@weasel-js/geom 1.13.0 → 1.14.1

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 (50) hide show
  1. package/README.md +6 -2
  2. package/dist/3d/index.d.ts +8 -1
  3. package/dist/3d/index.js +25 -1
  4. package/dist/3d/index.js.map +1 -1
  5. package/dist/booleans/index.d.ts +6 -5
  6. package/dist/booleans/index.js +583 -73
  7. package/dist/booleans/index.js.map +1 -1
  8. package/dist/{chunk-CE7IY7TB.js → chunk-2N6OWA7E.js} +3 -3
  9. package/dist/{chunk-CE7IY7TB.js.map → chunk-2N6OWA7E.js.map} +1 -1
  10. package/dist/{chunk-Q66NA2FU.js → chunk-3HQJGI63.js} +8 -5
  11. package/dist/chunk-3HQJGI63.js.map +1 -0
  12. package/dist/{chunk-YPWFGFQX.js → chunk-3YH5XU3H.js} +125 -8
  13. package/dist/chunk-3YH5XU3H.js.map +1 -0
  14. package/dist/{chunk-UI3FUWXM.js → chunk-42TZDN5C.js} +4 -4
  15. package/dist/{chunk-UI3FUWXM.js.map → chunk-42TZDN5C.js.map} +1 -1
  16. package/dist/{chunk-B53BERKG.js → chunk-B3D6KWW3.js} +110 -8
  17. package/dist/chunk-B3D6KWW3.js.map +1 -0
  18. package/dist/{chunk-2PKPKU4P.js → chunk-EURWZUNY.js} +25 -22
  19. package/dist/chunk-EURWZUNY.js.map +1 -0
  20. package/dist/{chunk-VHXOCDZ2.js → chunk-FROQPADA.js} +6 -6
  21. package/dist/{chunk-VHXOCDZ2.js.map → chunk-FROQPADA.js.map} +1 -1
  22. package/dist/{chunk-UGE57OTX.js → chunk-GWSJQSQE.js} +11 -8
  23. package/dist/chunk-GWSJQSQE.js.map +1 -0
  24. package/dist/chunk-XXNK4N7Z.js +683 -0
  25. package/dist/chunk-XXNK4N7Z.js.map +1 -0
  26. package/dist/chunk-ZOMUTU7J.js +249 -0
  27. package/dist/chunk-ZOMUTU7J.js.map +1 -0
  28. package/dist/{curvature-PkoLduGc.d.ts → curvature-CDOI32hv.d.ts} +46 -3
  29. package/dist/curves/index.d.ts +2 -2
  30. package/dist/curves/index.js +4 -4
  31. package/dist/index.d.ts +172 -45
  32. package/dist/index.js +244 -178
  33. package/dist/index.js.map +1 -1
  34. package/dist/nd/index.d.ts +28 -1
  35. package/dist/nd/index.js +27 -675
  36. package/dist/nd/index.js.map +1 -1
  37. package/dist/{path-BW8d_2RY.d.ts → path-t80OoJnM.d.ts} +11 -0
  38. package/dist/tessellate/index.d.ts +11 -4
  39. package/dist/tessellate/index.js +4 -4
  40. package/dist/warp/index.d.ts +1 -1
  41. package/dist/warp/index.js +238 -64
  42. package/dist/warp/index.js.map +1 -1
  43. package/package.json +1 -1
  44. package/dist/chunk-2PKPKU4P.js.map +0 -1
  45. package/dist/chunk-B53BERKG.js.map +0 -1
  46. package/dist/chunk-Q66NA2FU.js.map +0 -1
  47. package/dist/chunk-STGSBIOL.js +0 -152
  48. package/dist/chunk-STGSBIOL.js.map +0 -1
  49. package/dist/chunk-UGE57OTX.js.map +0 -1
  50. package/dist/chunk-YPWFGFQX.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@weasel-js/geom",
3
- "version": "1.13.0",
3
+ "version": "1.14.1",
4
4
  "description": "Pure geometry kernel for @weasel-js/core: affine, box, curve, polyline, the Path command stream and its math, and easing curves in 2D. Dependency-free core; curve representations in ./curves, tessellation in ./tessellate (earcut), polygon booleans and path splitting in ./booleans (polygon-clipping), vectors, quaternions, 4x4 matrices and ray intersection in ./3d, and dimension-generic snapping and a BVH (bounding volume hierarchy) for box, point, ray and half-space queries in ./nd.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -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-2PKPKU4P.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';\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, coords } = 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 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 a control polygon turns `maxTurn` radians or less in all, skipping\n * zero-length legs. Its turn bounds the turn of the curve it controls, so it\n * bounds the corner a chord standing in for that curve can leave. */\nfunction turnsWithin(\n x0: number, y0: number, x1: number, y1: number,\n x2: number, y2: number, x3: number, y3: number,\n maxTurn: number,\n): boolean {\n let turn = legTurn(x1 - x0, y1 - y0, x2 - x1, y2 - y1);\n if (turn > maxTurn) return false;\n turn += 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 return turn <= maxTurn;\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]. `maxTurn`, in radians, also bounds how far each\n * piece's control polygon may turn.\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 maxTurn = Infinity,\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), maxTurn, 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 maxTurn: 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 && (maxTurn === Infinity || turnsWithin(x0, y0, x1, y1, x2, y2, x3, y3, maxTurn));\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, maxTurn, out, arcOut, accum, depth + 1);\n accum = flattenCubicArcRec(x0123, y0123, x123, y123, x23, y23, x3, y3, tolerance, maxTurn, 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 maxTurn = Infinity,\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), maxTurn, 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 maxTurn: 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 && (maxTurn === Infinity || turnsWithin(x0, y0, x1, y1, x2, y2, x2, y2, maxTurn));\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, maxTurn, out, arcOut, accum, depth + 1);\n accum = flattenQuadraticArcRec(x012, y012, x12, y12, x2, y2, tolerance, maxTurn, 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/box.ts","../src/commands.ts","../src/curve.ts","../src/paths/builder.ts","../src/paths/cornerSpec.ts","../src/paths/cubicMath.ts"],"names":[],"mappings":"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","file":"chunk-B53BERKG.js","sourcesContent":["/** Axis-aligned box as [minX, minY, maxX, maxY]. */\nexport type Box = readonly [number, number, number, number];\n\n/** An axis-aligned rectangle in object form. `Box` is the tuple form; this is\n * the one that survives being read by a human. */\nexport interface Rect { x: number; y: number; width: number; height: number }\n\n/** Tight bounds of an interleaved coord stream, or null if empty. */\nexport function boundsOfCoords(coords: ArrayLike<number>): Box | null {\n if (coords.length < 2) return null;\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (let i = 0; i + 1 < coords.length; i += 2) {\n const x = coords[i], y = coords[i + 1];\n if (x < minX) minX = x;\n if (y < minY) minY = y;\n if (x > maxX) maxX = x;\n if (y > maxY) maxY = y;\n }\n return [minX, minY, maxX, maxY];\n}\n\n/** Smallest box containing both inputs. */\nexport function unionBox(a: Box, b: Box): Box {\n return [\n Math.min(a[0], b[0]),\n Math.min(a[1], b[1]),\n Math.max(a[2], b[2]),\n Math.max(a[3], b[3]),\n ];\n}\n\n/** Inclusive point-in-box test. */\nexport function boxContainsPoint(b: Box, x: number, y: number): boolean {\n return x >= b[0] && x <= b[2] && y >= b[1] && y <= b[3];\n}\n\n/** Whether `outer` wholly holds `inner`, edges inclusive. Two boxes that merely\n * overlap answer false. */\nexport function boxContainsBox(outer: Box, inner: Box): boolean {\n return inner[0] >= outer[0] && inner[1] >= outer[1] && inner[2] <= outer[2] && inner[3] <= outer[3];\n}\n\n/** Interleaved corner ring for a rect at (x,y,w,h), wound clockwise from the\n * origin corner. The closing edge is implicit — the same unclosed shape\n * `pointInPolygon` takes, and what a repeated first vertex would leave as a\n * zero-length segment for anything that strokes it. */\nexport function rectToContour(x: number, y: number, w: number, h: number): Float64Array {\n return Float64Array.of(x, y, x + w, y, x + w, y + h, x, y + h);\n}\n","/**\n * SVG-style command-stream encoding — the kit's single declaration of the path\n * opcodes.\n *\n * The codes index a `Uint8Array` command stream whose coords live in a\n * parallel float array, so a code declared anywhere but `PATH_COMMANDS` makes\n * every walker that doesn't know it misread the coord stream from that command\n * on — silently, for every path.\n */\n\n/** Opcode table: command code and the float coords it consumes. */\nexport const PATH_COMMANDS = {\n /** moveTo — opens a new subpath. */\n M: { code: 0, coords: 2 },\n /** Straight segment from the pen to the next coord pair. */\n L: { code: 1, coords: 2 },\n /** Cubic bezier: two control points then the endpoint. */\n C: { code: 2, coords: 6 },\n /** Quadratic bezier: one control point then the endpoint. */\n Q: { code: 3, coords: 4 },\n /** Close the current subpath back to its start. Consumes no coords and\n * leaves the pen where it is. */\n Z: { code: 4, coords: 0 },\n} as const;\n\n/** Mnemonic of a declared command (`'M' | 'L' | …`). */\nexport type PathCommandName = keyof typeof PATH_COMMANDS;\n/** Numeric code of a declared command. */\nexport type PathCommandCode = (typeof PATH_COMMANDS)[PathCommandName]['code'];\n\n/** Command code of `M` (moveTo). */\nexport const PATH_M = PATH_COMMANDS.M.code;\n/** Command code of `L` (lineTo). */\nexport const PATH_L = PATH_COMMANDS.L.code;\n/** Command code of `C` (cubic bezier). */\nexport const PATH_C = PATH_COMMANDS.C.code;\n/** Command code of `Q` (quadratic bezier). */\nexport const PATH_Q = PATH_COMMANDS.Q.code;\n/** Command code of `Z` (close subpath). */\nexport const PATH_Z = PATH_COMMANDS.Z.code;\n\n/** Float coords consumed by each command, indexed by command code. */\nexport const PATH_CMD_LENGTHS: readonly number[] = buildCmdLengths();\n\nfunction buildCmdLengths(): number[] {\n const lengths: number[] = [];\n for (const { code, coords } of Object.values(PATH_COMMANDS)) lengths[code] = coords;\n return lengths;\n}\n\n/** Float coords consumed by the command with this code. */\nexport function pathCommandCoordCount(cmd: number): number {\n return PATH_CMD_LENGTHS[cmd];\n}\n\n/**\n * Visit each command with its coord offset and the pen position BEFORE the\n * command consumes its coords (the segment start). The callback stops the\n * walk by returning `false`. `Z` returns the pen to the subpath's opening `M`.\n *\n * A command following a `Z` without an intervening `M` opens a new subpath at\n * the pen, as does a drawing command no `M` precedes at all. The visitor is\n * told with `opensSubpath`, and has to start its contour at `(penX, penY)`\n * then: there is no `M` to do it.\n *\n * A code `PATH_COMMANDS` does not declare throws once the visitor has seen it.\n */\nexport function forEachSegment(\n commands: ArrayLike<number>,\n coords: ArrayLike<number>,\n visit: (\n cmd: number,\n coordIndex: number,\n penX: number,\n penY: number,\n commandIndex: number,\n opensSubpath: boolean,\n ) => void | boolean,\n): void {\n let ci = 0;\n let px = 0, py = 0;\n let startX = 0, startY = 0;\n let open = false;\n for (let i = 0; i < commands.length; i++) {\n const cmd = commands[i];\n const opens = !open && cmd !== PATH_M && cmd !== PATH_Z;\n if (opens) { startX = px; startY = py; }\n open = cmd !== PATH_Z;\n if (visit(cmd, ci, px, py, i, opens) === false) return;\n const len = pathCommandCoordCount(cmd);\n if (len === undefined) throw new Error(`forEachSegment: unknown command code ${cmd}`);\n if (len > 0) {\n px = coords[ci + len - 2];\n py = coords[ci + len - 1];\n ci += len;\n if (cmd === PATH_M) { startX = px; startY = py; }\n } else if (cmd === PATH_Z) {\n px = startX; py = startY;\n }\n }\n}\n","import type { Box } from './box';\n\n/** Cubic Bezier point at parameter t (de Casteljau / Bernstein form). */\nexport function cubicEvalAt(\n x0: number, y0: number, x1: number, y1: number,\n x2: number, y2: number, x3: number, y3: number, t: number,\n): [number, number] {\n const u = 1 - t;\n const a = u * u * u, b = 3 * u * u * t, c = 3 * u * t * t, d = t * t * t;\n return [\n a * x0 + b * x1 + c * x2 + d * x3,\n a * y0 + b * y1 + c * y2 + d * y3,\n ];\n}\n\n/**\n * Degree-elevate a quadratic (q0, ctrl, q1) to a cubic. Returns the two\n * cubic control points [c1x, c1y, c2x, c2y]; the cubic endpoints equal the\n * quadratic endpoints. c1 = q0 + 2/3(ctrl-q0), c2 = q1 + 2/3(ctrl-q1).\n */\nexport function elevateQuadraticToCubic(\n q0x: number, q0y: number, cx: number, cy: number, q1x: number, q1y: number,\n): [number, number, number, number] {\n return [\n q0x + (2 / 3) * (cx - q0x),\n q0y + (2 / 3) * (cy - q0y),\n q1x + (2 / 3) * (cx - q1x),\n q1y + (2 / 3) * (cy - q1y),\n ];\n}\n\n/** The parameters in (0, 1) where one coordinate of a cubic, with control\n * values `p0..p3`, turns: the roots of its derivative. */\nexport function cubicAxisExtremaTs(p0: number, p1: number, p2: number, p3: number): number[] {\n // B'(t)=0 → quadratic a t² + b t + c = 0 with:\n const a = -p0 + 3 * p1 - 3 * p2 + p3;\n const b = 2 * (p0 - 2 * p1 + p2);\n const c = -p0 + p1;\n const ts: number[] = [];\n const push = (t: number) => { if (t > 0 && t < 1) ts.push(t); };\n if (Math.abs(a) < 1e-12) {\n if (Math.abs(b) > 1e-12) push(-c / b);\n } else {\n const disc = b * b - 4 * a * c;\n if (disc >= 0) {\n const sq = Math.sqrt(disc);\n push((-b + sq) / (2 * a));\n push((-b - sq) / (2 * a));\n }\n }\n return ts;\n}\n\n/** Tight AABB of a cubic, evaluating only extrema that lie on the curve. */\nexport function cubicBounds(\n x0: number, y0: number, x1: number, y1: number,\n x2: number, y2: number, x3: number, y3: number,\n): Box {\n let minX = Math.min(x0, x3), maxX = Math.max(x0, x3);\n let minY = Math.min(y0, y3), maxY = Math.max(y0, y3);\n for (const t of cubicAxisExtremaTs(x0, x1, x2, x3)) {\n const [ex] = cubicEvalAt(x0, y0, x1, y1, x2, y2, x3, y3, t);\n if (ex < minX) minX = ex;\n if (ex > maxX) maxX = ex;\n }\n for (const t of cubicAxisExtremaTs(y0, y1, y2, y3)) {\n const [, ey] = cubicEvalAt(x0, y0, x1, y1, x2, y2, x3, y3, t);\n if (ey < minY) minY = ey;\n if (ey > maxY) maxY = ey;\n }\n return [minX, minY, maxX, maxY];\n}\n\n/** Quadratic Bezier point at parameter t (Bernstein form). */\nexport function quadraticEvalAt(\n x0: number, y0: number, x1: number, y1: number, x2: number, y2: number, t: number,\n): [number, number] {\n const u = 1 - t;\n const a = u * u, b = 2 * u * t, c = t * t;\n return [a * x0 + b * x1 + c * x2, a * y0 + b * y1 + c * y2];\n}\n\n/** A line segment's coords: start, end. */\nexport type LineCoords = [number, number, number, number];\n/** A quadratic Bezier's coords: start, control, end. */\nexport type QuadraticCoords = [number, number, number, number, number, number];\n/** A cubic Bezier's coords: start, two controls, end. */\nexport type CubicCoords = [number, number, number, number, number, number, number, number];\n\n/**\n * Split a cubic at parameter t (de Casteljau). The two halves share the point\n * at t and together trace the original exactly. A t outside [0, 1] splits the\n * curve's polynomial extension.\n */\nexport function splitCubicAt(\n x0: number, y0: number, x1: number, y1: number,\n x2: number, y2: number, x3: number, y3: number, t: number,\n): [CubicCoords, CubicCoords] {\n const ax = x0 + (x1 - x0) * t, ay = y0 + (y1 - y0) * t;\n const bx = x1 + (x2 - x1) * t, by = y1 + (y2 - y1) * t;\n const cx = x2 + (x3 - x2) * t, cy = y2 + (y3 - y2) * t;\n const dx = ax + (bx - ax) * t, dy = ay + (by - ay) * t;\n const ex = bx + (cx - bx) * t, ey = by + (cy - by) * t;\n const mx = dx + (ex - dx) * t, my = dy + (ey - dy) * t;\n return [[x0, y0, ax, ay, dx, dy, mx, my], [mx, my, ex, ey, cx, cy, x3, y3]];\n}\n\n/** Split a quadratic at parameter t (de Casteljau). See {@link splitCubicAt}. */\nexport function splitQuadraticAt(\n x0: number, y0: number, x1: number, y1: number, x2: number, y2: number, t: number,\n): [QuadraticCoords, QuadraticCoords] {\n const ax = x0 + (x1 - x0) * t, ay = y0 + (y1 - y0) * t;\n const bx = x1 + (x2 - x1) * t, by = y1 + (y2 - y1) * t;\n const mx = ax + (bx - ax) * t, my = ay + (by - ay) * t;\n return [[x0, y0, ax, ay, mx, my], [mx, my, bx, by, x2, y2]];\n}\n\n/** Split a line segment at parameter t. See {@link splitCubicAt}. */\nexport function splitLineAt(\n x0: number, y0: number, x1: number, y1: number, t: number,\n): [LineCoords, LineCoords] {\n const mx = x0 + (x1 - x0) * t, my = y0 + (y1 - y0) * t;\n return [[x0, y0, mx, my], [mx, my, x1, y1]];\n}\n","/**\n * Fluent builder for `PolygonPath`. Hides the `Uint8Array` / `Float32Array`\n * encoding behind move/line/curve/close calls and a final `build()`. Use\n * this to construct paths in tests and demos; production callers that need\n * to mutate large paths in place should reach for the raw arrays directly.\n *\n * Numeric capacity grows by doubling — typical for amortized O(1) push.\n *\n * Also exposes `rectPath` / `polygonFromPoints` shortcuts for the common\n * cases. `rectPath` returns the lighter `RectPath` subtype, not a polygon.\n */\n\nimport { rectToContour } from '../box';\nimport { PATH_C, PATH_L, PATH_M, PATH_Q, PATH_Z } from '../commands';\nimport type { Path, PathFillRule, PolygonPath, RectPath } from '../path';\n\n/** Fluent builder for `PolygonPath`; hides the `Uint8Array`/`Float32Array` encoding behind move/line/curve/close calls. */\nexport class PathBuilder {\n private cmds: number[] = [];\n private xs: number[] = [];\n private fillRule: PathFillRule = 'nonzero';\n\n /** Seed a builder with an existing `PolygonPath`. Useful for extending\n * an in-flight path with another segment (e.g. appending a cubic to\n * the end of a curve in response to a user action) without hand-\n * reaching into the `commands` / `coords` typed arrays.\n *\n * ```ts\n * const next = PathBuilder.fromPath(current).curveTo(...).build();\n * ```\n */\n static fromPath(path: PolygonPath): PathBuilder {\n const b = new PathBuilder();\n b.cmds = Array.from(path.commands);\n b.xs = Array.from(path.coords);\n b.fillRule = path.fillRule;\n return b;\n }\n\n setFillRule(rule: PathFillRule): this {\n this.fillRule = rule;\n return this;\n }\n\n moveTo(x: number, y: number): this {\n this.cmds.push(PATH_M);\n this.xs.push(x, y);\n return this;\n }\n\n lineTo(x: number, y: number): this {\n this.cmds.push(PATH_L);\n this.xs.push(x, y);\n return this;\n }\n\n /** Cubic bezier to (x, y) with control points (x1, y1) and (x2, y2). */\n curveTo(x1: number, y1: number, x2: number, y2: number, x: number, y: number): this {\n this.cmds.push(PATH_C);\n this.xs.push(x1, y1, x2, y2, x, y);\n return this;\n }\n\n /** Quadratic bezier to (x, y) with control point (x1, y1). */\n quadTo(x1: number, y1: number, x: number, y: number): this {\n this.cmds.push(PATH_Q);\n this.xs.push(x1, y1, x, y);\n return this;\n }\n\n close(): this {\n this.cmds.push(PATH_Z);\n return this;\n }\n\n build(): PolygonPath {\n return {\n kind: 'polygon',\n commands: new Uint8Array(this.cmds),\n coords: new Float32Array(this.xs),\n fillRule: this.fillRule,\n };\n }\n}\n\n/** Construct a `RectPath` (the fast-path subtype). */\nexport function rectPath(x: number, y: number, width: number, height: number): RectPath {\n return { kind: 'rect', x, y, width, height };\n}\n\n/** `path` as a command stream drawing the same outline. A rect becomes its four\n * corners clockwise from `(x, y)`, the order `countPathAnchors` numbers them in. */\nexport function asPolygonPath(path: Path): PolygonPath {\n if (path.kind === 'polygon') return path;\n return {\n kind: 'polygon',\n commands: new Uint8Array([PATH_M, PATH_L, PATH_L, PATH_L, PATH_Z]),\n coords: Float32Array.from(rectToContour(path.x, path.y, path.width, path.height)),\n fillRule: 'nonzero',\n };\n}\n\n/** Build an open polyline from a flat list of points — the same geometry as\n * {@link polygonFromPoints} without the closing edge. A freehand stroke and a\n * measurement line want this; a region wants the closed one. */\nexport function polylineFromPoints(\n points: readonly { x: number; y: number }[],\n): PolygonPath | RectPath {\n const b = new PathBuilder();\n const first = points[0];\n if (!first) return rectPath(0, 0, 0, 0);\n b.moveTo(first.x, first.y);\n for (let i = 1; i < points.length; i++) {\n const p = points[i];\n if (p) b.lineTo(p.x, p.y);\n }\n return b.build();\n}\n\n/** Build a closed polygon from a flat list of points. */\nexport function polygonFromPoints(\n points: readonly { x: number; y: number }[],\n opts: { fillRule?: PathFillRule } = {},\n): PolygonPath {\n if (points.length === 0) {\n return {\n kind: 'polygon',\n commands: new Uint8Array(),\n coords: new Float32Array(),\n fillRule: opts.fillRule ?? 'nonzero',\n };\n }\n const b = new PathBuilder();\n if (opts.fillRule) b.setFillRule(opts.fillRule);\n b.moveTo(points[0].x, points[0].y);\n for (let i = 1; i < points.length; i++) b.lineTo(points[i].x, points[i].y);\n b.close();\n return b.build();\n}\n\n/** Cubic-Bezier kappa for circular-quadrant approximation (<1% max error). */\nconst ELLIPSE_KAPPA = 0.5522847498307936;\n\n/** Closed ellipse inscribed in `bounds`, as a 4-cubic-Bezier `PolygonPath`.\n * Matches the geometry `useEllipseTool`'s overlay paints. */\nexport function ellipsePath(\n bounds: { x: number; y: number; width: number; height: number },\n): PolygonPath {\n const cx = bounds.x + bounds.width / 2;\n const cy = bounds.y + bounds.height / 2;\n const rx = bounds.width / 2;\n const ry = bounds.height / 2;\n const ox = rx * ELLIPSE_KAPPA;\n const oy = ry * ELLIPSE_KAPPA;\n const b = new PathBuilder();\n b.moveTo(cx + rx, cy);\n b.curveTo(cx + rx, cy + oy, cx + ox, cy + ry, cx, cy + ry);\n b.curveTo(cx - ox, cy + ry, cx - rx, cy + oy, cx - rx, cy);\n b.curveTo(cx - rx, cy - oy, cx - ox, cy - ry, cx, cy - ry);\n b.curveTo(cx + ox, cy - ry, cx + rx, cy - oy, cx + rx, cy);\n b.close();\n return b.build();\n}\n\n/** Closed regular n-gon centered at `center`, circumscribed by `radius`.\n * `rotation` is in radians; default 0 puts the first vertex on the +x axis. */\nexport function regularPolygonPath(\n center: { x: number; y: number },\n radius: number,\n sides: number,\n rotation = 0,\n): PolygonPath {\n const b = new PathBuilder();\n for (let i = 0; i < sides; i++) {\n const a = rotation + (i / sides) * Math.PI * 2;\n const x = center.x + radius * Math.cos(a);\n const y = center.y + radius * Math.sin(a);\n if (i === 0) b.moveTo(x, y); else b.lineTo(x, y);\n }\n b.close();\n return b.build();\n}\n\n/** Closed n-pointed star centered at `center`, alternating `outerRadius` and\n * `innerRadius` (default `outerRadius / 2`). `rotation` is in radians. */\nexport function starPath(\n center: { x: number; y: number },\n outerRadius: number,\n points = 5,\n innerRadius: number = outerRadius / 2,\n rotation = 0,\n): PolygonPath {\n const b = new PathBuilder();\n const n = points * 2;\n for (let i = 0; i < n; i++) {\n const a = rotation + (i / n) * Math.PI * 2;\n const r = i % 2 === 0 ? outerRadius : innerRadius;\n const x = center.x + r * Math.cos(a);\n const y = center.y + r * Math.sin(a);\n if (i === 0) b.moveTo(x, y); else b.lineTo(x, y);\n }\n b.close();\n return b.build();\n}\n\n/** Open 2-vertex polyline from `a` to `b` — strokeable, not fillable. */\nexport function linePath(\n a: { x: number; y: number },\n b: { x: number; y: number },\n): PolygonPath {\n const pb = new PathBuilder();\n pb.moveTo(a.x, a.y);\n pb.lineTo(b.x, b.y);\n return pb.build();\n}\n","/**\n * Per-anchor corner specs: the stored half of corner shapes. A path carries\n * them in `PolygonPath.corners`, indexed by flat anchor index, and every\n * reader of its geometry sees them expanded (`resolveCorners`).\n */\nimport type { PolygonPath } from '../path';\nimport type { CornerShape } from './cornerShape';\n\n/** The corner at one anchor: its shape, and its setback, how far along each\n * edge from the anchor the cut starts. A `round` corner between edges at a\n * right angle is a circle of that radius. */\nexport interface CornerSpec {\n shape: CornerShape;\n radius: number;\n}\n\n/** The corner cut at flat anchor `index`, or null. A zero radius cuts nothing. */\nexport function cornerAt(path: PolygonPath, index: number): CornerSpec | null {\n const spec = path.corners?.[index];\n return spec && spec.radius > 0 ? spec : null;\n}\n\n/** The spec stored at flat anchor `index`, radius zero included: a shape\n * picked before any radius is dragged out. */\nexport function cornerSpecAt(path: PolygonPath, index: number): CornerSpec | null {\n return path.corners?.[index] ?? null;\n}\n\n/** Whether any anchor of `path` carries a corner with a radius. */\nexport function hasCorners(path: { kind: string; corners?: PolygonPath['corners'] }): boolean {\n const corners = path.corners;\n if (!corners) return false;\n for (const c of corners) if (c && c.radius > 0) return true;\n return false;\n}\n\n/** `corners` without trailing empty slots, or undefined when none is left. */\nexport function compactCorners(\n corners: readonly (CornerSpec | null | undefined)[],\n): (CornerSpec | null)[] | undefined {\n let end = corners.length;\n while (end > 0 && !corners[end - 1]) end--;\n if (end === 0) return undefined;\n const out: (CornerSpec | null)[] = new Array(end);\n for (let i = 0; i < end; i++) out[i] = corners[i] ?? null;\n return out;\n}\n\n/** `path` without its corner specs: the bare anchors the specs decorate. */\nexport function withoutCorners(path: PolygonPath): PolygonPath {\n if (path.corners === undefined) return path;\n const { corners: _dropped, ...rest } = path;\n return rest;\n}\n\n/** `path` with the corner at flat anchor `index` set to `spec`, or cleared\n * when `spec` is null. A zero radius keeps the shape and cuts nothing.\n * Never mutates `path`. */\nexport function withCorner(path: PolygonPath, index: number, spec: CornerSpec | null): PolygonPath {\n const next: (CornerSpec | null)[] = path.corners ? [...path.corners] : [];\n while (next.length <= index) next.push(null);\n next[index] = spec ? { shape: spec.shape, radius: Math.max(0, spec.radius) } : null;\n const corners = compactCorners(next);\n const bare = withoutCorners(path);\n return corners ? { ...bare, corners } : bare;\n}\n\n/** `path` with every corner radius multiplied by `factor`, as a uniform\n * scale of its geometry would carry them. */\nexport function scaleCorners(path: PolygonPath, factor: number): PolygonPath {\n if (!path.corners || factor === 1) return path;\n return {\n ...path,\n corners: path.corners.map((c) => (c ? { shape: c.shape, radius: c.radius * factor } : null)),\n };\n}\n\n/**\n * The corners of a path `t` of the way from `a` to `b`, which share their\n * anchors. A corner whose shape both ends agree on, or that one end leaves\n * sharp, grows its radius between them; one whose shape changes takes the\n * nearer end's.\n */\nexport function lerpCorners(\n a: PolygonPath['corners'],\n b: PolygonPath['corners'],\n t: number,\n): (CornerSpec | null)[] | undefined {\n if (!a && !b) return undefined;\n const n = Math.max(a?.length ?? 0, b?.length ?? 0);\n const out: (CornerSpec | null)[] = new Array(n);\n for (let i = 0; i < n; i++) {\n const ca = a?.[i] ?? null, cb = b?.[i] ?? null;\n const either = ca ?? cb;\n if (!either) out[i] = null;\n else if (ca && cb && ca.shape !== cb.shape) out[i] = t < 0.5 ? ca : cb;\n else out[i] = { shape: either.shape, radius: (ca?.radius ?? 0) + ((cb?.radius ?? 0) - (ca?.radius ?? 0)) * t };\n }\n return compactCorners(out);\n}\n","import { cubicEvalAt, splitCubicAt, type CubicCoords } from '../curve';\n\n/** A 2D point, the shape the point-taking path helpers read and return. */\nexport interface Point { x: number; y: number; }\n\n/** Point on the cubic Bezier (p0, p1, p2, p3) at parameter t. The point-shaped\n * face of geom's `cubicEvalAt`. */\nexport function cubicPointAt(p0: Point, p1: Point, p2: Point, p3: Point, t: number): Point {\n const [x, y] = cubicEvalAt(p0.x, p0.y, p1.x, p1.y, p2.x, p2.y, p3.x, p3.y, t);\n return { x, y };\n}\n\n/** De Casteljau subdivision of a cubic at parameter t. The point-shaped face\n * of geom's `splitCubicAt`; `left[3]` and `right[0]` are the point at t. */\nexport function splitCubicAtT(\n p0: Point, p1: Point, p2: Point, p3: Point,\n t: number,\n): { left: [Point, Point, Point, Point]; right: [Point, Point, Point, Point] } {\n const [l, r] = splitCubicAt(p0.x, p0.y, p1.x, p1.y, p2.x, p2.y, p3.x, p3.y, t);\n const quad = (c: CubicCoords): [Point, Point, Point, Point] =>\n [{ x: c[0], y: c[1] }, { x: c[2], y: c[3] }, { x: c[4], y: c[5] }, { x: c[6], y: c[7] }];\n return { left: quad(l), right: quad(r) };\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/paths/anchors.ts"],"names":[],"mappings":"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","file":"chunk-Q66NA2FU.js","sourcesContent":["/**\n * Counts the path anchors used by the per-anchor coloring surface. An\n * \"anchor\" is the destination point of a path command: M, L, C, Q each\n * contribute one (the (x, y) where the pen ends up); Z contributes none\n * (it closes back to the subpath's first M). RectPath has four implicit\n * anchors — the corners — matching its M/L/L/L/Z stroke tessellation.\n *\n * Consumers use this to size their per-anchor color array; the renderer\n * uses it to validate the array length in dev builds.\n */\n\nimport { PATH_C, PATH_L, PATH_M, PATH_Q, PATH_Z, forEachSegment } from '../commands';\nimport { nearestOnCubic, nearestOnLine } from '../nearest';\nimport type { Path, PolygonPath } from '../path';\nimport { PathBuilder } from './builder';\nimport { compactCorners, cornerSpecAt, withoutCorners, type CornerSpec } from './cornerSpec';\n\n/** One anchor of an editable path: its on-curve point plus the two control\n * handles that shape the segments either side of it. Handles are in the same\n * space as the point, and absent when the adjoining segment is straight. */\nexport interface PenAnchor {\n x: number;\n y: number;\n inHandle?: { x: number; y: number };\n outHandle?: { x: number; y: number };\n /** The corner shape cut at this anchor (`PolygonPath.corners`). */\n corner?: CornerSpec;\n}\n\n/**\n * Derive a per-subpath anchor model from a PolygonPath. Subpaths split on\n * every `M` command; a subpath is closed iff it ends with `Z`.\n *\n * Cubic-segment control points become the outHandle of the previous anchor\n * and the inHandle of the next anchor. A closed subpath whose last curve ends\n * exactly on its first point holds that point twice; the two are one anchor,\n * and the curve's second control is that anchor's inHandle. Quadratic segments are upgraded to\n * cubics (each control reused for both adjacent handles) — this loses no\n * geometry. Linear segments produce anchors with no handles.\n */\nexport function pathToAnchors(\n path: PolygonPath,\n): { anchors: PenAnchor[][]; closed: boolean[] } {\n const { commands, coords } = path;\n const anchors: PenAnchor[][] = [];\n const closed: boolean[] = [];\n let current: PenAnchor[] | null = null;\n\n forEachSegment(commands, coords, (cmd, ci) => {\n switch (cmd) {\n case PATH_M: {\n if (current) { anchors.push(current); closed.push(false); }\n current = [{ x: coords[ci], y: coords[ci + 1] }];\n break;\n }\n case PATH_L: {\n if (!current) throw new Error('pathToAnchors: L without prior M');\n current.push({ x: coords[ci], y: coords[ci + 1] });\n break;\n }\n case PATH_C: {\n if (!current) throw new Error('pathToAnchors: C without prior M');\n const prev = current[current.length - 1];\n prev.outHandle = { x: coords[ci], y: coords[ci + 1] };\n current.push({\n x: coords[ci + 4], y: coords[ci + 5],\n inHandle: { x: coords[ci + 2], y: coords[ci + 3] },\n });\n break;\n }\n case PATH_Q: {\n if (!current) throw new Error('pathToAnchors: Q without prior M');\n // Quadratic → cubic: handle is the same control point on both sides.\n const handle = { x: coords[ci], y: coords[ci + 1] };\n const prev = current[current.length - 1];\n prev.outHandle = handle;\n current.push({ x: coords[ci + 2], y: coords[ci + 3], inHandle: { ...handle } });\n break;\n }\n case PATH_Z: {\n if (current) {\n foldClosingCurve(current);\n anchors.push(current);\n closed.push(true);\n current = null;\n }\n break;\n }\n default:\n throw new Error(`pathToAnchors: unknown command ${cmd}`);\n }\n });\n if (current) { anchors.push(current); closed.push(false); }\n if (path.corners) {\n let flat = 0;\n for (const sub of anchors) {\n for (const a of sub) {\n const corner = cornerSpecAt(path, flat++);\n if (corner) a.corner = { ...corner };\n }\n }\n }\n return { anchors, closed };\n}\n\n/** Merge a closing curve's end anchor into the subpath's first anchor when\n * the two coincide. */\nfunction foldClosingCurve(sub: PenAnchor[]): void {\n if (sub.length < 2) return;\n const first = sub[0];\n const last = sub[sub.length - 1];\n if (!last.inHandle || last.x !== first.x || last.y !== first.y) return;\n sub.pop();\n first.inHandle = last.inHandle;\n}\n\n/**\n * Serialize the per-subpath anchor model back to a PolygonPath. Inverse of\n * `pathToAnchors`. Curve-vs-line decision per segment:\n * - Both adjacent handles absent → straight L segment.\n * - Either handle present → C segment, with missing handles defaulting to\n * the anchor point itself (degenerate but valid; renders as a near-line).\n * Given `like`, the path being reshaped, the result keeps its fill rules.\n */\nexport function anchorsToPath(\n anchors: PenAnchor[][],\n closed: boolean[],\n like?: PolygonPath,\n): PolygonPath {\n const b = new PathBuilder();\n for (let s = 0; s < anchors.length; s++) {\n const sub = anchors[s];\n if (sub.length === 0) continue;\n b.moveTo(sub[0].x, sub[0].y);\n for (let i = 1; i < sub.length; i++) {\n const prev = sub[i - 1];\n const cur = sub[i];\n const hasHandle = prev.outHandle != null || cur.inHandle != null;\n if (!hasHandle) {\n b.lineTo(cur.x, cur.y);\n } else {\n const c1 = prev.outHandle ?? { x: prev.x, y: prev.y };\n const c2 = cur.inHandle ?? { x: cur.x, y: cur.y };\n b.curveTo(c1.x, c1.y, c2.x, c2.y, cur.x, cur.y);\n }\n }\n if (closed[s]) {\n // Bridge last → first if they have curve handles; either way emit Z.\n const last = sub[sub.length - 1];\n const first = sub[0];\n const hasHandle = last.outHandle != null || first.inHandle != null;\n if (hasHandle) {\n const c1 = last.outHandle ?? { x: last.x, y: last.y };\n const c2 = first.inHandle ?? { x: first.x, y: first.y };\n b.curveTo(c1.x, c1.y, c2.x, c2.y, first.x, first.y);\n }\n b.close();\n }\n }\n const built = b.build();\n const corners = compactCorners(anchors.flatMap((sub) => sub.map((a) => a.corner ?? null)));\n const base = like ? { ...withoutCorners(like), commands: built.commands, coords: built.coords } : built;\n return corners ? { ...base, corners } : base;\n}\n\nconst SMOOTH_THRESHOLD = 0.001;\n\n/**\n * Returns true if the anchor's in-handle and out-handle are collinear with\n * the anchor point, indicating \"smooth\" (mirror-drag) behavior. Detected via\n * the magnitude of the normalized cross product of the two handle vectors.\n *\n * Edge cases:\n * - Missing in or out handle → false (corner by definition).\n * - Either handle at zero distance from anchor → false.\n */\nexport function isAnchorSmooth(a: PenAnchor): boolean {\n if (!a.inHandle || !a.outHandle) return false;\n const inDX = a.inHandle.x - a.x;\n const inDY = a.inHandle.y - a.y;\n const outDX = a.outHandle.x - a.x;\n const outDY = a.outHandle.y - a.y;\n const inLen = Math.hypot(inDX, inDY);\n const outLen = Math.hypot(outDX, outDY);\n if (inLen === 0 || outLen === 0) return false;\n // For collinear handles on opposite sides of the anchor, the cross product\n // of the two handle vectors should be zero. Normalize by both magnitudes.\n const cross = (inDX * outDY - inDY * outDX) / (inLen * outLen);\n return Math.abs(cross) < SMOOTH_THRESHOLD;\n}\n\n/** How many anchors a path has. Matches the per-anchor arrays the renderer\n * expects for `vertexColors`. */\nexport function countPathAnchors(path: Path): number {\n if (path.kind === 'rect') return 4;\n const cmds = path.commands;\n let n = 0;\n for (let i = 0; i < cmds.length; i++) {\n const c = cmds[i];\n if (c === PATH_M || c === PATH_L || c === PATH_C || c === PATH_Q) n++;\n }\n return n;\n}\n\n/** The segment `(sub, segIdx)` as its two end anchors, or null when it\n * doesn't exist. `segIdx === sub.length - 1` names a closed subpath's\n * closing segment, which runs from the last anchor back to the first. */\nexport function segmentEnds(\n anchors: readonly PenAnchor[][],\n closed: readonly boolean[] | undefined,\n sub: number,\n segIdx: number,\n): { a: PenAnchor; b: PenAnchor } | null {\n const s = anchors[sub];\n if (!s || segIdx < 0) return null;\n if (segIdx + 1 < s.length) return { a: s[segIdx], b: s[segIdx + 1] };\n if (closed?.[sub] && s.length > 1 && segIdx === s.length - 1) return { a: s[segIdx], b: s[0] };\n return null;\n}\n\n/** Whether the segment from `a` to `b` is a straight line (no handles). */\nexport function isStraightSegment(a: PenAnchor, b: PenAnchor): boolean {\n return a.outHandle == null && b.inHandle == null;\n}\n\n/** Nearest parameter on one segment to `(x, y)`, with its squared distance.\n * A straight segment is parameterized by arc length (`t` is the fraction of\n * the way from `a` to `b`), matching how {@link insertAnchorOnSegment}\n * splits one. */\nfunction nearestOnSegment(a: PenAnchor, b: PenAnchor, x: number, y: number): { t: number; d2: number } {\n const p1 = a.outHandle ?? a;\n const p2 = b.inHandle ?? b;\n const hit = isStraightSegment(a, b)\n ? nearestOnLine(x, y, a.x, a.y, b.x, b.y)\n : nearestOnCubic(x, y, a.x, a.y, p1.x, p1.y, p2.x, p2.y, b.x, b.y);\n return { t: hit.t, d2: hit.dist * hit.dist };\n}\n\n/** The segment of a decoded path nearest `(wx, wy)`, and the parameter `t`\n * on it closest to that point. Pass `closed` (from `pathToAnchors`) to\n * include each closed subpath's closing segment, reported as\n * `segIdx === sub.length - 1`. `t` spans `[0, 1]`, endpoints included.\n * Returns `null` only when there are no segments. */\nexport function nearestSegmentT(\n anchors: PenAnchor[][],\n wx: number,\n wy: number,\n closed?: readonly boolean[],\n): { sub: number; segIdx: number; t: number } | null {\n let bestD2 = Infinity;\n let best: { sub: number; segIdx: number; t: number } | null = null;\n for (let s = 0; s < anchors.length; s++) {\n const segCount = anchors[s].length - (closed?.[s] ? 0 : 1);\n for (let i = 0; i < segCount; i++) {\n const ends = segmentEnds(anchors, closed, s, i);\n if (!ends) continue;\n const hit = nearestOnSegment(ends.a, ends.b, wx, wy);\n if (hit.d2 < bestD2) {\n bestD2 = hit.d2;\n best = { sub: s, segIdx: i, t: hit.t };\n }\n }\n }\n return best;\n}\n"]}
@@ -1,152 +0,0 @@
1
- import { nearestOnLine, nearestOnCubic } from './chunk-CE7IY7TB.js';
2
- import { resolveCorners, fitCubicWithTangents } from './chunk-2PKPKU4P.js';
3
- import { forEachSegment, PATH_Z, PATH_Q, elevateQuadraticToCubic, cubicBounds, PATH_C, PATH_L, PATH_M, cubicPointAt } from './chunk-B53BERKG.js';
4
-
5
- // src/paths/bounds.ts
6
- function boundsOfPath(path) {
7
- if (path.kind === "rect") return path;
8
- const { commands, coords } = resolveCorners(path);
9
- if (commands.length === 0) {
10
- return { kind: "rect", x: 0, y: 0, width: 0, height: 0 };
11
- }
12
- let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;
13
- let seen = false;
14
- const include = (x, y) => {
15
- if (x < minX) minX = x;
16
- if (x > maxX) maxX = x;
17
- if (y < minY) minY = y;
18
- if (y > maxY) maxY = y;
19
- seen = true;
20
- };
21
- forEachSegment(commands, coords, (cmd, ci, px, py) => {
22
- switch (cmd) {
23
- case PATH_M:
24
- case PATH_L: {
25
- include(coords[ci], coords[ci + 1]);
26
- break;
27
- }
28
- case PATH_C: {
29
- const [bMinX, bMinY, bMaxX, bMaxY] = cubicBounds(
30
- px,
31
- py,
32
- coords[ci],
33
- coords[ci + 1],
34
- coords[ci + 2],
35
- coords[ci + 3],
36
- coords[ci + 4],
37
- coords[ci + 5]
38
- );
39
- include(bMinX, bMinY);
40
- include(bMaxX, bMaxY);
41
- break;
42
- }
43
- case PATH_Q: {
44
- const qx2 = coords[ci + 2], qy2 = coords[ci + 3];
45
- const [c1x, c1y, c2x, c2y] = elevateQuadraticToCubic(px, py, coords[ci], coords[ci + 1], qx2, qy2);
46
- const [bMinX, bMinY, bMaxX, bMaxY] = cubicBounds(px, py, c1x, c1y, c2x, c2y, qx2, qy2);
47
- include(bMinX, bMinY);
48
- include(bMaxX, bMaxY);
49
- break;
50
- }
51
- case PATH_Z:
52
- break;
53
- default:
54
- throw new Error(`boundsOfPath: unknown command ${cmd}`);
55
- }
56
- });
57
- if (!seen) return { kind: "rect", x: 0, y: 0, width: 0, height: 0 };
58
- return { kind: "rect", x: minX, y: minY, width: maxX - minX, height: maxY - minY };
59
- }
60
-
61
- // src/paths/fitRun.ts
62
- var MAX_STRAY_STEPS = 512;
63
- function keepCorner(to, from) {
64
- if (from.corner) to.corner = { ...from.corner };
65
- }
66
- function fitPointRun(pts, tStart, tEnd, tol, out, closing) {
67
- if (out.length === 0) out.push({ x: pts[0].x, y: pts[0].y });
68
- const segs = [];
69
- fitRecursive(pts, tStart, tEnd, tol, segs);
70
- segs.forEach((seg, i) => {
71
- const prev = out[out.length - 1];
72
- if (seg.c1) prev.outHandle = seg.c1;
73
- const isLast = i === segs.length - 1;
74
- if (closing && isLast) {
75
- if (seg.c2) out[0].inHandle = seg.c2;
76
- return;
77
- }
78
- out.push(seg.c2 ? { x: seg.end.x, y: seg.end.y, inHandle: seg.c2 } : { x: seg.end.x, y: seg.end.y });
79
- });
80
- }
81
- function fitRecursive(pts, tStart, tEnd, tol, out) {
82
- const a = pts[0];
83
- const e = pts[pts.length - 1];
84
- if (pts.length <= 2 || worstFromLine(pts, a, e).dist <= tol) {
85
- out.push({ end: e });
86
- return;
87
- }
88
- const { cp1, cp2 } = fitCubicWithTangents(pts, tStart, tEnd);
89
- const worst = worstFromCubic(pts, a, cp1, cp2, e);
90
- const stray = worst.dist <= tol ? strayFromRun(pts, a, cp1, cp2, e, tol) : -1;
91
- if (worst.dist <= tol && stray < 0) {
92
- out.push({ c1: cp1, c2: cp2, end: e });
93
- return;
94
- }
95
- const k = stray < 0 ? worst.index : stray;
96
- const center = unit(sub2(pts[k + 1], pts[k - 1]));
97
- fitRecursive(pts.slice(0, k + 1), tStart, neg(center), tol, out);
98
- fitRecursive(pts.slice(k), center, tEnd, tol, out);
99
- }
100
- function worstFromLine(pts, a, e) {
101
- let index = 1, dist = 0;
102
- for (let i = 1; i < pts.length - 1; i++) {
103
- const d = nearestOnLine(pts[i].x, pts[i].y, a.x, a.y, e.x, e.y).dist;
104
- if (d > dist) {
105
- dist = d;
106
- index = i;
107
- }
108
- }
109
- return { index, dist };
110
- }
111
- function worstFromCubic(pts, a, c1, c2, e) {
112
- let index = 1, dist = 0;
113
- for (let i = 1; i < pts.length - 1; i++) {
114
- const d = nearestOnCubic(pts[i].x, pts[i].y, a.x, a.y, c1.x, c1.y, c2.x, c2.y, e.x, e.y).dist;
115
- if (d > dist) {
116
- dist = d;
117
- index = i;
118
- }
119
- }
120
- return { index, dist };
121
- }
122
- function strayFromRun(pts, a, c1, c2, e, tol) {
123
- const reach = Math.hypot(c1.x - a.x, c1.y - a.y) + Math.hypot(c2.x - c1.x, c2.y - c1.y) + Math.hypot(e.x - c2.x, e.y - c2.y);
124
- const steps = Math.min(MAX_STRAY_STEPS, Math.max(8, Math.ceil(reach / tol)));
125
- const edges = pts.length - 1;
126
- let hint = 0;
127
- for (let s = 1; s < steps; s++) {
128
- const p = cubicPointAt(a, c1, c2, e, s / steps);
129
- let near = -1;
130
- for (let j = 0; j < edges && near < 0; j++) {
131
- const i = (hint + j) % edges;
132
- if (nearestOnLine(p.x, p.y, pts[i].x, pts[i].y, pts[i + 1].x, pts[i + 1].y).dist <= tol) near = i;
133
- }
134
- if (near >= 0) {
135
- hint = near;
136
- continue;
137
- }
138
- const along = nearestOnLine(p.x, p.y, pts[hint].x, pts[hint].y, pts[hint + 1].x, pts[hint + 1].y).t;
139
- return Math.min(Math.max(hint + (along < 0.5 ? 0 : 1), 1), pts.length - 2);
140
- }
141
- return -1;
142
- }
143
- var sub2 = (p, q) => ({ x: p.x - q.x, y: p.y - q.y });
144
- var neg = (p) => ({ x: -p.x, y: -p.y });
145
- function unit(p) {
146
- const len = Math.hypot(p.x, p.y);
147
- return len === 0 ? { x: 0, y: 0 } : { x: p.x / len, y: p.y / len };
148
- }
149
-
150
- export { boundsOfPath, fitPointRun, keepCorner };
151
- //# sourceMappingURL=chunk-STGSBIOL.js.map
152
- //# sourceMappingURL=chunk-STGSBIOL.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/paths/bounds.ts","../src/paths/fitRun.ts"],"names":[],"mappings":"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","file":"chunk-STGSBIOL.js","sourcesContent":["import { cubicBounds, elevateQuadraticToCubic } from '../curve';\nimport { forEachSegment, PATH_C, PATH_L, PATH_M, PATH_Q, PATH_Z } from '../commands';\nimport type { Path, RectPath } from '../path';\nimport { resolveCorners } from './corners';\n\n/**\n * AABB of a `Path`, returned as a `RectPath` for direct reuse with rect-fast-path machinery.\n * Control points are NOT included directly; they're used only to compute extrema that actually\n * lie on the curve. Corner shapes are bounded as they are drawn, expanded. Empty paths (no commands) return a zero-size rect anchored at the origin.\n */\nexport function boundsOfPath(path: Path): RectPath {\n if (path.kind === 'rect') return path;\n\n const { commands, coords } = resolveCorners(path);\n if (commands.length === 0) {\n return { kind: 'rect', x: 0, y: 0, width: 0, height: 0 };\n }\n\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n let seen = false;\n\n const include = (x: number, y: number) => {\n if (x < minX) minX = x;\n if (x > maxX) maxX = x;\n if (y < minY) minY = y;\n if (y > maxY) maxY = y;\n seen = true;\n };\n\n forEachSegment(commands, coords, (cmd, ci, px, py) => {\n switch (cmd) {\n case PATH_M:\n case PATH_L: {\n include(coords[ci], coords[ci + 1]);\n break;\n }\n case PATH_C: {\n const [bMinX, bMinY, bMaxX, bMaxY] = cubicBounds(\n px, py,\n coords[ci], coords[ci + 1],\n coords[ci + 2], coords[ci + 3],\n coords[ci + 4], coords[ci + 5],\n );\n include(bMinX, bMinY);\n include(bMaxX, bMaxY);\n break;\n }\n case PATH_Q: {\n const qx2 = coords[ci + 2], qy2 = coords[ci + 3];\n const [c1x, c1y, c2x, c2y] = elevateQuadraticToCubic(px, py, coords[ci], coords[ci + 1], qx2, qy2);\n const [bMinX, bMinY, bMaxX, bMaxY] = cubicBounds(px, py, c1x, c1y, c2x, c2y, qx2, qy2);\n include(bMinX, bMinY);\n include(bMaxX, bMaxY);\n break;\n }\n case PATH_Z:\n break;\n default:\n throw new Error(`boundsOfPath: unknown command ${cmd}`);\n }\n });\n\n if (!seen) return { kind: 'rect', x: 0, y: 0, width: 0, height: 0 };\n return { kind: 'rect', x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n}\n\n","/**\n * Fitting a run of sampled points with as few cubics as hold it within a\n * tolerance, each held to the run's end tangents: the refit `simplifyPath`\n * and `warpPath` share.\n */\nimport { nearestOnCubic, nearestOnLine } from '../nearest';\nimport type { PenAnchor } from './anchors';\nimport { cubicPointAt, type Point } from './cubicMath';\nimport { fitCubicWithTangents } from './schneiderFit';\n\n/** Most points a fitted cubic is checked at against the run it fits. */\nconst MAX_STRAY_STEPS = 512;\n\n/** Give `to`, an anchor a refit kept where `from` was, `from`'s corner spec. */\nexport function keepCorner(to: PenAnchor, from: PenAnchor): void {\n if (from.corner) to.corner = { ...from.corner };\n}\n\n/**\n * Fit `pts` with cubics held to the end tangents, splitting at the worst\n * sample until every sample is within `tol`, and append the anchors after the\n * first to `out` (the first too when `out` is empty). `closing` folds the\n * final anchor, which lands on the subpath's first, into that first one.\n */\nexport function fitPointRun(pts: Point[], tStart: Point, tEnd: Point, tol: number, out: PenAnchor[], closing: boolean): void {\n if (out.length === 0) out.push({ x: pts[0].x, y: pts[0].y });\n const segs: Array<{ c1?: Point; c2?: Point; end: Point }> = [];\n fitRecursive(pts, tStart, tEnd, tol, segs);\n segs.forEach((seg, i) => {\n const prev = out[out.length - 1];\n if (seg.c1) prev.outHandle = seg.c1;\n const isLast = i === segs.length - 1;\n if (closing && isLast) {\n if (seg.c2) out[0].inHandle = seg.c2;\n return;\n }\n out.push(seg.c2 ? { x: seg.end.x, y: seg.end.y, inHandle: seg.c2 } : { x: seg.end.x, y: seg.end.y });\n });\n}\n\nfunction fitRecursive(\n pts: Point[], tStart: Point, tEnd: Point, tol: number,\n out: Array<{ c1?: Point; c2?: Point; end: Point }>,\n): void {\n const a = pts[0];\n const e = pts[pts.length - 1];\n if (pts.length <= 2 || worstFromLine(pts, a, e).dist <= tol) {\n out.push({ end: e });\n return;\n }\n const { cp1, cp2 } = fitCubicWithTangents(pts, tStart, tEnd);\n const worst = worstFromCubic(pts, a, cp1, cp2, e);\n const stray = worst.dist <= tol ? strayFromRun(pts, a, cp1, cp2, e, tol) : -1;\n if (worst.dist <= tol && stray < 0) {\n out.push({ c1: cp1, c2: cp2, end: e });\n return;\n }\n const k = stray < 0 ? worst.index : stray;\n const center = unit(sub2(pts[k + 1], pts[k - 1]));\n fitRecursive(pts.slice(0, k + 1), tStart, neg(center), tol, out);\n fitRecursive(pts.slice(k), center, tEnd, tol, out);\n}\n\nfunction worstFromLine(pts: Point[], a: Point, e: Point): { index: number; dist: number } {\n let index = 1, dist = 0;\n for (let i = 1; i < pts.length - 1; i++) {\n const d = nearestOnLine(pts[i].x, pts[i].y, a.x, a.y, e.x, e.y).dist;\n if (d > dist) { dist = d; index = i; }\n }\n return { index, dist };\n}\n\nfunction worstFromCubic(pts: Point[], a: Point, c1: Point, c2: Point, e: Point): { index: number; dist: number } {\n let index = 1, dist = 0;\n for (let i = 1; i < pts.length - 1; i++) {\n const d = nearestOnCubic(pts[i].x, pts[i].y, a.x, a.y, c1.x, c1.y, c2.x, c2.y, e.x, e.y).dist;\n if (d > dist) { dist = d; index = i; }\n }\n return { index, dist };\n}\n\n/**\n * Where the cubic strays more than `tol` from the polyline through `pts`\n * between the samples, as the interior sample to split the run at; -1 when it\n * never does. The samples hold the run to the cubic; this holds the cubic to\n * the run, which a cubic bulging across a sparsely sampled flat fails.\n */\nfunction strayFromRun(pts: Point[], a: Point, c1: Point, c2: Point, e: Point, tol: number): number {\n const reach = Math.hypot(c1.x - a.x, c1.y - a.y) + Math.hypot(c2.x - c1.x, c2.y - c1.y) + Math.hypot(e.x - c2.x, e.y - c2.y);\n const steps = Math.min(MAX_STRAY_STEPS, Math.max(8, Math.ceil(reach / tol)));\n const edges = pts.length - 1;\n let hint = 0;\n for (let s = 1; s < steps; s++) {\n const p = cubicPointAt(a, c1, c2, e, s / steps);\n let near = -1;\n // Edges in order from the last one near the cubic, which it walks along.\n for (let j = 0; j < edges && near < 0; j++) {\n const i = (hint + j) % edges;\n if (nearestOnLine(p.x, p.y, pts[i].x, pts[i].y, pts[i + 1].x, pts[i + 1].y).dist <= tol) near = i;\n }\n if (near >= 0) { hint = near; continue; }\n // Split at whichever end of the edge it strayed from is nearer.\n const along = nearestOnLine(p.x, p.y, pts[hint].x, pts[hint].y, pts[hint + 1].x, pts[hint + 1].y).t;\n return Math.min(Math.max(hint + (along < 0.5 ? 0 : 1), 1), pts.length - 2);\n }\n return -1;\n}\n\nconst sub2 = (p: Point, q: Point): Point => ({ x: p.x - q.x, y: p.y - q.y });\nconst neg = (p: Point): Point => ({ x: -p.x, y: -p.y });\nfunction unit(p: Point): Point {\n const len = Math.hypot(p.x, p.y);\n return len === 0 ? { x: 0, y: 0 } : { x: p.x / len, y: p.y / len };\n}\n"]}