[GDI32]
authorJérôme Gardou <jerome.gardou@reactos.org>
Thu, 10 Jun 2010 14:32:05 +0000 (14:32 +0000)
committerJérôme Gardou <jerome.gardou@reactos.org>
Thu, 10 Jun 2010 14:32:05 +0000 (14:32 +0000)
  - DIB data is not mandatory in CreateDIBitmap
[WIN32K]
  - Simplify GreCreateDIBitmap
  - Surface data should be 16 bits aligned

svn path=/branches/reactos-yarotows/; revision=47735

dll/win32/gdi32/objects/bitmap.c
subsystems/win32/win32k/eng/surface.c
subsystems/win32/win32k/objects/dibobj.c

index 97cae2c..1070838 100644 (file)
@@ -461,8 +461,8 @@ CreateDIBitmap( HDC hDC,
   LONG width, height, compr, dibsize;
   WORD planes, bpp;
 //  PDC_ATTR pDc_Attr;
-  UINT InfoSize;
-  UINT cjBmpScanSize;
+  UINT InfoSize = 0;
+  UINT cjBmpScanSize = 0;
   HBITMAP hBmp;
   NTSTATUS Status = STATUS_SUCCESS;
 
@@ -477,17 +477,20 @@ CreateDIBitmap( HDC hDC,
 // For Icm support.
 // GdiGetHandleUserData(hdc, GDI_OBJECT_TYPE_DC, (PVOID)&pDc_Attr))
 
-  _SEH2_TRY
-  {
-      cjBmpScanSize = DIB_BitmapBitsSize(Data);
-      CalculateColorTableSize(&Data->bmiHeader, &ColorUse, &InfoSize);
-      InfoSize += Data->bmiHeader.biSize;
-  }
-  _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+  if(Data)
   {
-        Status = _SEH2_GetExceptionCode();
+      _SEH2_TRY
+      {
+          cjBmpScanSize = DIB_BitmapBitsSize(Data);
+          CalculateColorTableSize(&Data->bmiHeader, &ColorUse, &InfoSize);
+          InfoSize += Data->bmiHeader.biSize;
+      }
+      _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+      {
+            Status = _SEH2_GetExceptionCode();
+      }
+      _SEH2_END
   }
-  _SEH2_END
 
   if(!NT_SUCCESS(Status))
   {
index 76c502f..a57470b 100644 (file)
@@ -203,12 +203,12 @@ SURFACE_bSetBitmapBits(
     if (ulWidth)
     {
         /* Align the width (Windows compatibility) */
-        ulWidth = ((((ulWidth << 3) / cBitsPixel) * cBitsPixel + 31) & ~31) >> 3;
+        ulWidth = ((((ulWidth << 3) / cBitsPixel) * cBitsPixel + 15) & ~15) >> 3;
     }
     else
     {
         /* Calculate width from the bitmap width in pixels */
-        ulWidth = ((pso->sizlBitmap.cx * cBitsPixel + 31) & ~31) >> 3;
+        ulWidth = ((pso->sizlBitmap.cx * cBitsPixel + 15) & ~15) >> 3;
     }
 
     /* Calculate the bitmap size in bytes */
@@ -236,7 +236,7 @@ SURFACE_bSetBitmapBits(
                                         (fjBitmap & BMF_NOZEROINIT) ?
                                                 0 : FL_ZERO_MEMORY,
                                         pso->cjBits, TAG_DIB);
-            
+
             /* Free the section already, but keep the mapping */
             if (pvBits) EngFreeSectionMem(pvSection, NULL);
         }
index 44ba00f..f0b84be 100644 (file)
@@ -1177,68 +1177,39 @@ GreCreateDIBitmapInternal(
     PDC Dc;
     HBITMAP Bmp;
     WORD bpp;
+    HDC hdcDest;
 
-    if (!hDc) // CreateBitmap
+    if (!hDc) /* 1bpp monochrome bitmap */
     {  // Should use System Bitmap DC hSystemBM, with CreateCompatibleDC for this.
-        hDc = IntGdiCreateDC(NULL, NULL, NULL, NULL,FALSE);
-        if (!hDc)
+        hdcDest = IntGdiCreateDC(NULL, NULL, NULL, NULL,FALSE);
+        if(!hdcDest)
         {
-            SetLastWin32Error(ERROR_INVALID_HANDLE);
-            return NULL;
-        }
-
-        Dc = DC_LockDc(hDc);
-        if (!Dc)
-        {
-            NtGdiDeleteObjectApp(hDc);
-            SetLastWin32Error(ERROR_INVALID_HANDLE);
             return NULL;
         }
-        bpp = 1;
-        Bmp = IntCreateDIBitmap(Dc, cx, cy, bpp, fInit, pjInit, pbmi, iUsage);
+    }
+    else
+    {
+        hdcDest = hDc;
+    }
 
-        DC_UnlockDc(Dc);
-        NtGdiDeleteObjectApp(hDc);
+    Dc = DC_LockDc(hdcDest);
+    if (!Dc)
+    {
+        SetLastWin32Error(ERROR_INVALID_HANDLE);
+        return NULL;
     }
-    else // CreateCompatibleBitmap
+    /* It's OK to set bpp=0 here, as IntCreateDIBitmap will create a compatible Bitmap
+     * if bpp != 1 and ignore the real value that was passed */
+    if (pbmi)
+        bpp = pbmi->bmiHeader.bV5BitCount;
+    else
+        bpp = 0;
+    Bmp = IntCreateDIBitmap(Dc, cx, cy, bpp, fInit, pjInit, pbmi, iUsage);
+    DC_UnlockDc(Dc);
+
+    if(!hDc)
     {
-        Dc = DC_LockDc(hDc);
-        if (!Dc)
-        {
-            SetLastWin32Error(ERROR_INVALID_HANDLE);
-            return NULL;
-        }
-        /* pbmi == null
-           First create an un-initialised bitmap.  The depth of the bitmap
-           should match that of the hdc and not that supplied in bmih.
-         */
-        if (pbmi)
-            bpp = pbmi->bmiHeader.bV5BitCount;
-        else
-        {
-            if (Dc->dctype != DC_TYPE_MEMORY)
-                bpp = Dc->ppdev->gdiinfo.cBitsPixel;
-            else
-            {
-                DIBSECTION dibs;
-                INT Count;
-                SURFACE *psurf = Dc->dclevel.pSurface;
-                Count = BITMAP_GetObject(psurf, sizeof(dibs), &dibs);
-                if (!Count)
-                    bpp = 1;
-                else
-                {
-                    if (Count == sizeof(BITMAP))
-                        /* A device-dependent bitmap is selected in the DC */
-                        bpp = dibs.dsBm.bmBitsPixel;
-                    else
-                        /* A DIB section is selected in the DC */
-                        bpp = dibs.dsBmih.biBitCount;
-                }
-            }
-        }
-        Bmp = IntCreateDIBitmap(Dc, cx, cy, bpp, fInit, pjInit, pbmi, iUsage);
-        DC_UnlockDc(Dc);
+        NtGdiDeleteObjectApp(hdcDest);
     }
     return Bmp;
 }