Vladimir Panteleev : winex11: Add X11DRV_PALETTE_GetColor function to resolve any COLORREF to an RGB.

Alexandre Julliard julliard at winehq.org
Mon Nov 8 11:46:19 CST 2010


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

Author: Vladimir Panteleev <vladimir at thecybershadow.net>
Date:   Sun Nov  7 05:15:13 2010 +0200

winex11: Add X11DRV_PALETTE_GetColor function to resolve any COLORREF to an RGB.

---

 dlls/winex11.drv/palette.c |   50 ++++++++++++++++++++++++++++++++++++++-----
 dlls/winex11.drv/x11drv.h  |    1 +
 2 files changed, 45 insertions(+), 6 deletions(-)

diff --git a/dlls/winex11.drv/palette.c b/dlls/winex11.drv/palette.c
index adff6c1..a7a6b35 100644
--- a/dlls/winex11.drv/palette.c
+++ b/dlls/winex11.drv/palette.c
@@ -874,6 +874,49 @@ static inline BOOL colour_is_brighter(RGBQUAD c1, RGBQUAD c2)
 }
 
 /***********************************************************************
+ *           X11DRV_PALETTE_GetColor
+ *
+ * Resolve PALETTEINDEX/PALETTERGB/DIBINDEX COLORREFs to an RGB COLORREF.
+ */
+COLORREF X11DRV_PALETTE_GetColor( X11DRV_PDEVICE *physDev, COLORREF color )
+{
+    HPALETTE             hPal = GetCurrentObject(physDev->hdc, OBJ_PAL );
+    unsigned char        spec_type = color >> 24;
+    unsigned             idx = color & 0xffff;
+    PALETTEENTRY         entry;
+    RGBQUAD              quad;
+
+    switch(spec_type)
+    {
+      case 2:  /* PALETTERGB */
+        idx = GetNearestPaletteIndex( hPal, color );
+        /* fall through to PALETTEINDEX */
+
+      case 1: /* PALETTEINDEX */
+        if (!GetPaletteEntries( hPal, idx, 1, &entry ))
+        {
+            WARN("PALETTEINDEX(%x) : idx %d is out of bounds, assuming black\n", color, idx);
+            return 0;
+        }
+        return RGB( entry.peRed, entry.peGreen, entry.peBlue );
+
+      case 0x10: /* DIBINDEX */
+        if( GetDIBColorTable( physDev->hdc, idx, 1, &quad ) != 1 ) {
+            WARN("DIBINDEX(%x) : idx %d is out of bounds, assuming black\n", color , idx);
+            return 0;
+        }
+        return RGB( quad.rgbRed, quad.rgbGreen, quad.rgbBlue );
+
+      default:
+        color &= 0xffffff;
+        /* fall through to RGB */
+
+      case 0: /* RGB */
+        return color;
+    }
+}
+
+/***********************************************************************
  *           X11DRV_PALETTE_ToPhysical
  *
  * Return the physical color closest to 'color'.
@@ -898,16 +941,11 @@ int X11DRV_PALETTE_ToPhysical( X11DRV_PDEVICE *physDev, COLORREF color )
 
 	unsigned 	long red, green, blue;
 	unsigned	idx = color & 0xffff;
-        RGBQUAD         quad;
 
 	switch(spec_type)
         {
           case 0x10: /* DIBINDEX */
-            if( GetDIBColorTable( physDev->hdc, idx, 1, &quad ) != 1 ) {
-                WARN("DIBINDEX(%x) : idx %d is out of bounds, assuming black\n", color , idx);
-                return 0;
-            }
-            color = RGB( quad.rgbRed, quad.rgbGreen, quad.rgbBlue );
+            color = X11DRV_PALETTE_GetColor( physDev, color );
             break;
                 
           case 1: /* PALETTEINDEX */
diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h
index f0c0dc6..4412f3e 100644
--- a/dlls/winex11.drv/x11drv.h
+++ b/dlls/winex11.drv/x11drv.h
@@ -502,6 +502,7 @@ extern BOOL X11DRV_IsSolidColor(COLORREF color);
 
 extern COLORREF X11DRV_PALETTE_ToLogical(X11DRV_PDEVICE *physDev, int pixel);
 extern int X11DRV_PALETTE_ToPhysical(X11DRV_PDEVICE *physDev, COLORREF color);
+extern COLORREF X11DRV_PALETTE_GetColor( X11DRV_PDEVICE *physDev, COLORREF color );
 extern int X11DRV_PALETTE_LookupPixel(ColorShifts *shifts, COLORREF color);
 extern void X11DRV_PALETTE_ComputeColorShifts(ColorShifts *shifts, unsigned long redMask, unsigned long greenMask, unsigned long blueMask);
 




More information about the wine-cvs mailing list