X-Git-Url: https://git.reactos.org/?p=reactos.git;a=blobdiff_plain;f=rostests%2Fapitests%2Fgdi32%2FGetDIBits.c;h=887581ddbcb1bf68a89b25035e2f46f5c86d409c;hp=3f9f35da04c3d048a838677ee630f11560ef498d;hb=27b33c3045beaeda3cd8ebfb18bd4660b4ab733f;hpb=5de8339cd196e2bc01ac631e677010a939b2d083;ds=inline diff --git a/rostests/apitests/gdi32/GetDIBits.c b/rostests/apitests/gdi32/GetDIBits.c index 3f9f35da04c..887581ddbcb 100644 --- a/rostests/apitests/gdi32/GetDIBits.c +++ b/rostests/apitests/gdi32/GetDIBits.c @@ -9,93 +9,161 @@ #include #include -#define TEST(x) ok(x, #x"\n") -#define RTEST(x) ok(x, #x"\n") +#define ok_err(dwErr) ok(GetLastError() == dwErr, "LastError is wrong, expected %d, got %ld\n", dwErr, GetLastError()) void Test_GetDIBits() { - HDC hDCScreen; - HBITMAP hBitmap; - BITMAPINFO bi; - INT ScreenBpp; + HDC hdcScreen, hdcMem; + HBITMAP hbmp; + PBITMAPINFO pbi; + INT ret, ScreenBpp; + DWORD ajBits[10] = {0xff, 0x00, 0xcc, 0xf0, 0x0f}; - hDCScreen = GetDC(NULL); - ok(hDCScreen != 0, "GetDC failed, skipping tests\n"); - if (hDCScreen == NULL) return; + pbi = malloc(sizeof(BITMAPV5HEADER) + 256 * sizeof(DWORD)); - hBitmap = CreateCompatibleBitmap(hDCScreen, 16, 16); - RTEST(hBitmap != NULL); + hdcScreen = GetDC(NULL); + ok(hdcScreen != 0, "GetDC failed, skipping tests\n"); + if (hdcScreen == NULL) return; + + hdcMem = CreateCompatibleDC(0); + ok(hdcMem != 0, "CreateCompatibleDC failed, skipping tests\n"); + if (hdcMem == NULL) return; + + hbmp = CreateCompatibleBitmap(hdcScreen, 16, 16); + ok(hbmp != NULL, "CreateCompatibleBitmap failed\n"); /* misc */ SetLastError(ERROR_SUCCESS); - RTEST(GetDIBits(0, 0, 0, 0, NULL, NULL, 0) == 0); - RTEST(GetLastError() == ERROR_INVALID_PARAMETER); + ok(GetDIBits(0, 0, 0, 0, NULL, NULL, 0) == 0, "\n"); + ok_err(ERROR_INVALID_PARAMETER); SetLastError(ERROR_SUCCESS); - RTEST(GetDIBits((HDC)2345, 0, 0, 0, NULL, NULL, 0) == 0); - RTEST(GetLastError() == ERROR_INVALID_PARAMETER); + ok(GetDIBits((HDC)2345, 0, 0, 0, NULL, NULL, 0) == 0, "\n"); + ok_err(ERROR_INVALID_PARAMETER); SetLastError(ERROR_SUCCESS); - RTEST(GetDIBits((HDC)2345, hBitmap, 0, 0, NULL, NULL, 0) == 0); - RTEST(GetLastError() == ERROR_INVALID_PARAMETER); + ok(GetDIBits((HDC)2345, hbmp, 0, 0, NULL, NULL, 0) == 0, "\n"); + ok_err(ERROR_INVALID_PARAMETER); SetLastError(ERROR_SUCCESS); - RTEST(GetDIBits((HDC)2345, hBitmap, 0, 15, NULL, &bi, 0) == 0); - RTEST(GetLastError() == ERROR_INVALID_PARAMETER); + ok(GetDIBits((HDC)2345, hbmp, 0, 15, NULL, pbi, 0) == 0, "\n"); + ok_err(ERROR_INVALID_PARAMETER); /* null hdc */ SetLastError(ERROR_SUCCESS); - ZeroMemory(&bi, sizeof(BITMAPINFO)); - bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); - RTEST(GetDIBits(NULL, hBitmap, 0, 15, NULL, &bi, DIB_RGB_COLORS) == 0); - RTEST(GetLastError() == ERROR_INVALID_PARAMETER); + ZeroMemory(pbi, sizeof(BITMAPINFO)); + pbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + ok(GetDIBits(NULL, hbmp, 0, 15, NULL, pbi, DIB_RGB_COLORS) == 0, "\n"); + ok_err(ERROR_INVALID_PARAMETER); /* null bitmap */ SetLastError(ERROR_SUCCESS); - ZeroMemory(&bi, sizeof(BITMAPINFO)); - bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); - RTEST(GetDIBits(hDCScreen, NULL, 0, 15, NULL, &bi, DIB_RGB_COLORS) == 0); - RTEST(GetLastError() == ERROR_SUCCESS); + ZeroMemory(pbi, sizeof(BITMAPINFO)); + pbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + ok(GetDIBits(hdcScreen, NULL, 0, 15, NULL, pbi, DIB_RGB_COLORS) == 0, "\n"); + ok_err(ERROR_SUCCESS); /* 0 scan lines */ SetLastError(ERROR_SUCCESS); - ZeroMemory(&bi, sizeof(BITMAPINFO)); - bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); - RTEST(GetDIBits(hDCScreen, hBitmap, 0, 0, NULL, &bi, DIB_RGB_COLORS) > 0); - RTEST(GetLastError() == ERROR_SUCCESS); + ZeroMemory(pbi, sizeof(BITMAPINFO)); + pbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + ok(GetDIBits(hdcScreen, hbmp, 0, 0, NULL, pbi, DIB_RGB_COLORS) > 0, "\n"); + ok_err(ERROR_SUCCESS); /* null bitmap info - crashes XP*/ //SetLastError(ERROR_SUCCESS); - //RTEST(GetDIBits(hDCScreen, NULL, 0, 15, NULL, NULL, DIB_RGB_COLORS) == 0); - //RTEST(GetLastError() == ERROR_INVALID_PARAMETER); + //ok(GetDIBits(hdcScreen, NULL, 0, 15, NULL, NULL, DIB_RGB_COLORS) == 0); + //ok(GetLastError() == ERROR_INVALID_PARAMETER); /* bad bmi colours (uUsage) */ SetLastError(ERROR_SUCCESS); - ZeroMemory(&bi, sizeof(BITMAPINFO)); - bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); - RTEST(GetDIBits(hDCScreen, hBitmap, 0, 15, NULL, &bi, 100) == 0); - RTEST(GetLastError() == ERROR_SUCCESS); - RTEST(bi.bmiHeader.biWidth == 0); - RTEST(bi.bmiHeader.biHeight == 0); - RTEST(bi.bmiHeader.biBitCount == 0); - RTEST(bi.bmiHeader.biSizeImage == 0); + ZeroMemory(pbi, sizeof(BITMAPINFO)); + pbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + ok(GetDIBits(hdcScreen, hbmp, 0, 15, NULL, pbi, 100) == 0, "\n"); + ok_err(ERROR_SUCCESS); + ok(pbi->bmiHeader.biWidth == 0, "\n"); + ok(pbi->bmiHeader.biHeight == 0, "\n"); + ok(pbi->bmiHeader.biBitCount == 0, "\n"); + ok(pbi->bmiHeader.biSizeImage == 0, "\n"); /* basic call */ SetLastError(ERROR_SUCCESS); - ZeroMemory(&bi, sizeof(BITMAPINFO)); - bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); - RTEST(GetDIBits(hDCScreen, hBitmap, 0, 15, NULL, &bi, DIB_RGB_COLORS) > 0); - RTEST(GetLastError() == ERROR_SUCCESS); - ScreenBpp = GetDeviceCaps(hDCScreen, BITSPIXEL); - RTEST(bi.bmiHeader.biWidth == 16); - RTEST(bi.bmiHeader.biHeight == 16); - RTEST(bi.bmiHeader.biBitCount == ScreenBpp); - RTEST(bi.bmiHeader.biSizeImage == (16 * 16) * (ScreenBpp / 8)); - - DeleteObject(hBitmap); - ReleaseDC(NULL, hDCScreen); + 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); } START_TEST(GetDIBits)