@weasel-js/geom 1.7.0 → 1.7.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/booleans/adapter.ts","../../src/booleans/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Adapter between geom's path input shape and `polygon-clipping`'s\n * `MultiPolygon` format. Kept in a dedicated module so the dep is one\n * import away from being swappable. Ported from\n * `src/features/paths/booleans.adapter.ts`.\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 (cubic; quadratics are degree-elevated to cubic\n * first) — v1 is straight-line only. Open contours are implicitly closed\n * because boolean ops are defined on closed regions; polylines have zero area\n * and would otherwise be silently dropped.\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 { flattenCubic } from '../flatten';\n\n/** Minimal path input: a rect or a polygon command stream. geom does not\n * import @weasel-js/core's `Path`; the kit maps `Path` onto this shape. */\nexport type GeomPath =\n | { kind: 'rect'; x: number; y: number; width: number; height: number }\n | { kind: 'polygon'; commands: ArrayLike<number>; coords: ArrayLike<number>; fillRule?: 'nonzero' | 'evenodd' };\n\nconst DEFAULT_FLATTEN_TOLERANCE = 0.5;\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\nexport interface PathToMultiPolygonOptions {\n /** Flattening tolerance for bezier segments. Default: `DEFAULT_FLATTEN_TOLERANCE`. */\n tolerance?: number;\n}\n\n/** Polygon result shape emitted by `multiPolygonToPath`. */\nexport type GeomPolygonPath = { kind: 'polygon'; commands: Uint8Array; coords: Float32Array; fillRule: 'nonzero' };\n\n/** Convert a `GeomPath` to a `MultiPolygon` suitable for `polygon-clipping`. */\nexport function pathToMultiPolygon(\n path: GeomPath,\n opts: PathToMultiPolygonOptions = {},\n): MultiPolygon {\n if (path.kind === 'rect') {\n const { x, y, width, height } = path;\n const ring: Ring = [\n [x, y],\n [x + width, y],\n [x + width, y + height],\n [x, y + height],\n [x, y],\n ];\n return [[ring]];\n }\n\n const tolerance = opts.tolerance ?? DEFAULT_FLATTEN_TOLERANCE;\n const rings: Ring[] = [];\n let current: Ring | null = null;\n let cx = 0, cy = 0;\n let ci = 0;\n const { commands, coords } = path;\n\n const finalizeCurrent = () => {\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 current = [[cx, cy]];\n ci += 2;\n break;\n }\n case PATH_L: {\n cx = coords[ci]; cy = coords[ci + 1];\n if (current) 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 if (current) 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 if (current) 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();\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 ?? 'nonzero');\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): GeomPolygonPath {\n // First pass: count total commands and coord floats.\n let nCmds = 0;\n let nCoords = 0;\n for (const poly of mp) {\n for (const ring of poly) {\n if (ring.length < 4) continue; // 3 unique + 1 closing minimum\n // Drop the repeated closing vertex; emit M + (n-2) L + Z.\n const unique = ring.length - 1;\n nCmds += 1 + (unique - 1) + 1; // M + L*(unique-1) + Z\n nCoords += unique * 2;\n }\n }\n const commands = new Uint8Array(nCmds);\n const coords = new Float32Array(nCoords);\n let ci = 0;\n let pi = 0;\n for (const poly of mp) {\n for (const ring of poly) {\n if (ring.length < 4) continue;\n const unique = ring.length - 1;\n // M (first vertex)\n commands[ci++] = PATH_M;\n coords[pi++] = ring[0][0];\n coords[pi++] = ring[0][1];\n // L for vertices 1..unique-1\n for (let k = 1; k < unique; k++) {\n commands[ci++] = PATH_L;\n coords[pi++] = ring[k][0];\n coords[pi++] = ring[k][1];\n }\n // Z\n commands[ci++] = PATH_Z;\n }\n }\n return { kind: 'polygon', commands, coords, fillRule: 'nonzero' };\n}\n","/**\n * Polygon-boolean operations on `GeomPath` values, backed by\n * `polygon-clipping`. Ported from `src/features/paths/booleans.ts`.\n *\n * v1 limitations (documented; see design doc):\n * - Bezier inputs are flattened to straight-line segments before clipping.\n * The result therefore contains only M/L/Z commands.\n * - Open contours are treated as closed for boolean purposes (a polyline\n * has zero area and would otherwise be silently dropped).\n * - Output `fillRule` is always `'nonzero'`. The engine emits canonical\n * non-overlapping rings, so the choice is cosmetic on its output.\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 GeomPath, type GeomPolygonPath } from './adapter';\n\nexport { pathToMultiPolygon, multiPolygonToPath } from './adapter';\nexport type {\n GeomPath, GeomPolygonPath, Pair, Ring, Polygon, MultiPolygon,\n PathToMultiPolygonOptions,\n} from './adapter';\n\n/** Union of N paths. Commutative. Returns an empty path if all inputs are empty. */\nexport function pathUnion(...paths: GeomPath[]): GeomPolygonPath {\n if (paths.length === 0) return multiPolygonToPath([]);\n const mps = paths.map((p) => pathToMultiPolygon(p));\n const [head, ...rest] = mps;\n return multiPolygonToPath(polygonClipping.union(head, ...rest));\n}\n\n/** Intersection of N paths. Commutative. Empty result is an empty path. */\nexport function pathIntersect(...paths: GeomPath[]): GeomPolygonPath {\n if (paths.length === 0) return multiPolygonToPath([]);\n const mps = paths.map((p) => pathToMultiPolygon(p));\n const [head, ...rest] = mps;\n return multiPolygonToPath(polygonClipping.intersection(head, ...rest));\n}\n\n/** Asymmetric difference: returns `a − b`. */\nexport function pathSubtract(a: GeomPath, b: GeomPath): GeomPolygonPath {\n return multiPolygonToPath(polygonClipping.difference(pathToMultiPolygon(a), pathToMultiPolygon(b)));\n}\n\n/** Symmetric difference (XOR) of N paths. Commutative. */\nexport function pathExclude(...paths: GeomPath[]): GeomPolygonPath {\n if (paths.length === 0) return multiPolygonToPath([]);\n const mps = paths.map((p) => pathToMultiPolygon(p));\n const [head, ...rest] = mps;\n return multiPolygonToPath(polygonClipping.xor(head, ...rest));\n}\n\n/**\n * Fracture N paths along every intersection into the maximal set of\n * non-overlapping regions. Returns one polygon path per region.\n *\n * Algorithm: for every non-empty subset S ⊆ {A1..AN}, emit the region\n * `(∩ S) − (∪ complement)` — points covered by exactly the members of S\n * and no others. By construction the emitted regions are pairwise disjoint\n * and their union equals `pathUnion(A1..AN)`.\n *\n * For N=2 this collapses to the three Illustrator \"Divide\" outputs\n * (A−B, B−A, A∩B). For N=3 up to 7 regions are emitted. The 2^N − 1\n * subset count limits this to small N in practice; passing more than ~8\n * inputs is a misuse — the polygon-clipping kernel dominates anyway.\n */\nexport function pathDivide(...paths: GeomPath[]): GeomPolygonPath[] {\n if (paths.length === 0) return [];\n if (paths.length === 1) {\n return [multiPolygonToPath(pathToMultiPolygon(paths[0]))];\n }\n const mps = paths.map((p) => pathToMultiPolygon(p));\n const n = mps.length;\n const out: GeomPolygonPath[] = [];\n\n // Iterate every non-empty subset via bitmask. Emit subsets in size-\n // ascending order so the output is stable and reads \"exclusives first,\n // then pairs, then triples, …\" — matches the old N=2 ordering.\n const subsets: number[] = [];\n for (let mask = 1; mask < 1 << n; mask++) subsets.push(mask);\n subsets.sort((a, b) => popcount(a) - popcount(b) || a - b);\n\n for (const mask of subsets) {\n const inside: typeof mps = [];\n const outside: typeof mps = [];\n for (let i = 0; i < n; i++) {\n (mask & (1 << i) ? inside : outside).push(mps[i]);\n }\n const [insideHead, ...insideRest] = inside;\n let region = insideRest.length === 0\n ? insideHead\n : polygonClipping.intersection(insideHead, ...insideRest);\n if (region.length === 0) continue;\n if (outside.length > 0) {\n const [outHead, ...outRest] = outside;\n const outsideUnion = polygonClipping.union(outHead, ...outRest);\n region = polygonClipping.difference(region, outsideUnion);\n if (region.length === 0) continue;\n }\n out.push(multiPolygonToPath(region));\n }\n\n return out;\n}\n\nfunction popcount(n: number): number {\n let c = 0;\n while (n) { n &= n - 1; c++; }\n return c;\n}\n\n/**\n * Clip each non-topmost path to the topmost path (Illustrator \"Crop\").\n * Returns `N - 1` results, one per source-below-top, in input order.\n * Discards the topmost path itself — it acts purely as the clipping mask.\n *\n * Empty results (a source that lies entirely outside the mask) are\n * filtered. With `<2` inputs the result is empty.\n */\nexport function pathCrop(...paths: GeomPath[]): GeomPolygonPath[] {\n if (paths.length < 2) return [];\n const mps = paths.map((p) => pathToMultiPolygon(p));\n const mask = mps[mps.length - 1];\n const out: GeomPolygonPath[] = [];\n for (let i = 0; i < mps.length - 1; i++) {\n const clipped = polygonClipping.intersection(mps[i], mask);\n if (clipped.length > 0) out.push(multiPolygonToPath(clipped));\n }\n return out;\n}\n"]}
1
+ {"version":3,"sources":["../../src/booleans/adapter.ts","../../src/booleans/ops.ts","../../src/booleans/splitBySegment.ts"],"names":["a","b","c","l","r","k"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Adapter between `Path` and `polygon-clipping`'s `MultiPolygon` format.\n * Kept in a dedicated module so the dep is one import away from being\n * swappable.\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 (cubic; quadratics are degree-elevated to cubic\n * first) — v1 is straight-line only. Open contours are implicitly closed\n * because boolean ops are defined on closed regions; polylines have zero area\n * and would otherwise be silently dropped.\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 type { Path, PolygonPath } from '../path';\n\n/** A `[x, y]` 2-tuple. */\nexport type Pair = [number, number];\n/** Closed ring (first vertex repeated as last). */\nexport type Ring = Pair[];\n/** Polygon: one outer ring optionally followed by hole rings. */\nexport type Polygon = Ring[];\n/** MultiPolygon: list of polygons (used for boolean op I/O). */\nexport type MultiPolygon = Polygon[];\n\n/** Options for `pathToMultiPolygon`. */\nexport interface PathToMultiPolygonOptions {\n /** Flattening tolerance for bezier segments. Default: `DEFAULT_FLATTEN_TOLERANCE`. */\n tolerance?: number;\n}\n\n/** Convert a `Path` to a `MultiPolygon` suitable for `polygon-clipping`. */\nexport function pathToMultiPolygon(\n path: Path,\n opts: PathToMultiPolygonOptions = {},\n): MultiPolygon {\n if (path.kind === 'rect') {\n const { x, y, width, height } = path;\n const ring: Ring = [\n [x, y],\n [x + width, y],\n [x + width, y + height],\n [x, y + height],\n [x, y],\n ];\n return [[ring]];\n }\n\n const tolerance = opts.tolerance ?? DEFAULT_FLATTEN_TOLERANCE;\n const rings: Ring[] = [];\n let current: Ring | null = null;\n let cx = 0, cy = 0;\n let ci = 0;\n const { commands, coords } = path;\n\n const finalizeCurrent = () => {\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 current = [[cx, cy]];\n ci += 2;\n break;\n }\n case PATH_L: {\n cx = coords[ci]; cy = coords[ci + 1];\n if (current) 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 if (current) 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 if (current) 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();\n break;\n }\n default:\n throw new Error(`pathToMultiPolygon: unknown command ${cmd}`);\n }\n }\n finalizeCurrent();\n\n if (rings.length === 0) return [];\n return groupRings(rings, path.fillRule);\n}\n\n/** Shoelace area of a closed ring. Sign gives the winding direction. */\nfunction ringSignedArea(ring: Ring): number {\n let a = 0;\n for (let i = 0, n = ring.length - 1; i < n; i++) {\n a += ring[i][0] * ring[i + 1][1] - ring[i + 1][0] * ring[i][1];\n }\n return a * 0.5;\n}\n\ntype RingBox = [number, number, number, number];\n\nfunction ringBox(ring: Ring): RingBox {\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (const [x, y] of ring) {\n if (x < minX) minX = x;\n if (x > maxX) maxX = x;\n if (y < minY) minY = y;\n if (y > maxY) maxY = y;\n }\n return [minX, minY, maxX, maxY];\n}\n\n/** Even-odd ray cast; used only to decide ring nesting, never to fill. */\nfunction pointInRing(ring: Ring, px: number, py: number): boolean {\n let inside = false;\n for (let i = 0, n = ring.length - 1; i < n; i++) {\n const [ax, ay] = ring[i];\n const [bx, by] = ring[i + 1];\n if ((ay > py) !== (by > py) && px < ((bx - ax) * (py - ay)) / (by - ay) + ax) {\n inside = !inside;\n }\n }\n return inside;\n}\n\n/**\n * Nesting test by majority vote over three sample vertices — a single sample\n * gives the wrong answer whenever it lands exactly on the outer ring.\n */\nfunction ringContains(outer: Ring, outerBox: RingBox, inner: Ring, innerBox: RingBox): boolean {\n if (innerBox[0] < outerBox[0] || innerBox[1] < outerBox[1]\n || innerBox[2] > outerBox[2] || innerBox[3] > outerBox[3]) return false;\n const n = inner.length - 1;\n let votes = 0;\n for (const k of [0, Math.floor(n / 3), Math.floor((2 * n) / 3)]) {\n if (pointInRing(outer, inner[k][0], inner[k][1])) votes++;\n }\n return votes >= 2;\n}\n\n/**\n * Resolve rings into `polygon-clipping` polygons (outer ring first, hole\n * rings after) by nesting depth and `fillRule`.\n *\n * Without this a path's own holes are lost: separate polygons in a\n * MultiPolygon are unioned, so a donut arrives at the clipper as a solid disc.\n *\n * Rings that bound no boundary of the filled region — a same-winding ring\n * nested inside a nonzero fill — are dropped; they contribute nothing.\n */\nfunction groupRings(rings: Ring[], fillRule: 'nonzero' | 'evenodd'): MultiPolygon {\n const n = rings.length;\n if (n === 1) return [[rings[0]]];\n\n const boxes = rings.map(ringBox);\n const orient = rings.map((r) => (ringSignedArea(r) >= 0 ? 1 : -1));\n const parent = new Array<number>(n).fill(-1);\n const children: number[][] = rings.map(() => []);\n\n for (let i = 0; i < n; i++) {\n let best = -1;\n let bestArea = Infinity;\n for (let j = 0; j < n; j++) {\n if (i === j) continue;\n if (!ringContains(rings[j], boxes[j], rings[i], boxes[i])) continue;\n const area = (boxes[j][2] - boxes[j][0]) * (boxes[j][3] - boxes[j][1]);\n if (area < bestArea) { bestArea = area; best = j; }\n }\n parent[i] = best;\n }\n for (let i = 0; i < n; i++) if (parent[i] >= 0) children[parent[i]].push(i);\n\n const filled = new Array<boolean>(n);\n for (let i = 0; i < n; i++) {\n let depth = 0;\n let winding = 0;\n for (let a: number = i; a >= 0; a = parent[a]) {\n winding += orient[a];\n if (a !== i) depth++;\n }\n filled[i] = fillRule === 'evenodd' ? depth % 2 === 0 : winding !== 0;\n }\n\n const out: MultiPolygon = [];\n for (let i = 0; i < n; i++) {\n if (!filled[i]) continue;\n if (parent[i] >= 0 && filled[parent[i]]) continue;\n const polygon: Polygon = [rings[i]];\n const queue = [...children[i]];\n while (queue.length > 0) {\n const c = queue.pop() as number;\n // An unfilled child bounds a hole; a filled one merges into this\n // region, so its own children are what may punch holes in it.\n if (filled[c]) queue.push(...children[c]);\n else polygon.push(rings[c]);\n }\n out.push(polygon);\n }\n return out;\n}\n\n/** Convert a `MultiPolygon` to a polygon path with `fillRule: 'nonzero'`. */\nexport function multiPolygonToPath(mp: MultiPolygon): PolygonPath {\n // First pass: count total commands and coord floats.\n let nCmds = 0;\n let nCoords = 0;\n for (const poly of mp) {\n for (const ring of poly) {\n if (ring.length < 4) continue; // 3 unique + 1 closing minimum\n // Drop the repeated closing vertex; emit M + (n-2) L + Z.\n const unique = ring.length - 1;\n nCmds += 1 + (unique - 1) + 1; // M + L*(unique-1) + Z\n nCoords += unique * 2;\n }\n }\n const commands = new Uint8Array(nCmds);\n const coords = new Float32Array(nCoords);\n let ci = 0;\n let pi = 0;\n for (const poly of mp) {\n for (const ring of poly) {\n if (ring.length < 4) continue;\n const unique = ring.length - 1;\n // M (first vertex)\n commands[ci++] = PATH_M;\n coords[pi++] = ring[0][0];\n coords[pi++] = ring[0][1];\n // L for vertices 1..unique-1\n for (let k = 1; k < unique; k++) {\n commands[ci++] = PATH_L;\n coords[pi++] = ring[k][0];\n coords[pi++] = ring[k][1];\n }\n // Z\n commands[ci++] = PATH_Z;\n }\n }\n return { kind: 'polygon', commands, coords, fillRule: 'nonzero' };\n}\n","/**\n * Polygon-boolean operations on `Path` values, backed by\n * `polygon-clipping`.\n *\n * v1 limitations (documented; see design doc):\n * - Bezier inputs are flattened to straight-line segments before clipping.\n * The result therefore contains only M/L/Z commands.\n * - Open contours are treated as closed for boolean purposes (a polyline\n * has zero area and would otherwise be silently dropped).\n * - Output `fillRule` is always `'nonzero'`. The engine emits canonical\n * non-overlapping rings, so the choice is cosmetic on its output.\n *\n * This is the ONLY geom module that depends on `polygon-clipping`; it lives in\n * the `@weasel-js/geom/booleans` subpath so the core stays `deps: {}`.\n */\nimport polygonClipping from 'polygon-clipping';\nimport { pathToMultiPolygon, multiPolygonToPath } from './adapter';\nimport type { Path, PolygonPath } from '../path';\n\n/** Union of N paths. Commutative. Returns an empty path if all inputs are empty. */\nexport function pathUnion(...paths: Path[]): PolygonPath {\n if (paths.length === 0) return multiPolygonToPath([]);\n const mps = paths.map((p) => pathToMultiPolygon(p));\n const [head, ...rest] = mps;\n return multiPolygonToPath(polygonClipping.union(head, ...rest));\n}\n\n/** Intersection of N paths. Commutative. Empty result is an empty path. */\nexport function pathIntersect(...paths: Path[]): PolygonPath {\n if (paths.length === 0) return multiPolygonToPath([]);\n const mps = paths.map((p) => pathToMultiPolygon(p));\n const [head, ...rest] = mps;\n return multiPolygonToPath(polygonClipping.intersection(head, ...rest));\n}\n\n/** Asymmetric difference: returns `a − b`. */\nexport function pathSubtract(a: Path, b: Path): PolygonPath {\n return multiPolygonToPath(polygonClipping.difference(pathToMultiPolygon(a), pathToMultiPolygon(b)));\n}\n\n/** Symmetric difference (XOR) of N paths. Commutative. */\nexport function pathExclude(...paths: Path[]): PolygonPath {\n if (paths.length === 0) return multiPolygonToPath([]);\n const mps = paths.map((p) => pathToMultiPolygon(p));\n const [head, ...rest] = mps;\n return multiPolygonToPath(polygonClipping.xor(head, ...rest));\n}\n\n/**\n * Fracture N paths along every intersection into the maximal set of\n * non-overlapping regions. Returns one polygon path per region.\n *\n * Algorithm: for every non-empty subset S ⊆ {A1..AN}, emit the region\n * `(∩ S) − (∪ complement)` — points covered by exactly the members of S\n * and no others. By construction the emitted regions are pairwise disjoint\n * and their union equals `pathUnion(A1..AN)`.\n *\n * For N=2 this collapses to the three Illustrator \"Divide\" outputs\n * (A−B, B−A, A∩B). For N=3 up to 7 regions are emitted. The 2^N − 1\n * subset count limits this to small N in practice; passing more than ~8\n * inputs is a misuse — the polygon-clipping kernel dominates anyway.\n */\nexport function pathDivide(...paths: Path[]): PolygonPath[] {\n if (paths.length === 0) return [];\n if (paths.length === 1) {\n return [multiPolygonToPath(pathToMultiPolygon(paths[0]))];\n }\n const mps = paths.map((p) => pathToMultiPolygon(p));\n const n = mps.length;\n const out: PolygonPath[] = [];\n\n // Iterate every non-empty subset via bitmask. Emit subsets in size-\n // ascending order so the output is stable and reads \"exclusives first,\n // then pairs, then triples, …\" — matches the old N=2 ordering.\n const subsets: number[] = [];\n for (let mask = 1; mask < 1 << n; mask++) subsets.push(mask);\n subsets.sort((a, b) => popcount(a) - popcount(b) || a - b);\n\n for (const mask of subsets) {\n const inside: typeof mps = [];\n const outside: typeof mps = [];\n for (let i = 0; i < n; i++) {\n (mask & (1 << i) ? inside : outside).push(mps[i]);\n }\n const [insideHead, ...insideRest] = inside;\n let region = insideRest.length === 0\n ? insideHead\n : polygonClipping.intersection(insideHead, ...insideRest);\n if (region.length === 0) continue;\n if (outside.length > 0) {\n const [outHead, ...outRest] = outside;\n const outsideUnion = polygonClipping.union(outHead, ...outRest);\n region = polygonClipping.difference(region, outsideUnion);\n if (region.length === 0) continue;\n }\n out.push(multiPolygonToPath(region));\n }\n\n return out;\n}\n\nfunction popcount(n: number): number {\n let c = 0;\n while (n) { n &= n - 1; c++; }\n return c;\n}\n\n/**\n * Clip each non-topmost path to the topmost path (Illustrator \"Crop\").\n * Returns `N - 1` results, one per source-below-top, in input order.\n * Discards the topmost path itself — it acts purely as the clipping mask.\n *\n * Empty results (a source that lies entirely outside the mask) are\n * filtered. With `<2` inputs the result is empty.\n */\nexport function pathCrop(...paths: Path[]): PolygonPath[] {\n if (paths.length < 2) return [];\n const mps = paths.map((p) => pathToMultiPolygon(p));\n const mask = mps[mps.length - 1];\n const out: PolygonPath[] = [];\n for (let i = 0; i < mps.length - 1; i++) {\n const clipped = polygonClipping.intersection(mps[i], mask);\n if (clipped.length > 0) out.push(multiPolygonToPath(clipped));\n }\n return out;\n}\n","import { splitCubicAt, splitQuadraticAt } from '../curve';\nimport { segmentsCross, pointInPolygon } from '../polyline';\nimport type { Path, PolygonPath, PathFillRule } from '../path';\nimport { PATH_C, PATH_L, PATH_M, PATH_Q, PATH_Z } from '../commands';\nimport type { Point } from '../paths/cubicMath';\nimport { pathUnion } from './ops';\n\nexport type { Point };\n\n/** Options for `splitPathBySegment` and `splitPathByPolyline`. */\nexport interface SplitBySegmentOptions {\n /**\n * Flattening tolerance for the check that decides whether contours cross\n * each other. Only a path whose contours do cross is flattened (see\n * `splitPathByPolyline`).\n */\n flattenTolerance?: number;\n}\n\n/** A Bézier segment by its control points: 2 = line, 3 = quadratic, 4 = cubic. */\ntype Seg = Point[];\ntype Contour = Seg[];\n\n/** A point on a contour: segment index and parameter. */\ninterface Station {\n seg: number;\n t: number;\n pt: Point;\n}\n\ninterface 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 * 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). A\n * freehand cut is a polyline through its samples.\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, so a concave shape splits exactly where the stroke crosses\n * it. Curves are split at the crossing parameters by de Casteljau\n * subdivision, so every piece traces the original boundary exactly and keeps\n * its quadratic and cubic segments; the new edges follow the cut as straight\n * 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, so a cross-hatch yields every piece.\n *\n * Each connected piece the cut produces is returned as its own path, holes\n * included. Contours the cut misses entirely are returned together as one\n * final piece. A single chord that does not disconnect the shape (across a\n * ring, say) returns one slit piece.\n *\n * A path whose contours cross each other or themselves is first resolved into\n * non-overlapping rings by a polygon union, which flattens its curves.\n *\n * Returns `null` when no chord is cut.\n */\nexport function splitPathByPolyline(\n path: Path,\n cut: readonly Point[],\n opts: SplitBySegmentOptions = {},\n): Path[] | null {\n let pts = distinctPoints(cut);\n if (pts.length < 2) return null;\n const outRule = fillRuleOf(path);\n const boundaries = resolveBoundaries(path, opts);\n if (boundaries.length === 0) return null;\n\n pts = openClosedCut(pts, boundaries);\n const loops = interiorLoops(pts, boundaries);\n const pieces = knife(path, pts, opts, pts.length);\n if (loops.length === 0) return pieces;\n\n const regions = pieces ? pieces.map((p) => orientBoundaries(parseContours(p), outRule)) : [boundaries];\n if (!cutOutLoops(regions, loops)) return pieces;\n return regions.map((r) => toPath(r, outRule));\n}\n\nconst fillRuleOf = (path: Path): PathFillRule => (path.kind === 'polygon' ? path.fillRule : 'nonzero');\n\n/** The contours bounding `path`'s fill, fill on their left. Contours that\n * cross are first resolved by a union. */\nfunction resolveBoundaries(path: Path, opts: SplitBySegmentOptions): Contour[] {\n const contours = parseContours(path);\n if (contoursIntersect(contours, opts.flattenTolerance ?? 0.5)) {\n return orientBoundaries(parseContours(pathUnion(path)), 'nonzero');\n }\n return orientBoundaries(contours, fillRuleOf(path));\n}\n\nfunction knife(path: Path, cut: Point[], opts: SplitBySegmentOptions, budget: number): Path[] | null {\n const outRule = fillRuleOf(path);\n const boundaries = resolveBoundaries(path, opts);\n if (boundaries.length === 0) return null;\n\n const crossings = findCrossings(boundaries, cut);\n const partner = new Map<Crossing, Crossing>();\n const chord = new Map<Crossing, Point[]>();\n const accepted: Point[][] = [];\n let deferred = false;\n for (let k = 0; k + 1 < crossings.length; k++) {\n const c0 = crossings[k], c1 = crossings[k + 1];\n if (!c0.enters || c1.enters || c1.s - c0.s <= 1e-9) continue;\n const run = splitLoops(cutBetween(cut, c0, c1)).spine;\n if (accepted.some((other) => polylinesCross(run, other))) { deferred = true; continue; }\n accepted.push(run);\n partner.set(c0, c1);\n partner.set(c1, c0);\n chord.set(c0, run);\n chord.set(c1, run.slice().reverse());\n }\n if (partner.size === 0) return null;\n\n const { loops, untouched } = traceLoops(boundaries, partner, chord);\n\n const traced = assembleRegions(loops, untouched.filter((c) => signedArea(c) < 0));\n const islands = untouched.filter((c) => signedArea(c) > 0);\n const regions: Contour[][] = traced.filter((r) => Math.abs(regionArea(r)) > 1e-6);\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 same = (p: Point, q: Point) => Math.abs(p.x - q.x) <= 1e-7 && Math.abs(p.y - q.y) <= 1e-7;\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\n// ---------------------------------------------------------------------------\n// Cut polylines\n// ---------------------------------------------------------------------------\n\nfunction 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. */\nfunction 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 */\nfunction 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 */\nfunction 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 */\nfunction 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 */\nfunction cutOutLoops(regions: Contour[][], loops: Point[][]): boolean {\n let cut = false;\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) <= 1e-6) 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\nfunction 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\n// ---------------------------------------------------------------------------\n// Segment math\n// ---------------------------------------------------------------------------\n\nfunction evalSeg(s: Seg, t: number): Point {\n const u = 1 - t;\n if (s.length === 2) return { x: u * s[0].x + t * s[1].x, y: u * s[0].y + t * s[1].y };\n if (s.length === 3) {\n const a = u * u, b = 2 * u * t, c = t * t;\n return { x: a * s[0].x + b * s[1].x + c * s[2].x, y: a * s[0].y + b * s[1].y + c * s[2].y };\n }\n const a = u * u * u, b = 3 * u * u * t, c = 3 * u * t * t, d = t * t * t;\n return {\n x: a * s[0].x + b * s[1].x + c * s[2].x + d * s[3].x,\n y: a * s[0].y + b * s[1].y + c * s[2].y + d * s[3].y,\n };\n}\n\nfunction derivSeg(s: Seg, t: number): Point {\n const n = s.length - 1;\n const d: Seg = [];\n for (let i = 0; i < n; i++) d.push({ x: n * (s[i + 1].x - s[i].x), y: n * (s[i + 1].y - s[i].y) });\n return d.length === 1 ? d[0] : evalSeg(d, t);\n}\n\nfunction splitSeg(s: Seg, t: number): [Seg, Seg] {\n const pts = (c: ArrayLike<number>): Seg => {\n const out: Seg = [];\n for (let i = 0; i < c.length; i += 2) out.push({ x: c[i], y: c[i + 1] });\n return out;\n };\n if (s.length === 2) {\n const m = evalSeg(s, t);\n return [[s[0], m], [m, s[1]]];\n }\n if (s.length === 3) {\n const [l, r] = splitQuadraticAt(s[0].x, s[0].y, s[1].x, s[1].y, s[2].x, s[2].y, t);\n return [pts(l), pts(r)];\n }\n const [l, r] = splitCubicAt(s[0].x, s[0].y, s[1].x, s[1].y, s[2].x, s[2].y, s[3].x, s[3].y, t);\n return [pts(l), pts(r)];\n}\n\n/** The part of `s` between t0 and t1, with its ends snapped to the given points. */\nfunction subSeg(s: Seg, t0: number, t1: number, p0: Point, p1: Point): Seg | null {\n if (t1 - t0 <= 0) return null;\n let out = s;\n if (t0 > 0) out = splitSeg(out, t0)[1];\n const u = (t1 - t0) / (1 - t0);\n if (u < 1) out = splitSeg(out, u)[0];\n out = out.slice();\n out[0] = p0;\n out[out.length - 1] = p1;\n return out;\n}\n\nconst reverseContour = (c: Contour): Contour => c.map((s) => s.slice().reverse()).reverse();\n\n/** Points along a contour for area and containment estimates. */\nfunction sampleContour(c: Contour): number[] {\n const out: number[] = [];\n for (const s of c) {\n const n = s.length === 2 ? 1 : 16;\n for (let i = 0; i < n; i++) {\n const p = evalSeg(s, i / n);\n out.push(p.x, p.y);\n }\n }\n return out;\n}\n\n/** Signed area; positive when the fill lies to the left of the direction of travel. */\nfunction signedArea(c: Contour): number {\n const pts = sampleContour(c);\n let a = 0;\n for (let i = 0; i < pts.length; i += 2) {\n const j = (i + 2) % pts.length;\n a += pts[i] * pts[j + 1] - pts[j] * pts[i + 1];\n }\n return a / 2;\n}\n\n// ---------------------------------------------------------------------------\n// Roots of a segment against a line\n// ---------------------------------------------------------------------------\n\n/** Bernstein coefficients of the signed distance cross(d, P − o) along `s`. */\nfunction sideCoeffs(s: Seg, o: Point, d: Point): number[] {\n return s.map((p) => d.x * (p.y - o.y) - d.y * (p.x - o.x));\n}\n\nfunction bernstein(f: number[], t: number): number {\n const u = 1 - t;\n if (f.length === 2) return u * f[0] + t * f[1];\n if (f.length === 3) return u * u * f[0] + 2 * u * t * f[1] + t * t * f[2];\n return u * u * u * f[0] + 3 * u * u * t * f[1] + 3 * u * t * t * f[2] + t * t * t * f[3];\n}\n\ninterface SignChange { t: number; before: number; after: number }\n\n/**\n * Where the polynomial changes sign on [0, 1]. The interval is cut at the\n * derivative's roots so each piece is monotonic, then each sign change is\n * bisected. Tangencies have no sign change and are skipped. With\n * `zeroIsPositive` a zero counts as positive, so a change landing exactly on\n * an end is still seen once; otherwise zeros at the ends are left to the\n * caller.\n */\nfunction signChanges(f: number[], zeroIsPositive: boolean): SignChange[] {\n const sgn = (v: number) => (v > 0 ? 1 : v < 0 ? -1 : zeroIsPositive ? 1 : 0);\n const cuts = [0, ...criticalPoints(f), 1];\n const out: SignChange[] = [];\n for (let i = 0; i + 1 < cuts.length; i++) {\n let lo = cuts[i], hi = cuts[i + 1];\n const slo = sgn(bernstein(f, lo)), shi = sgn(bernstein(f, hi));\n if (slo === 0 && i > 0) {\n const before = sgn(bernstein(f, lo - 1e-7)), after = sgn(bernstein(f, lo + 1e-7));\n if (before * after < 0) out.push({ t: lo, before, after });\n }\n if (slo * shi >= 0) continue;\n for (let it = 0; it < 64; it++) {\n const mid = (lo + hi) / 2;\n if (sgn(bernstein(f, mid)) === slo) lo = mid; else hi = mid;\n }\n out.push({ t: (lo + hi) / 2, before: slo, after: shi });\n }\n return out;\n}\n\n/** Roots in (0, 1) of the derivative of a Bernstein polynomial of degree ≤ 3. */\nfunction criticalPoints(f: number[]): number[] {\n if (f.length < 3) return [];\n const n = f.length - 1;\n const d = f.slice(1).map((v, i) => n * (v - f[i]));\n // Power basis of the derivative: A t² + B t + C.\n let A = 0, B: number, C: number;\n if (d.length === 2) { B = d[1] - d[0]; C = d[0]; }\n else { A = d[0] - 2 * d[1] + d[2]; B = 2 * (d[1] - d[0]); C = d[0]; }\n const out: number[] = [];\n const scale = Math.max(Math.abs(A), Math.abs(B), Math.abs(C)) || 1;\n if (Math.abs(A) / scale < 1e-12) {\n if (Math.abs(B) / scale > 1e-12) out.push(-C / B);\n } else {\n const disc = B * B - 4 * A * C;\n if (disc >= 0) {\n const q = -0.5 * (B + Math.sign(B || 1) * Math.sqrt(disc));\n out.push(q / A);\n if (q !== 0) out.push(C / q);\n }\n }\n return out.filter((t) => t > 0 && t < 1).sort((x, y) => x - y);\n}\n\n/** Sign of f just after t = 0 (`fromStart`) or just before t = 1, read off the control values. */\nfunction endSide(f: number[], fromStart: boolean): number {\n const n = f.length;\n for (let i = 1; i < n; i++) {\n const v = fromStart ? f[i] : f[n - 1 - i];\n if (v !== 0) return Math.sign(v);\n }\n return 0;\n}\n\n// ---------------------------------------------------------------------------\n// Contours\n// ---------------------------------------------------------------------------\n\n/** Closed contours of `path`. Open subpaths close implicitly, as a fill does. */\nfunction parseContours(path: Path): Contour[] {\n return parseSubpaths(path).map((s) => s.segs);\n}\n\ninterface Subpath {\n segs: Contour;\n /** Closed by a `Z` (or a rect); the closing edge, if any, is in `segs`. */\n closed: boolean;\n}\n\n/**\n * Subpaths of `path` with their segments. With `implicitClose` (the default,\n * as a fill sees them) every subpath ends in its closing edge; without it,\n * only a subpath closed by `Z` does, as a stroke sees them.\n */\nfunction parseSubpaths(path: Path, implicitClose = true): Subpath[] {\n if (path.kind === 'rect') {\n const { x, y, width: w, height: h } = path;\n const p = [{ x, y }, { x: x + w, y }, { x: x + w, y: y + h }, { x, y: y + h }];\n return [{ segs: p.map((q, i) => [q, p[(i + 1) % 4]]), closed: true }];\n }\n const out: Subpath[] = [];\n let cur: Contour = [];\n let start: Point = { x: 0, y: 0 };\n let pen: Point = start;\n const finish = (closed: boolean) => {\n if (cur.length > 0 && (closed || implicitClose) && (pen.x !== start.x || pen.y !== start.y)) {\n cur.push([pen, start]);\n }\n if (cur.length > 0) out.push({ segs: cur, closed });\n cur = [];\n pen = start;\n };\n const c = path.coords;\n let k = 0;\n for (const cmd of path.commands) {\n if (cmd === PATH_M) {\n finish(false);\n start = pen = { x: c[k], y: c[k + 1] };\n k += 2;\n } else if (cmd === PATH_L) {\n const e = { x: c[k], y: c[k + 1] };\n if (e.x !== pen.x || e.y !== pen.y) cur.push([pen, e]);\n pen = e;\n k += 2;\n } else if (cmd === PATH_Q) {\n const e = { x: c[k + 2], y: c[k + 3] };\n cur.push([pen, { x: c[k], y: c[k + 1] }, e]);\n pen = e;\n k += 4;\n } else if (cmd === PATH_C) {\n const e = { x: c[k + 4], y: c[k + 5] };\n cur.push([pen, { x: c[k], y: c[k + 1] }, { x: c[k + 2], y: c[k + 3] }, e]);\n pen = e;\n k += 6;\n } else if (cmd === PATH_Z) {\n finish(true);\n }\n }\n finish(false);\n return out;\n}\n\n/** Whether any contour crosses another or itself, judged on a flattening. */\nfunction contoursIntersect(contours: Contour[], tol: number): boolean {\n type Edge = { x0: number; y0: number; x1: number; y1: number; c: number; i: number; n: number };\n const edges: Edge[] = [];\n contours.forEach((contour, ci) => {\n const pts: Point[] = [];\n for (const s of contour) {\n let n = 1;\n if (s.length > 2) {\n let len = 0;\n for (let i = 0; i + 1 < s.length; i++) len += Math.hypot(s[i + 1].x - s[i].x, s[i + 1].y - s[i].y);\n n = Math.min(64, Math.max(2, Math.ceil(Math.sqrt(len / Math.max(tol, 1e-3)))));\n }\n for (let i = 0; i < n; i++) pts.push(evalSeg(s, i / n));\n }\n for (let i = 0; i < pts.length; i++) {\n const p = pts[i], q = pts[(i + 1) % pts.length];\n edges.push({ x0: p.x, y0: p.y, x1: q.x, y1: q.y, c: ci, i, n: pts.length });\n }\n });\n for (let i = 0; i < edges.length; i++) {\n const e = edges[i];\n for (let j = i + 1; j < edges.length; j++) {\n const f = edges[j];\n if (e.c === f.c && (j - i === 1 || (i === 0 && f.i === f.n - 1))) continue;\n if (Math.max(e.x0, e.x1) < Math.min(f.x0, f.x1) || Math.max(f.x0, f.x1) < Math.min(e.x0, e.x1)) continue;\n if (Math.max(e.y0, e.y1) < Math.min(f.y0, f.y1) || Math.max(f.y0, f.y1) < Math.min(e.y0, e.y1)) continue;\n if (segmentsCross(e.x0, e.y0, e.x1, e.y1, f.x0, f.y0, f.x1, f.y1)) return true;\n }\n }\n return false;\n}\n\n/** Winding number of `q`, by a ray cast in +x against the exact curves. */\nfunction windingAt(q: Point, contours: Contour[]): number {\n const dir = { x: 1, y: 0 };\n let w = 0;\n for (const contour of contours) {\n for (const s of contour) {\n for (const c of signChanges(sideCoeffs(s, q, dir), true)) {\n if (evalSeg(s, c.t).x > q.x) w += c.after > 0 ? 1 : -1;\n }\n }\n }\n return w;\n}\n\n/**\n * The contours that bound the fill, each turned so the fill lies on its left.\n * A contour with fill on both sides or neither (a same-direction inner ring\n * under nonzero) bounds nothing and is dropped.\n */\nfunction orientBoundaries(contours: Contour[], fillRule: PathFillRule): Contour[] {\n const filled = (q: Point) => {\n const w = windingAt(q, contours);\n return fillRule === 'evenodd' ? (w & 1) !== 0 : w !== 0;\n };\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (const c of contours) for (const s of c) for (const p of s) {\n minX = Math.min(minX, p.x); maxX = Math.max(maxX, p.x);\n minY = Math.min(minY, p.y); maxY = Math.max(maxY, p.y);\n }\n const eps = Math.max(Math.hypot(maxX - minX, maxY - minY) * 1e-6, 1e-9);\n\n const out: Contour[] = [];\n for (const contour of contours) {\n let probe = contour[0];\n let best = -1;\n for (const s of contour) {\n const len = Math.hypot(s[s.length - 1].x - s[0].x, s[s.length - 1].y - s[0].y);\n if (len > best) { best = len; probe = s; }\n }\n const p = evalSeg(probe, 0.5);\n let tan = derivSeg(probe, 0.5);\n const tl = Math.hypot(tan.x, tan.y);\n if (tl === 0) continue;\n tan = { x: tan.x / tl, y: tan.y / tl };\n const left = filled({ x: p.x - tan.y * eps, y: p.y + tan.x * eps });\n const right = filled({ x: p.x + tan.y * eps, y: p.y - tan.x * eps });\n if (left && !right) out.push(contour);\n else if (right && !left) out.push(reverseContour(contour));\n }\n return out;\n}\n\n// ---------------------------------------------------------------------------\n// Crossings and tracing\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 */\nfunction 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. */\nfunction 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\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 */\nfunction 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. */\nfunction 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\n// ---------------------------------------------------------------------------\n// Output\n// ---------------------------------------------------------------------------\n\n/** Group loops into regions: each positive loop with the holes it immediately contains. */\nfunction assembleRegions(outers: Contour[], holes: Contour[]): Contour[][] {\n const regions = outers.map((o) => ({ loops: [o], ring: sampleContour(o), area: signedArea(o) }));\n for (const h of holes) {\n const hp = evalSeg(h[0], 0.5);\n let best: (typeof regions)[number] | null = null;\n for (const r of regions) {\n if (pointInPolygon(r.ring, hp.x, hp.y) && (!best || r.area < best.area)) best = r;\n }\n best?.loops.push(h);\n }\n return regions.map((r) => r.loops);\n}\n\nconst regionArea = (r: Contour[]): number => r.reduce((s, c) => s + signedArea(c), 0);\n\nconst toPath = (loops: Contour[], fillRule: PathFillRule): PolygonPath =>\n writePath(loops.map((segs) => ({ segs, closed: true })), fillRule);\n\nfunction writePath(subpaths: Subpath[], fillRule: PathFillRule): PolygonPath {\n const cmds: number[] = [];\n const xs: number[] = [];\n for (const { segs, closed } of subpaths) {\n cmds.push(PATH_M);\n xs.push(segs[0][0].x, segs[0][0].y);\n for (const s of segs) {\n cmds.push(s.length === 2 ? PATH_L : s.length === 3 ? PATH_Q : PATH_C);\n for (let i = 1; i < s.length; i++) xs.push(s[i].x, s[i].y);\n }\n if (closed) cmds.push(PATH_Z);\n }\n return { kind: 'polygon', commands: new Uint8Array(cmds), coords: new Float32Array(xs), fillRule };\n}\n"]}
@@ -0,0 +1,172 @@
1
+ import { DEFAULT_FLATTEN_TOLERANCE, flattenCubicWithArcLen, flattenQuadraticWithArcLen } from './chunk-RQYCDPU5.js';
2
+ import { forEachSegment, PATH_Z, PATH_C, PATH_Q, PATH_L, PATH_M } from './chunk-HEZTRG2M.js';
3
+
4
+ // src/box.ts
5
+ function boundsOfCoords(coords) {
6
+ if (coords.length < 2) return null;
7
+ let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;
8
+ for (let i = 0; i + 1 < coords.length; i += 2) {
9
+ const x = coords[i], y = coords[i + 1];
10
+ if (x < minX) minX = x;
11
+ if (y < minY) minY = y;
12
+ if (x > maxX) maxX = x;
13
+ if (y > maxY) maxY = y;
14
+ }
15
+ return [minX, minY, maxX, maxY];
16
+ }
17
+ function unionBox(a, b) {
18
+ return [
19
+ Math.min(a[0], b[0]),
20
+ Math.min(a[1], b[1]),
21
+ Math.max(a[2], b[2]),
22
+ Math.max(a[3], b[3])
23
+ ];
24
+ }
25
+ function boxContainsPoint(b, x, y) {
26
+ return x >= b[0] && x <= b[2] && y >= b[1] && y <= b[3];
27
+ }
28
+ function boxContainsBox(outer, inner) {
29
+ return inner[0] >= outer[0] && inner[1] >= outer[1] && inner[2] <= outer[2] && inner[3] <= outer[3];
30
+ }
31
+ function rectToContour(x, y, w, h) {
32
+ return Float64Array.of(x, y, x + w, y, x + w, y + h, x, y + h);
33
+ }
34
+
35
+ // src/tessellate/polyline.ts
36
+ function extractPolylines(path, opts = {}) {
37
+ if (path.kind === "rect") return [extractRect(path)];
38
+ return extractPolygon(path, opts);
39
+ }
40
+ function extractRect(p) {
41
+ const { x, y, width: w, height: h } = p;
42
+ return {
43
+ points: Array.from(rectToContour(x, y, w, h)),
44
+ closed: true,
45
+ anchorA: new Uint32Array([0, 1, 2, 3]),
46
+ anchorB: new Uint32Array([0, 1, 2, 3]),
47
+ anchorT: new Float32Array([0, 0, 0, 0])
48
+ };
49
+ }
50
+ function extractPolygon(p, opts) {
51
+ const tolerance = opts.flattenTolerance ?? DEFAULT_FLATTEN_TOLERANCE;
52
+ const { commands, coords } = p;
53
+ const out = [];
54
+ let anchorCounter = 0;
55
+ let pts = null;
56
+ let aA = null;
57
+ let aB = null;
58
+ let aT = null;
59
+ let current = null;
60
+ let prevAnchor = -1;
61
+ const beginContour = () => {
62
+ pts = [];
63
+ aA = [];
64
+ aB = [];
65
+ aT = [];
66
+ const next = { points: pts, closed: false };
67
+ out.push(next);
68
+ return next;
69
+ };
70
+ const dropDuplicateClosingPoint = () => {
71
+ if (!pts || !aA || !aB || !aT) return;
72
+ const n = pts.length / 2;
73
+ if (n < 2) return;
74
+ if (pts[0] !== pts[(n - 1) * 2] || pts[1] !== pts[(n - 1) * 2 + 1]) return;
75
+ pts.length -= 2;
76
+ aA.length -= 1;
77
+ aB.length -= 1;
78
+ aT.length -= 1;
79
+ };
80
+ const commit = (target) => {
81
+ if (!pts || !aA || !aB || !aT) return;
82
+ target.anchorA = new Uint32Array(aA);
83
+ target.anchorB = new Uint32Array(aB);
84
+ target.anchorT = new Float32Array(aT);
85
+ };
86
+ const pushCurveAnchors = (segStart, arcAccum, total, target) => {
87
+ for (let k = 0; k < arcAccum.length; k++) {
88
+ aA.push(prevAnchor);
89
+ aB.push(target);
90
+ aT.push(total > 0 ? arcAccum[k] / total : 0);
91
+ }
92
+ const lastIdx = segStart + arcAccum.length - 1;
93
+ aA[lastIdx] = target;
94
+ aB[lastIdx] = target;
95
+ aT[lastIdx] = 0;
96
+ };
97
+ forEachSegment(commands, coords, (cmd, coordIdx, prevX, prevY) => {
98
+ switch (cmd) {
99
+ case PATH_M:
100
+ case PATH_L: {
101
+ if (cmd === PATH_M) {
102
+ if (current) commit(current);
103
+ current = beginContour();
104
+ }
105
+ pts.push(coords[coordIdx], coords[coordIdx + 1]);
106
+ aA.push(anchorCounter);
107
+ aB.push(anchorCounter);
108
+ aT.push(0);
109
+ prevAnchor = anchorCounter;
110
+ anchorCounter++;
111
+ break;
112
+ }
113
+ case PATH_Q: {
114
+ const target = anchorCounter;
115
+ const segStart = pts.length / 2;
116
+ const arcAccum = [];
117
+ const total = flattenQuadraticWithArcLen(
118
+ prevX,
119
+ prevY,
120
+ coords[coordIdx],
121
+ coords[coordIdx + 1],
122
+ coords[coordIdx + 2],
123
+ coords[coordIdx + 3],
124
+ tolerance,
125
+ pts,
126
+ arcAccum
127
+ );
128
+ pushCurveAnchors(segStart, arcAccum, total, target);
129
+ prevAnchor = target;
130
+ anchorCounter++;
131
+ break;
132
+ }
133
+ case PATH_C: {
134
+ const target = anchorCounter;
135
+ const segStart = pts.length / 2;
136
+ const arcAccum = [];
137
+ const total = flattenCubicWithArcLen(
138
+ prevX,
139
+ prevY,
140
+ coords[coordIdx],
141
+ coords[coordIdx + 1],
142
+ coords[coordIdx + 2],
143
+ coords[coordIdx + 3],
144
+ coords[coordIdx + 4],
145
+ coords[coordIdx + 5],
146
+ tolerance,
147
+ pts,
148
+ arcAccum
149
+ );
150
+ pushCurveAnchors(segStart, arcAccum, total, target);
151
+ prevAnchor = target;
152
+ anchorCounter++;
153
+ break;
154
+ }
155
+ case PATH_Z: {
156
+ if (current) {
157
+ current.closed = true;
158
+ dropDuplicateClosingPoint();
159
+ }
160
+ break;
161
+ }
162
+ default:
163
+ throw new Error(`extractPolylines: unknown command code ${cmd}`);
164
+ }
165
+ });
166
+ if (current) commit(current);
167
+ return out;
168
+ }
169
+
170
+ export { boundsOfCoords, boxContainsBox, boxContainsPoint, extractPolylines, rectToContour, unionBox };
171
+ //# sourceMappingURL=chunk-6T5I3PR5.js.map
172
+ //# sourceMappingURL=chunk-6T5I3PR5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/box.ts","../src/tessellate/polyline.ts"],"names":[],"mappings":"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","file":"chunk-6T5I3PR5.js","sourcesContent":["/** Axis-aligned box as [minX, minY, maxX, maxY]. */\nexport type Box = readonly [number, number, number, number];\n\n/** An axis-aligned rectangle in object form. `Box` is the tuple form; this is\n * the one that survives being read by a human. */\nexport interface Rect { x: number; y: number; width: number; height: number }\n\n/** Tight bounds of an interleaved coord stream, or null if empty. */\nexport function boundsOfCoords(coords: ArrayLike<number>): Box | null {\n if (coords.length < 2) return null;\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (let i = 0; i + 1 < coords.length; i += 2) {\n const x = coords[i], y = coords[i + 1];\n if (x < minX) minX = x;\n if (y < minY) minY = y;\n if (x > maxX) maxX = x;\n if (y > maxY) maxY = y;\n }\n return [minX, minY, maxX, maxY];\n}\n\n/** Smallest box containing both inputs. */\nexport function unionBox(a: Box, b: Box): Box {\n return [\n Math.min(a[0], b[0]),\n Math.min(a[1], b[1]),\n Math.max(a[2], b[2]),\n Math.max(a[3], b[3]),\n ];\n}\n\n/** Inclusive point-in-box test. */\nexport function boxContainsPoint(b: Box, x: number, y: number): boolean {\n return x >= b[0] && x <= b[2] && y >= b[1] && y <= b[3];\n}\n\n/** Whether `outer` wholly holds `inner`, edges inclusive. Two boxes that merely\n * overlap answer false. */\nexport function boxContainsBox(outer: Box, inner: Box): boolean {\n return inner[0] >= outer[0] && inner[1] >= outer[1] && inner[2] <= outer[2] && inner[3] <= outer[3];\n}\n\n/** Interleaved corner ring for a rect at (x,y,w,h), wound clockwise from the\n * origin corner. The closing edge is implicit — the same unclosed shape\n * `pointInPolygon` takes, and what a repeated first vertex would leave as a\n * zero-length segment for anything that strokes it. */\nexport function rectToContour(x: number, y: number, w: number, h: number): Float64Array {\n return Float64Array.of(x, y, x + w, y, x + w, y + h, x, y + h);\n}\n","import { forEachSegment, PATH_M, PATH_L, PATH_Z, PATH_C, PATH_Q } from '../commands';\nimport { rectToContour } from '../box';\nimport { DEFAULT_FLATTEN_TOLERANCE, flattenCubicWithArcLen, flattenQuadraticWithArcLen } from '../flatten';\nimport type { Path, PolygonPath, RectPath } from '../path';\n\n/** One contour of a path, flattened to straight segments. */\nexport interface Polyline {\n /** Interleaved x,y vertices (length = 2 × point count). */\n points: number[];\n /** Whether the contour was closed (ends with Z, or is a RectPath). */\n closed: boolean;\n /** For each point, the previous anchor index. Anchor-aligned points set A === B. */\n anchorA?: Uint32Array;\n /** For each point, the next anchor index. */\n anchorB?: Uint32Array;\n /** For each point, the arc-length fraction along (A, B). 0 at anchor A; for anchor-aligned, set to 0. */\n anchorT?: Float32Array;\n /** Per-point stroke width, populated by the tessellator when the Stroke\n * carries `vertexWidths`. Undefined means uniform `Stroke.width`. */\n widths?: Float32Array;\n}\n\n/** Options for `extractPolylines`. */\nexport interface ExtractOptions {\n flattenTolerance?: number;\n}\n\n/** Flatten each contour of a path to a straight-segment polyline, carrying the\n * anchor parameterization per point. A rect yields one closed contour. */\nexport function extractPolylines(path: Path, opts: ExtractOptions = {}): Polyline[] {\n if (path.kind === 'rect') return [extractRect(path)];\n return extractPolygon(path, opts);\n}\n\nfunction extractRect(p: RectPath): Polyline {\n const { x, y, width: w, height: h } = p;\n return {\n points: Array.from(rectToContour(x, y, w, h)),\n closed: true,\n anchorA: new Uint32Array([0, 1, 2, 3]),\n anchorB: new Uint32Array([0, 1, 2, 3]),\n anchorT: new Float32Array([0, 0, 0, 0]),\n };\n}\n\nfunction extractPolygon(p: PolygonPath, opts: ExtractOptions): Polyline[] {\n const tolerance = opts.flattenTolerance ?? DEFAULT_FLATTEN_TOLERANCE;\n const { commands, coords } = p;\n const out: Polyline[] = [];\n // Anchors are numbered globally (across all contours) in command-stream order.\n let anchorCounter = 0;\n\n // Builders for the current polyline.\n let pts: number[] | null = null;\n let aA: number[] | null = null;\n let aB: number[] | null = null;\n let aT: number[] | null = null;\n let current: Polyline | null = null;\n\n let prevAnchor = -1;\n\n const beginContour = (): Polyline => {\n pts = [];\n aA = [];\n aB = [];\n aT = [];\n const next: Polyline = { points: pts, closed: false };\n out.push(next);\n return next;\n };\n\n /**\n * A closed contour's last point repeating its first is redundant — Z already\n * says \"return to the start\" — and it is *harmful*: it leaves a zero-length\n * closing segment, which the stroker discards along with the wrap-around\n * join it should have carried, notching the ribbon at the contour's start.\n *\n * Every font outline serialized by opentype.js is written this way, as is a\n * great deal of hand-written and exported SVG, so this is the common case\n * rather than a defensive edge. Exact equality is the right test: the\n * duplicate is a re-emission of the same number, not an approach to it, and\n * a near-miss is a genuine (if tiny) segment the author asked for.\n */\n const dropDuplicateClosingPoint = (): void => {\n if (!pts || !aA || !aB || !aT) return;\n const n = pts.length / 2;\n if (n < 2) return;\n if (pts[0] !== pts[(n - 1) * 2] || pts[1] !== pts[(n - 1) * 2 + 1]) return;\n pts.length -= 2;\n aA.length -= 1;\n aB.length -= 1;\n aT.length -= 1;\n };\n\n const commit = (target: Polyline): void => {\n if (!pts || !aA || !aB || !aT) return;\n target.anchorA = new Uint32Array(aA);\n target.anchorB = new Uint32Array(aB);\n target.anchorT = new Float32Array(aT);\n };\n\n // Fill anchorA/B/T for each point a curve just appended: interior points\n // interpolate (prevAnchor → target), and the final point is pinned to the\n // target so the draw-time lerp returns anchor B's color exactly.\n const pushCurveAnchors = (segStart: number, arcAccum: number[], total: number, target: number): void => {\n for (let k = 0; k < arcAccum.length; k++) {\n aA!.push(prevAnchor);\n aB!.push(target);\n aT!.push(total > 0 ? arcAccum[k] / total : 0);\n }\n const lastIdx = (segStart + arcAccum.length) - 1;\n aA![lastIdx] = target;\n aB![lastIdx] = target;\n aT![lastIdx] = 0;\n };\n\n forEachSegment(commands, coords, (cmd, coordIdx, prevX, prevY) => {\n switch (cmd) {\n case PATH_M:\n case PATH_L: {\n if (cmd === PATH_M) {\n if (current) commit(current);\n current = beginContour();\n }\n pts!.push(coords[coordIdx], coords[coordIdx + 1]);\n aA!.push(anchorCounter);\n aB!.push(anchorCounter);\n aT!.push(0);\n prevAnchor = anchorCounter;\n anchorCounter++;\n break;\n }\n case PATH_Q: {\n const target = anchorCounter;\n const segStart = pts!.length / 2;\n const arcAccum: number[] = [];\n const total = flattenQuadraticWithArcLen(\n prevX, prevY,\n coords[coordIdx], coords[coordIdx + 1],\n coords[coordIdx + 2], coords[coordIdx + 3],\n tolerance, pts!, arcAccum,\n );\n pushCurveAnchors(segStart, arcAccum, total, target);\n prevAnchor = target;\n anchorCounter++;\n break;\n }\n case PATH_C: {\n const target = anchorCounter;\n const segStart = pts!.length / 2;\n const arcAccum: number[] = [];\n const total = flattenCubicWithArcLen(\n prevX, prevY,\n coords[coordIdx], coords[coordIdx + 1],\n coords[coordIdx + 2], coords[coordIdx + 3],\n coords[coordIdx + 4], coords[coordIdx + 5],\n tolerance, pts!, arcAccum,\n );\n pushCurveAnchors(segStart, arcAccum, total, target);\n prevAnchor = target;\n anchorCounter++;\n break;\n }\n case PATH_Z: {\n if (current) {\n current.closed = true;\n dropDuplicateClosingPoint();\n }\n break;\n }\n default:\n throw new Error(`extractPolylines: unknown command code ${cmd}`);\n }\n });\n\n if (current) commit(current);\n return out;\n}\n"]}
@@ -0,0 +1,29 @@
1
+ // src/scalar.ts
2
+ var EPS = 1e-6;
3
+ var SINGULAR_RATIO = 1e-12;
4
+ function cross(ax, ay, bx, by) {
5
+ return ax * by - ay * bx;
6
+ }
7
+ function dot(ax, ay, bx, by) {
8
+ return ax * bx + ay * by;
9
+ }
10
+ function sub(ax, ay, bx, by) {
11
+ return [ax - bx, ay - by];
12
+ }
13
+ function len2(x, y) {
14
+ return x * x + y * y;
15
+ }
16
+ function sign(n) {
17
+ return n > 0 ? 1 : n < 0 ? -1 : 0;
18
+ }
19
+ function approxEq(a, b, eps = EPS) {
20
+ if (a === b) return true;
21
+ const diff = Math.abs(a - b);
22
+ if (!Number.isFinite(diff)) return false;
23
+ const scale = Math.max(1, Math.abs(a), Math.abs(b));
24
+ return diff <= eps * scale;
25
+ }
26
+
27
+ export { EPS, SINGULAR_RATIO, approxEq, cross, dot, len2, sign, sub };
28
+ //# sourceMappingURL=chunk-7ROQRYOA.js.map
29
+ //# sourceMappingURL=chunk-7ROQRYOA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/scalar.ts"],"names":[],"mappings":";AAUO,IAAM,GAAA,GAAM;AAKZ,IAAM,cAAA,GAAiB;AAGvB,SAAS,KAAA,CAAM,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,EAAoB;AAC5E,EAAA,OAAO,EAAA,GAAK,KAAK,EAAA,GAAK,EAAA;AACxB;AAGO,SAAS,GAAA,CAAI,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,EAAoB;AAC1E,EAAA,OAAO,EAAA,GAAK,KAAK,EAAA,GAAK,EAAA;AACxB;AAGO,SAAS,GAAA,CAAI,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,EAA8B;AACpF,EAAA,OAAO,CAAC,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAE,CAAA;AAC1B;AAGO,SAAS,IAAA,CAAK,GAAW,CAAA,EAAmB;AACjD,EAAA,OAAO,CAAA,GAAI,IAAI,CAAA,GAAI,CAAA;AACrB;AAGO,SAAS,KAAK,CAAA,EAAuB;AAC1C,EAAA,OAAO,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,IAAI,EAAA,GAAK,CAAA;AAClC;AAcO,SAAS,QAAA,CAAS,CAAA,EAAW,CAAA,EAAW,GAAA,GAAc,GAAA,EAAc;AACzE,EAAA,IAAI,CAAA,KAAM,GAAG,OAAO,IAAA;AACpB,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,CAAC,CAAA;AAG3B,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,IAAI,GAAG,OAAO,KAAA;AACnC,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAC,CAAC,CAAA;AAClD,EAAA,OAAO,QAAQ,GAAA,GAAM,KAAA;AACvB","file":"chunk-7ROQRYOA.js","sourcesContent":["/**\n * Scalar / 2-vector primitives and the kernel-wide epsilon policy.\n *\n * Points are scalar pairs (px, py); there is no point struct. All math is\n * f64 (JS-native). Epsilons are f32-SCALE and magnitude-relative, because\n * stored coords are quantized to Float32 (~7 significant digits) — see the\n * geometry-kernel spec.\n */\n\n/** Base relative epsilon, sized for Float32 storage (~1 part in 1e-6). */\nexport const EPS = 1e-6;\n\n/** A determinant at or below this fraction of its matrix's own scale counts as\n * singular. Dimensionless, so a uniformly tiny matrix still inverts while a\n * large one whose determinant is only rounding does not. */\nexport const SINGULAR_RATIO = 1e-12;\n\n/** 2D cross (wedge) product of vectors (ax,ay) and (bx,by). */\nexport function cross(ax: number, ay: number, bx: number, by: number): number {\n return ax * by - ay * bx;\n}\n\n/** 2D dot product. */\nexport function dot(ax: number, ay: number, bx: number, by: number): number {\n return ax * bx + ay * by;\n}\n\n/** Component difference (ax-bx, ay-by) as a tuple. Cold-path use only. */\nexport function sub(ax: number, ay: number, bx: number, by: number): [number, number] {\n return [ax - bx, ay - by];\n}\n\n/** Squared length of (x,y). Avoids the sqrt; compare against squared thresholds. */\nexport function len2(x: number, y: number): number {\n return x * x + y * y;\n}\n\n/** Three-valued sign. */\nexport function sign(n: number): -1 | 0 | 1 {\n return n > 0 ? 1 : n < 0 ? -1 : 0;\n}\n\n/**\n * Magnitude-scaled approximate equality. Two values are equal when their\n * absolute difference is within EPS scaled by the larger magnitude. Every\n * comparison of two *computed coordinates* goes through this — never `===`,\n * never an f64-tight literal.\n *\n * The exception is a guard against an exact algebraic value that a formula\n * produces bit-for-bit: a homogeneous `w === 1`, a ray's `d === 0`. Those are\n * testing a branch, not comparing coordinates, and `geom/3d` has two of them\n * (`mat4.ts`, `ray3.ts`). Widening one to `approxEq` would change which branch\n * runs, not how precisely it runs.\n */\nexport function approxEq(a: number, b: number, eps: number = EPS): boolean {\n if (a === b) return true; // also the only way two infinities compare equal\n const diff = Math.abs(a - b);\n // Infinity/Infinity is 1, so an unguarded relative test calls every finite\n // number equal to an infinity.\n if (!Number.isFinite(diff)) return false;\n const scale = Math.max(1, Math.abs(a), Math.abs(b));\n return diff <= eps * scale;\n}\n"]}
@@ -0,0 +1,55 @@
1
+ // src/commands.ts
2
+ var PATH_COMMANDS = {
3
+ /** moveTo — opens a new subpath. */
4
+ M: { code: 0, coords: 2 },
5
+ /** Straight segment from the pen to the next coord pair. */
6
+ L: { code: 1, coords: 2 },
7
+ /** Cubic bezier: two control points then the endpoint. */
8
+ C: { code: 2, coords: 6 },
9
+ /** Quadratic bezier: one control point then the endpoint. */
10
+ Q: { code: 3, coords: 4 },
11
+ /** Close the current subpath back to its start. Consumes no coords and
12
+ * leaves the pen where it is. */
13
+ Z: { code: 4, coords: 0 }
14
+ };
15
+ var PATH_M = PATH_COMMANDS.M.code;
16
+ var PATH_L = PATH_COMMANDS.L.code;
17
+ var PATH_C = PATH_COMMANDS.C.code;
18
+ var PATH_Q = PATH_COMMANDS.Q.code;
19
+ var PATH_Z = PATH_COMMANDS.Z.code;
20
+ var PATH_CMD_LENGTHS = buildCmdLengths();
21
+ function buildCmdLengths() {
22
+ const lengths = [];
23
+ for (const { code, coords } of Object.values(PATH_COMMANDS)) lengths[code] = coords;
24
+ return lengths;
25
+ }
26
+ function pathCommandCoordCount(cmd) {
27
+ return PATH_CMD_LENGTHS[cmd];
28
+ }
29
+ function forEachSegment(commands, coords, visit) {
30
+ let ci = 0;
31
+ let px = 0, py = 0;
32
+ let startX = 0, startY = 0;
33
+ for (let i = 0; i < commands.length; i++) {
34
+ const cmd = commands[i];
35
+ if (visit(cmd, ci, px, py, i) === false) return;
36
+ const len = pathCommandCoordCount(cmd);
37
+ if (len === void 0) throw new Error(`forEachSegment: unknown command code ${cmd}`);
38
+ if (len > 0) {
39
+ px = coords[ci + len - 2];
40
+ py = coords[ci + len - 1];
41
+ ci += len;
42
+ if (cmd === PATH_M) {
43
+ startX = px;
44
+ startY = py;
45
+ }
46
+ } else if (cmd === PATH_Z) {
47
+ px = startX;
48
+ py = startY;
49
+ }
50
+ }
51
+ }
52
+
53
+ export { PATH_C, PATH_CMD_LENGTHS, PATH_COMMANDS, PATH_L, PATH_M, PATH_Q, PATH_Z, forEachSegment, pathCommandCoordCount };
54
+ //# sourceMappingURL=chunk-HEZTRG2M.js.map
55
+ //# sourceMappingURL=chunk-HEZTRG2M.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands.ts"],"names":[],"mappings":";AAWO,IAAM,aAAA,GAAgB;AAAA;AAAA,EAE3B,CAAA,EAAG,EAAE,IAAA,EAAM,CAAA,EAAG,QAAQ,CAAA,EAAE;AAAA;AAAA,EAExB,CAAA,EAAG,EAAE,IAAA,EAAM,CAAA,EAAG,QAAQ,CAAA,EAAE;AAAA;AAAA,EAExB,CAAA,EAAG,EAAE,IAAA,EAAM,CAAA,EAAG,QAAQ,CAAA,EAAE;AAAA;AAAA,EAExB,CAAA,EAAG,EAAE,IAAA,EAAM,CAAA,EAAG,QAAQ,CAAA,EAAE;AAAA;AAAA;AAAA,EAGxB,CAAA,EAAG,EAAE,IAAA,EAAM,CAAA,EAAG,QAAQ,CAAA;AACxB;AAQO,IAAM,MAAA,GAAS,cAAc,CAAA,CAAE;AAE/B,IAAM,MAAA,GAAS,cAAc,CAAA,CAAE;AAE/B,IAAM,MAAA,GAAS,cAAc,CAAA,CAAE;AAE/B,IAAM,MAAA,GAAS,cAAc,CAAA,CAAE;AAE/B,IAAM,MAAA,GAAS,cAAc,CAAA,CAAE;AAG/B,IAAM,mBAAsC,eAAA;AAEnD,SAAS,eAAA,GAA4B;AACnC,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,KAAA,MAAW,EAAE,IAAA,EAAM,MAAA,EAAO,IAAK,MAAA,CAAO,OAAO,aAAa,CAAA,EAAG,OAAA,CAAQ,IAAI,CAAA,GAAI,MAAA;AAC7E,EAAA,OAAO,OAAA;AACT;AAGO,SAAS,sBAAsB,GAAA,EAAqB;AACzD,EAAA,OAAO,iBAAiB,GAAG,CAAA;AAC7B;AAaO,SAAS,cAAA,CACd,QAAA,EACA,MAAA,EACA,KAAA,EAOM;AACN,EAAA,IAAI,EAAA,GAAK,CAAA;AACT,EAAA,IAAI,EAAA,GAAK,GAAG,EAAA,GAAK,CAAA;AACjB,EAAA,IAAI,MAAA,GAAS,GAAG,MAAA,GAAS,CAAA;AACzB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACxC,IAAA,MAAM,GAAA,GAAM,SAAS,CAAC,CAAA;AACtB,IAAA,IAAI,MAAM,GAAA,EAAK,EAAA,EAAI,IAAI,EAAA,EAAI,CAAC,MAAM,KAAA,EAAO;AACzC,IAAA,MAAM,GAAA,GAAM,sBAAsB,GAAG,CAAA;AACrC,IAAA,IAAI,QAAQ,MAAA,EAAW,MAAM,IAAI,KAAA,CAAM,CAAA,qCAAA,EAAwC,GAAG,CAAA,CAAE,CAAA;AACpF,IAAA,IAAI,MAAM,CAAA,EAAG;AACX,MAAA,EAAA,GAAK,MAAA,CAAO,EAAA,GAAK,GAAA,GAAM,CAAC,CAAA;AACxB,MAAA,EAAA,GAAK,MAAA,CAAO,EAAA,GAAK,GAAA,GAAM,CAAC,CAAA;AACxB,MAAA,EAAA,IAAM,GAAA;AACN,MAAA,IAAI,QAAQ,MAAA,EAAQ;AAAE,QAAA,MAAA,GAAS,EAAA;AAAI,QAAA,MAAA,GAAS,EAAA;AAAA,MAAI;AAAA,IAClD,CAAA,MAAA,IAAW,QAAQ,MAAA,EAAQ;AACzB,MAAA,EAAA,GAAK,MAAA;AAAQ,MAAA,EAAA,GAAK,MAAA;AAAA,IACpB;AAAA,EACF;AACF","file":"chunk-HEZTRG2M.js","sourcesContent":["/**\n * SVG-style command-stream encoding — the kit's single declaration of the path\n * opcodes. `Path` (`./path`) wraps this with `kind` + `fillRule`.\n *\n * The codes index a `Uint8Array` command stream whose coords live in a\n * parallel float array, so a code declared anywhere but `PATH_COMMANDS` makes\n * every walker that doesn't know it misread the coord stream from that command\n * on — silently, for every path. Derive, never restate.\n */\n\n/** Opcode table: command code and the float coords it consumes. */\nexport const PATH_COMMANDS = {\n /** moveTo — opens a new subpath. */\n M: { code: 0, coords: 2 },\n /** Straight segment from the pen to the next coord pair. */\n L: { code: 1, coords: 2 },\n /** Cubic bezier: two control points then the endpoint. */\n C: { code: 2, coords: 6 },\n /** Quadratic bezier: one control point then the endpoint. */\n Q: { code: 3, coords: 4 },\n /** Close the current subpath back to its start. Consumes no coords and\n * leaves the pen where it is. */\n Z: { code: 4, coords: 0 },\n} as const;\n\n/** Mnemonic of a declared command (`'M' | 'L' | …`). */\nexport type PathCommandName = keyof typeof PATH_COMMANDS;\n/** Numeric code of a declared command. */\nexport type PathCommandCode = (typeof PATH_COMMANDS)[PathCommandName]['code'];\n\n/** Command code of `M` (moveTo). */\nexport const PATH_M = PATH_COMMANDS.M.code;\n/** Command code of `L` (lineTo). */\nexport const PATH_L = PATH_COMMANDS.L.code;\n/** Command code of `C` (cubic bezier). */\nexport const PATH_C = PATH_COMMANDS.C.code;\n/** Command code of `Q` (quadratic bezier). */\nexport const PATH_Q = PATH_COMMANDS.Q.code;\n/** Command code of `Z` (close subpath). */\nexport const PATH_Z = PATH_COMMANDS.Z.code;\n\n/** Float coords consumed by each command, indexed by command code. */\nexport const PATH_CMD_LENGTHS: readonly number[] = buildCmdLengths();\n\nfunction buildCmdLengths(): number[] {\n const lengths: number[] = [];\n for (const { code, coords } of Object.values(PATH_COMMANDS)) lengths[code] = coords;\n return lengths;\n}\n\n/** Float coords consumed by the command with this code. */\nexport function pathCommandCoordCount(cmd: number): number {\n return PATH_CMD_LENGTHS[cmd];\n}\n\n/**\n * Visit each command with its coord offset and the pen position BEFORE the\n * command consumes its coords (the segment start). The callback receives\n * (cmd, coordIndex, penX, penY, commandIndex) and stops the walk by returning\n * `false`. The pen advances to the command's last coord pair afterward; `Z`\n * returns it to the subpath's opening `M`, so a command following a `Z`\n * without an intervening `M` starts where SVG says it does.\n *\n * A code `PATH_COMMANDS` does not declare throws once the visitor has seen it,\n * since the walker cannot tell how many coords it consumes.\n */\nexport function forEachSegment(\n commands: ArrayLike<number>,\n coords: ArrayLike<number>,\n visit: (\n cmd: number,\n coordIndex: number,\n penX: number,\n penY: number,\n commandIndex: number,\n ) => void | boolean,\n): void {\n let ci = 0;\n let px = 0, py = 0;\n let startX = 0, startY = 0;\n for (let i = 0; i < commands.length; i++) {\n const cmd = commands[i];\n if (visit(cmd, ci, px, py, i) === false) return;\n const len = pathCommandCoordCount(cmd);\n if (len === undefined) throw new Error(`forEachSegment: unknown command code ${cmd}`);\n if (len > 0) {\n px = coords[ci + len - 2];\n py = coords[ci + len - 1];\n ci += len;\n if (cmd === PATH_M) { startX = px; startY = py; }\n } else if (cmd === PATH_Z) {\n px = startX; py = startY;\n }\n }\n}\n"]}