+ ZeroMemory(pbi, sizeof(BITMAPINFO));
+ pbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
+ pbi->bmiHeader.biWidth = 12;
+ ok_int(GetDIBits(hdcScreen, hbmp, 0, 5, NULL, pbi, DIB_RGB_COLORS), 1);
+ ok_int(pbi->bmiHeader.biWidth, 13);
+ ok_int(pbi->bmiHeader.biSizeImage, 28);
+
+ ZeroMemory(pbi, sizeof(BITMAPINFO));
+ pbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
+ pbi->bmiHeader.biSizeImage = 123;
+ ok_int(GetDIBits(hdcScreen, hbmp, 0, 5, NULL, pbi, DIB_RGB_COLORS), 1);
+
+ ZeroMemory(pbi, sizeof(BITMAPINFO));
+ pbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
+ pbi->bmiHeader.biCompression = BI_RGB;
+ ok_int(GetDIBits(hdcScreen, hbmp, 0, 5, NULL, pbi, DIB_RGB_COLORS), 1);
+
+ /* Set only biBitCount */
+ ZeroMemory(pbi, sizeof(BITMAPINFO));
+ pbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
+ pbi->bmiHeader.biBitCount = 5;
+ ok_int(GetDIBits(hdcScreen, hbmp, 0, 5, NULL, pbi, DIB_RGB_COLORS), 0);
+ pbi->bmiHeader.biBitCount = 1;
+ ok_int(GetDIBits(hdcScreen, hbmp, 0, 5, NULL, pbi, DIB_RGB_COLORS), 0);
+ pbi->bmiHeader.biBitCount = 8;
+ ok_int(GetDIBits(hdcScreen, hbmp, 0, 5, NULL, pbi, DIB_RGB_COLORS), 0);
+ pbi->bmiHeader.biBitCount = 32;
+ ok_int(GetDIBits(hdcScreen, hbmp, 0, 5, NULL, pbi, DIB_RGB_COLORS), 0);
+ ok_int(pbi->bmiHeader.biWidth, 0);
+ ok_int(pbi->bmiHeader.biHeight, 0);
+ ok_int(pbi->bmiHeader.biPlanes, 0);
+ ok_int(pbi->bmiHeader.biBitCount, 32);
+ ok_int(pbi->bmiHeader.biCompression, 0);
+ ok_int(pbi->bmiHeader.biSizeImage, 0);
+
+ /* Get the bitmap bits */
+ pbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
+ pbi->bmiHeader.biWidth = 4;
+ pbi->bmiHeader.biHeight = 4;
+ pbi->bmiHeader.biPlanes = 1;
+ pbi->bmiHeader.biBitCount = 32;
+ pbi->bmiHeader.biCompression = BI_RGB;
+ ok_int(GetDIBits(hdcScreen, hbmp, 0, 5, NULL, pbi, DIB_RGB_COLORS), 1);
+ pbi->bmiHeader.biWidth = 0;
+ ok_int(GetDIBits(hdcScreen, hbmp, 0, 5, NULL, pbi, DIB_RGB_COLORS), 0);
+ pbi->bmiHeader.biWidth = -3;
+ ok_int(GetDIBits(hdcScreen, hbmp, 0, 5, NULL, pbi, DIB_RGB_COLORS), 0);
+ pbi->bmiHeader.biWidth = 4;
+ pbi->bmiHeader.biHeight = 0;
+ ok_int(GetDIBits(hdcScreen, hbmp, 0, 5, NULL, pbi, DIB_RGB_COLORS), 0);
+ pbi->bmiHeader.biHeight = -4;
+ ok_int(GetDIBits(hdcScreen, hbmp, 0, 5, NULL, pbi, DIB_RGB_COLORS), 1);
+ pbi->bmiHeader.biBitCount = 31;
+ ok_int(GetDIBits(hdcScreen, hbmp, 0, 5, NULL, pbi, DIB_RGB_COLORS), 0);
+ pbi->bmiHeader.biBitCount = 16;
+ pbi->bmiHeader.biPlanes = 23;
+ ok_int(GetDIBits(hdcScreen, hbmp, 0, 5, NULL, pbi, DIB_RGB_COLORS), 1);
+ ok_int(pbi->bmiHeader.biPlanes, 1);
+ pbi->bmiHeader.biCompression = BI_JPEG;
+ ok_int(GetDIBits(hdcScreen, hbmp, 0, 5, NULL, pbi, DIB_RGB_COLORS), 0);
+ pbi->bmiHeader.biCompression = BI_PNG;
+ ok_int(GetDIBits(hdcScreen, hbmp, 0, 5, NULL, pbi, DIB_RGB_COLORS), 0);
+
+
+ /* Get the bitmap bits */
+ pbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
+ pbi->bmiHeader.biWidth = 4;
+ pbi->bmiHeader.biHeight = 4;
+ pbi->bmiHeader.biPlanes = 1;
+ pbi->bmiHeader.biBitCount = 32;
+ pbi->bmiHeader.biCompression = BI_RGB;
+ pbi->bmiHeader.biSizeImage = 0;
+ pbi->bmiHeader.biXPelsPerMeter = 0;
+ pbi->bmiHeader.biYPelsPerMeter = 0;
+ pbi->bmiHeader.biClrUsed = 0;
+ pbi->bmiHeader.biClrImportant = 0;
+ cjSizeImage = ((pbi->bmiHeader.biWidth * pbi->bmiHeader.biBitCount + 31) / 32) * 4 * pbi->bmiHeader.biHeight;
+ pvBits = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 512);
+ ok_int(GetDIBits(hdcScreen, hbmp, 0, 4, pvBits, pbi, DIB_RGB_COLORS), 4);
+
+ /* Set biBitCount to 0 */
+ pbi->bmiHeader.biBitCount = 0;
+ ok_int(GetDIBits(hdcScreen, hbmp, 0, 4, pvBits, pbi, DIB_RGB_COLORS), 0);
+ ok_int(GetDIBits(hdcScreen, hbmp, 0, 4, NULL, pbi, DIB_RGB_COLORS), 1);
+ ok_int(GetDIBits(NULL, hbmp, 0, 4, NULL, pbi, DIB_RGB_COLORS), 0);
+
+ /* Try different biBitCount and biWidth */
+ pbi->bmiHeader.biBitCount = 24;
+ pbi->bmiHeader.biWidth = 3;
+ ok_int(GetDIBits(hdcScreen, hbmp, 0, 4, pvBits, pbi, DIB_RGB_COLORS), 4);
+
+ /* Try different biBitCount and biWidth */
+ pbi->bmiHeader.biBitCount = 24;
+ pbi->bmiHeader.biWidth = 3;
+ ok_int(GetDIBits(hdcScreen, hbmp, 0, 4, pvBits, pbi, DIB_RGB_COLORS), 4);
+
+ /* Set only biBitCount and pjInit */
+ ZeroMemory(pbi, sizeof(BITMAPINFO));
+ pbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
+ pbi->bmiHeader.biBitCount = 5;
+ ok_int(GetDIBits(hdcScreen, hbmp, 0, 4, pvBits, pbi, DIB_RGB_COLORS), 0);
+
+ DeleteObject(hbmp);
+ HeapFree(GetProcessHeap(), 0, pvBits);
+
+ /* Test a 4 bpp bitmap */
+ hbmp = CreateBitmap(3, 5, 1, 4, NULL);
+ ok(hbmp != 0, "failed to create bitmap\n");
+ ZeroMemory(pbi, sizeof(BITMAPINFO));
+ pbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
+ ok_int(GetDIBits(hdcScreen, hbmp, 0, 0, NULL, pbi, DIB_RGB_COLORS), 1);
+ ok_int(pbi->bmiHeader.biWidth, 3);
+ ok_int(pbi->bmiHeader.biHeight, 5);
+ ok_int(pbi->bmiHeader.biBitCount, 4);
+ ok_int(pbi->bmiHeader.biSizeImage, 20);
+
+ /* This does NOT work with incompatible bitmaps */
+ pbi->bmiHeader.biSizeImage = 0;
+ ok_int(GetDIBits(hdcScreen, hbmp, 0, 0, NULL, pbi, DIB_RGB_COLORS), 0);
+
+ cjSizeImage = ((pbi->bmiHeader.biWidth * pbi->bmiHeader.biBitCount + 31) / 32) * 4 * pbi->bmiHeader.biHeight;
+ pvBits = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, cjSizeImage);
+
+ ok(SelectObject(hdcMem, ghbmpDIB4) != 0, "\n");;
+ ok_int(GetDIBits(hdcMem, hbmp, 0, 4, pvBits, pbi, DIB_RGB_COLORS), 0);
+ ok_int(GetDIBits(hdcMem, ghbmpDIB4, 0, 4, pvBits, pbi, DIB_RGB_COLORS), 3);
+
+
+ DeleteDC(hdcMem);
+ ReleaseDC(NULL, hdcScreen);
+}
+
+void Test_GetDIBits_BI_BITFIELDS()
+{