[GDI32_APITEST] Add GetTextMetrics tests to gdi32_apitest (#307)
[reactos.git] / modules / rostests / apitests / gdi32 / MaskBlt.c
1 /*
2 * PROJECT: ReactOS api tests
3 * LICENSE: GPL - See COPYING in the top level directory
4 * PURPOSE: Test for MaskBlt
5 * PROGRAMMERS: Timo Kreuzer
6 */
7
8 #include "precomp.h"
9
10 #include "init.h"
11
12 void Test_MaskBlt_1bpp()
13 {
14 HDC hdcDst, hdcSrc;
15 struct
16 {
17 BITMAPINFOHEADER bmiHeader;
18 ULONG aulColors[2];
19 } bmiData = {{sizeof(BITMAPINFOHEADER), 8, 1, 1, 1, BI_RGB, 0, 10, 10, 2,0}, {0, 0xFFFFFF}};
20 PBITMAPINFO pbmi = (PBITMAPINFO)&bmiData;
21 HBITMAP hbmDst, hbmSrc, hbmMsk;
22 PUCHAR pjBitsDst, pjBitsSrc, pjBitsMsk;
23 BOOL ret;
24
25 /* Create a dest dc and bitmap */
26 hdcDst = CreateCompatibleDC(NULL);
27 hbmDst = CreateDIBSection(hdcDst, pbmi, DIB_RGB_COLORS, (PVOID*)&pjBitsDst, NULL, 0);
28 SelectObject(hdcDst, hbmDst);
29
30 /* Create a source dc and bitmap */
31 hdcSrc = CreateCompatibleDC(NULL);
32 hbmSrc = CreateDIBSection(hdcSrc, pbmi, DIB_RGB_COLORS, (PVOID*)&pjBitsSrc, NULL, 0);
33 SelectObject(hdcSrc, hbmSrc);
34
35 /* Create a 1 bpp mask bitmap */
36 hbmMsk = CreateDIBSection(hdcDst, pbmi, DIB_RGB_COLORS, (PVOID*)&pjBitsMsk, NULL, 0);
37
38 /* Do the masking (SRCCOPY / NOOP) */
39 pjBitsDst[0] = 0xAA;
40 pjBitsSrc[0] = 0xCC;
41 pjBitsMsk[0] = 0xF0;
42 ret = MaskBlt(hdcDst, 0, 0, 8, 1, hdcSrc, 0, 0, hbmMsk, 0, 0, MAKEROP4(SRCCOPY, 0xAA0000));
43 ok(ret == 1, "MaskBlt failed (%d)\n", ret);
44 ok(pjBitsDst[0] == 0xCA, "pjBitsDst[0] == 0x%x\n", pjBitsDst[0]);
45
46 pjBitsDst[0] = 0x00;
47 pjBitsSrc[0] = 0xFF;
48 pjBitsMsk[0] = 0xF0;
49 ret = MaskBlt(hdcDst, 0, 0, 8, 1, hdcSrc, 0, 0, hbmMsk, 0, 0, MAKEROP4(SRCCOPY, 0xAA0000));
50 ok(ret == 1, "MaskBlt failed (%d)\n", ret);
51 ok(pjBitsDst[0] == 0xF0, "pjBitsDst[0] == 0x%x\n", pjBitsDst[0]);
52
53 /* Do the masking (NOTSRCERASE / SRCINVERT) */
54 pjBitsDst[0] = 0xF0; // 11110000
55 pjBitsSrc[0] = 0xCC; // 11001100
56 pjBitsMsk[0] = 0xAA; // 10101010
57
58 ret = MaskBlt(hdcDst, 0, 0, 8, 1, hdcSrc, 0, 0, hbmMsk, 0, 0, MAKEROP4(NOTSRCERASE, SRCINVERT)); // 22
59 ok(ret == 1, "MaskBlt failed (%d)\n", ret);
60 ok(pjBitsDst[0] == 0x16, "pjBitsDst[0] == 0x%x\n", pjBitsDst[0]);
61
62 /* Do the masking (MERGEPAINT / DSxn) */
63 pjBitsDst[0] = 0xF0;
64 pjBitsSrc[0] = 0xCC;
65 pjBitsMsk[0] = 0xAA;
66 ret = MaskBlt(hdcDst, 0, 0, 8, 1, hdcSrc, 0, 0, hbmMsk, 0, 0, MAKEROP4(MERGEPAINT, 0x990000));
67 ok(ret == 1, "MaskBlt failed (%d)\n", ret);
68 ok(pjBitsDst[0] == 0xE3, "pjBitsDst[0] == 0x%x\n", pjBitsDst[0]);
69
70 /* Try a ROP that needs a mask with a NULL mask bitmap handle */
71 ret = MaskBlt(hdcDst, 0, 0, 8, 1, hdcSrc, 0, 0, NULL, 0, 0, MAKEROP4(SRCCOPY, 0xAA0000));
72 ok(ret == 1, "MaskBlt failed (%d)\n", ret);
73 ok(pjBitsDst[0] == 0xCC, "pjBitsDst[0] == 0x%x\n", pjBitsDst[0]);
74
75 /* Try a ROP that needs a mask with an invalid mask bitmap handle */
76 ret = MaskBlt(hdcDst, 0, 0, 8, 1, hdcSrc, 0, 0, (HBITMAP)0x123456, 0, 0, MAKEROP4(SRCCOPY, 0xAA0000));
77 ok(ret == 0, "MaskBlt should fail, but succeeded (%d)\n", ret);
78
79 /* Try a ROP that needs a mask with an invalid mask bitmap */
80 ok(ghbmp24 != NULL, "ghbmp24 is NULL!\n");
81 ret = MaskBlt(hdcDst, 0, 0, 8, 1, hdcSrc, 0, 0, ghbmp24, 0, 0, MAKEROP4(SRCCOPY, 0xAA0000));
82 ok(ret == 0, "MaskBlt should fail, but succeeded (%d)\n", ret);
83
84 /* Try a ROP that needs no mask with an invalid mask bitmap */
85 ret = MaskBlt(hdcDst, 0, 0, 8, 1, hdcSrc, 0, 0, (HBITMAP)0x123456, 0, 0, MAKEROP4(SRCCOPY, SRCCOPY));
86 ok(ret == 1, "MaskBlt failed (%d)\n", ret);
87
88 /* Try (PATCOPY / NOOP) with a NULL source mask and bitmap */
89 ret = MaskBlt(hdcDst, 0, 0, 8, 1, NULL, 0, 0, NULL, 0, 0, MAKEROP4(PATCOPY, 0xAA0000));
90 ok(ret == 0, "MaskBlt should fail, but succeeded (%d)\n", ret);
91
92
93 /* Try with a mask that is smaller than the rect */
94 DeleteObject(hbmMsk);
95 pbmi->bmiHeader.biWidth = 4;
96 hbmMsk = CreateDIBSection(hdcDst, pbmi, DIB_RGB_COLORS, (PVOID*)&pjBitsMsk, NULL, 0);
97
98 /* Do the masking (SRCCOPY / NOOP) */
99 pjBitsDst[0] = 0xAA; // 10101010
100 pjBitsSrc[0] = 0xCC; // 11001100
101 pjBitsMsk[0] = 0x33; // 00110011
102 ret = MaskBlt(hdcDst, 0, 0, 5, 1, hdcSrc, 0, 0, hbmMsk, 0, 0, MAKEROP4(SRCCOPY, 0xAA0000));
103 ok(ret == 0, "MaskBlt should fail, but succeeded (%d)\n", ret);
104 ret = MaskBlt(hdcDst, 0, 0, 4, 1, hdcSrc, 0, 0, hbmMsk, 1, 0, MAKEROP4(SRCCOPY, 0xAA0000));
105 ok(ret == 0, "MaskBlt should fail, but succeeded (%d)\n", ret);
106 ret = MaskBlt(hdcDst, 0, 0, 4, 1, hdcSrc, 0, 0, hbmMsk, 0, 1, MAKEROP4(SRCCOPY, 0xAA0000));
107 ok(ret == 0, "MaskBlt should fail, but succeeded (%d)\n", ret);
108 ret = MaskBlt(hdcDst, 0, 0, 4, 1, hdcSrc, 0, 0, hbmMsk, 0, 0, MAKEROP4(SRCCOPY, 0xAA0000));
109 ok(ret == 1, "MaskBlt failed (%d)\n", ret);
110 ok(pjBitsDst[0] == 0x8A, "pjBitsDst[0] == 0x%x\n", pjBitsDst[0]);
111
112 }
113
114 void Test_MaskBlt_16bpp()
115 {
116 HDC hdcDst, hdcSrc;
117 BITMAPINFO bmi1 = {{sizeof(BITMAPINFOHEADER), 8, 1, 1, 1, BI_RGB, 0, 10, 10, 0,0}};
118 BITMAPINFO bmi32 = {{sizeof(BITMAPINFOHEADER), 8, 1, 1, 16, BI_RGB, 0, 10, 10, 0,0}};
119 HBITMAP hbmDst, hbmSrc, hbmMsk;
120 PUCHAR pjBitsMsk;
121 PUSHORT pusBitsDst, pusBitsSrc;
122 BOOL ret;
123
124 /* Create a dest dc and bitmap */
125 hdcDst = CreateCompatibleDC(NULL);
126 hbmDst = CreateDIBSection(hdcDst, &bmi32, DIB_RGB_COLORS, (PVOID*)&pusBitsDst, NULL, 0);
127 SelectObject(hdcDst, hbmDst);
128
129 /* Create a source dc and bitmap */
130 hdcSrc = CreateCompatibleDC(NULL);
131 hbmSrc = CreateDIBSection(hdcSrc, &bmi32, DIB_RGB_COLORS, (PVOID*)&pusBitsSrc, NULL, 0);
132 SelectObject(hdcSrc, hbmSrc);
133 ok(hdcSrc && hbmSrc, "\n");
134
135 /* Create a 1 bpp mask bitmap */
136 hbmMsk = CreateDIBSection(hdcDst, &bmi1, DIB_RGB_COLORS, (PVOID*)&pjBitsMsk, NULL, 0);
137 ok(hbmMsk != 0, "CreateDIBSection failed\n");
138
139 /* Do the masking */
140 pusBitsDst[0] = 0x1234;
141 pusBitsDst[1] = 0x5678;
142 pusBitsSrc[0] = 0x4321;
143 pusBitsSrc[1] = 0x8765;
144 pjBitsMsk[0] = 0x80;
145 ret = MaskBlt(hdcDst, 0, 0, 8, 1, hdcSrc, 0, 0, hbmMsk, 0, 0, MAKEROP4(SRCCOPY, 0xAA0000));
146 ok(ret == 1, "MaskBlt failed (%d)\n", ret);
147 ok (pusBitsDst[0] == 0x4321, "pusBitsDst[0] == 0x%x\n", pusBitsDst[0]);
148 ok (pusBitsDst[1] == 0x5678, "pusBitsDst[0] == 0x%x\n", pusBitsDst[1]);
149
150 pusBitsDst[0] = 0x1234;
151 pusBitsDst[1] = 0x5678;
152 ret = MaskBlt(hdcDst, 0, 0, 8, 1, hdcSrc, 0, 0, hbmMsk, 0, 0, MAKEROP4(SRCPAINT, MERGEPAINT));
153 ok(ret == 1, "MaskBlt failed (%d)\n", ret);
154 ok (pusBitsDst[0] == 0x5335, "pusBitsDst[0] == 0x%x\n", pusBitsDst[0]);
155 ok (pusBitsDst[1] == 0x7efa, "pusBitsDst[0] == 0x%x\n", pusBitsDst[1]);
156 }
157
158 void Test_MaskBlt_32bpp()
159 {
160 HDC hdcDst, hdcSrc;
161 BITMAPINFO bmi1 = {{sizeof(BITMAPINFOHEADER), 8, 1, 1, 1, BI_RGB, 0, 10, 10, 0,0}};
162 BITMAPINFO bmi32 = {{sizeof(BITMAPINFOHEADER), 8, 1, 1, 32, BI_RGB, 0, 10, 10, 0,0}};
163 HBITMAP hbmDst, hbmSrc, hbmMsk;
164 PUCHAR pjBitsMsk;
165 PULONG pulBitsDst, pulBitsSrc;
166 BOOL ret;
167
168 /* Create a dest dc and bitmap */
169 hdcDst = CreateCompatibleDC(NULL);
170 hbmDst = CreateDIBSection(hdcDst, &bmi32, DIB_RGB_COLORS, (PVOID*)&pulBitsDst, NULL, 0);
171 SelectObject(hdcDst, hbmDst);
172
173 /* Create a source dc and bitmap */
174 hdcSrc = CreateCompatibleDC(NULL);
175 hbmSrc = CreateDIBSection(hdcSrc, &bmi32, DIB_RGB_COLORS, (PVOID*)&pulBitsSrc, NULL, 0);
176 SelectObject(hdcSrc, hbmSrc);
177 ok(hdcSrc && hbmSrc, "\n");
178
179 /* Create a 1 bpp mask bitmap */
180 hbmMsk = CreateDIBSection(hdcDst, &bmi1, DIB_RGB_COLORS, (PVOID*)&pjBitsMsk, NULL, 0);
181 ok(hbmMsk != 0, "CreateDIBSection failed\n");
182
183 /* Do the masking */
184 pulBitsDst[0] = 0x12345678;
185 pulBitsDst[1] = 0x9abcdef0;
186 pulBitsSrc[0] = 0x87684321;
187 pulBitsSrc[1] = 0x0fedcba9;
188 pjBitsMsk[0] = 0x80;
189 ret = MaskBlt(hdcDst, 0, 0, 8, 1, hdcSrc, 0, 0, hbmMsk, 0, 0, MAKEROP4(SRCCOPY, 0xAA0000));
190 ok(ret == 1, "MaskBlt failed (%d)\n", ret);
191 ok (pulBitsDst[0] == 0x87684321, "pulBitsDst[0] == 0x%lx\n", pulBitsDst[0]);
192 ok (pulBitsDst[1] == 0x9abcdef0, "pulBitsDst[0] == 0x%lx\n", pulBitsDst[1]);
193
194 pulBitsDst[0] = 0x12345678;
195 pulBitsDst[1] = 0x9abcdef0;
196 ret = MaskBlt(hdcDst, 0, 0, 8, 1, hdcSrc, 0, 0, hbmMsk, 0, 0, MAKEROP4(SRCPAINT, MERGEPAINT));
197 ok(ret == 1, "MaskBlt failed (%d)\n", ret);
198 ok (pulBitsDst[0] == 0x977c5779, "pulBitsDst[0] == 0x%lx\n", pulBitsDst[0]);
199 ok (pulBitsDst[1] == 0xfabefef6, "pulBitsDst[0] == 0x%lx\n", pulBitsDst[1]);
200 }
201
202 void Test_MaskBlt_Brush()
203 {
204 HDC hdcDst, hdcSrc;
205 struct
206 {
207 BITMAPINFOHEADER bmiHeader;
208 ULONG aulColors[2];
209 } bmiData = {{sizeof(BITMAPINFOHEADER), 16, 16, 1, 1, BI_RGB, 0, 10, 10, 2,0}, {0, 0xFFFFFF}};
210 PBITMAPINFO pbmi = (PBITMAPINFO)&bmiData;
211 HBITMAP hbmDst, hbmSrc, hbmMsk;
212 PULONG pulBitsDst, pulBitsSrc, pulBitsMsk;
213 BOOL ret;
214 HBRUSH hbr;
215
216 /* Create a dest dc and bitmap */
217 hdcDst = CreateCompatibleDC(NULL);
218 hbmDst = CreateDIBSection(hdcDst, pbmi, DIB_RGB_COLORS, (PVOID*)&pulBitsDst, NULL, 0);
219 SelectObject(hdcDst, hbmDst);
220
221 /* Create a source dc and bitmap */
222 hdcSrc = CreateCompatibleDC(NULL);
223 hbmSrc = CreateDIBSection(hdcSrc, pbmi, DIB_RGB_COLORS, (PVOID*)&pulBitsSrc, NULL, 0);
224 SelectObject(hdcSrc, hbmSrc);
225
226 hbr = CreateHatchBrush(HS_CROSS, 0);
227 ok(hbr != 0, "failed to create brush\n");
228 ok(SelectObject(hdcDst, hbr) != 0, "failed to select brush\n");
229
230 /* Do the masking (SRCCOPY / NOOP) */
231 pulBitsDst[0] = 0x00000000;
232 pulBitsSrc[0] = 0xFFFFFFFF;
233 ret = MaskBlt(hdcDst, 0, 0, 8, 1, hdcSrc, 0, 0, NULL, 0, 0, MAKEROP4(SRCCOPY, 0xAA0000));
234 ok(ret == 1, "MaskBlt failed (%d)\n", ret);
235 ok(pulBitsDst[0] == 0, "pulBitsDst[0] == 0x%lx\n", pulBitsDst[0]);
236
237 /* Create a 1 bpp pattern brush */
238 pbmi->bmiHeader.biWidth = 8;
239 hbmMsk = CreateDIBSection(hdcDst, pbmi, DIB_RGB_COLORS, (PVOID*)&pulBitsMsk, NULL, 0);
240 ok(hbmMsk != 0, "CreateDIBSection failed\n");
241 hbr = CreatePatternBrush(hbmMsk);
242 ok(hbr != 0, "CreatePatternBrush failed\n");
243 ok(SelectObject(hdcDst, hbr) != 0, "failed to select brush\n");
244
245 /* Do the masking (SRCCOPY / NOOP) */
246 pulBitsDst[0] = 0x00000000;
247 pulBitsSrc[0] = 0xFFFFFFFF;
248 pulBitsMsk[0] = 0xCCAAFF00;
249 ret = MaskBlt(hdcDst, 0, 0, 16, 1, hdcSrc, 0, 0, NULL, 0, 0, MAKEROP4(SRCCOPY, 0xAA0000));
250 ok(ret == 1, "MaskBlt failed (%d)\n", ret);
251 ok(pulBitsDst[0] == 0, "pulBitsDst[0] == 0x%lx\n", pulBitsDst[0]);
252
253 }
254
255 START_TEST(MaskBlt)
256 {
257 InitStuff();
258 Test_MaskBlt_1bpp();
259 Test_MaskBlt_16bpp();
260 Test_MaskBlt_32bpp();
261 Test_MaskBlt_Brush();
262
263 }
264