@pixerate/editor 0.126.0 → 0.128.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/index.cjs +2 -2
- package/dist/agent/index.d.cts +3 -3
- package/dist/agent/index.d.ts +3 -3
- package/dist/agent/index.js +1 -1
- package/dist/animation/index.d.cts +2 -3
- package/dist/animation/index.d.ts +2 -3
- package/dist/animation-editor/index.cjs +63 -63
- package/dist/animation-editor/index.cjs.map +1 -1
- package/dist/animation-editor/index.d.cts +7 -9
- package/dist/animation-editor/index.d.ts +7 -9
- package/dist/animation-editor/index.js +10 -10
- package/dist/{arrange-BlfgJ_wt.d.ts → arrange-BUREmgD9.d.ts} +1 -1
- package/dist/{arrange-CD6Gh-pd.d.cts → arrange-CKXK_hf7.d.cts} +1 -1
- package/dist/{bezier-CWv6LQal.d.ts → bezier-CvgQiYRg.d.cts} +23 -3
- package/dist/{bezier-CBzKKDjl.d.cts → bezier-DP4NnJp3.d.ts} +23 -3
- package/dist/{brushTypes-IG7ZZjIN.d.cts → brushTypes-C7N3EBK7.d.cts} +56 -1
- package/dist/{brushTypes-IG7ZZjIN.d.ts → brushTypes-C7N3EBK7.d.ts} +56 -1
- package/dist/{brushstrokeRender-EELTV7U4.cjs → brushstrokeRender-JNHVEUFG.cjs} +29 -10
- package/dist/brushstrokeRender-JNHVEUFG.cjs.map +1 -0
- package/dist/{brushstrokeRender-LRV7GXGD.js → brushstrokeRender-SII6MG4R.js} +25 -6
- package/dist/brushstrokeRender-SII6MG4R.js.map +1 -0
- package/dist/{builtins-DMIsnNst.d.cts → builtins-Cc-bH-3U.d.cts} +3 -2
- package/dist/{builtins-B5-ipm5u.d.ts → builtins-ZU1GJnUA.d.ts} +3 -2
- package/dist/canvas/index.cjs +435 -38
- package/dist/canvas/index.cjs.map +1 -1
- package/dist/canvas/index.d.cts +206 -16
- package/dist/canvas/index.d.ts +206 -16
- package/dist/canvas/index.js +408 -11
- package/dist/canvas/index.js.map +1 -1
- package/dist/{chunk-MPQAO33O.js → chunk-A6KHMKI4.js} +3 -3
- package/dist/{chunk-V5YGPRCZ.cjs → chunk-BEGEWQHD.cjs} +41 -41
- package/dist/{chunk-V5YGPRCZ.cjs.map → chunk-BEGEWQHD.cjs.map} +1 -1
- package/dist/{chunk-N3FVUOZD.cjs → chunk-BJTCSLF6.cjs} +7 -7
- package/dist/{chunk-N3FVUOZD.cjs.map → chunk-BJTCSLF6.cjs.map} +1 -1
- package/dist/{chunk-7LQO6OHH.cjs → chunk-DDSO4HS7.cjs} +9 -5
- package/dist/chunk-DDSO4HS7.cjs.map +1 -0
- package/dist/{chunk-AKU2KQ47.cjs → chunk-DFSZO2B5.cjs} +70 -3
- package/dist/chunk-DFSZO2B5.cjs.map +1 -0
- package/dist/{chunk-WUDPFWAN.js → chunk-F7Q2NE2Y.js} +3 -3
- package/dist/{chunk-GUZ47CJM.cjs → chunk-IZ4WRXZA.cjs} +1 -1
- package/dist/{chunk-GUZ47CJM.cjs.map → chunk-IZ4WRXZA.cjs.map} +1 -1
- package/dist/{chunk-GLWZXQ4Q.js → chunk-KHNZ6MOU.js} +1 -1
- package/dist/chunk-KHNZ6MOU.js.map +1 -0
- package/dist/{chunk-GCJWMEYW.cjs → chunk-KSJLDRHK.cjs} +46 -46
- package/dist/{chunk-GCJWMEYW.cjs.map → chunk-KSJLDRHK.cjs.map} +1 -1
- package/dist/{chunk-2SDGZAJR.js → chunk-LSXXAJG3.js} +70 -3
- package/dist/chunk-LSXXAJG3.js.map +1 -0
- package/dist/{chunk-QQKTOA4U.cjs → chunk-ORE334I6.cjs} +132 -132
- package/dist/{chunk-QQKTOA4U.cjs.map → chunk-ORE334I6.cjs.map} +1 -1
- package/dist/{chunk-X6KTSFAE.js → chunk-Q4NBEVV5.js} +2 -2
- package/dist/{chunk-FPRIUR4T.js → chunk-ROZFX4QI.js} +3 -3
- package/dist/{chunk-J67OLQUQ.js → chunk-SVYE5HIM.js} +7 -3
- package/dist/chunk-SVYE5HIM.js.map +1 -0
- package/dist/{chunk-O5RVCDEC.cjs → chunk-XLUYXUBD.cjs} +88 -88
- package/dist/{chunk-O5RVCDEC.cjs.map → chunk-XLUYXUBD.cjs.map} +1 -1
- package/dist/{chunk-FG274FYT.js → chunk-YGJIER2R.js} +2 -2
- package/dist/commands/index.cjs +2 -2
- package/dist/commands/index.d.cts +3 -3
- package/dist/commands/index.d.ts +3 -3
- package/dist/commands/index.js +1 -1
- package/dist/effects/index.d.cts +6 -38
- package/dist/effects/index.d.ts +6 -38
- package/dist/evaluate-BbCeF6pt.d.ts +114 -0
- package/dist/evaluate-BsxYieLN.d.cts +114 -0
- package/dist/{export-Bp7ji2r4.d.cts → export-BkYQvV56.d.cts} +4 -4
- package/dist/{export-DVl4fWy5.d.cts → export-Cbr9IqpJ.d.cts} +1 -1
- package/dist/{export-C1s4eolZ.d.ts → export-ClPKUB-v.d.ts} +1 -1
- package/dist/{export-DAyPY94f.d.ts → export-DHrFJ8r_.d.ts} +4 -4
- package/dist/{helpers-i95Ob6Vi.d.cts → helpers-C5aAd44p.d.cts} +67 -4
- package/dist/{helpers-BBLlekuM.d.ts → helpers-CPWcK504.d.ts} +67 -4
- package/dist/image-editor/index.cjs +606 -606
- package/dist/image-editor/index.cjs.map +1 -1
- package/dist/image-editor/index.d.cts +12 -14
- package/dist/image-editor/index.d.ts +12 -14
- package/dist/image-editor/index.js +4 -4
- package/dist/{opentype-D80AVmMu.d.cts → opentype-BOewaGQx.d.cts} +1 -1
- package/dist/{opentype-14PDI5D2.d.ts → opentype-sQrF3Ry1.d.ts} +1 -1
- package/dist/paint/index.d.cts +2 -2
- package/dist/paint/index.d.ts +2 -2
- package/dist/paint-editor/index.cjs +9 -9
- package/dist/paint-editor/index.cjs.map +1 -1
- package/dist/paint-editor/index.d.cts +9 -11
- package/dist/paint-editor/index.d.ts +9 -11
- package/dist/paint-editor/index.js +4 -4
- package/dist/{pathfinder-DjISxkUv.d.ts → pathfinder-BwJx0_zM.d.ts} +2 -2
- package/dist/{pathfinder-C0UoFypx.d.cts → pathfinder-CnkW7zLI.d.cts} +2 -2
- package/dist/{player-cGLrngL_.d.ts → player-BK2kKbfd.d.ts} +1 -1
- package/dist/{player-CBtEoU2x.d.cts → player-CmbY3218.d.cts} +1 -1
- package/dist/pool-C7GtrL34.d.cts +34 -0
- package/dist/pool-CTrtciaN.d.ts +34 -0
- package/dist/{rand-CfinE-1c.d.cts → rand-DTXAssW1.d.cts} +4 -4
- package/dist/{rand-DtazXGOB.d.ts → rand-pQQ2sJTk.d.ts} +4 -4
- package/dist/{svg-DJKriJ4A.d.ts → svg-C4LlFnEw.d.cts} +2 -3
- package/dist/{svg-BkRL-fZJ.d.cts → svg-CUzZa0EO.d.ts} +2 -3
- package/dist/{tools-CM8Oe8F3.d.ts → tools-AugT22z3.d.ts} +1 -1
- package/dist/{tools-DZCv2kX1.d.cts → tools-BpCmUNxb.d.cts} +1 -1
- package/dist/vector/index.cjs +918 -918
- package/dist/vector/index.cjs.map +1 -1
- package/dist/vector/index.d.cts +11 -13
- package/dist/vector/index.d.ts +11 -13
- package/dist/vector/index.js +11 -11
- package/dist/video-editor/index.d.cts +6 -8
- package/dist/video-editor/index.d.ts +6 -8
- package/dist/{warp-k_PdtXOG.d.ts → warp-CIsO617e.d.ts} +1 -1
- package/dist/{warp-CH9MM435.d.cts → warp-D62N_5VK.d.cts} +1 -1
- package/package.json +1 -1
- package/skills/pixerate-canvas/SKILL.md +30 -2
- package/dist/behavior-Ymbld6jL.d.cts +0 -60
- package/dist/behavior-Ymbld6jL.d.ts +0 -60
- package/dist/brushstrokeRender-EELTV7U4.cjs.map +0 -1
- package/dist/brushstrokeRender-LRV7GXGD.js.map +0 -1
- package/dist/chunk-2SDGZAJR.js.map +0 -1
- package/dist/chunk-7LQO6OHH.cjs.map +0 -1
- package/dist/chunk-AKU2KQ47.cjs.map +0 -1
- package/dist/chunk-GLWZXQ4Q.js.map +0 -1
- package/dist/chunk-J67OLQUQ.js.map +0 -1
- package/dist/evaluate-2S3vSPLy.d.cts +0 -55
- package/dist/evaluate-CfmT6xA3.d.ts +0 -55
- package/dist/gradient-KDfCvhuj.d.cts +0 -66
- package/dist/gradient-KDfCvhuj.d.ts +0 -66
- /package/dist/{chunk-MPQAO33O.js.map → chunk-A6KHMKI4.js.map} +0 -0
- /package/dist/{chunk-WUDPFWAN.js.map → chunk-F7Q2NE2Y.js.map} +0 -0
- /package/dist/{chunk-X6KTSFAE.js.map → chunk-Q4NBEVV5.js.map} +0 -0
- /package/dist/{chunk-FPRIUR4T.js.map → chunk-ROZFX4QI.js.map} +0 -0
- /package/dist/{chunk-FG274FYT.js.map → chunk-YGJIER2R.js.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/editor/editor/packages/core/dist/chunk-GCJWMEYW.cjs","../src/canvas/pathops/planar.ts","../src/canvas/pathops/hatch.ts","../src/canvas/pathops/pathfinder.ts"],"names":["t","len","closed","ring"],"mappings":"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","file":"/home/runner/work/editor/editor/packages/core/dist/chunk-GCJWMEYW.cjs","sourcesContent":[null,"/**\n * Planar maps: the faces and edges a set of paths divides the plane into (Shape Builder, fill\n * regions, Pathfinder Outline).\n *\n * Unlike `dividePaths`, which splits the *filled areas* of closed shapes, every path here is an\n * edge, open ones included: three crossing lines enclose a triangle, a line across a rectangle\n * splits it in two, and an area enclosed by paths is a face whether or not anything fills it.\n *\n * 1. `planarSplit` (the boolean engine's intersection search) cuts every input segment wherever\n * it meets another one; coincident pieces become one edge.\n * 2. Each edge gives two half-edges. Around every vertex the half-edges leaving it are sorted by\n * the direction in which they cross a small circle around it (half the shortest edge there),\n * which orders tangent curves correctly.\n * 3. A face walk takes, at each vertex, the half-edge just clockwise of the way back — the\n * sharpest left turn. Bounded faces come out counter-clockwise (positive area in a y-up\n * frame), the outer boundary of every connected piece clockwise; spurs (loose line ends) are\n * dropped. Each outer boundary becomes a hole of the smallest face of another piece around\n * it, so nesting is decided face by face, never by an even-odd rule over the whole network.\n * 4. Faces learn which inputs fill them from a point well inside each face.\n *\n * Adjacency is kept in per-vertex lists and half-edge slots (no scans over all edges per step).\n *\n * Ported from vectorcraft-main/crates/pathops/src/planar.rs (`map`, `Map::merge`, `build`,\n * `interior_point`, `without_spurs`, `leaving_angle`, `cut_out`), figcraft-main/crates/doc/src/vector_faces.rs\n * (`faces`: half-edge walk with an angle-sorted next edge, the winding deciding inside or\n * outside) and cadcraft-main/crates/geom/src/region.rs (`enclosing_loop`, `boundary_at_gap`:\n * a ray from the point, the sharpest left turn, islands as holes, gaps between open ends\n * closed). MIT OR Apache-2.0, © ArtCraft Team and contributors. See THIRD_PARTY_NOTICES.md.\n */\nimport type { Point } from '../types.js';\nimport type { PolygonFillRule } from '../polygonBoolean.js';\nimport {\n\tcloseContour,\n\tcontourSignedArea,\n\tcontoursToPath,\n\tdist,\n\tflattenChain,\n\tpathToContours,\n\tsegmentLength,\n\tsegmentNearest,\n\tsegmentPoint,\n\tsegmentTangent,\n\tsolveMonotone,\n\tsubSegment,\n\twindingNumber,\n\ttype BezierContour,\n\ttype BezierPath,\n\ttype BezierPathInput,\n\ttype BezierSegment\n} from './bezier.js';\nimport { planarSplit, type PathOpsOptions, type PlanarSplitEdge } from './boolean.js';\n\n/** One input of a planar map. */\nexport interface PlanarInput {\n\t/** Its subpaths: closed ones bound faces and the area the input fills, open ones are edges only. */\n\tpath: BezierPathInput;\n\t/** How its closed subpaths fill (default `nonzero`). */\n\tfillRule?: PolygonFillRule;\n\t/** Whether its closed subpaths count as filling the faces inside them (default true). */\n\tfills?: boolean;\n}\n\nexport interface PlanarMapOptions extends PathOpsOptions {\n\t/**\n\t * Close gaps up to this distance between loose ends (vertices with one edge): each one joins\n\t * the nearest other loose end within reach by a straight edge (default 0, off).\n\t */\n\tgap?: number;\n\t/** Most input segments mapped (default 4096); a bigger input gives no map. */\n\tmaxSegments?: number;\n}\n\n/** A bounded face: an outer outline with the holes other pieces of the map make in it. */\nexport interface PlanarFace {\n\t/** Outer subpath (counter-clockwise in a y-up frame) followed by its holes (clockwise). */\n\tpath: BezierPath;\n\t/** Area (holes taken out). */\n\tarea: number;\n\tbounds: { minX: number; minY: number; maxX: number; maxY: number };\n}\n\n/** A run of edges between junctions (vertices where paths meet or a path ends). */\nexport interface PlanarChain {\n\tsegments: BezierSegment[];\n\t/** A loop with no junction on it. */\n\tclosed: boolean;\n\t/** The input it lies on: the front-most (highest index) where several coincide. */\n\tsource: number;\n}\n\ninterface Edge extends PlanarSplitEdge {\n\t/** Front-most input along it (-1: an edge closing a gap). */\n\tsource: number;\n}\n\ninterface Cycle {\n\thalves: number[];\n\tsegments: BezierSegment[];\n\tarea: number;\n\tbounds: PlanarFace['bounds'];\n}\n\nconst twin = (h: number) => h ^ 1;\n\nfunction boundsOf(segs: readonly BezierSegment[]): PlanarFace['bounds'] {\n\tlet minX = Infinity;\n\tlet minY = Infinity;\n\tlet maxX = -Infinity;\n\tlet maxY = -Infinity;\n\tfor (const s of segs) {\n\t\tfor (const [x, y] of s) {\n\t\t\tif (x < minX) minX = x;\n\t\t\tif (x > maxX) maxX = x;\n\t\t\tif (y < minY) minY = y;\n\t\t\tif (y > maxY) maxY = y;\n\t\t}\n\t}\n\treturn { minX, minY, maxX, maxY };\n}\n\nconst inBounds = (b: PlanarFace['bounds'], p: Point) => p[0] >= b.minX && p[0] <= b.maxX && p[1] >= b.minY && p[1] <= b.maxY;\n\n/** `cycle` without the spurs it runs out and back along (a line's loose end). */\nfunction withoutSpurs(cycle: readonly number[]): number[] {\n\tconst out: number[] = [];\n\tfor (const h of cycle) {\n\t\tif (out.length && out[out.length - 1] === twin(h)) out.pop();\n\t\telse out.push(h);\n\t}\n\twhile (out.length >= 2 && twin(out[0]) === out[out.length - 1]) {\n\t\tout.pop();\n\t\tout.shift();\n\t}\n\treturn out;\n}\n\n/** Moves the end points of a segment onto `a` and `b`, the handles next to them moving along. */\nfunction pinEnds(pts: readonly Point[], a: Point, b: Point): Point[] {\n\tconst n = pts.length;\n\tif (n === 2) return [a, b];\n\tconst out = pts.map((p) => [p[0], p[1]] as Point);\n\tconst d0: Point = [a[0] - pts[0][0], a[1] - pts[0][1]];\n\tconst d1: Point = [b[0] - pts[n - 1][0], b[1] - pts[n - 1][1]];\n\tout[0] = a;\n\tout[n - 1] = b;\n\tif (n === 3) {\n\t\tout[1] = [pts[1][0] + (d0[0] + d1[0]) / 2, pts[1][1] + (d0[1] + d1[1]) / 2];\n\t} else {\n\t\tout[1] = [pts[1][0] + d0[0], pts[1][1] + d0[1]];\n\t\tout[2] = [pts[2][0] + d1[0], pts[2][1] + d1[1]];\n\t}\n\treturn out;\n}\n\n/**\n * A point strictly inside a filled path (nonzero), well away from its edges where it can be:\n * the middle of the widest span of a few horizontal lines through it. Null for an empty path.\n * Ported from vectorcraft's `interior_point` (cadcraft's `interior_point` for polygons).\n */\nexport function interiorPoint(path: BezierPathInput | readonly (readonly BezierSegment[])[]): Point | null {\n\tconst chains: BezierSegment[][] =\n\t\tArray.isArray(path) && path.length > 0 && Array.isArray(path[0]) && Array.isArray((path[0] as BezierSegment[])[0]?.[0])\n\t\t\t? (path as BezierSegment[][])\n\t\t\t: pathToContours(path as BezierPathInput).map((c) => closeContour(c, true));\n\tconst b = boundsOf(chains.flat());\n\tif (!(b.maxX > b.minX) || !(b.maxY > b.minY)) return null;\n\tconst tol = Math.max(b.maxX - b.minX, b.maxY - b.minY) * 1e-3;\n\tconst rings = chains.filter((c) => c.length).map((c) => flattenChain(c, tol));\n\tlet best: { width: number; p: Point } | null = null;\n\tfor (const f of [0.5, 0.25, 0.75, 0.125, 0.375, 0.625, 0.875, 0.0625, 0.9375]) {\n\t\t// A little off round fractions, which on art drawn to a grid fall on the height of a corner.\n\t\tconst y = b.minY + (b.maxY - b.minY) * (f + 0.0061803);\n\t\tconst xs: number[] = [];\n\t\tfor (const ring of rings) {\n\t\t\tfor (let i = 0; i < ring.length; i++) {\n\t\t\t\tconst a = ring[i];\n\t\t\t\tconst c = ring[(i + 1) % ring.length];\n\t\t\t\tif (a[1] <= y !== c[1] <= y) xs.push(a[0] + ((y - a[1]) / (c[1] - a[1])) * (c[0] - a[0]));\n\t\t\t}\n\t\t}\n\t\txs.sort((p, q) => p - q);\n\t\tfor (let i = 0; i + 1 < xs.length; i++) {\n\t\t\tconst width = xs[i + 1] - xs[i];\n\t\t\tif (!(width > (best?.width ?? 0))) continue;\n\t\t\tconst m: Point = [(xs[i] + xs[i + 1]) / 2, y];\n\t\t\tif (windingNumber(chains, m) !== 0) best = { width, p: m };\n\t\t}\n\t}\n\treturn best?.p ?? null;\n}\n\n/**\n * The planar map of a set of paths. Build it with `PlanarMap.build`; faces, chains and fills\n * are computed on first use.\n */\nexport class PlanarMap {\n\tprivate readonly around: number[][];\n\tprivate readonly slot: number[];\n\tprivate readonly component: number[];\n\tprivate cyclesCache: { faces: Cycle[]; holes: Cycle[]; faceHoles: number[][]; faceOf: Int32Array } | null = null;\n\tprivate sourcesCache: (number[] | null)[] = [];\n\tprivate readonly fills: { chains: BezierSegment[][]; fillRule: PolygonFillRule; bounds: PlanarFace['bounds'] }[];\n\n\tprivate constructor(\n\t\treadonly vertices: Point[],\n\t\tprivate readonly edges: Edge[],\n\t\tprivate readonly sources: BezierSegment[],\n\t\treadonly eps: number,\n\t\treadonly inputCount: number,\n\t\tinputs: readonly PlanarInput[]\n\t) {\n\t\tthis.fills = inputs.map((input) => {\n\t\t\tconst chains = input.fills === false ? [] : pathToContours(input.path).filter((c) => c.closed).map((c) => closeContour(c));\n\t\t\treturn { chains, fillRule: input.fillRule ?? 'nonzero', bounds: boundsOf(chains.flat()) };\n\t\t});\n\t\tconst nv = vertices.length;\n\t\tthis.around = Array.from({ length: nv }, () => []);\n\t\tfor (let h = 0; h < edges.length * 2; h++) this.around[this.origin(h)].push(h);\n\t\tthis.slot = new Array(edges.length * 2).fill(0);\n\t\tthis.around.forEach((list, v) => {\n\t\t\tif (list.length === 0) return;\n\t\t\tconst at = vertices[v];\n\t\t\t// Half the shortest chord here: every edge gets that far from the vertex.\n\t\t\tlet r = Infinity;\n\t\t\tfor (const h of list) r = Math.min(r, dist(at, vertices[this.origin(twin(h))]));\n\t\t\tr *= 0.5;\n\t\t\tconst keyed = list.map((h) => ({ h, angle: this.leavingAngle(h, at, r) }));\n\t\t\tkeyed.sort((a, b) => a.angle - b.angle);\n\t\t\tlist.length = 0;\n\t\t\tkeyed.forEach(({ h }, k) => {\n\t\t\t\tlist.push(h);\n\t\t\t\tthis.slot[h] = k;\n\t\t\t});\n\t\t});\n\t\t// Connected pieces (union-find over the edges).\n\t\tconst parent = Array.from({ length: nv }, (_, i) => i);\n\t\tconst find = (v: number): number => {\n\t\t\twhile (parent[v] !== v) {\n\t\t\t\tparent[v] = parent[parent[v]];\n\t\t\t\tv = parent[v];\n\t\t\t}\n\t\t\treturn v;\n\t\t};\n\t\tfor (const e of edges) parent[find(e.a)] = find(e.b);\n\t\tthis.component = Array.from({ length: nv }, (_, v) => find(v));\n\t}\n\n\t/**\n\t * Maps `inputs` (their subpaths as given: open ones stay open). Null when they cannot be mapped\n\t * (non-finite points, more than `maxSegments` segments or an intersection search that does\n\t * not settle) or have no edges.\n\t */\n\tstatic build(inputs: readonly PlanarInput[], options: PlanarMapOptions = {}): PlanarMap | null {\n\t\tconst chains = inputs.map((input) => pathToContours(input.path).map((c) => closeContour(c)).filter((c) => c.length));\n\t\tconst count = chains.reduce((n, cs) => n + cs.reduce((m, c) => m + c.length, 0), 0);\n\t\tif (count === 0 || count > (options.maxSegments ?? 4096)) return null;\n\t\tlet split;\n\t\ttry {\n\t\t\tsplit = planarSplit(chains, options);\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t\tconst edges: Edge[] = split.edges.filter((e) => e.a !== e.b).map((e) => ({ ...e, source: e.operands[e.operands.length - 1] ?? -1 }));\n\t\tif (!edges.length) return null;\n\t\tconst gap = options.gap ?? 0;\n\t\tif (gap > split.eps) closeGaps(split.vertices, edges, gap);\n\t\treturn new PlanarMap(split.vertices, edges, split.sources, split.eps, inputs.length, inputs);\n\t}\n\n\t// -- half-edges ------------------------------------------------------------\n\n\tprivate origin(h: number): number {\n\t\tconst e = this.edges[h >> 1];\n\t\treturn h & 1 ? e.b : e.a;\n\t}\n\n\tprivate halfPts(h: number): Point[] {\n\t\tconst pts = this.edges[h >> 1].pts;\n\t\treturn h & 1 ? [...pts].reverse() : pts;\n\t}\n\n\t/** The half-edge after `h` on the face to its left: the sharpest left turn at its end. */\n\tprivate next(h: number): number {\n\t\tconst back = twin(h);\n\t\tconst list = this.around[this.origin(back)];\n\t\treturn list[(this.slot[back] + list.length - 1) % list.length];\n\t}\n\n\t/** Direction (angle) in which half-edge `h`, leaving `at`, first gets `r` away from it. */\n\tprivate leavingAngle(h: number, at: Point, r: number): number {\n\t\tconst pts = this.halfPts(h);\n\t\tconst d = (t: number) => dist(segmentPoint(pts, t), at);\n\t\tlet lo = 0;\n\t\tlet hi = 1;\n\t\tconst steps = pts.length === 2 ? 1 : 16;\n\t\tfor (let k = 1; k <= steps; k++) {\n\t\t\tif (d(k / steps) >= r) {\n\t\t\t\thi = k / steps;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tlo = k / steps;\n\t\t}\n\t\tfor (let i = 0; i < 40 && hi - lo > 1e-12; i++) {\n\t\t\tconst m = (lo + hi) / 2;\n\t\t\tif (d(m) >= r) hi = m;\n\t\t\telse lo = m;\n\t\t}\n\t\tconst p = segmentPoint(pts, hi);\n\t\tif (dist(p, at) > 0) return Math.atan2(p[1] - at[1], p[0] - at[0]);\n\t\tconst t = segmentTangent(pts, 0);\n\t\treturn Math.atan2(t[1], t[0]);\n\t}\n\n\t/** Segments of a run of half-edges (a loop unless `closed` is false), pieces of one input segment joined again. */\n\tprivate cycleSegments(halves: readonly number[], closed = true): BezierSegment[] {\n\t\tinterface Run {\n\t\t\th: number;\n\t\t\tsrc: number;\n\t\t\tfrom: number;\n\t\t\tto: number;\n\t\t}\n\t\tconst runs: Run[] = halves.map((h) => {\n\t\t\tconst e = this.edges[h >> 1];\n\t\t\treturn { h, src: e.source < 0 ? -1 : e.src, from: h & 1 ? e.sb : e.sa, to: h & 1 ? e.sa : e.sb };\n\t\t});\n\t\tconst joins = (a: Run, b: Run) => a.src >= 0 && a.src === b.src && Math.abs(a.to - b.from) < 1e-9 && a.to - a.from > 0 === b.to - b.from > 0;\n\t\tconst n = runs.length;\n\t\tlet start = 0;\n\t\tfor (let k = 0; closed && k < n; k++) {\n\t\t\tif (!joins(runs[(k + n - 1) % n], runs[k])) {\n\t\t\t\tstart = k;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tconst ordered = [...runs.slice(start), ...runs.slice(0, start)];\n\t\tconst out: BezierSegment[] = [];\n\t\tlet i = 0;\n\t\twhile (i < ordered.length) {\n\t\t\tlet j = i + 1;\n\t\t\twhile (j < ordered.length && joins(ordered[j - 1], ordered[j])) j++;\n\t\t\tconst first = ordered[i];\n\t\t\tconst last = ordered[j - 1];\n\t\t\tif (j - i === 1) out.push(this.halfPts(first.h));\n\t\t\telse {\n\t\t\t\tconst a = this.vertices[this.origin(first.h)];\n\t\t\t\tconst b = this.vertices[this.origin(twin(last.h))];\n\t\t\t\tconst seg = this.sources[first.src];\n\t\t\t\tout.push(seg.length === 2 ? [a, b] : pinEnds(subSegment(seg, first.from, last.to), a, b));\n\t\t\t}\n\t\t\ti = j;\n\t\t}\n\t\treturn out;\n\t}\n\n\tprivate cycles() {\n\t\tif (this.cyclesCache) return this.cyclesCache;\n\t\tconst halves = this.edges.length * 2;\n\t\tconst seen = new Uint8Array(halves);\n\t\tconst faces: Cycle[] = [];\n\t\tconst holes: Cycle[] = [];\n\t\tconst sliver = this.eps * 10;\n\t\tfor (let start = 0; start < halves; start++) {\n\t\t\tif (seen[start]) continue;\n\t\t\tconst walk: number[] = [];\n\t\t\tlet h = start;\n\t\t\twhile (!seen[h]) {\n\t\t\t\tseen[h] = 1;\n\t\t\t\twalk.push(h);\n\t\t\t\th = this.next(h);\n\t\t\t}\n\t\t\tconst cycle = withoutSpurs(walk);\n\t\t\tif (!cycle.length) continue;\n\t\t\tconst segments = this.cycleSegments(cycle);\n\t\t\tconst area = contourSignedArea(segments);\n\t\t\tlet perimeter = 0;\n\t\t\tfor (const s of segments) perimeter += s.length === 2 ? dist(s[0], s[1]) : segmentLength(s, 0, 1, 1e-6);\n\t\t\tif (!(perimeter > 0)) continue;\n\t\t\tconst entry: Cycle = { halves: cycle, segments, area, bounds: boundsOf(segments) };\n\t\t\tif (area > 0 && (2 * area) / perimeter >= sliver) faces.push(entry);\n\t\t\telse if (area < 0 && (-2 * area) / perimeter >= sliver) holes.push(entry);\n\t\t}\n\t\t// Each outer boundary is a hole in the smallest face of another piece around it.\n\t\tconst faceHoles: number[][] = faces.map(() => []);\n\t\tholes.forEach((hole, k) => {\n\t\t\tconst v = this.origin(hole.halves[0]);\n\t\t\tconst p = this.vertices[v];\n\t\t\tconst own = this.component[v];\n\t\t\tlet best = -1;\n\t\t\tfaces.forEach((face, i) => {\n\t\t\t\tif (this.component[this.origin(face.halves[0])] === own || !inBounds(face.bounds, p)) return;\n\t\t\t\tif (best >= 0 && faces[best].area <= face.area) return;\n\t\t\t\tif (windingNumber([face.segments], p) !== 0) best = i;\n\t\t\t});\n\t\t\tif (best >= 0) faceHoles[best].push(k);\n\t\t});\n\t\tconst faceOf = new Int32Array(halves).fill(-1);\n\t\tfaces.forEach((face, i) => {\n\t\t\tfor (const h of face.halves) faceOf[h] = i;\n\t\t\tfor (const k of faceHoles[i]) for (const h of holes[k].halves) faceOf[h] = i;\n\t\t});\n\t\tthis.cyclesCache = { faces, holes, faceHoles, faceOf };\n\t\tthis.sourcesCache = faces.map(() => null);\n\t\treturn this.cyclesCache;\n\t}\n\n\tprivate faceChains(i: number): BezierSegment[][] {\n\t\tconst { faces, holes, faceHoles } = this.cycles();\n\t\treturn [faces[i].segments, ...faceHoles[i].map((k) => holes[k].segments)];\n\t}\n\n\t/** The bounded faces of the map. */\n\tget faces(): PlanarFace[] {\n\t\tconst { faces, holes, faceHoles } = this.cycles();\n\t\treturn faces.map((f, i) => {\n\t\t\tconst chains = this.faceChains(i);\n\t\t\tconst area = f.area + faceHoles[i].reduce((sum, k) => sum + holes[k].area, 0);\n\t\t\treturn { path: contoursToPath(chains.map((segments) => ({ segments, closed: true }))), area, bounds: f.bounds };\n\t\t});\n\t}\n\n\t/** The inputs whose fill covers face `i`, ascending (empty for an area only outlines enclose). */\n\tfaceSources(i: number): number[] {\n\t\tthis.cycles();\n\t\tconst cached = this.sourcesCache[i];\n\t\tif (cached) return cached;\n\t\tconst p = interiorPoint(this.faceChains(i));\n\t\tconst out: number[] = [];\n\t\tif (p) {\n\t\t\tthis.fills.forEach((fill, k) => {\n\t\t\t\tif (!fill.chains.length || !inBounds(fill.bounds, p)) return;\n\t\t\t\tconst w = windingNumber(fill.chains, p);\n\t\t\t\tif (fill.fillRule === 'evenodd' ? (w & 1) === 1 : w !== 0) out.push(k);\n\t\t\t});\n\t\t}\n\t\tthis.sourcesCache[i] = out;\n\t\treturn out;\n\t}\n\n\t/** A point well inside face `i`. */\n\tfaceInterior(i: number): Point | null {\n\t\treturn interiorPoint(this.faceChains(i));\n\t}\n\n\t/** The face under `p` (the smallest one around it), or -1. */\n\tfaceAt(p: Point): number {\n\t\tconst { faces } = this.cycles();\n\t\tlet best = -1;\n\t\tfaces.forEach((face, i) => {\n\t\t\tif (!inBounds(face.bounds, p) || (best >= 0 && faces[best].area <= face.area)) return;\n\t\t\tif (windingNumber(this.faceChains(i), p) !== 0) best = i;\n\t\t});\n\t\treturn best;\n\t}\n\n\t/**\n\t * The union of faces, traced along the map's own edges: those between two merged faces drop\n\t * out exactly, so no seam or sliver is left where a boolean union of their outlines could\n\t * round shared corners apart. Outer subpaths come out counter-clockwise (y-up), holes clockwise.\n\t */\n\tmerge(faceIndices: readonly number[]): BezierPath {\n\t\tconst { faceOf } = this.cycles();\n\t\tconst picked = new Set(faceIndices);\n\t\tconst merged = (h: number) => faceOf[h] >= 0 && picked.has(faceOf[h]);\n\t\tconst boundary = (h: number) => merged(h) && !merged(twin(h));\n\t\tconst used = new Uint8Array(this.edges.length * 2);\n\t\tconst contours: BezierContour[] = [];\n\t\tfor (let start = 0; start < used.length; start++) {\n\t\t\tif (used[start] || !boundary(start)) continue;\n\t\t\tconst cycle: number[] = [];\n\t\t\tlet h = start;\n\t\t\tlet ok = true;\n\t\t\twhile (!used[h]) {\n\t\t\t\tused[h] = 1;\n\t\t\t\tcycle.push(h);\n\t\t\t\t// Turn from the way back as a face walk does, past edges inside the merged faces.\n\t\t\t\tconst back = twin(h);\n\t\t\t\tconst list = this.around[this.origin(back)];\n\t\t\t\tconst k = this.slot[back];\n\t\t\t\tconst n = list.length;\n\t\t\t\tlet found = -1;\n\t\t\t\tfor (let j = 1; j <= n; j++) {\n\t\t\t\t\tconst g = list[(k - j + n * 2) % n];\n\t\t\t\t\tif (boundary(g)) {\n\t\t\t\t\t\tfound = g;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (found < 0) {\n\t\t\t\t\tok = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\th = found;\n\t\t\t}\n\t\t\tif (!ok || h !== start) continue;\n\t\t\tcontours.push({ segments: this.cycleSegments(cycle), closed: true });\n\t\t}\n\t\treturn contoursToPath(contours);\n\t}\n\n\t/**\n\t * The edges joined into runs between junctions: vertices where other than two edges meet, or\n\t * where the two edges lie on different inputs. Each run is keyed by its input.\n\t */\n\tchains(): PlanarChain[] {\n\t\tconst passes = (v: number): [number, number] | null => {\n\t\t\tconst list = this.around[v];\n\t\t\tif (list.length !== 2) return null;\n\t\t\treturn this.edges[list[0] >> 1].source === this.edges[list[1] >> 1].source ? [list[0], list[1]] : null;\n\t\t};\n\t\tconst used = new Uint8Array(this.edges.length);\n\t\tconst out: PlanarChain[] = [];\n\t\tconst walk = (h0: number) => {\n\t\t\tconst source = this.edges[h0 >> 1].source;\n\t\t\tconst halves: number[] = [];\n\t\t\tlet h = h0;\n\t\t\tlet closed = false;\n\t\t\tfor (;;) {\n\t\t\t\tif (used[h >> 1]) {\n\t\t\t\t\tclosed = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tused[h >> 1] = 1;\n\t\t\t\thalves.push(h);\n\t\t\t\tconst v = this.origin(twin(h));\n\t\t\t\tconst pass = passes(v);\n\t\t\t\tif (!pass) {\n\t\t\t\t\tclosed = v === this.origin(h0);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\th = pass[0] === twin(h) ? pass[1] : pass[0];\n\t\t\t}\n\t\t\tif (source < 0) return;\n\t\t\tconst segments = this.cycleSegments(halves, closed);\n\t\t\tout.push({ segments, closed, source });\n\t\t};\n\t\tthis.around.forEach((list, v) => {\n\t\t\tif (passes(v)) return;\n\t\t\tfor (const h of list) if (!used[h >> 1]) walk(h);\n\t\t});\n\t\tfor (let e = 0; e < this.edges.length; e++) if (!used[e]) walk(e * 2);\n\t\treturn out;\n\t}\n\n\t// -- fill regions (cadcraft `boundary_at_gap`) -------------------------------\n\n\t/**\n\t * The region enclosing `p`, traced as cadcraft does it: a ray from `p` towards +x meets the\n\t * edges in order; for each, the half-edge with `p` on its left is followed by always taking the\n\t * sharpest left turn, until a loop that runs counter-clockwise round `p` comes back. The pieces\n\t * of the map nested inside that loop (islands) become its holes. Null when nothing encloses `p`.\n\t */\n\tregionAt(p: Point): BezierPath | null {\n\t\tconst { faces, faceOf } = this.cycles();\n\t\tconst hits: { x: number; e: number }[] = [];\n\t\tthis.edges.forEach((e, i) => {\n\t\t\tconst ay = this.vertices[e.a][1];\n\t\t\tconst by = this.vertices[e.b][1];\n\t\t\tif (ay > p[1] === by > p[1]) return;\n\t\t\t// Edges are monotone pieces, so the ray crosses each at most once.\n\t\t\tconst t = solveMonotone(e.pts, 1, p[1]);\n\t\t\tconst x = segmentPoint(e.pts, t)[0];\n\t\t\tif (x > p[0]) hits.push({ x, e: i });\n\t\t});\n\t\thits.sort((a, b) => a.x - b.x);\n\t\tfor (const { e } of hits.slice(0, 64)) {\n\t\t\tconst ay = this.vertices[this.edges[e].a][1];\n\t\t\tconst by = this.vertices[this.edges[e].b][1];\n\t\t\t// `p` lies west of the edge, which is the left side (y-up frame) of the half-edge running towards +y.\n\t\t\tconst h = by > ay ? e * 2 : e * 2 + 1;\n\t\t\tconst walk: number[] = [];\n\t\t\tconst seen = new Set<number>();\n\t\t\tlet g = h;\n\t\t\twhile (!seen.has(g)) {\n\t\t\t\tseen.add(g);\n\t\t\t\twalk.push(g);\n\t\t\t\tg = this.next(g);\n\t\t\t}\n\t\t\tif (g !== h) continue;\n\t\t\tconst cycle = withoutSpurs(walk);\n\t\t\tif (!cycle.length) continue;\n\t\t\tconst segments = this.cycleSegments(cycle);\n\t\t\tif (!(contourSignedArea(segments) > 0) || windingNumber([segments], p) === 0) continue;\n\t\t\t// The loop is one of the map's faces: take its holes.\n\t\t\tconst face = faceOf[cycle[0]];\n\t\t\tif (face >= 0 && faces[face].halves.includes(cycle[0])) {\n\t\t\t\treturn contoursToPath(this.faceChains(face).map((s) => ({ segments: s, closed: true })));\n\t\t\t}\n\t\t\treturn contoursToPath([{ segments, closed: true }]);\n\t\t}\n\t\treturn null;\n\t}\n}\n\n/** Joins loose ends (degree-one vertices) to the nearest other loose end within `gap`. */\nfunction closeGaps(vertices: Point[], edges: Edge[], gap: number) {\n\tconst degree = new Array(vertices.length).fill(0);\n\tconst linked = new Set<string>();\n\tfor (const e of edges) {\n\t\tdegree[e.a]++;\n\t\tdegree[e.b]++;\n\t\tlinked.add(`${Math.min(e.a, e.b)},${Math.max(e.a, e.b)}`);\n\t}\n\tconst ends = degree.flatMap((d, v) => (d === 1 ? [v] : [])).sort((a, b) => vertices[a][0] - vertices[b][0]);\n\tconst joined = new Set<number>();\n\tlet lo = 0;\n\tfor (let i = 0; i < ends.length; i++) {\n\t\tconst u = ends[i];\n\t\tif (joined.has(u)) continue;\n\t\tconst pu = vertices[u];\n\t\twhile (lo < ends.length && vertices[ends[lo]][0] < pu[0] - gap) lo++;\n\t\tlet best = -1;\n\t\tlet bestD = Infinity;\n\t\tfor (let j = lo; j < ends.length; j++) {\n\t\t\tconst v = ends[j];\n\t\t\tconst pv = vertices[v];\n\t\t\tif (pv[0] > pu[0] + gap) break;\n\t\t\tif (v === u || joined.has(v) || linked.has(`${Math.min(u, v)},${Math.max(u, v)}`)) continue;\n\t\t\tconst d = dist(pu, pv);\n\t\t\tif (d <= gap && d < bestD) {\n\t\t\t\tbest = v;\n\t\t\t\tbestD = d;\n\t\t\t}\n\t\t}\n\t\tif (best < 0) continue;\n\t\tconst a = Math.min(u, best);\n\t\tconst b = Math.max(u, best);\n\t\tedges.push({ a, b, pts: [vertices[a], vertices[b]], operands: [], src: -1, sa: 0, sb: 1, source: -1 });\n\t\tjoined.add(u);\n\t\tjoined.add(best);\n\t}\n}\n\n// -- cutting edges out of outlines (vectorcraft `cut_out`) ---------------------\n\n/** Whether a contour, closed, encloses an area (rather than retracing itself). */\nexport function contourEnclosesArea(contour: BezierContour): boolean {\n\tconst segs = closeContour(contour, true);\n\tif (!segs.length) return false;\n\tconst b = boundsOf(segs);\n\tconst w = b.maxX - b.minX;\n\tconst h = b.maxY - b.minY;\n\treturn Math.abs(contourSignedArea(segs)) > 1e-9 * (w * w + h * h);\n}\n\n/** The point of a chain nearest `p`, as a parameter `segment + t`, with its distance. */\nfunction nearestU(segs: readonly BezierSegment[], p: Point): { u: number; d: number } | null {\n\tlet best: { u: number; d: number } | null = null;\n\tsegs.forEach((seg, k) => {\n\t\tconst n = segmentNearest(seg, p);\n\t\tif (!best || n.distance < best.d) best = { u: k + n.t, d: n.distance };\n\t});\n\treturn best;\n}\n\n/** The run of a chain from parameter `u0` to `u1` (`u0 < u1`, unrolled past the end of a ring). */\nfunction span(segs: readonly BezierSegment[], u0: number, u1: number): BezierSegment[] {\n\tconst n = segs.length;\n\tif (!n || !Number.isFinite(u0) || !Number.isFinite(u1)) return [];\n\tconst first = Math.max(0, Math.floor(u0));\n\tconst last = Math.min(Math.max(0, Math.ceil(u1)), first + 2 * n);\n\tconst out: BezierSegment[] = [];\n\tfor (let k = first; k < last; k++) {\n\t\tconst t0 = Math.min(1, Math.max(0, u0 - k));\n\t\tconst t1 = Math.min(1, Math.max(0, u1 - k));\n\t\tif (t1 - t0 > 1e-12) out.push(subSegment(segs[k % n], t0, t1));\n\t}\n\treturn out;\n}\n\n/**\n * A run with its end points within `tol` of one of `to` put exactly on it (where the planar map\n * put the junction a piece ends at), the neighbouring handles moving with them.\n */\nfunction snapEnds(segs: BezierSegment[], to: readonly Point[], tol: number): BezierSegment[] {\n\tif (!segs.length) return segs;\n\tconst out = segs.map((s) => [...s]);\n\tconst move = (seg: Point[], end: number, handle: number) => {\n\t\tconst q = to.find((t) => dist(t, seg[end]) <= tol);\n\t\tif (!q) return;\n\t\tconst d: Point = [q[0] - seg[end][0], q[1] - seg[end][1]];\n\t\tseg[end] = q;\n\t\tif (seg.length === 4) seg[handle] = [seg[handle][0] + d[0], seg[handle][1] + d[1]];\n\t};\n\tmove(out[0], 0, 1);\n\tconst last = out[out.length - 1];\n\tmove(last, last.length - 1, last.length - 2);\n\treturn out;\n}\n\n/**\n * `path` without `piece`, a run along one of its subpaths between two points (a Shape Builder\n * edge from `PlanarMap.chains`): a closed subpath opens there, an open one splits in two (or\n * loses an end), and a piece that runs all the way round (`closed`, or ending where it starts)\n * takes its subpath with it. With `fillCloses`, open subpaths that enclose an area run on round\n * an invisible closing edge, as the Shape Builder sees a filled path: a piece may run over it,\n * and it never comes back as a visible segment. Null when the piece does not lie on `path`\n * within `tol`.\n *\n * Ported from vectorcraft-main/crates/pathops/src/planar.rs (`cut_out`, `nearest_u`, `span`,\n * `snap_ends`). MIT OR Apache-2.0, © ArtCraft Team and contributors. See THIRD_PARTY_NOTICES.md.\n */\nexport function cutOutPiece(path: BezierPathInput, piece: { segments: readonly BezierSegment[]; closed?: boolean }, fillCloses: boolean, tol: number): BezierPath | null {\n\tconst segs = piece.segments;\n\tif (!segs.length) return null;\n\t// A point well inside the piece: the middle of its longest segment.\n\tlet mid: Point | null = null;\n\tlet longest = -1;\n\tlet perimeter = 0;\n\tfor (const seg of segs) {\n\t\tconst len = segmentLength(seg);\n\t\tperimeter += len;\n\t\tif (len > longest) {\n\t\t\tlongest = len;\n\t\t\tmid = segmentPoint(seg, 0.5);\n\t\t}\n\t}\n\t// A speck (where paths touch): there is nothing to cut.\n\tif (!mid || perimeter <= tol) return null;\n\tconst a = segs[0][0];\n\tconst lastSeg = segs[segs.length - 1];\n\tconst b = lastSeg[lastSeg.length - 1];\n\tconst whole = !!piece.closed || dist(a, b) <= tol;\n\tconst contours = pathToContours(path);\n\t// Each subpath as the piece may run along it: round its closing edge when it has one.\n\tlet found: { index: number; ring: BezierSegment[]; closed: boolean; um: number; d: number } | null = null;\n\tcontours.forEach((c, index) => {\n\t\tif (!c.segments.length) return;\n\t\tconst closed = c.closed || (fillCloses && contourEnclosesArea(c));\n\t\tconst ring = closeContour(c, closed);\n\t\tconst n = nearestU(ring, mid!);\n\t\tif (n && n.d <= tol && (!found || n.d < found.d)) found = { index, ring, closed, um: n.u, d: n.d };\n\t});\n\tif (!found) return null;\n\tconst { index, ring, closed, um } = found as { index: number; ring: BezierSegment[]; closed: boolean; um: number };\n\tconst len = ring.length;\n\tconst real = closeContour(contours[index]).length;\n\tconst at = (p: Point) => {\n\t\tconst n = nearestU(ring, p);\n\t\treturn n && n.d <= tol ? n.u : null;\n\t};\n\t// The parameter spans of the ring that stay (unrolled past the end of a ring).\n\tlet keep: [number, number][] = [];\n\tif (!whole) {\n\t\tconst ua = at(a);\n\t\tconst ub = at(b);\n\t\tif (ua === null || ub === null) return null;\n\t\tif (closed) {\n\t\t\tconst fwd = (from: number, to: number) => (((to - from) % len) + len) % len;\n\t\t\t// The piece runs from one end through `mid` to the other; what stays runs on round.\n\t\t\tconst [start, end] = fwd(ua, um) <= fwd(ua, ub) ? [ub, ua] : [ua, ub];\n\t\t\tconst rest = fwd(start, end);\n\t\t\tif (rest > 1e-9 && len - rest > 1e-9) {\n\t\t\t\t// Where the ring closes with an invisible edge (`real..len`), what stays stops at it.\n\t\t\t\tconst parts: [number, number][] = real >= len ? [[0, 2 * len]] : [[0, real], [len, len + real]];\n\t\t\t\tkeep = parts.map(([lo, hi]): [number, number] => [Math.max(start, lo), Math.min(start + rest, hi)]).filter(([x, y]) => y - x > 1e-9);\n\t\t\t}\n\t\t} else {\n\t\t\tconst lo = Math.min(ua, ub);\n\t\t\tconst hi = Math.max(ua, ub);\n\t\t\tif (um < lo - 1e-9 || um > hi + 1e-9) return null;\n\t\t\tkeep = ([[0, lo], [hi, len]] as [number, number][]).filter(([x, y]) => y - x > 1e-9);\n\t\t}\n\t}\n\tconst out: BezierContour[] = contours.slice(0, index);\n\tfor (const [u0, u1] of keep) {\n\t\tconst run = span(ring, u0, u1);\n\t\tif (run.length) out.push({ segments: snapEnds(run, [a, b], tol), closed: false });\n\t}\n\tout.push(...contours.slice(index + 1));\n\treturn contoursToPath(out);\n}\n","/**\n * Diagonal hatching: the Shape Builder's mesh highlight over a face.\n *\n * Ported from vectorcraft-main/crates/tools/src/builder.rs (`hatch`). MIT OR Apache-2.0,\n * © ArtCraft Team and contributors. See THIRD_PARTY_NOTICES.md.\n */\nimport type { Point } from '../types.js';\nimport { bezierPathBounds, closeContour, flattenChain, pathToContours, type BezierPath, type BezierPathInput } from './bezier.js';\n\nexport interface HatchOptions {\n\t/** Distance between the lines, in the path's units (default 4). */\n\tgap?: number;\n\t/** Most lines drawn: past it the gap widens (default 400). */\n\tmaxLines?: number;\n}\n\n/**\n * 45° hatch lines filling `path` (non-zero and even-odd agree for simple faces; crossings are\n * paired in order, as even-odd does), `gap` apart. Each line is its own `M`/`L` pair, clipped to\n * the path. Empty for a path with no area.\n */\nexport function hatchPath(path: BezierPathInput, options: HatchOptions = {}): BezierPath {\n\tconst out: BezierPath = [];\n\tconst b = bezierPathBounds(path);\n\tif (!b || b.maxX - b.minX <= 0 || b.maxY - b.minY <= 0) return out;\n\tconst want = Math.max(options.gap ?? 4, 1e-3);\n\t// Rotated by -45° the hatch lines are horizontal scanlines.\n\tconst s = Math.SQRT1_2;\n\tconst rot = (p: Point): Point => [(p[0] + p[1]) * s, (p[1] - p[0]) * s];\n\tconst unrot = (x: number, y: number) => ({ x: (x - y) * s, y: (x + y) * s });\n\tconst edges: [Point, Point][] = [];\n\tfor (const contour of pathToContours(path)) {\n\t\tconst pts = flattenChain(closeContour(contour, true), want * 0.1).map(rot);\n\t\tfor (let i = 0; i < pts.length; i++) {\n\t\t\tconst p = pts[i];\n\t\t\tconst q = pts[(i + 1) % pts.length];\n\t\t\tif (p[0] !== q[0] || p[1] !== q[1]) edges.push([p, q]);\n\t\t}\n\t}\n\tlet y0 = Infinity;\n\tlet y1 = -Infinity;\n\tfor (const [p, q] of edges) {\n\t\ty0 = Math.min(y0, p[1], q[1]);\n\t\ty1 = Math.max(y1, p[1], q[1]);\n\t}\n\tif (!(y1 > y0)) return out;\n\tconst gap = Math.max(want, (y1 - y0) / Math.max(1, options.maxLines ?? 400), 1e-6);\n\tconst xs: number[] = [];\n\tfor (let y = Math.floor(y0 / gap) * gap + gap / 2; y < y1; y += gap) {\n\t\txs.length = 0;\n\t\tfor (const [p, q] of edges) if (p[1] <= y !== q[1] <= y) xs.push(p[0] + ((y - p[1]) / (q[1] - p[1])) * (q[0] - p[0]));\n\t\txs.sort((m, n) => m - n);\n\t\tfor (let i = 0; i + 1 < xs.length; i += 2) {\n\t\t\tout.push({ type: 'M', ...unrot(xs[i], y) }, { type: 'L', ...unrot(xs[i + 1], y) });\n\t\t}\n\t}\n\treturn out;\n}\n","/**\n * The Pathfinder panel's dividing operations over a stack of shapes (index 0 at the back):\n * Divide, Trim, Merge, Crop, Outline and Minus Back. (Unite, Minus Front, Intersect and Exclude\n * are `pathBoolean`.) Every result carries the index of the shape whose paint it keeps.\n *\n * The filled areas come from one arrangement of all shapes (`dividePaths`, `pathBooleanSelect`):\n * each area knows the shapes covering it, so an operation is a choice of areas per result.\n * Outline and Divide with cutting lines use the planar map (`PlanarMap`).\n *\n * Ported from vectorcraft-main/crates/pathops/src/pathfinder.rs (`pathfinder`, `PathfinderOp`,\n * `outline_edges`), MIT OR Apache-2.0, © ArtCraft Team and contributors. See\n * THIRD_PARTY_NOTICES.md.\n */\nimport type { PolygonFillRule } from '../polygonBoolean.js';\nimport { pathToContours, contoursToPath, type BezierPath, type BezierPathInput } from './bezier.js';\nimport { dividePaths, pathBooleanSelect, type PathOpsOptions, type PathOpsReport } from './boolean.js';\nimport { PlanarMap } from './planar.js';\n\nexport type PathfinderOperation = 'divide' | 'trim' | 'merge' | 'crop' | 'outline' | 'minusBack';\n\nexport const PATHFINDER_OPERATIONS: readonly PathfinderOperation[] = ['divide', 'trim', 'merge', 'crop', 'outline', 'minusBack'];\n\n/** A shape of the stack. */\nexport interface PathfinderShape {\n\t/** Its outline; open subpaths are closed for filling (unless `line`). */\n\tpath: BezierPathInput;\n\tfillRule?: PolygonFillRule;\n\t/** Identifies its paint: Merge joins touching areas whose shapes share a key (default: the index). */\n\tkey?: string | number;\n\t/**\n\t * An unfilled open path: a cutting edge for Divide, splitting the faces it crosses without\n\t * becoming one (ignored by the other operations).\n\t */\n\tline?: boolean;\n}\n\n/** One result: a filled area (or an open stroke for Outline). */\nexport interface PathfinderPiece {\n\tpath: BezierPath;\n\t/** Index of the shape whose paint it keeps. */\n\tsource: number;\n\t/** Outline edges are open paths (a loop with no junction on it stays closed). */\n\topen?: boolean;\n}\n\nexport interface PathfinderResult extends PathOpsReport {\n\tpieces: PathfinderPiece[];\n}\n\nconst top = (covering: readonly number[]) => covering[covering.length - 1];\n\n/**\n * Runs a Pathfinder operation:\n * - `divide`: every face of the arrangement becomes its own piece, painted like the top-most\n * shape covering it. `line` shapes cut the faces they cross.\n * - `trim`: hidden parts are removed; one piece per shape that stays visible, nothing merged.\n * - `merge`: like Trim, then touching or overlapping visible parts of shapes with the same key\n * become one piece (one per connected area).\n * - `crop`: the top shape crops the others; it is removed, the visible parts of the shapes below\n * inside it stay.\n * - `outline`: every outline is cut where it meets another; the pieces are open paths painted\n * like the shape they bound (the top-most where outlines coincide).\n * - `minusBack`: the top shape minus everything behind it.\n */\nexport function pathfinder(op: PathfinderOperation, shapes: readonly PathfinderShape[], options: PathOpsOptions = {}): PathfinderResult {\n\tconst n = shapes.length;\n\tif (n === 0) return { pieces: [], engine: 'curve' };\n\tconst filled = shapes.filter((s) => !s.line);\n\tconst operands = shapes.map((s) => ({ path: s.path, fillRule: s.fillRule ?? 'nonzero' }));\n\n\tif (op === 'outline') {\n\t\tconst map = PlanarMap.build(\n\t\t\tshapes.map((s) => ({ path: s.line ? s.path : closeAll(s.path), fills: false })),\n\t\t\toptions\n\t\t);\n\t\tif (!map) return { pieces: [], engine: 'curve', error: 'could not map the outlines' };\n\t\tconst pieces = map.chains().map((c) => ({ path: contoursToPath([{ segments: c.segments, closed: c.closed }]), source: c.source, open: !c.closed }));\n\t\treturn { pieces, engine: 'curve' };\n\t}\n\n\tif (op === 'divide') {\n\t\tif (filled.length !== n) {\n\t\t\tconst map = PlanarMap.build(shapes.map((s) => ({ path: s.line ? s.path : closeAll(s.path), fillRule: s.fillRule, fills: !s.line })), options);\n\t\t\tif (!map) return { pieces: [], engine: 'curve', error: 'could not map the shapes' };\n\t\t\tconst pieces: PathfinderPiece[] = [];\n\t\t\tmap.faces.forEach((face, i) => {\n\t\t\t\tconst covering = map.faceSources(i);\n\t\t\t\tif (covering.length) pieces.push({ path: face.path, source: top(covering) });\n\t\t\t});\n\t\t\treturn { pieces, engine: 'curve' };\n\t\t}\n\t\tconst result = dividePaths(operands, options);\n\t\treturn { ...report(result), pieces: result.pieces.map((p) => ({ path: p.path, source: top(p.operands) })) };\n\t}\n\n\t// The filled-area operations ignore cutting lines.\n\tconst index = shapes.flatMap((s, i) => (s.line ? [] : [i]));\n\tconst m = index.length;\n\tif (m === 0) return { pieces: [], engine: 'curve' };\n\tconst ops = index.map((i) => operands[i]);\n\tconst key = (k: number) => shapes[index[k]].key ?? index[k];\n\tconst select = (selectors: ((covering: readonly number[]) => boolean)[]) => pathBooleanSelect(ops, selectors, options);\n\tconst joined = (parts: BezierPath[]) => parts.flat();\n\n\tswitch (op) {\n\t\tcase 'trim': {\n\t\t\tconst result = select(index.map((_, k) => (c) => c.length > 0 && top(c) === k));\n\t\t\tconst pieces = result.parts.flatMap((parts, k) => (parts.length ? [{ path: joined(parts), source: index[k] }] : []));\n\t\t\treturn { ...report(result), pieces };\n\t\t}\n\t\tcase 'merge': {\n\t\t\tconst keys: (string | number)[] = [];\n\t\t\tfor (let k = 0; k < m; k++) if (!keys.includes(key(k))) keys.push(key(k));\n\t\t\tconst result = select(keys.map((kk) => (c) => c.length > 0 && key(top(c)) === kk));\n\t\t\tconst pieces: PathfinderPiece[] = [];\n\t\t\tresult.parts.forEach((parts, j) => {\n\t\t\t\t// Painted like the front-most shape with that key.\n\t\t\t\tlet source = 0;\n\t\t\t\tfor (let k = 0; k < m; k++) if (key(k) === keys[j]) source = index[k];\n\t\t\t\tfor (const part of parts) pieces.push({ path: part, source });\n\t\t\t});\n\t\t\treturn { ...report(result), pieces };\n\t\t}\n\t\tcase 'crop': {\n\t\t\tif (m < 2) return { pieces: [], engine: 'curve' };\n\t\t\tconst front = m - 1;\n\t\t\tconst result = select(\n\t\t\t\tindex.slice(0, front).map((_, k) => (c) => c.length >= 2 && top(c) === front && c[c.length - 2] === k)\n\t\t\t);\n\t\t\tconst pieces = result.parts.flatMap((parts, k) => (parts.length ? [{ path: joined(parts), source: index[k] }] : []));\n\t\t\treturn { ...report(result), pieces };\n\t\t}\n\t\tcase 'minusBack': {\n\t\t\tconst front = m - 1;\n\t\t\tconst result = select([(c) => c.length === 1 && c[0] === front]);\n\t\t\tconst parts = result.parts[0];\n\t\t\treturn { ...report(result), pieces: parts.length ? [{ path: joined(parts), source: index[front] }] : [] };\n\t\t}\n\t}\n\treturn { pieces: [], engine: 'curve' };\n}\n\nfunction report(r: PathOpsReport): PathOpsReport {\n\treturn { engine: r.engine, ...(r.fallbackReason ? { fallbackReason: r.fallbackReason } : {}), ...(r.error ? { error: r.error } : {}) };\n}\n\n/** The path with every subpath closed (as it fills). */\nfunction closeAll(path: BezierPathInput): BezierPath {\n\treturn contoursToPath(pathToContours(path).map((c) => ({ segments: c.segments, closed: true })));\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/editor/editor/packages/core/dist/chunk-KSJLDRHK.cjs","../src/canvas/pathops/planar.ts","../src/canvas/pathops/hatch.ts","../src/canvas/pathops/pathfinder.ts"],"names":["t","len","closed","ring"],"mappings":"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","file":"/home/runner/work/editor/editor/packages/core/dist/chunk-KSJLDRHK.cjs","sourcesContent":[null,"/**\n * Planar maps: the faces and edges a set of paths divides the plane into (Shape Builder, fill\n * regions, Pathfinder Outline).\n *\n * Unlike `dividePaths`, which splits the *filled areas* of closed shapes, every path here is an\n * edge, open ones included: three crossing lines enclose a triangle, a line across a rectangle\n * splits it in two, and an area enclosed by paths is a face whether or not anything fills it.\n *\n * 1. `planarSplit` (the boolean engine's intersection search) cuts every input segment wherever\n * it meets another one; coincident pieces become one edge.\n * 2. Each edge gives two half-edges. Around every vertex the half-edges leaving it are sorted by\n * the direction in which they cross a small circle around it (half the shortest edge there),\n * which orders tangent curves correctly.\n * 3. A face walk takes, at each vertex, the half-edge just clockwise of the way back — the\n * sharpest left turn. Bounded faces come out counter-clockwise (positive area in a y-up\n * frame), the outer boundary of every connected piece clockwise; spurs (loose line ends) are\n * dropped. Each outer boundary becomes a hole of the smallest face of another piece around\n * it, so nesting is decided face by face, never by an even-odd rule over the whole network.\n * 4. Faces learn which inputs fill them from a point well inside each face.\n *\n * Adjacency is kept in per-vertex lists and half-edge slots (no scans over all edges per step).\n *\n * Ported from vectorcraft-main/crates/pathops/src/planar.rs (`map`, `Map::merge`, `build`,\n * `interior_point`, `without_spurs`, `leaving_angle`, `cut_out`), figcraft-main/crates/doc/src/vector_faces.rs\n * (`faces`: half-edge walk with an angle-sorted next edge, the winding deciding inside or\n * outside) and cadcraft-main/crates/geom/src/region.rs (`enclosing_loop`, `boundary_at_gap`:\n * a ray from the point, the sharpest left turn, islands as holes, gaps between open ends\n * closed). MIT OR Apache-2.0, © ArtCraft Team and contributors. See THIRD_PARTY_NOTICES.md.\n */\nimport type { Point } from '../types.js';\nimport type { PolygonFillRule } from '../polygonBoolean.js';\nimport {\n\tcloseContour,\n\tcontourSignedArea,\n\tcontoursToPath,\n\tdist,\n\tflattenChain,\n\tpathToContours,\n\tsegmentLength,\n\tsegmentNearest,\n\tsegmentPoint,\n\tsegmentTangent,\n\tsolveMonotone,\n\tsubSegment,\n\twindingNumber,\n\ttype BezierContour,\n\ttype BezierPath,\n\ttype BezierPathInput,\n\ttype BezierSegment\n} from './bezier.js';\nimport { planarSplit, type PathOpsOptions, type PlanarSplitEdge } from './boolean.js';\n\n/** One input of a planar map. */\nexport interface PlanarInput {\n\t/** Its subpaths: closed ones bound faces and the area the input fills, open ones are edges only. */\n\tpath: BezierPathInput;\n\t/** How its closed subpaths fill (default `nonzero`). */\n\tfillRule?: PolygonFillRule;\n\t/** Whether its closed subpaths count as filling the faces inside them (default true). */\n\tfills?: boolean;\n}\n\nexport interface PlanarMapOptions extends PathOpsOptions {\n\t/**\n\t * Close gaps up to this distance between loose ends (vertices with one edge): each one joins\n\t * the nearest other loose end within reach by a straight edge (default 0, off).\n\t */\n\tgap?: number;\n\t/** Most input segments mapped (default 4096); a bigger input gives no map. */\n\tmaxSegments?: number;\n}\n\n/** A bounded face: an outer outline with the holes other pieces of the map make in it. */\nexport interface PlanarFace {\n\t/** Outer subpath (counter-clockwise in a y-up frame) followed by its holes (clockwise). */\n\tpath: BezierPath;\n\t/** Area (holes taken out). */\n\tarea: number;\n\tbounds: { minX: number; minY: number; maxX: number; maxY: number };\n}\n\n/** A run of edges between junctions (vertices where paths meet or a path ends). */\nexport interface PlanarChain {\n\tsegments: BezierSegment[];\n\t/** A loop with no junction on it. */\n\tclosed: boolean;\n\t/** The input it lies on: the front-most (highest index) where several coincide. */\n\tsource: number;\n}\n\ninterface Edge extends PlanarSplitEdge {\n\t/** Front-most input along it (-1: an edge closing a gap). */\n\tsource: number;\n}\n\ninterface Cycle {\n\thalves: number[];\n\tsegments: BezierSegment[];\n\tarea: number;\n\tbounds: PlanarFace['bounds'];\n}\n\nconst twin = (h: number) => h ^ 1;\n\nfunction boundsOf(segs: readonly BezierSegment[]): PlanarFace['bounds'] {\n\tlet minX = Infinity;\n\tlet minY = Infinity;\n\tlet maxX = -Infinity;\n\tlet maxY = -Infinity;\n\tfor (const s of segs) {\n\t\tfor (const [x, y] of s) {\n\t\t\tif (x < minX) minX = x;\n\t\t\tif (x > maxX) maxX = x;\n\t\t\tif (y < minY) minY = y;\n\t\t\tif (y > maxY) maxY = y;\n\t\t}\n\t}\n\treturn { minX, minY, maxX, maxY };\n}\n\nconst inBounds = (b: PlanarFace['bounds'], p: Point) => p[0] >= b.minX && p[0] <= b.maxX && p[1] >= b.minY && p[1] <= b.maxY;\n\n/** `cycle` without the spurs it runs out and back along (a line's loose end). */\nfunction withoutSpurs(cycle: readonly number[]): number[] {\n\tconst out: number[] = [];\n\tfor (const h of cycle) {\n\t\tif (out.length && out[out.length - 1] === twin(h)) out.pop();\n\t\telse out.push(h);\n\t}\n\twhile (out.length >= 2 && twin(out[0]) === out[out.length - 1]) {\n\t\tout.pop();\n\t\tout.shift();\n\t}\n\treturn out;\n}\n\n/** Moves the end points of a segment onto `a` and `b`, the handles next to them moving along. */\nfunction pinEnds(pts: readonly Point[], a: Point, b: Point): Point[] {\n\tconst n = pts.length;\n\tif (n === 2) return [a, b];\n\tconst out = pts.map((p) => [p[0], p[1]] as Point);\n\tconst d0: Point = [a[0] - pts[0][0], a[1] - pts[0][1]];\n\tconst d1: Point = [b[0] - pts[n - 1][0], b[1] - pts[n - 1][1]];\n\tout[0] = a;\n\tout[n - 1] = b;\n\tif (n === 3) {\n\t\tout[1] = [pts[1][0] + (d0[0] + d1[0]) / 2, pts[1][1] + (d0[1] + d1[1]) / 2];\n\t} else {\n\t\tout[1] = [pts[1][0] + d0[0], pts[1][1] + d0[1]];\n\t\tout[2] = [pts[2][0] + d1[0], pts[2][1] + d1[1]];\n\t}\n\treturn out;\n}\n\n/**\n * A point strictly inside a filled path (nonzero), well away from its edges where it can be:\n * the middle of the widest span of a few horizontal lines through it. Null for an empty path.\n * Ported from vectorcraft's `interior_point` (cadcraft's `interior_point` for polygons).\n */\nexport function interiorPoint(path: BezierPathInput | readonly (readonly BezierSegment[])[]): Point | null {\n\tconst chains: BezierSegment[][] =\n\t\tArray.isArray(path) && path.length > 0 && Array.isArray(path[0]) && Array.isArray((path[0] as BezierSegment[])[0]?.[0])\n\t\t\t? (path as BezierSegment[][])\n\t\t\t: pathToContours(path as BezierPathInput).map((c) => closeContour(c, true));\n\tconst b = boundsOf(chains.flat());\n\tif (!(b.maxX > b.minX) || !(b.maxY > b.minY)) return null;\n\tconst tol = Math.max(b.maxX - b.minX, b.maxY - b.minY) * 1e-3;\n\tconst rings = chains.filter((c) => c.length).map((c) => flattenChain(c, tol));\n\tlet best: { width: number; p: Point } | null = null;\n\tfor (const f of [0.5, 0.25, 0.75, 0.125, 0.375, 0.625, 0.875, 0.0625, 0.9375]) {\n\t\t// A little off round fractions, which on art drawn to a grid fall on the height of a corner.\n\t\tconst y = b.minY + (b.maxY - b.minY) * (f + 0.0061803);\n\t\tconst xs: number[] = [];\n\t\tfor (const ring of rings) {\n\t\t\tfor (let i = 0; i < ring.length; i++) {\n\t\t\t\tconst a = ring[i];\n\t\t\t\tconst c = ring[(i + 1) % ring.length];\n\t\t\t\tif (a[1] <= y !== c[1] <= y) xs.push(a[0] + ((y - a[1]) / (c[1] - a[1])) * (c[0] - a[0]));\n\t\t\t}\n\t\t}\n\t\txs.sort((p, q) => p - q);\n\t\tfor (let i = 0; i + 1 < xs.length; i++) {\n\t\t\tconst width = xs[i + 1] - xs[i];\n\t\t\tif (!(width > (best?.width ?? 0))) continue;\n\t\t\tconst m: Point = [(xs[i] + xs[i + 1]) / 2, y];\n\t\t\tif (windingNumber(chains, m) !== 0) best = { width, p: m };\n\t\t}\n\t}\n\treturn best?.p ?? null;\n}\n\n/**\n * The planar map of a set of paths. Build it with `PlanarMap.build`; faces, chains and fills\n * are computed on first use.\n */\nexport class PlanarMap {\n\tprivate readonly around: number[][];\n\tprivate readonly slot: number[];\n\tprivate readonly component: number[];\n\tprivate cyclesCache: { faces: Cycle[]; holes: Cycle[]; faceHoles: number[][]; faceOf: Int32Array } | null = null;\n\tprivate sourcesCache: (number[] | null)[] = [];\n\tprivate readonly fills: { chains: BezierSegment[][]; fillRule: PolygonFillRule; bounds: PlanarFace['bounds'] }[];\n\n\tprivate constructor(\n\t\treadonly vertices: Point[],\n\t\tprivate readonly edges: Edge[],\n\t\tprivate readonly sources: BezierSegment[],\n\t\treadonly eps: number,\n\t\treadonly inputCount: number,\n\t\tinputs: readonly PlanarInput[]\n\t) {\n\t\tthis.fills = inputs.map((input) => {\n\t\t\tconst chains = input.fills === false ? [] : pathToContours(input.path).filter((c) => c.closed).map((c) => closeContour(c));\n\t\t\treturn { chains, fillRule: input.fillRule ?? 'nonzero', bounds: boundsOf(chains.flat()) };\n\t\t});\n\t\tconst nv = vertices.length;\n\t\tthis.around = Array.from({ length: nv }, () => []);\n\t\tfor (let h = 0; h < edges.length * 2; h++) this.around[this.origin(h)].push(h);\n\t\tthis.slot = new Array(edges.length * 2).fill(0);\n\t\tthis.around.forEach((list, v) => {\n\t\t\tif (list.length === 0) return;\n\t\t\tconst at = vertices[v];\n\t\t\t// Half the shortest chord here: every edge gets that far from the vertex.\n\t\t\tlet r = Infinity;\n\t\t\tfor (const h of list) r = Math.min(r, dist(at, vertices[this.origin(twin(h))]));\n\t\t\tr *= 0.5;\n\t\t\tconst keyed = list.map((h) => ({ h, angle: this.leavingAngle(h, at, r) }));\n\t\t\tkeyed.sort((a, b) => a.angle - b.angle);\n\t\t\tlist.length = 0;\n\t\t\tkeyed.forEach(({ h }, k) => {\n\t\t\t\tlist.push(h);\n\t\t\t\tthis.slot[h] = k;\n\t\t\t});\n\t\t});\n\t\t// Connected pieces (union-find over the edges).\n\t\tconst parent = Array.from({ length: nv }, (_, i) => i);\n\t\tconst find = (v: number): number => {\n\t\t\twhile (parent[v] !== v) {\n\t\t\t\tparent[v] = parent[parent[v]];\n\t\t\t\tv = parent[v];\n\t\t\t}\n\t\t\treturn v;\n\t\t};\n\t\tfor (const e of edges) parent[find(e.a)] = find(e.b);\n\t\tthis.component = Array.from({ length: nv }, (_, v) => find(v));\n\t}\n\n\t/**\n\t * Maps `inputs` (their subpaths as given: open ones stay open). Null when they cannot be mapped\n\t * (non-finite points, more than `maxSegments` segments or an intersection search that does\n\t * not settle) or have no edges.\n\t */\n\tstatic build(inputs: readonly PlanarInput[], options: PlanarMapOptions = {}): PlanarMap | null {\n\t\tconst chains = inputs.map((input) => pathToContours(input.path).map((c) => closeContour(c)).filter((c) => c.length));\n\t\tconst count = chains.reduce((n, cs) => n + cs.reduce((m, c) => m + c.length, 0), 0);\n\t\tif (count === 0 || count > (options.maxSegments ?? 4096)) return null;\n\t\tlet split;\n\t\ttry {\n\t\t\tsplit = planarSplit(chains, options);\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t\tconst edges: Edge[] = split.edges.filter((e) => e.a !== e.b).map((e) => ({ ...e, source: e.operands[e.operands.length - 1] ?? -1 }));\n\t\tif (!edges.length) return null;\n\t\tconst gap = options.gap ?? 0;\n\t\tif (gap > split.eps) closeGaps(split.vertices, edges, gap);\n\t\treturn new PlanarMap(split.vertices, edges, split.sources, split.eps, inputs.length, inputs);\n\t}\n\n\t// -- half-edges ------------------------------------------------------------\n\n\tprivate origin(h: number): number {\n\t\tconst e = this.edges[h >> 1];\n\t\treturn h & 1 ? e.b : e.a;\n\t}\n\n\tprivate halfPts(h: number): Point[] {\n\t\tconst pts = this.edges[h >> 1].pts;\n\t\treturn h & 1 ? [...pts].reverse() : pts;\n\t}\n\n\t/** The half-edge after `h` on the face to its left: the sharpest left turn at its end. */\n\tprivate next(h: number): number {\n\t\tconst back = twin(h);\n\t\tconst list = this.around[this.origin(back)];\n\t\treturn list[(this.slot[back] + list.length - 1) % list.length];\n\t}\n\n\t/** Direction (angle) in which half-edge `h`, leaving `at`, first gets `r` away from it. */\n\tprivate leavingAngle(h: number, at: Point, r: number): number {\n\t\tconst pts = this.halfPts(h);\n\t\tconst d = (t: number) => dist(segmentPoint(pts, t), at);\n\t\tlet lo = 0;\n\t\tlet hi = 1;\n\t\tconst steps = pts.length === 2 ? 1 : 16;\n\t\tfor (let k = 1; k <= steps; k++) {\n\t\t\tif (d(k / steps) >= r) {\n\t\t\t\thi = k / steps;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tlo = k / steps;\n\t\t}\n\t\tfor (let i = 0; i < 40 && hi - lo > 1e-12; i++) {\n\t\t\tconst m = (lo + hi) / 2;\n\t\t\tif (d(m) >= r) hi = m;\n\t\t\telse lo = m;\n\t\t}\n\t\tconst p = segmentPoint(pts, hi);\n\t\tif (dist(p, at) > 0) return Math.atan2(p[1] - at[1], p[0] - at[0]);\n\t\tconst t = segmentTangent(pts, 0);\n\t\treturn Math.atan2(t[1], t[0]);\n\t}\n\n\t/** Segments of a run of half-edges (a loop unless `closed` is false), pieces of one input segment joined again. */\n\tprivate cycleSegments(halves: readonly number[], closed = true): BezierSegment[] {\n\t\tinterface Run {\n\t\t\th: number;\n\t\t\tsrc: number;\n\t\t\tfrom: number;\n\t\t\tto: number;\n\t\t}\n\t\tconst runs: Run[] = halves.map((h) => {\n\t\t\tconst e = this.edges[h >> 1];\n\t\t\treturn { h, src: e.source < 0 ? -1 : e.src, from: h & 1 ? e.sb : e.sa, to: h & 1 ? e.sa : e.sb };\n\t\t});\n\t\tconst joins = (a: Run, b: Run) => a.src >= 0 && a.src === b.src && Math.abs(a.to - b.from) < 1e-9 && a.to - a.from > 0 === b.to - b.from > 0;\n\t\tconst n = runs.length;\n\t\tlet start = 0;\n\t\tfor (let k = 0; closed && k < n; k++) {\n\t\t\tif (!joins(runs[(k + n - 1) % n], runs[k])) {\n\t\t\t\tstart = k;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tconst ordered = [...runs.slice(start), ...runs.slice(0, start)];\n\t\tconst out: BezierSegment[] = [];\n\t\tlet i = 0;\n\t\twhile (i < ordered.length) {\n\t\t\tlet j = i + 1;\n\t\t\twhile (j < ordered.length && joins(ordered[j - 1], ordered[j])) j++;\n\t\t\tconst first = ordered[i];\n\t\t\tconst last = ordered[j - 1];\n\t\t\tif (j - i === 1) out.push(this.halfPts(first.h));\n\t\t\telse {\n\t\t\t\tconst a = this.vertices[this.origin(first.h)];\n\t\t\t\tconst b = this.vertices[this.origin(twin(last.h))];\n\t\t\t\tconst seg = this.sources[first.src];\n\t\t\t\tout.push(seg.length === 2 ? [a, b] : pinEnds(subSegment(seg, first.from, last.to), a, b));\n\t\t\t}\n\t\t\ti = j;\n\t\t}\n\t\treturn out;\n\t}\n\n\tprivate cycles() {\n\t\tif (this.cyclesCache) return this.cyclesCache;\n\t\tconst halves = this.edges.length * 2;\n\t\tconst seen = new Uint8Array(halves);\n\t\tconst faces: Cycle[] = [];\n\t\tconst holes: Cycle[] = [];\n\t\tconst sliver = this.eps * 10;\n\t\tfor (let start = 0; start < halves; start++) {\n\t\t\tif (seen[start]) continue;\n\t\t\tconst walk: number[] = [];\n\t\t\tlet h = start;\n\t\t\twhile (!seen[h]) {\n\t\t\t\tseen[h] = 1;\n\t\t\t\twalk.push(h);\n\t\t\t\th = this.next(h);\n\t\t\t}\n\t\t\tconst cycle = withoutSpurs(walk);\n\t\t\tif (!cycle.length) continue;\n\t\t\tconst segments = this.cycleSegments(cycle);\n\t\t\tconst area = contourSignedArea(segments);\n\t\t\tlet perimeter = 0;\n\t\t\tfor (const s of segments) perimeter += s.length === 2 ? dist(s[0], s[1]) : segmentLength(s, 0, 1, 1e-6);\n\t\t\tif (!(perimeter > 0)) continue;\n\t\t\tconst entry: Cycle = { halves: cycle, segments, area, bounds: boundsOf(segments) };\n\t\t\tif (area > 0 && (2 * area) / perimeter >= sliver) faces.push(entry);\n\t\t\telse if (area < 0 && (-2 * area) / perimeter >= sliver) holes.push(entry);\n\t\t}\n\t\t// Each outer boundary is a hole in the smallest face of another piece around it.\n\t\tconst faceHoles: number[][] = faces.map(() => []);\n\t\tholes.forEach((hole, k) => {\n\t\t\tconst v = this.origin(hole.halves[0]);\n\t\t\tconst p = this.vertices[v];\n\t\t\tconst own = this.component[v];\n\t\t\tlet best = -1;\n\t\t\tfaces.forEach((face, i) => {\n\t\t\t\tif (this.component[this.origin(face.halves[0])] === own || !inBounds(face.bounds, p)) return;\n\t\t\t\tif (best >= 0 && faces[best].area <= face.area) return;\n\t\t\t\tif (windingNumber([face.segments], p) !== 0) best = i;\n\t\t\t});\n\t\t\tif (best >= 0) faceHoles[best].push(k);\n\t\t});\n\t\tconst faceOf = new Int32Array(halves).fill(-1);\n\t\tfaces.forEach((face, i) => {\n\t\t\tfor (const h of face.halves) faceOf[h] = i;\n\t\t\tfor (const k of faceHoles[i]) for (const h of holes[k].halves) faceOf[h] = i;\n\t\t});\n\t\tthis.cyclesCache = { faces, holes, faceHoles, faceOf };\n\t\tthis.sourcesCache = faces.map(() => null);\n\t\treturn this.cyclesCache;\n\t}\n\n\tprivate faceChains(i: number): BezierSegment[][] {\n\t\tconst { faces, holes, faceHoles } = this.cycles();\n\t\treturn [faces[i].segments, ...faceHoles[i].map((k) => holes[k].segments)];\n\t}\n\n\t/** The bounded faces of the map. */\n\tget faces(): PlanarFace[] {\n\t\tconst { faces, holes, faceHoles } = this.cycles();\n\t\treturn faces.map((f, i) => {\n\t\t\tconst chains = this.faceChains(i);\n\t\t\tconst area = f.area + faceHoles[i].reduce((sum, k) => sum + holes[k].area, 0);\n\t\t\treturn { path: contoursToPath(chains.map((segments) => ({ segments, closed: true }))), area, bounds: f.bounds };\n\t\t});\n\t}\n\n\t/** The inputs whose fill covers face `i`, ascending (empty for an area only outlines enclose). */\n\tfaceSources(i: number): number[] {\n\t\tthis.cycles();\n\t\tconst cached = this.sourcesCache[i];\n\t\tif (cached) return cached;\n\t\tconst p = interiorPoint(this.faceChains(i));\n\t\tconst out: number[] = [];\n\t\tif (p) {\n\t\t\tthis.fills.forEach((fill, k) => {\n\t\t\t\tif (!fill.chains.length || !inBounds(fill.bounds, p)) return;\n\t\t\t\tconst w = windingNumber(fill.chains, p);\n\t\t\t\tif (fill.fillRule === 'evenodd' ? (w & 1) === 1 : w !== 0) out.push(k);\n\t\t\t});\n\t\t}\n\t\tthis.sourcesCache[i] = out;\n\t\treturn out;\n\t}\n\n\t/** A point well inside face `i`. */\n\tfaceInterior(i: number): Point | null {\n\t\treturn interiorPoint(this.faceChains(i));\n\t}\n\n\t/** The face under `p` (the smallest one around it), or -1. */\n\tfaceAt(p: Point): number {\n\t\tconst { faces } = this.cycles();\n\t\tlet best = -1;\n\t\tfaces.forEach((face, i) => {\n\t\t\tif (!inBounds(face.bounds, p) || (best >= 0 && faces[best].area <= face.area)) return;\n\t\t\tif (windingNumber(this.faceChains(i), p) !== 0) best = i;\n\t\t});\n\t\treturn best;\n\t}\n\n\t/**\n\t * The union of faces, traced along the map's own edges: those between two merged faces drop\n\t * out exactly, so no seam or sliver is left where a boolean union of their outlines could\n\t * round shared corners apart. Outer subpaths come out counter-clockwise (y-up), holes clockwise.\n\t */\n\tmerge(faceIndices: readonly number[]): BezierPath {\n\t\tconst { faceOf } = this.cycles();\n\t\tconst picked = new Set(faceIndices);\n\t\tconst merged = (h: number) => faceOf[h] >= 0 && picked.has(faceOf[h]);\n\t\tconst boundary = (h: number) => merged(h) && !merged(twin(h));\n\t\tconst used = new Uint8Array(this.edges.length * 2);\n\t\tconst contours: BezierContour[] = [];\n\t\tfor (let start = 0; start < used.length; start++) {\n\t\t\tif (used[start] || !boundary(start)) continue;\n\t\t\tconst cycle: number[] = [];\n\t\t\tlet h = start;\n\t\t\tlet ok = true;\n\t\t\twhile (!used[h]) {\n\t\t\t\tused[h] = 1;\n\t\t\t\tcycle.push(h);\n\t\t\t\t// Turn from the way back as a face walk does, past edges inside the merged faces.\n\t\t\t\tconst back = twin(h);\n\t\t\t\tconst list = this.around[this.origin(back)];\n\t\t\t\tconst k = this.slot[back];\n\t\t\t\tconst n = list.length;\n\t\t\t\tlet found = -1;\n\t\t\t\tfor (let j = 1; j <= n; j++) {\n\t\t\t\t\tconst g = list[(k - j + n * 2) % n];\n\t\t\t\t\tif (boundary(g)) {\n\t\t\t\t\t\tfound = g;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (found < 0) {\n\t\t\t\t\tok = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\th = found;\n\t\t\t}\n\t\t\tif (!ok || h !== start) continue;\n\t\t\tcontours.push({ segments: this.cycleSegments(cycle), closed: true });\n\t\t}\n\t\treturn contoursToPath(contours);\n\t}\n\n\t/**\n\t * The edges joined into runs between junctions: vertices where other than two edges meet, or\n\t * where the two edges lie on different inputs. Each run is keyed by its input.\n\t */\n\tchains(): PlanarChain[] {\n\t\tconst passes = (v: number): [number, number] | null => {\n\t\t\tconst list = this.around[v];\n\t\t\tif (list.length !== 2) return null;\n\t\t\treturn this.edges[list[0] >> 1].source === this.edges[list[1] >> 1].source ? [list[0], list[1]] : null;\n\t\t};\n\t\tconst used = new Uint8Array(this.edges.length);\n\t\tconst out: PlanarChain[] = [];\n\t\tconst walk = (h0: number) => {\n\t\t\tconst source = this.edges[h0 >> 1].source;\n\t\t\tconst halves: number[] = [];\n\t\t\tlet h = h0;\n\t\t\tlet closed = false;\n\t\t\tfor (;;) {\n\t\t\t\tif (used[h >> 1]) {\n\t\t\t\t\tclosed = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tused[h >> 1] = 1;\n\t\t\t\thalves.push(h);\n\t\t\t\tconst v = this.origin(twin(h));\n\t\t\t\tconst pass = passes(v);\n\t\t\t\tif (!pass) {\n\t\t\t\t\tclosed = v === this.origin(h0);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\th = pass[0] === twin(h) ? pass[1] : pass[0];\n\t\t\t}\n\t\t\tif (source < 0) return;\n\t\t\tconst segments = this.cycleSegments(halves, closed);\n\t\t\tout.push({ segments, closed, source });\n\t\t};\n\t\tthis.around.forEach((list, v) => {\n\t\t\tif (passes(v)) return;\n\t\t\tfor (const h of list) if (!used[h >> 1]) walk(h);\n\t\t});\n\t\tfor (let e = 0; e < this.edges.length; e++) if (!used[e]) walk(e * 2);\n\t\treturn out;\n\t}\n\n\t// -- fill regions (cadcraft `boundary_at_gap`) -------------------------------\n\n\t/**\n\t * The region enclosing `p`, traced as cadcraft does it: a ray from `p` towards +x meets the\n\t * edges in order; for each, the half-edge with `p` on its left is followed by always taking the\n\t * sharpest left turn, until a loop that runs counter-clockwise round `p` comes back. The pieces\n\t * of the map nested inside that loop (islands) become its holes. Null when nothing encloses `p`.\n\t */\n\tregionAt(p: Point): BezierPath | null {\n\t\tconst { faces, faceOf } = this.cycles();\n\t\tconst hits: { x: number; e: number }[] = [];\n\t\tthis.edges.forEach((e, i) => {\n\t\t\tconst ay = this.vertices[e.a][1];\n\t\t\tconst by = this.vertices[e.b][1];\n\t\t\tif (ay > p[1] === by > p[1]) return;\n\t\t\t// Edges are monotone pieces, so the ray crosses each at most once.\n\t\t\tconst t = solveMonotone(e.pts, 1, p[1]);\n\t\t\tconst x = segmentPoint(e.pts, t)[0];\n\t\t\tif (x > p[0]) hits.push({ x, e: i });\n\t\t});\n\t\thits.sort((a, b) => a.x - b.x);\n\t\tfor (const { e } of hits.slice(0, 64)) {\n\t\t\tconst ay = this.vertices[this.edges[e].a][1];\n\t\t\tconst by = this.vertices[this.edges[e].b][1];\n\t\t\t// `p` lies west of the edge, which is the left side (y-up frame) of the half-edge running towards +y.\n\t\t\tconst h = by > ay ? e * 2 : e * 2 + 1;\n\t\t\tconst walk: number[] = [];\n\t\t\tconst seen = new Set<number>();\n\t\t\tlet g = h;\n\t\t\twhile (!seen.has(g)) {\n\t\t\t\tseen.add(g);\n\t\t\t\twalk.push(g);\n\t\t\t\tg = this.next(g);\n\t\t\t}\n\t\t\tif (g !== h) continue;\n\t\t\tconst cycle = withoutSpurs(walk);\n\t\t\tif (!cycle.length) continue;\n\t\t\tconst segments = this.cycleSegments(cycle);\n\t\t\tif (!(contourSignedArea(segments) > 0) || windingNumber([segments], p) === 0) continue;\n\t\t\t// The loop is one of the map's faces: take its holes.\n\t\t\tconst face = faceOf[cycle[0]];\n\t\t\tif (face >= 0 && faces[face].halves.includes(cycle[0])) {\n\t\t\t\treturn contoursToPath(this.faceChains(face).map((s) => ({ segments: s, closed: true })));\n\t\t\t}\n\t\t\treturn contoursToPath([{ segments, closed: true }]);\n\t\t}\n\t\treturn null;\n\t}\n}\n\n/** Joins loose ends (degree-one vertices) to the nearest other loose end within `gap`. */\nfunction closeGaps(vertices: Point[], edges: Edge[], gap: number) {\n\tconst degree = new Array(vertices.length).fill(0);\n\tconst linked = new Set<string>();\n\tfor (const e of edges) {\n\t\tdegree[e.a]++;\n\t\tdegree[e.b]++;\n\t\tlinked.add(`${Math.min(e.a, e.b)},${Math.max(e.a, e.b)}`);\n\t}\n\tconst ends = degree.flatMap((d, v) => (d === 1 ? [v] : [])).sort((a, b) => vertices[a][0] - vertices[b][0]);\n\tconst joined = new Set<number>();\n\tlet lo = 0;\n\tfor (let i = 0; i < ends.length; i++) {\n\t\tconst u = ends[i];\n\t\tif (joined.has(u)) continue;\n\t\tconst pu = vertices[u];\n\t\twhile (lo < ends.length && vertices[ends[lo]][0] < pu[0] - gap) lo++;\n\t\tlet best = -1;\n\t\tlet bestD = Infinity;\n\t\tfor (let j = lo; j < ends.length; j++) {\n\t\t\tconst v = ends[j];\n\t\t\tconst pv = vertices[v];\n\t\t\tif (pv[0] > pu[0] + gap) break;\n\t\t\tif (v === u || joined.has(v) || linked.has(`${Math.min(u, v)},${Math.max(u, v)}`)) continue;\n\t\t\tconst d = dist(pu, pv);\n\t\t\tif (d <= gap && d < bestD) {\n\t\t\t\tbest = v;\n\t\t\t\tbestD = d;\n\t\t\t}\n\t\t}\n\t\tif (best < 0) continue;\n\t\tconst a = Math.min(u, best);\n\t\tconst b = Math.max(u, best);\n\t\tedges.push({ a, b, pts: [vertices[a], vertices[b]], operands: [], src: -1, sa: 0, sb: 1, source: -1 });\n\t\tjoined.add(u);\n\t\tjoined.add(best);\n\t}\n}\n\n// -- cutting edges out of outlines (vectorcraft `cut_out`) ---------------------\n\n/** Whether a contour, closed, encloses an area (rather than retracing itself). */\nexport function contourEnclosesArea(contour: BezierContour): boolean {\n\tconst segs = closeContour(contour, true);\n\tif (!segs.length) return false;\n\tconst b = boundsOf(segs);\n\tconst w = b.maxX - b.minX;\n\tconst h = b.maxY - b.minY;\n\treturn Math.abs(contourSignedArea(segs)) > 1e-9 * (w * w + h * h);\n}\n\n/** The point of a chain nearest `p`, as a parameter `segment + t`, with its distance. */\nfunction nearestU(segs: readonly BezierSegment[], p: Point): { u: number; d: number } | null {\n\tlet best: { u: number; d: number } | null = null;\n\tsegs.forEach((seg, k) => {\n\t\tconst n = segmentNearest(seg, p);\n\t\tif (!best || n.distance < best.d) best = { u: k + n.t, d: n.distance };\n\t});\n\treturn best;\n}\n\n/** The run of a chain from parameter `u0` to `u1` (`u0 < u1`, unrolled past the end of a ring). */\nfunction span(segs: readonly BezierSegment[], u0: number, u1: number): BezierSegment[] {\n\tconst n = segs.length;\n\tif (!n || !Number.isFinite(u0) || !Number.isFinite(u1)) return [];\n\tconst first = Math.max(0, Math.floor(u0));\n\tconst last = Math.min(Math.max(0, Math.ceil(u1)), first + 2 * n);\n\tconst out: BezierSegment[] = [];\n\tfor (let k = first; k < last; k++) {\n\t\tconst t0 = Math.min(1, Math.max(0, u0 - k));\n\t\tconst t1 = Math.min(1, Math.max(0, u1 - k));\n\t\tif (t1 - t0 > 1e-12) out.push(subSegment(segs[k % n], t0, t1));\n\t}\n\treturn out;\n}\n\n/**\n * A run with its end points within `tol` of one of `to` put exactly on it (where the planar map\n * put the junction a piece ends at), the neighbouring handles moving with them.\n */\nfunction snapEnds(segs: BezierSegment[], to: readonly Point[], tol: number): BezierSegment[] {\n\tif (!segs.length) return segs;\n\tconst out = segs.map((s) => [...s]);\n\tconst move = (seg: Point[], end: number, handle: number) => {\n\t\tconst q = to.find((t) => dist(t, seg[end]) <= tol);\n\t\tif (!q) return;\n\t\tconst d: Point = [q[0] - seg[end][0], q[1] - seg[end][1]];\n\t\tseg[end] = q;\n\t\tif (seg.length === 4) seg[handle] = [seg[handle][0] + d[0], seg[handle][1] + d[1]];\n\t};\n\tmove(out[0], 0, 1);\n\tconst last = out[out.length - 1];\n\tmove(last, last.length - 1, last.length - 2);\n\treturn out;\n}\n\n/**\n * `path` without `piece`, a run along one of its subpaths between two points (a Shape Builder\n * edge from `PlanarMap.chains`): a closed subpath opens there, an open one splits in two (or\n * loses an end), and a piece that runs all the way round (`closed`, or ending where it starts)\n * takes its subpath with it. With `fillCloses`, open subpaths that enclose an area run on round\n * an invisible closing edge, as the Shape Builder sees a filled path: a piece may run over it,\n * and it never comes back as a visible segment. Null when the piece does not lie on `path`\n * within `tol`.\n *\n * Ported from vectorcraft-main/crates/pathops/src/planar.rs (`cut_out`, `nearest_u`, `span`,\n * `snap_ends`). MIT OR Apache-2.0, © ArtCraft Team and contributors. See THIRD_PARTY_NOTICES.md.\n */\nexport function cutOutPiece(path: BezierPathInput, piece: { segments: readonly BezierSegment[]; closed?: boolean }, fillCloses: boolean, tol: number): BezierPath | null {\n\tconst segs = piece.segments;\n\tif (!segs.length) return null;\n\t// A point well inside the piece: the middle of its longest segment.\n\tlet mid: Point | null = null;\n\tlet longest = -1;\n\tlet perimeter = 0;\n\tfor (const seg of segs) {\n\t\tconst len = segmentLength(seg);\n\t\tperimeter += len;\n\t\tif (len > longest) {\n\t\t\tlongest = len;\n\t\t\tmid = segmentPoint(seg, 0.5);\n\t\t}\n\t}\n\t// A speck (where paths touch): there is nothing to cut.\n\tif (!mid || perimeter <= tol) return null;\n\tconst a = segs[0][0];\n\tconst lastSeg = segs[segs.length - 1];\n\tconst b = lastSeg[lastSeg.length - 1];\n\tconst whole = !!piece.closed || dist(a, b) <= tol;\n\tconst contours = pathToContours(path);\n\t// Each subpath as the piece may run along it: round its closing edge when it has one.\n\tlet found: { index: number; ring: BezierSegment[]; closed: boolean; um: number; d: number } | null = null;\n\tcontours.forEach((c, index) => {\n\t\tif (!c.segments.length) return;\n\t\tconst closed = c.closed || (fillCloses && contourEnclosesArea(c));\n\t\tconst ring = closeContour(c, closed);\n\t\tconst n = nearestU(ring, mid!);\n\t\tif (n && n.d <= tol && (!found || n.d < found.d)) found = { index, ring, closed, um: n.u, d: n.d };\n\t});\n\tif (!found) return null;\n\tconst { index, ring, closed, um } = found as { index: number; ring: BezierSegment[]; closed: boolean; um: number };\n\tconst len = ring.length;\n\tconst real = closeContour(contours[index]).length;\n\tconst at = (p: Point) => {\n\t\tconst n = nearestU(ring, p);\n\t\treturn n && n.d <= tol ? n.u : null;\n\t};\n\t// The parameter spans of the ring that stay (unrolled past the end of a ring).\n\tlet keep: [number, number][] = [];\n\tif (!whole) {\n\t\tconst ua = at(a);\n\t\tconst ub = at(b);\n\t\tif (ua === null || ub === null) return null;\n\t\tif (closed) {\n\t\t\tconst fwd = (from: number, to: number) => (((to - from) % len) + len) % len;\n\t\t\t// The piece runs from one end through `mid` to the other; what stays runs on round.\n\t\t\tconst [start, end] = fwd(ua, um) <= fwd(ua, ub) ? [ub, ua] : [ua, ub];\n\t\t\tconst rest = fwd(start, end);\n\t\t\tif (rest > 1e-9 && len - rest > 1e-9) {\n\t\t\t\t// Where the ring closes with an invisible edge (`real..len`), what stays stops at it.\n\t\t\t\tconst parts: [number, number][] = real >= len ? [[0, 2 * len]] : [[0, real], [len, len + real]];\n\t\t\t\tkeep = parts.map(([lo, hi]): [number, number] => [Math.max(start, lo), Math.min(start + rest, hi)]).filter(([x, y]) => y - x > 1e-9);\n\t\t\t}\n\t\t} else {\n\t\t\tconst lo = Math.min(ua, ub);\n\t\t\tconst hi = Math.max(ua, ub);\n\t\t\tif (um < lo - 1e-9 || um > hi + 1e-9) return null;\n\t\t\tkeep = ([[0, lo], [hi, len]] as [number, number][]).filter(([x, y]) => y - x > 1e-9);\n\t\t}\n\t}\n\tconst out: BezierContour[] = contours.slice(0, index);\n\tfor (const [u0, u1] of keep) {\n\t\tconst run = span(ring, u0, u1);\n\t\tif (run.length) out.push({ segments: snapEnds(run, [a, b], tol), closed: false });\n\t}\n\tout.push(...contours.slice(index + 1));\n\treturn contoursToPath(out);\n}\n","/**\n * Diagonal hatching: the Shape Builder's mesh highlight over a face.\n *\n * Ported from vectorcraft-main/crates/tools/src/builder.rs (`hatch`). MIT OR Apache-2.0,\n * © ArtCraft Team and contributors. See THIRD_PARTY_NOTICES.md.\n */\nimport type { Point } from '../types.js';\nimport { bezierPathBounds, closeContour, flattenChain, pathToContours, type BezierPath, type BezierPathInput } from './bezier.js';\n\nexport interface HatchOptions {\n\t/** Distance between the lines, in the path's units (default 4). */\n\tgap?: number;\n\t/** Most lines drawn: past it the gap widens (default 400). */\n\tmaxLines?: number;\n}\n\n/**\n * 45° hatch lines filling `path` (non-zero and even-odd agree for simple faces; crossings are\n * paired in order, as even-odd does), `gap` apart. Each line is its own `M`/`L` pair, clipped to\n * the path. Empty for a path with no area.\n */\nexport function hatchPath(path: BezierPathInput, options: HatchOptions = {}): BezierPath {\n\tconst out: BezierPath = [];\n\tconst b = bezierPathBounds(path);\n\tif (!b || b.maxX - b.minX <= 0 || b.maxY - b.minY <= 0) return out;\n\tconst want = Math.max(options.gap ?? 4, 1e-3);\n\t// Rotated by -45° the hatch lines are horizontal scanlines.\n\tconst s = Math.SQRT1_2;\n\tconst rot = (p: Point): Point => [(p[0] + p[1]) * s, (p[1] - p[0]) * s];\n\tconst unrot = (x: number, y: number) => ({ x: (x - y) * s, y: (x + y) * s });\n\tconst edges: [Point, Point][] = [];\n\tfor (const contour of pathToContours(path)) {\n\t\tconst pts = flattenChain(closeContour(contour, true), want * 0.1).map(rot);\n\t\tfor (let i = 0; i < pts.length; i++) {\n\t\t\tconst p = pts[i];\n\t\t\tconst q = pts[(i + 1) % pts.length];\n\t\t\tif (p[0] !== q[0] || p[1] !== q[1]) edges.push([p, q]);\n\t\t}\n\t}\n\tlet y0 = Infinity;\n\tlet y1 = -Infinity;\n\tfor (const [p, q] of edges) {\n\t\ty0 = Math.min(y0, p[1], q[1]);\n\t\ty1 = Math.max(y1, p[1], q[1]);\n\t}\n\tif (!(y1 > y0)) return out;\n\tconst gap = Math.max(want, (y1 - y0) / Math.max(1, options.maxLines ?? 400), 1e-6);\n\tconst xs: number[] = [];\n\tfor (let y = Math.floor(y0 / gap) * gap + gap / 2; y < y1; y += gap) {\n\t\txs.length = 0;\n\t\tfor (const [p, q] of edges) if (p[1] <= y !== q[1] <= y) xs.push(p[0] + ((y - p[1]) / (q[1] - p[1])) * (q[0] - p[0]));\n\t\txs.sort((m, n) => m - n);\n\t\tfor (let i = 0; i + 1 < xs.length; i += 2) {\n\t\t\tout.push({ type: 'M', ...unrot(xs[i], y) }, { type: 'L', ...unrot(xs[i + 1], y) });\n\t\t}\n\t}\n\treturn out;\n}\n","/**\n * The Pathfinder panel's dividing operations over a stack of shapes (index 0 at the back):\n * Divide, Trim, Merge, Crop, Outline and Minus Back. (Unite, Minus Front, Intersect and Exclude\n * are `pathBoolean`.) Every result carries the index of the shape whose paint it keeps.\n *\n * The filled areas come from one arrangement of all shapes (`dividePaths`, `pathBooleanSelect`):\n * each area knows the shapes covering it, so an operation is a choice of areas per result.\n * Outline and Divide with cutting lines use the planar map (`PlanarMap`).\n *\n * Ported from vectorcraft-main/crates/pathops/src/pathfinder.rs (`pathfinder`, `PathfinderOp`,\n * `outline_edges`), MIT OR Apache-2.0, © ArtCraft Team and contributors. See\n * THIRD_PARTY_NOTICES.md.\n */\nimport type { PolygonFillRule } from '../polygonBoolean.js';\nimport { pathToContours, contoursToPath, type BezierPath, type BezierPathInput } from './bezier.js';\nimport { dividePaths, pathBooleanSelect, type PathOpsOptions, type PathOpsReport } from './boolean.js';\nimport { PlanarMap } from './planar.js';\n\nexport type PathfinderOperation = 'divide' | 'trim' | 'merge' | 'crop' | 'outline' | 'minusBack';\n\nexport const PATHFINDER_OPERATIONS: readonly PathfinderOperation[] = ['divide', 'trim', 'merge', 'crop', 'outline', 'minusBack'];\n\n/** A shape of the stack. */\nexport interface PathfinderShape {\n\t/** Its outline; open subpaths are closed for filling (unless `line`). */\n\tpath: BezierPathInput;\n\tfillRule?: PolygonFillRule;\n\t/** Identifies its paint: Merge joins touching areas whose shapes share a key (default: the index). */\n\tkey?: string | number;\n\t/**\n\t * An unfilled open path: a cutting edge for Divide, splitting the faces it crosses without\n\t * becoming one (ignored by the other operations).\n\t */\n\tline?: boolean;\n}\n\n/** One result: a filled area (or an open stroke for Outline). */\nexport interface PathfinderPiece {\n\tpath: BezierPath;\n\t/** Index of the shape whose paint it keeps. */\n\tsource: number;\n\t/** Outline edges are open paths (a loop with no junction on it stays closed). */\n\topen?: boolean;\n}\n\nexport interface PathfinderResult extends PathOpsReport {\n\tpieces: PathfinderPiece[];\n}\n\nconst top = (covering: readonly number[]) => covering[covering.length - 1];\n\n/**\n * Runs a Pathfinder operation:\n * - `divide`: every face of the arrangement becomes its own piece, painted like the top-most\n * shape covering it. `line` shapes cut the faces they cross.\n * - `trim`: hidden parts are removed; one piece per shape that stays visible, nothing merged.\n * - `merge`: like Trim, then touching or overlapping visible parts of shapes with the same key\n * become one piece (one per connected area).\n * - `crop`: the top shape crops the others; it is removed, the visible parts of the shapes below\n * inside it stay.\n * - `outline`: every outline is cut where it meets another; the pieces are open paths painted\n * like the shape they bound (the top-most where outlines coincide).\n * - `minusBack`: the top shape minus everything behind it.\n */\nexport function pathfinder(op: PathfinderOperation, shapes: readonly PathfinderShape[], options: PathOpsOptions = {}): PathfinderResult {\n\tconst n = shapes.length;\n\tif (n === 0) return { pieces: [], engine: 'curve' };\n\tconst filled = shapes.filter((s) => !s.line);\n\tconst operands = shapes.map((s) => ({ path: s.path, fillRule: s.fillRule ?? 'nonzero' }));\n\n\tif (op === 'outline') {\n\t\tconst map = PlanarMap.build(\n\t\t\tshapes.map((s) => ({ path: s.line ? s.path : closeAll(s.path), fills: false })),\n\t\t\toptions\n\t\t);\n\t\tif (!map) return { pieces: [], engine: 'curve', error: 'could not map the outlines' };\n\t\tconst pieces = map.chains().map((c) => ({ path: contoursToPath([{ segments: c.segments, closed: c.closed }]), source: c.source, open: !c.closed }));\n\t\treturn { pieces, engine: 'curve' };\n\t}\n\n\tif (op === 'divide') {\n\t\tif (filled.length !== n) {\n\t\t\tconst map = PlanarMap.build(shapes.map((s) => ({ path: s.line ? s.path : closeAll(s.path), fillRule: s.fillRule, fills: !s.line })), options);\n\t\t\tif (!map) return { pieces: [], engine: 'curve', error: 'could not map the shapes' };\n\t\t\tconst pieces: PathfinderPiece[] = [];\n\t\t\tmap.faces.forEach((face, i) => {\n\t\t\t\tconst covering = map.faceSources(i);\n\t\t\t\tif (covering.length) pieces.push({ path: face.path, source: top(covering) });\n\t\t\t});\n\t\t\treturn { pieces, engine: 'curve' };\n\t\t}\n\t\tconst result = dividePaths(operands, options);\n\t\treturn { ...report(result), pieces: result.pieces.map((p) => ({ path: p.path, source: top(p.operands) })) };\n\t}\n\n\t// The filled-area operations ignore cutting lines.\n\tconst index = shapes.flatMap((s, i) => (s.line ? [] : [i]));\n\tconst m = index.length;\n\tif (m === 0) return { pieces: [], engine: 'curve' };\n\tconst ops = index.map((i) => operands[i]);\n\tconst key = (k: number) => shapes[index[k]].key ?? index[k];\n\tconst select = (selectors: ((covering: readonly number[]) => boolean)[]) => pathBooleanSelect(ops, selectors, options);\n\tconst joined = (parts: BezierPath[]) => parts.flat();\n\n\tswitch (op) {\n\t\tcase 'trim': {\n\t\t\tconst result = select(index.map((_, k) => (c) => c.length > 0 && top(c) === k));\n\t\t\tconst pieces = result.parts.flatMap((parts, k) => (parts.length ? [{ path: joined(parts), source: index[k] }] : []));\n\t\t\treturn { ...report(result), pieces };\n\t\t}\n\t\tcase 'merge': {\n\t\t\tconst keys: (string | number)[] = [];\n\t\t\tfor (let k = 0; k < m; k++) if (!keys.includes(key(k))) keys.push(key(k));\n\t\t\tconst result = select(keys.map((kk) => (c) => c.length > 0 && key(top(c)) === kk));\n\t\t\tconst pieces: PathfinderPiece[] = [];\n\t\t\tresult.parts.forEach((parts, j) => {\n\t\t\t\t// Painted like the front-most shape with that key.\n\t\t\t\tlet source = 0;\n\t\t\t\tfor (let k = 0; k < m; k++) if (key(k) === keys[j]) source = index[k];\n\t\t\t\tfor (const part of parts) pieces.push({ path: part, source });\n\t\t\t});\n\t\t\treturn { ...report(result), pieces };\n\t\t}\n\t\tcase 'crop': {\n\t\t\tif (m < 2) return { pieces: [], engine: 'curve' };\n\t\t\tconst front = m - 1;\n\t\t\tconst result = select(\n\t\t\t\tindex.slice(0, front).map((_, k) => (c) => c.length >= 2 && top(c) === front && c[c.length - 2] === k)\n\t\t\t);\n\t\t\tconst pieces = result.parts.flatMap((parts, k) => (parts.length ? [{ path: joined(parts), source: index[k] }] : []));\n\t\t\treturn { ...report(result), pieces };\n\t\t}\n\t\tcase 'minusBack': {\n\t\t\tconst front = m - 1;\n\t\t\tconst result = select([(c) => c.length === 1 && c[0] === front]);\n\t\t\tconst parts = result.parts[0];\n\t\t\treturn { ...report(result), pieces: parts.length ? [{ path: joined(parts), source: index[front] }] : [] };\n\t\t}\n\t}\n\treturn { pieces: [], engine: 'curve' };\n}\n\nfunction report(r: PathOpsReport): PathOpsReport {\n\treturn { engine: r.engine, ...(r.fallbackReason ? { fallbackReason: r.fallbackReason } : {}), ...(r.error ? { error: r.error } : {}) };\n}\n\n/** The path with every subpath closed (as it fills). */\nfunction closeAll(path: BezierPathInput): BezierPath {\n\treturn contoursToPath(pathToContours(path).map((c) => ({ segments: c.segments, closed: true })));\n}\n"]}
|
|
@@ -218,6 +218,71 @@ var BRUSH_SETTINGS_PARAM = {
|
|
|
218
218
|
pressureOpacity: { type: "boolean", description: "Pressure scales the opacity (default false)." }
|
|
219
219
|
}
|
|
220
220
|
};
|
|
221
|
+
var HEX_PARAM = "^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$";
|
|
222
|
+
var BRUSH_PAINT_PARAM = {
|
|
223
|
+
description: 'Paint the brushed stroke with gradient paint (or one colour) instead of `color`, sampled dab by dab along the path; `color` still gives the alpha and fills "paint" stops. Only with `brush`. Example (blue to yellow over 200 canvas units, and back): { "type": "gradient", "stops": [{ "offset": 0, "color": "#1d4ed8" }, { "offset": 1, "color": "#facc15" }], "map": { "by": "distance", "length": 200, "repeat": "mirror" } }.',
|
|
224
|
+
oneOf: [
|
|
225
|
+
{
|
|
226
|
+
type: "object",
|
|
227
|
+
additionalProperties: false,
|
|
228
|
+
required: ["type", "color"],
|
|
229
|
+
description: "One colour.",
|
|
230
|
+
properties: {
|
|
231
|
+
type: { type: "string", enum: ["color"], description: 'Always "color".' },
|
|
232
|
+
color: { type: "string", pattern: HEX_PARAM, description: "The colour as #rrggbb (or #rgb)." }
|
|
233
|
+
}
|
|
234
|
+
},
|
|
235
|
+
{
|
|
236
|
+
type: "object",
|
|
237
|
+
additionalProperties: false,
|
|
238
|
+
required: ["type", "stops"],
|
|
239
|
+
description: "Gradient paint: the brush samples it dab by dab as the stroke goes.",
|
|
240
|
+
properties: {
|
|
241
|
+
type: { type: "string", enum: ["gradient"], description: 'Always "gradient".' },
|
|
242
|
+
stops: {
|
|
243
|
+
type: "array",
|
|
244
|
+
minItems: 2,
|
|
245
|
+
maxItems: 16,
|
|
246
|
+
description: "2..16 stops sorted by offset.",
|
|
247
|
+
items: {
|
|
248
|
+
type: "object",
|
|
249
|
+
additionalProperties: false,
|
|
250
|
+
required: ["offset", "color"],
|
|
251
|
+
properties: {
|
|
252
|
+
offset: { type: "number", minimum: 0, maximum: 1, description: "Position 0..1 along the gradient." },
|
|
253
|
+
color: {
|
|
254
|
+
type: "string",
|
|
255
|
+
description: 'The stop colour as #rrggbb, or "paint" (the stroke colour) or "secondary" (white).',
|
|
256
|
+
anyOf: [{ pattern: HEX_PARAM }, { enum: ["paint", "secondary"] }]
|
|
257
|
+
},
|
|
258
|
+
opacity: { type: "number", minimum: 0, maximum: 1, description: "Multiplies the brush flow where this colour is laid, 0..1 (default 1)." },
|
|
259
|
+
midpoint: { type: "number", minimum: 0.05, maximum: 0.95, description: "Where between this stop and the next the colours are half mixed, 0.05..0.95 (default 0.5)." }
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
},
|
|
263
|
+
space: { type: "string", enum: ["pigment", "oklab", "srgb"], description: "How neighbouring stops mix: pigment (default; like paint, blue to yellow passes green), oklab (perceptual) or srgb (plain numbers)." },
|
|
264
|
+
map: {
|
|
265
|
+
type: "object",
|
|
266
|
+
additionalProperties: false,
|
|
267
|
+
required: ["by"],
|
|
268
|
+
description: "What moves the stroke along the gradient (default distance, 300 canvas units, mirror).",
|
|
269
|
+
properties: {
|
|
270
|
+
by: {
|
|
271
|
+
type: "string",
|
|
272
|
+
enum: ["distance", "pressure", "tilt", "direction", "across-tip", "random"],
|
|
273
|
+
description: "distance: canvas units (or dabs) travelled along the path; pressure: the pressure profile 0..1; tilt: pen lean from the tilt profiles, upright 0 .. flat 1; direction: direction of travel, once round per 360\xB0; across-tip: left to right across the tip (a brush loaded with several colours); random: a seeded random point per dab. Canvas strokes carry no timing, so velocity and time are not available."
|
|
274
|
+
},
|
|
275
|
+
length: { type: "number", minimum: 1, maximum: 1e5, description: 'distance: canvas units (or dabs, with unit "dabs") per run through the gradient (default 300).' },
|
|
276
|
+
repeat: { type: "string", enum: ["clamp", "repeat", "mirror"], description: "distance: past the end, clamp (hold the last colour), repeat (start again) or mirror (run back; default)." },
|
|
277
|
+
unit: { type: "string", enum: ["px", "dabs"], description: 'distance: canvas units ("px", default) or dabs.' },
|
|
278
|
+
every: { type: "integer", minimum: 1, maximum: 500, description: "random: dabs per random pick (default 1)." }
|
|
279
|
+
}
|
|
280
|
+
},
|
|
281
|
+
softness: { type: "number", minimum: 0, maximum: 1, description: "How softly neighbouring stops blend: 1 smooth (default) .. 0 hard steps." }
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
]
|
|
285
|
+
};
|
|
221
286
|
function createDrawCommands(target, options = {}) {
|
|
222
287
|
const prefix = options.prefix ?? "canvas.";
|
|
223
288
|
const group = options.group ?? "Draw";
|
|
@@ -229,7 +294,7 @@ function createDrawCommands(target, options = {}) {
|
|
|
229
294
|
id: `${prefix}drawFreehand`,
|
|
230
295
|
label: "Draw Freehand Stroke",
|
|
231
296
|
keywords: ["pen", "highlighter", "brush", "sketch", "draw", "stroke", "pencil", "ink"],
|
|
232
|
-
description: "Draws a freehand pen or highlighter stroke through points (canvas coordinates) as one path shape node, in one undo step. With `brush` it is painted with a dry paint brush (a preset id from canvas.listBrushes, or tip settings) and `pressure` / `tiltX` / `tiltY` profiles shape it along its length;
|
|
297
|
+
description: "Draws a freehand pen or highlighter stroke through points (canvas coordinates) as one path shape node, in one undo step. With `brush` it is painted with a dry paint brush (a preset id from canvas.listBrushes, or tip settings) and `pressure` / `tiltX` / `tiltY` profiles shape it along its length; `paint` gives it gradient paint that changes colour along the stroke. Wet brushes are refused. Returns the new node `id`, its `bounds` and the stored `brush`.",
|
|
233
298
|
params: {
|
|
234
299
|
type: "object",
|
|
235
300
|
additionalProperties: false,
|
|
@@ -250,6 +315,7 @@ function createDrawCommands(target, options = {}) {
|
|
|
250
315
|
description: 'Paint the stroke with a dry paint brush: a preset id such as "ink-pen", "pencil-hb", "brush-pen", "charcoal-stick", "soft-pastel", "marker" or "airbrush" (all ids: canvas.listBrushes), or tip settings. Omit for a plain vector stroke.',
|
|
251
316
|
oneOf: [{ type: "string", minLength: 1 }, BRUSH_SETTINGS_PARAM]
|
|
252
317
|
},
|
|
318
|
+
paint: BRUSH_PAINT_PARAM,
|
|
253
319
|
pressure: PROFILE_PARAM("Pen pressure 0..1", 0, 1),
|
|
254
320
|
tiltX: PROFILE_PARAM("Pen tilt along x in degrees (\u221290..90)", -90, 90),
|
|
255
321
|
tiltY: PROFILE_PARAM("Pen tilt along y in degrees (\u221290..90)", -90, 90),
|
|
@@ -264,7 +330,8 @@ function createDrawCommands(target, options = {}) {
|
|
|
264
330
|
...params.color !== void 0 ? { color: params.color } : {},
|
|
265
331
|
...params.width !== void 0 ? { width: params.width } : {},
|
|
266
332
|
...params.opacity !== void 0 ? { opacity: params.opacity } : {},
|
|
267
|
-
...params.brush !== void 0 ? { brush: params.brush } : {}
|
|
333
|
+
...params.brush !== void 0 ? { brush: params.brush } : {},
|
|
334
|
+
...params.paint !== void 0 ? { paint: params.paint } : {}
|
|
268
335
|
},
|
|
269
336
|
...params.pressure ? { pressure: params.pressure } : {},
|
|
270
337
|
...params.tiltX ? { tiltX: params.tiltX } : {},
|
|
@@ -609,4 +676,4 @@ export {
|
|
|
609
676
|
createComponentCommands,
|
|
610
677
|
createSpreadsheetCommands
|
|
611
678
|
};
|
|
612
|
-
//# sourceMappingURL=chunk-
|
|
679
|
+
//# sourceMappingURL=chunk-LSXXAJG3.js.map
|