1 /* 2 * PROJECT: ReactOS api tests 3 * LICENSE: GPL - See COPYING in the top level directory 4 * PURPOSE: Test for GetDIBits 5 * PROGRAMMERS: Timo Kreuzer 6 */ 7 8 #include "precomp.h" 9 10 #include "init.h" 11 12 void 13 Test_GetDIBits_xBpp( 14 ULONG cBitsPixel) 15 { 16 UCHAR ajBuffer[sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD)]; 17 PBITMAPINFO pbmi = (PBITMAPINFO)ajBuffer; 18 HBITMAP hbmp; 19 ULONG cjSizeImage, cColors; 20 HDC hdc; 21 22 hdc = GetDC(0); 23 hbmp = CreateBitmap(3, 3, 1, cBitsPixel, NULL); 24 25 /* Fill in the size field */ 26 ZeroMemory(pbmi, sizeof(ajBuffer)); 27 pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 28 29 /* Get info */ 30 ok_int(GetDIBits(hdc, hbmp, 0, 0, NULL, pbmi, DIB_RGB_COLORS), 1); 31 cjSizeImage = (((pbmi->bmiHeader.biWidth * pbmi->bmiHeader.biBitCount) + 31) & ~31) * pbmi->bmiHeader.biHeight / 8; 32 cColors = cBitsPixel <= 8 ? 1 << pbmi->bmiHeader.biBitCount : 0; 33 34 ok_int(pbmi->bmiHeader.biSize, sizeof(BITMAPINFOHEADER)); 35 ok_int(pbmi->bmiHeader.biWidth, 3); 36 ok_int(pbmi->bmiHeader.biHeight, 3); 37 ok_int(pbmi->bmiHeader.biPlanes, 1); 38 ok_int(pbmi->bmiHeader.biBitCount, cBitsPixel); 39 ok_int(pbmi->bmiHeader.biCompression, (cBitsPixel == 16) || (cBitsPixel == 32) ? BI_BITFIELDS : BI_RGB); 40 ok_int(pbmi->bmiHeader.biSizeImage, cjSizeImage); 41 ok_int(pbmi->bmiHeader.biXPelsPerMeter, 0); 42 ok_int(pbmi->bmiHeader.biYPelsPerMeter, 0); 43 ok_int(pbmi->bmiHeader.biClrUsed, cColors); 44 ok_int(pbmi->bmiHeader.biClrImportant, cColors); 45 46 // pbmi->bmiHeader.biSizeImage = 0; 47 //ok_int(GetDIBits(NULL, hbmp, 0, 0, NULL, pbmi, DIB_RGB_COLORS), 1); 48 49 /* Test a bitmap with values partly set */ 50 ZeroMemory(pbmi, sizeof(ajBuffer)); 51 pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 52 pbmi->bmiHeader.biWidth = 12; 53 pbmi->bmiHeader.biHeight = 14; 54 pbmi->bmiHeader.biPlanes = 2; 55 pbmi->bmiHeader.biBitCount = 0; // keep biBitCount == 0! 56 pbmi->bmiHeader.biCompression = 7; 57 pbmi->bmiHeader.biSizeImage = 123; 58 ok_int(GetDIBits(hdc, hbmp, 0, 5, NULL, pbmi, DIB_RGB_COLORS), 1); 59 ok_int(pbmi->bmiHeader.biWidth, 3); 60 ok_int(pbmi->bmiHeader.biHeight, 3); 61 ok_int(pbmi->bmiHeader.biPlanes, 1); 62 ok_int(pbmi->bmiHeader.biBitCount, cBitsPixel); 63 ok_int(pbmi->bmiHeader.biSizeImage, cjSizeImage); 64 ok_int(pbmi->bmiHeader.biXPelsPerMeter, 0); 65 ok_int(pbmi->bmiHeader.biYPelsPerMeter, 0); 66 ok_int(pbmi->bmiHeader.biClrUsed, cColors); 67 ok_int(pbmi->bmiHeader.biClrImportant, cColors); 68 69 70 #if 0 71 /* Get info including the color table */ 72 ZeroMemory(pbmi, sizeof(ajBuffer)); 73 pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 74 pbmi->bmiHeader.biBitCount = 1; 75 ok_int(GetDIBits(NULL, hbmp, 0, 0, NULL, pbmi, DIB_PAL_COLORS), 1); 76 77 /* Check a different bit depth */ 78 pbmi->bmiHeader.biBitCount, cBitsPixel = (cBitsPixel == 1) ? 8 : 1; 79 ok_int(GetDIBits(hdc, hbmp, 0, 0, NULL, pbmi, DIB_RGB_COLORS), 1); 80 ok_int(pbmi->bmiHeader.biBitCount, (cBitsPixel == 1) ? 8 : 1); 81 82 /* Get the bits */ 83 SetLastError(0); 84 ok_int(GetDIBits(hdc, hbmp, 0, 4, pvBits, pbmi, DIB_PAL_COLORS), 3); 85 ok_int(GetDIBits(hdc, hbmp, 3, 7, pvBits, pbmi, DIB_RGB_COLORS), 1); 86 ok_err(0); 87 88 pbmi->bmiHeader.biPlanes = 2; 89 pbmi->bmiHeader.biClrUsed = 0; 90 ok_int(GetDIBits(hdc, hbmp, 0, 4, pvBits, pbmi, DIB_RGB_COLORS), 3); 91 #endif 92 93 DeleteObject(hbmp); 94 ReleaseDC(NULL, hdc); 95 } 96 97 void Test_GetDIBits() 98 { 99 HDC hdcScreen, hdcMem; 100 HBITMAP hbmp; 101 PBITMAPINFO pbi; 102 DWORD bisize; 103 PBITMAPCOREHEADER pbch; 104 PBITMAPV5HEADER pbV5Header; 105 INT ScreenBpp; 106 DWORD ajBits[100] = {0xff, 0x00, 0xcc, 0xf0, 0x0f}; 107 PVOID pvBits; 108 ULONG cjSizeImage; 109 110 bisize = sizeof(BITMAPV5HEADER) + 256 * sizeof(DWORD); 111 pbi = malloc(bisize); 112 pbch = (PVOID)pbi; 113 pbV5Header = (PVOID)pbi; 114 115 hdcScreen = GetDC(NULL); 116 ok(hdcScreen != 0, "GetDC failed, skipping tests\n"); 117 if (hdcScreen == NULL) return; 118 119 hbmp = CreateCompatibleBitmap(hdcScreen, 16, 16); 120 ok(hbmp != NULL, "CreateCompatibleBitmap failed\n"); 121 122 /* misc */ 123 SetLastError(ERROR_SUCCESS); 124 ok(GetDIBits(0, 0, 0, 0, NULL, NULL, 0) == 0, "\n"); 125 ok_err(ERROR_INVALID_PARAMETER); 126 127 SetLastError(ERROR_SUCCESS); 128 ok(GetDIBits((HDC)2345, 0, 0, 0, NULL, NULL, 0) == 0, "\n"); 129 ok_err(ERROR_INVALID_PARAMETER); 130 131 SetLastError(ERROR_SUCCESS); 132 ok(GetDIBits((HDC)2345, hbmp, 0, 0, NULL, NULL, 0) == 0, "\n"); 133 ok_err(ERROR_INVALID_PARAMETER); 134 135 SetLastError(ERROR_SUCCESS); 136 ok(GetDIBits((HDC)2345, hbmp, 0, 15, NULL, pbi, 0) == 0, "\n"); 137 ok_err(ERROR_INVALID_PARAMETER); 138 139 140 141 /* null hdc */ 142 SetLastError(ERROR_SUCCESS); 143 ZeroMemory(pbi, bisize); 144 pbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 145 ok(GetDIBits(NULL, hbmp, 0, 15, NULL, pbi, DIB_RGB_COLORS) == 0, "\n"); 146 ok_err(ERROR_INVALID_PARAMETER); 147 148 /* null bitmap */ 149 SetLastError(ERROR_SUCCESS); 150 ZeroMemory(pbi, bisize); 151 pbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 152 ok(GetDIBits(hdcScreen, NULL, 0, 15, NULL, pbi, DIB_RGB_COLORS) == 0, "\n"); 153 ok_err(ERROR_SUCCESS); 154 155 /* 0 scan lines */ 156 SetLastError(ERROR_SUCCESS); 157 ZeroMemory(pbi, bisize); 158 pbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 159 ok(GetDIBits(hdcScreen, hbmp, 0, 0, NULL, pbi, DIB_RGB_COLORS) > 0, "\n"); 160 ok_err(ERROR_SUCCESS); 161 162 /* null bitmap info - crashes XP*/ 163 //SetLastError(ERROR_SUCCESS); 164 //ok(GetDIBits(hdcScreen, NULL, 0, 15, NULL, NULL, DIB_RGB_COLORS) == 0); 165 //ok(GetLastError() == ERROR_INVALID_PARAMETER); 166 167 /* bad bmi colours (uUsage) */ 168 SetLastError(0); 169 ZeroMemory(pbi, bisize); 170 pbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 171 ok(GetDIBits(hdcScreen, hbmp, 0, 15, NULL, pbi, 100) == 0, "\n"); 172 ok_err(ERROR_SUCCESS); 173 ok(pbi->bmiHeader.biWidth == 0, "\n"); 174 ok(pbi->bmiHeader.biHeight == 0, "\n"); 175 ok(pbi->bmiHeader.biBitCount == 0, "\n"); 176 ok(pbi->bmiHeader.biSizeImage == 0, "\n"); 177 178 /* basic call */ 179 SetLastError(ERROR_SUCCESS); 180 ZeroMemory(pbi, bisize); 181 pbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 182 ok(GetDIBits(hdcScreen, hbmp, 0, 15, NULL, pbi, DIB_RGB_COLORS) > 0, "\n"); 183 ok_err(ERROR_SUCCESS); 184 ScreenBpp = GetDeviceCaps(hdcScreen, BITSPIXEL); 185 ok(pbi->bmiHeader.biWidth == 16, "\n"); 186 ok(pbi->bmiHeader.biHeight == 16, "\n"); 187 ok(pbi->bmiHeader.biBitCount == ScreenBpp, "\n"); 188 ok(pbi->bmiHeader.biSizeImage == (16 * 16) * (ScreenBpp / 8), "\n"); 189 190 /* Test if COREHEADER is supported */ 191 ZeroMemory(pbi, bisize); 192 pbi->bmiHeader.biSize = sizeof(BITMAPCOREHEADER); 193 ok_int(GetDIBits(hdcScreen, hbmp, 0, 15, NULL, pbi, DIB_RGB_COLORS), 1); 194 ok_int(pbi->bmiHeader.biSize, sizeof(BITMAPCOREHEADER)); 195 ok_int(pbch->bcWidth, 16); 196 ok_int(pbch->bcHeight, 16); 197 ok_int(pbch->bcPlanes, 1); 198 //ok_int(pbch->bcBitCount, ScreenBpp > 16 ? 24 : ScreenBpp); // fails on XP with screenbpp == 16 199 200 /* Test different header sizes */ 201 ZeroMemory(pbi, bisize); 202 pbi->bmiHeader.biSize = sizeof(BITMAPCOREHEADER) + 4; 203 ok_int(GetDIBits(hdcScreen, hbmp, 0, 15, NULL, pbi, DIB_RGB_COLORS), 0); 204 205 ZeroMemory(pbi, bisize); 206 pbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER) + 4; 207 ok_int(GetDIBits(hdcScreen, hbmp, 0, 15, NULL, pbi, DIB_RGB_COLORS), 1); 208 209 ZeroMemory(pbi, bisize); 210 pbi->bmiHeader.biSize = sizeof(BITMAPV4HEADER); 211 ok_int(GetDIBits(hdcScreen, hbmp, 0, 15, NULL, pbi, DIB_RGB_COLORS), 1); 212 213 ZeroMemory(pbi, bisize); 214 pbi->bmiHeader.biSize = sizeof(BITMAPV4HEADER) + 4; 215 ok_int(GetDIBits(hdcScreen, hbmp, 0, 15, NULL, pbi, DIB_RGB_COLORS), 1); 216 217 ZeroMemory(pbi, bisize); 218 pbi->bmiHeader.biSize = sizeof(BITMAPV5HEADER); 219 ok_int(GetDIBits(hdcScreen, hbmp, 0, 15, NULL, pbi, DIB_RGB_COLORS), 1); 220 221 ZeroMemory(pbi, bisize); 222 pbi->bmiHeader.biSize = sizeof(BITMAPV5HEADER) + 4; 223 ok_int(GetDIBits(hdcScreen, hbmp, 0, 15, NULL, pbi, DIB_RGB_COLORS), 1); 224 ok_int(pbV5Header->bV5RedMask, 0); 225 ok_int(pbV5Header->bV5GreenMask, 0); 226 ok_int(pbV5Header->bV5BlueMask, 0); 227 ok_int(pbV5Header->bV5AlphaMask, 0); 228 ok_int(pbV5Header->bV5CSType, 0); 229 // CIEXYZTRIPLE bV5Endpoints; 230 ok_int(pbV5Header->bV5GammaRed, 0); 231 ok_int(pbV5Header->bV5GammaGreen, 0); 232 ok_int(pbV5Header->bV5GammaBlue, 0); 233 ok_int(pbV5Header->bV5Intent, 0); 234 ok_int(pbV5Header->bV5ProfileData, 0); 235 ok_int(pbV5Header->bV5ProfileSize, 0); 236 ok_int(pbV5Header->bV5Reserved, 0); 237 238 ZeroMemory(pbi, bisize); 239 pbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 240 ok_int(GetDIBits(hdcScreen, hbmp, 234, 43, NULL, pbi, DIB_RGB_COLORS), 1); 241 242 DeleteObject(hbmp); 243 244 /* Test a mono bitmap */ 245 hbmp = CreateBitmap(13, 7, 1, 1, ajBits); 246 ok(hbmp != 0, "failed to create bitmap\n"); 247 ZeroMemory(pbi, bisize); 248 pbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 249 ok_int(GetDIBits(hdcScreen, hbmp, 0, 0, NULL, pbi, DIB_RGB_COLORS), 1); 250 ok_int(pbi->bmiHeader.biWidth, 13); 251 ok_int(pbi->bmiHeader.biHeight, 7); 252 ok_int(pbi->bmiHeader.biBitCount, 1); 253 ok_int(pbi->bmiHeader.biSizeImage, 28); 254 255 /* Test with values set, except biSizeImage */ 256 pbi->bmiHeader.biSizeImage = 0; 257 ok_int(GetDIBits(hdcScreen, hbmp, 0, 0, NULL, pbi, DIB_RGB_COLORS), 1); 258 ok_int(pbi->bmiHeader.biSizeImage, 28); 259 260 /* Test with different biWidth set */ 261 pbi->bmiHeader.biWidth = 17; 262 pbi->bmiHeader.biHeight = 3; 263 pbi->bmiHeader.biSizeImage = 0; 264 ok_int(GetDIBits(hdcScreen, hbmp, 0, 0, NULL, pbi, DIB_RGB_COLORS), 1); 265 ok_int(pbi->bmiHeader.biSizeImage, 12); 266 ok_int(pbi->bmiHeader.biWidth, 17); 267 ok_int(pbi->bmiHeader.biHeight, 3); 268 269 /* Test with different biBitCount set */ 270 pbi->bmiHeader.biBitCount = 4; 271 pbi->bmiHeader.biSizeImage = 1; 272 ok_int(GetDIBits(hdcScreen, hbmp, 0, 0, NULL, pbi, DIB_RGB_COLORS), 1); 273 ok_int(pbi->bmiHeader.biSizeImage, 36); 274 ok_int(pbi->bmiHeader.biBitCount, 4); 275 276 /* Test with different biBitCount set */ 277 pbi->bmiHeader.biBitCount = 8; 278 pbi->bmiHeader.biSizeImage = 1000; 279 ok_int(GetDIBits(hdcScreen, hbmp, 0, 0, NULL, pbi, DIB_RGB_COLORS), 1); 280 ok_int(pbi->bmiHeader.biSizeImage, 60); 281 ok_int(pbi->bmiHeader.biBitCount, 8); 282 283 /* Test with invalid biBitCount set */ 284 pbi->bmiHeader.biBitCount = 123; 285 pbi->bmiHeader.biSizeImage = -12; 286 ok_int(GetDIBits(hdcScreen, hbmp, 0, 0, NULL, pbi, DIB_RGB_COLORS), 0); 287 ok_int(pbi->bmiHeader.biSizeImage, -12); 288 ok_int(pbi->bmiHeader.biBitCount, 123); 289 290 /* Set bitmap dimensions */ 291 ok_int(SetBitmapDimensionEx(hbmp, 110, 220, NULL), 1); 292 ZeroMemory(pbi, bisize); 293 pbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 294 ok_int(GetDIBits(hdcScreen, hbmp, 0, 5, NULL, pbi, DIB_RGB_COLORS), 1); 295 ok_int(pbi->bmiHeader.biXPelsPerMeter, 0); 296 ok_int(pbi->bmiHeader.biYPelsPerMeter, 0); 297 298 /* Set individual values */ 299 ZeroMemory(pbi, bisize); 300 pbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 301 pbi->bmiHeader.biWidth = 12; 302 ok_int(GetDIBits(hdcScreen, hbmp, 0, 5, NULL, pbi, DIB_RGB_COLORS), 1); 303 ok_int(pbi->bmiHeader.biWidth, 13); 304 ok_int(pbi->bmiHeader.biSizeImage, 28); 305 306 ZeroMemory(pbi, bisize); 307 pbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 308 pbi->bmiHeader.biSizeImage = 123; 309 ok_int(GetDIBits(hdcScreen, hbmp, 0, 5, NULL, pbi, DIB_RGB_COLORS), 1); 310 311 ZeroMemory(pbi, bisize); 312 pbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 313 pbi->bmiHeader.biCompression = BI_RGB; 314 ok_int(GetDIBits(hdcScreen, hbmp, 0, 5, NULL, pbi, DIB_RGB_COLORS), 1); 315 316 /* Set only biBitCount */ 317 ZeroMemory(pbi, bisize); 318 pbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 319 pbi->bmiHeader.biBitCount = 5; 320 ok_int(GetDIBits(hdcScreen, hbmp, 0, 5, NULL, pbi, DIB_RGB_COLORS), 0); 321 pbi->bmiHeader.biBitCount = 1; 322 ok_int(GetDIBits(hdcScreen, hbmp, 0, 5, NULL, pbi, DIB_RGB_COLORS), 0); 323 pbi->bmiHeader.biBitCount = 8; 324 ok_int(GetDIBits(hdcScreen, hbmp, 0, 5, NULL, pbi, DIB_RGB_COLORS), 0); 325 pbi->bmiHeader.biBitCount = 32; 326 ok_int(GetDIBits(hdcScreen, hbmp, 0, 5, NULL, pbi, DIB_RGB_COLORS), 0); 327 ok_int(pbi->bmiHeader.biWidth, 0); 328 ok_int(pbi->bmiHeader.biHeight, 0); 329 ok_int(pbi->bmiHeader.biPlanes, 0); 330 ok_int(pbi->bmiHeader.biBitCount, 32); 331 ok_int(pbi->bmiHeader.biCompression, 0); 332 ok_int(pbi->bmiHeader.biSizeImage, 0); 333 334 /* Get the bitmap info */ 335 pbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 336 pbi->bmiHeader.biWidth = 4; 337 pbi->bmiHeader.biHeight = 4; 338 pbi->bmiHeader.biPlanes = 3; 339 pbi->bmiHeader.biBitCount = 32; 340 pbi->bmiHeader.biCompression = BI_RGB; 341 ok_int(GetDIBits(hdcScreen, hbmp, 0, 5, NULL, pbi, DIB_RGB_COLORS), 1); 342 ok_int(pbi->bmiHeader.biSizeImage, 64); 343 ok_int(pbi->bmiHeader.biPlanes, 1); 344 pbi->bmiHeader.biWidth = 0; 345 ok_int(GetDIBits(hdcScreen, hbmp, 0, 5, NULL, pbi, DIB_RGB_COLORS), 0); 346 pbi->bmiHeader.biWidth = 2; 347 ok_int(GetDIBits(hdcScreen, hbmp, 0, 5, NULL, pbi, DIB_RGB_COLORS), 1); 348 ok_int(pbi->bmiHeader.biSizeImage, 32); 349 pbi->bmiHeader.biWidth = -3; 350 ok_int(GetDIBits(hdcScreen, hbmp, 0, 5, NULL, pbi, DIB_RGB_COLORS), 0); 351 pbi->bmiHeader.biWidth = 4; 352 pbi->bmiHeader.biHeight = 0; 353 ok_int(GetDIBits(hdcScreen, hbmp, 0, 5, NULL, pbi, DIB_RGB_COLORS), 0); 354 pbi->bmiHeader.biHeight = -4; 355 ok_int(GetDIBits(hdcScreen, hbmp, 0, 5, NULL, pbi, DIB_RGB_COLORS), 1); 356 pbi->bmiHeader.biBitCount = 31; 357 ok_int(GetDIBits(hdcScreen, hbmp, 0, 5, NULL, pbi, DIB_RGB_COLORS), 0); 358 pbi->bmiHeader.biBitCount = 16; 359 pbi->bmiHeader.biPlanes = 23; 360 ok_int(GetDIBits(hdcScreen, hbmp, 0, 5, NULL, pbi, DIB_RGB_COLORS), 1); 361 ok_int(pbi->bmiHeader.biPlanes, 1); 362 SetLastError(0xdeadbabe); 363 ok_int(GetDIBits((HDC)UlongToHandle(0xff00ff00), hbmp, 0, 5, NULL, pbi, DIB_RGB_COLORS), 0); 364 ok_err(0x57); 365 SetLastError(0xdeadbabe); 366 ok_int(GetDIBits(hdcScreen, (HBITMAP)UlongToHandle(0xff00ff00), 0, 5, NULL, pbi, DIB_RGB_COLORS), 0); 367 ok_err(0xdeadbabe); 368 SetLastError(0xdeadbabe); 369 ok_int(GetDIBits((HDC)UlongToHandle(0xff00ff00), (HBITMAP)UlongToHandle(0xff00ff00), 0, 5, NULL, pbi, DIB_RGB_COLORS), 0); 370 ok_err(0x57); 371 SetLastError(0xdeadbabe); 372 ok_int(GetDIBits(NULL, hbmp, 0, 5, NULL, pbi, DIB_RGB_COLORS), 0); 373 ok_err(0x57); 374 375 pbi->bmiHeader.biCompression = BI_JPEG; 376 ok_int(GetDIBits(hdcScreen, hbmp, 0, 5, NULL, pbi, DIB_RGB_COLORS), 0); 377 pbi->bmiHeader.biCompression = BI_PNG; 378 ok_int(GetDIBits(hdcScreen, hbmp, 0, 5, NULL, pbi, DIB_RGB_COLORS), 0); 379 380 /* Get the bitmap bits */ 381 pbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 382 pbi->bmiHeader.biWidth = 4; 383 pbi->bmiHeader.biHeight = 4; 384 pbi->bmiHeader.biPlanes = 1; 385 pbi->bmiHeader.biBitCount = 32; 386 pbi->bmiHeader.biCompression = BI_RGB; 387 pbi->bmiHeader.biSizeImage = 0; 388 pbi->bmiHeader.biXPelsPerMeter = 0; 389 pbi->bmiHeader.biYPelsPerMeter = 0; 390 pbi->bmiHeader.biClrUsed = 0; 391 pbi->bmiHeader.biClrImportant = 0; 392 cjSizeImage = ((pbi->bmiHeader.biWidth * pbi->bmiHeader.biBitCount + 31) / 32) * 4 * pbi->bmiHeader.biHeight; 393 pvBits = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 512); 394 ok_int(GetDIBits(hdcScreen, hbmp, 0, 4, pvBits, pbi, DIB_RGB_COLORS), 4); 395 ok_int(pbi->bmiHeader.biSize, sizeof(BITMAPINFOHEADER)); 396 ok_int(pbi->bmiHeader.biWidth, 4); 397 ok_int(pbi->bmiHeader.biHeight, 4); 398 ok_int(pbi->bmiHeader.biPlanes, 1); 399 ok_int(pbi->bmiHeader.biBitCount, 32); 400 ok_int(pbi->bmiHeader.biCompression, BI_RGB); 401 ok_int(pbi->bmiHeader.biSizeImage, 64); 402 ok_int(pbi->bmiHeader.biXPelsPerMeter, 0); 403 ok_int(pbi->bmiHeader.biYPelsPerMeter, 0); 404 ok_int(pbi->bmiHeader.biClrUsed, 0); 405 ok_int(pbi->bmiHeader.biClrImportant, 0); 406 407 /* Set biBitCount to 0 */ 408 pbi->bmiHeader.biBitCount = 0; 409 ok_int(GetDIBits(hdcScreen, hbmp, 0, 4, pvBits, pbi, DIB_RGB_COLORS), 0); 410 ok_int(GetDIBits(hdcScreen, hbmp, 0, 4, (PVOID)(LONG_PTR)-1, pbi, DIB_RGB_COLORS), 0); 411 ok_int(GetDIBits(hdcScreen, hbmp, 0, 4, NULL, pbi, DIB_RGB_COLORS), 1); 412 ok_int(GetDIBits(NULL, hbmp, 0, 4, NULL, pbi, DIB_RGB_COLORS), 0); 413 414 /* Try different biBitCount and biWidth */ 415 pbi->bmiHeader.biBitCount = 24; 416 pbi->bmiHeader.biWidth = 3; 417 ok_int(GetDIBits(hdcScreen, hbmp, 0, 4, pvBits, pbi, DIB_RGB_COLORS), 4); 418 419 /* Try different biBitCount and biWidth */ 420 pbi->bmiHeader.biBitCount = 24; 421 pbi->bmiHeader.biWidth = 3; 422 ok_int(GetDIBits(hdcScreen, hbmp, 0, 4, pvBits, pbi, DIB_RGB_COLORS), 4); 423 424 /* Try invalid biBitCount */ 425 pbi->bmiHeader.biBitCount = 17; 426 ok_int(GetDIBits(hdcScreen, hbmp, 0, 4, pvBits, pbi, DIB_RGB_COLORS), 0); 427 428 /* Set only biBitCount and pjInit */ 429 ZeroMemory(pbi, bisize); 430 pbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 431 pbi->bmiHeader.biBitCount = 5; 432 ok_int(GetDIBits(hdcScreen, hbmp, 0, 4, pvBits, pbi, DIB_RGB_COLORS), 0); 433 434 DeleteObject(hbmp); 435 HeapFree(GetProcessHeap(), 0, pvBits); 436 437 /* Test a 4 bpp bitmap */ 438 hbmp = CreateBitmap(3, 5, 1, 4, NULL); 439 ok(hbmp != 0, "failed to create bitmap\n"); 440 ZeroMemory(pbi, bisize); 441 pbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 442 ok_int(GetDIBits(hdcScreen, hbmp, 0, 0, NULL, pbi, DIB_RGB_COLORS), 1); 443 ok_int(pbi->bmiHeader.biWidth, 3); 444 ok_int(pbi->bmiHeader.biHeight, 5); 445 ok_int(pbi->bmiHeader.biBitCount, 4); 446 ok_int(pbi->bmiHeader.biSizeImage, 20); 447 448 /* This does NOT work with incompatible bitmaps */ 449 pbi->bmiHeader.biSizeImage = 0; 450 ok_int(GetDIBits(hdcScreen, hbmp, 0, 0, NULL, pbi, DIB_RGB_COLORS), 0); 451 452 /* Calculate bitmap size and allocate a buffer */ 453 cjSizeImage = ((pbi->bmiHeader.biWidth * pbi->bmiHeader.biBitCount + 31) / 32) * 4 * pbi->bmiHeader.biHeight; 454 ok_int(cjSizeImage, 20); 455 pvBits = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, cjSizeImage); 456 457 /* Test using a compatible DC */ 458 hdcMem = CreateCompatibleDC(0); 459 ok(hdcMem != 0, "CreateCompatibleDC failed, skipping tests\n"); 460 if (hdcMem == NULL) return; 461 ok_int(GetDIBits(hdcMem, hbmp, 0, 4, pvBits, pbi, DIB_RGB_COLORS), 0); 462 ok_int(GetDIBits(hdcMem, ghbmpDIB4, 0, 4, pvBits, pbi, DIB_RGB_COLORS), 4); 463 464 HeapFree(GetProcessHeap(), 0, pvBits); 465 DeleteDC(hdcMem); 466 ReleaseDC(NULL, hdcScreen); 467 } 468 469 void Test_GetDIBits_BI_BITFIELDS() 470 { 471 } 472 473 START_TEST(GetDIBits) 474 { 475 //getchar(); 476 InitStuff(); 477 Test_GetDIBits_xBpp(1); 478 Test_GetDIBits_xBpp(4); 479 Test_GetDIBits_xBpp(8); 480 Test_GetDIBits_xBpp(16); 481 Test_GetDIBits_xBpp(24); 482 Test_GetDIBits_xBpp(32); 483 Test_GetDIBits(); 484 } 485 486