2 * PROJECT: ReactOS api tests
3 * LICENSE: GPL - See COPYING in the top level directory
4 * PURPOSE: Test for ...
5 * PROGRAMMERS: Timo Kreuzer
10 typedef struct _RECT_TEST
19 } RECT_TEST
, *PRECT_TEST
;
21 #define SetRectRgnIndirect(hrgn, prect) \
22 SetRectRgn(hrgn, (prect)->left, (prect)->top, (prect)->right, (prect)->bottom)
24 PSTR apszRgnOp
[6] = { "invalid", "RGN_AND", "RGN_OR", "RGN_XOR", "RGN_DIFF", "RGN_COPY" };
26 void Test_RectRegions()
28 RECT_TEST aRectTests
[] = {
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}}}},
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}}}},
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
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
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
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
102 HRGN hrgn1
, hrgn2
, hrgn3
, hrgnRes
;
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);
112 for (i
= 0; i
< sizeof(aRectTests
) / sizeof(aRectTests
[0]); i
++)
116 SetRectRgnIndirect(hrgn1
, &aRectTests
[i
].rcSrc1
);
117 SetRectRgnIndirect(hrgn2
, &aRectTests
[i
].rcSrc2
);
119 for (iCombine
= RGN_AND
; iCombine
<= RGN_DIFF
; iCombine
++)
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
);
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
);
134 if (aRectTests
[i
].res
[iCombine
-1].iComplexity
== SIMPLEREGION
)
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
]);
146 DeleteObject(hrgnRes
);
150 void Test_CombineRgn_Params()
152 HRGN hrgn1
, hrgn2
, hrgn3
;
154 hrgn1
= CreateRectRgn(0, 0, 0, 0);
155 hrgn2
= CreateRectRgn(0, 0, 10, 10);
156 hrgn3
= CreateRectRgn(5, 5, 20, 20);
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());
166 void Test_CombineRgn_COPY()
168 HRGN hrgn1
, hrgn2
, hrgn3
;
170 hrgn1
= CreateRectRgn(0, 0, 0, 0);
171 hrgn2
= CreateRectRgn(0, 0, 10, 10);
172 hrgn3
= CreateRectRgn(5, 5, 20, 20);
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());
181 ok_long(CombineRgn(hrgn1
, hrgn2
, hrgn3
, RGN_COPY
), SIMPLEREGION
);
182 ok(EqualRgn(hrgn1
, hrgn2
), "Region is not correct\n");
184 ok_long(CombineRgn(hrgn1
, hrgn1
, NULL
, RGN_COPY
), SIMPLEREGION
);
185 ok(EqualRgn(hrgn1
, hrgn2
), "Region is not correct\n");
187 ok_long(CombineRgn(hrgn1
, hrgn3
, GetStockObject(BLACK_PEN
), RGN_COPY
), SIMPLEREGION
);
188 ok(EqualRgn(hrgn1
, hrgn3
), "Region is not correct\n");
190 ok_long(CombineRgn(hrgn1
, GetStockObject(BLACK_PEN
), hrgn2
, RGN_COPY
), ERROR
);
191 ok(EqualRgn(hrgn1
, hrgn3
), "Region is not correct\n");
193 ok_long(CombineRgn(hrgn1
, NULL
, hrgn2
, RGN_COPY
), ERROR
);
194 ok(EqualRgn(hrgn1
, hrgn3
), "Region is not correct\n");
196 ok_long(CombineRgn(hrgn1
, NULL
, NULL
, RGN_COPY
), ERROR
);
197 ok(EqualRgn(hrgn1
, hrgn3
), "Region is not correct\n");
199 ok((GetLastError() == 0xbadbabe) || (GetLastError() == ERROR_INVALID_HANDLE
), "wrong error: %ld\n", GetLastError());
203 void Test_CombineRgn_AND()
205 HRGN hrgn1
, hrgn2
, hrgn3
;
207 hrgn1
= CreateRectRgn(0, 0, 0, 0);
208 hrgn2
= CreateRectRgn(0, 0, 10, 10);
209 hrgn3
= CreateRectRgn(5, 5, 20, 20);
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());
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");
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");
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");
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
);
249 SetRectRgn(hrgn1
, 0, 0, 30, 10);
250 ok_long(CombineRgn(hrgn1
, hrgn1
, hrgn1
, RGN_AND
), SIMPLEREGION
);
254 void Test_CombineRgn_OR()
256 HRGN hrgn1
, hrgn2
, hrgn3
;
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");
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");
278 void Test_CombineRgn_DIFF()
280 HRGN hrgn1
, hrgn2
, hrgn3
;
282 hrgn1
= CreateRectRgn(0, 0, 0, 0);
283 hrgn2
= CreateRectRgn(0, 0, 10, 10);
284 hrgn3
= CreateRectRgn(5, 0, 10, 5);
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());
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
);
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
);
307 void Test_CombineRgn_XOR()
309 HRGN hrgn1
, hrgn2
, hrgn3
, hrgn4
;
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);
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());
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");
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
);
336 START_TEST(CombineRgn
)
338 Test_CombineRgn_Params();
339 Test_CombineRgn_COPY();
340 Test_CombineRgn_AND();
341 Test_CombineRgn_OR();
342 Test_CombineRgn_DIFF();
343 Test_CombineRgn_XOR();