Always pad scanlines to multiples of 4 bytes for DIBs
Modified: trunk/reactos/subsys/win32k/objects/dib.c

Modified: trunk/reactos/subsys/win32k/objects/dib.c
--- trunk/reactos/subsys/win32k/objects/dib.c	2005-11-16 16:05:55 UTC (rev 19267)
+++ trunk/reactos/subsys/win32k/objects/dib.c	2005-11-16 16:10:57 UTC (rev 19268)
@@ -449,7 +449,8 @@
          DestSize.cx = BitmapObj->SurfObj.sizlBitmap.cx;
          DestSize.cy = ScanLines;
          DestBitmap = EngCreateBitmap(
-            DestSize, BitmapObj->SurfObj.lDelta,
+            DestSize, DIB_GetDIBWidthBytes(DestSize.cx,
+                                           Info->bmiHeader.biBitCount),
             BitmapFormat(Info->bmiHeader.biBitCount, Info->bmiHeader.biCompression),
             0 < Info->bmiHeader.biHeight ? 0 : BMF_TOPDOWN,
             Bits);
@@ -667,6 +668,7 @@
   int height;
   WORD bpp;
   WORD compr;
+  SIZEL size;
 
   if (DIB_GetBitmapInfo( header, &width, &height, &bpp, &compr ) == -1) return 0;
 
@@ -721,7 +723,12 @@
   }
   else
   {
-    handle = NtGdiCreateBitmap( width, height, 1, 1, NULL);
+    size.cx = width;
+    size.cy = abs(height);
+
+    handle = IntCreateBitmap(size, DIB_GetDIBWidthBytes(width, 1), BMF_1BPP,
+                             (height < 0 ? BMF_TOPDOWN : 0) | BMF_NOZEROINIT,
+                             NULL);
   }
 
   if (height < 0)
@@ -986,24 +993,7 @@
  */
 INT FASTCALL DIB_GetDIBWidthBytes (INT width, INT depth)
 {
-  int words;
-
-  switch(depth)
-  {
-    case 1:  words = (width + 31) >> 5; break;
-    case 4:  words = (width + 7) >> 3; break;
-    case 8:  words = (width + 3) >> 2; break;
-    case 15:
-    case 16: words = (width + 1) >> 1; break;
-    case 24: words = (width * 3 + 3) >> 2; break;
-
-    default:
-      DPRINT("(%d): Unsupported depth\n", depth );
-      /* fall through */
-    case 32:
-      words = width;
-  }
-  return words << 2;
+  return ((width * depth + 31) & ~31) >> 3;
 }
 
 /***********************************************************************