ReactOS 0.4.17-dev-116-ga4b6fe9
clipping.c
Go to the documentation of this file.
1/*
2 * Unit test suite for clipping
3 *
4 * Copyright 2005 Huw Davies
5 * Copyright 2008,2011,2013 Dmitry Timoshkov
6 *
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.
11 *
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.
16 *
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
20 */
21
22#include "wine/test.h"
23#include "winbase.h"
24#include "wingdi.h"
25#include "winuser.h"
26
27static void test_GetRandomRgn(void)
28{
29 HWND hwnd = CreateWindowExA(0,"BUTTON","test",WS_VISIBLE|WS_POPUP,0,0,100,100,GetDesktopWindow(),0,0,0);
30 HDC hdc;
31 HRGN hrgn = CreateRectRgn(0, 0, 0, 0);
32 int ret;
33 RECT rc, rc2;
34 RECT ret_rc, window_rc;
35
36 ok( hwnd != 0, "CreateWindow failed\n" );
37
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 );
41 hdc = GetDC(hwnd);
42
43 ret = GetRandomRgn(hdc, hrgn, 1);
44 ok(ret == 0, "GetRandomRgn rets %d\n", ret);
45 ret = GetRandomRgn(hdc, NULL, 1);
46 ok(ret == 0, "GetRandomRgn rets %d\n", ret);
47 ret = GetRandomRgn(hdc, hrgn, 2);
48 ok(ret == 0, "GetRandomRgn rets %d\n", ret);
49 ret = GetRandomRgn(hdc, hrgn, 3);
50 ok(ret == 0, "GetRandomRgn rets %d\n", ret);
51
52 /* Set a clip region */
53 SetRect(&rc, 20, 20, 80, 80);
54 IntersectClipRect(hdc, rc.left, rc.top, rc.right, rc.bottom);
55
56 ret = GetRandomRgn(hdc, hrgn, 1);
57 ok(ret != 0, "GetRandomRgn rets %d\n", ret);
58 GetRgnBox(hrgn, &ret_rc);
59 ok(EqualRect(&rc, &ret_rc), "GetRandomRgn %s\n", wine_dbgstr_rect(&ret_rc));
60
61 ret = GetRandomRgn(hdc, hrgn, 2);
62 ok(ret == 0, "GetRandomRgn rets %d\n", ret);
63
64 ret = GetRandomRgn(hdc, hrgn, 3);
65 ok(ret != 0, "GetRandomRgn rets %d\n", ret);
66 GetRgnBox(hrgn, &ret_rc);
67 ok(EqualRect(&rc, &ret_rc), "GetRandomRgn %s\n", wine_dbgstr_rect(&ret_rc));
68
69 /* Move the clip to the meta and clear the clip */
71
72 ret = GetRandomRgn(hdc, hrgn, 1);
73 ok(ret == 0, "GetRandomRgn rets %d\n", ret);
74 ret = GetRandomRgn(hdc, hrgn, 2);
75 ok(ret != 0, "GetRandomRgn rets %d\n", ret);
76 GetRgnBox(hrgn, &ret_rc);
77 ok(EqualRect(&rc, &ret_rc), "GetRandomRgn %s\n", wine_dbgstr_rect(&ret_rc));
78
79 ret = GetRandomRgn(hdc, hrgn, 3);
80 ok(ret != 0, "GetRandomRgn rets %d\n", ret);
81 GetRgnBox(hrgn, &ret_rc);
82 ok(EqualRect(&rc, &ret_rc), "GetRandomRgn %s\n", wine_dbgstr_rect(&ret_rc));
83
84 /* Set a new clip (still got the meta) */
85 SetRect(&rc2, 10, 30, 70, 90);
86 IntersectClipRect(hdc, rc2.left, rc2.top, rc2.right, rc2.bottom);
87
88 ret = GetRandomRgn(hdc, hrgn, 1);
89 ok(ret > 0, "GetRandomRgn rets %d\n", ret);
90 GetRgnBox(hrgn, &ret_rc);
91 ok(EqualRect(&rc2, &ret_rc), "GetRandomRgn %s\n", wine_dbgstr_rect(&ret_rc));
92
93 ret = GetRandomRgn(hdc, NULL, 1);
94 ok(ret == -1, "GetRandomRgn rets %d\n", ret);
95
96 ret = GetRandomRgn(hdc, hrgn, 2);
97 ok(ret != 0, "GetRandomRgn rets %d\n", ret);
98 GetRgnBox(hrgn, &ret_rc);
99 ok(EqualRect(&rc, &ret_rc), "GetRandomRgn %s\n", wine_dbgstr_rect(&ret_rc));
100
101 IntersectRect(&rc2, &rc, &rc2);
102
103 ret = GetRandomRgn(hdc, hrgn, 3);
104 ok(ret != 0, "GetRandomRgn rets %d\n", ret);
105 GetRgnBox(hrgn, &ret_rc);
106 ok(EqualRect(&rc2, &ret_rc), "GetRandomRgn %s\n", wine_dbgstr_rect(&ret_rc));
107
108
110 ok(ret != 0, "GetRandomRgn rets %d\n", ret);
111 GetRgnBox(hrgn, &ret_rc);
112 if(GetVersion() & 0x80000000)
113 OffsetRect(&window_rc, -window_rc.left, -window_rc.top);
114 /* the window may be partially obscured so the region may be smaller */
115 IntersectRect( &window_rc, &ret_rc, &ret_rc );
116 ok(EqualRect(&window_rc, &ret_rc), "GetRandomRgn %s\n", wine_dbgstr_rect(&ret_rc));
117
121}
122
123static void verify_region(HRGN hrgn, const RECT *rc)
124{
125 union
126 {
128 char buf[sizeof(RGNDATAHEADER) + sizeof(RECT)];
129 } rgn;
130 const RECT *rect;
131 DWORD ret;
132
133 ret = GetRegionData(hrgn, 0, NULL);
134 if (IsRectEmpty(rc))
135 ok(ret == sizeof(rgn.data.rdh), "expected sizeof(rdh), got %lu\n", ret);
136 else
137 ok(ret == sizeof(rgn.data.rdh) + sizeof(RECT), "expected sizeof(rgn), got %lu\n", ret);
138
139 if (!ret) return;
140
141 ret = GetRegionData(hrgn, sizeof(rgn), &rgn.data);
142 if (IsRectEmpty(rc))
143 ok(ret == sizeof(rgn.data.rdh), "expected sizeof(rdh), got %lu\n", ret);
144 else
145 ok(ret == sizeof(rgn.data.rdh) + sizeof(RECT), "expected sizeof(rgn), got %lu\n", ret);
146
147 trace("size %lu, type %lu, count %lu, rgn size %lu, bound %s\n",
148 rgn.data.rdh.dwSize, rgn.data.rdh.iType, rgn.data.rdh.nCount, rgn.data.rdh.nRgnSize,
149 wine_dbgstr_rect(&rgn.data.rdh.rcBound));
150 if (rgn.data.rdh.nCount != 0)
151 {
152 rect = (const RECT *)rgn.data.Buffer;
153 trace("rect %s\n", wine_dbgstr_rect(rect));
154 ok(EqualRect(rect, rc), "rects don't match\n");
155 }
156
157 ok(rgn.data.rdh.dwSize == sizeof(rgn.data.rdh), "expected sizeof(rdh), got %lu\n", rgn.data.rdh.dwSize);
158 ok(rgn.data.rdh.iType == RDH_RECTANGLES, "expected RDH_RECTANGLES, got %lu\n", rgn.data.rdh.iType);
159 if (IsRectEmpty(rc))
160 {
161 ok(rgn.data.rdh.nCount == 0, "expected 0, got %lu\n", rgn.data.rdh.nCount);
162 ok(rgn.data.rdh.nRgnSize == 0 ||
163 broken(rgn.data.rdh.nRgnSize == 168), /* NT4 */
164 "expected 0, got %lu\n", rgn.data.rdh.nRgnSize);
165 }
166 else
167 {
168 ok(rgn.data.rdh.nCount == 1, "expected 1, got %lu\n", rgn.data.rdh.nCount);
169 ok(rgn.data.rdh.nRgnSize == sizeof(RECT) ||
170 broken(rgn.data.rdh.nRgnSize == 168), /* NT4 */
171 "expected sizeof(RECT), got %lu\n", rgn.data.rdh.nRgnSize);
172 }
173 ok(EqualRect(&rgn.data.rdh.rcBound, rc), "rects don't match\n");
174}
175
176static void test_ExtCreateRegion(void)
177{
178 static const RECT empty_rect;
179 static const RECT rc = { 111, 222, 333, 444 };
180 static const RECT arc[2] = { {0, 0, 10, 10}, {10, 10, 20, 20}};
181 static const RECT rc_xformed = { 76, 151, 187, 262 };
182 union
183 {
185 char buf[sizeof(RGNDATAHEADER) + 2 * sizeof(RECT)];
186 } rgn;
187 HRGN hrgn;
188 XFORM xform;
189
190 SetLastError(0xdeadbeef);
192 ok(!hrgn, "ExtCreateRegion should fail\n");
193 ok(GetLastError() == ERROR_INVALID_PARAMETER, "ERROR_INVALID_PARAMETER, got %lu\n", GetLastError());
194
195 rgn.data.rdh.dwSize = 0;
196 rgn.data.rdh.iType = 0;
197 rgn.data.rdh.nCount = 0;
198 rgn.data.rdh.nRgnSize = 0;
199 SetRectEmpty(&rgn.data.rdh.rcBound);
200 memcpy(rgn.data.Buffer, &rc, sizeof(rc));
201
202 SetLastError(0xdeadbeef);
203 hrgn = ExtCreateRegion(NULL, sizeof(rgn), &rgn.data);
204 ok(!hrgn, "ExtCreateRegion should fail\n");
205 ok(GetLastError() == 0xdeadbeef, "0xdeadbeef, got %lu\n", GetLastError());
206
207 rgn.data.rdh.dwSize = sizeof(rgn.data.rdh) - 1;
208
209 SetLastError(0xdeadbeef);
210 hrgn = ExtCreateRegion(NULL, sizeof(rgn), &rgn.data);
211 ok(!hrgn, "ExtCreateRegion should fail\n");
212 ok(GetLastError() == 0xdeadbeef, "0xdeadbeef, got %lu\n", GetLastError());
213
214 /* although XP doesn't care about the type Win9x does */
215 rgn.data.rdh.iType = RDH_RECTANGLES;
216 rgn.data.rdh.dwSize = sizeof(rgn.data.rdh);
217
218 /* sizeof(RGNDATAHEADER) is large enough */
219 SetLastError(0xdeadbeef);
220 hrgn = ExtCreateRegion(NULL, sizeof(RGNDATAHEADER), &rgn.data);
221 ok(hrgn != 0, "ExtCreateRegion error %lu\n", GetLastError());
222 verify_region(hrgn, &empty_rect);
224
225 /* Cannot be smaller than sizeof(RGNDATAHEADER) */
226 SetLastError(0xdeadbeef);
227 hrgn = ExtCreateRegion(NULL, sizeof(RGNDATAHEADER) - 1, &rgn.data);
229 ok(!hrgn, "ExtCreateRegion should fail\n");
232 broken(GetLastError() == 0xdeadbeef), "0xdeadbeef, got %lu\n", GetLastError());
233
234 SetLastError(0xdeadbeef);
235 hrgn = ExtCreateRegion(NULL, sizeof(rgn), &rgn.data);
236 ok(hrgn != 0, "ExtCreateRegion error %lu\n", GetLastError());
237 verify_region(hrgn, &empty_rect);
239
240 rgn.data.rdh.nCount = 1;
241 SetRectEmpty(&rgn.data.rdh.rcBound);
242 memcpy(rgn.data.Buffer, &rc, sizeof(rc));
243
244 SetLastError(0xdeadbeef);
245 hrgn = ExtCreateRegion(NULL, sizeof(rgn), &rgn.data);
246 ok(hrgn != 0, "ExtCreateRegion error %lu\n", GetLastError());
247 verify_region(hrgn, &rc);
249
250 xform.eM11 = 0.5; /* 50% width */
251 xform.eM12 = 0.0;
252 xform.eM21 = 0.0;
253 xform.eM22 = 0.5; /* 50% height */
254 xform.eDx = 20.0;
255 xform.eDy = 40.0;
256
257 SetLastError(0xdeadbeef);
258 hrgn = ExtCreateRegion(&xform, sizeof(rgn), &rgn.data);
259 ok(hrgn != 0, "ExtCreateRegion error %lu/%lx\n", GetLastError(), GetLastError());
260 verify_region(hrgn, &rc_xformed);
262
263 rgn.data.rdh.nCount = 2;
264 SetRectEmpty(&rgn.data.rdh.rcBound);
265 memcpy(rgn.data.Buffer, arc, sizeof(arc));
266
267 /* Buffer cannot be smaller than sizeof(RGNDATAHEADER) + 2 * sizeof(RECT) */
268 SetLastError(0xdeadbeef);
269 hrgn = ExtCreateRegion(NULL, sizeof(RGNDATAHEADER) + 2 * sizeof(RECT) - 1, &rgn.data);
271 ok(!hrgn, "ExtCreateRegion should fail\n");
272 ok(GetLastError() == 0xdeadbeef, "0xdeadbeef, got %lu\n", GetLastError());
273
274}
275
276static void test_GetClipRgn(void)
277{
278 HDC hdc;
279 HRGN hrgn, hrgn2, hrgn3, hrgn4;
280 int ret;
281
282 /* Test calling GetClipRgn with NULL device context and region handles. */
284 ok(ret == -1, "Expected GetClipRgn to return -1, got %d\n", ret);
285
286 hdc = GetDC(NULL);
287 ok(hdc != NULL, "Expected GetDC to return a valid device context handle\n");
288
289 /* Test calling GetClipRgn with a valid device context and NULL region. */
291 ok(ret == 0, "Expected GetClipRgn to return 0, got %d\n", ret);
292
293 /* Initialize the test regions. */
294 hrgn = CreateRectRgn(100, 100, 100, 100);
295 ok(hrgn != NULL,
296 "Expected CreateRectRgn to return a handle to a new rectangular region\n");
297
298 hrgn2 = CreateRectRgn(1, 2, 3, 4);
299 ok(hrgn2 != NULL,
300 "Expected CreateRectRgn to return a handle to a new rectangular region\n");
301
302 hrgn3 = CreateRectRgn(1, 2, 3, 4);
303 ok(hrgn3 != NULL,
304 "Expected CreateRectRgn to return a handle to a new rectangular region\n");
305
306 hrgn4 = CreateRectRgn(1, 2, 3, 4);
307 ok(hrgn4 != NULL,
308 "Expected CreateRectRgn to return a handle to a new rectangular region\n");
309
310 /* Try getting a clipping region from the device context
311 * when the device context's clipping region isn't set. */
313 ok(ret == 0, "Expected GetClipRgn to return 0, got %d\n", ret);
314
315 /* The region passed to GetClipRgn should be unchanged. */
316 ret = EqualRgn(hrgn2, hrgn3);
317 ok(ret == 1,
318 "Expected EqualRgn to compare the two regions as equal, got %d\n", ret);
319
320 /* Try setting and getting back a clipping region. */
322 ok(ret == NULLREGION,
323 "Expected SelectClipRgn to return NULLREGION, got %d\n", ret);
324
325 /* Passing a NULL region handle when the device context
326 * has a clipping region results in an error. */
328 ok(ret == -1, "Expected GetClipRgn to return -1, got %d\n", ret);
329
331 ok(ret == 1, "Expected GetClipRgn to return 1, got %d\n", ret);
332
334 ok(ret == 1,
335 "Expected EqualRgn to compare the two regions as equal, got %d\n", ret);
336
337 /* Try unsetting and then query the clipping region. */
340 "Expected SelectClipRgn to return SIMPLEREGION, got %d\n", ret);
341
343 ok(ret == 0, "Expected GetClipRgn to return 0, got %d\n", ret);
344
345 ret = GetClipRgn(hdc, hrgn3);
346 ok(ret == 0, "Expected GetClipRgn to return 0, got %d\n", ret);
347
348 ret = EqualRgn(hrgn3, hrgn4);
349 ok(ret == 1,
350 "Expected EqualRgn to compare the two regions as equal, got %d\n", ret);
351
352 DeleteObject(hrgn4);
353 DeleteObject(hrgn3);
357}
358
359static void test_memory_dc_clipping(void)
360{
361 HDC hdc;
362 HRGN hrgn, hrgn_empty;
364 RECT rc;
365 int ret;
366
368 hrgn_empty = CreateRectRgn(0, 0, 0, 0);
369 hrgn = CreateRectRgn(0, 0, 0, 0);
370 hbmp = CreateCompatibleBitmap(hdc, 100, 100);
371
373 ok(ret == 0, "expected 0, got %d\n", ret);
374
375 ret = ExtSelectClipRgn(hdc, hrgn_empty, RGN_DIFF);
376 ok(ret == SIMPLEREGION, "expected SIMPLEREGION, got %d\n", ret);
377
379 ok(ret == 1, "expected 1, got %d\n", ret);
380
381 ret = GetRgnBox(hrgn, &rc);
382 ok(ret == SIMPLEREGION, "expected SIMPLEREGION, got %d\n", ret);
383 ok(rc.left == 0 && rc.top == 0 && rc.right == 1 && rc.bottom == 1,
384 "expected 0,0-1,1, got %s\n", wine_dbgstr_rect(&rc));
385
387 ok(ret == SIMPLEREGION, "expected SIMPLEREGION, got %d\n", ret);
388
390 ok(ret == 0, "expected 0, got %d\n", ret);
391
393 ok(ret == 0, "expected 0, got %d\n", ret);
394
396 ok(ret == 0, "expected 0, got %d\n", ret);
397
399
400 ret = ExtSelectClipRgn(hdc, hrgn_empty, RGN_DIFF);
401 ok(ret == SIMPLEREGION, "expected SIMPLEREGION, got %d\n", ret);
402
404 ok(ret == 1, "expected 1, got %d\n", ret);
405
406 ret = GetRgnBox(hrgn, &rc);
407 ok(ret == SIMPLEREGION, "expected SIMPLEREGION, got %d\n", ret);
408 ok(rc.left == 0 && rc.top == 0 && rc.right == 100 && rc.bottom == 100,
409 "expected 0,0-100,100, got %s\n", wine_dbgstr_rect(&rc));
410
411 SetRect( &rc, 10, 10, 20, 20 );
412 ret = RectVisible( hdc, &rc );
413 ok(ret, "RectVisible failed for %s\n", wine_dbgstr_rect(&rc));
414
415 SetRect( &rc, 20, 20, 10, 10 );
416 ret = RectVisible( hdc, &rc );
417 ok(ret, "RectVisible failed for %s\n", wine_dbgstr_rect(&rc));
418
420 ok(ret == 0, "expected 0, got %d\n", ret);
421
423 ok(ret == 1, "expected 1, got %d\n", ret);
424
425 ret = GetRgnBox(hrgn, &rc);
426 ok(ret == SIMPLEREGION, "expected SIMPLEREGION, got %d\n", ret);
427 ok(rc.left == 0 && rc.top == 0 && rc.right == 100 && rc.bottom == 100,
428 "expected 0,0-100,100, got %s\n", wine_dbgstr_rect(&rc));
429
430 DeleteDC(hdc);
432 DeleteObject(hrgn_empty);
434}
435
436static void test_window_dc_clipping(void)
437{
438 HDC hdc;
439 HRGN hrgn, hrgn_empty;
440 HWND hwnd;
441 RECT rc, virtual_rect;
442 int ret, screen_width, screen_height;
443
444 /* Windows versions earlier than Win2k do not support the virtual screen metrics,
445 * so we fall back to the primary screen metrics. */
446 screen_width = GetSystemMetrics(SM_CXVIRTUALSCREEN);
447 if(!screen_width) screen_width = GetSystemMetrics(SM_CXSCREEN);
448 screen_height = GetSystemMetrics(SM_CYVIRTUALSCREEN);
449 if(!screen_height) screen_height = GetSystemMetrics(SM_CYSCREEN);
451 GetSystemMetrics(SM_XVIRTUALSCREEN) + screen_width, GetSystemMetrics(SM_YVIRTUALSCREEN) + screen_height);
452
453 trace("screen resolution %d x %d\n", screen_width, screen_height);
454
455 hwnd = CreateWindowExA(0, "static", NULL, WS_POPUP,
456 -100, -100, screen_width * 2, screen_height * 2, 0, 0, 0, NULL);
457 hdc = GetWindowDC(0);
458 hrgn_empty = CreateRectRgn(0, 0, 0, 0);
459 hrgn = CreateRectRgn(0, 0, 0, 0);
460
462 ok(ret == 0, "expected 0, got %d\n", ret);
463
465 ok(ret == 0, "expected 0, got %d\n", ret);
466
468 ok(ret == 0, "expected 0, got %d\n", ret);
469
470 ret = ExtSelectClipRgn(hdc, hrgn_empty, RGN_DIFF);
472 "expected SIMPLEREGION, got %d\n", ret);
473
475 ok(ret == 1, "expected 1, got %d\n", ret);
476
477 ret = GetRgnBox(hrgn, &rc);
478 ok(ret == SIMPLEREGION, "expected SIMPLEREGION, got %d\n", ret);
479 ok(EqualRect(&rc, &virtual_rect), "expected %s, got %s\n", wine_dbgstr_rect(&virtual_rect),
480 wine_dbgstr_rect(&rc));
481
482 SetRect( &rc, 10, 10, 20, 20 );
483 ret = RectVisible( hdc, &rc );
484 ok( ret, "RectVisible failed for %s\n", wine_dbgstr_rect(&rc));
485
486 SetRect( &rc, 20, 20, 10, 10 );
487 ret = RectVisible( hdc, &rc );
488 ok( ret, "RectVisible failed for %s\n", wine_dbgstr_rect(&rc));
489
491 ok(ret == 0, "expected 0, got %d\n", ret);
492
494 ok(ret == 1, "expected 1, got %d\n", ret);
495
496 ret = GetRgnBox(hrgn, &rc);
497 ok(ret == SIMPLEREGION, "expected SIMPLEREGION, got %d\n", ret);
498 ok(EqualRect(&rc, &virtual_rect), "expected %s, got %s\n", wine_dbgstr_rect(&virtual_rect),
499 wine_dbgstr_rect(&rc));
500
503 "expected SIMPLEREGION, got %d\n", ret);
504
506 ok(ret == 0, "expected 0, got %d\n", ret);
507
508 DeleteDC(hdc);
510 DeleteObject(hrgn_empty);
512}
513
515{
516 HRGN region;
517 POINT points_zero[] = { {0, 0}, {0, 0}, {0, 0} };
518 POINT points_mixed[] = { {0, 0}, {0, 0}, {0, 0}, {6, 6}, {6, 6}, {6, 6} };
519 POINT points_six[] = { {6, 6}, {6, 6}, {6, 6} };
520 POINT points_line[] = { {1, 0}, {11, 0}, {21, 0}};
521 POINT points_overflow[] = { {0, 0}, {1, 0}, {0, 0x80000000} };
522 INT counts_single_poly[] = { 3 };
523 INT counts_two_poly[] = { 3, 3 };
524 INT counts_overflow[] = { ARRAY_SIZE(points_overflow) };
525 int ret;
526 RECT rect;
527
528 /* When all polygons are just one point or line, return must not be NULL */
529
530 region = CreatePolyPolygonRgn(points_zero, counts_single_poly, ARRAY_SIZE(counts_single_poly), ALTERNATE);
531 ok (region != NULL, "region must not be NULL\n");
532 ret = GetRgnBox(region, &rect);
533 ok (ret == NULLREGION, "Expected NULLREGION, got %d\n", ret);
534 DeleteObject(region);
535
536 region = CreatePolyPolygonRgn(points_six, counts_single_poly, ARRAY_SIZE(counts_single_poly), ALTERNATE);
537 ok (region != NULL, "region must not be NULL\n");
538 ret = GetRgnBox(region, &rect);
539 ok (ret == NULLREGION, "Expected NULLREGION, got %d\n", ret);
540 DeleteObject(region);
541
542 region = CreatePolyPolygonRgn(points_line, counts_single_poly, ARRAY_SIZE(counts_single_poly), ALTERNATE);
543 ok (region != NULL, "region must not be NULL\n");
544 ret = GetRgnBox(region, &rect);
545 ok (ret == NULLREGION, "Expected NULLREGION, got %d\n", ret);
546 DeleteObject(region);
547
548 region = CreatePolyPolygonRgn(points_mixed, counts_two_poly, ARRAY_SIZE(counts_two_poly), ALTERNATE);
549 ok (region != NULL, "region must not be NULL\n");
550 ret = GetRgnBox(region, &rect);
551 ok (ret == NULLREGION, "Expected NULLREGION, got %d\n", ret);
552 DeleteObject(region);
553
554 /* Test with points that overflow the edge table */
555 region = CreatePolyPolygonRgn(points_overflow, counts_overflow, ARRAY_SIZE(counts_overflow), ALTERNATE);
556 ok (region != NULL, "region must not be NULL\n");
557 ret = GetRgnBox(region, &rect);
558 ok (ret == NULLREGION, "Expected NULLREGION, got %d\n", ret);
559 DeleteObject(region);
560}
561
562START_TEST(clipping)
563{
570}
#define SYSRGN
Definition: GetRandomRgn.c:13
static HRGN hrgn2
static HRGN hrgn
#define trace
Definition: atltest.h:70
#define ok(value,...)
Definition: atltest.h:57
#define broken(x)
Definition: atltest.h:178
#define START_TEST(x)
Definition: atltest.h:75
static const char * wine_dbgstr_rect(const RECT *prc)
Definition: atltest.h:160
struct _RGNDATAHEADER RGNDATAHEADER
#define ALTERNATE
Definition: constants.h:278
#define ARRAY_SIZE(A)
Definition: main.h:20
HBITMAP hbmp
static void test_memory_dc_clipping(void)
Definition: clipping.c:359
static void test_ExtCreateRegion(void)
Definition: clipping.c:176
static void test_GetClipRgn(void)
Definition: clipping.c:276
static void test_GetRandomRgn(void)
Definition: clipping.c:27
static void verify_region(HRGN hrgn, const RECT *rc)
Definition: clipping.c:123
static void test_CreatePolyPolygonRgn(void)
Definition: clipping.c:514
static void test_window_dc_clipping(void)
Definition: clipping.c:436
RECT rect
Definition: combotst.c:67
#define NULL
Definition: types.h:112
static const WCHAR rc2[]
Definition: oid.c:1216
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
#define SetLastError(x)
Definition: compat.h:752
DWORD WINAPI GetVersion(void)
Definition: version.c:1458
return ret
Definition: mutex.c:146
unsigned long DWORD
Definition: ntddk_ex.h:95
pKey DeleteObject()
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
#define todo_wine
Definition: minitest.h:80
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
HDC hdc
Definition: main.c:9
static HBITMAP
Definition: button.c:44
static HDC
Definition: imagelist.c:88
#define WS_POPUP
Definition: pedump.c:616
#define WS_VISIBLE
Definition: pedump.c:620
FLOAT eDy
Definition: wingdi.h:2172
FLOAT eM11
Definition: wingdi.h:2167
FLOAT eM21
Definition: wingdi.h:2169
FLOAT eM22
Definition: wingdi.h:2170
FLOAT eM12
Definition: wingdi.h:2168
FLOAT eDx
Definition: wingdi.h:2171
LONG right
Definition: windef.h:108
LONG bottom
Definition: windef.h:109
LONG top
Definition: windef.h:107
LONG left
Definition: windef.h:106
int32_t INT
Definition: typedefs.h:58
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
#define COMPLEXREGION
Definition: wingdi.h:363
HRGN WINAPI CreateRectRgn(_In_ int, _In_ int, _In_ int, _In_ int)
#define RGN_DIFF
Definition: wingdi.h:358
#define NULLREGION
Definition: wingdi.h:361
BOOL WINAPI RectVisible(_In_ HDC, _In_ LPCRECT)
int WINAPI IntersectClipRect(_In_ HDC, _In_ int, _In_ int, _In_ int, _In_ int)
HRGN WINAPI CreatePolyPolygonRgn(_In_ const POINT *pptl, _In_reads_(cPoly) const INT *pc, _In_ int cPoly, _In_ int iMode)
#define RDH_RECTANGLES
Definition: wingdi.h:669
BOOL WINAPI EqualRgn(_In_ HRGN, _In_ HRGN)
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
Definition: dc.c:1546
HDC WINAPI CreateCompatibleDC(_In_opt_ HDC hdc)
int WINAPI GetClipRgn(_In_ HDC, _In_ HRGN)
HRGN WINAPI ExtCreateRegion(_In_opt_ const XFORM *lpx, _In_ DWORD nCount, _In_reads_bytes_(nCount) const RGNDATA *lpData)
#define RGN_COPY
Definition: wingdi.h:357
int WINAPI SetMetaRgn(_In_ HDC)
#define SIMPLEREGION
Definition: wingdi.h:362
HBITMAP WINAPI CreateCompatibleBitmap(_In_ HDC hdc, _In_ INT cx, _In_ INT cy)
int WINAPI GetRandomRgn(_In_ HDC, _In_ HRGN, _In_ INT)
DWORD WINAPI GetRegionData(_In_ HRGN hrgn, _In_ DWORD nCount, _Out_writes_bytes_to_opt_(nCount, return) LPRGNDATA lpRgnData)
BOOL WINAPI DeleteDC(_In_ HDC)
int WINAPI SelectClipRgn(_In_ HDC, _In_opt_ HRGN)
int WINAPI ExtSelectClipRgn(_In_ HDC, _In_opt_ HRGN, _In_ int)
int WINAPI GetRgnBox(_In_ HRGN, _Out_ LPRECT)
int WINAPI ReleaseDC(_In_opt_ HWND, _In_ HDC)
#define SM_CYVIRTUALSCREEN
Definition: winuser.h:1050
HDC WINAPI GetWindowDC(_In_opt_ HWND)
HWND WINAPI CreateWindowExA(_In_ DWORD dwExStyle, _In_opt_ LPCSTR lpClassName, _In_opt_ LPCSTR lpWindowName, _In_ DWORD dwStyle, _In_ int X, _In_ int Y, _In_ int nWidth, _In_ int nHeight, _In_opt_ HWND hWndParent, _In_opt_ HMENU hMenu, _In_opt_ HINSTANCE hInstance, _In_opt_ LPVOID lpParam)
#define SM_CYSCREEN
Definition: winuser.h:971
#define HWND_TOPMOST
Definition: winuser.h:1219
BOOL WINAPI SetWindowPos(_In_ HWND, _In_opt_ HWND, _In_ int, _In_ int, _In_ int, _In_ int, _In_ UINT)
BOOL WINAPI IsRectEmpty(_In_ LPCRECT)
HWND WINAPI GetDesktopWindow(void)
Definition: window.c:628
#define SM_CXVIRTUALSCREEN
Definition: winuser.h:1049
BOOL WINAPI IntersectRect(_Out_ LPRECT, _In_ LPCRECT, _In_ LPCRECT)
HDC WINAPI GetDC(_In_opt_ HWND)
BOOL WINAPI SetRectEmpty(_Out_ LPRECT)
BOOL WINAPI OffsetRect(_Inout_ LPRECT, _In_ int, _In_ int)
#define SM_CXSCREEN
Definition: winuser.h:970
#define SM_XVIRTUALSCREEN
Definition: winuser.h:1047
#define SM_CMONITORS
Definition: winuser.h:1051
BOOL WINAPI DestroyWindow(_In_ HWND)
BOOL WINAPI EqualRect(_In_ LPCRECT, _In_ LPCRECT)
int WINAPI GetSystemMetrics(_In_ int)
#define SM_YVIRTUALSCREEN
Definition: winuser.h:1048
BOOL WINAPI SetRect(_Out_ LPRECT, _In_ int, _In_ int, _In_ int, _In_ int)