[ros-diffs] [tkreuzer] 56548: [WIN32K] - Make CreateDIBPalette handle BITMAPCOREINFO (we need to handle this, since win32k can load bitmap files, that can contain these headers) - Remove obsolete IntSetDIBColo...

tkreuzer at svn.reactos.org tkreuzer at svn.reactos.org
Wed May 9 08:13:51 UTC 2012


Author: tkreuzer
Date: Wed May  9 08:13:49 2012
New Revision: 56548

URL: http://svn.reactos.org/svn/reactos?rev=56548&view=rev
Log:
[WIN32K]
- Make CreateDIBPalette handle BITMAPCOREINFO (we need to handle this, since win32k can load bitmap files, that can contain these headers)
- Remove obsolete IntSetDIBColorTable, IntGetDIBColorTable

Modified:
    trunk/reactos/win32ss/gdi/ntgdi/dibobj.c

Modified: trunk/reactos/win32ss/gdi/ntgdi/dibobj.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/gdi/ntgdi/dibobj.c?rev=56548&r1=56547&r2=56548&view=diff
==============================================================================
--- trunk/reactos/win32ss/gdi/ntgdi/dibobj.c [iso-8859-1] (original)
+++ trunk/reactos/win32ss/gdi/ntgdi/dibobj.c [iso-8859-1] Wed May  9 08:13:49 2012
@@ -111,13 +111,23 @@
     _In_ ULONG iUsage)
 {
     PPALETTE ppal;
-    ULONG i, cColors;
+    ULONG i, cBitsPixel, cColors;
+
+    if (pbmi->bmiHeader.biSize < sizeof(BITMAPINFOHEADER))
+    {
+        PBITMAPCOREINFO pbci = (PBITMAPCOREINFO)pbmi;
+        cBitsPixel = pbci->bmciHeader.bcBitCount;
+    }
+    else
+    {
+        cBitsPixel = pbmi->bmiHeader.biBitCount;
+    }
 
     /* Check if the colors are indexed */
-    if (pbmi->bmiHeader.biBitCount <= 8)
+    if (cBitsPixel <= 8)
     {
         /* We create a "full" palette */
-        cColors = 1 << pbmi->bmiHeader.biBitCount;
+        cColors = 1 << cBitsPixel;
 
         /* Allocate the palette */
         ppal = PALETTE_AllocPalette(PAL_INDEXED,
@@ -128,7 +138,8 @@
                                     0);
 
         /* Check if the BITMAPINFO specifies how many colors to use */
-        if (pbmi->bmiHeader.biClrUsed != 0)
+        if ((pbmi->bmiHeader.biSize >= sizeof(BITMAPINFOHEADER)) &&
+            (pbmi->bmiHeader.biClrUsed != 0))
         {
             /* This is how many colors we can actually process */
             cColors = min(cColors, pbmi->bmiHeader.biClrUsed);
@@ -179,7 +190,7 @@
             // FIXME: this one is undocumented
 //            ASSERT(FALSE);
 //        }
-        else // if (iUsage == DIB_RGB_COLORS)
+        else if (pbmi->bmiHeader.biSize >= sizeof(BITMAPINFOHEADER))
         {
             /* The colors are an array of RGBQUAD values */
             RGBQUAD *prgb = (RGBQUAD*)((PCHAR)pbmi + pbmi->bmiHeader.biSize);
@@ -197,6 +208,22 @@
                 PALETTE_vSetRGBColorForIndex(ppal, i, crColor);
             }
         }
+        else
+        {
+            /* The colors are an array of RGBTRIPLE values */
+            RGBTRIPLE *prgb = (RGBTRIPLE*)((PCHAR)pbmi + pbmi->bmiHeader.biSize);
+
+            /* Loop all color indices in the DIB */
+            for (i = 0; i < cColors; i++)
+            {
+                /* Get the color value and translate it to a COLORREF */
+                RGBTRIPLE rgb = prgb[i];
+                COLORREF crColor = RGB(rgb.rgbtRed, rgb.rgbtGreen, rgb.rgbtBlue);
+
+                /* Set the RGB value in the palette */
+                PALETTE_vSetRGBColorForIndex(ppal, i, crColor);
+            }
+        }
     }
     else
     {
@@ -204,7 +231,8 @@
         ULONG flRedMask, flGreenMask, flBlueMask;
 
         /* Check if the DIB contains bitfield values */
-        if (pbmi->bmiHeader.biCompression == BI_BITFIELDS)
+        if ((pbmi->bmiHeader.biSize >= sizeof(BITMAPINFOHEADER)) &&
+            (pbmi->bmiHeader.biCompression == BI_BITFIELDS))
         {
             /* Check if we have a v4/v5 header */
             if (pbmi->bmiHeader.biSize >= sizeof(BITMAPV4HEADER))
@@ -228,7 +256,7 @@
         {
             /* Check what bit depth we have. Note: optimization flags are
                calculated in PALETTE_AllocPalette()  */
-            if (pbmi->bmiHeader.biBitCount == 16)
+            if (cBitsPixel == 16)
             {
                 /* This is an RGB 555 palette */
                 flRedMask = 0x7C00;
@@ -255,136 +283,6 @@
 
     /* We're done, return the palette */
     return ppal;
-}
-
-
-UINT
-APIENTRY
-IntSetDIBColorTable(
-    HDC hDC,
-    UINT StartIndex,
-    UINT Entries,
-    CONST RGBQUAD *Colors)
-{
-    PDC dc;
-    PSURFACE psurf;
-    PPALETTE PalGDI;
-    UINT Index;
-    ULONG biBitCount;
-
-    if (!(dc = DC_LockDc(hDC))) return 0;
-    if (dc->dctype == DC_TYPE_INFO)
-    {
-        DC_UnlockDc(dc);
-        return 0;
-    }
-
-    psurf = dc->dclevel.pSurface;
-    if (psurf == NULL)
-    {
-        DC_UnlockDc(dc);
-        EngSetLastError(ERROR_INVALID_PARAMETER);
-        return 0;
-    }
-
-    if (psurf->hSecure == NULL)
-    {
-        DC_UnlockDc(dc);
-        EngSetLastError(ERROR_INVALID_PARAMETER);
-        return 0;
-    }
-
-    biBitCount = BitsPerFormat(psurf->SurfObj.iBitmapFormat);
-    if ((biBitCount <= 8) && (StartIndex < (1UL << biBitCount)))
-    {
-        if (StartIndex + Entries > (1UL << biBitCount))
-            Entries = (1 << biBitCount) - StartIndex;
-
-        if (psurf->ppal == NULL)
-        {
-            DC_UnlockDc(dc);
-            EngSetLastError(ERROR_INVALID_HANDLE);
-            return 0;
-        }
-
-        PalGDI = psurf->ppal;
-
-        for (Index = StartIndex;
-                Index < StartIndex + Entries && Index < PalGDI->NumColors;
-                Index++)
-        {
-            PalGDI->IndexedColors[Index].peRed = Colors[Index - StartIndex].rgbRed;
-            PalGDI->IndexedColors[Index].peGreen = Colors[Index - StartIndex].rgbGreen;
-            PalGDI->IndexedColors[Index].peBlue = Colors[Index - StartIndex].rgbBlue;
-        }
-    }
-    else
-        Entries = 0;
-
-    /* Mark the brushes invalid */
-    dc->pdcattr->ulDirty_ |= DIRTY_FILL|DIRTY_LINE|DIRTY_BACKGROUND|DIRTY_TEXT;
-
-    DC_UnlockDc(dc);
-
-    return Entries;
-}
-
-UINT
-APIENTRY
-IntGetDIBColorTable(
-    HDC hDC,
-    UINT StartIndex,
-    UINT Entries,
-    RGBQUAD *Colors)
-{
-    PDC dc;
-    PSURFACE psurf;
-    PPALETTE ppal;
-    UINT Index, Count = 0;
-
-    if (!(dc = DC_LockDc(hDC))) return 0;
-    if (dc->dctype == DC_TYPE_INFO)
-    {
-        DC_UnlockDc(dc);
-        return 0;
-    }
-
-    psurf = dc->dclevel.pSurface;
-    if (psurf == NULL)
-    {
-        DC_UnlockDc(dc);
-        EngSetLastError(ERROR_INVALID_PARAMETER);
-        return 0;
-    }
-
-    if (psurf->hSecure == NULL)
-    {
-        DC_UnlockDc(dc);
-        EngSetLastError(ERROR_INVALID_PARAMETER);
-        return 0;
-    }
-
-    ppal = psurf->ppal;
-    ASSERT(ppal);
-
-    if (ppal->flFlags & PAL_INDEXED)
-    {
-
-        for (Index = StartIndex;
-                Index < StartIndex + Entries && Index < ppal->NumColors;
-                Index++)
-        {
-            Colors[Index - StartIndex].rgbRed = ppal->IndexedColors[Index].peRed;
-            Colors[Index - StartIndex].rgbGreen = ppal->IndexedColors[Index].peGreen;
-            Colors[Index - StartIndex].rgbBlue = ppal->IndexedColors[Index].peBlue;
-            Colors[Index - StartIndex].rgbReserved = 0;
-            Count++;
-        }
-    }
-
-    DC_UnlockDc(dc);
-
-    return Count;
 }
 
 // Converts a DIB to a device-dependent bitmap




More information about the Ros-diffs mailing list