--- /dev/null
+/* 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
#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
{ 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