diff --git a/demo2/pathfinder.ts b/demo2/pathfinder.ts index ad0ada63..663f9f85 100644 --- a/demo2/pathfinder.ts +++ b/demo2/pathfinder.ts @@ -425,6 +425,7 @@ class Scene { GLOBAL_TRANSFORM.tx, GLOBAL_TRANSFORM.ty, ]); + path = flattenPath(path); path = canonicalizePath(path); const boundingRect = this.boundingRectOfPath(path); @@ -677,6 +678,34 @@ class Program { } } +class PathSegment { + command: string; + points: Point2D[]; + + constructor(segment: string[]) { + const points = []; + for (let i = 1; i < segment.length; i += 2) + points.push(new Point2D(parseFloat(segment[i]), parseFloat(segment[i + 1]))); + this.points = points; + this.command = segment[0]; + } +} + +function flattenPath(path: SVGPath): SVGPath { + return path.abs().iterate(segment => { + if (segment[0] === 'Q') + return [['L', segment[1], segment[2]], ['L', segment[3], segment[4]]]; + if (segment[0] === 'C') { + return [ + ['L', segment[1], segment[2]], + ['L', segment[3], segment[4]], + ['L', segment[5], segment[6]], + ]; + } + return [segment]; + }); +} + function canonicalizePath(path: SVGPath): SVGPath { return path.abs().iterate(segment => { if (segment[0] === 'H')