diff --git a/reactos/dll/win32/gdi32/gdi32.def b/reactos/dll/win32/gdi32/gdi32.def index 975f4a0d695..bb189e2def7 100644 --- a/reactos/dll/win32/gdi32/gdi32.def +++ b/reactos/dll/win32/gdi32/gdi32.def @@ -369,7 +369,7 @@ GetDCBrushColor@4 GetDCOrgEx@8 GetDCPenColor@4 GetDIBColorTable@16=NtGdiGetDIBColorTable@16 -GetDIBits@28=NtGdiGetDIBits@28 +GetDIBits@28 GetDeviceCaps@8=NtGdiGetDeviceCaps@8 GetDeviceGammaRamp@8 GetEnhMetaFileA@4 diff --git a/reactos/dll/win32/gdi32/objects/bitmap.c b/reactos/dll/win32/gdi32/objects/bitmap.c index 504d3d5a460..07700a03996 100644 --- a/reactos/dll/win32/gdi32/objects/bitmap.c +++ b/reactos/dll/win32/gdi32/objects/bitmap.c @@ -1,5 +1,32 @@ #include "precomp.h" +/* + * Return the full scan size for a bitmap. + * + * Based on Wine and Windows Graphics Prog pg 595 + */ +UINT +FASTCALL +DIB_BitmapMaxBitsSize( PBITMAPINFO Info, UINT ScanLines ) +{ + UINT MaxBits = 0; + + if (Info->bmiHeader.biSize == sizeof(BITMAPCOREHEADER)) + { + PBITMAPCOREHEADER Core = (PBITMAPCOREHEADER)Info; + MaxBits = Core->bcBitCount * Core->bcPlanes * Core->bcWidth; + } + else /* assume BITMAPINFOHEADER */ + { + if ((Info->bmiHeader.biCompression) && (Info->bmiHeader.biCompression != BI_BITFIELDS)) + return Info->bmiHeader.biSizeImage; + MaxBits = Info->bmiHeader.biBitCount * Info->bmiHeader.biPlanes * Info->bmiHeader.biWidth; + } + // Planes are over looked by Yuan. I guess assumed always 1. + MaxBits = (MaxBits + 31) / 32; // ScanLineSize = (Width * bitcount + 31)/32 + return (MaxBits * ScanLines); // ret the full Size. +} + /* * @implemented */ @@ -144,3 +171,27 @@ SetDIBitsToDevice( FALSE, NULL); } + + +INT +STDCALL +GetDIBits( + HDC hDC, + HBITMAP hbmp, + UINT uStartScan, + UINT cScanLines, + LPVOID lpvBits, + LPBITMAPINFO lpbmi, + UINT uUsage + ) +{ + return NtGdiGetDIBitsInternal(hDC, + hbmp, + uStartScan, + cScanLines, + lpvBits, + lpbmi, + uUsage, + DIB_BitmapMaxBitsSize( lpbmi, cScanLines ), + 0); +} diff --git a/reactos/include/reactos/win32k/ntgdibad.h b/reactos/include/reactos/win32k/ntgdibad.h index f366421cafc..b28090c6d9e 100644 --- a/reactos/include/reactos/win32k/ntgdibad.h +++ b/reactos/include/reactos/win32k/ntgdibad.h @@ -317,20 +317,6 @@ NtGdiGetDIBColorTable ( RGBQUAD * Colors ); -/* Use NtGdiGetDIBitsInternal. */ -INT -STDCALL -NtGdiGetDIBits ( - HDC hDC, - HBITMAP hBitmap, - UINT StartScan, - UINT ScanLines, - LPVOID Bits, - LPBITMAPINFO bi, - UINT Usage - ); - - /* Meta are user-mode. */ HENHMETAFILE STDCALL diff --git a/reactos/subsystems/win32/win32k/ntuser/clipboard.c b/reactos/subsystems/win32/win32k/ntuser/clipboard.c index 48fc7a7a11c..320ac041f56 100644 --- a/reactos/subsystems/win32/win32k/ntuser/clipboard.c +++ b/reactos/subsystems/win32/win32k/ntuser/clipboard.c @@ -1007,14 +1007,14 @@ NtUserSetClipboardData(UINT uFormat, HANDLE hMem, DWORD size) bi.bmiHeader.biYPelsPerMeter = 0; bi.bmiHeader.biClrUsed = 0; - ret = NtGdiGetDIBits(hdc, hMem, 0, bm.bmHeight, NULL, &bi, DIB_RGB_COLORS); + ret = NtGdiGetDIBitsInternal(hdc, hMem, 0, bm.bmHeight, NULL, &bi, DIB_RGB_COLORS, 0, 0); size = bi.bmiHeader.biSizeImage + sizeof(BITMAPINFOHEADER); hCBData = ExAllocatePool(PagedPool, size); memcpy(hCBData, &bi, sizeof(BITMAPINFOHEADER)); - ret = NtGdiGetDIBits(hdc, hMem, 0, bm.bmHeight, (LPBYTE)hCBData + sizeof(BITMAPINFOHEADER), &bi, DIB_RGB_COLORS); + ret = NtGdiGetDIBitsInternal(hdc, hMem, 0, bm.bmHeight, (LPBYTE)hCBData + sizeof(BITMAPINFOHEADER), &bi, DIB_RGB_COLORS, 0, 0); UserReleaseDC(NULL, hdc, FALSE); diff --git a/reactos/subsystems/win32/win32k/objects/dibobj.c b/reactos/subsystems/win32/win32k/objects/dibobj.c index 66134364169..9a7d8cfa6e9 100644 --- a/reactos/subsystems/win32/win32k/objects/dibobj.c +++ b/reactos/subsystems/win32/win32k/objects/dibobj.c @@ -352,13 +352,15 @@ NtGdiSetDIBitsToDeviceInternal( /* Converts a device-dependent bitmap to a DIB */ INT STDCALL -NtGdiGetDIBits(HDC hDC, - HBITMAP hBitmap, - UINT StartScan, - UINT ScanLines, - LPVOID Bits, - LPBITMAPINFO Info, - UINT Usage) +NtGdiGetDIBitsInternal(HDC hDC, + HBITMAP hBitmap, + UINT StartScan, + UINT ScanLines, + LPBYTE Bits, + LPBITMAPINFO Info, + UINT Usage, + UINT MaxBits, + UINT MaxInfo) { BITMAPOBJ *BitmapObj; SURFOBJ *DestSurfObj; diff --git a/reactos/subsystems/win32/win32k/w32ksvc.db b/reactos/subsystems/win32/win32k/w32ksvc.db index 93844ef88c5..1bf0cfb97f5 100644 --- a/reactos/subsystems/win32/win32k/w32ksvc.db +++ b/reactos/subsystems/win32/win32k/w32ksvc.db @@ -180,7 +180,7 @@ NtGdiGetDCPoint 3 NtGdiGetDeviceCaps 2 NtGdiGetDeviceGammaRamp 2 # NtGdiGetDeviceCapsAll 2 -# NtGdiGetDIBitsInternal 9 +NtGdiGetDIBitsInternal 9 # NtGdiGetETM 2 # NtGdiGetEudcTimeStampEx 3 NtGdiGetFontData 5 @@ -782,7 +782,6 @@ NtGdiGetColorSpace 1 NtGdiGetCurrentObject 2 NtGdiGetCurrentPositionEx 2 NtGdiGetDIBColorTable 4 -NtGdiGetDIBits 7 NtGdiGetEnhMetaFile 1 NtGdiGetEnhMetaFileBits 3 NtGdiGetEnhMetaFileDescription 3