Module: wine Branch: master Commit: 3582d3dfb41fdc51854b2fc6d3cc9b7a392064b5 URL: http://source.winehq.org/git/wine.git/?a=commit;h=3582d3dfb41fdc51854b2fc6d3...
Author: Huw Davies huw@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); }