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. --- doc/ScintillaHistory.html | 3 +++ win32/PlatWin.cxx | 30 ++++++++++++++++++++---------- 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/doc/ScintillaHistory.html b/doc/ScintillaHistory.html index 7895d131a..e7ac0cc1b 100644 --- a/doc/ScintillaHistory.html +++ b/doc/ScintillaHistory.html @@ -596,6 +596,9 @@ The translucency of INDIC_COMPOSITIONTHICK can be changed with SCI_INDICSETOUTLINEALPHA.
  • + Improve drawing of rounded rectangles on Direct2D. +
  • +
  • Line state optimized to avoid excess allocations by always allocating for every line. This makes SCI_GETMAXLINESTATE less useful although it can still distinguish cases where line state was never set for any lines. 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