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