[NTFS]
[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
13 void Test_MaskBlt_1bpp()
14 {
15 HDC hdcDst, hdcSrc;
16 struct
17 {
18 BITMAPINFOHEADER bmiHeader;
19 ULONG aulColors[2];
20 } bmiData = {{sizeof(BITMAPINFOHEADER), 8, 1, 1, 1, BI_RGB, 0, 10, 10, 2,0}, {0, 0xFFFFFF}};
21 PBITMAPINFO pbmi = (PBITMAPINFO)&bmiData;
22 HBITMAP hbmDst, hbmSrc, hbmMsk;
23 PUCHAR pjBitsDst, pjBitsSrc, pjBitsMsk;
24 BOOL ret;
25
26 /* Create a dest dc and bitmap */
27 hdcDst = CreateCompatibleDC(NULL);
28 hbmDst = CreateDIBSection(hdcDst, pbmi, DIB_RGB_COLORS, (PVOID*)&pjBitsDst, NULL, 0);
29 SelectObject(hdcDst, hbmDst);
30
31 /* Create a source dc and bitmap */
32 hdcSrc = CreateCompatibleDC(NULL);
33 hbmSrc = CreateDIBSection(hdcSrc, pbmi, DIB_RGB_COLORS, (PVOID*)&pjBitsSrc, NULL, 0);
34 SelectObject(hdcSrc, hbmSrc);
35
36 /* Create a 1 bpp mask bitmap */
37 hbmMsk = CreateDIBSection(hdcDst, pbmi, DIB_RGB_COLORS, (PVOID*)&pjBitsMsk, NULL, 0);
38
39 /* Do the masking (SRCCOPY / NOOP) */
40 pjBitsDst[0] = 0xAA;
41 pjBitsSrc[0] = 0xCC;
42 pjBitsMsk[0] = 0xF0;
43 ret = MaskBlt(hdcDst, 0, 0, 8, 1, hdcSrc, 0, 0, hbmMsk, 0, 0, MAKEROP4(SRCCOPY, 0xAA0000));
44 ok(ret == 1, "MaskBlt failed (%d)\n", ret);
45 ok (pjBitsDst[0] == 0xCA, "pjBitsDst[0] == 0x%x\n", pjBitsDst[0]);
46
47 pjBitsDst[0] = 0x00;
48 pjBitsSrc[0] = 0xFF;
49 pjBitsMsk[0] = 0xF0;
50 ret = MaskBlt(hdcDst, 0, 0, 8, 1, hdcSrc, 0, 0, hbmMsk, 0, 0, MAKEROP4(SRCCOPY, 0xAA0000));
51 ok(ret == 1, "MaskBlt failed (%d)\n", ret);
52 ok (pjBitsDst[0] == 0xF0, "pjBitsDst[0] == 0x%x\n", pjBitsDst[0]);
53
54 /* Do the masking (NOTSRCERASE / SRCINVERT) */
55 pjBitsDst[0] = 0xF0;
56 pjBitsSrc[0] = 0xCC;
57 pjBitsMsk[0] = 0xAA;
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 }
71
72 void Test_MaskBlt_16bpp()
73 {
74 HDC hdcDst, hdcSrc;
75 BITMAPINFO bmi1 = {{sizeof(BITMAPINFOHEADER), 8, 1, 1, 1, BI_RGB, 0, 10, 10, 0,0}};
76 BITMAPINFO bmi32 = {{sizeof(BITMAPINFOHEADER), 8, 1, 1, 16, BI_RGB, 0, 10, 10, 0,0}};
77 HBITMAP hbmDst, hbmSrc, hbmMsk;
78 PUCHAR pjBitsMsk;
79 PUSHORT pusBitsDst, pusBitsSrc;
80 BOOL ret;
81
82 /* Create a dest dc and bitmap */
83 hdcDst = CreateCompatibleDC(NULL);
84 hbmDst = CreateDIBSection(hdcDst, &bmi32, DIB_RGB_COLORS, (PVOID*)&pusBitsDst, NULL, 0);
85 SelectObject(hdcDst, hbmDst);
86
87 /* Create a source dc and bitmap */
88 hdcSrc = CreateCompatibleDC(NULL);
89 hbmSrc = CreateDIBSection(hdcSrc, &bmi32, DIB_RGB_COLORS, (PVOID*)&pusBitsSrc, NULL, 0);
90 SelectObject(hdcSrc, hbmSrc);
91 ok(hdcSrc && hbmSrc, "\n");
92
93 /* Create a 1 bpp mask bitmap */
94 hbmMsk = CreateDIBSection(hdcDst, &bmi1, DIB_RGB_COLORS, (PVOID*)&pjBitsMsk, NULL, 0);
95 ok(hbmMsk != 0, "CreateDIBSection failed\n");
96
97 /* Do the masking */
98 pusBitsDst[0] = 0x1234;
99 pusBitsDst[1] = 0x5678;
100 pusBitsSrc[0] = 0x4321;
101 pusBitsSrc[1] = 0x8765;
102 pjBitsMsk[0] = 0x80;
103 ret = MaskBlt(hdcDst, 0, 0, 8, 1, hdcSrc, 0, 0, hbmMsk, 0, 0, MAKEROP4(SRCCOPY, 0xAA0000));
104 ok(ret == 1, "MaskBlt failed (%d)\n", ret);
105 ok (pusBitsDst[0] == 0x4321, "pusBitsDst[0] == 0x%x\n", pusBitsDst[0]);
106 ok (pusBitsDst[1] == 0x5678, "pusBitsDst[0] == 0x%x\n", pusBitsDst[1]);
107
108 pusBitsDst[0] = 0x1234;
109 pusBitsDst[1] = 0x5678;
110 ret = MaskBlt(hdcDst, 0, 0, 8, 1, hdcSrc, 0, 0, hbmMsk, 0, 0, MAKEROP4(SRCPAINT, MERGEPAINT));
111 ok(ret == 1, "MaskBlt failed (%d)\n", ret);
112 ok (pusBitsDst[0] == 0x5335, "pusBitsDst[0] == 0x%x\n", pusBitsDst[0]);
113 ok (pusBitsDst[1] == 0x7efa, "pusBitsDst[0] == 0x%x\n", pusBitsDst[1]);
114 }
115
116 void Test_MaskBlt_32bpp()
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, 32, BI_RGB, 0, 10, 10, 0,0}};
121 HBITMAP hbmDst, hbmSrc, hbmMsk;
122 PUCHAR pjBitsMsk;
123 PULONG pulBitsDst, pulBitsSrc;
124 BOOL ret;
125
126 /* Create a dest dc and bitmap */
127 hdcDst = CreateCompatibleDC(NULL);
128 hbmDst = CreateDIBSection(hdcDst, &bmi32, DIB_RGB_COLORS, (PVOID*)&pulBitsDst, 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*)&pulBitsSrc, 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 pulBitsDst[0] = 0x12345678;
143 pulBitsDst[1] = 0x9abcdef0;
144 pulBitsSrc[0] = 0x87684321;
145 pulBitsSrc[1] = 0x0fedcba9;
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 (pulBitsDst[0] == 0x87684321, "pulBitsDst[0] == 0x%lx\n", pulBitsDst[0]);
150 ok (pulBitsDst[1] == 0x9abcdef0, "pulBitsDst[0] == 0x%lx\n", pulBitsDst[1]);
151
152 pulBitsDst[0] = 0x12345678;
153 pulBitsDst[1] = 0x9abcdef0;
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 (pulBitsDst[0] == 0x977c5779, "pulBitsDst[0] == 0x%lx\n", pulBitsDst[0]);
157 ok (pulBitsDst[1] == 0xfabefef6, "pulBitsDst[0] == 0x%lx\n", pulBitsDst[1]);
158 }
159
160 START_TEST(MaskBlt)
161 {
162 Test_MaskBlt_1bpp();
163 switch (GetDeviceCaps(GetDC(NULL), BITSPIXEL))
164 {
165 case 16: Test_MaskBlt_16bpp(); break;
166 case 32: Test_MaskBlt_32bpp(); break;
167 }
168
169 }
170