@weasel-js/geom 1.10.1 → 1.11.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.
Files changed (55) hide show
  1. package/README.md +9 -1
  2. package/dist/3d/index.d.ts +29 -2
  3. package/dist/3d/index.js +49 -1
  4. package/dist/3d/index.js.map +1 -1
  5. package/dist/booleans/index.d.ts +15 -10
  6. package/dist/booleans/index.js +306 -353
  7. package/dist/booleans/index.js.map +1 -1
  8. package/dist/{chunk-7WFFCHRL.js → chunk-6XSJY3TC.js} +6 -37
  9. package/dist/chunk-6XSJY3TC.js.map +1 -0
  10. package/dist/chunk-7KLJZFBY.js +573 -0
  11. package/dist/chunk-7KLJZFBY.js.map +1 -0
  12. package/dist/chunk-B53BERKG.js +386 -0
  13. package/dist/chunk-B53BERKG.js.map +1 -0
  14. package/dist/chunk-CE7IY7TB.js +104 -0
  15. package/dist/chunk-CE7IY7TB.js.map +1 -0
  16. package/dist/chunk-HGF5OVEN.js +129 -0
  17. package/dist/chunk-HGF5OVEN.js.map +1 -0
  18. package/dist/chunk-J2O2B54M.js +800 -0
  19. package/dist/chunk-J2O2B54M.js.map +1 -0
  20. package/dist/chunk-Q66NA2FU.js +174 -0
  21. package/dist/chunk-Q66NA2FU.js.map +1 -0
  22. package/dist/chunk-SASMXDBE.js +443 -0
  23. package/dist/chunk-SASMXDBE.js.map +1 -0
  24. package/dist/chunk-UI3FUWXM.js +533 -0
  25. package/dist/chunk-UI3FUWXM.js.map +1 -0
  26. package/dist/curvature-PkoLduGc.d.ts +454 -0
  27. package/dist/curves/index.d.ts +14 -5
  28. package/dist/curves/index.js +33 -111
  29. package/dist/curves/index.js.map +1 -1
  30. package/dist/index.d.ts +1468 -284
  31. package/dist/index.js +5450 -2672
  32. package/dist/index.js.map +1 -1
  33. package/dist/nd/index.d.ts +91 -27
  34. package/dist/nd/index.js +282 -0
  35. package/dist/nd/index.js.map +1 -1
  36. package/dist/path-BW8d_2RY.d.ts +157 -0
  37. package/dist/portCurve-C5HDWuuV.d.ts +30 -0
  38. package/dist/tessellate/index.d.ts +15 -4
  39. package/dist/tessellate/index.js +21 -277
  40. package/dist/tessellate/index.js.map +1 -1
  41. package/dist/warp/index.d.ts +252 -0
  42. package/dist/warp/index.js +1316 -0
  43. package/dist/warp/index.js.map +1 -0
  44. package/package.json +5 -1
  45. package/dist/chunk-7WFFCHRL.js.map +0 -1
  46. package/dist/chunk-IDXY2NCA.js +0 -177
  47. package/dist/chunk-IDXY2NCA.js.map +0 -1
  48. package/dist/chunk-NJ3IGAKR.js +0 -16
  49. package/dist/chunk-NJ3IGAKR.js.map +0 -1
  50. package/dist/chunk-OXH3NOXC.js +0 -62
  51. package/dist/chunk-OXH3NOXC.js.map +0 -1
  52. package/dist/chunk-URQMDR6Q.js +0 -80
  53. package/dist/chunk-URQMDR6Q.js.map +0 -1
  54. package/dist/cubicMath-BW-HJrCE.d.ts +0 -16
  55. package/dist/path-ljHxobyu.d.ts +0 -44
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/booleans/adapter.ts","../../src/booleans/ops.ts","../../src/booleans/trianglesToPath.ts","../../src/booleans/contourSegments.ts","../../src/booleans/cutCrossings.ts","../../src/booleans/contours.ts","../../src/booleans/cutPolyline.ts","../../src/booleans/cutLoops.ts","../../src/booleans/cutRegions.ts","../../src/booleans/splitBySegment.ts","../../src/booleans/snipAtCrossings.ts"],"names":["polygonClipping","a","b","c","l","r","k"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Adapter between `Path` and `polygon-clipping`'s `MultiPolygon` format.\n *\n * `polygon-clipping` expects:\n * MultiPolygon = Polygon[]\n * Polygon = Ring[] (first ring outer, subsequent rings holes)\n * Ring = [x, y][] (closed — first vertex repeated as last)\n *\n * Bezier inputs are flattened. A boolean works on what a fill covers: an open\n * contour is closed where a fill closes it (`fillsOpenSubpaths`) and left out\n * where one does not.\n *\n * The `[x,y][]` nested-array form here is the one place geom's flat-everywhere\n * rule is suspended — it is the third-party clipper's required API.\n */\nimport { PATH_M, PATH_L, PATH_C, PATH_Q, PATH_Z } from '../commands';\nimport { elevateQuadraticToCubic } from '../curve';\nimport { DEFAULT_FLATTEN_TOLERANCE, flattenCubic } from '../flatten';\nimport { fillsOpenSubpaths } from '../openFill';\nimport type { Path, PolygonPath } from '../path';\n\n/** A `[x, y]` 2-tuple. */\nexport type Pair = [number, number];\n/** Closed ring (first vertex repeated as last). */\nexport type Ring = Pair[];\n/** Polygon: one outer ring optionally followed by hole rings. */\nexport type Polygon = Ring[];\n/** MultiPolygon: list of polygons (used for boolean op I/O). */\nexport type MultiPolygon = Polygon[];\n\n/** Options for `pathToMultiPolygon`. */\nexport interface PathToMultiPolygonOptions {\n /** Flattening tolerance for bezier segments. Default: `DEFAULT_FLATTEN_TOLERANCE`. */\n tolerance?: number;\n}\n\n/** Convert a `Path` to a `MultiPolygon` suitable for `polygon-clipping`. */\nexport function pathToMultiPolygon(\n path: Path,\n opts: PathToMultiPolygonOptions = {},\n): MultiPolygon {\n if (path.kind === 'rect') {\n const { x, y, width, height } = path;\n const ring: Ring = [\n [x, y],\n [x + width, y],\n [x + width, y + height],\n [x, y + height],\n [x, y],\n ];\n return [[ring]];\n }\n\n const tolerance = opts.tolerance ?? DEFAULT_FLATTEN_TOLERANCE;\n const rings: Ring[] = [];\n let current: Ring | null = null;\n let cx = 0, cy = 0;\n // Where `Z` returns the pen, and so where a command after it starts.\n let startX = 0, startY = 0;\n let ci = 0;\n const { commands, coords } = path;\n\n const fillsOpen = fillsOpenSubpaths(path);\n const finalizeCurrent = (closed = fillsOpen) => {\n if (!closed) current = null;\n if (!current || current.length === 0) return;\n // Close the ring by repeating the first vertex if not already closed.\n const first = current[0];\n const last = current[current.length - 1];\n if (first[0] !== last[0] || first[1] !== last[1]) {\n current.push([first[0], first[1]]);\n }\n if (current.length >= 4) rings.push(current); // 3 unique + 1 closing\n current = null;\n };\n\n for (let i = 0; i < commands.length; i++) {\n const cmd = commands[i];\n switch (cmd) {\n case PATH_M: {\n finalizeCurrent();\n cx = coords[ci]; cy = coords[ci + 1];\n startX = cx; startY = cy;\n current = [[cx, cy]];\n ci += 2;\n break;\n }\n case PATH_L: {\n current ??= [[cx, cy]];\n cx = coords[ci]; cy = coords[ci + 1];\n current.push([cx, cy]);\n ci += 2;\n break;\n }\n case PATH_C: {\n const x1 = coords[ci], y1 = coords[ci + 1];\n const x2 = coords[ci + 2], y2 = coords[ci + 3];\n const x3 = coords[ci + 4], y3 = coords[ci + 5];\n const out: number[] = [];\n flattenCubic(cx, cy, x1, y1, x2, y2, x3, y3, tolerance, out);\n current ??= [[cx, cy]];\n for (let k = 0; k < out.length; k += 2) current.push([out[k], out[k + 1]]);\n cx = x3; cy = y3;\n ci += 6;\n break;\n }\n case PATH_Q: {\n const x1 = coords[ci], y1 = coords[ci + 1];\n const x2 = coords[ci + 2], y2 = coords[ci + 3];\n const [c1x, c1y, c2x, c2y] = elevateQuadraticToCubic(cx, cy, x1, y1, x2, y2);\n const out: number[] = [];\n flattenCubic(cx, cy, c1x, c1y, c2x, c2y, x2, y2, tolerance, out);\n current ??= [[cx, cy]];\n for (let k = 0; k < out.length; k += 2) current.push([out[k], out[k + 1]]);\n cx = x2; cy = y2;\n ci += 4;\n break;\n }\n case PATH_Z: {\n finalizeCurrent(true);\n cx = startX; cy = startY;\n break;\n }\n default:\n throw new Error(`pathToMultiPolygon: unknown command ${cmd}`);\n }\n }\n finalizeCurrent();\n\n if (rings.length === 0) return [];\n return groupRings(rings, path.fillRule);\n}\n\n/** Shoelace area of a closed ring. Sign gives the winding direction. */\nfunction ringSignedArea(ring: Ring): number {\n let a = 0;\n for (let i = 0, n = ring.length - 1; i < n; i++) {\n a += ring[i][0] * ring[i + 1][1] - ring[i + 1][0] * ring[i][1];\n }\n return a * 0.5;\n}\n\ntype RingBox = [number, number, number, number];\n\nfunction ringBox(ring: Ring): RingBox {\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (const [x, y] of ring) {\n if (x < minX) minX = x;\n if (x > maxX) maxX = x;\n if (y < minY) minY = y;\n if (y > maxY) maxY = y;\n }\n return [minX, minY, maxX, maxY];\n}\n\n/** Even-odd ray cast; used only to decide ring nesting, never to fill. */\nfunction pointInRing(ring: Ring, px: number, py: number): boolean {\n let inside = false;\n for (let i = 0, n = ring.length - 1; i < n; i++) {\n const [ax, ay] = ring[i];\n const [bx, by] = ring[i + 1];\n if ((ay > py) !== (by > py) && px < ((bx - ax) * (py - ay)) / (by - ay) + ax) {\n inside = !inside;\n }\n }\n return inside;\n}\n\n/**\n * Nesting test by majority vote over three sample vertices — a single sample\n * gives the wrong answer whenever it lands exactly on the outer ring.\n */\nfunction ringContains(outer: Ring, outerBox: RingBox, inner: Ring, innerBox: RingBox): boolean {\n if (innerBox[0] < outerBox[0] || innerBox[1] < outerBox[1]\n || innerBox[2] > outerBox[2] || innerBox[3] > outerBox[3]) return false;\n const n = inner.length - 1;\n let votes = 0;\n for (const k of [0, Math.floor(n / 3), Math.floor((2 * n) / 3)]) {\n if (pointInRing(outer, inner[k][0], inner[k][1])) votes++;\n }\n return votes >= 2;\n}\n\n/**\n * Resolve rings into `polygon-clipping` polygons (outer ring first, hole\n * rings after) by nesting depth and `fillRule`.\n *\n * Without this a path's own holes are lost: separate polygons in a\n * MultiPolygon are unioned, so a donut arrives at the clipper as a solid disc.\n *\n * Rings that bound no boundary of the filled region — a same-winding ring\n * nested inside a nonzero fill — are dropped; they contribute nothing.\n */\nfunction groupRings(rings: Ring[], fillRule: 'nonzero' | 'evenodd'): MultiPolygon {\n const n = rings.length;\n if (n === 1) return [[rings[0]]];\n\n const boxes = rings.map(ringBox);\n const orient = rings.map((r) => (ringSignedArea(r) >= 0 ? 1 : -1));\n const parent = new Array<number>(n).fill(-1);\n const children: number[][] = rings.map(() => []);\n\n for (let i = 0; i < n; i++) {\n let best = -1;\n let bestArea = Infinity;\n for (let j = 0; j < n; j++) {\n if (i === j) continue;\n if (!ringContains(rings[j], boxes[j], rings[i], boxes[i])) continue;\n const area = (boxes[j][2] - boxes[j][0]) * (boxes[j][3] - boxes[j][1]);\n if (area < bestArea) { bestArea = area; best = j; }\n }\n parent[i] = best;\n }\n for (let i = 0; i < n; i++) if (parent[i] >= 0) children[parent[i]].push(i);\n\n const filled = new Array<boolean>(n);\n for (let i = 0; i < n; i++) {\n let depth = 0;\n let winding = 0;\n for (let a: number = i; a >= 0; a = parent[a]) {\n winding += orient[a];\n if (a !== i) depth++;\n }\n filled[i] = fillRule === 'evenodd' ? depth % 2 === 0 : winding !== 0;\n }\n\n const out: MultiPolygon = [];\n for (let i = 0; i < n; i++) {\n if (!filled[i]) continue;\n if (parent[i] >= 0 && filled[parent[i]]) continue;\n const polygon: Polygon = [rings[i]];\n const queue = [...children[i]];\n while (queue.length > 0) {\n const c = queue.pop() as number;\n // An unfilled child bounds a hole; a filled one merges into this\n // region, so its own children are what may punch holes in it.\n if (filled[c]) queue.push(...children[c]);\n else polygon.push(rings[c]);\n }\n out.push(polygon);\n }\n return out;\n}\n\n/** Convert a `MultiPolygon` to a polygon path with `fillRule: 'nonzero'`. */\nexport function multiPolygonToPath(mp: MultiPolygon): PolygonPath {\n // First pass: count total commands and coord floats.\n let nCmds = 0;\n let nCoords = 0;\n for (const poly of mp) {\n for (const ring of poly) {\n if (ring.length < 4) continue; // 3 unique + 1 closing minimum\n // Drop the repeated closing vertex; emit M + (n-2) L + Z.\n const unique = ring.length - 1;\n nCmds += 1 + (unique - 1) + 1; // M + L*(unique-1) + Z\n nCoords += unique * 2;\n }\n }\n const commands = new Uint8Array(nCmds);\n const coords = new Float32Array(nCoords);\n let ci = 0;\n let pi = 0;\n for (const poly of mp) {\n for (const ring of poly) {\n if (ring.length < 4) continue;\n const unique = ring.length - 1;\n commands[ci++] = PATH_M;\n coords[pi++] = ring[0][0];\n coords[pi++] = ring[0][1];\n for (let k = 1; k < unique; k++) {\n commands[ci++] = PATH_L;\n coords[pi++] = ring[k][0];\n coords[pi++] = ring[k][1];\n }\n commands[ci++] = PATH_Z;\n }\n }\n return { kind: 'polygon', commands, coords, fillRule: 'nonzero' };\n}\n","/**\n * Polygon-boolean operations on `Path` values, backed by `polygon-clipping`.\n *\n * - Bezier inputs are flattened to straight-line segments before clipping,\n * so the result contains only M/L/Z commands.\n * - Open contours are treated as closed (a polyline has zero area and would\n * otherwise be silently dropped).\n * - Output `fillRule` is always `'nonzero'`.\n *\n * This is the only geom module that depends on `polygon-clipping`; it lives in\n * the `@weasel-js/geom/booleans` subpath so the core stays `deps: {}`.\n */\nimport polygonClipping from 'polygon-clipping';\nimport { pathToMultiPolygon, multiPolygonToPath } from './adapter';\nimport type { Path, PolygonPath } from '../path';\n\n/** Union of N paths. Commutative. Returns an empty path if all inputs are empty. */\nexport function pathUnion(...paths: Path[]): PolygonPath {\n if (paths.length === 0) return multiPolygonToPath([]);\n const mps = paths.map((p) => pathToMultiPolygon(p));\n const [head, ...rest] = mps;\n return multiPolygonToPath(polygonClipping.union(head, ...rest));\n}\n\n/** Intersection of N paths. Commutative. Empty result is an empty path. */\nexport function pathIntersect(...paths: Path[]): PolygonPath {\n if (paths.length === 0) return multiPolygonToPath([]);\n const mps = paths.map((p) => pathToMultiPolygon(p));\n const [head, ...rest] = mps;\n return multiPolygonToPath(polygonClipping.intersection(head, ...rest));\n}\n\n/** Asymmetric difference: returns `a − b`. */\nexport function pathSubtract(a: Path, b: Path): PolygonPath {\n return multiPolygonToPath(polygonClipping.difference(pathToMultiPolygon(a), pathToMultiPolygon(b)));\n}\n\n/** Symmetric difference (XOR) of N paths. Commutative. */\nexport function pathExclude(...paths: Path[]): PolygonPath {\n if (paths.length === 0) return multiPolygonToPath([]);\n const mps = paths.map((p) => pathToMultiPolygon(p));\n const [head, ...rest] = mps;\n return multiPolygonToPath(polygonClipping.xor(head, ...rest));\n}\n\n/** One path of a result that keeps its pieces apart, and the inputs it came\n * from: their indices in the call, ascending, so the last is the topmost of\n * inputs given back to front. */\nexport interface BooleanPiece {\n path: PolygonPath;\n sources: number[];\n}\n\n/** {@link pathDividePieces} as bare paths. */\nexport function pathDivide(...paths: Path[]): PolygonPath[] {\n return pathDividePieces(...paths).map((p) => p.path);\n}\n\n/** {@link pathCropPieces} as bare paths. */\nexport function pathCrop(...paths: Path[]): PolygonPath[] {\n return pathCropPieces(...paths).map((p) => p.path);\n}\n\n/**\n * Fracture N paths along every intersection into the maximal set of\n * non-overlapping regions. Returns one piece per region, naming every input\n * that covers it. For N=2 these are the three Illustrator \"Divide\" outputs\n * (A−B, B−A, A∩B).\n *\n * One region per non-empty subset of the inputs, so the 2^N − 1 subset count\n * limits this to small N; passing more than ~8 inputs is a misuse.\n */\nexport function pathDividePieces(...paths: Path[]): BooleanPiece[] {\n if (paths.length === 0) return [];\n if (paths.length === 1) {\n return [{ path: multiPolygonToPath(pathToMultiPolygon(paths[0])), sources: [0] }];\n }\n const mps = paths.map((p) => pathToMultiPolygon(p));\n const n = mps.length;\n const out: BooleanPiece[] = [];\n\n // Size-ascending, so the output is stable: exclusives first, then pairs,\n // then triples, …\n const subsets: number[] = [];\n for (let mask = 1; mask < 1 << n; mask++) subsets.push(mask);\n subsets.sort((a, b) => popcount(a) - popcount(b) || a - b);\n\n for (const mask of subsets) {\n const inside: typeof mps = [];\n const outside: typeof mps = [];\n const sources: number[] = [];\n for (let i = 0; i < n; i++) {\n if (mask & (1 << i)) sources.push(i);\n (mask & (1 << i) ? inside : outside).push(mps[i]);\n }\n const [insideHead, ...insideRest] = inside;\n let region = insideRest.length === 0\n ? insideHead\n : polygonClipping.intersection(insideHead, ...insideRest);\n if (region.length === 0) continue;\n if (outside.length > 0) {\n const [outHead, ...outRest] = outside;\n const outsideUnion = polygonClipping.union(outHead, ...outRest);\n region = polygonClipping.difference(region, outsideUnion);\n if (region.length === 0) continue;\n }\n out.push({ path: multiPolygonToPath(region), sources });\n }\n\n return out;\n}\n\n/**\n * Remove from each path what the paths after it cover (Illustrator \"Trim\"):\n * given back to front, every piece is the part of its input left showing.\n * One piece per input in input order, less the inputs wholly hidden.\n */\nexport function pathTrim(...paths: Path[]): BooleanPiece[] {\n const mps = paths.map((p) => pathToMultiPolygon(p));\n const out: BooleanPiece[] = [];\n // Front to back, so the cover over each input is built once.\n let cover: (typeof mps)[number] | null = null;\n for (let i = mps.length - 1; i >= 0; i--) {\n const shown = cover ? polygonClipping.difference(mps[i], cover) : mps[i];\n if (shown.length > 0) out.unshift({ path: multiPolygonToPath(shown), sources: [i] });\n cover = cover ? polygonClipping.union(cover, mps[i]) : mps[i];\n }\n return out;\n}\n\n/**\n * {@link pathTrim}, then unite the pieces of the inputs `keyOf` gives the same\n * key (Illustrator \"Merge\", keyed by paint). Keys compare with `===`. A piece\n * names every input left showing in it, and the pieces are ordered by their\n * topmost one. Pieces that share a key and do not touch come back as one path\n * of several contours.\n */\nexport function pathMerge(paths: readonly Path[], keyOf: (index: number) => unknown): BooleanPiece[] {\n const groups = new Map<unknown, BooleanPiece[]>();\n for (const piece of pathTrim(...paths)) {\n const key = keyOf(piece.sources[0]!);\n const group = groups.get(key);\n if (group) group.push(piece);\n else groups.set(key, [piece]);\n }\n const top = (p: BooleanPiece): number => p.sources[p.sources.length - 1]!;\n return [...groups.values()]\n .map((g): BooleanPiece => (g.length === 1 ? g[0]! : {\n path: pathUnion(...g.map((p) => p.path)),\n sources: g.map((p) => p.sources[0]!),\n }))\n .sort((a, b) => top(a) - top(b));\n}\n\nfunction popcount(n: number): number {\n let c = 0;\n while (n) { n &= n - 1; c++; }\n return c;\n}\n\n/**\n * Clip each non-topmost path to the topmost path (Illustrator \"Crop\"), which\n * acts purely as the mask and is discarded. Returns up to `N - 1` pieces in\n * input order, each naming the one input it was clipped from; a source\n * entirely outside the mask is dropped.\n */\nexport function pathCropPieces(...paths: Path[]): BooleanPiece[] {\n if (paths.length < 2) return [];\n const mps = paths.map((p) => pathToMultiPolygon(p));\n const mask = mps[mps.length - 1];\n const out: BooleanPiece[] = [];\n for (let i = 0; i < mps.length - 1; i++) {\n const clipped = polygonClipping.intersection(mps[i], mask);\n if (clipped.length > 0) out.push({ path: multiPolygonToPath(clipped), sources: [i] });\n }\n return out;\n}\n","/**\n * The outline of a triangle mesh: the union of its triangles as one path.\n * This is what turns a tessellated shape back into geometry, e.g. a stroke's\n * ribbon into the region the stroke covers.\n */\nimport polygonClipping from 'polygon-clipping';\nimport { multiPolygonToPath, type MultiPolygon } from './adapter';\nimport type { PolygonPath } from '../path';\n\n/**\n * Union the triangles of an indexed mesh (`vertices` as x, y pairs; `indices`\n * three per triangle) into canonical, non-overlapping rings. Overlaps count\n * once, and triangles with no area are skipped. The result holds only M/L/Z.\n */\nexport function trianglesToPath(vertices: ArrayLike<number>, indices: ArrayLike<number>): PolygonPath {\n const triangles: MultiPolygon[] = [];\n for (let i = 0; i + 2 < indices.length; i += 3) {\n const a = indices[i] * 2, b = indices[i + 1] * 2, c = indices[i + 2] * 2;\n const ax = vertices[a], ay = vertices[a + 1];\n const bx = vertices[b], by = vertices[b + 1];\n const cx = vertices[c], cy = vertices[c + 1];\n if ((bx - ax) * (cy - ay) - (cx - ax) * (by - ay) === 0) continue;\n triangles.push([[[[ax, ay], [bx, by], [cx, cy], [ax, ay]]]]);\n }\n if (triangles.length === 0) return multiPolygonToPath([]);\n const [head, ...rest] = triangles;\n return multiPolygonToPath(polygonClipping.union(head, ...rest));\n}\n","/** A contour as Bézier segments: evaluating and splitting one, and where one crosses a line. */\n\nimport { splitCubicAt, splitQuadraticAt } from '../curve';\nimport type { Point } from '../paths/cubicMath';\n\n/** A Bézier segment by its control points: 2 = line, 3 = quadratic, 4 = cubic. */\nexport type Seg = Point[];\nexport type Contour = Seg[];\n\n/** A point on a contour: segment index and parameter. */\nexport interface Station {\n seg: number;\n t: number;\n pt: Point;\n}\n\nexport function evalSeg(s: Seg, t: number): Point {\n const u = 1 - t;\n if (s.length === 2) return { x: u * s[0].x + t * s[1].x, y: u * s[0].y + t * s[1].y };\n if (s.length === 3) {\n const a = u * u, b = 2 * u * t, c = t * t;\n return { x: a * s[0].x + b * s[1].x + c * s[2].x, y: a * s[0].y + b * s[1].y + c * s[2].y };\n }\n const a = u * u * u, b = 3 * u * u * t, c = 3 * u * t * t, d = t * t * t;\n return {\n x: a * s[0].x + b * s[1].x + c * s[2].x + d * s[3].x,\n y: a * s[0].y + b * s[1].y + c * s[2].y + d * s[3].y,\n };\n}\n\nexport function derivSeg(s: Seg, t: number): Point {\n const n = s.length - 1;\n const d: Seg = [];\n for (let i = 0; i < n; i++) d.push({ x: n * (s[i + 1].x - s[i].x), y: n * (s[i + 1].y - s[i].y) });\n return d.length === 1 ? d[0] : evalSeg(d, t);\n}\n\nfunction splitSeg(s: Seg, t: number): [Seg, Seg] {\n const pts = (c: ArrayLike<number>): Seg => {\n const out: Seg = [];\n for (let i = 0; i < c.length; i += 2) out.push({ x: c[i], y: c[i + 1] });\n return out;\n };\n if (s.length === 2) {\n const m = evalSeg(s, t);\n return [[s[0], m], [m, s[1]]];\n }\n if (s.length === 3) {\n const [l, r] = splitQuadraticAt(s[0].x, s[0].y, s[1].x, s[1].y, s[2].x, s[2].y, t);\n return [pts(l), pts(r)];\n }\n const [l, r] = splitCubicAt(s[0].x, s[0].y, s[1].x, s[1].y, s[2].x, s[2].y, s[3].x, s[3].y, t);\n return [pts(l), pts(r)];\n}\n\n/** The part of `s` between t0 and t1, with its ends snapped to the given points. */\nexport function subSeg(s: Seg, t0: number, t1: number, p0: Point, p1: Point): Seg | null {\n if (t1 - t0 <= 0) return null;\n let out = s;\n if (t0 > 0) out = splitSeg(out, t0)[1];\n const u = (t1 - t0) / (1 - t0);\n if (u < 1) out = splitSeg(out, u)[0];\n out = out.slice();\n out[0] = p0;\n out[out.length - 1] = p1;\n return out;\n}\n\nexport const reverseContour = (c: Contour): Contour => c.map((s) => s.slice().reverse()).reverse();\n\n/** Points along a contour for area and containment estimates. */\nexport function sampleContour(c: Contour): number[] {\n const out: number[] = [];\n for (const s of c) {\n const n = s.length === 2 ? 1 : 16;\n for (let i = 0; i < n; i++) {\n const p = evalSeg(s, i / n);\n out.push(p.x, p.y);\n }\n }\n return out;\n}\n\n/** Signed area; positive when the fill lies to the left of the direction of travel. */\nexport function signedArea(c: Contour): number {\n const pts = sampleContour(c);\n let a = 0;\n for (let i = 0; i < pts.length; i += 2) {\n const j = (i + 2) % pts.length;\n a += pts[i] * pts[j + 1] - pts[j] * pts[i + 1];\n }\n return a / 2;\n}\n\n/** Bernstein coefficients of the signed distance cross(d, P − o) along `s`. */\nexport function sideCoeffs(s: Seg, o: Point, d: Point): number[] {\n return s.map((p) => d.x * (p.y - o.y) - d.y * (p.x - o.x));\n}\n\nfunction bernstein(f: number[], t: number): number {\n const u = 1 - t;\n if (f.length === 2) return u * f[0] + t * f[1];\n if (f.length === 3) return u * u * f[0] + 2 * u * t * f[1] + t * t * f[2];\n return u * u * u * f[0] + 3 * u * u * t * f[1] + 3 * u * t * t * f[2] + t * t * t * f[3];\n}\n\ninterface SignChange { t: number; before: number; after: number }\n\n/**\n * Where the polynomial changes sign on [0, 1]. The interval is cut at the\n * derivative's roots so each piece is monotonic, then each sign change is\n * bisected. Tangencies have no sign change and are skipped. With\n * `zeroIsPositive` a zero counts as positive, so a change landing exactly on\n * an end is still seen once; otherwise zeros at the ends are left to the\n * caller.\n */\nexport function signChanges(f: number[], zeroIsPositive: boolean): SignChange[] {\n const sgn = (v: number) => (v > 0 ? 1 : v < 0 ? -1 : zeroIsPositive ? 1 : 0);\n const cuts = [0, ...criticalPoints(f), 1];\n const out: SignChange[] = [];\n for (let i = 0; i + 1 < cuts.length; i++) {\n let lo = cuts[i], hi = cuts[i + 1];\n const slo = sgn(bernstein(f, lo)), shi = sgn(bernstein(f, hi));\n if (slo === 0 && i > 0) {\n const before = sgn(bernstein(f, lo - 1e-7)), after = sgn(bernstein(f, lo + 1e-7));\n if (before * after < 0) out.push({ t: lo, before, after });\n }\n if (slo * shi >= 0) continue;\n for (let it = 0; it < 64; it++) {\n const mid = (lo + hi) / 2;\n if (sgn(bernstein(f, mid)) === slo) lo = mid; else hi = mid;\n }\n out.push({ t: (lo + hi) / 2, before: slo, after: shi });\n }\n return out;\n}\n\n/** Roots in (0, 1) of the derivative of a Bernstein polynomial of degree ≤ 3. */\nfunction criticalPoints(f: number[]): number[] {\n if (f.length < 3) return [];\n const n = f.length - 1;\n const d = f.slice(1).map((v, i) => n * (v - f[i]));\n // Power basis of the derivative: A t² + B t + C.\n let A = 0, B: number, C: number;\n if (d.length === 2) { B = d[1] - d[0]; C = d[0]; }\n else { A = d[0] - 2 * d[1] + d[2]; B = 2 * (d[1] - d[0]); C = d[0]; }\n const out: number[] = [];\n const scale = Math.max(Math.abs(A), Math.abs(B), Math.abs(C)) || 1;\n if (Math.abs(A) / scale < 1e-12) {\n if (Math.abs(B) / scale > 1e-12) out.push(-C / B);\n } else {\n const disc = B * B - 4 * A * C;\n if (disc >= 0) {\n const q = -0.5 * (B + Math.sign(B || 1) * Math.sqrt(disc));\n out.push(q / A);\n if (q !== 0) out.push(C / q);\n }\n }\n return out.filter((t) => t > 0 && t < 1).sort((x, y) => x - y);\n}\n\n/** Sign of f just after t = 0 (`fromStart`) or just before t = 1, read off the control values. */\nexport function endSide(f: number[], fromStart: boolean): number {\n const n = f.length;\n for (let i = 1; i < n; i++) {\n const v = fromStart ? f[i] : f[n - 1 - i];\n if (v !== 0) return Math.sign(v);\n }\n return 0;\n}\n","/** Where a cut crosses the contours of a path. */\n\nimport type { Point } from '../paths/cubicMath';\nimport { type Contour, type Station, evalSeg, sideCoeffs, signChanges, endSide } from './contourSegments';\n\nexport interface Crossing extends Station {\n contour: number;\n /** Position along the cut: cut segment k runs from k to k + 1. */\n s: number;\n /** True where the cut, going forward, enters the filled region. */\n enters: boolean;\n}\n\n/**\n * Where along cut segment `k` of `cut` a point on its line falls, as a\n * position on the whole cut, or null when it is off that segment. A point at a\n * joint belongs to the segment that starts there, so it is counted once.\n */\nexport function cutPosition(cut: Point[], k: number, pt: Point): number | null {\n const a = cut[k], b = cut[k + 1];\n const d = { x: b.x - a.x, y: b.y - a.y };\n const s = ((pt.x - a.x) * d.x + (pt.y - a.y) * d.y) / (d.x * d.x + d.y * d.y);\n const eps = 1e-9;\n const last = k + 2 === cut.length;\n if (s < (k === 0 ? 0 : -eps)) return null;\n if (last ? s > 1 : s >= 1 - eps) return null;\n return k + Math.min(1, Math.max(0, s));\n}\n\n/** Every point where the boundary crosses the cut, sorted along it. */\nexport function findCrossings(boundaries: Contour[], cut: Point[]): Crossing[] {\n const out: Crossing[] = [];\n for (let k = 0; k + 1 < cut.length; k++) crossingsOnSegment(boundaries, cut, k, out);\n return out.sort((x, y) => x.s - y.s);\n}\n\nfunction crossingsOnSegment(boundaries: Contour[], cut: Point[], k: number, out: Crossing[]): void {\n const a = cut[k];\n const d = { x: cut[k + 1].x - a.x, y: cut[k + 1].y - a.y };\n const push = (contour: number, seg: number, t: number, before: number, after: number) => {\n const pt = evalSeg(boundaries[contour][seg], t);\n const s = cutPosition(cut, k, pt);\n if (s === null) return;\n // Fill is on the boundary's left: crossing from the cut's left to its right is an entry.\n out.push({ contour, seg, t, pt, s, enters: before > 0 && after < 0 });\n };\n\n boundaries.forEach((contour, ci) => {\n const fs = contour.map((s) => sideCoeffs(s, a, d));\n const n = contour.length;\n fs.forEach((f, si) => {\n for (const c of signChanges(f, false)) push(ci, si, c.t, c.before, c.after);\n if (f[0] !== 0) return;\n // The segment passes through this vertex. Where the boundary runs along\n // the cut, the crossing is taken at the end of the run.\n const after = endSide(f, true);\n if (after === 0) return;\n let before = 0;\n for (let k = 1; k <= n && before === 0; k++) before = endSide(fs[(si - k + n) % n], false);\n if (before !== 0 && before !== after) push(ci, si, 0, before, after);\n });\n });\n}\n","/** Reading a path into contours, and what a set of contours encloses. */\n\nimport { segmentsCross } from '../polyline';\nimport type { Path, PathFillRule } from '../path';\nimport { PATH_C, PATH_L, PATH_M, PATH_Q, PATH_Z } from '../commands';\nimport type { Point } from '../paths/cubicMath';\nimport { EPS } from '../scalar';\nimport { fillsOpenSubpaths } from '../openFill';\nimport { type Contour, evalSeg, derivSeg, reverseContour, sideCoeffs, signChanges } from './contourSegments';\n\n/** The contours a fill of `path` covers: an open subpath closes implicitly\n * where a fill closes it, and is left out where one does not. */\nexport function parseContours(path: Path): Contour[] {\n const fillsOpen = path.kind === 'rect' || fillsOpenSubpaths(path);\n return parseSubpaths(path).filter((s) => s.closed || fillsOpen).map((s) => s.segs);\n}\n\nexport interface Subpath {\n segs: Contour;\n /** Closed by a `Z` (or a rect); the closing edge, if any, is in `segs`. */\n closed: boolean;\n}\n\n/**\n * Subpaths of `path` with their segments. With `implicitClose` (the default,\n * as a fill sees them) every subpath ends in its closing edge; without it,\n * only a subpath closed by `Z` does, as a stroke sees them.\n */\nexport function parseSubpaths(path: Path, implicitClose = true): Subpath[] {\n if (path.kind === 'rect') {\n const { x, y, width: w, height: h } = path;\n const p = [{ x, y }, { x: x + w, y }, { x: x + w, y: y + h }, { x, y: y + h }];\n return [{ segs: p.map((q, i) => [q, p[(i + 1) % 4]]), closed: true }];\n }\n const out: Subpath[] = [];\n let cur: Contour = [];\n let start: Point = { x: 0, y: 0 };\n let pen: Point = start;\n const finish = (closed: boolean) => {\n if (cur.length > 0 && (closed || implicitClose) && (pen.x !== start.x || pen.y !== start.y)) {\n cur.push([pen, start]);\n }\n if (cur.length > 0) out.push({ segs: cur, closed });\n cur = [];\n pen = start;\n };\n const c = path.coords;\n let k = 0;\n for (const cmd of path.commands) {\n if (cmd === PATH_M) {\n finish(false);\n start = pen = { x: c[k], y: c[k + 1] };\n k += 2;\n } else if (cmd === PATH_L) {\n const e = { x: c[k], y: c[k + 1] };\n if (e.x !== pen.x || e.y !== pen.y) cur.push([pen, e]);\n pen = e;\n k += 2;\n } else if (cmd === PATH_Q) {\n const e = { x: c[k + 2], y: c[k + 3] };\n cur.push([pen, { x: c[k], y: c[k + 1] }, e]);\n pen = e;\n k += 4;\n } else if (cmd === PATH_C) {\n const e = { x: c[k + 4], y: c[k + 5] };\n cur.push([pen, { x: c[k], y: c[k + 1] }, { x: c[k + 2], y: c[k + 3] }, e]);\n pen = e;\n k += 6;\n } else if (cmd === PATH_Z) {\n finish(true);\n }\n }\n finish(false);\n return out;\n}\n\n/** Whether any contour crosses another or itself, judged on a flattening. */\nexport function contoursIntersect(contours: Contour[], tol: number): boolean {\n type Edge = { x0: number; y0: number; x1: number; y1: number; c: number; i: number; n: number };\n const edges: Edge[] = [];\n contours.forEach((contour, ci) => {\n const pts: Point[] = [];\n for (const s of contour) {\n let n = 1;\n if (s.length > 2) {\n let len = 0;\n for (let i = 0; i + 1 < s.length; i++) len += Math.hypot(s[i + 1].x - s[i].x, s[i + 1].y - s[i].y);\n n = Math.min(64, Math.max(2, Math.ceil(Math.sqrt(len / Math.max(tol, 1e-3)))));\n }\n for (let i = 0; i < n; i++) pts.push(evalSeg(s, i / n));\n }\n for (let i = 0; i < pts.length; i++) {\n const p = pts[i], q = pts[(i + 1) % pts.length];\n edges.push({ x0: p.x, y0: p.y, x1: q.x, y1: q.y, c: ci, i, n: pts.length });\n }\n });\n for (let i = 0; i < edges.length; i++) {\n const e = edges[i];\n for (let j = i + 1; j < edges.length; j++) {\n const f = edges[j];\n if (e.c === f.c && (j - i === 1 || (i === 0 && f.i === f.n - 1))) continue;\n if (Math.max(e.x0, e.x1) < Math.min(f.x0, f.x1) || Math.max(f.x0, f.x1) < Math.min(e.x0, e.x1)) continue;\n if (Math.max(e.y0, e.y1) < Math.min(f.y0, f.y1) || Math.max(f.y0, f.y1) < Math.min(e.y0, e.y1)) continue;\n if (segmentsCross(e.x0, e.y0, e.x1, e.y1, f.x0, f.y0, f.x1, f.y1)) return true;\n }\n }\n return false;\n}\n\n/** Winding number of `q`, by a ray cast in +x against the exact curves. */\nexport function windingAt(q: Point, contours: Contour[]): number {\n const dir = { x: 1, y: 0 };\n let w = 0;\n for (const contour of contours) {\n for (const s of contour) {\n for (const c of signChanges(sideCoeffs(s, q, dir), true)) {\n if (evalSeg(s, c.t).x > q.x) w += c.after > 0 ? 1 : -1;\n }\n }\n }\n return w;\n}\n\n/** The diagonal of the box around every control point of `contours`. */\nexport function extentOf(contours: Contour[]): number {\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (const c of contours) for (const s of c) for (const p of s) {\n minX = Math.min(minX, p.x); maxX = Math.max(maxX, p.x);\n minY = Math.min(minY, p.y); maxY = Math.max(maxY, p.y);\n }\n return Math.hypot(maxX - minX, maxY - minY);\n}\n\n/** The area below which a region cut from `contours` is rounding, not a piece. */\nexport function negligibleArea(contours: Contour[]): number {\n const extent = extentOf(contours);\n return extent * extent * EPS * EPS;\n}\n\n/**\n * The contours that bound the fill, each turned so the fill lies on its left.\n * A contour with fill on both sides or neither (a same-direction inner ring\n * under nonzero) bounds nothing and is dropped.\n */\nexport function orientBoundaries(contours: Contour[], fillRule: PathFillRule): Contour[] {\n const filled = (q: Point) => {\n const w = windingAt(q, contours);\n return fillRule === 'evenodd' ? (w & 1) !== 0 : w !== 0;\n };\n const eps = Math.max(extentOf(contours) * 1e-6, 1e-9);\n\n const out: Contour[] = [];\n for (const contour of contours) {\n let probe = contour[0];\n let best = -1;\n for (const s of contour) {\n const len = Math.hypot(s[s.length - 1].x - s[0].x, s[s.length - 1].y - s[0].y);\n if (len > best) { best = len; probe = s; }\n }\n const p = evalSeg(probe, 0.5);\n let tan = derivSeg(probe, 0.5);\n const tl = Math.hypot(tan.x, tan.y);\n if (tl === 0) continue;\n tan = { x: tan.x / tl, y: tan.y / tl };\n const left = filled({ x: p.x - tan.y * eps, y: p.y + tan.x * eps });\n const right = filled({ x: p.x + tan.y * eps, y: p.y - tan.x * eps });\n if (left && !right) out.push(contour);\n else if (right && !left) out.push(reverseContour(contour));\n }\n return out;\n}\n","/** The cut polyline itself: where it crosses itself, and the loops it closes inside a path. */\n\nimport { pointInPolygon } from '../polyline';\nimport type { Point } from '../paths/cubicMath';\nimport { type Contour, evalSeg, reverseContour, sampleContour, signedArea } from './contourSegments';\nimport { type Crossing, findCrossings } from './cutCrossings';\nimport { windingAt, negligibleArea } from './contours';\n\nexport function distinctPoints(cut: readonly Point[]): Point[] {\n const out: Point[] = [];\n for (const p of cut) {\n const q = out[out.length - 1];\n if (!q || q.x !== p.x || q.y !== p.y) out.push({ x: p.x, y: p.y });\n }\n return out;\n}\n\n/** The stretch of the cut from one crossing to a later one. */\nexport function cutBetween(cut: Point[], from: Crossing, to: Crossing): Point[] {\n const out = [from.pt];\n for (let v = Math.floor(from.s) + 1; v < to.s; v++) out.push(cut[v]);\n out.push(to.pt);\n return out;\n}\n\n/** Where segments p0→p1 and q0→q1 cross at a point interior to both, or null. */\nfunction properCrossing(p0: Point, p1: Point, q0: Point, q1: Point): Point | null {\n const r = { x: p1.x - p0.x, y: p1.y - p0.y };\n const s = { x: q1.x - q0.x, y: q1.y - q0.y };\n const den = r.x * s.y - r.y * s.x;\n if (den === 0) return null;\n const qp = { x: q0.x - p0.x, y: q0.y - p0.y };\n const t = (qp.x * s.y - qp.y * s.x) / den;\n const u = (qp.x * r.y - qp.y * r.x) / den;\n const eps = 1e-9;\n if (t <= eps || t >= 1 - eps || u <= eps || u >= 1 - eps) return null;\n return { x: p0.x + t * r.x, y: p0.y + t * r.y };\n}\n\n/**\n * `run` split where it crosses its own track: each loop it closes, as the\n * ring of points from the crossing round to it again, and the spine left once\n * every loop is taken out. Loops are taken as they close, so each is simple.\n * A run ending where it started is itself a loop, and leaves no spine.\n */\nexport function splitLoops(run: Point[]): { spine: Point[]; loops: Point[][] } {\n const spine = [run[0]];\n const loops: Point[][] = [];\n for (let i = 1; i < run.length; i++) {\n const to = run[i];\n for (;;) {\n const from = spine[spine.length - 1];\n let hit: { j: number; x: Point; d: number } | null = null;\n for (let j = 0; j + 2 < spine.length; j++) {\n const x = properCrossing(from, to, spine[j], spine[j + 1]);\n if (!x) continue;\n const d = Math.hypot(x.x - from.x, x.y - from.y);\n if (!hit || d < hit.d) hit = { j, x, d };\n }\n if (!hit) { spine.push(to); break; }\n loops.push([hit.x, ...spine.slice(hit.j + 1)]);\n spine.length = hit.j + 1;\n spine.push(hit.x);\n }\n }\n const last = spine[spine.length - 1];\n if (spine.length >= 4 && last.x === spine[0].x && last.y === spine[0].y) {\n loops.push(spine.slice(0, -1));\n return { spine: [], loops };\n }\n return { spine, loops };\n}\n\n/** The point at position `s` along the cut. */\nfunction pointAt(cut: Point[], s: number): Point {\n const k = Math.min(Math.floor(s), cut.length - 2);\n const f = s - k;\n const a = cut[k], b = cut[k + 1];\n return { x: a.x + f * (b.x - a.x), y: a.y + f * (b.y - a.y) };\n}\n\n/**\n * A closed cut that crosses the boundary, turned to start and end outside\n * the fill so its chords read enter-then-exit like any other cut's. Any other\n * cut comes back unchanged.\n */\nexport function openClosedCut(cut: Point[], boundaries: Contour[]): Point[] {\n const n = cut.length - 1;\n if (n < 3 || cut[0].x !== cut[n].x || cut[0].y !== cut[n].y) return cut;\n const crossings = findCrossings(boundaries, cut);\n const k = crossings.findIndex((c) => !c.enters);\n if (k < 0) return cut;\n const next = k + 1 < crossings.length ? crossings[k + 1].s : crossings[0].s + n;\n const s = ((crossings[k].s + next) / 2) % n;\n const seg = Math.min(Math.floor(s), n - 1);\n const start = pointAt(cut, s);\n const ring = cut.slice(0, n);\n return distinctPoints([start, ...ring.slice(seg + 1), ...ring.slice(0, seg + 1), start]);\n}\n\n/**\n * The loops the cut closes inside the fill, each a ring of points. A loop\n * lies within one stretch of the cut between boundary crossings, so it\n * crosses no boundary. One that a chord of the cut, or an earlier loop, runs\n * through is left out.\n */\nexport function interiorLoops(cut: Point[], boundaries: Contour[]): Point[][] {\n const crossings = findCrossings(boundaries, cut);\n const chords: Point[][] = [];\n for (let k = 0; k + 1 < crossings.length; k++) {\n const c0 = crossings[k], c1 = crossings[k + 1];\n if (c0.enters && !c1.enters && c1.s - c0.s > 1e-9) chords.push(splitLoops(cutBetween(cut, c0, c1)).spine);\n }\n\n const last = cut.length - 1;\n const stops = [{ s: 0, pt: cut[0] }, ...crossings, { s: last, pt: cut[last] }];\n const rings: Point[][] = [];\n const loops: Point[][] = [];\n for (let i = 0; i + 1 < stops.length; i++) {\n const a = stops[i], b = stops[i + 1];\n if (b.s - a.s <= 1e-9) continue;\n if (windingAt(pointAt(cut, (a.s + b.s) / 2), boundaries) === 0) continue;\n const run = [a.pt];\n for (let v = Math.floor(a.s) + 1; v < b.s; v++) run.push(cut[v]);\n run.push(b.pt);\n for (const loop of splitLoops(distinctPoints(run)).loops) {\n const ring = [...loop, loop[0]];\n if (chords.some((c) => polylinesCross(ring, c)) || rings.some((r) => polylinesCross(ring, r))) continue;\n rings.push(ring);\n loops.push(loop);\n }\n }\n return loops;\n}\n\n/**\n * Cut each loop out of the region holding it: the loop, with whatever of that\n * region it encloses, becomes a region of its own, and the loop becomes a hole\n * in what is left. Edits `regions` in place; returns whether any loop cut.\n */\nexport function cutOutLoops(regions: Contour[][], loops: Point[][]): boolean {\n let cut = false;\n const minArea = negligibleArea(regions.flat());\n for (const loop of loops) {\n let ring: Contour = loop.map((p, i) => [p, loop[(i + 1) % loop.length]]);\n const a = signedArea(ring);\n if (Math.abs(a) <= minArea) continue;\n if (a < 0) ring = reverseContour(ring);\n const probe = evalSeg(ring[0], 0.5);\n const at = regions.findIndex((r) => windingAt(probe, r) !== 0);\n if (at < 0) continue;\n const samples = sampleContour(ring);\n const within = (c: Contour): boolean => {\n const p = evalSeg(c[0], 0.5);\n return pointInPolygon(samples, p.x, p.y);\n };\n const region = regions[at];\n regions[at] = [...region.filter((c) => !within(c)), reverseContour(ring)];\n regions.push([ring, ...region.filter(within)]);\n cut = true;\n }\n return cut;\n}\n\nexport function polylinesCross(a: Point[], b: Point[]): boolean {\n for (let i = 0; i + 1 < a.length; i++) {\n for (let j = 0; j + 1 < b.length; j++) {\n if (properCrossing(a[i], a[i + 1], b[j], b[j + 1])) return true;\n }\n }\n return false;\n}\n","/** Tracing the loops a cut divides a path's contours into. */\n\nimport type { Point } from '../paths/cubicMath';\nimport { type Seg, type Contour, type Station, subSeg } from './contourSegments';\nimport type { Crossing } from './cutCrossings';\n\n/**\n * Walk the boundary arcs between cut points and the chords that join them.\n * With the fill on every contour's left, each arc ending at a cut point\n * continues along that point's chord and then along the arc leaving the\n * chord's other end.\n */\nexport function traceLoops(\n boundaries: Contour[],\n partner: Map<Crossing, Crossing>,\n chord: Map<Crossing, Point[]>,\n): { loops: Contour[]; untouched: Contour[] } {\n const byContour = new Map<number, Crossing[]>();\n for (const c of partner.keys()) {\n const list = byContour.get(c.contour) ?? [];\n list.push(c);\n byContour.set(c.contour, list);\n }\n\n const arcFrom = new Map<Crossing, { segs: Seg[]; end: Crossing }>();\n const untouched: Contour[] = [];\n boundaries.forEach((contour, ci) => {\n const cuts = byContour.get(ci);\n if (!cuts) { untouched.push(contour); return; }\n cuts.sort((x, y) => x.seg - y.seg || x.t - y.t);\n for (let k = 0; k < cuts.length; k++) {\n const from = cuts[k], to = cuts[(k + 1) % cuts.length];\n arcFrom.set(from, { segs: arcBetween(contour, from, to, cuts.length === 1), end: to });\n }\n });\n\n const loops: Contour[] = [];\n const seen = new Set<Crossing>();\n for (const start of arcFrom.keys()) {\n if (seen.has(start)) continue;\n const loop: Contour = [];\n let at = start;\n while (!seen.has(at)) {\n seen.add(at);\n const arc = arcFrom.get(at)!;\n loop.push(...arc.segs);\n const run = chord.get(arc.end)!;\n for (let i = 0; i + 1 < run.length; i++) loop.push([run[i], run[i + 1]]);\n at = partner.get(arc.end)!;\n }\n loops.push(loop);\n }\n return { loops, untouched };\n}\n\n/** The boundary from one cut point forward to the next. */\nexport function arcBetween(contour: Contour, from: Station, to: Station, whole: boolean): Seg[] {\n const out: Seg[] = [];\n const add = (s: Seg | null) => { if (s) out.push(s); };\n if (!whole && to.seg === from.seg && to.t > from.t) {\n add(subSeg(contour[from.seg], from.t, to.t, from.pt, to.pt));\n return out;\n }\n const n = contour.length;\n const first = contour[from.seg];\n add(subSeg(first, from.t, 1, from.pt, first[first.length - 1]));\n for (let i = (from.seg + 1) % n; i !== to.seg; i = (i + 1) % n) out.push(contour[i]);\n const last = contour[to.seg];\n add(subSeg(last, 0, to.t, last[0], to.pt));\n return out;\n}\n","/** Grouping traced loops into regions, and writing contours back out as paths. */\n\nimport { pointInPolygon } from '../polyline';\nimport type { PolygonPath, PathFillRule } from '../path';\nimport { PATH_C, PATH_L, PATH_M, PATH_Q, PATH_Z } from '../commands';\nimport { type Contour, evalSeg, sampleContour, signedArea } from './contourSegments';\nimport type { Subpath } from './contours';\n\n/** Group loops into regions: each positive loop with the holes it immediately contains. */\nexport function assembleRegions(outers: Contour[], holes: Contour[]): Contour[][] {\n const regions = outers.map((o) => ({ loops: [o], ring: sampleContour(o), area: signedArea(o) }));\n for (const h of holes) {\n const hp = evalSeg(h[0], 0.5);\n let best: (typeof regions)[number] | null = null;\n for (const r of regions) {\n if (pointInPolygon(r.ring, hp.x, hp.y) && (!best || r.area < best.area)) best = r;\n }\n best?.loops.push(h);\n }\n return regions.map((r) => r.loops);\n}\n\nexport const regionArea = (r: Contour[]): number => r.reduce((s, c) => s + signedArea(c), 0);\n\nexport const toPath = (loops: Contour[], fillRule: PathFillRule): PolygonPath =>\n writePath(loops.map((segs) => ({ segs, closed: true })), fillRule);\n\nexport function writePath(subpaths: Subpath[], fillRule: PathFillRule): PolygonPath {\n const cmds: number[] = [];\n const xs: number[] = [];\n for (const { segs, closed } of subpaths) {\n cmds.push(PATH_M);\n xs.push(segs[0][0].x, segs[0][0].y);\n for (const s of segs) {\n cmds.push(s.length === 2 ? PATH_L : s.length === 3 ? PATH_Q : PATH_C);\n for (let i = 1; i < s.length; i++) xs.push(s[i].x, s[i].y);\n }\n if (closed) cmds.push(PATH_Z);\n }\n return { kind: 'polygon', commands: new Uint8Array(cmds), coords: new Float32Array(xs), fillRule };\n}\n","import type { Path, PathFillRule } from '../path';\nimport type { Point } from '../paths/cubicMath';\nimport { pathUnion } from './ops';\nimport { type Contour, type Station, evalSeg, signedArea, sideCoeffs, signChanges } from './contourSegments';\nimport { type Crossing, cutPosition, findCrossings } from './cutCrossings';\nimport {\n distinctPoints, cutBetween, splitLoops, openClosedCut, interiorLoops, cutOutLoops, polylinesCross,\n} from './cutPolyline';\nimport {\n parseContours, type Subpath, parseSubpaths, contoursIntersect, extentOf, negligibleArea, orientBoundaries,\n} from './contours';\nimport { traceLoops, arcBetween } from './cutLoops';\nimport { assembleRegions, regionArea, toPath, writePath } from './cutRegions';\n\nexport type { Point };\n\n/** Options for `splitPathBySegment` and `splitPathByPolyline`. */\nexport interface SplitBySegmentOptions {\n /**\n * Flattening tolerance for the check that decides whether contours cross\n * each other. Only a path whose contours do cross is flattened (see\n * `splitPathByPolyline`).\n */\n flattenTolerance?: number;\n}\n\n/**\n * Split `path` along the finite segment a→b into closed pieces (Knife).\n * The same as {@link splitPathByPolyline} with a two-point cut.\n */\nexport function splitPathBySegment(\n path: Path,\n a: Point,\n b: Point,\n opts: SplitBySegmentOptions = {},\n): Path[] | null {\n return splitPathByPolyline(path, [a, b], opts);\n}\n\n/**\n * Split `path` along the open polyline `cut` into closed pieces (Knife).\n *\n * Only chords the cut crosses end to end are cut: a stretch of the cut that\n * starts or stops inside the fill cuts nothing, and nothing beyond the cut's\n * ends is touched. Curves are split at the crossing parameters by de Casteljau\n * subdivision, so every piece keeps its quadratic and cubic segments; the new\n * edges follow the cut as straight lines, bends included.\n *\n * A loop the cut draws inside the fill, where it crosses its own track, cuts\n * out the region it encloses: that region is returned as its own piece, with\n * any hole it surrounds, and leaves a hole in the piece around it. A chord\n * running through a loop leaves the loop uncut. A closed cut (its last point\n * equal to its first) is one such loop or, where it crosses the boundary, is\n * cut as the chords it makes. Chords that cross each other are cut one after\n * another.\n *\n * Each connected piece the cut produces is returned as its own path, holes\n * included. Contours the cut misses entirely are returned together as one\n * final piece. A single chord that does not disconnect the shape (across a\n * ring, say) returns one slit piece.\n *\n * A path whose contours cross each other or themselves is first resolved into\n * non-overlapping rings by a polygon union, which flattens its curves.\n *\n * Returns `null` when no chord is cut.\n */\nexport function splitPathByPolyline(\n path: Path,\n cut: readonly Point[],\n opts: SplitBySegmentOptions = {},\n): Path[] | null {\n let pts = distinctPoints(cut);\n if (pts.length < 2) return null;\n const outRule = fillRuleOf(path);\n const boundaries = resolveBoundaries(path, opts);\n if (boundaries.length === 0) return null;\n\n pts = openClosedCut(pts, boundaries);\n const loops = interiorLoops(pts, boundaries);\n const pieces = knife(path, pts, opts, pts.length);\n if (loops.length === 0) return pieces;\n\n const regions = pieces ? pieces.map((p) => orientBoundaries(parseContours(p), outRule)) : [boundaries];\n if (!cutOutLoops(regions, loops)) return pieces;\n return regions.map((r) => toPath(r, outRule));\n}\n\nconst fillRuleOf = (path: Path): PathFillRule => (path.kind === 'polygon' ? path.fillRule : 'nonzero');\n\n/** The contours bounding `path`'s fill, fill on their left. Contours that\n * cross are first resolved by a union. */\nfunction resolveBoundaries(path: Path, opts: SplitBySegmentOptions): Contour[] {\n const contours = parseContours(path);\n if (contoursIntersect(contours, opts.flattenTolerance ?? 0.5)) {\n return orientBoundaries(parseContours(pathUnion(path)), 'nonzero');\n }\n return orientBoundaries(contours, fillRuleOf(path));\n}\n\nfunction knife(path: Path, cut: Point[], opts: SplitBySegmentOptions, budget: number): Path[] | null {\n const outRule = fillRuleOf(path);\n const boundaries = resolveBoundaries(path, opts);\n if (boundaries.length === 0) return null;\n\n const crossings = findCrossings(boundaries, cut);\n const partner = new Map<Crossing, Crossing>();\n const chord = new Map<Crossing, Point[]>();\n const accepted: Point[][] = [];\n let deferred = false;\n for (let k = 0; k + 1 < crossings.length; k++) {\n const c0 = crossings[k], c1 = crossings[k + 1];\n if (!c0.enters || c1.enters || c1.s - c0.s <= 1e-9) continue;\n const run = splitLoops(cutBetween(cut, c0, c1)).spine;\n if (accepted.some((other) => polylinesCross(run, other))) { deferred = true; continue; }\n accepted.push(run);\n partner.set(c0, c1);\n partner.set(c1, c0);\n chord.set(c0, run);\n chord.set(c1, run.slice().reverse());\n }\n if (partner.size === 0) return null;\n\n const { loops, untouched } = traceLoops(boundaries, partner, chord);\n\n const traced = assembleRegions(loops, untouched.filter((c) => signedArea(c) < 0));\n const islands = untouched.filter((c) => signedArea(c) > 0);\n const minArea = negligibleArea(boundaries);\n const regions: Contour[][] = traced.filter((r) => Math.abs(regionArea(r)) > minArea);\n if (islands.length > 0) {\n const leftover = untouched.filter((c) => !traced.some((r) => r.includes(c)));\n regions.push(leftover);\n }\n const pieces: Path[] = regions.map((r) => toPath(r, outRule));\n if (!deferred || budget <= 1) return pieces;\n return pieces.flatMap((p) => knife(p, cut, opts, budget - 1) ?? [p]);\n}\n\n/**\n * Split the stroke of `path` wherever the open polyline `cut` crosses it\n * (Scissors).\n *\n * Nothing is closed the way a fill closes it: an open subpath is cut into open\n * runs at each crossing, and a closed one is opened there, so a ring crossed\n * once becomes a single open run that starts and ends at the crossing. Curves\n * are split by de Casteljau subdivision, keeping their segment types. A\n * crossing at an end of an open subpath cuts nothing, and neither does a point\n * where the path only touches the cut.\n *\n * Each run is returned as its own path. Subpaths the cut misses are returned\n * together as one final piece.\n *\n * Returns `null` when nothing is cut.\n */\nexport function snipPathByPolyline(path: Path, cut: readonly Point[]): Path[] | null {\n const pts = distinctPoints(cut);\n if (pts.length < 2) return null;\n const rule: PathFillRule = path.kind === 'polygon' ? path.fillRule : 'nonzero';\n\n const runs: Contour[] = [];\n const missed: Subpath[] = [];\n for (const sub of parseSubpaths(path, false)) {\n const stops = snipStations(sub, pts);\n if (stops.length === 0) { missed.push(sub); continue; }\n const segs = sub.segs;\n if (sub.closed) {\n for (let i = 0; i < stops.length; i++) {\n runs.push(arcBetween(segs, stops[i], stops[(i + 1) % stops.length], stops.length === 1));\n }\n } else {\n const last = segs[segs.length - 1];\n const all: Station[] = [\n { seg: 0, t: 0, pt: segs[0][0] },\n ...stops,\n { seg: segs.length - 1, t: 1, pt: last[last.length - 1] },\n ];\n for (let i = 0; i + 1 < all.length; i++) runs.push(arcBetween(segs, all[i], all[i + 1], false));\n }\n }\n if (runs.length === 0) return null;\n\n const pieces = runs.filter((r) => r.length > 0).map((r) => writePath([{ segs: r, closed: false }], rule));\n if (missed.length > 0) pieces.push(writePath(missed, rule));\n return pieces;\n}\n\n/**\n * Where the cut splits one subpath, in order along it. Detections at one point\n * pair off: two there are the path touching the cut and leaving on the side it\n * came from.\n */\nfunction snipStations(sub: Subpath, cut: Point[]): Station[] {\n const raw: Station[] = [];\n sub.segs.forEach((seg, si) => {\n for (let k = 0; k + 1 < cut.length; k++) {\n const a = cut[k];\n const d = { x: cut[k + 1].x - a.x, y: cut[k + 1].y - a.y };\n for (const c of signChanges(sideCoeffs(seg, a, d), true)) {\n const pt = evalSeg(seg, c.t);\n if (cutPosition(cut, k, pt) !== null) raw.push({ seg: si, t: c.t, pt });\n }\n }\n });\n raw.sort((x, y) => x.seg - y.seg || x.t - y.t);\n\n const tol = extentOf([sub.segs]) * 1e-9;\n const same = (p: Point, q: Point) => Math.abs(p.x - q.x) <= tol && Math.abs(p.y - q.y) <= tol;\n const groups: Station[][] = [];\n for (const st of raw) {\n const g = groups[groups.length - 1];\n if (g && same(g[0].pt, st.pt)) g.push(st); else groups.push([st]);\n }\n if (sub.closed && groups.length > 1 && same(groups[0][0].pt, groups[groups.length - 1][0].pt)) {\n groups[0].push(...groups.pop()!);\n }\n const first = sub.segs[0][0];\n const lastSeg = sub.segs[sub.segs.length - 1];\n const end = lastSeg[lastSeg.length - 1];\n return groups\n .filter((g) => g.length % 2 === 1)\n .map((g) => g[0])\n .filter((st) => sub.closed || (!same(st.pt, first) && !same(st.pt, end)));\n}\n","import type { Path } from '../path';\nimport type { Point } from '../paths/cubicMath';\nimport { flattenCubic, flattenQuadratic } from '../flatten';\nimport { parseSubpaths } from './contours';\nimport { snipPathByPolyline } from './splitBySegment';\n\n/** Options for {@link snipPathsAtCrossings}. */\nexport interface SnipAtCrossingsOptions {\n /** How closely a cutting path's curves are followed when they are flattened\n * to find where they cross. Default 0.05. */\n flattenTolerance?: number;\n}\n\n/**\n * Cut the stroke of every path in `paths` wherever another of them crosses\n * it, as {@link snipPathByPolyline} cuts along one polyline: an open subpath\n * becomes open runs between crossings, and a closed one is opened at them.\n * A path is not cut where it crosses itself.\n *\n * Answers one entry per path, in order: its pieces, or `null` when no other\n * path crosses it. The cutting paths' curves are flattened, so a crossing on\n * a curve is found to within `flattenTolerance`; the pieces keep their own\n * segment types.\n */\nexport function snipPathsAtCrossings(\n paths: readonly Path[],\n opts: SnipAtCrossingsOptions = {},\n): (Path[] | null)[] {\n const tol = opts.flattenTolerance ?? 0.05;\n const cuts = paths.map((p) => cutLinesOf(p, tol));\n return paths.map((path, i) => {\n let pieces: Path[] = [path];\n let cut = false;\n cuts.forEach((lines, j) => {\n if (j === i) return;\n for (const line of lines) {\n pieces = pieces.flatMap((piece) => {\n const snipped = snipPathByPolyline(piece, line);\n if (!snipped) return [piece];\n cut = true;\n return snipped;\n });\n }\n });\n return cut ? pieces : null;\n });\n}\n\n/** `path`'s subpaths as polylines, a closed one ending where it began. */\nfunction cutLinesOf(path: Path, tol: number): Point[][] {\n return parseSubpaths(path, false).map(({ segs, closed }) => {\n const flat: number[] = [segs[0][0].x, segs[0][0].y];\n for (const s of segs) {\n if (s.length === 2) flat.push(s[1].x, s[1].y);\n else if (s.length === 3) flattenQuadratic(s[0].x, s[0].y, s[1].x, s[1].y, s[2].x, s[2].y, tol, flat);\n else flattenCubic(s[0].x, s[0].y, s[1].x, s[1].y, s[2].x, s[2].y, s[3].x, s[3].y, tol, flat);\n }\n const pts: Point[] = [];\n for (let k = 0; k < flat.length; k += 2) pts.push({ x: flat[k], y: flat[k + 1] });\n if (closed) {\n const end = pts[pts.length - 1];\n if (end.x !== pts[0].x || end.y !== pts[0].y) pts.push({ ...pts[0] });\n }\n return pts;\n });\n}\n"]}
1
+ {"version":3,"sources":["../../src/booleans/adapter.ts","../../src/booleans/arrangement.ts","../../src/booleans/arrangementFaces.ts","../../src/booleans/ops.ts","../../src/booleans/trianglesToPath.ts","../../src/booleans/cutCrossings.ts","../../src/booleans/cutPolyline.ts","../../src/booleans/cutLoops.ts","../../src/booleans/splitBySegment.ts","../../src/booleans/snipAtCrossings.ts"],"names":["v","faces","toPath","polygonClipping","k"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Adapter between `Path` and `polygon-clipping`'s `MultiPolygon` format.\n *\n * `polygon-clipping` expects:\n * MultiPolygon = Polygon[]\n * Polygon = Ring[] (first ring outer, subsequent rings holes)\n * Ring = [x, y][] (closed — first vertex repeated as last)\n *\n * Bezier inputs are flattened. A boolean works on what a fill covers: an open\n * contour is closed where a fill closes it (`fillsOpenSubpaths`) and left out\n * where one does not.\n *\n * The `[x,y][]` nested-array form here is the one place geom's flat-everywhere\n * rule is suspended — it is the third-party clipper's required API.\n */\nimport { PATH_M, PATH_L, PATH_C, PATH_Q, PATH_Z } from '../commands';\nimport { elevateQuadraticToCubic } from '../curve';\nimport { DEFAULT_FLATTEN_TOLERANCE, flattenCubic } from '../flatten';\nimport { fillsOpenSubpaths } from '../openFill';\nimport type { Path, PolygonPath } from '../path';\nimport { resolveCorners } from '../paths/corners';\n\n/** A `[x, y]` 2-tuple. */\nexport type Pair = [number, number];\n/** Closed ring (first vertex repeated as last). */\nexport type Ring = Pair[];\n/** Polygon: one outer ring optionally followed by hole rings. */\nexport type Polygon = Ring[];\n/** MultiPolygon: list of polygons (used for boolean op I/O). */\nexport type MultiPolygon = Polygon[];\n\n/** Options for `pathToMultiPolygon`. */\nexport interface PathToMultiPolygonOptions {\n /** Flattening tolerance for bezier segments. Default: `DEFAULT_FLATTEN_TOLERANCE`. */\n tolerance?: number;\n}\n\n/** Convert a `Path` to a `MultiPolygon` suitable for `polygon-clipping`. */\nexport function pathToMultiPolygon(\n given: Path,\n opts: PathToMultiPolygonOptions = {},\n): MultiPolygon {\n const path = resolveCorners(given);\n if (path.kind === 'rect') {\n const { x, y, width, height } = path;\n const ring: Ring = [\n [x, y],\n [x + width, y],\n [x + width, y + height],\n [x, y + height],\n [x, y],\n ];\n return [[ring]];\n }\n\n const tolerance = opts.tolerance ?? DEFAULT_FLATTEN_TOLERANCE;\n const rings: Ring[] = [];\n let current: Ring | null = null;\n let cx = 0, cy = 0;\n // Where `Z` returns the pen, and so where a command after it starts.\n let startX = 0, startY = 0;\n let ci = 0;\n const { commands, coords } = path;\n\n const fillsOpen = fillsOpenSubpaths(path);\n const finalizeCurrent = (closed = fillsOpen) => {\n if (!closed) current = null;\n if (!current || current.length === 0) return;\n // Close the ring by repeating the first vertex if not already closed.\n const first = current[0];\n const last = current[current.length - 1];\n if (first[0] !== last[0] || first[1] !== last[1]) {\n current.push([first[0], first[1]]);\n }\n if (current.length >= 4) rings.push(current); // 3 unique + 1 closing\n current = null;\n };\n\n for (let i = 0; i < commands.length; i++) {\n const cmd = commands[i];\n switch (cmd) {\n case PATH_M: {\n finalizeCurrent();\n cx = coords[ci]; cy = coords[ci + 1];\n startX = cx; startY = cy;\n current = [[cx, cy]];\n ci += 2;\n break;\n }\n case PATH_L: {\n current ??= [[cx, cy]];\n cx = coords[ci]; cy = coords[ci + 1];\n current.push([cx, cy]);\n ci += 2;\n break;\n }\n case PATH_C: {\n const x1 = coords[ci], y1 = coords[ci + 1];\n const x2 = coords[ci + 2], y2 = coords[ci + 3];\n const x3 = coords[ci + 4], y3 = coords[ci + 5];\n const out: number[] = [];\n flattenCubic(cx, cy, x1, y1, x2, y2, x3, y3, tolerance, out);\n current ??= [[cx, cy]];\n for (let k = 0; k < out.length; k += 2) current.push([out[k], out[k + 1]]);\n cx = x3; cy = y3;\n ci += 6;\n break;\n }\n case PATH_Q: {\n const x1 = coords[ci], y1 = coords[ci + 1];\n const x2 = coords[ci + 2], y2 = coords[ci + 3];\n const [c1x, c1y, c2x, c2y] = elevateQuadraticToCubic(cx, cy, x1, y1, x2, y2);\n const out: number[] = [];\n flattenCubic(cx, cy, c1x, c1y, c2x, c2y, x2, y2, tolerance, out);\n current ??= [[cx, cy]];\n for (let k = 0; k < out.length; k += 2) current.push([out[k], out[k + 1]]);\n cx = x2; cy = y2;\n ci += 4;\n break;\n }\n case PATH_Z: {\n finalizeCurrent(true);\n cx = startX; cy = startY;\n break;\n }\n default:\n throw new Error(`pathToMultiPolygon: unknown command ${cmd}`);\n }\n }\n finalizeCurrent();\n\n if (rings.length === 0) return [];\n return groupRings(rings, path.fillRule);\n}\n\n/** Shoelace area of a closed ring. Sign gives the winding direction. */\nfunction ringSignedArea(ring: Ring): number {\n let a = 0;\n for (let i = 0, n = ring.length - 1; i < n; i++) {\n a += ring[i][0] * ring[i + 1][1] - ring[i + 1][0] * ring[i][1];\n }\n return a * 0.5;\n}\n\ntype RingBox = [number, number, number, number];\n\nfunction ringBox(ring: Ring): RingBox {\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (const [x, y] of ring) {\n if (x < minX) minX = x;\n if (x > maxX) maxX = x;\n if (y < minY) minY = y;\n if (y > maxY) maxY = y;\n }\n return [minX, minY, maxX, maxY];\n}\n\n/** Even-odd ray cast; used only to decide ring nesting, never to fill. */\nfunction pointInRing(ring: Ring, px: number, py: number): boolean {\n let inside = false;\n for (let i = 0, n = ring.length - 1; i < n; i++) {\n const [ax, ay] = ring[i];\n const [bx, by] = ring[i + 1];\n if ((ay > py) !== (by > py) && px < ((bx - ax) * (py - ay)) / (by - ay) + ax) {\n inside = !inside;\n }\n }\n return inside;\n}\n\n/**\n * Nesting test by majority vote over three sample vertices — a single sample\n * gives the wrong answer whenever it lands exactly on the outer ring.\n */\nfunction ringContains(outer: Ring, outerBox: RingBox, inner: Ring, innerBox: RingBox): boolean {\n if (innerBox[0] < outerBox[0] || innerBox[1] < outerBox[1]\n || innerBox[2] > outerBox[2] || innerBox[3] > outerBox[3]) return false;\n const n = inner.length - 1;\n let votes = 0;\n for (const k of [0, Math.floor(n / 3), Math.floor((2 * n) / 3)]) {\n if (pointInRing(outer, inner[k][0], inner[k][1])) votes++;\n }\n return votes >= 2;\n}\n\n/**\n * Resolve rings into `polygon-clipping` polygons (outer ring first, hole\n * rings after) by nesting depth and `fillRule`.\n *\n * Without this a path's own holes are lost: separate polygons in a\n * MultiPolygon are unioned, so a donut arrives at the clipper as a solid disc.\n *\n * Rings that bound no boundary of the filled region — a same-winding ring\n * nested inside a nonzero fill — are dropped; they contribute nothing.\n */\nfunction groupRings(rings: Ring[], fillRule: 'nonzero' | 'evenodd'): MultiPolygon {\n const n = rings.length;\n if (n === 1) return [[rings[0]]];\n\n const boxes = rings.map(ringBox);\n const orient = rings.map((r) => (ringSignedArea(r) >= 0 ? 1 : -1));\n const parent = new Array<number>(n).fill(-1);\n const children: number[][] = rings.map(() => []);\n\n for (let i = 0; i < n; i++) {\n let best = -1;\n let bestArea = Infinity;\n for (let j = 0; j < n; j++) {\n if (i === j) continue;\n if (!ringContains(rings[j], boxes[j], rings[i], boxes[i])) continue;\n const area = (boxes[j][2] - boxes[j][0]) * (boxes[j][3] - boxes[j][1]);\n if (area < bestArea) { bestArea = area; best = j; }\n }\n parent[i] = best;\n }\n for (let i = 0; i < n; i++) if (parent[i] >= 0) children[parent[i]].push(i);\n\n const filled = new Array<boolean>(n);\n for (let i = 0; i < n; i++) {\n let depth = 0;\n let winding = 0;\n for (let a: number = i; a >= 0; a = parent[a]) {\n winding += orient[a];\n if (a !== i) depth++;\n }\n filled[i] = fillRule === 'evenodd' ? depth % 2 === 0 : winding !== 0;\n }\n\n const out: MultiPolygon = [];\n for (let i = 0; i < n; i++) {\n if (!filled[i]) continue;\n if (parent[i] >= 0 && filled[parent[i]]) continue;\n const polygon: Polygon = [rings[i]];\n const queue = [...children[i]];\n while (queue.length > 0) {\n const c = queue.pop() as number;\n // An unfilled child bounds a hole; a filled one merges into this\n // region, so its own children are what may punch holes in it.\n if (filled[c]) queue.push(...children[c]);\n else polygon.push(rings[c]);\n }\n out.push(polygon);\n }\n return out;\n}\n\n/** Convert a `MultiPolygon` to a polygon path with `fillRule: 'nonzero'`. */\nexport function multiPolygonToPath(mp: MultiPolygon): PolygonPath {\n // First pass: count total commands and coord floats.\n let nCmds = 0;\n let nCoords = 0;\n for (const poly of mp) {\n for (const ring of poly) {\n if (ring.length < 4) continue; // 3 unique + 1 closing minimum\n // Drop the repeated closing vertex; emit M + (n-2) L + Z.\n const unique = ring.length - 1;\n nCmds += 1 + (unique - 1) + 1; // M + L*(unique-1) + Z\n nCoords += unique * 2;\n }\n }\n const commands = new Uint8Array(nCmds);\n const coords = new Float32Array(nCoords);\n let ci = 0;\n let pi = 0;\n for (const poly of mp) {\n for (const ring of poly) {\n if (ring.length < 4) continue;\n const unique = ring.length - 1;\n commands[ci++] = PATH_M;\n coords[pi++] = ring[0][0];\n coords[pi++] = ring[0][1];\n for (let k = 1; k < unique; k++) {\n commands[ci++] = PATH_L;\n coords[pi++] = ring[k][0];\n coords[pi++] = ring[k][1];\n }\n commands[ci++] = PATH_Z;\n }\n }\n return { kind: 'polygon', commands, coords, fillRule: 'nonzero' };\n}\n","/**\n * The planar arrangement of several polygon sets' boundaries: every edge split\n * where it meets another, coincident points merged, and the result stored as\n * half-edges linked around the faces they bound.\n */\nimport type { MultiPolygon } from './adapter';\n\n/**\n * Half-edge `h` runs from `origin[h]` to `origin[h ^ 1]`, so `h ^ 1` is its\n * twin; `next[h]` continues around the face on `h`'s left. `owners[h >> 1]`\n * has bit `i` set when input `i`'s boundary runs along that edge an odd number\n * of times, so crossing the edge toggles exactly those inputs.\n */\nexport interface Arrangement {\n xs: number[];\n ys: number[];\n origin: number[];\n next: number[];\n owners: bigint[];\n}\n\ninterface Cut { t: number; x: number; y: number }\n\ninterface Seg {\n ax: number; ay: number; bx: number; by: number;\n input: number;\n minX: number; maxX: number; minY: number; maxY: number;\n cuts: Cut[];\n}\n\n/** Merges points closer than `eps` (per axis) into one vertex. */\nclass VertexPool {\n readonly xs: number[] = [];\n readonly ys: number[] = [];\n private readonly cells = new Map<string, number[]>();\n private readonly cell: number;\n constructor(private readonly eps: number) { this.cell = eps * 2; }\n\n id(x: number, y: number): number {\n const cx = Math.floor(x / this.cell), cy = Math.floor(y / this.cell);\n for (let dx = -1; dx <= 1; dx++) {\n for (let dy = -1; dy <= 1; dy++) {\n for (const v of this.cells.get(`${cx + dx},${cy + dy}`) ?? []) {\n if (Math.abs(this.xs[v]! - x) <= this.eps && Math.abs(this.ys[v]! - y) <= this.eps) return v;\n }\n }\n }\n const v = this.xs.length;\n this.xs.push(x);\n this.ys.push(y);\n const key = `${cx},${cy}`;\n const bucket = this.cells.get(key);\n if (bucket) bucket.push(v);\n else this.cells.set(key, [v]);\n return v;\n }\n}\n\nfunction segmentsOf(inputs: readonly MultiPolygon[]): { segs: Seg[]; extent: number } {\n const segs: Seg[] = [];\n let extent = 0;\n inputs.forEach((mp, input) => {\n for (const polygon of mp) {\n for (const ring of polygon) {\n for (let k = 0; k + 1 < ring.length; k++) {\n const [ax, ay] = ring[k]!;\n const [bx, by] = ring[k + 1]!;\n if (ax === bx && ay === by) continue;\n extent = Math.max(extent, Math.abs(ax), Math.abs(ay), Math.abs(bx), Math.abs(by));\n segs.push({\n ax, ay, bx, by, input,\n minX: Math.min(ax, bx), maxX: Math.max(ax, bx),\n minY: Math.min(ay, by), maxY: Math.max(ay, by),\n cuts: [],\n });\n }\n }\n }\n });\n return { segs, extent };\n}\n\n/** Cuts `seg` at `(px, py)` when that point lies on it, short of its ends. */\nfunction cutAtPoint(seg: Seg, px: number, py: number, eps: number): void {\n const rx = seg.bx - seg.ax, ry = seg.by - seg.ay;\n const len2 = rx * rx + ry * ry;\n const t = ((px - seg.ax) * rx + (py - seg.ay) * ry) / len2;\n if (t <= 0 || t >= 1) return;\n const ex = seg.ax + t * rx - px, ey = seg.ay + t * ry - py;\n if (ex * ex + ey * ey <= eps * eps) seg.cuts.push({ t, x: px, y: py });\n}\n\nfunction cutPair(s: Seg, o: Seg, eps: number): void {\n const rx = s.bx - s.ax, ry = s.by - s.ay;\n const sx = o.bx - o.ax, sy = o.by - o.ay;\n const d = rx * sy - ry * sx;\n const lenR = Math.hypot(rx, ry), lenS = Math.hypot(sx, sy);\n if (Math.abs(d) > 1e-12 * lenR * lenS) {\n const qx = o.ax - s.ax, qy = o.ay - s.ay;\n const t = (qx * sy - qy * sx) / d;\n const u = (qx * ry - qy * rx) / d;\n const tolT = eps / lenR, tolU = eps / lenS;\n if (t > -tolT && t < 1 + tolT && u > -tolU && u < 1 + tolU) {\n const tc = Math.min(1, Math.max(0, t));\n const x = s.ax + tc * rx, y = s.ay + tc * ry;\n s.cuts.push({ t: tc, x, y });\n o.cuts.push({ t: Math.min(1, Math.max(0, u)), x, y });\n }\n }\n // Ends lying on the other segment: T-junctions and collinear overlaps.\n cutAtPoint(s, o.ax, o.ay, eps);\n cutAtPoint(s, o.bx, o.by, eps);\n cutAtPoint(o, s.ax, s.ay, eps);\n cutAtPoint(o, s.bx, s.by, eps);\n}\n\nfunction cutAll(segs: Seg[], eps: number): void {\n const order = segs.map((_, i) => i).sort((i, j) => segs[i]!.minX - segs[j]!.minX);\n for (let a = 0; a < order.length; a++) {\n const s = segs[order[a]!]!;\n for (let b = a + 1; b < order.length; b++) {\n const o = segs[order[b]!]!;\n if (o.minX > s.maxX + eps) break;\n if (o.minY > s.maxY + eps || o.maxY < s.minY - eps) continue;\n cutPair(s, o, eps);\n }\n }\n}\n\nfunction linkFaces(xs: number[], ys: number[], origin: number[]): number[] {\n const out: number[][] = xs.map(() => []);\n const angle: number[] = [];\n for (let h = 0; h < origin.length; h++) {\n const u = origin[h]!, v = origin[h ^ 1]!;\n out[u]!.push(h);\n angle[h] = Math.atan2(ys[v]! - ys[u]!, xs[v]! - xs[u]!);\n }\n const slot: number[] = [];\n for (const list of out) {\n list.sort((a, b) => angle[a]! - angle[b]!);\n list.forEach((h, k) => { slot[h] = k; });\n }\n // Leaving the head of `h`, the face on its left continues along the\n // outgoing edge just clockwise of the way back.\n return origin.map((_, h) => {\n const list = out[origin[h ^ 1]!]!;\n return list[(slot[h ^ 1]! - 1 + list.length) % list.length]!;\n });\n}\n\n/** Builds the arrangement of the rings of `inputs`, input `i` owning bit `i`. */\nexport function buildArrangement(inputs: readonly MultiPolygon[]): Arrangement {\n const { segs, extent } = segmentsOf(inputs);\n const eps = 1e-9 * Math.max(1, extent);\n cutAll(segs, eps);\n\n const pool = new VertexPool(eps);\n const edges = new Map<string, { u: number; v: number; owners: bigint }>();\n for (const seg of segs) {\n const points = [{ t: 0, x: seg.ax, y: seg.ay }, ...seg.cuts, { t: 1, x: seg.bx, y: seg.by }]\n .sort((a, b) => a.t - b.t);\n const bit = 1n << BigInt(seg.input);\n let prev = pool.id(points[0]!.x, points[0]!.y);\n for (let k = 1; k < points.length; k++) {\n const id = pool.id(points[k]!.x, points[k]!.y);\n if (id === prev) continue;\n const u = Math.min(prev, id), v = Math.max(prev, id);\n const key = `${u},${v}`;\n const edge = edges.get(key);\n if (edge) edge.owners ^= bit;\n else edges.set(key, { u, v, owners: bit });\n prev = id;\n }\n }\n\n const origin: number[] = [];\n const owners: bigint[] = [];\n for (const { u, v, owners: o } of edges.values()) {\n if (o === 0n) continue;\n origin.push(u, v);\n owners.push(o);\n }\n return { xs: pool.xs, ys: pool.ys, origin, next: linkFaces(pool.xs, pool.ys, origin), owners };\n}\n","/**\n * The faces of an {@link Arrangement}, each labeled with the inputs covering it.\n */\nimport type { MultiPolygon, Polygon, Ring } from './adapter';\nimport { buildArrangement, type Arrangement } from './arrangement';\n\n/** A connected region every point of which lies in exactly the inputs `mask` names. */\nexport interface ArrangementFace {\n mask: bigint;\n polygon: Polygon;\n}\n\ninterface Cycle {\n edges: number[];\n area: number;\n component: number;\n minX: number; maxX: number; minY: number; maxY: number;\n}\n\nfunction components(arr: Arrangement): number[] {\n const parent = arr.xs.map((_, i) => i);\n const find = (v: number): number => {\n while (parent[v] !== v) { parent[v] = parent[parent[v]!]!; v = parent[v]!; }\n return v;\n };\n for (let h = 0; h < arr.origin.length; h += 2) parent[find(arr.origin[h]!)] = find(arr.origin[h + 1]!);\n return arr.xs.map((_, v) => find(v));\n}\n\nfunction traceCycles(arr: Arrangement, compOf: number[]): { cycles: Cycle[]; cycleOf: number[] } {\n const cycleOf: number[] = new Array(arr.origin.length).fill(-1);\n const cycles: Cycle[] = [];\n for (let start = 0; start < arr.origin.length; start++) {\n if (cycleOf[start] !== -1) continue;\n const c: Cycle = { edges: [], area: 0, component: compOf[arr.origin[start]!]!, minX: Infinity, maxX: -Infinity, minY: Infinity, maxY: -Infinity };\n let h = start;\n do {\n cycleOf[h] = cycles.length;\n c.edges.push(h);\n const x0 = arr.xs[arr.origin[h]!]!, y0 = arr.ys[arr.origin[h]!]!;\n const x1 = arr.xs[arr.origin[h ^ 1]!]!, y1 = arr.ys[arr.origin[h ^ 1]!]!;\n c.area += (x0 * y1 - x1 * y0) / 2;\n c.minX = Math.min(c.minX, x0); c.maxX = Math.max(c.maxX, x0);\n c.minY = Math.min(c.minY, y0); c.maxY = Math.max(c.maxY, y0);\n h = arr.next[h]!;\n } while (h !== start);\n cycles.push(c);\n }\n return { cycles, cycleOf };\n}\n\n/** Which inputs hold the point `(px, py)`, counting only edges outside `component`. */\nfunction coverAt(arr: Arrangement, compOf: number[], component: number, px: number, py: number): bigint {\n let mask = 0n;\n for (let h = 0; h < arr.origin.length; h += 2) {\n const u = arr.origin[h]!, v = arr.origin[h + 1]!;\n if (compOf[u] === component) continue;\n const y0 = arr.ys[u]!, y1 = arr.ys[v]!;\n if ((y0 > py) === (y1 > py)) continue;\n const x = arr.xs[u]! + ((py - y0) / (y1 - y0)) * (arr.xs[v]! - arr.xs[u]!);\n if (x < px) mask ^= arr.owners[h >> 1]!;\n }\n return mask;\n}\n\nfunction ringOf(arr: Arrangement, cycle: Cycle): Ring {\n const ring: Ring = cycle.edges.map((h) => [arr.xs[arr.origin[h]!]!, arr.ys[arr.origin[h]!]!]);\n ring.push([ring[0]![0], ring[0]![1]]);\n return ring;\n}\n\nfunction ringHolds(ring: Ring, px: number, py: number): boolean {\n let inside = false;\n for (let k = 0; k + 1 < ring.length; k++) {\n const [x0, y0] = ring[k]!;\n const [x1, y1] = ring[k + 1]!;\n if ((y0 > py) !== (y1 > py) && px < x0 + ((py - y0) / (y1 - y0)) * (x1 - x0)) inside = !inside;\n }\n return inside;\n}\n\nfunction popcount(mask: bigint): number {\n let c = 0;\n for (let m = mask; m; m &= m - 1n) c++;\n return c;\n}\n\n/**\n * Every face the boundaries of `inputs` cut the plane into that some input\n * covers, with its holes. Inputs must be clean polygon sets — rings that do\n * not cross themselves or each other, as `polygon-clipping` returns them — so\n * crossing an input's boundary always toggles it. Faces come smallest `mask`\n * population first, then by `mask`, then left to right.\n */\nexport function arrangementFaces(inputs: readonly MultiPolygon[]): ArrangementFace[] {\n const arr = buildArrangement(inputs);\n const compOf = components(arr);\n const { cycles, cycleOf } = traceCycles(arr, compOf);\n\n // Each component's outer boundary is its one clockwise cycle.\n const outerOf = new Map<number, number>();\n cycles.forEach((c, i) => {\n const best = outerOf.get(c.component);\n if (best === undefined || c.area < cycles[best]!.area) outerOf.set(c.component, i);\n });\n\n const label: (bigint | undefined)[] = new Array(cycles.length);\n for (const [component, outer] of outerOf) {\n const v = arr.origin[cycles[outer]!.edges[0]!]!;\n label[outer] = coverAt(arr, compOf, component, arr.xs[v]!, arr.ys[v]!);\n const queue = [outer];\n while (queue.length > 0) {\n const f = queue.pop()!;\n for (const h of cycles[f]!.edges) {\n const g = cycleOf[h ^ 1]!;\n if (label[g] !== undefined) continue;\n label[g] = label[f]! ^ arr.owners[h >> 1]!;\n queue.push(g);\n }\n }\n }\n\n let extent = 1;\n for (let v = 0; v < arr.xs.length; v++) extent = Math.max(extent, Math.abs(arr.xs[v]!), Math.abs(arr.ys[v]!));\n const minArea = 1e-12 * extent * extent;\n const faces = new Map<number, ArrangementFace>();\n cycles.forEach((c, i) => {\n if (c.area > minArea && label[i]) faces.set(i, { mask: label[i]!, polygon: [ringOf(arr, c)] });\n });\n\n // A component's outer boundary is a hole in the smallest face of another\n // component that holds it.\n for (const [component, outer] of outerOf) {\n const v = arr.origin[cycles[outer]!.edges[0]!]!;\n const px = arr.xs[v]!, py = arr.ys[v]!;\n let host = -1;\n cycles.forEach((c, i) => {\n if (c.component === component || c.area <= minArea) return;\n if (px < c.minX || px > c.maxX || py < c.minY || py > c.maxY) return;\n if (host !== -1 && cycles[host]!.area <= c.area) return;\n if (ringHolds(ringOf(arr, c), px, py)) host = i;\n });\n faces.get(host)?.polygon.push(ringOf(arr, cycles[outer]!));\n }\n\n const left = (f: ArrangementFace) => Math.min(...f.polygon[0]!.map((p) => p[0]));\n const low = (f: ArrangementFace) => Math.min(...f.polygon[0]!.map((p) => p[1]));\n return [...faces.values()].sort((a, b) =>\n popcount(a.mask) - popcount(b.mask)\n || (a.mask < b.mask ? -1 : a.mask > b.mask ? 1 : 0)\n || left(a) - left(b) || low(a) - low(b));\n}\n","/**\n * Polygon-boolean operations on `Path` values, backed by `polygon-clipping`.\n *\n * - Bezier inputs are flattened to straight-line segments before clipping,\n * so the result contains only M/L/Z commands.\n * - Open contours are treated as closed (a polyline has zero area and would\n * otherwise be silently dropped).\n * - Output `fillRule` is always `'nonzero'`.\n *\n * This is the only geom module that depends on `polygon-clipping`; it lives in\n * the `@weasel-js/geom/booleans` subpath so the core stays `deps: {}`.\n */\nimport polygonClipping from 'polygon-clipping';\nimport { pathToMultiPolygon, multiPolygonToPath, type MultiPolygon, type Polygon } from './adapter';\nimport { arrangementFaces } from './arrangementFaces';\nimport type { Path, PolygonPath } from '../path';\nimport { keepCorners } from '../paths/cornerRestore';\n\n/** `mp` as a path, with the corners of `sources` it still draws whole kept as corners. */\nfunction toPath(mp: MultiPolygon, sources: readonly Path[]): PolygonPath {\n return keepCorners(sources, multiPolygonToPath(mp));\n}\n\n/** Union of N paths. Commutative. Returns an empty path if all inputs are empty. */\nexport function pathUnion(...paths: Path[]): PolygonPath {\n if (paths.length === 0) return multiPolygonToPath([]);\n const mps = paths.map((p) => pathToMultiPolygon(p));\n const [head, ...rest] = mps;\n return toPath(polygonClipping.union(head, ...rest), paths);\n}\n\n/** Intersection of N paths. Commutative. Empty result is an empty path. */\nexport function pathIntersect(...paths: Path[]): PolygonPath {\n if (paths.length === 0) return multiPolygonToPath([]);\n const mps = paths.map((p) => pathToMultiPolygon(p));\n const [head, ...rest] = mps;\n return toPath(polygonClipping.intersection(head, ...rest), paths);\n}\n\n/** Asymmetric difference: returns `a − b`. */\nexport function pathSubtract(a: Path, b: Path): PolygonPath {\n return toPath(polygonClipping.difference(pathToMultiPolygon(a), pathToMultiPolygon(b)), [a, b]);\n}\n\n/** Symmetric difference (XOR) of N paths. Commutative. */\nexport function pathExclude(...paths: Path[]): PolygonPath {\n if (paths.length === 0) return multiPolygonToPath([]);\n const mps = paths.map((p) => pathToMultiPolygon(p));\n const [head, ...rest] = mps;\n return toPath(polygonClipping.xor(head, ...rest), paths);\n}\n\n/** One path of a result that keeps its pieces apart, and the inputs it came\n * from: their indices in the call, ascending, so the last is the topmost of\n * inputs given back to front. */\nexport interface BooleanPiece {\n path: PolygonPath;\n sources: number[];\n}\n\n/** {@link pathDividePieces} as bare paths. */\nexport function pathDivide(...paths: Path[]): PolygonPath[] {\n return pathDividePieces(...paths).map((p) => p.path);\n}\n\n/** {@link pathCropPieces} as bare paths. */\nexport function pathCrop(...paths: Path[]): PolygonPath[] {\n return pathCropPieces(...paths).map((p) => p.path);\n}\n\n/** The faces the paths' outlines cut the plane into, each naming the inputs covering it. */\nfunction faces(paths: Path[]): { polygon: Polygon; sources: number[] }[] {\n const clean = paths.map((p) => {\n const mp = pathToMultiPolygon(p);\n return mp.length === 0 ? mp : polygonClipping.union(mp);\n });\n return arrangementFaces(clean).map(({ mask, polygon }) => {\n const sources: number[] = [];\n for (let i = 0; i < paths.length; i++) if (mask & (1n << BigInt(i))) sources.push(i);\n return { polygon, sources };\n });\n}\n\n/**\n * Fracture N paths along every intersection into the maximal set of\n * non-overlapping regions. Returns one piece per set of inputs covering some\n * region, naming them. For N=2 these are the three Illustrator \"Divide\"\n * outputs (A−B, B−A, A∩B). Pieces with fewer sources come first.\n */\nexport function pathDividePieces(...paths: Path[]): BooleanPiece[] {\n const regions = new Map<string, { polygons: Polygon[]; sources: number[] }>();\n for (const { polygon, sources } of faces(paths)) {\n const key = sources.join(',');\n const region = regions.get(key);\n if (region) region.polygons.push(polygon);\n else regions.set(key, { polygons: [polygon], sources });\n }\n return [...regions.values()].map(({ polygons, sources }) => ({ path: toPath(polygons, paths), sources }));\n}\n\n/**\n * The faces the paths cut each other into: {@link pathDividePieces}, with a\n * region that falls apart split into one piece per connected part. A face\n * keeps its holes. Same order, a region's parts left to right.\n *\n * Traces the arrangement of the outlines once, so the cost grows with the\n * edges and their crossings rather than with the subsets of the inputs.\n */\nexport function pathFacePieces(...paths: Path[]): BooleanPiece[] {\n return faces(paths).map(({ polygon, sources }) => ({ path: toPath([polygon], paths), sources }));\n}\n\n/**\n * Remove from each path what the paths after it cover (Illustrator \"Trim\"):\n * given back to front, every piece is the part of its input left showing.\n * One piece per input in input order, less the inputs wholly hidden.\n */\nexport function pathTrim(...paths: Path[]): BooleanPiece[] {\n const mps = paths.map((p) => pathToMultiPolygon(p));\n const out: BooleanPiece[] = [];\n // Front to back, so the cover over each input is built once.\n let cover: (typeof mps)[number] | null = null;\n for (let i = mps.length - 1; i >= 0; i--) {\n const shown = cover ? polygonClipping.difference(mps[i], cover) : mps[i];\n if (shown.length > 0) out.unshift({ path: toPath(shown, paths), sources: [i] });\n cover = cover ? polygonClipping.union(cover, mps[i]) : mps[i];\n }\n return out;\n}\n\n/**\n * {@link pathTrim}, then unite the pieces of the inputs `keyOf` gives the same\n * key (Illustrator \"Merge\", keyed by paint). Keys compare with `===`. A piece\n * names every input left showing in it, and the pieces are ordered by their\n * topmost one. Pieces that share a key and do not touch come back as one path\n * of several contours.\n */\nexport function pathMerge(paths: readonly Path[], keyOf: (index: number) => unknown): BooleanPiece[] {\n const groups = new Map<unknown, BooleanPiece[]>();\n for (const piece of pathTrim(...paths)) {\n const key = keyOf(piece.sources[0]!);\n const group = groups.get(key);\n if (group) group.push(piece);\n else groups.set(key, [piece]);\n }\n const top = (p: BooleanPiece): number => p.sources[p.sources.length - 1]!;\n return [...groups.values()]\n .map((g): BooleanPiece => (g.length === 1 ? g[0]! : {\n path: pathUnion(...g.map((p) => p.path)),\n sources: g.map((p) => p.sources[0]!),\n }))\n .sort((a, b) => top(a) - top(b));\n}\n\n/**\n * Clip each non-topmost path to the topmost path (Illustrator \"Crop\"), which\n * acts purely as the mask and is discarded. Returns up to `N - 1` pieces in\n * input order, each naming the one input it was clipped from; a source\n * entirely outside the mask is dropped.\n */\nexport function pathCropPieces(...paths: Path[]): BooleanPiece[] {\n if (paths.length < 2) return [];\n const mps = paths.map((p) => pathToMultiPolygon(p));\n const mask = mps[mps.length - 1];\n const out: BooleanPiece[] = [];\n for (let i = 0; i < mps.length - 1; i++) {\n const clipped = polygonClipping.intersection(mps[i], mask);\n if (clipped.length > 0) out.push({ path: toPath(clipped, paths), sources: [i] });\n }\n return out;\n}\n","/**\n * The outline of a triangle mesh: the union of its triangles as one path.\n * This is what turns a tessellated shape back into geometry, e.g. a stroke's\n * ribbon into the region the stroke covers.\n */\nimport polygonClipping from 'polygon-clipping';\nimport { multiPolygonToPath, type MultiPolygon } from './adapter';\nimport type { PolygonPath } from '../path';\n\n/**\n * Union the triangles of an indexed mesh (`vertices` as x, y pairs; `indices`\n * three per triangle) into canonical, non-overlapping rings. Overlaps count\n * once, and triangles with no area are skipped. The result holds only M/L/Z.\n */\nexport function trianglesToPath(vertices: ArrayLike<number>, indices: ArrayLike<number>): PolygonPath {\n const triangles: MultiPolygon[] = [];\n for (let i = 0; i + 2 < indices.length; i += 3) {\n const a = indices[i] * 2, b = indices[i + 1] * 2, c = indices[i + 2] * 2;\n const ax = vertices[a], ay = vertices[a + 1];\n const bx = vertices[b], by = vertices[b + 1];\n const cx = vertices[c], cy = vertices[c + 1];\n if ((bx - ax) * (cy - ay) - (cx - ax) * (by - ay) === 0) continue;\n triangles.push([[[[ax, ay], [bx, by], [cx, cy], [ax, ay]]]]);\n }\n if (triangles.length === 0) return multiPolygonToPath([]);\n const [head, ...rest] = triangles;\n return multiPolygonToPath(polygonClipping.union(head, ...rest));\n}\n","/** Where a cut crosses the contours of a path. */\n\nimport type { Point } from '../paths/cubicMath';\nimport { type Contour, type Station, evalSeg, sideCoeffs, signChanges, endSide } from './contourSegments';\n\nexport interface Crossing extends Station {\n contour: number;\n /** Position along the cut: cut segment k runs from k to k + 1. */\n s: number;\n /** True where the cut, going forward, enters the filled region. */\n enters: boolean;\n}\n\n/**\n * Where along cut segment `k` of `cut` a point on its line falls, as a\n * position on the whole cut, or null when it is off that segment. A point at a\n * joint belongs to the segment that starts there, so it is counted once.\n */\nexport function cutPosition(cut: Point[], k: number, pt: Point): number | null {\n const a = cut[k], b = cut[k + 1];\n const d = { x: b.x - a.x, y: b.y - a.y };\n const s = ((pt.x - a.x) * d.x + (pt.y - a.y) * d.y) / (d.x * d.x + d.y * d.y);\n const eps = 1e-9;\n const last = k + 2 === cut.length;\n if (s < (k === 0 ? 0 : -eps)) return null;\n if (last ? s > 1 : s >= 1 - eps) return null;\n return k + Math.min(1, Math.max(0, s));\n}\n\n/** Every point where the boundary crosses the cut, sorted along it. */\nexport function findCrossings(boundaries: Contour[], cut: Point[]): Crossing[] {\n const out: Crossing[] = [];\n for (let k = 0; k + 1 < cut.length; k++) crossingsOnSegment(boundaries, cut, k, out);\n return out.sort((x, y) => x.s - y.s);\n}\n\nfunction crossingsOnSegment(boundaries: Contour[], cut: Point[], k: number, out: Crossing[]): void {\n const a = cut[k];\n const d = { x: cut[k + 1].x - a.x, y: cut[k + 1].y - a.y };\n const push = (contour: number, seg: number, t: number, before: number, after: number) => {\n const pt = evalSeg(boundaries[contour][seg], t);\n const s = cutPosition(cut, k, pt);\n if (s === null) return;\n // Fill is on the boundary's left: crossing from the cut's left to its right is an entry.\n out.push({ contour, seg, t, pt, s, enters: before > 0 && after < 0 });\n };\n\n boundaries.forEach((contour, ci) => {\n const fs = contour.map((s) => sideCoeffs(s, a, d));\n const n = contour.length;\n fs.forEach((f, si) => {\n for (const c of signChanges(f, false)) push(ci, si, c.t, c.before, c.after);\n if (f[0] !== 0) return;\n // The segment passes through this vertex. Where the boundary runs along\n // the cut, the crossing is taken at the end of the run.\n const after = endSide(f, true);\n if (after === 0) return;\n let before = 0;\n for (let k = 1; k <= n && before === 0; k++) before = endSide(fs[(si - k + n) % n], false);\n if (before !== 0 && before !== after) push(ci, si, 0, before, after);\n });\n });\n}\n","/** The cut polyline itself: where it crosses itself, and the loops it closes inside a path. */\n\nimport { pointInPolygon } from '../polyline';\nimport type { Point } from '../paths/cubicMath';\nimport { type Contour, evalSeg, reverseContour, sampleContour, signedArea } from './contourSegments';\nimport { type Crossing, findCrossings } from './cutCrossings';\nimport { windingAt, negligibleArea } from './contours';\n\nexport function distinctPoints(cut: readonly Point[]): Point[] {\n const out: Point[] = [];\n for (const p of cut) {\n const q = out[out.length - 1];\n if (!q || q.x !== p.x || q.y !== p.y) out.push({ x: p.x, y: p.y });\n }\n return out;\n}\n\n/** The stretch of the cut from one crossing to a later one. */\nexport function cutBetween(cut: Point[], from: Crossing, to: Crossing): Point[] {\n const out = [from.pt];\n for (let v = Math.floor(from.s) + 1; v < to.s; v++) out.push(cut[v]);\n out.push(to.pt);\n return out;\n}\n\n/** Where segments p0→p1 and q0→q1 cross at a point interior to both, or null. */\nfunction properCrossing(p0: Point, p1: Point, q0: Point, q1: Point): Point | null {\n const r = { x: p1.x - p0.x, y: p1.y - p0.y };\n const s = { x: q1.x - q0.x, y: q1.y - q0.y };\n const den = r.x * s.y - r.y * s.x;\n if (den === 0) return null;\n const qp = { x: q0.x - p0.x, y: q0.y - p0.y };\n const t = (qp.x * s.y - qp.y * s.x) / den;\n const u = (qp.x * r.y - qp.y * r.x) / den;\n const eps = 1e-9;\n if (t <= eps || t >= 1 - eps || u <= eps || u >= 1 - eps) return null;\n return { x: p0.x + t * r.x, y: p0.y + t * r.y };\n}\n\n/**\n * `run` split where it crosses its own track: each loop it closes, as the\n * ring of points from the crossing round to it again, and the spine left once\n * every loop is taken out. Loops are taken as they close, so each is simple.\n * A run ending where it started is itself a loop, and leaves no spine.\n */\nexport function splitLoops(run: Point[]): { spine: Point[]; loops: Point[][] } {\n const spine = [run[0]];\n const loops: Point[][] = [];\n for (let i = 1; i < run.length; i++) {\n const to = run[i];\n for (;;) {\n const from = spine[spine.length - 1];\n let hit: { j: number; x: Point; d: number } | null = null;\n for (let j = 0; j + 2 < spine.length; j++) {\n const x = properCrossing(from, to, spine[j], spine[j + 1]);\n if (!x) continue;\n const d = Math.hypot(x.x - from.x, x.y - from.y);\n if (!hit || d < hit.d) hit = { j, x, d };\n }\n if (!hit) { spine.push(to); break; }\n loops.push([hit.x, ...spine.slice(hit.j + 1)]);\n spine.length = hit.j + 1;\n spine.push(hit.x);\n }\n }\n const last = spine[spine.length - 1];\n if (spine.length >= 4 && last.x === spine[0].x && last.y === spine[0].y) {\n loops.push(spine.slice(0, -1));\n return { spine: [], loops };\n }\n return { spine, loops };\n}\n\n/** The point at position `s` along the cut. */\nfunction pointAt(cut: Point[], s: number): Point {\n const k = Math.min(Math.floor(s), cut.length - 2);\n const f = s - k;\n const a = cut[k], b = cut[k + 1];\n return { x: a.x + f * (b.x - a.x), y: a.y + f * (b.y - a.y) };\n}\n\n/**\n * A closed cut that crosses the boundary, turned to start and end outside\n * the fill so its chords read enter-then-exit like any other cut's. Any other\n * cut comes back unchanged.\n */\nexport function openClosedCut(cut: Point[], boundaries: Contour[]): Point[] {\n const n = cut.length - 1;\n if (n < 3 || cut[0].x !== cut[n].x || cut[0].y !== cut[n].y) return cut;\n const crossings = findCrossings(boundaries, cut);\n const k = crossings.findIndex((c) => !c.enters);\n if (k < 0) return cut;\n const next = k + 1 < crossings.length ? crossings[k + 1].s : crossings[0].s + n;\n const s = ((crossings[k].s + next) / 2) % n;\n const seg = Math.min(Math.floor(s), n - 1);\n const start = pointAt(cut, s);\n const ring = cut.slice(0, n);\n return distinctPoints([start, ...ring.slice(seg + 1), ...ring.slice(0, seg + 1), start]);\n}\n\n/**\n * The loops the cut closes inside the fill, each a ring of points. A loop\n * lies within one stretch of the cut between boundary crossings, so it\n * crosses no boundary. One that a chord of the cut, or an earlier loop, runs\n * through is left out.\n */\nexport function interiorLoops(cut: Point[], boundaries: Contour[]): Point[][] {\n const crossings = findCrossings(boundaries, cut);\n const chords: Point[][] = [];\n for (let k = 0; k + 1 < crossings.length; k++) {\n const c0 = crossings[k], c1 = crossings[k + 1];\n if (c0.enters && !c1.enters && c1.s - c0.s > 1e-9) chords.push(splitLoops(cutBetween(cut, c0, c1)).spine);\n }\n\n const last = cut.length - 1;\n const stops = [{ s: 0, pt: cut[0] }, ...crossings, { s: last, pt: cut[last] }];\n const rings: Point[][] = [];\n const loops: Point[][] = [];\n for (let i = 0; i + 1 < stops.length; i++) {\n const a = stops[i], b = stops[i + 1];\n if (b.s - a.s <= 1e-9) continue;\n if (windingAt(pointAt(cut, (a.s + b.s) / 2), boundaries) === 0) continue;\n const run = [a.pt];\n for (let v = Math.floor(a.s) + 1; v < b.s; v++) run.push(cut[v]);\n run.push(b.pt);\n for (const loop of splitLoops(distinctPoints(run)).loops) {\n const ring = [...loop, loop[0]];\n if (chords.some((c) => polylinesCross(ring, c)) || rings.some((r) => polylinesCross(ring, r))) continue;\n rings.push(ring);\n loops.push(loop);\n }\n }\n return loops;\n}\n\n/**\n * Cut each loop out of the region holding it: the loop, with whatever of that\n * region it encloses, becomes a region of its own, and the loop becomes a hole\n * in what is left. Edits `regions` in place; returns whether any loop cut.\n */\nexport function cutOutLoops(regions: Contour[][], loops: Point[][]): boolean {\n let cut = false;\n const minArea = negligibleArea(regions.flat());\n for (const loop of loops) {\n let ring: Contour = loop.map((p, i) => [p, loop[(i + 1) % loop.length]]);\n const a = signedArea(ring);\n if (Math.abs(a) <= minArea) continue;\n if (a < 0) ring = reverseContour(ring);\n const probe = evalSeg(ring[0], 0.5);\n const at = regions.findIndex((r) => windingAt(probe, r) !== 0);\n if (at < 0) continue;\n const samples = sampleContour(ring);\n const within = (c: Contour): boolean => {\n const p = evalSeg(c[0], 0.5);\n return pointInPolygon(samples, p.x, p.y);\n };\n const region = regions[at];\n regions[at] = [...region.filter((c) => !within(c)), reverseContour(ring)];\n regions.push([ring, ...region.filter(within)]);\n cut = true;\n }\n return cut;\n}\n\nexport function polylinesCross(a: Point[], b: Point[]): boolean {\n for (let i = 0; i + 1 < a.length; i++) {\n for (let j = 0; j + 1 < b.length; j++) {\n if (properCrossing(a[i], a[i + 1], b[j], b[j + 1])) return true;\n }\n }\n return false;\n}\n","/** Tracing the loops a cut divides a path's contours into. */\n\nimport type { Point } from '../paths/cubicMath';\nimport { type Seg, type Contour, type Station, subSeg } from './contourSegments';\nimport type { Crossing } from './cutCrossings';\n\n/**\n * Walk the boundary arcs between cut points and the chords that join them.\n * With the fill on every contour's left, each arc ending at a cut point\n * continues along that point's chord and then along the arc leaving the\n * chord's other end.\n */\nexport function traceLoops(\n boundaries: Contour[],\n partner: Map<Crossing, Crossing>,\n chord: Map<Crossing, Point[]>,\n): { loops: Contour[]; untouched: Contour[] } {\n const byContour = new Map<number, Crossing[]>();\n for (const c of partner.keys()) {\n const list = byContour.get(c.contour) ?? [];\n list.push(c);\n byContour.set(c.contour, list);\n }\n\n const arcFrom = new Map<Crossing, { segs: Seg[]; end: Crossing }>();\n const untouched: Contour[] = [];\n boundaries.forEach((contour, ci) => {\n const cuts = byContour.get(ci);\n if (!cuts) { untouched.push(contour); return; }\n cuts.sort((x, y) => x.seg - y.seg || x.t - y.t);\n for (let k = 0; k < cuts.length; k++) {\n const from = cuts[k], to = cuts[(k + 1) % cuts.length];\n arcFrom.set(from, { segs: arcBetween(contour, from, to, cuts.length === 1), end: to });\n }\n });\n\n const loops: Contour[] = [];\n const seen = new Set<Crossing>();\n for (const start of arcFrom.keys()) {\n if (seen.has(start)) continue;\n const loop: Contour = [];\n let at = start;\n while (!seen.has(at)) {\n seen.add(at);\n const arc = arcFrom.get(at)!;\n loop.push(...arc.segs);\n const run = chord.get(arc.end)!;\n for (let i = 0; i + 1 < run.length; i++) loop.push([run[i], run[i + 1]]);\n at = partner.get(arc.end)!;\n }\n loops.push(loop);\n }\n return { loops, untouched };\n}\n\n/** The boundary from one cut point forward to the next. */\nexport function arcBetween(contour: Contour, from: Station, to: Station, whole: boolean): Seg[] {\n const out: Seg[] = [];\n const add = (s: Seg | null) => { if (s) out.push(s); };\n if (!whole && to.seg === from.seg && to.t > from.t) {\n add(subSeg(contour[from.seg], from.t, to.t, from.pt, to.pt));\n return out;\n }\n const n = contour.length;\n const first = contour[from.seg];\n add(subSeg(first, from.t, 1, from.pt, first[first.length - 1]));\n for (let i = (from.seg + 1) % n; i !== to.seg; i = (i + 1) % n) out.push(contour[i]);\n const last = contour[to.seg];\n add(subSeg(last, 0, to.t, last[0], to.pt));\n return out;\n}\n","import type { Path, PathFillRule } from '../path';\nimport type { Point } from '../paths/cubicMath';\nimport { pathUnion } from './ops';\nimport { type Contour, type Station, evalSeg, signedArea, sideCoeffs, signChanges } from './contourSegments';\nimport { type Crossing, cutPosition, findCrossings } from './cutCrossings';\nimport {\n distinctPoints, cutBetween, splitLoops, openClosedCut, interiorLoops, cutOutLoops, polylinesCross,\n} from './cutPolyline';\nimport {\n parseContours, type Subpath, parseSubpaths, contoursIntersect, extentOf, negligibleArea, orientBoundaries,\n} from './contours';\nimport { traceLoops, arcBetween } from './cutLoops';\nimport { assembleRegions, regionArea, toPath, writePath } from './cutRegions';\n\nexport type { Point };\n\n/** Options for `splitPathBySegment` and `splitPathByPolyline`. */\nexport interface SplitBySegmentOptions {\n /**\n * Flattening tolerance for the check that decides whether contours cross\n * each other. Only a path whose contours do cross is flattened (see\n * `splitPathByPolyline`).\n */\n flattenTolerance?: number;\n}\n\n/**\n * Split `path` along the finite segment a→b into closed pieces (Knife).\n * The same as {@link splitPathByPolyline} with a two-point cut.\n */\nexport function splitPathBySegment(\n path: Path,\n a: Point,\n b: Point,\n opts: SplitBySegmentOptions = {},\n): Path[] | null {\n return splitPathByPolyline(path, [a, b], opts);\n}\n\n/**\n * Split `path` along the open polyline `cut` into closed pieces (Knife).\n *\n * Only chords the cut crosses end to end are cut: a stretch of the cut that\n * starts or stops inside the fill cuts nothing, and nothing beyond the cut's\n * ends is touched. Curves are split at the crossing parameters by de Casteljau\n * subdivision, so every piece keeps its quadratic and cubic segments; the new\n * edges follow the cut as straight lines, bends included.\n *\n * A loop the cut draws inside the fill, where it crosses its own track, cuts\n * out the region it encloses: that region is returned as its own piece, with\n * any hole it surrounds, and leaves a hole in the piece around it. A chord\n * running through a loop leaves the loop uncut. A closed cut (its last point\n * equal to its first) is one such loop or, where it crosses the boundary, is\n * cut as the chords it makes. Chords that cross each other are cut one after\n * another.\n *\n * Each connected piece the cut produces is returned as its own path, holes\n * included. Contours the cut misses entirely are returned together as one\n * final piece. A single chord that does not disconnect the shape (across a\n * ring, say) returns one slit piece.\n *\n * A path whose contours cross each other or themselves is first resolved into\n * non-overlapping rings by a polygon union, which flattens its curves.\n *\n * Returns `null` when no chord is cut.\n */\nexport function splitPathByPolyline(\n path: Path,\n cut: readonly Point[],\n opts: SplitBySegmentOptions = {},\n): Path[] | null {\n let pts = distinctPoints(cut);\n if (pts.length < 2) return null;\n const outRule = fillRuleOf(path);\n const boundaries = resolveBoundaries(path, opts);\n if (boundaries.length === 0) return null;\n\n pts = openClosedCut(pts, boundaries);\n const loops = interiorLoops(pts, boundaries);\n const pieces = knife(path, pts, opts, pts.length);\n if (loops.length === 0) return pieces;\n\n const regions = pieces ? pieces.map((p) => orientBoundaries(parseContours(p), outRule)) : [boundaries];\n if (!cutOutLoops(regions, loops)) return pieces;\n return regions.map((r) => toPath(r, outRule));\n}\n\nconst fillRuleOf = (path: Path): PathFillRule => (path.kind === 'polygon' ? path.fillRule : 'nonzero');\n\n/** The contours bounding `path`'s fill, fill on their left. Contours that\n * cross are first resolved by a union. */\nfunction resolveBoundaries(path: Path, opts: SplitBySegmentOptions): Contour[] {\n const contours = parseContours(path);\n if (contoursIntersect(contours, opts.flattenTolerance ?? 0.5)) {\n return orientBoundaries(parseContours(pathUnion(path)), 'nonzero');\n }\n return orientBoundaries(contours, fillRuleOf(path));\n}\n\nfunction knife(path: Path, cut: Point[], opts: SplitBySegmentOptions, budget: number): Path[] | null {\n const outRule = fillRuleOf(path);\n const boundaries = resolveBoundaries(path, opts);\n if (boundaries.length === 0) return null;\n\n const crossings = findCrossings(boundaries, cut);\n const partner = new Map<Crossing, Crossing>();\n const chord = new Map<Crossing, Point[]>();\n const accepted: Point[][] = [];\n let deferred = false;\n for (let k = 0; k + 1 < crossings.length; k++) {\n const c0 = crossings[k], c1 = crossings[k + 1];\n if (!c0.enters || c1.enters || c1.s - c0.s <= 1e-9) continue;\n const run = splitLoops(cutBetween(cut, c0, c1)).spine;\n if (accepted.some((other) => polylinesCross(run, other))) { deferred = true; continue; }\n accepted.push(run);\n partner.set(c0, c1);\n partner.set(c1, c0);\n chord.set(c0, run);\n chord.set(c1, run.slice().reverse());\n }\n if (partner.size === 0) return null;\n\n const { loops, untouched } = traceLoops(boundaries, partner, chord);\n\n const traced = assembleRegions(loops, untouched.filter((c) => signedArea(c) < 0));\n const islands = untouched.filter((c) => signedArea(c) > 0);\n const minArea = negligibleArea(boundaries);\n const regions: Contour[][] = traced.filter((r) => Math.abs(regionArea(r)) > minArea);\n if (islands.length > 0) {\n const leftover = untouched.filter((c) => !traced.some((r) => r.includes(c)));\n regions.push(leftover);\n }\n const pieces: Path[] = regions.map((r) => toPath(r, outRule));\n if (!deferred || budget <= 1) return pieces;\n return pieces.flatMap((p) => knife(p, cut, opts, budget - 1) ?? [p]);\n}\n\n/**\n * Split the stroke of `path` wherever the open polyline `cut` crosses it\n * (Scissors).\n *\n * Nothing is closed the way a fill closes it: an open subpath is cut into open\n * runs at each crossing, and a closed one is opened there, so a ring crossed\n * once becomes a single open run that starts and ends at the crossing. Curves\n * are split by de Casteljau subdivision, keeping their segment types. A\n * crossing at an end of an open subpath cuts nothing, and neither does a point\n * where the path only touches the cut.\n *\n * Each run is returned as its own path. Subpaths the cut misses are returned\n * together as one final piece.\n *\n * Returns `null` when nothing is cut.\n */\nexport function snipPathByPolyline(path: Path, cut: readonly Point[]): Path[] | null {\n const pts = distinctPoints(cut);\n if (pts.length < 2) return null;\n const rule: PathFillRule = path.kind === 'polygon' ? path.fillRule : 'nonzero';\n\n const runs: Contour[] = [];\n const missed: Subpath[] = [];\n for (const sub of parseSubpaths(path, false)) {\n const stops = snipStations(sub, pts);\n if (stops.length === 0) { missed.push(sub); continue; }\n const segs = sub.segs;\n if (sub.closed) {\n for (let i = 0; i < stops.length; i++) {\n runs.push(arcBetween(segs, stops[i], stops[(i + 1) % stops.length], stops.length === 1));\n }\n } else {\n const last = segs[segs.length - 1];\n const all: Station[] = [\n { seg: 0, t: 0, pt: segs[0][0] },\n ...stops,\n { seg: segs.length - 1, t: 1, pt: last[last.length - 1] },\n ];\n for (let i = 0; i + 1 < all.length; i++) runs.push(arcBetween(segs, all[i], all[i + 1], false));\n }\n }\n if (runs.length === 0) return null;\n\n const pieces = runs.filter((r) => r.length > 0).map((r) => writePath([{ segs: r, closed: false }], rule));\n if (missed.length > 0) pieces.push(writePath(missed, rule));\n return pieces;\n}\n\n/**\n * Where the cut splits one subpath, in order along it. Detections at one point\n * pair off: two there are the path touching the cut and leaving on the side it\n * came from.\n */\nfunction snipStations(sub: Subpath, cut: Point[]): Station[] {\n const raw: Station[] = [];\n sub.segs.forEach((seg, si) => {\n for (let k = 0; k + 1 < cut.length; k++) {\n const a = cut[k];\n const d = { x: cut[k + 1].x - a.x, y: cut[k + 1].y - a.y };\n for (const c of signChanges(sideCoeffs(seg, a, d), true)) {\n const pt = evalSeg(seg, c.t);\n if (cutPosition(cut, k, pt) !== null) raw.push({ seg: si, t: c.t, pt });\n }\n }\n });\n raw.sort((x, y) => x.seg - y.seg || x.t - y.t);\n\n const tol = extentOf([sub.segs]) * 1e-9;\n const same = (p: Point, q: Point) => Math.abs(p.x - q.x) <= tol && Math.abs(p.y - q.y) <= tol;\n const groups: Station[][] = [];\n for (const st of raw) {\n const g = groups[groups.length - 1];\n if (g && same(g[0].pt, st.pt)) g.push(st); else groups.push([st]);\n }\n if (sub.closed && groups.length > 1 && same(groups[0][0].pt, groups[groups.length - 1][0].pt)) {\n groups[0].push(...groups.pop()!);\n }\n const first = sub.segs[0][0];\n const lastSeg = sub.segs[sub.segs.length - 1];\n const end = lastSeg[lastSeg.length - 1];\n return groups\n .filter((g) => g.length % 2 === 1)\n .map((g) => g[0])\n .filter((st) => sub.closed || (!same(st.pt, first) && !same(st.pt, end)));\n}\n","import type { Path } from '../path';\nimport type { Point } from '../paths/cubicMath';\nimport { flattenCubic, flattenQuadratic } from '../flatten';\nimport { parseSubpaths } from './contours';\nimport { snipPathByPolyline } from './splitBySegment';\nimport { keepCorners } from '../paths/cornerRestore';\n\n/** Options for {@link snipPathsAtCrossings}. */\nexport interface SnipAtCrossingsOptions {\n /** How closely a cutting path's curves are followed when they are flattened\n * to find where they cross. Default 0.05. */\n flattenTolerance?: number;\n}\n\n/**\n * Cut the stroke of every path in `paths` wherever another of them crosses\n * it, as {@link snipPathByPolyline} cuts along one polyline: an open subpath\n * becomes open runs between crossings, and a closed one is opened at them.\n * A path is not cut where it crosses itself.\n *\n * Answers one entry per path, in order: its pieces, or `null` when no other\n * path crosses it. The cutting paths' curves are flattened, so a crossing on\n * a curve is found to within `flattenTolerance`; the pieces keep their own\n * segment types.\n */\nexport function snipPathsAtCrossings(\n paths: readonly Path[],\n opts: SnipAtCrossingsOptions = {},\n): (Path[] | null)[] {\n const tol = opts.flattenTolerance ?? 0.05;\n const cuts = paths.map((p) => cutLinesOf(p, tol));\n return paths.map((path, i) => {\n let pieces: Path[] = [path];\n let cut = false;\n cuts.forEach((lines, j) => {\n if (j === i) return;\n for (const line of lines) {\n pieces = pieces.flatMap((piece) => {\n const snipped = snipPathByPolyline(piece, line);\n if (!snipped) return [piece];\n cut = true;\n return snipped;\n });\n }\n });\n return cut ? pieces.map((piece) => (piece.kind === 'polygon' ? keepCorners([path], piece) : piece)) : null;\n });\n}\n\n/** `path`'s subpaths as polylines, a closed one ending where it began. */\nfunction cutLinesOf(path: Path, tol: number): Point[][] {\n return parseSubpaths(path, false).map(({ segs, closed }) => {\n const flat: number[] = [segs[0][0].x, segs[0][0].y];\n for (const s of segs) {\n if (s.length === 2) flat.push(s[1].x, s[1].y);\n else if (s.length === 3) flattenQuadratic(s[0].x, s[0].y, s[1].x, s[1].y, s[2].x, s[2].y, tol, flat);\n else flattenCubic(s[0].x, s[0].y, s[1].x, s[1].y, s[2].x, s[2].y, s[3].x, s[3].y, tol, flat);\n }\n const pts: Point[] = [];\n for (let k = 0; k < flat.length; k += 2) pts.push({ x: flat[k], y: flat[k + 1] });\n if (closed) {\n const end = pts[pts.length - 1];\n if (end.x !== pts[0].x || end.y !== pts[0].y) pts.push({ ...pts[0] });\n }\n return pts;\n });\n}\n"]}
@@ -1,41 +1,10 @@
1
- import { DEFAULT_FLATTEN_TOLERANCE, flattenCubicWithArcLen, flattenQuadraticWithArcLen } from './chunk-IDXY2NCA.js';
2
- import { forEachSegment, PATH_Z, PATH_C, PATH_Q, PATH_L, PATH_M } from './chunk-OXH3NOXC.js';
3
-
4
- // src/box.ts
5
- function boundsOfCoords(coords) {
6
- if (coords.length < 2) return null;
7
- let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;
8
- for (let i = 0; i + 1 < coords.length; i += 2) {
9
- const x = coords[i], y = coords[i + 1];
10
- if (x < minX) minX = x;
11
- if (y < minY) minY = y;
12
- if (x > maxX) maxX = x;
13
- if (y > maxY) maxY = y;
14
- }
15
- return [minX, minY, maxX, maxY];
16
- }
17
- function unionBox(a, b) {
18
- return [
19
- Math.min(a[0], b[0]),
20
- Math.min(a[1], b[1]),
21
- Math.max(a[2], b[2]),
22
- Math.max(a[3], b[3])
23
- ];
24
- }
25
- function boxContainsPoint(b, x, y) {
26
- return x >= b[0] && x <= b[2] && y >= b[1] && y <= b[3];
27
- }
28
- function boxContainsBox(outer, inner) {
29
- return inner[0] >= outer[0] && inner[1] >= outer[1] && inner[2] <= outer[2] && inner[3] <= outer[3];
30
- }
31
- function rectToContour(x, y, w, h) {
32
- return Float64Array.of(x, y, x + w, y, x + w, y + h, x, y + h);
33
- }
1
+ import { resolveCorners, DEFAULT_FLATTEN_TOLERANCE, flattenCubicWithArcLen, flattenQuadraticWithArcLen } from './chunk-J2O2B54M.js';
2
+ import { rectToContour, forEachSegment, PATH_Z, PATH_C, PATH_Q, PATH_L, PATH_M } from './chunk-B53BERKG.js';
34
3
 
35
4
  // src/tessellate/polyline.ts
36
5
  function extractPolylines(path, opts = {}) {
37
6
  if (path.kind === "rect") return [extractRect(path)];
38
- return extractPolygon(path, opts);
7
+ return extractPolygon(resolveCorners(path), opts);
39
8
  }
40
9
  function extractRect(p) {
41
10
  const { x, y, width: w, height: h } = p;
@@ -180,6 +149,6 @@ function extractPolygon(p, opts) {
180
149
  return out;
181
150
  }
182
151
 
183
- export { boundsOfCoords, boxContainsBox, boxContainsPoint, extractPolylines, rectToContour, unionBox };
184
- //# sourceMappingURL=chunk-7WFFCHRL.js.map
185
- //# sourceMappingURL=chunk-7WFFCHRL.js.map
152
+ export { extractPolylines };
153
+ //# sourceMappingURL=chunk-6XSJY3TC.js.map
154
+ //# sourceMappingURL=chunk-6XSJY3TC.js.map