2 * PROJECT: ReactOS api tests
3 * LICENSE: GPL - See COPYING in the top level directory
4 * PURPOSE: Test for NtGdiCreateDIBSection
13 NtGdiCreateDIBSection(
15 IN OPTIONAL HANDLE hSection,
21 IN ULONG_PTR dwColorSpace,
26 GetBitmapSize(BITMAPINFOHEADER
*pbih
)
28 ULONG WidthBits
, WidthBytes
;
30 WidthBits
= pbih
->biWidth
* pbih
->biBitCount
* pbih
->biPlanes
;
31 WidthBytes
= ((WidthBits
+ 31) & ~ 31) >> 3;
33 return pbih
->biHeight
* WidthBytes
;
37 START_TEST(NtGdiCreateDIBSection
)
44 DIBSECTION dibsection
;
48 BITMAPINFOHEADER bmiHeader
;
49 RGBQUAD bmiColors
[100];
51 PBITMAPINFO pbmi
= (PBITMAPINFO
)&bmi
;
52 PBITMAPINFOHEADER pbih
= (PBITMAPINFOHEADER
)&bmi
.bmiHeader
;
53 PBITMAPV4HEADER pbV4h
= (PBITMAPV4HEADER
)&bmi
.bmiHeader
;
54 PBITMAPV5HEADER pbV5h
= (PBITMAPV5HEADER
)&bmi
.bmiHeader
;
58 LARGE_INTEGER MaximumSize
;
61 pbih
->biSize
= sizeof(BITMAPINFOHEADER
);
66 pbih
->biCompression
= BI_RGB
;
67 pbih
->biSizeImage
= 0;
68 pbih
->biXPelsPerMeter
= 100;
69 pbih
->biYPelsPerMeter
= 100;
71 pbih
->biClrImportant
= 2;
75 /** iUsage = 0 (DIB_RGB_COLORS) ***********************************************/
77 cjHeader
= bmi
.bmiHeader
.biSize
+ cEntries
* 4 + 8;
79 /* Test something simple */
82 hbmp
= NtGdiCreateDIBSection(hDC
, NULL
, 0, pbmi
, 0, cjHeader
, 0, 0, &pvBits
);
85 // TEST(GetLastError() == 0);
86 TEST(GetObject(hbmp
, sizeof(DIBSECTION
), &dibsection
) == sizeof(DIBSECTION
));
87 TEST(dibsection
.dsBitfields
[0] == 0);
88 TEST(dibsection
.dsBitfields
[1] == 0);
89 TEST(dibsection
.dsBitfields
[2] == 0);
90 TEST(dibsection
.dshSection
== 0);
91 TEST(dibsection
.dsOffset
== 0);
92 if (hbmp
) DeleteObject(hbmp
);
98 hbmp
= NtGdiCreateDIBSection(0, NULL
, 0, pbmi
, 0, cjHeader
, 0, 0, &pvBits
);
101 TEST(GetLastError() == ERROR_NOT_ENOUGH_MEMORY
);
102 if (hbmp
) DeleteObject(hbmp
);
104 /* Test a wrong HDC */
107 hbmp
= NtGdiCreateDIBSection((HDC
)0xdeadbeef, NULL
, 0, pbmi
, 0, cjHeader
, 0, 0, &pvBits
);
110 TEST(GetLastError() == 8);
111 if (hbmp
) DeleteObject(hbmp
);
113 /* Test pbmi = NULL */
116 hbmp
= NtGdiCreateDIBSection(hDC
, NULL
, 0, NULL
, 0, cjHeader
, 0, 0, &pvBits
);
117 TEST(pvBits
== (PVOID
)-1);
119 TEST(GetLastError() == 0);
120 if (hbmp
) DeleteObject(hbmp
);
122 /* Test invalid pbmi */
125 hbmp
= NtGdiCreateDIBSection(hDC
, NULL
, 0, (PVOID
)0x80001234, 0, cjHeader
, 0, 0, &pvBits
);
126 TEST(pvBits
== (PVOID
)-1);
128 TEST(GetLastError() == ERROR_INVALID_PARAMETER
);
129 if (hbmp
) DeleteObject(hbmp
);
131 /* Test invalid pbmi */
134 hbmp
= NtGdiCreateDIBSection(hDC
, NULL
, 0, (PVOID
)1, 0, cjHeader
, 0, 0, &pvBits
);
135 TEST(pvBits
== (PVOID
)-1);
137 TEST(GetLastError() == ERROR_INVALID_PARAMETER
);
138 if (hbmp
) DeleteObject(hbmp
);
140 /* Test ppvBits = NULL */
142 hbmp
= NtGdiCreateDIBSection(0, NULL
, 0, pbmi
, 0, cjHeader
, 0, 0, NULL
);
144 TEST(GetLastError() == ERROR_INVALID_PARAMETER
);
145 if (hbmp
) DeleteObject(hbmp
);
147 /* Test ppvBits = NULL and pbmi == 0*/
149 hbmp
= NtGdiCreateDIBSection(0, NULL
, 0, NULL
, 0, cjHeader
, 0, 0, NULL
);
151 TEST(GetLastError() == 0);
152 if (hbmp
) DeleteObject(hbmp
);
154 /* Test ppvBits = NULL and wrong cjHeader */
156 hbmp
= NtGdiCreateDIBSection(0, NULL
, 0, pbmi
, 0, cjHeader
+4, 0, 0, NULL
);
158 TEST(GetLastError() == 0);
159 if (hbmp
) DeleteObject(hbmp
);
161 /* Test ppvBits = NULL and cjHeader = 0 */
163 hbmp
= NtGdiCreateDIBSection(0, NULL
, 0, pbmi
, 0, 0, 0, 0, NULL
);
165 TEST(GetLastError() == 0);
166 if (hbmp
) DeleteObject(hbmp
);
168 /* Test wrong cjHeader */
171 hbmp
= NtGdiCreateDIBSection(hDC
, NULL
, 0, pbmi
, 0, cjHeader
+4, 0, 0, &pvBits
);
174 TEST(GetLastError() == 0);
175 if (hbmp
) DeleteObject(hbmp
);
177 /* Test different bitcount */
178 pbih
->biBitCount
= 4;
179 hbmp
= NtGdiCreateDIBSection(hDC
, NULL
, 0, pbmi
, 0, cjHeader
, 0, 0, &pvBits
);
181 if (hbmp
) DeleteObject(hbmp
);
183 pbih
->biBitCount
= 8;
184 hbmp
= NtGdiCreateDIBSection(hDC
, NULL
, 0, pbmi
, 0, cjHeader
, 0, 0, &pvBits
);
186 if (hbmp
) DeleteObject(hbmp
);
188 cjHeader
= pbih
->biSize
;
189 pbih
->biBitCount
= 16;
190 hbmp
= NtGdiCreateDIBSection(hDC
, NULL
, 0, pbmi
, 0, cjHeader
, 0, 0, &pvBits
);
192 if (hbmp
) DeleteObject(hbmp
);
194 pbih
->biBitCount
= 24;
195 hbmp
= NtGdiCreateDIBSection(hDC
, NULL
, 0, pbmi
, 0, cjHeader
, 0, 0, &pvBits
);
197 if (hbmp
) DeleteObject(hbmp
);
199 pbih
->biBitCount
= 32;
200 hbmp
= NtGdiCreateDIBSection(hDC
, NULL
, 0, pbmi
, 0, cjHeader
, 0, 0, &pvBits
);
202 if (hbmp
) DeleteObject(hbmp
);
204 /* Test BI_BITFIELDS */
206 cjHeader
= pbih
->biSize
+ cEntries
* sizeof(DWORD
);
207 pbih
->biBitCount
= 16;
208 pbih
->biCompression
= BI_BITFIELDS
;
209 ((DWORD
*)pbmi
->bmiColors
)[0] = 0x0007;
210 ((DWORD
*)pbmi
->bmiColors
)[1] = 0x0038;
211 ((DWORD
*)pbmi
->bmiColors
)[2] = 0x01C0;
212 hbmp
= NtGdiCreateDIBSection(hDC
, NULL
, 0, pbmi
, 0, cjHeader
, 0, 0, &pvBits
);
214 TEST(GetObject(hbmp
, sizeof(DIBSECTION
), &dibsection
) == sizeof(DIBSECTION
));
215 TEST(dibsection
.dsBm
.bmType
== 0);
216 TEST(dibsection
.dsBm
.bmWidth
== 2);
217 TEST(dibsection
.dsBm
.bmHeight
== 2);
218 TEST(dibsection
.dsBm
.bmWidthBytes
== 4);
219 TEST(dibsection
.dsBm
.bmPlanes
== 1);
220 TEST(dibsection
.dsBm
.bmBitsPixel
== 16);
221 TEST(dibsection
.dsBm
.bmBits
== pvBits
);
222 TEST(dibsection
.dsBmih
.biSize
== sizeof(BITMAPINFOHEADER
));
223 TEST(dibsection
.dsBmih
.biWidth
== 2);
224 TEST(dibsection
.dsBmih
.biHeight
== 2);
225 TEST(dibsection
.dsBmih
.biPlanes
== 1);
226 TEST(dibsection
.dsBmih
.biBitCount
== 16);
227 TEST(dibsection
.dsBmih
.biCompression
== BI_BITFIELDS
);
228 TEST(dibsection
.dsBmih
.biSizeImage
== 8);
229 TEST(dibsection
.dsBmih
.biXPelsPerMeter
== 0);
230 TEST(dibsection
.dsBmih
.biYPelsPerMeter
== 0);
231 TEST(dibsection
.dsBmih
.biClrUsed
== 0);
232 TEST(dibsection
.dsBmih
.biClrImportant
== 0);
233 TEST(dibsection
.dsBitfields
[0] == 0x0007);
234 TEST(dibsection
.dsBitfields
[1] == 0x0038);
235 TEST(dibsection
.dsBitfields
[2] == 0x01C0);
236 TEST(dibsection
.dshSection
== 0);
237 TEST(dibsection
.dsOffset
== 0);
239 printf("dib with bitfileds: %p\n", hbmp
);
242 if (hbmp
) DeleteObject(hbmp
);
245 /* Test BI_BITFIELDS */
249 pbih
->biSize
= sizeof(BITMAPINFOHEADER
);
253 pbih
->biBitCount
= 4;
254 pbih
->biCompression
= BI_RGB
;
255 pbih
->biSizeImage
= 0;
256 pbih
->biXPelsPerMeter
= 100;
257 pbih
->biYPelsPerMeter
= 100;
259 pbih
->biClrImportant
= 0;
260 ((DWORD
*)pbmi
->bmiColors
)[0] = 0xF800;
261 ((DWORD
*)pbmi
->bmiColors
)[1] = 0x00ff00;
262 ((DWORD
*)pbmi
->bmiColors
)[2] = 0x0000ff;
264 cjHeader
= bmi
.bmiHeader
.biSize
+ cEntries
* 4 + 20;
267 /** iUsage = 1 (DIB_PAL_COLORS) ***********************************************/
269 pbmi
->bmiHeader
.biClrUsed
= 2;
270 pbmi
->bmiHeader
.biClrImportant
= 2;
273 cjHeader
= bmi
.bmiHeader
.biSize
+ cEntries
* 4 + 8;
275 /* Test iUsage = 1 */
278 hbmp
= NtGdiCreateDIBSection(hDC
, NULL
, 0, pbmi
, 1, cjHeader
, 0, 0, &pvBits
);
279 TEST(pvBits
== (PVOID
)-1);
281 TEST(GetLastError() == 0);
282 if (hbmp
) DeleteObject(hbmp
);
286 /** iUsage = 2 (???) **********************************************************/
288 /* Test iUsage = 2 */
291 hbmp
= NtGdiCreateDIBSection(hDC
, NULL
, 0, pbmi
, 2, cjHeader
, 0, 0, &pvBits
);
292 TEST(pvBits
== (PVOID
)-1);
294 TEST(GetLastError() == 0);
295 if (hbmp
) DeleteObject(hbmp
);
298 /** wrong iUsage **************************************************************/
301 cjHeader
= bmi
.bmiHeader
.biSize
+ cEntries
* 4 + 8;
303 /* Test iUsage = 3 */
306 hbmp
= NtGdiCreateDIBSection(hDC
, NULL
, 0, pbmi
, 3, cjHeader
, 0, 0, &pvBits
);
307 TEST(pvBits
== (PVOID
)-1);
309 TEST(GetLastError() == ERROR_INVALID_PARAMETER
);
310 if (hbmp
) DeleteObject(hbmp
);
312 /* Test iUsage = 3 */
315 hbmp
= NtGdiCreateDIBSection(hDC
, NULL
, 0, pbmi
, 3, cjHeader
+4, 0, 0, &pvBits
);
316 TEST(pvBits
== (PVOID
)-1);
318 TEST(GetLastError() == 0);
319 if (hbmp
) DeleteObject(hbmp
);
321 /* Test wrong iUsage */
324 hbmp
= NtGdiCreateDIBSection(hDC
, NULL
, 0, pbmi
, -55, cjHeader
, 0, 0, &pvBits
);
325 TEST(pvBits
== (PVOID
)-1);
327 TEST(GetLastError() == ERROR_INVALID_PARAMETER
);
328 if (hbmp
) DeleteObject(hbmp
);
330 /* Test wrong iUsage and wrong cjHeader */
333 hbmp
= NtGdiCreateDIBSection(hDC
, NULL
, 0, pbmi
, -55, cjHeader
+4, 0, 0, &pvBits
);
334 TEST(pvBits
== (PVOID
)-1);
336 TEST(GetLastError() == 0);
337 if (hbmp
) DeleteObject(hbmp
);
339 /* increased header size */
340 pbih
->biSize
= sizeof(BITMAPINFOHEADER
) + 4;
341 cjHeader
= pbih
->biSize
+ cEntries
* 4 + 8;
344 hbmp
= NtGdiCreateDIBSection(hDC
, NULL
, 0, pbmi
, 0, cjHeader
, 0, 0, &pvBits
);
345 TEST(pvBits
!= NULL
);
347 TEST(GetLastError() == 8);
348 if (hbmp
) DeleteObject(hbmp
);
350 /* increased header size */
351 pbih
->biSize
= sizeof(BITMAPINFOHEADER
) + 2;
352 cjHeader
= pbih
->biSize
+ cEntries
* 4 + 8;
355 hbmp
= NtGdiCreateDIBSection(hDC
, NULL
, 0, pbmi
, 0, cjHeader
, 0, 0, &pvBits
);
356 TEST(pvBits
== (PVOID
)-1);
358 TEST(GetLastError() == 0);
359 if (hbmp
) DeleteObject(hbmp
);
361 /* decreased header size */
362 pbih
->biSize
= sizeof(BITMAPINFOHEADER
) - 4;
363 cjHeader
= pbih
->biSize
+ cEntries
* 4 + 8;
366 hbmp
= NtGdiCreateDIBSection(hDC
, NULL
, 0, pbmi
, 0, cjHeader
, 0, 0, &pvBits
);
367 TEST(pvBits
== (PVOID
)-1);
369 TEST(GetLastError() == 0);
370 if (hbmp
) DeleteObject(hbmp
);
373 /** BITMAPV4HEADER ************************************************************/
375 pbV4h
->bV4Size
= sizeof(BITMAPV4HEADER
);
377 pbV4h
->bV4Height
= 3;
378 pbV4h
->bV4Planes
= 1;
379 pbV4h
->bV4BitCount
= 1;
380 pbV4h
->bV4V4Compression
= BI_RGB
;
381 pbV4h
->bV4SizeImage
= 0;
382 pbV4h
->bV4XPelsPerMeter
= 100;
383 pbV4h
->bV4YPelsPerMeter
= 100;
384 pbV4h
->bV4ClrUsed
= 0;
385 pbV4h
->bV4ClrImportant
= 0;
386 pbV4h
->bV4RedMask
= 0;
387 pbV4h
->bV4GreenMask
= 0;
388 pbV4h
->bV4BlueMask
= 0;
389 pbV4h
->bV4AlphaMask
= 0;
390 pbV4h
->bV4CSType
= 0;
391 memset(&pbV4h
->bV4Endpoints
, 0, sizeof(CIEXYZTRIPLE
));
392 pbV4h
->bV4GammaRed
= 0;
393 pbV4h
->bV4GammaGreen
= 0;
394 pbV4h
->bV4GammaBlue
= 0;
397 cjHeader
= bmi
.bmiHeader
.biSize
+ cEntries
* 4 + 8;
399 /* Test something simple */
402 hbmp
= NtGdiCreateDIBSection(hDC
, NULL
, 0, pbmi
, 0, cjHeader
, 0, 0, &pvBits
);
403 TEST(pvBits
!= NULL
);
405 TEST(GetLastError() == 8);
406 if (hbmp
) DeleteObject(hbmp
);
409 /** BITMAPV5HEADER ************************************************************/
411 pbV5h
->bV5Size
= sizeof(BITMAPV5HEADER
);
413 pbV5h
->bV5Height
= 3;
414 pbV5h
->bV5Planes
= 1;
415 pbV5h
->bV5BitCount
= 1;
416 pbV5h
->bV5Compression
= BI_RGB
;
417 pbV5h
->bV5SizeImage
= 0;
418 pbV5h
->bV5XPelsPerMeter
= 100;
419 pbV5h
->bV5YPelsPerMeter
= 100;
420 pbV5h
->bV5ClrUsed
= 2;
421 pbV5h
->bV5ClrImportant
= 2;
422 pbV5h
->bV5RedMask
= 0;
423 pbV5h
->bV5GreenMask
= 0;
424 pbV5h
->bV5BlueMask
= 0;
425 pbV5h
->bV5AlphaMask
= 0;
426 pbV5h
->bV5CSType
= 0;
427 memset(&pbV5h
->bV5Endpoints
, 0, sizeof(CIEXYZTRIPLE
));
428 pbV5h
->bV5GammaRed
= 0;
429 pbV5h
->bV5GammaGreen
= 0;
430 pbV5h
->bV5GammaBlue
= 0;
431 pbV5h
->bV5Intent
= 0;
432 pbV5h
->bV5ProfileData
= 0;
433 pbV5h
->bV5ProfileSize
= 0;
434 pbV5h
->bV5Reserved
= 0;
437 cjHeader
= pbV5h
->bV5Size
+ cEntries
* 4 + 8;
439 /* Test something simple */
442 hbmp
= NtGdiCreateDIBSection(hDC
, NULL
, 0, pbmi
, 0, cjHeader
, 0, 0, &pvBits
);
443 TEST(pvBits
!= NULL
);
445 TEST(GetLastError() == 8);
446 if (hbmp
) DeleteObject(hbmp
);
448 /* increased header size */
449 pbV5h
->bV5Size
= sizeof(BITMAPV5HEADER
) + 64;
450 cjHeader
= pbV5h
->bV5Size
+ cEntries
* 4 + 8;
453 hbmp
= NtGdiCreateDIBSection(hDC
, NULL
, 0, pbmi
, 0, cjHeader
, 0, 0, &pvBits
);
454 TEST(pvBits
!= NULL
);
456 TEST(GetLastError() == 8);
457 if (hbmp
) DeleteObject(hbmp
);
460 MaximumSize
.QuadPart
= 4096;
461 Status
= NtCreateSection(&hSection
,
468 ASSERT(NT_SUCCESS(Status
));
472 hbmp
= NtGdiCreateDIBSection(hDC
, hSection
, 0, pbmi
, 0, cjHeader
, 0, 0, &pvBits
);
473 TEST(pvBits
!= NULL
);
475 // TEST(GetLastError() == 0);
476 printf("hbmp = %p, pvBits = %p, hSection = %p\n", hbmp
, pvBits
, hSection
);
478 if (hbmp
) DeleteObject(hbmp
);