2 * PROJECT: ReactOS api tests
3 * LICENSE: GPL - See COPYING in the top level directory
4 * PURPOSE: Test for CreateDIBitmap
5 * PROGRAMMERS: Timo Kreuzer
15 #define CBM_CREATDIB 2
21 const BITMAPINFOHEADER
*lpbmih
,
24 const BITMAPINFO
*lpbmi
,
29 *pdwError
= ERROR_INVALID_PARAMETER
;
33 if (fuUsage
!= DIB_RGB_COLORS
)
41 if (fdwInit
& CBM_INIT
)
45 if (!lpbInit
|| (lpbInit
== (PVOID
)0xC0000000)) return FALSE
;
51 if (lpbInit
== (PVOID
)0xC0000000) return FALSE
;
52 if (!lpbmi
|| (lpbmi
== (PVOID
)0xC0000000)) return FALSE
;
53 if (lpbmi
->bmiHeader
.biSize
== 0) return FALSE
;
54 if (fuUsage
== 2) return FALSE
;
60 if (fdwInit
& CBM_CREATDIB
)
62 if (fuUsage
== 2) return FALSE
;
63 if ((fuUsage
== DIB_PAL_COLORS
) && !hdc
)
68 if (fdwInit
& CBM_INIT
)
70 if (!lpbInit
|| (lpbInit
== (PVOID
)0xC0000000)) return FALSE
;
73 if ((!lpbmi
) || (lpbmi
== (PVOID
)0xc0000000) || (lpbmi
->bmiHeader
.biSize
== 0))
81 if ((lpbmih
== NULL
) ||
82 (lpbmih
== (PVOID
)0xC0000000) ||
83 (lpbmih
->biSize
== 0))
90 *pdwError
= ERROR_INVALID_PARAMETER
;
95 if (lpbmi
== (PVOID
)0xc0000000) return FALSE
;
103 Test_CreateDIBitmap_Params(void)
108 {{sizeof(BITMAPINFOHEADER
), 4, 4, 1, 8, BI_RGB
, 0, 1, 1, 1, 0}, {{0,0,0,0}}};
109 BITMAPINFO bmiBroken
=
110 {{0, -2, -4, 55, 42, 21, 0, 1, 1, 1, 0}, {{0,0,0,0}}};
113 hdc
= CreateCompatibleDC(0);
114 ok(hdc
!= 0, "failed\n");
116 hbmp
= CreateDIBitmap(hdc
, &bmi
.bmiHeader
, CBM_INIT
, ajBits
, &bmi
, DIB_PAL_COLORS
);
119 hbmp
= CreateDIBitmap(hdc
, &bmi
.bmiHeader
, CBM_INIT
, NULL
, &bmi
, DIB_PAL_COLORS
);
122 hbmp
= CreateDIBitmap(hdc
, &bmi
.bmiHeader
, CBM_INIT
, NULL
, NULL
, DIB_PAL_COLORS
);
125 hbmp
= CreateDIBitmap(hdc
, &bmi
.bmiHeader
, 0, (PVOID
)0xc0000000, &bmi
, DIB_PAL_COLORS
);
128 hbmp
= CreateDIBitmap(NULL
, &bmi
.bmiHeader
, CBM_INIT
, NULL
, &bmi
, DIB_PAL_COLORS
);
131 hbmp
= CreateDIBitmap(hdc
, &bmi
.bmiHeader
, CBM_INIT
, NULL
, &bmiBroken
, DIB_PAL_COLORS
);
134 hbmp
= CreateDIBitmap(NULL
, NULL
, 2, NULL
, &bmi
, 0);
137 SetLastError(0xbadbad00);
138 hbmp
= CreateDIBitmap(hdc
, NULL
, CBM_INIT
, ajBits
, &bmi
, DIB_PAL_COLORS
);
140 ok_err(ERROR_INVALID_PARAMETER
);
142 SetLastError(0xbadbad00);
143 hbmp
= CreateDIBitmap(hdc
, NULL
, CBM_INIT
, NULL
, &bmiBroken
, DIB_PAL_COLORS
);
145 ok_err(ERROR_INVALID_PARAMETER
);
147 SetLastError(0xbadbad00);
148 hbmp
= CreateDIBitmap(hdc
, &bmi
.bmiHeader
, CBM_INIT
, ajBits
, &bmi
, 2);
150 ok_err(ERROR_INVALID_PARAMETER
);
152 SetLastError(0xbadbad00);
153 hbmp
= CreateDIBitmap(hdc
, &bmi
.bmiHeader
, CBM_INIT
, ajBits
, NULL
, DIB_PAL_COLORS
);
157 SetLastError(0xbadbad00);
158 hbmp
= CreateDIBitmap(hdc
, &bmi
.bmiHeader
, CBM_INIT
, (PVOID
)0xc0000000, &bmi
, DIB_PAL_COLORS
);
162 SetLastError(0xbadbad00);
165 hbmp
= CreateDIBitmap(hdc
, &bmi
.bmiHeader
, 0, ajBits
, (PVOID
)0xc0000000, DIB_PAL_COLORS
);
167 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
172 ok(hbmp
== (HBITMAP
)-1, "\n");
175 SetLastError(0xbadbad00);
176 hbmp
= CreateDIBitmap(hdc
, &bmi
.bmiHeader
, CBM_INIT
, NULL
, NULL
, 5);
178 ok_err(ERROR_INVALID_PARAMETER
);
180 SetLastError(0xbadbad00);
181 hbmp
= CreateDIBitmap((HDC
)-1, &bmi
.bmiHeader
, CBM_INIT
, NULL
, &bmi
, DIB_PAL_COLORS
);
185 SetLastError(0xbadbad00);
186 hbmp
= CreateDIBitmap(hdc
, &bmiBroken
.bmiHeader
, CBM_INIT
, NULL
, &bmi
, DIB_PAL_COLORS
);
188 ok_err(ERROR_INVALID_PARAMETER
);
192 ULONG i1
, i2
, i3
, i4
, i5
, i6
;
193 HDC ahdc
[3] = {0, hdc
, (HDC
)-1};
194 PBITMAPINFOHEADER apbih
[4] = {NULL
, &bmi
.bmiHeader
, &bmiBroken
.bmiHeader
, (PVOID
)0xC0000000};
195 ULONG afInitf
[12] = {0, 1, 2, 3, CBM_INIT
, 4, 5, 6, 7, 8, 0x10, 0x20};
196 PVOID apvBits
[3] = {NULL
, ajBits
, (PVOID
)0xc0000000};
197 PBITMAPINFO apbmi
[4] = {NULL
, &bmi
, &bmiBroken
, (PVOID
)0xC0000000};
198 ULONG aiUsage
[5] = {0, 1, 2, 3, 23};
202 for (i1
= 0; i1
< 3; i1
++)
204 for (i2
= 0; i2
< 4; i2
++)
206 for (i3
= 0; i3
< 8; i3
++)
208 for (i4
= 0; i4
< 3; i4
++)
210 for (i5
= 0; i5
< 4; i5
++)
212 for (i6
= 0; i6
< 5; i6
++)
214 SetLastError(0xbadbad00);
215 dwExpError
= 0xbadbad00;
217 bExpSuccess
= GetExpected(&dwExpError
, ahdc
[i1
], apbih
[i2
], afInitf
[i3
], apvBits
[i4
], apbmi
[i5
], aiUsage
[i6
]);
221 hbmp
= CreateDIBitmap(ahdc
[i1
], apbih
[i2
], afInitf
[i3
], apvBits
[i4
], apbmi
[i5
], aiUsage
[i6
]);
223 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
231 ok(hbmp
!= 0, "Expected success for (%ld,%ld,%ld,%ld,%ld,%ld) CreateDIBitmap(%p, %p, 0x%lx, %p, %p, %ld)\n",
232 i1
, i2
, i3
, i4
, i5
, i6
,
233 ahdc
[i1
], apbih
[i2
], afInitf
[i3
], apvBits
[i4
], apbmi
[i5
], aiUsage
[i6
]);
237 ok(hbmp
== 0, "Expected failure for (%ld,%ld,%ld,%ld,%ld,%ld) CreateDIBitmap(%p, %p, 0x%lx, %p, %p, %ld)\n",
238 i1
, i2
, i3
, i4
, i5
, i6
,
239 ahdc
[i1
], apbih
[i2
], afInitf
[i3
], apvBits
[i4
], apbmi
[i5
], aiUsage
[i6
]);
242 // ok(GetLastError() == dwExpError, "Expected error %ld got %ld for (%ld,%ld,%ld,%ld,%ld,%ld) CreateDIBitmap(%p, %p, 0x%lx, %p, %p, %ld)\n",
243 // dwExpError, GetLastError(), i1, i2, i3, i4, i5, i6,
244 // ahdc[i1], apbih[i2], afInitf[i3], apvBits[i4], apbmi[i5], aiUsage[i6]);
257 Test_CreateDIBitmap_DIB_PAL_COLORS(void)
261 BITMAPINFOHEADER bmiHeader
;
264 BITMAPINFO
*pbmi
= (PVOID
)&bmibuffer
;
266 ULONG bits
[16] = {0};
271 hdc
= CreateCompatibleDC(0);
272 ok(hdc
!= 0, "failed\n");
274 /* Select a palette */
275 hpalOld
= SelectPalette(hdc
, ghpal
, FALSE
);
276 ok(hpalOld
!= NULL
, "error=%ld\n", GetLastError());
278 /* Initialize a BITMAPINFO */
279 pbmi
->bmiHeader
.biSize
= sizeof(BITMAPINFOHEADER
);
280 pbmi
->bmiHeader
.biWidth
= 2;
281 pbmi
->bmiHeader
.biHeight
= -2;
282 pbmi
->bmiHeader
.biPlanes
= 1;
283 pbmi
->bmiHeader
.biBitCount
= 8;
284 pbmi
->bmiHeader
.biCompression
= BI_RGB
;
285 pbmi
->bmiHeader
.biSizeImage
= 0;
286 pbmi
->bmiHeader
.biXPelsPerMeter
= 1;
287 pbmi
->bmiHeader
.biYPelsPerMeter
= 1;
288 pbmi
->bmiHeader
.biClrUsed
= 8;
289 pbmi
->bmiHeader
.biClrImportant
= 0;
291 for( i
= 0; i
< 8; i
++ )
293 bmibuffer
.bmiColors
[i
] = i
;
296 /* Create the bitmap */
297 hbmp
= CreateDIBitmap(hdc
, &pbmi
->bmiHeader
, CBM_INIT
, bits
, pbmi
, DIB_PAL_COLORS
);
298 ok(hbmp
!= 0, "failed\n");
300 SelectObject(hdc
, hbmp
);
306 Test_CreateDIBitmap1(void)
311 ULONG bits
[128] = {0};
312 BYTE rlebits
[] = {2, 0, 0, 0, 2, 1, 0, 1};
318 bmi
.bmiHeader
.biSize
= sizeof(BITMAPINFOHEADER
);
319 bmi
.bmiHeader
.biWidth
= 2;
320 bmi
.bmiHeader
.biHeight
= 2;
321 bmi
.bmiHeader
.biPlanes
= 1;
322 bmi
.bmiHeader
.biBitCount
= 16;
323 bmi
.bmiHeader
.biCompression
= BI_RGB
;
324 bmi
.bmiHeader
.biSizeImage
= 0;
325 bmi
.bmiHeader
.biXPelsPerMeter
= 1;
326 bmi
.bmiHeader
.biYPelsPerMeter
= 1;
327 bmi
.bmiHeader
.biClrUsed
= 0;
328 bmi
.bmiHeader
.biClrImportant
= 0;
330 hbmp
= CreateDIBitmap(hdc
, &bmi
.bmiHeader
, CBM_INIT
, bits
, &bmi
, DIB_RGB_COLORS
);
331 ok(hbmp
!= 0, "failed\n");
333 ret
= GetObject(hbmp
, sizeof(bitmap
), &bitmap
);
334 ok(ret
!= 0, "failed\n");
335 ok(bitmap
.bmType
== 0, "\n");
336 ok(bitmap
.bmWidth
== 2, "\n");
337 ok(bitmap
.bmHeight
== 2, "\n");
338 ok(bitmap
.bmWidthBytes
== 8, "bmWidthBytes = %ld\n", bitmap
.bmWidthBytes
);
339 ok(bitmap
.bmPlanes
== 1, "\n");
340 ok(bitmap
.bmBitsPixel
== GetDeviceCaps(hdc
, BITSPIXEL
), "\n");
341 ok(bitmap
.bmBits
== 0, "\n");
344 bmi
.bmiHeader
.biCompression
= BI_RLE8
;
345 bmi
.bmiHeader
.biBitCount
= 8;
346 bmi
.bmiHeader
.biSizeImage
= 8;
347 bmi
.bmiHeader
.biClrUsed
= 1;
348 hbmp
= CreateDIBitmap(hdc
, &bmi
.bmiHeader
, CBM_INIT
, rlebits
, &bmi
, DIB_PAL_COLORS
);
349 ok(hbmp
!= 0, "failed\n");
350 ok(GetLastError() == 0, "GetLastError() == %ld\n", GetLastError());
352 ret
= GetObject(hbmp
, sizeof(bitmap
), &bitmap
);
353 ok(ret
!= 0, "failed\n");
354 ok(bitmap
.bmType
== 0, "\n");
355 ok(bitmap
.bmWidth
== 2, "\n");
356 ok(bitmap
.bmHeight
== 2, "\n");
357 ok(bitmap
.bmWidthBytes
== 8, "bmWidthBytes = %ld\n", bitmap
.bmWidthBytes
);
358 ok(bitmap
.bmPlanes
== 1, "\n");
359 ok(bitmap
.bmBitsPixel
== GetDeviceCaps(hdc
, BITSPIXEL
), "\n");
360 ok(bitmap
.bmBits
== 0, "\n");
365 void Test_CreateDIBitmap_RLE8()
369 BITMAPINFOHEADER bmiHeader
;
374 {sizeof(BITMAPINFOHEADER
), 4, 4, 1, 8, BI_RLE8
, 20, 1, 1, 4, 0},
376 {4,0, 0,2,0,1,0,2,3,1, 2,1, 2,2, 1,3,1,0,1,2, },
381 hdc
= CreateCompatibleDC(0);
383 SetLastError(0xbadbad00);
384 hbmp
= CreateDIBitmap(hdc
, &PackedDIB
.bmiHeader
, CBM_INIT
, &PackedDIB
.ajBuffer
, (PVOID
)&PackedDIB
, DIB_PAL_COLORS
);
385 ok(hbmp
!= 0, "CreateDIBitmap failed.\n");
389 PackedDIB
.bmiHeader
.biSizeImage
= 2;
390 hbmp
= CreateDIBitmap(hdc
, &PackedDIB
.bmiHeader
, CBM_INIT
, &PackedDIB
.ajBuffer
, (PVOID
)&PackedDIB
, DIB_PAL_COLORS
);
391 ok(hbmp
!= 0, "CreateDIBitmap failed.\n");
395 PackedDIB
.bmiHeader
.biSizeImage
= 1;
396 hbmp
= CreateDIBitmap(hdc
, &PackedDIB
.bmiHeader
, CBM_INIT
, &PackedDIB
.ajBuffer
, (PVOID
)&PackedDIB
, DIB_PAL_COLORS
);
397 ok(hbmp
!= 0, "CreateDIBitmap failed.\n");
401 PackedDIB
.bmiHeader
.biSizeImage
= 0;
402 hbmp
= CreateDIBitmap(hdc
, &PackedDIB
.bmiHeader
, CBM_INIT
, &PackedDIB
.ajBuffer
, (PVOID
)&PackedDIB
, DIB_PAL_COLORS
);
403 ok(hbmp
== 0, "CreateDIBitmap succeeded, expected failure\n");
406 /* Test a line that is too long */
407 PackedDIB
.bmiHeader
.biSizeImage
= 20;
408 PackedDIB
.ajBuffer
[0] = 17;
409 hbmp
= CreateDIBitmap(hdc
, &PackedDIB
.bmiHeader
, CBM_INIT
, &PackedDIB
.ajBuffer
, (PVOID
)&PackedDIB
, DIB_PAL_COLORS
);
410 ok(hbmp
!= 0, "CreateDIBitmap failed\n");
418 Test_CreateDIBitmap_CBM_CREATDIB(void)
420 HBITMAP hbmp
, hbmpOld
;
423 {{sizeof(BITMAPINFOHEADER
), 4, 4, 1, 8, BI_RGB
, 0, 1, 1, 1, 0}, {{0,1,2,3}}};
424 BYTE ajBits
[10] = {0,1,2,3,4,5,6,7,8,9};
428 BITMAPINFOHEADER bmiHeader
;
432 {sizeof(BITMAPINFOHEADER
), 8, 2, 1, 8, BI_RLE8
, 20, 1, 1, 4, 0},
435 BYTE ajBitsRLE
[] = {4,0, 0,2,0,1,0,2,3,1, 2,1, 2,2, 1,3,1,0,1,2, };
437 hdc
= CreateCompatibleDC(0);
440 ok(0, "CreateCompatibleDC failed. Skipping tests!\n");
444 SetLastError(0xbadbad00);
445 hbmp
= CreateDIBitmap(hdc
, NULL
, CBM_CREATDIB
, ajBits
, NULL
, DIB_RGB_COLORS
);
446 ok(hbmp
== 0, "CreateDIBitmap should fail.\n");
447 ok_int(GetLastError(), 0xbadbad00);
449 hbmp
= CreateDIBitmap(hdc
, NULL
, CBM_CREATDIB
, ajBits
, &bmi
, DIB_RGB_COLORS
);
450 ok(hbmp
!= 0, "CreateDIBitmap failed.\n");
452 ok_long(GetObject(hbmp
, sizeof(DIBSECTION
), &bitmap
), sizeof(BITMAP
));
453 ok_int(bitmap
.bmType
, 0);
454 ok_int(bitmap
.bmWidth
, 4);
455 ok_int(bitmap
.bmHeight
, 4);
456 ok_int(bitmap
.bmWidthBytes
, 4);
457 ok_int(bitmap
.bmPlanes
, 1);
458 ok_int(bitmap
.bmBitsPixel
, 8);
459 ok_ptr(bitmap
.bmBits
, 0);
461 hbmpOld
= SelectObject(hdc
, hbmp
);
462 ok(hbmpOld
!= NULL
, "Couldn't select the bitmap.\n");
464 /* Copy it on a dib section */
465 memset(gpDIB32
, 0x77, sizeof(*gpDIB32
));
466 ok_long(BitBlt(ghdcDIB32
, 0, 0, 4, 4, hdc
, 0, 0, SRCCOPY
), 1);
467 ok_long((*gpDIB32
)[0][0], 0x20100);
468 ok_long((*gpDIB32
)[0][1], 0x20100);
469 ok_long((*gpDIB32
)[0][2], 0x20100);
470 ok_long((*gpDIB32
)[0][3], 0x20100);
472 SelectObject(hdc
, hbmpOld
);
475 hbmp
= CreateDIBitmap(hdc
, NULL
, CBM_CREATDIB
| CBM_INIT
, ajBits
, &bmi
, DIB_PAL_COLORS
);
476 ok(hbmp
!= 0, "CreateDIBitmap failed.\n");
478 ok_long(GetObject(hbmp
, sizeof(DIBSECTION
), &bitmap
), sizeof(BITMAP
));
479 ok_int(bitmap
.bmType
, 0);
480 ok_int(bitmap
.bmWidth
, 4);
481 ok_int(bitmap
.bmHeight
, 4);
482 ok_int(bitmap
.bmWidthBytes
, 4);
483 ok_int(bitmap
.bmPlanes
, 1);
484 ok_int(bitmap
.bmBitsPixel
, 8);
485 ok_ptr(bitmap
.bmBits
, 0);
487 /* Even with CBM_INIT and lpbmih != 0, pbmi is used for the dimensions */
488 hbmp
= CreateDIBitmap(hdc
, &bmiRLE
.bmiHeader
, CBM_CREATDIB
| CBM_INIT
, ajBits
, &bmi
, DIB_PAL_COLORS
);
489 ok(hbmp
!= 0, "CreateDIBitmap failed.\n");
491 ok_long(GetObject(hbmp
, sizeof(DIBSECTION
), &bitmap
), sizeof(BITMAP
));
492 ok_int(bitmap
.bmType
, 0);
493 ok_int(bitmap
.bmWidth
, 4);
494 ok_int(bitmap
.bmHeight
, 4);
495 ok_int(bitmap
.bmWidthBytes
, 4);
496 ok_int(bitmap
.bmPlanes
, 1);
497 ok_int(bitmap
.bmBitsPixel
, 8);
498 ok_ptr(bitmap
.bmBits
, 0);
500 hbmpOld
= SelectObject(hdc
, hbmp
);
501 ok(hbmpOld
!= NULL
, "Couldn't select the bitmap.\n");
503 /* Copy it on a dib section */
504 memset(gpDIB32
, 0x77, sizeof(*gpDIB32
));
505 ok_long(BitBlt(ghdcDIB32
, 0, 0, 4, 4, hdc
, 0, 0, SRCCOPY
), 1);
506 ok_long((*gpDIB32
)[0][0], 0);
507 ok_long((*gpDIB32
)[0][1], 0);
508 ok_long((*gpDIB32
)[0][2], 0);
509 ok_long((*gpDIB32
)[0][3], 0);
511 SelectObject(hdc
, hbmpOld
);
514 hbmp
= CreateDIBitmap(hdc
, NULL
, CBM_CREATDIB
, ajBitsRLE
, (PVOID
)&bmiRLE
, DIB_PAL_COLORS
);
515 ok(hbmp
== 0, "CreateDIBitmap should fail.\n");
516 hbmp
= CreateDIBitmap(hdc
, NULL
, CBM_INIT
| CBM_CREATDIB
, ajBitsRLE
, (PVOID
)&bmiRLE
, DIB_PAL_COLORS
);
517 ok(hbmp
== 0, "CreateDIBitmap should fail.\n");
519 /* Check if a 0 pixel bitmap results in the DEFAULT_BITMAP being returned */
520 bmi
.bmiHeader
.biWidth
= 0;
521 bmi
.bmiHeader
.biHeight
= 4;
522 hbmp
= CreateDIBitmap(hdc
, &bmi
.bmiHeader
, CBM_CREATDIB
, ajBits
, &bmi
, DIB_PAL_COLORS
);
523 ok(hbmp
== GetStockObject(21), "CreateDIBitmap didn't return the default bitmap.\n");
524 bmi
.bmiHeader
.biWidth
= 23;
525 bmi
.bmiHeader
.biHeight
= 0;
526 hbmp
= CreateDIBitmap(hdc
, &bmi
.bmiHeader
, CBM_CREATDIB
, ajBits
, &bmi
, DIB_PAL_COLORS
);
527 ok(hbmp
== GetStockObject(21), "CreateDIBitmap didn't return the default bitmap.\n");
532 START_TEST(CreateDIBitmap
)
535 Test_CreateDIBitmap_Params();
536 Test_CreateDIBitmap1();
537 Test_CreateDIBitmap_DIB_PAL_COLORS();
538 Test_CreateDIBitmap_RLE8();
539 Test_CreateDIBitmap_CBM_CREATDIB();