diff --git a/reactos/subsystems/win32/win32k/objects/dibobj.c b/reactos/subsystems/win32/win32k/objects/dibobj.c index bbc598a2b33..e8e5831ff94 100644 --- a/reactos/subsystems/win32/win32k/objects/dibobj.c +++ b/reactos/subsystems/win32/win32k/objects/dibobj.c @@ -665,7 +665,9 @@ NtGdiGetDIBitsInternal(HDC hDC, } else { + ScanLines = min(ScanLines, BitmapObj->SurfObj.sizlBitmap.cy - StartScan); + DestSize.cx = BitmapObj->SurfObj.sizlBitmap.cx; DestSize.cy = ScanLines; @@ -686,9 +688,9 @@ NtGdiGetDIBitsInternal(HDC hDC, if (Info->bmiHeader.biSize == sizeof(BITMAPINFOHEADER)) { + hDestBitmap = EngCreateBitmap(DestSize, - /* DIB_GetDIBWidthBytes(DestSize.cx, Info->bmiHeader.biBitCount), */ - DestSize.cx * (Info->bmiHeader.biBitCount >> 3), /* HACK */ + DIB_GetDIBWidthBytes(DestSize.cx, Info->bmiHeader.biBitCount), BitmapFormat(Info->bmiHeader.biBitCount, Info->bmiHeader.biCompression), 0 < Info->bmiHeader.biHeight ? 0 : BMF_TOPDOWN, Bits); @@ -1218,7 +1220,12 @@ DIB_CreateDIBSection( */ INT FASTCALL DIB_GetDIBWidthBytes (INT width, INT depth) { - return ((width * depth + 31) & ~31) >> 3; + /* http://www.osronline.com/DDKx/graphics/gdifncs_9pgn.htm say it must be exacly + * number of byte to next scanline in the bitmap + */ + UINT bytes = ((UINT)(abs(width)) * (UINT)depth) >> 3; + // FIXME : this is wrong return (width * depth + 31) & ~31) >> 3; + return (INT)bytes; } /***********************************************************************