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

This commit is contained in:
Alexandre Julliard 2011-12-22 16:18:13 +01:00
parent 9237638c0e
commit e166ec0bb0
4 changed files with 26 additions and 56 deletions

View File

@ -262,13 +262,6 @@ static void update_fg_colors( dibdrv_physdev *pdev )
pdev->text_color = get_pixel_color( pdev, GetTextColor( pdev->dev.hdc ), TRUE ); pdev->text_color = get_pixel_color( pdev, GetTextColor( pdev->dev.hdc ), TRUE );
} }
static void update_masks( dibdrv_physdev *pdev, INT rop )
{
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 );
}
/*********************************************************************** /***********************************************************************
* add_extra_clipping_region * add_extra_clipping_region
* *
@ -379,40 +372,11 @@ static COLORREF dibdrv_SetBkColor( PHYSDEV dev, COLORREF color )
PHYSDEV next = GET_NEXT_PHYSDEV( dev, pSetBkColor ); PHYSDEV next = GET_NEXT_PHYSDEV( dev, pSetBkColor );
dibdrv_physdev *pdev = get_dibdrv_pdev(dev); dibdrv_physdev *pdev = get_dibdrv_pdev(dev);
pdev->bkgnd_color = get_pixel_color( pdev, color, FALSE );
if( GetBkMode(dev->hdc) == OPAQUE )
calc_and_xor_masks( GetROP2(dev->hdc), pdev->bkgnd_color, &pdev->bkgnd_and, &pdev->bkgnd_xor );
else
{
pdev->bkgnd_and = ~0u;
pdev->bkgnd_xor = 0;
}
update_fg_colors( pdev ); /* Only needed in the 1 bpp case */ update_fg_colors( pdev ); /* Only needed in the 1 bpp case */
return next->funcs->pSetBkColor( next, color ); return next->funcs->pSetBkColor( next, color );
} }
/***********************************************************************
* dibdrv_SetBkMode
*/
static INT dibdrv_SetBkMode( PHYSDEV dev, INT mode )
{
PHYSDEV next = GET_NEXT_PHYSDEV( dev, pSetBkMode );
dibdrv_physdev *pdev = get_dibdrv_pdev(dev);
if( mode == OPAQUE )
calc_and_xor_masks( GetROP2(dev->hdc), pdev->bkgnd_color, &pdev->bkgnd_and, &pdev->bkgnd_xor );
else
{
pdev->bkgnd_and = ~0u;
pdev->bkgnd_xor = 0;
}
return next->funcs->pSetBkMode( next, mode );
}
/*********************************************************************** /***********************************************************************
* dibdrv_SetDeviceClipping * dibdrv_SetDeviceClipping
*/ */
@ -438,10 +402,8 @@ static UINT dibdrv_SetDIBColorTable( PHYSDEV dev, UINT pos, UINT count, const RG
if (pdev->dib.color_table) if (pdev->dib.color_table)
{ {
pdev->bkgnd_color = get_pixel_color( pdev, GetBkColor( dev->hdc ), FALSE );
update_fg_colors( pdev ); update_fg_colors( pdev );
update_brush_rop( pdev, GetROP2( dev->hdc ) );
update_masks( pdev, GetROP2( dev->hdc ) );
} }
return next->funcs->pSetDIBColorTable( next, pos, count, colors ); return next->funcs->pSetDIBColorTable( next, pos, count, colors );
} }
@ -454,7 +416,7 @@ static INT dibdrv_SetROP2( PHYSDEV dev, INT rop )
PHYSDEV next = GET_NEXT_PHYSDEV( dev, pSetROP2 ); PHYSDEV next = GET_NEXT_PHYSDEV( dev, pSetROP2 );
dibdrv_physdev *pdev = get_dibdrv_pdev(dev); dibdrv_physdev *pdev = get_dibdrv_pdev(dev);
update_masks( pdev, rop ); update_brush_rop( pdev, rop );
return next->funcs->pSetROP2( next, rop ); return next->funcs->pSetROP2( next, rop );
} }
@ -575,7 +537,7 @@ const struct gdi_dc_funcs dib_driver =
dibdrv_SelectPen, /* pSelectPen */ dibdrv_SelectPen, /* pSelectPen */
NULL, /* pSetArcDirection */ NULL, /* pSetArcDirection */
dibdrv_SetBkColor, /* pSetBkColor */ dibdrv_SetBkColor, /* pSetBkColor */
dibdrv_SetBkMode, /* pSetBkMode */ NULL, /* pSetBkMode */
dibdrv_SetDCBrushColor, /* pSetDCBrushColor */ dibdrv_SetDCBrushColor, /* pSetDCBrushColor */
dibdrv_SetDCPenColor, /* pSetDCPenColor */ dibdrv_SetDCPenColor, /* pSetDCPenColor */
dibdrv_SetDIBColorTable, /* pSetDIBColorTable */ dibdrv_SetDIBColorTable, /* pSetDIBColorTable */

View File

@ -103,9 +103,6 @@ typedef struct dibdrv_physdev
HBITMAP brush_pattern_bitmap; HBITMAP brush_pattern_bitmap;
BOOL (* brush_rects)(struct dibdrv_physdev *pdev, dib_info *dib, int num, const RECT *rects, HRGN clip); BOOL (* brush_rects)(struct dibdrv_physdev *pdev, dib_info *dib, int num, const RECT *rects, HRGN clip);
/* background */
DWORD bkgnd_color, bkgnd_and, bkgnd_xor;
/* text */ /* text */
DWORD text_color; DWORD text_color;
struct intensity_range glyph_intensities[17]; struct intensity_range glyph_intensities[17];

View File

@ -114,16 +114,18 @@ void update_aa_ranges( dibdrv_physdev *pdev )
* *
* See the comment above get_pen_bkgnd_masks * See the comment above get_pen_bkgnd_masks
*/ */
static inline void get_text_bkgnd_masks( const dibdrv_physdev *pdev, rop_mask *mask ) static inline void get_text_bkgnd_masks( dibdrv_physdev *pdev, rop_mask *mask )
{ {
COLORREF bg = GetBkColor( pdev->dev.hdc );
mask->and = 0; mask->and = 0;
if (pdev->dib.bit_count != 1) if (pdev->dib.bit_count != 1)
mask->xor = pdev->bkgnd_color; mask->xor = get_pixel_color( pdev, bg, FALSE );
else else
{ {
mask->xor = ~pdev->text_color; mask->xor = ~pdev->text_color;
if (GetTextColor( pdev->dev.hdc ) == GetBkColor( pdev->dev.hdc )) if (GetTextColor( pdev->dev.hdc ) == bg)
mask->xor = pdev->text_color; mask->xor = pdev->text_color;
} }
} }

View File

@ -180,8 +180,9 @@ DWORD get_pixel_color( dibdrv_physdev *pdev, COLORREF color, BOOL mono_fixup )
if(rgbquad_equal(&fg_quad, pdev->dib.color_table + 1)) if(rgbquad_equal(&fg_quad, pdev->dib.color_table + 1))
return 1; return 1;
if(color == GetBkColor(pdev->dev.hdc)) return pdev->bkgnd_color; pixel = get_pixel_color( pdev, GetBkColor(pdev->dev.hdc), FALSE );
else return pdev->bkgnd_color ? 0 : 1; if (color == GetBkColor(pdev->dev.hdc)) return pixel;
else return !pixel;
} }
/*************************************************************************** /***************************************************************************
@ -194,17 +195,25 @@ DWORD get_pixel_color( dibdrv_physdev *pdev, COLORREF color, BOOL mono_fixup )
*/ */
static inline void get_pen_bkgnd_masks(dibdrv_physdev *pdev, DWORD *and, DWORD *xor) static inline void get_pen_bkgnd_masks(dibdrv_physdev *pdev, DWORD *and, DWORD *xor)
{ {
if(pdev->dib.bit_count != 1 || GetBkMode(pdev->dev.hdc) == TRANSPARENT) DWORD color;
if (GetBkMode(pdev->dev.hdc) == TRANSPARENT)
{ {
*and = pdev->bkgnd_and; *and = ~0u;
*xor = pdev->bkgnd_xor; *xor = 0;
return;
}
if (pdev->dib.bit_count != 1)
{
color = get_pixel_color( pdev, GetBkColor(pdev->dev.hdc), FALSE );
} }
else else
{ {
DWORD color = get_pixel_color( pdev, pdev->pen_colorref, TRUE ); color = get_pixel_color( pdev, pdev->pen_colorref, TRUE );
if(pdev->pen_colorref != GetBkColor(pdev->dev.hdc)) color = !color; if(pdev->pen_colorref != GetBkColor(pdev->dev.hdc)) color = !color;
calc_and_xor_masks( GetROP2(pdev->dev.hdc), color, and, xor );
} }
calc_and_xor_masks( GetROP2(pdev->dev.hdc), color, and, xor );
} }
static inline void get_brush_bkgnd_masks(dibdrv_physdev *pdev, DWORD *and, DWORD *xor) static inline void get_brush_bkgnd_masks(dibdrv_physdev *pdev, DWORD *and, DWORD *xor)
@ -213,8 +222,8 @@ static inline void get_brush_bkgnd_masks(dibdrv_physdev *pdev, DWORD *and, DWORD
if(GetBkMode(pdev->dev.hdc) == TRANSPARENT) if(GetBkMode(pdev->dev.hdc) == TRANSPARENT)
{ {
*and = pdev->bkgnd_and; *and = ~0u;
*xor = pdev->bkgnd_xor; *xor = 0;
} }
else else
{ {