[ros-diffs] [tkreuzer] 50918: [GDI32] In GetDIBits convert a BITMAPCOREHEADER to a BITMAPINFOHEADER before calling win32k, like done in other places. Convert it back after. This allows to simplify NtGdiGetDIBi...

tkreuzer at svn.reactos.org tkreuzer at svn.reactos.org
Sun Feb 27 17:20:03 UTC 2011


Author: tkreuzer
Date: Sun Feb 27 17:20:02 2011
New Revision: 50918

URL: http://svn.reactos.org/svn/reactos?rev=50918&view=rev
Log:
[GDI32]
In GetDIBits convert a BITMAPCOREHEADER to a BITMAPINFOHEADER before calling win32k, like done in other places. Convert it back after. This allows to simplify NtGdiGetDIBitsInternal (not done yet)

Modified:
    trunk/reactos/dll/win32/gdi32/objects/bitmap.c

Modified: trunk/reactos/dll/win32/gdi32/objects/bitmap.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/gdi32/objects/bitmap.c?rev=50918&r1=50917&r2=50918&view=diff
==============================================================================
--- trunk/reactos/dll/win32/gdi32/objects/bitmap.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/gdi32/objects/bitmap.c [iso-8859-1] Sun Feb 27 17:20:02 2011
@@ -410,6 +410,33 @@
     return CreateDIBSection(hDC, (CONST BITMAPINFO *)&dibs.dsBmih, 0, NULL, NULL, 0);
 }
 
+void
+ConvertBackBitmapInfo(PBITMAPINFO pbmi, PBITMAPINFO pbmiConverted)
+{
+    /* Check if we converted from PBITMAPCOREINFO */
+    if (pbmiConverted != pbmi)
+    {
+        PBITMAPCOREINFO pbci = (PBITMAPCOREINFO)pbmi;
+
+        /* Convert back header */
+        pbci->bmciHeader.biSize = sizeof(BITMAPCOREHEADER);
+        pbci->bmciHeader.bcWidth = pbmiConverted->bmiHeader.biWidth;
+        pbci->bmciHeader.bcHeight = pbmiConverted->bmiHeader.biHeight;
+        pbci->bmciHeader.bcPlanes = 1;
+        pbci->bmciHeader.bcBitCount = pbmiConverted->bmiHeader.biBitCount;
+
+        /* Convert back colors */
+        for (i = 0; i < pbmiConverted->bmiHeader.biClrUsed; i++)
+        {
+            pbci->bmciColors.rgbtRed = pbmiConverted->bmiColors.rgbRed;
+            pbci->bmciColors.rgbtGreen = pbmiConverted->bmiColors.rgbGreen;
+            pbci->bmciColors.rgbtBlue = pbmiConverted->bmiColors.rgbBlue;
+        }
+
+        /* Free memory */
+        RtlFreeHeap(RtlGetProcessHeap(), 0, pbmiConverted);
+    }
+}
 
 INT
 WINAPI
@@ -422,8 +449,9 @@
     LPBITMAPINFO lpbmi,
     UINT uUsage)
 {
-    UINT cjBmpScanSize;
-    UINT cjInfoSize;
+    PBITMAPINFO pbmiConverted;
+    UINT cjBmpScanSize, cjInfoSize;
+    INT iResult;
 
     if (!hDC || !GdiIsHandleValid((HGDIOBJ)hDC) || !lpbmi)
     {
@@ -431,15 +459,22 @@
         return 0;
     }
 
+    /* Convert BITMAPINFO to a proper format */
+    pbmiConverted = ConvertBitmapInfo(lpbmi, uUsage, &cjInfoSize, FALSE);
+    if (!pbmiConverted)
+    {
+        GdiSetLastError(ERROR_INVALID_PARAMETER);
+        return 0;
+    }
+
     cjBmpScanSize = DIB_BitmapMaxBitsSize(lpbmi, cScanLines);
-    cjInfoSize = DIB_BitmapInfoSize(lpbmi, uUsage);
-
-    if ( lpvBits )
-    {
-        if ( lpbmi->bmiHeader.biSize >= sizeof(BITMAPINFOHEADER) )
-        {
-            if ( lpbmi->bmiHeader.biCompression == BI_JPEG ||
-                    lpbmi->bmiHeader.biCompression == BI_PNG )
+
+    if (lpvBits)
+    {
+        if (lpbmi->bmiHeader.biSize >= sizeof(BITMAPINFOHEADER))
+        {
+            if (lpbmi->bmiHeader.biCompression == BI_JPEG ||
+                lpbmi->bmiHeader.biCompression == BI_PNG)
             {
                 SetLastError(ERROR_INVALID_PARAMETER);
                 return 0;
@@ -447,16 +482,21 @@
         }
     }
 
-    return NtGdiGetDIBitsInternal(hDC,
-                                  hbmp,
-                                  uStartScan,
-                                  cScanLines,
-                                  lpvBits,
-                                  lpbmi,
-                                  uUsage,
-                                  cjBmpScanSize,
-                                  cjInfoSize);
-}
+    iResult = NtGdiGetDIBitsInternal(hDC,
+                                     hbmp,
+                                     uStartScan,
+                                     cScanLines,
+                                     lpvBits,
+                                     pbmiConverted,
+                                     uUsage,
+                                     cjBmpScanSize,
+                                     cjInfoSize);
+
+    ConvertBackBitmapInfo(lpbmi, pbmiConverted);
+
+    return iResult;
+}
+
 
 /*
  * @implemented




More information about the Ros-diffs mailing list