Module: wine Branch: master Commit: 8f929ae04db6ad8546a0b31fc1e700d29eb1d2ce URL: http://source.winehq.org/git/wine.git/?a=commit;h=8f929ae04db6ad8546a0b31fc1...
Author: Alexandre Julliard julliard@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 );