Release 980315
[wine/multimedia.git] / windows / painting.c
bloba78982f348b174455585cdfe1941e5b77cd01f61
1 /*
2 * Window painting functions
4 * Copyright 1993, 1994, 1995 Alexandre Julliard
6 * FIXME: Do not repaint full nonclient area all the time. Instead, compute
7 * intersection with hrgnUpdate (which should be moved from client to
8 * window coords as well, lookup 'the pain' comment in the winpos.c).
9 */
11 #include <stdio.h>
12 #include "win.h"
13 #include "queue.h"
14 #include "gdi.h"
15 #include "dce.h"
16 #include "heap.h"
17 #include "debug.h"
19 /* Last CTLCOLOR id */
20 #define CTLCOLOR_MAX CTLCOLOR_STATIC
22 /***********************************************************************
23 * WIN_UpdateNCArea
26 void WIN_UpdateNCArea(WND* wnd, BOOL32 bUpdate)
28 POINT16 pt = {0, 0};
29 HRGN32 hClip = 1;
31 TRACE(nonclient,"hwnd %04x, hrgnUpdate %04x\n",
32 wnd->hwndSelf, wnd->hrgnUpdate );
34 /* desktop window doesn't have nonclient area */
35 if(wnd == WIN_GetDesktop())
37 wnd->flags &= ~WIN_NEEDS_NCPAINT;
38 return;
41 if( wnd->hrgnUpdate > 1 )
43 ClientToScreen16(wnd->hwndSelf, &pt);
45 hClip = CreateRectRgn32( 0, 0, 0, 0 );
46 if (!CombineRgn32( hClip, wnd->hrgnUpdate, 0, RGN_COPY ))
48 DeleteObject32(hClip);
49 hClip = 1;
51 else
52 OffsetRgn32( hClip, pt.x, pt.y );
54 if (bUpdate)
56 /* exclude non-client area from update region */
57 HRGN32 hrgn = CreateRectRgn32( 0, 0,
58 wnd->rectClient.right - wnd->rectClient.left,
59 wnd->rectClient.bottom - wnd->rectClient.top);
61 if (hrgn && (CombineRgn32( wnd->hrgnUpdate, wnd->hrgnUpdate,
62 hrgn, RGN_AND) == NULLREGION))
64 DeleteObject32( wnd->hrgnUpdate );
65 wnd->hrgnUpdate = 1;
68 DeleteObject32( hrgn );
72 wnd->flags &= ~WIN_NEEDS_NCPAINT;
74 if ((wnd->hwndSelf == GetActiveWindow32()) &&
75 !(wnd->flags & WIN_NCACTIVATED))
77 wnd->flags |= WIN_NCACTIVATED;
78 if( hClip > 1) DeleteObject32( hClip );
79 hClip = 1;
82 if (hClip) SendMessage16( wnd->hwndSelf, WM_NCPAINT, hClip, 0L );
84 if (hClip > 1) DeleteObject32( hClip );
88 /***********************************************************************
89 * BeginPaint16 (USER.39)
91 HDC16 WINAPI BeginPaint16( HWND16 hwnd, LPPAINTSTRUCT16 lps )
93 BOOL32 bIcon;
94 HRGN32 hrgnUpdate;
95 WND *wndPtr = WIN_FindWndPtr( hwnd );
96 if (!wndPtr) return 0;
98 bIcon = (wndPtr->dwStyle & WS_MINIMIZE && wndPtr->class->hIcon);
100 wndPtr->flags &= ~WIN_NEEDS_BEGINPAINT;
102 if (wndPtr->flags & WIN_NEEDS_NCPAINT) WIN_UpdateNCArea( wndPtr, TRUE );
104 if (((hrgnUpdate = wndPtr->hrgnUpdate) != 0) ||
105 (wndPtr->flags & WIN_INTERNAL_PAINT))
106 QUEUE_DecPaintCount( wndPtr->hmemTaskQ );
108 wndPtr->hrgnUpdate = 0;
109 wndPtr->flags &= ~WIN_INTERNAL_PAINT;
111 HideCaret32( hwnd );
113 TRACE(win,"hrgnUpdate = %04x, \n", hrgnUpdate);
115 /* When bIcon is TRUE hrgnUpdate is automatically in window coordinates
116 * (because rectClient == rectWindow for WS_MINIMIZE windows).
119 if (wndPtr->class->style & CS_PARENTDC)
121 /* Don't clip the output to the update region for CS_PARENTDC window */
122 if(hrgnUpdate > 1)
123 DeleteObject32(hrgnUpdate);
124 lps->hdc = GetDCEx16( hwnd, 0, DCX_WINDOWPAINT | DCX_USESTYLE |
125 (bIcon ? DCX_WINDOW : 0) );
127 else
129 lps->hdc = GetDCEx16(hwnd, hrgnUpdate, DCX_INTERSECTRGN |
130 DCX_WINDOWPAINT | DCX_USESTYLE |
131 (bIcon ? DCX_WINDOW : 0) );
134 TRACE(win,"hdc = %04x\n", lps->hdc);
136 if (!lps->hdc)
138 fprintf(stderr, "GetDCEx() failed in BeginPaint(), hwnd=%04x\n", hwnd);
139 return 0;
142 GetRgnBox16( InquireVisRgn(lps->hdc), &lps->rcPaint );
144 TRACE(win,"box = (%i,%i - %i,%i)\n", lps->rcPaint.left, lps->rcPaint.top,
145 lps->rcPaint.right, lps->rcPaint.bottom );
147 DPtoLP16( lps->hdc, (LPPOINT16)&lps->rcPaint, 2 );
149 if (wndPtr->flags & WIN_NEEDS_ERASEBKGND)
151 wndPtr->flags &= ~WIN_NEEDS_ERASEBKGND;
152 lps->fErase = !SendMessage16(hwnd, (bIcon) ? WM_ICONERASEBKGND
153 : WM_ERASEBKGND,
154 (WPARAM16)lps->hdc, 0 );
156 else lps->fErase = TRUE;
158 return lps->hdc;
162 /***********************************************************************
163 * BeginPaint32 (USER32.9)
165 HDC32 WINAPI BeginPaint32( HWND32 hwnd, PAINTSTRUCT32 *lps )
167 PAINTSTRUCT16 ps;
169 BeginPaint16( hwnd, &ps );
170 lps->hdc = (HDC32)ps.hdc;
171 lps->fErase = ps.fErase;
172 lps->rcPaint.top = ps.rcPaint.top;
173 lps->rcPaint.left = ps.rcPaint.left;
174 lps->rcPaint.right = ps.rcPaint.right;
175 lps->rcPaint.bottom = ps.rcPaint.bottom;
176 lps->fRestore = ps.fRestore;
177 lps->fIncUpdate = ps.fIncUpdate;
178 return lps->hdc;
182 /***********************************************************************
183 * EndPaint16 (USER.40)
185 BOOL16 WINAPI EndPaint16( HWND16 hwnd, const PAINTSTRUCT16* lps )
187 ReleaseDC16( hwnd, lps->hdc );
188 ShowCaret32( hwnd );
189 return TRUE;
193 /***********************************************************************
194 * EndPaint32 (USER32.175)
196 BOOL32 WINAPI EndPaint32( HWND32 hwnd, const PAINTSTRUCT32 *lps )
198 ReleaseDC32( hwnd, lps->hdc );
199 ShowCaret32( hwnd );
200 return TRUE;
204 /***********************************************************************
205 * FillWindow (USER.324)
207 void WINAPI FillWindow( HWND16 hwndParent, HWND16 hwnd, HDC16 hdc, HBRUSH16 hbrush )
209 RECT16 rect;
210 GetClientRect16( hwnd, &rect );
211 DPtoLP16( hdc, (LPPOINT16)&rect, 2 );
212 PaintRect( hwndParent, hwnd, hdc, hbrush, &rect );
216 /***********************************************************************
217 * PAINT_GetControlBrush
219 static HBRUSH16 PAINT_GetControlBrush( HWND32 hParent, HWND32 hWnd, HDC16 hDC, UINT16 ctlType )
221 HBRUSH16 bkgBrush = (HBRUSH16)SendMessage32A( hParent, WM_CTLCOLORMSGBOX + ctlType,
222 (WPARAM32)hDC, (LPARAM)hWnd );
223 if( !IsGDIObject(bkgBrush) )
224 bkgBrush = DEFWND_ControlColor( hDC, ctlType );
225 return bkgBrush;
229 /***********************************************************************
230 * PaintRect (USER.325)
232 void WINAPI PaintRect( HWND16 hwndParent, HWND16 hwnd, HDC16 hdc,
233 HBRUSH16 hbrush, const RECT16 *rect)
235 if( hbrush <= CTLCOLOR_MAX )
236 if( hwndParent )
237 hbrush = PAINT_GetControlBrush( hwndParent, hwnd, hdc, (UINT16)hbrush );
238 else
239 return;
240 if( hbrush )
241 FillRect16( hdc, rect, hbrush );
245 /***********************************************************************
246 * GetControlBrush (USER.326)
248 HBRUSH16 WINAPI GetControlBrush( HWND16 hwnd, HDC16 hdc, UINT16 ctlType )
250 WND* wndPtr = WIN_FindWndPtr( hwnd );
252 if((ctlType <= CTLCOLOR_MAX) && wndPtr )
254 WND* parent;
255 if( wndPtr->dwStyle & WS_POPUP ) parent = wndPtr->owner;
256 else parent = wndPtr->parent;
257 if( !parent ) parent = wndPtr;
258 return (HBRUSH16)PAINT_GetControlBrush( parent->hwndSelf, hwnd, hdc, ctlType );
260 return (HBRUSH16)0;
264 /***********************************************************************
265 * PAINT_RedrawWindow
267 * FIXME: Windows uses WM_SYNCPAINT to cut down the number of intertask
268 * SendMessage() calls. This is a comment inside DefWindowProc() source
269 * from 16-bit SDK:
271 * This message avoids lots of inter-app message traffic
272 * by switching to the other task and continuing the
273 * recursion there.
275 * wParam = flags
276 * LOWORD(lParam) = hrgnClip
277 * HIWORD(lParam) = hwndSkip (not used; always NULL)
279 * All in all, a prime candidate for a rewrite.
281 BOOL32 PAINT_RedrawWindow( HWND32 hwnd, const RECT32 *rectUpdate,
282 HRGN32 hrgnUpdate, UINT32 flags, UINT32 control )
284 BOOL32 bIcon;
285 HRGN32 hrgn;
286 RECT32 rectClient;
287 WND* wndPtr;
288 WND **list, **ppWnd;
290 if (!hwnd) hwnd = GetDesktopWindow32();
291 if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return FALSE;
292 if (!WIN_IsWindowDrawable( wndPtr, !(flags & RDW_FRAME) ) )
293 return TRUE; /* No redraw needed */
295 bIcon = (wndPtr->dwStyle & WS_MINIMIZE && wndPtr->class->hIcon);
296 if (rectUpdate)
298 TRACE(win, "%04x %d,%d-%d,%d %04x flags=%04x\n",
299 hwnd, rectUpdate->left, rectUpdate->top,
300 rectUpdate->right, rectUpdate->bottom, hrgnUpdate, flags );
302 else
304 TRACE(win, "%04x NULL %04x flags=%04x\n",
305 hwnd, hrgnUpdate, flags);
308 GetClientRect32( hwnd, &rectClient );
310 if (flags & RDW_INVALIDATE) /* Invalidate */
312 int rgnNotEmpty = COMPLEXREGION;
314 if (wndPtr->hrgnUpdate > 1) /* Is there already an update region? */
316 if ((hrgn = hrgnUpdate) == 0)
317 hrgn = CreateRectRgnIndirect32( rectUpdate ? rectUpdate :
318 &rectClient );
319 rgnNotEmpty = CombineRgn32( wndPtr->hrgnUpdate, wndPtr->hrgnUpdate,
320 hrgn, RGN_OR );
321 if (!hrgnUpdate) DeleteObject32( hrgn );
323 else /* No update region yet */
325 if (!(wndPtr->flags & WIN_INTERNAL_PAINT))
326 QUEUE_IncPaintCount( wndPtr->hmemTaskQ );
327 if (hrgnUpdate)
329 wndPtr->hrgnUpdate = CreateRectRgn32( 0, 0, 0, 0 );
330 rgnNotEmpty = CombineRgn32( wndPtr->hrgnUpdate, hrgnUpdate,
331 0, RGN_COPY );
333 else wndPtr->hrgnUpdate = CreateRectRgnIndirect32( rectUpdate ?
334 rectUpdate : &rectClient );
337 if (flags & RDW_FRAME) wndPtr->flags |= WIN_NEEDS_NCPAINT;
339 /* restrict update region to client area (FIXME: correct?) */
340 if (wndPtr->hrgnUpdate)
342 HRGN32 clientRgn = CreateRectRgnIndirect32( &rectClient );
343 rgnNotEmpty = CombineRgn32( wndPtr->hrgnUpdate, clientRgn,
344 wndPtr->hrgnUpdate, RGN_AND );
345 DeleteObject32( clientRgn );
348 /* check for bogus update region */
349 if ( rgnNotEmpty == NULLREGION )
351 wndPtr->flags &= ~WIN_NEEDS_ERASEBKGND;
352 DeleteObject32( wndPtr->hrgnUpdate );
353 wndPtr->hrgnUpdate=0;
354 if (!(wndPtr->flags & WIN_INTERNAL_PAINT))
355 QUEUE_DecPaintCount( wndPtr->hmemTaskQ );
357 else
358 if (flags & RDW_ERASE) wndPtr->flags |= WIN_NEEDS_ERASEBKGND;
359 flags |= RDW_FRAME; /* Force children frame invalidation */
361 else if (flags & RDW_VALIDATE) /* Validate */
363 /* We need an update region in order to validate anything */
364 if (wndPtr->hrgnUpdate > 1)
366 if (!hrgnUpdate && !rectUpdate)
368 /* Special case: validate everything */
369 DeleteObject32( wndPtr->hrgnUpdate );
370 wndPtr->hrgnUpdate = 0;
372 else
374 if ((hrgn = hrgnUpdate) == 0)
375 hrgn = CreateRectRgnIndirect32( rectUpdate );
376 if (CombineRgn32( wndPtr->hrgnUpdate, wndPtr->hrgnUpdate,
377 hrgn, RGN_DIFF ) == NULLREGION)
379 DeleteObject32( wndPtr->hrgnUpdate );
380 wndPtr->hrgnUpdate = 0;
382 if (!hrgnUpdate) DeleteObject32( hrgn );
384 if (!wndPtr->hrgnUpdate) /* No more update region */
385 if (!(wndPtr->flags & WIN_INTERNAL_PAINT))
386 QUEUE_DecPaintCount( wndPtr->hmemTaskQ );
388 if (flags & RDW_NOFRAME) wndPtr->flags &= ~WIN_NEEDS_NCPAINT;
389 if (flags & RDW_NOERASE) wndPtr->flags &= ~WIN_NEEDS_ERASEBKGND;
392 /* Set/clear internal paint flag */
394 if (flags & RDW_INTERNALPAINT)
396 if ( wndPtr->hrgnUpdate <= 1 && !(wndPtr->flags & WIN_INTERNAL_PAINT))
397 QUEUE_IncPaintCount( wndPtr->hmemTaskQ );
398 wndPtr->flags |= WIN_INTERNAL_PAINT;
400 else if (flags & RDW_NOINTERNALPAINT)
402 if ( wndPtr->hrgnUpdate <= 1 && (wndPtr->flags & WIN_INTERNAL_PAINT))
403 QUEUE_DecPaintCount( wndPtr->hmemTaskQ );
404 wndPtr->flags &= ~WIN_INTERNAL_PAINT;
407 /* Erase/update window */
409 if (flags & RDW_UPDATENOW)
411 if (wndPtr->hrgnUpdate) /* wm_painticon wparam is 1 */
412 SendMessage16( hwnd, (bIcon) ? WM_PAINTICON : WM_PAINT, bIcon, 0 );
414 else if (flags & RDW_ERASENOW)
416 if (wndPtr->flags & WIN_NEEDS_NCPAINT)
417 WIN_UpdateNCArea( wndPtr, FALSE);
419 if (wndPtr->flags & WIN_NEEDS_ERASEBKGND)
421 HDC32 hdc = GetDCEx32( hwnd, wndPtr->hrgnUpdate,
422 DCX_INTERSECTRGN | DCX_USESTYLE |
423 DCX_KEEPCLIPRGN | DCX_WINDOWPAINT |
424 (bIcon ? DCX_WINDOW : 0) );
425 if (hdc)
427 if (SendMessage16( hwnd, (bIcon) ? WM_ICONERASEBKGND
428 : WM_ERASEBKGND,
429 (WPARAM16)hdc, 0 ))
430 wndPtr->flags &= ~WIN_NEEDS_ERASEBKGND;
431 ReleaseDC32( hwnd, hdc );
436 /* Recursively process children */
438 if (!(flags & RDW_NOCHILDREN) &&
439 ((flags & RDW_ALLCHILDREN) || !(wndPtr->dwStyle & WS_CLIPCHILDREN)) &&
440 !(wndPtr->dwStyle & WS_MINIMIZE) )
442 if ( hrgnUpdate || rectUpdate )
444 if (!(hrgn = CreateRectRgn32( 0, 0, 0, 0 ))) return TRUE;
445 if( !hrgnUpdate )
447 control |= (RDW_C_DELETEHRGN | RDW_C_USEHRGN);
448 if( !(hrgnUpdate = CreateRectRgnIndirect32( rectUpdate )) )
450 DeleteObject32( hrgn );
451 return TRUE;
454 if( (list = WIN_BuildWinArray( wndPtr, 0, NULL )) )
456 for (ppWnd = list; *ppWnd; ppWnd++)
458 wndPtr = *ppWnd;
459 if (!IsWindow32(wndPtr->hwndSelf)) continue;
460 if (wndPtr->dwStyle & WS_VISIBLE)
462 SetRectRgn32( hrgn,
463 wndPtr->rectWindow.left, wndPtr->rectWindow.top,
464 wndPtr->rectWindow.right, wndPtr->rectWindow.bottom );
465 if (CombineRgn32( hrgn, hrgn, hrgnUpdate, RGN_AND ))
467 OffsetRgn32( hrgn, -wndPtr->rectClient.left,
468 -wndPtr->rectClient.top );
469 PAINT_RedrawWindow( wndPtr->hwndSelf, NULL, hrgn, flags,
470 RDW_C_USEHRGN );
474 HeapFree( SystemHeap, 0, list );
476 DeleteObject32( hrgn );
477 if (control & RDW_C_DELETEHRGN) DeleteObject32( hrgnUpdate );
479 else
481 if( (list = WIN_BuildWinArray( wndPtr, 0, NULL )) )
483 for (ppWnd = list; *ppWnd; ppWnd++)
485 wndPtr = *ppWnd;
486 if (IsWindow32( wndPtr->hwndSelf ))
487 PAINT_RedrawWindow( wndPtr->hwndSelf, NULL, 0, flags, 0 );
489 HeapFree( SystemHeap, 0, list );
494 return TRUE;
498 /***********************************************************************
499 * RedrawWindow32 (USER32.425)
501 BOOL32 WINAPI RedrawWindow32( HWND32 hwnd, const RECT32 *rectUpdate,
502 HRGN32 hrgnUpdate, UINT32 flags )
504 return PAINT_RedrawWindow( hwnd, rectUpdate, hrgnUpdate, flags, 0 );
508 /***********************************************************************
509 * RedrawWindow16 (USER.290)
511 BOOL16 WINAPI RedrawWindow16( HWND16 hwnd, const RECT16 *rectUpdate,
512 HRGN16 hrgnUpdate, UINT16 flags )
514 if (rectUpdate)
516 RECT32 r;
517 CONV_RECT16TO32( rectUpdate, &r );
518 return (BOOL16)RedrawWindow32( (HWND32)hwnd, &r, hrgnUpdate, flags );
520 return (BOOL16)PAINT_RedrawWindow( (HWND32)hwnd, NULL,
521 (HRGN32)hrgnUpdate, flags, 0 );
525 /***********************************************************************
526 * UpdateWindow16 (USER.124)
528 void WINAPI UpdateWindow16( HWND16 hwnd )
530 PAINT_RedrawWindow( hwnd, NULL, 0, RDW_UPDATENOW | RDW_NOCHILDREN, 0 );
533 /***********************************************************************
534 * UpdateWindow32 (USER32.566)
536 void WINAPI UpdateWindow32( HWND32 hwnd )
538 PAINT_RedrawWindow( hwnd, NULL, 0, RDW_UPDATENOW | RDW_NOCHILDREN, 0 );
541 /***********************************************************************
542 * InvalidateRgn16 (USER.126)
544 void WINAPI InvalidateRgn16( HWND16 hwnd, HRGN16 hrgn, BOOL16 erase )
546 PAINT_RedrawWindow((HWND32)hwnd, NULL, (HRGN32)hrgn,
547 RDW_INVALIDATE | (erase ? RDW_ERASE : 0), 0 );
551 /***********************************************************************
552 * InvalidateRgn32 (USER32.328)
554 void WINAPI InvalidateRgn32( HWND32 hwnd, HRGN32 hrgn, BOOL32 erase )
556 PAINT_RedrawWindow(hwnd, NULL, hrgn, RDW_INVALIDATE | (erase ? RDW_ERASE : 0), 0 );
560 /***********************************************************************
561 * InvalidateRect16 (USER.125)
563 void WINAPI InvalidateRect16( HWND16 hwnd, const RECT16 *rect, BOOL16 erase )
565 RedrawWindow16( hwnd, rect, 0, RDW_INVALIDATE | (erase ? RDW_ERASE : 0) );
569 /***********************************************************************
570 * InvalidateRect32 (USER32.327)
572 void WINAPI InvalidateRect32( HWND32 hwnd, const RECT32 *rect, BOOL32 erase )
574 PAINT_RedrawWindow( hwnd, rect, 0,
575 RDW_INVALIDATE | (erase ? RDW_ERASE : 0), 0 );
579 /***********************************************************************
580 * ValidateRgn16 (USER.128)
582 void WINAPI ValidateRgn16( HWND16 hwnd, HRGN16 hrgn )
584 PAINT_RedrawWindow( (HWND32)hwnd, NULL, (HRGN32)hrgn,
585 RDW_VALIDATE | RDW_NOCHILDREN, 0 );
589 /***********************************************************************
590 * ValidateRgn32 (USER32.571)
592 void WINAPI ValidateRgn32( HWND32 hwnd, HRGN32 hrgn )
594 PAINT_RedrawWindow( hwnd, NULL, hrgn, RDW_VALIDATE | RDW_NOCHILDREN, 0 );
598 /***********************************************************************
599 * ValidateRect16 (USER.127)
601 void WINAPI ValidateRect16( HWND16 hwnd, const RECT16 *rect )
603 RedrawWindow16( hwnd, rect, 0, RDW_VALIDATE | RDW_NOCHILDREN );
607 /***********************************************************************
608 * ValidateRect32 (USER32.570)
610 void WINAPI ValidateRect32( HWND32 hwnd, const RECT32 *rect )
612 PAINT_RedrawWindow( hwnd, rect, 0, RDW_VALIDATE | RDW_NOCHILDREN, 0 );
616 /***********************************************************************
617 * GetUpdateRect16 (USER.190)
619 BOOL16 WINAPI GetUpdateRect16( HWND16 hwnd, LPRECT16 rect, BOOL16 erase )
621 RECT32 r;
622 BOOL16 ret;
624 if (!rect) return GetUpdateRect32( hwnd, NULL, erase );
625 ret = GetUpdateRect32( hwnd, &r, erase );
626 CONV_RECT32TO16( &r, rect );
627 return ret;
631 /***********************************************************************
632 * GetUpdateRect32 (USER32.296)
634 BOOL32 WINAPI GetUpdateRect32( HWND32 hwnd, LPRECT32 rect, BOOL32 erase )
636 WND * wndPtr = WIN_FindWndPtr( hwnd );
637 if (!wndPtr) return FALSE;
639 if (rect)
641 if (wndPtr->hrgnUpdate > 1)
643 HRGN32 hrgn = CreateRectRgn32( 0, 0, 0, 0 );
644 if (GetUpdateRgn32( hwnd, hrgn, erase ) == ERROR) return FALSE;
645 GetRgnBox32( hrgn, rect );
646 DeleteObject32( hrgn );
648 else SetRectEmpty32( rect );
650 return (wndPtr->hrgnUpdate > 1);
654 /***********************************************************************
655 * GetUpdateRgn16 (USER.237)
657 INT16 WINAPI GetUpdateRgn16( HWND16 hwnd, HRGN16 hrgn, BOOL16 erase )
659 return GetUpdateRgn32( hwnd, hrgn, erase );
663 /***********************************************************************
664 * GetUpdateRgn32 (USER32.297)
666 INT32 WINAPI GetUpdateRgn32( HWND32 hwnd, HRGN32 hrgn, BOOL32 erase )
668 INT32 retval;
669 WND * wndPtr = WIN_FindWndPtr( hwnd );
670 if (!wndPtr) return ERROR;
672 if (wndPtr->hrgnUpdate <= 1)
674 SetRectRgn32( hrgn, 0, 0, 0, 0 );
675 return NULLREGION;
677 retval = CombineRgn32( hrgn, wndPtr->hrgnUpdate, 0, RGN_COPY );
678 if (erase) RedrawWindow32( hwnd, NULL, 0, RDW_ERASENOW | RDW_NOCHILDREN );
679 return retval;
683 /***********************************************************************
684 * ExcludeUpdateRgn16 (USER.238)
686 INT16 WINAPI ExcludeUpdateRgn16( HDC16 hdc, HWND16 hwnd )
688 return ExcludeUpdateRgn32( hdc, hwnd );
692 /***********************************************************************
693 * ExcludeUpdateRgn32 (USER32.194)
695 INT32 WINAPI ExcludeUpdateRgn32( HDC32 hdc, HWND32 hwnd )
697 RECT32 rect;
698 WND * wndPtr;
700 if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return ERROR;
702 if (wndPtr->hrgnUpdate)
704 INT32 ret;
705 HRGN32 hrgn = CreateRectRgn32(wndPtr->rectWindow.left - wndPtr->rectClient.left,
706 wndPtr->rectWindow.top - wndPtr->rectClient.top,
707 wndPtr->rectClient.right - wndPtr->rectClient.left,
708 wndPtr->rectClient.bottom - wndPtr->rectClient.top);
709 if( wndPtr->hrgnUpdate > 1 )
710 CombineRgn32(hrgn, wndPtr->hrgnUpdate, 0, RGN_COPY);
712 /* do ugly coordinate translations in dce.c */
714 ret = DCE_ExcludeRgn( hdc, wndPtr, hrgn );
715 DeleteObject32( hrgn );
716 return ret;
718 return GetClipBox32( hdc, &rect );