2#include <freerdp/gdi/gdi.h>
4#include <freerdp/gdi/dc.h>
5#include <freerdp/gdi/pen.h>
6#include <freerdp/gdi/region.h>
7#include <freerdp/gdi/bitmap.h>
23 HGDI_RGN rgn1 = gdi_CreateRectRgn(0, 0, 0, 0);
24 HGDI_RGN rgn2 = gdi_CreateRectRgn(0, 0, 0, 0);
27 (void)fprintf(stderr,
"[%s:%" PRIuz
"] gdi_CreateRectRgn failed: rgn1=%p, rgn2=%p\n",
28 __func__, testNr, rgn1, rgn2);
34 if (!gdi_SetNullClipRgn(hdc))
36 (void)fprintf(stderr,
"[%s:%" PRIuz
"] gdi_SetNullClipRgn failed\n", __func__, testNr);
40 else if (!gdi_SetClipRgn(hdc, clip->x, clip->y, clip->w, clip->h))
42 (void)fprintf(stderr,
"[%s:%" PRIuz
"] gdi_SetClipRgn failed\n", __func__, testNr);
46 if (!gdi_SetRgn(rgn1, input->x, input->y, input->w, input->h))
48 (void)fprintf(stderr,
"[%s:%" PRIuz
"] gdi_SetRgn (rgn1) failed\n", __func__, testNr);
54 if (!gdi_SetRgn(rgn2, expect->x, expect->y, expect->w, expect->h))
56 (void)fprintf(stderr,
"[%s:%" PRIuz
"] gdi_SetRgn (rgn2) failed\n", __func__, testNr);
62 gdi_ClipCoords(hdc, &(rgn1->x), &(rgn1->y), &(rgn1->w), &(rgn1->h),
nullptr,
nullptr);
68 "[%s:%" PRIuz
"] gdi_ClipCoords failed: expected TRUE, got FALSE\n",
73 if (!gdi_EqualRgn(rgn1, rgn2))
75 char buffer1[64] = WINPR_C_ARRAY_INIT;
76 char buffer2[64] = WINPR_C_ARRAY_INIT;
77 (void)fprintf(stderr,
"[%s:%" PRIuz
"] gdi_EqualRgn failed: expected %s, got %s\n",
78 __func__, testNr, buffer1, buffer2);
87 "[%s:%" PRIuz
"] gdi_ClipCoords failed: expected FALSE, got TRUE\n",
101static int test_gdi_ClipCoords(
void)
106 const UINT32 format = PIXEL_FORMAT_ARGB32;
108 if (!(hdc = gdi_GetDC()))
110 printf(
"failed to get gdi device context\n");
114 hdc->format = format;
115 bmp = gdi_CreateBitmapEx(1024, 768, PIXEL_FORMAT_XRGB32, 0,
nullptr,
nullptr);
119 if (!gdi_SetNullClipRgn(hdc))
129 const GDI_RGN rgn0x0_1x768 = { 0, 0, 0, 1, 768, FALSE };
130 const GDI_RGN rgn0x0_1024x1 = { 0, 0, 0, 1024, 1, FALSE };
131 const GDI_RGN rgn0x0_1024x768 = { 0, 0, 0, 1024, 768, FALSE };
132 const GDI_RGN rgn20x20_0x0 = { 0, 20, 20, 0, 0, FALSE };
133 const GDI_RGN rgn20x20_100x100 = { 0, 20, 20, 100, 100, FALSE };
134 const GDI_RGN rgn100x300_250x100 = { 0, 100, 300, 250, 100, FALSE };
135 const GDI_RGN rgn100x300_300x100 = { 0, 100, 300, 300, 100, FALSE };
136 const GDI_RGN rgn300x20_100x100 = { 0, 300, 20, 100, 100, FALSE };
137 const GDI_RGN rgn300x100_300x300 = { 0, 300, 100, 300, 300, FALSE };
138 const GDI_RGN rgn300x300_50x100 = { 0, 300, 300, 50, 100, FALSE };
139 const GDI_RGN rgn300x300_100x100 = { 0, 300, 300, 100, 100, FALSE };
140 const GDI_RGN rgn300x300_300x100 = { 0, 300, 300, 300, 100, FALSE };
141 const GDI_RGN rgn300x300_300x200 = { 0, 300, 300, 100, 200, FALSE };
142 const GDI_RGN rgn300x420_100x100 = { 0, 300, 420, 100, 100, FALSE };
143 const GDI_RGN rgn350x300_50x100 = { 0, 350, 300, 50, 100, FALSE };
144 const GDI_RGN rgn350x300_200x100 = { 0, 350, 300, 200, 100, FALSE };
145 const GDI_RGN rgn420x420_100x100 = { 0, 420, 420, 100, 100, FALSE };
147 const struct testcase_t testcases[] = {
149 {
nullptr, &rgn20x20_100x100, &rgn20x20_100x100 },
151 {
nullptr, &rgn20x20_0x0,
nullptr },
153 {
nullptr, &rgn0x0_1x768, &rgn0x0_1x768 },
155 {
nullptr, &rgn0x0_1024x1, &rgn0x0_1024x1 },
157 { &rgn0x0_1024x768, &rgn20x20_100x100, &rgn20x20_100x100 },
159 { &rgn300x300_100x100, &rgn20x20_100x100,
nullptr },
161 { &rgn300x300_100x100, &rgn420x420_100x100,
nullptr },
163 { &rgn300x300_100x100, &rgn300x20_100x100,
nullptr },
165 { &rgn300x300_100x100, &rgn300x420_100x100,
nullptr },
167 { &rgn300x300_100x100, &rgn100x300_300x100, &rgn300x300_100x100 },
169 { &rgn300x300_100x100, &rgn100x300_250x100, &rgn300x300_50x100 },
171 { &rgn300x300_100x100, &rgn300x300_300x100, &rgn300x300_100x100 },
173 { &rgn300x300_100x100, &rgn350x300_200x100, &rgn350x300_50x100 },
175 { &rgn300x300_100x100, &rgn300x100_300x300, &rgn300x300_100x100 },
177 { &rgn300x300_100x100, &rgn300x300_300x200, &rgn300x300_100x100 },
179 { &rgn300x300_100x100, &rgn300x300_100x100, &rgn300x300_100x100 }
182 for (
size_t x = 0; x < ARRAYSIZE(testcases); x++)
184 const struct testcase_t* cur = &testcases[x];
185 if (!test_gdi_coords(x, hdc, cur->clip, cur->in, cur->expect))
197static int test_gdi_ClipCoordsSmallBitmap(
void)
199 const GDI_RGN rgn0x0_64x64 = { 0, 0, 0, 64, 64, FALSE };
200 const GDI_RGN rgn0x0_1x64 = { 0, 0, 0, 1, 64, FALSE };
201 const GDI_RGN rgn0x0_64x1 = { 0, 0, 0, 64, 1, FALSE };
202 const GDI_RGN* sizes[] = { &rgn0x0_1x64, &rgn0x0_64x1 };
204 for (
size_t x = 0; x < ARRAYSIZE(sizes); x++)
207 const UINT32 w = WINPR_ASSERTING_INT_CAST(UINT32, cur->w);
208 const UINT32 h = WINPR_ASSERTING_INT_CAST(UINT32, cur->h);
214 hdc->format = PIXEL_FORMAT_XRGB32;
215 HGDI_BITMAP bmp = gdi_CreateBitmapEx(w, h, hdc->format, 0,
nullptr,
nullptr);
219 rc = test_gdi_coords(x, hdc,
nullptr, &rgn0x0_64x64, cur) &&
220 test_gdi_coords(x, hdc, &rgn0x0_64x64, &rgn0x0_64x64, cur);
232static int test_gdi_InvalidateRegion(
void)
241 const UINT32 format = PIXEL_FORMAT_XRGB32;
243 if (!(hdc = gdi_GetDC()))
245 printf(
"failed to get gdi device context\n");
249 hdc->format = format;
250 bmp = gdi_CreateBitmapEx(1024, 768, PIXEL_FORMAT_XRGB32, 0,
nullptr,
nullptr);
254 if (!gdi_SetNullClipRgn(hdc))
259 hdc->hwnd->invalid = gdi_CreateRectRgn(0, 0, 0, 0);
260 if (!hdc->hwnd->invalid)
262 hdc->hwnd->invalid->null = TRUE;
263 invalid = hdc->hwnd->invalid;
264 hdc->hwnd->count = 16;
265 hdc->hwnd->cinvalid = (
HGDI_RGN)calloc(hdc->hwnd->count,
sizeof(
GDI_RGN));
266 rgn1 = gdi_CreateRectRgn(0, 0, 0, 0);
267 rgn2 = gdi_CreateRectRgn(0, 0, 0, 0);
271 invalid->null = TRUE;
272 if (!gdi_SetRgn(rgn1, 300, 300, 100, 100))
274 if (!gdi_SetRgn(rgn2, 300, 300, 100, 100))
276 if (!gdi_InvalidateRegion(hdc, rgn1->x, rgn1->y, rgn1->w, rgn1->h))
279 if (!gdi_EqualRgn(invalid, rgn2))
283 if (!gdi_SetRgn(invalid, 300, 300, 100, 100))
285 if (!gdi_SetRgn(rgn1, 300, 300, 100, 100))
287 if (!gdi_SetRgn(rgn2, 300, 300, 100, 100))
289 if (!gdi_InvalidateRegion(hdc, rgn1->x, rgn1->y, rgn1->w, rgn1->h))
292 if (!gdi_EqualRgn(invalid, rgn2))
296 if (!gdi_SetRgn(invalid, 300, 300, 100, 100))
298 if (!gdi_SetRgn(rgn1, 100, 300, 300, 100))
300 if (!gdi_SetRgn(rgn2, 100, 300, 300, 100))
302 if (!gdi_InvalidateRegion(hdc, rgn1->x, rgn1->y, rgn1->w, rgn1->h))
305 if (!gdi_EqualRgn(invalid, rgn2))
309 if (!gdi_SetRgn(invalid, 300, 300, 100, 100))
311 if (!gdi_SetRgn(rgn1, 300, 300, 300, 100))
313 if (!gdi_SetRgn(rgn2, 300, 300, 300, 100))
315 if (!gdi_InvalidateRegion(hdc, rgn1->x, rgn1->y, rgn1->w, rgn1->h))
318 if (!gdi_EqualRgn(invalid, rgn2))
322 if (!gdi_SetRgn(invalid, 300, 300, 100, 100))
324 if (!gdi_SetRgn(rgn1, 300, 100, 100, 300))
326 if (!gdi_SetRgn(rgn2, 300, 100, 100, 300))
328 if (!gdi_InvalidateRegion(hdc, rgn1->x, rgn1->y, rgn1->w, rgn1->h))
331 if (!gdi_EqualRgn(invalid, rgn2))
335 if (!gdi_SetRgn(invalid, 300, 300, 100, 100))
337 if (!gdi_SetRgn(rgn1, 300, 300, 100, 300))
339 if (!gdi_SetRgn(rgn2, 300, 300, 100, 300))
341 if (!gdi_InvalidateRegion(hdc, rgn1->x, rgn1->y, rgn1->w, rgn1->h))
344 if (!gdi_EqualRgn(invalid, rgn2))
348 if (!gdi_SetRgn(invalid, 300, 300, 100, 100))
350 if (!gdi_SetRgn(rgn1, 100, 300, 600, 300))
352 if (!gdi_SetRgn(rgn2, 100, 300, 600, 300))
354 if (!gdi_InvalidateRegion(hdc, rgn1->x, rgn1->y, rgn1->w, rgn1->h))
357 if (!gdi_EqualRgn(invalid, rgn2))
361 if (!gdi_SetRgn(invalid, 300, 300, 100, 100))
363 if (!gdi_SetRgn(rgn1, 300, 100, 100, 500))
365 if (!gdi_SetRgn(rgn2, 300, 100, 100, 500))
367 if (!gdi_InvalidateRegion(hdc, rgn1->x, rgn1->y, rgn1->w, rgn1->h))
370 if (!gdi_EqualRgn(invalid, rgn2))
374 if (!gdi_SetRgn(invalid, 300, 300, 100, 100))
376 if (!gdi_SetRgn(rgn1, 100, 300, 100, 100))
378 if (!gdi_SetRgn(rgn2, 100, 300, 300, 100))
380 if (!gdi_InvalidateRegion(hdc, rgn1->x, rgn1->y, rgn1->w, rgn1->h))
383 if (!gdi_EqualRgn(invalid, rgn2))
387 if (!gdi_SetRgn(invalid, 300, 300, 100, 100))
389 if (!gdi_SetRgn(rgn1, 700, 300, 100, 100))
391 if (!gdi_SetRgn(rgn2, 300, 300, 500, 100))
393 if (!gdi_InvalidateRegion(hdc, rgn1->x, rgn1->y, rgn1->w, rgn1->h))
396 if (!gdi_EqualRgn(invalid, rgn2))
400 if (!gdi_SetRgn(invalid, 300, 300, 100, 100))
402 if (!gdi_SetRgn(rgn1, 300, 100, 100, 100))
404 if (!gdi_SetRgn(rgn2, 300, 100, 100, 300))
406 if (!gdi_InvalidateRegion(hdc, rgn1->x, rgn1->y, rgn1->w, rgn1->h))
409 if (!gdi_EqualRgn(invalid, rgn2))
413 if (!gdi_SetRgn(invalid, 300, 300, 100, 100))
415 if (!gdi_SetRgn(rgn1, 300, 500, 100, 100))
417 if (!gdi_SetRgn(rgn2, 300, 300, 100, 300))
419 if (!gdi_InvalidateRegion(hdc, rgn1->x, rgn1->y, rgn1->w, rgn1->h))
422 if (!gdi_EqualRgn(invalid, rgn2))
426 if (!gdi_SetRgn(invalid, 300, 300, 100, 100))
428 if (!gdi_SetRgn(rgn1, 100, 100, 600, 600))
430 if (!gdi_SetRgn(rgn2, 100, 100, 600, 600))
432 if (!gdi_InvalidateRegion(hdc, rgn1->x, rgn1->y, rgn1->w, rgn1->h))
435 if (!gdi_EqualRgn(invalid, rgn2))
439 if (!gdi_SetRgn(invalid, 300, 300, 100, 100))
441 if (!gdi_SetRgn(rgn1, 0, 0, 1024, 768))
443 if (!gdi_SetRgn(rgn2, 0, 0, 1024, 768))
445 if (!gdi_InvalidateRegion(hdc, rgn1->x, rgn1->y, rgn1->w, rgn1->h))
448 if (!gdi_EqualRgn(invalid, rgn2))
452 hdc->hwnd->ninvalid = 0;
453 if (!gdi_InvalidateRegion(hdc, 2024, 10, -1000, 11))
455 if (!gdi_InvalidateRegion(hdc, 10, 2024, 11, -1000))
457 if (hdc->hwnd->ninvalid != 0)
460 pen = gdi_CreatePen(GDI_PS_SOLID, 1, 0, format,
nullptr);
464 if (!gdi_MoveToEx(hdc, 2024, 10,
nullptr))
466 if (!gdi_LineTo(hdc, 2124, 20))
468 if (hdc->hwnd->ninvalid != 0)
481int TestGdiClip(
int argc,
char* argv[])
485 (void)fprintf(stderr,
"test_gdi_ClipCoords()\n");
487 if (test_gdi_ClipCoords() < 0)
490 (void)fprintf(stderr,
"test_gdi_ClipCoordsSmallBitmap()\n");
492 if (test_gdi_ClipCoordsSmallBitmap() < 0)
495 (void)fprintf(stderr,
"test_gdi_InvalidateRegion()\n");
497 if (test_gdi_InvalidateRegion() < 0)