Module: wine Branch: master Commit: 8c0bc67275db07d85227cbe36a099d8eb44b8591 URL: http://source.winehq.org/git/wine.git/?a=commit;h=8c0bc67275db07d85227cbe36a...
Author: Huw Davies huw@codeweavers.com Date: Mon May 16 11:29:04 2011 +0100
gdi32: Implement PaintRgn().
---
dlls/gdi32/dibdrv/dc.c | 2 +- dlls/gdi32/dibdrv/dibdrv.h | 1 + dlls/gdi32/dibdrv/graphics.c | 37 +++++++++++++++++++++++++++++++++---- 3 files changed, 35 insertions(+), 5 deletions(-)
diff --git a/dlls/gdi32/dibdrv/dc.c b/dlls/gdi32/dibdrv/dc.c index 50a7682..6cc1d33 100644 --- a/dlls/gdi32/dibdrv/dc.c +++ b/dlls/gdi32/dibdrv/dc.c @@ -391,7 +391,7 @@ const DC_FUNCTIONS dib_driver = NULL, /* pOffsetClipRgn */ NULL, /* pOffsetViewportOrg */ NULL, /* pOffsetWindowOrg */ - NULL, /* pPaintRgn */ + dibdrv_PaintRgn, /* pPaintRgn */ dibdrv_PatBlt, /* pPatBlt */ NULL, /* pPie */ NULL, /* pPolyBezier */ diff --git a/dlls/gdi32/dibdrv/dibdrv.h b/dlls/gdi32/dibdrv/dibdrv.h index 2ec604c..ccf9f9a 100644 --- a/dlls/gdi32/dibdrv/dibdrv.h +++ b/dlls/gdi32/dibdrv/dibdrv.h @@ -20,6 +20,7 @@
extern BOOL CDECL dibdrv_LineTo( PHYSDEV dev, INT x, INT y ) DECLSPEC_HIDDEN; extern BOOL CDECL dibdrv_PatBlt( PHYSDEV dev, INT x, INT y, INT width, INT height, DWORD rop ) DECLSPEC_HIDDEN; +extern BOOL CDECL dibdrv_PaintRgn( PHYSDEV dev, HRGN hrgn ) DECLSPEC_HIDDEN; extern BOOL CDECL dibdrv_Rectangle( PHYSDEV dev, INT left, INT top, INT right, INT bottom ) DECLSPEC_HIDDEN; extern HBRUSH CDECL dibdrv_SelectBrush( PHYSDEV dev, HBRUSH hbrush ) DECLSPEC_HIDDEN; extern HPEN CDECL dibdrv_SelectPen( PHYSDEV dev, HPEN hpen ) DECLSPEC_HIDDEN; diff --git a/dlls/gdi32/dibdrv/graphics.c b/dlls/gdi32/dibdrv/graphics.c index bc7c488..7f7746f 100644 --- a/dlls/gdi32/dibdrv/graphics.c +++ b/dlls/gdi32/dibdrv/graphics.c @@ -25,7 +25,7 @@
WINE_DEFAULT_DEBUG_CHANNEL(dib);
-static RECT get_device_rect( HDC hdc, int left, int top, int right, int bottom ) +static RECT get_device_rect( HDC hdc, int left, int top, int right, int bottom, BOOL rtl_correction ) { RECT rect;
@@ -33,7 +33,7 @@ static RECT get_device_rect( HDC hdc, int left, int top, int right, int bottom ) rect.top = top; rect.right = right; rect.bottom = bottom; - if (GetLayout( hdc ) & LAYOUT_RTL) + if (rtl_correction && GetLayout( hdc ) & LAYOUT_RTL) { /* shift the rectangle so that the right border is included after mirroring */ /* it would be more correct to do this after LPtoDP but that's not what Windows does */ @@ -98,7 +98,7 @@ BOOL CDECL dibdrv_PatBlt( PHYSDEV dev, INT x, INT y, INT width, INT height, DWOR PHYSDEV next = GET_NEXT_PHYSDEV( dev, pPatBlt ); dibdrv_physdev *pdev = get_dibdrv_pdev(dev); INT rop2 = get_rop2_from_rop(rop); - RECT rect = get_device_rect( dev->hdc, x, y, x + width, y + height ); + RECT rect = get_device_rect( dev->hdc, x, y, x + width, y + height, TRUE ); BOOL done;
TRACE("(%p, %d, %d, %d, %d, %06x)\n", dev, x, y, width, height, rop); @@ -119,13 +119,42 @@ BOOL CDECL dibdrv_PatBlt( PHYSDEV dev, INT x, INT y, INT width, INT height, DWOR }
/*********************************************************************** + * dibdrv_PaintRgn + */ +BOOL CDECL dibdrv_PaintRgn( PHYSDEV dev, HRGN rgn ) +{ + PHYSDEV next = GET_NEXT_PHYSDEV( dev, pPaintRgn ); + dibdrv_physdev *pdev = get_dibdrv_pdev(dev); + const WINEREGION *region; + int i; + RECT rect; + + TRACE("%p, %p\n", dev, rgn); + + if(defer_brush(pdev)) return next->funcs->pPaintRgn( next, rgn ); + + region = get_wine_region( rgn ); + if(!region) return FALSE; + + for(i = 0; i < region->numRects; i++) + { + rect = get_device_rect( dev->hdc, region->rects[i].left, region->rects[i].top, + region->rects[i].right, region->rects[i].bottom, FALSE ); + pdev->brush_rects( pdev, 1, &rect ); + } + + release_wine_region( rgn ); + return TRUE; +} + +/*********************************************************************** * dibdrv_Rectangle */ BOOL CDECL dibdrv_Rectangle( PHYSDEV dev, INT left, INT top, INT right, INT bottom ) { PHYSDEV next = GET_NEXT_PHYSDEV( dev, pRectangle ); dibdrv_physdev *pdev = get_dibdrv_pdev(dev); - RECT rect = get_device_rect( dev->hdc, left, top, right, bottom ); + RECT rect = get_device_rect( dev->hdc, left, top, right, bottom, TRUE ); POINT pts[4];
TRACE("(%p, %d, %d, %d, %d)\n", dev, left, top, right, bottom);