[GDI32_APITEST] Remove broken EngDeleteSemaphore.c (#655)
[reactos.git] / modules / rostests / apitests / gdi32 / CombineRgn.c
1 /*
2 * PROJECT: ReactOS api tests
3 * LICENSE: GPL - See COPYING in the top level directory
4 * PURPOSE: Test for ...
5 * PROGRAMMERS: Timo Kreuzer
6 */
7
8 #include "precomp.h"
9
10 typedef struct _RECT_TEST
11 {
12 RECT rcSrc1;
13 RECT rcSrc2;
14 struct
15 {
16 INT iComplexity;
17 RECT rcDstBounds;
18 } res[4];
19 } RECT_TEST, *PRECT_TEST;
20
21 #define SetRectRgnIndirect(hrgn, prect) \
22 SetRectRgn(hrgn, (prect)->left, (prect)->top, (prect)->right, (prect)->bottom)
23
24 PSTR apszRgnOp[6] = { "invalid", "RGN_AND", "RGN_OR", "RGN_XOR", "RGN_DIFF", "RGN_COPY" };
25
26 void Test_RectRegions()
27 {
28 RECT_TEST aRectTests[] = {
29
30 /* rcSrc1 rcSrc2 RGN_AND RGN_OR RGN_XOR RGN_DIFF */
31 {{0,0,0,0},{0,0,0,0}, {{NULLREGION, {0,0,0,0}}, {NULLREGION, {0,0,0,0}}, {NULLREGION, {0,0,0,0}}, {NULLREGION, {0,0,0,0}}}},
32 {{0,0,1,1},{0,0,0,0}, {{NULLREGION, {0,0,0,0}}, {SIMPLEREGION, {0,0,1,1}}, {SIMPLEREGION, {0,0,1,1}}, {SIMPLEREGION, {0,0,1,1}}}},
33 {{0,0,0,0},{0,0,1,1}, {{NULLREGION, {0,0,0,0}}, {SIMPLEREGION, {0,0,1,1}}, {SIMPLEREGION, {0,0,1,1}}, {NULLREGION, {0,0,0,0}}}},
34
35 /* Equal rgn */
36 {{0,0,4,4},{0,0,4,4}, {{SIMPLEREGION, {0,0,4,4}}, {SIMPLEREGION, {0,0,4,4}}, {NULLREGION, {0,0,0,0}}, {NULLREGION, {0,0,0,0}}}},
37
38 /* rgn 2 is within rgn 1 */
39 {{0,0,4,4},{0,0,2,4}, {{SIMPLEREGION, {0,0,2,4}}, {SIMPLEREGION, {0,0,4,4}}, {SIMPLEREGION ,{2,0,4,4}}, {SIMPLEREGION, {2,0,4,4}}}}, // left
40 {{0,0,4,4},{0,0,4,2}, {{SIMPLEREGION, {0,0,4,2}}, {SIMPLEREGION, {0,0,4,4}}, {SIMPLEREGION ,{0,2,4,4}}, {SIMPLEREGION, {0,2,4,4}}}}, // top
41 {{0,0,4,4},{2,0,4,4}, {{SIMPLEREGION, {2,0,4,4}}, {SIMPLEREGION, {0,0,4,4}}, {SIMPLEREGION ,{0,0,2,4}}, {SIMPLEREGION, {0,0,2,4}}}}, // right
42 {{0,0,4,4},{0,2,4,4}, {{SIMPLEREGION, {0,2,4,4}}, {SIMPLEREGION, {0,0,4,4}}, {SIMPLEREGION ,{0,0,4,2}}, {SIMPLEREGION, {0,0,4,2}}}}, // bottom
43 {{0,0,4,4},{0,0,2,2}, {{SIMPLEREGION, {0,0,2,2}}, {SIMPLEREGION, {0,0,4,4}}, {COMPLEXREGION,{0,0,4,4}}, {COMPLEXREGION,{0,0,4,4}}}}, // top-left
44 {{0,0,4,4},{2,0,4,2}, {{SIMPLEREGION, {2,0,4,2}}, {SIMPLEREGION, {0,0,4,4}}, {COMPLEXREGION,{0,0,4,4}}, {COMPLEXREGION,{0,0,4,4}}}}, // top-right
45 {{0,0,4,4},{0,2,2,4}, {{SIMPLEREGION, {0,2,2,4}}, {SIMPLEREGION, {0,0,4,4}}, {COMPLEXREGION,{0,0,4,4}}, {COMPLEXREGION,{0,0,4,4}}}}, // bottom-left
46 {{0,0,4,4},{2,2,4,4}, {{SIMPLEREGION, {2,2,4,4}}, {SIMPLEREGION, {0,0,4,4}}, {COMPLEXREGION,{0,0,4,4}}, {COMPLEXREGION,{0,0,4,4}}}}, // bottom-right
47 {{0,0,4,4},{0,1,2,3}, {{SIMPLEREGION, {0,1,2,3}}, {SIMPLEREGION, {0,0,4,4}}, {COMPLEXREGION,{0,0,4,4}}, {COMPLEXREGION,{0,0,4,4}}}}, // center-left
48 {{0,0,4,4},{1,0,3,2}, {{SIMPLEREGION, {1,0,3,2}}, {SIMPLEREGION, {0,0,4,4}}, {COMPLEXREGION,{0,0,4,4}}, {COMPLEXREGION,{0,0,4,4}}}}, // center-top
49 {{0,0,4,4},{2,1,4,3}, {{SIMPLEREGION, {2,1,4,3}}, {SIMPLEREGION, {0,0,4,4}}, {COMPLEXREGION,{0,0,4,4}}, {COMPLEXREGION,{0,0,4,4}}}}, // center-right
50 {{0,0,4,4},{1,2,3,4}, {{SIMPLEREGION, {1,2,3,4}}, {SIMPLEREGION, {0,0,4,4}}, {COMPLEXREGION,{0,0,4,4}}, {COMPLEXREGION,{0,0,4,4}}}}, // center-bottom
51 {{0,0,4,4},{1,1,3,4}, {{SIMPLEREGION, {1,1,3,4}}, {SIMPLEREGION, {0,0,4,4}}, {COMPLEXREGION,{0,0,4,4}}, {COMPLEXREGION,{0,0,4,4}}}}, // center
52
53 /* rgn 1 is within rgn 2 */
54 {{0,0,2,4},{0,0,4,4}, {{SIMPLEREGION, {0,0,2,4}}, {SIMPLEREGION, {0,0,4,4}}, {SIMPLEREGION ,{2,0,4,4}}, {NULLREGION, {0,0,0,0}}}}, // left
55 {{0,0,4,2},{0,0,4,4}, {{SIMPLEREGION, {0,0,4,2}}, {SIMPLEREGION, {0,0,4,4}}, {SIMPLEREGION ,{0,2,4,4}}, {NULLREGION, {0,0,0,0}}}}, // top
56 {{2,0,4,4},{0,0,4,4}, {{SIMPLEREGION, {2,0,4,4}}, {SIMPLEREGION, {0,0,4,4}}, {SIMPLEREGION ,{0,0,2,4}}, {NULLREGION, {0,0,0,0}}}}, // right
57 {{0,2,4,4},{0,0,4,4}, {{SIMPLEREGION, {0,2,4,4}}, {SIMPLEREGION, {0,0,4,4}}, {SIMPLEREGION ,{0,0,4,2}}, {NULLREGION, {0,0,0,0}}}}, // bottom
58 {{0,0,2,2},{0,0,4,4}, {{SIMPLEREGION, {0,0,2,2}}, {SIMPLEREGION, {0,0,4,4}}, {COMPLEXREGION,{0,0,4,4}}, {NULLREGION, {0,0,0,0}}}}, // top-left
59 {{2,0,4,2},{0,0,4,4}, {{SIMPLEREGION, {2,0,4,2}}, {SIMPLEREGION, {0,0,4,4}}, {COMPLEXREGION,{0,0,4,4}}, {NULLREGION, {0,0,0,0}}}}, // top-right
60 {{0,2,2,4},{0,0,4,4}, {{SIMPLEREGION, {0,2,2,4}}, {SIMPLEREGION, {0,0,4,4}}, {COMPLEXREGION,{0,0,4,4}}, {NULLREGION, {0,0,0,0}}}}, // bottom-left
61 {{2,2,4,4},{0,0,4,4}, {{SIMPLEREGION, {2,2,4,4}}, {SIMPLEREGION, {0,0,4,4}}, {COMPLEXREGION,{0,0,4,4}}, {NULLREGION, {0,0,0,0}}}}, // bottom-right
62 {{0,1,2,3},{0,0,4,4}, {{SIMPLEREGION, {0,1,2,3}}, {SIMPLEREGION, {0,0,4,4}}, {COMPLEXREGION,{0,0,4,4}}, {NULLREGION, {0,0,0,0}}}}, // center-left
63 {{1,0,3,2},{0,0,4,4}, {{SIMPLEREGION, {1,0,3,2}}, {SIMPLEREGION, {0,0,4,4}}, {COMPLEXREGION,{0,0,4,4}}, {NULLREGION, {0,0,0,0}}}}, // center-top
64 {{2,1,4,3},{0,0,4,4}, {{SIMPLEREGION, {2,1,4,3}}, {SIMPLEREGION, {0,0,4,4}}, {COMPLEXREGION,{0,0,4,4}}, {NULLREGION, {0,0,0,0}}}}, // center-right
65 {{1,2,3,4},{0,0,4,4}, {{SIMPLEREGION, {1,2,3,4}}, {SIMPLEREGION, {0,0,4,4}}, {COMPLEXREGION,{0,0,4,4}}, {NULLREGION, {0,0,0,0}}}}, // center-bottom
66 {{1,1,3,4},{0,0,4,4}, {{SIMPLEREGION, {1,1,3,4}}, {SIMPLEREGION, {0,0,4,4}}, {COMPLEXREGION,{0,0,4,4}}, {NULLREGION, {0,0,0,0}}}}, // center
67
68 /* rgn 2 is adjacent to rgn 1 */
69 {{2,2,4,4},{0,2,2,4}, {{NULLREGION, {0,0,0,0}}, {SIMPLEREGION, {0,2,4,4}}, {SIMPLEREGION, {0,2,4,4}}, {SIMPLEREGION, {2,2,4,4}}}}, // left-fit
70 {{2,2,4,4},{0,1,2,5}, {{NULLREGION, {0,0,0,0}}, {COMPLEXREGION,{0,1,4,5}}, {COMPLEXREGION,{0,1,4,5}}, {SIMPLEREGION, {2,2,4,4}}}}, // left-larger
71 {{2,2,4,4},{0,3,2,4}, {{NULLREGION, {0,0,0,0}}, {COMPLEXREGION,{0,2,4,4}}, {COMPLEXREGION,{0,2,4,4}}, {SIMPLEREGION, {2,2,4,4}}}}, // left-smaller
72 {{2,2,4,4},{2,0,4,2}, {{NULLREGION, {0,0,0,0}}, {SIMPLEREGION, {2,0,4,4}}, {SIMPLEREGION, {2,0,4,4}}, {SIMPLEREGION, {2,2,4,4}}}}, // top-fit
73 {{2,2,4,4},{1,0,5,2}, {{NULLREGION, {0,0,0,0}}, {COMPLEXREGION,{1,0,5,4}}, {COMPLEXREGION,{1,0,5,4}}, {SIMPLEREGION, {2,2,4,4}}}}, // top-larger
74 {{2,2,4,4},{3,0,4,2}, {{NULLREGION, {0,0,0,0}}, {COMPLEXREGION,{2,0,4,4}}, {COMPLEXREGION,{2,0,4,4}}, {SIMPLEREGION, {2,2,4,4}}}}, // top-smaller
75 {{2,2,4,4},{4,2,6,4}, {{NULLREGION, {0,0,0,0}}, {SIMPLEREGION, {2,2,6,4}}, {SIMPLEREGION, {2,2,6,4}}, {SIMPLEREGION, {2,2,4,4}}}}, // right-fit
76 {{2,2,4,4},{4,1,6,5}, {{NULLREGION, {0,0,0,0}}, {COMPLEXREGION,{2,1,6,5}}, {COMPLEXREGION,{2,1,6,5}}, {SIMPLEREGION, {2,2,4,4}}}}, // right-larger
77 {{2,2,4,4},{4,3,6,4}, {{NULLREGION, {0,0,0,0}}, {COMPLEXREGION,{2,2,6,4}}, {COMPLEXREGION,{2,2,6,4}}, {SIMPLEREGION, {2,2,4,4}}}}, // right-smaller
78 {{2,2,4,4},{2,4,4,6}, {{NULLREGION, {0,0,0,0}}, {SIMPLEREGION, {2,2,4,6}}, {SIMPLEREGION, {2,2,4,6}}, {SIMPLEREGION, {2,2,4,4}}}}, // bottom-fit
79 {{2,2,4,4},{1,4,5,6}, {{NULLREGION, {0,0,0,0}}, {COMPLEXREGION,{1,2,5,6}}, {COMPLEXREGION,{1,2,5,6}}, {SIMPLEREGION, {2,2,4,4}}}}, // bottom-larger
80 {{2,2,4,4},{3,4,4,6}, {{NULLREGION, {0,0,0,0}}, {COMPLEXREGION,{2,2,4,6}}, {COMPLEXREGION,{2,2,4,6}}, {SIMPLEREGION, {2,2,4,4}}}}, // bottom-smaller
81
82 /* rgn 2 overlaps rgn 1 */
83 {{2,2,4,4},{0,2,3,4}, {{SIMPLEREGION, {2,2,3,4}}, {SIMPLEREGION, {0,2,4,4}}, {COMPLEXREGION,{0,2,4,4}}, {SIMPLEREGION, {3,2,4,4}}}}, // left-fit
84 {{2,2,4,4},{0,1,3,5}, {{SIMPLEREGION, {2,2,3,4}}, {COMPLEXREGION,{0,1,4,5}}, {COMPLEXREGION,{0,1,4,5}}, {SIMPLEREGION, {3,2,4,4}}}}, // left-larger
85 {{2,2,4,4},{0,3,3,4}, {{SIMPLEREGION, {2,3,3,4}}, {COMPLEXREGION,{0,2,4,4}}, {COMPLEXREGION,{0,2,4,4}}, {COMPLEXREGION,{2,2,4,4}}}}, // left-smaller
86 {{2,2,4,4},{2,0,4,3}, {{SIMPLEREGION, {2,2,4,3}}, {SIMPLEREGION, {2,0,4,4}}, {COMPLEXREGION,{2,0,4,4}}, {SIMPLEREGION, {2,3,4,4}}}}, // top-fit
87 {{2,2,4,4},{1,0,5,3}, {{SIMPLEREGION, {2,2,4,3}}, {COMPLEXREGION,{1,0,5,4}}, {COMPLEXREGION,{1,0,5,4}}, {SIMPLEREGION, {2,3,4,4}}}}, // top-larger
88 {{2,2,4,4},{3,0,4,3}, {{SIMPLEREGION, {3,2,4,3}}, {COMPLEXREGION,{2,0,4,4}}, {COMPLEXREGION,{2,0,4,4}}, {COMPLEXREGION,{2,2,4,4}}}}, // top-smaller
89 {{2,2,4,4},{3,2,6,4}, {{SIMPLEREGION, {3,2,4,4}}, {SIMPLEREGION, {2,2,6,4}}, {COMPLEXREGION,{2,2,6,4}}, {SIMPLEREGION, {2,2,3,4}}}}, // right-fit
90 {{2,2,4,4},{3,1,6,5}, {{SIMPLEREGION, {3,2,4,4}}, {COMPLEXREGION,{2,1,6,5}}, {COMPLEXREGION,{2,1,6,5}}, {SIMPLEREGION, {2,2,3,4}}}}, // right-larger
91 {{2,2,4,4},{3,3,6,4}, {{SIMPLEREGION, {3,3,4,4}}, {COMPLEXREGION,{2,2,6,4}}, {COMPLEXREGION,{2,2,6,4}}, {COMPLEXREGION,{2,2,4,4}}}}, // right-smaller
92 {{2,2,4,4},{2,3,4,6}, {{SIMPLEREGION, {2,3,4,4}}, {SIMPLEREGION, {2,2,4,6}}, {COMPLEXREGION,{2,2,4,6}}, {SIMPLEREGION, {2,2,4,3}}}}, // bottom-fit
93 {{2,2,4,4},{1,3,5,6}, {{SIMPLEREGION, {2,3,4,4}}, {COMPLEXREGION,{1,2,5,6}}, {COMPLEXREGION,{1,2,5,6}}, {SIMPLEREGION, {2,2,4,3}}}}, // bottom-larger
94 {{2,2,4,4},{3,3,4,6}, {{SIMPLEREGION, {3,3,4,4}}, {COMPLEXREGION,{2,2,4,6}}, {COMPLEXREGION,{2,2,4,6}}, {COMPLEXREGION,{2,2,4,4}}}}, // bottom-smaller
95 {{2,2,4,4},{0,0,3,3}, {{SIMPLEREGION, {2,2,3,3}}, {COMPLEXREGION,{0,0,4,4}}, {COMPLEXREGION,{0,0,4,4}}, {COMPLEXREGION,{2,2,4,4}}}}, // top-left
96 {{2,2,4,4},{3,0,6,3}, {{SIMPLEREGION, {3,2,4,3}}, {COMPLEXREGION,{2,0,6,4}}, {COMPLEXREGION,{2,0,6,4}}, {COMPLEXREGION,{2,2,4,4}}}}, // top-right
97 {{2,2,4,4},{0,3,3,6}, {{SIMPLEREGION, {2,3,3,4}}, {COMPLEXREGION,{0,2,4,6}}, {COMPLEXREGION,{0,2,4,6}}, {COMPLEXREGION,{2,2,4,4}}}}, // bottom-left
98 {{2,2,4,4},{3,3,6,6}, {{SIMPLEREGION, {3,3,4,4}}, {COMPLEXREGION,{2,2,6,6}}, {COMPLEXREGION,{2,2,6,6}}, {COMPLEXREGION,{2,2,4,4}}}}, // bottom-right
99
100 };
101
102 HRGN hrgn1, hrgn2, hrgn3, hrgnRes;
103 RECT rc;
104 INT iComplexity;
105 UINT i;
106
107 hrgn1 = CreateRectRgn(0, 0, 0, 0);
108 hrgn2 = CreateRectRgn(0, 0, 0, 0);
109 hrgn3 = CreateRectRgn(0, 0, 0, 0);
110 hrgnRes = CreateRectRgn(0, 0, 0, 0);
111
112 for (i = 0; i < sizeof(aRectTests) / sizeof(aRectTests[0]); i++)
113 {
114 INT iCombine;
115
116 SetRectRgnIndirect(hrgn1, &aRectTests[i].rcSrc1);
117 SetRectRgnIndirect(hrgn2, &aRectTests[i].rcSrc2);
118
119 for (iCombine = RGN_AND; iCombine <= RGN_DIFF; iCombine++)
120 {
121 iComplexity = CombineRgn(hrgnRes, hrgn1, hrgn2, iCombine);
122 ok(iComplexity == aRectTests[i].res[iCombine-1].iComplexity,
123 "#%u (%s), iComplexity does not match: expected %u, got %u\n",
124 i, apszRgnOp[iCombine], aRectTests[i].res[iCombine-1].iComplexity, iComplexity);
125
126 ok(GetRgnBox(hrgnRes, &rc), "GetRgnBox failed!\n");
127 ok(EqualRect(&rc, &aRectTests[i].res[iCombine-1].rcDstBounds),
128 "#%u (%s), Bounding box does not match: expected {%ld,%ld,%ld,%ld} got {%ld,%ld,%ld,%ld}\n",
129 i, apszRgnOp[iCombine],
130 aRectTests[i].res[iCombine-1].rcDstBounds.left, aRectTests[i].res[iCombine-1].rcDstBounds.top,
131 aRectTests[i].res[iCombine-1].rcDstBounds.right, aRectTests[i].res[iCombine-1].rcDstBounds.bottom,
132 rc.left, rc.top, rc.right, rc.bottom);
133
134 if (aRectTests[i].res[iCombine-1].iComplexity == SIMPLEREGION)
135 {
136 SetRectRgnIndirect(hrgn3, &aRectTests[i].res[iCombine-1].rcDstBounds);
137 ok(EqualRgn(hrgnRes, hrgn3), "#%u (%s), regions are not equal\n",
138 i, apszRgnOp[iCombine]);
139 }
140 }
141 }
142
143 DeleteObject(hrgn1);
144 DeleteObject(hrgn2);
145 DeleteObject(hrgn3);
146 DeleteObject(hrgnRes);
147 }
148
149
150 void Test_CombineRgn_Params()
151 {
152 HRGN hrgn1, hrgn2, hrgn3;
153
154 hrgn1 = CreateRectRgn(0, 0, 0, 0);
155 hrgn2 = CreateRectRgn(0, 0, 10, 10);
156 hrgn3 = CreateRectRgn(5, 5, 20, 20);
157
158 SetLastError(0xbadbabe);
159 ok_long(CombineRgn(NULL, NULL, NULL, 0), ERROR);
160 ok_long(CombineRgn(hrgn1, hrgn2, hrgn3, 0), ERROR);
161 ok_long(CombineRgn(hrgn1, hrgn2, hrgn3, 6), ERROR);
162 ok((GetLastError() == 0xbadbabe) || (GetLastError() == ERROR_INVALID_PARAMETER), "wrong error: %ld\n", GetLastError());
163
164 }
165
166 void Test_CombineRgn_COPY()
167 {
168 HRGN hrgn1, hrgn2, hrgn3;
169
170 hrgn1 = CreateRectRgn(0, 0, 0, 0);
171 hrgn2 = CreateRectRgn(0, 0, 10, 10);
172 hrgn3 = CreateRectRgn(5, 5, 20, 20);
173
174 SetLastError(0xbadbabe);
175 ok_long(CombineRgn(NULL, NULL, NULL, RGN_COPY), ERROR);
176 ok_long(CombineRgn(NULL, hrgn1, NULL, RGN_COPY), ERROR);
177 ok_long(CombineRgn(NULL, NULL, hrgn1, RGN_COPY), ERROR);
178 ok_long(CombineRgn(NULL, hrgn1, hrgn2, RGN_COPY), ERROR);
179 ok((GetLastError() == 0xbadbabe) || (GetLastError() == ERROR_INVALID_HANDLE), "wrong error: %ld\n", GetLastError());
180
181 ok_long(CombineRgn(hrgn1, hrgn2, hrgn3, RGN_COPY), SIMPLEREGION);
182 ok(EqualRgn(hrgn1, hrgn2), "Region is not correct\n");
183
184 ok_long(CombineRgn(hrgn1, hrgn1, NULL, RGN_COPY), SIMPLEREGION);
185 ok(EqualRgn(hrgn1, hrgn2), "Region is not correct\n");
186
187 ok_long(CombineRgn(hrgn1, hrgn3, GetStockObject(BLACK_PEN), RGN_COPY), SIMPLEREGION);
188 ok(EqualRgn(hrgn1, hrgn3), "Region is not correct\n");
189
190 ok_long(CombineRgn(hrgn1, GetStockObject(BLACK_PEN), hrgn2, RGN_COPY), ERROR);
191 ok(EqualRgn(hrgn1, hrgn3), "Region is not correct\n");
192
193 ok_long(CombineRgn(hrgn1, NULL, hrgn2, RGN_COPY), ERROR);
194 ok(EqualRgn(hrgn1, hrgn3), "Region is not correct\n");
195
196 ok_long(CombineRgn(hrgn1, NULL, NULL, RGN_COPY), ERROR);
197 ok(EqualRgn(hrgn1, hrgn3), "Region is not correct\n");
198
199 ok((GetLastError() == 0xbadbabe) || (GetLastError() == ERROR_INVALID_HANDLE), "wrong error: %ld\n", GetLastError());
200
201 }
202
203 void Test_CombineRgn_AND()
204 {
205 HRGN hrgn1, hrgn2, hrgn3;
206
207 hrgn1 = CreateRectRgn(0, 0, 0, 0);
208 hrgn2 = CreateRectRgn(0, 0, 10, 10);
209 hrgn3 = CreateRectRgn(5, 5, 20, 20);
210
211 SetLastError(0xbadbabe);
212 ok_long(CombineRgn(NULL, NULL, NULL, RGN_AND), ERROR);
213 ok_long(CombineRgn(hrgn1, NULL, NULL, RGN_AND), ERROR);
214 ok_long(CombineRgn(hrgn1, hrgn2, NULL, RGN_AND), ERROR);
215 ok_long(CombineRgn(hrgn1, NULL, hrgn2, RGN_AND), ERROR);
216 ok_long(CombineRgn(hrgn1, GetStockObject(BLACK_PEN), hrgn2, RGN_AND), ERROR);
217 ok_long(CombineRgn(hrgn1, hrgn2, GetStockObject(BLACK_PEN), RGN_AND), ERROR);
218 ok((GetLastError() == 0xbadbabe) || (GetLastError() == ERROR_INVALID_HANDLE), "wrong error: %ld\n", GetLastError());
219
220
221 ok_long(CombineRgn(hrgn1, hrgn2, hrgn3, RGN_AND), SIMPLEREGION);
222 SetRectRgn(hrgn2, 5, 5, 10, 10);
223 ok(EqualRgn(hrgn1, hrgn2), "Region is not correct\n");
224
225 SetRectRgn(hrgn2, 0, 0, 5, 5);
226 SetRectRgn(hrgn3, 5, 0, 10, 5);
227 ok_long(CombineRgn(hrgn1, hrgn2, hrgn3, RGN_AND), NULLREGION);
228 SetRectRgn(hrgn2, 0, 0, 0, 0);
229 ok(EqualRgn(hrgn1, hrgn2), "Region is not correct\n");
230
231 SetRectRgn(hrgn2, 0, 0, 20, 20);
232 SetRectRgn(hrgn3, 5, 5, 10, 10);
233 ok_long(CombineRgn(hrgn1, hrgn2, hrgn3, RGN_AND), SIMPLEREGION);
234 SetRectRgn(hrgn2, 5, 5, 10, 10);
235 ok(EqualRgn(hrgn1, hrgn2), "Region is not correct\n");
236
237
238 SetRectRgn(hrgn2, 0, 0, 30, 10);
239 SetRectRgn(hrgn3, 10, 10, 20, 30);
240 ok_long(CombineRgn(hrgn1, hrgn2, hrgn3, RGN_OR), COMPLEXREGION);
241 SetRectRgn(hrgn2, 10, 0, 30, 30);
242 ok_long(CombineRgn(hrgn1, hrgn1, hrgn2, RGN_AND), COMPLEXREGION);
243 ok_long(CombineRgn(hrgn1, hrgn1, hrgn1, RGN_AND), COMPLEXREGION);
244 SetRectRgn(hrgn2, 10, 10, 30, 30);
245 ok_long(CombineRgn(hrgn1, hrgn1, hrgn2, RGN_AND), SIMPLEREGION);
246 SetRectRgn(hrgn2, 0, 0, 10, 10);
247 ok_long(CombineRgn(hrgn1, hrgn1, hrgn2, RGN_AND), NULLREGION);
248
249 SetRectRgn(hrgn1, 0, 0, 30, 10);
250 ok_long(CombineRgn(hrgn1, hrgn1, hrgn1, RGN_AND), SIMPLEREGION);
251
252 }
253
254 void Test_CombineRgn_OR()
255 {
256 HRGN hrgn1, hrgn2, hrgn3;
257
258 hrgn1 = CreateRectRgn(0, 0, 0, 0);
259 hrgn2 = CreateRectRgn(0, 0, 5, 5);
260 hrgn3 = CreateRectRgn(5, 0, 10, 5);
261 ok_long(CombineRgn(hrgn1, hrgn2, hrgn3, RGN_OR), SIMPLEREGION);
262 SetRectRgn(hrgn2, 0, 0, 10, 5);
263 ok(EqualRgn(hrgn1, hrgn2), "Region is not correct\n");
264
265 SetRectRgn(hrgn2, 0, 0, 10, 10);
266 SetRectRgn(hrgn3, 10, 10, 20, 20);
267 ok_long(CombineRgn(hrgn1, hrgn2, hrgn3, RGN_OR), COMPLEXREGION);
268 SetRectRgn(hrgn2, 10, 0, 20, 10);
269 ok_long(CombineRgn(hrgn1, hrgn1, hrgn2, RGN_OR), COMPLEXREGION);
270 ok_long(CombineRgn(hrgn1, hrgn1, hrgn1, RGN_OR), COMPLEXREGION);
271 SetRectRgn(hrgn2, 0, 10, 10, 20);
272 ok_long(CombineRgn(hrgn1, hrgn1, hrgn2, RGN_OR), SIMPLEREGION);
273 SetRectRgn(hrgn2, 0, 0, 20, 20);
274 ok(EqualRgn(hrgn1, hrgn2), "Region is not correct\n");
275
276 }
277
278 void Test_CombineRgn_DIFF()
279 {
280 HRGN hrgn1, hrgn2, hrgn3;
281
282 hrgn1 = CreateRectRgn(0, 0, 0, 0);
283 hrgn2 = CreateRectRgn(0, 0, 10, 10);
284 hrgn3 = CreateRectRgn(5, 0, 10, 5);
285
286 SetLastError(0xbadbabe);
287 ok_long(CombineRgn(NULL, NULL, NULL, RGN_DIFF), ERROR);
288 ok_long(CombineRgn(hrgn1, NULL, NULL, RGN_DIFF), ERROR);
289 ok_long(CombineRgn(hrgn1, hrgn2, NULL, RGN_DIFF), ERROR);
290 ok_long(CombineRgn(hrgn1, NULL, hrgn2, RGN_DIFF), ERROR);
291 ok_long(CombineRgn(hrgn1, GetStockObject(BLACK_PEN), hrgn2, RGN_DIFF), ERROR);
292 ok_long(CombineRgn(hrgn1, hrgn2, GetStockObject(BLACK_PEN), RGN_DIFF), ERROR);
293 ok((GetLastError() == 0xbadbabe) || (GetLastError() == ERROR_INVALID_HANDLE), "wrong error: %ld\n", GetLastError());
294
295 ok_long(CombineRgn(hrgn1, hrgn1, hrgn1, RGN_DIFF), NULLREGION);
296 ok_long(CombineRgn(hrgn1, hrgn2, hrgn2, RGN_DIFF), NULLREGION);
297 ok_long(CombineRgn(hrgn1, hrgn1, hrgn2, RGN_DIFF), NULLREGION);
298
299 ok_long(CombineRgn(hrgn1, hrgn2, hrgn1, RGN_DIFF), SIMPLEREGION);
300 ok_long(CombineRgn(hrgn1, hrgn2, hrgn3, RGN_DIFF), COMPLEXREGION);
301 ok_long(CombineRgn(hrgn1, hrgn1, hrgn3, RGN_DIFF), COMPLEXREGION);
302 ok_long(CombineRgn(hrgn1, hrgn1, hrgn2, RGN_DIFF), NULLREGION);
303
304
305 }
306
307 void Test_CombineRgn_XOR()
308 {
309 HRGN hrgn1, hrgn2, hrgn3, hrgn4;
310
311 hrgn1 = CreateRectRgn(0, 0, 0, 0);
312 hrgn2 = CreateRectRgn(0, 0, 5, 5);
313 hrgn3 = CreateRectRgn(5, 5, 10, 10);
314 hrgn4 = CreateRectRgn(0, 0, 0, 0);
315
316 SetLastError(0xbadbabe);
317 ok_long(CombineRgn(NULL, NULL, NULL, RGN_XOR), ERROR);
318 ok_long(CombineRgn(hrgn1, NULL, NULL, RGN_XOR), ERROR);
319 ok_long(CombineRgn(hrgn1, hrgn2, NULL, RGN_XOR), ERROR);
320 ok_long(CombineRgn(hrgn1, NULL, hrgn2, RGN_XOR), ERROR);
321 ok_long(CombineRgn(hrgn1, GetStockObject(BLACK_PEN), hrgn2, RGN_XOR), ERROR);
322 ok_long(CombineRgn(hrgn1, hrgn2, GetStockObject(BLACK_PEN), RGN_XOR), ERROR);
323 ok((GetLastError() == 0xbadbabe) || (GetLastError() == ERROR_INVALID_HANDLE), "wrong error: %ld\n", GetLastError());
324
325 ok_long(CombineRgn(hrgn1, hrgn2, hrgn3, RGN_XOR), COMPLEXREGION);
326 ok_long(CombineRgn(hrgn4, hrgn2, hrgn3, RGN_OR), COMPLEXREGION);
327 ok(EqualRgn(hrgn1, hrgn4), "Region is not correct\n");
328
329 ok_long(CombineRgn(hrgn1, hrgn1, hrgn2, RGN_XOR), SIMPLEREGION);
330 ok(EqualRgn(hrgn1, hrgn3), "Region is not correct\n");
331 ok_long(CombineRgn(hrgn1, hrgn1, hrgn3, RGN_XOR), NULLREGION);
332
333
334 }
335
336 START_TEST(CombineRgn)
337 {
338 Test_CombineRgn_Params();
339 Test_CombineRgn_COPY();
340 Test_CombineRgn_AND();
341 Test_CombineRgn_OR();
342 Test_CombineRgn_DIFF();
343 Test_CombineRgn_XOR();
344 Test_RectRegions();
345 }
346