Alexandre Julliard : gdi32: Recompute the brush masks on every use to support PALETTEINDEX colors.
Alexandre Julliard
julliard at winehq.org
Fri Dec 23 13:03:21 CST 2011
Module: wine
Branch: master
Commit: 43373c29effd217f76b1da86063b4e665a41f749
URL: http://source.winehq.org/git/wine.git/?a=commit;h=43373c29effd217f76b1da86063b4e665a41f749
Author: Alexandre Julliard <julliard at winehq.org>
Date: Thu Dec 22 10:21:42 2011 +0100
gdi32: Recompute the brush masks on every use to support PALETTEINDEX colors.
---
dlls/gdi32/dibdrv/dc.c | 1 -
dlls/gdi32/dibdrv/dibdrv.h | 1 -
dlls/gdi32/dibdrv/objects.c | 48 ++++++++++++++++++------------------------
3 files changed, 21 insertions(+), 29 deletions(-)
diff --git a/dlls/gdi32/dibdrv/dc.c b/dlls/gdi32/dibdrv/dc.c
index 571a070..a33c488 100644
--- a/dlls/gdi32/dibdrv/dc.c
+++ b/dlls/gdi32/dibdrv/dc.c
@@ -260,7 +260,6 @@ DWORD convert_bitmapinfo( const BITMAPINFO *src_info, void *src_bits, struct bit
static void update_fg_colors( dibdrv_physdev *pdev )
{
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 );
}
diff --git a/dlls/gdi32/dibdrv/dibdrv.h b/dlls/gdi32/dibdrv/dibdrv.h
index 1bf9114..b0966af 100644
--- a/dlls/gdi32/dibdrv/dibdrv.h
+++ b/dlls/gdi32/dibdrv/dibdrv.h
@@ -94,7 +94,6 @@ typedef struct dibdrv_physdev
UINT brush_hatch;
INT brush_rop; /* PatBlt, for example, can override the DC's rop2 */
COLORREF brush_colorref;
- DWORD brush_color, brush_and, brush_xor;
dib_info brush_dib;
void *brush_and_bits, *brush_xor_bits;
const BITMAPINFO *brush_pattern_info;
diff --git a/dlls/gdi32/dibdrv/objects.c b/dlls/gdi32/dibdrv/objects.c
index 281642a..084d447 100644
--- a/dlls/gdi32/dibdrv/objects.c
+++ b/dlls/gdi32/dibdrv/objects.c
@@ -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)
{
*and = pdev->bkgnd_and;
@@ -216,15 +218,15 @@ static inline void get_brush_bkgnd_masks(const dibdrv_physdev *pdev, DWORD *and,
}
else
{
- DWORD color = pdev->bkgnd_color;
-
if(pdev->dib.bit_count == 1)
{
if(pdev->brush_colorref == GetBkColor(pdev->dev.hdc))
- color = pdev->brush_color;
+ color = get_pixel_color( pdev, pdev->brush_colorref, TRUE );
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 );
}
}
@@ -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)
{
rop_mask brush_color;
+ DWORD color = get_pixel_color( pdev, pdev->brush_colorref, TRUE );
- brush_color.and = pdev->brush_and;
- brush_color.xor = pdev->brush_xor;
-
+ calc_and_xor_masks( pdev->brush_rop, color, &brush_color.and, &brush_color.xor );
solid_rects( dib, num, rects, &brush_color, region );
return TRUE;
}
@@ -1522,7 +1523,7 @@ static BOOL create_hatch_brush_bits(dibdrv_physdev *pdev)
dib_info hatch;
rop_mask fg_mask, bg_mask;
rop_mask_bits mask_bits;
- DWORD size;
+ DWORD size, color;
BOOL ret;
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.is_copy = FALSE;
- fg_mask.and = pdev->brush_and;
- fg_mask.xor = pdev->brush_xor;
+ color = get_pixel_color( pdev, pdev->brush_colorref, TRUE );
+ 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 );
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)
{
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++)
@@ -1738,8 +1740,8 @@ static BOOL pattern_brush(dibdrv_physdev *pdev, dib_info *dib, int num, const RE
}
release_wine_region( region );
+done:
if (needs_reselect) free_pattern_brush( pdev );
-
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 )
{
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 );
}
@@ -1768,6 +1768,8 @@ HBRUSH dibdrv_SelectBrush( PHYSDEV dev, HBRUSH hbrush, HBITMAP bitmap,
TRACE("(%p, %p)\n", dev, hbrush);
+ free_pattern_brush( pdev );
+
if (bitmap || info) /* 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_usage = usage;
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 );
}
- if (!GetObjectW( hbrush, sizeof(logbrush), &logbrush )) return 0;
+ GetObjectW( hbrush, sizeof(logbrush), &logbrush );
if (hbrush == GetStockObject( DC_BRUSH ))
logbrush.lbColor = GetDCBrushColor( dev->hdc );
pdev->brush_style = logbrush.lbStyle;
- free_pattern_brush( pdev );
-
switch(logbrush.lbStyle)
{
case BS_SOLID:
pdev->brush_colorref = logbrush.lbColor;
- 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);
+ pdev->brush_rop = GetROP2( dev->hdc );
pdev->brush_rects = solid_brush;
break;
@@ -1807,8 +1806,7 @@ HBRUSH dibdrv_SelectBrush( PHYSDEV dev, HBRUSH hbrush, HBITMAP bitmap,
if(logbrush.lbHatch > HS_DIAGCROSS) return 0;
pdev->brush_hatch = logbrush.lbHatch;
pdev->brush_colorref = logbrush.lbColor;
- 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);
+ pdev->brush_rop = GetROP2( dev->hdc );
pdev->brush_rects = pattern_brush;
break;
@@ -1828,11 +1826,7 @@ COLORREF dibdrv_SetDCBrushColor( PHYSDEV dev, COLORREF color )
dibdrv_physdev *pdev = get_dibdrv_pdev(dev);
if (GetCurrentObject(dev->hdc, OBJ_BRUSH) == GetStockObject( DC_BRUSH ))
- {
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 );
}
More information about the wine-cvs
mailing list