[GDI32_APITEST]
[reactos.git] / rostests / apitests / gdi32 / ExtCreateRegion.c
1 /*
2 * PROJECT: ReactOS api tests
3 * LICENSE: GPL - See COPYING in the top level directory
4 * PURPOSE: Test for ExtCeateRegion
5 * PROGRAMMERS: Timo Kreuzer
6 */
7
8 #include <apitest.h>
9
10 #include <windows.h>
11 #include <math.h>
12
13 VOID
14 InitXFORM(
15 PXFORM pxform,
16 FLOAT eM11,
17 FLOAT eM12,
18 FLOAT eM21,
19 FLOAT eM22,
20 FLOAT eDx,
21 FLOAT eDy)
22 {
23 pxform->eM11 = eM11;
24 pxform->eM12 = eM12;
25 pxform->eM21 = eM21;
26 pxform->eM22 = eM22;
27 pxform->eDx = eDx;
28 pxform->eDy = eDy;
29 }
30
31 #if 0
32 void Test_ExtCreateRegion_Parameters()
33 {
34 hrgn = ExtCreateRegion(NULL, 1, pRgnData);
35 ok(hrgn != NULL, "ExtCreateRegion failed \n");
36 }
37 #endif // 0
38
39 #define CheckRect(prect, _left, _top, _right, _bottom) \
40 do { \
41 ok(((prect)->left == _left) && ((prect)->top == _top) && \
42 ((prect)->right == _right) && ((prect)->bottom == _bottom), \
43 "Region does not match, expected (%ld,%ld,%ld,%ld) got (%ld,%ld,%ld,%ld)\n", \
44 _left, _top, _right, _bottom, \
45 (prect)->left, (prect)->top, (prect)->right, (prect)->bottom); \
46 } while (0)
47
48 #define CheckRectRegion(hrgn, _left, _top, _right, _bottom) \
49 do { \
50 HRGN hrgnTemp = CreateRectRgn(_left, _top, _right, _bottom); \
51 RECT rcTemp; \
52 ok(GetRgnBox(hrgn, &rcTemp) == SIMPLEREGION, "Region is not SIMPLEREGION\n"); \
53 CheckRect(&rcTemp, _left, _top, _right, _bottom); \
54 ok(EqualRgn(hrgn, hrgnTemp), "Region does not match\n"); \
55 DeleteObject(hrgnTemp); \
56 } while (0)
57
58 void Test_ExtCreateRegion_Transform()
59 {
60 struct
61 {
62 RGNDATA rgndata;
63 CHAR data[sizeof(RECT) - 1];
64 } RgnDataBuffer;
65 PRECT prect = (PRECT)&RgnDataBuffer.rgndata.Buffer;
66 const RGNDATA *pRgnData = (const RGNDATA *)&RgnDataBuffer;
67 XFORM xform;
68 FLOAT eAngle;
69 HRGN hrgn;
70 RECT rcTemp;
71
72 RgnDataBuffer.rgndata.rdh.dwSize = sizeof(RGNDATAHEADER);
73 RgnDataBuffer.rgndata.rdh.iType = RDH_RECTANGLES;
74 RgnDataBuffer.rgndata.rdh.nCount = 1;
75 RgnDataBuffer.rgndata.rdh.nRgnSize = sizeof(RGNDATAHEADER) + sizeof(RECT);
76 RgnDataBuffer.rgndata.rdh.rcBound.left = 0;
77 RgnDataBuffer.rgndata.rdh.rcBound.top = 0;
78 RgnDataBuffer.rgndata.rdh.rcBound.right = 10;
79 RgnDataBuffer.rgndata.rdh.rcBound.bottom = 10;
80 prect->left = 0;
81 prect->top = 0;
82 prect->right = 10;
83 prect->bottom = 10;
84
85 SetRectEmpty(&RgnDataBuffer.rgndata.rdh.rcBound);
86
87 hrgn = ExtCreateRegion(NULL, sizeof(RgnDataBuffer), pRgnData);
88 ok(hrgn != NULL, "ExtCreateRegion failed with without transform\n");
89 CheckRectRegion(hrgn, 0, 0, 10, 10);
90
91 InitXFORM(&xform, 1., 0., 0., 1., 0., 0.);
92 hrgn = ExtCreateRegion(&xform, sizeof(RgnDataBuffer), pRgnData);
93 ok(hrgn != NULL, "ExtCreateRegion failed with identity transform\n");
94 CheckRectRegion(hrgn, 0, 0, 10, 10);
95
96 InitXFORM(&xform, 1., 0., 0., 1., 10., 10.);
97 hrgn = ExtCreateRegion(&xform, sizeof(RgnDataBuffer), pRgnData);
98 ok(hrgn != NULL, "ExtCreateRegion failed with offset transform\n");
99 CheckRectRegion(hrgn, 10, 10, 20, 20);
100
101 InitXFORM(&xform, 2.5, 0., 0., 1.5, 0., 0.);
102 hrgn = ExtCreateRegion(&xform, sizeof(RgnDataBuffer), pRgnData);
103 ok(hrgn != NULL, "ExtCreateRegion failed with scaling transform\n");
104 CheckRectRegion(hrgn, 0, 0, 25, 15);
105
106 InitXFORM(&xform, 2.5, 0., 0., 1.5, 20., 40.);
107 hrgn = ExtCreateRegion(&xform, sizeof(RgnDataBuffer), pRgnData);
108 ok(hrgn != NULL, "ExtCreateRegion failed with scaling+offset transform\n");
109 CheckRectRegion(hrgn, 20, 40, 45, 55);
110
111 InitXFORM(&xform, 1., 10., 0., 1., 0., 0.);
112 hrgn = ExtCreateRegion(&xform, sizeof(RgnDataBuffer), pRgnData);
113 ok(hrgn != NULL, "ExtCreateRegion failed with shearing transform\n");
114 ok(GetRgnBox(hrgn, &rcTemp) == COMPLEXREGION, "not a complex region\n");
115 CheckRect(&rcTemp, 0, 1, 10, 101);
116
117 eAngle = 23.6f;
118 InitXFORM(&xform, cosf(eAngle), -sinf(eAngle), sinf(eAngle), cosf(eAngle), 10., 10.);
119 hrgn = ExtCreateRegion(&xform, sizeof(RgnDataBuffer), pRgnData);
120 ok(hrgn != NULL, "ExtCreateRegion failed with rotating transform\n");
121 CheckRectRegion(hrgn, 0, 10, 10, 20);
122
123 }
124
125 START_TEST(ExtCreateRegion)
126 {
127 Test_ExtCreateRegion_Transform();
128 }
129