From ee4e08d81f633437034b05b56a82dc20f474991a Mon Sep 17 00:00:00 2001 From: Neil Date: Mon, 1 Aug 2022 11:03:53 +1000 Subject: Improve drawing of rounded rectangles with Direct2D. Treat case where outline and fill are same colour as single fill call for more uniform appearance. In thin rectangles, shift to semi-circular ends when no room for full rounded corners. Use different radius for fill and stroke for more uniform appearance. --- win32/PlatWin.cxx | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) (limited to 'win32') diff --git a/win32/PlatWin.cxx b/win32/PlatWin.cxx index 293e7d3cb..761c00193 100644 --- a/win32/PlatWin.cxx +++ b/win32/PlatWin.cxx @@ -1651,17 +1651,27 @@ void SurfaceD2D::FillRectangle(PRectangle rc, Surface &surfacePattern) { void SurfaceD2D::RoundedRectangle(PRectangle rc, FillStroke fillStroke) { if (pRenderTarget) { - D2D1_ROUNDED_RECT roundedRectFill = { - RectangleFromPRectangle(rc.Inset(1.0)), - 4, 4}; - D2DPenColourAlpha(fillStroke.fill.colour); - pRenderTarget->FillRoundedRectangle(roundedRectFill, pBrush); + const FLOAT minDimension = static_cast(std::min(rc.Width(), rc.Height())) / 2.0f; + const FLOAT radius = std::min(4.0f, minDimension); + if (fillStroke.fill.colour == fillStroke.stroke.colour) { + D2D1_ROUNDED_RECT roundedRectFill = { + RectangleFromPRectangle(rc), + radius, radius }; + D2DPenColourAlpha(fillStroke.fill.colour); + pRenderTarget->FillRoundedRectangle(roundedRectFill, pBrush); + } else { + D2D1_ROUNDED_RECT roundedRectFill = { + RectangleFromPRectangle(rc.Inset(1.0)), + radius-1, radius-1 }; + D2DPenColourAlpha(fillStroke.fill.colour); + pRenderTarget->FillRoundedRectangle(roundedRectFill, pBrush); - D2D1_ROUNDED_RECT roundedRect = { - RectangleFromPRectangle(rc.Inset(0.5)), - 4, 4}; - D2DPenColourAlpha(fillStroke.stroke.colour); - pRenderTarget->DrawRoundedRectangle(roundedRect, pBrush, fillStroke.stroke.WidthF()); + D2D1_ROUNDED_RECT roundedRect = { + RectangleFromPRectangle(rc.Inset(0.5)), + radius, radius }; + D2DPenColourAlpha(fillStroke.stroke.colour); + pRenderTarget->DrawRoundedRectangle(roundedRect, pBrush, fillStroke.stroke.WidthF()); + } } } -- cgit v1.2.3