2 * Unit test suite for clipping
4 * Copyright 2005 Huw Davies
5 * Copyright 2008,2011,2013 Dmitry Timoshkov
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
22 #include "wine/test.h"
27 static void test_GetRandomRgn(void)
29 HWND hwnd
= CreateWindowExA(0,"BUTTON","test",WS_VISIBLE
|WS_POPUP
,0,0,100,100,GetDesktopWindow(),0,0,0);
31 HRGN hrgn
= CreateRectRgn(0, 0, 0, 0);
34 RECT ret_rc
, window_rc
;
36 ok( hwnd
!= 0, "CreateWindow failed\n" );
38 SetRect(&window_rc
, 400, 300, 500, 400);
39 SetWindowPos(hwnd
, HWND_TOPMOST
, window_rc
.left
, window_rc
.top
,
40 window_rc
.right
- window_rc
.left
, window_rc
.bottom
- window_rc
.top
, 0 );
43 ret
= GetRandomRgn(hdc
, hrgn
, 1);
44 ok(ret
== 0, "GetRandomRgn rets %d\n", ret
);
45 ret
= GetRandomRgn(hdc
, hrgn
, 2);
46 ok(ret
== 0, "GetRandomRgn rets %d\n", ret
);
47 ret
= GetRandomRgn(hdc
, hrgn
, 3);
48 ok(ret
== 0, "GetRandomRgn rets %d\n", ret
);
50 /* Set a clip region */
51 SetRect(&rc
, 20, 20, 80, 80);
52 IntersectClipRect(hdc
, rc
.left
, rc
.top
, rc
.right
, rc
.bottom
);
54 ret
= GetRandomRgn(hdc
, hrgn
, 1);
55 ok(ret
!= 0, "GetRandomRgn rets %d\n", ret
);
56 GetRgnBox(hrgn
, &ret_rc
);
57 ok(EqualRect(&rc
, &ret_rc
), "GetRandomRgn %s\n", wine_dbgstr_rect(&ret_rc
));
59 ret
= GetRandomRgn(hdc
, hrgn
, 2);
60 ok(ret
== 0, "GetRandomRgn rets %d\n", ret
);
62 ret
= GetRandomRgn(hdc
, hrgn
, 3);
63 ok(ret
!= 0, "GetRandomRgn rets %d\n", ret
);
64 GetRgnBox(hrgn
, &ret_rc
);
65 ok(EqualRect(&rc
, &ret_rc
), "GetRandomRgn %s\n", wine_dbgstr_rect(&ret_rc
));
67 /* Move the clip to the meta and clear the clip */
70 ret
= GetRandomRgn(hdc
, hrgn
, 1);
71 ok(ret
== 0, "GetRandomRgn rets %d\n", ret
);
72 ret
= GetRandomRgn(hdc
, hrgn
, 2);
73 ok(ret
!= 0, "GetRandomRgn rets %d\n", ret
);
74 GetRgnBox(hrgn
, &ret_rc
);
75 ok(EqualRect(&rc
, &ret_rc
), "GetRandomRgn %s\n", wine_dbgstr_rect(&ret_rc
));
77 ret
= GetRandomRgn(hdc
, hrgn
, 3);
78 ok(ret
!= 0, "GetRandomRgn rets %d\n", ret
);
79 GetRgnBox(hrgn
, &ret_rc
);
80 ok(EqualRect(&rc
, &ret_rc
), "GetRandomRgn %s\n", wine_dbgstr_rect(&ret_rc
));
82 /* Set a new clip (still got the meta) */
83 SetRect(&rc2
, 10, 30, 70, 90);
84 IntersectClipRect(hdc
, rc2
.left
, rc2
.top
, rc2
.right
, rc2
.bottom
);
86 ret
= GetRandomRgn(hdc
, hrgn
, 1);
87 ok(ret
!= 0, "GetRandomRgn rets %d\n", ret
);
88 GetRgnBox(hrgn
, &ret_rc
);
89 ok(EqualRect(&rc2
, &ret_rc
), "GetRandomRgn %s\n", wine_dbgstr_rect(&ret_rc
));
91 ret
= GetRandomRgn(hdc
, hrgn
, 2);
92 ok(ret
!= 0, "GetRandomRgn rets %d\n", ret
);
93 GetRgnBox(hrgn
, &ret_rc
);
94 ok(EqualRect(&rc
, &ret_rc
), "GetRandomRgn %s\n", wine_dbgstr_rect(&ret_rc
));
96 IntersectRect(&rc2
, &rc
, &rc2
);
98 ret
= GetRandomRgn(hdc
, hrgn
, 3);
99 ok(ret
!= 0, "GetRandomRgn rets %d\n", ret
);
100 GetRgnBox(hrgn
, &ret_rc
);
101 ok(EqualRect(&rc2
, &ret_rc
), "GetRandomRgn %s\n", wine_dbgstr_rect(&ret_rc
));
104 ret
= GetRandomRgn(hdc
, hrgn
, SYSRGN
);
105 ok(ret
!= 0, "GetRandomRgn rets %d\n", ret
);
106 GetRgnBox(hrgn
, &ret_rc
);
107 if(GetVersion() & 0x80000000)
108 OffsetRect(&window_rc
, -window_rc
.left
, -window_rc
.top
);
109 /* the window may be partially obscured so the region may be smaller */
110 IntersectRect( &window_rc
, &ret_rc
, &ret_rc
);
111 ok(EqualRect(&window_rc
, &ret_rc
), "GetRandomRgn %s\n", wine_dbgstr_rect(&ret_rc
));
114 ReleaseDC(hwnd
, hdc
);
118 static void verify_region(HRGN hrgn
, const RECT
*rc
)
123 char buf
[sizeof(RGNDATAHEADER
) + sizeof(RECT
)];
128 ret
= GetRegionData(hrgn
, 0, NULL
);
130 ok(ret
== sizeof(rgn
.data
.rdh
), "expected sizeof(rdh), got %u\n", ret
);
132 ok(ret
== sizeof(rgn
.data
.rdh
) + sizeof(RECT
), "expected sizeof(rgn), got %u\n", ret
);
136 ret
= GetRegionData(hrgn
, sizeof(rgn
), &rgn
.data
);
138 ok(ret
== sizeof(rgn
.data
.rdh
), "expected sizeof(rdh), got %u\n", ret
);
140 ok(ret
== sizeof(rgn
.data
.rdh
) + sizeof(RECT
), "expected sizeof(rgn), got %u\n", ret
);
142 trace("size %u, type %u, count %u, rgn size %u, bound %s\n",
143 rgn
.data
.rdh
.dwSize
, rgn
.data
.rdh
.iType
, rgn
.data
.rdh
.nCount
, rgn
.data
.rdh
.nRgnSize
,
144 wine_dbgstr_rect(&rgn
.data
.rdh
.rcBound
));
145 if (rgn
.data
.rdh
.nCount
!= 0)
147 rect
= (const RECT
*)rgn
.data
.Buffer
;
148 trace("rect %s\n", wine_dbgstr_rect(rect
));
149 ok(EqualRect(rect
, rc
), "rects don't match\n");
152 ok(rgn
.data
.rdh
.dwSize
== sizeof(rgn
.data
.rdh
), "expected sizeof(rdh), got %u\n", rgn
.data
.rdh
.dwSize
);
153 ok(rgn
.data
.rdh
.iType
== RDH_RECTANGLES
, "expected RDH_RECTANGLES, got %u\n", rgn
.data
.rdh
.iType
);
156 ok(rgn
.data
.rdh
.nCount
== 0, "expected 0, got %u\n", rgn
.data
.rdh
.nCount
);
157 ok(rgn
.data
.rdh
.nRgnSize
== 0 ||
158 broken(rgn
.data
.rdh
.nRgnSize
== 168), /* NT4 */
159 "expected 0, got %u\n", rgn
.data
.rdh
.nRgnSize
);
163 ok(rgn
.data
.rdh
.nCount
== 1, "expected 1, got %u\n", rgn
.data
.rdh
.nCount
);
164 ok(rgn
.data
.rdh
.nRgnSize
== sizeof(RECT
) ||
165 broken(rgn
.data
.rdh
.nRgnSize
== 168), /* NT4 */
166 "expected sizeof(RECT), got %u\n", rgn
.data
.rdh
.nRgnSize
);
168 ok(EqualRect(&rgn
.data
.rdh
.rcBound
, rc
), "rects don't match\n");
171 static void test_ExtCreateRegion(void)
173 static const RECT empty_rect
;
174 static const RECT rc
= { 111, 222, 333, 444 };
175 static const RECT arc
[2] = { {0, 0, 10, 10}, {10, 10, 20, 20}};
176 static const RECT rc_xformed
= { 76, 151, 187, 262 };
180 char buf
[sizeof(RGNDATAHEADER
) + 2 * sizeof(RECT
)];
185 if (0) /* crashes under Win9x */
187 SetLastError(0xdeadbeef);
188 hrgn
= ExtCreateRegion(NULL
, 0, NULL
);
189 ok(!hrgn
, "ExtCreateRegion should fail\n");
190 ok(GetLastError() == ERROR_INVALID_PARAMETER
, "ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
193 rgn
.data
.rdh
.dwSize
= 0;
194 rgn
.data
.rdh
.iType
= 0;
195 rgn
.data
.rdh
.nCount
= 0;
196 rgn
.data
.rdh
.nRgnSize
= 0;
197 SetRectEmpty(&rgn
.data
.rdh
.rcBound
);
198 memcpy(rgn
.data
.Buffer
, &rc
, sizeof(rc
));
200 SetLastError(0xdeadbeef);
201 hrgn
= ExtCreateRegion(NULL
, sizeof(rgn
), &rgn
.data
);
202 ok(!hrgn
, "ExtCreateRegion should fail\n");
203 ok(GetLastError() == 0xdeadbeef, "0xdeadbeef, got %u\n", GetLastError());
205 rgn
.data
.rdh
.dwSize
= sizeof(rgn
.data
.rdh
) - 1;
207 SetLastError(0xdeadbeef);
208 hrgn
= ExtCreateRegion(NULL
, sizeof(rgn
), &rgn
.data
);
209 ok(!hrgn
, "ExtCreateRegion should fail\n");
210 ok(GetLastError() == 0xdeadbeef, "0xdeadbeef, got %u\n", GetLastError());
212 /* although XP doesn't care about the type Win9x does */
213 rgn
.data
.rdh
.iType
= RDH_RECTANGLES
;
214 rgn
.data
.rdh
.dwSize
= sizeof(rgn
.data
.rdh
);
216 /* sizeof(RGNDATAHEADER) is large enough */
217 SetLastError(0xdeadbeef);
218 hrgn
= ExtCreateRegion(NULL
, sizeof(RGNDATAHEADER
), &rgn
.data
);
219 ok(hrgn
!= 0, "ExtCreateRegion error %u\n", GetLastError());
220 verify_region(hrgn
, &empty_rect
);
223 /* Cannot be smaller than sizeof(RGNDATAHEADER) */
224 SetLastError(0xdeadbeef);
225 hrgn
= ExtCreateRegion(NULL
, sizeof(RGNDATAHEADER
) - 1, &rgn
.data
);
227 ok(!hrgn
, "ExtCreateRegion should fail\n");
228 ok(GetLastError() == 0xdeadbeef, "0xdeadbeef, got %u\n", GetLastError());
230 SetLastError(0xdeadbeef);
231 hrgn
= ExtCreateRegion(NULL
, sizeof(rgn
), &rgn
.data
);
232 ok(hrgn
!= 0, "ExtCreateRegion error %u\n", GetLastError());
233 verify_region(hrgn
, &empty_rect
);
236 rgn
.data
.rdh
.nCount
= 1;
237 SetRectEmpty(&rgn
.data
.rdh
.rcBound
);
238 memcpy(rgn
.data
.Buffer
, &rc
, sizeof(rc
));
240 /* With a single rect this seems to work... */
241 SetLastError(0xdeadbeef);
242 hrgn
= ExtCreateRegion(NULL
, sizeof(RGNDATAHEADER
) + sizeof(RECT
) - 1, &rgn
.data
);
243 ok(hrgn
!= 0, "ExtCreateRegion error %u\n", GetLastError());
244 verify_region(hrgn
, &rc
);
247 SetLastError(0xdeadbeef);
248 hrgn
= ExtCreateRegion(NULL
, sizeof(rgn
), &rgn
.data
);
249 ok(hrgn
!= 0, "ExtCreateRegion error %u\n", GetLastError());
250 verify_region(hrgn
, &rc
);
253 rgn
.data
.rdh
.dwSize
= sizeof(rgn
.data
.rdh
) + 1;
255 SetLastError(0xdeadbeef);
256 hrgn
= ExtCreateRegion(NULL
, 1, &rgn
.data
);
258 broken(GetLastError() == 0xdeadbeef), /* NT4 */
259 "ExtCreateRegion error %u\n", GetLastError());
262 verify_region(hrgn
, &rc
);
266 xform
.eM11
= 0.5; /* 50% width */
269 xform
.eM22
= 0.5; /* 50% height */
273 rgn
.data
.rdh
.dwSize
= sizeof(rgn
.data
.rdh
);
275 SetLastError(0xdeadbeef);
276 hrgn
= ExtCreateRegion(&xform
, sizeof(rgn
), &rgn
.data
);
277 ok(hrgn
!= 0, "ExtCreateRegion error %u/%x\n", GetLastError(), GetLastError());
278 verify_region(hrgn
, &rc_xformed
);
281 rgn
.data
.rdh
.nCount
= 2;
282 SetRectEmpty(&rgn
.data
.rdh
.rcBound
);
283 memcpy(rgn
.data
.Buffer
, arc
, sizeof(arc
));
285 /* Buffer cannot be smaller than sizeof(RGNDATAHEADER) + 2 * sizeof(RECT) */
286 SetLastError(0xdeadbeef);
287 hrgn
= ExtCreateRegion(NULL
, sizeof(RGNDATAHEADER
) + 2 * sizeof(RECT
) - 1, &rgn
.data
);
289 ok(!hrgn
, "ExtCreateRegion should fail\n");
290 ok(GetLastError() == 0xdeadbeef, "0xdeadbeef, got %u\n", GetLastError());
294 static void test_GetClipRgn(void)
297 HRGN hrgn
, hrgn2
, hrgn3
, hrgn4
;
300 /* Test calling GetClipRgn with NULL device context and region handles. */
301 ret
= GetClipRgn(NULL
, NULL
);
302 ok(ret
== -1, "Expected GetClipRgn to return -1, got %d\n", ret
);
305 ok(hdc
!= NULL
, "Expected GetDC to return a valid device context handle\n");
307 /* Test calling GetClipRgn with a valid device context and NULL region. */
308 ret
= GetClipRgn(hdc
, NULL
);
310 ret
== -1 /* Win9x */,
311 "Expected GetClipRgn to return 0, got %d\n", ret
);
313 /* Initialize the test regions. */
314 hrgn
= CreateRectRgn(100, 100, 100, 100);
316 "Expected CreateRectRgn to return a handle to a new rectangular region\n");
318 hrgn2
= CreateRectRgn(1, 2, 3, 4);
320 "Expected CreateRectRgn to return a handle to a new rectangular region\n");
322 hrgn3
= CreateRectRgn(1, 2, 3, 4);
324 "Expected CreateRectRgn to return a handle to a new rectangular region\n");
326 hrgn4
= CreateRectRgn(1, 2, 3, 4);
328 "Expected CreateRectRgn to return a handle to a new rectangular region\n");
330 /* Try getting a clipping region from the device context
331 * when the device context's clipping region isn't set. */
332 ret
= GetClipRgn(hdc
, hrgn2
);
333 ok(ret
== 0, "Expected GetClipRgn to return 0, got %d\n", ret
);
335 /* The region passed to GetClipRgn should be unchanged. */
336 ret
= EqualRgn(hrgn2
, hrgn3
);
338 "Expected EqualRgn to compare the two regions as equal, got %d\n", ret
);
340 /* Try setting and getting back a clipping region. */
341 ret
= SelectClipRgn(hdc
, hrgn
);
342 ok(ret
== NULLREGION
,
343 "Expected SelectClipRgn to return NULLREGION, got %d\n", ret
);
345 /* Passing a NULL region handle when the device context
346 * has a clipping region results in an error. */
347 ret
= GetClipRgn(hdc
, NULL
);
348 ok(ret
== -1, "Expected GetClipRgn to return -1, got %d\n", ret
);
350 ret
= GetClipRgn(hdc
, hrgn2
);
351 ok(ret
== 1, "Expected GetClipRgn to return 1, got %d\n", ret
);
353 ret
= EqualRgn(hrgn
, hrgn2
);
355 "Expected EqualRgn to compare the two regions as equal, got %d\n", ret
);
357 /* Try unsetting and then query the clipping region. */
358 ret
= SelectClipRgn(hdc
, NULL
);
359 ok(ret
== SIMPLEREGION
|| (ret
== COMPLEXREGION
&& GetSystemMetrics(SM_CMONITORS
) > 1),
360 "Expected SelectClipRgn to return SIMPLEREGION, got %d\n", ret
);
362 ret
= GetClipRgn(hdc
, NULL
);
364 ret
== -1 /* Win9x */,
365 "Expected GetClipRgn to return 0, got %d\n", ret
);
367 ret
= GetClipRgn(hdc
, hrgn3
);
368 ok(ret
== 0, "Expected GetClipRgn to return 0, got %d\n", ret
);
370 ret
= EqualRgn(hrgn3
, hrgn4
);
372 "Expected EqualRgn to compare the two regions as equal, got %d\n", ret
);
378 ReleaseDC(NULL
, hdc
);
381 static void test_memory_dc_clipping(void)
384 HRGN hrgn
, hrgn_empty
;
389 hdc
= CreateCompatibleDC(0);
390 hrgn_empty
= CreateRectRgn(0, 0, 0, 0);
391 hrgn
= CreateRectRgn(0, 0, 0, 0);
392 hbmp
= CreateCompatibleBitmap(hdc
, 100, 100);
394 ret
= GetClipRgn(hdc
, hrgn
);
395 ok(ret
== 0, "expected 0, got %d\n", ret
);
397 ret
= ExtSelectClipRgn(hdc
, hrgn_empty
, RGN_DIFF
);
398 ok(ret
== SIMPLEREGION
, "expected SIMPLEREGION, got %d\n", ret
);
400 ret
= GetClipRgn(hdc
, hrgn
);
401 ok(ret
== 1, "expected 1, got %d\n", ret
);
403 ret
= GetRgnBox(hrgn
, &rc
);
404 ok(ret
== SIMPLEREGION
, "expected SIMPLEREGION, got %d\n", ret
);
405 ok(rc
.left
== 0 && rc
.top
== 0 && rc
.right
== 1 && rc
.bottom
== 1,
406 "expected 0,0-1,1, got %s\n", wine_dbgstr_rect(&rc
));
408 ret
= ExtSelectClipRgn(hdc
, 0, RGN_COPY
);
409 ok(ret
== SIMPLEREGION
, "expected SIMPLEREGION, got %d\n", ret
);
411 ret
= GetClipRgn(hdc
, hrgn
);
412 ok(ret
== 0, "expected 0, got %d\n", ret
);
414 ret
= ExtSelectClipRgn(hdc
, 0, RGN_DIFF
);
415 ok(ret
== 0, "expected 0, got %d\n", ret
);
417 ret
= GetClipRgn(hdc
, hrgn
);
418 ok(ret
== 0, "expected 0, got %d\n", ret
);
420 SelectObject(hdc
, hbmp
);
422 ret
= ExtSelectClipRgn(hdc
, hrgn_empty
, RGN_DIFF
);
423 ok(ret
== SIMPLEREGION
, "expected SIMPLEREGION, got %d\n", ret
);
425 ret
= GetClipRgn(hdc
, hrgn
);
426 ok(ret
== 1, "expected 1, got %d\n", ret
);
428 ret
= GetRgnBox(hrgn
, &rc
);
429 ok(ret
== SIMPLEREGION
, "expected SIMPLEREGION, got %d\n", ret
);
430 ok(rc
.left
== 0 && rc
.top
== 0 && rc
.right
== 100 && rc
.bottom
== 100,
431 "expected 0,0-100,100, got %s\n", wine_dbgstr_rect(&rc
));
433 SetRect( &rc
, 10, 10, 20, 20 );
434 ret
= RectVisible( hdc
, &rc
);
435 ok(ret
, "RectVisible failed for %s\n", wine_dbgstr_rect(&rc
));
437 SetRect( &rc
, 20, 20, 10, 10 );
438 ret
= RectVisible( hdc
, &rc
);
439 ok(ret
, "RectVisible failed for %s\n", wine_dbgstr_rect(&rc
));
441 ret
= ExtSelectClipRgn(hdc
, 0, RGN_DIFF
);
442 ok(ret
== 0, "expected 0, got %d\n", ret
);
444 ret
= GetClipRgn(hdc
, hrgn
);
445 ok(ret
== 1, "expected 1, got %d\n", ret
);
447 ret
= GetRgnBox(hrgn
, &rc
);
448 ok(ret
== SIMPLEREGION
, "expected SIMPLEREGION, got %d\n", ret
);
449 ok(rc
.left
== 0 && rc
.top
== 0 && rc
.right
== 100 && rc
.bottom
== 100,
450 "expected 0,0-100,100, got %s\n", wine_dbgstr_rect(&rc
));
454 DeleteObject(hrgn_empty
);
458 static void test_window_dc_clipping(void)
461 HRGN hrgn
, hrgn_empty
;
463 RECT rc
, virtual_rect
;
464 int ret
, screen_width
, screen_height
;
466 /* Windows versions earlier than Win2k do not support the virtual screen metrics,
467 * so we fall back to the primary screen metrics. */
468 screen_width
= GetSystemMetrics(SM_CXVIRTUALSCREEN
);
469 if(!screen_width
) screen_width
= GetSystemMetrics(SM_CXSCREEN
);
470 screen_height
= GetSystemMetrics(SM_CYVIRTUALSCREEN
);
471 if(!screen_height
) screen_height
= GetSystemMetrics(SM_CYSCREEN
);
472 SetRect(&virtual_rect
, GetSystemMetrics(SM_XVIRTUALSCREEN
), GetSystemMetrics(SM_YVIRTUALSCREEN
),
473 GetSystemMetrics(SM_XVIRTUALSCREEN
) + screen_width
, GetSystemMetrics(SM_YVIRTUALSCREEN
) + screen_height
);
475 trace("screen resolution %d x %d\n", screen_width
, screen_height
);
477 hwnd
= CreateWindowExA(0, "static", NULL
, WS_POPUP
,
478 -100, -100, screen_width
* 2, screen_height
* 2, 0, 0, 0, NULL
);
479 hdc
= GetWindowDC(0);
480 hrgn_empty
= CreateRectRgn(0, 0, 0, 0);
481 hrgn
= CreateRectRgn(0, 0, 0, 0);
483 ret
= GetClipRgn(hdc
, hrgn
);
484 ok(ret
== 0, "expected 0, got %d\n", ret
);
486 ret
= ExtSelectClipRgn(hdc
, 0, RGN_DIFF
);
487 ok(ret
== 0, "expected 0, got %d\n", ret
);
489 ret
= GetClipRgn(hdc
, hrgn
);
490 ok(ret
== 0, "expected 0, got %d\n", ret
);
492 ret
= ExtSelectClipRgn(hdc
, hrgn_empty
, RGN_DIFF
);
493 ok(ret
== SIMPLEREGION
|| (ret
== COMPLEXREGION
&& GetSystemMetrics(SM_CMONITORS
) > 1),
494 "expected SIMPLEREGION, got %d\n", ret
);
496 ret
= GetClipRgn(hdc
, hrgn
);
497 ok(ret
== 1, "expected 1, got %d\n", ret
);
499 ret
= GetRgnBox(hrgn
, &rc
);
500 ok(ret
== SIMPLEREGION
, "expected SIMPLEREGION, got %d\n", ret
);
501 ok(EqualRect(&rc
, &virtual_rect
), "expected %s, got %s\n", wine_dbgstr_rect(&virtual_rect
),
502 wine_dbgstr_rect(&rc
));
504 SetRect( &rc
, 10, 10, 20, 20 );
505 ret
= RectVisible( hdc
, &rc
);
506 ok( ret
, "RectVisible failed for %s\n", wine_dbgstr_rect(&rc
));
508 SetRect( &rc
, 20, 20, 10, 10 );
509 ret
= RectVisible( hdc
, &rc
);
510 ok( ret
, "RectVisible failed for %s\n", wine_dbgstr_rect(&rc
));
512 ret
= ExtSelectClipRgn(hdc
, 0, RGN_DIFF
);
513 ok(ret
== 0, "expected 0, got %d\n", ret
);
515 ret
= GetClipRgn(hdc
, hrgn
);
516 ok(ret
== 1, "expected 1, got %d\n", ret
);
518 ret
= GetRgnBox(hrgn
, &rc
);
519 ok(ret
== SIMPLEREGION
, "expected SIMPLEREGION, got %d\n", ret
);
520 ok(EqualRect(&rc
, &virtual_rect
), "expected %s, got %s\n", wine_dbgstr_rect(&virtual_rect
),
521 wine_dbgstr_rect(&rc
));
523 ret
= ExtSelectClipRgn(hdc
, 0, RGN_COPY
);
524 ok(ret
== SIMPLEREGION
|| (ret
== COMPLEXREGION
&& GetSystemMetrics(SM_CMONITORS
) > 1),
525 "expected SIMPLEREGION, got %d\n", ret
);
527 ret
= GetClipRgn(hdc
, hrgn
);
528 ok(ret
== 0, "expected 0, got %d\n", ret
);
532 DeleteObject(hrgn_empty
);
540 test_ExtCreateRegion();
542 test_memory_dc_clipping();
543 test_window_dc_clipping();