From 9ae5fa077790f072c64ca2991d62b2032e518ed3 Mon Sep 17 00:00:00 2001 From: Magnus Olsen Date: Sat, 31 May 2008 11:01:51 +0000 Subject: [PATCH] Fixed bug in DIB_GetDIBWidthBytes accdoing OSR it is number of bytes to next scanline in the bitmap, wine version did align it, that why wrong number of bytes was reported also fixed overflow bug in the math, and make sure if some part of win32k send in negtive width, it will not calc it wrong, Remove one hack in win32k, thx of this, Thx fireball that suggest this functions mabey was wrong svn path=/trunk/; revision=33782 --- reactos/subsystems/win32/win32k/objects/dibobj.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) 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; } /***********************************************************************