Add basic tests for NtGdiGetDIBitsInternal
authorGed Murphy <gedmurphy@reactos.org>
Mon, 24 Sep 2007 15:09:15 +0000 (15:09 +0000)
committerGed Murphy <gedmurphy@reactos.org>
Mon, 24 Sep 2007 15:09:15 +0000 (15:09 +0000)
svn path=/trunk/; revision=29191

rostests/apitests/w32knapi/ntgdi/NtGdiGetDIBits.c [new file with mode: 0644]
rostests/apitests/w32knapi/testlist.c

diff --git a/rostests/apitests/w32knapi/ntgdi/NtGdiGetDIBits.c b/rostests/apitests/w32knapi/ntgdi/NtGdiGetDIBits.c
new file mode 100644 (file)
index 0000000..e1fc948
--- /dev/null
@@ -0,0 +1,71 @@
+/* taken from gdi32, bitmap.c */\r
+UINT\r
+FASTCALL\r
+DIB_BitmapMaxBitsSize( PBITMAPINFO Info, UINT ScanLines )\r
+{\r
+    UINT MaxBits = 0;\r
+    \r
+    if (Info->bmiHeader.biSize == sizeof(BITMAPCOREHEADER))\r
+    {\r
+       PBITMAPCOREHEADER Core = (PBITMAPCOREHEADER)Info;\r
+       MaxBits = Core->bcBitCount * Core->bcPlanes * Core->bcWidth;\r
+    }\r
+    else  /* assume BITMAPINFOHEADER */\r
+    {\r
+       if ((Info->bmiHeader.biCompression) && (Info->bmiHeader.biCompression != BI_BITFIELDS))\r
+           return Info->bmiHeader.biSizeImage;\r
+    // Planes are over looked by Yuan. I guess assumed always 1.    \r
+       MaxBits = Info->bmiHeader.biBitCount * Info->bmiHeader.biPlanes * Info->bmiHeader.biWidth;\r
+    }\r
+    MaxBits = ((MaxBits + 31) & ~31 ) / 8; // From Yuan, ScanLineSize = (Width * bitcount + 31)/32\r
+    return (MaxBits * ScanLines);  // ret the full Size.\r
+}\r
+\r
+\r
+INT\r
+Test_NtGdiGetDIBitsInternal(PTESTINFO pti)\r
+{\r
+       HBITMAP hBitmap;\r
+       BITMAPINFO bi;\r
+       INT ScreenBpp;\r
+\r
+       HDC hDCScreen = GetDC(NULL);\r
+       ASSERT(hDCScreen != NULL);\r
+\r
+       hBitmap = CreateCompatibleBitmap(hDCScreen, 16, 16);\r
+       ASSERT(hBitmap != NULL);\r
+\r
+       SetLastError(ERROR_SUCCESS);\r
+       RTEST(NtGdiGetDIBitsInternal(0, 0, 0, 0, NULL, NULL, 0, 0, 0) == 0);\r
+       RTEST(GetLastError() == ERROR_SUCCESS);\r
+\r
+       SetLastError(ERROR_SUCCESS);\r
+       RTEST(NtGdiGetDIBitsInternal((HDC)2345, 0, 0, 0, NULL, NULL, 0, 0, 0) == 0);\r
+       RTEST(GetLastError() == ERROR_SUCCESS);\r
+\r
+       SetLastError(ERROR_SUCCESS);\r
+       RTEST(NtGdiGetDIBitsInternal((HDC)2345, hBitmap, 0, 0, NULL, NULL, 0, 0, 0) == 0);\r
+       RTEST(GetLastError() == ERROR_SUCCESS);\r
+\r
+       SetLastError(ERROR_SUCCESS);\r
+       RTEST(NtGdiGetDIBitsInternal((HDC)2345, hBitmap, 0, 15, NULL, &bi, 0, 0, 0) == 0);\r
+       RTEST(GetLastError() == ERROR_SUCCESS);\r
+\r
+       SetLastError(ERROR_SUCCESS);\r
+    ZeroMemory(&bi, sizeof(BITMAPINFO));\r
+    bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);\r
+       RTEST(NtGdiGetDIBitsInternal(hDCScreen, hBitmap, 0, 15, NULL, &bi, DIB_RGB_COLORS,\r
+                                                                DIB_BitmapMaxBitsSize(&bi, 15), 0) > 0);\r
+       RTEST(GetLastError() == ERROR_SUCCESS);\r
+\r
+       ScreenBpp = GetDeviceCaps(hDCScreen, BITSPIXEL);\r
+       RTEST(bi.bmiHeader.biWidth == 16);\r
+       RTEST(bi.bmiHeader.biHeight == 16);\r
+       RTEST(bi.bmiHeader.biBitCount == ScreenBpp);\r
+       RTEST(bi.bmiHeader.biSizeImage == (16 * 16) * (ScreenBpp / 8));\r
+\r
+       ReleaseDC(NULL, hDCScreen);\r
+       DeleteObject(hBitmap);\r
+\r
+       return APISTATUS_NORMAL;\r
+}\r
index b156766..b0ab9b7 100644 (file)
@@ -17,6 +17,7 @@
 #include "ntgdi/NtGdiGetRandomRgn.c"\r
 #include "ntgdi/NtGdiSetBitmapBits.c"\r
 //#include "ntgdi/NtGdiSTROBJ_vEnumStart.c"\r
+#include "ntgdi/NtGdiGetDIBits.c"\r
 \r
 #include "ntuser/NtUserCountClipboardFormats.c"\r
 \r
@@ -40,6 +41,7 @@ TESTENTRY TestList[] =
        { L"NtGdiGetRandomRgn", Test_NtGdiGetRandomRgn },\r
        { L"NtGdiSetBitmapBits", Test_NtGdiSetBitmapBits },\r
 //     { L"NtGdiSTROBJ_vEnumStart", Test_NtGdiSTROBJ_vEnumStart },\r
+       { L"NtGdiGetDIBitsInternal", Test_NtGdiGetDIBitsInternal },\r
 \r
        /* ntuser */\r
        { L"NtUserCountClipboardFormats", Test_NtUserCountClipboardFormats }\r