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 #include <wine/debug.h>
34 WINE_DEFAULT_DEBUG_CHANNEL(user32
);
36 static HBRUSH FrameBrushes
[13];
37 static HBITMAP hHatch
;
38 const DWORD HatchBitmap
[4] = {0x5555AAAA, 0x5555AAAA, 0x5555AAAA, 0x5555AAAA};
40 BOOL WINAPI
MirrorRgn(HWND hwnd
, HRGN hrgn
);
41 BOOL WINAPI
PolyPatBlt(HDC
,DWORD
,PPATRECT
,INT
,ULONG
);
43 /* FUNCTIONS *****************************************************************/
47 MirrorWindowRect( PWND pWnd
, LPRECT lprc
)
49 INT Ret
= pWnd
->rcWindow
.right
- pWnd
->rcWindow
.left
- lprc
->left
;
50 lprc
->left
= pWnd
->rcWindow
.right
- pWnd
->rcWindow
.left
- lprc
->right
;
56 CreateFrameBrushes(VOID
)
58 FrameBrushes
[0] = CreateSolidBrush(RGB(0,0,0));
59 FrameBrushes
[1] = CreateSolidBrush(RGB(0,0,128));
60 FrameBrushes
[2] = CreateSolidBrush(RGB(10,36,106));
61 FrameBrushes
[3] = CreateSolidBrush(RGB(128,128,128));
62 FrameBrushes
[4] = CreateSolidBrush(RGB(181,181,181));
63 FrameBrushes
[5] = CreateSolidBrush(RGB(212,208,200));
64 FrameBrushes
[6] = CreateSolidBrush(RGB(236,233,216));
65 FrameBrushes
[7] = CreateSolidBrush(RGB(255,255,255));
66 FrameBrushes
[8] = CreateSolidBrush(RGB(49,106,197));
67 FrameBrushes
[9] = CreateSolidBrush(RGB(58,110,165));
68 FrameBrushes
[10] = CreateSolidBrush(RGB(64,64,64));
69 FrameBrushes
[11] = CreateSolidBrush(RGB(255,255,225));
70 hHatch
= CreateBitmap(8, 8, 1, 1, HatchBitmap
);
71 FrameBrushes
[12] = CreatePatternBrush(hHatch
);
75 DeleteFrameBrushes(VOID
)
79 for (Brush
= 0; Brush
< sizeof(FrameBrushes
) / sizeof(HBRUSH
); Brush
++)
81 if (NULL
!= FrameBrushes
[Brush
])
83 DeleteObject(FrameBrushes
[Brush
]);
84 FrameBrushes
[Brush
] = NULL
;
107 pWnd
= ValidateHwnd(Wnd
);
111 if ( pWnd
->hrgnUpdate
||
112 pWnd
->state
& (WNDS_SENDERASEBACKGROUND
|WNDS_SENDNCPAINT
|WNDS_UPDATEDIRTY
|WNDS_PAINTNOTPROCESSED
))
114 return NtUserGetUpdateRect(Wnd
, Rect
, Erase
);
118 { // Did the Rgn update? No! Back set and shutup!
119 Rect
->left
= Rect
->right
= Rect
->top
= Rect
->bottom
= 0;
121 return FALSE
; // msdn: "If there is no update region, the return value is zero."
140 SetLastError(ERROR_INVALID_HANDLE
);
144 pWnd
= ValidateHwnd(hWnd
);
148 if ( pWnd
->hrgnUpdate
||
149 pWnd
->state
& (WNDS_SENDERASEBACKGROUND
|WNDS_SENDNCPAINT
|WNDS_UPDATEDIRTY
|WNDS_PAINTNOTPROCESSED
))
151 return NtUserGetUpdateRgn(hWnd
, hRgn
, bErase
);
153 SetRectRgn(hRgn
, 0, 0, 0, 0);
166 CONST RECT
*lprcScroll
,
167 CONST RECT
*lprcClip
,
171 if (hDC
== NULL
) return FALSE
;
173 if (dx
== 0 && dy
== 0)
175 if (hrgnUpdate
) SetRectRgn(hrgnUpdate
, 0, 0, 0, 0);
176 if (lprcUpdate
) lprcUpdate
->left
= lprcUpdate
->right
=
177 lprcUpdate
->top
= lprcUpdate
->bottom
= 0;
181 return NtUserScrollDC( hDC
,
205 Hook
= BeginIfHookedUserApiHook();
207 /* Bypass SEH and go direct. */
210 Ret
= NtUserSetWindowRgn(hWnd
, hRgn
, bRedraw
);
218 Ret
= guah
.SetWindowRgn(hWnd
, hRgn
, bRedraw
);
220 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
238 PWND pWnd
= ValidateHwnd(hWnd
);
243 if ( pWnd
->hrgnUpdate
||
244 pWnd
->state
& WNDS_INTERNALPAINT
||
247 return NtUserxUpdateWindow(hWnd
);
261 return NtUserxValidateRgn(hWnd
, hRgn
);
279 pWnd
= ValidateHwnd(hWnd
);
281 if (!pWnd
|| !pWnd
->hrgnClip
|| pWnd
->state2
& WNDS2_MAXIMIZEDMONITORREGION
)
284 Ret
= CombineRgn(hRgn
, pWnd
->hrgnClip
, NULL
, RGN_COPY
);
289 if (hWnd != GetDesktopWindow()) // pWnd->fnid != FNID_DESKTOP)
290 Ret = OffsetRgn(hRgn, -pWnd->rcWindow.left, -pWnd->rcWindow.top);
292 if (pWnd
->ExStyle
& WS_EX_LAYOUTRTL
)
293 MirrorRgn(hWnd
, hRgn
);
313 pWnd
= ValidateHwnd(hWnd
);
315 if (!pWnd
|| !pWnd
->hrgnClip
|| pWnd
->state2
& WNDS2_MAXIMIZEDMONITORREGION
)
318 Ret
= GetRgnBox(pWnd
->hrgnClip
, lprc
);
323 if (hWnd != GetDesktopWindow()) // pWnd->fnid != FNID_DESKTOP)
324 OffsetRect(lprc, -pWnd->rcWindow.left, -pWnd->rcWindow.top);
326 if (pWnd
->ExStyle
& WS_EX_LAYOUTRTL
)
327 MirrorWindowRect(pWnd
, lprc
);
333 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};
350 if (NULL
== FrameBrushes
[0])
352 CreateFrameBrushes();
367 brush
= MappingTable
[brush
];
368 hbrFrame
= FrameBrushes
[brush
];
369 p
[0].hBrush
= hbrFrame
;
370 p
[1].hBrush
= hbrFrame
;
371 p
[2].hBrush
= hbrFrame
;
372 p
[3].hBrush
= hbrFrame
;
373 p
[0].r
.left
= r
->left
;
375 p
[0].r
.right
= r
->right
- r
->left
;
376 p
[0].r
.bottom
= width
;
377 p
[1].r
.left
= r
->left
;
378 p
[1].r
.top
= r
->bottom
- width
;
379 p
[1].r
.right
= r
->right
- r
->left
;
380 p
[1].r
.bottom
= width
;
381 p
[2].r
.left
= r
->left
;
382 p
[2].r
.top
= r
->top
+ width
;
383 p
[2].r
.right
= width
;
384 p
[2].r
.bottom
= r
->bottom
- r
->top
- (width
* 2);
385 p
[3].r
.left
= r
->right
- width
;
386 p
[3].r
.top
= r
->top
+ width
;
387 p
[3].r
.right
= width
;
388 p
[3].r
.bottom
= r
->bottom
- r
->top
- (width
* 2);
389 return PolyPatBlt(hDc
,rop
,p
,4,0);