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",