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_1024x768 = { 0, 0, 0, 1024, 768, FALSE };
130 const GDI_RGN rgn20x20_100x100 = { 0, 20, 20, 100, 100, FALSE };
131 const GDI_RGN rgn100x300_250x100 = { 0, 100, 300, 250, 100, FALSE };
132 const GDI_RGN rgn100x300_300x100 = { 0, 100, 300, 300, 100, FALSE };
133 const GDI_RGN rgn300x20_100x100 = { 0, 300, 20, 100, 100, FALSE };
134 const GDI_RGN rgn300x100_300x300 = { 0, 300, 100, 300, 300, FALSE };
135 const GDI_RGN rgn300x300_50x100 = { 0, 300, 300, 50, 100, FALSE };
136 const GDI_RGN rgn300x300_100x100 = { 0, 300, 300, 100, 100, FALSE };
137 const GDI_RGN rgn300x300_300x100 = { 0, 300, 300, 300, 100, FALSE };
138 const GDI_RGN rgn300x300_300x200 = { 0, 300, 300, 100, 200, FALSE };
139 const GDI_RGN rgn300x420_100x100 = { 0, 300, 420, 100, 100, FALSE };
140 const GDI_RGN rgn350x300_50x100 = { 0, 350, 300, 50, 100, FALSE };
141 const GDI_RGN rgn350x300_200x100 = { 0, 350, 300, 200, 100, FALSE };
142 const GDI_RGN rgn420x420_100x100 = { 0, 420, 420, 100, 100, FALSE };
144 const struct testcase_t testcases[] = {
146 {
nullptr, &rgn20x20_100x100, &rgn20x20_100x100 },
148 { &rgn0x0_1024x768, &rgn20x20_100x100, &rgn20x20_100x100 },
150 { &rgn300x300_100x100, &rgn20x20_100x100,
nullptr },
152 { &rgn300x300_100x100, &rgn420x420_100x100,
nullptr },
154 { &rgn300x300_100x100, &rgn300x20_100x100,
nullptr },
156 { &rgn300x300_100x100, &rgn300x420_100x100,
nullptr },
158 { &rgn300x300_100x100, &rgn100x300_300x100, &rgn300x300_100x100 },
160 { &rgn300x300_100x100, &rgn100x300_250x100, &rgn300x300_50x100 },
162 { &rgn300x300_100x100, &rgn300x300_300x100, &rgn300x300_100x100 },
164 { &rgn300x300_100x100, &rgn350x300_200x100, &rgn350x300_50x100 },
166 { &rgn300x300_100x100, &rgn300x100_300x300, &rgn300x300_100x100 },
168 { &rgn300x300_100x100, &rgn300x300_300x200, &rgn300x300_100x100 },
170 { &rgn300x300_100x100, &rgn300x300_100x100, &rgn300x300_100x100 }
173 for (
size_t x = 0; x < ARRAYSIZE(testcases); x++)
175 const struct testcase_t* cur = &testcases[x];
176 if (!test_gdi_coords(x, hdc, cur->clip, cur->in, cur->expect))
187static int test_gdi_InvalidateRegion(
void)
195 const UINT32 format = PIXEL_FORMAT_XRGB32;
197 if (!(hdc = gdi_GetDC()))
199 printf(
"failed to get gdi device context\n");
203 hdc->format = format;
204 bmp = gdi_CreateBitmapEx(1024, 768, PIXEL_FORMAT_XRGB32, 0,
nullptr,
nullptr);
208 if (!gdi_SetNullClipRgn(hdc))
213 hdc->hwnd->invalid = gdi_CreateRectRgn(0, 0, 0, 0);
214 if (!hdc->hwnd->invalid)
216 hdc->hwnd->invalid->null = TRUE;
217 invalid = hdc->hwnd->invalid;
218 hdc->hwnd->count = 16;
219 hdc->hwnd->cinvalid = (
HGDI_RGN)calloc(hdc->hwnd->count,
sizeof(
GDI_RGN));
220 rgn1 = gdi_CreateRectRgn(0, 0, 0, 0);
221 rgn2 = gdi_CreateRectRgn(0, 0, 0, 0);
225 invalid->null = TRUE;
226 if (!gdi_SetRgn(rgn1, 300, 300, 100, 100))
228 if (!gdi_SetRgn(rgn2, 300, 300, 100, 100))
230 if (!gdi_InvalidateRegion(hdc, rgn1->x, rgn1->y, rgn1->w, rgn1->h))
233 if (!gdi_EqualRgn(invalid, rgn2))
237 if (!gdi_SetRgn(invalid, 300, 300, 100, 100))
239 if (!gdi_SetRgn(rgn1, 300, 300, 100, 100))
241 if (!gdi_SetRgn(rgn2, 300, 300, 100, 100))
243 if (!gdi_InvalidateRegion(hdc, rgn1->x, rgn1->y, rgn1->w, rgn1->h))
246 if (!gdi_EqualRgn(invalid, rgn2))
250 if (!gdi_SetRgn(invalid, 300, 300, 100, 100))
252 if (!gdi_SetRgn(rgn1, 100, 300, 300, 100))
254 if (!gdi_SetRgn(rgn2, 100, 300, 300, 100))
256 if (!gdi_InvalidateRegion(hdc, rgn1->x, rgn1->y, rgn1->w, rgn1->h))
259 if (!gdi_EqualRgn(invalid, rgn2))
263 if (!gdi_SetRgn(invalid, 300, 300, 100, 100))
265 if (!gdi_SetRgn(rgn1, 300, 300, 300, 100))
267 if (!gdi_SetRgn(rgn2, 300, 300, 300, 100))
269 if (!gdi_InvalidateRegion(hdc, rgn1->x, rgn1->y, rgn1->w, rgn1->h))
272 if (!gdi_EqualRgn(invalid, rgn2))
276 if (!gdi_SetRgn(invalid, 300, 300, 100, 100))
278 if (!gdi_SetRgn(rgn1, 300, 100, 100, 300))
280 if (!gdi_SetRgn(rgn2, 300, 100, 100, 300))
282 if (!gdi_InvalidateRegion(hdc, rgn1->x, rgn1->y, rgn1->w, rgn1->h))
285 if (!gdi_EqualRgn(invalid, rgn2))
289 if (!gdi_SetRgn(invalid, 300, 300, 100, 100))
291 if (!gdi_SetRgn(rgn1, 300, 300, 100, 300))
293 if (!gdi_SetRgn(rgn2, 300, 300, 100, 300))
295 if (!gdi_InvalidateRegion(hdc, rgn1->x, rgn1->y, rgn1->w, rgn1->h))
298 if (!gdi_EqualRgn(invalid, rgn2))
302 if (!gdi_SetRgn(invalid, 300, 300, 100, 100))
304 if (!gdi_SetRgn(rgn1, 100, 300, 600, 300))
306 if (!gdi_SetRgn(rgn2, 100, 300, 600, 300))
308 if (!gdi_InvalidateRegion(hdc, rgn1->x, rgn1->y, rgn1->w, rgn1->h))
311 if (!gdi_EqualRgn(invalid, rgn2))
315 if (!gdi_SetRgn(invalid, 300, 300, 100, 100))
317 if (!gdi_SetRgn(rgn1, 300, 100, 100, 500))
319 if (!gdi_SetRgn(rgn2, 300, 100, 100, 500))
321 if (!gdi_InvalidateRegion(hdc, rgn1->x, rgn1->y, rgn1->w, rgn1->h))
324 if (!gdi_EqualRgn(invalid, rgn2))
328 if (!gdi_SetRgn(invalid, 300, 300, 100, 100))
330 if (!gdi_SetRgn(rgn1, 100, 300, 100, 100))
332 if (!gdi_SetRgn(rgn2, 100, 300, 300, 100))
334 if (!gdi_InvalidateRegion(hdc, rgn1->x, rgn1->y, rgn1->w, rgn1->h))
337 if (!gdi_EqualRgn(invalid, rgn2))
341 if (!gdi_SetRgn(invalid, 300, 300, 100, 100))
343 if (!gdi_SetRgn(rgn1, 700, 300, 100, 100))
345 if (!gdi_SetRgn(rgn2, 300, 300, 500, 100))
347 if (!gdi_InvalidateRegion(hdc, rgn1->x, rgn1->y, rgn1->w, rgn1->h))
350 if (!gdi_EqualRgn(invalid, rgn2))
354 if (!gdi_SetRgn(invalid, 300, 300, 100, 100))
356 if (!gdi_SetRgn(rgn1, 300, 100, 100, 100))
358 if (!gdi_SetRgn(rgn2, 300, 100, 100, 300))
360 if (!gdi_InvalidateRegion(hdc, rgn1->x, rgn1->y, rgn1->w, rgn1->h))
363 if (!gdi_EqualRgn(invalid, rgn2))
367 if (!gdi_SetRgn(invalid, 300, 300, 100, 100))
369 if (!gdi_SetRgn(rgn1, 300, 500, 100, 100))
371 if (!gdi_SetRgn(rgn2, 300, 300, 100, 300))
373 if (!gdi_InvalidateRegion(hdc, rgn1->x, rgn1->y, rgn1->w, rgn1->h))
376 if (!gdi_EqualRgn(invalid, rgn2))
380 if (!gdi_SetRgn(invalid, 300, 300, 100, 100))
382 if (!gdi_SetRgn(rgn1, 100, 100, 600, 600))
384 if (!gdi_SetRgn(rgn2, 100, 100, 600, 600))
386 if (!gdi_InvalidateRegion(hdc, rgn1->x, rgn1->y, rgn1->w, rgn1->h))
389 if (!gdi_EqualRgn(invalid, rgn2))
393 if (!gdi_SetRgn(invalid, 300, 300, 100, 100))
395 if (!gdi_SetRgn(rgn1, 0, 0, 1024, 768))
397 if (!gdi_SetRgn(rgn2, 0, 0, 1024, 768))
399 if (!gdi_InvalidateRegion(hdc, rgn1->x, rgn1->y, rgn1->w, rgn1->h))
402 if (!gdi_EqualRgn(invalid, rgn2))
414int TestGdiClip(
int argc,
char* argv[])
418 (void)fprintf(stderr,
"test_gdi_ClipCoords()\n");
420 if (test_gdi_ClipCoords() < 0)
423 (void)fprintf(stderr,
"test_gdi_InvalidateRegion()\n");
425 if (test_gdi_InvalidateRegion() < 0)