Module: wine Branch: master Commit: cf290ea6596f734e25fa3a42f0f5200162b6d670 URL: http://source.winehq.org/git/wine.git/?a=commit;h=cf290ea6596f734e25fa3a42f0...
Author: Huw Davies huw@codeweavers.com Date: Fri May 13 13:28:15 2011 +0100
gdi32: Implement Rectangle().
---
dlls/gdi32/dibdrv/dc.c | 2 +- dlls/gdi32/dibdrv/dibdrv.h | 1 + dlls/gdi32/dibdrv/graphics.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 44 insertions(+), 1 deletions(-)
diff --git a/dlls/gdi32/dibdrv/dc.c b/dlls/gdi32/dibdrv/dc.c index 7a11bec..50a7682 100644 --- a/dlls/gdi32/dibdrv/dc.c +++ b/dlls/gdi32/dibdrv/dc.c @@ -404,7 +404,7 @@ const DC_FUNCTIONS dib_driver = NULL, /* pPolylineTo */ NULL, /* pRealizeDefaultPalette */ NULL, /* pRealizePalette */ - NULL, /* pRectangle */ + dibdrv_Rectangle, /* pRectangle */ NULL, /* pResetDC */ NULL, /* pRestoreDC */ NULL, /* pRoundRect */ diff --git a/dlls/gdi32/dibdrv/dibdrv.h b/dlls/gdi32/dibdrv/dibdrv.h index a502c72..2ec604c 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_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; extern COLORREF CDECL dibdrv_SetDCBrushColor( PHYSDEV dev, COLORREF color ) DECLSPEC_HIDDEN; diff --git a/dlls/gdi32/dibdrv/graphics.c b/dlls/gdi32/dibdrv/graphics.c index c231434..bc7c488 100644 --- a/dlls/gdi32/dibdrv/graphics.c +++ b/dlls/gdi32/dibdrv/graphics.c @@ -117,3 +117,45 @@ BOOL CDECL dibdrv_PatBlt( PHYSDEV dev, INT x, INT y, INT width, INT height, DWOR
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 ); + POINT pts[4]; + + TRACE("(%p, %d, %d, %d, %d)\n", dev, left, top, right, bottom); + + if(rect.left == rect.right || rect.top == rect.bottom) return TRUE; + + if(defer_pen(pdev) || defer_brush(pdev)) + return next->funcs->pRectangle( next, left, top, right, bottom ); + + reset_dash_origin(pdev); + + /* 4 pts going anti-clockwise starting from top-right */ + pts[0].x = pts[3].x = rect.right - 1; + pts[0].y = pts[1].y = rect.top; + pts[1].x = pts[2].x = rect.left; + pts[2].y = pts[3].y = rect.bottom - 1; + + pdev->pen_line(pdev, pts , pts + 1); + pdev->pen_line(pdev, pts + 1, pts + 2); + pdev->pen_line(pdev, pts + 2, pts + 3); + pdev->pen_line(pdev, pts + 3, pts ); + + /* FIXME: Will need updating when we support wide pens */ + + rect.left += 1; + rect.top += 1; + rect.right -= 1; + rect.bottom -= 1; + + pdev->brush_rects(pdev, 1, &rect); + + return TRUE; +}