2 * PROJECT: ReactOS api tests
3 * LICENSE: GPL - See COPYING in the top level directory
4 * PURPOSE: Test for MaskBlt
5 * PROGRAMMERS: Timo Kreuzer
12 void Test_MaskBlt_1bpp()
17 BITMAPINFOHEADER bmiHeader
;
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
;
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
);
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
);
35 /* Create a 1 bpp mask bitmap */
36 hbmMsk
= CreateDIBSection(hdcDst
, pbmi
, DIB_RGB_COLORS
, (PVOID
*)&pjBitsMsk
, NULL
, 0);
38 /* Do the masking (SRCCOPY / NOOP) */
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]);
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]);
53 /* Do the masking (NOTSRCERASE / SRCINVERT) */
54 pjBitsDst
[0] = 0xF0; // 11110000
55 pjBitsSrc
[0] = 0xCC; // 11001100
56 pjBitsMsk
[0] = 0xAA; // 10101010
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]);
62 /* Do the masking (MERGEPAINT / DSxn) */
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]);
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]);
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
);
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
);
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
);
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
);
93 /* Try with a mask that is smaller than the rect */
95 pbmi
->bmiHeader
.biWidth
= 4;
96 hbmMsk
= CreateDIBSection(hdcDst
, pbmi
, DIB_RGB_COLORS
, (PVOID
*)&pjBitsMsk
, NULL
, 0);
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]);
114 void Test_MaskBlt_16bpp()
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
;
121 PUSHORT pusBitsDst
, pusBitsSrc
;
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
);
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");
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");
140 pusBitsDst
[0] = 0x1234;
141 pusBitsDst
[1] = 0x5678;
142 pusBitsSrc
[0] = 0x4321;
143 pusBitsSrc
[1] = 0x8765;
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]);
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]);
158 void Test_MaskBlt_32bpp()
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
;
165 PULONG pulBitsDst
, pulBitsSrc
;
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
);
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");
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");
184 pulBitsDst
[0] = 0x12345678;
185 pulBitsDst
[1] = 0x9abcdef0;
186 pulBitsSrc
[0] = 0x87684321;
187 pulBitsSrc
[1] = 0x0fedcba9;
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]);
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]);
202 void Test_MaskBlt_Brush()
207 BITMAPINFOHEADER bmiHeader
;
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
;
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
);
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
);
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");
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]);
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");
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]);
259 Test_MaskBlt_16bpp();
260 Test_MaskBlt_32bpp();
261 Test_MaskBlt_Brush();