gdi32: Recompute the foreground masks on every use to support PALETTEINDEX colors.

This commit is contained in:
Alexandre Julliard 2011-12-22 16:32:37 +01:00
parent e166ec0bb0
commit 56532d0cf7
3 changed files with 16 additions and 56 deletions

View File

@ -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
*
@ -364,19 +359,6 @@ static HBITMAP dibdrv_SelectBitmap( PHYSDEV dev, HBITMAP bitmap )
return next->funcs->pSelectBitmap( next, 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
*/
@ -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 */

View File

@ -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 )

View File

@ -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)