From afd1e71761ce4cb71bb3316dc5e4a7cc81235e7a Mon Sep 17 00:00:00 2001 From: REVO9 <80324799+REVO9@users.noreply.github.com> Date: Fri, 19 Sep 2025 00:34:54 +0200 Subject: [PATCH] renderer: fix inconsistent border thickness for roundingPower < 2 (#11752) --- src/render/decorations/CHyprBorderDecoration.cpp | 10 +++++++--- src/render/decorations/CHyprDropShadowDecoration.cpp | 12 +++++++----- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/render/decorations/CHyprBorderDecoration.cpp b/src/render/decorations/CHyprBorderDecoration.cpp index 33ffcb60..0bf1f16a 100644 --- a/src/render/decorations/CHyprBorderDecoration.cpp +++ b/src/render/decorations/CHyprBorderDecoration.cpp @@ -70,14 +70,18 @@ void CHyprBorderDecoration::draw(PHLMONITOR pMonitor, float const& a) { m_window->m_realBorderColorPrevious.m_angle = grad.m_angle; } - int borderSize = m_window->getRealBorderSize(); - const auto ROUNDING = m_window->rounding() * pMonitor->m_scale; - const auto ROUNDINGPOWER = m_window->roundingPower(); + int borderSize = m_window->getRealBorderSize(); + const auto ROUNDINGBASE = m_window->rounding(); + const auto ROUNDING = ROUNDINGBASE * pMonitor->m_scale; + const auto ROUNDINGPOWER = m_window->roundingPower(); + const auto CORRECTIONOFFSET = (borderSize * (M_SQRT2 - 1) * std::max(2.0 - ROUNDINGPOWER, 0.0)); + const auto OUTERROUND = ((ROUNDINGBASE + borderSize) - CORRECTIONOFFSET) * pMonitor->m_scale; CBorderPassElement::SBorderData data; data.box = windowBox; data.grad1 = grad; data.round = ROUNDING; + data.outerRound = OUTERROUND; data.roundingPower = ROUNDINGPOWER; data.a = a; data.borderSize = borderSize; diff --git a/src/render/decorations/CHyprDropShadowDecoration.cpp b/src/render/decorations/CHyprDropShadowDecoration.cpp index d09d4a83..50841d6b 100644 --- a/src/render/decorations/CHyprDropShadowDecoration.cpp +++ b/src/render/decorations/CHyprDropShadowDecoration.cpp @@ -117,11 +117,13 @@ void CHyprDropShadowDecoration::render(PHLMONITOR pMonitor, float const& a) { if (*PSHADOWS != 1) return; // disabled - const auto ROUNDINGBASE = PWINDOW->rounding(); - const auto ROUNDINGPOWER = PWINDOW->roundingPower(); - const auto ROUNDING = ROUNDINGBASE > 0 ? ROUNDINGBASE + PWINDOW->getRealBorderSize() : 0; - const auto PWORKSPACE = PWINDOW->m_workspace; - const auto WORKSPACEOFFSET = PWORKSPACE && !PWINDOW->m_pinned ? PWORKSPACE->m_renderOffset->value() : Vector2D(); + const auto BORDERSIZE = PWINDOW->getRealBorderSize(); + const auto ROUNDINGBASE = PWINDOW->rounding(); + const auto ROUNDINGPOWER = PWINDOW->roundingPower(); + const auto CORRECTIONOFFSET = (BORDERSIZE * (M_SQRT2 - 1) * std::max(2.0 - ROUNDINGPOWER, 0.0)); + const auto ROUNDING = ROUNDINGBASE > 0 ? (ROUNDINGBASE + BORDERSIZE) - CORRECTIONOFFSET : 0; + const auto PWORKSPACE = PWINDOW->m_workspace; + const auto WORKSPACEOFFSET = PWORKSPACE && !PWINDOW->m_pinned ? PWORKSPACE->m_renderOffset->value() : Vector2D(); // draw the shadow CBox fullBox = m_lastWindowBoxWithDecos;