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