FreeRDP
TestGdiEllipse.c
1 
2 #include <freerdp/gdi/gdi.h>
3 
4 #include <freerdp/gdi/dc.h>
5 #include <freerdp/gdi/pen.h>
6 #include <freerdp/gdi/shape.h>
7 #include <freerdp/gdi/region.h>
8 #include <freerdp/gdi/bitmap.h>
9 
10 #include <winpr/crt.h>
11 #include <winpr/print.h>
12 
13 #include "line.h"
14 #include "brush.h"
15 #include "clipping.h"
16 #include "helpers.h"
17 
18 /* Ellipse() Test Data */
19 
20 static const BYTE ellipse_case_1[256] = {
21  "\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF"
22  "\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF"
23  "\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF"
24  "\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF"
25  "\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF"
26  "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
27  "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
28  "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
29  "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
30  "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
31  "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
32  "\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF"
33  "\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF"
34  "\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF"
35  "\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF"
36  "\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF"
37 };
38 
39 static const BYTE ellipse_case_2[256] = {
40  "\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF"
41  "\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF"
42  "\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF"
43  "\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF"
44  "\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF"
45  "\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF"
46  "\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF"
47  "\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF"
48  "\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF"
49  "\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF"
50  "\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF"
51  "\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF"
52  "\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF"
53  "\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF"
54  "\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF"
55  "\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF"
56 };
57 
58 static const BYTE ellipse_case_3[256] = {
59  "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
60  "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
61  "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
62  "\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF"
63  "\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF"
64  "\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF"
65  "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
66  "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
67  "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
68  "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
69  "\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF"
70  "\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF"
71  "\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF"
72  "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
73  "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
74  "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
75 };
76 
77 int TestGdiEllipse(int argc, char* argv[])
78 {
79  int rc = -1;
80  const UINT32 RawFormat = PIXEL_FORMAT_RGB8;
81  const UINT32 colorFormats[] = { PIXEL_FORMAT_RGB15, PIXEL_FORMAT_ARGB15, PIXEL_FORMAT_RGB16,
82  PIXEL_FORMAT_RGB24, PIXEL_FORMAT_ARGB32, PIXEL_FORMAT_XRGB32,
83  PIXEL_FORMAT_RGBA32, PIXEL_FORMAT_RGBX32, PIXEL_FORMAT_BGR15,
84  PIXEL_FORMAT_ABGR15, PIXEL_FORMAT_BGR16, PIXEL_FORMAT_BGR24,
85  PIXEL_FORMAT_ABGR32, PIXEL_FORMAT_XBGR32, PIXEL_FORMAT_BGRA32,
86  PIXEL_FORMAT_BGRX32 };
87  const UINT32 number_formats = sizeof(colorFormats) / sizeof(colorFormats[0]);
88  gdiPalette g;
89  WINPR_UNUSED(argc);
90  WINPR_UNUSED(argv);
91 
92  for (UINT32 i = 0; i < number_formats; i++)
93  {
94  HGDI_DC hdc = NULL;
95  HGDI_PEN pen = NULL;
96  HGDI_BITMAP hBmp = NULL;
97  HGDI_BITMAP hBmp_Ellipse_1 = NULL;
98  HGDI_BITMAP hBmp_Ellipse_2 = NULL;
99  HGDI_BITMAP hBmp_Ellipse_3 = NULL;
100  const UINT32 format = colorFormats[i];
101  gdiPalette* hPalette = &g;
102  g.format = format;
103 
104  for (UINT32 j = 0; j < 256; j++)
105  g.palette[i] = FreeRDPGetColor(format, j, j, j, 0xFF);
106 
107  rc = -1;
108 
109  if (!(hdc = gdi_GetDC()))
110  {
111  printf("failed to get gdi device context\n");
112  goto fail;
113  }
114 
115  hdc->format = format;
116  gdi_SetNullClipRgn(hdc);
117 
118  if (!(pen = gdi_CreatePen(1, 1, 0, format, hPalette)))
119  {
120  printf("gdi_CreatePen failed\n");
121  goto fail;
122  }
123 
124  gdi_SelectObject(hdc, (HGDIOBJECT)pen);
125  hBmp = gdi_CreateCompatibleBitmap(hdc, 16, 16);
126  gdi_SelectObject(hdc, (HGDIOBJECT)hBmp);
127  hBmp_Ellipse_1 = test_convert_to_bitmap(ellipse_case_1, RawFormat, 0, 0, 0, format, 0, 0, 0,
128  16, 16, hPalette);
129 
130  if (!hBmp_Ellipse_1)
131  goto fail;
132 
133  hBmp_Ellipse_2 = test_convert_to_bitmap(ellipse_case_2, RawFormat, 0, 0, 0, format, 0, 0, 0,
134  16, 16, hPalette);
135 
136  if (!hBmp_Ellipse_2)
137  goto fail;
138 
139  hBmp_Ellipse_3 = test_convert_to_bitmap(ellipse_case_3, RawFormat, 0, 0, 0, format, 0, 0, 0,
140  16, 16, hPalette);
141 
142  if (!hBmp_Ellipse_3)
143  goto fail;
144 
145  /* Test Case 1: (0,0) -> (16, 16) */
146  if (!gdi_BitBlt(hdc, 0, 0, 16, 16, hdc, 0, 0, GDI_WHITENESS, hPalette))
147  {
148  printf("gdi_BitBlt failed (line #%u)\n", __LINE__);
149  goto fail;
150  }
151 
152  if (!gdi_Ellipse(hdc, 0, 0, 15, 15))
153  goto fail;
154 
155  rc = 0;
156  fail:
157  gdi_DeleteObject((HGDIOBJECT)hBmp_Ellipse_1);
158  gdi_DeleteObject((HGDIOBJECT)hBmp_Ellipse_2);
159  gdi_DeleteObject((HGDIOBJECT)hBmp_Ellipse_3);
160  gdi_DeleteObject((HGDIOBJECT)hBmp);
161  gdi_DeleteObject((HGDIOBJECT)pen);
162  gdi_DeleteDC(hdc);
163 
164  if (rc != 0)
165  break;
166  }
167 
168  return rc;
169 }