@weasel-js/geom 1.15.1 → 1.15.2

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 (47) hide show
  1. package/dist/3d/index.d.ts +3 -1
  2. package/dist/3d/index.js +7 -10
  3. package/dist/3d/index.js.map +1 -1
  4. package/dist/booleans/index.js +4 -5
  5. package/dist/booleans/index.js.map +1 -1
  6. package/dist/{chunk-B3D6KWW3.js → chunk-346XYYMX.js} +154 -3
  7. package/dist/chunk-346XYYMX.js.map +1 -0
  8. package/dist/chunk-DNX24KBT.js +82 -0
  9. package/dist/chunk-DNX24KBT.js.map +1 -0
  10. package/dist/{chunk-EURWZUNY.js → chunk-GA5R5KWD.js} +59 -65
  11. package/dist/chunk-GA5R5KWD.js.map +1 -0
  12. package/dist/{chunk-3HQJGI63.js → chunk-HTT5AQIU.js} +3 -4
  13. package/dist/chunk-HTT5AQIU.js.map +1 -0
  14. package/dist/{chunk-FROQPADA.js → chunk-IDSKOHA4.js} +4 -4
  15. package/dist/{chunk-FROQPADA.js.map → chunk-IDSKOHA4.js.map} +1 -1
  16. package/dist/{chunk-HMGGJZTM.js → chunk-MIKP4V2C.js} +7 -21
  17. package/dist/chunk-MIKP4V2C.js.map +1 -0
  18. package/dist/{chunk-HNLJO3E7.js → chunk-MOCSUHEI.js} +22 -8
  19. package/dist/chunk-MOCSUHEI.js.map +1 -0
  20. package/dist/{chunk-3YH5XU3H.js → chunk-OQP5M5VD.js} +14 -23
  21. package/dist/chunk-OQP5M5VD.js.map +1 -0
  22. package/dist/{chunk-ZOMUTU7J.js → chunk-STYO7J4Y.js} +5 -11
  23. package/dist/chunk-STYO7J4Y.js.map +1 -0
  24. package/dist/{curvature-CDOI32hv.d.ts → curvature-DKPO4Qeh.d.ts} +0 -27
  25. package/dist/curves/index.d.ts +1 -1
  26. package/dist/curves/index.js +4 -4
  27. package/dist/index.d.ts +108 -3
  28. package/dist/index.js +159 -162
  29. package/dist/index.js.map +1 -1
  30. package/dist/nd/index.d.ts +28 -1
  31. package/dist/nd/index.js +2 -5
  32. package/dist/nd/index.js.map +1 -1
  33. package/dist/tessellate/index.js +5 -5
  34. package/dist/warp/index.js +8 -15
  35. package/dist/warp/index.js.map +1 -1
  36. package/package.json +1 -1
  37. package/dist/chunk-2N6OWA7E.js +0 -104
  38. package/dist/chunk-2N6OWA7E.js.map +0 -1
  39. package/dist/chunk-3HQJGI63.js.map +0 -1
  40. package/dist/chunk-3YH5XU3H.js.map +0 -1
  41. package/dist/chunk-755Y4YZS.js +0 -32
  42. package/dist/chunk-755Y4YZS.js.map +0 -1
  43. package/dist/chunk-B3D6KWW3.js.map +0 -1
  44. package/dist/chunk-EURWZUNY.js.map +0 -1
  45. package/dist/chunk-HMGGJZTM.js.map +0 -1
  46. package/dist/chunk-HNLJO3E7.js.map +0 -1
  47. package/dist/chunk-ZOMUTU7J.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/booleans/adapter.ts","../../src/booleans/arrangement.ts","../../src/booleans/arrangementFaces.ts","../../src/booleans/curveOverlap.ts","../../src/booleans/curveEdges.ts","../../src/booleans/curveClassify.ts","../../src/booleans/curveTrace.ts","../../src/booleans/curveBoolean.ts","../../src/booleans/curvePieces.ts","../../src/booleans/ops.ts","../../src/booleans/meshJunctions.ts","../../src/booleans/meshOutline.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":["filled","winding","v","angle","faces","i","along","t","loops","clockwise","toPath","shown","polygonClipping","k","traceLoops","runs","all"],"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';\nimport { coordsFrom, originFor, worldCoords } from '../paths/pathOrigin';\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 } = path;\n const coords = worldCoords(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 world = new Float64Array(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 world[pi++] = ring[0][0];\n world[pi++] = ring[0][1];\n for (let k = 1; k < unique; k++) {\n commands[ci++] = PATH_L;\n world[pi++] = ring[k][0];\n world[pi++] = ring[k][1];\n }\n commands[ci++] = PATH_Z;\n }\n }\n const origin = originFor(world);\n return { kind: 'polygon', commands, coords: coordsFrom(origin, world), fillRule: 'nonzero', ...(origin ? { origin } : {}) };\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","/** Outlines that run along each other: where a shared stretch starts and ends, and its pieces made one edge. */\n\nimport type { Point } from '../paths/cubicMath';\nimport { nearestOnCubic, nearestOnLine, nearestOnQuadratic, type CurveNearest } from '../nearest';\nimport { type Seg, evalSeg } from './contourSegments';\nimport type { Edge } from './curveEdges';\n\n/** The point on `s` nearest `p`. */\nexport function nearestOnSeg(s: Seg, p: Point): CurveNearest {\n if (s.length === 2) return nearestOnLine(p.x, p.y, s[0].x, s[0].y, s[1].x, s[1].y);\n if (s.length === 3) return nearestOnQuadratic(p.x, p.y, s[0].x, s[0].y, s[1].x, s[1].y, s[2].x, s[2].y);\n return nearestOnCubic(p.x, p.y, s[0].x, s[0].y, s[1].x, s[1].y, s[2].x, s[2].y, s[3].x, s[3].y);\n}\n\n/** One end of a stretch two segments share: the parameter on each, and the point. */\nexport interface OverlapEnd {\n ta: number;\n tb: number;\n p: Point;\n}\n\n/** Interior samples a stretch must lie on the other segment at to count as shared. */\nconst SAMPLES = [0.25, 0.5, 0.75];\n\n/**\n * The ends of the stretch `a` and `b` share, or null when they share none.\n * Each end of a shared stretch is an end of one segment lying on the other,\n * so only those are tried: two segments of degree three or less that share a\n * stretch are pieces of one curve and cross nowhere else.\n */\nexport function sharedStretch(a: Seg, b: Seg, snap: number): [OverlapEnd, OverlapEnd] | null {\n const ends: OverlapEnd[] = [];\n const add = (e: OverlapEnd) => {\n if (!ends.some((f) => Math.hypot(f.p.x - e.p.x, f.p.y - e.p.y) <= snap)) ends.push(e);\n };\n for (const [tb, p] of [[0, b[0]], [1, b[b.length - 1]]] as const) {\n const n = nearestOnSeg(a, p);\n if (n.dist <= snap) add({ ta: n.t, tb, p });\n }\n for (const [ta, p] of [[0, a[0]], [1, a[a.length - 1]]] as const) {\n const n = nearestOnSeg(b, p);\n if (n.dist <= snap) add({ ta, tb: n.t, p });\n }\n let best: [OverlapEnd, OverlapEnd] | null = null;\n for (let i = 0; i < ends.length; i++) {\n for (let j = i + 1; j < ends.length; j++) {\n const [e, f] = ends[i].ta <= ends[j].ta ? [ends[i], ends[j]] : [ends[j], ends[i]];\n if (best && f.ta - e.ta <= best[1].ta - best[0].ta) continue;\n const on = SAMPLES.every((s) => nearestOnSeg(b, evalSeg(a, e.ta + (f.ta - e.ta) * s)).dist <= snap);\n if (on) best = [e, f];\n }\n }\n return best;\n}\n\n/** Whether `e` and `f` join the same two vertices along the same curve. */\nfunction coincide(e: Edge, f: Edge, snap: number): boolean {\n const same = e.from === f.from && e.to === f.to;\n if (!same && !(e.from === f.to && e.to === f.from)) return false;\n return SAMPLES.every((s) => nearestOnSeg(f.seg, evalSeg(e.seg, s)).dist <= snap);\n}\n\n/**\n * `edges` with every set of pieces lying along one another made one edge,\n * the first of them, naming the others in `also`.\n */\nexport function mergeCoincident(edges: readonly Edge[], snap: number): Edge[] {\n const byEnds = new Map<string, Edge[]>();\n const out: Edge[] = [];\n for (const e of edges) {\n const key = e.from < e.to ? `${e.from},${e.to}` : `${e.to},${e.from}`;\n const list = byEnds.get(key) ?? [];\n const twin = list.find((f) => coincide(f, e, snap));\n if (twin) {\n (twin.also ??= []).push({ operand: e.operand, sign: twin.from === e.from ? 1 : -1 });\n continue;\n }\n list.push(e);\n byEnds.set(key, list);\n out.push(e);\n }\n return out;\n}\n","/** The operands' outlines cut at every crossing into edges that meet only at their ends. */\n\nimport type { Point } from '../paths/cubicMath';\nimport { intersectSegments } from '../intersect/segmentIntersections';\nimport { type Seg, type Contour, evalSeg, subSeg } from './contourSegments';\nimport { mergeCoincident, sharedStretch } from './curveOverlap';\n\n/** One piece of an outline between two crossings, and where it came from. */\nexport interface Edge {\n seg: Seg;\n /** Vertex ids of its ends. */\n from: number;\n to: number;\n operand: number;\n /** The whole segment it was cut from, and the parameters it spans on it. */\n source: Seg;\n t0: number;\n t1: number;\n /** Orders edges by where they sit in the input. */\n key: number;\n /** Runs against its source curve. */\n reversed: boolean;\n /** Other operands' pieces lying along this one, each running with it (1) or against it (-1). */\n also?: { operand: number; sign: 1 | -1 }[];\n}\n\nexport interface Arrangement {\n edges: Edge[];\n points: Point[];\n}\n\n/** Two curves overlapping along a stretch report at most this many crossings. */\nconst OVERLAP_HITS = 16;\nconst END_T = 1e-9;\n\n/** Points within `snap` of each other are one vertex. */\nclass Vertices {\n readonly points: Point[] = [];\n private readonly grid = new Map<string, number[]>();\n constructor(private readonly snap: number) {}\n\n id(p: Point): number {\n const gx = Math.floor(p.x / this.snap), gy = Math.floor(p.y / this.snap);\n for (let dx = -1; dx <= 1; dx++) {\n for (let dy = -1; dy <= 1; dy++) {\n for (const i of this.grid.get(`${gx + dx},${gy + dy}`) ?? []) {\n const q = this.points[i];\n if (Math.hypot(q.x - p.x, q.y - p.y) <= this.snap) return i;\n }\n }\n }\n const i = this.points.length;\n this.points.push({ x: p.x, y: p.y });\n const key = `${gx},${gy}`;\n const cell = this.grid.get(key);\n if (cell) cell.push(i); else this.grid.set(key, [i]);\n return i;\n }\n}\n\ninterface SegRef {\n seg: Seg;\n operand: number;\n contour: number;\n index: number;\n count: number;\n box: [number, number, number, number];\n}\n\nfunction refsOf(operands: readonly Contour[][]): SegRef[] {\n const out: SegRef[] = [];\n operands.forEach((contours, operand) => contours.forEach((c, contour) => c.forEach((seg, index) => {\n let x0 = Infinity, y0 = Infinity, x1 = -Infinity, y1 = -Infinity;\n for (const p of seg) {\n x0 = Math.min(x0, p.x); x1 = Math.max(x1, p.x);\n y0 = Math.min(y0, p.y); y1 = Math.max(y1, p.y);\n }\n out.push({ seg, operand, contour, index, count: c.length, box: [x0, y0, x1, y1] });\n })));\n return out;\n}\n\nconst adjacent = (a: SegRef, b: SegRef): boolean => {\n if (a.operand !== b.operand || a.contour !== b.contour) return false;\n const d = Math.abs(a.index - b.index);\n return d === 1 || d === a.count - 1;\n};\n\n/** Whether a cubic crosses itself, which no pair of segments would find. */\nfunction loops(seg: Seg): boolean {\n if (seg.length < 4) return false;\n const mid = evalSeg(seg, 0.5);\n const l = subSeg(seg, 0, 0.5, seg[0], mid);\n const r = subSeg(seg, 0.5, 1, mid, seg[3]);\n if (!l || !r) return false;\n return intersectSegments(l, r).some((h) => h.ta < 1 - 1e-6 || h.tb > 1e-6);\n}\n\n/**\n * Every segment of every operand cut where any other crosses or touches it,\n * or starts or stops running along it, the cut ends snapped to shared\n * vertices; pieces that lie along each other are one edge. Null when the\n * input has a case the cut cannot represent: a cubic that crosses itself, or\n * an overlap whose ends are not ends of either segment.\n */\nexport function cutEdges(operands: readonly Contour[][], snap: number): Arrangement | null {\n const refs = refsOf(operands);\n if (refs.some((r) => loops(r.seg))) return null;\n const verts = new Vertices(snap);\n // Ends first, so a crossing that lands on one takes its exact position rather than giving it a computed one.\n const ends = refs.map(({ seg }) => [verts.id(seg[0]), verts.id(seg[seg.length - 1])]);\n const stops: { t: number; v: number }[][] = refs.map(() => []);\n\n for (let i = 0; i < refs.length; i++) {\n const a = refs[i];\n for (let j = i + 1; j < refs.length; j++) {\n const b = refs[j];\n if (a.box[0] > b.box[2] + snap || b.box[0] > a.box[2] + snap\n || a.box[1] > b.box[3] + snap || b.box[1] > a.box[3] + snap) continue;\n const shared = sharedStretch(a.seg, b.seg, snap);\n if (shared) {\n for (const end of shared) {\n const v = verts.id(end.p);\n stops[i].push({ t: end.ta, v });\n stops[j].push({ t: end.tb, v });\n }\n continue;\n }\n const hits = intersectSegments(a.seg, b.seg);\n if (hits.length >= OVERLAP_HITS) return null;\n const near = adjacent(a, b);\n for (const h of hits) {\n if (near && ((h.ta > 1 - END_T && h.tb < END_T) || (h.ta < END_T && h.tb > 1 - END_T))) continue;\n const v = verts.id(h);\n stops[i].push({ t: h.ta, v });\n stops[j].push({ t: h.tb, v });\n }\n }\n }\n\n const edges: Edge[] = [];\n refs.forEach((ref, i) => {\n const { seg } = ref;\n const list = [{ t: 0, v: ends[i][0] }, ...stops[i].sort((p, q) => p.t - q.t), { t: 1, v: ends[i][1] }];\n // The same vertex twice in a row is one stop, the segment's own end kept over a crossing.\n const kept = [list[0]];\n for (let k = 1; k < list.length; k++) {\n const s = list[k];\n if (s.v !== kept[kept.length - 1].v) kept.push(s);\n else if (k === list.length - 1 && kept.length > 1) kept[kept.length - 1] = s;\n }\n // A segment that leaves a vertex and comes back to it with no stop between is a loop of its own.\n const size = Math.hypot(ref.box[2] - ref.box[0], ref.box[3] - ref.box[1]);\n if (kept.length === 1 && seg.length > 2 && size > 100 * snap) kept.push(list[list.length - 1]);\n for (let k = 0; k + 1 < kept.length; k++) {\n const a = kept[k], b = kept[k + 1];\n const piece = a.t === 0 && b.t === 1 ? seg.slice() : subSeg(seg, a.t, b.t, verts.points[a.v], verts.points[b.v]);\n if (!piece) continue;\n piece[0] = verts.points[a.v];\n piece[piece.length - 1] = verts.points[b.v];\n edges.push({ seg: piece, from: a.v, to: b.v, operand: ref.operand, source: seg, t0: a.t, t1: b.t, key: i + a.t * 0.5, reversed: false });\n }\n });\n return { edges: mergeCoincident(edges, snap), points: verts.points };\n}\n","/** Which operands cover either side of each edge of a cut arrangement, by exact-curve winding. */\n\nimport type { PathFillRule } from '../path';\nimport type { Point } from '../paths/cubicMath';\nimport { type Seg, type Contour, evalSeg, derivSeg, sideCoeffs, signChanges } from './contourSegments';\nimport type { Edge } from './curveEdges';\n\n/** One operand's segments, each with its box, for winding tests. */\nexport interface WindingSet {\n segs: Seg[];\n boxes: Float64Array;\n fillRule: PathFillRule;\n}\n\nexport function windingSet(contours: readonly Contour[], fillRule: PathFillRule): WindingSet {\n const segs = contours.flat();\n const boxes = new Float64Array(segs.length * 4);\n segs.forEach((s, i) => {\n let x0 = Infinity, y0 = Infinity, x1 = -Infinity, y1 = -Infinity;\n for (const p of s) {\n x0 = Math.min(x0, p.x); x1 = Math.max(x1, p.x);\n y0 = Math.min(y0, p.y); y1 = Math.max(y1, p.y);\n }\n boxes.set([x0, y0, x1, y1], i * 4);\n });\n return { segs, boxes, fillRule };\n}\n\nconst RAY: Point = { x: 1, y: 0 };\n\n/** Winding number of `q`, by a ray cast in +x against the exact curves. */\nfunction winding(q: Point, set: WindingSet): number {\n let w = 0;\n const { segs, boxes } = set;\n for (let i = 0; i < segs.length; i++) {\n if (q.y < boxes[i * 4 + 1] || q.y > boxes[i * 4 + 3] || boxes[i * 4 + 2] < q.x) continue;\n const s = segs[i];\n for (const c of signChanges(sideCoeffs(s, q, RAY), true)) {\n if (evalSeg(s, c.t).x > q.x) w += c.after > 0 ? 1 : -1;\n }\n }\n return w;\n}\n\nconst filled = (w: number, rule: PathFillRule): boolean => (rule === 'evenodd' ? (w & 1) !== 0 : w !== 0);\n\nexport const reversed = (e: Edge): Edge => ({ ...e, seg: e.seg.slice().reverse(), from: e.to, to: e.from, reversed: true });\n\n/** An edge, and which operands cover the points just to its left and its right. */\nexport interface CoveredEdge {\n edge: Edge;\n inL: boolean[];\n inR: boolean[];\n}\n\n/** How many times each operand's outline runs along `e`, counting a piece against it as -1. */\nfunction runs(e: Edge, operands: number): number[] {\n const n = new Array<number>(operands).fill(0);\n n[e.operand] = 1;\n for (const { operand, sign } of e.also ?? []) n[operand] += sign;\n return n;\n}\n\n/**\n * Which operands cover either side of every edge. Null when an edge lies\n * along an outline the cut did not merge into it, which the winding on its\n * two sides gives away.\n */\nexport function coverEdges(edges: readonly Edge[], sets: readonly WindingSet[], probe: number): CoveredEdge[] | null {\n const out: CoveredEdge[] = [];\n for (const e of edges) {\n // Probe the source curve rather than the cut piece, whose ends were snapped.\n const tm = (e.t0 + e.t1) / 2;\n const m = evalSeg(e.source, tm);\n let tan = derivSeg(e.source, tm);\n let len = Math.hypot(tan.x, tan.y);\n if (len === 0) {\n const a = e.seg[0], b = e.seg[e.seg.length - 1];\n tan = { x: b.x - a.x, y: b.y - a.y };\n len = Math.hypot(tan.x, tan.y);\n if (len === 0) continue;\n }\n const nx = -tan.y / len * probe, ny = tan.x / len * probe;\n const L = { x: m.x + nx, y: m.y + ny }, R = { x: m.x - nx, y: m.y - ny };\n const along = runs(e, sets.length);\n const inL: boolean[] = new Array<boolean>(sets.length);\n const inR: boolean[] = new Array<boolean>(sets.length);\n for (let k = 0; k < sets.length; k++) {\n const wl = winding(L, sets[k]), wr = winding(R, sets[k]);\n if (Math.abs(wl - wr) !== Math.abs(along[k])) return null;\n inL[k] = filled(wl, sets[k].fillRule);\n inR[k] = filled(wr, sets[k].fillRule);\n }\n out.push({ edge: e, inL, inR });\n }\n return out;\n}\n","/** Joining a boolean's boundary edges into closed loops. */\n\nimport type { Point } from '../paths/cubicMath';\nimport { type Seg, evalSeg, subSeg } from './contourSegments';\nimport type { Edge } from './curveEdges';\n\nconst TAU = Math.PI * 2;\n/** Directions closer than this (radians) are a tie, settled a little way along the curves. */\nconst TIE = 1e-7;\n\n/** Direction an edge leaves its start in: toward the first control point off it. */\nfunction leaving(s: Seg): Point {\n const a = s[0];\n for (let i = 1; i < s.length; i++) if (s[i].x !== a.x || s[i].y !== a.y) return { x: s[i].x - a.x, y: s[i].y - a.y };\n return { x: 0, y: 0 };\n}\n\nconst backward = (s: Seg): Seg => s.slice().reverse();\n\n/** Direction from an edge's start to the point a short way along it. */\nfunction along(s: Seg, dist: number): Point {\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 const p = evalSeg(s, len === 0 ? 0 : Math.min(1, dist / len));\n return { x: p.x - s[0].x, y: p.y - s[0].y };\n}\n\nconst angle = (d: Point): number => Math.atan2(d.y, d.x);\n\n/** Clockwise turn from `from` to `to`, in (0, 2π]. */\nfunction clockwise(from: number, to: number): number {\n const d = (from - to) % TAU;\n return d <= 0 ? d + TAU : d;\n}\n\nfunction chordLength(s: Seg): number {\n const a = s[0], b = s[s.length - 1];\n return Math.hypot(b.x - a.x, b.y - a.y) || Math.hypot(s[1].x - a.x, s[1].y - a.y);\n}\n\n/**\n * The edge a loop with its fill on the left takes after arriving along `e`:\n * of those leaving where `e` ends, the first clockwise from the way `e` came\n * in. -1 when none leaves, or two directions tie even a little way along.\n */\nfunction nextEdge(e: Edge, out: readonly Edge[][]): number {\n const cands = out[e.to];\n if (!cands || cands.length === 0) return -1;\n if (cands.length === 1) return cands[0].key;\n const back = backward(e.seg);\n const turns = (dir: (s: Seg) => Point) => {\n const from = angle(dir(back));\n return cands.map((c) => clockwise(from, angle(dir(c.seg))));\n };\n const tied = (t: number[]) => {\n const sorted = t.slice().sort((x, y) => x - y);\n return sorted[0] < TIE || sorted[sorted.length - 1] > TAU - TIE || sorted[1] - sorted[0] < TIE;\n };\n let t = turns(leaving);\n if (tied(t)) {\n const dist = 1e-3 * Math.min(chordLength(e.seg), ...cands.map((c) => chordLength(c.seg)));\n t = turns((s) => along(s, dist));\n if (tied(t)) return -1;\n }\n let best = 0;\n for (let i = 1; i < t.length; i++) if (t[i] < t[best]) best = i;\n return cands[best].key;\n}\n\n/** `e` then `f` as one piece of their source, when they are neighbors on it. */\nfunction joined(e: Edge, f: Edge): Edge | null {\n if (e.source !== f.source || e.reversed !== f.reversed) return null;\n const [lo, hi] = e.reversed ? [f, e] : [e, f];\n if (lo.t1 !== hi.t0) return null;\n const t0 = lo.t0, t1 = hi.t1;\n const a = lo.seg[e.reversed ? lo.seg.length - 1 : 0], b = hi.seg[e.reversed ? 0 : hi.seg.length - 1];\n const seg = t0 === 0 && t1 === 1 ? lo.source.slice() : subSeg(lo.source, t0, t1, a, b);\n if (!seg) return null;\n seg[0] = a;\n seg[seg.length - 1] = b;\n if (e.reversed) seg.reverse();\n return { ...e, seg, from: e.from, to: f.to, t0, t1 };\n}\n\n/** A loop's edges with each run of neighbors on one source curve put back together. */\nfunction rejoin(loop: Edge[]): Seg[] {\n const out: Edge[] = [];\n for (const e of loop) {\n const j = out.length > 0 ? joined(out[out.length - 1], e) : null;\n if (j) out[out.length - 1] = j; else out.push(e);\n }\n while (out.length > 1) {\n const j = joined(out[out.length - 1], out[0]);\n if (!j) break;\n out.pop();\n out[0] = j;\n }\n return out.map((e) => e.seg);\n}\n\n/**\n * The closed loops `edges` form, each a list of segments starting at its\n * lowest-keyed edge, with pieces cut from one curve that stayed neighbors\n * joined back into one. Null when the edges do not close up into loops that\n * each use every edge once.\n */\nexport function traceLoops(edges: readonly Edge[], vertexCount: number): Seg[][] | null {\n const byKey = new Map<number, number>();\n const out: Edge[][] = Array.from({ length: vertexCount }, () => []);\n edges.forEach((e, i) => {\n byKey.set(e.key, i);\n out[e.from].push(e);\n });\n if (byKey.size !== edges.length) return null;\n const next = edges.map((e) => {\n const k = nextEdge(e, out);\n return k < 0 ? -1 : byKey.get(k)!;\n });\n if (next.includes(-1)) return null;\n\n const loopOf = new Int32Array(edges.length).fill(-1);\n const loops: Seg[][] = [];\n for (let s = 0; s < edges.length; s++) {\n if (loopOf[s] >= 0) continue;\n const loop: number[] = [];\n let e = s;\n do {\n if (loopOf[e] >= 0) return null;\n loopOf[e] = loops.length;\n loop.push(e);\n e = next[e];\n } while (e !== s);\n let first = 0;\n for (let i = 1; i < loop.length; i++) if (edges[loop[i]].key < edges[loop[first]].key) first = i;\n loops.push(rejoin([...loop.slice(first), ...loop.slice(0, first)].map((i) => edges[i])));\n }\n return loops;\n}\n","/**\n * Booleans that keep curves: the operands' outlines are cut where they\n * cross, every piece is kept or dropped by the winding on its two sides, and\n * the kept pieces are joined back into loops. Each curve in the result is a\n * piece of an input curve, cut by de Casteljau subdivision.\n */\n\nimport type { Path, PolygonPath } from '../path';\nimport { PATH_C, PATH_Q } from '../commands';\nimport { resolveCorners } from '../paths/corners';\nimport { type Contour, type Seg, reverseContour, signedArea } from './contourSegments';\nimport { parseContours, extentOf } from './contours';\nimport { writePath } from './cutRegions';\nimport { type Edge, cutEdges } from './curveEdges';\nimport { type CoveredEdge, coverEdges, reversed, windingSet } from './curveClassify';\nimport { traceLoops } from './curveTrace';\n\n/** Inputs with more segments than this go to the polygon clipper, whose sweep scales better. */\nconst MAX_SEGMENTS = 4096;\n\nfunction hasCurve(path: Path): boolean {\n const p = resolveCorners(path);\n return p.kind === 'polygon' && p.commands.some((c) => c === PATH_C || c === PATH_Q);\n}\n\n/** Drop a loop's closing line where it ends at the loop's start, so `Z` draws it. */\nfunction closingTrimmed(loop: Seg[]): Seg[] {\n if (loop.length < 2) return loop;\n const last = loop[loop.length - 1];\n return last.length === 2 ? loop.slice(0, -1) : loop;\n}\n\n/** The operands' outlines cut at every crossing, each piece knowing which operands cover its two sides. */\nexport interface CurveCut {\n edges: CoveredEdge[];\n vertexCount: number;\n /** Per operand, whether its largest contour turns with its fill on the right. */\n clockwise: boolean[];\n}\n\n/**\n * `paths` cut against each other, curves kept. Null where the polygon\n * clipper should answer instead: when no input has a curve, when the inputs\n * are very large, and in the cases this cannot represent — a cubic that\n * crosses itself, or two curves that run nearly along each other without\n * being pieces of one curve. Outlines that share a stretch of one line or\n * curve are cut where it starts and ends, and the pieces along it become one\n * edge that both own.\n */\nexport function cutPaths(paths: readonly Path[]): CurveCut | null {\n if (!paths.some(hasCurve)) return null;\n const operands = paths.map((p) => parseContours(p));\n const count = operands.reduce((n, cs) => n + cs.reduce((m, c) => m + c.length, 0), 0);\n if (count === 0 || count > MAX_SEGMENTS) return null;\n\n const extent = extentOf(operands.flat()) || 1;\n const arrangement = cutEdges(operands, extent * 1e-6);\n if (!arrangement) return null;\n const sets = operands.map((cs, i) => {\n const p = paths[i];\n return windingSet(cs, p.kind === 'polygon' ? p.fillRule : 'nonzero');\n });\n const edges = coverEdges(arrangement.edges, sets, extent * 1e-7);\n if (!edges) return null;\n return { edges, vertexCount: arrangement.points.length, clockwise: operands.map(clockwiseFirst) };\n}\n\n/**\n * The plane split by `label`, given whether each operand covers a point: for\n * every label other than -1 that holds somewhere, the closed loops bounding\n * where it holds, each with its region on the left. Null when a boundary does\n * not close into loops, as at a vertex where two outlines leave in the same\n * direction and stay together.\n */\nexport function curveRegions(cut: CurveCut, label: (inside: boolean[]) => number): Map<number, Contour[]> | null {\n const sides = new Map<number, Edge[]>();\n const add = (k: number, e: Edge) => {\n const list = sides.get(k);\n if (list) list.push(e); else sides.set(k, [e]);\n };\n for (const { edge, inL, inR } of cut.edges) {\n const l = label(inL), r = label(inR);\n if (l === r) continue;\n if (l !== -1) add(l, edge);\n if (r !== -1) add(r, reversed(edge));\n }\n const out = new Map<number, Contour[]>();\n for (const [k, edges] of sides) {\n const loops = traceLoops(edges, cut.vertexCount);\n if (!loops) return null;\n out.set(k, loops);\n }\n return out;\n}\n\n/** `loops` as a nonzero path, turned clockwise when `clockwise`, closing lines left to `Z`. */\nexport function writeLoops(loops: readonly Contour[], clockwise: boolean): PolygonPath {\n const turned = clockwise ? loops.map(reversedFromFirst) : loops;\n return writePath(turned.map((l) => ({ segs: closingTrimmed(l), closed: true })), 'nonzero');\n}\n\n/**\n * The region of the plane where `keep` holds, given whether each of `paths`\n * covers a point, as a nonzero path whose curves are pieces of the inputs'.\n * Null where {@link cutPaths} or {@link curveRegions} is.\n */\nexport function curveBoolean(paths: readonly Path[], keep: (inside: boolean[]) => boolean): PolygonPath | null {\n const cut = cutPaths(paths);\n if (!cut) return null;\n const regions = curveRegions(cut, (inside) => (keep(inside) ? 0 : -1));\n if (!regions) return null;\n // Keep the first operand's turning direction, so a curve that comes through whole comes back as it went in.\n return writeLoops(regions.get(0) ?? [], cut.clockwise[0]);\n}\n\n/** Whether a contour set's largest contour turns with its fill on the right. */\nfunction clockwiseFirst(contours: readonly Contour[]): boolean {\n let best = 0;\n for (const c of contours) {\n const a = signedArea(c);\n if (Math.abs(a) > Math.abs(best)) best = a;\n }\n return best < 0;\n}\n\n/** `loop` reversed, starting at the segment that reverses its first. */\nfunction reversedFromFirst(loop: Contour): Contour {\n const rev = reverseContour(loop);\n return [rev[rev.length - 1], ...rev.slice(0, -1)];\n}\n","/**\n * Divide, face pieces, trim and merge that keep curves: one cut of every\n * outline against the others, its edges labeled by which inputs cover each\n * side, and each label's boundary traced into loops.\n */\n\nimport type { Path, PolygonPath } from '../path';\nimport { type Contour, sampleContour, signedArea } from './contourSegments';\nimport { assembleRegions } from './cutRegions';\nimport { type CurveCut, cutPaths, curveRegions, writeLoops } from './curveBoolean';\n\nexport interface CurvePiece {\n path: PolygonPath;\n sources: number[];\n}\n\nconst covering = (inside: boolean[]): number[] => {\n const s: number[] = [];\n inside.forEach((v, i) => { if (v) s.push(i); });\n return s;\n};\n\nconst maskOf = (sources: readonly number[]): bigint => sources.reduce((m, i) => m | (1n << BigInt(i)), 0n);\n\n/** Left edge, then bottom, of a region's outer loop. */\nfunction corner(loops: readonly Contour[]): [number, number] {\n const pts = sampleContour(loops[0]);\n let x = Infinity, y = Infinity;\n for (let i = 0; i < pts.length; i += 2) { x = Math.min(x, pts[i]); y = Math.min(y, pts[i + 1]); }\n return [x, y];\n}\n\n/** Loops with their region on the left, as connected regions: each outer loop with the holes it holds. */\nfunction connected(loops: readonly Contour[]): Contour[][] {\n const outers: Contour[] = [], holes: Contour[] = [];\n for (const l of loops) (signedArea(l) > 0 ? outers : holes).push(l);\n return assembleRegions(outers, holes);\n}\n\n/**\n * The faces the paths' outlines cut the plane into, grouped by the inputs\n * covering them: one piece per cover set, or with `split` one per connected\n * face. Ordered as `pathDividePieces` orders them. Null where `cutPaths` or\n * `curveRegions` is.\n */\nexport function curveDivide(paths: readonly Path[], split: boolean): CurvePiece[] | null {\n const cut = cutPaths(paths);\n if (!cut) return null;\n const ids = new Map<string, number>();\n const sets: number[][] = [];\n const regions = curveRegions(cut, (inside) => {\n const s = covering(inside);\n if (s.length === 0) return -1;\n const key = s.join(',');\n let id = ids.get(key);\n if (id === undefined) { id = sets.length; ids.set(key, id); sets.push(s); }\n return id;\n });\n if (!regions) return null;\n\n const out: { piece: CurvePiece; mask: bigint; at: [number, number] }[] = [];\n for (const [id, loops] of regions) {\n const sources = sets[id];\n const mask = maskOf(sources);\n for (const face of split ? connected(loops) : [loops]) {\n out.push({ piece: { path: writeLoops(face, cut.clockwise[sources[0]]), sources }, mask, at: corner(face) });\n }\n }\n return out.sort((a, b) =>\n a.piece.sources.length - b.piece.sources.length\n || (a.mask < b.mask ? -1 : a.mask > b.mask ? 1 : 0)\n || a.at[0] - b.at[0] || a.at[1] - b.at[1]).map((o) => o.piece);\n}\n\nconst topmost = (inside: boolean[]): number => inside.lastIndexOf(true);\n\n/** Each input's part left showing, keyed by input; inputs wholly hidden have none. */\nfunction shown(cut: CurveCut): Map<number, Contour[]> | null {\n return curveRegions(cut, topmost);\n}\n\n/** `pathTrim` with curves kept. Null where `cutPaths` or `curveRegions` is. */\nexport function curveTrim(paths: readonly Path[]): CurvePiece[] | null {\n const cut = cutPaths(paths);\n const regions = cut && shown(cut);\n if (!cut || !regions) return null;\n return [...regions.keys()].sort((a, b) => a - b)\n .map((i) => ({ path: writeLoops(regions.get(i)!, cut.clockwise[i]), sources: [i] }));\n}\n\n/** `pathMerge` with curves kept. Null where `cutPaths` or `curveRegions` is. */\nexport function curveMerge(paths: readonly Path[], keyOf: (index: number) => unknown): CurvePiece[] | null {\n const cut = cutPaths(paths);\n const visible = cut && shown(cut);\n if (!cut || !visible) return null;\n const groupIds = new Map<unknown, number>();\n const groupOf = paths.map((_, i) => {\n const key = keyOf(i);\n let g = groupIds.get(key);\n if (g === undefined) { g = groupIds.size; groupIds.set(key, g); }\n return g;\n });\n const regions = curveRegions(cut, (inside) => {\n const top = topmost(inside);\n return top < 0 ? -1 : groupOf[top];\n });\n if (!regions) return null;\n const pieces: CurvePiece[] = [];\n for (const [g, loops] of regions) {\n const sources = [...visible.keys()].filter((i) => groupOf[i] === g).sort((a, b) => a - b);\n pieces.push({ path: writeLoops(loops, cut.clockwise[sources[0]]), sources });\n }\n return pieces.sort((a, b) => a.sources[a.sources.length - 1] - b.sources[b.sources.length - 1]);\n}\n","/**\n * Boolean operations on `Path` values.\n *\n * - Union, intersect, subtract and exclude keep curves: where any input has\n * a curve, each curve in the result is a piece of an input curve\n * (`curveBoolean`). Inputs of straight lines only, very large inputs, and\n * the cases `curveBoolean` declines (self-crossing cubics, some\n * tangencies) are flattened and clipped by `polygon-clipping`\n * instead, so their result has only M/L/Z commands.\n * - Divide, crop, trim, merge and the face pieces keep curves the same\n * way (`curvePieces`), and fall back to the clipper in the same cases.\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 { curveBoolean } from './curveBoolean';\nimport { curveDivide, curveMerge, curveTrim, type CurvePiece } from './curvePieces';\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\ntype Clip = (head: MultiPolygon, ...rest: MultiPolygon[]) => MultiPolygon;\n\n/** `keep` over `paths` with curves kept, or `clip` on their flattening where that declines. */\nfunction boolean(paths: Path[], keep: (inside: boolean[]) => boolean, clip: Clip): PolygonPath {\n if (paths.length === 0) return multiPolygonToPath([]);\n const curved = curveBoolean(paths, keep);\n if (curved) return keepCorners(paths, curved);\n const [head, ...rest] = paths.map((p) => pathToMultiPolygon(p));\n return toPath(clip(head, ...rest), paths);\n}\n\nconst any = (inside: boolean[]): boolean => inside.includes(true);\nconst all = (inside: boolean[]): boolean => !inside.includes(false);\nconst aNotB = (inside: boolean[]): boolean => inside[0] && !inside[1];\nconst odd = (inside: boolean[]): boolean => inside.filter(Boolean).length % 2 === 1;\n\n/** Union of N paths. Commutative. Returns an empty path if all inputs are empty. */\nexport function pathUnion(...paths: Path[]): PolygonPath {\n return boolean(paths, any, polygonClipping.union);\n}\n\n/** Intersection of N paths. Commutative. Empty result is an empty path. */\nexport function pathIntersect(...paths: Path[]): PolygonPath {\n return boolean(paths, all, polygonClipping.intersection);\n}\n\n/** Asymmetric difference: returns `a − b`. */\nexport function pathSubtract(a: Path, b: Path): PolygonPath {\n return boolean([a, b], aNotB, polygonClipping.difference);\n}\n\n/** Symmetric difference (XOR) of N paths: what an odd number of them cover. Commutative. */\nexport function pathExclude(...paths: Path[]): PolygonPath {\n return boolean(paths, odd, polygonClipping.xor);\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/** Curved pieces with the corners of `sources` they still draw whole kept as corners. */\nconst cornered = (pieces: CurvePiece[], sources: readonly Path[]): BooleanPiece[] =>\n pieces.map(({ path, sources: s }) => ({ path: keepCorners(sources, path), sources: s }));\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 curved = curveDivide(paths, false);\n if (curved) return cornered(curved, paths);\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 const curved = curveDivide(paths, true);\n if (curved) return cornered(curved, paths);\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 curved = curveTrim(paths);\n if (curved) return cornered(curved, paths);\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 curved = curveMerge(paths, keyOf);\n if (curved) return cornered(curved, paths);\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 mask = paths[paths.length - 1];\n const out: BooleanPiece[] = [];\n for (let i = 0; i < paths.length - 1; i++) {\n const clipped = pathIntersect(paths[i], mask);\n if (clipped.commands.length > 0) out.push({ path: clipped, sources: [i] });\n }\n return out;\n}\n","/**\n * Closing a mesh's T-junctions before its triangles are unioned. A stroke\n * ribbon puts vertices partway along its neighbors' edges (a join's pivot on\n * a segment's end), and stored as float32 they land a hair to one side. The\n * union then sees two edges that nearly meet instead of one shared edge, and\n * keeps the crack or overlap between them as slivers.\n */\nimport type { Ring } from './adapter';\n\n/** How near an edge a vertex counts as on it: eight float32 ulps of the\n * largest coordinate. */\nconst ON_EDGE = 2 ** -20;\n\n/**\n * Each triangle of the mesh as a closed ring, with every mesh vertex lying on\n * one of its edges inserted into that edge, so that neighbors meeting along\n * an edge share its points exactly. `triangles` holds three vertex indices\n * per triangle, into `vertices` as x, y pairs.\n */\nexport function junctionRings(vertices: ArrayLike<number>, triangles: readonly number[]): Ring[] {\n const n = vertices.length / 2;\n let scale = 0, minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (let i = 0; i < n; i++) {\n const x = vertices[i * 2], y = vertices[i * 2 + 1];\n scale = Math.max(scale, Math.abs(x), Math.abs(y));\n minX = Math.min(minX, x); minY = Math.min(minY, y);\n maxX = Math.max(maxX, x); maxY = Math.max(maxY, y);\n }\n const eps = scale * ON_EDGE;\n const cell = Math.max(maxX - minX, maxY - minY, eps) / Math.max(1, Math.sqrt(n));\n const grid = new Map<string, number[]>();\n const key = (cx: number, cy: number) => `${cx},${cy}`;\n for (const i of new Set(triangles)) {\n const k = key(Math.floor((vertices[i * 2] - minX) / cell), Math.floor((vertices[i * 2 + 1] - minY) / cell));\n const bucket = grid.get(k);\n if (bucket) bucket.push(i); else grid.set(k, [i]);\n }\n\n const onEdge = (p: number, q: number): number[] => {\n const px = vertices[p * 2], py = vertices[p * 2 + 1];\n const dx = vertices[q * 2] - px, dy = vertices[q * 2 + 1] - py;\n const len2 = dx * dx + dy * dy;\n if (len2 === 0) return [];\n const len = Math.sqrt(len2);\n const hits: { i: number; t: number }[] = [];\n const x0 = Math.floor((Math.min(px, px + dx) - eps - minX) / cell), x1 = Math.floor((Math.max(px, px + dx) + eps - minX) / cell);\n const y0 = Math.floor((Math.min(py, py + dy) - eps - minY) / cell), y1 = Math.floor((Math.max(py, py + dy) + eps - minY) / cell);\n for (let cx = x0; cx <= x1; cx++) {\n for (let cy = y0; cy <= y1; cy++) {\n for (const i of grid.get(key(cx, cy)) ?? []) {\n const vx = vertices[i * 2] - px, vy = vertices[i * 2 + 1] - py;\n const t = (vx * dx + vy * dy) / len2;\n if (t * len <= eps || (1 - t) * len <= eps) continue;\n if (Math.abs(vx * dy - vy * dx) / len <= eps) hits.push({ i, t });\n }\n }\n }\n return hits.sort((a, b) => a.t - b.t).map((h) => h.i);\n };\n\n const rings: Ring[] = [];\n for (let k = 0; k + 2 < triangles.length; k += 3) {\n const ring: Ring = [];\n for (let e = 0; e < 3; e++) {\n const p = triangles[k + e], q = triangles[k + ((e + 1) % 3)];\n for (const i of [p, ...onEdge(p, q)]) ring.push([vertices[i * 2], vertices[i * 2 + 1]]);\n }\n ring.push(ring[0]);\n rings.push(ring);\n }\n return rings;\n}\n","/**\n * A triangle mesh's boundary as one ring whose winding number at every point\n * is how many of its triangles cover that point. Edges two triangles share in\n * opposite directions cancel, so a union of the ring under the nonzero rule\n * sweeps only the mesh's outline rather than every interior edge, and none of\n * the near-parallel crossings a thin ribbon's overlapping triangles make.\n */\nimport type { Pair, Ring } from './adapter';\n\n/**\n * The boundary of `rings`, each a closed triangle ring (as `junctionRings`\n * gives them), as one closed ring, or null when every edge cancels. Each\n * triangle counts once, whichever way it winds. Separate loops of the\n * boundary are joined by a bridge walked out and back, which adds nothing to\n * the winding.\n */\nexport function meshOutline(rings: readonly Ring[]): Ring | null {\n const points = new Map<string, Pair>();\n // Directed edge counts, keyed `from|to`; an edge and its reverse cancel.\n const edges = new Map<string, number>();\n const keyOf = (p: Pair): string => {\n const k = `${p[0]},${p[1]}`;\n if (!points.has(k)) points.set(k, p);\n return k;\n };\n for (const ring of rings) {\n const keys = ring.slice(0, -1).map(keyOf);\n if (ringArea(ring) < 0) keys.reverse();\n for (let i = 0; i < keys.length; i++) {\n const a = keys[i], b = keys[(i + 1) % keys.length];\n if (a === b) continue;\n const back = `${b}|${a}`;\n const n = edges.get(back);\n if (n) {\n if (n === 1) edges.delete(back); else edges.set(back, n - 1);\n } else {\n const fwd = `${a}|${b}`;\n edges.set(fwd, (edges.get(fwd) ?? 0) + 1);\n }\n }\n }\n const loops = walkLoops(edges).map((loop) => loop.map((k) => points.get(k)!));\n return loops.length === 0 ? null : bridge(loops);\n}\n\n/** The directed edges left in `edges`, chained into closed loops of point keys. */\nfunction walkLoops(edges: Map<string, number>): string[][] {\n const out = new Map<string, string[]>();\n for (const [edge, n] of edges) {\n const [a, b] = edge.split('|');\n let list = out.get(a);\n if (!list) out.set(a, (list = []));\n for (let i = 0; i < n; i++) list.push(b);\n }\n const loops: string[][] = [];\n for (const start of out.keys()) {\n while ((out.get(start)?.length ?? 0) > 0) {\n const loop = [start];\n let at = out.get(start)!.pop()!;\n while (at !== start) {\n loop.push(at);\n const next = out.get(at);\n // Every point has as many edges in as out, so a walk can only end\n // where it began.\n at = next!.pop()!;\n }\n loops.push(loop);\n }\n }\n return loops;\n}\n\n/**\n * `loops` as one closed ring: each loop entered at its leftmost point from\n * the previous loop's, walked round, and left the way it came in, so every\n * bridge is crossed once each way.\n */\nfunction bridge(loops: Pair[][]): Ring {\n const entered = loops.map((loop) => {\n let k = 0;\n for (let i = 1; i < loop.length; i++) if (loop[i][0] < loop[k][0] || (loop[i][0] === loop[k][0] && loop[i][1] < loop[k][1])) k = i;\n return [...loop.slice(k), ...loop.slice(0, k)];\n });\n entered.sort((a, b) => a[0][0] - b[0][0] || a[0][1] - b[0][1]);\n const ring: Ring = [];\n for (const loop of entered) ring.push(...loop, loop[0]);\n for (let i = entered.length - 2; i >= 0; i--) ring.push(entered[i][0]);\n return ring;\n}\n\nfunction ringArea(ring: Ring): number {\n let a = 0;\n for (let i = 0; i + 1 < ring.length; i++) a += ring[i][0] * ring[i + 1][1] - ring[i + 1][0] * ring[i][1];\n return a;\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 } from './adapter';\nimport { junctionRings } from './meshJunctions';\nimport { meshOutline } from './meshOutline';\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, triangles with no area are skipped, and a vertex lying on another\n * triangle's edge joins it there rather than leaving a crack. The result\n * holds only M/L/Z.\n */\nexport function trianglesToPath(vertices: ArrayLike<number>, indices: ArrayLike<number>): PolygonPath {\n const kept: number[] = [];\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 if ((vertices[b] - ax) * (vertices[c + 1] - ay) - (vertices[c] - ax) * (vertices[b + 1] - ay) === 0) continue;\n kept.push(indices[i], indices[i + 1], indices[i + 2]);\n }\n if (kept.length === 0) return multiPolygonToPath([]);\n const outline = meshOutline(junctionRings(vertices, kept));\n return multiPolygonToPath(outline ? polygonClipping.union([[outline]]) : []);\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 resolved by a union\n * first (see `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 `pathUnion`, which keeps its curves except in the\n * few cases that union flattens (a cubic that crosses itself, say).\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
+ {"version":3,"sources":["../../src/booleans/adapter.ts","../../src/booleans/arrangement.ts","../../src/booleans/arrangementFaces.ts","../../src/booleans/curveOverlap.ts","../../src/booleans/curveEdges.ts","../../src/booleans/curveClassify.ts","../../src/booleans/curveTrace.ts","../../src/booleans/curveBoolean.ts","../../src/booleans/curvePieces.ts","../../src/booleans/ops.ts","../../src/booleans/meshJunctions.ts","../../src/booleans/meshOutline.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":["filled","winding","v","angle","faces","i","along","t","loops","clockwise","toPath","shown","polygonClipping","k","traceLoops","runs","all"],"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';\nimport { coordsFrom, originFor, worldCoords } from '../paths/pathOrigin';\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 } = path;\n const coords = worldCoords(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 world = new Float64Array(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 world[pi++] = ring[0][0];\n world[pi++] = ring[0][1];\n for (let k = 1; k < unique; k++) {\n commands[ci++] = PATH_L;\n world[pi++] = ring[k][0];\n world[pi++] = ring[k][1];\n }\n commands[ci++] = PATH_Z;\n }\n }\n const origin = originFor(world);\n return { kind: 'polygon', commands, coords: coordsFrom(origin, world), fillRule: 'nonzero', ...(origin ? { origin } : {}) };\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","/** Outlines that run along each other: where a shared stretch starts and ends, and its pieces made one edge. */\n\nimport type { Point } from '../paths/cubicMath';\nimport { nearestOnCubic, nearestOnLine, nearestOnQuadratic, type CurveNearest } from '../nearest';\nimport { type Seg, evalSeg } from './contourSegments';\nimport type { Edge } from './curveEdges';\n\n/** The point on `s` nearest `p`. */\nexport function nearestOnSeg(s: Seg, p: Point): CurveNearest {\n if (s.length === 2) return nearestOnLine(p.x, p.y, s[0].x, s[0].y, s[1].x, s[1].y);\n if (s.length === 3) return nearestOnQuadratic(p.x, p.y, s[0].x, s[0].y, s[1].x, s[1].y, s[2].x, s[2].y);\n return nearestOnCubic(p.x, p.y, s[0].x, s[0].y, s[1].x, s[1].y, s[2].x, s[2].y, s[3].x, s[3].y);\n}\n\n/** One end of a stretch two segments share: the parameter on each, and the point. */\nexport interface OverlapEnd {\n ta: number;\n tb: number;\n p: Point;\n}\n\n/** Interior samples a stretch must lie on the other segment at to count as shared. */\nconst SAMPLES = [0.25, 0.5, 0.75];\n\n/**\n * The ends of the stretch `a` and `b` share, or null when they share none.\n * Each end of a shared stretch is an end of one segment lying on the other,\n * so only those are tried: two segments of degree three or less that share a\n * stretch are pieces of one curve and cross nowhere else.\n */\nexport function sharedStretch(a: Seg, b: Seg, snap: number): [OverlapEnd, OverlapEnd] | null {\n const ends: OverlapEnd[] = [];\n const add = (e: OverlapEnd) => {\n if (!ends.some((f) => Math.hypot(f.p.x - e.p.x, f.p.y - e.p.y) <= snap)) ends.push(e);\n };\n for (const [tb, p] of [[0, b[0]], [1, b[b.length - 1]]] as const) {\n const n = nearestOnSeg(a, p);\n if (n.dist <= snap) add({ ta: n.t, tb, p });\n }\n for (const [ta, p] of [[0, a[0]], [1, a[a.length - 1]]] as const) {\n const n = nearestOnSeg(b, p);\n if (n.dist <= snap) add({ ta, tb: n.t, p });\n }\n let best: [OverlapEnd, OverlapEnd] | null = null;\n for (let i = 0; i < ends.length; i++) {\n for (let j = i + 1; j < ends.length; j++) {\n const [e, f] = ends[i].ta <= ends[j].ta ? [ends[i], ends[j]] : [ends[j], ends[i]];\n if (best && f.ta - e.ta <= best[1].ta - best[0].ta) continue;\n const on = SAMPLES.every((s) => nearestOnSeg(b, evalSeg(a, e.ta + (f.ta - e.ta) * s)).dist <= snap);\n if (on) best = [e, f];\n }\n }\n return best;\n}\n\n/** Whether `e` and `f` join the same two vertices along the same curve. */\nfunction coincide(e: Edge, f: Edge, snap: number): boolean {\n const same = e.from === f.from && e.to === f.to;\n if (!same && !(e.from === f.to && e.to === f.from)) return false;\n return SAMPLES.every((s) => nearestOnSeg(f.seg, evalSeg(e.seg, s)).dist <= snap);\n}\n\n/**\n * `edges` with every set of pieces lying along one another made one edge,\n * the first of them, naming the others in `also`.\n */\nexport function mergeCoincident(edges: readonly Edge[], snap: number): Edge[] {\n const byEnds = new Map<string, Edge[]>();\n const out: Edge[] = [];\n for (const e of edges) {\n const key = e.from < e.to ? `${e.from},${e.to}` : `${e.to},${e.from}`;\n const list = byEnds.get(key) ?? [];\n const twin = list.find((f) => coincide(f, e, snap));\n if (twin) {\n (twin.also ??= []).push({ operand: e.operand, sign: twin.from === e.from ? 1 : -1 });\n continue;\n }\n list.push(e);\n byEnds.set(key, list);\n out.push(e);\n }\n return out;\n}\n","/** The operands' outlines cut at every crossing into edges that meet only at their ends. */\n\nimport type { Point } from '../paths/cubicMath';\nimport { intersectSegments } from '../intersect/segmentIntersections';\nimport { type Seg, type Contour, evalSeg, subSeg } from './contourSegments';\nimport { mergeCoincident, sharedStretch } from './curveOverlap';\n\n/** One piece of an outline between two crossings, and where it came from. */\nexport interface Edge {\n seg: Seg;\n /** Vertex ids of its ends. */\n from: number;\n to: number;\n operand: number;\n /** The whole segment it was cut from, and the parameters it spans on it. */\n source: Seg;\n t0: number;\n t1: number;\n /** Orders edges by where they sit in the input. */\n key: number;\n /** Runs against its source curve. */\n reversed: boolean;\n /** Other operands' pieces lying along this one, each running with it (1) or against it (-1). */\n also?: { operand: number; sign: 1 | -1 }[];\n}\n\nexport interface Arrangement {\n edges: Edge[];\n points: Point[];\n}\n\n/** Two curves overlapping along a stretch report at most this many crossings. */\nconst OVERLAP_HITS = 16;\nconst END_T = 1e-9;\n\n/** Points within `snap` of each other are one vertex. */\nclass Vertices {\n readonly points: Point[] = [];\n private readonly grid = new Map<string, number[]>();\n constructor(private readonly snap: number) {}\n\n id(p: Point): number {\n const gx = Math.floor(p.x / this.snap), gy = Math.floor(p.y / this.snap);\n for (let dx = -1; dx <= 1; dx++) {\n for (let dy = -1; dy <= 1; dy++) {\n for (const i of this.grid.get(`${gx + dx},${gy + dy}`) ?? []) {\n const q = this.points[i];\n if (Math.hypot(q.x - p.x, q.y - p.y) <= this.snap) return i;\n }\n }\n }\n const i = this.points.length;\n this.points.push({ x: p.x, y: p.y });\n const key = `${gx},${gy}`;\n const cell = this.grid.get(key);\n if (cell) cell.push(i); else this.grid.set(key, [i]);\n return i;\n }\n}\n\ninterface SegRef {\n seg: Seg;\n operand: number;\n contour: number;\n index: number;\n count: number;\n box: [number, number, number, number];\n}\n\nfunction refsOf(operands: readonly Contour[][]): SegRef[] {\n const out: SegRef[] = [];\n operands.forEach((contours, operand) => contours.forEach((c, contour) => c.forEach((seg, index) => {\n let x0 = Infinity, y0 = Infinity, x1 = -Infinity, y1 = -Infinity;\n for (const p of seg) {\n x0 = Math.min(x0, p.x); x1 = Math.max(x1, p.x);\n y0 = Math.min(y0, p.y); y1 = Math.max(y1, p.y);\n }\n out.push({ seg, operand, contour, index, count: c.length, box: [x0, y0, x1, y1] });\n })));\n return out;\n}\n\nconst adjacent = (a: SegRef, b: SegRef): boolean => {\n if (a.operand !== b.operand || a.contour !== b.contour) return false;\n const d = Math.abs(a.index - b.index);\n return d === 1 || d === a.count - 1;\n};\n\n/** Whether a cubic crosses itself, which no pair of segments would find. */\nfunction loops(seg: Seg): boolean {\n if (seg.length < 4) return false;\n const mid = evalSeg(seg, 0.5);\n const l = subSeg(seg, 0, 0.5, seg[0], mid);\n const r = subSeg(seg, 0.5, 1, mid, seg[3]);\n if (!l || !r) return false;\n return intersectSegments(l, r).some((h) => h.ta < 1 - 1e-6 || h.tb > 1e-6);\n}\n\n/**\n * Every segment of every operand cut where any other crosses or touches it,\n * or starts or stops running along it, the cut ends snapped to shared\n * vertices; pieces that lie along each other are one edge. Null when the\n * input has a case the cut cannot represent: a cubic that crosses itself, or\n * an overlap whose ends are not ends of either segment.\n */\nexport function cutEdges(operands: readonly Contour[][], snap: number): Arrangement | null {\n const refs = refsOf(operands);\n if (refs.some((r) => loops(r.seg))) return null;\n const verts = new Vertices(snap);\n // Ends first, so a crossing that lands on one takes its exact position rather than giving it a computed one.\n const ends = refs.map(({ seg }) => [verts.id(seg[0]), verts.id(seg[seg.length - 1])]);\n const stops: { t: number; v: number }[][] = refs.map(() => []);\n\n for (let i = 0; i < refs.length; i++) {\n const a = refs[i];\n for (let j = i + 1; j < refs.length; j++) {\n const b = refs[j];\n if (a.box[0] > b.box[2] + snap || b.box[0] > a.box[2] + snap\n || a.box[1] > b.box[3] + snap || b.box[1] > a.box[3] + snap) continue;\n const shared = sharedStretch(a.seg, b.seg, snap);\n if (shared) {\n for (const end of shared) {\n const v = verts.id(end.p);\n stops[i].push({ t: end.ta, v });\n stops[j].push({ t: end.tb, v });\n }\n continue;\n }\n const hits = intersectSegments(a.seg, b.seg);\n if (hits.length >= OVERLAP_HITS) return null;\n const near = adjacent(a, b);\n for (const h of hits) {\n if (near && ((h.ta > 1 - END_T && h.tb < END_T) || (h.ta < END_T && h.tb > 1 - END_T))) continue;\n const v = verts.id(h);\n stops[i].push({ t: h.ta, v });\n stops[j].push({ t: h.tb, v });\n }\n }\n }\n\n const edges: Edge[] = [];\n refs.forEach((ref, i) => {\n const { seg } = ref;\n const list = [{ t: 0, v: ends[i][0] }, ...stops[i].sort((p, q) => p.t - q.t), { t: 1, v: ends[i][1] }];\n // The same vertex twice in a row is one stop, the segment's own end kept over a crossing.\n const kept = [list[0]];\n for (let k = 1; k < list.length; k++) {\n const s = list[k];\n if (s.v !== kept[kept.length - 1].v) kept.push(s);\n else if (k === list.length - 1 && kept.length > 1) kept[kept.length - 1] = s;\n }\n // A segment that leaves a vertex and comes back to it with no stop between is a loop of its own.\n const size = Math.hypot(ref.box[2] - ref.box[0], ref.box[3] - ref.box[1]);\n if (kept.length === 1 && seg.length > 2 && size > 100 * snap) kept.push(list[list.length - 1]);\n for (let k = 0; k + 1 < kept.length; k++) {\n const a = kept[k], b = kept[k + 1];\n const piece = a.t === 0 && b.t === 1 ? seg.slice() : subSeg(seg, a.t, b.t, verts.points[a.v], verts.points[b.v]);\n if (!piece) continue;\n piece[0] = verts.points[a.v];\n piece[piece.length - 1] = verts.points[b.v];\n edges.push({ seg: piece, from: a.v, to: b.v, operand: ref.operand, source: seg, t0: a.t, t1: b.t, key: i + a.t * 0.5, reversed: false });\n }\n });\n return { edges: mergeCoincident(edges, snap), points: verts.points };\n}\n","/** Which operands cover either side of each edge of a cut arrangement, by exact-curve winding. */\n\nimport type { PathFillRule } from '../path';\nimport type { Point } from '../paths/cubicMath';\nimport { type Seg, type Contour, evalSeg, derivSeg, sideCoeffs, signChanges } from './contourSegments';\nimport type { Edge } from './curveEdges';\n\n/** One operand's segments, each with its box, for winding tests. */\nexport interface WindingSet {\n segs: Seg[];\n boxes: Float64Array;\n fillRule: PathFillRule;\n}\n\nexport function windingSet(contours: readonly Contour[], fillRule: PathFillRule): WindingSet {\n const segs = contours.flat();\n const boxes = new Float64Array(segs.length * 4);\n segs.forEach((s, i) => {\n let x0 = Infinity, y0 = Infinity, x1 = -Infinity, y1 = -Infinity;\n for (const p of s) {\n x0 = Math.min(x0, p.x); x1 = Math.max(x1, p.x);\n y0 = Math.min(y0, p.y); y1 = Math.max(y1, p.y);\n }\n boxes.set([x0, y0, x1, y1], i * 4);\n });\n return { segs, boxes, fillRule };\n}\n\nconst RAY: Point = { x: 1, y: 0 };\n\n/** Winding number of `q`, by a ray cast in +x against the exact curves. */\nfunction winding(q: Point, set: WindingSet): number {\n let w = 0;\n const { segs, boxes } = set;\n for (let i = 0; i < segs.length; i++) {\n if (q.y < boxes[i * 4 + 1] || q.y > boxes[i * 4 + 3] || boxes[i * 4 + 2] < q.x) continue;\n const s = segs[i];\n for (const c of signChanges(sideCoeffs(s, q, RAY), true)) {\n if (evalSeg(s, c.t).x > q.x) w += c.after > 0 ? 1 : -1;\n }\n }\n return w;\n}\n\nconst filled = (w: number, rule: PathFillRule): boolean => (rule === 'evenodd' ? (w & 1) !== 0 : w !== 0);\n\nexport const reversed = (e: Edge): Edge => ({ ...e, seg: e.seg.slice().reverse(), from: e.to, to: e.from, reversed: true });\n\n/** An edge, and which operands cover the points just to its left and its right. */\nexport interface CoveredEdge {\n edge: Edge;\n inL: boolean[];\n inR: boolean[];\n}\n\n/** How many times each operand's outline runs along `e`, counting a piece against it as -1. */\nfunction runs(e: Edge, operands: number): number[] {\n const n = new Array<number>(operands).fill(0);\n n[e.operand] = 1;\n for (const { operand, sign } of e.also ?? []) n[operand] += sign;\n return n;\n}\n\n/**\n * Which operands cover either side of every edge. Null when an edge lies\n * along an outline the cut did not merge into it, which the winding on its\n * two sides gives away.\n */\nexport function coverEdges(edges: readonly Edge[], sets: readonly WindingSet[], probe: number): CoveredEdge[] | null {\n const out: CoveredEdge[] = [];\n for (const e of edges) {\n // Probe the source curve rather than the cut piece, whose ends were snapped.\n const tm = (e.t0 + e.t1) / 2;\n const m = evalSeg(e.source, tm);\n let tan = derivSeg(e.source, tm);\n let len = Math.hypot(tan.x, tan.y);\n if (len === 0) {\n const a = e.seg[0], b = e.seg[e.seg.length - 1];\n tan = { x: b.x - a.x, y: b.y - a.y };\n len = Math.hypot(tan.x, tan.y);\n if (len === 0) continue;\n }\n const nx = -tan.y / len * probe, ny = tan.x / len * probe;\n const L = { x: m.x + nx, y: m.y + ny }, R = { x: m.x - nx, y: m.y - ny };\n const along = runs(e, sets.length);\n const inL: boolean[] = new Array<boolean>(sets.length);\n const inR: boolean[] = new Array<boolean>(sets.length);\n for (let k = 0; k < sets.length; k++) {\n const wl = winding(L, sets[k]), wr = winding(R, sets[k]);\n if (Math.abs(wl - wr) !== Math.abs(along[k])) return null;\n inL[k] = filled(wl, sets[k].fillRule);\n inR[k] = filled(wr, sets[k].fillRule);\n }\n out.push({ edge: e, inL, inR });\n }\n return out;\n}\n","/** Joining a boolean's boundary edges into closed loops. */\n\nimport type { Point } from '../paths/cubicMath';\nimport { type Seg, evalSeg, subSeg } from './contourSegments';\nimport type { Edge } from './curveEdges';\n\nconst TAU = Math.PI * 2;\n/** Directions closer than this (radians) are a tie, settled a little way along the curves. */\nconst TIE = 1e-7;\n\n/** Direction an edge leaves its start in: toward the first control point off it. */\nfunction leaving(s: Seg): Point {\n const a = s[0];\n for (let i = 1; i < s.length; i++) if (s[i].x !== a.x || s[i].y !== a.y) return { x: s[i].x - a.x, y: s[i].y - a.y };\n return { x: 0, y: 0 };\n}\n\nconst backward = (s: Seg): Seg => s.slice().reverse();\n\n/** Direction from an edge's start to the point a short way along it. */\nfunction along(s: Seg, dist: number): Point {\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 const p = evalSeg(s, len === 0 ? 0 : Math.min(1, dist / len));\n return { x: p.x - s[0].x, y: p.y - s[0].y };\n}\n\nconst angle = (d: Point): number => Math.atan2(d.y, d.x);\n\n/** Clockwise turn from `from` to `to`, in (0, 2π]. */\nfunction clockwise(from: number, to: number): number {\n const d = (from - to) % TAU;\n return d <= 0 ? d + TAU : d;\n}\n\nfunction chordLength(s: Seg): number {\n const a = s[0], b = s[s.length - 1];\n return Math.hypot(b.x - a.x, b.y - a.y) || Math.hypot(s[1].x - a.x, s[1].y - a.y);\n}\n\n/**\n * The edge a loop with its fill on the left takes after arriving along `e`:\n * of those leaving where `e` ends, the first clockwise from the way `e` came\n * in. -1 when none leaves, or two directions tie even a little way along.\n */\nfunction nextEdge(e: Edge, out: readonly Edge[][]): number {\n const cands = out[e.to];\n if (!cands || cands.length === 0) return -1;\n if (cands.length === 1) return cands[0].key;\n const back = backward(e.seg);\n const turns = (dir: (s: Seg) => Point) => {\n const from = angle(dir(back));\n return cands.map((c) => clockwise(from, angle(dir(c.seg))));\n };\n const tied = (t: number[]) => {\n const sorted = t.slice().sort((x, y) => x - y);\n return sorted[0] < TIE || sorted[sorted.length - 1] > TAU - TIE || sorted[1] - sorted[0] < TIE;\n };\n let t = turns(leaving);\n if (tied(t)) {\n const dist = 1e-3 * Math.min(chordLength(e.seg), ...cands.map((c) => chordLength(c.seg)));\n t = turns((s) => along(s, dist));\n if (tied(t)) return -1;\n }\n let best = 0;\n for (let i = 1; i < t.length; i++) if (t[i] < t[best]) best = i;\n return cands[best].key;\n}\n\n/** `e` then `f` as one piece of their source, when they are neighbors on it. */\nfunction joined(e: Edge, f: Edge): Edge | null {\n if (e.source !== f.source || e.reversed !== f.reversed) return null;\n const [lo, hi] = e.reversed ? [f, e] : [e, f];\n if (lo.t1 !== hi.t0) return null;\n const t0 = lo.t0, t1 = hi.t1;\n const a = lo.seg[e.reversed ? lo.seg.length - 1 : 0], b = hi.seg[e.reversed ? 0 : hi.seg.length - 1];\n const seg = t0 === 0 && t1 === 1 ? lo.source.slice() : subSeg(lo.source, t0, t1, a, b);\n if (!seg) return null;\n seg[0] = a;\n seg[seg.length - 1] = b;\n if (e.reversed) seg.reverse();\n return { ...e, seg, from: e.from, to: f.to, t0, t1 };\n}\n\n/** A loop's edges with each run of neighbors on one source curve put back together. */\nfunction rejoin(loop: Edge[]): Seg[] {\n const out: Edge[] = [];\n for (const e of loop) {\n const j = out.length > 0 ? joined(out[out.length - 1], e) : null;\n if (j) out[out.length - 1] = j; else out.push(e);\n }\n while (out.length > 1) {\n const j = joined(out[out.length - 1], out[0]);\n if (!j) break;\n out.pop();\n out[0] = j;\n }\n return out.map((e) => e.seg);\n}\n\n/**\n * The closed loops `edges` form, each a list of segments starting at its\n * lowest-keyed edge, with pieces cut from one curve that stayed neighbors\n * joined back into one. Null when the edges do not close up into loops that\n * each use every edge once.\n */\nexport function traceLoops(edges: readonly Edge[], vertexCount: number): Seg[][] | null {\n const byKey = new Map<number, number>();\n const out: Edge[][] = Array.from({ length: vertexCount }, () => []);\n edges.forEach((e, i) => {\n byKey.set(e.key, i);\n out[e.from].push(e);\n });\n if (byKey.size !== edges.length) return null;\n const next = edges.map((e) => {\n const k = nextEdge(e, out);\n return k < 0 ? -1 : byKey.get(k)!;\n });\n if (next.includes(-1)) return null;\n\n const loopOf = new Int32Array(edges.length).fill(-1);\n const loops: Seg[][] = [];\n for (let s = 0; s < edges.length; s++) {\n if (loopOf[s] >= 0) continue;\n const loop: number[] = [];\n let e = s;\n do {\n if (loopOf[e] >= 0) return null;\n loopOf[e] = loops.length;\n loop.push(e);\n e = next[e];\n } while (e !== s);\n let first = 0;\n for (let i = 1; i < loop.length; i++) if (edges[loop[i]].key < edges[loop[first]].key) first = i;\n loops.push(rejoin([...loop.slice(first), ...loop.slice(0, first)].map((i) => edges[i])));\n }\n return loops;\n}\n","/**\n * Booleans that keep curves: the operands' outlines are cut where they\n * cross, every piece is kept or dropped by the winding on its two sides, and\n * the kept pieces are joined back into loops. Each curve in the result is a\n * piece of an input curve, cut by de Casteljau subdivision.\n */\n\nimport type { Path, PolygonPath } from '../path';\nimport { PATH_C, PATH_Q } from '../commands';\nimport { resolveCorners } from '../paths/corners';\nimport { type Contour, type Seg, reverseContour, signedArea } from './contourSegments';\nimport { parseContours, extentOf } from './contours';\nimport { writePath } from './cutRegions';\nimport { type Edge, cutEdges } from './curveEdges';\nimport { type CoveredEdge, coverEdges, reversed, windingSet } from './curveClassify';\nimport { traceLoops } from './curveTrace';\n\n/** Inputs with more segments than this go to the polygon clipper, whose sweep scales better. */\nconst MAX_SEGMENTS = 4096;\n\nfunction hasCurve(path: Path): boolean {\n const p = resolveCorners(path);\n return p.kind === 'polygon' && p.commands.some((c) => c === PATH_C || c === PATH_Q);\n}\n\n/** Drop a loop's closing line where it ends at the loop's start, so `Z` draws it. */\nfunction closingTrimmed(loop: Seg[]): Seg[] {\n if (loop.length < 2) return loop;\n const last = loop[loop.length - 1];\n return last.length === 2 ? loop.slice(0, -1) : loop;\n}\n\n/** The operands' outlines cut at every crossing, each piece knowing which operands cover its two sides. */\nexport interface CurveCut {\n edges: CoveredEdge[];\n vertexCount: number;\n /** Per operand, whether its largest contour turns with its fill on the right. */\n clockwise: boolean[];\n}\n\n/**\n * `paths` cut against each other, curves kept. Null where the polygon\n * clipper should answer instead: when no input has a curve, when the inputs\n * are very large, and in the cases this cannot represent — a cubic that\n * crosses itself, or two curves that run nearly along each other without\n * being pieces of one curve. Outlines that share a stretch of one line or\n * curve are cut where it starts and ends, and the pieces along it become one\n * edge that both own.\n */\nexport function cutPaths(paths: readonly Path[]): CurveCut | null {\n if (!paths.some(hasCurve)) return null;\n const operands = paths.map((p) => parseContours(p));\n const count = operands.reduce((n, cs) => n + cs.reduce((m, c) => m + c.length, 0), 0);\n if (count === 0 || count > MAX_SEGMENTS) return null;\n\n const extent = extentOf(operands.flat()) || 1;\n const arrangement = cutEdges(operands, extent * 1e-6);\n if (!arrangement) return null;\n const sets = operands.map((cs, i) => {\n const p = paths[i];\n return windingSet(cs, p.kind === 'polygon' ? p.fillRule : 'nonzero');\n });\n const edges = coverEdges(arrangement.edges, sets, extent * 1e-7);\n if (!edges) return null;\n return { edges, vertexCount: arrangement.points.length, clockwise: operands.map(clockwiseFirst) };\n}\n\n/**\n * The plane split by `label`, given whether each operand covers a point: for\n * every label other than -1 that holds somewhere, the closed loops bounding\n * where it holds, each with its region on the left. Null when a boundary does\n * not close into loops, as at a vertex where two outlines leave in the same\n * direction and stay together.\n */\nexport function curveRegions(cut: CurveCut, label: (inside: boolean[]) => number): Map<number, Contour[]> | null {\n const sides = new Map<number, Edge[]>();\n const add = (k: number, e: Edge) => {\n const list = sides.get(k);\n if (list) list.push(e); else sides.set(k, [e]);\n };\n for (const { edge, inL, inR } of cut.edges) {\n const l = label(inL), r = label(inR);\n if (l === r) continue;\n if (l !== -1) add(l, edge);\n if (r !== -1) add(r, reversed(edge));\n }\n const out = new Map<number, Contour[]>();\n for (const [k, edges] of sides) {\n const loops = traceLoops(edges, cut.vertexCount);\n if (!loops) return null;\n out.set(k, loops);\n }\n return out;\n}\n\n/** `loops` as a nonzero path, turned clockwise when `clockwise`, closing lines left to `Z`. */\nexport function writeLoops(loops: readonly Contour[], clockwise: boolean): PolygonPath {\n const turned = clockwise ? loops.map(reversedFromFirst) : loops;\n return writePath(turned.map((l) => ({ segs: closingTrimmed(l), closed: true })), 'nonzero');\n}\n\n/**\n * The region of the plane where `keep` holds, given whether each of `paths`\n * covers a point, as a nonzero path whose curves are pieces of the inputs'.\n * Null where {@link cutPaths} or {@link curveRegions} is.\n */\nexport function curveBoolean(paths: readonly Path[], keep: (inside: boolean[]) => boolean): PolygonPath | null {\n const cut = cutPaths(paths);\n if (!cut) return null;\n const regions = curveRegions(cut, (inside) => (keep(inside) ? 0 : -1));\n if (!regions) return null;\n // Keep the first operand's turning direction, so a curve that comes through whole comes back as it went in.\n return writeLoops(regions.get(0) ?? [], cut.clockwise[0]);\n}\n\n/** Whether a contour set's largest contour turns with its fill on the right. */\nfunction clockwiseFirst(contours: readonly Contour[]): boolean {\n let best = 0;\n for (const c of contours) {\n const a = signedArea(c);\n if (Math.abs(a) > Math.abs(best)) best = a;\n }\n return best < 0;\n}\n\n/** `loop` reversed, starting at the segment that reverses its first. */\nfunction reversedFromFirst(loop: Contour): Contour {\n const rev = reverseContour(loop);\n return [rev[rev.length - 1], ...rev.slice(0, -1)];\n}\n","/**\n * Divide, face pieces, trim and merge that keep curves: one cut of every\n * outline against the others, its edges labeled by which inputs cover each\n * side, and each label's boundary traced into loops.\n */\n\nimport type { Path, PolygonPath } from '../path';\nimport { type Contour, sampleContour, signedArea } from './contourSegments';\nimport { assembleRegions } from './cutRegions';\nimport { type CurveCut, cutPaths, curveRegions, writeLoops } from './curveBoolean';\n\nexport interface CurvePiece {\n path: PolygonPath;\n sources: number[];\n}\n\nconst covering = (inside: boolean[]): number[] => {\n const s: number[] = [];\n inside.forEach((v, i) => { if (v) s.push(i); });\n return s;\n};\n\nconst maskOf = (sources: readonly number[]): bigint => sources.reduce((m, i) => m | (1n << BigInt(i)), 0n);\n\n/** Left edge, then bottom, of a region's outer loop. */\nfunction corner(loops: readonly Contour[]): [number, number] {\n const pts = sampleContour(loops[0]);\n let x = Infinity, y = Infinity;\n for (let i = 0; i < pts.length; i += 2) { x = Math.min(x, pts[i]); y = Math.min(y, pts[i + 1]); }\n return [x, y];\n}\n\n/** Loops with their region on the left, as connected regions: each outer loop with the holes it holds. */\nfunction connected(loops: readonly Contour[]): Contour[][] {\n const outers: Contour[] = [], holes: Contour[] = [];\n for (const l of loops) (signedArea(l) > 0 ? outers : holes).push(l);\n return assembleRegions(outers, holes);\n}\n\n/**\n * The faces the paths' outlines cut the plane into, grouped by the inputs\n * covering them: one piece per cover set, or with `split` one per connected\n * face. Ordered as `pathDividePieces` orders them. Null where `cutPaths` or\n * `curveRegions` is.\n */\nexport function curveDivide(paths: readonly Path[], split: boolean): CurvePiece[] | null {\n const cut = cutPaths(paths);\n if (!cut) return null;\n const ids = new Map<string, number>();\n const sets: number[][] = [];\n const regions = curveRegions(cut, (inside) => {\n const s = covering(inside);\n if (s.length === 0) return -1;\n const key = s.join(',');\n let id = ids.get(key);\n if (id === undefined) { id = sets.length; ids.set(key, id); sets.push(s); }\n return id;\n });\n if (!regions) return null;\n\n const out: { piece: CurvePiece; mask: bigint; at: [number, number] }[] = [];\n for (const [id, loops] of regions) {\n const sources = sets[id];\n const mask = maskOf(sources);\n for (const face of split ? connected(loops) : [loops]) {\n out.push({ piece: { path: writeLoops(face, cut.clockwise[sources[0]]), sources }, mask, at: corner(face) });\n }\n }\n return out.sort((a, b) =>\n a.piece.sources.length - b.piece.sources.length\n || (a.mask < b.mask ? -1 : a.mask > b.mask ? 1 : 0)\n || a.at[0] - b.at[0] || a.at[1] - b.at[1]).map((o) => o.piece);\n}\n\nconst topmost = (inside: boolean[]): number => inside.lastIndexOf(true);\n\n/** Each input's part left showing, keyed by input; inputs wholly hidden have none. */\nfunction shown(cut: CurveCut): Map<number, Contour[]> | null {\n return curveRegions(cut, topmost);\n}\n\n/** `pathTrim` with curves kept. Null where `cutPaths` or `curveRegions` is. */\nexport function curveTrim(paths: readonly Path[]): CurvePiece[] | null {\n const cut = cutPaths(paths);\n const regions = cut && shown(cut);\n if (!cut || !regions) return null;\n return [...regions.keys()].sort((a, b) => a - b)\n .map((i) => ({ path: writeLoops(regions.get(i)!, cut.clockwise[i]), sources: [i] }));\n}\n\n/** `pathMerge` with curves kept. Null where `cutPaths` or `curveRegions` is. */\nexport function curveMerge(paths: readonly Path[], keyOf: (index: number) => unknown): CurvePiece[] | null {\n const cut = cutPaths(paths);\n const visible = cut && shown(cut);\n if (!cut || !visible) return null;\n const groupIds = new Map<unknown, number>();\n const groupOf = paths.map((_, i) => {\n const key = keyOf(i);\n let g = groupIds.get(key);\n if (g === undefined) { g = groupIds.size; groupIds.set(key, g); }\n return g;\n });\n const regions = curveRegions(cut, (inside) => {\n const top = topmost(inside);\n return top < 0 ? -1 : groupOf[top];\n });\n if (!regions) return null;\n const pieces: CurvePiece[] = [];\n for (const [g, loops] of regions) {\n const sources = [...visible.keys()].filter((i) => groupOf[i] === g).sort((a, b) => a - b);\n pieces.push({ path: writeLoops(loops, cut.clockwise[sources[0]]), sources });\n }\n return pieces.sort((a, b) => a.sources[a.sources.length - 1] - b.sources[b.sources.length - 1]);\n}\n","/**\n * Boolean operations on `Path` values.\n *\n * - Union, intersect, subtract and exclude keep curves: where any input has\n * a curve, each curve in the result is a piece of an input curve\n * (`curveBoolean`). Inputs of straight lines only, very large inputs, and\n * the cases `curveBoolean` declines (self-crossing cubics, some\n * tangencies) are flattened and clipped by `polygon-clipping`\n * instead, so their result has only M/L/Z commands.\n * - Divide, crop, trim, merge and the face pieces keep curves the same\n * way (`curvePieces`), and fall back to the clipper in the same cases.\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 { curveBoolean } from './curveBoolean';\nimport { curveDivide, curveMerge, curveTrim, type CurvePiece } from './curvePieces';\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\ntype Clip = (head: MultiPolygon, ...rest: MultiPolygon[]) => MultiPolygon;\n\n/** `keep` over `paths` with curves kept, or `clip` on their flattening where that declines. */\nfunction boolean(paths: Path[], keep: (inside: boolean[]) => boolean, clip: Clip): PolygonPath {\n if (paths.length === 0) return multiPolygonToPath([]);\n const curved = curveBoolean(paths, keep);\n if (curved) return keepCorners(paths, curved);\n const [head, ...rest] = paths.map((p) => pathToMultiPolygon(p));\n return toPath(clip(head, ...rest), paths);\n}\n\nconst any = (inside: boolean[]): boolean => inside.includes(true);\nconst all = (inside: boolean[]): boolean => !inside.includes(false);\nconst aNotB = (inside: boolean[]): boolean => inside[0] && !inside[1];\nconst odd = (inside: boolean[]): boolean => inside.filter(Boolean).length % 2 === 1;\n\n/** Union of N paths. Commutative. Returns an empty path if all inputs are empty. */\nexport function pathUnion(...paths: Path[]): PolygonPath {\n return boolean(paths, any, polygonClipping.union);\n}\n\n/** Intersection of N paths. Commutative. Empty result is an empty path. */\nexport function pathIntersect(...paths: Path[]): PolygonPath {\n return boolean(paths, all, polygonClipping.intersection);\n}\n\n/** Asymmetric difference: returns `a − b`. */\nexport function pathSubtract(a: Path, b: Path): PolygonPath {\n return boolean([a, b], aNotB, polygonClipping.difference);\n}\n\n/** Symmetric difference (XOR) of N paths: what an odd number of them cover. Commutative. */\nexport function pathExclude(...paths: Path[]): PolygonPath {\n return boolean(paths, odd, polygonClipping.xor);\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/** Curved pieces with the corners of `sources` they still draw whole kept as corners. */\nconst cornered = (pieces: CurvePiece[], sources: readonly Path[]): BooleanPiece[] =>\n pieces.map(({ path, sources: s }) => ({ path: keepCorners(sources, path), sources: s }));\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 curved = curveDivide(paths, false);\n if (curved) return cornered(curved, paths);\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 const curved = curveDivide(paths, true);\n if (curved) return cornered(curved, paths);\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 curved = curveTrim(paths);\n if (curved) return cornered(curved, paths);\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 curved = curveMerge(paths, keyOf);\n if (curved) return cornered(curved, paths);\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 mask = paths[paths.length - 1];\n const out: BooleanPiece[] = [];\n for (let i = 0; i < paths.length - 1; i++) {\n const clipped = pathIntersect(paths[i], mask);\n if (clipped.commands.length > 0) out.push({ path: clipped, sources: [i] });\n }\n return out;\n}\n","/**\n * Closing a mesh's T-junctions before its triangles are unioned. A stroke\n * ribbon puts vertices partway along its neighbors' edges (a join's pivot on\n * a segment's end), and stored as float32 they land a hair to one side. The\n * union then sees two edges that nearly meet instead of one shared edge, and\n * keeps the crack or overlap between them as slivers.\n */\nimport type { Ring } from './adapter';\n\n/** How near an edge a vertex counts as on it: eight float32 ulps of the\n * largest coordinate. */\nconst ON_EDGE = 2 ** -20;\n\n/**\n * Each triangle of the mesh as a closed ring, with every mesh vertex lying on\n * one of its edges inserted into that edge, so that neighbors meeting along\n * an edge share its points exactly. `triangles` holds three vertex indices\n * per triangle, into `vertices` as x, y pairs.\n */\nexport function junctionRings(vertices: ArrayLike<number>, triangles: readonly number[]): Ring[] {\n const n = vertices.length / 2;\n let scale = 0, minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (let i = 0; i < n; i++) {\n const x = vertices[i * 2], y = vertices[i * 2 + 1];\n scale = Math.max(scale, Math.abs(x), Math.abs(y));\n minX = Math.min(minX, x); minY = Math.min(minY, y);\n maxX = Math.max(maxX, x); maxY = Math.max(maxY, y);\n }\n const eps = scale * ON_EDGE;\n const cell = Math.max(maxX - minX, maxY - minY, eps) / Math.max(1, Math.sqrt(n));\n const grid = new Map<string, number[]>();\n const key = (cx: number, cy: number) => `${cx},${cy}`;\n for (const i of new Set(triangles)) {\n const k = key(Math.floor((vertices[i * 2] - minX) / cell), Math.floor((vertices[i * 2 + 1] - minY) / cell));\n const bucket = grid.get(k);\n if (bucket) bucket.push(i); else grid.set(k, [i]);\n }\n\n const onEdge = (p: number, q: number): number[] => {\n const px = vertices[p * 2], py = vertices[p * 2 + 1];\n const dx = vertices[q * 2] - px, dy = vertices[q * 2 + 1] - py;\n const len2 = dx * dx + dy * dy;\n if (len2 === 0) return [];\n const len = Math.sqrt(len2);\n const hits: { i: number; t: number }[] = [];\n const x0 = Math.floor((Math.min(px, px + dx) - eps - minX) / cell), x1 = Math.floor((Math.max(px, px + dx) + eps - minX) / cell);\n const y0 = Math.floor((Math.min(py, py + dy) - eps - minY) / cell), y1 = Math.floor((Math.max(py, py + dy) + eps - minY) / cell);\n for (let cx = x0; cx <= x1; cx++) {\n for (let cy = y0; cy <= y1; cy++) {\n for (const i of grid.get(key(cx, cy)) ?? []) {\n const vx = vertices[i * 2] - px, vy = vertices[i * 2 + 1] - py;\n const t = (vx * dx + vy * dy) / len2;\n if (t * len <= eps || (1 - t) * len <= eps) continue;\n if (Math.abs(vx * dy - vy * dx) / len <= eps) hits.push({ i, t });\n }\n }\n }\n return hits.sort((a, b) => a.t - b.t).map((h) => h.i);\n };\n\n const rings: Ring[] = [];\n for (let k = 0; k + 2 < triangles.length; k += 3) {\n const ring: Ring = [];\n for (let e = 0; e < 3; e++) {\n const p = triangles[k + e], q = triangles[k + ((e + 1) % 3)];\n for (const i of [p, ...onEdge(p, q)]) ring.push([vertices[i * 2], vertices[i * 2 + 1]]);\n }\n ring.push(ring[0]);\n rings.push(ring);\n }\n return rings;\n}\n","/**\n * A triangle mesh's boundary as one ring whose winding number at every point\n * is how many of its triangles cover that point. Edges two triangles share in\n * opposite directions cancel, so a union of the ring under the nonzero rule\n * sweeps only the mesh's outline rather than every interior edge, and none of\n * the near-parallel crossings a thin ribbon's overlapping triangles make.\n */\nimport type { Pair, Ring } from './adapter';\n\n/**\n * The boundary of `rings`, each a closed triangle ring (as `junctionRings`\n * gives them), as one closed ring, or null when every edge cancels. Each\n * triangle counts once, whichever way it winds. Separate loops of the\n * boundary are joined by a bridge walked out and back, which adds nothing to\n * the winding.\n */\nexport function meshOutline(rings: readonly Ring[]): Ring | null {\n const points = new Map<string, Pair>();\n // Directed edge counts, keyed `from|to`; an edge and its reverse cancel.\n const edges = new Map<string, number>();\n const keyOf = (p: Pair): string => {\n const k = `${p[0]},${p[1]}`;\n if (!points.has(k)) points.set(k, p);\n return k;\n };\n for (const ring of rings) {\n const keys = ring.slice(0, -1).map(keyOf);\n if (ringArea(ring) < 0) keys.reverse();\n for (let i = 0; i < keys.length; i++) {\n const a = keys[i], b = keys[(i + 1) % keys.length];\n if (a === b) continue;\n const back = `${b}|${a}`;\n const n = edges.get(back);\n if (n) {\n if (n === 1) edges.delete(back); else edges.set(back, n - 1);\n } else {\n const fwd = `${a}|${b}`;\n edges.set(fwd, (edges.get(fwd) ?? 0) + 1);\n }\n }\n }\n const loops = walkLoops(edges).map((loop) => loop.map((k) => points.get(k)!));\n return loops.length === 0 ? null : bridge(loops);\n}\n\n/** The directed edges left in `edges`, chained into closed loops of point keys. */\nfunction walkLoops(edges: Map<string, number>): string[][] {\n const out = new Map<string, string[]>();\n for (const [edge, n] of edges) {\n const [a, b] = edge.split('|');\n let list = out.get(a);\n if (!list) out.set(a, (list = []));\n for (let i = 0; i < n; i++) list.push(b);\n }\n const loops: string[][] = [];\n for (const start of out.keys()) {\n while ((out.get(start)?.length ?? 0) > 0) {\n const loop = [start];\n let at = out.get(start)!.pop()!;\n while (at !== start) {\n loop.push(at);\n const next = out.get(at);\n // Every point has as many edges in as out, so a walk can only end\n // where it began.\n at = next!.pop()!;\n }\n loops.push(loop);\n }\n }\n return loops;\n}\n\n/**\n * `loops` as one closed ring: each loop entered at its leftmost point from\n * the previous loop's, walked round, and left the way it came in, so every\n * bridge is crossed once each way.\n */\nfunction bridge(loops: Pair[][]): Ring {\n const entered = loops.map((loop) => {\n let k = 0;\n for (let i = 1; i < loop.length; i++) if (loop[i][0] < loop[k][0] || (loop[i][0] === loop[k][0] && loop[i][1] < loop[k][1])) k = i;\n return [...loop.slice(k), ...loop.slice(0, k)];\n });\n entered.sort((a, b) => a[0][0] - b[0][0] || a[0][1] - b[0][1]);\n const ring: Ring = [];\n for (const loop of entered) ring.push(...loop, loop[0]);\n for (let i = entered.length - 2; i >= 0; i--) ring.push(entered[i][0]);\n return ring;\n}\n\nfunction ringArea(ring: Ring): number {\n let a = 0;\n for (let i = 0; i + 1 < ring.length; i++) a += ring[i][0] * ring[i + 1][1] - ring[i + 1][0] * ring[i][1];\n return a;\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 } from './adapter';\nimport { junctionRings } from './meshJunctions';\nimport { meshOutline } from './meshOutline';\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, triangles with no area are skipped, and a vertex lying on another\n * triangle's edge joins it there rather than leaving a crack. The result\n * holds only M/L/Z.\n */\nexport function trianglesToPath(vertices: ArrayLike<number>, indices: ArrayLike<number>): PolygonPath {\n const kept: number[] = [];\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 if ((vertices[b] - ax) * (vertices[c + 1] - ay) - (vertices[c] - ax) * (vertices[b + 1] - ay) === 0) continue;\n kept.push(indices[i], indices[i + 1], indices[i + 2]);\n }\n if (kept.length === 0) return multiPolygonToPath([]);\n const outline = meshOutline(junctionRings(vertices, kept));\n return multiPolygonToPath(outline ? polygonClipping.union([[outline]]) : []);\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 resolved by a union\n * first (see `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 `pathUnion`, which keeps its curves except in the\n * few cases that union flattens (a cubic that crosses itself, say).\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"]}