ReactOS  0.4.15-dev-3428-g0609db5
ExtCreateRegion.c
Go to the documentation of this file.
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
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 
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 
125 {
127 }
128 
struct _RGNDATAHEADER RGNDATAHEADER
#define CheckRectRegion(hrgn, _left, _top, _right, _bottom)
char CHAR
Definition: xmlstorage.h:175
#define COMPLEXREGION
Definition: wingdi.h:363
LONG top
Definition: windef.h:307
LONG left
Definition: windef.h:306
LONG right
Definition: windef.h:308
_Check_return_ float __cdecl cosf(_In_ float x)
Definition: math.h:222
struct tagRECT RECT
FLOAT eDx
Definition: wingdi.h:1725
VOID InitXFORM(PXFORM pxform, FLOAT eM11, FLOAT eM12, FLOAT eM21, FLOAT eM22, FLOAT eDx, FLOAT eDy)
FLOAT eM21
Definition: wingdi.h:1723
FLOAT eM12
Definition: wingdi.h:1722
#define CheckRect(prect, _left, _top, _right, _bottom)
#define RDH_RECTANGLES
Definition: wingdi.h:669
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
FLOAT eM11
Definition: wingdi.h:1721
static HRGN hrgn
Definition: win.c:55
void Test_ExtCreateRegion_Transform()
START_TEST(ExtCreateRegion)
BOOL WINAPI SetRectEmpty(_Out_ LPRECT)
int WINAPI GetRgnBox(_In_ HRGN, _Out_ LPRECT)
HRGN WINAPI ExtCreateRegion(_In_opt_ const XFORM *lpx, _In_ DWORD nCount, _In_reads_bytes_(nCount) const RGNDATA *lpData)
#define ok(value,...)
Definition: atltest.h:57
_Check_return_ float __cdecl sinf(_In_ float x)
Definition: math.h:231
FLOAT eM22
Definition: wingdi.h:1724
FLOAT eDy
Definition: wingdi.h:1726
#define NULL
Definition: types.h:112
float FLOAT
Definition: typedefs.h:69
LONG bottom
Definition: windef.h:309
struct tagRECT * PRECT