Francois Gouget : winex11.drv: Remove the coloruse == -1 special case. Add X11DRV_DIB_GetColorCount() for computing a bitmap's number of colors.

Alexandre Julliard julliard at winehq.org
Fri Oct 19 08:35:49 CDT 2007


Module: wine
Branch: master
Commit: 0d24ebfcbbe04e808622b1835b536301b61c9bf1
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=0d24ebfcbbe04e808622b1835b536301b61c9bf1

Author: Francois Gouget <fgouget at codeweavers.com>
Date:   Thu Oct 18 17:10:06 2007 +0200

winex11.drv: Remove the coloruse == -1 special case. Add X11DRV_DIB_GetColorCount() for computing a bitmap's number of colors.

---

 dlls/winex11.drv/dib.c |  102 +++++++++++++++++++++++++++--------------------
 1 files changed, 59 insertions(+), 43 deletions(-)

diff --git a/dlls/winex11.drv/dib.c b/dlls/winex11.drv/dib.c
index 4c28928..e24bd96 100644
--- a/dlls/winex11.drv/dib.c
+++ b/dlls/winex11.drv/dib.c
@@ -257,6 +257,34 @@ static int DIB_GetBitmapInfoEx( const BITMAPINFOHEADER *header, LONG *width,
 
 
 /***********************************************************************
+ *           X11DRV_DIB_GetColorCount
+ *
+ * Computes the number of colors for the bitmap palette.
+ * Should not be called for a >8-bit deep bitmap.
+ */
+static unsigned int X11DRV_DIB_GetColorCount(const BITMAPINFO *info)
+{
+    unsigned int colors;
+    BOOL core_info = info->bmiHeader.biSize == sizeof(BITMAPCOREHEADER);
+
+    if (core_info)
+    {
+        colors = 1 << ((const BITMAPCOREINFO*)info)->bmciHeader.bcBitCount;
+    }
+    else
+    {
+        colors = info->bmiHeader.biClrUsed;
+        if (!colors) colors = 1 << info->bmiHeader.biBitCount;
+    }
+    if (colors > 256)
+    {
+        ERR("called with >256 colors!\n");
+        colors = 0;
+    }
+    return colors;
+}
+
+/***********************************************************************
  *           DIB_GetBitmapInfo
  *
  * Get the info from a bitmap header.
@@ -343,15 +371,10 @@ static int *X11DRV_DIB_GenColorMap( X11DRV_PDEVICE *physDev, int *colorMapping,
     }
     else  /* DIB_PAL_COLORS */
     {
-        if (colorPtr) {
-            const WORD * index = (const WORD *)colorPtr;
+        const WORD * index = (const WORD *)colorPtr;
 
-            for (i = start; i < end; i++, index++)
-                colorMapping[i] = X11DRV_PALETTE_ToPhysical( physDev, PALETTEINDEX(*index) );
-        } else {
-            for (i = start; i < end; i++)
-                colorMapping[i] = X11DRV_PALETTE_ToPhysical( physDev, PALETTEINDEX(i) );
-        }
+        for (i = start; i < end; i++, index++)
+            colorMapping[i] = X11DRV_PALETTE_ToPhysical( physDev, PALETTEINDEX(*index) );
     }
 
     return colorMapping;
@@ -366,40 +389,21 @@ static int *X11DRV_DIB_GenColorMap( X11DRV_PDEVICE *physDev, int *colorMapping,
 static int *X11DRV_DIB_BuildColorMap( X11DRV_PDEVICE *physDev, WORD coloruse, WORD depth,
                                       const BITMAPINFO *info, int *nColors )
 {
-    unsigned int colors;
     BOOL isInfo;
     const void *colorPtr;
     int *colorMapping;
 
-    isInfo = info->bmiHeader.biSize != sizeof(BITMAPCOREHEADER);
 
-    if (isInfo)
-    {
-        colors = info->bmiHeader.biClrUsed;
-        if (!colors) colors = 1 << info->bmiHeader.biBitCount;
-    }
-    else
-    {
-        colors = 1 << ((const BITMAPCOREHEADER *)info)->bcBitCount;
-    }
+    *nColors = X11DRV_DIB_GetColorCount(info);
+    if (!*nColors) return NULL;
 
-    colorPtr = (const BYTE*) info + (WORD) info->bmiHeader.biSize;
-
-    if (colors > 256)
-    {
-        ERR("called with >256 colors!\n");
-        return NULL;
-    }
-
-    /* just so CopyDIBSection doesn't have to create an identity palette */
-    if (coloruse == (WORD)-1) colorPtr = NULL;
-
-    if (!(colorMapping = HeapAlloc(GetProcessHeap(), 0, colors * sizeof(int) )))
+    isInfo = info->bmiHeader.biSize != sizeof(BITMAPCOREHEADER);
+    colorPtr = (const BYTE*)info + (WORD)info->bmiHeader.biSize;
+    if (!(colorMapping = HeapAlloc(GetProcessHeap(), 0, *nColors * sizeof(int) )))
         return NULL;
 
-    *nColors = colors;
     return X11DRV_DIB_GenColorMap( physDev, colorMapping, coloruse, depth,
-                                   isInfo, colorPtr, 0, colors);
+                                   isInfo, colorPtr, 0, *nColors);
 }
 
 /***********************************************************************
@@ -4199,7 +4203,9 @@ void X11DRV_DIB_CopyDIBSection(X11DRV_PDEVICE *physDevSrc, X11DRV_PDEVICE *physD
 {
   DIBSECTION dib;
   X_PHYSBITMAP *physBitmap;
-  int nColorMap = 0, *colorMap = NULL, aColorMap = FALSE;
+  unsigned int nColorMap;
+  int* x11ColorMap;
+  int freeColorMap;
 
   TRACE("(%p,%p,%d,%d,%d,%d,%d,%d)\n", physDevSrc->hdc, physDevDst->hdc,
     xSrc, ySrc, xDest, yDest, width, height);
@@ -4228,24 +4234,34 @@ void X11DRV_DIB_CopyDIBSection(X11DRV_PDEVICE *physDevSrc, X11DRV_PDEVICE *physD
 	 * use the DIB colormap instead - this is necessary in some
 	 * cases since we need to do depth conversion in some places
 	 * where real Windows can just copy data straight over */
-	colorMap = physBitmap->colorMap;
+	x11ColorMap = physBitmap->colorMap;
 	nColorMap = physBitmap->nColorMap;
+        freeColorMap = FALSE;
       } else {
-	colorMap = X11DRV_DIB_BuildColorMap( physDevSrc, (WORD)-1,
-					     dib.dsBm.bmBitsPixel,
-					     (BITMAPINFO*)&dib.dsBmih,
-					     &nColorMap );
-	if (colorMap) aColorMap = TRUE;
+	  const BITMAPINFO* info = (BITMAPINFO*)&dib.dsBmih;
+	  int i;
+
+	  nColorMap = X11DRV_DIB_GetColorCount(info);
+	  x11ColorMap = HeapAlloc(GetProcessHeap(), 0, nColorMap * sizeof(int));
+	  for (i = 0; i < nColorMap; i++)
+	      x11ColorMap[i] = X11DRV_PALETTE_ToPhysical(physDevSrc, PALETTEINDEX(i));
+	  freeColorMap = TRUE;
       }
     }
+    else
+    {
+        nColorMap = 0;
+        x11ColorMap = NULL;
+        freeColorMap = FALSE;
+    }
     /* perform the copy */
-    X11DRV_DIB_DoCopyDIBSection(physBitmap, FALSE, colorMap, nColorMap,
+    X11DRV_DIB_DoCopyDIBSection(physBitmap, FALSE, x11ColorMap, nColorMap,
 				physDevDst->drawable, physDevDst->gc, xSrc, ySrc,
                                 physDevDst->dc_rect.left + xDest, physDevDst->dc_rect.top + yDest,
 				width, height);
     /* free color mapping */
-    if (aColorMap)
-      HeapFree(GetProcessHeap(), 0, colorMap);
+    if (freeColorMap)
+      HeapFree(GetProcessHeap(), 0, x11ColorMap);
   }
 }
 




More information about the wine-cvs mailing list