Huw Davies : gdi32: Update pixel colours when the colour table changes.

Alexandre Julliard julliard at winehq.org
Thu Jun 2 11:23:00 CDT 2011


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

Author: Huw Davies <huw at codeweavers.com>
Date:   Thu Jun  2 12:22:02 2011 +0100

gdi32: Update pixel colours when the colour table changes.

---

 dlls/gdi32/dibdrv/dc.c      |   38 +++++++++++++++++++++++++++++++++-----
 dlls/gdi32/dibdrv/objects.c |    4 ++++
 dlls/gdi32/gdi_private.h    |    2 ++
 3 files changed, 39 insertions(+), 5 deletions(-)

diff --git a/dlls/gdi32/dibdrv/dc.c b/dlls/gdi32/dibdrv/dc.c
index 8bdb60d..6a38480 100644
--- a/dlls/gdi32/dibdrv/dc.c
+++ b/dlls/gdi32/dibdrv/dc.c
@@ -357,6 +357,37 @@ 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
+ */
+static UINT CDECL dibdrv_SetDIBColorTable( PHYSDEV dev, UINT pos, UINT count, const RGBQUAD *colors )
+{
+    PHYSDEV next = GET_NEXT_PHYSDEV( dev, pSetDIBColorTable );
+    dibdrv_physdev *pdev = get_dibdrv_pdev(dev);
+    TRACE("(%p, %d, %d, %p)\n", dev, pos, count, colors);
+
+    if( pdev->dib.color_table && pos < pdev->dib.color_table_size )
+    {
+        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_masks( pdev, GetROP2( dev->hdc ) );
+    }
+    return next->funcs->pSetDIBColorTable( next, pos, count, colors );
+}
+
 /***********************************************************************
  *           dibdrv_SetROP2
  */
@@ -365,10 +396,7 @@ static INT CDECL dibdrv_SetROP2( PHYSDEV dev, INT rop )
     PHYSDEV next = GET_NEXT_PHYSDEV( dev, pSetROP2 );
     dibdrv_physdev *pdev = get_dibdrv_pdev(dev);
 
-    calc_and_xor_masks(rop, pdev->pen_color, &pdev->pen_and, &pdev->pen_xor);
-    update_brush_rop(pdev, rop);
-    if( GetBkMode(dev->hdc) == OPAQUE )
-        calc_and_xor_masks(rop, pdev->bkgnd_color, &pdev->bkgnd_and, &pdev->bkgnd_xor);
+    update_masks( pdev, rop );
 
     return next->funcs->pSetROP2( next, rop );
 }
@@ -462,7 +490,7 @@ const DC_FUNCTIONS dib_driver =
     dibdrv_SetBkMode,                   /* pSetBkMode */
     dibdrv_SetDCBrushColor,             /* pSetDCBrushColor */
     dibdrv_SetDCPenColor,               /* pSetDCPenColor */
-    NULL,                               /* pSetDIBColorTable */
+    dibdrv_SetDIBColorTable,            /* pSetDIBColorTable */
     NULL,                               /* pSetDIBits */
     NULL,                               /* pSetDIBitsToDevice */
     dibdrv_SetDeviceClipping,           /* pSetDeviceClipping */
diff --git a/dlls/gdi32/dibdrv/objects.c b/dlls/gdi32/dibdrv/objects.c
index ce6e710..381cc39 100644
--- a/dlls/gdi32/dibdrv/objects.c
+++ b/dlls/gdi32/dibdrv/objects.c
@@ -868,6 +868,7 @@ HPEN CDECL dibdrv_SelectPen( PHYSDEV dev, HPEN hpen )
     if (hpen == GetStockObject( DC_PEN ))
         logpen.lopnColor = GetDCPenColor( dev->hdc );
 
+    pdev->pen_colorref = logpen.lopnColor;
     pdev->pen_color = pdev->dib.funcs->colorref_to_pixel(&pdev->dib, logpen.lopnColor);
     calc_and_xor_masks(GetROP2(dev->hdc), pdev->pen_color, &pdev->pen_and, &pdev->pen_xor);
 
@@ -919,6 +920,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);
         calc_and_xor_masks(GetROP2(dev->hdc), pdev->pen_color, &pdev->pen_and, &pdev->pen_xor);
     }
@@ -1102,6 +1104,7 @@ HBRUSH CDECL dibdrv_SelectBrush( PHYSDEV dev, HBRUSH hbrush )
     switch(logbrush.lbStyle)
     {
     case BS_SOLID:
+        pdev->brush_colorref = logbrush.lbColor;
         pdev->brush_color = pdev->dib.funcs->colorref_to_pixel(&pdev->dib, logbrush.lbColor);
         calc_and_xor_masks(GetROP2(dev->hdc), pdev->brush_color, &pdev->brush_and, &pdev->brush_xor);
         pdev->brush_rects = solid_brush;
@@ -1152,6 +1155,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);
         calc_and_xor_masks(GetROP2(dev->hdc), pdev->brush_color, &pdev->brush_and, &pdev->brush_xor);
     }
diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h
index 9a188ee..7d1240b 100644
--- a/dlls/gdi32/gdi_private.h
+++ b/dlls/gdi32/gdi_private.h
@@ -118,6 +118,7 @@ typedef struct dibdrv_physdev
     DWORD defer;
 
     /* pen */
+    COLORREF pen_colorref;
     DWORD pen_color, pen_and, pen_xor;
     dash_pattern pen_pattern;
     dash_pos dash_pos;
@@ -126,6 +127,7 @@ typedef struct dibdrv_physdev
     /* brush */
     UINT brush_style;
     INT brush_rop;   /* PatBlt, for example, can override the DC's rop2 */
+    COLORREF brush_colorref;
     DWORD brush_color, brush_and, brush_xor;
     dib_info brush_dib;
     void *brush_and_bits, *brush_xor_bits;




More information about the wine-cvs mailing list