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

This commit is contained in:
Alexandre Julliard 2011-12-22 10:21:42 +01:00
parent b433f1cd04
commit 43373c29ef
3 changed files with 21 additions and 29 deletions

View File

@ -260,7 +260,6 @@ DWORD convert_bitmapinfo( const BITMAPINFO *src_info, void *src_bits, struct bit
static void update_fg_colors( dibdrv_physdev *pdev ) static void update_fg_colors( dibdrv_physdev *pdev )
{ {
pdev->pen_color = get_pixel_color( pdev, pdev->pen_colorref, TRUE ); pdev->pen_color = get_pixel_color( pdev, pdev->pen_colorref, TRUE );
pdev->brush_color = get_pixel_color( pdev, pdev->brush_colorref, TRUE );
pdev->text_color = get_pixel_color( pdev, GetTextColor( pdev->dev.hdc ), TRUE ); pdev->text_color = get_pixel_color( pdev, GetTextColor( pdev->dev.hdc ), TRUE );
} }

View File

@ -94,7 +94,6 @@ typedef struct dibdrv_physdev
UINT brush_hatch; UINT brush_hatch;
INT brush_rop; /* PatBlt, for example, can override the DC's rop2 */ INT brush_rop; /* PatBlt, for example, can override the DC's rop2 */
COLORREF brush_colorref; COLORREF brush_colorref;
DWORD brush_color, brush_and, brush_xor;
dib_info brush_dib; dib_info brush_dib;
void *brush_and_bits, *brush_xor_bits; void *brush_and_bits, *brush_xor_bits;
const BITMAPINFO *brush_pattern_info; const BITMAPINFO *brush_pattern_info;

View File

@ -207,8 +207,10 @@ static inline void get_pen_bkgnd_masks(const dibdrv_physdev *pdev, DWORD *and, D
} }
} }
static inline void get_brush_bkgnd_masks(const dibdrv_physdev *pdev, DWORD *and, DWORD *xor) static inline void get_brush_bkgnd_masks(dibdrv_physdev *pdev, DWORD *and, DWORD *xor)
{ {
DWORD color;
if(GetBkMode(pdev->dev.hdc) == TRANSPARENT) if(GetBkMode(pdev->dev.hdc) == TRANSPARENT)
{ {
*and = pdev->bkgnd_and; *and = pdev->bkgnd_and;
@ -216,15 +218,15 @@ static inline void get_brush_bkgnd_masks(const dibdrv_physdev *pdev, DWORD *and,
} }
else else
{ {
DWORD color = pdev->bkgnd_color;
if(pdev->dib.bit_count == 1) if(pdev->dib.bit_count == 1)
{ {
if(pdev->brush_colorref == GetBkColor(pdev->dev.hdc)) if(pdev->brush_colorref == GetBkColor(pdev->dev.hdc))
color = pdev->brush_color; color = get_pixel_color( pdev, pdev->brush_colorref, TRUE );
else else
color = ~pdev->brush_color; color = ~get_pixel_color( pdev, pdev->brush_colorref, TRUE );
} }
else color = get_pixel_color( pdev, GetBkColor( pdev->dev.hdc ), FALSE );
calc_and_xor_masks( pdev->brush_rop, color, and, xor ); calc_and_xor_masks( pdev->brush_rop, color, and, xor );
} }
} }
@ -1455,10 +1457,9 @@ void solid_rects( dib_info *dib, int num, const RECT *rects, const rop_mask *col
static BOOL solid_brush(dibdrv_physdev *pdev, dib_info *dib, int num, const RECT *rects, HRGN region) static BOOL solid_brush(dibdrv_physdev *pdev, dib_info *dib, int num, const RECT *rects, HRGN region)
{ {
rop_mask brush_color; rop_mask brush_color;
DWORD color = get_pixel_color( pdev, pdev->brush_colorref, TRUE );
brush_color.and = pdev->brush_and; calc_and_xor_masks( pdev->brush_rop, color, &brush_color.and, &brush_color.xor );
brush_color.xor = pdev->brush_xor;
solid_rects( dib, num, rects, &brush_color, region ); solid_rects( dib, num, rects, &brush_color, region );
return TRUE; return TRUE;
} }
@ -1522,7 +1523,7 @@ static BOOL create_hatch_brush_bits(dibdrv_physdev *pdev)
dib_info hatch; dib_info hatch;
rop_mask fg_mask, bg_mask; rop_mask fg_mask, bg_mask;
rop_mask_bits mask_bits; rop_mask_bits mask_bits;
DWORD size; DWORD size, color;
BOOL ret; BOOL ret;
assert(pdev->brush_and_bits == NULL); assert(pdev->brush_and_bits == NULL);
@ -1556,8 +1557,9 @@ static BOOL create_hatch_brush_bits(dibdrv_physdev *pdev)
hatch.bits.free = hatch.bits.param = NULL; hatch.bits.free = hatch.bits.param = NULL;
hatch.bits.is_copy = FALSE; hatch.bits.is_copy = FALSE;
fg_mask.and = pdev->brush_and; color = get_pixel_color( pdev, pdev->brush_colorref, TRUE );
fg_mask.xor = pdev->brush_xor; calc_and_xor_masks( pdev->brush_rop, color, &fg_mask.and, &fg_mask.xor );
get_brush_bkgnd_masks( pdev, &bg_mask.and, &bg_mask.xor ); get_brush_bkgnd_masks( pdev, &bg_mask.and, &bg_mask.xor );
ret = pdev->brush_dib.funcs->create_rop_masks( &pdev->brush_dib, &hatch, &fg_mask, &bg_mask, &mask_bits ); ret = pdev->brush_dib.funcs->create_rop_masks( &pdev->brush_dib, &hatch, &fg_mask, &bg_mask, &mask_bits );
@ -1705,7 +1707,7 @@ static BOOL pattern_brush(dibdrv_physdev *pdev, dib_info *dib, int num, const RE
if (!clip) if (!clip)
{ {
dib->funcs->pattern_rects( dib, num, rects, &origin, &pdev->brush_dib, pdev->brush_and_bits, pdev->brush_xor_bits ); dib->funcs->pattern_rects( dib, num, rects, &origin, &pdev->brush_dib, pdev->brush_and_bits, pdev->brush_xor_bits );
return TRUE; goto done;
} }
for(i = 0; i < num; i++) for(i = 0; i < num; i++)
@ -1738,8 +1740,8 @@ static BOOL pattern_brush(dibdrv_physdev *pdev, dib_info *dib, int num, const RE
} }
release_wine_region( region ); release_wine_region( region );
done:
if (needs_reselect) free_pattern_brush( pdev ); if (needs_reselect) free_pattern_brush( pdev );
return TRUE; return TRUE;
} }
@ -1751,8 +1753,6 @@ static BOOL null_brush(dibdrv_physdev *pdev, dib_info *dib, int num, const RECT
void update_brush_rop( dibdrv_physdev *pdev, INT rop ) void update_brush_rop( dibdrv_physdev *pdev, INT rop )
{ {
pdev->brush_rop = rop; pdev->brush_rop = rop;
if(pdev->brush_style == BS_SOLID || pdev->brush_style == BS_HATCHED)
calc_and_xor_masks(rop, pdev->brush_color, &pdev->brush_and, &pdev->brush_xor);
free_pattern_brush_bits( pdev ); free_pattern_brush_bits( pdev );
} }
@ -1768,6 +1768,8 @@ HBRUSH dibdrv_SelectBrush( PHYSDEV dev, HBRUSH hbrush, HBITMAP bitmap,
TRACE("(%p, %p)\n", dev, hbrush); TRACE("(%p, %p)\n", dev, hbrush);
free_pattern_brush( pdev );
if (bitmap || info) /* pattern brush */ if (bitmap || info) /* pattern brush */
{ {
pdev->brush_rects = pattern_brush; pdev->brush_rects = pattern_brush;
@ -1776,26 +1778,23 @@ HBRUSH dibdrv_SelectBrush( PHYSDEV dev, HBRUSH hbrush, HBITMAP bitmap,
pdev->brush_pattern_bits = bits; pdev->brush_pattern_bits = bits;
pdev->brush_pattern_usage = usage; pdev->brush_pattern_usage = usage;
pdev->brush_pattern_bitmap = bitmap; pdev->brush_pattern_bitmap = bitmap;
free_pattern_brush( pdev ); /* brush is actually selected only when it's used */ /* brush is actually selected only when it's used */
return next->funcs->pSelectBrush( next, hbrush, bitmap, info, bits, usage ); return next->funcs->pSelectBrush( next, hbrush, bitmap, info, bits, usage );
} }
if (!GetObjectW( hbrush, sizeof(logbrush), &logbrush )) return 0; GetObjectW( hbrush, sizeof(logbrush), &logbrush );
if (hbrush == GetStockObject( DC_BRUSH )) if (hbrush == GetStockObject( DC_BRUSH ))
logbrush.lbColor = GetDCBrushColor( dev->hdc ); logbrush.lbColor = GetDCBrushColor( dev->hdc );
pdev->brush_style = logbrush.lbStyle; pdev->brush_style = logbrush.lbStyle;
free_pattern_brush( pdev );
switch(logbrush.lbStyle) switch(logbrush.lbStyle)
{ {
case BS_SOLID: case BS_SOLID:
pdev->brush_colorref = logbrush.lbColor; pdev->brush_colorref = logbrush.lbColor;
pdev->brush_color = get_pixel_color( pdev, pdev->brush_colorref, TRUE ); pdev->brush_rop = GetROP2( dev->hdc );
calc_and_xor_masks(GetROP2(dev->hdc), pdev->brush_color, &pdev->brush_and, &pdev->brush_xor);
pdev->brush_rects = solid_brush; pdev->brush_rects = solid_brush;
break; break;
@ -1807,8 +1806,7 @@ HBRUSH dibdrv_SelectBrush( PHYSDEV dev, HBRUSH hbrush, HBITMAP bitmap,
if(logbrush.lbHatch > HS_DIAGCROSS) return 0; if(logbrush.lbHatch > HS_DIAGCROSS) return 0;
pdev->brush_hatch = logbrush.lbHatch; pdev->brush_hatch = logbrush.lbHatch;
pdev->brush_colorref = logbrush.lbColor; pdev->brush_colorref = logbrush.lbColor;
pdev->brush_color = get_pixel_color( pdev, pdev->brush_colorref, TRUE ); pdev->brush_rop = GetROP2( dev->hdc );
calc_and_xor_masks(GetROP2(dev->hdc), pdev->brush_color, &pdev->brush_and, &pdev->brush_xor);
pdev->brush_rects = pattern_brush; pdev->brush_rects = pattern_brush;
break; break;
@ -1828,11 +1826,7 @@ COLORREF dibdrv_SetDCBrushColor( PHYSDEV dev, COLORREF color )
dibdrv_physdev *pdev = get_dibdrv_pdev(dev); dibdrv_physdev *pdev = get_dibdrv_pdev(dev);
if (GetCurrentObject(dev->hdc, OBJ_BRUSH) == GetStockObject( DC_BRUSH )) if (GetCurrentObject(dev->hdc, OBJ_BRUSH) == GetStockObject( DC_BRUSH ))
{
pdev->brush_colorref = color; pdev->brush_colorref = color;
pdev->brush_color = get_pixel_color( pdev, pdev->brush_colorref, TRUE );
calc_and_xor_masks(GetROP2(dev->hdc), pdev->brush_color, &pdev->brush_and, &pdev->brush_xor);
}
return next->funcs->pSetDCBrushColor( next, color ); return next->funcs->pSetDCBrushColor( next, color );
} }