+ ZeroMemory(pbi, sizeof(BITMAPINFO));
+ pbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
+ ok(GetDIBits(hdcScreen, hbmp, 0, 15, NULL, pbi, DIB_RGB_COLORS) > 0, "\n");
+ ok_err(ERROR_SUCCESS);
+ ScreenBpp = GetDeviceCaps(hdcScreen, BITSPIXEL);
+ ok(pbi->bmiHeader.biWidth == 16, "\n");
+ ok(pbi->bmiHeader.biHeight == 16, "\n");
+ ok(pbi->bmiHeader.biBitCount == ScreenBpp, "\n");
+ ok(pbi->bmiHeader.biSizeImage == (16 * 16) * (ScreenBpp / 8), "\n");
+
+ /* Test if COREHEADER is supported */
+ pbi->bmiHeader.biSize = sizeof(BITMAPCOREHEADER);
+ ok(GetDIBits(hdcScreen, hbmp, 0, 15, NULL, pbi, DIB_RGB_COLORS) > 0, "\n");
+ ok(pbi->bmiHeader.biSize == sizeof(BITMAPCOREHEADER), "\n");
+
+ /* Test different header sizes */
+ pbi->bmiHeader.biSize = sizeof(BITMAPCOREHEADER) + 4;
+ ok(GetDIBits(hdcScreen, hbmp, 0, 15, NULL, pbi, DIB_RGB_COLORS) == 0, "should fail.\n");
+ pbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER) + 4;
+ ok(GetDIBits(hdcScreen, hbmp, 0, 15, NULL, pbi, DIB_RGB_COLORS) == 0, "should fail.\n");
+ pbi->bmiHeader.biSize = sizeof(BITMAPV5HEADER);
+ ok(GetDIBits(hdcScreen, hbmp, 0, 15, NULL, pbi, DIB_RGB_COLORS) > 0, "should not fail.\n");
+ pbi->bmiHeader.biSize = sizeof(BITMAPV5HEADER) + 4;
+ ok(GetDIBits(hdcScreen, hbmp, 0, 15, NULL, pbi, DIB_RGB_COLORS) > 0, "should not fail.\n");
+
+
+ DeleteObject(hbmp);
+
+ /* Test a mono bitmap */
+ hbmp = CreateBitmap(13, 7, 1, 1, ajBits);
+ ok(hbmp != 0, "failed to create bitmap\n");
+ ZeroMemory(pbi, sizeof(BITMAPINFO));
+ pbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
+ ret = GetDIBits(hdcScreen, hbmp, 0, 0, NULL, pbi, DIB_RGB_COLORS);
+ ok(ret == 1, "%d\n", ret);
+ ok(pbi->bmiHeader.biWidth == 13, "pbi->bmiHeader.biWidth = %ld\n", pbi->bmiHeader.biWidth);
+ ok(pbi->bmiHeader.biHeight == 7, "pbi->bmiHeader.biHeight = %ld\n", pbi->bmiHeader.biHeight);
+ ok(pbi->bmiHeader.biBitCount == 1, "pbi->bmiHeader.biBitCount = %d\n", pbi->bmiHeader.biBitCount);
+ ok(pbi->bmiHeader.biSizeImage == 28, "pbi->bmiHeader.biSizeImage = %ld\n", pbi->bmiHeader.biSizeImage);
+
+ /* Test a mono bitmap with values set */
+ ZeroMemory(pbi, sizeof(BITMAPINFO));
+ pbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
+ pbi->bmiHeader.biWidth = 12;
+ pbi->bmiHeader.biHeight = 9;
+ pbi->bmiHeader.biPlanes = 1;
+ pbi->bmiHeader.biBitCount = 32;
+ pbi->bmiHeader.biCompression = BI_RGB;
+ pbi->bmiHeader.biSizeImage = 123;
+ ret = GetDIBits(hdcScreen, hbmp, 0, 5, NULL, pbi, DIB_RGB_COLORS);
+ ok(ret == 1, "%d\n", ret);
+ ok(pbi->bmiHeader.biWidth == 12, "pbi->bmiHeader.biWidth = %ld\n", pbi->bmiHeader.biWidth);
+ ok(pbi->bmiHeader.biHeight == 9, "pbi->bmiHeader.biHeight = %ld\n", pbi->bmiHeader.biHeight);
+ ok(pbi->bmiHeader.biBitCount == 32, "pbi->bmiHeader.biBitCount = %d\n", pbi->bmiHeader.biBitCount);
+ ok(pbi->bmiHeader.biSizeImage == 432, "pbi->bmiHeader.biSizeImage = %ld\n", pbi->bmiHeader.biSizeImage);
+
+ /* Set individual values */
+ ZeroMemory(pbi, sizeof(BITMAPINFO));
+ pbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
+ pbi->bmiHeader.biWidth = 12;
+ ret = GetDIBits(hdcScreen, hbmp, 0, 5, NULL, pbi, DIB_RGB_COLORS);
+ ok(ret == 1, "%d\n", ret);
+ pbi->bmiHeader.biWidth = 0;
+ pbi->bmiHeader.biSizeImage = 123;
+ ret = GetDIBits(hdcScreen, hbmp, 0, 5, NULL, pbi, DIB_RGB_COLORS);
+ ok(ret == 0, "%d\n", ret);
+ pbi->bmiHeader.biSizeImage = 0;
+ pbi->bmiHeader.biCompression = BI_RGB;
+ ret = GetDIBits(hdcScreen, hbmp, 0, 5, NULL, pbi, DIB_RGB_COLORS);
+ ok(ret == 0, "%d\n", ret);
+
+ DeleteObject(hbmp);
+ DeleteDC(hdcMem);
+ ReleaseDC(NULL, hdcScreen);