From 44045fa02045300304b9d1cb0d6c0a9988fc4772 Mon Sep 17 00:00:00 2001 From: Lemmy Date: Mon, 9 Mar 2026 17:16:14 -0400 Subject: [PATCH] fix(backgrounds): prevent qTriangulate crash on framed bar outer rectangle arcs --- .../MainScreen/Backgrounds/BarBackground.qml | 44 ++++++++++--------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/Modules/MainScreen/Backgrounds/BarBackground.qml b/Modules/MainScreen/Backgrounds/BarBackground.qml index 6ad30b7bc..18f5e2538 100644 --- a/Modules/MainScreen/Backgrounds/BarBackground.qml +++ b/Modules/MainScreen/Backgrounds/BarBackground.qml @@ -141,7 +141,9 @@ ShapePath { // all subsequent path elements form a valid non-degenerate off-screen square. // Each edge is split between PathLine and PathArc so no arc has zero displacement, // preventing CurveRenderer triangulation crashes on degenerate arcs. - startX: isRenderable ? (isFramed ? 0 : (barMappedPos.x + leftEdgeOvs + tlRadius * tlMultX)) : -0.75 + // For framed mode the outer path is a full-screen rectangle; _minR offsets at each + // corner prevent zero-displacement zero-radius arcs that crash qTriangulate. + startX: isRenderable ? (isFramed ? _minR : (barMappedPos.x + leftEdgeOvs + tlRadius * tlMultX)) : -0.75 startY: isRenderable ? (isFramed ? 0 : (barMappedPos.y + topEdgeOvs)) : -1 // ========== PATH DEFINITION ========== @@ -151,58 +153,58 @@ ShapePath { // off-screen square with non-degenerate arcs so CurveRenderer never receives // a zero-area, bare-moveto, or zero-displacement arc path. PathLine { - x: root.isRenderable ? (root.isFramed ? root.screenWidth : (root.barMappedPos.x + root.barWidth + root.rightEdgeOvs - root.trRadius * root.trMultX)) : 0 + x: root.isRenderable ? (root.isFramed ? (root.screenWidth - root._minR) : (root.barMappedPos.x + root.barWidth + root.rightEdgeOvs - root.trRadius * root.trMultX)) : 0 y: root.isRenderable ? (root.isFramed ? 0 : (root.barMappedPos.y + root.topEdgeOvs)) : -1 } - // Bar top-right corner (only if not framed) + // Top-right corner PathArc { x: root.isRenderable ? (root.isFramed ? root.screenWidth : (root.barMappedPos.x + root.barWidth + root.rightEdgeOvs)) : 0 - y: root.isRenderable ? (root.isFramed ? 0 : (root.barMappedPos.y + root.topEdgeOvs + root.trRadius * root.trMultY)) : -0.75 - radiusX: root.isRenderable ? (root.isFramed ? 0 : root.trRadius) : 0 - radiusY: root.isRenderable ? (root.isFramed ? 0 : root.trRadius) : 0 + y: root.isRenderable ? (root.isFramed ? root._minR : (root.barMappedPos.y + root.topEdgeOvs + root.trRadius * root.trMultY)) : -0.75 + radiusX: root.isRenderable ? (root.isFramed ? root._minR : root.trRadius) : 0 + radiusY: root.isRenderable ? (root.isFramed ? root._minR : root.trRadius) : 0 direction: ShapeCornerHelper.getArcDirection(root.trMultX, root.trMultY) } PathLine { x: root.isRenderable ? (root.isFramed ? root.screenWidth : (root.barMappedPos.x + root.barWidth + root.rightEdgeOvs)) : 0 - y: root.isRenderable ? (root.isFramed ? root.screenHeight : (root.barMappedPos.y + root.barHeight + root.bottomEdgeOvs - root.brRadius * root.brMultY)) : 0 + y: root.isRenderable ? (root.isFramed ? (root.screenHeight - root._minR) : (root.barMappedPos.y + root.barHeight + root.bottomEdgeOvs - root.brRadius * root.brMultY)) : 0 } - // Bar bottom-right corner (only if not framed) + // Bottom-right corner PathArc { - x: root.isRenderable ? (root.isFramed ? root.screenWidth : (root.barMappedPos.x + root.barWidth + root.rightEdgeOvs - root.brRadius * root.brMultX)) : -0.25 + x: root.isRenderable ? (root.isFramed ? (root.screenWidth - root._minR) : (root.barMappedPos.x + root.barWidth + root.rightEdgeOvs - root.brRadius * root.brMultX)) : -0.25 y: root.isRenderable ? (root.isFramed ? root.screenHeight : (root.barMappedPos.y + root.barHeight + root.bottomEdgeOvs)) : 0 - radiusX: root.isRenderable ? (root.isFramed ? 0 : root.brRadius) : 0 - radiusY: root.isRenderable ? (root.isFramed ? 0 : root.brRadius) : 0 + radiusX: root.isRenderable ? (root.isFramed ? root._minR : root.brRadius) : 0 + radiusY: root.isRenderable ? (root.isFramed ? root._minR : root.brRadius) : 0 direction: ShapeCornerHelper.getArcDirection(root.brMultX, root.brMultY) } PathLine { - x: root.isRenderable ? (root.isFramed ? 0 : (root.barMappedPos.x + root.leftEdgeOvs + root.blRadius * root.blMultX)) : -1 + x: root.isRenderable ? (root.isFramed ? root._minR : (root.barMappedPos.x + root.leftEdgeOvs + root.blRadius * root.blMultX)) : -1 y: root.isRenderable ? (root.isFramed ? root.screenHeight : (root.barMappedPos.y + root.barHeight + root.bottomEdgeOvs)) : 0 } - // Bar bottom-left corner (only if not framed) + // Bottom-left corner PathArc { x: root.isRenderable ? (root.isFramed ? 0 : (root.barMappedPos.x + root.leftEdgeOvs)) : -1 - y: root.isRenderable ? (root.isFramed ? root.screenHeight : (root.barMappedPos.y + root.barHeight + root.bottomEdgeOvs - root.blRadius * root.blMultY)) : -0.25 - radiusX: root.isRenderable ? (root.isFramed ? 0 : root.blRadius) : 0 - radiusY: root.isRenderable ? (root.isFramed ? 0 : root.blRadius) : 0 + y: root.isRenderable ? (root.isFramed ? (root.screenHeight - root._minR) : (root.barMappedPos.y + root.barHeight + root.bottomEdgeOvs - root.blRadius * root.blMultY)) : -0.25 + radiusX: root.isRenderable ? (root.isFramed ? root._minR : root.blRadius) : 0 + radiusY: root.isRenderable ? (root.isFramed ? root._minR : root.blRadius) : 0 direction: ShapeCornerHelper.getArcDirection(root.blMultX, root.blMultY) } PathLine { x: root.isRenderable ? (root.isFramed ? 0 : (root.barMappedPos.x + root.leftEdgeOvs)) : -1 - y: root.isRenderable ? (root.isFramed ? 0 : (root.barMappedPos.y + root.topEdgeOvs + root.tlRadius * root.tlMultY)) : -1 + y: root.isRenderable ? (root.isFramed ? root._minR : (root.barMappedPos.y + root.topEdgeOvs + root.tlRadius * root.tlMultY)) : -1 } - // Bar top-left corner (only if not framed, back to start) + // Top-left corner (back to start) PathArc { - x: root.isRenderable ? (root.isFramed ? 0 : (root.barMappedPos.x + root.leftEdgeOvs + root.tlRadius * root.tlMultX)) : -0.75 + x: root.isRenderable ? (root.isFramed ? root._minR : (root.barMappedPos.x + root.leftEdgeOvs + root.tlRadius * root.tlMultX)) : -0.75 y: root.isRenderable ? (root.isFramed ? 0 : (root.barMappedPos.y + root.topEdgeOvs)) : -1 - radiusX: root.isRenderable ? (root.isFramed ? 0 : root.tlRadius) : 0 - radiusY: root.isRenderable ? (root.isFramed ? 0 : root.tlRadius) : 0 + radiusX: root.isRenderable ? (root.isFramed ? root._minR : root.tlRadius) : 0 + radiusY: root.isRenderable ? (root.isFramed ? root._minR : root.tlRadius) : 0 direction: ShapeCornerHelper.getArcDirection(root.tlMultX, root.tlMultY) }