[ros-diffs] [greatlrd] 33782: 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

greatlrd at svn.reactos.org greatlrd at svn.reactos.org
Sat May 31 13:01:52 CEST 2008


Author: greatlrd
Date: Sat May 31 06:01:51 2008
New Revision: 33782

URL: http://svn.reactos.org/svn/reactos?rev=33782&view=rev
Log:
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 

Modified:
    trunk/reactos/subsystems/win32/win32k/objects/dibobj.c

Modified: trunk/reactos/subsystems/win32/win32k/objects/dibobj.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/objects/dibobj.c?rev=33782&r1=33781&r2=33782&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/objects/dibobj.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/objects/dibobj.c [iso-8859-1] Sat May 31 06:01:51 2008
@@ -665,7 +665,9 @@
             }
             else
             {
+
                 ScanLines = min(ScanLines, BitmapObj->SurfObj.sizlBitmap.cy - StartScan);
+                
                 DestSize.cx = BitmapObj->SurfObj.sizlBitmap.cx;
                 DestSize.cy = ScanLines;
 
@@ -686,9 +688,9 @@
 
                 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 @@
  */
 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;
 }
 
 /***********************************************************************



More information about the Ros-diffs mailing list