2 * PROJECT: ReactOS api tests
3 * LICENSE: GPL - See COPYING in the top level directory
4 * PURPOSE: Test for GetDIBits
5 * PROGRAMMERS: Timo Kreuzer
19 UCHAR ajBuffer
[sizeof(BITMAPINFOHEADER
) + 256 * sizeof(RGBQUAD
)];
20 PBITMAPINFO pbmi
= (PBITMAPINFO
)ajBuffer
;
22 ULONG cjSizeImage
, cColors
;
26 hbmp
= CreateBitmap(3, 3, 1, cBitsPixel
, NULL
);
28 /* Fill in the size field */
29 ZeroMemory(pbmi
, sizeof(ajBuffer
));
30 pbmi
->bmiHeader
.biSize
= sizeof(BITMAPINFOHEADER
);
33 ok_int(GetDIBits(hdc
, hbmp
, 0, 0, NULL
, pbmi
, DIB_RGB_COLORS
), 1);
34 cjSizeImage
= (((pbmi
->bmiHeader
.biWidth
* pbmi
->bmiHeader
.biBitCount
) + 31) & ~31) * pbmi
->bmiHeader
.biHeight
/ 8;
35 cColors
= cBitsPixel
<= 8 ? 1 << pbmi
->bmiHeader
.biBitCount
: 0;
37 ok_int(pbmi
->bmiHeader
.biSize
, sizeof(BITMAPINFOHEADER
));
38 ok_int(pbmi
->bmiHeader
.biWidth
, 3);
39 ok_int(pbmi
->bmiHeader
.biHeight
, 3);
40 ok_int(pbmi
->bmiHeader
.biPlanes
, 1);
41 ok_int(pbmi
->bmiHeader
.biBitCount
, cBitsPixel
);
42 ok_int(pbmi
->bmiHeader
.biCompression
, (cBitsPixel
== 16) || (cBitsPixel
== 32) ? BI_BITFIELDS
: BI_RGB
);
43 ok_int(pbmi
->bmiHeader
.biSizeImage
, cjSizeImage
);
44 ok_int(pbmi
->bmiHeader
.biXPelsPerMeter
, 0);
45 ok_int(pbmi
->bmiHeader
.biYPelsPerMeter
, 0);
46 ok_int(pbmi
->bmiHeader
.biClrUsed
, cColors
);
47 ok_int(pbmi
->bmiHeader
.biClrImportant
, cColors
);
49 // pbmi->bmiHeader.biSizeImage = 0;
50 //ok_int(GetDIBits(NULL, hbmp, 0, 0, NULL, pbmi, DIB_RGB_COLORS), 1);
52 /* Test a bitmap with values partly set */
53 ZeroMemory(pbmi
, sizeof(BITMAPINFO
));
54 pbmi
->bmiHeader
.biSize
= sizeof(BITMAPINFOHEADER
);
55 pbmi
->bmiHeader
.biWidth
= 12;
56 pbmi
->bmiHeader
.biHeight
= 14;
57 pbmi
->bmiHeader
.biPlanes
= 2;
58 pbmi
->bmiHeader
.biBitCount
= 0; // keep biBitCount == 0!
59 pbmi
->bmiHeader
.biCompression
= 7;
60 pbmi
->bmiHeader
.biSizeImage
= 123;
61 ok_int(GetDIBits(hdc
, hbmp
, 0, 5, NULL
, pbmi
, DIB_RGB_COLORS
), 1);
62 ok_int(pbmi
->bmiHeader
.biWidth
, 3);
63 ok_int(pbmi
->bmiHeader
.biHeight
, 3);
64 ok_int(pbmi
->bmiHeader
.biPlanes
, 1);
65 ok_int(pbmi
->bmiHeader
.biBitCount
, cBitsPixel
);
66 ok_int(pbmi
->bmiHeader
.biSizeImage
, cjSizeImage
);
67 ok_int(pbmi
->bmiHeader
.biXPelsPerMeter
, 0);
68 ok_int(pbmi
->bmiHeader
.biYPelsPerMeter
, 0);
69 ok_int(pbmi
->bmiHeader
.biClrUsed
, cColors
);
70 ok_int(pbmi
->bmiHeader
.biClrImportant
, cColors
);
74 /* Get info including the color table */
75 ZeroMemory(pbmi
, sizeof(ajBuffer
));
76 pbmi
->bmiHeader
.biSize
= sizeof(BITMAPINFOHEADER
);
77 pbmi
->bmiHeader
.biBitCount
= 1;
78 ok_int(GetDIBits(NULL
, hbmp
, 0, 0, NULL
, pbmi
, DIB_PAL_COLORS
), 1);
80 /* Check a different bit depth */
81 pbmi
->bmiHeader
.biBitCount
, cBitsPixel
= (cBitsPixel
== 1) ? 8 : 1;
82 ok_int(GetDIBits(hdc
, hbmp
, 0, 0, NULL
, pbmi
, DIB_RGB_COLORS
), 1);
83 ok_int(pbmi
->bmiHeader
.biBitCount
, (cBitsPixel
== 1) ? 8 : 1);
87 ok_int(GetDIBits(hdc
, hbmp
, 0, 4, pvBits
, pbmi
, DIB_PAL_COLORS
), 3);
88 ok_int(GetDIBits(hdc
, hbmp
, 3, 7, pvBits
, pbmi
, DIB_RGB_COLORS
), 1);
91 pbmi
->bmiHeader
.biPlanes
= 2;
92 pbmi
->bmiHeader
.biClrUsed
= 0;
93 ok_int(GetDIBits(hdc
, hbmp
, 0, 4, pvBits
, pbmi
, DIB_RGB_COLORS
), 3);
100 void Test_GetDIBits()
102 HDC hdcScreen
, hdcMem
;
105 PBITMAPCOREHEADER pbch
;
106 PBITMAPV5HEADER pbV5Header
;
108 DWORD ajBits
[100] = {0xff, 0x00, 0xcc, 0xf0, 0x0f};
112 pbi
= malloc(sizeof(BITMAPV5HEADER
) + 256 * sizeof(DWORD
));
114 pbV5Header
= (PVOID
)pbi
;
116 hdcScreen
= GetDC(NULL
);
117 ok(hdcScreen
!= 0, "GetDC failed, skipping tests\n");
118 if (hdcScreen
== NULL
) return;
120 hdcMem
= CreateCompatibleDC(0);
121 ok(hdcMem
!= 0, "CreateCompatibleDC failed, skipping tests\n");
122 if (hdcMem
== NULL
) return;
124 hbmp
= CreateCompatibleBitmap(hdcScreen
, 16, 16);
125 ok(hbmp
!= NULL
, "CreateCompatibleBitmap failed\n");
128 SetLastError(ERROR_SUCCESS
);
129 ok(GetDIBits(0, 0, 0, 0, NULL
, NULL
, 0) == 0, "\n");
130 ok_err(ERROR_INVALID_PARAMETER
);
132 SetLastError(ERROR_SUCCESS
);
133 ok(GetDIBits((HDC
)2345, 0, 0, 0, NULL
, NULL
, 0) == 0, "\n");
134 ok_err(ERROR_INVALID_PARAMETER
);
136 SetLastError(ERROR_SUCCESS
);
137 ok(GetDIBits((HDC
)2345, hbmp
, 0, 0, NULL
, NULL
, 0) == 0, "\n");
138 ok_err(ERROR_INVALID_PARAMETER
);
140 SetLastError(ERROR_SUCCESS
);
141 ok(GetDIBits((HDC
)2345, hbmp
, 0, 15, NULL
, pbi
, 0) == 0, "\n");
142 ok_err(ERROR_INVALID_PARAMETER
);
147 SetLastError(ERROR_SUCCESS
);
148 ZeroMemory(pbi
, sizeof(BITMAPINFO
));
149 pbi
->bmiHeader
.biSize
= sizeof(BITMAPINFOHEADER
);
150 ok(GetDIBits(NULL
, hbmp
, 0, 15, NULL
, pbi
, DIB_RGB_COLORS
) == 0, "\n");
151 ok_err(ERROR_INVALID_PARAMETER
);
154 SetLastError(ERROR_SUCCESS
);
155 ZeroMemory(pbi
, sizeof(BITMAPINFO
));
156 pbi
->bmiHeader
.biSize
= sizeof(BITMAPINFOHEADER
);
157 ok(GetDIBits(hdcScreen
, NULL
, 0, 15, NULL
, pbi
, DIB_RGB_COLORS
) == 0, "\n");
158 ok_err(ERROR_SUCCESS
);
161 SetLastError(ERROR_SUCCESS
);
162 ZeroMemory(pbi
, sizeof(BITMAPINFO
));
163 pbi
->bmiHeader
.biSize
= sizeof(BITMAPINFOHEADER
);
164 ok(GetDIBits(hdcScreen
, hbmp
, 0, 0, NULL
, pbi
, DIB_RGB_COLORS
) > 0, "\n");
165 ok_err(ERROR_SUCCESS
);
167 /* null bitmap info - crashes XP*/
168 //SetLastError(ERROR_SUCCESS);
169 //ok(GetDIBits(hdcScreen, NULL, 0, 15, NULL, NULL, DIB_RGB_COLORS) == 0);
170 //ok(GetLastError() == ERROR_INVALID_PARAMETER);
172 /* bad bmi colours (uUsage) */
174 ZeroMemory(pbi
, sizeof(BITMAPINFO
));
175 pbi
->bmiHeader
.biSize
= sizeof(BITMAPINFOHEADER
);
176 ok(GetDIBits(hdcScreen
, hbmp
, 0, 15, NULL
, pbi
, 100) == 0, "\n");
177 ok_err(ERROR_SUCCESS
);
178 ok(pbi
->bmiHeader
.biWidth
== 0, "\n");
179 ok(pbi
->bmiHeader
.biHeight
== 0, "\n");
180 ok(pbi
->bmiHeader
.biBitCount
== 0, "\n");
181 ok(pbi
->bmiHeader
.biSizeImage
== 0, "\n");
184 SetLastError(ERROR_SUCCESS
);
185 ZeroMemory(pbi
, sizeof(BITMAPINFO
));
186 pbi
->bmiHeader
.biSize
= sizeof(BITMAPINFOHEADER
);
187 ok(GetDIBits(hdcScreen
, hbmp
, 0, 15, NULL
, pbi
, DIB_RGB_COLORS
) > 0, "\n");
188 ok_err(ERROR_SUCCESS
);
189 ScreenBpp
= GetDeviceCaps(hdcScreen
, BITSPIXEL
);
190 ok(pbi
->bmiHeader
.biWidth
== 16, "\n");
191 ok(pbi
->bmiHeader
.biHeight
== 16, "\n");
192 ok(pbi
->bmiHeader
.biBitCount
== ScreenBpp
, "\n");
193 ok(pbi
->bmiHeader
.biSizeImage
== (16 * 16) * (ScreenBpp
/ 8), "\n");
195 /* Test if COREHEADER is supported */
196 ZeroMemory(pbi
, sizeof(BITMAPINFO
));
197 pbi
->bmiHeader
.biSize
= sizeof(BITMAPCOREHEADER
);
198 ok_int(GetDIBits(hdcScreen
, hbmp
, 0, 15, NULL
, pbi
, DIB_RGB_COLORS
), 1);
199 ok_int(pbi
->bmiHeader
.biSize
, sizeof(BITMAPCOREHEADER
));
200 ok_int(pbch
->bcWidth
, 16);
201 ok_int(pbch
->bcHeight
, 16);
202 ok_int(pbch
->bcPlanes
, 1);
203 //ok_int(pbch->bcBitCount, ScreenBpp > 16 ? 24 : ScreenBpp); // fails on XP with screenbpp == 16
205 /* Test different header sizes */
206 ZeroMemory(pbi
, sizeof(BITMAPINFO
));
207 pbi
->bmiHeader
.biSize
= sizeof(BITMAPCOREHEADER
) + 4;
208 ok_int(GetDIBits(hdcScreen
, hbmp
, 0, 15, NULL
, pbi
, DIB_RGB_COLORS
), 0);
210 ZeroMemory(pbi
, sizeof(BITMAPINFO
));
211 pbi
->bmiHeader
.biSize
= sizeof(BITMAPINFOHEADER
) + 4;
212 ok_int(GetDIBits(hdcScreen
, hbmp
, 0, 15, NULL
, pbi
, DIB_RGB_COLORS
), 1);
214 ZeroMemory(pbi
, sizeof(BITMAPINFO
));
215 pbi
->bmiHeader
.biSize
= sizeof(BITMAPV4HEADER
);
216 ok_int(GetDIBits(hdcScreen
, hbmp
, 0, 15, NULL
, pbi
, DIB_RGB_COLORS
), 1);
218 ZeroMemory(pbi
, sizeof(BITMAPINFO
));
219 pbi
->bmiHeader
.biSize
= sizeof(BITMAPV4HEADER
) + 4;
220 ok_int(GetDIBits(hdcScreen
, hbmp
, 0, 15, NULL
, pbi
, DIB_RGB_COLORS
), 1);
222 ZeroMemory(pbi
, sizeof(BITMAPINFO
));
223 pbi
->bmiHeader
.biSize
= sizeof(BITMAPV5HEADER
);
224 ok_int(GetDIBits(hdcScreen
, hbmp
, 0, 15, NULL
, pbi
, DIB_RGB_COLORS
), 1);
226 ZeroMemory(pbi
, sizeof(BITMAPINFO
));
227 pbi
->bmiHeader
.biSize
= sizeof(BITMAPV5HEADER
) + 4;
228 ok_int(GetDIBits(hdcScreen
, hbmp
, 0, 15, NULL
, pbi
, DIB_RGB_COLORS
), 1);
229 ok_int(pbV5Header
->bV5RedMask
, 0);
230 ok_int(pbV5Header
->bV5GreenMask
, 0);
231 ok_int(pbV5Header
->bV5BlueMask
, 0);
232 ok_int(pbV5Header
->bV5AlphaMask
, 0);
233 ok_int(pbV5Header
->bV5CSType
, 0);
234 // CIEXYZTRIPLE bV5Endpoints;
235 ok_int(pbV5Header
->bV5GammaRed
, 0);
236 ok_int(pbV5Header
->bV5GammaGreen
, 0);
237 ok_int(pbV5Header
->bV5GammaBlue
, 0);
238 ok_int(pbV5Header
->bV5Intent
, 0);
239 ok_int(pbV5Header
->bV5ProfileData
, 0);
240 ok_int(pbV5Header
->bV5ProfileSize
, 0);
241 ok_int(pbV5Header
->bV5Reserved
, 0);
243 ZeroMemory(pbi
, sizeof(BITMAPINFO
));
244 pbi
->bmiHeader
.biSize
= sizeof(BITMAPINFOHEADER
);
245 ok_int(GetDIBits(hdcScreen
, hbmp
, 234, 43, NULL
, pbi
, DIB_RGB_COLORS
), 1);
249 /* Test a mono bitmap */
250 hbmp
= CreateBitmap(13, 7, 1, 1, ajBits
);
251 ok(hbmp
!= 0, "failed to create bitmap\n");
252 ZeroMemory(pbi
, sizeof(BITMAPINFO
));
253 pbi
->bmiHeader
.biSize
= sizeof(BITMAPINFOHEADER
);
254 ok_int(GetDIBits(hdcScreen
, hbmp
, 0, 0, NULL
, pbi
, DIB_RGB_COLORS
), 1);
255 ok_int(pbi
->bmiHeader
.biWidth
, 13);
256 ok_int(pbi
->bmiHeader
.biHeight
, 7);
257 ok_int(pbi
->bmiHeader
.biBitCount
, 1);
258 ok_int(pbi
->bmiHeader
.biSizeImage
, 28);
260 /* Test with values set, except biSizeImage */
261 pbi
->bmiHeader
.biSizeImage
= 0;
262 ok_int(GetDIBits(hdcScreen
, hbmp
, 0, 0, NULL
, pbi
, DIB_RGB_COLORS
), 1);
263 ok_int(pbi
->bmiHeader
.biSizeImage
, 28);
265 /* Test with different biWidth set */
266 pbi
->bmiHeader
.biWidth
= 17;
267 pbi
->bmiHeader
.biHeight
= 3;
268 pbi
->bmiHeader
.biSizeImage
= 0;
269 ok_int(GetDIBits(hdcScreen
, hbmp
, 0, 0, NULL
, pbi
, DIB_RGB_COLORS
), 1);
270 ok_int(pbi
->bmiHeader
.biSizeImage
, 12);
271 ok_int(pbi
->bmiHeader
.biWidth
, 17);
272 ok_int(pbi
->bmiHeader
.biHeight
, 3);
274 /* Test with different biBitCount set */
275 pbi
->bmiHeader
.biBitCount
= 4;
276 pbi
->bmiHeader
.biSizeImage
= 0;
277 ok_int(GetDIBits(hdcScreen
, hbmp
, 0, 0, NULL
, pbi
, DIB_RGB_COLORS
), 1);
278 ok_int(pbi
->bmiHeader
.biSizeImage
, 36);
279 ok_int(pbi
->bmiHeader
.biBitCount
, 4);
281 /* Set bitmap dimensions */
282 ok_int(SetBitmapDimensionEx(hbmp
, 110, 220, NULL
), 1);
283 ZeroMemory(pbi
, sizeof(BITMAPINFO
));
284 pbi
->bmiHeader
.biSize
= sizeof(BITMAPINFOHEADER
);
285 ok_int(GetDIBits(hdcScreen
, hbmp
, 0, 5, NULL
, pbi
, DIB_RGB_COLORS
), 1);
286 ok_int(pbi
->bmiHeader
.biXPelsPerMeter
, 0);
287 ok_int(pbi
->bmiHeader
.biYPelsPerMeter
, 0);
289 /* Set individual values */
290 ZeroMemory(pbi
, sizeof(BITMAPINFO
));
291 pbi
->bmiHeader
.biSize
= sizeof(BITMAPINFOHEADER
);
292 pbi
->bmiHeader
.biWidth
= 12;
293 ok_int(GetDIBits(hdcScreen
, hbmp
, 0, 5, NULL
, pbi
, DIB_RGB_COLORS
), 1);
294 ok_int(pbi
->bmiHeader
.biWidth
, 13);
295 ok_int(pbi
->bmiHeader
.biSizeImage
, 28);
297 ZeroMemory(pbi
, sizeof(BITMAPINFO
));
298 pbi
->bmiHeader
.biSize
= sizeof(BITMAPINFOHEADER
);
299 pbi
->bmiHeader
.biSizeImage
= 123;
300 ok_int(GetDIBits(hdcScreen
, hbmp
, 0, 5, NULL
, pbi
, DIB_RGB_COLORS
), 1);
302 ZeroMemory(pbi
, sizeof(BITMAPINFO
));
303 pbi
->bmiHeader
.biSize
= sizeof(BITMAPINFOHEADER
);
304 pbi
->bmiHeader
.biCompression
= BI_RGB
;
305 ok_int(GetDIBits(hdcScreen
, hbmp
, 0, 5, NULL
, pbi
, DIB_RGB_COLORS
), 1);
307 /* Set only biBitCount */
308 ZeroMemory(pbi
, sizeof(BITMAPINFO
));
309 pbi
->bmiHeader
.biSize
= sizeof(BITMAPINFOHEADER
);
310 pbi
->bmiHeader
.biBitCount
= 5;
311 ok_int(GetDIBits(hdcScreen
, hbmp
, 0, 5, NULL
, pbi
, DIB_RGB_COLORS
), 0);
312 pbi
->bmiHeader
.biBitCount
= 1;
313 ok_int(GetDIBits(hdcScreen
, hbmp
, 0, 5, NULL
, pbi
, DIB_RGB_COLORS
), 0);
314 pbi
->bmiHeader
.biBitCount
= 8;
315 ok_int(GetDIBits(hdcScreen
, hbmp
, 0, 5, NULL
, pbi
, DIB_RGB_COLORS
), 0);
316 pbi
->bmiHeader
.biBitCount
= 32;
317 ok_int(GetDIBits(hdcScreen
, hbmp
, 0, 5, NULL
, pbi
, DIB_RGB_COLORS
), 0);
318 ok_int(pbi
->bmiHeader
.biWidth
, 0);
319 ok_int(pbi
->bmiHeader
.biHeight
, 0);
320 ok_int(pbi
->bmiHeader
.biPlanes
, 0);
321 ok_int(pbi
->bmiHeader
.biBitCount
, 32);
322 ok_int(pbi
->bmiHeader
.biCompression
, 0);
323 ok_int(pbi
->bmiHeader
.biSizeImage
, 0);
325 /* Get the bitmap bits */
326 pbi
->bmiHeader
.biSize
= sizeof(BITMAPINFOHEADER
);
327 pbi
->bmiHeader
.biWidth
= 4;
328 pbi
->bmiHeader
.biHeight
= 4;
329 pbi
->bmiHeader
.biPlanes
= 1;
330 pbi
->bmiHeader
.biBitCount
= 32;
331 pbi
->bmiHeader
.biCompression
= BI_RGB
;
332 ok_int(GetDIBits(hdcScreen
, hbmp
, 0, 5, NULL
, pbi
, DIB_RGB_COLORS
), 1);
333 pbi
->bmiHeader
.biWidth
= 0;
334 ok_int(GetDIBits(hdcScreen
, hbmp
, 0, 5, NULL
, pbi
, DIB_RGB_COLORS
), 0);
335 pbi
->bmiHeader
.biWidth
= -3;
336 ok_int(GetDIBits(hdcScreen
, hbmp
, 0, 5, NULL
, pbi
, DIB_RGB_COLORS
), 0);
337 pbi
->bmiHeader
.biWidth
= 4;
338 pbi
->bmiHeader
.biHeight
= 0;
339 ok_int(GetDIBits(hdcScreen
, hbmp
, 0, 5, NULL
, pbi
, DIB_RGB_COLORS
), 0);
340 pbi
->bmiHeader
.biHeight
= -4;
341 ok_int(GetDIBits(hdcScreen
, hbmp
, 0, 5, NULL
, pbi
, DIB_RGB_COLORS
), 1);
342 pbi
->bmiHeader
.biBitCount
= 31;
343 ok_int(GetDIBits(hdcScreen
, hbmp
, 0, 5, NULL
, pbi
, DIB_RGB_COLORS
), 0);
344 pbi
->bmiHeader
.biBitCount
= 16;
345 pbi
->bmiHeader
.biPlanes
= 23;
346 ok_int(GetDIBits(hdcScreen
, hbmp
, 0, 5, NULL
, pbi
, DIB_RGB_COLORS
), 1);
347 ok_int(pbi
->bmiHeader
.biPlanes
, 1);
348 pbi
->bmiHeader
.biCompression
= BI_JPEG
;
349 ok_int(GetDIBits(hdcScreen
, hbmp
, 0, 5, NULL
, pbi
, DIB_RGB_COLORS
), 0);
350 pbi
->bmiHeader
.biCompression
= BI_PNG
;
351 ok_int(GetDIBits(hdcScreen
, hbmp
, 0, 5, NULL
, pbi
, DIB_RGB_COLORS
), 0);
354 /* Get the bitmap bits */
355 pbi
->bmiHeader
.biSize
= sizeof(BITMAPINFOHEADER
);
356 pbi
->bmiHeader
.biWidth
= 4;
357 pbi
->bmiHeader
.biHeight
= 4;
358 pbi
->bmiHeader
.biPlanes
= 1;
359 pbi
->bmiHeader
.biBitCount
= 32;
360 pbi
->bmiHeader
.biCompression
= BI_RGB
;
361 pbi
->bmiHeader
.biSizeImage
= 0;
362 pbi
->bmiHeader
.biXPelsPerMeter
= 0;
363 pbi
->bmiHeader
.biYPelsPerMeter
= 0;
364 pbi
->bmiHeader
.biClrUsed
= 0;
365 pbi
->bmiHeader
.biClrImportant
= 0;
366 cjSizeImage
= ((pbi
->bmiHeader
.biWidth
* pbi
->bmiHeader
.biBitCount
+ 31) / 32) * 4 * pbi
->bmiHeader
.biHeight
;
367 pvBits
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, 512);
368 ok_int(GetDIBits(hdcScreen
, hbmp
, 0, 4, pvBits
, pbi
, DIB_RGB_COLORS
), 4);
370 /* Set biBitCount to 0 */
371 pbi
->bmiHeader
.biBitCount
= 0;
372 ok_int(GetDIBits(hdcScreen
, hbmp
, 0, 4, pvBits
, pbi
, DIB_RGB_COLORS
), 0);
373 ok_int(GetDIBits(hdcScreen
, hbmp
, 0, 4, NULL
, pbi
, DIB_RGB_COLORS
), 1);
374 ok_int(GetDIBits(NULL
, hbmp
, 0, 4, NULL
, pbi
, DIB_RGB_COLORS
), 0);
376 /* Try different biBitCount and biWidth */
377 pbi
->bmiHeader
.biBitCount
= 24;
378 pbi
->bmiHeader
.biWidth
= 3;
379 ok_int(GetDIBits(hdcScreen
, hbmp
, 0, 4, pvBits
, pbi
, DIB_RGB_COLORS
), 4);
381 /* Try different biBitCount and biWidth */
382 pbi
->bmiHeader
.biBitCount
= 24;
383 pbi
->bmiHeader
.biWidth
= 3;
384 ok_int(GetDIBits(hdcScreen
, hbmp
, 0, 4, pvBits
, pbi
, DIB_RGB_COLORS
), 4);
386 /* Set only biBitCount and pjInit */
387 ZeroMemory(pbi
, sizeof(BITMAPINFO
));
388 pbi
->bmiHeader
.biSize
= sizeof(BITMAPINFOHEADER
);
389 pbi
->bmiHeader
.biBitCount
= 5;
390 ok_int(GetDIBits(hdcScreen
, hbmp
, 0, 4, pvBits
, pbi
, DIB_RGB_COLORS
), 0);
393 HeapFree(GetProcessHeap(), 0, pvBits
);
395 /* Test a 4 bpp bitmap */
396 hbmp
= CreateBitmap(3, 5, 1, 4, NULL
);
397 ok(hbmp
!= 0, "failed to create bitmap\n");
398 ZeroMemory(pbi
, sizeof(BITMAPINFO
));
399 pbi
->bmiHeader
.biSize
= sizeof(BITMAPINFOHEADER
);
400 ok_int(GetDIBits(hdcScreen
, hbmp
, 0, 0, NULL
, pbi
, DIB_RGB_COLORS
), 1);
401 ok_int(pbi
->bmiHeader
.biWidth
, 3);
402 ok_int(pbi
->bmiHeader
.biHeight
, 5);
403 ok_int(pbi
->bmiHeader
.biBitCount
, 4);
404 ok_int(pbi
->bmiHeader
.biSizeImage
, 20);
406 /* This does NOT work with incompatible bitmaps */
407 pbi
->bmiHeader
.biSizeImage
= 0;
408 ok_int(GetDIBits(hdcScreen
, hbmp
, 0, 0, NULL
, pbi
, DIB_RGB_COLORS
), 0);
410 cjSizeImage
= ((pbi
->bmiHeader
.biWidth
* pbi
->bmiHeader
.biBitCount
+ 31) / 32) * 4 * pbi
->bmiHeader
.biHeight
;
411 pvBits
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, cjSizeImage
);
413 ok(SelectObject(hdcMem
, ghbmpDIB4
) != 0, "\n");;
414 ok_int(GetDIBits(hdcMem
, hbmp
, 0, 4, pvBits
, pbi
, DIB_RGB_COLORS
), 0);
415 ok_int(GetDIBits(hdcMem
, ghbmpDIB4
, 0, 4, pvBits
, pbi
, DIB_RGB_COLORS
), 3);
419 ReleaseDC(NULL
, hdcScreen
);
422 void Test_GetDIBits_BI_BITFIELDS()
426 START_TEST(GetDIBits
)
430 Test_GetDIBits_xBpp(1);
431 Test_GetDIBits_xBpp(4);
432 Test_GetDIBits_xBpp(8);
433 Test_GetDIBits_xBpp(16);
434 Test_GetDIBits_xBpp(24);
435 Test_GetDIBits_xBpp(32);