@weasel-js/geom 1.15.0 → 1.15.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/dist/3d/index.d.ts +3 -1
  2. package/dist/3d/index.js +7 -10
  3. package/dist/3d/index.js.map +1 -1
  4. package/dist/booleans/index.js +4 -5
  5. package/dist/booleans/index.js.map +1 -1
  6. package/dist/{chunk-B3D6KWW3.js → chunk-346XYYMX.js} +154 -3
  7. package/dist/chunk-346XYYMX.js.map +1 -0
  8. package/dist/chunk-DNX24KBT.js +82 -0
  9. package/dist/chunk-DNX24KBT.js.map +1 -0
  10. package/dist/{chunk-EURWZUNY.js → chunk-GA5R5KWD.js} +59 -65
  11. package/dist/chunk-GA5R5KWD.js.map +1 -0
  12. package/dist/{chunk-3HQJGI63.js → chunk-HTT5AQIU.js} +3 -4
  13. package/dist/chunk-HTT5AQIU.js.map +1 -0
  14. package/dist/{chunk-FROQPADA.js → chunk-IDSKOHA4.js} +4 -4
  15. package/dist/{chunk-FROQPADA.js.map → chunk-IDSKOHA4.js.map} +1 -1
  16. package/dist/{chunk-HMGGJZTM.js → chunk-MIKP4V2C.js} +7 -21
  17. package/dist/chunk-MIKP4V2C.js.map +1 -0
  18. package/dist/{chunk-HNLJO3E7.js → chunk-MOCSUHEI.js} +22 -8
  19. package/dist/chunk-MOCSUHEI.js.map +1 -0
  20. package/dist/{chunk-3YH5XU3H.js → chunk-OQP5M5VD.js} +14 -23
  21. package/dist/chunk-OQP5M5VD.js.map +1 -0
  22. package/dist/{chunk-ZOMUTU7J.js → chunk-STYO7J4Y.js} +5 -11
  23. package/dist/chunk-STYO7J4Y.js.map +1 -0
  24. package/dist/{curvature-CDOI32hv.d.ts → curvature-DKPO4Qeh.d.ts} +0 -27
  25. package/dist/curves/index.d.ts +1 -1
  26. package/dist/curves/index.js +4 -4
  27. package/dist/index.d.ts +108 -3
  28. package/dist/index.js +159 -162
  29. package/dist/index.js.map +1 -1
  30. package/dist/nd/index.d.ts +28 -1
  31. package/dist/nd/index.js +2 -5
  32. package/dist/nd/index.js.map +1 -1
  33. package/dist/tessellate/index.js +5 -5
  34. package/dist/warp/index.js +8 -15
  35. package/dist/warp/index.js.map +1 -1
  36. package/package.json +3 -3
  37. package/dist/chunk-2N6OWA7E.js +0 -104
  38. package/dist/chunk-2N6OWA7E.js.map +0 -1
  39. package/dist/chunk-3HQJGI63.js.map +0 -1
  40. package/dist/chunk-3YH5XU3H.js.map +0 -1
  41. package/dist/chunk-755Y4YZS.js +0 -32
  42. package/dist/chunk-755Y4YZS.js.map +0 -1
  43. package/dist/chunk-B3D6KWW3.js.map +0 -1
  44. package/dist/chunk-EURWZUNY.js.map +0 -1
  45. package/dist/chunk-HMGGJZTM.js.map +0 -1
  46. package/dist/chunk-HNLJO3E7.js.map +0 -1
  47. package/dist/chunk-ZOMUTU7J.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/paths/schneiderFit.ts","../src/paths/cornerShape.ts","../src/paths/cornerSegments.ts","../src/paths/corners.ts","../src/flatten.ts","../src/polyline.ts","../src/openFill.ts"],"names":["fit","sub","unit","len2"],"mappings":"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","file":"chunk-EURWZUNY.js","sourcesContent":["import { PathBuilder } from './builder';\nimport { cubicPointAt, type Point } from './cubicMath';\nimport type { PolygonPath } from '../path';\n\n/**\n * Schneider (1990, Graphics Gems I) adaptive cubic-Bezier fitter.\n * Given a sequence of sample points, returns a `PolygonPath` whose `C`\n * segments approximate the samples within `errorTolerance` world units.\n *\n * Output shape: an initial `M` to the first sample, followed by N\n * `C` cubic segments. For colinear / two-point inputs, returns a single\n * degenerate cubic. For empty input, returns an empty polygon path.\n */\nexport function schneiderFit(\n samples: ReadonlyArray<Point>,\n errorTolerance: number,\n): PolygonPath {\n if (samples.length === 0) {\n return {\n kind: 'polygon',\n commands: new Uint8Array(),\n coords: new Float32Array(),\n fillRule: 'nonzero',\n };\n }\n\n const b = new PathBuilder();\n b.moveTo(samples[0].x, samples[0].y);\n\n if (samples.length === 1) {\n return b.build();\n }\n\n if (samples.length === 2) {\n emitStraightCubic(b, samples[0], samples[1]);\n return b.build();\n }\n\n fitRecursive(samples, errorTolerance, b);\n return b.build();\n}\n\nfunction fitRecursive(\n samples: ReadonlyArray<Point>,\n errorTolerance: number,\n b: PathBuilder,\n): void {\n if (samples.length === 2) {\n const fit = fitOneCubic(samples);\n b.curveTo(fit.cp1.x, fit.cp1.y, fit.cp2.x, fit.cp2.y, fit.end.x, fit.end.y);\n return;\n }\n const fit = fitOneCubic(samples);\n const { worstIndex, worstError } = measureError(samples, fit);\n if (worstError <= errorTolerance * errorTolerance) {\n b.curveTo(fit.cp1.x, fit.cp1.y, fit.cp2.x, fit.cp2.y, fit.end.x, fit.end.y);\n return;\n }\n // Split. Both halves include the split sample so endpoints meet.\n const left = samples.slice(0, worstIndex + 1);\n const right = samples.slice(worstIndex);\n fitRecursive(left, errorTolerance, b);\n fitRecursive(right, errorTolerance, b);\n}\n\nfunction measureError(\n samples: ReadonlyArray<Point>,\n fit: CubicFit,\n): { worstIndex: number; worstError: number } {\n let worstIndex = 1;\n let worstError = 0;\n const a = samples[0];\n for (let i = 1; i < samples.length - 1; i++) {\n const q = cubicPointAt(a, fit.cp1, fit.cp2, fit.end, fit.ts[i]);\n const dx = samples[i].x - q.x;\n const dy = samples[i].y - q.y;\n const sq = dx * dx + dy * dy;\n if (sq > worstError) {\n worstError = sq;\n worstIndex = i;\n }\n }\n return { worstIndex, worstError };\n}\n\ninterface CubicFit {\n cp1: Point;\n cp2: Point;\n end: Point;\n /** The curve parameter each sample was fitted at: where its error is measured. */\n ts: ReadonlyArray<number>;\n}\n\nfunction fitOneCubic(samples: ReadonlyArray<Point>): CubicFit {\n const n = samples.length;\n return fitWithTangents(\n samples,\n unit(sub(samples[1], samples[0])),\n unit(sub(samples[n - 2], samples[n - 1])),\n 4,\n );\n}\n\n/**\n * The single cubic from the first sample to the last that best fits the\n * samples between, with its control points held to the given unit tangents:\n * `tStart` leaving the first sample, `tEnd` leaving the last one backward.\n * Only the two handle lengths are solved for.\n *\n * `params` is the curve parameter each sample starts at, chord length when\n * omitted; `passes` is how many times those are refined and the lengths\n * solved again.\n */\nexport function fitCubicWithTangents(\n samples: ReadonlyArray<Point>,\n tStart: Point,\n tEnd: Point,\n opts: { params?: ReadonlyArray<number>; passes?: number } = {},\n): { cp1: Point; cp2: Point } {\n const { cp1, cp2 } = fitWithTangents(samples, tStart, tEnd, opts.passes ?? 4, opts.params);\n return { cp1, cp2 };\n}\n\nfunction fitWithTangents(\n samples: ReadonlyArray<Point>,\n tStart: Point,\n tEnd: Point,\n passes: number,\n params?: ReadonlyArray<number>,\n): CubicFit {\n const n = samples.length;\n const a = samples[0];\n const e = samples[n - 1];\n const ts = params ? [...params] : chordLengthParam(samples);\n if (ts === null) return { cp1: { ...a }, cp2: { ...e }, end: e, ts: samples.map(() => 0) };\n\n let fit = solveLS(samples, ts, a, e, tStart, tEnd);\n for (let pass = 0; pass < passes; pass++) {\n reparameterize(samples, ts, a, e, fit);\n fit = solveLS(samples, ts, a, e, tStart, tEnd);\n }\n return fit;\n}\n\nfunction chordLengthParam(samples: ReadonlyArray<Point>): number[] | null {\n const n = samples.length;\n const ts = new Array<number>(n);\n ts[0] = 0;\n let total = 0;\n for (let i = 1; i < n; i++) {\n total += dist(samples[i - 1], samples[i]);\n ts[i] = total;\n }\n if (total === 0) return null;\n for (let i = 0; i < n; i++) ts[i] /= total;\n return ts;\n}\n\nfunction solveLS(\n samples: ReadonlyArray<Point>,\n ts: ReadonlyArray<number>,\n a: Point,\n e: Point,\n tStart: Point,\n tEnd: Point,\n): CubicFit {\n const n = samples.length;\n let c11 = 0, c12 = 0, c22 = 0, x1 = 0, x2 = 0;\n for (let i = 0; i < n; i++) {\n const t = ts[i];\n const u = 1 - t;\n const b0 = u * u * u;\n const b1 = 3 * u * u * t;\n const b2 = 3 * u * t * t;\n const b3 = t * t * t;\n const A1x = b1 * tStart.x;\n const A1y = b1 * tStart.y;\n const A2x = b2 * tEnd.x;\n const A2y = b2 * tEnd.y;\n c11 += A1x * A1x + A1y * A1y;\n c12 += A1x * A2x + A1y * A2y;\n c22 += A2x * A2x + A2y * A2y;\n const targetX = samples[i].x - (b0 + b1) * a.x - (b2 + b3) * e.x;\n const targetY = samples[i].y - (b0 + b1) * a.y - (b2 + b3) * e.y;\n x1 += A1x * targetX + A1y * targetY;\n x2 += A2x * targetX + A2y * targetY;\n }\n const det = c11 * c22 - c12 * c12;\n let alpha1: number;\n let alpha2: number;\n if (Math.abs(det) < 1e-12) {\n const chord = dist(a, e);\n alpha1 = alpha2 = chord / 3;\n } else {\n alpha1 = (c22 * x1 - c12 * x2) / det;\n alpha2 = (c11 * x2 - c12 * x1) / det;\n if (alpha1 < 1e-6 || alpha2 < 1e-6) {\n const chord = dist(a, e);\n alpha1 = alpha2 = chord / 3;\n }\n }\n return {\n cp1: { x: a.x + tStart.x * alpha1, y: a.y + tStart.y * alpha1 },\n cp2: { x: e.x + tEnd.x * alpha2, y: e.y + tEnd.y * alpha2 },\n end: e,\n ts,\n };\n}\n\nfunction reparameterize(\n samples: ReadonlyArray<Point>,\n ts: number[],\n a: Point,\n e: Point,\n fit: CubicFit,\n): void {\n void a; void e;\n for (let i = 1; i < samples.length - 1; i++) {\n ts[i] = newtonRefineT(samples[i], ts[i], samples[0], fit.cp1, fit.cp2, samples[samples.length - 1]);\n }\n}\n\nfunction newtonRefineT(\n p: Point,\n t: number,\n p0: Point,\n p1: Point,\n p2: Point,\n p3: Point,\n): number {\n // Q(t) - p, where Q is the cubic. Newton step uses Q'(t)·(Q(t)-p) and\n // a second-derivative correction.\n const u = 1 - t;\n const { x: qx, y: qy } = cubicPointAt(p0, p1, p2, p3, t);\n const qpx = 3*u*u*(p1.x - p0.x) + 6*u*t*(p2.x - p1.x) + 3*t*t*(p3.x - p2.x);\n const qpy = 3*u*u*(p1.y - p0.y) + 6*u*t*(p2.y - p1.y) + 3*t*t*(p3.y - p2.y);\n const qppx = 6*u*(p2.x - 2*p1.x + p0.x) + 6*t*(p3.x - 2*p2.x + p1.x);\n const qppy = 6*u*(p2.y - 2*p1.y + p0.y) + 6*t*(p3.y - 2*p2.y + p1.y);\n const dx = qx - p.x;\n const dy = qy - p.y;\n const numerator = dx * qpx + dy * qpy;\n const denominator = qpx * qpx + qpy * qpy + dx * qppx + dy * qppy;\n if (Math.abs(denominator) < 1e-12) return t;\n const next = t - numerator / denominator;\n if (next < 0) return 0;\n if (next > 1) return 1;\n return next;\n}\n\nfunction sub(a: Point, b: Point): Point {\n return { x: a.x - b.x, y: a.y - b.y };\n}\nfunction dist(a: Point, b: Point): number {\n return Math.hypot(a.x - b.x, a.y - b.y);\n}\nfunction unit(v: Point): Point {\n const m = Math.hypot(v.x, v.y);\n if (m === 0) return { x: 0, y: 0 };\n return { x: v.x / m, y: v.y / m };\n}\n\nfunction emitStraightCubic(\n b: PathBuilder,\n a: Point,\n c: Point,\n): void {\n // cp1 at 1/3 along chord, cp2 at 2/3 — the canonical straight cubic.\n const cp1x = a.x + (c.x - a.x) / 3;\n const cp1y = a.y + (c.y - a.y) / 3;\n const cp2x = a.x + (2 * (c.x - a.x)) / 3;\n const cp2y = a.y + (2 * (c.y - a.y)) / 3;\n b.curveTo(cp1x, cp1y, cp2x, cp2y, c.x, c.y);\n}\n","/**\n * Corner shapes as the CSS `corner-shape` property defines them: one curve,\n * `superellipse(k)`, whose keywords are points on its parameter. With\n * `n = 2^|k|`, a convex corner (`k > 0`) is the quarter of `|u|^n + |v|^n = 1`\n * spanned from the corner's center (the point across the cut from the outer\n * corner), and a concave one (`k < 0`) is the same curve spanned from the\n * outer corner instead, so `-k` mirrors `k` through the cut. `k = 1` is an\n * ellipse, `0` the straight bevel, and `±∞` the square corner and the notch.\n */\nimport { fitCubicWithTangents } from './schneiderFit';\nimport type { Point } from './cubicMath';\n\n/** The six `corner-shape` keywords, from most convex to most concave. */\nexport type CornerKeyword = 'square' | 'squircle' | 'round' | 'bevel' | 'scoop' | 'notch';\n\n/** A corner's shape: a keyword, or a finite `superellipse()` parameter. */\nexport type CornerShape = CornerKeyword | number;\n\n/** The keywords in the order cycling through them steps. */\nexport const CORNER_KEYWORDS: readonly CornerKeyword[] = ['square', 'squircle', 'round', 'bevel', 'scoop', 'notch'];\n\nconst K_OF: Record<CornerKeyword, number> = {\n square: Infinity, squircle: 2, round: 1, bevel: 0, scoop: -1, notch: -Infinity,\n};\n\n/** The `superellipse()` parameter of `shape`. */\nexport function cornerShapeK(shape: CornerShape): number {\n return typeof shape === 'number' ? shape : K_OF[shape];\n}\n\n/** The keyword whose parameter is exactly `k`, or null. */\nexport function cornerKeywordOf(k: number): CornerKeyword | null {\n return CORNER_KEYWORDS.find((w) => K_OF[w] === k) ?? null;\n}\n\n/** Whether `v` is a keyword or a finite number. */\nexport function isCornerShape(v: unknown): v is CornerShape {\n return (typeof v === 'number' && Number.isFinite(v)) || CORNER_KEYWORDS.includes(v as CornerKeyword);\n}\n\n/** The keyword after `shape` in {@link CORNER_KEYWORDS}, wrapping; from a\n * number, the first keyword less convex than it. */\nexport function nextCornerShape(shape: CornerShape): CornerKeyword {\n if (typeof shape !== 'number') {\n return CORNER_KEYWORDS[(CORNER_KEYWORDS.indexOf(shape) + 1) % CORNER_KEYWORDS.length];\n }\n return CORNER_KEYWORDS.find((w) => K_OF[w] < shape) ?? CORNER_KEYWORDS[0];\n}\n\n/** Largest distance, in units of the corner's setback, the fitted cubics may\n * stray from the true superellipse. */\nexport const CORNER_FIT_TOLERANCE = 1e-3;\n\n/** The cut a corner shape spans: from `start` to `end`, the two points where\n * it leaves the edges, around `outer`, the corner the edges meet at. */\nexport interface CornerShapeFrame {\n start: Point;\n end: Point;\n outer: Point;\n}\n\n/** One piece of a corner's outline, continuing from where the last ended. */\nexport type CornerPiece =\n | { kind: 'line'; to: Point }\n | { kind: 'cubic'; c1: Point; c2: Point; to: Point };\n\n/** Kappa of the cubic quarter circle, the one the kit draws every arc with. */\nconst KAPPA = (4 / 3) * Math.tan(Math.PI / 8);\n\n/** The exponent `2^|k|`, or Infinity once the curve is a right angle within\n * the fit tolerance. */\nfunction exponentOf(k: number): number {\n const n = 2 ** Math.abs(k);\n return 1 - 0.5 ** (1 / n) < CORNER_FIT_TOLERANCE / 4 ? Infinity : n;\n}\n\n/** The point at `theta` on the unit curve `u^n + v^n = 1`: `π/2` is\n * `(0, 1)`, where the corner starts, and `0` is `(1, 0)`, where it ends. */\nfunction unitPoint(n: number, theta: number): Point {\n const p = 2 / n;\n return { x: Math.cos(theta) ** p, y: Math.sin(theta) ** p };\n}\n\n/** The unit direction of travel from start to end at `theta`. */\nfunction unitTangent(n: number, theta: number): Point {\n const q = 2 - 2 / n;\n const x = Math.sin(theta) ** q, y = -(Math.cos(theta) ** q);\n const l = Math.hypot(x, y);\n return { x: x / l, y: y / l };\n}\n\ntype UnitCubic = [Point, Point, Point];\n\nconst sub = (a: Point, b: Point): Point => ({ x: a.x - b.x, y: a.y - b.y });\n\nfunction cubicAt(p0: Point, [c1, c2, p3]: UnitCubic, t: number): Point {\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 { x: a * p0.x + b * c1.x + c * c2.x + d * p3.x, y: a * p0.y + b * c1.y + c * c2.y + d * p3.y };\n}\n\n/** The distance from `q` to the cubic `p0, piece`: the nearest of a coarse\n * scan, refined by bisecting the parameter around it. */\nfunction distanceToCubic(q: Point, p0: Point, piece: UnitCubic): number {\n const d = (t: number) => { const c = cubicAt(p0, piece, t); return Math.hypot(c.x - q.x, c.y - q.y); };\n let best = 0;\n for (let i = 1; i <= 32; i++) if (d(i / 32) < d(best / 32)) best = i;\n let lo = Math.max(0, (best - 1) / 32), hi = Math.min(1, (best + 1) / 32);\n for (let i = 0; i < 30; i++) {\n const a = lo + (hi - lo) / 3, b = hi - (hi - lo) / 3;\n if (d(a) < d(b)) hi = b; else lo = a;\n }\n return d((lo + hi) / 2);\n}\n\n/** The farthest any point of the true curve between `a` and `b` lies from\n * the cubic `p0, piece`. */\nfunction fitError(n: number, a: number, b: number, p0: Point, piece: UnitCubic): number {\n let worst = 0;\n for (let i = 1; i < 16; i++) worst = Math.max(worst, distanceToCubic(unitPoint(n, a + (b - a) * (i / 16)), p0, piece));\n return worst;\n}\n\n/** Cubics through the unit curve from `theta = a` down to `b`, split until\n * each is within `tol`. */\nfunction fitUnit(n: number, a: number, b: number, tol: number, depth: number, out: UnitCubic[]): void {\n const p0 = unitPoint(n, a), p3 = unitPoint(n, b);\n const samples: Point[] = [];\n const params: number[] = [];\n for (let i = 0; i <= 12; i++) {\n samples.push(unitPoint(n, a + (b - a) * (i / 12)));\n params.push(i / 12);\n }\n const tEnd = unitTangent(n, b);\n const { cp1, cp2 } = fitCubicWithTangents(samples, unitTangent(n, a), { x: -tEnd.x, y: -tEnd.y }, { params });\n const piece: UnitCubic = [cp1, cp2, p3];\n if (depth >= 10 || fitError(n, a, b, p0, piece) <= tol) { out.push(piece); return; }\n const mid = (a + b) / 2;\n fitUnit(n, a, mid, tol, depth + 1, out);\n fitUnit(n, mid, b, tol, depth + 1, out);\n}\n\nconst unitCache = new Map<string, UnitCubic[]>();\n\n/** The unit curve of exponent `n` as cubics, `(0, 1)` to `(1, 0)`. */\nfunction unitCubics(n: number, tol: number): UnitCubic[] {\n if (n === 2) return [[{ x: KAPPA, y: 1 }, { x: 1, y: KAPPA }, { x: 1, y: 0 }]];\n const key = `${n}:${tol}`;\n let hit = unitCache.get(key);\n if (!hit) {\n hit = [];\n fitUnit(n, Math.PI / 2, 0, tol, 0, hit);\n if (unitCache.size > 256) unitCache.clear();\n unitCache.set(key, hit);\n }\n return hit;\n}\n\n/** `frame` mapped from the unit square spanned at `center`. */\nfunction mapperFor(frame: CornerShapeFrame, center: Point): (p: Point) => Point {\n const ex = sub(frame.end, center), sy = sub(frame.start, center);\n return (p) => ({ x: center.x + p.x * ex.x + p.y * sy.x, y: center.y + p.x * ex.y + p.y * sy.y });\n}\n\n/** The center the convex curves are spanned from: across the cut from `outer`. */\nexport function cornerCenter(frame: CornerShapeFrame): Point {\n return { x: frame.start.x + frame.end.x - frame.outer.x, y: frame.start.y + frame.end.y - frame.outer.y };\n}\n\n/**\n * The outline of a corner of parameter `k` across `frame`, from its start to\n * its end. Exact at `k = 0` (a line), `±1` (the cubic quarter arc the kit\n * draws circles with) and `±∞` (two lines, through the outer corner or the\n * center); fitted with cubics within `tolerance` of the setback elsewhere.\n */\nexport function cornerShapePieces(k: number, frame: CornerShapeFrame, tolerance = CORNER_FIT_TOLERANCE): CornerPiece[] {\n if (k === 0) return [{ kind: 'line', to: frame.end }];\n const n = exponentOf(k);\n if (n === Infinity) {\n const via = k > 0 ? frame.outer : cornerCenter(frame);\n return [{ kind: 'line', to: via }, { kind: 'line', to: frame.end }];\n }\n const map = mapperFor(frame, k > 0 ? cornerCenter(frame) : frame.outer);\n return unitCubics(n, tolerance).map(([c1, c2, to]) => ({ kind: 'cubic', c1: map(c1), c2: map(c2), to: map(to) }));\n}\n\n/** The point on the true curve of parameter `k` across `frame` at `s`, from\n * 0 at its start to 1 at its end. Finite `k` only. */\nexport function cornerShapePoint(k: number, frame: CornerShapeFrame, s: number): Point {\n const n = 2 ** Math.abs(k);\n const map = mapperFor(frame, k > 0 ? cornerCenter(frame) : frame.outer);\n return map(unitPoint(n, (Math.PI / 2) * (1 - s)));\n}\n","/**\n * A path decoded into contours of anchors and the exact segments between\n * them, for corner expansion: lines stay lines, a quadratic is elevated to\n * the cubic it equals, and a closing curve that ends on its subpath's first\n * point folds onto that anchor the way `enumerateAnchors` counts it.\n */\nimport { forEachSegment, PATH_C, PATH_L, PATH_M, PATH_Q, PATH_Z } from '../commands';\nimport { cubicEvalAt, splitCubicAt } from '../curve';\nimport type { PolygonPath } from '../path';\nimport type { Point } from './cubicMath';\nimport { worldCoords } from './pathOrigin';\n\n/** One segment as a cubic; a line has its controls on its ends. */\nexport interface Seg {\n line: boolean;\n p0: Point; c1: Point; c2: Point; p3: Point;\n}\n\n/** One subpath. Segment `k` runs from anchor `k` to anchor `k + 1`, wrapping\n * when closed, so a closed contour has as many segments as anchors. */\nexport interface Contour {\n anchors: Point[];\n segs: Seg[];\n closed: boolean;\n /** Flat index of `anchors[0]`. */\n first: number;\n /** For each anchor, the index of the command that drew it among the\n * path's M, L, C, and Q commands: the numbering `countPathAnchors` sizes\n * per-anchor arrays by. */\n sources: number[];\n}\n\nconst lineSeg = (a: Point, b: Point): Seg => ({ line: true, p0: a, c1: a, c2: b, p3: b });\n\n/** `path` as contours, or null when a command opens a subpath with no `M`,\n * where the anchor walkers and this one would count differently. */\nexport function decodeContours(path: PolygonPath): Contour[] | null {\n const { commands } = path;\n const coords = worldCoords(path);\n const out: Contour[] = [];\n let cur: Contour | null = null;\n let flat = 0;\n let drawn = 0;\n let bad = false;\n const last = (): Point => cur!.anchors[cur!.anchors.length - 1];\n const push = (p: Point, seg: Seg): void => {\n cur!.segs.push(seg);\n cur!.anchors.push(p);\n cur!.sources.push(drawn++);\n flat++;\n };\n forEachSegment(commands, coords, (cmd, ci, _px, _py, _i, opens) => {\n if (opens) { bad = true; return false; }\n const at = (k: number): Point => ({ x: coords[ci + k], y: coords[ci + k + 1] });\n switch (cmd) {\n case PATH_M:\n if (cur) out.push(cur);\n cur = { anchors: [at(0)], segs: [], closed: false, first: flat++, sources: [drawn++] };\n break;\n case PATH_L:\n push(at(0), lineSeg(last(), at(0)));\n break;\n case PATH_C:\n push(at(4), { line: false, p0: last(), c1: at(0), c2: at(2), p3: at(4) });\n break;\n case PATH_Q: {\n const p0 = last(), q = at(0), p3 = at(2);\n const c1 = { x: p0.x + (2 / 3) * (q.x - p0.x), y: p0.y + (2 / 3) * (q.y - p0.y) };\n const c2 = { x: p3.x + (2 / 3) * (q.x - p3.x), y: p3.y + (2 / 3) * (q.y - p3.y) };\n push(p3, { line: false, p0, c1, c2, p3 });\n break;\n }\n case PATH_Z:\n if (cur) closeContour(cur, () => flat--);\n if (cur) out.push(cur);\n cur = null;\n break;\n }\n return undefined;\n });\n if (bad) return null;\n if (cur) out.push(cur);\n return out;\n}\n\nfunction closeContour(c: Contour, unfold: () => void): void {\n c.closed = true;\n const n = c.anchors.length;\n const a0 = c.anchors[0];\n const end = c.anchors[n - 1];\n if (n > 1 && !c.segs[n - 2].line && end.x === a0.x && end.y === a0.y) {\n c.anchors.pop();\n c.sources.pop();\n unfold();\n return;\n }\n c.segs.push(lineSeg(end, a0));\n}\n\nconst LUT_STEPS = 32;\n\n/** Arc length of `seg`. */\nexport function segLength(seg: Seg): number {\n if (seg.line) return Math.hypot(seg.p3.x - seg.p0.x, seg.p3.y - seg.p0.y);\n return lut(seg)[LUT_STEPS];\n}\n\nconst lutCache = new WeakMap<Seg, Float64Array>();\n\nfunction lut(seg: Seg): Float64Array {\n let table = lutCache.get(seg);\n if (table) return table;\n table = new Float64Array(LUT_STEPS + 1);\n let prev = seg.p0;\n for (let i = 1; i <= LUT_STEPS; i++) {\n const p = pointAt(seg, i / LUT_STEPS);\n table[i] = table[i - 1] + Math.hypot(p.x - prev.x, p.y - prev.y);\n prev = p;\n }\n lutCache.set(seg, table);\n return table;\n}\n\n/** Parameter of the point `s` along `seg` from its start. */\nexport function paramAtLength(seg: Seg, s: number): number {\n const total = segLength(seg);\n if (total <= 0) return 0;\n if (seg.line) return Math.min(1, Math.max(0, s / total));\n const table = lut(seg);\n if (s <= 0) return 0;\n if (s >= total) return 1;\n let i = 1;\n while (table[i] < s) i++;\n const span = table[i] - table[i - 1];\n const f = span > 0 ? (s - table[i - 1]) / span : 0;\n return (i - 1 + f) / LUT_STEPS;\n}\n\nexport function pointAt(seg: Seg, t: number): Point {\n if (seg.line) {\n return { x: seg.p0.x + (seg.p3.x - seg.p0.x) * t, y: seg.p0.y + (seg.p3.y - seg.p0.y) * t };\n }\n const { p0, c1, c2, p3 } = seg;\n const [x, y] = cubicEvalAt(p0.x, p0.y, c1.x, c1.y, c2.x, c2.y, p3.x, p3.y, t);\n return { x, y };\n}\n\nfunction unit(x: number, y: number): Point | null {\n const l = Math.hypot(x, y);\n return l > 1e-12 ? { x: x / l, y: y / l } : null;\n}\n\n/** Unit direction of travel along `seg` at `t`, or null for a segment of no length. */\nexport function tangentAt(seg: Seg, t: number): Point | null {\n const { p0, c1, c2, p3 } = seg;\n if (seg.line) return unit(p3.x - p0.x, p3.y - p0.y);\n const u = 1 - t;\n const dx = 3 * (u * u * (c1.x - p0.x) + 2 * u * t * (c2.x - c1.x) + t * t * (p3.x - c2.x));\n const dy = 3 * (u * u * (c1.y - p0.y) + 2 * u * t * (c2.y - c1.y) + t * t * (p3.y - c2.y));\n const d = unit(dx, dy);\n if (d) return d;\n // A control on its end point: the tangent there runs to the next point.\n if (t < 0.5) return unit(c2.x - p0.x, c2.y - p0.y) ?? unit(p3.x - p0.x, p3.y - p0.y);\n return unit(p3.x - c1.x, p3.y - c1.y) ?? unit(p3.x - p0.x, p3.y - p0.y);\n}\n\n/** The piece of cubic `seg` between parameters `t0 < t1`, as `[c1, c2, p3]`. */\nexport function subCubic(seg: Seg, t0: number, t1: number): [Point, Point, Point] {\n const { p0, c1, c2, p3 } = seg;\n let c = [p0.x, p0.y, c1.x, c1.y, c2.x, c2.y, p3.x, p3.y];\n if (t0 > 0) c = [...splitCubicAt(c[0], c[1], c[2], c[3], c[4], c[5], c[6], c[7], t0)[1]];\n const t = t0 < 1 ? (t1 - t0) / (1 - t0) : 1;\n if (t < 1) c = [...splitCubicAt(c[0], c[1], c[2], c[3], c[4], c[5], c[6], c[7], t)[0]];\n return [{ x: c[2], y: c[3] }, { x: c[4], y: c[5] }, { x: c[6], y: c[7] }];\n}\n","/**\n * Corner expansion: a path's corner specs turned into the plain geometry\n * that every reader draws, hits, bounds, and exports.\n */\nimport type { Path, PolygonPath } from '../path';\nimport { PathBuilder } from './builder';\nimport { cornerAt, hasCorners, withoutCorners, type CornerSpec } from './cornerSpec';\nimport { cornerShapeK, cornerShapePieces, type CornerPiece, type CornerShapeFrame } from './cornerShape';\nimport {\n decodeContours, paramAtLength, pointAt, segLength, subCubic, tangentAt,\n type Contour,\n} from './cornerSegments';\nimport type { Point } from './cubicMath';\n\n/** Below this turn (radians) an anchor is smooth, and no corner can be cut. */\nconst MIN_TURN = 1e-3;\n\n/** Where and how a corner anchor can be cut. */\nexport interface CornerFrame {\n /** Flat anchor index. */\n index: number;\n /** The anchor. */\n x: number;\n y: number;\n /** Unit direction from the anchor into the wedge the cut is taken from. */\n bisector: Point;\n /** Half the angle between the two edges at the anchor. */\n halfAngle: number;\n /** How far along each edge the stored spec cuts, its setback, after clamping. */\n trim: number;\n /** The longest cut the edges allow while the neighbors keep theirs. */\n maxTrim: number;\n}\n\ninterface AnchorCut {\n frame: Omit<CornerFrame, 'trim' | 'maxTrim'>;\n spec: CornerSpec | null;\n want: number;\n trim: number;\n}\n\n/** The cut each anchor of `c` takes, clamped so that the two cuts on any\n * segment never meet past each other. Null for an anchor that cannot be cut. */\nfunction contourCuts(path: PolygonPath, c: Contour): (AnchorCut | null)[] {\n const n = c.anchors.length;\n const lengths = c.segs.map(segLength);\n const cuts: (AnchorCut | null)[] = c.anchors.map((a, i) => {\n const inSeg = i > 0 ? c.segs[i - 1] : c.closed ? c.segs[n - 1] : null;\n const outSeg = i < c.segs.length ? c.segs[i] : null;\n if (!inSeg || !outSeg || inSeg === outSeg) return null;\n const tIn = tangentAt(inSeg, 1);\n const tOut = tangentAt(outSeg, 0);\n if (!tIn || !tOut) return null;\n const turn = Math.acos(Math.max(-1, Math.min(1, tIn.x * tOut.x + tIn.y * tOut.y)));\n if (turn < MIN_TURN || turn > Math.PI - MIN_TURN) return null;\n const bx = tOut.x - tIn.x, by = tOut.y - tIn.y;\n const bl = Math.hypot(bx, by);\n const halfAngle = (Math.PI - turn) / 2;\n const spec = cornerAt(path, c.first + i);\n const want = spec ? spec.radius : 0;\n return {\n frame: { index: c.first + i, x: a.x, y: a.y, bisector: { x: bx / bl, y: by / bl }, halfAngle },\n spec,\n want,\n trim: want,\n };\n });\n const scale = cuts.map(() => 1);\n c.segs.forEach((_seg, k) => {\n const a = k, b = (k + 1) % n;\n const sum = (cuts[a]?.want ?? 0) + (cuts[b]?.want ?? 0);\n if (sum <= lengths[k]) return;\n const f = lengths[k] / sum;\n scale[a] = Math.min(scale[a], f);\n scale[b] = Math.min(scale[b], f);\n });\n cuts.forEach((cut, i) => { if (cut) cut.trim = cut.want * scale[i]; });\n return cuts;\n}\n\n/** Every anchor of `path` that can take a corner, with the cut its spec\n * makes now. */\nexport function cornerFrames(path: PolygonPath): CornerFrame[] {\n const contours = decodeContours(path);\n if (!contours) return [];\n const out: CornerFrame[] = [];\n for (const c of contours) {\n const cuts = contourCuts(path, c);\n const n = c.anchors.length;\n cuts.forEach((cut, i) => {\n if (!cut) return;\n const prev = (i - 1 + n) % n;\n const next = (i + 1) % n;\n const inLen = segLength(c.segs[prev]);\n const outLen = segLength(c.segs[i]);\n const room = (len: number, j: number): number => len - Math.min(len, cuts[j]?.want ?? 0);\n out.push({\n ...cut.frame,\n trim: cut.trim,\n maxTrim: Math.max(0, Math.min(room(inLen, prev), room(outLen, next))),\n });\n });\n }\n return out;\n}\n\n/** The frame of the corner at flat anchor `index`, or null when that anchor\n * cannot take one. */\nexport function cornerFrameAt(path: PolygonPath, index: number): CornerFrame | null {\n return cornerFrames(path).find((f) => f.index === index) ?? null;\n}\n\n/** A path with its corners expanded, and where its anchors came from. */\nexport interface ResolvedCorners {\n path: PolygonPath;\n /**\n * For each anchor of `path` (each M, L, C, or Q, as `countPathAnchors`\n * counts them), the anchor of the source path it belongs to, in the same\n * numbering. Every point a corner's cut adds belongs to that corner's\n * anchor. Null when the expansion added none.\n */\n anchorSources: Uint32Array | null;\n}\n\nconst expanded = new WeakMap<PolygonPath, ResolvedCorners>();\n\n/** {@link resolveCorners}, also answering which source anchor each anchor of\n * the result came from, so an array kept per anchor (`vertexColors`) can be\n * carried onto it with {@link remapPerAnchor}. */\nexport function resolveCornersWithSources(path: PolygonPath): ResolvedCorners {\n if (path.corners === undefined) return { path, anchorSources: null };\n const hit = expanded.get(path);\n if (hit) return hit;\n const out = hasCorners(path) ? expand(path) : { path: withoutCorners(path), anchorSources: null };\n expanded.set(path, out);\n return out;\n}\n\n/**\n * `path` with its corner specs expanded into plain geometry and dropped: each\n * corner is cut `radius` along both edges and spans the cut with its shape's\n * superellipse (`cornerShapePieces`). Each cut is clamped so the cuts on\n * either end of a segment never overlap. A path with no corners comes back\n * as itself, and so does a rect.\n */\nexport function resolveCorners<P extends Path>(path: P): P;\nexport function resolveCorners(path: Path): Path {\n if (path.kind !== 'polygon') return path;\n return resolveCornersWithSources(path).path;\n}\n\n/** `values`, `stride` numbers per source anchor, as `stride` per anchor of\n * the expanded path that `sources` describes. */\nexport function remapPerAnchor<T>(values: readonly T[], sources: Uint32Array, stride: number): T[] {\n const out = new Array<T>(sources.length * stride);\n for (let i = 0; i < sources.length; i++) {\n for (let k = 0; k < stride; k++) out[i * stride + k] = values[sources[i] * stride + k];\n }\n return out;\n}\n\n/** A `PathBuilder` that records, for each anchor it writes, the source anchor `src`. */\nclass Emitter {\n readonly b = new PathBuilder();\n readonly sources: number[] = [];\n src = 0;\n moveTo(x: number, y: number): void { this.b.moveTo(x, y); this.sources.push(this.src); }\n lineTo(x: number, y: number): void { this.b.lineTo(x, y); this.sources.push(this.src); }\n curveTo(a: number, b: number, c: number, d: number, x: number, y: number): void {\n this.b.curveTo(a, b, c, d, x, y);\n this.sources.push(this.src);\n }\n close(): void { this.b.close(); }\n}\n\nfunction expand(path: PolygonPath): ResolvedCorners {\n const contours = decodeContours(path);\n if (!contours) return { path: withoutCorners(path), anchorSources: null };\n const e = new Emitter();\n // The contours are in the path's own space; the expansion is stored measured from its origin again.\n if (path.origin) e.b.setOrigin(path.origin.x, path.origin.y);\n for (const c of contours) emitContour(e, c, contourCuts(path, c));\n const { commands, coords } = e.b.build();\n return {\n path: { ...withoutCorners(path), commands, coords },\n anchorSources: Uint32Array.from(e.sources),\n };\n}\n\n/** Parameter on segment `k` where the cut at its start ends, and where the\n * cut at its end begins. */\nfunction segSpan(c: Contour, cuts: readonly (AnchorCut | null)[], k: number): [number, number] {\n const seg = c.segs[k];\n const len = segLength(seg);\n const t0 = paramAtLength(seg, cuts[k]?.trim ?? 0);\n const t1 = paramAtLength(seg, len - (cuts[(k + 1) % c.anchors.length]?.trim ?? 0));\n return [t0, Math.max(t0, t1)];\n}\n\n/** The corner cut at the anchor segment `k` runs into, as the expansion\n * draws it, or null when that anchor takes none. */\nfunction cutAfter(\n c: Contour, cuts: readonly (AnchorCut | null)[], spans: readonly [number, number][], k: number,\n): { cut: AnchorCut; start: Point; end: Point; pieces: CornerPiece[] } | null {\n const j = (k + 1) % c.anchors.length;\n const cut = cuts[j];\n const next = c.segs[j];\n if (!cut?.spec || cut.trim <= 0 || !next) return null;\n const seg = c.segs[k];\n const start = pointAt(seg, spans[k][1]);\n const end = pointAt(next, spans[j][0]);\n const frame = shapeFrame({ x: cut.frame.x, y: cut.frame.y }, start, tangentAt(seg, spans[k][1]), end, tangentAt(next, spans[j][0]));\n return { cut, start, end, pieces: cornerShapePieces(cornerShapeK(cut.spec.shape), frame) };\n}\n\n/** One corner of a path as its expansion draws it. */\nexport interface CornerCut {\n /** Flat anchor index. */\n index: number;\n anchor: Point;\n spec: CornerSpec;\n /** Where the cut leaves the edge into the anchor, and where it rejoins the edge out of it. */\n start: Point;\n end: Point;\n /** The outline from `start` to `end`. */\n pieces: CornerPiece[];\n}\n\n/** Every corner `path` cuts, in path order. */\nexport function cornerCuts(path: PolygonPath): CornerCut[] {\n if (!hasCorners(path)) return [];\n const out: CornerCut[] = [];\n for (const c of decodeContours(path) ?? []) {\n const cuts = contourCuts(path, c);\n const spans = c.segs.map((_s, k) => segSpan(c, cuts, k));\n c.segs.forEach((_seg, k) => {\n const at = cutAfter(c, cuts, spans, k);\n if (!at) return;\n const { frame } = at.cut;\n out.push({ index: frame.index, anchor: { x: frame.x, y: frame.y }, spec: at.cut.spec!, start: at.start, end: at.end, pieces: at.pieces });\n });\n }\n return out;\n}\n\nfunction emitContour(b: Emitter, c: Contour, cuts: readonly (AnchorCut | null)[]): void {\n const n = c.anchors.length;\n const spans = c.segs.map((_s, k) => segSpan(c, cuts, k));\n const start = c.closed && c.segs.length > 0 ? pointAt(c.segs[0], spans[0][0]) : c.anchors[0];\n b.src = c.sources[0];\n b.moveTo(start.x, start.y);\n c.segs.forEach((seg, k) => {\n const [t0, t1] = spans[k];\n // Both the run up to the next anchor and the cut at it belong to that anchor.\n b.src = c.sources[(k + 1) % n];\n const closing = c.closed && k === n - 1 && !(cuts[0]?.spec && cuts[0].trim > 0);\n if (t1 > t0 && !(closing && seg.line)) {\n if (seg.line) {\n const p = pointAt(seg, t1);\n b.lineTo(p.x, p.y);\n } else {\n const [c1, c2, p3] = subCubic(seg, t0, t1);\n b.curveTo(c1.x, c1.y, c2.x, c2.y, p3.x, p3.y);\n }\n }\n const at = cutAfter(c, cuts, spans, k);\n if (!at) return;\n const pieces = [...at.pieces];\n // A closing line that ends where the contour started is drawn by the close.\n if ((k + 1) % n === 0 && pieces.at(-1)?.kind === 'line') pieces.pop();\n for (const piece of pieces) {\n if (piece.kind === 'line') b.lineTo(piece.to.x, piece.to.y);\n else b.curveTo(piece.c1.x, piece.c1.y, piece.c2.x, piece.c2.y, piece.to.x, piece.to.y);\n }\n });\n if (c.closed) b.close();\n}\n\n/** The frame a corner's shape spans: from `p1` to `p2`, around where the two\n * edges' tangents there meet. That is the anchor itself between straight\n * edges; between curves it keeps every convex shape tangent to both. */\nfunction shapeFrame(v: Point, p1: Point, t1: Point | null, p2: Point, t2: Point | null): CornerShapeFrame {\n const outer = t1 && t2 ? tangentMeet(p1, t1, p2, t2) : null;\n const chord = Math.hypot(p2.x - p1.x, p2.y - p1.y);\n const far = !outer || Math.hypot(outer.x - v.x, outer.y - v.y) > 4 * chord;\n return { start: p1, end: p2, outer: far ? v : outer };\n}\n\n/** Where the line through `a` along `ta` meets the one through `b` along\n * `tb`, or null when they are parallel. */\nfunction tangentMeet(a: Point, ta: Point, b: Point, tb: Point): Point | null {\n const den = ta.x * tb.y - ta.y * tb.x;\n if (Math.abs(den) < 1e-9) return null;\n const s = ((b.x - a.x) * tb.y - (b.y - a.y) * tb.x) / den;\n return { x: a.x + ta.x * s, y: a.y + ta.y * s };\n}\n","/**\n * Bezier flattening — subdivide cubic and quadratic segments into polyline\n * approximations within a flatness tolerance.\n *\n * The flatness metric is the maximum distance from any control point to the\n * chord between endpoints.\n *\n * Tolerance is in world units. 0.5 is a sensible default for screen-rate\n * rendering at 1× zoom; consumers that zoom in heavily should pass a\n * tighter tolerance.\n */\n\nexport const DEFAULT_FLATTEN_TOLERANCE = 0.5;\n\n/** Floor for a non-positive or NaN tolerance. Without it the flatness test can\n * never be satisfied and the subdivision recurses until the stack blows. */\nconst MIN_FLATTEN_TOLERANCE = 1e-6;\n\n/** Subdivision ceiling. The tolerance floor bounds the common runaway; this\n * bounds the other one, coordinates large enough that reaching 1e-6 takes\n * hundreds of levels. Error falls roughly 4x per level, so 16 is far beyond\n * any tolerance a caller can mean. */\nconst MAX_FLATTEN_DEPTH = 16;\n\nfunction usableTolerance(tolerance: number): number {\n return tolerance > 0 ? tolerance : MIN_FLATTEN_TOLERANCE;\n}\n\nfunction finite6(a: number, b: number, c: number, d: number, e: number, f: number): boolean {\n return Number.isFinite(a) && Number.isFinite(b) && Number.isFinite(c)\n && Number.isFinite(d) && Number.isFinite(e) && Number.isFinite(f);\n}\n\nfunction finite8(\n a: number, b: number, c: number, d: number,\n e: number, f: number, g: number, h: number,\n): boolean {\n return finite6(a, b, c, d, e, f) && Number.isFinite(g) && Number.isFinite(h);\n}\n\n/**\n * Distance from point P to segment AB. To the segment, not the line through\n * it: a control point on that line but past an end still pulls the curve out\n * beyond the chord, and measures zero against the line.\n */\nfunction distPointToSegment(px: number, py: number, ax: number, ay: number, bx: number, by: number): number {\n const dx = bx - ax;\n const dy = by - ay;\n const len2 = dx * dx + dy * dy;\n const along = len2 === 0 ? 0 : ((px - ax) * dx + (py - ay) * dy) / len2;\n if (along <= 0) return Math.hypot(px - ax, py - ay);\n if (along >= 1) return Math.hypot(px - bx, py - by);\n return Math.abs((px - ax) * dy - (py - ay) * dx) / Math.sqrt(len2);\n}\n\n/** Whether edges `offset` out from a curve stay within `tolerance` of the true\n * ones when a chord stands in for it. An edge sits on a circle `offset` wider\n * than the curve's, so it strays by that radius times `1 - cos(turn / 2)`; the\n * control polygon bounds the turn, and its length over the turn the radius. */\nfunction edgesWithin(\n x0: number, y0: number, x1: number, y1: number,\n x2: number, y2: number, x3: number, y3: number,\n offset: number, tolerance: number,\n): boolean {\n let turn = legTurn(x1 - x0, y1 - y0, x2 - x1, y2 - y1)\n + legTurn(x2 - x1, y2 - y1, x3 - x2, y3 - y2);\n if (x2 === x1 && y2 === y1) turn += legTurn(x1 - x0, y1 - y0, x3 - x2, y3 - y2);\n if (turn === 0) return true;\n if (turn >= Math.PI) return false;\n const length = Math.hypot(x1 - x0, y1 - y0) + Math.hypot(x2 - x1, y2 - y1) + Math.hypot(x3 - x2, y3 - y2);\n return (length / turn + offset) * (1 - Math.cos(turn / 2)) <= tolerance;\n}\n\n/** Angle between two legs; zero when either has no length. */\nfunction legTurn(ax: number, ay: number, bx: number, by: number): number {\n const lens = Math.sqrt((ax * ax + ay * ay) * (bx * bx + by * by));\n if (lens === 0) return 0;\n return Math.acos(Math.max(-1, Math.min(1, (ax * bx + ay * by) / lens)));\n}\n\n/**\n * Recursively subdivide a cubic bezier (P0..P3) and append `lineTo`-style\n * vertices to `out` (interleaved x,y). The starting endpoint is *not*\n * appended — callers usually emitted it as the segment's previous vertex.\n */\nexport function flattenCubic(\n x0: number, y0: number,\n x1: number, y1: number,\n x2: number, y2: number,\n x3: number, y3: number,\n tolerance: number,\n out: number[],\n): void {\n if (!finite8(x0, y0, x1, y1, x2, y2, x3, y3)) {\n out.push(x3, y3);\n return;\n }\n flattenCubicRec(x0, y0, x1, y1, x2, y2, x3, y3, usableTolerance(tolerance), out, 0);\n}\n\nfunction flattenCubicRec(\n x0: number, y0: number,\n x1: number, y1: number,\n x2: number, y2: number,\n x3: number, y3: number,\n tolerance: number,\n out: number[],\n depth: number,\n): void {\n const d1 = distPointToSegment(x1, y1, x0, y0, x3, y3);\n const d2 = distPointToSegment(x2, y2, x0, y0, x3, y3);\n if (Math.max(d1, d2) <= tolerance || depth >= MAX_FLATTEN_DEPTH) {\n out.push(x3, y3);\n return;\n }\n // De Casteljau split at t=0.5\n const x01 = (x0 + x1) * 0.5, y01 = (y0 + y1) * 0.5;\n const x12 = (x1 + x2) * 0.5, y12 = (y1 + y2) * 0.5;\n const x23 = (x2 + x3) * 0.5, y23 = (y2 + y3) * 0.5;\n const x012 = (x01 + x12) * 0.5, y012 = (y01 + y12) * 0.5;\n const x123 = (x12 + x23) * 0.5, y123 = (y12 + y23) * 0.5;\n const x0123 = (x012 + x123) * 0.5, y0123 = (y012 + y123) * 0.5;\n flattenCubicRec(x0, y0, x01, y01, x012, y012, x0123, y0123, tolerance, out, depth + 1);\n flattenCubicRec(x0123, y0123, x123, y123, x23, y23, x3, y3, tolerance, out, depth + 1);\n}\n\n/** Recursively subdivide a quadratic bezier (P0, P1, P2). */\nexport function flattenQuadratic(\n x0: number, y0: number,\n x1: number, y1: number,\n x2: number, y2: number,\n tolerance: number,\n out: number[],\n): void {\n if (!finite6(x0, y0, x1, y1, x2, y2)) {\n out.push(x2, y2);\n return;\n }\n flattenQuadraticRec(x0, y0, x1, y1, x2, y2, usableTolerance(tolerance), out, 0);\n}\n\nfunction flattenQuadraticRec(\n x0: number, y0: number,\n x1: number, y1: number,\n x2: number, y2: number,\n tolerance: number,\n out: number[],\n depth: number,\n): void {\n const d = distPointToSegment(x1, y1, x0, y0, x2, y2);\n if (d <= tolerance || depth >= MAX_FLATTEN_DEPTH) {\n out.push(x2, y2);\n return;\n }\n const x01 = (x0 + x1) * 0.5, y01 = (y0 + y1) * 0.5;\n const x12 = (x1 + x2) * 0.5, y12 = (y1 + y2) * 0.5;\n const x012 = (x01 + x12) * 0.5, y012 = (y01 + y12) * 0.5;\n flattenQuadraticRec(x0, y0, x01, y01, x012, y012, tolerance, out, depth + 1);\n flattenQuadraticRec(x012, y012, x12, y12, x2, y2, tolerance, out, depth + 1);\n}\n\n/**\n * Like `flattenCubic` but also appends to `arcOut`, for each new flattened\n * point, its *cumulative distance from the segment start* — not a normalized\n * fraction. The caller divides each by the segment's total flattened arc\n * length to yield t ∈ (0, 1]. With `offset`, each piece is also fine enough\n * that edges that far out from it stay within the tolerance.\n */\nexport function flattenCubicWithArcLen(\n x0: number, y0: number,\n x1: number, y1: number,\n x2: number, y2: number,\n x3: number, y3: number,\n tolerance: number,\n out: number[],\n arcOut: number[],\n offset = 0,\n): number {\n if (!finite8(x0, y0, x1, y1, x2, y2, x3, y3)) {\n out.push(x3, y3);\n arcOut.push(0);\n return 0;\n }\n return flattenCubicArcRec(x0, y0, x1, y1, x2, y2, x3, y3, usableTolerance(tolerance), offset, out, arcOut, 0, 0);\n}\n\nfunction flattenCubicArcRec(\n x0: number, y0: number,\n x1: number, y1: number,\n x2: number, y2: number,\n x3: number, y3: number,\n tolerance: number,\n offset: number,\n out: number[],\n arcOut: number[],\n accum: number,\n depth: number,\n): number {\n const d1 = distPointToSegment(x1, y1, x0, y0, x3, y3);\n const d2 = distPointToSegment(x2, y2, x0, y0, x3, y3);\n const flat = Math.max(d1, d2) <= tolerance\n && (offset === 0 || edgesWithin(x0, y0, x1, y1, x2, y2, x3, y3, offset, tolerance));\n if (flat || depth >= MAX_FLATTEN_DEPTH) {\n const lastX = out.length >= 2 ? out[out.length - 2] : x0;\n const lastY = out.length >= 2 ? out[out.length - 1] : y0;\n const seg = Math.hypot(x3 - lastX, y3 - lastY);\n accum += seg;\n out.push(x3, y3);\n arcOut.push(accum);\n return accum;\n }\n const x01 = (x0 + x1) * 0.5, y01 = (y0 + y1) * 0.5;\n const x12 = (x1 + x2) * 0.5, y12 = (y1 + y2) * 0.5;\n const x23 = (x2 + x3) * 0.5, y23 = (y2 + y3) * 0.5;\n const x012 = (x01 + x12) * 0.5, y012 = (y01 + y12) * 0.5;\n const x123 = (x12 + x23) * 0.5, y123 = (y12 + y23) * 0.5;\n const x0123 = (x012 + x123) * 0.5, y0123 = (y012 + y123) * 0.5;\n accum = flattenCubicArcRec(x0, y0, x01, y01, x012, y012, x0123, y0123, tolerance, offset, out, arcOut, accum, depth + 1);\n accum = flattenCubicArcRec(x0123, y0123, x123, y123, x23, y23, x3, y3, tolerance, offset, out, arcOut, accum, depth + 1);\n return accum;\n}\n\n/** Flatten a quadratic bezier into line segments within `tolerance`, appending\n * points to `out` and their cumulative arc lengths to `arcOut`. The arc\n * lengths are what lets per-anchor color and dash phase be interpolated\n * evenly along the curve rather than per segment. */\nexport function flattenQuadraticWithArcLen(\n x0: number, y0: number,\n x1: number, y1: number,\n x2: number, y2: number,\n tolerance: number,\n out: number[],\n arcOut: number[],\n offset = 0,\n): number {\n if (!finite6(x0, y0, x1, y1, x2, y2)) {\n out.push(x2, y2);\n arcOut.push(0);\n return 0;\n }\n return flattenQuadraticArcRec(x0, y0, x1, y1, x2, y2, usableTolerance(tolerance), offset, out, arcOut, 0, 0);\n}\n\nfunction flattenQuadraticArcRec(\n x0: number, y0: number,\n x1: number, y1: number,\n x2: number, y2: number,\n tolerance: number,\n offset: number,\n out: number[],\n arcOut: number[],\n accum: number,\n depth: number,\n): number {\n const d = distPointToSegment(x1, y1, x0, y0, x2, y2);\n const flat = d <= tolerance\n && (offset === 0 || edgesWithin(x0, y0, x1, y1, x2, y2, x2, y2, offset, tolerance));\n if (flat || depth >= MAX_FLATTEN_DEPTH) {\n const lastX = out.length >= 2 ? out[out.length - 2] : x0;\n const lastY = out.length >= 2 ? out[out.length - 1] : y0;\n const seg = Math.hypot(x2 - lastX, y2 - lastY);\n accum += seg;\n out.push(x2, y2);\n arcOut.push(accum);\n return accum;\n }\n const x01 = (x0 + x1) * 0.5, y01 = (y0 + y1) * 0.5;\n const x12 = (x1 + x2) * 0.5, y12 = (y1 + y2) * 0.5;\n const x012 = (x01 + x12) * 0.5, y012 = (y01 + y12) * 0.5;\n accum = flattenQuadraticArcRec(x0, y0, x01, y01, x012, y012, tolerance, offset, out, arcOut, accum, depth + 1);\n accum = flattenQuadraticArcRec(x012, y012, x12, y12, x2, y2, tolerance, offset, out, arcOut, accum, depth + 1);\n return accum;\n}\n\n","import { sign, dot, len2 } from './scalar';\n\n/**\n * Even-odd ray-cast point-in-polygon over an interleaved, unclosed contour\n * [x0,y0,x1,y1,…]. The closing edge (last→first) is implicit.\n *\n * `start`/`end` are vertex indices, not float offsets, and bound one contour\n * inside a buffer holding several.\n */\nexport function pointInPolygon(\n coords: ArrayLike<number>,\n px: number,\n py: number,\n start = 0,\n end = coords.length >> 1,\n): boolean {\n if (end - start < 3) return false;\n let inside = false;\n for (let i = start, j = end - 1; i < end; j = i++) {\n const xi = coords[i * 2], yi = coords[i * 2 + 1];\n const xj = coords[j * 2], yj = coords[j * 2 + 1];\n const crosses =\n (yi > py) !== (yj > py) &&\n px < ((xj - xi) * (py - yi)) / (yj - yi) + xi;\n if (crosses) inside = !inside;\n }\n return inside;\n}\n\n/**\n * True if segments (ax,ay)-(bx,by) and (cx,cy)-(dx,dy) intersect at a single\n * point. An endpoint landing on the other segment counts (a T-junction and a\n * shared endpoint both answer true) — hit-testing wants a grazing edge to\n * register. Collinear overlap answers false: there is no single crossing\n * point, so the sign test both segments rely on is zero on all four sides.\n */\nexport function segmentsCross(\n ax: number, ay: number, bx: number, by: number,\n cx: number, cy: number, dx: number, dy: number,\n): boolean {\n const d1 = sign((dx - cx) * (ay - cy) - (dy - cy) * (ax - cx));\n const d2 = sign((dx - cx) * (by - cy) - (dy - cy) * (bx - cx));\n const d3 = sign((bx - ax) * (cy - ay) - (by - ay) * (cx - ax));\n const d4 = sign((bx - ax) * (dy - ay) - (by - ay) * (dx - ax));\n return d1 !== d2 && d3 !== d4;\n}\n\n/** Squared distance from (px,py) to segment (ax,ay)-(bx,by), endpoint-clamped. */\nexport function pointSegmentDist2(\n px: number, py: number, ax: number, ay: number, bx: number, by: number,\n): number {\n const vx = bx - ax, vy = by - ay;\n const wx = px - ax, wy = py - ay;\n const vv = len2(vx, vy);\n let t = vv === 0 ? 0 : dot(wx, wy, vx, vy) / vv;\n t = t < 0 ? 0 : t > 1 ? 1 : t;\n const dx = px - (ax + t * vx), dy = py - (ay + t * vy);\n return len2(dx, dy);\n}\n","import type { PathOpenFill, PolygonPath } from './path';\n\nlet fallback: PathOpenFill = 'close';\n\n/** Set whether a fill closes an open subpath, for every path that names no\n * `openFill` of its own. Starts at `'close'`. */\nexport function setDefaultOpenFill(rule: PathOpenFill): void {\n fallback = rule;\n}\n\n/** The rule a path with no `openFill` of its own follows. */\nexport function defaultOpenFill(): PathOpenFill {\n return fallback;\n}\n\n/** Whether `path`'s open subpaths fill, each closed by a straight edge back to\n * its start. What painting, area, and the filled-region hit tests all ask. */\nexport function fillsOpenSubpaths(path: PolygonPath): boolean {\n return (path.openFill ?? fallback) === 'close';\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/tessellate/sweep.ts","../src/tessellate/crossings.ts","../src/tessellate/nesting.ts","../src/tessellate/evenOdd.ts","../src/tessellate/tessellate.ts"],"names":["near","rings"],"mappings":"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","file":"chunk-HMGGJZTM.js","sourcesContent":["/** Finding where straight segments cross, by a sweep along x. */\n\nconst LOW_WORD = new Uint8Array(new Uint16Array([1]).buffer)[0] === 1 ? 0 : 1;\n/** How far, relative to itself, writing an index into a key's low word can\n * move it. A zero key becomes a subnormal, which the sweep's 1e-300 covers. */\nconst KEY_SLACK = 2 ** -19;\n\n/**\n * Call `visit` for every pair of segments that cross inside both, with how far\n * along each the crossing lies; `visit` returns `true` to stop. `ends` holds\n * `n` segments as `x0, y0, x1, y1`. Of each pair, `e` is the one whose\n * smallest x is smaller.\n */\nexport function forEachCrossing(\n ends: Float64Array,\n n: number,\n visit: (e: number, f: number, s: number, u: number) => boolean | void,\n): void {\n const keys = sortedMinX(ends, n);\n const index = new Uint32Array(keys.buffer);\n for (let i = 0; i < n; i++) {\n const ei = index[i * 2 + LOW_WORD], e = ei * 4;\n const ex0 = ends[e], ey0 = ends[e + 1], ex1 = ends[e + 2], ey1 = ends[e + 3];\n const maxX = Math.max(ex0, ex1);\n const stop = maxX + Math.abs(maxX) * KEY_SLACK + 1e-300;\n for (let j = i + 1; j < n; j++) {\n if (keys[j] > stop) break;\n const fi = index[j * 2 + LOW_WORD], f = fi * 4;\n const fx0 = ends[f], fy0 = ends[f + 1], fx1 = ends[f + 2], fy1 = ends[f + 3];\n if (Math.max(ey0, ey1) < Math.min(fy0, fy1)) continue;\n if (Math.max(fy0, fy1) < Math.min(ey0, ey1)) continue;\n const hit = crossingParams(ex0, ey0, ex1, ey1, fx0, fy0, fx1, fy1);\n if (hit && visit(ei, fi, hit[0], hit[1])) return;\n }\n }\n}\n\n/**\n * Each segment's smallest x in ascending order, with the segment's index\n * written into the key's low 32 bits, read back through a `Uint32Array` view.\n * A native numeric sort runs about three times as fast as one through a\n * comparator; the index moves each key by under `KEY_SLACK` of itself, which\n * the sweep's stop allows for.\n */\nfunction sortedMinX(ends: Float64Array, n: number): Float64Array {\n const keys = new Float64Array(n);\n const index = new Uint32Array(keys.buffer);\n for (let e = 0; e < n; e++) {\n keys[e] = Math.min(ends[e * 4], ends[e * 4 + 2]);\n index[e * 2 + LOW_WORD] = e;\n }\n return keys.sort();\n}\n\n/** Where segment E crosses segment F inside both, as fractions along each. */\nfunction crossingParams(\n ex0: number, ey0: number, ex1: number, ey1: number,\n fx0: number, fy0: number, fx1: number, fy1: number,\n): [number, number] | null {\n const rx = ex1 - ex0, ry = ey1 - ey0;\n const qx = fx1 - fx0, qy = fy1 - fy0;\n const den = rx * qy - ry * qx;\n if (den === 0) return null;\n const dx = fx0 - ex0, dy = fy0 - ey0;\n const s = (dx * qy - dy * qx) / den;\n const u = (dx * ry - dy * rx) / den;\n const lo = 1e-9, hi = 1 - 1e-9;\n if (s <= lo || s >= hi || u <= lo || u >= hi) return null;\n return [s, u];\n}\n","/** Rebuilding outlines as the non-crossing boundary of their fill. */\n\nimport { forEachCrossing } from './sweep';\n\n/** Flattened contours with each vertex's anchor parameterization. */\nexport interface FlattenedContours {\n coords: number[];\n contourStarts: number[];\n anchorA: number[];\n anchorB: number[];\n anchorT: number[];\n}\n\ninterface Node {\n x: number;\n y: number;\n a: number;\n b: number;\n t: number;\n}\n\ninterface Edge {\n from: Node;\n to: Node;\n /** Where crossings cut this edge, by parameter along it. */\n cuts: { s: number; node: Node }[];\n}\n\ninterface Piece {\n from: Node;\n to: Node;\n}\n\nconst keyOf = (n: Node): string => `${n.x},${n.y}`;\n\n/**\n * The boundary of `flat`'s nonzero fill as loops that do not cross, each with\n * the fill on its left, or `null` when no two edges cross and `always` is\n * not set.\n */\nexport function resolveCrossings(flat: FlattenedContours, always = false): FlattenedContours | null {\n if (!always && !anyCrossing(flat)) return null;\n return resolve(flat, (w) => w !== 0)!.contours;\n}\n\n/**\n * How much work resolving an even-odd fill may take, as boundary pieces times\n * edges: each piece is judged by a winding count over every edge. 2^20 of it\n * took 10 ms on an Apple M-series core (1024 edges, 2026-10-31), and parity is\n * what the stencil computes for free, so a fill past it keeps the stencil.\n */\nexport const MAX_EVENODD_RESOLVE_WORK = 2 ** 20;\n\n/**\n * The boundary of `flat`'s even-odd fill as loops that neither cross nor\n * overlap, each with the fill on its left, for outlines that cross or touch.\n * `null` when resolving would pass {@link MAX_EVENODD_RESOLVE_WORK}, or a\n * boundary piece would not close into a loop.\n */\nexport function resolveEvenOdd(flat: FlattenedContours): FlattenedContours | null {\n const edges = edgeCount(flat);\n const maxCrossings = Math.floor((MAX_EVENODD_RESOLVE_WORK / edges - edges) / 2);\n if (!(maxCrossings >= 0)) return null;\n const out = resolve(flat, (w) => (w & 1) !== 0, maxCrossings);\n return out !== null && out.complete ? out.contours : null;\n}\n\nfunction resolve(\n flat: FlattenedContours, filled: (winding: number) => boolean, maxCrossings = Infinity,\n): { contours: FlattenedContours; complete: boolean } | null {\n const edges = edgesOf(flat);\n const eps = contactTolerance(edges);\n if (!cutAtCrossings(edges, maxCrossings)) return null;\n cutAtContacts(edges, eps);\n weld(edges, eps);\n const pieces = boundaryPieces(edges, filled);\n const { loops, complete } = chainLoops(pieces);\n return { contours: loopsToContours(loops), complete };\n}\n\nfunction edgeCount(flat: FlattenedContours): number {\n const { coords, contourStarts } = flat;\n const total = coords.length / 2;\n let n = 0;\n contourStarts.forEach((start, c) => {\n const end = c + 1 < contourStarts.length ? contourStarts[c + 1] : total;\n for (let i = start; i < end; i++) {\n const j = i + 1 < end ? i + 1 : start;\n if (coords[i * 2] !== coords[j * 2] || coords[i * 2 + 1] !== coords[j * 2 + 1]) n++;\n }\n });\n return n;\n}\n\n/** Whether any two edges of `flat` cross. Every nonzero fill asks this, and\n * most cross nowhere, so it reads the coordinates without building edges. */\nexport function anyCrossing(flat: FlattenedContours): boolean {\n const { coords, contourStarts } = flat;\n const total = coords.length / 2;\n const ends = new Float64Array(total * 4);\n let n = 0;\n contourStarts.forEach((start, c) => {\n const end = c + 1 < contourStarts.length ? contourStarts[c + 1] : total;\n for (let i = start; i < end; i++) {\n const j = i + 1 < end ? i + 1 : start;\n const x0 = coords[i * 2], y0 = coords[i * 2 + 1], x1 = coords[j * 2], y1 = coords[j * 2 + 1];\n if (x0 === x1 && y0 === y1) continue;\n ends[n * 4] = x0; ends[n * 4 + 1] = y0; ends[n * 4 + 2] = x1; ends[n * 4 + 3] = y1;\n n++;\n }\n });\n let found = false;\n forEachCrossing(ends, n, () => (found = true));\n return found;\n}\n\nfunction edgesOf(flat: FlattenedContours): Edge[] {\n const { coords, contourStarts, anchorA, anchorB, anchorT } = flat;\n const total = coords.length / 2;\n const node = (i: number): Node => ({ x: coords[i * 2], y: coords[i * 2 + 1], a: anchorA[i], b: anchorB[i], t: anchorT[i] });\n const edges: Edge[] = [];\n contourStarts.forEach((start, c) => {\n const end = c + 1 < contourStarts.length ? contourStarts[c + 1] : total;\n for (let i = start; i < end; i++) {\n const from = node(i), to = node(i + 1 < end ? i + 1 : start);\n if (from.x !== to.x || from.y !== to.y) edges.push({ from, to, cuts: [] });\n }\n });\n return edges;\n}\n\n/** Record every interior crossing on both edges it cuts. `false`, having\n * stopped, when there are more than `max`. */\nfunction cutAtCrossings(edges: Edge[], max: number): boolean {\n const ends = new Float64Array(edges.length * 4);\n edges.forEach(({ from, to }, i) => ends.set([from.x, from.y, to.x, to.y], i * 4));\n let count = 0;\n forEachCrossing(ends, edges.length, (ei, fi, s, u) => {\n if (++count > max) return true;\n const e = edges[ei];\n const node = {\n x: e.from.x + (e.to.x - e.from.x) * s,\n y: e.from.y + (e.to.y - e.from.y) * s,\n ...anchorsAlong(e, s),\n };\n e.cuts.push({ s, node });\n edges[fi].cuts.push({ s: u, node });\n return false;\n });\n return count <= max;\n}\n\n/**\n * Cut every edge where another's end lies inside it, so outlines that touch\n * without crossing (a corner on an edge, a stretch of edge two contours share)\n * meet at a node both name. The cut takes the touching end's own coordinates,\n * so the two sides of a shared stretch come out as the same pieces.\n */\nfunction cutAtContacts(edges: Edge[], eps: number): void {\n const order = edges.map((_, i) => i);\n const lo = (e: Edge): number => Math.min(e.from.x, e.to.x);\n order.sort((a, b) => lo(edges[a]) - lo(edges[b]));\n for (let a = 0; a < order.length; a++) {\n const e = edges[order[a]];\n const stop = Math.max(e.from.x, e.to.x) + eps;\n for (let b = a + 1; b < order.length; b++) {\n const f = edges[order[b]];\n if (lo(f) > stop) break;\n if (Math.max(e.from.y, e.to.y) + eps < Math.min(f.from.y, f.to.y)) continue;\n if (Math.max(f.from.y, f.to.y) + eps < Math.min(e.from.y, e.to.y)) continue;\n cutAt(e, f.from, eps); cutAt(e, f.to, eps);\n cutAt(f, e.from, eps); cutAt(f, e.to, eps);\n }\n }\n}\n\n/** How near two points are to count as touching: the tolerance\n * `evenOddRings` judges contact by. */\nfunction contactTolerance(edges: Edge[]): number {\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (const { from: p } of edges) {\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.max(maxX - minX, maxY - minY, Math.abs(minX), Math.abs(maxX), Math.abs(minY), Math.abs(maxY)) * 1e-9;\n}\n\n/** Move every node within `eps` of one before it onto that one, so loops\n * chain through points that differ only by rounding. */\nfunction weld(edges: Edge[], eps: number): void {\n const nodes: Node[] = [];\n for (const e of edges) {\n nodes.push(e.from, e.to);\n for (const c of e.cuts) nodes.push(c.node);\n }\n nodes.sort((p, q) => p.x - q.x);\n for (let i = 0; i < nodes.length; i++) {\n const p = nodes[i];\n for (let j = i + 1; j < nodes.length && nodes[j].x - p.x <= eps; j++) {\n const q = nodes[j];\n if (q !== p && Math.abs(q.y - p.y) <= eps && (q.x !== p.x || q.y !== p.y)) {\n q.x = p.x;\n q.y = p.y;\n }\n }\n }\n}\n\n/** Cut `e` at `p` when `p` lies within `eps` of its inside, away from its ends\n * and from any cut already there. */\nfunction cutAt(e: Edge, p: Node, eps: number): void {\n const dx = e.to.x - e.from.x, dy = e.to.y - e.from.y;\n const len2 = dx * dx + dy * dy;\n const s = ((p.x - e.from.x) * dx + (p.y - e.from.y) * dy) / len2;\n if (!(s > 0 && s < 1)) return;\n if (Math.hypot(e.from.x + dx * s - p.x, e.from.y + dy * s - p.y) > eps) return;\n const at = (q: Node): boolean => Math.abs(q.x - p.x) <= eps && Math.abs(q.y - p.y) <= eps;\n if (at(e.from) || at(e.to) || e.cuts.some((c) => at(c.node))) return;\n e.cuts.push({ s, node: p });\n}\n\n/** Anchors for a point `s` of the way along `e`: interpolated within one\n * curve's run, else the nearer end's. */\nfunction anchorsAlong(e: Edge, s: number): { a: number; b: number; t: number } {\n const { from, to } = e;\n if (from.a === to.a && from.b === to.b) return { a: from.a, b: from.b, t: from.t + (to.t - from.t) * s };\n const near = s < 0.5 ? from : to;\n return { a: near.a, b: near.b, t: near.t };\n}\n\n/** The pieces between cuts that have fill on exactly one side, turned so it\n * is on the left. A stretch two edges share comes out once. */\nfunction boundaryPieces(edges: Edge[], filledBy: (winding: number) => boolean): Piece[] {\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (const { from: p } of edges) {\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-7, 1e-9);\n const filled = (x: number, y: number) => filledBy(windingAt(edges, x, y));\n\n const out: Piece[] = [];\n const seen = new Set<string>();\n const keep = (from: Node, to: Node): void => {\n const k = `${keyOf(from)}>${keyOf(to)}`;\n if (seen.has(k)) return;\n seen.add(k);\n out.push({ from, to });\n };\n for (const e of edges) {\n const stops = [e.from, ...e.cuts.sort((p, q) => p.s - q.s).map((c) => c.node), e.to];\n for (let k = 0; k + 1 < stops.length; k++) {\n const p = stops[k], q = stops[k + 1];\n const dx = q.x - p.x, dy = q.y - p.y;\n const len = Math.hypot(dx, dy);\n if (len === 0) continue;\n const mx = (p.x + q.x) / 2, my = (p.y + q.y) / 2;\n const nx = (-dy / len) * eps, ny = (dx / len) * eps;\n const left = filled(mx + nx, my + ny), right = filled(mx - nx, my - ny);\n if (left && !right) keep(p, q);\n else if (right && !left) keep(q, p);\n }\n }\n return out;\n}\n\nfunction windingAt(edges: Edge[], x: number, y: number): number {\n let w = 0;\n for (const { from: p, to: q } of edges) {\n const side = (q.x - p.x) * (y - p.y) - (x - p.x) * (q.y - p.y);\n if (p.y <= y && q.y > y && side > 0) w++;\n else if (q.y <= y && p.y > y && side < 0) w--;\n }\n return w;\n}\n\n/** Join pieces end to start into closed loops. Where a node has several ways\n * on, take the sharpest left turn, which keeps to the face being traced. */\nfunction chainLoops(pieces: Piece[]): { loops: Node[][]; complete: boolean } {\n const outgoing = new Map<string, Piece[]>();\n for (const p of pieces) {\n const k = keyOf(p.from);\n const list = outgoing.get(k);\n if (list) list.push(p);\n else outgoing.set(k, [p]);\n }\n const used = new Set<Piece>();\n const loops: Node[][] = [];\n let complete = true;\n for (const first of pieces) {\n if (used.has(first)) continue;\n used.add(first);\n const loop: Node[] = [first.from];\n const startKey = keyOf(first.from);\n let cur = first;\n while (keyOf(cur.to) !== startKey) {\n const next = sharpestLeft(cur, (outgoing.get(keyOf(cur.to)) ?? []).filter((p) => !used.has(p)));\n if (!next) break;\n used.add(next);\n loop.push(next.from);\n cur = next;\n }\n if (keyOf(cur.to) !== startKey) complete = false;\n else if (loop.length >= 3) loops.push(loop);\n }\n return { loops, complete };\n}\n\nfunction sharpestLeft(into: Piece, options: Piece[]): Piece | undefined {\n const ix = into.to.x - into.from.x, iy = into.to.y - into.from.y;\n let best: Piece | undefined;\n let bestTurn = -Infinity;\n for (const p of options) {\n const ox = p.to.x - p.from.x, oy = p.to.y - p.from.y;\n const turn = Math.atan2(ix * oy - iy * ox, ix * ox + iy * oy);\n if (turn > bestTurn) {\n bestTurn = turn;\n best = p;\n }\n }\n return best;\n}\n\nfunction loopsToContours(loops: Node[][]): FlattenedContours {\n const out: FlattenedContours = { coords: [], contourStarts: [], anchorA: [], anchorB: [], anchorT: [] };\n for (const loop of loops) {\n out.contourStarts.push(out.coords.length / 2);\n for (const n of loop) {\n out.coords.push(n.x, n.y);\n out.anchorA.push(n.a);\n out.anchorB.push(n.b);\n out.anchorT.push(n.t);\n }\n }\n return out;\n}\n","/** How the rings of a fill that does not cross itself sit inside one another. */\n\nimport { pointInPolygon } from '../polyline';\nimport type { FlattenedContours } from './crossings';\n\nexport interface Ring {\n start: number;\n end: number;\n area: number;\n /** The smallest ring this one lies inside, or -1. */\n parent: number;\n /** Nonzero winding number just inside this ring. */\n winding: number;\n}\n\n/** Each contour's ring. A zero-area ring has no parent and winding 0. */\nexport function nestRings(flat: FlattenedContours): Ring[] {\n const { coords, contourStarts } = flat;\n const total = coords.length / 2;\n const rings: Ring[] = contourStarts.map((start, c) => {\n const end = c + 1 < contourStarts.length ? contourStarts[c + 1] : total;\n return { start, end, area: signedArea(coords, start, end), parent: -1, winding: 0 };\n });\n const boxes = rings.map((r) => boxOf(coords, r.start, r.end));\n const bySize = rings.map((_, i) => i).filter((i) => rings[i].area !== 0);\n bySize.sort((i, j) => Math.abs(rings[j].area) - Math.abs(rings[i].area));\n for (let k = 0; k < bySize.length; k++) {\n const r = rings[bySize[k]];\n for (let m = k - 1; m >= 0; m--) {\n const o = bySize[m];\n if (contains(coords, rings[o], boxes[o], r)) {\n r.parent = o;\n break;\n }\n }\n r.winding = Math.sign(r.area) + (r.parent >= 0 ? rings[r.parent].winding : 0);\n }\n return rings;\n}\n\n/** Whether `r` lies inside `o`, given that neither crosses the other. Judged\n * at the first vertex of `r` not on `o`'s outline, since one on it is\n * inside or out by rounding. */\nfunction contains(coords: number[], o: Ring, box: number[], r: Ring): boolean {\n const eps = Math.max(box[2] - box[0], box[3] - box[1]) * 1e-9;\n for (let i = r.start; i < r.end; i++) {\n const x = coords[i * 2], y = coords[i * 2 + 1];\n if (x < box[0] || x > box[2] || y < box[1] || y > box[3]) return false;\n if (!onOutline(coords, o, x, y, eps)) return pointInPolygon(coords, x, y, o.start, o.end);\n }\n return false;\n}\n\nfunction onOutline(coords: number[], o: Ring, x: number, y: number, eps: number): boolean {\n for (let i = o.start; i < o.end; i++) {\n const j = i + 1 === o.end ? o.start : i + 1;\n const ax = coords[i * 2], ay = coords[i * 2 + 1];\n const dx = coords[j * 2] - ax, dy = coords[j * 2 + 1] - ay;\n const len2 = dx * dx + dy * dy;\n const s = len2 > 0 ? Math.max(0, Math.min(1, ((x - ax) * dx + (y - ay) * dy) / len2)) : 0;\n if (Math.hypot(ax + dx * s - x, ay + dy * s - y) <= eps) return true;\n }\n return false;\n}\n\nfunction boxOf(coords: number[], start: number, end: number): number[] {\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (let i = start; i < end; i++) {\n const x = coords[i * 2], y = coords[i * 2 + 1];\n minX = Math.min(minX, x); maxX = Math.max(maxX, x);\n minY = Math.min(minY, y); maxY = Math.max(maxY, y);\n }\n return [minX, minY, maxX, maxY];\n}\n\nfunction signedArea(coords: number[], start: number, end: number): number {\n let a = 0;\n for (let i = start; i < end; i++) {\n const j = i + 1 === end ? start : i + 1;\n a += coords[i * 2] * coords[j * 2 + 1] - coords[j * 2] * coords[i * 2 + 1];\n }\n return a * 0.5;\n}\n","/** Even-odd fills whose outlines never meet, which triangulate like nonzero ones. */\n\nimport type { FlattenedContours } from './crossings';\nimport { nestRings, type Ring } from './nesting';\n\n/**\n * The rings of an even-odd fill with each `winding` set to 1 where the fill\n * lies just inside it and 0 where a hole does, or `null` when two edges touch\n * anywhere but the vertex two neighbors share, or a ring has no area. Without\n * contact, each ring is filled or empty by how many rings enclose it, so the\n * fill is the even-depth rings less their children and earcut can draw it.\n * Contact is judged with a tolerance, so a near miss reads as a touch.\n */\nexport function evenOddRings(flat: FlattenedContours): Ring[] | null {\n if (anyContact(flat)) return null;\n const rings = nestRings(flat);\n if (rings.some((r) => r.area === 0)) return null;\n for (const r of rings) {\n let depth = 0;\n for (let p = r.parent; p >= 0; p = rings[p].parent) depth++;\n r.winding = depth % 2 === 0 ? 1 : 0;\n }\n return rings;\n}\n\n/** Segments as `x0, y0, x1, y1`, with each one's contour and position in it. */\ninterface Segments {\n ends: Float64Array;\n contour: Uint32Array;\n pos: Uint32Array;\n /** Segments in each contour. */\n count: number[];\n n: number;\n}\n\nfunction segmentsOf(flat: FlattenedContours): Segments {\n const { coords, contourStarts } = flat;\n const total = coords.length / 2;\n const ends = new Float64Array(total * 4);\n const contour = new Uint32Array(total);\n const pos = new Uint32Array(total);\n const count: number[] = [];\n let n = 0;\n contourStarts.forEach((start, c) => {\n const end = c + 1 < contourStarts.length ? contourStarts[c + 1] : total;\n let k = 0;\n for (let i = start; i < end; i++) {\n const j = i + 1 < end ? i + 1 : start;\n const x0 = coords[i * 2], y0 = coords[i * 2 + 1], x1 = coords[j * 2], y1 = coords[j * 2 + 1];\n if (x0 === x1 && y0 === y1) continue;\n ends.set([x0, y0, x1, y1], n * 4);\n contour[n] = c;\n pos[n] = k++;\n n++;\n }\n count.push(k);\n });\n return { ends, contour, pos, count, n };\n}\n\n/** Whether any two segments meet other than at the end two neighbors share. */\nfunction anyContact(flat: FlattenedContours): boolean {\n const s = segmentsOf(flat);\n const { ends, n } = s;\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (let i = 0; i < n * 4; i += 2) {\n minX = Math.min(minX, ends[i]); maxX = Math.max(maxX, ends[i]);\n minY = Math.min(minY, ends[i + 1]); maxY = Math.max(maxY, ends[i + 1]);\n }\n const eps = Math.max(maxX - minX, maxY - minY, Math.abs(minX), Math.abs(maxX), Math.abs(minY), Math.abs(maxY)) * 1e-9;\n const order = Array.from({ length: n }, (_, i) => i);\n const lo = (e: number): number => Math.min(ends[e * 4], ends[e * 4 + 2]);\n order.sort((a, b) => lo(a) - lo(b));\n for (let a = 0; a < n; a++) {\n const e = order[a];\n const stop = Math.max(ends[e * 4], ends[e * 4 + 2]) + eps;\n for (let b = a + 1; b < n; b++) {\n const f = order[b];\n if (lo(f) > stop) break;\n if (touches(s, e, f, eps)) return true;\n }\n }\n return false;\n}\n\nfunction touches(s: Segments, e: number, f: number, eps: number): boolean {\n const { ends } = s;\n const ax = ends[e * 4], ay = ends[e * 4 + 1], bx = ends[e * 4 + 2], by = ends[e * 4 + 3];\n const cx = ends[f * 4], cy = ends[f * 4 + 1], dx = ends[f * 4 + 2], dy = ends[f * 4 + 3];\n if (Math.max(ay, by) + eps < Math.min(cy, dy) || Math.max(cy, dy) + eps < Math.min(ay, by)) return false;\n const shared = sharedEnd(s, e, f);\n if (shared === 'e-to') {\n // f starts where e ends: they meet only there unless f doubles back along e.\n return foldsBack(bx - ax, by - ay, dx - cx, dy - cy) || near(ax, ay, cx, cy, dx, dy, eps);\n }\n if (shared === 'f-to') {\n return foldsBack(dx - cx, dy - cy, bx - ax, by - ay) || near(cx, cy, ax, ay, bx, by, eps);\n }\n return near(ax, ay, cx, cy, dx, dy, eps) || near(bx, by, cx, cy, dx, dy, eps)\n || near(cx, cy, ax, ay, bx, by, eps) || near(dx, dy, ax, ay, bx, by, eps)\n || properCross(ax, ay, bx, by, cx, cy, dx, dy);\n}\n\n/** Which of the pair hands its end to the other as its start, when they are\n * neighbors in one contour. A contour of two segments has them meet at both\n * ends, and is caught for having no area. */\nfunction sharedEnd(s: Segments, e: number, f: number): 'e-to' | 'f-to' | null {\n if (s.contour[e] !== s.contour[f]) return null;\n const k = s.count[s.contour[e]];\n if (k < 3) return null;\n if ((s.pos[e] + 1) % k === s.pos[f]) return 'e-to';\n if ((s.pos[f] + 1) % k === s.pos[e]) return 'f-to';\n return null;\n}\n\n/** Whether the second direction turns back along the first. */\nfunction foldsBack(ux: number, uy: number, vx: number, vy: number): boolean {\n const cross = ux * vy - uy * vx;\n return Math.abs(cross) <= 1e-9 * Math.hypot(ux, uy) * Math.hypot(vx, vy) && ux * vx + uy * vy < 0;\n}\n\n/** Whether point P lies within `eps` of segment AB. */\nfunction near(px: number, py: number, ax: number, ay: number, bx: number, by: number, eps: number): boolean {\n const dx = bx - ax, dy = by - ay;\n const len2 = dx * dx + dy * dy;\n const t = len2 > 0 ? Math.max(0, Math.min(1, ((px - ax) * dx + (py - ay) * dy) / len2)) : 0;\n return Math.hypot(ax + dx * t - px, ay + dy * t - py) <= eps;\n}\n\nfunction properCross(\n ax: number, ay: number, bx: number, by: number,\n cx: number, cy: number, dx: number, dy: number,\n): boolean {\n const o1 = orient(ax, ay, bx, by, cx, cy), o2 = orient(ax, ay, bx, by, dx, dy);\n const o3 = orient(cx, cy, dx, dy, ax, ay), o4 = orient(cx, cy, dx, dy, bx, by);\n return o1 * o2 <= 0 && o3 * o4 <= 0;\n}\n\nconst orient = (ax: number, ay: number, bx: number, by: number, px: number, py: number): number =>\n Math.sign((bx - ax) * (py - ay) - (by - ay) * (px - ax));\n","import earcut from 'earcut';\nimport { forEachSegment, PATH_M, PATH_L, PATH_Z, PATH_C, PATH_Q } from '../commands';\nimport { resolveCorners } from '../paths/corners';\nimport { coordsFrom, originFor } from '../paths/pathOrigin';\nimport { rectToContour } from '../box';\nimport type { Path, PolygonPath, RectPath } from '../path';\nimport { fillsOpenSubpaths } from '../openFill';\nimport {\n DEFAULT_FLATTEN_TOLERANCE,\n flattenCubicWithArcLen,\n flattenQuadraticWithArcLen,\n} from '../flatten';\nimport type { Mesh } from './mesh';\nimport { resolveCrossings, resolveEvenOdd, type FlattenedContours } from './crossings';\nimport { nestRings, type Ring } from './nesting';\nimport { evenOddRings } from './evenOdd';\n\n/** Options for `tessellate`. A smaller tolerance means more triangles and\n * smoother curves; it is in path-local units, so callers rendering at a\n * larger scale should tighten it. */\nexport interface TessellateOptions {\n /** Flatness tolerance for bezier subdivision in path-local units. */\n flattenTolerance?: number;\n}\n\n/** Turn a path into a triangle mesh the renderer can draw: curves flattened to\n * line segments, then the resulting polygon triangulated. */\nexport function tessellate(path: Path, opts: TessellateOptions = {}): Mesh {\n if (path.kind === 'rect') return tessellateRect(path);\n const mesh = tessellatePolygon(resolveCorners(path), opts);\n return path.origin ? { ...mesh, origin: path.origin } : mesh;\n}\n\nfunction tessellateRect(p: RectPath): Mesh {\n const corners = rectToContour(p.x, p.y, p.width, p.height);\n const origin = originFor(corners);\n return {\n vertices: coordsFrom(origin, corners),\n indices: new Uint32Array([0, 1, 2, 0, 2, 3]),\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 ...(origin ? { origin } : {}),\n };\n}\n\n/** The contours a fill covers: all of them, or only those a `Z` closed. */\nexport function flattenPolygon(p: PolygonPath, tolerance: number): FlattenedContours {\n const closed = new Set<number>();\n const all = flattenContours(p, tolerance, closed);\n if (fillsOpenSubpaths(p)) return all;\n const kept: FlattenedContours = { coords: [], contourStarts: [], anchorA: [], anchorB: [], anchorT: [] };\n all.contourStarts.forEach((start, c) => {\n if (!closed.has(c)) return;\n const end = c + 1 < all.contourStarts.length ? all.contourStarts[c + 1] : all.coords.length / 2;\n kept.contourStarts.push(kept.coords.length / 2);\n kept.coords.push(...all.coords.slice(start * 2, end * 2));\n kept.anchorA.push(...all.anchorA.slice(start, end));\n kept.anchorB.push(...all.anchorB.slice(start, end));\n kept.anchorT.push(...all.anchorT.slice(start, end));\n });\n return kept;\n}\n\n/** Flatten every contour, noting in `closed` the index of each one a `Z` ends. */\nfunction flattenContours(p: PolygonPath, tolerance: number, closed: Set<number>): FlattenedContours {\n const { commands, coords } = p;\n const out: number[] = [];\n const anchorA: number[] = [];\n const anchorB: number[] = [];\n const anchorT: number[] = [];\n const contourStarts: number[] = [];\n let startAnchor = -1;\n let prevAnchor = -1;\n let anchorCounter = 0;\n\n // Anchor bookkeeping for the points a curve just appended: interior points\n // interpolate (prevAnchor → target); the last is pinned anchor-exact.\n const pushCurveAnchors = (anchorStart: number, arcAccum: number[], total: number, target: number): void => {\n for (let k = 0; k < arcAccum.length; k++) {\n anchorA.push(prevAnchor);\n anchorB.push(target);\n anchorT.push(total > 0 ? arcAccum[k] / total : 0);\n }\n const lastIdx = anchorStart + arcAccum.length - 1;\n anchorA[lastIdx] = target;\n anchorB[lastIdx] = target;\n anchorT[lastIdx] = 0;\n };\n\n forEachSegment(commands, coords, (cmd, coordIdx, prevX, prevY, _i, opensSubpath) => {\n if (opensSubpath) {\n const anchor = Math.max(startAnchor, 0);\n contourStarts.push(out.length / 2);\n out.push(prevX, prevY);\n anchorA.push(anchor);\n anchorB.push(anchor);\n anchorT.push(0);\n prevAnchor = anchor;\n }\n switch (cmd) {\n case PATH_M:\n case PATH_L: {\n if (cmd === PATH_M) {\n contourStarts.push(out.length / 2);\n startAnchor = anchorCounter;\n }\n out.push(coords[coordIdx], coords[coordIdx + 1]);\n anchorA.push(anchorCounter);\n anchorB.push(anchorCounter);\n anchorT.push(0);\n prevAnchor = anchorCounter;\n anchorCounter++;\n break;\n }\n case PATH_Q: {\n const target = anchorCounter;\n const arcAccum: number[] = [];\n const anchorStart = anchorA.length;\n const total = flattenQuadraticWithArcLen(\n prevX, prevY,\n coords[coordIdx], coords[coordIdx + 1],\n coords[coordIdx + 2], coords[coordIdx + 3],\n tolerance, out, arcAccum,\n );\n pushCurveAnchors(anchorStart, arcAccum, total, target);\n prevAnchor = target;\n anchorCounter++;\n break;\n }\n case PATH_C: {\n const target = anchorCounter;\n const arcAccum: number[] = [];\n const anchorStart = anchorA.length;\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, out, arcAccum,\n );\n pushCurveAnchors(anchorStart, arcAccum, total, target);\n prevAnchor = target;\n anchorCounter++;\n break;\n }\n case PATH_Z:\n closed.add(contourStarts.length - 1);\n // The pen returns to the subpath start (forEachSegment does that); the\n // anchor it carries has to follow, or a curve after the Z interpolates\n // from the wrong end.\n prevAnchor = startAnchor;\n break;\n default:\n throw new Error(`tessellate: unknown command code ${cmd}`);\n }\n });\n\n return { coords: out, contourStarts, anchorA, anchorB, anchorT };\n}\n\nfunction tessellatePolygon(p: PolygonPath, opts: TessellateOptions): Mesh {\n const tolerance = opts.flattenTolerance ?? DEFAULT_FLATTEN_TOLERANCE;\n const flat = flattenPolygon(p, tolerance);\n\n if (p.fillRule === 'evenodd') {\n const rings = evenOddRings(flat);\n if (rings) return tessellateNonzero(flat, rings);\n const resolved = resolveEvenOdd(flat);\n if (resolved) return tessellateNonzero(resolved, nestRings(resolved));\n const { coords, contourStarts, anchorA, anchorB, anchorT } = flat;\n return tessellateEvenoddWithAnchors(coords, contourStarts, anchorA, anchorB, anchorT);\n }\n const crossed = resolveCrossings(flat);\n if (crossed) return tessellateNonzero(crossed, nestRings(crossed));\n const rings = nestRings(flat);\n if (rings.every((r) => Math.abs(r.winding) <= 1)) return tessellateNonzero(flat, rings);\n // Nested same-wound rings would cover the region they share twice.\n const rebuilt = resolveCrossings(flat, true)!;\n return tessellateNonzero(rebuilt, nestRings(rebuilt));\n}\n\n/** Triangulate rings that do not cross and wind at most once anywhere: each\n * ring with fill inside it, less the rings directly inside it, which are its\n * holes. */\nfunction tessellateNonzero(flat: FlattenedContours, rings: Ring[]): Mesh {\n const { coords, contourStarts, anchorA, anchorB, anchorT } = flat;\n const shapes: number[] = [];\n const holesByShape = new Map<number, number[]>();\n rings.forEach((r, i) => {\n if (r.area === 0) return;\n if (r.winding !== 0) shapes.push(i);\n else if (holesByShape.has(r.parent)) holesByShape.get(r.parent)!.push(i);\n else holesByShape.set(r.parent, [i]);\n });\n\n if (shapes.length <= 1 && (shapes[0] ?? 0) === 0) {\n const tri = earcut(coords, contourStarts.length > 1 ? contourStarts.slice(1) : undefined);\n return {\n vertices: new Float32Array(coords),\n indices: new Uint32Array(tri),\n anchorA: new Uint32Array(anchorA),\n anchorB: new Uint32Array(anchorB),\n anchorT: new Float32Array(anchorT),\n };\n }\n\n const finalCoords: number[] = [];\n const finalAnchorA: number[] = [];\n const finalAnchorB: number[] = [];\n const finalAnchorT: number[] = [];\n const finalIndices: number[] = [];\n for (const pos of shapes) {\n const holes = holesByShape.get(pos) ?? [];\n const offset = finalCoords.length / 2;\n const groupCoords: number[] = [];\n const groupStarts: number[] = [0];\n for (let i = rings[pos].start; i < rings[pos].end; i++) {\n groupCoords.push(coords[i * 2], coords[i * 2 + 1]);\n finalAnchorA.push(anchorA[i]);\n finalAnchorB.push(anchorB[i]);\n finalAnchorT.push(anchorT[i]);\n }\n for (const h of holes) {\n groupStarts.push(groupCoords.length / 2);\n for (let i = rings[h].start; i < rings[h].end; i++) {\n groupCoords.push(coords[i * 2], coords[i * 2 + 1]);\n finalAnchorA.push(anchorA[i]);\n finalAnchorB.push(anchorB[i]);\n finalAnchorT.push(anchorT[i]);\n }\n }\n const tri = earcut(groupCoords, groupStarts.length > 1 ? groupStarts.slice(1) : undefined);\n for (const v of groupCoords) finalCoords.push(v);\n for (const idx of tri) finalIndices.push(idx + offset);\n }\n\n return {\n vertices: new Float32Array(finalCoords),\n indices: new Uint32Array(finalIndices),\n anchorA: new Uint32Array(finalAnchorA),\n anchorB: new Uint32Array(finalAnchorB),\n anchorT: new Float32Array(finalAnchorT),\n };\n}\n\nfunction tessellateEvenoddWithAnchors(\n coords: number[],\n contourStarts: number[],\n anchorA: number[],\n anchorB: number[],\n anchorT: number[],\n): Mesh {\n const indices: number[] = [];\n const totalVerts = coords.length / 2;\n for (let c = 0; c < contourStarts.length; c++) {\n const start = contourStarts[c];\n const end = c + 1 < contourStarts.length ? contourStarts[c + 1] : totalVerts;\n for (let i = start + 1; i < end - 1; i++) {\n indices.push(start, i, i + 1);\n }\n }\n return {\n vertices: new Float32Array(coords),\n indices: new Uint32Array(indices),\n requiresStencil: true,\n anchorA: new Uint32Array(anchorA),\n anchorB: new Uint32Array(anchorB),\n anchorT: new Float32Array(anchorT),\n };\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/paths/curvature.ts","../src/paths/eulerSpiral.ts","../src/paths/spiro.ts","../src/paths/spiroPath.ts"],"names":[],"mappings":"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","file":"chunk-HNLJO3E7.js","sourcesContent":["import type { AnchorSet } from './anchorEdits';\nimport { isStraightSegment, segmentEnds } from './anchors';\nimport { cubicPointAt, type Point } from './cubicMath';\n\n/** First derivative of the cubic Bezier (p0, p1, p2, p3) at t. */\nexport function cubicDerivativeAt(p0: Point, p1: Point, p2: Point, p3: Point, t: number): Point {\n const u = 1 - t;\n return {\n x: 3 * u * u * (p1.x - p0.x) + 6 * u * t * (p2.x - p1.x) + 3 * t * t * (p3.x - p2.x),\n y: 3 * u * u * (p1.y - p0.y) + 6 * u * t * (p2.y - p1.y) + 3 * t * t * (p3.y - p2.y),\n };\n}\n\nfunction cubicSecondDerivativeAt(p0: Point, p1: Point, p2: Point, p3: Point, t: number): Point {\n const u = 1 - t;\n return {\n x: 6 * u * (p2.x - 2 * p1.x + p0.x) + 6 * t * (p3.x - 2 * p2.x + p1.x),\n y: 6 * u * (p2.y - 2 * p1.y + p0.y) + 6 * t * (p3.y - 2 * p2.y + p1.y),\n };\n}\n\n/**\n * Signed curvature of the cubic Bezier (p0, p1, p2, p3) at t: one over the\n * radius of the circle that fits the curve there. Positive where the curve\n * turns toward its left normal `(-dy, dx)`, negative where it turns away, so\n * the sign flips at an inflection. 0 where the curve has no direction at t, as\n * at an end whose handle sits on its anchor.\n */\nexport function cubicCurvatureAt(p0: Point, p1: Point, p2: Point, p3: Point, t: number): number {\n const d1 = cubicDerivativeAt(p0, p1, p2, p3, t);\n const d2 = cubicSecondDerivativeAt(p0, p1, p2, p3, t);\n const den = Math.pow(d1.x * d1.x + d1.y * d1.y, 1.5);\n if (den < 1e-12) return 0;\n return (d1.x * d2.y - d1.y * d2.x) / den;\n}\n\n/** One tooth of a curvature comb: a point on the curve and the tip of the\n * tooth standing on it. */\nexport interface CombTooth {\n /** The point on the curve. */\n x: number;\n y: number;\n /** The tooth's tip: off the curve along its normal, on the outside of the\n * bend, by the curvature times the comb's scale. */\n tipX: number;\n tipY: number;\n /** Signed curvature at the point, as {@link cubicCurvatureAt} gives it. */\n curvature: number;\n}\n\n/** The comb of one curved segment, which runs from anchor `segIdx` of\n * subpath `sub` to the next. */\nexport interface SegmentComb {\n sub: number;\n segIdx: number;\n /** Evenly spaced in t, ends included. */\n teeth: CombTooth[];\n}\n\n/** Options for {@link curvatureComb} and {@link combTeeth}. */\nexport interface CurvatureCombOptions {\n /** Tooth length per unit of curvature. A tooth over a stretch of radius r is\n * `scale / r` long, in the curve's own units. */\n scale: number;\n /** Teeth per segment for {@link curvatureComb}, or along the whole source\n * for {@link combTeeth}; ends included. Default 24; at least 2. */\n samplesPerSegment?: number;\n}\n\n/**\n * A curve parameterized over t in [0, 1], as a curvature comb reads it. Any\n * curve can stand a comb this way, whether or not it is a path.\n */\nexport interface CurvatureSource {\n /** The point on the curve at t. */\n pointAt(t: number): Point;\n /** A vector along the direction of travel at t. Only its direction is read;\n * a zero vector means the curve has no direction there. */\n tangentAt(t: number): Point;\n /** Signed curvature at t, positive where the curve turns toward its left\n * normal `(-dy, dx)`, as {@link cubicCurvatureAt} gives it. */\n curvatureAt(t: number): number;\n}\n\n/** How far in from an end a tooth moves when the curve has no direction at\n * the end itself, so it reports the curvature the end is approached with. */\nconst END_NUDGE = 1e-3;\n\nfunction sampleCount(opts: CurvatureCombOptions): number {\n return Math.max(2, Math.round(opts.samplesPerSegment ?? 24));\n}\n\n/**\n * The teeth of a curvature comb along `source`, evenly spaced in t with both\n * ends included. Each stands out of the curve along its normal, on the outside\n * of the bend, `scale` times the curvature long.\n */\nexport function combTeeth(source: CurvatureSource, opts: CurvatureCombOptions): CombTooth[] {\n const samples = sampleCount(opts);\n const teeth: CombTooth[] = [];\n for (let i = 0; i < samples; i++) teeth.push(toothAt(source, i / (samples - 1), opts.scale));\n return teeth;\n}\n\n/** The cubic Bezier (p0, p1, p2, p3) as a {@link CurvatureSource}. */\nexport function cubicCurvatureSource(p0: Point, p1: Point, p2: Point, p3: Point): CurvatureSource {\n return {\n pointAt: (t) => cubicPointAt(p0, p1, p2, p3, t),\n tangentAt: (t) => cubicDerivativeAt(p0, p1, p2, p3, t),\n curvatureAt: (t) => cubicCurvatureAt(p0, p1, p2, p3, t),\n };\n}\n\n/**\n * Curvature combs for every curved segment of `set`: teeth that stand out of\n * the curve, each as long as the curvature where it stands. Joining their tips\n * draws how the bend changes along the path. A tooth that jumps in length at\n * an anchor shows a curvature break there; teeth that change side show an\n * inflection. Straight segments have no curvature, and no comb.\n */\nexport function curvatureComb(set: AnchorSet, opts: CurvatureCombOptions): SegmentComb[] {\n const out: SegmentComb[] = [];\n for (let sub = 0; sub < set.anchors.length; sub++) {\n const count = set.anchors[sub].length - (set.closed[sub] ? 0 : 1);\n for (let segIdx = 0; segIdx < count; segIdx++) {\n const ends = segmentEnds(set.anchors, set.closed, sub, segIdx);\n if (!ends || isStraightSegment(ends.a, ends.b)) continue;\n const { a, b } = ends;\n const source = cubicCurvatureSource(a, a.outHandle ?? a, b.inHandle ?? b, b);\n out.push({ sub, segIdx, teeth: combTeeth(source, opts) });\n }\n }\n return out;\n}\n\nfunction toothAt(source: CurvatureSource, t: number, scale: number): CombTooth {\n const at = source.pointAt(t);\n let d = source.tangentAt(t);\n let k = source.curvatureAt(t);\n if (Math.hypot(d.x, d.y) < 1e-9) {\n const inner = t < 0.5 ? t + END_NUDGE : t - END_NUDGE;\n d = source.tangentAt(inner);\n k = source.curvatureAt(inner);\n }\n const len = Math.hypot(d.x, d.y);\n if (len < 1e-12) return { x: at.x, y: at.y, tipX: at.x, tipY: at.y, curvature: 0 };\n // The bend's center lies along the left normal times 1/k, so the tooth goes\n // the other way: outside the bend on either side of an inflection.\n const nx = -d.y / len;\n const ny = d.x / len;\n return { x: at.x, y: at.y, tipX: at.x - nx * k * scale, tipY: at.y - ny * k * scale, curvature: k };\n}\n","/**\n * One spiral segment, fitted between two points so it leaves the first and\n * reaches the second at given angles to the chord. `solveSpiro` joins these\n * into a curvature-continuous spline.\n *\n * In its normalized frame the segment has unit arc length and, with\n * `u = s − ½`, tangent angle `φ = k0·u + (k1/2)·u² + (k2/6)·u³ + (k3/24)·u⁴`,\n * so its curvature is `k0 + k1·u + (k2/2)·u² + (k3/6)·u³`. An Euler spiral has\n * `k2 = k3 = 0`: its curvature changes linearly along it. A cubic-curvature\n * segment uses all four, which is what lets a G4 point keep the curvature's\n * first two derivatives continuous as well.\n */\nimport type { Point } from './cubicMath';\n\n/** The shape of a fitted segment, in its normalized frame. */\nexport interface EulerFit {\n k0: number;\n k1: number;\n /** Zero on an Euler spiral; set on a cubic-curvature segment. */\n k2: number;\n k3: number;\n /** Chord over arc length: the normalized segment's chord length. */\n ratio: number;\n /** The normalized chord's angle, which the world chord is rotated onto. */\n chordAngle: number;\n}\n\n/** Steps of the Simpson rule that integrates a segment's tangent. Even. */\nconst STEPS = 48;\n/** A chord-relative angle past this has no sensible spiral. */\nconst MAX_ANGLE = Math.PI * 0.95;\n\nconst clampAngle = (a: number): number => Math.max(-MAX_ANGLE, Math.min(MAX_ANGLE, a));\n\n/** `∫₀^upTo e^{iφ(s)} ds` for the normalized segment `(k0, k1, k2, k3)`. */\nexport function integrateEuler(k0: number, k1: number, upTo = 1, k2 = 0, k3 = 0): Point {\n const n = Math.max(2, Math.ceil((STEPS * upTo) / 2) * 2);\n const h = upTo / n;\n let x = 0;\n let y = 0;\n for (let i = 0; i <= n; i++) {\n const u = i * h - 0.5;\n const phi = k0 * u + u * u * (k1 / 2 + u * (k2 / 6 + (u * k3) / 24));\n const w = i === 0 || i === n ? 1 : i % 2 === 1 ? 4 : 2;\n x += w * Math.cos(phi);\n y += w * Math.sin(phi);\n }\n return { x: (x * h) / 3, y: (y * h) / 3 };\n}\n\n/** How far the start angle of `(k0, k1, k2, k3)` is from `th0`. */\nfunction startError(k0: number, k1: number, k2: number, k3: number, th0: number): number {\n const c = integrateEuler(k0, k1, 1, k2, k3);\n return -k0 / 2 + k1 / 8 - k2 / 48 + k3 / 384 - Math.atan2(c.y, c.x) - th0;\n}\n\n/**\n * The spiral leaving its chord at angle `th0` and reaching the far end at\n * angle `th1`, both measured from the chord, counterclockwise positive. With\n * `k2` and `k3` left at zero it is an Euler spiral; given, they are the\n * cubic-curvature segment's higher terms, and `k0` and `k1` are fitted around them.\n */\nexport function fitEulerSegment(th0: number, th1: number, k2 = 0, k3 = 0): EulerFit {\n const t0 = clampAngle(th0);\n const t1 = clampAngle(th1);\n // The odd terms set the total turn; the even ones bow the segment.\n const k0 = t1 - t0 - k2 / 24;\n // The small-angle solution, then Newton on the one remaining unknown.\n let k1 = 6 * (t0 + t1) - k3 / 40;\n for (let iter = 0; iter < 12; iter++) {\n const e = startError(k0, k1, k2, k3, t0);\n if (Math.abs(e) < 1e-12) break;\n const d = (startError(k0, k1 + 1e-6, k2, k3, t0) - e) / 1e-6;\n if (!Number.isFinite(d) || Math.abs(d) < 1e-12) break;\n k1 -= e / d;\n }\n const c = integrateEuler(k0, k1, 1, k2, k3);\n return { k0, k1, k2, k3, ratio: Math.hypot(c.x, c.y), chordAngle: Math.atan2(c.y, c.x) };\n}\n\n/** A fitted segment placed between two world points. */\nexport interface EulerSegment extends EulerFit {\n p0: Point;\n p1: Point;\n /** World arc length. */\n length: number;\n /** The world angle the normalized frame is turned by. */\n rotation: number;\n}\n\n/** `fit` placed so it runs from `p0` to `p1`. */\nexport function placeEulerSegment(fit: EulerFit, p0: Point, p1: Point): EulerSegment {\n const chord = Math.hypot(p1.x - p0.x, p1.y - p0.y);\n const length = fit.ratio > 1e-9 ? chord / fit.ratio : chord;\n const rotation = Math.atan2(p1.y - p0.y, p1.x - p0.x) - fit.chordAngle;\n return { ...fit, p0, p1, length, rotation };\n}\n\n/** The point at fraction `s` of the arc length along `seg`. */\nexport function eulerPointAt(seg: EulerSegment, s: number): Point {\n const c = integrateEuler(seg.k0, seg.k1, s, seg.k2, seg.k3);\n const cos = Math.cos(seg.rotation);\n const sin = Math.sin(seg.rotation);\n return {\n x: seg.p0.x + seg.length * (c.x * cos - c.y * sin),\n y: seg.p0.y + seg.length * (c.x * sin + c.y * cos),\n };\n}\n\n/** World tangent angle at fraction `s` of `seg`'s arc length. */\nexport function eulerAngleAt(seg: EulerSegment, s: number): number {\n const u = s - 0.5;\n return seg.rotation + seg.k0 * u + u * u * (seg.k1 / 2 + u * (seg.k2 / 6 + (u * seg.k3) / 24));\n}\n\n/** Normalized curvature at `u = s − ½`. */\nconst bendAt = (f: EulerFit, u: number): number => f.k0 + u * (f.k1 + u * (f.k2 / 2 + (u * f.k3) / 6));\n\n/** Signed world curvature at fraction `s` of `seg`'s arc length;\n * positive turns counterclockwise. */\nexport function eulerCurvatureAt(seg: EulerSegment, s: number): number {\n if (seg.length < 1e-12) return 0;\n return bendAt(seg, s - 0.5) / seg.length;\n}\n\n/** The first and second derivatives of `seg`'s world curvature with respect\n * to world arc length, at fraction `s` of it. */\nexport function eulerCurvatureDerivativesAt(seg: EulerSegment, s: number): [number, number] {\n if (seg.length < 1e-12) return [0, 0];\n const u = s - 0.5;\n return [\n (seg.k1 + u * (seg.k2 + (u * seg.k3) / 2)) / seg.length ** 2,\n (seg.k2 + u * seg.k3) / seg.length ** 3,\n ];\n}\n\nconst SAMPLES = 16;\n\n/** Handle lengths `[a, b]` along `u0`, `u1` that best fit `samples` at the\n * cubic parameters `ts`, by least squares. Null when the fit degenerates. */\nfunction fitHandleLengths(\n p0: Point, p1: Point, u0: Point, u1: Point, samples: readonly Point[], ts: readonly number[],\n): [number, number] | null {\n // B(t) = base(t) + a·3(1−t)²t·u0 − b·3(1−t)t²·u1, linear in a and b.\n let m00 = 0, m01 = 0, m11 = 0, r0 = 0, r1 = 0;\n samples.forEach((q, i) => {\n const t = ts[i];\n const mt = 1 - t;\n const b0 = mt * mt * mt + 3 * mt * mt * t;\n const b3 = 3 * mt * t * t + t * t * t;\n const ex = q.x - (b0 * p0.x + b3 * p1.x);\n const ey = q.y - (b0 * p0.y + b3 * p1.y);\n const f1 = 3 * mt * mt * t;\n const f2 = 3 * mt * t * t;\n const ax = f1 * u0.x, ay = f1 * u0.y;\n const bx = -f2 * u1.x, by = -f2 * u1.y;\n m00 += ax * ax + ay * ay;\n m01 += ax * bx + ay * by;\n m11 += bx * bx + by * by;\n r0 += ax * ex + ay * ey;\n r1 += bx * ex + by * ey;\n });\n const det = m00 * m11 - m01 * m01;\n if (Math.abs(det) < 1e-12) return null;\n const a = (r0 * m11 - r1 * m01) / det;\n const b = (m00 * r1 - m01 * r0) / det;\n return a > 0 && b > 0 && Number.isFinite(a) && Number.isFinite(b) ? [a, b] : null;\n}\n\n/** One Newton step moving `t` toward the point of the cubic nearest `q`. */\nfunction nearerT(p: readonly Point[], q: Point, t: number): number {\n const mt = 1 - t;\n const at = (c0: number, c1: number, c2: number, c3: number) =>\n mt * mt * mt * c0 + 3 * mt * mt * t * c1 + 3 * mt * t * t * c2 + t * t * t * c3;\n const d1 = (c0: number, c1: number, c2: number, c3: number) =>\n 3 * (mt * mt * (c1 - c0) + 2 * mt * t * (c2 - c1) + t * t * (c3 - c2));\n const d2 = (c0: number, c1: number, c2: number, c3: number) =>\n 6 * (mt * (c2 - 2 * c1 + c0) + t * (c3 - 2 * c2 + c1));\n const ex = at(p[0].x, p[1].x, p[2].x, p[3].x) - q.x;\n const ey = at(p[0].y, p[1].y, p[2].y, p[3].y) - q.y;\n const dx = d1(p[0].x, p[1].x, p[2].x, p[3].x);\n const dy = d1(p[0].y, p[1].y, p[2].y, p[3].y);\n const ddx = d2(p[0].x, p[1].x, p[2].x, p[3].x);\n const ddy = d2(p[0].y, p[1].y, p[2].y, p[3].y);\n const den = dx * dx + dy * dy + ex * ddx + ey * ddy;\n if (Math.abs(den) < 1e-12) return t;\n return Math.min(1, Math.max(0, t - (ex * dx + ey * dy) / den));\n}\n\n/**\n * The two control points of a cubic that follows `seg`: each handle lies on\n * the spiral's tangent at its end, with lengths fitted to points sampled along\n * the spiral by least squares, re-pairing each sample with its nearest cubic\n * parameter between rounds.\n */\nexport function eulerSegmentCubic(seg: EulerSegment): { c1: Point; c2: Point } {\n const { p0, p1 } = seg;\n const a0 = eulerAngleAt(seg, 0);\n const a1 = eulerAngleAt(seg, 1);\n const u0 = { x: Math.cos(a0), y: Math.sin(a0) };\n const u1 = { x: Math.cos(a1), y: Math.sin(a1) };\n const samples: Point[] = [];\n const ts: number[] = [];\n for (let i = 1; i < SAMPLES; i++) {\n samples.push(eulerPointAt(seg, i / SAMPLES));\n ts.push(i / SAMPLES);\n }\n const chord = Math.hypot(p1.x - p0.x, p1.y - p0.y);\n let lengths: [number, number] = [chord / 3, chord / 3];\n const handles = ([a, b]: [number, number]) => ({\n c1: { x: p0.x + a * u0.x, y: p0.y + a * u0.y },\n c2: { x: p1.x - b * u1.x, y: p1.y - b * u1.y },\n });\n for (let round = 0; round < 4; round++) {\n const fit = fitHandleLengths(p0, p1, u0, u1, samples, ts);\n if (!fit) break;\n lengths = fit;\n const { c1, c2 } = handles(lengths);\n const ctrl = [p0, c1, c2, p1];\n samples.forEach((q, i) => { ts[i] = nearerT(ctrl, q, ts[i]); });\n }\n return handles(lengths);\n}\n\n/** The stretch of `seg` from fraction `s0` to `s1` of its arc length, as a\n * segment of its own: a piece of an Euler spiral is one. */\nexport function subEulerSegment(seg: EulerSegment, s0: number, s1: number): EulerSegment {\n const d = s1 - s0;\n const m = (s0 + s1) / 2 - 0.5;\n // The curvature polynomial re-centered on the piece and scaled to its length.\n const k0 = bendAt(seg, m) * d;\n const k1 = (seg.k1 + m * (seg.k2 + (m * seg.k3) / 2)) * d ** 2;\n const k2 = (seg.k2 + m * seg.k3) * d ** 3;\n const k3 = seg.k3 * d ** 4;\n const c = integrateEuler(k0, k1, 1, k2, k3);\n const fit: EulerFit = { k0, k1, k2, k3, ratio: Math.hypot(c.x, c.y), chordAngle: Math.atan2(c.y, c.x) };\n return placeEulerSegment(fit, eulerPointAt(seg, s0), eulerPointAt(seg, s1));\n}\n\n/** How far the cubic `(seg.p0, c1, c2, seg.p1)` strays from `seg`, measured\n * at a few points along the spiral. */\nexport function eulerCubicError(seg: EulerSegment, c1: Point, c2: Point): number {\n const ctrl = [seg.p0, c1, c2, seg.p1];\n let worst = 0;\n for (const s of [0.2, 0.4, 0.5, 0.6, 0.8]) {\n const q = eulerPointAt(seg, s);\n let t = s;\n for (let i = 0; i < 4; i++) t = nearerT(ctrl, q, t);\n const mt = 1 - t;\n const x = mt * mt * mt * seg.p0.x + 3 * mt * mt * t * c1.x + 3 * mt * t * t * c2.x + t * t * t * seg.p1.x;\n const y = mt * mt * mt * seg.p0.y + 3 * mt * mt * t * c1.y + 3 * mt * t * t * c2.y + t * t * t * seg.p1.y;\n worst = Math.max(worst, Math.hypot(x - q.x, y - q.y));\n }\n return worst;\n}\n","/**\n * Spiro curves: a spline defined by on-curve points alone. Between each pair\n * of neighboring points runs an Euler-spiral segment (`eulerSpiral`), and the\n * segments are solved together so that, at every smooth point, both the\n * tangent and the curvature carry straight through. The curve has no handles\n * to tune; moving a point re-solves the whole curve.\n *\n * Each point's kind says what holds at it:\n *\n * | kind | at the point |\n * |---|---|\n * | `smooth` | tangent and curvature continue (G2); next to a straight segment, the curve leaves along the line |\n * | `g4` | tangent, curvature, and the curvature's first two derivatives continue (G4); otherwise as `smooth` |\n * | `corner` | the two sides are independent; each meets the point with zero curvature |\n * | `left` | the segment arriving is straight, and the curve leaving continues the line |\n * | `right` | the segment leaving is straight, and the curve arriving runs into the line |\n *\n * The ends of an open curve meet their points with zero curvature, as a\n * corner's sides do.\n *\n * A segment with a `g4` point at either end is a cubic-curvature segment,\n * with two more unknowns than an Euler spiral's two end tangents. A `g4`\n * point between two curved segments pays for its side's two with its two\n * extra equations; anywhere else, such a segment's curvature stops bending\n * at that end (its second derivative is zero there).\n */\nimport type { Point } from './cubicMath';\nimport {\n eulerAngleAt, eulerCurvatureAt, eulerCurvatureDerivativesAt, fitEulerSegment, placeEulerSegment,\n type EulerSegment,\n} from './eulerSpiral';\n\n/** What holds at a spiro point; see the table at the top of `spiro.ts`. */\nexport type SpiroKind = 'smooth' | 'g4' | 'corner' | 'left' | 'right';\n\n/** Every {@link SpiroKind}, in the order a picker lists them. */\nexport const SPIRO_KINDS: readonly SpiroKind[] = ['smooth', 'g4', 'corner', 'left', 'right'];\n\n/** One on-curve point of a spiro curve. */\nexport interface SpiroPoint {\n x: number;\n y: number;\n kind: SpiroKind;\n}\n\n/** One solved segment of a spiro curve: a straight line, or a placed Euler\n * spiral (`spiral`) between the two points. */\nexport interface SpiroSegment {\n from: Point;\n to: Point;\n spiral: EulerSegment | null;\n}\n\ntype Side = { kind: 'none' } | { kind: 'line'; angle: number } | { kind: 'curve'; seg: number };\n\nconst TAU = Math.PI * 2;\nconst wrap = (a: number): number => a - TAU * Math.round(a / TAU);\nconst angleOf = (p: Point, q: Point): number => Math.atan2(q.y - p.y, q.x - p.x);\nconst distance = (p: Point, q: Point): number => Math.hypot(q.x - p.x, q.y - p.y);\n\n/** Whether `kind` is one of the {@link SpiroKind}s. */\nexport function isSpiroKind(kind: unknown): kind is SpiroKind {\n return SPIRO_KINDS.includes(kind as SpiroKind);\n}\n\ninterface System {\n points: readonly SpiroPoint[];\n /** Segment `i` runs from point `i` to point `ends[i]`. */\n ends: number[];\n straight: boolean[];\n /** The first unknown slot of each curved segment (start tangent, end\n * tangent, then a cubic-curvature segment's two higher terms), or -1. */\n slot: number[];\n /** Whether each segment is a cubic-curvature one. */\n cubic: boolean[];\n unknowns: number;\n}\n\nfunction buildSystem(points: readonly SpiroPoint[], closed: boolean): System {\n const n = points.length;\n const count = closed ? n : n - 1;\n const ends: number[] = [];\n const straight: boolean[] = [];\n const slot: number[] = [];\n const cubic: boolean[] = [];\n let unknowns = 0;\n for (let i = 0; i < count; i++) {\n const j = (i + 1) % n;\n ends.push(j);\n const line = points[i].kind === 'right' || points[j].kind === 'left'\n || distance(points[i], points[j]) < 1e-9;\n straight.push(line);\n slot.push(line ? -1 : unknowns);\n const higher = !line && (points[i].kind === 'g4' || points[j].kind === 'g4');\n cubic.push(higher);\n if (!line) unknowns += higher ? 4 : 2;\n }\n return { points, ends, straight, slot, cubic, unknowns };\n}\n\nfunction sides(sys: System, closed: boolean, i: number): [Side, Side] {\n const n = sys.points.length;\n const count = sys.ends.length;\n const side = (seg: number): Side => {\n if (seg < 0 || seg >= count) return { kind: 'none' };\n if (sys.straight[seg]) return { kind: 'line', angle: angleOf(sys.points[seg], sys.points[sys.ends[seg]]) };\n return { kind: 'curve', seg };\n };\n const into = i > 0 ? i - 1 : closed ? n - 1 : -1;\n const outOf = closed || i < n - 1 ? i : -1;\n return [side(into), side(outOf)];\n}\n\ninterface Fitted { seg: EulerSegment; chord: number; startAngle: number; endAngle: number; cubic: boolean }\n\nfunction fitSegment(sys: System, s: number, x: readonly number[]): Fitted {\n const p0 = sys.points[s];\n const p1 = sys.points[sys.ends[s]];\n const chord = angleOf(p0, p1);\n const k = sys.slot[s];\n const fit = sys.cubic[s]\n ? fitEulerSegment(wrap(x[k] - chord), wrap(x[k + 1] - chord), x[k + 2], x[k + 3])\n : fitEulerSegment(wrap(x[k] - chord), wrap(x[k + 1] - chord));\n const seg = placeEulerSegment(fit, p0, p1);\n const startAngle = eulerAngleAt(seg, 0);\n return { seg, chord: distance(p0, p1), startAngle, endAngle: eulerAngleAt(seg, 1), cubic: sys.cubic[s] };\n}\n\n/** Curvature at one end of `f`, times its chord so every equation is on one scale. */\nconst bend = (f: Fitted, at: 0 | 1): number => eulerCurvatureAt(f.seg, at) * f.chord;\n\n/** The second derivative of curvature at one end of `f`, on the same scale. */\nconst twist = (f: Fitted, at: 0 | 1): number => eulerCurvatureDerivativesAt(f.seg, at)[1] * f.chord ** 3;\n\n/** Angle, curvature, and the curvature's first two derivatives matched where\n * `fa` ends and `fb` begins. */\nfunction g4Join(fa: Fitted, fb: Fitted): number[] {\n const scale = (fa.chord + fb.chord) / 2;\n const [a1, a2] = eulerCurvatureDerivativesAt(fa.seg, 1);\n const [b1, b2] = eulerCurvatureDerivativesAt(fb.seg, 0);\n return [\n wrap(fa.endAngle - fb.startAngle),\n (eulerCurvatureAt(fa.seg, 1) - eulerCurvatureAt(fb.seg, 0)) * scale,\n (a1 - b1) * scale ** 2,\n (a2 - b2) * scale ** 3,\n ];\n}\n\nfunction residuals(sys: System, closed: boolean, fits: readonly Fitted[]): number[] {\n const out: number[] = [];\n const fitOf = (side: Side): Fitted => fits[(side as { seg: number }).seg];\n for (let i = 0; i < sys.points.length; i++) {\n const [a, b] = sides(sys, closed, i);\n const kind = sys.points[i].kind;\n const ac = a.kind === 'curve';\n const bc = b.kind === 'curve';\n if (!ac && !bc) continue;\n if (kind === 'g4' && ac && bc) {\n out.push(...g4Join(fitOf(a), fitOf(b)));\n continue;\n }\n if (kind === 'smooth' && ac && bc) {\n const fa = fitOf(a), fb = fitOf(b);\n out.push(...g4Join(fa, fb).slice(0, 2));\n if (fa.cubic) out.push(twist(fa, 1));\n if (fb.cubic) out.push(twist(fb, 0));\n continue;\n }\n // One curved side from here on, or a corner's two independent ones.\n for (const [side, other, at] of [[a, b, 1], [b, a, 0]] as const) {\n if (side.kind !== 'curve') continue;\n const f = fitOf(side);\n const angle = at === 1 ? f.endAngle : f.startAngle;\n const followsLine = other.kind === 'line' && kind !== 'corner';\n out.push(followsLine ? wrap(angle - other.angle) : bend(f, at));\n if (f.cubic) out.push(twist(f, at));\n }\n }\n return out;\n}\n\n/** A starting tangent at each point: along the bisector of its two chords. */\nfunction initialGuess(sys: System, closed: boolean): number[] {\n const x = new Array<number>(sys.unknowns).fill(0);\n const n = sys.points.length;\n const tangentAt = (i: number, seg: number): number => {\n const chord = angleOf(sys.points[seg], sys.points[sys.ends[seg]]);\n const [a, b] = sides(sys, closed, i);\n if (sys.points[i].kind === 'corner' || a.kind === 'none' || b.kind === 'none') return chord;\n if (a.kind === 'line') return a.angle;\n if (b.kind === 'line') return b.angle;\n const prev = sys.points[(i - 1 + n) % n];\n const next = sys.points[(i + 1) % n];\n const pin = angleOf(prev, sys.points[i]);\n const pout = angleOf(sys.points[i], next);\n return pin + wrap(pout - pin) / 2;\n };\n for (let s = 0; s < sys.ends.length; s++) {\n const k = sys.slot[s];\n if (k < 0) continue;\n x[k] = tangentAt(s, s);\n x[k + 1] = tangentAt(sys.ends[s], s);\n }\n return x;\n}\n\n/** Solve `m · d = r` in place by Gaussian elimination with partial pivoting. */\nfunction solveLinear(m: number[][], r: number[]): number[] | null {\n const n = r.length;\n for (let c = 0; c < n; c++) {\n let p = c;\n for (let i = c + 1; i < n; i++) if (Math.abs(m[i][c]) > Math.abs(m[p][c])) p = i;\n if (Math.abs(m[p][c]) < 1e-14) return null;\n [m[c], m[p]] = [m[p], m[c]];\n [r[c], r[p]] = [r[p], r[c]];\n for (let i = c + 1; i < n; i++) {\n const f = m[i][c] / m[c][c];\n if (f === 0) continue;\n for (let j = c; j < n; j++) m[i][j] -= f * m[c][j];\n r[i] -= f * r[c];\n }\n }\n const out = new Array<number>(n).fill(0);\n for (let i = n - 1; i >= 0; i--) {\n let v = r[i];\n for (let j = i + 1; j < n; j++) v -= m[i][j] * out[j];\n out[i] = v / m[i][i];\n }\n return out;\n}\n\nconst norm = (v: readonly number[]): number => Math.sqrt(v.reduce((s, e) => s + e * e, 0));\n\n/**\n * Solve the spiro curve through `points`. A closed curve has a segment from\n * the last point back to the first. Fewer than two points make no segments.\n */\nexport function solveSpiro(points: readonly SpiroPoint[], closed: boolean): SpiroSegment[] {\n if (points.length < 2) return [];\n const sys = buildSystem(points, closed && points.length > 2);\n const isClosed = closed && points.length > 2;\n let x = initialGuess(sys, isClosed);\n const fitAll = (v: readonly number[]): Fitted[] =>\n sys.ends.map((_, s) => (sys.slot[s] < 0 ? (null as unknown as Fitted) : fitSegment(sys, s, v)));\n let fits = fitAll(x);\n let r = residuals(sys, isClosed, fits);\n for (let iter = 0; iter < 40 && sys.unknowns > 0; iter++) {\n const err = norm(r);\n if (err < 1e-10) break;\n // Each unknown moves only its own segment, so a column refits one segment.\n const jac = r.map(() => new Array<number>(sys.unknowns).fill(0));\n for (let s = 0; s < sys.ends.length; s++) {\n const k = sys.slot[s];\n if (k < 0) continue;\n for (let u = k; u < k + (sys.cubic[s] ? 4 : 2); u++) {\n const h = 1e-6;\n const xs = x.slice();\n xs[u] += h;\n const moved = fits.slice();\n moved[s] = fitSegment(sys, s, xs);\n const rs = residuals(sys, isClosed, moved);\n for (let e = 0; e < r.length; e++) jac[e][u] = (rs[e] - r[e]) / h;\n }\n }\n const step = solveLinear(jac, r.map((v) => -v));\n if (!step) break;\n // Halve the step until it lowers the error.\n let t = 1;\n let accepted = false;\n for (let tries = 0; tries < 12; tries++, t /= 2) {\n const xt = x.map((v, i) => v + t * step[i]);\n const ft = fitAll(xt);\n const rt = residuals(sys, isClosed, ft);\n if (norm(rt) < err) {\n x = xt; fits = ft; r = rt; accepted = true;\n break;\n }\n }\n if (!accepted) break;\n }\n return sys.ends.map((end, s) => ({\n from: { x: points[s].x, y: points[s].y },\n to: { x: points[end].x, y: points[end].y },\n spiral: sys.slot[s] < 0 ? null : fits[s].seg,\n }));\n}\n","/**\n * Spiro curves as cubic paths, and back. A solved curve is written as cubics,\n * each spiral segment split into as many as it takes to stay within tolerance,\n * so most anchors of the path are not spiro points. `at` records which are:\n * `at[i]` is the flat anchor index of point `i`, counted across subpaths. The\n * points are then read back out of the path itself, so whatever moves the path\n * — a move, a resize, a rotation — moves them with it.\n */\nimport type { PolygonPath } from '../path';\nimport { anchorsToPath, pathToAnchors, type PenAnchor } from './anchors';\nimport { eulerCubicError, eulerSegmentCubic, subEulerSegment, type EulerSegment } from './eulerSpiral';\nimport { solveSpiro, type SpiroKind, type SpiroPoint } from './spiro';\n\n/** One subpath of a spiro curve: its points, and whether it closes. */\nexport interface SpiroContour {\n points: SpiroPoint[];\n closed: boolean;\n}\n\n/** A spiro curve written as a cubic path, with the anchor each point became. */\nexport interface SpiroPath {\n path: PolygonPath;\n /** The flat anchor index of each point, in contour order. */\n at: number[];\n}\n\n/** Options for {@link spiroToPath}. */\nexport interface SpiroToPathOptions {\n /** The furthest a cubic may stray from its spiral, as a fraction of that\n * segment's arc length. Default `1e-4`. */\n tolerance?: number;\n /** The path being reshaped, whose fill rules the result keeps. */\n like?: PolygonPath;\n}\n\nconst MAX_PIECES = 16;\n\ninterface Piece { end: EulerSegment; c1: { x: number; y: number }; c2: { x: number; y: number } }\n\n/** `spiral` as the fewest equal pieces whose cubics all stay within `tol`. */\nfunction cubicPieces(spiral: EulerSegment, tol: number): Piece[] {\n let best: Piece[] = [];\n for (let m = 1; m <= MAX_PIECES; m++) {\n best = [];\n let fits = true;\n for (let j = 0; j < m; j++) {\n const piece = m === 1 ? spiral : subEulerSegment(spiral, j / m, (j + 1) / m);\n const { c1, c2 } = eulerSegmentCubic(piece);\n best.push({ end: piece, c1, c2 });\n if (eulerCubicError(piece, c1, c2) > tol * spiral.length) fits = false;\n }\n if (fits) break;\n }\n return best;\n}\n\nfunction contourAnchors(c: SpiroContour, tol: number): { anchors: PenAnchor[]; at: number[] } {\n const anchors: PenAnchor[] = [];\n const at: number[] = [];\n const segments = solveSpiro(c.points, c.closed);\n // The handle the last piece of a segment arrives with, for the point after it.\n let arriving: { x: number; y: number } | null = null;\n c.points.forEach((p, i) => {\n at.push(anchors.length);\n anchors.push({ x: p.x, y: p.y, ...(arriving ? { inHandle: arriving } : {}) });\n arriving = null;\n const spiral = segments[i]?.spiral;\n if (!spiral) return;\n const pieces = cubicPieces(spiral, tol);\n pieces.forEach((piece, j) => {\n anchors[anchors.length - 1].outHandle = { x: piece.c1.x, y: piece.c1.y };\n const c2 = { x: piece.c2.x, y: piece.c2.y };\n if (j < pieces.length - 1) anchors.push({ x: piece.end.p1.x, y: piece.end.p1.y, inHandle: c2 });\n else arriving = c2;\n });\n });\n if (arriving) anchors[0].inHandle = arriving;\n return { anchors, at };\n}\n\n/**\n * Solve each contour and write it as a cubic path. Straight segments carry no\n * handles.\n */\nexport function spiroToPath(contours: readonly SpiroContour[], options: SpiroToPathOptions = {}): SpiroPath {\n const tol = options.tolerance ?? 1e-4;\n const subs: PenAnchor[][] = [];\n const closed: boolean[] = [];\n const at: number[] = [];\n let base = 0;\n for (const c of contours) {\n if (c.points.length === 0) continue;\n const written = contourAnchors(c, tol);\n subs.push(written.anchors);\n closed.push(c.closed && c.points.length > 2);\n at.push(...written.at.map((i) => i + base));\n base += written.anchors.length;\n }\n return { path: anchorsToPath(subs, closed, options.like), at };\n}\n\n/**\n * The spiro points `path` holds, given the kind of each and the anchor each\n * became. Null when `kinds` and `at` do not describe `path`: the counts\n * differ, an index is out of order or out of range, or a subpath does not\n * start on a point.\n */\nexport function spiroContoursOf(\n path: PolygonPath,\n kinds: readonly SpiroKind[],\n at: readonly number[],\n): SpiroContour[] | null {\n if (kinds.length !== at.length || at.length === 0) return null;\n const { anchors, closed } = pathToAnchors(path);\n const contours: SpiroContour[] = [];\n let flat = 0;\n let k = 0;\n for (let s = 0; s < anchors.length; s++) {\n const sub = anchors[s];\n if (at[k] !== flat) return null;\n const points: SpiroPoint[] = [];\n while (k < at.length && at[k] < flat + sub.length) {\n if (k > 0 && at[k] <= at[k - 1]) return null;\n const a = sub[at[k] - flat];\n points.push({ x: a.x, y: a.y, kind: kinds[k] });\n k++;\n }\n contours.push({ points, closed: closed[s] });\n flat += sub.length;\n }\n return k === at.length ? contours : null;\n}\n\n/** The straight-sided path through each contour's points: what an editor\n * shows and moves in place of the curve. */\nexport function spiroControlPath(contours: readonly SpiroContour[]): PolygonPath {\n return anchorsToPath(\n contours.map((c) => c.points.map((p) => ({ x: p.x, y: p.y }))),\n contours.map((c) => c.closed),\n );\n}\n\nconst key = (x: number, y: number): string => `${Math.round(x * 1e3)},${Math.round(y * 1e3)}`;\n\n/**\n * Read an edited control path back as contours: every anchor is a point.\n * Kinds follow from `before`, the contours the edit started from: point for\n * point when the count is unchanged, else by position, with an anchor that\n * lands nowhere a point was taking `fallback`. Handles are ignored.\n */\nexport function spiroContoursFromControl(\n control: PolygonPath,\n before: readonly SpiroContour[],\n fallback: SpiroKind = 'smooth',\n): SpiroContour[] {\n const { anchors, closed } = pathToAnchors(control);\n const old = before.flatMap((c) => c.points);\n const count = anchors.reduce((n, sub) => n + sub.length, 0);\n const byPlace = new Map<string, SpiroKind>();\n for (const p of old) if (!byPlace.has(key(p.x, p.y))) byPlace.set(key(p.x, p.y), p.kind);\n let i = 0;\n return anchors.map((sub, s) => ({\n closed: closed[s],\n points: sub.map((a) => {\n const kind = count === old.length ? old[i].kind : byPlace.get(key(a.x, a.y)) ?? fallback;\n i++;\n return { x: a.x, y: a.y, kind };\n }),\n }));\n}\n"]}