gdi32: Add a helper function for computing the device rect for PS_INSIDEFRAME.

This commit is contained in:
Alexandre Julliard 2012-01-06 19:21:42 +01:00
parent 5ff285629e
commit 92d5b41599
1 changed files with 19 additions and 20 deletions

View File

@ -57,6 +57,21 @@ static RECT get_device_rect( HDC hdc, int left, int top, int right, int bottom,
return rect; return rect;
} }
static BOOL get_pen_device_rect( dibdrv_physdev *dev, RECT *rect, int left, int top, int right, int bottom )
{
*rect = get_device_rect( dev->dev.hdc, left, top, right, bottom, TRUE );
if (rect->left == rect->right || rect->top == rect->bottom) return FALSE;
if (dev->pen_style == PS_INSIDEFRAME)
{
rect->left += dev->pen_width / 2;
rect->top += dev->pen_width / 2;
rect->right -= (dev->pen_width - 1) / 2;
rect->bottom -= (dev->pen_width - 1) / 2;
}
return TRUE;
}
/* compute the points for the first quadrant of an ellipse, counterclockwise from the x axis */ /* compute the points for the first quadrant of an ellipse, counterclockwise from the x axis */
/* 'data' must contain enough space, (width+height)/2 is a reasonable upper bound */ /* 'data' must contain enough space, (width+height)/2 is a reasonable upper bound */
static int ellipse_first_quadrant( int width, int height, POINT *data ) static int ellipse_first_quadrant( int width, int height, POINT *data )
@ -696,22 +711,14 @@ BOOL dibdrv_Polyline( PHYSDEV dev, const POINT* pt, INT count )
BOOL dibdrv_Rectangle( PHYSDEV dev, INT left, INT top, INT right, INT bottom ) BOOL dibdrv_Rectangle( PHYSDEV dev, INT left, INT top, INT right, INT bottom )
{ {
dibdrv_physdev *pdev = get_dibdrv_pdev(dev); dibdrv_physdev *pdev = get_dibdrv_pdev(dev);
RECT rect = get_device_rect( dev->hdc, left, top, right, bottom, TRUE ); RECT rect;
POINT pts[4]; POINT pts[4];
BOOL ret; BOOL ret;
HRGN outline = 0; HRGN outline = 0;
TRACE("(%p, %d, %d, %d, %d)\n", dev, left, top, right, bottom); TRACE("(%p, %d, %d, %d, %d)\n", dev, left, top, right, bottom);
if(rect.left == rect.right || rect.top == rect.bottom) return TRUE; if (!get_pen_device_rect( pdev, &rect, left, top, right, bottom )) return TRUE;
if (pdev->pen_style == PS_INSIDEFRAME)
{
rect.left += pdev->pen_width / 2;
rect.top += pdev->pen_width / 2;
rect.right -= (pdev->pen_width - 1) / 2;
rect.bottom -= (pdev->pen_width - 1) / 2;
}
if (pdev->pen_uses_region && !(outline = CreateRectRgn( 0, 0, 0, 0 ))) return FALSE; if (pdev->pen_uses_region && !(outline = CreateRectRgn( 0, 0, 0, 0 ))) return FALSE;
@ -769,21 +776,13 @@ BOOL dibdrv_RoundRect( PHYSDEV dev, INT left, INT top, INT right, INT bottom,
INT ellipse_width, INT ellipse_height ) INT ellipse_width, INT ellipse_height )
{ {
dibdrv_physdev *pdev = get_dibdrv_pdev( dev ); dibdrv_physdev *pdev = get_dibdrv_pdev( dev );
RECT rect = get_device_rect( dev->hdc, left, top, right, bottom, TRUE ); RECT rect;
POINT pt[2], *points; POINT pt[2], *points;
int i, end, count; int i, end, count;
BOOL ret = TRUE; BOOL ret = TRUE;
HRGN outline = 0, interior = 0; HRGN outline = 0, interior = 0;
if (rect.left == rect.right || rect.top == rect.bottom) return TRUE; if (!get_pen_device_rect( pdev, &rect, left, top, right, bottom )) return TRUE;
if (pdev->pen_style == PS_INSIDEFRAME)
{
rect.left += pdev->pen_width / 2;
rect.top += pdev->pen_width / 2;
rect.right -= (pdev->pen_width - 1) / 2;
rect.bottom -= (pdev->pen_width - 1) / 2;
}
pt[0].x = pt[0].y = 0; pt[0].x = pt[0].y = 0;
pt[1].x = ellipse_width; pt[1].x = ellipse_width;