Huw Davies : gdi32: Add support for non-rgb colorrefs.

Alexandre Julliard julliard at winehq.org
Wed Oct 19 14:05:25 CDT 2011


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

Author: Huw Davies <huw at codeweavers.com>
Date:   Wed Oct 19 12:41:52 2011 +0100

gdi32: Add support for non-rgb colorrefs.

---

 dlls/gdi32/dibdrv/objects.c |   58 +++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 56 insertions(+), 2 deletions(-)

diff --git a/dlls/gdi32/dibdrv/objects.c b/dlls/gdi32/dibdrv/objects.c
index 6b278c8..a1f6829 100644
--- a/dlls/gdi32/dibdrv/objects.c
+++ b/dlls/gdi32/dibdrv/objects.c
@@ -123,6 +123,54 @@ static inline BOOL rgbquad_equal(const RGBQUAD *a, const RGBQUAD *b)
     return FALSE;
 }
 
+static COLORREF make_rgb_colorref( dibdrv_physdev *pdev, COLORREF color,
+                                   BOOL *got_pixel, DWORD *pixel )
+{
+    BYTE type = color >> 24;
+    WORD index = LOWORD( color );
+    HPALETTE pal = GetCurrentObject( pdev->dev.hdc, OBJ_PAL );
+    PALETTEENTRY pal_ent;
+
+    *pixel = 0;
+    *got_pixel = FALSE;
+
+    switch( type )
+    {
+    case 0: break;
+
+    case 0x10: /* DIBINDEX */
+        *got_pixel = TRUE;
+        *pixel = 0;
+        color = RGB(0, 0, 0);
+
+        if (pdev->dib.bit_count <= 8 && index < (1 << pdev->dib.bit_count))
+        {
+            *pixel = index;
+            if (index < pdev->dib.color_table_size)
+                color = RGB( pdev->dib.color_table[index].rgbRed,
+                             pdev->dib.color_table[index].rgbGreen,
+                             pdev->dib.color_table[index].rgbBlue );
+        }
+        break;
+
+    case 2: /* PALETTERGB */
+        color &= 0xffffff;
+        break;
+
+    case 1: /* PALETTEINDEX */
+        if (!GetPaletteEntries( pal, index, 1, &pal_ent ))
+            GetPaletteEntries( pal, 0, 1, &pal_ent );
+        color = RGB( pal_ent.peRed, pal_ent.peGreen, pal_ent.peBlue );
+        break;
+
+    default:
+        FIXME("Unhandled color type %08x\n", color);
+        color &= 0xffffff;
+    }
+
+    return color;
+}
+
 /******************************************************************
  *                   get_pixel_color
  *
@@ -135,11 +183,17 @@ static inline BOOL rgbquad_equal(const RGBQUAD *a, const RGBQUAD *b)
 DWORD get_pixel_color( dibdrv_physdev *pdev, COLORREF color, BOOL mono_fixup )
 {
     RGBQUAD fg_quad;
+    BOOL got_pixel;
+    DWORD pixel;
+    COLORREF rgb_ref;
+
+    rgb_ref = make_rgb_colorref( pdev, color, &got_pixel, &pixel );
+    if (got_pixel) return pixel;
 
     if (pdev->dib.bit_count != 1 || !mono_fixup)
-        return pdev->dib.funcs->colorref_to_pixel( &pdev->dib, color );
+        return pdev->dib.funcs->colorref_to_pixel( &pdev->dib, rgb_ref );
 
-    fg_quad = rgbquad_from_colorref( color );
+    fg_quad = rgbquad_from_colorref( rgb_ref );
     if(rgbquad_equal(&fg_quad, pdev->dib.color_table))
         return 0;
     if(rgbquad_equal(&fg_quad, pdev->dib.color_table + 1))




More information about the wine-cvs mailing list