Huw Davies : gdi32: Add helpers to retrieve foreground and background colours.

Alexandre Julliard julliard at winehq.org
Wed Jun 15 13:43:01 CDT 2011


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

Author: Huw Davies <huw at codeweavers.com>
Date:   Wed Jun 15 13:43:48 2011 +0100

gdi32: Add helpers to retrieve foreground and background colours.

---

 dlls/gdi32/dibdrv/dc.c      |   25 +++++++++++++++----------
 dlls/gdi32/dibdrv/dibdrv.h  |    1 +
 dlls/gdi32/dibdrv/objects.c |   41 +++++++++++++++++++++++++++++++++++------
 3 files changed, 51 insertions(+), 16 deletions(-)

diff --git a/dlls/gdi32/dibdrv/dc.c b/dlls/gdi32/dibdrv/dc.c
index 6a38480..53e63bd 100644
--- a/dlls/gdi32/dibdrv/dc.c
+++ b/dlls/gdi32/dibdrv/dc.c
@@ -262,6 +262,20 @@ BOOL convert_dib(dib_info *dst, const dib_info *src)
     return ret;
 }
 
+static void update_fg_colors( dibdrv_physdev *pdev )
+{
+    pdev->pen_color   = get_fg_color( pdev, pdev->pen_colorref );
+    pdev->brush_color = get_fg_color( pdev, pdev->brush_colorref );
+}
+
+static void update_masks( dibdrv_physdev *pdev, INT rop )
+{
+    calc_and_xor_masks( rop, pdev->pen_color, &pdev->pen_and, &pdev->pen_xor );
+    update_brush_rop( pdev, rop );
+    if( GetBkMode( pdev->dev.hdc ) == OPAQUE )
+        calc_and_xor_masks( rop, pdev->bkgnd_color, &pdev->bkgnd_and, &pdev->bkgnd_xor );
+}
+
 /***********************************************************************
  *           dibdrv_DeleteDC
  */
@@ -357,14 +371,6 @@ static void CDECL dibdrv_SetDeviceClipping( PHYSDEV dev, HRGN vis_rgn, HRGN clip
     return next->funcs->pSetDeviceClipping( next, vis_rgn, clip_rgn);
 }
 
-static void update_masks( dibdrv_physdev *pdev, INT rop )
-{
-    calc_and_xor_masks( rop, pdev->pen_color, &pdev->pen_and, &pdev->pen_xor );
-    update_brush_rop( pdev, rop );
-    if( GetBkMode( pdev->dev.hdc ) == OPAQUE )
-        calc_and_xor_masks( rop, pdev->bkgnd_color, &pdev->bkgnd_and, &pdev->bkgnd_xor );
-}
-
 /***********************************************************************
  *           dibdrv_SetDIBColorTable
  */
@@ -379,9 +385,8 @@ static UINT CDECL dibdrv_SetDIBColorTable( PHYSDEV dev, UINT pos, UINT count, co
         if( pos + count > pdev->dib.color_table_size ) count = pdev->dib.color_table_size - pos;
         memcpy( pdev->dib.color_table + pos, colors, count * sizeof(RGBQUAD) );
 
-        pdev->pen_color   = pdev->dib.funcs->colorref_to_pixel( &pdev->dib, pdev->pen_colorref );
-        pdev->brush_color = pdev->dib.funcs->colorref_to_pixel( &pdev->dib, pdev->brush_colorref );
         pdev->bkgnd_color = pdev->dib.funcs->colorref_to_pixel( &pdev->dib, GetBkColor( dev->hdc ) );
+        update_fg_colors( pdev );
 
         update_masks( pdev, GetROP2( dev->hdc ) );
     }
diff --git a/dlls/gdi32/dibdrv/dibdrv.h b/dlls/gdi32/dibdrv/dibdrv.h
index c23574b..3ebe4fe 100644
--- a/dlls/gdi32/dibdrv/dibdrv.h
+++ b/dlls/gdi32/dibdrv/dibdrv.h
@@ -62,6 +62,7 @@ extern void free_dib_info(dib_info *dib, BOOL free_bits) DECLSPEC_HIDDEN;
 extern void free_pattern_brush(dibdrv_physdev *pdev) DECLSPEC_HIDDEN;
 extern void copy_dib_color_info(dib_info *dst, const dib_info *src) DECLSPEC_HIDDEN;
 extern BOOL convert_dib(dib_info *dst, const dib_info *src) DECLSPEC_HIDDEN;
+extern DWORD get_fg_color(dibdrv_physdev *pdev, COLORREF color) DECLSPEC_HIDDEN;
 
 static inline BOOL defer_pen(dibdrv_physdev *pdev)
 {
diff --git a/dlls/gdi32/dibdrv/objects.c b/dlls/gdi32/dibdrv/objects.c
index 381cc39..2b59d0a 100644
--- a/dlls/gdi32/dibdrv/objects.c
+++ b/dlls/gdi32/dibdrv/objects.c
@@ -92,6 +92,36 @@ void calc_and_xor_masks(INT rop, DWORD color, DWORD *and, DWORD *xor)
     *xor = (color & rop2_xor_array[rop-1][0]) | ((~color) & rop2_xor_array[rop-1][1]);
 }
 
+/******************************************************************
+ *                   get_fg_color
+ */
+DWORD get_fg_color( dibdrv_physdev *pdev, COLORREF fg )
+{
+    if(pdev->dib.bit_count != 1)
+        return pdev->dib.funcs->colorref_to_pixel( &pdev->dib, fg );
+
+    FIXME("bit count == 1\n");
+    return 0;
+}
+
+/***************************************************************************
+ *                get_pen_bkgnd_masks
+ */
+static inline void get_pen_bkgnd_masks(const dibdrv_physdev *pdev, DWORD *and, DWORD *xor)
+{
+    if(pdev->dib.bit_count != 1 || GetBkMode(pdev->dev.hdc) == TRANSPARENT)
+    {
+        *and = pdev->bkgnd_and;
+        *xor = pdev->bkgnd_xor;
+    }
+    else
+    {
+        FIXME("bit count == 1\n");
+        *and = ~0u;
+        *xor = 0u;
+    }
+}
+
 static inline void order_end_points(int *s, int *e)
 {
     if(*s > *e)
@@ -579,8 +609,7 @@ static inline void get_dash_colors(const dibdrv_physdev *pdev, DWORD *and, DWORD
     }
     else /* space */
     {
-        *and = pdev->bkgnd_and;
-        *xor = pdev->bkgnd_xor;
+        get_pen_bkgnd_masks( pdev, and, xor );
     }
 }
 
@@ -869,7 +898,7 @@ HPEN CDECL dibdrv_SelectPen( PHYSDEV dev, HPEN hpen )
         logpen.lopnColor = GetDCPenColor( dev->hdc );
 
     pdev->pen_colorref = logpen.lopnColor;
-    pdev->pen_color = pdev->dib.funcs->colorref_to_pixel(&pdev->dib, logpen.lopnColor);
+    pdev->pen_color = get_fg_color( pdev, pdev->pen_colorref );
     calc_and_xor_masks(GetROP2(dev->hdc), pdev->pen_color, &pdev->pen_and, &pdev->pen_xor);
 
     pdev->pen_pattern = dash_patterns[PS_SOLID];
@@ -921,7 +950,7 @@ COLORREF CDECL dibdrv_SetDCPenColor( PHYSDEV dev, COLORREF color )
     if (GetCurrentObject(dev->hdc, OBJ_PEN) == GetStockObject( DC_PEN ))
     {
         pdev->pen_colorref = color;
-        pdev->pen_color = pdev->dib.funcs->colorref_to_pixel(&pdev->dib, color);
+        pdev->pen_color = get_fg_color( pdev, pdev->pen_colorref );
         calc_and_xor_masks(GetROP2(dev->hdc), pdev->pen_color, &pdev->pen_and, &pdev->pen_xor);
     }
 
@@ -1105,7 +1134,7 @@ HBRUSH CDECL dibdrv_SelectBrush( PHYSDEV dev, HBRUSH hbrush )
     {
     case BS_SOLID:
         pdev->brush_colorref = logbrush.lbColor;
-        pdev->brush_color = pdev->dib.funcs->colorref_to_pixel(&pdev->dib, logbrush.lbColor);
+        pdev->brush_color = get_fg_color( pdev, pdev->brush_colorref );
         calc_and_xor_masks(GetROP2(dev->hdc), pdev->brush_color, &pdev->brush_and, &pdev->brush_xor);
         pdev->brush_rects = solid_brush;
         pdev->defer &= ~DEFER_BRUSH;
@@ -1156,7 +1185,7 @@ COLORREF CDECL dibdrv_SetDCBrushColor( PHYSDEV dev, COLORREF color )
     if (GetCurrentObject(dev->hdc, OBJ_BRUSH) == GetStockObject( DC_BRUSH ))
     {
         pdev->brush_colorref = color;
-        pdev->brush_color = pdev->dib.funcs->colorref_to_pixel(&pdev->dib, color);
+        pdev->brush_color = get_fg_color( pdev, pdev->brush_colorref );
         calc_and_xor_masks(GetROP2(dev->hdc), pdev->brush_color, &pdev->brush_and, &pdev->brush_xor);
     }
 




More information about the wine-cvs mailing list