* Addendum to r58214.
[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 <wine/test.h>
9 #include <wingdi.h>
10 #include <winuser.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;
55 pjBitsSrc[0] = 0xCC;
56 pjBitsMsk[0] = 0xAA;
57 ret = MaskBlt(hdcDst, 0, 0, 8, 1, hdcSrc, 0, 0, hbmMsk, 0, 0, MAKEROP4(NOTSRCERASE, SRCINVERT)); // 22
58 ok(ret == 1, "MaskBlt failed (%d)\n", ret);
59 ok (pjBitsDst[0] == 0x16, "pjBitsDst[0] == 0x%x\n", pjBitsDst[0]);
60
61 /* Do the masking (MERGEPAINT / DSxn) */
62 pjBitsDst[0] = 0xF0;
63 pjBitsSrc[0] = 0xCC;
64 pjBitsMsk[0] = 0xAA;
65 ret = MaskBlt(hdcDst, 0, 0, 8, 1, hdcSrc, 0, 0, hbmMsk, 0, 0, MAKEROP4(MERGEPAINT, 0x990000));
66 ok(ret == 1, "MaskBlt failed (%d)\n", ret);
67 ok (pjBitsDst[0] == 0xE3, "pjBitsDst[0] == 0x%x\n", pjBitsDst[0]);
68
69 }
70
71 void Test_MaskBlt_16bpp()
72 {
73 HDC hdcDst, hdcSrc;
74 BITMAPINFO bmi1 = {{sizeof(BITMAPINFOHEADER), 8, 1, 1, 1, BI_RGB, 0, 10, 10, 0,0}};
75 BITMAPINFO bmi32 = {{sizeof(BITMAPINFOHEADER), 8, 1, 1, 16, BI_RGB, 0, 10, 10, 0,0}};
76 HBITMAP hbmDst, hbmSrc, hbmMsk;
77 PUCHAR pjBitsMsk;
78 PUSHORT pusBitsDst, pusBitsSrc;
79 BOOL ret;
80
81 /* Create a dest dc and bitmap */
82 hdcDst = CreateCompatibleDC(NULL);
83 hbmDst = CreateDIBSection(hdcDst, &bmi32, DIB_RGB_COLORS, (PVOID*)&pusBitsDst, NULL, 0);
84 SelectObject(hdcDst, hbmDst);
85
86 /* Create a source dc and bitmap */
87 hdcSrc = CreateCompatibleDC(NULL);
88 hbmSrc = CreateDIBSection(hdcSrc, &bmi32, DIB_RGB_COLORS, (PVOID*)&pusBitsSrc, NULL, 0);
89 SelectObject(hdcSrc, hbmSrc);
90 ok(hdcSrc && hbmSrc, "\n");
91
92 /* Create a 1 bpp mask bitmap */
93 hbmMsk = CreateDIBSection(hdcDst, &bmi1, DIB_RGB_COLORS, (PVOID*)&pjBitsMsk, NULL, 0);
94 ok(hbmMsk != 0, "CreateDIBSection failed\n");
95
96 /* Do the masking */
97 pusBitsDst[0] = 0x1234;
98 pusBitsDst[1] = 0x5678;
99 pusBitsSrc[0] = 0x4321;
100 pusBitsSrc[1] = 0x8765;
101 pjBitsMsk[0] = 0x80;
102 ret = MaskBlt(hdcDst, 0, 0, 8, 1, hdcSrc, 0, 0, hbmMsk, 0, 0, MAKEROP4(SRCCOPY, 0xAA0000));
103 ok(ret == 1, "MaskBlt failed (%d)\n", ret);
104 ok (pusBitsDst[0] == 0x4321, "pusBitsDst[0] == 0x%x\n", pusBitsDst[0]);
105 ok (pusBitsDst[1] == 0x5678, "pusBitsDst[0] == 0x%x\n", pusBitsDst[1]);
106
107 pusBitsDst[0] = 0x1234;
108 pusBitsDst[1] = 0x5678;
109 ret = MaskBlt(hdcDst, 0, 0, 8, 1, hdcSrc, 0, 0, hbmMsk, 0, 0, MAKEROP4(SRCPAINT, MERGEPAINT));
110 ok(ret == 1, "MaskBlt failed (%d)\n", ret);
111 ok (pusBitsDst[0] == 0x5335, "pusBitsDst[0] == 0x%x\n", pusBitsDst[0]);
112 ok (pusBitsDst[1] == 0x7efa, "pusBitsDst[0] == 0x%x\n", pusBitsDst[1]);
113 }
114
115 void Test_MaskBlt_32bpp()
116 {
117 HDC hdcDst, hdcSrc;
118 BITMAPINFO bmi1 = {{sizeof(BITMAPINFOHEADER), 8, 1, 1, 1, BI_RGB, 0, 10, 10, 0,0}};
119 BITMAPINFO bmi32 = {{sizeof(BITMAPINFOHEADER), 8, 1, 1, 32, BI_RGB, 0, 10, 10, 0,0}};
120 HBITMAP hbmDst, hbmSrc, hbmMsk;
121 PUCHAR pjBitsMsk;
122 PULONG pulBitsDst, pulBitsSrc;
123 BOOL ret;
124
125 /* Create a dest dc and bitmap */
126 hdcDst = CreateCompatibleDC(NULL);
127 hbmDst = CreateDIBSection(hdcDst, &bmi32, DIB_RGB_COLORS, (PVOID*)&pulBitsDst, NULL, 0);
128 SelectObject(hdcDst, hbmDst);
129
130 /* Create a source dc and bitmap */
131 hdcSrc = CreateCompatibleDC(NULL);
132 hbmSrc = CreateDIBSection(hdcSrc, &bmi32, DIB_RGB_COLORS, (PVOID*)&pulBitsSrc, NULL, 0);
133 SelectObject(hdcSrc, hbmSrc);
134 ok(hdcSrc && hbmSrc, "\n");
135
136 /* Create a 1 bpp mask bitmap */
137 hbmMsk = CreateDIBSection(hdcDst, &bmi1, DIB_RGB_COLORS, (PVOID*)&pjBitsMsk, NULL, 0);
138 ok(hbmMsk != 0, "CreateDIBSection failed\n");
139
140 /* Do the masking */
141 pulBitsDst[0] = 0x12345678;
142 pulBitsDst[1] = 0x9abcdef0;
143 pulBitsSrc[0] = 0x87684321;
144 pulBitsSrc[1] = 0x0fedcba9;
145 pjBitsMsk[0] = 0x80;
146 ret = MaskBlt(hdcDst, 0, 0, 8, 1, hdcSrc, 0, 0, hbmMsk, 0, 0, MAKEROP4(SRCCOPY, 0xAA0000));
147 ok(ret == 1, "MaskBlt failed (%d)\n", ret);
148 ok (pulBitsDst[0] == 0x87684321, "pulBitsDst[0] == 0x%lx\n", pulBitsDst[0]);
149 ok (pulBitsDst[1] == 0x9abcdef0, "pulBitsDst[0] == 0x%lx\n", pulBitsDst[1]);
150
151 pulBitsDst[0] = 0x12345678;
152 pulBitsDst[1] = 0x9abcdef0;
153 ret = MaskBlt(hdcDst, 0, 0, 8, 1, hdcSrc, 0, 0, hbmMsk, 0, 0, MAKEROP4(SRCPAINT, MERGEPAINT));
154 ok(ret == 1, "MaskBlt failed (%d)\n", ret);
155 ok (pulBitsDst[0] == 0x977c5779, "pulBitsDst[0] == 0x%lx\n", pulBitsDst[0]);
156 ok (pulBitsDst[1] == 0xfabefef6, "pulBitsDst[0] == 0x%lx\n", pulBitsDst[1]);
157 }
158
159 START_TEST(MaskBlt)
160 {
161 Test_MaskBlt_1bpp();
162 switch (GetDeviceCaps(GetDC(NULL), BITSPIXEL))
163 {
164 case 16: Test_MaskBlt_16bpp(); break;
165 case 32: Test_MaskBlt_32bpp(); break;
166 }
167
168 }
169