@weasel-js/geom 1.11.0 → 1.11.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.
- package/dist/booleans/index.d.ts +3 -1
- package/dist/booleans/index.js +138 -11
- package/dist/booleans/index.js.map +1 -1
- package/dist/{chunk-7KLJZFBY.js → chunk-4Y67BZL5.js} +3 -3
- package/dist/{chunk-7KLJZFBY.js.map → chunk-4Y67BZL5.js.map} +1 -1
- package/dist/{chunk-HGF5OVEN.js → chunk-6FGQML7D.js} +29 -6
- package/dist/chunk-6FGQML7D.js.map +1 -0
- package/dist/{chunk-6XSJY3TC.js → chunk-7F66PQCJ.js} +3 -3
- package/dist/{chunk-6XSJY3TC.js.map → chunk-7F66PQCJ.js.map} +1 -1
- package/dist/{chunk-J2O2B54M.js → chunk-EAKE3N7W.js} +13 -9
- package/dist/chunk-EAKE3N7W.js.map +1 -0
- package/dist/{chunk-SASMXDBE.js → chunk-LRVPK7HI.js} +83 -35
- package/dist/chunk-LRVPK7HI.js.map +1 -0
- package/dist/index.d.ts +47 -3
- package/dist/index.js +331 -28
- package/dist/index.js.map +1 -1
- package/dist/nd/index.d.ts +2 -1
- package/dist/nd/index.js +44 -29
- package/dist/nd/index.js.map +1 -1
- package/dist/tessellate/index.js +3 -3
- package/dist/warp/index.d.ts +7 -5
- package/dist/warp/index.js +145 -13
- package/dist/warp/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-HGF5OVEN.js.map +0 -1
- package/dist/chunk-J2O2B54M.js.map +0 -1
- package/dist/chunk-SASMXDBE.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/paths/cornerCarry.ts","../src/paths/cornerRestore.ts","../src/booleans/contourSegments.ts","../src/booleans/contours.ts","../src/booleans/cutRegions.ts"],"names":["a","b","u","folded","c","l","r"],"mappings":"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","file":"chunk-7KLJZFBY.js","sourcesContent":["/**\n * Carrying corner specs onto a path rebuilt from another: a split, a rejoin,\n * a reversal. Specs are keyed by flat anchor index, so a rewrite that moves\n * anchors must renumber them rather than keep the old array.\n */\nimport { forEachSegment, pathCommandCoordCount, PATH_C, PATH_M, PATH_Q, PATH_Z } from '../commands';\nimport type { PolygonPath } from '../path';\nimport { compactCorners, withoutCorners, type CornerSpec } from './cornerSpec';\n\nconst flatCache = new WeakMap<PolygonPath, Int32Array>();\n\n/**\n * For each anchor command of `path` (each M, L, C, or Q, as `countPathAnchors`\n * numbers them), its flat anchor index, the numbering `PolygonPath.corners`\n * uses: a closing curve that ends on its subpath's first point folds onto\n * that anchor, as `pathToAnchors` folds it.\n */\nexport function flatAnchorIndices(path: PolygonPath): Int32Array {\n const hit = flatCache.get(path);\n if (hit) return hit;\n const { commands, coords } = path;\n const out: number[] = [];\n let flat = 0, first = 0, count = 0;\n let sx = 0, sy = 0, ex = 0, ey = 0, curve = false;\n forEachSegment(commands, coords, (cmd, ci) => {\n if (cmd === PATH_Z) {\n if (count > 1 && curve && ex === sx && ey === sy) { out[out.length - 1] = first; flat--; }\n count = 0;\n return;\n }\n const n = pathCommandCoordCount(cmd);\n ex = coords[ci + n - 2]; ey = coords[ci + n - 1];\n curve = cmd === PATH_C || cmd === PATH_Q;\n if (cmd === PATH_M || count === 0) { first = flat; sx = ex; sy = ey; count = 0; }\n count++;\n out.push(flat++);\n });\n const result = Int32Array.from(out);\n flatCache.set(path, result);\n return result;\n}\n\n/**\n * `to` with `from`'s corner specs carried across, where `sources[k]` is the\n * anchor command of `from` that anchor command `k` of `to` was drawn from, or\n * -1 for one with no source. Each spec lands once, on the first anchor drawn\n * from its own; any specs `to` already had are dropped.\n */\nexport function carryCorners(from: PolygonPath, to: PolygonPath, sources: ArrayLike<number>): PolygonPath {\n const bare = withoutCorners(to);\n const specs = from.corners;\n if (!specs) return bare;\n const fromFlat = flatAnchorIndices(from);\n const toFlat = flatAnchorIndices(to);\n const placed = new Set<number>();\n const next: (CornerSpec | null)[] = [];\n for (let k = 0; k < toFlat.length; k++) {\n const s = sources[k];\n if (s === undefined || s < 0 || s >= fromFlat.length) continue;\n const f = fromFlat[s];\n const spec = specs[f];\n if (!spec || placed.has(f)) continue;\n placed.add(f);\n while (next.length < toFlat[k]) next.push(null);\n next[toFlat[k]] = spec;\n }\n const corners = compactCorners(next);\n return corners ? { ...bare, corners } : bare;\n}\n\n/** `count` consecutive anchor command indices from `start`: the sources of a\n * contiguous slice. */\nexport function anchorRange(start: number, count: number): Int32Array {\n const out = new Int32Array(count);\n for (let i = 0; i < count; i++) out[i] = start + i;\n return out;\n}\n","/**\n * Putting corner specs back on a path an operation rebuilt from expanded\n * geometry. Booleans, trims and cuts work on what a path draws, its corners\n * cut and spanned (`resolveCorners`); wherever a corner's cut comes through\n * whole, it folds back into its anchor and spec, and only a corner the\n * operation cut into or moved stays expanded.\n */\nimport type { Path, PolygonPath } from '../path';\nimport { nearestOnCubic, nearestOnLine } from '../nearest';\nimport { PathBuilder } from './builder';\nimport { flatAnchorIndices } from './cornerCarry';\nimport { decodeContours, type Contour, type Seg } from './cornerSegments';\nimport type { Point } from './cubicMath';\nimport type { CornerPiece } from './cornerShape';\nimport { compactCorners, withoutCorners, type CornerSpec } from './cornerSpec';\nimport { cornerCuts } from './corners';\n\n/** A corner a rebuilt path may hold expanded: the anchor and spec it folds\n * back into, and the cut it is drawn as, from `start` to `end`. */\nexport interface CornerTrace {\n anchor: Point;\n spec: CornerSpec;\n start: Point;\n end: Point;\n pieces: readonly CornerPiece[];\n}\n\n/** How far a point may sit from where a corner draws it and still count as on it. */\nexport const CORNER_RESTORE_TOLERANCE = 1e-3;\n\n/** The corners `path` cuts, as {@link restoreCorners} looks for them. */\nexport function cornerTraces(path: Path): CornerTrace[] {\n if (path.kind !== 'polygon') return [];\n return cornerCuts(path).map(({ anchor, spec, start, end, pieces }) => ({ anchor, spec, start, end, pieces }));\n}\n\n/**\n * `result` with the corners of `sources` folded back in wherever it still\n * draws them whole: an operation's output, rebuilt from what the sources\n * draw. A corner the operation cut into, or whose edges it moved, stays as\n * the plain geometry it already is.\n */\nexport function keepCorners(sources: readonly Path[], result: PolygonPath, tolerance = CORNER_RESTORE_TOLERANCE): PolygonPath {\n const traces = sources.flatMap(cornerTraces);\n return traces.length === 0 ? result : restoreCorners(result, traces, tolerance);\n}\n\nconst dist = (a: Point, b: Point): number => Math.hypot(a.x - b.x, a.y - b.y);\n\nfunction onTrace(p: Point, t: CornerTrace, tol: number): boolean {\n let from = t.start;\n for (const piece of t.pieces) {\n const d = piece.kind === 'line'\n ? nearestOnLine(p.x, p.y, from.x, from.y, piece.to.x, piece.to.y).dist\n : nearestOnCubic(p.x, p.y, from.x, from.y, piece.c1.x, piece.c1.y, piece.c2.x, piece.c2.y, piece.to.x, piece.to.y).dist;\n if (d <= tol) return true;\n from = piece.to;\n }\n return false;\n}\n\n/** The blossom of cubic `s` at `(u, v, w)`. */\nfunction blossom(s: Seg, u: number, v: number, w: number): Point {\n const lerp = (a: Point, b: Point, t: number): Point => ({ x: a.x + (b.x - a.x) * t, y: a.y + (b.y - a.y) * t });\n const a = lerp(s.p0, s.c1, u), b = lerp(s.c1, s.c2, u), c = lerp(s.c2, s.p3, u);\n const d = lerp(a, b, v), e = lerp(b, c, v);\n return lerp(d, e, w);\n}\n\n/** The parameter, past `[0, 1]` on the side `from` gives, where cubic `s`\n * carried on as the same polynomial passes through `target`; null if it does not. */\nfunction extendTo(s: Seg, target: Point, from: 0 | 1, tol: number): number | null {\n const at = (u: number) => blossom(s, u, u, u);\n const d1 = (u: number): Point => {\n const a = blossom(s, u, u, 0), b = blossom(s, u, u, 1);\n return { x: 3 * (b.x - a.x), y: 3 * (b.y - a.y) };\n };\n const speed = Math.hypot(d1(from).x, d1(from).y);\n if (speed === 0) return null;\n let u = from + (from === 1 ? 1 : -1) * dist(at(from), target) / speed;\n for (let i = 0; i < 30; i++) {\n const p = at(u), d = d1(u);\n const dd = d.x * d.x + d.y * d.y;\n if (dd === 0) break;\n u -= ((p.x - target.x) * d.x + (p.y - target.y) * d.y) / dd;\n }\n return dist(at(u), target) <= tol ? u : null;\n}\n\n/** `s` with its start moved to `start` and its end to `end`, either left\n * where it was when undefined; null when a curve cannot reach them. */\nfunction reachSeg(s: Seg, start: Point | undefined, end: Point | undefined, tol: number): Seg | null {\n const p0 = start ?? s.p0, p3 = end ?? s.p3;\n if (s.line) return { line: true, p0, c1: p0, c2: p3, p3 };\n const u0 = start ? extendTo(s, start, 0, tol) : 0;\n const u1 = end ? extendTo(s, end, 1, tol) : 1;\n if (u0 === null || u1 === null) return null;\n return { line: false, p0, c1: blossom(s, u0, u0, u1), c2: blossom(s, u0, u1, u1), p3 };\n}\n\n/** A stretch of a contour's anchors, `from` to `to` going forward, that draws one corner. */\ninterface Run { from: number; to: number; trace: CornerTrace }\n\n/** Whether anchor `a`, reached or left by straight edge `edge`, ends a corner's\n * cut at `p`: it sits there, or it sits on the cut and the edge runs through\n * `p` to it, as when flattening has merged the cut's end into the edge. */\nfunction endsCut(a: Point, edge: Seg, p: Point, t: CornerTrace, tol: number): boolean {\n if (dist(a, p) <= tol) return true;\n return edge.line && onTrace(a, t, tol)\n && nearestOnLine(p.x, p.y, edge.p0.x, edge.p0.y, edge.p3.x, edge.p3.y).dist <= tol;\n}\n\nfunction findRun(c: Contour, t: CornerTrace, tol: number): Run | null {\n const n = c.anchors.length;\n for (let i = c.closed ? 0 : 1; i < n; i++) {\n for (const [first, last] of [[t.start, t.end], [t.end, t.start]] as const) {\n if (!endsCut(c.anchors[i], c.segs[(i - 1 + n) % n], first, t, tol)) continue;\n for (let j = i + 1, steps = 1; steps < c.segs.length; j++, steps++) {\n if (!c.closed && j >= n - 1) break;\n const a = c.anchors[j % n];\n const seg = c.segs[(j - 1) % n];\n if (!seg.line && !onTrace(blossom(seg, 0.5, 0.5, 0.5), t, tol)) break;\n if (endsCut(a, c.segs[j % n], last, t, tol)) return { from: i, to: j % n, trace: t };\n if (!onTrace(a, t, tol)) break;\n }\n }\n }\n return null;\n}\n\n/** The anchors a run covers, its ends included. */\nfunction covered(run: Run, n: number): number[] {\n const out: number[] = [];\n for (let k = run.from; ; k = (k + 1) % n) {\n out.push(k);\n if (k === run.to) return out;\n }\n}\n\ninterface Node { at: Point; spec: CornerSpec | null }\ninterface Rebuilt { nodes: Node[]; segs: Seg[]; closed: boolean; folded: Run[] }\n\n/** `c` with each of `runs` folded into its anchor; null when an edge next to one cannot reach it. */\nfunction foldContour(c: Contour, runs: readonly Run[], specs: readonly (CornerSpec | null)[], tol: number): Rebuilt | null {\n const n = c.anchors.length;\n const runAt = new Map<number, Run>();\n const inside = new Set<number>();\n for (const run of runs) {\n runAt.set(run.from, run);\n for (const k of covered(run, n)) inside.add(k);\n }\n let begin = 0;\n if (c.closed) {\n const free = c.anchors.findIndex((_a, k) => !inside.has(k));\n begin = free >= 0 ? free : runs[0]!.from;\n }\n const nodes: Node[] = [];\n const exits: number[] = []; // anchor each node's outgoing segment leaves from\n for (let step = 0, k = begin; step < n; ) {\n const run = runAt.get(k);\n if (run) {\n nodes.push({ at: run.trace.anchor, spec: run.trace.spec });\n exits.push(run.to);\n const span = covered(run, n).length;\n step += span;\n k = (run.to + 1) % n;\n } else {\n nodes.push({ at: c.anchors[k], spec: specs[k] ?? null });\n exits.push(k);\n step++;\n k = (k + 1) % n;\n }\n }\n const runEnds = new Set(runs.map((r) => r.to));\n const segs: Seg[] = [];\n const count = c.closed ? nodes.length : nodes.length - 1;\n for (let m = 0; m < count; m++) {\n const exit = exits[m]!;\n const moveStart = runEnds.has(exit) ? nodes[m]!.at : undefined;\n const moveEnd = runAt.has((exit + 1) % n) ? nodes[(m + 1) % nodes.length]!.at : undefined;\n const reached = reachSeg(c.segs[exit]!, moveStart, moveEnd, tol);\n if (!reached) return null;\n segs.push(reached);\n }\n return { nodes, segs, closed: c.closed, folded: [...runs] };\n}\n\nfunction write(contours: readonly Rebuilt[], result: PolygonPath): PolygonPath {\n const b = new PathBuilder();\n const specs: (CornerSpec | null)[] = [];\n for (const { nodes, segs, closed } of contours) {\n b.moveTo(nodes[0]!.at.x, nodes[0]!.at.y);\n specs.push(nodes[0]!.spec);\n segs.forEach((s, m) => {\n const to = nodes[(m + 1) % nodes.length]!;\n const closing = closed && m === segs.length - 1;\n if (closing && s.line) return;\n if (s.line) b.lineTo(to.at.x, to.at.y);\n else b.curveTo(s.c1.x, s.c1.y, s.c2.x, s.c2.y, to.at.x, to.at.y);\n specs.push(to.spec);\n });\n if (closed) b.close();\n }\n const { commands, coords } = b.build();\n const built: PolygonPath = { ...withoutCorners(result), commands, coords };\n const flat = flatAnchorIndices(built);\n const corners: (CornerSpec | null)[] = [];\n specs.forEach((spec, k) => {\n if (!spec) return;\n while (corners.length < flat[k]!) corners.push(null);\n corners[flat[k]!] = spec;\n });\n const compact = compactCorners(corners);\n return compact ? { ...built, corners: compact } : built;\n}\n\n/** Whether every corner folded into `path` draws again where its trace says. */\nfunction failedTraces(path: PolygonPath, tol: number, folded: readonly Run[]): Set<CornerTrace> {\n const bad = new Set(folded.map((r) => r.trace));\n for (const cut of cornerCuts(path)) {\n for (const t of bad) {\n if (dist(cut.anchor, t.anchor) > tol) continue;\n const same = (dist(cut.start, t.start) <= tol && dist(cut.end, t.end) <= tol)\n || (dist(cut.start, t.end) <= tol && dist(cut.end, t.start) <= tol);\n if (same) bad.delete(t);\n }\n }\n return bad;\n}\n\n/**\n * `result` with each of `traces` it draws whole folded back into its anchor\n * and spec. A trace counts as drawn when a run of anchors goes from one end\n * of its cut to the other along it, the edges either side carry on to its\n * anchor, and the folded corner cuts the same again. Specs `result` already\n * holds are kept.\n */\nexport function restoreCorners(result: PolygonPath, traces: readonly CornerTrace[], tolerance = CORNER_RESTORE_TOLERANCE): PolygonPath {\n const contours = decodeContours(result);\n if (!contours || traces.length === 0) return result;\n const rejected = new Set<CornerTrace>();\n for (let attempt = 0; attempt <= traces.length; attempt++) {\n const rebuilt: Rebuilt[] = [];\n for (const c of contours) {\n const runs: Run[] = [];\n const used = new Set<number>();\n for (const t of traces) {\n if (rejected.has(t)) continue;\n const run = findRun(c, t, tolerance);\n if (!run) continue;\n const span = covered(run, c.anchors.length);\n if (span.some((k) => used.has(k))) continue;\n span.forEach((k) => used.add(k));\n runs.push(run);\n }\n const specs = c.anchors.map((_a, k) => result.corners?.[c.first + k] ?? null);\n const folded = runs.length > 0 ? foldContour(c, runs, specs, tolerance) : null;\n if (runs.length > 0 && !folded) {\n runs.forEach((r) => rejected.add(r.trace));\n rebuilt.length = 0;\n break;\n }\n rebuilt.push(folded ?? { nodes: c.anchors.map((at, k) => ({ at, spec: specs[k]! })), segs: c.segs, closed: c.closed, folded: [] });\n }\n if (rebuilt.length !== contours.length) continue;\n const folded = rebuilt.flatMap((r) => r.folded);\n if (folded.length === 0) return result;\n const out = write(rebuilt, result);\n const bad = failedTraces(out, tolerance, folded);\n if (bad.size === 0) return out;\n bad.forEach((t) => rejected.add(t));\n }\n return result;\n}\n","/** A contour as Bézier segments: evaluating and splitting one, and where one crosses a line. */\n\nimport { splitCubicAt, splitQuadraticAt } from '../curve';\nimport type { Point } from '../paths/cubicMath';\n\n/** A Bézier segment by its control points: 2 = line, 3 = quadratic, 4 = cubic. */\nexport type Seg = Point[];\nexport type Contour = Seg[];\n\n/** A point on a contour: segment index and parameter. */\nexport interface Station {\n seg: number;\n t: number;\n pt: Point;\n}\n\nexport function evalSeg(s: Seg, t: number): Point {\n const u = 1 - t;\n if (s.length === 2) return { x: u * s[0].x + t * s[1].x, y: u * s[0].y + t * s[1].y };\n if (s.length === 3) {\n const a = u * u, b = 2 * u * t, c = t * t;\n return { x: a * s[0].x + b * s[1].x + c * s[2].x, y: a * s[0].y + b * s[1].y + c * s[2].y };\n }\n const a = u * u * u, b = 3 * u * u * t, c = 3 * u * t * t, d = t * t * t;\n return {\n x: a * s[0].x + b * s[1].x + c * s[2].x + d * s[3].x,\n y: a * s[0].y + b * s[1].y + c * s[2].y + d * s[3].y,\n };\n}\n\nexport function derivSeg(s: Seg, t: number): Point {\n const n = s.length - 1;\n const d: Seg = [];\n for (let i = 0; i < n; i++) d.push({ x: n * (s[i + 1].x - s[i].x), y: n * (s[i + 1].y - s[i].y) });\n return d.length === 1 ? d[0] : evalSeg(d, t);\n}\n\nfunction splitSeg(s: Seg, t: number): [Seg, Seg] {\n const pts = (c: ArrayLike<number>): Seg => {\n const out: Seg = [];\n for (let i = 0; i < c.length; i += 2) out.push({ x: c[i], y: c[i + 1] });\n return out;\n };\n if (s.length === 2) {\n const m = evalSeg(s, t);\n return [[s[0], m], [m, s[1]]];\n }\n if (s.length === 3) {\n const [l, r] = splitQuadraticAt(s[0].x, s[0].y, s[1].x, s[1].y, s[2].x, s[2].y, t);\n return [pts(l), pts(r)];\n }\n const [l, r] = splitCubicAt(s[0].x, s[0].y, s[1].x, s[1].y, s[2].x, s[2].y, s[3].x, s[3].y, t);\n return [pts(l), pts(r)];\n}\n\n/** The part of `s` between t0 and t1, with its ends snapped to the given points. */\nexport function subSeg(s: Seg, t0: number, t1: number, p0: Point, p1: Point): Seg | null {\n if (t1 - t0 <= 0) return null;\n let out = s;\n if (t0 > 0) out = splitSeg(out, t0)[1];\n const u = (t1 - t0) / (1 - t0);\n if (u < 1) out = splitSeg(out, u)[0];\n out = out.slice();\n out[0] = p0;\n out[out.length - 1] = p1;\n return out;\n}\n\nexport const reverseContour = (c: Contour): Contour => c.map((s) => s.slice().reverse()).reverse();\n\n/** Points along a contour for area and containment estimates. */\nexport function sampleContour(c: Contour): number[] {\n const out: number[] = [];\n for (const s of c) {\n const n = s.length === 2 ? 1 : 16;\n for (let i = 0; i < n; i++) {\n const p = evalSeg(s, i / n);\n out.push(p.x, p.y);\n }\n }\n return out;\n}\n\n/** Signed area; positive when the fill lies to the left of the direction of travel. */\nexport function signedArea(c: Contour): number {\n const pts = sampleContour(c);\n let a = 0;\n for (let i = 0; i < pts.length; i += 2) {\n const j = (i + 2) % pts.length;\n a += pts[i] * pts[j + 1] - pts[j] * pts[i + 1];\n }\n return a / 2;\n}\n\n/** Bernstein coefficients of the signed distance cross(d, P − o) along `s`. */\nexport function sideCoeffs(s: Seg, o: Point, d: Point): number[] {\n return s.map((p) => d.x * (p.y - o.y) - d.y * (p.x - o.x));\n}\n\nfunction bernstein(f: number[], t: number): number {\n const u = 1 - t;\n if (f.length === 2) return u * f[0] + t * f[1];\n if (f.length === 3) return u * u * f[0] + 2 * u * t * f[1] + t * t * f[2];\n return u * u * u * f[0] + 3 * u * u * t * f[1] + 3 * u * t * t * f[2] + t * t * t * f[3];\n}\n\ninterface SignChange { t: number; before: number; after: number }\n\n/**\n * Where the polynomial changes sign on [0, 1]. The interval is cut at the\n * derivative's roots so each piece is monotonic, then each sign change is\n * bisected. Tangencies have no sign change and are skipped. With\n * `zeroIsPositive` a zero counts as positive, so a change landing exactly on\n * an end is still seen once; otherwise zeros at the ends are left to the\n * caller.\n */\nexport function signChanges(f: number[], zeroIsPositive: boolean): SignChange[] {\n const sgn = (v: number) => (v > 0 ? 1 : v < 0 ? -1 : zeroIsPositive ? 1 : 0);\n const cuts = [0, ...criticalPoints(f), 1];\n const out: SignChange[] = [];\n for (let i = 0; i + 1 < cuts.length; i++) {\n let lo = cuts[i], hi = cuts[i + 1];\n const slo = sgn(bernstein(f, lo)), shi = sgn(bernstein(f, hi));\n if (slo === 0 && i > 0) {\n const before = sgn(bernstein(f, lo - 1e-7)), after = sgn(bernstein(f, lo + 1e-7));\n if (before * after < 0) out.push({ t: lo, before, after });\n }\n if (slo * shi >= 0) continue;\n for (let it = 0; it < 64; it++) {\n const mid = (lo + hi) / 2;\n if (sgn(bernstein(f, mid)) === slo) lo = mid; else hi = mid;\n }\n out.push({ t: (lo + hi) / 2, before: slo, after: shi });\n }\n return out;\n}\n\n/** Roots in (0, 1) of the derivative of a Bernstein polynomial of degree ≤ 3. */\nfunction criticalPoints(f: number[]): number[] {\n if (f.length < 3) return [];\n const n = f.length - 1;\n const d = f.slice(1).map((v, i) => n * (v - f[i]));\n // Power basis of the derivative: A t² + B t + C.\n let A = 0, B: number, C: number;\n if (d.length === 2) { B = d[1] - d[0]; C = d[0]; }\n else { A = d[0] - 2 * d[1] + d[2]; B = 2 * (d[1] - d[0]); C = d[0]; }\n const out: number[] = [];\n const scale = Math.max(Math.abs(A), Math.abs(B), Math.abs(C)) || 1;\n if (Math.abs(A) / scale < 1e-12) {\n if (Math.abs(B) / scale > 1e-12) out.push(-C / B);\n } else {\n const disc = B * B - 4 * A * C;\n if (disc >= 0) {\n const q = -0.5 * (B + Math.sign(B || 1) * Math.sqrt(disc));\n out.push(q / A);\n if (q !== 0) out.push(C / q);\n }\n }\n return out.filter((t) => t > 0 && t < 1).sort((x, y) => x - y);\n}\n\n/** Sign of f just after t = 0 (`fromStart`) or just before t = 1, read off the control values. */\nexport function endSide(f: number[], fromStart: boolean): number {\n const n = f.length;\n for (let i = 1; i < n; i++) {\n const v = fromStart ? f[i] : f[n - 1 - i];\n if (v !== 0) return Math.sign(v);\n }\n return 0;\n}\n","/** Reading a path into contours, and what a set of contours encloses. */\n\nimport { segmentsCross } from '../polyline';\nimport type { Path, PathFillRule } from '../path';\nimport { PATH_C, PATH_L, PATH_M, PATH_Q, PATH_Z } from '../commands';\nimport type { Point } from '../paths/cubicMath';\nimport { EPS } from '../scalar';\nimport { fillsOpenSubpaths } from '../openFill';\nimport { resolveCorners } from '../paths/corners';\nimport { type Contour, evalSeg, derivSeg, reverseContour, sideCoeffs, signChanges } from './contourSegments';\n\n/** The contours a fill of `path` covers: an open subpath closes implicitly\n * where a fill closes it, and is left out where one does not. */\nexport function parseContours(path: Path): Contour[] {\n const fillsOpen = path.kind === 'rect' || fillsOpenSubpaths(path);\n return parseSubpaths(path).filter((s) => s.closed || fillsOpen).map((s) => s.segs);\n}\n\nexport interface Subpath {\n segs: Contour;\n /** Closed by a `Z` (or a rect); the closing edge, if any, is in `segs`. */\n closed: boolean;\n}\n\n/**\n * Subpaths of `path` with their segments. With `implicitClose` (the default,\n * as a fill sees them) every subpath ends in its closing edge; without it,\n * only a subpath closed by `Z` does, as a stroke sees them.\n */\nexport function parseSubpaths(given: Path, implicitClose = true): Subpath[] {\n const path = resolveCorners(given);\n if (path.kind === 'rect') {\n const { x, y, width: w, height: h } = path;\n const p = [{ x, y }, { x: x + w, y }, { x: x + w, y: y + h }, { x, y: y + h }];\n return [{ segs: p.map((q, i) => [q, p[(i + 1) % 4]]), closed: true }];\n }\n const out: Subpath[] = [];\n let cur: Contour = [];\n let start: Point = { x: 0, y: 0 };\n let pen: Point = start;\n const finish = (closed: boolean) => {\n if (cur.length > 0 && (closed || implicitClose) && (pen.x !== start.x || pen.y !== start.y)) {\n cur.push([pen, start]);\n }\n if (cur.length > 0) out.push({ segs: cur, closed });\n cur = [];\n pen = start;\n };\n const c = path.coords;\n let k = 0;\n for (const cmd of path.commands) {\n if (cmd === PATH_M) {\n finish(false);\n start = pen = { x: c[k], y: c[k + 1] };\n k += 2;\n } else if (cmd === PATH_L) {\n const e = { x: c[k], y: c[k + 1] };\n if (e.x !== pen.x || e.y !== pen.y) cur.push([pen, e]);\n pen = e;\n k += 2;\n } else if (cmd === PATH_Q) {\n const e = { x: c[k + 2], y: c[k + 3] };\n cur.push([pen, { x: c[k], y: c[k + 1] }, e]);\n pen = e;\n k += 4;\n } else if (cmd === PATH_C) {\n const e = { x: c[k + 4], y: c[k + 5] };\n cur.push([pen, { x: c[k], y: c[k + 1] }, { x: c[k + 2], y: c[k + 3] }, e]);\n pen = e;\n k += 6;\n } else if (cmd === PATH_Z) {\n finish(true);\n }\n }\n finish(false);\n return out;\n}\n\n/** Whether any contour crosses another or itself, judged on a flattening. */\nexport function contoursIntersect(contours: Contour[], tol: number): boolean {\n type Edge = { x0: number; y0: number; x1: number; y1: number; c: number; i: number; n: number };\n const edges: Edge[] = [];\n contours.forEach((contour, ci) => {\n const pts: Point[] = [];\n for (const s of contour) {\n let n = 1;\n if (s.length > 2) {\n let len = 0;\n for (let i = 0; i + 1 < s.length; i++) len += Math.hypot(s[i + 1].x - s[i].x, s[i + 1].y - s[i].y);\n n = Math.min(64, Math.max(2, Math.ceil(Math.sqrt(len / Math.max(tol, 1e-3)))));\n }\n for (let i = 0; i < n; i++) pts.push(evalSeg(s, i / n));\n }\n for (let i = 0; i < pts.length; i++) {\n const p = pts[i], q = pts[(i + 1) % pts.length];\n edges.push({ x0: p.x, y0: p.y, x1: q.x, y1: q.y, c: ci, i, n: pts.length });\n }\n });\n for (let i = 0; i < edges.length; i++) {\n const e = edges[i];\n for (let j = i + 1; j < edges.length; j++) {\n const f = edges[j];\n if (e.c === f.c && (j - i === 1 || (i === 0 && f.i === f.n - 1))) continue;\n if (Math.max(e.x0, e.x1) < Math.min(f.x0, f.x1) || Math.max(f.x0, f.x1) < Math.min(e.x0, e.x1)) continue;\n if (Math.max(e.y0, e.y1) < Math.min(f.y0, f.y1) || Math.max(f.y0, f.y1) < Math.min(e.y0, e.y1)) continue;\n if (segmentsCross(e.x0, e.y0, e.x1, e.y1, f.x0, f.y0, f.x1, f.y1)) return true;\n }\n }\n return false;\n}\n\n/** Winding number of `q`, by a ray cast in +x against the exact curves. */\nexport function windingAt(q: Point, contours: Contour[]): number {\n const dir = { x: 1, y: 0 };\n let w = 0;\n for (const contour of contours) {\n for (const s of contour) {\n for (const c of signChanges(sideCoeffs(s, q, dir), true)) {\n if (evalSeg(s, c.t).x > q.x) w += c.after > 0 ? 1 : -1;\n }\n }\n }\n return w;\n}\n\n/** The diagonal of the box around every control point of `contours`. */\nexport function extentOf(contours: Contour[]): number {\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (const c of contours) for (const s of c) for (const p of s) {\n minX = Math.min(minX, p.x); maxX = Math.max(maxX, p.x);\n minY = Math.min(minY, p.y); maxY = Math.max(maxY, p.y);\n }\n return Math.hypot(maxX - minX, maxY - minY);\n}\n\n/** The area below which a region cut from `contours` is rounding, not a piece. */\nexport function negligibleArea(contours: Contour[]): number {\n const extent = extentOf(contours);\n return extent * extent * EPS * EPS;\n}\n\n/**\n * The contours that bound the fill, each turned so the fill lies on its left.\n * A contour with fill on both sides or neither (a same-direction inner ring\n * under nonzero) bounds nothing and is dropped.\n */\nexport function orientBoundaries(contours: Contour[], fillRule: PathFillRule): Contour[] {\n const filled = (q: Point) => {\n const w = windingAt(q, contours);\n return fillRule === 'evenodd' ? (w & 1) !== 0 : w !== 0;\n };\n const eps = Math.max(extentOf(contours) * 1e-6, 1e-9);\n\n const out: Contour[] = [];\n for (const contour of contours) {\n let probe = contour[0];\n let best = -1;\n for (const s of contour) {\n const len = Math.hypot(s[s.length - 1].x - s[0].x, s[s.length - 1].y - s[0].y);\n if (len > best) { best = len; probe = s; }\n }\n const p = evalSeg(probe, 0.5);\n let tan = derivSeg(probe, 0.5);\n const tl = Math.hypot(tan.x, tan.y);\n if (tl === 0) continue;\n tan = { x: tan.x / tl, y: tan.y / tl };\n const left = filled({ x: p.x - tan.y * eps, y: p.y + tan.x * eps });\n const right = filled({ x: p.x + tan.y * eps, y: p.y - tan.x * eps });\n if (left && !right) out.push(contour);\n else if (right && !left) out.push(reverseContour(contour));\n }\n return out;\n}\n","/** Grouping traced loops into regions, and writing contours back out as paths. */\n\nimport { pointInPolygon } from '../polyline';\nimport type { PolygonPath, PathFillRule } from '../path';\nimport { PATH_C, PATH_L, PATH_M, PATH_Q, PATH_Z } from '../commands';\nimport { type Contour, evalSeg, sampleContour, signedArea } from './contourSegments';\nimport type { Subpath } from './contours';\n\n/** Group loops into regions: each positive loop with the holes it immediately contains. */\nexport function assembleRegions(outers: Contour[], holes: Contour[]): Contour[][] {\n const regions = outers.map((o) => ({ loops: [o], ring: sampleContour(o), area: signedArea(o) }));\n for (const h of holes) {\n const hp = evalSeg(h[0], 0.5);\n let best: (typeof regions)[number] | null = null;\n for (const r of regions) {\n if (pointInPolygon(r.ring, hp.x, hp.y) && (!best || r.area < best.area)) best = r;\n }\n best?.loops.push(h);\n }\n return regions.map((r) => r.loops);\n}\n\nexport const regionArea = (r: Contour[]): number => r.reduce((s, c) => s + signedArea(c), 0);\n\nexport const toPath = (loops: Contour[], fillRule: PathFillRule): PolygonPath =>\n writePath(loops.map((segs) => ({ segs, closed: true })), fillRule);\n\nexport function writePath(subpaths: Subpath[], fillRule: PathFillRule): PolygonPath {\n const cmds: number[] = [];\n const xs: number[] = [];\n for (const { segs, closed } of subpaths) {\n cmds.push(PATH_M);\n xs.push(segs[0][0].x, segs[0][0].y);\n for (const s of segs) {\n cmds.push(s.length === 2 ? PATH_L : s.length === 3 ? PATH_Q : PATH_C);\n for (let i = 1; i < s.length; i++) xs.push(s[i].x, s[i].y);\n }\n if (closed) cmds.push(PATH_Z);\n }\n return { kind: 'polygon', commands: new Uint8Array(cmds), coords: new Float32Array(xs), fillRule };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/paths/cornerCarry.ts","../src/paths/cornerRestore.ts","../src/booleans/contourSegments.ts","../src/booleans/contours.ts","../src/booleans/cutRegions.ts"],"names":["a","b","u","folded","c","l","r"],"mappings":"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","file":"chunk-4Y67BZL5.js","sourcesContent":["/**\n * Carrying corner specs onto a path rebuilt from another: a split, a rejoin,\n * a reversal. Specs are keyed by flat anchor index, so a rewrite that moves\n * anchors must renumber them rather than keep the old array.\n */\nimport { forEachSegment, pathCommandCoordCount, PATH_C, PATH_M, PATH_Q, PATH_Z } from '../commands';\nimport type { PolygonPath } from '../path';\nimport { compactCorners, withoutCorners, type CornerSpec } from './cornerSpec';\n\nconst flatCache = new WeakMap<PolygonPath, Int32Array>();\n\n/**\n * For each anchor command of `path` (each M, L, C, or Q, as `countPathAnchors`\n * numbers them), its flat anchor index, the numbering `PolygonPath.corners`\n * uses: a closing curve that ends on its subpath's first point folds onto\n * that anchor, as `pathToAnchors` folds it.\n */\nexport function flatAnchorIndices(path: PolygonPath): Int32Array {\n const hit = flatCache.get(path);\n if (hit) return hit;\n const { commands, coords } = path;\n const out: number[] = [];\n let flat = 0, first = 0, count = 0;\n let sx = 0, sy = 0, ex = 0, ey = 0, curve = false;\n forEachSegment(commands, coords, (cmd, ci) => {\n if (cmd === PATH_Z) {\n if (count > 1 && curve && ex === sx && ey === sy) { out[out.length - 1] = first; flat--; }\n count = 0;\n return;\n }\n const n = pathCommandCoordCount(cmd);\n ex = coords[ci + n - 2]; ey = coords[ci + n - 1];\n curve = cmd === PATH_C || cmd === PATH_Q;\n if (cmd === PATH_M || count === 0) { first = flat; sx = ex; sy = ey; count = 0; }\n count++;\n out.push(flat++);\n });\n const result = Int32Array.from(out);\n flatCache.set(path, result);\n return result;\n}\n\n/**\n * `to` with `from`'s corner specs carried across, where `sources[k]` is the\n * anchor command of `from` that anchor command `k` of `to` was drawn from, or\n * -1 for one with no source. Each spec lands once, on the first anchor drawn\n * from its own; any specs `to` already had are dropped.\n */\nexport function carryCorners(from: PolygonPath, to: PolygonPath, sources: ArrayLike<number>): PolygonPath {\n const bare = withoutCorners(to);\n const specs = from.corners;\n if (!specs) return bare;\n const fromFlat = flatAnchorIndices(from);\n const toFlat = flatAnchorIndices(to);\n const placed = new Set<number>();\n const next: (CornerSpec | null)[] = [];\n for (let k = 0; k < toFlat.length; k++) {\n const s = sources[k];\n if (s === undefined || s < 0 || s >= fromFlat.length) continue;\n const f = fromFlat[s];\n const spec = specs[f];\n if (!spec || placed.has(f)) continue;\n placed.add(f);\n while (next.length < toFlat[k]) next.push(null);\n next[toFlat[k]] = spec;\n }\n const corners = compactCorners(next);\n return corners ? { ...bare, corners } : bare;\n}\n\n/** `count` consecutive anchor command indices from `start`: the sources of a\n * contiguous slice. */\nexport function anchorRange(start: number, count: number): Int32Array {\n const out = new Int32Array(count);\n for (let i = 0; i < count; i++) out[i] = start + i;\n return out;\n}\n","/**\n * Putting corner specs back on a path an operation rebuilt from expanded\n * geometry. Booleans, trims and cuts work on what a path draws, its corners\n * cut and spanned (`resolveCorners`); wherever a corner's cut comes through\n * whole, it folds back into its anchor and spec, and only a corner the\n * operation cut into or moved stays expanded.\n */\nimport type { Path, PolygonPath } from '../path';\nimport { nearestOnCubic, nearestOnLine } from '../nearest';\nimport { PathBuilder } from './builder';\nimport { flatAnchorIndices } from './cornerCarry';\nimport { decodeContours, type Contour, type Seg } from './cornerSegments';\nimport type { Point } from './cubicMath';\nimport type { CornerPiece } from './cornerShape';\nimport { compactCorners, withoutCorners, type CornerSpec } from './cornerSpec';\nimport { cornerCuts } from './corners';\n\n/** A corner a rebuilt path may hold expanded: the anchor and spec it folds\n * back into, and the cut it is drawn as, from `start` to `end`. */\nexport interface CornerTrace {\n anchor: Point;\n spec: CornerSpec;\n start: Point;\n end: Point;\n pieces: readonly CornerPiece[];\n}\n\n/** How far a point may sit from where a corner draws it and still count as on it. */\nexport const CORNER_RESTORE_TOLERANCE = 1e-3;\n\n/** The corners `path` cuts, as {@link restoreCorners} looks for them. */\nexport function cornerTraces(path: Path): CornerTrace[] {\n if (path.kind !== 'polygon') return [];\n return cornerCuts(path).map(({ anchor, spec, start, end, pieces }) => ({ anchor, spec, start, end, pieces }));\n}\n\n/**\n * `result` with the corners of `sources` folded back in wherever it still\n * draws them whole: an operation's output, rebuilt from what the sources\n * draw. A corner the operation cut into, or whose edges it moved, stays as\n * the plain geometry it already is.\n */\nexport function keepCorners(sources: readonly Path[], result: PolygonPath, tolerance = CORNER_RESTORE_TOLERANCE): PolygonPath {\n const traces = sources.flatMap(cornerTraces);\n return traces.length === 0 ? result : restoreCorners(result, traces, tolerance);\n}\n\nconst dist = (a: Point, b: Point): number => Math.hypot(a.x - b.x, a.y - b.y);\n\nfunction onTrace(p: Point, t: CornerTrace, tol: number): boolean {\n let from = t.start;\n for (const piece of t.pieces) {\n const d = piece.kind === 'line'\n ? nearestOnLine(p.x, p.y, from.x, from.y, piece.to.x, piece.to.y).dist\n : nearestOnCubic(p.x, p.y, from.x, from.y, piece.c1.x, piece.c1.y, piece.c2.x, piece.c2.y, piece.to.x, piece.to.y).dist;\n if (d <= tol) return true;\n from = piece.to;\n }\n return false;\n}\n\n/** The blossom of cubic `s` at `(u, v, w)`. */\nfunction blossom(s: Seg, u: number, v: number, w: number): Point {\n const lerp = (a: Point, b: Point, t: number): Point => ({ x: a.x + (b.x - a.x) * t, y: a.y + (b.y - a.y) * t });\n const a = lerp(s.p0, s.c1, u), b = lerp(s.c1, s.c2, u), c = lerp(s.c2, s.p3, u);\n const d = lerp(a, b, v), e = lerp(b, c, v);\n return lerp(d, e, w);\n}\n\n/** The parameter, past `[0, 1]` on the side `from` gives, where cubic `s`\n * carried on as the same polynomial passes through `target`; null if it does not. */\nfunction extendTo(s: Seg, target: Point, from: 0 | 1, tol: number): number | null {\n const at = (u: number) => blossom(s, u, u, u);\n const d1 = (u: number): Point => {\n const a = blossom(s, u, u, 0), b = blossom(s, u, u, 1);\n return { x: 3 * (b.x - a.x), y: 3 * (b.y - a.y) };\n };\n const speed = Math.hypot(d1(from).x, d1(from).y);\n if (speed === 0) return null;\n let u = from + (from === 1 ? 1 : -1) * dist(at(from), target) / speed;\n for (let i = 0; i < 30; i++) {\n const p = at(u), d = d1(u);\n const dd = d.x * d.x + d.y * d.y;\n if (dd === 0) break;\n u -= ((p.x - target.x) * d.x + (p.y - target.y) * d.y) / dd;\n }\n return dist(at(u), target) <= tol ? u : null;\n}\n\n/** `s` with its start moved to `start` and its end to `end`, either left\n * where it was when undefined; null when a curve cannot reach them. */\nfunction reachSeg(s: Seg, start: Point | undefined, end: Point | undefined, tol: number): Seg | null {\n const p0 = start ?? s.p0, p3 = end ?? s.p3;\n if (s.line) return { line: true, p0, c1: p0, c2: p3, p3 };\n const u0 = start ? extendTo(s, start, 0, tol) : 0;\n const u1 = end ? extendTo(s, end, 1, tol) : 1;\n if (u0 === null || u1 === null) return null;\n return { line: false, p0, c1: blossom(s, u0, u0, u1), c2: blossom(s, u0, u1, u1), p3 };\n}\n\n/** A stretch of a contour's anchors, `from` to `to` going forward, that draws one corner. */\ninterface Run { from: number; to: number; trace: CornerTrace }\n\n/** Whether anchor `a`, reached or left by straight edge `edge`, ends a corner's\n * cut at `p`: it sits there, or it sits on the cut and the edge runs through\n * `p` to it, as when flattening has merged the cut's end into the edge. */\nfunction endsCut(a: Point, edge: Seg, p: Point, t: CornerTrace, tol: number): boolean {\n if (dist(a, p) <= tol) return true;\n return edge.line && onTrace(a, t, tol)\n && nearestOnLine(p.x, p.y, edge.p0.x, edge.p0.y, edge.p3.x, edge.p3.y).dist <= tol;\n}\n\nfunction findRun(c: Contour, t: CornerTrace, tol: number): Run | null {\n const n = c.anchors.length;\n for (let i = c.closed ? 0 : 1; i < n; i++) {\n for (const [first, last] of [[t.start, t.end], [t.end, t.start]] as const) {\n if (!endsCut(c.anchors[i], c.segs[(i - 1 + n) % n], first, t, tol)) continue;\n for (let j = i + 1, steps = 1; steps < c.segs.length; j++, steps++) {\n if (!c.closed && j >= n - 1) break;\n const a = c.anchors[j % n];\n const seg = c.segs[(j - 1) % n];\n if (!seg.line && !onTrace(blossom(seg, 0.5, 0.5, 0.5), t, tol)) break;\n if (endsCut(a, c.segs[j % n], last, t, tol)) return { from: i, to: j % n, trace: t };\n if (!onTrace(a, t, tol)) break;\n }\n }\n }\n return null;\n}\n\n/** The anchors a run covers, its ends included. */\nfunction covered(run: Run, n: number): number[] {\n const out: number[] = [];\n for (let k = run.from; ; k = (k + 1) % n) {\n out.push(k);\n if (k === run.to) return out;\n }\n}\n\ninterface Node { at: Point; spec: CornerSpec | null }\ninterface Rebuilt { nodes: Node[]; segs: Seg[]; closed: boolean; folded: Run[] }\n\n/** `c` with each of `runs` folded into its anchor; null when an edge next to one cannot reach it. */\nfunction foldContour(c: Contour, runs: readonly Run[], specs: readonly (CornerSpec | null)[], tol: number): Rebuilt | null {\n const n = c.anchors.length;\n const runAt = new Map<number, Run>();\n const inside = new Set<number>();\n for (const run of runs) {\n runAt.set(run.from, run);\n for (const k of covered(run, n)) inside.add(k);\n }\n let begin = 0;\n if (c.closed) {\n const free = c.anchors.findIndex((_a, k) => !inside.has(k));\n begin = free >= 0 ? free : runs[0]!.from;\n }\n const nodes: Node[] = [];\n const exits: number[] = []; // anchor each node's outgoing segment leaves from\n for (let step = 0, k = begin; step < n; ) {\n const run = runAt.get(k);\n if (run) {\n nodes.push({ at: run.trace.anchor, spec: run.trace.spec });\n exits.push(run.to);\n const span = covered(run, n).length;\n step += span;\n k = (run.to + 1) % n;\n } else {\n nodes.push({ at: c.anchors[k], spec: specs[k] ?? null });\n exits.push(k);\n step++;\n k = (k + 1) % n;\n }\n }\n const runEnds = new Set(runs.map((r) => r.to));\n const segs: Seg[] = [];\n const count = c.closed ? nodes.length : nodes.length - 1;\n for (let m = 0; m < count; m++) {\n const exit = exits[m]!;\n const moveStart = runEnds.has(exit) ? nodes[m]!.at : undefined;\n const moveEnd = runAt.has((exit + 1) % n) ? nodes[(m + 1) % nodes.length]!.at : undefined;\n const reached = reachSeg(c.segs[exit]!, moveStart, moveEnd, tol);\n if (!reached) return null;\n segs.push(reached);\n }\n return { nodes, segs, closed: c.closed, folded: [...runs] };\n}\n\nfunction write(contours: readonly Rebuilt[], result: PolygonPath): PolygonPath {\n const b = new PathBuilder();\n const specs: (CornerSpec | null)[] = [];\n for (const { nodes, segs, closed } of contours) {\n b.moveTo(nodes[0]!.at.x, nodes[0]!.at.y);\n specs.push(nodes[0]!.spec);\n segs.forEach((s, m) => {\n const to = nodes[(m + 1) % nodes.length]!;\n const closing = closed && m === segs.length - 1;\n if (closing && s.line) return;\n if (s.line) b.lineTo(to.at.x, to.at.y);\n else b.curveTo(s.c1.x, s.c1.y, s.c2.x, s.c2.y, to.at.x, to.at.y);\n specs.push(to.spec);\n });\n if (closed) b.close();\n }\n const { commands, coords } = b.build();\n const built: PolygonPath = { ...withoutCorners(result), commands, coords };\n const flat = flatAnchorIndices(built);\n const corners: (CornerSpec | null)[] = [];\n specs.forEach((spec, k) => {\n if (!spec) return;\n while (corners.length < flat[k]!) corners.push(null);\n corners[flat[k]!] = spec;\n });\n const compact = compactCorners(corners);\n return compact ? { ...built, corners: compact } : built;\n}\n\n/** Whether every corner folded into `path` draws again where its trace says. */\nfunction failedTraces(path: PolygonPath, tol: number, folded: readonly Run[]): Set<CornerTrace> {\n const bad = new Set(folded.map((r) => r.trace));\n for (const cut of cornerCuts(path)) {\n for (const t of bad) {\n if (dist(cut.anchor, t.anchor) > tol) continue;\n const same = (dist(cut.start, t.start) <= tol && dist(cut.end, t.end) <= tol)\n || (dist(cut.start, t.end) <= tol && dist(cut.end, t.start) <= tol);\n if (same) bad.delete(t);\n }\n }\n return bad;\n}\n\n/**\n * `result` with each of `traces` it draws whole folded back into its anchor\n * and spec. A trace counts as drawn when a run of anchors goes from one end\n * of its cut to the other along it, the edges either side carry on to its\n * anchor, and the folded corner cuts the same again. Specs `result` already\n * holds are kept.\n */\nexport function restoreCorners(result: PolygonPath, traces: readonly CornerTrace[], tolerance = CORNER_RESTORE_TOLERANCE): PolygonPath {\n const contours = decodeContours(result);\n if (!contours || traces.length === 0) return result;\n const rejected = new Set<CornerTrace>();\n for (let attempt = 0; attempt <= traces.length; attempt++) {\n const rebuilt: Rebuilt[] = [];\n for (const c of contours) {\n const runs: Run[] = [];\n const used = new Set<number>();\n for (const t of traces) {\n if (rejected.has(t)) continue;\n const run = findRun(c, t, tolerance);\n if (!run) continue;\n const span = covered(run, c.anchors.length);\n if (span.some((k) => used.has(k))) continue;\n span.forEach((k) => used.add(k));\n runs.push(run);\n }\n const specs = c.anchors.map((_a, k) => result.corners?.[c.first + k] ?? null);\n const folded = runs.length > 0 ? foldContour(c, runs, specs, tolerance) : null;\n if (runs.length > 0 && !folded) {\n runs.forEach((r) => rejected.add(r.trace));\n rebuilt.length = 0;\n break;\n }\n rebuilt.push(folded ?? { nodes: c.anchors.map((at, k) => ({ at, spec: specs[k]! })), segs: c.segs, closed: c.closed, folded: [] });\n }\n if (rebuilt.length !== contours.length) continue;\n const folded = rebuilt.flatMap((r) => r.folded);\n if (folded.length === 0) return result;\n const out = write(rebuilt, result);\n const bad = failedTraces(out, tolerance, folded);\n if (bad.size === 0) return out;\n bad.forEach((t) => rejected.add(t));\n }\n return result;\n}\n","/** A contour as Bézier segments: evaluating and splitting one, and where one crosses a line. */\n\nimport { splitCubicAt, splitQuadraticAt } from '../curve';\nimport type { Point } from '../paths/cubicMath';\n\n/** A Bézier segment by its control points: 2 = line, 3 = quadratic, 4 = cubic. */\nexport type Seg = Point[];\nexport type Contour = Seg[];\n\n/** A point on a contour: segment index and parameter. */\nexport interface Station {\n seg: number;\n t: number;\n pt: Point;\n}\n\nexport function evalSeg(s: Seg, t: number): Point {\n const u = 1 - t;\n if (s.length === 2) return { x: u * s[0].x + t * s[1].x, y: u * s[0].y + t * s[1].y };\n if (s.length === 3) {\n const a = u * u, b = 2 * u * t, c = t * t;\n return { x: a * s[0].x + b * s[1].x + c * s[2].x, y: a * s[0].y + b * s[1].y + c * s[2].y };\n }\n const a = u * u * u, b = 3 * u * u * t, c = 3 * u * t * t, d = t * t * t;\n return {\n x: a * s[0].x + b * s[1].x + c * s[2].x + d * s[3].x,\n y: a * s[0].y + b * s[1].y + c * s[2].y + d * s[3].y,\n };\n}\n\nexport function derivSeg(s: Seg, t: number): Point {\n const n = s.length - 1;\n const d: Seg = [];\n for (let i = 0; i < n; i++) d.push({ x: n * (s[i + 1].x - s[i].x), y: n * (s[i + 1].y - s[i].y) });\n return d.length === 1 ? d[0] : evalSeg(d, t);\n}\n\nfunction splitSeg(s: Seg, t: number): [Seg, Seg] {\n const pts = (c: ArrayLike<number>): Seg => {\n const out: Seg = [];\n for (let i = 0; i < c.length; i += 2) out.push({ x: c[i], y: c[i + 1] });\n return out;\n };\n if (s.length === 2) {\n const m = evalSeg(s, t);\n return [[s[0], m], [m, s[1]]];\n }\n if (s.length === 3) {\n const [l, r] = splitQuadraticAt(s[0].x, s[0].y, s[1].x, s[1].y, s[2].x, s[2].y, t);\n return [pts(l), pts(r)];\n }\n const [l, r] = splitCubicAt(s[0].x, s[0].y, s[1].x, s[1].y, s[2].x, s[2].y, s[3].x, s[3].y, t);\n return [pts(l), pts(r)];\n}\n\n/** The part of `s` between t0 and t1, with its ends snapped to the given points. */\nexport function subSeg(s: Seg, t0: number, t1: number, p0: Point, p1: Point): Seg | null {\n if (t1 - t0 <= 0) return null;\n let out = s;\n if (t0 > 0) out = splitSeg(out, t0)[1];\n const u = (t1 - t0) / (1 - t0);\n if (u < 1) out = splitSeg(out, u)[0];\n out = out.slice();\n out[0] = p0;\n out[out.length - 1] = p1;\n return out;\n}\n\nexport const reverseContour = (c: Contour): Contour => c.map((s) => s.slice().reverse()).reverse();\n\n/** Points along a contour for area and containment estimates. */\nexport function sampleContour(c: Contour): number[] {\n const out: number[] = [];\n for (const s of c) {\n const n = s.length === 2 ? 1 : 16;\n for (let i = 0; i < n; i++) {\n const p = evalSeg(s, i / n);\n out.push(p.x, p.y);\n }\n }\n return out;\n}\n\n/** Signed area; positive when the fill lies to the left of the direction of travel. */\nexport function signedArea(c: Contour): number {\n const pts = sampleContour(c);\n let a = 0;\n for (let i = 0; i < pts.length; i += 2) {\n const j = (i + 2) % pts.length;\n a += pts[i] * pts[j + 1] - pts[j] * pts[i + 1];\n }\n return a / 2;\n}\n\n/** Bernstein coefficients of the signed distance cross(d, P − o) along `s`. */\nexport function sideCoeffs(s: Seg, o: Point, d: Point): number[] {\n return s.map((p) => d.x * (p.y - o.y) - d.y * (p.x - o.x));\n}\n\nfunction bernstein(f: number[], t: number): number {\n const u = 1 - t;\n if (f.length === 2) return u * f[0] + t * f[1];\n if (f.length === 3) return u * u * f[0] + 2 * u * t * f[1] + t * t * f[2];\n return u * u * u * f[0] + 3 * u * u * t * f[1] + 3 * u * t * t * f[2] + t * t * t * f[3];\n}\n\ninterface SignChange { t: number; before: number; after: number }\n\n/**\n * Where the polynomial changes sign on [0, 1]. The interval is cut at the\n * derivative's roots so each piece is monotonic, then each sign change is\n * bisected. Tangencies have no sign change and are skipped. With\n * `zeroIsPositive` a zero counts as positive, so a change landing exactly on\n * an end is still seen once; otherwise zeros at the ends are left to the\n * caller.\n */\nexport function signChanges(f: number[], zeroIsPositive: boolean): SignChange[] {\n const sgn = (v: number) => (v > 0 ? 1 : v < 0 ? -1 : zeroIsPositive ? 1 : 0);\n const cuts = [0, ...criticalPoints(f), 1];\n const out: SignChange[] = [];\n for (let i = 0; i + 1 < cuts.length; i++) {\n let lo = cuts[i], hi = cuts[i + 1];\n const slo = sgn(bernstein(f, lo)), shi = sgn(bernstein(f, hi));\n if (slo === 0 && i > 0) {\n const before = sgn(bernstein(f, lo - 1e-7)), after = sgn(bernstein(f, lo + 1e-7));\n if (before * after < 0) out.push({ t: lo, before, after });\n }\n if (slo * shi >= 0) continue;\n for (let it = 0; it < 64; it++) {\n const mid = (lo + hi) / 2;\n if (sgn(bernstein(f, mid)) === slo) lo = mid; else hi = mid;\n }\n out.push({ t: (lo + hi) / 2, before: slo, after: shi });\n }\n return out;\n}\n\n/** Roots in (0, 1) of the derivative of a Bernstein polynomial of degree ≤ 3. */\nfunction criticalPoints(f: number[]): number[] {\n if (f.length < 3) return [];\n const n = f.length - 1;\n const d = f.slice(1).map((v, i) => n * (v - f[i]));\n // Power basis of the derivative: A t² + B t + C.\n let A = 0, B: number, C: number;\n if (d.length === 2) { B = d[1] - d[0]; C = d[0]; }\n else { A = d[0] - 2 * d[1] + d[2]; B = 2 * (d[1] - d[0]); C = d[0]; }\n const out: number[] = [];\n const scale = Math.max(Math.abs(A), Math.abs(B), Math.abs(C)) || 1;\n if (Math.abs(A) / scale < 1e-12) {\n if (Math.abs(B) / scale > 1e-12) out.push(-C / B);\n } else {\n const disc = B * B - 4 * A * C;\n if (disc >= 0) {\n const q = -0.5 * (B + Math.sign(B || 1) * Math.sqrt(disc));\n out.push(q / A);\n if (q !== 0) out.push(C / q);\n }\n }\n return out.filter((t) => t > 0 && t < 1).sort((x, y) => x - y);\n}\n\n/** Sign of f just after t = 0 (`fromStart`) or just before t = 1, read off the control values. */\nexport function endSide(f: number[], fromStart: boolean): number {\n const n = f.length;\n for (let i = 1; i < n; i++) {\n const v = fromStart ? f[i] : f[n - 1 - i];\n if (v !== 0) return Math.sign(v);\n }\n return 0;\n}\n","/** Reading a path into contours, and what a set of contours encloses. */\n\nimport { segmentsCross } from '../polyline';\nimport type { Path, PathFillRule } from '../path';\nimport { PATH_C, PATH_L, PATH_M, PATH_Q, PATH_Z } from '../commands';\nimport type { Point } from '../paths/cubicMath';\nimport { EPS } from '../scalar';\nimport { fillsOpenSubpaths } from '../openFill';\nimport { resolveCorners } from '../paths/corners';\nimport { type Contour, evalSeg, derivSeg, reverseContour, sideCoeffs, signChanges } from './contourSegments';\n\n/** The contours a fill of `path` covers: an open subpath closes implicitly\n * where a fill closes it, and is left out where one does not. */\nexport function parseContours(path: Path): Contour[] {\n const fillsOpen = path.kind === 'rect' || fillsOpenSubpaths(path);\n return parseSubpaths(path).filter((s) => s.closed || fillsOpen).map((s) => s.segs);\n}\n\nexport interface Subpath {\n segs: Contour;\n /** Closed by a `Z` (or a rect); the closing edge, if any, is in `segs`. */\n closed: boolean;\n}\n\n/**\n * Subpaths of `path` with their segments. With `implicitClose` (the default,\n * as a fill sees them) every subpath ends in its closing edge; without it,\n * only a subpath closed by `Z` does, as a stroke sees them.\n */\nexport function parseSubpaths(given: Path, implicitClose = true): Subpath[] {\n const path = resolveCorners(given);\n if (path.kind === 'rect') {\n const { x, y, width: w, height: h } = path;\n const p = [{ x, y }, { x: x + w, y }, { x: x + w, y: y + h }, { x, y: y + h }];\n return [{ segs: p.map((q, i) => [q, p[(i + 1) % 4]]), closed: true }];\n }\n const out: Subpath[] = [];\n let cur: Contour = [];\n let start: Point = { x: 0, y: 0 };\n let pen: Point = start;\n const finish = (closed: boolean) => {\n if (cur.length > 0 && (closed || implicitClose) && (pen.x !== start.x || pen.y !== start.y)) {\n cur.push([pen, start]);\n }\n if (cur.length > 0) out.push({ segs: cur, closed });\n cur = [];\n pen = start;\n };\n const c = path.coords;\n let k = 0;\n for (const cmd of path.commands) {\n if (cmd === PATH_M) {\n finish(false);\n start = pen = { x: c[k], y: c[k + 1] };\n k += 2;\n } else if (cmd === PATH_L) {\n const e = { x: c[k], y: c[k + 1] };\n if (e.x !== pen.x || e.y !== pen.y) cur.push([pen, e]);\n pen = e;\n k += 2;\n } else if (cmd === PATH_Q) {\n const e = { x: c[k + 2], y: c[k + 3] };\n cur.push([pen, { x: c[k], y: c[k + 1] }, e]);\n pen = e;\n k += 4;\n } else if (cmd === PATH_C) {\n const e = { x: c[k + 4], y: c[k + 5] };\n cur.push([pen, { x: c[k], y: c[k + 1] }, { x: c[k + 2], y: c[k + 3] }, e]);\n pen = e;\n k += 6;\n } else if (cmd === PATH_Z) {\n finish(true);\n }\n }\n finish(false);\n return out;\n}\n\n/** Whether any contour crosses another or itself, judged on a flattening. */\nexport function contoursIntersect(contours: Contour[], tol: number): boolean {\n type Edge = { x0: number; y0: number; x1: number; y1: number; c: number; i: number; n: number };\n const edges: Edge[] = [];\n contours.forEach((contour, ci) => {\n const pts: Point[] = [];\n for (const s of contour) {\n let n = 1;\n if (s.length > 2) {\n let len = 0;\n for (let i = 0; i + 1 < s.length; i++) len += Math.hypot(s[i + 1].x - s[i].x, s[i + 1].y - s[i].y);\n n = Math.min(64, Math.max(2, Math.ceil(Math.sqrt(len / Math.max(tol, 1e-3)))));\n }\n for (let i = 0; i < n; i++) pts.push(evalSeg(s, i / n));\n }\n for (let i = 0; i < pts.length; i++) {\n const p = pts[i], q = pts[(i + 1) % pts.length];\n edges.push({ x0: p.x, y0: p.y, x1: q.x, y1: q.y, c: ci, i, n: pts.length });\n }\n });\n for (let i = 0; i < edges.length; i++) {\n const e = edges[i];\n for (let j = i + 1; j < edges.length; j++) {\n const f = edges[j];\n if (e.c === f.c && (j - i === 1 || (i === 0 && f.i === f.n - 1))) continue;\n if (Math.max(e.x0, e.x1) < Math.min(f.x0, f.x1) || Math.max(f.x0, f.x1) < Math.min(e.x0, e.x1)) continue;\n if (Math.max(e.y0, e.y1) < Math.min(f.y0, f.y1) || Math.max(f.y0, f.y1) < Math.min(e.y0, e.y1)) continue;\n if (segmentsCross(e.x0, e.y0, e.x1, e.y1, f.x0, f.y0, f.x1, f.y1)) return true;\n }\n }\n return false;\n}\n\n/** Winding number of `q`, by a ray cast in +x against the exact curves. */\nexport function windingAt(q: Point, contours: Contour[]): number {\n const dir = { x: 1, y: 0 };\n let w = 0;\n for (const contour of contours) {\n for (const s of contour) {\n for (const c of signChanges(sideCoeffs(s, q, dir), true)) {\n if (evalSeg(s, c.t).x > q.x) w += c.after > 0 ? 1 : -1;\n }\n }\n }\n return w;\n}\n\n/** The diagonal of the box around every control point of `contours`. */\nexport function extentOf(contours: Contour[]): number {\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (const c of contours) for (const s of c) for (const p of s) {\n minX = Math.min(minX, p.x); maxX = Math.max(maxX, p.x);\n minY = Math.min(minY, p.y); maxY = Math.max(maxY, p.y);\n }\n return Math.hypot(maxX - minX, maxY - minY);\n}\n\n/** The area below which a region cut from `contours` is rounding, not a piece. */\nexport function negligibleArea(contours: Contour[]): number {\n const extent = extentOf(contours);\n return extent * extent * EPS * EPS;\n}\n\n/**\n * The contours that bound the fill, each turned so the fill lies on its left.\n * A contour with fill on both sides or neither (a same-direction inner ring\n * under nonzero) bounds nothing and is dropped.\n */\nexport function orientBoundaries(contours: Contour[], fillRule: PathFillRule): Contour[] {\n const filled = (q: Point) => {\n const w = windingAt(q, contours);\n return fillRule === 'evenodd' ? (w & 1) !== 0 : w !== 0;\n };\n const eps = Math.max(extentOf(contours) * 1e-6, 1e-9);\n\n const out: Contour[] = [];\n for (const contour of contours) {\n let probe = contour[0];\n let best = -1;\n for (const s of contour) {\n const len = Math.hypot(s[s.length - 1].x - s[0].x, s[s.length - 1].y - s[0].y);\n if (len > best) { best = len; probe = s; }\n }\n const p = evalSeg(probe, 0.5);\n let tan = derivSeg(probe, 0.5);\n const tl = Math.hypot(tan.x, tan.y);\n if (tl === 0) continue;\n tan = { x: tan.x / tl, y: tan.y / tl };\n const left = filled({ x: p.x - tan.y * eps, y: p.y + tan.x * eps });\n const right = filled({ x: p.x + tan.y * eps, y: p.y - tan.x * eps });\n if (left && !right) out.push(contour);\n else if (right && !left) out.push(reverseContour(contour));\n }\n return out;\n}\n","/** Grouping traced loops into regions, and writing contours back out as paths. */\n\nimport { pointInPolygon } from '../polyline';\nimport type { PolygonPath, PathFillRule } from '../path';\nimport { PATH_C, PATH_L, PATH_M, PATH_Q, PATH_Z } from '../commands';\nimport { type Contour, evalSeg, sampleContour, signedArea } from './contourSegments';\nimport type { Subpath } from './contours';\n\n/** Group loops into regions: each positive loop with the holes it immediately contains. */\nexport function assembleRegions(outers: Contour[], holes: Contour[]): Contour[][] {\n const regions = outers.map((o) => ({ loops: [o], ring: sampleContour(o), area: signedArea(o) }));\n for (const h of holes) {\n const hp = evalSeg(h[0], 0.5);\n let best: (typeof regions)[number] | null = null;\n for (const r of regions) {\n if (pointInPolygon(r.ring, hp.x, hp.y) && (!best || r.area < best.area)) best = r;\n }\n best?.loops.push(h);\n }\n return regions.map((r) => r.loops);\n}\n\nexport const regionArea = (r: Contour[]): number => r.reduce((s, c) => s + signedArea(c), 0);\n\nexport const toPath = (loops: Contour[], fillRule: PathFillRule): PolygonPath =>\n writePath(loops.map((segs) => ({ segs, closed: true })), fillRule);\n\nexport function writePath(subpaths: Subpath[], fillRule: PathFillRule): PolygonPath {\n const cmds: number[] = [];\n const xs: number[] = [];\n for (const { segs, closed } of subpaths) {\n cmds.push(PATH_M);\n xs.push(segs[0][0].x, segs[0][0].y);\n for (const s of segs) {\n cmds.push(s.length === 2 ? PATH_L : s.length === 3 ? PATH_Q : PATH_C);\n for (let i = 1; i < s.length; i++) xs.push(s[i].x, s[i].y);\n }\n if (closed) cmds.push(PATH_Z);\n }\n return { kind: 'polygon', commands: new Uint8Array(cmds), coords: new Float32Array(xs), fillRule };\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { nearestOnLine, nearestOnCubic } from './chunk-CE7IY7TB.js';
|
|
2
|
-
import { resolveCorners, fitCubicWithTangents } from './chunk-
|
|
3
|
-
import { forEachSegment, PATH_Z, PATH_Q, elevateQuadraticToCubic, cubicBounds, PATH_C, PATH_L, PATH_M } from './chunk-B53BERKG.js';
|
|
2
|
+
import { resolveCorners, fitCubicWithTangents } from './chunk-EAKE3N7W.js';
|
|
3
|
+
import { forEachSegment, PATH_Z, PATH_Q, elevateQuadraticToCubic, cubicBounds, PATH_C, PATH_L, PATH_M, cubicPointAt } from './chunk-B53BERKG.js';
|
|
4
4
|
|
|
5
5
|
// src/paths/bounds.ts
|
|
6
6
|
function boundsOfPath(path) {
|
|
@@ -59,6 +59,7 @@ function boundsOfPath(path) {
|
|
|
59
59
|
}
|
|
60
60
|
|
|
61
61
|
// src/paths/fitRun.ts
|
|
62
|
+
var MAX_STRAY_STEPS = 512;
|
|
62
63
|
function keepCorner(to, from) {
|
|
63
64
|
if (from.corner) to.corner = { ...from.corner };
|
|
64
65
|
}
|
|
@@ -86,11 +87,12 @@ function fitRecursive(pts, tStart, tEnd, tol, out) {
|
|
|
86
87
|
}
|
|
87
88
|
const { cp1, cp2 } = fitCubicWithTangents(pts, tStart, tEnd);
|
|
88
89
|
const worst = worstFromCubic(pts, a, cp1, cp2, e);
|
|
89
|
-
|
|
90
|
+
const stray = worst.dist <= tol ? strayFromRun(pts, a, cp1, cp2, e, tol) : -1;
|
|
91
|
+
if (worst.dist <= tol && stray < 0) {
|
|
90
92
|
out.push({ c1: cp1, c2: cp2, end: e });
|
|
91
93
|
return;
|
|
92
94
|
}
|
|
93
|
-
const k = worst.index;
|
|
95
|
+
const k = stray < 0 ? worst.index : stray;
|
|
94
96
|
const center = unit(sub2(pts[k + 1], pts[k - 1]));
|
|
95
97
|
fitRecursive(pts.slice(0, k + 1), tStart, neg(center), tol, out);
|
|
96
98
|
fitRecursive(pts.slice(k), center, tEnd, tol, out);
|
|
@@ -117,6 +119,27 @@ function worstFromCubic(pts, a, c1, c2, e) {
|
|
|
117
119
|
}
|
|
118
120
|
return { index, dist };
|
|
119
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
|
+
}
|
|
120
143
|
var sub2 = (p, q) => ({ x: p.x - q.x, y: p.y - q.y });
|
|
121
144
|
var neg = (p) => ({ x: -p.x, y: -p.y });
|
|
122
145
|
function unit(p) {
|
|
@@ -125,5 +148,5 @@ function unit(p) {
|
|
|
125
148
|
}
|
|
126
149
|
|
|
127
150
|
export { boundsOfPath, fitPointRun, keepCorner };
|
|
128
|
-
//# sourceMappingURL=chunk-
|
|
129
|
-
//# sourceMappingURL=chunk-
|
|
151
|
+
//# sourceMappingURL=chunk-6FGQML7D.js.map
|
|
152
|
+
//# sourceMappingURL=chunk-6FGQML7D.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/paths/bounds.ts","../src/paths/fitRun.ts"],"names":[],"mappings":"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","file":"chunk-6FGQML7D.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"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { resolveCorners, DEFAULT_FLATTEN_TOLERANCE, flattenCubicWithArcLen, flattenQuadraticWithArcLen } from './chunk-
|
|
1
|
+
import { resolveCorners, DEFAULT_FLATTEN_TOLERANCE, flattenCubicWithArcLen, flattenQuadraticWithArcLen } from './chunk-EAKE3N7W.js';
|
|
2
2
|
import { rectToContour, forEachSegment, PATH_Z, PATH_C, PATH_Q, PATH_L, PATH_M } from './chunk-B53BERKG.js';
|
|
3
3
|
|
|
4
4
|
// src/tessellate/polyline.ts
|
|
@@ -150,5 +150,5 @@ function extractPolygon(p, opts) {
|
|
|
150
150
|
}
|
|
151
151
|
|
|
152
152
|
export { extractPolylines };
|
|
153
|
-
//# sourceMappingURL=chunk-
|
|
154
|
-
//# sourceMappingURL=chunk-
|
|
153
|
+
//# sourceMappingURL=chunk-7F66PQCJ.js.map
|
|
154
|
+
//# sourceMappingURL=chunk-7F66PQCJ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/tessellate/polyline.ts"],"names":[],"mappings":"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","file":"chunk-6XSJY3TC.js","sourcesContent":["import { forEachSegment, PATH_M, PATH_L, PATH_Z, PATH_C, PATH_Q } from '../commands';\nimport { resolveCorners } from '../paths/corners';\nimport { rectToContour } from '../box';\nimport { DEFAULT_FLATTEN_TOLERANCE, flattenCubicWithArcLen, flattenQuadraticWithArcLen } from '../flatten';\nimport type { Path, PolygonPath, RectPath } from '../path';\n\n/** One contour of a path, flattened to straight segments. */\nexport interface Polyline {\n /** Interleaved x,y vertices (length = 2 × point count). */\n points: number[];\n /** Whether the contour was closed (ends with Z, or is a RectPath). */\n closed: boolean;\n /** For each point, the previous anchor index. Anchor-aligned points set A === B. */\n anchorA?: Uint32Array;\n /** For each point, the next anchor index. */\n anchorB?: Uint32Array;\n /** For each point, the arc-length fraction along (A, B). 0 at anchor A; for anchor-aligned, set to 0. */\n anchorT?: Float32Array;\n /** Per-point stroke width, populated by the tessellator when the Stroke\n * carries `vertexWidths`. Undefined means uniform `Stroke.width`. */\n widths?: Float32Array;\n /** Per-point distance the ribbon's middle sits off the path toward the\n * normal `(−dy, dx)` of the direction of travel: half the right edge's\n * distance less the left's. Set alongside `widths` only when the two sides\n * differ somewhere; undefined means centered. */\n offsets?: Float32Array;\n}\n\n/** Options for `extractPolylines`. */\nexport interface ExtractOptions {\n flattenTolerance?: number;\n /** Most a curve may turn, in radians, between two flattened vertices.\n * Unbounded when unset. */\n maxTurn?: number;\n}\n\n/** Flatten each contour of a path to a straight-segment polyline, carrying the\n * anchor parameterization per point. A rect yields one closed contour. */\nexport function extractPolylines(path: Path, opts: ExtractOptions = {}): Polyline[] {\n if (path.kind === 'rect') return [extractRect(path)];\n return extractPolygon(resolveCorners(path), opts);\n}\n\nfunction extractRect(p: RectPath): Polyline {\n const { x, y, width: w, height: h } = p;\n return {\n points: Array.from(rectToContour(x, y, w, h)),\n closed: true,\n anchorA: new Uint32Array([0, 1, 2, 3]),\n anchorB: new Uint32Array([0, 1, 2, 3]),\n anchorT: new Float32Array([0, 0, 0, 0]),\n };\n}\n\nfunction extractPolygon(p: PolygonPath, opts: ExtractOptions): Polyline[] {\n const tolerance = opts.flattenTolerance ?? DEFAULT_FLATTEN_TOLERANCE;\n const { commands, coords } = p;\n const out: Polyline[] = [];\n // Anchors are numbered globally (across all contours) in command-stream order.\n let anchorCounter = 0;\n\n // Builders for the current polyline.\n let pts: number[] | null = null;\n let aA: number[] | null = null;\n let aB: number[] | null = null;\n let aT: number[] | null = null;\n let current: Polyline | null = null;\n\n let prevAnchor = -1;\n // The anchor a subpath opened by a bare drawing command starts from.\n let startAnchor = 0;\n\n const beginContour = (): Polyline => {\n pts = [];\n aA = [];\n aB = [];\n aT = [];\n const next: Polyline = { points: pts, closed: false };\n out.push(next);\n return next;\n };\n\n /**\n * A closed contour's last point repeating its first leaves a zero-length\n * closing segment, which the stroker discards along with the wrap-around\n * join it should have carried, notching the ribbon at the contour's start.\n * Every font outline serialized by opentype.js is written this way. Exact\n * equality is the right test: the duplicate is a re-emission of the same\n * number, and a near-miss is a genuine (if tiny) segment the author asked for.\n */\n const dropDuplicateClosingPoint = (): void => {\n if (!pts || !aA || !aB || !aT) return;\n const n = pts.length / 2;\n if (n < 2) return;\n if (pts[0] !== pts[(n - 1) * 2] || pts[1] !== pts[(n - 1) * 2 + 1]) return;\n pts.length -= 2;\n aA.length -= 1;\n aB.length -= 1;\n aT.length -= 1;\n };\n\n const commit = (target: Polyline): void => {\n if (!pts || !aA || !aB || !aT) return;\n target.anchorA = new Uint32Array(aA);\n target.anchorB = new Uint32Array(aB);\n target.anchorT = new Float32Array(aT);\n };\n\n // Fill anchorA/B/T for each point a curve just appended: interior points\n // interpolate (prevAnchor → target), and the final point is pinned to the\n // target so the draw-time lerp returns anchor B's color exactly.\n const pushCurveAnchors = (segStart: number, arcAccum: number[], total: number, target: number): void => {\n for (let k = 0; k < arcAccum.length; k++) {\n aA!.push(prevAnchor);\n aB!.push(target);\n aT!.push(total > 0 ? arcAccum[k] / total : 0);\n }\n const lastIdx = (segStart + arcAccum.length) - 1;\n aA![lastIdx] = target;\n aB![lastIdx] = target;\n aT![lastIdx] = 0;\n };\n\n forEachSegment(commands, coords, (cmd, coordIdx, prevX, prevY, _i, opensSubpath) => {\n if (opensSubpath) {\n if (current) commit(current);\n current = beginContour();\n pts!.push(prevX, prevY);\n aA!.push(startAnchor);\n aB!.push(startAnchor);\n aT!.push(0);\n prevAnchor = startAnchor;\n }\n switch (cmd) {\n case PATH_M:\n case PATH_L: {\n if (cmd === PATH_M) {\n if (current) commit(current);\n current = beginContour();\n startAnchor = anchorCounter;\n }\n pts!.push(coords[coordIdx], coords[coordIdx + 1]);\n aA!.push(anchorCounter);\n aB!.push(anchorCounter);\n aT!.push(0);\n prevAnchor = anchorCounter;\n anchorCounter++;\n break;\n }\n case PATH_Q: {\n const target = anchorCounter;\n const segStart = pts!.length / 2;\n const arcAccum: number[] = [];\n const total = flattenQuadraticWithArcLen(\n prevX, prevY,\n coords[coordIdx], coords[coordIdx + 1],\n coords[coordIdx + 2], coords[coordIdx + 3],\n tolerance, pts!, arcAccum, opts.maxTurn,\n );\n pushCurveAnchors(segStart, arcAccum, total, target);\n prevAnchor = target;\n anchorCounter++;\n break;\n }\n case PATH_C: {\n const target = anchorCounter;\n const segStart = pts!.length / 2;\n const arcAccum: number[] = [];\n const total = flattenCubicWithArcLen(\n prevX, prevY,\n coords[coordIdx], coords[coordIdx + 1],\n coords[coordIdx + 2], coords[coordIdx + 3],\n coords[coordIdx + 4], coords[coordIdx + 5],\n tolerance, pts!, arcAccum, opts.maxTurn,\n );\n pushCurveAnchors(segStart, arcAccum, total, target);\n prevAnchor = target;\n anchorCounter++;\n break;\n }\n case PATH_Z: {\n if (current) {\n current.closed = true;\n dropDuplicateClosingPoint();\n }\n break;\n }\n default:\n throw new Error(`extractPolylines: unknown command code ${cmd}`);\n }\n });\n\n if (current) commit(current);\n return out;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/tessellate/polyline.ts"],"names":[],"mappings":"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","file":"chunk-7F66PQCJ.js","sourcesContent":["import { forEachSegment, PATH_M, PATH_L, PATH_Z, PATH_C, PATH_Q } from '../commands';\nimport { resolveCorners } from '../paths/corners';\nimport { rectToContour } from '../box';\nimport { DEFAULT_FLATTEN_TOLERANCE, flattenCubicWithArcLen, flattenQuadraticWithArcLen } from '../flatten';\nimport type { Path, PolygonPath, RectPath } from '../path';\n\n/** One contour of a path, flattened to straight segments. */\nexport interface Polyline {\n /** Interleaved x,y vertices (length = 2 × point count). */\n points: number[];\n /** Whether the contour was closed (ends with Z, or is a RectPath). */\n closed: boolean;\n /** For each point, the previous anchor index. Anchor-aligned points set A === B. */\n anchorA?: Uint32Array;\n /** For each point, the next anchor index. */\n anchorB?: Uint32Array;\n /** For each point, the arc-length fraction along (A, B). 0 at anchor A; for anchor-aligned, set to 0. */\n anchorT?: Float32Array;\n /** Per-point stroke width, populated by the tessellator when the Stroke\n * carries `vertexWidths`. Undefined means uniform `Stroke.width`. */\n widths?: Float32Array;\n /** Per-point distance the ribbon's middle sits off the path toward the\n * normal `(−dy, dx)` of the direction of travel: half the right edge's\n * distance less the left's. Set alongside `widths` only when the two sides\n * differ somewhere; undefined means centered. */\n offsets?: Float32Array;\n}\n\n/** Options for `extractPolylines`. */\nexport interface ExtractOptions {\n flattenTolerance?: number;\n /** Most a curve may turn, in radians, between two flattened vertices.\n * Unbounded when unset. */\n maxTurn?: number;\n}\n\n/** Flatten each contour of a path to a straight-segment polyline, carrying the\n * anchor parameterization per point. A rect yields one closed contour. */\nexport function extractPolylines(path: Path, opts: ExtractOptions = {}): Polyline[] {\n if (path.kind === 'rect') return [extractRect(path)];\n return extractPolygon(resolveCorners(path), opts);\n}\n\nfunction extractRect(p: RectPath): Polyline {\n const { x, y, width: w, height: h } = p;\n return {\n points: Array.from(rectToContour(x, y, w, h)),\n closed: true,\n anchorA: new Uint32Array([0, 1, 2, 3]),\n anchorB: new Uint32Array([0, 1, 2, 3]),\n anchorT: new Float32Array([0, 0, 0, 0]),\n };\n}\n\nfunction extractPolygon(p: PolygonPath, opts: ExtractOptions): Polyline[] {\n const tolerance = opts.flattenTolerance ?? DEFAULT_FLATTEN_TOLERANCE;\n const { commands, coords } = p;\n const out: Polyline[] = [];\n // Anchors are numbered globally (across all contours) in command-stream order.\n let anchorCounter = 0;\n\n // Builders for the current polyline.\n let pts: number[] | null = null;\n let aA: number[] | null = null;\n let aB: number[] | null = null;\n let aT: number[] | null = null;\n let current: Polyline | null = null;\n\n let prevAnchor = -1;\n // The anchor a subpath opened by a bare drawing command starts from.\n let startAnchor = 0;\n\n const beginContour = (): Polyline => {\n pts = [];\n aA = [];\n aB = [];\n aT = [];\n const next: Polyline = { points: pts, closed: false };\n out.push(next);\n return next;\n };\n\n /**\n * A closed contour's last point repeating its first leaves a zero-length\n * closing segment, which the stroker discards along with the wrap-around\n * join it should have carried, notching the ribbon at the contour's start.\n * Every font outline serialized by opentype.js is written this way. Exact\n * equality is the right test: the duplicate is a re-emission of the same\n * number, and a near-miss is a genuine (if tiny) segment the author asked for.\n */\n const dropDuplicateClosingPoint = (): void => {\n if (!pts || !aA || !aB || !aT) return;\n const n = pts.length / 2;\n if (n < 2) return;\n if (pts[0] !== pts[(n - 1) * 2] || pts[1] !== pts[(n - 1) * 2 + 1]) return;\n pts.length -= 2;\n aA.length -= 1;\n aB.length -= 1;\n aT.length -= 1;\n };\n\n const commit = (target: Polyline): void => {\n if (!pts || !aA || !aB || !aT) return;\n target.anchorA = new Uint32Array(aA);\n target.anchorB = new Uint32Array(aB);\n target.anchorT = new Float32Array(aT);\n };\n\n // Fill anchorA/B/T for each point a curve just appended: interior points\n // interpolate (prevAnchor → target), and the final point is pinned to the\n // target so the draw-time lerp returns anchor B's color exactly.\n const pushCurveAnchors = (segStart: number, arcAccum: number[], total: number, target: number): void => {\n for (let k = 0; k < arcAccum.length; k++) {\n aA!.push(prevAnchor);\n aB!.push(target);\n aT!.push(total > 0 ? arcAccum[k] / total : 0);\n }\n const lastIdx = (segStart + arcAccum.length) - 1;\n aA![lastIdx] = target;\n aB![lastIdx] = target;\n aT![lastIdx] = 0;\n };\n\n forEachSegment(commands, coords, (cmd, coordIdx, prevX, prevY, _i, opensSubpath) => {\n if (opensSubpath) {\n if (current) commit(current);\n current = beginContour();\n pts!.push(prevX, prevY);\n aA!.push(startAnchor);\n aB!.push(startAnchor);\n aT!.push(0);\n prevAnchor = startAnchor;\n }\n switch (cmd) {\n case PATH_M:\n case PATH_L: {\n if (cmd === PATH_M) {\n if (current) commit(current);\n current = beginContour();\n startAnchor = anchorCounter;\n }\n pts!.push(coords[coordIdx], coords[coordIdx + 1]);\n aA!.push(anchorCounter);\n aB!.push(anchorCounter);\n aT!.push(0);\n prevAnchor = anchorCounter;\n anchorCounter++;\n break;\n }\n case PATH_Q: {\n const target = anchorCounter;\n const segStart = pts!.length / 2;\n const arcAccum: number[] = [];\n const total = flattenQuadraticWithArcLen(\n prevX, prevY,\n coords[coordIdx], coords[coordIdx + 1],\n coords[coordIdx + 2], coords[coordIdx + 3],\n tolerance, pts!, arcAccum, opts.maxTurn,\n );\n pushCurveAnchors(segStart, arcAccum, total, target);\n prevAnchor = target;\n anchorCounter++;\n break;\n }\n case PATH_C: {\n const target = anchorCounter;\n const segStart = pts!.length / 2;\n const arcAccum: number[] = [];\n const total = flattenCubicWithArcLen(\n prevX, prevY,\n coords[coordIdx], coords[coordIdx + 1],\n coords[coordIdx + 2], coords[coordIdx + 3],\n coords[coordIdx + 4], coords[coordIdx + 5],\n tolerance, pts!, arcAccum, opts.maxTurn,\n );\n pushCurveAnchors(segStart, arcAccum, total, target);\n prevAnchor = target;\n anchorCounter++;\n break;\n }\n case PATH_Z: {\n if (current) {\n current.closed = true;\n dropDuplicateClosingPoint();\n }\n break;\n }\n default:\n throw new Error(`extractPolylines: unknown command code ${cmd}`);\n }\n });\n\n if (current) commit(current);\n return out;\n}\n"]}
|
|
@@ -23,13 +23,17 @@ function distPointToSegment(px, py, ax, ay, bx, by) {
|
|
|
23
23
|
if (along >= 1) return Math.hypot(px - bx, py - by);
|
|
24
24
|
return Math.abs((px - ax) * dy - (py - ay) * dx) / Math.sqrt(len22);
|
|
25
25
|
}
|
|
26
|
-
function
|
|
27
|
-
|
|
26
|
+
function turnsWithin(x0, y0, x1, y1, x2, y2, x3, y3, maxTurn) {
|
|
27
|
+
let turn = legTurn(x1 - x0, y1 - y0, x2 - x1, y2 - y1);
|
|
28
|
+
if (turn > maxTurn) return false;
|
|
29
|
+
turn += legTurn(x2 - x1, y2 - y1, x3 - x2, y3 - y2);
|
|
30
|
+
if (x2 === x1 && y2 === y1) turn += legTurn(x1 - x0, y1 - y0, x3 - x2, y3 - y2);
|
|
31
|
+
return turn <= maxTurn;
|
|
28
32
|
}
|
|
29
33
|
function legTurn(ax, ay, bx, by) {
|
|
30
|
-
const
|
|
31
|
-
if (
|
|
32
|
-
return Math.acos(Math.max(-1, Math.min(1, (ax * bx + ay * by) /
|
|
34
|
+
const lens = Math.sqrt((ax * ax + ay * ay) * (bx * bx + by * by));
|
|
35
|
+
if (lens === 0) return 0;
|
|
36
|
+
return Math.acos(Math.max(-1, Math.min(1, (ax * bx + ay * by) / lens)));
|
|
33
37
|
}
|
|
34
38
|
function flattenCubic(x0, y0, x1, y1, x2, y2, x3, y3, tolerance, out) {
|
|
35
39
|
if (!finite8(x0, y0, x1, y1, x2, y2, x3, y3)) {
|
|
@@ -84,7 +88,7 @@ function flattenCubicWithArcLen(x0, y0, x1, y1, x2, y2, x3, y3, tolerance, out,
|
|
|
84
88
|
function flattenCubicArcRec(x0, y0, x1, y1, x2, y2, x3, y3, tolerance, maxTurn, out, arcOut, accum, depth) {
|
|
85
89
|
const d1 = distPointToSegment(x1, y1, x0, y0, x3, y3);
|
|
86
90
|
const d2 = distPointToSegment(x2, y2, x0, y0, x3, y3);
|
|
87
|
-
const flat = Math.max(d1, d2) <= tolerance && (maxTurn === Infinity ||
|
|
91
|
+
const flat = Math.max(d1, d2) <= tolerance && (maxTurn === Infinity || turnsWithin(x0, y0, x1, y1, x2, y2, x3, y3, maxTurn));
|
|
88
92
|
if (flat || depth >= MAX_FLATTEN_DEPTH) {
|
|
89
93
|
const lastX = out.length >= 2 ? out[out.length - 2] : x0;
|
|
90
94
|
const lastY = out.length >= 2 ? out[out.length - 1] : y0;
|
|
@@ -114,7 +118,7 @@ function flattenQuadraticWithArcLen(x0, y0, x1, y1, x2, y2, tolerance, out, arcO
|
|
|
114
118
|
}
|
|
115
119
|
function flattenQuadraticArcRec(x0, y0, x1, y1, x2, y2, tolerance, maxTurn, out, arcOut, accum, depth) {
|
|
116
120
|
const d = distPointToSegment(x1, y1, x0, y0, x2, y2);
|
|
117
|
-
const flat = d <= tolerance && (maxTurn === Infinity ||
|
|
121
|
+
const flat = d <= tolerance && (maxTurn === Infinity || turnsWithin(x0, y0, x1, y1, x2, y2, x2, y2, maxTurn));
|
|
118
122
|
if (flat || depth >= MAX_FLATTEN_DEPTH) {
|
|
119
123
|
const lastX = out.length >= 2 ? out[out.length - 2] : x0;
|
|
120
124
|
const lastY = out.length >= 2 ? out[out.length - 1] : y0;
|
|
@@ -796,5 +800,5 @@ function tangentMeet(a, ta, b, tb) {
|
|
|
796
800
|
}
|
|
797
801
|
|
|
798
802
|
export { CORNER_FIT_TOLERANCE, CORNER_KEYWORDS, DEFAULT_FLATTEN_TOLERANCE, cornerCenter, cornerCuts, cornerFrameAt, cornerFrames, cornerKeywordOf, cornerShapeK, cornerShapePieces, cornerShapePoint, decodeContours, defaultOpenFill, fillsOpenSubpaths, fitCubicWithTangents, flattenCubic, flattenCubicWithArcLen, flattenQuadratic, flattenQuadraticWithArcLen, isCornerShape, nextCornerShape, pointInPolygon, pointSegmentDist2, remapPerAnchor, resolveCorners, resolveCornersWithSources, schneiderFit, segmentsCross, setDefaultOpenFill };
|
|
799
|
-
//# sourceMappingURL=chunk-
|
|
800
|
-
//# sourceMappingURL=chunk-
|
|
803
|
+
//# sourceMappingURL=chunk-EAKE3N7W.js.map
|
|
804
|
+
//# sourceMappingURL=chunk-EAKE3N7W.js.map
|