2 * PROJECT: ReactOS api tests
3 * LICENSE: GPL - See COPYING in the top level directory
4 * PURPOSE: Test for CreateDIBitmap
5 * PROGRAMMERS: Timo Kreuzer
12 #define CBM_CREATDIB 2
18 const BITMAPINFOHEADER
*lpbmih
,
21 const BITMAPINFO
*lpbmi
,
26 *pdwError
= ERROR_INVALID_PARAMETER
;
30 if (fuUsage
!= DIB_RGB_COLORS
)
38 if (fdwInit
& CBM_INIT
)
42 if (!lpbInit
|| (lpbInit
== (PVOID
)0xC0000000)) return FALSE
;
48 if (lpbInit
== (PVOID
)0xC0000000) return FALSE
;
49 if (!lpbmi
|| (lpbmi
== (PVOID
)0xC0000000)) return FALSE
;
50 if (lpbmi
->bmiHeader
.biSize
== 0) return FALSE
;
51 if (fuUsage
== 2) return FALSE
;
57 if (fdwInit
& CBM_CREATDIB
)
59 if (fuUsage
== 2) return FALSE
;
60 if ((fuUsage
== DIB_PAL_COLORS
) && !hdc
)
65 if (fdwInit
& CBM_INIT
)
67 if (!lpbInit
|| (lpbInit
== (PVOID
)0xC0000000)) return FALSE
;
70 if ((!lpbmi
) || (lpbmi
== (PVOID
)0xc0000000) || (lpbmi
->bmiHeader
.biSize
== 0))
78 if ((lpbmih
== NULL
) ||
79 (lpbmih
== (PVOID
)0xC0000000) ||
80 (lpbmih
->biSize
== 0))
87 *pdwError
= ERROR_INVALID_PARAMETER
;
92 if (lpbmi
== (PVOID
)0xc0000000) return FALSE
;
100 Test_CreateDIBitmap_Params(void)
105 {{sizeof(BITMAPINFOHEADER
), 4, 4, 1, 8, BI_RGB
, 0, 1, 1, 1, 0}, {{0,0,0,0}}};
106 BITMAPINFO bmiBroken
=
107 {{0, -2, -4, 55, 42, 21, 0, 1, 1, 1, 0}, {{0,0,0,0}}};
110 hdc
= CreateCompatibleDC(0);
111 ok(hdc
!= 0, "failed\n");
113 hbmp
= CreateDIBitmap(hdc
, &bmi
.bmiHeader
, CBM_INIT
, ajBits
, &bmi
, DIB_PAL_COLORS
);
116 hbmp
= CreateDIBitmap(hdc
, &bmi
.bmiHeader
, CBM_INIT
, NULL
, &bmi
, DIB_PAL_COLORS
);
119 hbmp
= CreateDIBitmap(hdc
, &bmi
.bmiHeader
, CBM_INIT
, NULL
, NULL
, DIB_PAL_COLORS
);
122 hbmp
= CreateDIBitmap(hdc
, &bmi
.bmiHeader
, 0, (PVOID
)0xc0000000, &bmi
, DIB_PAL_COLORS
);
125 hbmp
= CreateDIBitmap(NULL
, &bmi
.bmiHeader
, CBM_INIT
, NULL
, &bmi
, DIB_PAL_COLORS
);
128 hbmp
= CreateDIBitmap(hdc
, &bmi
.bmiHeader
, CBM_INIT
, NULL
, &bmiBroken
, DIB_PAL_COLORS
);
131 hbmp
= CreateDIBitmap(NULL
, NULL
, 2, NULL
, &bmi
, 0);
134 SetLastError(0xbadbad00);
135 hbmp
= CreateDIBitmap(hdc
, NULL
, CBM_INIT
, ajBits
, &bmi
, DIB_PAL_COLORS
);
137 ok_err(ERROR_INVALID_PARAMETER
);
139 SetLastError(0xbadbad00);
140 hbmp
= CreateDIBitmap(hdc
, NULL
, CBM_INIT
, NULL
, &bmiBroken
, DIB_PAL_COLORS
);
142 ok_err(ERROR_INVALID_PARAMETER
);
144 SetLastError(0xbadbad00);
145 hbmp
= CreateDIBitmap(hdc
, &bmi
.bmiHeader
, CBM_INIT
, ajBits
, &bmi
, 2);
147 ok_err(ERROR_INVALID_PARAMETER
);
149 SetLastError(0xbadbad00);
150 hbmp
= CreateDIBitmap(hdc
, &bmi
.bmiHeader
, CBM_INIT
, ajBits
, NULL
, DIB_PAL_COLORS
);
154 SetLastError(0xbadbad00);
155 hbmp
= CreateDIBitmap(hdc
, &bmi
.bmiHeader
, CBM_INIT
, (PVOID
)0xc0000000, &bmi
, DIB_PAL_COLORS
);
159 SetLastError(0xbadbad00);
162 hbmp
= CreateDIBitmap(hdc
, &bmi
.bmiHeader
, 0, ajBits
, (PVOID
)0xc0000000, DIB_PAL_COLORS
);
164 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
169 ok(hbmp
== (HBITMAP
)-1, "\n");
172 SetLastError(0xbadbad00);
173 hbmp
= CreateDIBitmap(hdc
, &bmi
.bmiHeader
, CBM_INIT
, NULL
, NULL
, 5);
175 ok_err(ERROR_INVALID_PARAMETER
);
177 SetLastError(0xbadbad00);
178 hbmp
= CreateDIBitmap((HDC
)-1, &bmi
.bmiHeader
, CBM_INIT
, NULL
, &bmi
, DIB_PAL_COLORS
);
182 SetLastError(0xbadbad00);
183 hbmp
= CreateDIBitmap(hdc
, &bmiBroken
.bmiHeader
, CBM_INIT
, NULL
, &bmi
, DIB_PAL_COLORS
);
185 ok_err(ERROR_INVALID_PARAMETER
);
189 ULONG i1
, i2
, i3
, i4
, i5
, i6
;
190 HDC ahdc
[3] = {0, hdc
, (HDC
)-1};
191 PBITMAPINFOHEADER apbih
[4] = {NULL
, &bmi
.bmiHeader
, &bmiBroken
.bmiHeader
, (PVOID
)0xC0000000};
192 ULONG afInitf
[12] = {0, 1, 2, 3, CBM_INIT
, 4, 5, 6, 7, 8, 0x10, 0x20};
193 PVOID apvBits
[3] = {NULL
, ajBits
, (PVOID
)0xc0000000};
194 PBITMAPINFO apbmi
[4] = {NULL
, &bmi
, &bmiBroken
, (PVOID
)0xC0000000};
195 ULONG aiUsage
[5] = {0, 1, 2, 3, 23};
199 for (i1
= 0; i1
< 3; i1
++)
201 for (i2
= 0; i2
< 4; i2
++)
203 for (i3
= 0; i3
< 8; i3
++)
205 for (i4
= 0; i4
< 3; i4
++)
207 for (i5
= 0; i5
< 4; i5
++)
209 for (i6
= 0; i6
< 5; i6
++)
211 SetLastError(0xbadbad00);
212 dwExpError
= 0xbadbad00;
214 bExpSuccess
= GetExpected(&dwExpError
, ahdc
[i1
], apbih
[i2
], afInitf
[i3
], apvBits
[i4
], apbmi
[i5
], aiUsage
[i6
]);
218 hbmp
= CreateDIBitmap(ahdc
[i1
], apbih
[i2
], afInitf
[i3
], apvBits
[i4
], apbmi
[i5
], aiUsage
[i6
]);
220 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
228 ok(hbmp
!= 0, "Expected success for (%ld,%ld,%ld,%ld,%ld,%ld) CreateDIBitmap(%p, %p, 0x%lx, %p, %p, %ld)\n",
229 i1
, i2
, i3
, i4
, i5
, i6
,
230 ahdc
[i1
], apbih
[i2
], afInitf
[i3
], apvBits
[i4
], apbmi
[i5
], aiUsage
[i6
]);
234 ok(hbmp
== 0, "Expected failure for (%ld,%ld,%ld,%ld,%ld,%ld) CreateDIBitmap(%p, %p, 0x%lx, %p, %p, %ld)\n",
235 i1
, i2
, i3
, i4
, i5
, i6
,
236 ahdc
[i1
], apbih
[i2
], afInitf
[i3
], apvBits
[i4
], apbmi
[i5
], aiUsage
[i6
]);
239 // ok(GetLastError() == dwExpError, "Expected error %ld got %ld for (%ld,%ld,%ld,%ld,%ld,%ld) CreateDIBitmap(%p, %p, 0x%lx, %p, %p, %ld)\n",
240 // dwExpError, GetLastError(), i1, i2, i3, i4, i5, i6,
241 // ahdc[i1], apbih[i2], afInitf[i3], apvBits[i4], apbmi[i5], aiUsage[i6]);
254 Test_CreateDIBitmap_DIB_PAL_COLORS(void)
258 BITMAPINFOHEADER bmiHeader
;
261 BITMAPINFO
*pbmi
= (PVOID
)&bmibuffer
;
263 ULONG bits
[16] = {0};
268 hdc
= CreateCompatibleDC(0);
269 ok(hdc
!= 0, "failed\n");
271 /* Select a palette */
272 hpalOld
= SelectPalette(hdc
, ghpal
, FALSE
);
273 ok(hpalOld
!= NULL
, "error=%ld\n", GetLastError());
275 /* Initialize a BITMAPINFO */
276 pbmi
->bmiHeader
.biSize
= sizeof(BITMAPINFOHEADER
);
277 pbmi
->bmiHeader
.biWidth
= 2;
278 pbmi
->bmiHeader
.biHeight
= -2;
279 pbmi
->bmiHeader
.biPlanes
= 1;
280 pbmi
->bmiHeader
.biBitCount
= 8;
281 pbmi
->bmiHeader
.biCompression
= BI_RGB
;
282 pbmi
->bmiHeader
.biSizeImage
= 0;
283 pbmi
->bmiHeader
.biXPelsPerMeter
= 1;
284 pbmi
->bmiHeader
.biYPelsPerMeter
= 1;
285 pbmi
->bmiHeader
.biClrUsed
= 8;
286 pbmi
->bmiHeader
.biClrImportant
= 0;
288 for( i
= 0; i
< 8; i
++ )
290 bmibuffer
.bmiColors
[i
] = i
;
293 /* Create the bitmap */
294 hbmp
= CreateDIBitmap(hdc
, &pbmi
->bmiHeader
, CBM_INIT
, bits
, pbmi
, DIB_PAL_COLORS
);
295 ok(hbmp
!= 0, "failed\n");
297 SelectObject(hdc
, hbmp
);
303 Test_CreateDIBitmap1(void)
308 ULONG bits
[128] = {0};
309 BYTE rlebits
[] = {2, 0, 0, 0, 2, 1, 0, 1};
315 bmi
.bmiHeader
.biSize
= sizeof(BITMAPINFOHEADER
);
316 bmi
.bmiHeader
.biWidth
= 2;
317 bmi
.bmiHeader
.biHeight
= 2;
318 bmi
.bmiHeader
.biPlanes
= 1;
319 bmi
.bmiHeader
.biBitCount
= 16;
320 bmi
.bmiHeader
.biCompression
= BI_RGB
;
321 bmi
.bmiHeader
.biSizeImage
= 0;
322 bmi
.bmiHeader
.biXPelsPerMeter
= 1;
323 bmi
.bmiHeader
.biYPelsPerMeter
= 1;
324 bmi
.bmiHeader
.biClrUsed
= 0;
325 bmi
.bmiHeader
.biClrImportant
= 0;
327 hbmp
= CreateDIBitmap(hdc
, &bmi
.bmiHeader
, CBM_INIT
, bits
, &bmi
, DIB_RGB_COLORS
);
328 ok(hbmp
!= 0, "failed\n");
330 ret
= GetObject(hbmp
, sizeof(bitmap
), &bitmap
);
331 ok(ret
!= 0, "failed\n");
332 ok(bitmap
.bmType
== 0, "\n");
333 ok(bitmap
.bmWidth
== 2, "\n");
334 ok(bitmap
.bmHeight
== 2, "\n");
335 ok(bitmap
.bmWidthBytes
== 8, "bmWidthBytes = %ld\n", bitmap
.bmWidthBytes
);
336 ok(bitmap
.bmPlanes
== 1, "\n");
337 ok(bitmap
.bmBitsPixel
== GetDeviceCaps(hdc
, BITSPIXEL
), "\n");
338 ok(bitmap
.bmBits
== 0, "\n");
341 bmi
.bmiHeader
.biCompression
= BI_RLE8
;
342 bmi
.bmiHeader
.biBitCount
= 8;
343 bmi
.bmiHeader
.biSizeImage
= 8;
344 bmi
.bmiHeader
.biClrUsed
= 1;
345 hbmp
= CreateDIBitmap(hdc
, &bmi
.bmiHeader
, CBM_INIT
, rlebits
, &bmi
, DIB_PAL_COLORS
);
346 ok(hbmp
!= 0, "failed\n");
347 ok(GetLastError() == 0, "GetLastError() == %ld\n", GetLastError());
349 ret
= GetObject(hbmp
, sizeof(bitmap
), &bitmap
);
350 ok(ret
!= 0, "failed\n");
351 ok(bitmap
.bmType
== 0, "\n");
352 ok(bitmap
.bmWidth
== 2, "\n");
353 ok(bitmap
.bmHeight
== 2, "\n");
354 ok(bitmap
.bmWidthBytes
== 8, "bmWidthBytes = %ld\n", bitmap
.bmWidthBytes
);
355 ok(bitmap
.bmPlanes
== 1, "\n");
356 ok(bitmap
.bmBitsPixel
== GetDeviceCaps(hdc
, BITSPIXEL
), "\n");
357 ok(bitmap
.bmBits
== 0, "\n");
362 void Test_CreateDIBitmap_RLE8()
366 BITMAPINFOHEADER bmiHeader
;
371 {sizeof(BITMAPINFOHEADER
), 4, 4, 1, 8, BI_RLE8
, 20, 1, 1, 4, 0},
373 {4,0, 0,2,0,1,0,2,3,1, 2,1, 2,2, 1,3,1,0,1,2, },
378 hdc
= CreateCompatibleDC(0);
380 SetLastError(0xbadbad00);
381 hbmp
= CreateDIBitmap(hdc
, &PackedDIB
.bmiHeader
, CBM_INIT
, &PackedDIB
.ajBuffer
, (PVOID
)&PackedDIB
, DIB_PAL_COLORS
);
382 ok(hbmp
!= 0, "CreateDIBitmap failed.\n");
386 PackedDIB
.bmiHeader
.biSizeImage
= 2;
387 hbmp
= CreateDIBitmap(hdc
, &PackedDIB
.bmiHeader
, CBM_INIT
, &PackedDIB
.ajBuffer
, (PVOID
)&PackedDIB
, DIB_PAL_COLORS
);
388 ok(hbmp
!= 0, "CreateDIBitmap failed.\n");
392 PackedDIB
.bmiHeader
.biSizeImage
= 1;
393 hbmp
= CreateDIBitmap(hdc
, &PackedDIB
.bmiHeader
, CBM_INIT
, &PackedDIB
.ajBuffer
, (PVOID
)&PackedDIB
, DIB_PAL_COLORS
);
394 ok(hbmp
!= 0, "CreateDIBitmap failed.\n");
398 PackedDIB
.bmiHeader
.biSizeImage
= 0;
399 hbmp
= CreateDIBitmap(hdc
, &PackedDIB
.bmiHeader
, CBM_INIT
, &PackedDIB
.ajBuffer
, (PVOID
)&PackedDIB
, DIB_PAL_COLORS
);
400 ok(hbmp
== 0, "CreateDIBitmap succeeded, expected failure\n");
403 /* Test a line that is too long */
404 PackedDIB
.bmiHeader
.biSizeImage
= 20;
405 PackedDIB
.ajBuffer
[0] = 17;
406 hbmp
= CreateDIBitmap(hdc
, &PackedDIB
.bmiHeader
, CBM_INIT
, &PackedDIB
.ajBuffer
, (PVOID
)&PackedDIB
, DIB_PAL_COLORS
);
407 ok(hbmp
!= 0, "CreateDIBitmap failed\n");
415 Test_CreateDIBitmap_CBM_CREATDIB(void)
417 HBITMAP hbmp
, hbmpOld
;
420 {{sizeof(BITMAPINFOHEADER
), 4, 4, 1, 8, BI_RGB
, 0, 1, 1, 1, 0}, {{0,1,2,3}}};
421 BYTE ajBits
[10] = {0,1,2,3,4,5,6,7,8,9};
425 BITMAPINFOHEADER bmiHeader
;
429 {sizeof(BITMAPINFOHEADER
), 8, 2, 1, 8, BI_RLE8
, 20, 1, 1, 4, 0},
432 BYTE ajBitsRLE
[] = {4,0, 0,2,0,1,0,2,3,1, 2,1, 2,2, 1,3,1,0,1,2, };
434 hdc
= CreateCompatibleDC(0);
437 ok(0, "CreateCompatibleDC failed. Skipping tests!\n");
441 SetLastError(0xbadbad00);
442 hbmp
= CreateDIBitmap(hdc
, NULL
, CBM_CREATDIB
, ajBits
, NULL
, DIB_RGB_COLORS
);
443 ok(hbmp
== 0, "CreateDIBitmap should fail.\n");
444 ok_int(GetLastError(), 0xbadbad00);
446 hbmp
= CreateDIBitmap(hdc
, NULL
, CBM_CREATDIB
, ajBits
, &bmi
, DIB_RGB_COLORS
);
447 ok(hbmp
!= 0, "CreateDIBitmap failed.\n");
449 ok_long(GetObject(hbmp
, sizeof(DIBSECTION
), &bitmap
), sizeof(BITMAP
));
450 ok_int(bitmap
.bmType
, 0);
451 ok_int(bitmap
.bmWidth
, 4);
452 ok_int(bitmap
.bmHeight
, 4);
453 ok_int(bitmap
.bmWidthBytes
, 4);
454 ok_int(bitmap
.bmPlanes
, 1);
455 ok_int(bitmap
.bmBitsPixel
, 8);
456 ok_ptr(bitmap
.bmBits
, 0);
458 hbmpOld
= SelectObject(hdc
, hbmp
);
459 ok(hbmpOld
!= NULL
, "Couldn't select the bitmap.\n");
461 /* Copy it on a dib section */
462 memset(gpDIB32
, 0x77, sizeof(*gpDIB32
));
463 ok_long(BitBlt(ghdcDIB32
, 0, 0, 4, 4, hdc
, 0, 0, SRCCOPY
), 1);
464 ok_long((*gpDIB32
)[0][0], 0x20100);
465 ok_long((*gpDIB32
)[0][1], 0x20100);
466 ok_long((*gpDIB32
)[0][2], 0x20100);
467 ok_long((*gpDIB32
)[0][3], 0x20100);
469 SelectObject(hdc
, hbmpOld
);
472 hbmp
= CreateDIBitmap(hdc
, NULL
, CBM_CREATDIB
| CBM_INIT
, ajBits
, &bmi
, DIB_PAL_COLORS
);
473 ok(hbmp
!= 0, "CreateDIBitmap failed.\n");
475 ok_long(GetObject(hbmp
, sizeof(DIBSECTION
), &bitmap
), sizeof(BITMAP
));
476 ok_int(bitmap
.bmType
, 0);
477 ok_int(bitmap
.bmWidth
, 4);
478 ok_int(bitmap
.bmHeight
, 4);
479 ok_int(bitmap
.bmWidthBytes
, 4);
480 ok_int(bitmap
.bmPlanes
, 1);
481 ok_int(bitmap
.bmBitsPixel
, 8);
482 ok_ptr(bitmap
.bmBits
, 0);
484 /* Even with CBM_INIT and lpbmih != 0, pbmi is used for the dimensions */
485 hbmp
= CreateDIBitmap(hdc
, &bmiRLE
.bmiHeader
, CBM_CREATDIB
| CBM_INIT
, ajBits
, &bmi
, DIB_PAL_COLORS
);
486 ok(hbmp
!= 0, "CreateDIBitmap failed.\n");
488 ok_long(GetObject(hbmp
, sizeof(DIBSECTION
), &bitmap
), sizeof(BITMAP
));
489 ok_int(bitmap
.bmType
, 0);
490 ok_int(bitmap
.bmWidth
, 4);
491 ok_int(bitmap
.bmHeight
, 4);
492 ok_int(bitmap
.bmWidthBytes
, 4);
493 ok_int(bitmap
.bmPlanes
, 1);
494 ok_int(bitmap
.bmBitsPixel
, 8);
495 ok_ptr(bitmap
.bmBits
, 0);
497 hbmpOld
= SelectObject(hdc
, hbmp
);
498 ok(hbmpOld
!= NULL
, "Couldn't select the bitmap.\n");
500 /* Copy it on a dib section */
501 memset(gpDIB32
, 0x77, sizeof(*gpDIB32
));
502 ok_long(BitBlt(ghdcDIB32
, 0, 0, 4, 4, hdc
, 0, 0, SRCCOPY
), 1);
503 ok_long((*gpDIB32
)[0][0], 0);
504 ok_long((*gpDIB32
)[0][1], 0);
505 ok_long((*gpDIB32
)[0][2], 0);
506 ok_long((*gpDIB32
)[0][3], 0);
508 SelectObject(hdc
, hbmpOld
);
511 hbmp
= CreateDIBitmap(hdc
, NULL
, CBM_CREATDIB
, ajBitsRLE
, (PVOID
)&bmiRLE
, DIB_PAL_COLORS
);
512 ok(hbmp
== 0, "CreateDIBitmap should fail.\n");
513 hbmp
= CreateDIBitmap(hdc
, NULL
, CBM_INIT
| CBM_CREATDIB
, ajBitsRLE
, (PVOID
)&bmiRLE
, DIB_PAL_COLORS
);
514 ok(hbmp
== 0, "CreateDIBitmap should fail.\n");
516 /* Check if a 0 pixel bitmap results in the DEFAULT_BITMAP being returned */
517 bmi
.bmiHeader
.biWidth
= 0;
518 bmi
.bmiHeader
.biHeight
= 4;
519 hbmp
= CreateDIBitmap(hdc
, &bmi
.bmiHeader
, CBM_CREATDIB
, ajBits
, &bmi
, DIB_PAL_COLORS
);
520 ok(hbmp
== GetStockObject(21), "CreateDIBitmap didn't return the default bitmap.\n");
521 bmi
.bmiHeader
.biWidth
= 23;
522 bmi
.bmiHeader
.biHeight
= 0;
523 hbmp
= CreateDIBitmap(hdc
, &bmi
.bmiHeader
, CBM_CREATDIB
, ajBits
, &bmi
, DIB_PAL_COLORS
);
524 ok(hbmp
== GetStockObject(21), "CreateDIBitmap didn't return the default bitmap.\n");
529 START_TEST(CreateDIBitmap
)
532 Test_CreateDIBitmap_Params();
533 Test_CreateDIBitmap1();
534 Test_CreateDIBitmap_DIB_PAL_COLORS();
535 Test_CreateDIBitmap_RLE8();
536 Test_CreateDIBitmap_CBM_CREATDIB();