ReactOS 0.4.15-dev-7924-g5949c20
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
12VOID
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
31void 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) \
39do { \
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) \
48do { \
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
VOID InitXFORM(PXFORM pxform, FLOAT eM11, FLOAT eM12, FLOAT eM21, FLOAT eM22, FLOAT eDx, FLOAT eDy)
#define CheckRect(prect, _left, _top, _right, _bottom)
#define CheckRectRegion(hrgn, _left, _top, _right, _bottom)
void Test_ExtCreateRegion_Transform()
static HRGN hrgn
#define ok(value,...)
Definition: atltest.h:57
#define START_TEST(x)
Definition: atltest.h:75
struct _RGNDATAHEADER RGNDATAHEADER
#define NULL
Definition: types.h:112
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
_Check_return_ float __cdecl cosf(_In_ float x)
Definition: math.h:224
_Check_return_ float __cdecl sinf(_In_ float x)
Definition: math.h:233
FLOAT eDy
Definition: wingdi.h:1726
FLOAT eM11
Definition: wingdi.h:1721
FLOAT eM21
Definition: wingdi.h:1723
FLOAT eM22
Definition: wingdi.h:1724
FLOAT eM12
Definition: wingdi.h:1722
FLOAT eDx
Definition: wingdi.h:1725
LONG right
Definition: windef.h:308
LONG bottom
Definition: windef.h:309
LONG top
Definition: windef.h:307
LONG left
Definition: windef.h:306
float FLOAT
Definition: typedefs.h:69
#define PRECT
Definition: precomp.h:27
#define RECT
Definition: precomp.h:26
#define COMPLEXREGION
Definition: wingdi.h:363
#define RDH_RECTANGLES
Definition: wingdi.h:669
HRGN WINAPI ExtCreateRegion(_In_opt_ const XFORM *lpx, _In_ DWORD nCount, _In_reads_bytes_(nCount) const RGNDATA *lpData)
int WINAPI GetRgnBox(_In_ HRGN, _Out_ LPRECT)
BOOL WINAPI SetRectEmpty(_Out_ LPRECT)
char CHAR
Definition: xmlstorage.h:175