Alexandre Julliard : gdi32: Add a common helper for computing pen and brush masks.
Alexandre Julliard
julliard at winehq.org
Fri Dec 23 13:03:22 CST 2011
Module: wine
Branch: master
Commit: 8f929ae04db6ad8546a0b31fc1e700d29eb1d2ce
URL: http://source.winehq.org/git/wine.git/?a=commit;h=8f929ae04db6ad8546a0b31fc1e700d29eb1d2ce
Author: Alexandre Julliard <julliard at winehq.org>
Date: Thu Dec 22 20:09:23 2011 +0100
gdi32: Add a common helper for computing pen and brush masks.
---
dlls/gdi32/dibdrv/dibdrv.h | 1 -
dlls/gdi32/dibdrv/objects.c | 79 +++++++++++++-----------------------------
2 files changed, 25 insertions(+), 55 deletions(-)
diff --git a/dlls/gdi32/dibdrv/dibdrv.h b/dlls/gdi32/dibdrv/dibdrv.h
index bbb90f4..e8acfa0 100644
--- a/dlls/gdi32/dibdrv/dibdrv.h
+++ b/dlls/gdi32/dibdrv/dibdrv.h
@@ -213,7 +213,6 @@ typedef struct
} bres_params;
extern void get_rop_codes(INT rop, struct rop_codes *codes) DECLSPEC_HIDDEN;
-extern void calc_and_xor_masks(INT rop, DWORD color, DWORD *and, DWORD *xor) DECLSPEC_HIDDEN;
extern void update_brush_rop( dibdrv_physdev *pdev, INT rop ) DECLSPEC_HIDDEN;
extern void reset_dash_origin(dibdrv_physdev *pdev) DECLSPEC_HIDDEN;
extern void init_dib_info_from_bitmapinfo(dib_info *dib, const BITMAPINFO *info, void *bits, enum dib_info_flags flags) DECLSPEC_HIDDEN;
diff --git a/dlls/gdi32/dibdrv/objects.c b/dlls/gdi32/dibdrv/objects.c
index 6d74b75..85fbbbc 100644
--- a/dlls/gdi32/dibdrv/objects.c
+++ b/dlls/gdi32/dibdrv/objects.c
@@ -94,7 +94,7 @@ void get_rop_codes(INT rop, struct rop_codes *codes)
codes->x2 = rop2_xor_array[rop-1][1];
}
-void calc_and_xor_masks(INT rop, DWORD color, DWORD *and, DWORD *xor)
+static inline void calc_and_xor_masks(INT rop, DWORD color, DWORD *and, DWORD *xor)
{
struct rop_codes codes;
get_rop_codes( rop, &codes );
@@ -103,6 +103,11 @@ void calc_and_xor_masks(INT rop, DWORD color, DWORD *and, DWORD *xor)
*xor = (color & codes.x1) ^ codes.x2;
}
+static inline void calc_rop_masks(INT rop, DWORD color, rop_mask *masks)
+{
+ calc_and_xor_masks( rop, color, &masks->and, &masks->xor );
+}
+
static inline RGBQUAD rgbquad_from_colorref(COLORREF c)
{
RGBQUAD ret;
@@ -186,58 +191,30 @@ DWORD get_pixel_color( dibdrv_physdev *pdev, COLORREF color, BOOL mono_fixup )
}
/***************************************************************************
- * get_pen_bkgnd_masks
+ * get_color_masks
*
- * Returns the pre-calculated bkgnd color masks unless the dib is 1 bpp.
- * In this case since there are several fg sources (pen, brush, text)
- * this makes pdev->bkgnd_color unusable. So here we take the inverse
+ * Returns the color masks unless the dib is 1 bpp. In this case since
+ * there are several fg sources (pen, brush, text) we take as bg the inverse
* of the relevant fg color (which is always set up correctly).
*/
-static inline void get_pen_bkgnd_masks(dibdrv_physdev *pdev, DWORD *and, DWORD *xor)
+static inline void get_color_masks( dibdrv_physdev *pdev, UINT rop, COLORREF colorref,
+ rop_mask *fg_mask, rop_mask *bg_mask )
{
- DWORD color;
+ DWORD color = get_pixel_color( pdev, colorref, TRUE );
+
+ calc_rop_masks( rop, color, fg_mask );
if (GetBkMode(pdev->dev.hdc) == TRANSPARENT)
{
- *and = ~0u;
- *xor = 0;
+ bg_mask->and = ~0u;
+ bg_mask->xor = 0;
return;
}
- if (pdev->dib.bit_count != 1)
- {
- color = get_pixel_color( pdev, GetBkColor(pdev->dev.hdc), FALSE );
- }
- else
- {
- color = get_pixel_color( pdev, pdev->pen_colorref, TRUE );
- if(pdev->pen_colorref != GetBkColor(pdev->dev.hdc)) color = !color;
- }
- 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)
-{
- DWORD color;
+ if (pdev->dib.bit_count != 1) color = get_pixel_color( pdev, GetBkColor(pdev->dev.hdc), FALSE );
+ else if (colorref != GetBkColor(pdev->dev.hdc)) color = !color;
- if(GetBkMode(pdev->dev.hdc) == TRANSPARENT)
- {
- *and = ~0u;
- *xor = 0;
- }
- else
- {
- if(pdev->dib.bit_count == 1)
- {
- if(pdev->brush_colorref == GetBkColor(pdev->dev.hdc))
- color = get_pixel_color( pdev, pdev->brush_colorref, TRUE );
- else
- 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_rop_masks( rop, color, bg_mask );
}
static inline void order_end_points(int *s, int *e)
@@ -982,12 +959,9 @@ static BOOL dashed_pen_line(dibdrv_physdev *pdev, POINT *start, POINT *end)
static BOOL dashed_pen_lines(dibdrv_physdev *pdev, int num, POINT *pts, BOOL close)
{
int i;
- DWORD color;
- color = get_pixel_color( pdev, pdev->pen_colorref, TRUE );
- get_pen_bkgnd_masks( pdev, &pdev->dash_masks[0].and, &pdev->dash_masks[0].xor );
- calc_and_xor_masks( GetROP2(pdev->dev.hdc), color,
- &pdev->dash_masks[1].and, &pdev->dash_masks[1].xor );
+ get_color_masks( pdev, GetROP2(pdev->dev.hdc), pdev->pen_colorref,
+ &pdev->dash_masks[1], &pdev->dash_masks[0] );
assert( num >= 2 );
for (i = 0; i < num - 1; i++)
@@ -1287,7 +1261,7 @@ static BOOL wide_pen_lines(dibdrv_physdev *pdev, int num, POINT *pts, BOOL close
HRGN region;
DWORD pen_color = get_pixel_color( pdev, pdev->pen_colorref, TRUE );
- calc_and_xor_masks( GetROP2(pdev->dev.hdc), pen_color, &color.and, &color.xor );
+ calc_rop_masks( GetROP2(pdev->dev.hdc), pen_color, &color );
region = get_wide_lines_region( pdev, num, pts, close );
@@ -1455,7 +1429,7 @@ static BOOL solid_brush(dibdrv_physdev *pdev, dib_info *dib, int num, const RECT
rop_mask brush_color;
DWORD color = get_pixel_color( pdev, pdev->brush_colorref, TRUE );
- calc_and_xor_masks( pdev->brush_rop, color, &brush_color.and, &brush_color.xor );
+ calc_rop_masks( pdev->brush_rop, color, &brush_color );
solid_rects( dib, num, rects, &brush_color, region );
return TRUE;
}
@@ -1519,7 +1493,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, color;
+ DWORD size;
BOOL ret;
assert(pdev->brush_and_bits == NULL);
@@ -1553,10 +1527,7 @@ static BOOL create_hatch_brush_bits(dibdrv_physdev *pdev)
hatch.bits.free = hatch.bits.param = NULL;
hatch.bits.is_copy = FALSE;
- 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 );
+ get_color_masks( pdev, pdev->brush_rop, pdev->brush_colorref, &fg_mask, &bg_mask );
ret = pdev->brush_dib.funcs->create_rop_masks( &pdev->brush_dib, &hatch, &fg_mask, &bg_mask, &mask_bits );
if(!ret) free_pattern_brush_bits( pdev );
More information about the wine-cvs
mailing list