[SPIDER]
[reactos.git] / rostests / apitests / gdi32 / GetDIBits.c
1 /*
2 * PROJECT: ReactOS api tests
3 * LICENSE: GPL - See COPYING in the top level directory
4 * PURPOSE: Test for GetDIBits
5 * PROGRAMMERS: Timo Kreuzer
6 */
7
8 #include <apitest.h>
9
10 #include <wingdi.h>
11 #include <winuser.h>
12
13 #include "init.h"
14
15 void
16 Test_GetDIBits_xBpp(
17 ULONG cBitsPixel)
18 {
19 UCHAR ajBuffer[sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD)];
20 PBITMAPINFO pbmi = (PBITMAPINFO)ajBuffer;
21 HBITMAP hbmp;
22 ULONG cjSizeImage, cColors;
23 HDC hdc;
24
25 hdc = GetDC(0);
26 hbmp = CreateBitmap(3, 3, 1, cBitsPixel, NULL);
27
28 /* Fill in the size field */
29 ZeroMemory(pbmi, sizeof(ajBuffer));
30 pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
31
32 /* Get info */
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;
36
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);
48
49 // pbmi->bmiHeader.biSizeImage = 0;
50 //ok_int(GetDIBits(NULL, hbmp, 0, 0, NULL, pbmi, DIB_RGB_COLORS), 1);
51
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);
71
72
73 #if 0
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);
79
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);
84
85 /* Get the bits */
86 SetLastError(0);
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);
89 ok_err(0);
90
91 pbmi->bmiHeader.biPlanes = 2;
92 pbmi->bmiHeader.biClrUsed = 0;
93 ok_int(GetDIBits(hdc, hbmp, 0, 4, pvBits, pbmi, DIB_RGB_COLORS), 3);
94 #endif
95
96 DeleteObject(hbmp);
97 ReleaseDC(NULL, hdc);
98 }
99
100 void Test_GetDIBits()
101 {
102 HDC hdcScreen, hdcMem;
103 HBITMAP hbmp;
104 PBITMAPINFO pbi;
105 PBITMAPCOREHEADER pbch;
106 PBITMAPV5HEADER pbV5Header;
107 INT ScreenBpp;
108 DWORD ajBits[100] = {0xff, 0x00, 0xcc, 0xf0, 0x0f};
109 PVOID pvBits;
110 ULONG cjSizeImage;
111
112 pbi = malloc(sizeof(BITMAPV5HEADER) + 256 * sizeof(DWORD));
113 pbch = (PVOID)pbi;
114 pbV5Header = (PVOID)pbi;
115
116 hdcScreen = GetDC(NULL);
117 ok(hdcScreen != 0, "GetDC failed, skipping tests\n");
118 if (hdcScreen == NULL) return;
119
120 hdcMem = CreateCompatibleDC(0);
121 ok(hdcMem != 0, "CreateCompatibleDC failed, skipping tests\n");
122 if (hdcMem == NULL) return;
123
124 hbmp = CreateCompatibleBitmap(hdcScreen, 16, 16);
125 ok(hbmp != NULL, "CreateCompatibleBitmap failed\n");
126
127 /* misc */
128 SetLastError(ERROR_SUCCESS);
129 ok(GetDIBits(0, 0, 0, 0, NULL, NULL, 0) == 0, "\n");
130 ok_err(ERROR_INVALID_PARAMETER);
131
132 SetLastError(ERROR_SUCCESS);
133 ok(GetDIBits((HDC)2345, 0, 0, 0, NULL, NULL, 0) == 0, "\n");
134 ok_err(ERROR_INVALID_PARAMETER);
135
136 SetLastError(ERROR_SUCCESS);
137 ok(GetDIBits((HDC)2345, hbmp, 0, 0, NULL, NULL, 0) == 0, "\n");
138 ok_err(ERROR_INVALID_PARAMETER);
139
140 SetLastError(ERROR_SUCCESS);
141 ok(GetDIBits((HDC)2345, hbmp, 0, 15, NULL, pbi, 0) == 0, "\n");
142 ok_err(ERROR_INVALID_PARAMETER);
143
144
145
146 /* null hdc */
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);
152
153 /* null bitmap */
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);
159
160 /* 0 scan lines */
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);
166
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);
171
172 /* bad bmi colours (uUsage) */
173 SetLastError(0);
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");
182
183 /* basic call */
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");
194
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
204
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);
209
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);
213
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);
217
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);
221
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);
225
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);
242
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);
246
247 DeleteObject(hbmp);
248
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);
259
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);
264
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);
273
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);
280
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);
288
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);
296
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);
301
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);
306
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);
324
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);
352
353
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);
369
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);
375
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);
380
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);
385
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);
391
392 DeleteObject(hbmp);
393 HeapFree(GetProcessHeap(), 0, pvBits);
394
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);
405
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);
409
410 cjSizeImage = ((pbi->bmiHeader.biWidth * pbi->bmiHeader.biBitCount + 31) / 32) * 4 * pbi->bmiHeader.biHeight;
411 pvBits = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, cjSizeImage);
412
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);
416
417
418 DeleteDC(hdcMem);
419 ReleaseDC(NULL, hdcScreen);
420 }
421
422 void Test_GetDIBits_BI_BITFIELDS()
423 {
424 }
425
426 START_TEST(GetDIBits)
427 {
428 //getchar();
429 InitStuff();
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);
436 Test_GetDIBits();
437 }
438