ReactOS 0.4.15-dev-8119-g4fb2fdb
paint.c
Go to the documentation of this file.
1/*
2 * ReactOS kernel
3 * Copyright (C) 1998, 1999, 2000, 2001 ReactOS Team
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 */
19/*
20 * PROJECT: ReactOS user32.dll
21 * FILE: win32ss/user/user32/windows/paint.c
22 * PURPOSE: Input
23 * PROGRAMMER: Casper S. Hornstrup (chorns@users.sourceforge.net)
24 * UPDATE HISTORY:
25 * 09-05-2001 CSH Created
26 */
27
28/* INCLUDES ******************************************************************/
29
30#include <user32.h>
31
32static HBRUSH FrameBrushes[13];
34const DWORD HatchBitmap[4] = {0x5555AAAA, 0x5555AAAA, 0x5555AAAA, 0x5555AAAA};
35
38
39/* FUNCTIONS *****************************************************************/
40
41INT
44{
45 INT Ret = pWnd->rcWindow.right - pWnd->rcWindow.left - lprc->left;
46 lprc->left = pWnd->rcWindow.right - pWnd->rcWindow.left - lprc->right;
47 lprc->right = Ret;
48 return Ret;
49}
50
51VOID
53{
55 FrameBrushes[1] = CreateSolidBrush(RGB(0,0,128));
56 FrameBrushes[2] = CreateSolidBrush(RGB(10,36,106));
57 FrameBrushes[3] = CreateSolidBrush(RGB(128,128,128));
58 FrameBrushes[4] = CreateSolidBrush(RGB(181,181,181));
59 FrameBrushes[5] = CreateSolidBrush(RGB(212,208,200));
60 FrameBrushes[6] = CreateSolidBrush(RGB(236,233,216));
61 FrameBrushes[7] = CreateSolidBrush(RGB(255,255,255));
62 FrameBrushes[8] = CreateSolidBrush(RGB(49,106,197));
63 FrameBrushes[9] = CreateSolidBrush(RGB(58,110,165));
64 FrameBrushes[10] = CreateSolidBrush(RGB(64,64,64));
65 FrameBrushes[11] = CreateSolidBrush(RGB(255,255,225));
66 hHatch = CreateBitmap(8, 8, 1, 1, HatchBitmap);
68}
69
70VOID
72{
73 unsigned Brush;
74
75 for (Brush = 0; Brush < sizeof(FrameBrushes) / sizeof(HBRUSH); Brush++)
76 {
77 if (NULL != FrameBrushes[Brush])
78 {
81 }
82 }
83 if (NULL != hHatch)
84 {
86 hHatch = NULL;
87 }
88}
89
90
91/*
92 * @implemented
93 */
94BOOL
97 HWND Wnd,
99 BOOL Erase)
100{
101 PWND pWnd;
102
103 pWnd = ValidateHwnd(Wnd);
104 if (!pWnd)
105 return FALSE;
106
107 if ( pWnd->hrgnUpdate ||
109 {
110 return NtUserGetUpdateRect(Wnd, Rect, Erase);
111 }
112
113 if (Rect)
114 { // Did the Rgn update? No! Back set and shutup!
115 Rect->left = Rect->right = Rect->top = Rect->bottom = 0;
116 }
117 return FALSE; // msdn: "If there is no update region, the return value is zero."
118
119}
120
121
122/*
123 * @implemented
124 */
125int
126WINAPI
128 HWND hWnd,
129 HRGN hRgn,
130 BOOL bErase)
131{
132 PWND pWnd;
133
134 if (!hRgn)
135 {
137 return ERROR;
138 }
139
140 pWnd = ValidateHwnd(hWnd);
141 if (!pWnd)
142 return ERROR;
143
144 if ( pWnd->hrgnUpdate ||
146 {
147 return NtUserGetUpdateRgn(hWnd, hRgn, bErase);
148 }
149 SetRectRgn(hRgn, 0, 0, 0, 0);
150 return NULLREGION;
151}
152
153
154/*
155 * @implemented
156 */
159 HDC hDC,
160 int dx,
161 int dy,
162 CONST RECT *lprcScroll,
163 CONST RECT *lprcClip,
164 HRGN hrgnUpdate,
165 LPRECT lprcUpdate)
166{
167 if (hDC == NULL) return FALSE;
168
169 if (dx == 0 && dy == 0)
170 {
171 if (hrgnUpdate) SetRectRgn(hrgnUpdate, 0, 0, 0, 0);
172 if (lprcUpdate) lprcUpdate->left = lprcUpdate->right =
173 lprcUpdate->top = lprcUpdate->bottom = 0;
174 return TRUE;
175 }
176
177 return NtUserScrollDC( hDC,
178 dx,
179 dy,
180 lprcScroll,
181 lprcClip,
182 hrgnUpdate,
183 lprcUpdate);
184}
185
186/*
187 * @implemented
188 */
189int
190WINAPI
192 HWND hWnd,
193 HRGN hRgn,
194 BOOL bRedraw)
195{
196 BOOL Hook;
197 int Ret = 0;
198
200
202
203 /* Bypass SEH and go direct. */
204 if (!Hook)
205 {
206 Ret = NtUserSetWindowRgn(hWnd, hRgn, bRedraw);
207 if (Ret)
209 return Ret;
210 }
211
213 {
214 Ret = guah.SetWindowRgn(hWnd, hRgn, bRedraw);
215 }
217 {
218 }
219 _SEH2_END;
220
222
223 return Ret;
224}
225
226/*
227 * @implemented
228 */
229BOOL
230WINAPI
232 HWND hWnd)
233{
234 PWND pWnd = ValidateHwnd(hWnd);
235
236 if (!pWnd)
237 return FALSE;
238
239 if ( pWnd->hrgnUpdate ||
240 pWnd->state & WNDS_INTERNALPAINT ||
241 pWnd->spwndChild )
242 {
244 }
245 return TRUE;
246}
247
248/*
249 * @implemented
250 */
251BOOL
252WINAPI
254 HWND hWnd,
255 HRGN hRgn)
256{
258}
259
260/*
261 * @implemented
262 */
263int
264WINAPI
266 HWND hWnd,
267 HRGN hRgn)
268{
269 PWND pWnd;
270 int Ret;
271
272 if (!hRgn)
273 return ERROR;
274
275 pWnd = ValidateHwnd(hWnd);
276
277 if (!pWnd || !pWnd->hrgnClip || pWnd->state2 & WNDS2_MAXIMIZEDMONITORREGION)
278 return ERROR;
279
280 Ret = CombineRgn(hRgn, pWnd->hrgnClip, NULL, RGN_COPY);
281
282 if (!Ret)
283 return ERROR;
284/*
285 if (hWnd != GetDesktopWindow()) // pWnd->fnid != FNID_DESKTOP)
286 Ret = OffsetRgn(hRgn, -pWnd->rcWindow.left, -pWnd->rcWindow.top);
287*/
288 if (pWnd->ExStyle & WS_EX_LAYOUTRTL)
290
291 return Ret;
292}
293
294/*
295 * @implemented
296 */
297int
298WINAPI
300 HWND hWnd,
301 LPRECT lprc)
302{
303 PWND pWnd;
304 int Ret;
305
306 if (!lprc)
307 return ERROR;
308
309 pWnd = ValidateHwnd(hWnd);
310
311 if (!pWnd || !pWnd->hrgnClip || pWnd->state2 & WNDS2_MAXIMIZEDMONITORREGION)
312 return ERROR;
313
314 Ret = GetRgnBox(pWnd->hrgnClip, lprc);
315
316 if (!Ret)
317 return ERROR;
318/*
319 if (hWnd != GetDesktopWindow()) // pWnd->fnid != FNID_DESKTOP)
320 OffsetRect(lprc, -pWnd->rcWindow.left, -pWnd->rcWindow.top);
321*/
322 if (pWnd->ExStyle & WS_EX_LAYOUTRTL)
323 MirrorWindowRect(pWnd, lprc);
324
325 return Ret;
326}
327
328
329const BYTE MappingTable[33] = {5,9,2,3,5,7,0,0,0,7,5,5,3,2,7,5,3,3,0,5,7,10,5,0,11,4,1,1,3,8,6,12,7};
330/*
331 * @implemented
332 */
333BOOL
334WINAPI
336 HDC hDc,
337 RECT *r,
338 DWORD width,
339 DWORD type
340 )
341{
342 DWORD rop;
343 DWORD brush;
344 HBRUSH hbrFrame;
345 PATRECT p[4];
346 if (NULL == FrameBrushes[0])
347 {
349 }
350 if (type & 4)
351 {
352 rop = PATINVERT;
353 }
354 else
355 {
356 rop = PATCOPY;
357 }
358 brush = type / 8;
359 if (brush >= 33)
360 {
361 brush = 32;
362 }
363 brush = MappingTable[brush];
364 hbrFrame = FrameBrushes[brush];
365 p[0].hBrush = hbrFrame;
366 p[1].hBrush = hbrFrame;
367 p[2].hBrush = hbrFrame;
368 p[3].hBrush = hbrFrame;
369 p[0].r.left = r->left;
370 p[0].r.top = r->top;
371 p[0].r.right = r->right - r->left;
372 p[0].r.bottom = width;
373 p[1].r.left = r->left;
374 p[1].r.top = r->bottom - width;
375 p[1].r.right = r->right - r->left;
376 p[1].r.bottom = width;
377 p[2].r.left = r->left;
378 p[2].r.top = r->top + width;
379 p[2].r.right = width;
380 p[2].r.bottom = r->bottom - r->top - (width * 2);
381 p[3].r.left = r->right - width;
382 p[3].r.top = r->top + width;
383 p[3].r.right = width;
384 p[3].r.bottom = r->bottom - r->top - (width * 2);
385 return PolyPatBlt(hDc,rop,p,4,0);
386}
static HDC hDC
Definition: 3dtext.c:33
static HRGN hrgn
HWND hWnd
Definition: settings.c:17
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define SetLastError(x)
Definition: compat.h:752
#define ERROR_INVALID_HANDLE
Definition: compat.h:98
#define ValidateHwnd(hwnd)
Definition: precomp.h:85
unsigned width
Definition: paint.c:490
void Erase(HDC hdc, LONG x1, LONG y1, LONG x2, LONG y2, COLORREF color, LONG radius)
Definition: drawing.cpp:115
#define RGB(r, g, b)
Definition: precomp.h:71
#define ERROR(name)
Definition: error_private.h:53
#define _SEH2_END
Definition: filesup.c:22
#define _SEH2_TRY
Definition: filesup.c:19
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
pKey DeleteObject()
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
GLint GLint GLsizei width
Definition: gl.h:1546
GLfloat GLfloat p
Definition: glext.h:8902
#define EXCEPTION_EXECUTE_HANDLER
Definition: excpt.h:85
#define WNDS_SENDNCPAINT
Definition: ntuser.h:616
#define WNDS_INTERNALPAINT
Definition: ntuser.h:617
#define WNDS2_MAXIMIZEDMONITORREGION
Definition: ntuser.h:652
BOOL NTAPI NtUserGetUpdateRect(HWND hWnd, LPRECT lpRect, BOOL fErase)
Definition: painting.c:1961
INT NTAPI NtUserGetUpdateRgn(HWND hWnd, HRGN hRgn, BOOL bErase)
Definition: painting.c:1934
BOOL NTAPI NtUserScrollDC(HDC hDC, int dx, int dy, CONST RECT *lprcScroll, CONST RECT *lprcClip, HRGN hrgnUpdate, LPRECT lprcUpdate)
INT NTAPI NtUserSetWindowRgn(HWND hWnd, HRGN hRgn, BOOL bRedraw)
Definition: winpos.c:3572
#define WNDS_UPDATEDIRTY
Definition: ntuser.h:618
#define WNDS_PAINTNOTPROCESSED
Definition: ntuser.h:627
#define WNDS_SENDERASEBACKGROUND
Definition: ntuser.h:614
GLint dy
Definition: linetemp.h:97
GLint dx
Definition: linetemp.h:97
static HBITMAP
Definition: button.c:44
static HDC
Definition: imagelist.c:92
static HRGN hRgn
Definition: mapping.c:33
static int rop(int rop, int src, int dst)
Definition: nanoxwin.c:124
EXTINLINE BOOL NtUserxUpdateWindow(HWND hWnd)
Definition: ntwrapper.h:773
EXTINLINE BOOL NtUserxValidateRgn(HWND hWnd, HRGN hRgn)
Definition: ntwrapper.h:671
#define CONST
Definition: pedump.c:81
#define _SEH2_EXCEPT(...)
Definition: pseh2_64.h:66
Definition: ntuser.h:694
DWORD ExStyle
Definition: ntuser.h:704
HRGN hrgnClip
Definition: ntuser.h:733
DWORD state2
Definition: ntuser.h:702
struct _WND * spwndChild
Definition: ntuser.h:714
HRGN hrgnUpdate
Definition: ntuser.h:721
DWORD state
Definition: ntuser.h:701
RECT rcWindow
Definition: ntuser.h:716
LONG right
Definition: windef.h:308
LONG bottom
Definition: windef.h:309
LONG top
Definition: windef.h:307
LONG left
Definition: windef.h:306
SETWINDOWRGN SetWindowRgn
Definition: undocuser.h:346
int32_t INT
Definition: typedefs.h:58
uint32_t ULONG
Definition: typedefs.h:59
BOOL FASTCALL EndUserApiHook(VOID)
Definition: usrapihk.c:164
BOOL FASTCALL BeginIfHookedUserApiHook(VOID)
Definition: usrapihk.c:106
USERAPIHOOK guah
Definition: usrapihk.c:344
static __inline void LoadUserApiHook()
Definition: user_x.h:85
int WINAPI GetUpdateRgn(HWND hWnd, HRGN hRgn, BOOL bErase)
Definition: paint.c:127
INT WINAPI MirrorWindowRect(PWND pWnd, LPRECT lprc)
Definition: paint.c:43
BOOL WINAPI GetUpdateRect(HWND Wnd, LPRECT Rect, BOOL Erase)
Definition: paint.c:96
BOOL WINAPI MirrorRgn(HWND hwnd, HRGN hrgn)
Definition: region.c:863
BOOL WINAPI ScrollDC(HDC hDC, int dx, int dy, CONST RECT *lprcScroll, CONST RECT *lprcClip, HRGN hrgnUpdate, LPRECT lprcUpdate)
Definition: paint.c:158
VOID CreateFrameBrushes(VOID)
Definition: paint.c:52
static HBRUSH FrameBrushes[13]
Definition: paint.c:32
int WINAPI GetWindowRgn(HWND hWnd, HRGN hRgn)
Definition: paint.c:265
const DWORD HatchBitmap[4]
Definition: paint.c:34
BOOL WINAPI DrawFrame(HDC hDc, RECT *r, DWORD width, DWORD type)
Definition: paint.c:335
int WINAPI SetWindowRgn(HWND hWnd, HRGN hRgn, BOOL bRedraw)
Definition: paint.c:191
int WINAPI GetWindowRgnBox(HWND hWnd, LPRECT lprc)
Definition: paint.c:299
const BYTE MappingTable[33]
Definition: paint.c:329
BOOL WINAPI ValidateRgn(HWND hWnd, HRGN hRgn)
Definition: paint.c:253
static HBITMAP hHatch
Definition: paint.c:33
VOID DeleteFrameBrushes(VOID)
Definition: paint.c:71
BOOL WINAPI UpdateWindow(HWND hWnd)
Definition: paint.c:231
BOOL WINAPI PolyPatBlt(HDC, DWORD, PPATRECT, INT, ULONG)
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
#define WINAPI
Definition: msvc.h:6
HBITMAP WINAPI CreateBitmap(_In_ INT cx, _In_ INT cy, _In_ UINT cPlanes, _In_ UINT cBitsPerPel, _In_opt_ const VOID *pvBits)
#define PATINVERT
Definition: wingdi.h:328
#define NULLREGION
Definition: wingdi.h:361
int WINAPI CombineRgn(_In_opt_ HRGN hrgnDest, _In_opt_ HRGN hrgnSrc1, _In_opt_ HRGN hrgnSrc2, _In_ int fnCombineMode)
#define RGN_COPY
Definition: wingdi.h:357
#define PATCOPY
Definition: wingdi.h:335
HBRUSH WINAPI CreateSolidBrush(_In_ COLORREF)
BOOL WINAPI SetRectRgn(_In_ HRGN, _In_ int, _In_ int, _In_ int, _In_ int)
int WINAPI GetRgnBox(_In_ HRGN, _Out_ LPRECT)
HBRUSH WINAPI CreatePatternBrush(_In_ HBITMAP)
#define WS_EX_LAYOUTRTL
Definition: winuser.h:390
_In_ int _Inout_ LPRECT lprc
Definition: winuser.h:4466
unsigned char BYTE
Definition: xxhash.c:193