7 IN OPTIONAL HANDLE hSection,
13 IN ULONG_PTR dwColorSpace,
18 GetBitmapSize(BITMAPINFOHEADER
*pbih
)
20 ULONG WidthBits
, WidthBytes
;
22 WidthBits
= pbih
->biWidth
* pbih
->biBitCount
* pbih
->biPlanes
;
23 WidthBytes
= ((WidthBits
+ 31) & ~ 31) >> 3;
25 return pbih
->biHeight
* WidthBytes
;
30 Test_NtGdiCreateDIBSection(PTESTINFO pti
)
37 DIBSECTION dibsection
;
41 BITMAPINFOHEADER bmiHeader
;
42 RGBQUAD bmiColors
[100];
44 PBITMAPINFO pbmi
= (PBITMAPINFO
)&bmi
;
45 PBITMAPINFOHEADER pbih
= (PBITMAPINFOHEADER
)&bmi
.bmiHeader
;
46 PBITMAPV4HEADER pbV4h
= (PBITMAPV4HEADER
)&bmi
.bmiHeader
;
47 PBITMAPV5HEADER pbV5h
= (PBITMAPV5HEADER
)&bmi
.bmiHeader
;
51 LARGE_INTEGER MaximumSize
;
54 pbih
->biSize
= sizeof(BITMAPINFOHEADER
);
59 pbih
->biCompression
= BI_RGB
;
60 pbih
->biSizeImage
= 0;
61 pbih
->biXPelsPerMeter
= 100;
62 pbih
->biYPelsPerMeter
= 100;
64 pbih
->biClrImportant
= 2;
68 /** iUsage = 0 (DIB_RGB_COLORS) ***********************************************/
70 cjHeader
= bmi
.bmiHeader
.biSize
+ cEntries
* 4 + 8;
72 /* Test something simple */
75 hbmp
= NtGdiCreateDIBSection(hDC
, NULL
, 0, pbmi
, 0, cjHeader
, 0, 0, &pvBits
);
78 // TEST(GetLastError() == 0);
79 TEST(GetObject(hbmp
, sizeof(DIBSECTION
), &dibsection
) == sizeof(DIBSECTION
));
80 TEST(dibsection
.dsBitfields
[0] == 0);
81 TEST(dibsection
.dsBitfields
[1] == 0);
82 TEST(dibsection
.dsBitfields
[2] == 0);
83 TEST(dibsection
.dshSection
== 0);
84 TEST(dibsection
.dsOffset
== 0);
85 if (hbmp
) DeleteObject(hbmp
);
91 hbmp
= NtGdiCreateDIBSection(0, NULL
, 0, pbmi
, 0, cjHeader
, 0, 0, &pvBits
);
94 TEST(GetLastError() == ERROR_NOT_ENOUGH_MEMORY
);
95 if (hbmp
) DeleteObject(hbmp
);
97 /* Test a wrong HDC */
100 hbmp
= NtGdiCreateDIBSection((HDC
)0xdeadbeef, NULL
, 0, pbmi
, 0, cjHeader
, 0, 0, &pvBits
);
103 TEST(GetLastError() == 8);
104 if (hbmp
) DeleteObject(hbmp
);
106 /* Test pbmi = NULL */
109 hbmp
= NtGdiCreateDIBSection(hDC
, NULL
, 0, NULL
, 0, cjHeader
, 0, 0, &pvBits
);
110 TEST(pvBits
== (PVOID
)-1);
112 TEST(GetLastError() == 0);
113 if (hbmp
) DeleteObject(hbmp
);
115 /* Test invalid pbmi */
118 hbmp
= NtGdiCreateDIBSection(hDC
, NULL
, 0, (PVOID
)0x80001234, 0, cjHeader
, 0, 0, &pvBits
);
119 TEST(pvBits
== (PVOID
)-1);
121 TEST(GetLastError() == ERROR_INVALID_PARAMETER
);
122 if (hbmp
) DeleteObject(hbmp
);
124 /* Test invalid pbmi */
127 hbmp
= NtGdiCreateDIBSection(hDC
, NULL
, 0, (PVOID
)1, 0, cjHeader
, 0, 0, &pvBits
);
128 TEST(pvBits
== (PVOID
)-1);
130 TEST(GetLastError() == ERROR_INVALID_PARAMETER
);
131 if (hbmp
) DeleteObject(hbmp
);
133 /* Test ppvBits = NULL */
135 hbmp
= NtGdiCreateDIBSection(0, NULL
, 0, pbmi
, 0, cjHeader
, 0, 0, NULL
);
137 TEST(GetLastError() == ERROR_INVALID_PARAMETER
);
138 if (hbmp
) DeleteObject(hbmp
);
140 /* Test ppvBits = NULL and pbmi == 0*/
142 hbmp
= NtGdiCreateDIBSection(0, NULL
, 0, NULL
, 0, cjHeader
, 0, 0, NULL
);
144 TEST(GetLastError() == 0);
145 if (hbmp
) DeleteObject(hbmp
);
147 /* Test ppvBits = NULL and wrong cjHeader */
149 hbmp
= NtGdiCreateDIBSection(0, NULL
, 0, pbmi
, 0, cjHeader
+4, 0, 0, NULL
);
151 TEST(GetLastError() == 0);
152 if (hbmp
) DeleteObject(hbmp
);
154 /* Test ppvBits = NULL and cjHeader = 0 */
156 hbmp
= NtGdiCreateDIBSection(0, NULL
, 0, pbmi
, 0, 0, 0, 0, NULL
);
158 TEST(GetLastError() == 0);
159 if (hbmp
) DeleteObject(hbmp
);
161 /* Test wrong cjHeader */
164 hbmp
= NtGdiCreateDIBSection(hDC
, NULL
, 0, pbmi
, 0, cjHeader
+4, 0, 0, &pvBits
);
167 TEST(GetLastError() == 0);
168 if (hbmp
) DeleteObject(hbmp
);
170 /* Test different bitcount */
171 pbih
->biBitCount
= 4;
172 hbmp
= NtGdiCreateDIBSection(hDC
, NULL
, 0, pbmi
, 0, cjHeader
, 0, 0, &pvBits
);
174 if (hbmp
) DeleteObject(hbmp
);
176 pbih
->biBitCount
= 8;
177 hbmp
= NtGdiCreateDIBSection(hDC
, NULL
, 0, pbmi
, 0, cjHeader
, 0, 0, &pvBits
);
179 if (hbmp
) DeleteObject(hbmp
);
181 cjHeader
= pbih
->biSize
;
182 pbih
->biBitCount
= 16;
183 hbmp
= NtGdiCreateDIBSection(hDC
, NULL
, 0, pbmi
, 0, cjHeader
, 0, 0, &pvBits
);
185 if (hbmp
) DeleteObject(hbmp
);
187 pbih
->biBitCount
= 24;
188 hbmp
= NtGdiCreateDIBSection(hDC
, NULL
, 0, pbmi
, 0, cjHeader
, 0, 0, &pvBits
);
190 if (hbmp
) DeleteObject(hbmp
);
192 pbih
->biBitCount
= 32;
193 hbmp
= NtGdiCreateDIBSection(hDC
, NULL
, 0, pbmi
, 0, cjHeader
, 0, 0, &pvBits
);
195 if (hbmp
) DeleteObject(hbmp
);
197 /* Test BI_BITFIELDS */
199 cjHeader
= pbih
->biSize
+ cEntries
* sizeof(DWORD
);
200 pbih
->biBitCount
= 16;
201 pbih
->biCompression
= BI_BITFIELDS
;
202 ((DWORD
*)pbmi
->bmiColors
)[0] = 0x0007;
203 ((DWORD
*)pbmi
->bmiColors
)[1] = 0x0038;
204 ((DWORD
*)pbmi
->bmiColors
)[2] = 0x01C0;
205 hbmp
= NtGdiCreateDIBSection(hDC
, NULL
, 0, pbmi
, 0, cjHeader
, 0, 0, &pvBits
);
207 TEST(GetObject(hbmp
, sizeof(DIBSECTION
), &dibsection
) == sizeof(DIBSECTION
));
208 TEST(dibsection
.dsBm
.bmType
== 0);
209 TEST(dibsection
.dsBm
.bmWidth
== 2);
210 TEST(dibsection
.dsBm
.bmHeight
== 2);
211 TEST(dibsection
.dsBm
.bmWidthBytes
== 4);
212 TEST(dibsection
.dsBm
.bmPlanes
== 1);
213 TEST(dibsection
.dsBm
.bmBitsPixel
== 16);
214 TEST(dibsection
.dsBm
.bmBits
== pvBits
);
215 TEST(dibsection
.dsBmih
.biSize
== sizeof(BITMAPINFOHEADER
));
216 TEST(dibsection
.dsBmih
.biWidth
== 2);
217 TEST(dibsection
.dsBmih
.biHeight
== 2);
218 TEST(dibsection
.dsBmih
.biPlanes
== 1);
219 TEST(dibsection
.dsBmih
.biBitCount
== 16);
220 TEST(dibsection
.dsBmih
.biCompression
== BI_BITFIELDS
);
221 TEST(dibsection
.dsBmih
.biSizeImage
== 8);
222 TEST(dibsection
.dsBmih
.biXPelsPerMeter
== 0);
223 TEST(dibsection
.dsBmih
.biYPelsPerMeter
== 0);
224 TEST(dibsection
.dsBmih
.biClrUsed
== 0);
225 TEST(dibsection
.dsBmih
.biClrImportant
== 0);
226 TEST(dibsection
.dsBitfields
[0] == 0x0007);
227 TEST(dibsection
.dsBitfields
[1] == 0x0038);
228 TEST(dibsection
.dsBitfields
[2] == 0x01C0);
229 TEST(dibsection
.dshSection
== 0);
230 TEST(dibsection
.dsOffset
== 0);
232 printf("dib with bitfileds: %p\n", hbmp
);
235 if (hbmp
) DeleteObject(hbmp
);
238 /* Test BI_BITFIELDS */
242 pbih
->biSize
= sizeof(BITMAPINFOHEADER
);
246 pbih
->biBitCount
= 4;
247 pbih
->biCompression
= BI_RGB
;
248 pbih
->biSizeImage
= 0;
249 pbih
->biXPelsPerMeter
= 100;
250 pbih
->biYPelsPerMeter
= 100;
252 pbih
->biClrImportant
= 0;
253 ((DWORD
*)pbmi
->bmiColors
)[0] = 0xF800;
254 ((DWORD
*)pbmi
->bmiColors
)[1] = 0x00ff00;
255 ((DWORD
*)pbmi
->bmiColors
)[2] = 0x0000ff;
257 cjHeader
= bmi
.bmiHeader
.biSize
+ cEntries
* 4 + 20;
260 /** iUsage = 1 (DIB_PAL_COLORS) ***********************************************/
262 pbmi
->bmiHeader
.biClrUsed
= 2;
263 pbmi
->bmiHeader
.biClrImportant
= 2;
266 cjHeader
= bmi
.bmiHeader
.biSize
+ cEntries
* 4 + 8;
268 /* Test iUsage = 1 */
271 hbmp
= NtGdiCreateDIBSection(hDC
, NULL
, 0, pbmi
, 1, cjHeader
, 0, 0, &pvBits
);
272 TEST(pvBits
== (PVOID
)-1);
274 TEST(GetLastError() == 0);
275 if (hbmp
) DeleteObject(hbmp
);
279 /** iUsage = 2 (???) **********************************************************/
281 /* Test iUsage = 2 */
284 hbmp
= NtGdiCreateDIBSection(hDC
, NULL
, 0, pbmi
, 2, cjHeader
, 0, 0, &pvBits
);
285 TEST(pvBits
== (PVOID
)-1);
287 TEST(GetLastError() == 0);
288 if (hbmp
) DeleteObject(hbmp
);
291 /** wrong iUsage **************************************************************/
294 cjHeader
= bmi
.bmiHeader
.biSize
+ cEntries
* 4 + 8;
296 /* Test iUsage = 3 */
299 hbmp
= NtGdiCreateDIBSection(hDC
, NULL
, 0, pbmi
, 3, cjHeader
, 0, 0, &pvBits
);
300 TEST(pvBits
== (PVOID
)-1);
302 TEST(GetLastError() == ERROR_INVALID_PARAMETER
);
303 if (hbmp
) DeleteObject(hbmp
);
305 /* Test iUsage = 3 */
308 hbmp
= NtGdiCreateDIBSection(hDC
, NULL
, 0, pbmi
, 3, cjHeader
+4, 0, 0, &pvBits
);
309 TEST(pvBits
== (PVOID
)-1);
311 TEST(GetLastError() == 0);
312 if (hbmp
) DeleteObject(hbmp
);
314 /* Test wrong iUsage */
317 hbmp
= NtGdiCreateDIBSection(hDC
, NULL
, 0, pbmi
, -55, cjHeader
, 0, 0, &pvBits
);
318 TEST(pvBits
== (PVOID
)-1);
320 TEST(GetLastError() == ERROR_INVALID_PARAMETER
);
321 if (hbmp
) DeleteObject(hbmp
);
323 /* Test wrong iUsage and wrong cjHeader */
326 hbmp
= NtGdiCreateDIBSection(hDC
, NULL
, 0, pbmi
, -55, cjHeader
+4, 0, 0, &pvBits
);
327 TEST(pvBits
== (PVOID
)-1);
329 TEST(GetLastError() == 0);
330 if (hbmp
) DeleteObject(hbmp
);
332 /* increased header size */
333 pbih
->biSize
= sizeof(BITMAPINFOHEADER
) + 4;
334 cjHeader
= pbih
->biSize
+ cEntries
* 4 + 8;
337 hbmp
= NtGdiCreateDIBSection(hDC
, NULL
, 0, pbmi
, 0, cjHeader
, 0, 0, &pvBits
);
338 TEST(pvBits
!= NULL
);
340 TEST(GetLastError() == 8);
341 if (hbmp
) DeleteObject(hbmp
);
343 /* increased header size */
344 pbih
->biSize
= sizeof(BITMAPINFOHEADER
) + 2;
345 cjHeader
= pbih
->biSize
+ cEntries
* 4 + 8;
348 hbmp
= NtGdiCreateDIBSection(hDC
, NULL
, 0, pbmi
, 0, cjHeader
, 0, 0, &pvBits
);
349 TEST(pvBits
== (PVOID
)-1);
351 TEST(GetLastError() == 0);
352 if (hbmp
) DeleteObject(hbmp
);
354 /* decreased header size */
355 pbih
->biSize
= sizeof(BITMAPINFOHEADER
) - 4;
356 cjHeader
= pbih
->biSize
+ cEntries
* 4 + 8;
359 hbmp
= NtGdiCreateDIBSection(hDC
, NULL
, 0, pbmi
, 0, cjHeader
, 0, 0, &pvBits
);
360 TEST(pvBits
== (PVOID
)-1);
362 TEST(GetLastError() == 0);
363 if (hbmp
) DeleteObject(hbmp
);
366 /** BITMAPV4HEADER ************************************************************/
368 pbV4h
->bV4Size
= sizeof(BITMAPV4HEADER
);
370 pbV4h
->bV4Height
= 3;
371 pbV4h
->bV4Planes
= 1;
372 pbV4h
->bV4BitCount
= 1;
373 pbV4h
->bV4V4Compression
= BI_RGB
;
374 pbV4h
->bV4SizeImage
= 0;
375 pbV4h
->bV4XPelsPerMeter
= 100;
376 pbV4h
->bV4YPelsPerMeter
= 100;
377 pbV4h
->bV4ClrUsed
= 0;
378 pbV4h
->bV4ClrImportant
= 0;
379 pbV4h
->bV4RedMask
= 0;
380 pbV4h
->bV4GreenMask
= 0;
381 pbV4h
->bV4BlueMask
= 0;
382 pbV4h
->bV4AlphaMask
= 0;
383 pbV4h
->bV4CSType
= 0;
384 memset(&pbV4h
->bV4Endpoints
, sizeof(CIEXYZTRIPLE
), 0);
385 pbV4h
->bV4GammaRed
= 0;
386 pbV4h
->bV4GammaGreen
= 0;
387 pbV4h
->bV4GammaBlue
= 0;
390 cjHeader
= bmi
.bmiHeader
.biSize
+ cEntries
* 4 + 8;
392 /* Test something simple */
395 hbmp
= NtGdiCreateDIBSection(hDC
, NULL
, 0, pbmi
, 0, cjHeader
, 0, 0, &pvBits
);
396 TEST(pvBits
!= NULL
);
398 TEST(GetLastError() == 8);
399 if (hbmp
) DeleteObject(hbmp
);
402 /** BITMAPV5HEADER ************************************************************/
404 pbV5h
->bV5Size
= sizeof(BITMAPV5HEADER
);
406 pbV5h
->bV5Height
= 3;
407 pbV5h
->bV5Planes
= 1;
408 pbV5h
->bV5BitCount
= 1;
409 pbV5h
->bV5Compression
= BI_RGB
;
410 pbV5h
->bV5SizeImage
= 0;
411 pbV5h
->bV5XPelsPerMeter
= 100;
412 pbV5h
->bV5YPelsPerMeter
= 100;
413 pbV5h
->bV5ClrUsed
= 2;
414 pbV5h
->bV5ClrImportant
= 2;
415 pbV5h
->bV5RedMask
= 0;
416 pbV5h
->bV5GreenMask
= 0;
417 pbV5h
->bV5BlueMask
= 0;
418 pbV5h
->bV5AlphaMask
= 0;
419 pbV5h
->bV5CSType
= 0;
420 memset(&pbV5h
->bV5Endpoints
, 0, sizeof(CIEXYZTRIPLE
));
421 pbV5h
->bV5GammaRed
= 0;
422 pbV5h
->bV5GammaGreen
= 0;
423 pbV5h
->bV5GammaBlue
= 0;
424 pbV5h
->bV5Intent
= 0;
425 pbV5h
->bV5ProfileData
= 0;
426 pbV5h
->bV5ProfileSize
= 0;
427 pbV5h
->bV5Reserved
= 0;
430 cjHeader
= pbV5h
->bV5Size
+ cEntries
* 4 + 8;
432 /* Test something simple */
435 hbmp
= NtGdiCreateDIBSection(hDC
, NULL
, 0, pbmi
, 0, cjHeader
, 0, 0, &pvBits
);
436 TEST(pvBits
!= NULL
);
438 TEST(GetLastError() == 8);
439 if (hbmp
) DeleteObject(hbmp
);
441 /* increased header size */
442 pbV5h
->bV5Size
= sizeof(BITMAPV5HEADER
) + 64;
443 cjHeader
= pbV5h
->bV5Size
+ cEntries
* 4 + 8;
446 hbmp
= NtGdiCreateDIBSection(hDC
, NULL
, 0, pbmi
, 0, cjHeader
, 0, 0, &pvBits
);
447 TEST(pvBits
!= NULL
);
449 TEST(GetLastError() == 8);
450 if (hbmp
) DeleteObject(hbmp
);
453 MaximumSize
.QuadPart
= 4096;
454 Status
= ZwCreateSection(&hSection
,
461 ASSERT(NT_SUCCESS(Status
));
465 hbmp
= NtGdiCreateDIBSection(hDC
, hSection
, 0, pbmi
, 0, cjHeader
, 0, 0, &pvBits
);
466 TEST(pvBits
!= NULL
);
468 // TEST(GetLastError() == 0);
469 printf("hbmp = %p, pvBits = %p, hSection = %p\n", hbmp
, pvBits
, hSection
);
471 if (hbmp
) DeleteObject(hbmp
);
474 return APISTATUS_NORMAL
;