Module: wine Branch: master Commit: 56532d0cf7108333ceff227d6d8acabc9891e8fe URL: http://source.winehq.org/git/wine.git/?a=commit;h=56532d0cf7108333ceff227d6d...
Author: Alexandre Julliard julliard@winehq.org Date: Thu Dec 22 16:32:37 2011 +0100
gdi32: Recompute the foreground masks on every use to support PALETTEINDEX colors.
---
dlls/gdi32/dibdrv/dc.c | 42 ++++-------------------------------------- dlls/gdi32/dibdrv/dibdrv.h | 5 ----- dlls/gdi32/dibdrv/graphics.c | 25 ++++++++++++------------- 3 files changed, 16 insertions(+), 56 deletions(-)
diff --git a/dlls/gdi32/dibdrv/dc.c b/dlls/gdi32/dibdrv/dc.c index f3cf1d5..cdcbd19 100644 --- a/dlls/gdi32/dibdrv/dc.c +++ b/dlls/gdi32/dibdrv/dc.c @@ -257,11 +257,6 @@ DWORD convert_bitmapinfo( const BITMAPINFO *src_info, void *src_bits, struct bit return ERROR_SUCCESS; }
-static void update_fg_colors( dibdrv_physdev *pdev ) -{ - pdev->text_color = get_pixel_color( pdev, GetTextColor( pdev->dev.hdc ), TRUE ); -} - /*********************************************************************** * add_extra_clipping_region * @@ -365,19 +360,6 @@ static HBITMAP dibdrv_SelectBitmap( PHYSDEV dev, HBITMAP bitmap ) }
/*********************************************************************** - * dibdrv_SetBkColor - */ -static COLORREF dibdrv_SetBkColor( PHYSDEV dev, COLORREF color ) -{ - PHYSDEV next = GET_NEXT_PHYSDEV( dev, pSetBkColor ); - dibdrv_physdev *pdev = get_dibdrv_pdev(dev); - - update_fg_colors( pdev ); /* Only needed in the 1 bpp case */ - - return next->funcs->pSetBkColor( next, color ); -} - -/*********************************************************************** * dibdrv_SetDeviceClipping */ static void dibdrv_SetDeviceClipping( PHYSDEV dev, HRGN rgn ) @@ -400,11 +382,8 @@ static UINT dibdrv_SetDIBColorTable( PHYSDEV dev, UINT pos, UINT count, const RG dibdrv_physdev *pdev = get_dibdrv_pdev(dev); TRACE("(%p, %d, %d, %p)\n", dev, pos, count, colors);
- if (pdev->dib.color_table) - { - update_fg_colors( pdev ); - update_brush_rop( pdev, GetROP2( dev->hdc ) ); - } + if (pdev->dib.color_table) update_brush_rop( pdev, GetROP2( dev->hdc ) ); + return next->funcs->pSetDIBColorTable( next, pos, count, colors ); }
@@ -421,19 +400,6 @@ static INT dibdrv_SetROP2( PHYSDEV dev, INT rop ) return next->funcs->pSetROP2( next, rop ); }
-/*********************************************************************** - * dibdrv_SetTextColor - */ -static COLORREF dibdrv_SetTextColor( PHYSDEV dev, COLORREF color ) -{ - PHYSDEV next = GET_NEXT_PHYSDEV( dev, pSetTextColor ); - dibdrv_physdev *pdev = get_dibdrv_pdev(dev); - - pdev->text_color = get_pixel_color( pdev, color, TRUE ); - update_aa_ranges( pdev ); - - return next->funcs->pSetTextColor( next, color ); -}
const struct gdi_dc_funcs dib_driver = { @@ -536,7 +502,7 @@ const struct gdi_dc_funcs dib_driver = NULL, /* pSelectPalette */ dibdrv_SelectPen, /* pSelectPen */ NULL, /* pSetArcDirection */ - dibdrv_SetBkColor, /* pSetBkColor */ + NULL, /* pSetBkColor */ NULL, /* pSetBkMode */ dibdrv_SetDCBrushColor, /* pSetDCBrushColor */ dibdrv_SetDCPenColor, /* pSetDCPenColor */ @@ -555,7 +521,7 @@ const struct gdi_dc_funcs dib_driver = NULL, /* pSetStretchBltMode */ NULL, /* pSetTextAlign */ NULL, /* pSetTextCharacterExtra */ - dibdrv_SetTextColor, /* pSetTextColor */ + NULL, /* pSetTextColor */ NULL, /* pSetTextJustification */ NULL, /* pSetViewportExt */ NULL, /* pSetViewportOrg */ diff --git a/dlls/gdi32/dibdrv/dibdrv.h b/dlls/gdi32/dibdrv/dibdrv.h index 5ff0889..bbb90f4 100644 --- a/dlls/gdi32/dibdrv/dibdrv.h +++ b/dlls/gdi32/dibdrv/dibdrv.h @@ -102,10 +102,6 @@ typedef struct dibdrv_physdev UINT brush_pattern_usage; HBITMAP brush_pattern_bitmap; BOOL (* brush_rects)(struct dibdrv_physdev *pdev, dib_info *dib, int num, const RECT *rects, HRGN clip); - - /* text */ - DWORD text_color; - struct intensity_range glyph_intensities[17]; } dibdrv_physdev;
#define DEFER_PEN 2 @@ -234,7 +230,6 @@ extern HRGN add_extra_clipping_region( dibdrv_physdev *pdev, HRGN rgn ) DECLSPEC extern void restore_clipping_region( dibdrv_physdev *pdev, HRGN rgn ) DECLSPEC_HIDDEN; extern int clip_line(const POINT *start, const POINT *end, const RECT *clip, const bres_params *params, POINT *pt1, POINT *pt2) DECLSPEC_HIDDEN; -extern void update_aa_ranges( dibdrv_physdev *pdev ) DECLSPEC_HIDDEN;
/* compute the x coordinate corresponding to y on the specified edge */ static inline int edge_coord( int y, int x1, int y1, int x2, int y2 ) diff --git a/dlls/gdi32/dibdrv/graphics.c b/dlls/gdi32/dibdrv/graphics.c index 33e7d6d..ad6c4ad 100644 --- a/dlls/gdi32/dibdrv/graphics.c +++ b/dlls/gdi32/dibdrv/graphics.c @@ -103,12 +103,6 @@ static inline void get_aa_ranges( COLORREF col, struct intensity_range intensiti } }
-void update_aa_ranges( dibdrv_physdev *pdev ) -{ - COLORREF text = pdev->dib.funcs->pixel_to_colorref( &pdev->dib, pdev->text_color ); - get_aa_ranges( text, pdev->glyph_intensities ); -} - /********************************************************************** * get_text_bkgnd_masks * @@ -124,14 +118,15 @@ static inline void get_text_bkgnd_masks( dibdrv_physdev *pdev, rop_mask *mask ) mask->xor = get_pixel_color( pdev, bg, FALSE ); else { - mask->xor = ~pdev->text_color; - if (GetTextColor( pdev->dev.hdc ) == bg) - mask->xor = pdev->text_color; + COLORREF fg = GetTextColor( pdev->dev.hdc ); + mask->xor = get_pixel_color( pdev, fg, TRUE ); + if (fg != bg) mask->xor = ~mask->xor; } }
static void draw_glyph( dibdrv_physdev *pdev, const POINT *origin, const GLYPHMETRICS *metrics, - const struct gdi_image_bits *image ) + const struct gdi_image_bits *image, DWORD text_color, + const struct intensity_range *ranges ) { const WINEREGION *clip = get_wine_region( pdev->clip ); int i; @@ -158,7 +153,7 @@ static void draw_glyph( dibdrv_physdev *pdev, const POINT *origin, const GLYPHME src_origin.y = clipped_rect.top - rect.top;
pdev->dib.funcs->draw_glyph( &pdev->dib, &clipped_rect, &glyph_dib, &src_origin, - pdev->text_color, pdev->glyph_intensities ); + text_color, ranges ); } }
@@ -339,8 +334,9 @@ BOOL dibdrv_ExtTextOut( PHYSDEV dev, INT x, INT y, UINT flags, dibdrv_physdev *pdev = get_dibdrv_pdev(dev); UINT aa_flags, i; POINT origin; - DWORD err; + DWORD text_color, err; HRGN saved_clip = NULL; + struct intensity_range ranges[17];
if (flags & ETO_OPAQUE) { @@ -358,6 +354,9 @@ BOOL dibdrv_ExtTextOut( PHYSDEV dev, INT x, INT y, UINT flags, DeleteObject( clip ); }
+ text_color = get_pixel_color( pdev, GetTextColor( pdev->dev.hdc ), TRUE ); + get_aa_ranges( pdev->dib.funcs->pixel_to_colorref( &pdev->dib, text_color ), ranges ); + aa_flags = get_font_aa_flags( dev->hdc ); origin.x = x; origin.y = y; @@ -369,7 +368,7 @@ BOOL dibdrv_ExtTextOut( PHYSDEV dev, INT x, INT y, UINT flags, err = get_glyph_bitmap( dev->hdc, (UINT)str[i], aa_flags, &metrics, &image ); if (err) continue;
- if (image.ptr) draw_glyph( pdev, &origin, &metrics, &image ); + if (image.ptr) draw_glyph( pdev, &origin, &metrics, &image, text_color, ranges ); if (image.free) image.free( &image );
if (dx)