Module: wine Branch: master Commit: c1c8c92875085bbabfe4cbbd266edc8296b2ef0f URL: http://source.winehq.org/git/wine.git/?a=commit;h=c1c8c92875085bbabfe4cbbd26...
Author: Alexandre Julliard julliard@winehq.org Date: Thu Dec 29 10:10:35 2011 +0100
gdi32: Add helpers to paint a region with the brush or pen.
---
dlls/gdi32/dibdrv/dibdrv.h | 3 ++- dlls/gdi32/dibdrv/graphics.c | 23 ++++++----------------- dlls/gdi32/dibdrv/objects.c | 31 +++++++++++++++---------------- 3 files changed, 23 insertions(+), 34 deletions(-)
diff --git a/dlls/gdi32/dibdrv/dibdrv.h b/dlls/gdi32/dibdrv/dibdrv.h index 1f158db..a5fd968 100644 --- a/dlls/gdi32/dibdrv/dibdrv.h +++ b/dlls/gdi32/dibdrv/dibdrv.h @@ -233,7 +233,8 @@ extern BOOL convert_dib(dib_info *dst, const dib_info *src) DECLSPEC_HIDDEN; extern COLORREF make_rgb_colorref( HDC hdc, dib_info *dib, COLORREF color, BOOL *got_pixel, DWORD *pixel ) DECLSPEC_HIDDEN; extern DWORD get_pixel_color(dibdrv_physdev *pdev, COLORREF color, BOOL mono_fixup) DECLSPEC_HIDDEN; extern BOOL brush_rect( dibdrv_physdev *pdev, const RECT *rect, HRGN clip, INT rop ) DECLSPEC_HIDDEN; -extern BOOL pen_rect(dibdrv_physdev *pdev, const RECT *rect, HRGN clip, INT rop) DECLSPEC_HIDDEN; +extern BOOL brush_region( dibdrv_physdev *pdev, HRGN region ) DECLSPEC_HIDDEN; +extern BOOL pen_region( dibdrv_physdev *pdev, HRGN region ) DECLSPEC_HIDDEN; extern int get_clipped_rects( const dib_info *dib, const RECT *rc, HRGN clip, struct clipped_rects *clip_rects ) DECLSPEC_HIDDEN; extern int clip_line(const POINT *start, const POINT *end, const RECT *clip, const bres_params *params, POINT *pt1, POINT *pt2) DECLSPEC_HIDDEN; diff --git a/dlls/gdi32/dibdrv/graphics.c b/dlls/gdi32/dibdrv/graphics.c index 81d1d1b..ad52273 100644 --- a/dlls/gdi32/dibdrv/graphics.c +++ b/dlls/gdi32/dibdrv/graphics.c @@ -464,7 +464,7 @@ BOOL dibdrv_LineTo( PHYSDEV dev, INT x, INT y ) if (region) { if (pdev->clip) CombineRgn( region, region, pdev->clip, RGN_AND ); - ret = pen_rect( pdev, NULL, region, GetROP2(dev->hdc) ); + ret = pen_region( pdev, region ); DeleteObject( region ); } return ret; @@ -529,7 +529,6 @@ BOOL dibdrv_PolyPolygon( PHYSDEV dev, const POINT *pt, const INT *counts, DWORD DWORD total, i, pos; BOOL ret = FALSE; POINT *points; - INT rop = GetROP2( dev->hdc ); HRGN outline = 0, interior;
if (defer_pen( pdev )) return next->funcs->pPolyPolygon( next, pt, counts, polygons ); @@ -551,11 +550,9 @@ BOOL dibdrv_PolyPolygon( PHYSDEV dev, const POINT *pt, const INT *counts, DWORD return FALSE; }
- if (pdev->clip) CombineRgn( interior, interior, pdev->clip, RGN_AND ); - /* if not using a region, paint the interior first so the outline can overlap it */ if (!pdev->pen_uses_region || !(outline = CreateRectRgn( 0, 0, 0, 0 ))) - ret = brush_rect( pdev, NULL, interior, rop ); + ret = brush_region( pdev, interior );
for (i = pos = 0; i < polygons; i++) { @@ -566,9 +563,8 @@ BOOL dibdrv_PolyPolygon( PHYSDEV dev, const POINT *pt, const INT *counts, DWORD
if (outline) { - if (pdev->clip) CombineRgn( outline, outline, pdev->clip, RGN_AND ); CombineRgn( interior, interior, outline, RGN_DIFF ); - ret = pen_rect( pdev, NULL, outline, rop ) && brush_rect( pdev, NULL, interior, rop ); + ret = pen_region( pdev, outline ) && brush_region( pdev, interior ); DeleteObject( outline ); }
@@ -587,7 +583,6 @@ BOOL dibdrv_PolyPolyline( PHYSDEV dev, const POINT* pt, const DWORD* counts, DWO DWORD max_points = 0, i; POINT *points; BOOL ret = TRUE; - INT rop = GetROP2( dev->hdc ); HRGN outline = 0;
if (defer_pen( pdev )) return next->funcs->pPolyPolyline( next, pt, counts, polylines ); @@ -620,7 +615,7 @@ BOOL dibdrv_PolyPolyline( PHYSDEV dev, const POINT* pt, const DWORD* counts, DWO if (outline) { if (pdev->clip) CombineRgn( outline, outline, pdev->clip, RGN_AND ); - ret = pen_rect( pdev, NULL, outline, rop ); + ret = pen_region( pdev, outline ); DeleteObject( outline ); }
@@ -659,7 +654,6 @@ BOOL dibdrv_Rectangle( PHYSDEV dev, INT left, INT top, INT right, INT bottom ) RECT rect = get_device_rect( dev->hdc, left, top, right, bottom, TRUE ); POINT pts[4]; BOOL ret; - INT rop = GetROP2( dev->hdc ); HRGN outline = 0;
TRACE("(%p, %d, %d, %d, %d)\n", dev, left, top, right, bottom); @@ -696,12 +690,7 @@ BOOL dibdrv_Rectangle( PHYSDEV dev, INT left, INT top, INT right, INT bottom ) HRGN interior = CreateRectRgnIndirect( &rect );
CombineRgn( interior, interior, outline, RGN_DIFF ); - if (pdev->clip) - { - CombineRgn( outline, outline, pdev->clip, RGN_AND ); - CombineRgn( interior, interior, pdev->clip, RGN_AND ); - } - ret = pen_rect( pdev, NULL, outline, rop ) && brush_rect( pdev, NULL, interior, rop ); + ret = pen_region( pdev, outline ) && brush_region( pdev, interior ); DeleteObject( outline ); DeleteObject( interior ); } @@ -711,7 +700,7 @@ BOOL dibdrv_Rectangle( PHYSDEV dev, INT left, INT top, INT right, INT bottom ) rect.top += (pdev->pen_width + 1) / 2; rect.right -= pdev->pen_width / 2; rect.bottom -= pdev->pen_width / 2; - ret = brush_rect( pdev, &rect, pdev->clip, rop ); + ret = brush_rect( pdev, &rect, pdev->clip, GetROP2(dev->hdc) ); } return ret; } diff --git a/dlls/gdi32/dibdrv/objects.c b/dlls/gdi32/dibdrv/objects.c index 197b220..c7f2ae9 100644 --- a/dlls/gdi32/dibdrv/objects.c +++ b/dlls/gdi32/dibdrv/objects.c @@ -1329,11 +1329,12 @@ static void add_join( dibdrv_physdev *pdev, HRGN region, const POINT *pt, return; }
-static BOOL get_wide_lines_region( dibdrv_physdev *pdev, int num, POINT *pts, BOOL close, HRGN total ) +static BOOL wide_pen_lines(dibdrv_physdev *pdev, int num, POINT *pts, BOOL close, HRGN total) { int i; HRGN segment;
+ assert( total != 0 ); /* wide pens should always be drawn through a region */ assert( num >= 2 );
if (!close) num--; @@ -1481,18 +1482,6 @@ static BOOL get_wide_lines_region( dibdrv_physdev *pdev, int num, POINT *pts, BO return TRUE; }
-static BOOL wide_pen_lines(dibdrv_physdev *pdev, int num, POINT *pts, BOOL close, HRGN region) -{ - if (region) return get_wide_lines_region( pdev, num, pts, close, region ); - - if (!(region = CreateRectRgn( 0, 0, 0, 0 ))) return FALSE; - get_wide_lines_region( pdev, num, pts, close, region ); - if (pdev->clip) CombineRgn( region, region, pdev->clip, RGN_AND ); - pen_rect( pdev, NULL, region, GetROP2( pdev->dev.hdc ) ); - DeleteObject( region ); - return TRUE; -} - static const dash_pattern dash_patterns_cosmetic[4] = { {2, {18, 6}, 24}, /* PS_DASH */ @@ -2022,15 +2011,25 @@ BOOL brush_rect(dibdrv_physdev *pdev, const RECT *rect, HRGN clip, INT rop) return ret; }
-BOOL pen_rect(dibdrv_physdev *pdev, const RECT *rect, HRGN clip, INT rop) +/* paint a region with the brush (note: the region can be modified) */ +BOOL brush_region( dibdrv_physdev *pdev, HRGN region ) +{ + if (pdev->clip) CombineRgn( region, region, pdev->clip, RGN_AND ); + return brush_rect( pdev, NULL, region, GetROP2( pdev->dev.hdc )); +} + +/* paint a region with the pen (note: the region can be modified) */ +BOOL pen_region( dibdrv_physdev *pdev, HRGN region ) { struct clipped_rects clipped_rects; rop_mask color; DWORD pen_color = get_pixel_color( pdev, pdev->pen_colorref, TRUE );
- if (!get_clipped_rects( &pdev->dib, rect, clip, &clipped_rects )) return TRUE; + if (pdev->clip) CombineRgn( region, region, pdev->clip, RGN_AND ); + + if (!get_clipped_rects( &pdev->dib, NULL, region, &clipped_rects )) return TRUE;
- calc_rop_masks( rop, pen_color, &color ); + calc_rop_masks( GetROP2( pdev->dev.hdc ), pen_color, &color ); pdev->dib.funcs->solid_rects( &pdev->dib, clipped_rects.count, clipped_rects.rects, color.and, color.xor ); free_clipped_rects( &clipped_rects );