From c9d29ea600f2b9673746c556abfb036415fb15c8 Mon Sep 17 00:00:00 2001 From: dwelle <5153846+dwelle@users.noreply.github.com> Date: Fri, 3 Apr 2026 19:36:06 +0200 Subject: [PATCH] improve miter --- packages/element/src/shape.ts | 6 +++++- packages/element/tests/shape.test.ts | 13 +++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/packages/element/src/shape.ts b/packages/element/src/shape.ts index 85e4327a1f..a74610bad4 100644 --- a/packages/element/src/shape.ts +++ b/packages/element/src/shape.ts @@ -1258,6 +1258,7 @@ const getSvgPathFromPoints = ( const FIXED_FREEDRAW_MIN_SMOOTH_ALIGNMENT = 0.6; const FIXED_FREEDRAW_MIN_SMOOTH_SEGMENT_LENGTH = 0.2; +const FIXED_FREEDRAW_MIN_CORNER_ALIGNMENT = -0.25; const FIXED_FREEDRAW_MIN_CORNER_ROUNDING = 0.75; const FIXED_FREEDRAW_MAX_CORNER_ROUNDING = 6; const FIXED_FREEDRAW_CORNER_ROUNDING_FACTOR = 0.35; @@ -1310,7 +1311,10 @@ const getFixedFreeDrawRoundedCorner = ( (previousDeltaX * nextDeltaX + previousDeltaY * nextDeltaY) / (previousSegmentLength * nextSegmentLength); - if (alignment >= FIXED_FREEDRAW_MIN_SMOOTH_ALIGNMENT) { + if ( + alignment >= FIXED_FREEDRAW_MIN_SMOOTH_ALIGNMENT || + alignment <= FIXED_FREEDRAW_MIN_CORNER_ALIGNMENT + ) { return null; } diff --git a/packages/element/tests/shape.test.ts b/packages/element/tests/shape.test.ts index 9608832d45..ff606173e4 100644 --- a/packages/element/tests/shape.test.ts +++ b/packages/element/tests/shape.test.ts @@ -43,6 +43,19 @@ describe("freedraw stroke shape", () => { expect(path).toBe("M0,0 L8.5,0 Q10,0 10,1.5 L10,10 "); }); + it("does not round fixed stroke hairpin turns", () => { + const element = API.createElement({ + type: "freedraw", + strokeShape: "fixed", + strokeWidth: 1, + points: [pointFrom(0, 0), pointFrom(10, 0), pointFrom(9, 1)], + }); + + const [path] = ShapeCache.generateElementShape(element, null); + + expect(path).toBe("M0,0 L10,0 L9,1 "); + }); + it("smooths dense fixed stroke points without dropping them", () => { const element = API.createElement({ type: "freedraw",