@weasel-js/geom 1.10.1 → 1.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/README.md +9 -1
  2. package/dist/3d/index.d.ts +29 -2
  3. package/dist/3d/index.js +49 -1
  4. package/dist/3d/index.js.map +1 -1
  5. package/dist/booleans/index.d.ts +15 -10
  6. package/dist/booleans/index.js +306 -353
  7. package/dist/booleans/index.js.map +1 -1
  8. package/dist/{chunk-7WFFCHRL.js → chunk-6XSJY3TC.js} +6 -37
  9. package/dist/chunk-6XSJY3TC.js.map +1 -0
  10. package/dist/chunk-7KLJZFBY.js +573 -0
  11. package/dist/chunk-7KLJZFBY.js.map +1 -0
  12. package/dist/chunk-B53BERKG.js +386 -0
  13. package/dist/chunk-B53BERKG.js.map +1 -0
  14. package/dist/chunk-CE7IY7TB.js +104 -0
  15. package/dist/chunk-CE7IY7TB.js.map +1 -0
  16. package/dist/chunk-HGF5OVEN.js +129 -0
  17. package/dist/chunk-HGF5OVEN.js.map +1 -0
  18. package/dist/chunk-J2O2B54M.js +800 -0
  19. package/dist/chunk-J2O2B54M.js.map +1 -0
  20. package/dist/chunk-Q66NA2FU.js +174 -0
  21. package/dist/chunk-Q66NA2FU.js.map +1 -0
  22. package/dist/chunk-SASMXDBE.js +443 -0
  23. package/dist/chunk-SASMXDBE.js.map +1 -0
  24. package/dist/chunk-UI3FUWXM.js +533 -0
  25. package/dist/chunk-UI3FUWXM.js.map +1 -0
  26. package/dist/curvature-PkoLduGc.d.ts +454 -0
  27. package/dist/curves/index.d.ts +14 -5
  28. package/dist/curves/index.js +33 -111
  29. package/dist/curves/index.js.map +1 -1
  30. package/dist/index.d.ts +1468 -284
  31. package/dist/index.js +5450 -2672
  32. package/dist/index.js.map +1 -1
  33. package/dist/nd/index.d.ts +91 -27
  34. package/dist/nd/index.js +282 -0
  35. package/dist/nd/index.js.map +1 -1
  36. package/dist/path-BW8d_2RY.d.ts +157 -0
  37. package/dist/portCurve-C5HDWuuV.d.ts +30 -0
  38. package/dist/tessellate/index.d.ts +15 -4
  39. package/dist/tessellate/index.js +21 -277
  40. package/dist/tessellate/index.js.map +1 -1
  41. package/dist/warp/index.d.ts +252 -0
  42. package/dist/warp/index.js +1316 -0
  43. package/dist/warp/index.js.map +1 -0
  44. package/package.json +5 -1
  45. package/dist/chunk-7WFFCHRL.js.map +0 -1
  46. package/dist/chunk-IDXY2NCA.js +0 -177
  47. package/dist/chunk-IDXY2NCA.js.map +0 -1
  48. package/dist/chunk-NJ3IGAKR.js +0 -16
  49. package/dist/chunk-NJ3IGAKR.js.map +0 -1
  50. package/dist/chunk-OXH3NOXC.js +0 -62
  51. package/dist/chunk-OXH3NOXC.js.map +0 -1
  52. package/dist/chunk-URQMDR6Q.js +0 -80
  53. package/dist/chunk-URQMDR6Q.js.map +0 -1
  54. package/dist/cubicMath-BW-HJrCE.d.ts +0 -16
  55. package/dist/path-ljHxobyu.d.ts +0 -44
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/paths/cornerCarry.ts","../src/paths/cornerRestore.ts","../src/booleans/contourSegments.ts","../src/booleans/contours.ts","../src/booleans/cutRegions.ts"],"names":["a","b","u","folded","c","l","r"],"mappings":"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","file":"chunk-7KLJZFBY.js","sourcesContent":["/**\n * Carrying corner specs onto a path rebuilt from another: a split, a rejoin,\n * a reversal. Specs are keyed by flat anchor index, so a rewrite that moves\n * anchors must renumber them rather than keep the old array.\n */\nimport { forEachSegment, pathCommandCoordCount, PATH_C, PATH_M, PATH_Q, PATH_Z } from '../commands';\nimport type { PolygonPath } from '../path';\nimport { compactCorners, withoutCorners, type CornerSpec } from './cornerSpec';\n\nconst flatCache = new WeakMap<PolygonPath, Int32Array>();\n\n/**\n * For each anchor command of `path` (each M, L, C, or Q, as `countPathAnchors`\n * numbers them), its flat anchor index, the numbering `PolygonPath.corners`\n * uses: a closing curve that ends on its subpath's first point folds onto\n * that anchor, as `pathToAnchors` folds it.\n */\nexport function flatAnchorIndices(path: PolygonPath): Int32Array {\n const hit = flatCache.get(path);\n if (hit) return hit;\n const { commands, coords } = path;\n const out: number[] = [];\n let flat = 0, first = 0, count = 0;\n let sx = 0, sy = 0, ex = 0, ey = 0, curve = false;\n forEachSegment(commands, coords, (cmd, ci) => {\n if (cmd === PATH_Z) {\n if (count > 1 && curve && ex === sx && ey === sy) { out[out.length - 1] = first; flat--; }\n count = 0;\n return;\n }\n const n = pathCommandCoordCount(cmd);\n ex = coords[ci + n - 2]; ey = coords[ci + n - 1];\n curve = cmd === PATH_C || cmd === PATH_Q;\n if (cmd === PATH_M || count === 0) { first = flat; sx = ex; sy = ey; count = 0; }\n count++;\n out.push(flat++);\n });\n const result = Int32Array.from(out);\n flatCache.set(path, result);\n return result;\n}\n\n/**\n * `to` with `from`'s corner specs carried across, where `sources[k]` is the\n * anchor command of `from` that anchor command `k` of `to` was drawn from, or\n * -1 for one with no source. Each spec lands once, on the first anchor drawn\n * from its own; any specs `to` already had are dropped.\n */\nexport function carryCorners(from: PolygonPath, to: PolygonPath, sources: ArrayLike<number>): PolygonPath {\n const bare = withoutCorners(to);\n const specs = from.corners;\n if (!specs) return bare;\n const fromFlat = flatAnchorIndices(from);\n const toFlat = flatAnchorIndices(to);\n const placed = new Set<number>();\n const next: (CornerSpec | null)[] = [];\n for (let k = 0; k < toFlat.length; k++) {\n const s = sources[k];\n if (s === undefined || s < 0 || s >= fromFlat.length) continue;\n const f = fromFlat[s];\n const spec = specs[f];\n if (!spec || placed.has(f)) continue;\n placed.add(f);\n while (next.length < toFlat[k]) next.push(null);\n next[toFlat[k]] = spec;\n }\n const corners = compactCorners(next);\n return corners ? { ...bare, corners } : bare;\n}\n\n/** `count` consecutive anchor command indices from `start`: the sources of a\n * contiguous slice. */\nexport function anchorRange(start: number, count: number): Int32Array {\n const out = new Int32Array(count);\n for (let i = 0; i < count; i++) out[i] = start + i;\n return out;\n}\n","/**\n * Putting corner specs back on a path an operation rebuilt from expanded\n * geometry. Booleans, trims and cuts work on what a path draws, its corners\n * cut and spanned (`resolveCorners`); wherever a corner's cut comes through\n * whole, it folds back into its anchor and spec, and only a corner the\n * operation cut into or moved stays expanded.\n */\nimport type { Path, PolygonPath } from '../path';\nimport { nearestOnCubic, nearestOnLine } from '../nearest';\nimport { PathBuilder } from './builder';\nimport { flatAnchorIndices } from './cornerCarry';\nimport { decodeContours, type Contour, type Seg } from './cornerSegments';\nimport type { Point } from './cubicMath';\nimport type { CornerPiece } from './cornerShape';\nimport { compactCorners, withoutCorners, type CornerSpec } from './cornerSpec';\nimport { cornerCuts } from './corners';\n\n/** A corner a rebuilt path may hold expanded: the anchor and spec it folds\n * back into, and the cut it is drawn as, from `start` to `end`. */\nexport interface CornerTrace {\n anchor: Point;\n spec: CornerSpec;\n start: Point;\n end: Point;\n pieces: readonly CornerPiece[];\n}\n\n/** How far a point may sit from where a corner draws it and still count as on it. */\nexport const CORNER_RESTORE_TOLERANCE = 1e-3;\n\n/** The corners `path` cuts, as {@link restoreCorners} looks for them. */\nexport function cornerTraces(path: Path): CornerTrace[] {\n if (path.kind !== 'polygon') return [];\n return cornerCuts(path).map(({ anchor, spec, start, end, pieces }) => ({ anchor, spec, start, end, pieces }));\n}\n\n/**\n * `result` with the corners of `sources` folded back in wherever it still\n * draws them whole: an operation's output, rebuilt from what the sources\n * draw. A corner the operation cut into, or whose edges it moved, stays as\n * the plain geometry it already is.\n */\nexport function keepCorners(sources: readonly Path[], result: PolygonPath, tolerance = CORNER_RESTORE_TOLERANCE): PolygonPath {\n const traces = sources.flatMap(cornerTraces);\n return traces.length === 0 ? result : restoreCorners(result, traces, tolerance);\n}\n\nconst dist = (a: Point, b: Point): number => Math.hypot(a.x - b.x, a.y - b.y);\n\nfunction onTrace(p: Point, t: CornerTrace, tol: number): boolean {\n let from = t.start;\n for (const piece of t.pieces) {\n const d = piece.kind === 'line'\n ? nearestOnLine(p.x, p.y, from.x, from.y, piece.to.x, piece.to.y).dist\n : nearestOnCubic(p.x, p.y, from.x, from.y, piece.c1.x, piece.c1.y, piece.c2.x, piece.c2.y, piece.to.x, piece.to.y).dist;\n if (d <= tol) return true;\n from = piece.to;\n }\n return false;\n}\n\n/** The blossom of cubic `s` at `(u, v, w)`. */\nfunction blossom(s: Seg, u: number, v: number, w: number): Point {\n const lerp = (a: Point, b: Point, t: number): Point => ({ x: a.x + (b.x - a.x) * t, y: a.y + (b.y - a.y) * t });\n const a = lerp(s.p0, s.c1, u), b = lerp(s.c1, s.c2, u), c = lerp(s.c2, s.p3, u);\n const d = lerp(a, b, v), e = lerp(b, c, v);\n return lerp(d, e, w);\n}\n\n/** The parameter, past `[0, 1]` on the side `from` gives, where cubic `s`\n * carried on as the same polynomial passes through `target`; null if it does not. */\nfunction extendTo(s: Seg, target: Point, from: 0 | 1, tol: number): number | null {\n const at = (u: number) => blossom(s, u, u, u);\n const d1 = (u: number): Point => {\n const a = blossom(s, u, u, 0), b = blossom(s, u, u, 1);\n return { x: 3 * (b.x - a.x), y: 3 * (b.y - a.y) };\n };\n const speed = Math.hypot(d1(from).x, d1(from).y);\n if (speed === 0) return null;\n let u = from + (from === 1 ? 1 : -1) * dist(at(from), target) / speed;\n for (let i = 0; i < 30; i++) {\n const p = at(u), d = d1(u);\n const dd = d.x * d.x + d.y * d.y;\n if (dd === 0) break;\n u -= ((p.x - target.x) * d.x + (p.y - target.y) * d.y) / dd;\n }\n return dist(at(u), target) <= tol ? u : null;\n}\n\n/** `s` with its start moved to `start` and its end to `end`, either left\n * where it was when undefined; null when a curve cannot reach them. */\nfunction reachSeg(s: Seg, start: Point | undefined, end: Point | undefined, tol: number): Seg | null {\n const p0 = start ?? s.p0, p3 = end ?? s.p3;\n if (s.line) return { line: true, p0, c1: p0, c2: p3, p3 };\n const u0 = start ? extendTo(s, start, 0, tol) : 0;\n const u1 = end ? extendTo(s, end, 1, tol) : 1;\n if (u0 === null || u1 === null) return null;\n return { line: false, p0, c1: blossom(s, u0, u0, u1), c2: blossom(s, u0, u1, u1), p3 };\n}\n\n/** A stretch of a contour's anchors, `from` to `to` going forward, that draws one corner. */\ninterface Run { from: number; to: number; trace: CornerTrace }\n\n/** Whether anchor `a`, reached or left by straight edge `edge`, ends a corner's\n * cut at `p`: it sits there, or it sits on the cut and the edge runs through\n * `p` to it, as when flattening has merged the cut's end into the edge. */\nfunction endsCut(a: Point, edge: Seg, p: Point, t: CornerTrace, tol: number): boolean {\n if (dist(a, p) <= tol) return true;\n return edge.line && onTrace(a, t, tol)\n && nearestOnLine(p.x, p.y, edge.p0.x, edge.p0.y, edge.p3.x, edge.p3.y).dist <= tol;\n}\n\nfunction findRun(c: Contour, t: CornerTrace, tol: number): Run | null {\n const n = c.anchors.length;\n for (let i = c.closed ? 0 : 1; i < n; i++) {\n for (const [first, last] of [[t.start, t.end], [t.end, t.start]] as const) {\n if (!endsCut(c.anchors[i], c.segs[(i - 1 + n) % n], first, t, tol)) continue;\n for (let j = i + 1, steps = 1; steps < c.segs.length; j++, steps++) {\n if (!c.closed && j >= n - 1) break;\n const a = c.anchors[j % n];\n const seg = c.segs[(j - 1) % n];\n if (!seg.line && !onTrace(blossom(seg, 0.5, 0.5, 0.5), t, tol)) break;\n if (endsCut(a, c.segs[j % n], last, t, tol)) return { from: i, to: j % n, trace: t };\n if (!onTrace(a, t, tol)) break;\n }\n }\n }\n return null;\n}\n\n/** The anchors a run covers, its ends included. */\nfunction covered(run: Run, n: number): number[] {\n const out: number[] = [];\n for (let k = run.from; ; k = (k + 1) % n) {\n out.push(k);\n if (k === run.to) return out;\n }\n}\n\ninterface Node { at: Point; spec: CornerSpec | null }\ninterface Rebuilt { nodes: Node[]; segs: Seg[]; closed: boolean; folded: Run[] }\n\n/** `c` with each of `runs` folded into its anchor; null when an edge next to one cannot reach it. */\nfunction foldContour(c: Contour, runs: readonly Run[], specs: readonly (CornerSpec | null)[], tol: number): Rebuilt | null {\n const n = c.anchors.length;\n const runAt = new Map<number, Run>();\n const inside = new Set<number>();\n for (const run of runs) {\n runAt.set(run.from, run);\n for (const k of covered(run, n)) inside.add(k);\n }\n let begin = 0;\n if (c.closed) {\n const free = c.anchors.findIndex((_a, k) => !inside.has(k));\n begin = free >= 0 ? free : runs[0]!.from;\n }\n const nodes: Node[] = [];\n const exits: number[] = []; // anchor each node's outgoing segment leaves from\n for (let step = 0, k = begin; step < n; ) {\n const run = runAt.get(k);\n if (run) {\n nodes.push({ at: run.trace.anchor, spec: run.trace.spec });\n exits.push(run.to);\n const span = covered(run, n).length;\n step += span;\n k = (run.to + 1) % n;\n } else {\n nodes.push({ at: c.anchors[k], spec: specs[k] ?? null });\n exits.push(k);\n step++;\n k = (k + 1) % n;\n }\n }\n const runEnds = new Set(runs.map((r) => r.to));\n const segs: Seg[] = [];\n const count = c.closed ? nodes.length : nodes.length - 1;\n for (let m = 0; m < count; m++) {\n const exit = exits[m]!;\n const moveStart = runEnds.has(exit) ? nodes[m]!.at : undefined;\n const moveEnd = runAt.has((exit + 1) % n) ? nodes[(m + 1) % nodes.length]!.at : undefined;\n const reached = reachSeg(c.segs[exit]!, moveStart, moveEnd, tol);\n if (!reached) return null;\n segs.push(reached);\n }\n return { nodes, segs, closed: c.closed, folded: [...runs] };\n}\n\nfunction write(contours: readonly Rebuilt[], result: PolygonPath): PolygonPath {\n const b = new PathBuilder();\n const specs: (CornerSpec | null)[] = [];\n for (const { nodes, segs, closed } of contours) {\n b.moveTo(nodes[0]!.at.x, nodes[0]!.at.y);\n specs.push(nodes[0]!.spec);\n segs.forEach((s, m) => {\n const to = nodes[(m + 1) % nodes.length]!;\n const closing = closed && m === segs.length - 1;\n if (closing && s.line) return;\n if (s.line) b.lineTo(to.at.x, to.at.y);\n else b.curveTo(s.c1.x, s.c1.y, s.c2.x, s.c2.y, to.at.x, to.at.y);\n specs.push(to.spec);\n });\n if (closed) b.close();\n }\n const { commands, coords } = b.build();\n const built: PolygonPath = { ...withoutCorners(result), commands, coords };\n const flat = flatAnchorIndices(built);\n const corners: (CornerSpec | null)[] = [];\n specs.forEach((spec, k) => {\n if (!spec) return;\n while (corners.length < flat[k]!) corners.push(null);\n corners[flat[k]!] = spec;\n });\n const compact = compactCorners(corners);\n return compact ? { ...built, corners: compact } : built;\n}\n\n/** Whether every corner folded into `path` draws again where its trace says. */\nfunction failedTraces(path: PolygonPath, tol: number, folded: readonly Run[]): Set<CornerTrace> {\n const bad = new Set(folded.map((r) => r.trace));\n for (const cut of cornerCuts(path)) {\n for (const t of bad) {\n if (dist(cut.anchor, t.anchor) > tol) continue;\n const same = (dist(cut.start, t.start) <= tol && dist(cut.end, t.end) <= tol)\n || (dist(cut.start, t.end) <= tol && dist(cut.end, t.start) <= tol);\n if (same) bad.delete(t);\n }\n }\n return bad;\n}\n\n/**\n * `result` with each of `traces` it draws whole folded back into its anchor\n * and spec. A trace counts as drawn when a run of anchors goes from one end\n * of its cut to the other along it, the edges either side carry on to its\n * anchor, and the folded corner cuts the same again. Specs `result` already\n * holds are kept.\n */\nexport function restoreCorners(result: PolygonPath, traces: readonly CornerTrace[], tolerance = CORNER_RESTORE_TOLERANCE): PolygonPath {\n const contours = decodeContours(result);\n if (!contours || traces.length === 0) return result;\n const rejected = new Set<CornerTrace>();\n for (let attempt = 0; attempt <= traces.length; attempt++) {\n const rebuilt: Rebuilt[] = [];\n for (const c of contours) {\n const runs: Run[] = [];\n const used = new Set<number>();\n for (const t of traces) {\n if (rejected.has(t)) continue;\n const run = findRun(c, t, tolerance);\n if (!run) continue;\n const span = covered(run, c.anchors.length);\n if (span.some((k) => used.has(k))) continue;\n span.forEach((k) => used.add(k));\n runs.push(run);\n }\n const specs = c.anchors.map((_a, k) => result.corners?.[c.first + k] ?? null);\n const folded = runs.length > 0 ? foldContour(c, runs, specs, tolerance) : null;\n if (runs.length > 0 && !folded) {\n runs.forEach((r) => rejected.add(r.trace));\n rebuilt.length = 0;\n break;\n }\n rebuilt.push(folded ?? { nodes: c.anchors.map((at, k) => ({ at, spec: specs[k]! })), segs: c.segs, closed: c.closed, folded: [] });\n }\n if (rebuilt.length !== contours.length) continue;\n const folded = rebuilt.flatMap((r) => r.folded);\n if (folded.length === 0) return result;\n const out = write(rebuilt, result);\n const bad = failedTraces(out, tolerance, folded);\n if (bad.size === 0) return out;\n bad.forEach((t) => rejected.add(t));\n }\n return result;\n}\n","/** A contour as Bézier segments: evaluating and splitting one, and where one crosses a line. */\n\nimport { splitCubicAt, splitQuadraticAt } from '../curve';\nimport type { Point } from '../paths/cubicMath';\n\n/** A Bézier segment by its control points: 2 = line, 3 = quadratic, 4 = cubic. */\nexport type Seg = Point[];\nexport type Contour = Seg[];\n\n/** A point on a contour: segment index and parameter. */\nexport interface Station {\n seg: number;\n t: number;\n pt: Point;\n}\n\nexport function evalSeg(s: Seg, t: number): Point {\n const u = 1 - t;\n if (s.length === 2) return { x: u * s[0].x + t * s[1].x, y: u * s[0].y + t * s[1].y };\n if (s.length === 3) {\n const a = u * u, b = 2 * u * t, c = t * t;\n return { x: a * s[0].x + b * s[1].x + c * s[2].x, y: a * s[0].y + b * s[1].y + c * s[2].y };\n }\n const a = u * u * u, b = 3 * u * u * t, c = 3 * u * t * t, d = t * t * t;\n return {\n x: a * s[0].x + b * s[1].x + c * s[2].x + d * s[3].x,\n y: a * s[0].y + b * s[1].y + c * s[2].y + d * s[3].y,\n };\n}\n\nexport function derivSeg(s: Seg, t: number): Point {\n const n = s.length - 1;\n const d: Seg = [];\n for (let i = 0; i < n; i++) d.push({ x: n * (s[i + 1].x - s[i].x), y: n * (s[i + 1].y - s[i].y) });\n return d.length === 1 ? d[0] : evalSeg(d, t);\n}\n\nfunction splitSeg(s: Seg, t: number): [Seg, Seg] {\n const pts = (c: ArrayLike<number>): Seg => {\n const out: Seg = [];\n for (let i = 0; i < c.length; i += 2) out.push({ x: c[i], y: c[i + 1] });\n return out;\n };\n if (s.length === 2) {\n const m = evalSeg(s, t);\n return [[s[0], m], [m, s[1]]];\n }\n if (s.length === 3) {\n const [l, r] = splitQuadraticAt(s[0].x, s[0].y, s[1].x, s[1].y, s[2].x, s[2].y, t);\n return [pts(l), pts(r)];\n }\n const [l, r] = splitCubicAt(s[0].x, s[0].y, s[1].x, s[1].y, s[2].x, s[2].y, s[3].x, s[3].y, t);\n return [pts(l), pts(r)];\n}\n\n/** The part of `s` between t0 and t1, with its ends snapped to the given points. */\nexport function subSeg(s: Seg, t0: number, t1: number, p0: Point, p1: Point): Seg | null {\n if (t1 - t0 <= 0) return null;\n let out = s;\n if (t0 > 0) out = splitSeg(out, t0)[1];\n const u = (t1 - t0) / (1 - t0);\n if (u < 1) out = splitSeg(out, u)[0];\n out = out.slice();\n out[0] = p0;\n out[out.length - 1] = p1;\n return out;\n}\n\nexport const reverseContour = (c: Contour): Contour => c.map((s) => s.slice().reverse()).reverse();\n\n/** Points along a contour for area and containment estimates. */\nexport function sampleContour(c: Contour): number[] {\n const out: number[] = [];\n for (const s of c) {\n const n = s.length === 2 ? 1 : 16;\n for (let i = 0; i < n; i++) {\n const p = evalSeg(s, i / n);\n out.push(p.x, p.y);\n }\n }\n return out;\n}\n\n/** Signed area; positive when the fill lies to the left of the direction of travel. */\nexport function signedArea(c: Contour): number {\n const pts = sampleContour(c);\n let a = 0;\n for (let i = 0; i < pts.length; i += 2) {\n const j = (i + 2) % pts.length;\n a += pts[i] * pts[j + 1] - pts[j] * pts[i + 1];\n }\n return a / 2;\n}\n\n/** Bernstein coefficients of the signed distance cross(d, P − o) along `s`. */\nexport function sideCoeffs(s: Seg, o: Point, d: Point): number[] {\n return s.map((p) => d.x * (p.y - o.y) - d.y * (p.x - o.x));\n}\n\nfunction bernstein(f: number[], t: number): number {\n const u = 1 - t;\n if (f.length === 2) return u * f[0] + t * f[1];\n if (f.length === 3) return u * u * f[0] + 2 * u * t * f[1] + t * t * f[2];\n return u * u * u * f[0] + 3 * u * u * t * f[1] + 3 * u * t * t * f[2] + t * t * t * f[3];\n}\n\ninterface SignChange { t: number; before: number; after: number }\n\n/**\n * Where the polynomial changes sign on [0, 1]. The interval is cut at the\n * derivative's roots so each piece is monotonic, then each sign change is\n * bisected. Tangencies have no sign change and are skipped. With\n * `zeroIsPositive` a zero counts as positive, so a change landing exactly on\n * an end is still seen once; otherwise zeros at the ends are left to the\n * caller.\n */\nexport function signChanges(f: number[], zeroIsPositive: boolean): SignChange[] {\n const sgn = (v: number) => (v > 0 ? 1 : v < 0 ? -1 : zeroIsPositive ? 1 : 0);\n const cuts = [0, ...criticalPoints(f), 1];\n const out: SignChange[] = [];\n for (let i = 0; i + 1 < cuts.length; i++) {\n let lo = cuts[i], hi = cuts[i + 1];\n const slo = sgn(bernstein(f, lo)), shi = sgn(bernstein(f, hi));\n if (slo === 0 && i > 0) {\n const before = sgn(bernstein(f, lo - 1e-7)), after = sgn(bernstein(f, lo + 1e-7));\n if (before * after < 0) out.push({ t: lo, before, after });\n }\n if (slo * shi >= 0) continue;\n for (let it = 0; it < 64; it++) {\n const mid = (lo + hi) / 2;\n if (sgn(bernstein(f, mid)) === slo) lo = mid; else hi = mid;\n }\n out.push({ t: (lo + hi) / 2, before: slo, after: shi });\n }\n return out;\n}\n\n/** Roots in (0, 1) of the derivative of a Bernstein polynomial of degree ≤ 3. */\nfunction criticalPoints(f: number[]): number[] {\n if (f.length < 3) return [];\n const n = f.length - 1;\n const d = f.slice(1).map((v, i) => n * (v - f[i]));\n // Power basis of the derivative: A t² + B t + C.\n let A = 0, B: number, C: number;\n if (d.length === 2) { B = d[1] - d[0]; C = d[0]; }\n else { A = d[0] - 2 * d[1] + d[2]; B = 2 * (d[1] - d[0]); C = d[0]; }\n const out: number[] = [];\n const scale = Math.max(Math.abs(A), Math.abs(B), Math.abs(C)) || 1;\n if (Math.abs(A) / scale < 1e-12) {\n if (Math.abs(B) / scale > 1e-12) out.push(-C / B);\n } else {\n const disc = B * B - 4 * A * C;\n if (disc >= 0) {\n const q = -0.5 * (B + Math.sign(B || 1) * Math.sqrt(disc));\n out.push(q / A);\n if (q !== 0) out.push(C / q);\n }\n }\n return out.filter((t) => t > 0 && t < 1).sort((x, y) => x - y);\n}\n\n/** Sign of f just after t = 0 (`fromStart`) or just before t = 1, read off the control values. */\nexport function endSide(f: number[], fromStart: boolean): number {\n const n = f.length;\n for (let i = 1; i < n; i++) {\n const v = fromStart ? f[i] : f[n - 1 - i];\n if (v !== 0) return Math.sign(v);\n }\n return 0;\n}\n","/** Reading a path into contours, and what a set of contours encloses. */\n\nimport { segmentsCross } from '../polyline';\nimport type { Path, PathFillRule } from '../path';\nimport { PATH_C, PATH_L, PATH_M, PATH_Q, PATH_Z } from '../commands';\nimport type { Point } from '../paths/cubicMath';\nimport { EPS } from '../scalar';\nimport { fillsOpenSubpaths } from '../openFill';\nimport { resolveCorners } from '../paths/corners';\nimport { type Contour, evalSeg, derivSeg, reverseContour, sideCoeffs, signChanges } from './contourSegments';\n\n/** The contours a fill of `path` covers: an open subpath closes implicitly\n * where a fill closes it, and is left out where one does not. */\nexport function parseContours(path: Path): Contour[] {\n const fillsOpen = path.kind === 'rect' || fillsOpenSubpaths(path);\n return parseSubpaths(path).filter((s) => s.closed || fillsOpen).map((s) => s.segs);\n}\n\nexport interface Subpath {\n segs: Contour;\n /** Closed by a `Z` (or a rect); the closing edge, if any, is in `segs`. */\n closed: boolean;\n}\n\n/**\n * Subpaths of `path` with their segments. With `implicitClose` (the default,\n * as a fill sees them) every subpath ends in its closing edge; without it,\n * only a subpath closed by `Z` does, as a stroke sees them.\n */\nexport function parseSubpaths(given: Path, implicitClose = true): Subpath[] {\n const path = resolveCorners(given);\n if (path.kind === 'rect') {\n const { x, y, width: w, height: h } = path;\n const p = [{ x, y }, { x: x + w, y }, { x: x + w, y: y + h }, { x, y: y + h }];\n return [{ segs: p.map((q, i) => [q, p[(i + 1) % 4]]), closed: true }];\n }\n const out: Subpath[] = [];\n let cur: Contour = [];\n let start: Point = { x: 0, y: 0 };\n let pen: Point = start;\n const finish = (closed: boolean) => {\n if (cur.length > 0 && (closed || implicitClose) && (pen.x !== start.x || pen.y !== start.y)) {\n cur.push([pen, start]);\n }\n if (cur.length > 0) out.push({ segs: cur, closed });\n cur = [];\n pen = start;\n };\n const c = path.coords;\n let k = 0;\n for (const cmd of path.commands) {\n if (cmd === PATH_M) {\n finish(false);\n start = pen = { x: c[k], y: c[k + 1] };\n k += 2;\n } else if (cmd === PATH_L) {\n const e = { x: c[k], y: c[k + 1] };\n if (e.x !== pen.x || e.y !== pen.y) cur.push([pen, e]);\n pen = e;\n k += 2;\n } else if (cmd === PATH_Q) {\n const e = { x: c[k + 2], y: c[k + 3] };\n cur.push([pen, { x: c[k], y: c[k + 1] }, e]);\n pen = e;\n k += 4;\n } else if (cmd === PATH_C) {\n const e = { x: c[k + 4], y: c[k + 5] };\n cur.push([pen, { x: c[k], y: c[k + 1] }, { x: c[k + 2], y: c[k + 3] }, e]);\n pen = e;\n k += 6;\n } else if (cmd === PATH_Z) {\n finish(true);\n }\n }\n finish(false);\n return out;\n}\n\n/** Whether any contour crosses another or itself, judged on a flattening. */\nexport function contoursIntersect(contours: Contour[], tol: number): boolean {\n type Edge = { x0: number; y0: number; x1: number; y1: number; c: number; i: number; n: number };\n const edges: Edge[] = [];\n contours.forEach((contour, ci) => {\n const pts: Point[] = [];\n for (const s of contour) {\n let n = 1;\n if (s.length > 2) {\n let len = 0;\n for (let i = 0; i + 1 < s.length; i++) len += Math.hypot(s[i + 1].x - s[i].x, s[i + 1].y - s[i].y);\n n = Math.min(64, Math.max(2, Math.ceil(Math.sqrt(len / Math.max(tol, 1e-3)))));\n }\n for (let i = 0; i < n; i++) pts.push(evalSeg(s, i / n));\n }\n for (let i = 0; i < pts.length; i++) {\n const p = pts[i], q = pts[(i + 1) % pts.length];\n edges.push({ x0: p.x, y0: p.y, x1: q.x, y1: q.y, c: ci, i, n: pts.length });\n }\n });\n for (let i = 0; i < edges.length; i++) {\n const e = edges[i];\n for (let j = i + 1; j < edges.length; j++) {\n const f = edges[j];\n if (e.c === f.c && (j - i === 1 || (i === 0 && f.i === f.n - 1))) continue;\n if (Math.max(e.x0, e.x1) < Math.min(f.x0, f.x1) || Math.max(f.x0, f.x1) < Math.min(e.x0, e.x1)) continue;\n if (Math.max(e.y0, e.y1) < Math.min(f.y0, f.y1) || Math.max(f.y0, f.y1) < Math.min(e.y0, e.y1)) continue;\n if (segmentsCross(e.x0, e.y0, e.x1, e.y1, f.x0, f.y0, f.x1, f.y1)) return true;\n }\n }\n return false;\n}\n\n/** Winding number of `q`, by a ray cast in +x against the exact curves. */\nexport function windingAt(q: Point, contours: Contour[]): number {\n const dir = { x: 1, y: 0 };\n let w = 0;\n for (const contour of contours) {\n for (const s of contour) {\n for (const c of signChanges(sideCoeffs(s, q, dir), true)) {\n if (evalSeg(s, c.t).x > q.x) w += c.after > 0 ? 1 : -1;\n }\n }\n }\n return w;\n}\n\n/** The diagonal of the box around every control point of `contours`. */\nexport function extentOf(contours: Contour[]): number {\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (const c of contours) for (const s of c) for (const p of s) {\n minX = Math.min(minX, p.x); maxX = Math.max(maxX, p.x);\n minY = Math.min(minY, p.y); maxY = Math.max(maxY, p.y);\n }\n return Math.hypot(maxX - minX, maxY - minY);\n}\n\n/** The area below which a region cut from `contours` is rounding, not a piece. */\nexport function negligibleArea(contours: Contour[]): number {\n const extent = extentOf(contours);\n return extent * extent * EPS * EPS;\n}\n\n/**\n * The contours that bound the fill, each turned so the fill lies on its left.\n * A contour with fill on both sides or neither (a same-direction inner ring\n * under nonzero) bounds nothing and is dropped.\n */\nexport function orientBoundaries(contours: Contour[], fillRule: PathFillRule): Contour[] {\n const filled = (q: Point) => {\n const w = windingAt(q, contours);\n return fillRule === 'evenodd' ? (w & 1) !== 0 : w !== 0;\n };\n const eps = Math.max(extentOf(contours) * 1e-6, 1e-9);\n\n const out: Contour[] = [];\n for (const contour of contours) {\n let probe = contour[0];\n let best = -1;\n for (const s of contour) {\n const len = Math.hypot(s[s.length - 1].x - s[0].x, s[s.length - 1].y - s[0].y);\n if (len > best) { best = len; probe = s; }\n }\n const p = evalSeg(probe, 0.5);\n let tan = derivSeg(probe, 0.5);\n const tl = Math.hypot(tan.x, tan.y);\n if (tl === 0) continue;\n tan = { x: tan.x / tl, y: tan.y / tl };\n const left = filled({ x: p.x - tan.y * eps, y: p.y + tan.x * eps });\n const right = filled({ x: p.x + tan.y * eps, y: p.y - tan.x * eps });\n if (left && !right) out.push(contour);\n else if (right && !left) out.push(reverseContour(contour));\n }\n return out;\n}\n","/** Grouping traced loops into regions, and writing contours back out as paths. */\n\nimport { pointInPolygon } from '../polyline';\nimport type { PolygonPath, PathFillRule } from '../path';\nimport { PATH_C, PATH_L, PATH_M, PATH_Q, PATH_Z } from '../commands';\nimport { type Contour, evalSeg, sampleContour, signedArea } from './contourSegments';\nimport type { Subpath } from './contours';\n\n/** Group loops into regions: each positive loop with the holes it immediately contains. */\nexport function assembleRegions(outers: Contour[], holes: Contour[]): Contour[][] {\n const regions = outers.map((o) => ({ loops: [o], ring: sampleContour(o), area: signedArea(o) }));\n for (const h of holes) {\n const hp = evalSeg(h[0], 0.5);\n let best: (typeof regions)[number] | null = null;\n for (const r of regions) {\n if (pointInPolygon(r.ring, hp.x, hp.y) && (!best || r.area < best.area)) best = r;\n }\n best?.loops.push(h);\n }\n return regions.map((r) => r.loops);\n}\n\nexport const regionArea = (r: Contour[]): number => r.reduce((s, c) => s + signedArea(c), 0);\n\nexport const toPath = (loops: Contour[], fillRule: PathFillRule): PolygonPath =>\n writePath(loops.map((segs) => ({ segs, closed: true })), fillRule);\n\nexport function writePath(subpaths: Subpath[], fillRule: PathFillRule): PolygonPath {\n const cmds: number[] = [];\n const xs: number[] = [];\n for (const { segs, closed } of subpaths) {\n cmds.push(PATH_M);\n xs.push(segs[0][0].x, segs[0][0].y);\n for (const s of segs) {\n cmds.push(s.length === 2 ? PATH_L : s.length === 3 ? PATH_Q : PATH_C);\n for (let i = 1; i < s.length; i++) xs.push(s[i].x, s[i].y);\n }\n if (closed) cmds.push(PATH_Z);\n }\n return { kind: 'polygon', commands: new Uint8Array(cmds), coords: new Float32Array(xs), fillRule };\n}\n"]}
@@ -0,0 +1,386 @@
1
+ // src/box.ts
2
+ function boundsOfCoords(coords) {
3
+ if (coords.length < 2) return null;
4
+ let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;
5
+ for (let i = 0; i + 1 < coords.length; i += 2) {
6
+ const x = coords[i], y = coords[i + 1];
7
+ if (x < minX) minX = x;
8
+ if (y < minY) minY = y;
9
+ if (x > maxX) maxX = x;
10
+ if (y > maxY) maxY = y;
11
+ }
12
+ return [minX, minY, maxX, maxY];
13
+ }
14
+ function unionBox(a, b) {
15
+ return [
16
+ Math.min(a[0], b[0]),
17
+ Math.min(a[1], b[1]),
18
+ Math.max(a[2], b[2]),
19
+ Math.max(a[3], b[3])
20
+ ];
21
+ }
22
+ function boxContainsPoint(b, x, y) {
23
+ return x >= b[0] && x <= b[2] && y >= b[1] && y <= b[3];
24
+ }
25
+ function boxContainsBox(outer, inner) {
26
+ return inner[0] >= outer[0] && inner[1] >= outer[1] && inner[2] <= outer[2] && inner[3] <= outer[3];
27
+ }
28
+ function rectToContour(x, y, w, h) {
29
+ return Float64Array.of(x, y, x + w, y, x + w, y + h, x, y + h);
30
+ }
31
+
32
+ // src/commands.ts
33
+ var PATH_COMMANDS = {
34
+ /** moveTo — opens a new subpath. */
35
+ M: { code: 0, coords: 2 },
36
+ /** Straight segment from the pen to the next coord pair. */
37
+ L: { code: 1, coords: 2 },
38
+ /** Cubic bezier: two control points then the endpoint. */
39
+ C: { code: 2, coords: 6 },
40
+ /** Quadratic bezier: one control point then the endpoint. */
41
+ Q: { code: 3, coords: 4 },
42
+ /** Close the current subpath back to its start. Consumes no coords and
43
+ * leaves the pen where it is. */
44
+ Z: { code: 4, coords: 0 }
45
+ };
46
+ var PATH_M = PATH_COMMANDS.M.code;
47
+ var PATH_L = PATH_COMMANDS.L.code;
48
+ var PATH_C = PATH_COMMANDS.C.code;
49
+ var PATH_Q = PATH_COMMANDS.Q.code;
50
+ var PATH_Z = PATH_COMMANDS.Z.code;
51
+ var PATH_CMD_LENGTHS = buildCmdLengths();
52
+ function buildCmdLengths() {
53
+ const lengths = [];
54
+ for (const { code, coords } of Object.values(PATH_COMMANDS)) lengths[code] = coords;
55
+ return lengths;
56
+ }
57
+ function pathCommandCoordCount(cmd) {
58
+ return PATH_CMD_LENGTHS[cmd];
59
+ }
60
+ function forEachSegment(commands, coords, visit) {
61
+ let ci = 0;
62
+ let px = 0, py = 0;
63
+ let startX = 0, startY = 0;
64
+ let open = false;
65
+ for (let i = 0; i < commands.length; i++) {
66
+ const cmd = commands[i];
67
+ const opens = !open && cmd !== PATH_M && cmd !== PATH_Z;
68
+ if (opens) {
69
+ startX = px;
70
+ startY = py;
71
+ }
72
+ open = cmd !== PATH_Z;
73
+ if (visit(cmd, ci, px, py, i, opens) === false) return;
74
+ const len = pathCommandCoordCount(cmd);
75
+ if (len === void 0) throw new Error(`forEachSegment: unknown command code ${cmd}`);
76
+ if (len > 0) {
77
+ px = coords[ci + len - 2];
78
+ py = coords[ci + len - 1];
79
+ ci += len;
80
+ if (cmd === PATH_M) {
81
+ startX = px;
82
+ startY = py;
83
+ }
84
+ } else if (cmd === PATH_Z) {
85
+ px = startX;
86
+ py = startY;
87
+ }
88
+ }
89
+ }
90
+
91
+ // src/curve.ts
92
+ function cubicEvalAt(x0, y0, x1, y1, x2, y2, x3, y3, t) {
93
+ const u = 1 - t;
94
+ const a = u * u * u, b = 3 * u * u * t, c = 3 * u * t * t, d = t * t * t;
95
+ return [
96
+ a * x0 + b * x1 + c * x2 + d * x3,
97
+ a * y0 + b * y1 + c * y2 + d * y3
98
+ ];
99
+ }
100
+ function elevateQuadraticToCubic(q0x, q0y, cx, cy, q1x, q1y) {
101
+ return [
102
+ q0x + 2 / 3 * (cx - q0x),
103
+ q0y + 2 / 3 * (cy - q0y),
104
+ q1x + 2 / 3 * (cx - q1x),
105
+ q1y + 2 / 3 * (cy - q1y)
106
+ ];
107
+ }
108
+ function cubicAxisExtremaTs(p0, p1, p2, p3) {
109
+ const a = -p0 + 3 * p1 - 3 * p2 + p3;
110
+ const b = 2 * (p0 - 2 * p1 + p2);
111
+ const c = -p0 + p1;
112
+ const ts = [];
113
+ const push = (t) => {
114
+ if (t > 0 && t < 1) ts.push(t);
115
+ };
116
+ if (Math.abs(a) < 1e-12) {
117
+ if (Math.abs(b) > 1e-12) push(-c / b);
118
+ } else {
119
+ const disc = b * b - 4 * a * c;
120
+ if (disc >= 0) {
121
+ const sq = Math.sqrt(disc);
122
+ push((-b + sq) / (2 * a));
123
+ push((-b - sq) / (2 * a));
124
+ }
125
+ }
126
+ return ts;
127
+ }
128
+ function cubicBounds(x0, y0, x1, y1, x2, y2, x3, y3) {
129
+ let minX = Math.min(x0, x3), maxX = Math.max(x0, x3);
130
+ let minY = Math.min(y0, y3), maxY = Math.max(y0, y3);
131
+ for (const t of cubicAxisExtremaTs(x0, x1, x2, x3)) {
132
+ const [ex] = cubicEvalAt(x0, y0, x1, y1, x2, y2, x3, y3, t);
133
+ if (ex < minX) minX = ex;
134
+ if (ex > maxX) maxX = ex;
135
+ }
136
+ for (const t of cubicAxisExtremaTs(y0, y1, y2, y3)) {
137
+ const [, ey] = cubicEvalAt(x0, y0, x1, y1, x2, y2, x3, y3, t);
138
+ if (ey < minY) minY = ey;
139
+ if (ey > maxY) maxY = ey;
140
+ }
141
+ return [minX, minY, maxX, maxY];
142
+ }
143
+ function quadraticEvalAt(x0, y0, x1, y1, x2, y2, t) {
144
+ const u = 1 - t;
145
+ const a = u * u, b = 2 * u * t, c = t * t;
146
+ return [a * x0 + b * x1 + c * x2, a * y0 + b * y1 + c * y2];
147
+ }
148
+ function splitCubicAt(x0, y0, x1, y1, x2, y2, x3, y3, t) {
149
+ const ax = x0 + (x1 - x0) * t, ay = y0 + (y1 - y0) * t;
150
+ const bx = x1 + (x2 - x1) * t, by = y1 + (y2 - y1) * t;
151
+ const cx = x2 + (x3 - x2) * t, cy = y2 + (y3 - y2) * t;
152
+ const dx = ax + (bx - ax) * t, dy = ay + (by - ay) * t;
153
+ const ex = bx + (cx - bx) * t, ey = by + (cy - by) * t;
154
+ const mx = dx + (ex - dx) * t, my = dy + (ey - dy) * t;
155
+ return [[x0, y0, ax, ay, dx, dy, mx, my], [mx, my, ex, ey, cx, cy, x3, y3]];
156
+ }
157
+ function splitQuadraticAt(x0, y0, x1, y1, x2, y2, t) {
158
+ const ax = x0 + (x1 - x0) * t, ay = y0 + (y1 - y0) * t;
159
+ const bx = x1 + (x2 - x1) * t, by = y1 + (y2 - y1) * t;
160
+ const mx = ax + (bx - ax) * t, my = ay + (by - ay) * t;
161
+ return [[x0, y0, ax, ay, mx, my], [mx, my, bx, by, x2, y2]];
162
+ }
163
+ function splitLineAt(x0, y0, x1, y1, t) {
164
+ const mx = x0 + (x1 - x0) * t, my = y0 + (y1 - y0) * t;
165
+ return [[x0, y0, mx, my], [mx, my, x1, y1]];
166
+ }
167
+
168
+ // src/paths/builder.ts
169
+ var PathBuilder = class _PathBuilder {
170
+ cmds = [];
171
+ xs = [];
172
+ fillRule = "nonzero";
173
+ /** Seed a builder with an existing `PolygonPath`. Useful for extending
174
+ * an in-flight path with another segment (e.g. appending a cubic to
175
+ * the end of a curve in response to a user action) without hand-
176
+ * reaching into the `commands` / `coords` typed arrays.
177
+ *
178
+ * ```ts
179
+ * const next = PathBuilder.fromPath(current).curveTo(...).build();
180
+ * ```
181
+ */
182
+ static fromPath(path) {
183
+ const b = new _PathBuilder();
184
+ b.cmds = Array.from(path.commands);
185
+ b.xs = Array.from(path.coords);
186
+ b.fillRule = path.fillRule;
187
+ return b;
188
+ }
189
+ setFillRule(rule) {
190
+ this.fillRule = rule;
191
+ return this;
192
+ }
193
+ moveTo(x, y) {
194
+ this.cmds.push(PATH_M);
195
+ this.xs.push(x, y);
196
+ return this;
197
+ }
198
+ lineTo(x, y) {
199
+ this.cmds.push(PATH_L);
200
+ this.xs.push(x, y);
201
+ return this;
202
+ }
203
+ /** Cubic bezier to (x, y) with control points (x1, y1) and (x2, y2). */
204
+ curveTo(x1, y1, x2, y2, x, y) {
205
+ this.cmds.push(PATH_C);
206
+ this.xs.push(x1, y1, x2, y2, x, y);
207
+ return this;
208
+ }
209
+ /** Quadratic bezier to (x, y) with control point (x1, y1). */
210
+ quadTo(x1, y1, x, y) {
211
+ this.cmds.push(PATH_Q);
212
+ this.xs.push(x1, y1, x, y);
213
+ return this;
214
+ }
215
+ close() {
216
+ this.cmds.push(PATH_Z);
217
+ return this;
218
+ }
219
+ build() {
220
+ return {
221
+ kind: "polygon",
222
+ commands: new Uint8Array(this.cmds),
223
+ coords: new Float32Array(this.xs),
224
+ fillRule: this.fillRule
225
+ };
226
+ }
227
+ };
228
+ function rectPath(x, y, width, height) {
229
+ return { kind: "rect", x, y, width, height };
230
+ }
231
+ function asPolygonPath(path) {
232
+ if (path.kind === "polygon") return path;
233
+ return {
234
+ kind: "polygon",
235
+ commands: new Uint8Array([PATH_M, PATH_L, PATH_L, PATH_L, PATH_Z]),
236
+ coords: Float32Array.from(rectToContour(path.x, path.y, path.width, path.height)),
237
+ fillRule: "nonzero"
238
+ };
239
+ }
240
+ function polylineFromPoints(points) {
241
+ const b = new PathBuilder();
242
+ const first = points[0];
243
+ if (!first) return rectPath(0, 0, 0, 0);
244
+ b.moveTo(first.x, first.y);
245
+ for (let i = 1; i < points.length; i++) {
246
+ const p = points[i];
247
+ if (p) b.lineTo(p.x, p.y);
248
+ }
249
+ return b.build();
250
+ }
251
+ function polygonFromPoints(points, opts = {}) {
252
+ if (points.length === 0) {
253
+ return {
254
+ kind: "polygon",
255
+ commands: new Uint8Array(),
256
+ coords: new Float32Array(),
257
+ fillRule: opts.fillRule ?? "nonzero"
258
+ };
259
+ }
260
+ const b = new PathBuilder();
261
+ if (opts.fillRule) b.setFillRule(opts.fillRule);
262
+ b.moveTo(points[0].x, points[0].y);
263
+ for (let i = 1; i < points.length; i++) b.lineTo(points[i].x, points[i].y);
264
+ b.close();
265
+ return b.build();
266
+ }
267
+ var ELLIPSE_KAPPA = 0.5522847498307936;
268
+ function ellipsePath(bounds) {
269
+ const cx = bounds.x + bounds.width / 2;
270
+ const cy = bounds.y + bounds.height / 2;
271
+ const rx = bounds.width / 2;
272
+ const ry = bounds.height / 2;
273
+ const ox = rx * ELLIPSE_KAPPA;
274
+ const oy = ry * ELLIPSE_KAPPA;
275
+ const b = new PathBuilder();
276
+ b.moveTo(cx + rx, cy);
277
+ b.curveTo(cx + rx, cy + oy, cx + ox, cy + ry, cx, cy + ry);
278
+ b.curveTo(cx - ox, cy + ry, cx - rx, cy + oy, cx - rx, cy);
279
+ b.curveTo(cx - rx, cy - oy, cx - ox, cy - ry, cx, cy - ry);
280
+ b.curveTo(cx + ox, cy - ry, cx + rx, cy - oy, cx + rx, cy);
281
+ b.close();
282
+ return b.build();
283
+ }
284
+ function regularPolygonPath(center, radius, sides, rotation = 0) {
285
+ const b = new PathBuilder();
286
+ for (let i = 0; i < sides; i++) {
287
+ const a = rotation + i / sides * Math.PI * 2;
288
+ const x = center.x + radius * Math.cos(a);
289
+ const y = center.y + radius * Math.sin(a);
290
+ if (i === 0) b.moveTo(x, y);
291
+ else b.lineTo(x, y);
292
+ }
293
+ b.close();
294
+ return b.build();
295
+ }
296
+ function starPath(center, outerRadius, points = 5, innerRadius = outerRadius / 2, rotation = 0) {
297
+ const b = new PathBuilder();
298
+ const n = points * 2;
299
+ for (let i = 0; i < n; i++) {
300
+ const a = rotation + i / n * Math.PI * 2;
301
+ const r = i % 2 === 0 ? outerRadius : innerRadius;
302
+ const x = center.x + r * Math.cos(a);
303
+ const y = center.y + r * Math.sin(a);
304
+ if (i === 0) b.moveTo(x, y);
305
+ else b.lineTo(x, y);
306
+ }
307
+ b.close();
308
+ return b.build();
309
+ }
310
+ function linePath(a, b) {
311
+ const pb = new PathBuilder();
312
+ pb.moveTo(a.x, a.y);
313
+ pb.lineTo(b.x, b.y);
314
+ return pb.build();
315
+ }
316
+
317
+ // src/paths/cornerSpec.ts
318
+ function cornerAt(path, index) {
319
+ const spec = path.corners?.[index];
320
+ return spec && spec.radius > 0 ? spec : null;
321
+ }
322
+ function cornerSpecAt(path, index) {
323
+ return path.corners?.[index] ?? null;
324
+ }
325
+ function hasCorners(path) {
326
+ const corners = path.corners;
327
+ if (!corners) return false;
328
+ for (const c of corners) if (c && c.radius > 0) return true;
329
+ return false;
330
+ }
331
+ function compactCorners(corners) {
332
+ let end = corners.length;
333
+ while (end > 0 && !corners[end - 1]) end--;
334
+ if (end === 0) return void 0;
335
+ const out = new Array(end);
336
+ for (let i = 0; i < end; i++) out[i] = corners[i] ?? null;
337
+ return out;
338
+ }
339
+ function withoutCorners(path) {
340
+ if (path.corners === void 0) return path;
341
+ const { corners: _dropped, ...rest } = path;
342
+ return rest;
343
+ }
344
+ function withCorner(path, index, spec) {
345
+ const next = path.corners ? [...path.corners] : [];
346
+ while (next.length <= index) next.push(null);
347
+ next[index] = spec ? { shape: spec.shape, radius: Math.max(0, spec.radius) } : null;
348
+ const corners = compactCorners(next);
349
+ const bare = withoutCorners(path);
350
+ return corners ? { ...bare, corners } : bare;
351
+ }
352
+ function scaleCorners(path, factor) {
353
+ if (!path.corners || factor === 1) return path;
354
+ return {
355
+ ...path,
356
+ corners: path.corners.map((c) => c ? { shape: c.shape, radius: c.radius * factor } : null)
357
+ };
358
+ }
359
+ function lerpCorners(a, b, t) {
360
+ if (!a && !b) return void 0;
361
+ const n = Math.max(a?.length ?? 0, b?.length ?? 0);
362
+ const out = new Array(n);
363
+ for (let i = 0; i < n; i++) {
364
+ const ca = a?.[i] ?? null, cb = b?.[i] ?? null;
365
+ const either = ca ?? cb;
366
+ if (!either) out[i] = null;
367
+ else if (ca && cb && ca.shape !== cb.shape) out[i] = t < 0.5 ? ca : cb;
368
+ else out[i] = { shape: either.shape, radius: (ca?.radius ?? 0) + ((cb?.radius ?? 0) - (ca?.radius ?? 0)) * t };
369
+ }
370
+ return compactCorners(out);
371
+ }
372
+
373
+ // src/paths/cubicMath.ts
374
+ function cubicPointAt(p0, p1, p2, p3, t) {
375
+ const [x, y] = cubicEvalAt(p0.x, p0.y, p1.x, p1.y, p2.x, p2.y, p3.x, p3.y, t);
376
+ return { x, y };
377
+ }
378
+ function splitCubicAtT(p0, p1, p2, p3, t) {
379
+ const [l, r] = splitCubicAt(p0.x, p0.y, p1.x, p1.y, p2.x, p2.y, p3.x, p3.y, t);
380
+ const quad = (c) => [{ x: c[0], y: c[1] }, { x: c[2], y: c[3] }, { x: c[4], y: c[5] }, { x: c[6], y: c[7] }];
381
+ return { left: quad(l), right: quad(r) };
382
+ }
383
+
384
+ export { PATH_C, PATH_CMD_LENGTHS, PATH_COMMANDS, PATH_L, PATH_M, PATH_Q, PATH_Z, PathBuilder, asPolygonPath, boundsOfCoords, boxContainsBox, boxContainsPoint, compactCorners, cornerAt, cornerSpecAt, cubicAxisExtremaTs, cubicBounds, cubicEvalAt, cubicPointAt, elevateQuadraticToCubic, ellipsePath, forEachSegment, hasCorners, lerpCorners, linePath, pathCommandCoordCount, polygonFromPoints, polylineFromPoints, quadraticEvalAt, rectPath, rectToContour, regularPolygonPath, scaleCorners, splitCubicAt, splitCubicAtT, splitLineAt, splitQuadraticAt, starPath, unionBox, withCorner, withoutCorners };
385
+ //# sourceMappingURL=chunk-B53BERKG.js.map
386
+ //# sourceMappingURL=chunk-B53BERKG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/box.ts","../src/commands.ts","../src/curve.ts","../src/paths/builder.ts","../src/paths/cornerSpec.ts","../src/paths/cubicMath.ts"],"names":[],"mappings":"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","file":"chunk-B53BERKG.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","/**\n * SVG-style command-stream encoding — the kit's single declaration of the path\n * opcodes.\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.\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 stops the\n * walk by returning `false`. `Z` returns the pen to the subpath's opening `M`.\n *\n * A command following a `Z` without an intervening `M` opens a new subpath at\n * the pen, as does a drawing command no `M` precedes at all. The visitor is\n * told with `opensSubpath`, and has to start its contour at `(penX, penY)`\n * then: there is no `M` to do it.\n *\n * A code `PATH_COMMANDS` does not declare throws once the visitor has seen it.\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 opensSubpath: boolean,\n ) => void | boolean,\n): void {\n let ci = 0;\n let px = 0, py = 0;\n let startX = 0, startY = 0;\n let open = false;\n for (let i = 0; i < commands.length; i++) {\n const cmd = commands[i];\n const opens = !open && cmd !== PATH_M && cmd !== PATH_Z;\n if (opens) { startX = px; startY = py; }\n open = cmd !== PATH_Z;\n if (visit(cmd, ci, px, py, i, opens) === 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","import type { Box } from './box';\n\n/** Cubic Bezier point at parameter t (de Casteljau / Bernstein form). */\nexport function cubicEvalAt(\n x0: number, y0: number, x1: number, y1: number,\n x2: number, y2: number, x3: number, y3: number, t: number,\n): [number, number] {\n const u = 1 - t;\n const a = u * u * u, b = 3 * u * u * t, c = 3 * u * t * t, d = t * t * t;\n return [\n a * x0 + b * x1 + c * x2 + d * x3,\n a * y0 + b * y1 + c * y2 + d * y3,\n ];\n}\n\n/**\n * Degree-elevate a quadratic (q0, ctrl, q1) to a cubic. Returns the two\n * cubic control points [c1x, c1y, c2x, c2y]; the cubic endpoints equal the\n * quadratic endpoints. c1 = q0 + 2/3(ctrl-q0), c2 = q1 + 2/3(ctrl-q1).\n */\nexport function elevateQuadraticToCubic(\n q0x: number, q0y: number, cx: number, cy: number, q1x: number, q1y: number,\n): [number, number, number, number] {\n return [\n q0x + (2 / 3) * (cx - q0x),\n q0y + (2 / 3) * (cy - q0y),\n q1x + (2 / 3) * (cx - q1x),\n q1y + (2 / 3) * (cy - q1y),\n ];\n}\n\n/** The parameters in (0, 1) where one coordinate of a cubic, with control\n * values `p0..p3`, turns: the roots of its derivative. */\nexport function cubicAxisExtremaTs(p0: number, p1: number, p2: number, p3: number): number[] {\n // B'(t)=0 → quadratic a t² + b t + c = 0 with:\n const a = -p0 + 3 * p1 - 3 * p2 + p3;\n const b = 2 * (p0 - 2 * p1 + p2);\n const c = -p0 + p1;\n const ts: number[] = [];\n const push = (t: number) => { if (t > 0 && t < 1) ts.push(t); };\n if (Math.abs(a) < 1e-12) {\n if (Math.abs(b) > 1e-12) push(-c / b);\n } else {\n const disc = b * b - 4 * a * c;\n if (disc >= 0) {\n const sq = Math.sqrt(disc);\n push((-b + sq) / (2 * a));\n push((-b - sq) / (2 * a));\n }\n }\n return ts;\n}\n\n/** Tight AABB of a cubic, evaluating only extrema that lie on the curve. */\nexport function cubicBounds(\n x0: number, y0: number, x1: number, y1: number,\n x2: number, y2: number, x3: number, y3: number,\n): Box {\n let minX = Math.min(x0, x3), maxX = Math.max(x0, x3);\n let minY = Math.min(y0, y3), maxY = Math.max(y0, y3);\n for (const t of cubicAxisExtremaTs(x0, x1, x2, x3)) {\n const [ex] = cubicEvalAt(x0, y0, x1, y1, x2, y2, x3, y3, t);\n if (ex < minX) minX = ex;\n if (ex > maxX) maxX = ex;\n }\n for (const t of cubicAxisExtremaTs(y0, y1, y2, y3)) {\n const [, ey] = cubicEvalAt(x0, y0, x1, y1, x2, y2, x3, y3, t);\n if (ey < minY) minY = ey;\n if (ey > maxY) maxY = ey;\n }\n return [minX, minY, maxX, maxY];\n}\n\n/** Quadratic Bezier point at parameter t (Bernstein form). */\nexport function quadraticEvalAt(\n x0: number, y0: number, x1: number, y1: number, x2: number, y2: number, t: number,\n): [number, number] {\n const u = 1 - t;\n const a = u * u, b = 2 * u * t, c = t * t;\n return [a * x0 + b * x1 + c * x2, a * y0 + b * y1 + c * y2];\n}\n\n/** A line segment's coords: start, end. */\nexport type LineCoords = [number, number, number, number];\n/** A quadratic Bezier's coords: start, control, end. */\nexport type QuadraticCoords = [number, number, number, number, number, number];\n/** A cubic Bezier's coords: start, two controls, end. */\nexport type CubicCoords = [number, number, number, number, number, number, number, number];\n\n/**\n * Split a cubic at parameter t (de Casteljau). The two halves share the point\n * at t and together trace the original exactly. A t outside [0, 1] splits the\n * curve's polynomial extension.\n */\nexport function splitCubicAt(\n x0: number, y0: number, x1: number, y1: number,\n x2: number, y2: number, x3: number, y3: number, t: number,\n): [CubicCoords, CubicCoords] {\n const ax = x0 + (x1 - x0) * t, ay = y0 + (y1 - y0) * t;\n const bx = x1 + (x2 - x1) * t, by = y1 + (y2 - y1) * t;\n const cx = x2 + (x3 - x2) * t, cy = y2 + (y3 - y2) * t;\n const dx = ax + (bx - ax) * t, dy = ay + (by - ay) * t;\n const ex = bx + (cx - bx) * t, ey = by + (cy - by) * t;\n const mx = dx + (ex - dx) * t, my = dy + (ey - dy) * t;\n return [[x0, y0, ax, ay, dx, dy, mx, my], [mx, my, ex, ey, cx, cy, x3, y3]];\n}\n\n/** Split a quadratic at parameter t (de Casteljau). See {@link splitCubicAt}. */\nexport function splitQuadraticAt(\n x0: number, y0: number, x1: number, y1: number, x2: number, y2: number, t: number,\n): [QuadraticCoords, QuadraticCoords] {\n const ax = x0 + (x1 - x0) * t, ay = y0 + (y1 - y0) * t;\n const bx = x1 + (x2 - x1) * t, by = y1 + (y2 - y1) * t;\n const mx = ax + (bx - ax) * t, my = ay + (by - ay) * t;\n return [[x0, y0, ax, ay, mx, my], [mx, my, bx, by, x2, y2]];\n}\n\n/** Split a line segment at parameter t. See {@link splitCubicAt}. */\nexport function splitLineAt(\n x0: number, y0: number, x1: number, y1: number, t: number,\n): [LineCoords, LineCoords] {\n const mx = x0 + (x1 - x0) * t, my = y0 + (y1 - y0) * t;\n return [[x0, y0, mx, my], [mx, my, x1, y1]];\n}\n","/**\n * Fluent builder for `PolygonPath`. Hides the `Uint8Array` / `Float32Array`\n * encoding behind move/line/curve/close calls and a final `build()`. Use\n * this to construct paths in tests and demos; production callers that need\n * to mutate large paths in place should reach for the raw arrays directly.\n *\n * Numeric capacity grows by doubling — typical for amortized O(1) push.\n *\n * Also exposes `rectPath` / `polygonFromPoints` shortcuts for the common\n * cases. `rectPath` returns the lighter `RectPath` subtype, not a polygon.\n */\n\nimport { rectToContour } from '../box';\nimport { PATH_C, PATH_L, PATH_M, PATH_Q, PATH_Z } from '../commands';\nimport type { Path, PathFillRule, PolygonPath, RectPath } from '../path';\n\n/** Fluent builder for `PolygonPath`; hides the `Uint8Array`/`Float32Array` encoding behind move/line/curve/close calls. */\nexport class PathBuilder {\n private cmds: number[] = [];\n private xs: number[] = [];\n private fillRule: PathFillRule = 'nonzero';\n\n /** Seed a builder with an existing `PolygonPath`. Useful for extending\n * an in-flight path with another segment (e.g. appending a cubic to\n * the end of a curve in response to a user action) without hand-\n * reaching into the `commands` / `coords` typed arrays.\n *\n * ```ts\n * const next = PathBuilder.fromPath(current).curveTo(...).build();\n * ```\n */\n static fromPath(path: PolygonPath): PathBuilder {\n const b = new PathBuilder();\n b.cmds = Array.from(path.commands);\n b.xs = Array.from(path.coords);\n b.fillRule = path.fillRule;\n return b;\n }\n\n setFillRule(rule: PathFillRule): this {\n this.fillRule = rule;\n return this;\n }\n\n moveTo(x: number, y: number): this {\n this.cmds.push(PATH_M);\n this.xs.push(x, y);\n return this;\n }\n\n lineTo(x: number, y: number): this {\n this.cmds.push(PATH_L);\n this.xs.push(x, y);\n return this;\n }\n\n /** Cubic bezier to (x, y) with control points (x1, y1) and (x2, y2). */\n curveTo(x1: number, y1: number, x2: number, y2: number, x: number, y: number): this {\n this.cmds.push(PATH_C);\n this.xs.push(x1, y1, x2, y2, x, y);\n return this;\n }\n\n /** Quadratic bezier to (x, y) with control point (x1, y1). */\n quadTo(x1: number, y1: number, x: number, y: number): this {\n this.cmds.push(PATH_Q);\n this.xs.push(x1, y1, x, y);\n return this;\n }\n\n close(): this {\n this.cmds.push(PATH_Z);\n return this;\n }\n\n build(): PolygonPath {\n return {\n kind: 'polygon',\n commands: new Uint8Array(this.cmds),\n coords: new Float32Array(this.xs),\n fillRule: this.fillRule,\n };\n }\n}\n\n/** Construct a `RectPath` (the fast-path subtype). */\nexport function rectPath(x: number, y: number, width: number, height: number): RectPath {\n return { kind: 'rect', x, y, width, height };\n}\n\n/** `path` as a command stream drawing the same outline. A rect becomes its four\n * corners clockwise from `(x, y)`, the order `countPathAnchors` numbers them in. */\nexport function asPolygonPath(path: Path): PolygonPath {\n if (path.kind === 'polygon') return path;\n return {\n kind: 'polygon',\n commands: new Uint8Array([PATH_M, PATH_L, PATH_L, PATH_L, PATH_Z]),\n coords: Float32Array.from(rectToContour(path.x, path.y, path.width, path.height)),\n fillRule: 'nonzero',\n };\n}\n\n/** Build an open polyline from a flat list of points — the same geometry as\n * {@link polygonFromPoints} without the closing edge. A freehand stroke and a\n * measurement line want this; a region wants the closed one. */\nexport function polylineFromPoints(\n points: readonly { x: number; y: number }[],\n): PolygonPath | RectPath {\n const b = new PathBuilder();\n const first = points[0];\n if (!first) return rectPath(0, 0, 0, 0);\n b.moveTo(first.x, first.y);\n for (let i = 1; i < points.length; i++) {\n const p = points[i];\n if (p) b.lineTo(p.x, p.y);\n }\n return b.build();\n}\n\n/** Build a closed polygon from a flat list of points. */\nexport function polygonFromPoints(\n points: readonly { x: number; y: number }[],\n opts: { fillRule?: PathFillRule } = {},\n): PolygonPath {\n if (points.length === 0) {\n return {\n kind: 'polygon',\n commands: new Uint8Array(),\n coords: new Float32Array(),\n fillRule: opts.fillRule ?? 'nonzero',\n };\n }\n const b = new PathBuilder();\n if (opts.fillRule) b.setFillRule(opts.fillRule);\n b.moveTo(points[0].x, points[0].y);\n for (let i = 1; i < points.length; i++) b.lineTo(points[i].x, points[i].y);\n b.close();\n return b.build();\n}\n\n/** Cubic-Bezier kappa for circular-quadrant approximation (<1% max error). */\nconst ELLIPSE_KAPPA = 0.5522847498307936;\n\n/** Closed ellipse inscribed in `bounds`, as a 4-cubic-Bezier `PolygonPath`.\n * Matches the geometry `useEllipseTool`'s overlay paints. */\nexport function ellipsePath(\n bounds: { x: number; y: number; width: number; height: number },\n): PolygonPath {\n const cx = bounds.x + bounds.width / 2;\n const cy = bounds.y + bounds.height / 2;\n const rx = bounds.width / 2;\n const ry = bounds.height / 2;\n const ox = rx * ELLIPSE_KAPPA;\n const oy = ry * ELLIPSE_KAPPA;\n const b = new PathBuilder();\n b.moveTo(cx + rx, cy);\n b.curveTo(cx + rx, cy + oy, cx + ox, cy + ry, cx, cy + ry);\n b.curveTo(cx - ox, cy + ry, cx - rx, cy + oy, cx - rx, cy);\n b.curveTo(cx - rx, cy - oy, cx - ox, cy - ry, cx, cy - ry);\n b.curveTo(cx + ox, cy - ry, cx + rx, cy - oy, cx + rx, cy);\n b.close();\n return b.build();\n}\n\n/** Closed regular n-gon centered at `center`, circumscribed by `radius`.\n * `rotation` is in radians; default 0 puts the first vertex on the +x axis. */\nexport function regularPolygonPath(\n center: { x: number; y: number },\n radius: number,\n sides: number,\n rotation = 0,\n): PolygonPath {\n const b = new PathBuilder();\n for (let i = 0; i < sides; i++) {\n const a = rotation + (i / sides) * Math.PI * 2;\n const x = center.x + radius * Math.cos(a);\n const y = center.y + radius * Math.sin(a);\n if (i === 0) b.moveTo(x, y); else b.lineTo(x, y);\n }\n b.close();\n return b.build();\n}\n\n/** Closed n-pointed star centered at `center`, alternating `outerRadius` and\n * `innerRadius` (default `outerRadius / 2`). `rotation` is in radians. */\nexport function starPath(\n center: { x: number; y: number },\n outerRadius: number,\n points = 5,\n innerRadius: number = outerRadius / 2,\n rotation = 0,\n): PolygonPath {\n const b = new PathBuilder();\n const n = points * 2;\n for (let i = 0; i < n; i++) {\n const a = rotation + (i / n) * Math.PI * 2;\n const r = i % 2 === 0 ? outerRadius : innerRadius;\n const x = center.x + r * Math.cos(a);\n const y = center.y + r * Math.sin(a);\n if (i === 0) b.moveTo(x, y); else b.lineTo(x, y);\n }\n b.close();\n return b.build();\n}\n\n/** Open 2-vertex polyline from `a` to `b` — strokeable, not fillable. */\nexport function linePath(\n a: { x: number; y: number },\n b: { x: number; y: number },\n): PolygonPath {\n const pb = new PathBuilder();\n pb.moveTo(a.x, a.y);\n pb.lineTo(b.x, b.y);\n return pb.build();\n}\n","/**\n * Per-anchor corner specs: the stored half of corner shapes. A path carries\n * them in `PolygonPath.corners`, indexed by flat anchor index, and every\n * reader of its geometry sees them expanded (`resolveCorners`).\n */\nimport type { PolygonPath } from '../path';\nimport type { CornerShape } from './cornerShape';\n\n/** The corner at one anchor: its shape, and its setback, how far along each\n * edge from the anchor the cut starts. A `round` corner between edges at a\n * right angle is a circle of that radius. */\nexport interface CornerSpec {\n shape: CornerShape;\n radius: number;\n}\n\n/** The corner cut at flat anchor `index`, or null. A zero radius cuts nothing. */\nexport function cornerAt(path: PolygonPath, index: number): CornerSpec | null {\n const spec = path.corners?.[index];\n return spec && spec.radius > 0 ? spec : null;\n}\n\n/** The spec stored at flat anchor `index`, radius zero included: a shape\n * picked before any radius is dragged out. */\nexport function cornerSpecAt(path: PolygonPath, index: number): CornerSpec | null {\n return path.corners?.[index] ?? null;\n}\n\n/** Whether any anchor of `path` carries a corner with a radius. */\nexport function hasCorners(path: { kind: string; corners?: PolygonPath['corners'] }): boolean {\n const corners = path.corners;\n if (!corners) return false;\n for (const c of corners) if (c && c.radius > 0) return true;\n return false;\n}\n\n/** `corners` without trailing empty slots, or undefined when none is left. */\nexport function compactCorners(\n corners: readonly (CornerSpec | null | undefined)[],\n): (CornerSpec | null)[] | undefined {\n let end = corners.length;\n while (end > 0 && !corners[end - 1]) end--;\n if (end === 0) return undefined;\n const out: (CornerSpec | null)[] = new Array(end);\n for (let i = 0; i < end; i++) out[i] = corners[i] ?? null;\n return out;\n}\n\n/** `path` without its corner specs: the bare anchors the specs decorate. */\nexport function withoutCorners(path: PolygonPath): PolygonPath {\n if (path.corners === undefined) return path;\n const { corners: _dropped, ...rest } = path;\n return rest;\n}\n\n/** `path` with the corner at flat anchor `index` set to `spec`, or cleared\n * when `spec` is null. A zero radius keeps the shape and cuts nothing.\n * Never mutates `path`. */\nexport function withCorner(path: PolygonPath, index: number, spec: CornerSpec | null): PolygonPath {\n const next: (CornerSpec | null)[] = path.corners ? [...path.corners] : [];\n while (next.length <= index) next.push(null);\n next[index] = spec ? { shape: spec.shape, radius: Math.max(0, spec.radius) } : null;\n const corners = compactCorners(next);\n const bare = withoutCorners(path);\n return corners ? { ...bare, corners } : bare;\n}\n\n/** `path` with every corner radius multiplied by `factor`, as a uniform\n * scale of its geometry would carry them. */\nexport function scaleCorners(path: PolygonPath, factor: number): PolygonPath {\n if (!path.corners || factor === 1) return path;\n return {\n ...path,\n corners: path.corners.map((c) => (c ? { shape: c.shape, radius: c.radius * factor } : null)),\n };\n}\n\n/**\n * The corners of a path `t` of the way from `a` to `b`, which share their\n * anchors. A corner whose shape both ends agree on, or that one end leaves\n * sharp, grows its radius between them; one whose shape changes takes the\n * nearer end's.\n */\nexport function lerpCorners(\n a: PolygonPath['corners'],\n b: PolygonPath['corners'],\n t: number,\n): (CornerSpec | null)[] | undefined {\n if (!a && !b) return undefined;\n const n = Math.max(a?.length ?? 0, b?.length ?? 0);\n const out: (CornerSpec | null)[] = new Array(n);\n for (let i = 0; i < n; i++) {\n const ca = a?.[i] ?? null, cb = b?.[i] ?? null;\n const either = ca ?? cb;\n if (!either) out[i] = null;\n else if (ca && cb && ca.shape !== cb.shape) out[i] = t < 0.5 ? ca : cb;\n else out[i] = { shape: either.shape, radius: (ca?.radius ?? 0) + ((cb?.radius ?? 0) - (ca?.radius ?? 0)) * t };\n }\n return compactCorners(out);\n}\n","import { cubicEvalAt, splitCubicAt, type CubicCoords } from '../curve';\n\n/** A 2D point, the shape the point-taking path helpers read and return. */\nexport interface Point { x: number; y: number; }\n\n/** Point on the cubic Bezier (p0, p1, p2, p3) at parameter t. The point-shaped\n * face of geom's `cubicEvalAt`. */\nexport function cubicPointAt(p0: Point, p1: Point, p2: Point, p3: Point, t: number): Point {\n const [x, y] = cubicEvalAt(p0.x, p0.y, p1.x, p1.y, p2.x, p2.y, p3.x, p3.y, t);\n return { x, y };\n}\n\n/** De Casteljau subdivision of a cubic at parameter t. The point-shaped face\n * of geom's `splitCubicAt`; `left[3]` and `right[0]` are the point at t. */\nexport function splitCubicAtT(\n p0: Point, p1: Point, p2: Point, p3: Point,\n t: number,\n): { left: [Point, Point, Point, Point]; right: [Point, Point, Point, Point] } {\n const [l, r] = splitCubicAt(p0.x, p0.y, p1.x, p1.y, p2.x, p2.y, p3.x, p3.y, t);\n const quad = (c: CubicCoords): [Point, Point, Point, Point] =>\n [{ x: c[0], y: c[1] }, { x: c[2], y: c[3] }, { x: c[4], y: c[5] }, { x: c[6], y: c[7] }];\n return { left: quad(l), right: quad(r) };\n}\n"]}