3 * Copyright (C) 1998, 1999, 2000, 2001 ReactOS Team
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.
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.
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.
20 * PROJECT: ReactOS user32.dll
21 * FILE: dll/win32/user32/windows/paint.c
23 * PROGRAMMER: Casper S. Hornstrup (chorns@users.sourceforge.net)
25 * 09-05-2001 CSH Created
28 /* INCLUDES ******************************************************************/
32 static HBRUSH FrameBrushes
[13];
33 static HBITMAP hHatch
;
34 const DWORD HatchBitmap
[4] = {0x5555AAAA, 0x5555AAAA, 0x5555AAAA, 0x5555AAAA};
36 BOOL WINAPI
MirrorRgn(HWND hwnd
, HRGN hrgn
);
37 BOOL WINAPI
PolyPatBlt(HDC
,DWORD
,PPATRECT
,INT
,ULONG
);
39 /* FUNCTIONS *****************************************************************/
43 MirrorWindowRect( PWND pWnd
, LPRECT lprc
)
45 INT Ret
= pWnd
->rcWindow
.right
- pWnd
->rcWindow
.left
- lprc
->left
;
46 lprc
->left
= pWnd
->rcWindow
.right
- pWnd
->rcWindow
.left
- lprc
->right
;
52 CreateFrameBrushes(VOID
)
54 FrameBrushes
[0] = CreateSolidBrush(RGB(0,0,0));
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
);
67 FrameBrushes
[12] = CreatePatternBrush(hHatch
);
71 DeleteFrameBrushes(VOID
)
75 for (Brush
= 0; Brush
< sizeof(FrameBrushes
) / sizeof(HBRUSH
); Brush
++)
77 if (NULL
!= FrameBrushes
[Brush
])
79 DeleteObject(FrameBrushes
[Brush
]);
80 FrameBrushes
[Brush
] = NULL
;
103 pWnd
= ValidateHwnd(Wnd
);
107 if ( pWnd
->hrgnUpdate
||
108 pWnd
->state
& (WNDS_SENDERASEBACKGROUND
|WNDS_SENDNCPAINT
|WNDS_UPDATEDIRTY
|WNDS_PAINTNOTPROCESSED
))
110 return NtUserGetUpdateRect(Wnd
, Rect
, Erase
);
114 { // Did the Rgn update? No! Back set and shutup!
115 Rect
->left
= Rect
->right
= Rect
->top
= Rect
->bottom
= 0;
117 return FALSE
; // msdn: "If there is no update region, the return value is zero."
136 SetLastError(ERROR_INVALID_HANDLE
);
140 pWnd
= ValidateHwnd(hWnd
);
144 if ( pWnd
->hrgnUpdate
||
145 pWnd
->state
& (WNDS_SENDERASEBACKGROUND
|WNDS_SENDNCPAINT
|WNDS_UPDATEDIRTY
|WNDS_PAINTNOTPROCESSED
))
147 return NtUserGetUpdateRgn(hWnd
, hRgn
, bErase
);
149 SetRectRgn(hRgn
, 0, 0, 0, 0);
162 CONST RECT
*lprcScroll
,
163 CONST RECT
*lprcClip
,
167 if (hDC
== NULL
) return FALSE
;
169 if (dx
== 0 && dy
== 0)
171 if (hrgnUpdate
) SetRectRgn(hrgnUpdate
, 0, 0, 0, 0);
172 if (lprcUpdate
) lprcUpdate
->left
= lprcUpdate
->right
=
173 lprcUpdate
->top
= lprcUpdate
->bottom
= 0;
177 return NtUserScrollDC( hDC
,
201 Hook
= BeginIfHookedUserApiHook();
203 /* Bypass SEH and go direct. */
206 Ret
= NtUserSetWindowRgn(hWnd
, hRgn
, bRedraw
);
214 Ret
= guah
.SetWindowRgn(hWnd
, hRgn
, bRedraw
);
216 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
234 PWND pWnd
= ValidateHwnd(hWnd
);
239 if ( pWnd
->hrgnUpdate
||
240 pWnd
->state
& WNDS_INTERNALPAINT
||
243 return NtUserxUpdateWindow(hWnd
);
257 return NtUserxValidateRgn(hWnd
, hRgn
);
275 pWnd
= ValidateHwnd(hWnd
);
277 if (!pWnd
|| !pWnd
->hrgnClip
|| pWnd
->state2
& WNDS2_MAXIMIZEDMONITORREGION
)
280 Ret
= CombineRgn(hRgn
, pWnd
->hrgnClip
, NULL
, RGN_COPY
);
285 if (hWnd != GetDesktopWindow()) // pWnd->fnid != FNID_DESKTOP)
286 Ret = OffsetRgn(hRgn, -pWnd->rcWindow.left, -pWnd->rcWindow.top);
288 if (pWnd
->ExStyle
& WS_EX_LAYOUTRTL
)
289 MirrorRgn(hWnd
, hRgn
);
309 pWnd
= ValidateHwnd(hWnd
);
311 if (!pWnd
|| !pWnd
->hrgnClip
|| pWnd
->state2
& WNDS2_MAXIMIZEDMONITORREGION
)
314 Ret
= GetRgnBox(pWnd
->hrgnClip
, lprc
);
319 if (hWnd != GetDesktopWindow()) // pWnd->fnid != FNID_DESKTOP)
320 OffsetRect(lprc, -pWnd->rcWindow.left, -pWnd->rcWindow.top);
322 if (pWnd
->ExStyle
& WS_EX_LAYOUTRTL
)
323 MirrorWindowRect(pWnd
, lprc
);
329 const 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};
346 if (NULL
== FrameBrushes
[0])
348 CreateFrameBrushes();
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
;
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);