Release 0.3.0
[wine/multimedia.git] / windows / clipping.c
blob80b19d29dd77cf10f7e0a5e67c18e9331be6bf1f
1 /*
2 * Window clipping functions
4 * Copyright 1993 Alexandre Julliard
5 */
7 static char Copyright[] = "Copyright Alexandre Julliard, 1993";
9 #include <stdio.h>
11 #include "windows.h"
12 #include "win.h"
15 /***********************************************************************
16 * InvalidateRgn (USER.126)
18 void InvalidateRgn( HWND hwnd, HRGN hrgn, BOOL erase )
20 HRGN newRgn;
21 WND * wndPtr = WIN_FindWndPtr( hwnd );
22 if (!wndPtr) return;
24 if (!hrgn)
26 newRgn = CreateRectRgn(0, 0,
27 wndPtr->rectClient.right-wndPtr->rectClient.left,
28 wndPtr->rectClient.bottom-wndPtr->rectClient.top );
30 else
32 if (!(newRgn = CreateRectRgn( 0, 0, 0, 0 ))) return;
33 if (!wndPtr->hrgnUpdate) CombineRgn( newRgn, hrgn, 0, RGN_COPY );
34 else CombineRgn( newRgn, wndPtr->hrgnUpdate, hrgn, RGN_OR );
36 if (wndPtr->hrgnUpdate) DeleteObject( wndPtr->hrgnUpdate );
37 wndPtr->hrgnUpdate = newRgn;
38 if (erase) wndPtr->flags |= WIN_ERASE_UPDATERGN;
42 /***********************************************************************
43 * InvalidateRect (USER.125)
45 void InvalidateRect( HWND hwnd, LPRECT rect, BOOL erase )
47 HRGN hrgn = 0;
49 WND * wndPtr = WIN_FindWndPtr( hwnd );
50 if (!wndPtr) return;
52 #ifdef DEBUG_WIN
53 if (rect) printf( "InvalidateRect: %d %d,%d-%d,%d\n", hwnd,
54 rect->left, rect->top, rect->right, rect->bottom );
55 else printf( "InvalidateRect: %d NULL\n", hwnd );
56 #endif
57 if (rect) hrgn = CreateRectRgnIndirect( rect );
58 InvalidateRgn( hwnd, hrgn, erase );
59 if (hrgn) DeleteObject( hrgn );
63 /***********************************************************************
64 * ValidateRgn (USER.128)
66 void ValidateRgn( HWND hwnd, HRGN hrgn )
68 HRGN newRgn;
69 WND * wndPtr = WIN_FindWndPtr( hwnd );
70 if (!wndPtr) return;
72 if (!wndPtr->hrgnUpdate) return;
73 if (!hrgn) newRgn = 0;
74 else
76 if (!(newRgn = CreateRectRgn( 0, 0, 0, 0 ))) return;
77 if (CombineRgn( newRgn, wndPtr->hrgnUpdate, hrgn, RGN_DIFF ) == NULLREGION)
79 DeleteObject( newRgn );
80 newRgn = 0;
83 DeleteObject( wndPtr->hrgnUpdate );
84 wndPtr->hrgnUpdate = newRgn;
85 if (!wndPtr->hrgnUpdate) wndPtr->flags &= ~WIN_ERASE_UPDATERGN;
89 /***********************************************************************
90 * ValidateRect (USER.127)
92 void ValidateRect( HWND hwnd, LPRECT rect )
94 HRGN hrgn = 0;
96 WND * wndPtr = WIN_FindWndPtr( hwnd );
97 if (!wndPtr) return;
99 if (rect) hrgn = CreateRectRgnIndirect( rect );
100 ValidateRgn( hwnd, hrgn );
101 if (hrgn) DeleteObject( hrgn );
105 /***********************************************************************
106 * GetUpdateRect (USER.190)
108 BOOL GetUpdateRect( HWND hwnd, LPRECT rect, BOOL erase )
110 BOOL retval;
111 WND * wndPtr = WIN_FindWndPtr( hwnd );
112 if (!wndPtr) return FALSE;
114 retval = (wndPtr->hrgnUpdate != 0);
116 if (rect)
118 if (wndPtr->hrgnUpdate) GetRgnBox( wndPtr->hrgnUpdate, rect );
119 else SetRectEmpty( rect );
120 if (erase && wndPtr->hrgnUpdate)
122 HDC hdc = GetDC( hwnd );
123 if (hdc)
125 SendMessage( hwnd, WM_ERASEBKGND, hdc, 0 );
126 ReleaseDC( hwnd, hdc );
130 GlobalUnlock( hwnd );
131 return retval;
135 /***********************************************************************
136 * GetUpdateRgn (USER.237)
138 int GetUpdateRgn( HWND hwnd, HRGN hrgn, BOOL erase )
140 int retval;
141 WND * wndPtr = WIN_FindWndPtr( hwnd );
142 if (!wndPtr) return ERROR;
144 if (erase && wndPtr->hrgnUpdate)
146 HDC hdc = GetDC( hwnd );
147 if (hdc)
149 SendMessage( hwnd, WM_ERASEBKGND, hdc, 0 );
150 ReleaseDC( hwnd, hdc );
153 retval = CombineRgn( hrgn, wndPtr->hrgnUpdate, 0, RGN_COPY );
154 GlobalUnlock( hwnd );
155 return retval;