2 * PROJECT: ReactOS api tests
3 * LICENSE: GPL - See COPYING in the top level directory
4 * PURPOSE: Test for CreateDIBitmap
5 * PROGRAMMERS: Timo Kreuzer
13 #define CBM_CREATDIB 2
19 const BITMAPINFOHEADER
*lpbmih
,
22 const BITMAPINFO
*lpbmi
,
27 *pdwError
= ERROR_INVALID_PARAMETER
;
31 if (fuUsage
!= DIB_RGB_COLORS
)
39 if (fdwInit
& CBM_INIT
)
43 if (!lpbInit
|| (lpbInit
== (PVOID
)0xC0000000)) return FALSE
;
49 if (lpbInit
== (PVOID
)0xC0000000) return FALSE
;
50 if (!lpbmi
|| (lpbmi
== (PVOID
)0xC0000000)) return FALSE
;
51 if (lpbmi
->bmiHeader
.biSize
== 0) return FALSE
;
52 if (fuUsage
== 2) return FALSE
;
58 if (fdwInit
& CBM_CREATDIB
)
60 if (fuUsage
== 2) return FALSE
;
61 if ((fuUsage
== DIB_PAL_COLORS
) && !hdc
)
66 if ((fdwInit
& CBM_INIT
))
68 if (!lpbInit
|| (lpbInit
== (PVOID
)0xC0000000)) return FALSE
;
71 if ((!lpbmi
) || (lpbmi
== (PVOID
)0xc0000000) || (lpbmi
->bmiHeader
.biSize
== 0))
79 if ((lpbmih
== NULL
) ||
80 (lpbmih
== (PVOID
)0xC0000000) ||
81 (lpbmih
->biSize
== 0))
88 *pdwError
= ERROR_INVALID_PARAMETER
;
93 if (lpbmi
== (PVOID
)0xc0000000) return FALSE
;
101 Test_CreateDIBitmap_Params(void)
106 {{sizeof(BITMAPINFOHEADER
), 4, 4, 1, 8, BI_RGB
, 0, 1, 1, 1, 0}, {{0,0,0,0}}};
107 BITMAPINFO bmiBroken
=
108 {{0, -2, -4, 55, 42, 21, 0, 1, 1, 1, 0}, {{0,0,0,0}}};
111 hdc
= CreateCompatibleDC(0);
112 ok(hdc
!= 0, "failed\n");
114 hbmp
= CreateDIBitmap(hdc
, &bmi
.bmiHeader
, CBM_INIT
, ajBits
, &bmi
, DIB_PAL_COLORS
);
117 hbmp
= CreateDIBitmap(hdc
, &bmi
.bmiHeader
, CBM_INIT
, NULL
, &bmi
, DIB_PAL_COLORS
);
120 hbmp
= CreateDIBitmap(hdc
, &bmi
.bmiHeader
, CBM_INIT
, NULL
, NULL
, DIB_PAL_COLORS
);
123 hbmp
= CreateDIBitmap(hdc
, &bmi
.bmiHeader
, 0, (PVOID
)0xc0000000, &bmi
, DIB_PAL_COLORS
);
126 hbmp
= CreateDIBitmap(NULL
, &bmi
.bmiHeader
, CBM_INIT
, NULL
, &bmi
, DIB_PAL_COLORS
);
129 hbmp
= CreateDIBitmap(hdc
, &bmi
.bmiHeader
, CBM_INIT
, NULL
, &bmiBroken
, DIB_PAL_COLORS
);
132 hbmp
= CreateDIBitmap(NULL
, NULL
, 2, NULL
, &bmi
, 0);
135 SetLastError(0xbadbad00);
136 hbmp
= CreateDIBitmap(hdc
, NULL
, CBM_INIT
, ajBits
, &bmi
, DIB_PAL_COLORS
);
138 ok_err(ERROR_INVALID_PARAMETER
);
140 SetLastError(0xbadbad00);
141 hbmp
= CreateDIBitmap(hdc
, NULL
, CBM_INIT
, NULL
, &bmiBroken
, DIB_PAL_COLORS
);
143 ok_err(ERROR_INVALID_PARAMETER
);
145 SetLastError(0xbadbad00);
146 hbmp
= CreateDIBitmap(hdc
, &bmi
.bmiHeader
, CBM_INIT
, ajBits
, &bmi
, 2);
148 ok_err(ERROR_INVALID_PARAMETER
);
150 SetLastError(0xbadbad00);
151 hbmp
= CreateDIBitmap(hdc
, &bmi
.bmiHeader
, CBM_INIT
, ajBits
, NULL
, DIB_PAL_COLORS
);
155 SetLastError(0xbadbad00);
156 hbmp
= CreateDIBitmap(hdc
, &bmi
.bmiHeader
, CBM_INIT
, (PVOID
)0xc0000000, &bmi
, DIB_PAL_COLORS
);
160 SetLastError(0xbadbad00);
163 hbmp
= CreateDIBitmap(hdc
, &bmi
.bmiHeader
, 0, ajBits
, (PVOID
)0xc0000000, DIB_PAL_COLORS
);
165 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
170 ok(hbmp
== (HBITMAP
)-1, "\n");
173 SetLastError(0xbadbad00);
174 hbmp
= CreateDIBitmap(hdc
, &bmi
.bmiHeader
, CBM_INIT
, NULL
, NULL
, 5);
176 ok_err(ERROR_INVALID_PARAMETER
);
178 SetLastError(0xbadbad00);
179 hbmp
= CreateDIBitmap((HDC
)-1, &bmi
.bmiHeader
, CBM_INIT
, NULL
, &bmi
, DIB_PAL_COLORS
);
183 SetLastError(0xbadbad00);
184 hbmp
= CreateDIBitmap(hdc
, &bmiBroken
.bmiHeader
, CBM_INIT
, NULL
, &bmi
, DIB_PAL_COLORS
);
186 ok_err(ERROR_INVALID_PARAMETER
);
190 ULONG i1
, i2
, i3
, i4
, i5
, i6
;
191 HDC ahdc
[3] = {0, hdc
, (HDC
)-1};
192 PBITMAPINFOHEADER apbih
[4] = {NULL
, &bmi
.bmiHeader
, &bmiBroken
.bmiHeader
, (PVOID
)0xC0000000};
193 ULONG afInitf
[12] = {0, 1, 2, 3, CBM_INIT
, 4, 5, 6, 7, 8, 0x10, 0x20};
194 PVOID apvBits
[3] = {NULL
, ajBits
, (PVOID
)0xc0000000};
195 PBITMAPINFO apbmi
[4] = {NULL
, &bmi
, &bmiBroken
, (PVOID
)0xC0000000};
196 ULONG aiUsage
[5] = {0, 1, 2, 3, 23};
200 for (i1
= 0; i1
< 3; i1
++)
202 for (i2
= 0; i2
< 4; i2
++)
204 for (i3
= 0; i3
< 8; i3
++)
206 for (i4
= 0; i4
< 3; i4
++)
208 for (i5
= 0; i5
< 4; i5
++)
210 for (i6
= 0; i6
< 5; i6
++)
212 SetLastError(0xbadbad00);
213 dwExpError
= 0xbadbad00;
215 bExpSuccess
= GetExpected(&dwExpError
, ahdc
[i1
], apbih
[i2
], afInitf
[i3
], apvBits
[i4
], apbmi
[i5
], aiUsage
[i6
]);
219 hbmp
= CreateDIBitmap(ahdc
[i1
], apbih
[i2
], afInitf
[i3
], apvBits
[i4
], apbmi
[i5
], aiUsage
[i6
]);
221 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
229 ok(hbmp
!= 0, "Expected success for (%ld,%ld,%ld,%ld,%ld,%ld) CreateDIBitmap(%p, %p, 0x%lx, %p, %p, %ld)\n",
230 i1
, i2
, i3
, i4
, i5
, i6
,
231 ahdc
[i1
], apbih
[i2
], afInitf
[i3
], apvBits
[i4
], apbmi
[i5
], aiUsage
[i6
]);
235 ok(hbmp
== 0, "Expected failure for (%ld,%ld,%ld,%ld,%ld,%ld) CreateDIBitmap(%p, %p, 0x%lx, %p, %p, %ld)\n",
236 i1
, i2
, i3
, i4
, i5
, i6
,
237 ahdc
[i1
], apbih
[i2
], afInitf
[i3
], apvBits
[i4
], apbmi
[i5
], aiUsage
[i6
]);
240 // ok(GetLastError() == dwExpError, "Expected error %ld got %ld for (%ld,%ld,%ld,%ld,%ld,%ld) CreateDIBitmap(%p, %p, 0x%lx, %p, %p, %ld)\n",
241 // dwExpError, GetLastError(), i1, i2, i3, i4, i5, i6,
242 // ahdc[i1], apbih[i2], afInitf[i3], apvBits[i4], apbmi[i5], aiUsage[i6]);
255 Test_CreateDIBitmap_DIB_PAL_COLORS(void)
259 BITMAPINFOHEADER bmiHeader
;
262 BITMAPINFO
*pbmi
= (PVOID
)&bmibuffer
;
264 ULONG bits
[16] = {0};
269 hdc
= CreateCompatibleDC(0);
270 ok(hdc
!= 0, "failed\n");
272 /* Select a palette */
273 hpalOld
= SelectPalette(hdc
, ghpal
, FALSE
);
274 ok(hpalOld
!= NULL
, "error=%ld\n", GetLastError());
276 /* Initialize a BITMAPINFO */
277 pbmi
->bmiHeader
.biSize
= sizeof(BITMAPINFOHEADER
);
278 pbmi
->bmiHeader
.biWidth
= 2;
279 pbmi
->bmiHeader
.biHeight
= -2;
280 pbmi
->bmiHeader
.biPlanes
= 1;
281 pbmi
->bmiHeader
.biBitCount
= 8;
282 pbmi
->bmiHeader
.biCompression
= BI_RGB
;
283 pbmi
->bmiHeader
.biSizeImage
= 0;
284 pbmi
->bmiHeader
.biXPelsPerMeter
= 1;
285 pbmi
->bmiHeader
.biYPelsPerMeter
= 1;
286 pbmi
->bmiHeader
.biClrUsed
= 8;
287 pbmi
->bmiHeader
.biClrImportant
= 0;
289 for( i
= 0; i
< 8; i
++ )
291 bmibuffer
.bmiColors
[i
] = i
;
294 /* Create the bitmap */
295 hbmp
= CreateDIBitmap(hdc
, &pbmi
->bmiHeader
, CBM_INIT
, bits
, pbmi
, DIB_PAL_COLORS
);
296 ok(hbmp
!= 0, "failed\n");
298 SelectObject(hdc
, hbmp
);
304 Test_CreateDIBitmap1(void)
309 ULONG bits
[128] = {0};
310 BYTE rlebits
[] = {2, 0, 0, 0, 2, 1, 0, 1};
316 bmi
.bmiHeader
.biSize
= sizeof(BITMAPINFOHEADER
);
317 bmi
.bmiHeader
.biWidth
= 2;
318 bmi
.bmiHeader
.biHeight
= 2;
319 bmi
.bmiHeader
.biPlanes
= 1;
320 bmi
.bmiHeader
.biBitCount
= 16;
321 bmi
.bmiHeader
.biCompression
= BI_RGB
;
322 bmi
.bmiHeader
.biSizeImage
= 0;
323 bmi
.bmiHeader
.biXPelsPerMeter
= 1;
324 bmi
.bmiHeader
.biYPelsPerMeter
= 1;
325 bmi
.bmiHeader
.biClrUsed
= 0;
326 bmi
.bmiHeader
.biClrImportant
= 0;
328 hbmp
= CreateDIBitmap(hdc
, &bmi
.bmiHeader
, CBM_INIT
, bits
, &bmi
, DIB_RGB_COLORS
);
329 ok(hbmp
!= 0, "failed\n");
331 ret
= GetObject(hbmp
, sizeof(bitmap
), &bitmap
);
332 ok(ret
!= 0, "failed\n");
333 ok(bitmap
.bmType
== 0, "\n");
334 ok(bitmap
.bmWidth
== 2, "\n");
335 ok(bitmap
.bmHeight
== 2, "\n");
336 ok(bitmap
.bmWidthBytes
== 8, "bmWidthBytes = %ld\n", bitmap
.bmWidthBytes
);
337 ok(bitmap
.bmPlanes
== 1, "\n");
338 ok(bitmap
.bmBitsPixel
== GetDeviceCaps(hdc
, BITSPIXEL
), "\n");
339 ok(bitmap
.bmBits
== 0, "\n");
342 bmi
.bmiHeader
.biCompression
= BI_RLE8
;
343 bmi
.bmiHeader
.biBitCount
= 8;
344 bmi
.bmiHeader
.biSizeImage
= 8;
345 bmi
.bmiHeader
.biClrUsed
= 1;
346 hbmp
= CreateDIBitmap(hdc
, &bmi
.bmiHeader
, CBM_INIT
, rlebits
, &bmi
, DIB_PAL_COLORS
);
347 ok(hbmp
!= 0, "failed\n");
348 ok(GetLastError() == 0, "GetLastError() == %ld\n", GetLastError());
350 ret
= GetObject(hbmp
, sizeof(bitmap
), &bitmap
);
351 ok(ret
!= 0, "failed\n");
352 ok(bitmap
.bmType
== 0, "\n");
353 ok(bitmap
.bmWidth
== 2, "\n");
354 ok(bitmap
.bmHeight
== 2, "\n");
355 ok(bitmap
.bmWidthBytes
== 8, "bmWidthBytes = %ld\n", bitmap
.bmWidthBytes
);
356 ok(bitmap
.bmPlanes
== 1, "\n");
357 ok(bitmap
.bmBitsPixel
== GetDeviceCaps(hdc
, BITSPIXEL
), "\n");
358 ok(bitmap
.bmBits
== 0, "\n");
363 void Test_CreateDIBitmap_RLE8()
367 BITMAPINFOHEADER bmiHeader
;
372 {sizeof(BITMAPINFOHEADER
), 4, 4, 1, 8, BI_RLE8
, 20, 1, 1, 4, 0},
374 {4,0, 0,2,0,1,0,2,3,1, 2,1, 2,2, 1,3,1,0,1,2, },
379 hdc
= CreateCompatibleDC(0);
381 SetLastError(0xbadbad00);
382 hbmp
= CreateDIBitmap(hdc
, &PackedDIB
.bmiHeader
, CBM_INIT
, &PackedDIB
.ajBuffer
, (PVOID
)&PackedDIB
, DIB_PAL_COLORS
);
383 ok(hbmp
!= 0, "CreateDIBitmap failed.\n");
387 PackedDIB
.bmiHeader
.biSizeImage
= 2;
388 hbmp
= CreateDIBitmap(hdc
, &PackedDIB
.bmiHeader
, CBM_INIT
, &PackedDIB
.ajBuffer
, (PVOID
)&PackedDIB
, DIB_PAL_COLORS
);
389 ok(hbmp
!= 0, "CreateDIBitmap failed.\n");
393 PackedDIB
.bmiHeader
.biSizeImage
= 1;
394 hbmp
= CreateDIBitmap(hdc
, &PackedDIB
.bmiHeader
, CBM_INIT
, &PackedDIB
.ajBuffer
, (PVOID
)&PackedDIB
, DIB_PAL_COLORS
);
395 ok(hbmp
!= 0, "CreateDIBitmap failed.\n");
399 PackedDIB
.bmiHeader
.biSizeImage
= 0;
400 hbmp
= CreateDIBitmap(hdc
, &PackedDIB
.bmiHeader
, CBM_INIT
, &PackedDIB
.ajBuffer
, (PVOID
)&PackedDIB
, DIB_PAL_COLORS
);
401 ok(hbmp
== 0, "CreateDIBitmap succeeded, expeted failure\n");
404 /* Test a line that is too long */
405 PackedDIB
.bmiHeader
.biSizeImage
= 20;
406 PackedDIB
.ajBuffer
[0] = 17;
407 hbmp
= CreateDIBitmap(hdc
, &PackedDIB
.bmiHeader
, CBM_INIT
, &PackedDIB
.ajBuffer
, (PVOID
)&PackedDIB
, DIB_PAL_COLORS
);
408 ok(hbmp
!= 0, "CreateDIBitmap failed\n");
416 Test_CreateDIBitmap_CBM_CREATDIB(void)
421 {{sizeof(BITMAPINFOHEADER
), 4, 4, 1, 8, BI_RGB
, 0, 1, 1, 1, 0}, {{0,0,0,0}}};
425 hdc
= CreateCompatibleDC(0);
426 ok(hdc
!= 0, "failed\n");
428 hbmp
= CreateDIBitmap(hdc
, &bmi
.bmiHeader
, CBM_CREATDIB
, ajBits
, &bmi
, DIB_PAL_COLORS
);
429 ok(hbmp
!= 0, "CreateDIBitmap failed.\n");
431 ok_long(GetObject(hbmp
, sizeof(DIBSECTION
), &bitmap
), sizeof(BITMAP
));
432 ok_int(bitmap
.bmType
, 0);
433 ok_int(bitmap
.bmWidth
, 4);
434 ok_int(bitmap
.bmHeight
, 4);
435 ok_int(bitmap
.bmWidthBytes
, 4);
436 ok_int(bitmap
.bmPlanes
, 1);
437 ok_int(bitmap
.bmBitsPixel
, 8);
438 ok_ptr(bitmap
.bmBits
, 0);
442 START_TEST(CreateDIBitmap
)
445 Test_CreateDIBitmap_Params();
446 Test_CreateDIBitmap1();
447 Test_CreateDIBitmap_DIB_PAL_COLORS();
448 Test_CreateDIBitmap_RLE8();
449 Test_CreateDIBitmap_CBM_CREATDIB();