ReactOS 0.4.15-dev-7958-gcd0bb1a
graphics.c
Go to the documentation of this file.
1/*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Console Server DLL
4 * FILE: win32ss/user/winsrv/consrv/frontends/gui/graphics.c
5 * PURPOSE: GUI Terminal Front-End - Support for graphics-mode screen-buffers
6 * PROGRAMMERS: Hermes Belusca-Maito (hermes.belusca@sfr.fr)
7 */
8
9/* INCLUDES *******************************************************************/
10
11#include <consrv.h>
12
13#define NDEBUG
14#include <debug.h>
15
16#include "guiterm.h"
17
18/* FUNCTIONS ******************************************************************/
19
20VOID
22 PGUI_CONSOLE_DATA GuiData)
23{
24 /*
25 * This function supposes that the system clipboard was opened.
26 */
27
28 HDC hMemDC;
29 HBITMAP hBitmapTarget, hBitmapOld;
30 HPALETTE hPalette, hPaletteOld;
31 ULONG selWidth, selHeight;
32
33 if (Buffer->BitMap == NULL) return;
34
35 selWidth = ConioRectWidth(&GuiData->Selection.srSelection);
36 selHeight = ConioRectHeight(&GuiData->Selection.srSelection);
37 DPRINT("Selection is (%d|%d) to (%d|%d)\n",
38 GuiData->Selection.srSelection.Left,
39 GuiData->Selection.srSelection.Top,
42
43 hMemDC = CreateCompatibleDC(GuiData->hMemDC);
44 if (hMemDC == NULL) return;
45
46 /* Allocate a bitmap to be given to the clipboard, so it will not be freed here */
47 hBitmapTarget = CreateCompatibleBitmap(GuiData->hMemDC, selWidth, selHeight);
48 if (hBitmapTarget == NULL)
49 {
50 DeleteDC(hMemDC);
51 return;
52 }
53
54 /* Select the new bitmap */
55 hBitmapOld = SelectObject(hMemDC, hBitmapTarget);
56
57 /* Change the palette in hMemDC if the current palette does exist */
58 if (Buffer->PaletteHandle == NULL)
59 hPalette = GuiData->hSysPalette;
60 else
61 hPalette = Buffer->PaletteHandle;
62
63 if (hPalette) hPaletteOld = SelectPalette(hMemDC, hPalette, FALSE);
64
65 /* Grab the mutex */
67
68 // The equivalent of a SetDIBitsToDevice call...
69 // It seems to be broken: it does not copy the tail of the bitmap.
70 // http://wiki.allegro.cc/index.php?title=StretchDIBits
71#if 0
72 StretchDIBits(hMemDC,
73 0, 0,
74 selWidth, selHeight,
75 GuiData->Selection.srSelection.Left,
76 GuiData->Selection.srSelection.Top,
77 selWidth, selHeight,
78 Buffer->BitMap,
79 Buffer->BitMapInfo,
80 Buffer->BitMapUsage,
81 SRCCOPY);
82#else
83 SetDIBitsToDevice(hMemDC,
84 /* Coordinates / size of the repainted rectangle, in the framebuffer's frame */
85 0, 0,
86 selWidth, selHeight,
87 /* Coordinates / size of the corresponding image portion, in the graphics screen-buffer's frame */
88 GuiData->Selection.srSelection.Left,
89 GuiData->Selection.srSelection.Top,
90 0,
91 Buffer->ScreenBufferSize.Y, // == Buffer->BitMapInfo->bmiHeader.biHeight
92 Buffer->BitMap,
93 Buffer->BitMapInfo,
94 Buffer->BitMapUsage);
95#endif
96
97 /* Release the mutex */
99
100 /* Restore the palette and the old bitmap */
101 if (hPalette) SelectPalette(hMemDC, hPaletteOld, FALSE);
102 SelectObject(hMemDC, hBitmapOld);
103
105 SetClipboardData(CF_BITMAP, hBitmapTarget);
106
107 DeleteDC(hMemDC);
108}
109
110VOID
112 PGUI_CONSOLE_DATA GuiData)
113{
114 /*
115 * This function supposes that the system clipboard was opened.
116 */
117
118 // PCONSRV_CONSOLE Console = Buffer->Header.Console;
119
121}
122
123VOID
125 PGUI_CONSOLE_DATA GuiData,
126 PRECT rcView,
127 PRECT rcFramebuffer)
128{
130 // ASSERT(Console == GuiData->Console);
131
132 ConioInitLongRect(rcFramebuffer, 0, 0, 0, 0);
133
134 if (Buffer->BitMap == NULL)
135 return;
136
138 return;
139
140 ConioInitLongRect(rcFramebuffer,
141 Buffer->ViewOrigin.Y * 1 + rcView->top,
142 Buffer->ViewOrigin.X * 1 + rcView->left,
143 Buffer->ViewOrigin.Y * 1 + rcView->bottom,
144 Buffer->ViewOrigin.X * 1 + rcView->right);
145
146 /* Grab the mutex */
148
149 /*
150 * The seventh parameter (YSrc) of SetDIBitsToDevice always designates
151 * the Y-coordinate of the "lower-left corner" of the image, be the DIB
152 * in bottom-up or top-down mode.
153 */
154 SetDIBitsToDevice(GuiData->hMemDC,
155 /* Coordinates / size of the repainted rectangle, in the framebuffer's frame */
156 rcFramebuffer->left,
157 rcFramebuffer->top,
158 rcFramebuffer->right - rcFramebuffer->left,
159 rcFramebuffer->bottom - rcFramebuffer->top,
160 /* Coordinates / size of the corresponding image portion, in the graphics screen-buffer's frame */
161 rcFramebuffer->left,
162 rcFramebuffer->top,
163 0,
164 Buffer->ScreenBufferSize.Y, // == Buffer->BitMapInfo->bmiHeader.biHeight
165 Buffer->BitMap,
166 Buffer->BitMapInfo,
167 Buffer->BitMapUsage);
168
169 /* Release the mutex */
170 NtReleaseMutant(Buffer->Mutex, NULL);
171
173}
174
175/* EOF */
CConsole Console
#define CF_BITMAP
Definition: constants.h:397
#define UNIMPLEMENTED
Definition: debug.h:115
Definition: bufpool.h:45
struct _CONSRV_CONSOLE * PCONSRV_CONSOLE
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define ConioRectWidth(Rect)
Definition: readwrite.c:24
#define ConioRectHeight(Rect)
Definition: readwrite.c:22
static HBITMAP
Definition: button.c:44
static HDC
Definition: imagelist.c:92
NTSTATUS NTAPI NtReleaseMutant(IN HANDLE MutantHandle, IN PLONG PreviousCount OPTIONAL)
Definition: mutant.c:296
NTSYSAPI NTSTATUS NTAPI NtWaitForSingleObject(IN HANDLE hObject, IN BOOLEAN bAlertable, IN PLARGE_INTEGER Timeout)
#define DPRINT
Definition: sndvol32.h:71
SMALL_RECT srSelection
Definition: wincon.h:210
CONSOLE_SELECTION_INFO Selection
Definition: conwnd.h:93
HPALETTE hSysPalette
Definition: conwnd.h:65
SHORT Top
Definition: tui.c:25
SHORT Right
Definition: tui.c:26
SHORT Left
Definition: tui.c:24
SHORT Bottom
Definition: tui.c:27
LONG right
Definition: windef.h:308
LONG bottom
Definition: windef.h:309
LONG top
Definition: windef.h:307
LONG left
Definition: windef.h:306
uint32_t ULONG
Definition: typedefs.h:59
BOOLEAN NTAPI ConDrvValidateConsoleUnsafe(IN PCONSOLE Console, IN CONSOLE_STATE ExpectedState, IN BOOLEAN LockConsole)
Definition: console.c:36
VOID GuiCopyFromGraphicsBuffer(PGRAPHICS_SCREEN_BUFFER Buffer, PGUI_CONSOLE_DATA GuiData)
Definition: graphics.c:21
VOID GuiPaintGraphicsBuffer(PGRAPHICS_SCREEN_BUFFER Buffer, PGUI_CONSOLE_DATA GuiData, PRECT rcView, PRECT rcFramebuffer)
Definition: graphics.c:124
VOID GuiPasteToGraphicsBuffer(PGRAPHICS_SCREEN_BUFFER Buffer, PGUI_CONSOLE_DATA GuiData)
Definition: graphics.c:111
@ CONSOLE_RUNNING
Definition: conio.h:283
#define ConioInitLongRect(Rect, Top, Left, Bottom, Right)
Definition: rect.h:12
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
int WINAPI SetDIBitsToDevice(_In_ HDC, _In_ int, _In_ int, _In_ DWORD, _In_ DWORD, _In_ int, _In_ int, _In_ UINT, _In_ UINT, _In_ CONST VOID *, _In_ CONST BITMAPINFO *, _In_ UINT)
HPALETTE WINAPI SelectPalette(_In_ HDC, _In_ HPALETTE, _In_ BOOL)
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
Definition: dc.c:1539
HDC WINAPI CreateCompatibleDC(_In_opt_ HDC hdc)
#define SRCCOPY
Definition: wingdi.h:333
HBITMAP WINAPI CreateCompatibleBitmap(_In_ HDC hdc, _In_ INT cx, _In_ INT cy)
BOOL WINAPI DeleteDC(_In_ HDC)
int WINAPI StretchDIBits(_In_ HDC, _In_ int, _In_ int, _In_ int, _In_ int, _In_ int, _In_ int, _In_ int, _In_ int, _In_opt_ const VOID *, _In_ const BITMAPINFO *, _In_ UINT, _In_ DWORD)
HANDLE WINAPI SetClipboardData(_In_ UINT, _In_opt_ HANDLE)
BOOL WINAPI EmptyClipboard(void)
Definition: ntwrapper.h:190