@weasel-js/geom 1.14.2 → 1.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -50,10 +50,38 @@ function crossingParams(ex0, ey0, ex1, ey1, fx0, fy0, fx1, fy1) {
50
50
  var keyOf = (n) => `${n.x},${n.y}`;
51
51
  function resolveCrossings(flat, always = false) {
52
52
  if (!always && !anyCrossing(flat)) return null;
53
+ return resolve(flat, (w) => w !== 0).contours;
54
+ }
55
+ var MAX_EVENODD_RESOLVE_WORK = 2 ** 20;
56
+ function resolveEvenOdd(flat) {
57
+ const edges = edgeCount(flat);
58
+ const maxCrossings = Math.floor((MAX_EVENODD_RESOLVE_WORK / edges - edges) / 2);
59
+ if (!(maxCrossings >= 0)) return null;
60
+ const out = resolve(flat, (w) => (w & 1) !== 0, maxCrossings);
61
+ return out !== null && out.complete ? out.contours : null;
62
+ }
63
+ function resolve(flat, filled, maxCrossings = Infinity) {
53
64
  const edges = edgesOf(flat);
54
- cutAtCrossings(edges);
55
- const pieces = boundaryPieces(edges);
56
- return loopsToContours(chainLoops(pieces));
65
+ const eps = contactTolerance(edges);
66
+ if (!cutAtCrossings(edges, maxCrossings)) return null;
67
+ cutAtContacts(edges, eps);
68
+ weld(edges, eps);
69
+ const pieces = boundaryPieces(edges, filled);
70
+ const { loops, complete } = chainLoops(pieces);
71
+ return { contours: loopsToContours(loops), complete };
72
+ }
73
+ function edgeCount(flat) {
74
+ const { coords, contourStarts } = flat;
75
+ const total = coords.length / 2;
76
+ let n = 0;
77
+ contourStarts.forEach((start, c) => {
78
+ const end = c + 1 < contourStarts.length ? contourStarts[c + 1] : total;
79
+ for (let i = start; i < end; i++) {
80
+ const j = i + 1 < end ? i + 1 : start;
81
+ if (coords[i * 2] !== coords[j * 2] || coords[i * 2 + 1] !== coords[j * 2 + 1]) n++;
82
+ }
83
+ });
84
+ return n;
57
85
  }
58
86
  function anyCrossing(flat) {
59
87
  const { coords, contourStarts } = flat;
@@ -91,10 +119,12 @@ function edgesOf(flat) {
91
119
  });
92
120
  return edges;
93
121
  }
94
- function cutAtCrossings(edges) {
122
+ function cutAtCrossings(edges, max) {
95
123
  const ends = new Float64Array(edges.length * 4);
96
124
  edges.forEach(({ from, to }, i) => ends.set([from.x, from.y, to.x, to.y], i * 4));
125
+ let count = 0;
97
126
  forEachCrossing(ends, edges.length, (ei, fi, s, u) => {
127
+ if (++count > max) return true;
98
128
  const e = edges[ei];
99
129
  const node = {
100
130
  x: e.from.x + (e.to.x - e.from.x) * s,
@@ -103,15 +133,74 @@ function cutAtCrossings(edges) {
103
133
  };
104
134
  e.cuts.push({ s, node });
105
135
  edges[fi].cuts.push({ s: u, node });
136
+ return false;
106
137
  });
138
+ return count <= max;
139
+ }
140
+ function cutAtContacts(edges, eps) {
141
+ const order = edges.map((_, i) => i);
142
+ const lo = (e) => Math.min(e.from.x, e.to.x);
143
+ order.sort((a, b) => lo(edges[a]) - lo(edges[b]));
144
+ for (let a = 0; a < order.length; a++) {
145
+ const e = edges[order[a]];
146
+ const stop = Math.max(e.from.x, e.to.x) + eps;
147
+ for (let b = a + 1; b < order.length; b++) {
148
+ const f = edges[order[b]];
149
+ if (lo(f) > stop) break;
150
+ if (Math.max(e.from.y, e.to.y) + eps < Math.min(f.from.y, f.to.y)) continue;
151
+ if (Math.max(f.from.y, f.to.y) + eps < Math.min(e.from.y, e.to.y)) continue;
152
+ cutAt(e, f.from, eps);
153
+ cutAt(e, f.to, eps);
154
+ cutAt(f, e.from, eps);
155
+ cutAt(f, e.to, eps);
156
+ }
157
+ }
158
+ }
159
+ function contactTolerance(edges) {
160
+ let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;
161
+ for (const { from: p } of edges) {
162
+ minX = Math.min(minX, p.x);
163
+ maxX = Math.max(maxX, p.x);
164
+ minY = Math.min(minY, p.y);
165
+ maxY = Math.max(maxY, p.y);
166
+ }
167
+ return Math.max(maxX - minX, maxY - minY, Math.abs(minX), Math.abs(maxX), Math.abs(minY), Math.abs(maxY)) * 1e-9;
168
+ }
169
+ function weld(edges, eps) {
170
+ const nodes = [];
171
+ for (const e of edges) {
172
+ nodes.push(e.from, e.to);
173
+ for (const c of e.cuts) nodes.push(c.node);
174
+ }
175
+ nodes.sort((p, q) => p.x - q.x);
176
+ for (let i = 0; i < nodes.length; i++) {
177
+ const p = nodes[i];
178
+ for (let j = i + 1; j < nodes.length && nodes[j].x - p.x <= eps; j++) {
179
+ const q = nodes[j];
180
+ if (q !== p && Math.abs(q.y - p.y) <= eps && (q.x !== p.x || q.y !== p.y)) {
181
+ q.x = p.x;
182
+ q.y = p.y;
183
+ }
184
+ }
185
+ }
186
+ }
187
+ function cutAt(e, p, eps) {
188
+ const dx = e.to.x - e.from.x, dy = e.to.y - e.from.y;
189
+ const len2 = dx * dx + dy * dy;
190
+ const s = ((p.x - e.from.x) * dx + (p.y - e.from.y) * dy) / len2;
191
+ if (!(s > 0 && s < 1)) return;
192
+ if (Math.hypot(e.from.x + dx * s - p.x, e.from.y + dy * s - p.y) > eps) return;
193
+ const at = (q) => Math.abs(q.x - p.x) <= eps && Math.abs(q.y - p.y) <= eps;
194
+ if (at(e.from) || at(e.to) || e.cuts.some((c) => at(c.node))) return;
195
+ e.cuts.push({ s, node: p });
107
196
  }
108
197
  function anchorsAlong(e, s) {
109
198
  const { from, to } = e;
110
199
  if (from.a === to.a && from.b === to.b) return { a: from.a, b: from.b, t: from.t + (to.t - from.t) * s };
111
- const near = s < 0.5 ? from : to;
112
- return { a: near.a, b: near.b, t: near.t };
200
+ const near2 = s < 0.5 ? from : to;
201
+ return { a: near2.a, b: near2.b, t: near2.t };
113
202
  }
114
- function boundaryPieces(edges) {
203
+ function boundaryPieces(edges, filledBy) {
115
204
  let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;
116
205
  for (const { from: p } of edges) {
117
206
  minX = Math.min(minX, p.x);
@@ -120,8 +209,15 @@ function boundaryPieces(edges) {
120
209
  maxY = Math.max(maxY, p.y);
121
210
  }
122
211
  const eps = Math.max(Math.hypot(maxX - minX, maxY - minY) * 1e-7, 1e-9);
123
- const filled = (x, y) => windingAt(edges, x, y) !== 0;
212
+ const filled = (x, y) => filledBy(windingAt(edges, x, y));
124
213
  const out = [];
214
+ const seen = /* @__PURE__ */ new Set();
215
+ const keep = (from, to) => {
216
+ const k = `${keyOf(from)}>${keyOf(to)}`;
217
+ if (seen.has(k)) return;
218
+ seen.add(k);
219
+ out.push({ from, to });
220
+ };
125
221
  for (const e of edges) {
126
222
  const stops = [e.from, ...e.cuts.sort((p, q) => p.s - q.s).map((c) => c.node), e.to];
127
223
  for (let k = 0; k + 1 < stops.length; k++) {
@@ -132,8 +228,8 @@ function boundaryPieces(edges) {
132
228
  const mx = (p.x + q.x) / 2, my = (p.y + q.y) / 2;
133
229
  const nx = -dy / len * eps, ny = dx / len * eps;
134
230
  const left = filled(mx + nx, my + ny), right = filled(mx - nx, my - ny);
135
- if (left && !right) out.push({ from: p, to: q });
136
- else if (right && !left) out.push({ from: q, to: p });
231
+ if (left && !right) keep(p, q);
232
+ else if (right && !left) keep(q, p);
137
233
  }
138
234
  }
139
235
  return out;
@@ -157,6 +253,7 @@ function chainLoops(pieces) {
157
253
  }
158
254
  const used = /* @__PURE__ */ new Set();
159
255
  const loops = [];
256
+ let complete = true;
160
257
  for (const first of pieces) {
161
258
  if (used.has(first)) continue;
162
259
  used.add(first);
@@ -170,9 +267,10 @@ function chainLoops(pieces) {
170
267
  loop.push(next.from);
171
268
  cur = next;
172
269
  }
173
- if (keyOf(cur.to) === startKey && loop.length >= 3) loops.push(loop);
270
+ if (keyOf(cur.to) !== startKey) complete = false;
271
+ else if (loop.length >= 3) loops.push(loop);
174
272
  }
175
- return loops;
273
+ return { loops, complete };
176
274
  }
177
275
  function sharpestLeft(into, options) {
178
276
  const ix = into.to.x - into.from.x, iy = into.to.y - into.from.y;
@@ -266,6 +364,106 @@ function signedArea(coords, start, end) {
266
364
  return a * 0.5;
267
365
  }
268
366
 
367
+ // src/tessellate/evenOdd.ts
368
+ function evenOddRings(flat) {
369
+ if (anyContact(flat)) return null;
370
+ const rings = nestRings(flat);
371
+ if (rings.some((r) => r.area === 0)) return null;
372
+ for (const r of rings) {
373
+ let depth = 0;
374
+ for (let p = r.parent; p >= 0; p = rings[p].parent) depth++;
375
+ r.winding = depth % 2 === 0 ? 1 : 0;
376
+ }
377
+ return rings;
378
+ }
379
+ function segmentsOf(flat) {
380
+ const { coords, contourStarts } = flat;
381
+ const total = coords.length / 2;
382
+ const ends = new Float64Array(total * 4);
383
+ const contour = new Uint32Array(total);
384
+ const pos = new Uint32Array(total);
385
+ const count = [];
386
+ let n = 0;
387
+ contourStarts.forEach((start, c) => {
388
+ const end = c + 1 < contourStarts.length ? contourStarts[c + 1] : total;
389
+ let k = 0;
390
+ for (let i = start; i < end; i++) {
391
+ const j = i + 1 < end ? i + 1 : start;
392
+ const x0 = coords[i * 2], y0 = coords[i * 2 + 1], x1 = coords[j * 2], y1 = coords[j * 2 + 1];
393
+ if (x0 === x1 && y0 === y1) continue;
394
+ ends.set([x0, y0, x1, y1], n * 4);
395
+ contour[n] = c;
396
+ pos[n] = k++;
397
+ n++;
398
+ }
399
+ count.push(k);
400
+ });
401
+ return { ends, contour, pos, count, n };
402
+ }
403
+ function anyContact(flat) {
404
+ const s = segmentsOf(flat);
405
+ const { ends, n } = s;
406
+ let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;
407
+ for (let i = 0; i < n * 4; i += 2) {
408
+ minX = Math.min(minX, ends[i]);
409
+ maxX = Math.max(maxX, ends[i]);
410
+ minY = Math.min(minY, ends[i + 1]);
411
+ maxY = Math.max(maxY, ends[i + 1]);
412
+ }
413
+ const eps = Math.max(maxX - minX, maxY - minY, Math.abs(minX), Math.abs(maxX), Math.abs(minY), Math.abs(maxY)) * 1e-9;
414
+ const order = Array.from({ length: n }, (_, i) => i);
415
+ const lo = (e) => Math.min(ends[e * 4], ends[e * 4 + 2]);
416
+ order.sort((a, b) => lo(a) - lo(b));
417
+ for (let a = 0; a < n; a++) {
418
+ const e = order[a];
419
+ const stop = Math.max(ends[e * 4], ends[e * 4 + 2]) + eps;
420
+ for (let b = a + 1; b < n; b++) {
421
+ const f = order[b];
422
+ if (lo(f) > stop) break;
423
+ if (touches(s, e, f, eps)) return true;
424
+ }
425
+ }
426
+ return false;
427
+ }
428
+ function touches(s, e, f, eps) {
429
+ const { ends } = s;
430
+ const ax = ends[e * 4], ay = ends[e * 4 + 1], bx = ends[e * 4 + 2], by = ends[e * 4 + 3];
431
+ const cx = ends[f * 4], cy = ends[f * 4 + 1], dx = ends[f * 4 + 2], dy = ends[f * 4 + 3];
432
+ if (Math.max(ay, by) + eps < Math.min(cy, dy) || Math.max(cy, dy) + eps < Math.min(ay, by)) return false;
433
+ const shared = sharedEnd(s, e, f);
434
+ if (shared === "e-to") {
435
+ return foldsBack(bx - ax, by - ay, dx - cx, dy - cy) || near(ax, ay, cx, cy, dx, dy, eps);
436
+ }
437
+ if (shared === "f-to") {
438
+ return foldsBack(dx - cx, dy - cy, bx - ax, by - ay) || near(cx, cy, ax, ay, bx, by, eps);
439
+ }
440
+ return near(ax, ay, cx, cy, dx, dy, eps) || near(bx, by, cx, cy, dx, dy, eps) || near(cx, cy, ax, ay, bx, by, eps) || near(dx, dy, ax, ay, bx, by, eps) || properCross(ax, ay, bx, by, cx, cy, dx, dy);
441
+ }
442
+ function sharedEnd(s, e, f) {
443
+ if (s.contour[e] !== s.contour[f]) return null;
444
+ const k = s.count[s.contour[e]];
445
+ if (k < 3) return null;
446
+ if ((s.pos[e] + 1) % k === s.pos[f]) return "e-to";
447
+ if ((s.pos[f] + 1) % k === s.pos[e]) return "f-to";
448
+ return null;
449
+ }
450
+ function foldsBack(ux, uy, vx, vy) {
451
+ const cross = ux * vy - uy * vx;
452
+ return Math.abs(cross) <= 1e-9 * Math.hypot(ux, uy) * Math.hypot(vx, vy) && ux * vx + uy * vy < 0;
453
+ }
454
+ function near(px, py, ax, ay, bx, by, eps) {
455
+ const dx = bx - ax, dy = by - ay;
456
+ const len2 = dx * dx + dy * dy;
457
+ const t = len2 > 0 ? Math.max(0, Math.min(1, ((px - ax) * dx + (py - ay) * dy) / len2)) : 0;
458
+ return Math.hypot(ax + dx * t - px, ay + dy * t - py) <= eps;
459
+ }
460
+ function properCross(ax, ay, bx, by, cx, cy, dx, dy) {
461
+ const o1 = orient(ax, ay, bx, by, cx, cy), o2 = orient(ax, ay, bx, by, dx, dy);
462
+ const o3 = orient(cx, cy, dx, dy, ax, ay), o4 = orient(cx, cy, dx, dy, bx, by);
463
+ return o1 * o2 <= 0 && o3 * o4 <= 0;
464
+ }
465
+ var orient = (ax, ay, bx, by, px, py) => Math.sign((bx - ax) * (py - ay) - (by - ay) * (px - ax));
466
+
269
467
  // src/tessellate/tessellate.ts
270
468
  function tessellate(path, opts = {}) {
271
469
  if (path.kind === "rect") return tessellateRect(path);
@@ -402,6 +600,10 @@ function tessellatePolygon(p, opts) {
402
600
  const tolerance = opts.flattenTolerance ?? DEFAULT_FLATTEN_TOLERANCE;
403
601
  const flat = flattenPolygon(p, tolerance);
404
602
  if (p.fillRule === "evenodd") {
603
+ const rings2 = evenOddRings(flat);
604
+ if (rings2) return tessellateNonzero(flat, rings2);
605
+ const resolved = resolveEvenOdd(flat);
606
+ if (resolved) return tessellateNonzero(resolved, nestRings(resolved));
405
607
  const { coords, contourStarts, anchorA, anchorB, anchorT } = flat;
406
608
  return tessellateEvenoddWithAnchors(coords, contourStarts, anchorA, anchorB, anchorT);
407
609
  }
@@ -489,6 +691,6 @@ function tessellateEvenoddWithAnchors(coords, contourStarts, anchorA, anchorB, a
489
691
  };
490
692
  }
491
693
 
492
- export { flattenPolygon, nestRings, resolveCrossings, tessellate };
493
- //# sourceMappingURL=chunk-GWSJQSQE.js.map
494
- //# sourceMappingURL=chunk-GWSJQSQE.js.map
694
+ export { MAX_EVENODD_RESOLVE_WORK, flattenPolygon, nestRings, resolveCrossings, tessellate };
695
+ //# sourceMappingURL=chunk-HMGGJZTM.js.map
696
+ //# sourceMappingURL=chunk-HMGGJZTM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tessellate/sweep.ts","../src/tessellate/crossings.ts","../src/tessellate/nesting.ts","../src/tessellate/evenOdd.ts","../src/tessellate/tessellate.ts"],"names":["near","rings"],"mappings":"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","file":"chunk-HMGGJZTM.js","sourcesContent":["/** Finding where straight segments cross, by a sweep along x. */\n\nconst LOW_WORD = new Uint8Array(new Uint16Array([1]).buffer)[0] === 1 ? 0 : 1;\n/** How far, relative to itself, writing an index into a key's low word can\n * move it. A zero key becomes a subnormal, which the sweep's 1e-300 covers. */\nconst KEY_SLACK = 2 ** -19;\n\n/**\n * Call `visit` for every pair of segments that cross inside both, with how far\n * along each the crossing lies; `visit` returns `true` to stop. `ends` holds\n * `n` segments as `x0, y0, x1, y1`. Of each pair, `e` is the one whose\n * smallest x is smaller.\n */\nexport function forEachCrossing(\n ends: Float64Array,\n n: number,\n visit: (e: number, f: number, s: number, u: number) => boolean | void,\n): void {\n const keys = sortedMinX(ends, n);\n const index = new Uint32Array(keys.buffer);\n for (let i = 0; i < n; i++) {\n const ei = index[i * 2 + LOW_WORD], e = ei * 4;\n const ex0 = ends[e], ey0 = ends[e + 1], ex1 = ends[e + 2], ey1 = ends[e + 3];\n const maxX = Math.max(ex0, ex1);\n const stop = maxX + Math.abs(maxX) * KEY_SLACK + 1e-300;\n for (let j = i + 1; j < n; j++) {\n if (keys[j] > stop) break;\n const fi = index[j * 2 + LOW_WORD], f = fi * 4;\n const fx0 = ends[f], fy0 = ends[f + 1], fx1 = ends[f + 2], fy1 = ends[f + 3];\n if (Math.max(ey0, ey1) < Math.min(fy0, fy1)) continue;\n if (Math.max(fy0, fy1) < Math.min(ey0, ey1)) continue;\n const hit = crossingParams(ex0, ey0, ex1, ey1, fx0, fy0, fx1, fy1);\n if (hit && visit(ei, fi, hit[0], hit[1])) return;\n }\n }\n}\n\n/**\n * Each segment's smallest x in ascending order, with the segment's index\n * written into the key's low 32 bits, read back through a `Uint32Array` view.\n * A native numeric sort runs about three times as fast as one through a\n * comparator; the index moves each key by under `KEY_SLACK` of itself, which\n * the sweep's stop allows for.\n */\nfunction sortedMinX(ends: Float64Array, n: number): Float64Array {\n const keys = new Float64Array(n);\n const index = new Uint32Array(keys.buffer);\n for (let e = 0; e < n; e++) {\n keys[e] = Math.min(ends[e * 4], ends[e * 4 + 2]);\n index[e * 2 + LOW_WORD] = e;\n }\n return keys.sort();\n}\n\n/** Where segment E crosses segment F inside both, as fractions along each. */\nfunction crossingParams(\n ex0: number, ey0: number, ex1: number, ey1: number,\n fx0: number, fy0: number, fx1: number, fy1: number,\n): [number, number] | null {\n const rx = ex1 - ex0, ry = ey1 - ey0;\n const qx = fx1 - fx0, qy = fy1 - fy0;\n const den = rx * qy - ry * qx;\n if (den === 0) return null;\n const dx = fx0 - ex0, dy = fy0 - ey0;\n const s = (dx * qy - dy * qx) / den;\n const u = (dx * ry - dy * rx) / den;\n const lo = 1e-9, hi = 1 - 1e-9;\n if (s <= lo || s >= hi || u <= lo || u >= hi) return null;\n return [s, u];\n}\n","/** Rebuilding outlines as the non-crossing boundary of their fill. */\n\nimport { forEachCrossing } from './sweep';\n\n/** Flattened contours with each vertex's anchor parameterization. */\nexport interface FlattenedContours {\n coords: number[];\n contourStarts: number[];\n anchorA: number[];\n anchorB: number[];\n anchorT: number[];\n}\n\ninterface Node {\n x: number;\n y: number;\n a: number;\n b: number;\n t: number;\n}\n\ninterface Edge {\n from: Node;\n to: Node;\n /** Where crossings cut this edge, by parameter along it. */\n cuts: { s: number; node: Node }[];\n}\n\ninterface Piece {\n from: Node;\n to: Node;\n}\n\nconst keyOf = (n: Node): string => `${n.x},${n.y}`;\n\n/**\n * The boundary of `flat`'s nonzero fill as loops that do not cross, each with\n * the fill on its left, or `null` when no two edges cross and `always` is\n * not set.\n */\nexport function resolveCrossings(flat: FlattenedContours, always = false): FlattenedContours | null {\n if (!always && !anyCrossing(flat)) return null;\n return resolve(flat, (w) => w !== 0)!.contours;\n}\n\n/**\n * How much work resolving an even-odd fill may take, as boundary pieces times\n * edges: each piece is judged by a winding count over every edge. 2^20 of it\n * took 10 ms on an Apple M-series core (1024 edges, 2026-10-31), and parity is\n * what the stencil computes for free, so a fill past it keeps the stencil.\n */\nexport const MAX_EVENODD_RESOLVE_WORK = 2 ** 20;\n\n/**\n * The boundary of `flat`'s even-odd fill as loops that neither cross nor\n * overlap, each with the fill on its left, for outlines that cross or touch.\n * `null` when resolving would pass {@link MAX_EVENODD_RESOLVE_WORK}, or a\n * boundary piece would not close into a loop.\n */\nexport function resolveEvenOdd(flat: FlattenedContours): FlattenedContours | null {\n const edges = edgeCount(flat);\n const maxCrossings = Math.floor((MAX_EVENODD_RESOLVE_WORK / edges - edges) / 2);\n if (!(maxCrossings >= 0)) return null;\n const out = resolve(flat, (w) => (w & 1) !== 0, maxCrossings);\n return out !== null && out.complete ? out.contours : null;\n}\n\nfunction resolve(\n flat: FlattenedContours, filled: (winding: number) => boolean, maxCrossings = Infinity,\n): { contours: FlattenedContours; complete: boolean } | null {\n const edges = edgesOf(flat);\n const eps = contactTolerance(edges);\n if (!cutAtCrossings(edges, maxCrossings)) return null;\n cutAtContacts(edges, eps);\n weld(edges, eps);\n const pieces = boundaryPieces(edges, filled);\n const { loops, complete } = chainLoops(pieces);\n return { contours: loopsToContours(loops), complete };\n}\n\nfunction edgeCount(flat: FlattenedContours): number {\n const { coords, contourStarts } = flat;\n const total = coords.length / 2;\n let n = 0;\n contourStarts.forEach((start, c) => {\n const end = c + 1 < contourStarts.length ? contourStarts[c + 1] : total;\n for (let i = start; i < end; i++) {\n const j = i + 1 < end ? i + 1 : start;\n if (coords[i * 2] !== coords[j * 2] || coords[i * 2 + 1] !== coords[j * 2 + 1]) n++;\n }\n });\n return n;\n}\n\n/** Whether any two edges of `flat` cross. Every nonzero fill asks this, and\n * most cross nowhere, so it reads the coordinates without building edges. */\nexport function anyCrossing(flat: FlattenedContours): boolean {\n const { coords, contourStarts } = flat;\n const total = coords.length / 2;\n const ends = new Float64Array(total * 4);\n let n = 0;\n contourStarts.forEach((start, c) => {\n const end = c + 1 < contourStarts.length ? contourStarts[c + 1] : total;\n for (let i = start; i < end; i++) {\n const j = i + 1 < end ? i + 1 : start;\n const x0 = coords[i * 2], y0 = coords[i * 2 + 1], x1 = coords[j * 2], y1 = coords[j * 2 + 1];\n if (x0 === x1 && y0 === y1) continue;\n ends[n * 4] = x0; ends[n * 4 + 1] = y0; ends[n * 4 + 2] = x1; ends[n * 4 + 3] = y1;\n n++;\n }\n });\n let found = false;\n forEachCrossing(ends, n, () => (found = true));\n return found;\n}\n\nfunction edgesOf(flat: FlattenedContours): Edge[] {\n const { coords, contourStarts, anchorA, anchorB, anchorT } = flat;\n const total = coords.length / 2;\n const node = (i: number): Node => ({ x: coords[i * 2], y: coords[i * 2 + 1], a: anchorA[i], b: anchorB[i], t: anchorT[i] });\n const edges: Edge[] = [];\n contourStarts.forEach((start, c) => {\n const end = c + 1 < contourStarts.length ? contourStarts[c + 1] : total;\n for (let i = start; i < end; i++) {\n const from = node(i), to = node(i + 1 < end ? i + 1 : start);\n if (from.x !== to.x || from.y !== to.y) edges.push({ from, to, cuts: [] });\n }\n });\n return edges;\n}\n\n/** Record every interior crossing on both edges it cuts. `false`, having\n * stopped, when there are more than `max`. */\nfunction cutAtCrossings(edges: Edge[], max: number): boolean {\n const ends = new Float64Array(edges.length * 4);\n edges.forEach(({ from, to }, i) => ends.set([from.x, from.y, to.x, to.y], i * 4));\n let count = 0;\n forEachCrossing(ends, edges.length, (ei, fi, s, u) => {\n if (++count > max) return true;\n const e = edges[ei];\n const node = {\n x: e.from.x + (e.to.x - e.from.x) * s,\n y: e.from.y + (e.to.y - e.from.y) * s,\n ...anchorsAlong(e, s),\n };\n e.cuts.push({ s, node });\n edges[fi].cuts.push({ s: u, node });\n return false;\n });\n return count <= max;\n}\n\n/**\n * Cut every edge where another's end lies inside it, so outlines that touch\n * without crossing (a corner on an edge, a stretch of edge two contours share)\n * meet at a node both name. The cut takes the touching end's own coordinates,\n * so the two sides of a shared stretch come out as the same pieces.\n */\nfunction cutAtContacts(edges: Edge[], eps: number): void {\n const order = edges.map((_, i) => i);\n const lo = (e: Edge): number => Math.min(e.from.x, e.to.x);\n order.sort((a, b) => lo(edges[a]) - lo(edges[b]));\n for (let a = 0; a < order.length; a++) {\n const e = edges[order[a]];\n const stop = Math.max(e.from.x, e.to.x) + eps;\n for (let b = a + 1; b < order.length; b++) {\n const f = edges[order[b]];\n if (lo(f) > stop) break;\n if (Math.max(e.from.y, e.to.y) + eps < Math.min(f.from.y, f.to.y)) continue;\n if (Math.max(f.from.y, f.to.y) + eps < Math.min(e.from.y, e.to.y)) continue;\n cutAt(e, f.from, eps); cutAt(e, f.to, eps);\n cutAt(f, e.from, eps); cutAt(f, e.to, eps);\n }\n }\n}\n\n/** How near two points are to count as touching: the tolerance\n * `evenOddRings` judges contact by. */\nfunction contactTolerance(edges: Edge[]): number {\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (const { from: p } of edges) {\n minX = Math.min(minX, p.x); maxX = Math.max(maxX, p.x);\n minY = Math.min(minY, p.y); maxY = Math.max(maxY, p.y);\n }\n return Math.max(maxX - minX, maxY - minY, Math.abs(minX), Math.abs(maxX), Math.abs(minY), Math.abs(maxY)) * 1e-9;\n}\n\n/** Move every node within `eps` of one before it onto that one, so loops\n * chain through points that differ only by rounding. */\nfunction weld(edges: Edge[], eps: number): void {\n const nodes: Node[] = [];\n for (const e of edges) {\n nodes.push(e.from, e.to);\n for (const c of e.cuts) nodes.push(c.node);\n }\n nodes.sort((p, q) => p.x - q.x);\n for (let i = 0; i < nodes.length; i++) {\n const p = nodes[i];\n for (let j = i + 1; j < nodes.length && nodes[j].x - p.x <= eps; j++) {\n const q = nodes[j];\n if (q !== p && Math.abs(q.y - p.y) <= eps && (q.x !== p.x || q.y !== p.y)) {\n q.x = p.x;\n q.y = p.y;\n }\n }\n }\n}\n\n/** Cut `e` at `p` when `p` lies within `eps` of its inside, away from its ends\n * and from any cut already there. */\nfunction cutAt(e: Edge, p: Node, eps: number): void {\n const dx = e.to.x - e.from.x, dy = e.to.y - e.from.y;\n const len2 = dx * dx + dy * dy;\n const s = ((p.x - e.from.x) * dx + (p.y - e.from.y) * dy) / len2;\n if (!(s > 0 && s < 1)) return;\n if (Math.hypot(e.from.x + dx * s - p.x, e.from.y + dy * s - p.y) > eps) return;\n const at = (q: Node): boolean => Math.abs(q.x - p.x) <= eps && Math.abs(q.y - p.y) <= eps;\n if (at(e.from) || at(e.to) || e.cuts.some((c) => at(c.node))) return;\n e.cuts.push({ s, node: p });\n}\n\n/** Anchors for a point `s` of the way along `e`: interpolated within one\n * curve's run, else the nearer end's. */\nfunction anchorsAlong(e: Edge, s: number): { a: number; b: number; t: number } {\n const { from, to } = e;\n if (from.a === to.a && from.b === to.b) return { a: from.a, b: from.b, t: from.t + (to.t - from.t) * s };\n const near = s < 0.5 ? from : to;\n return { a: near.a, b: near.b, t: near.t };\n}\n\n/** The pieces between cuts that have fill on exactly one side, turned so it\n * is on the left. A stretch two edges share comes out once. */\nfunction boundaryPieces(edges: Edge[], filledBy: (winding: number) => boolean): Piece[] {\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (const { from: p } of edges) {\n minX = Math.min(minX, p.x); maxX = Math.max(maxX, p.x);\n minY = Math.min(minY, p.y); maxY = Math.max(maxY, p.y);\n }\n const eps = Math.max(Math.hypot(maxX - minX, maxY - minY) * 1e-7, 1e-9);\n const filled = (x: number, y: number) => filledBy(windingAt(edges, x, y));\n\n const out: Piece[] = [];\n const seen = new Set<string>();\n const keep = (from: Node, to: Node): void => {\n const k = `${keyOf(from)}>${keyOf(to)}`;\n if (seen.has(k)) return;\n seen.add(k);\n out.push({ from, to });\n };\n for (const e of edges) {\n const stops = [e.from, ...e.cuts.sort((p, q) => p.s - q.s).map((c) => c.node), e.to];\n for (let k = 0; k + 1 < stops.length; k++) {\n const p = stops[k], q = stops[k + 1];\n const dx = q.x - p.x, dy = q.y - p.y;\n const len = Math.hypot(dx, dy);\n if (len === 0) continue;\n const mx = (p.x + q.x) / 2, my = (p.y + q.y) / 2;\n const nx = (-dy / len) * eps, ny = (dx / len) * eps;\n const left = filled(mx + nx, my + ny), right = filled(mx - nx, my - ny);\n if (left && !right) keep(p, q);\n else if (right && !left) keep(q, p);\n }\n }\n return out;\n}\n\nfunction windingAt(edges: Edge[], x: number, y: number): number {\n let w = 0;\n for (const { from: p, to: q } of edges) {\n const side = (q.x - p.x) * (y - p.y) - (x - p.x) * (q.y - p.y);\n if (p.y <= y && q.y > y && side > 0) w++;\n else if (q.y <= y && p.y > y && side < 0) w--;\n }\n return w;\n}\n\n/** Join pieces end to start into closed loops. Where a node has several ways\n * on, take the sharpest left turn, which keeps to the face being traced. */\nfunction chainLoops(pieces: Piece[]): { loops: Node[][]; complete: boolean } {\n const outgoing = new Map<string, Piece[]>();\n for (const p of pieces) {\n const k = keyOf(p.from);\n const list = outgoing.get(k);\n if (list) list.push(p);\n else outgoing.set(k, [p]);\n }\n const used = new Set<Piece>();\n const loops: Node[][] = [];\n let complete = true;\n for (const first of pieces) {\n if (used.has(first)) continue;\n used.add(first);\n const loop: Node[] = [first.from];\n const startKey = keyOf(first.from);\n let cur = first;\n while (keyOf(cur.to) !== startKey) {\n const next = sharpestLeft(cur, (outgoing.get(keyOf(cur.to)) ?? []).filter((p) => !used.has(p)));\n if (!next) break;\n used.add(next);\n loop.push(next.from);\n cur = next;\n }\n if (keyOf(cur.to) !== startKey) complete = false;\n else if (loop.length >= 3) loops.push(loop);\n }\n return { loops, complete };\n}\n\nfunction sharpestLeft(into: Piece, options: Piece[]): Piece | undefined {\n const ix = into.to.x - into.from.x, iy = into.to.y - into.from.y;\n let best: Piece | undefined;\n let bestTurn = -Infinity;\n for (const p of options) {\n const ox = p.to.x - p.from.x, oy = p.to.y - p.from.y;\n const turn = Math.atan2(ix * oy - iy * ox, ix * ox + iy * oy);\n if (turn > bestTurn) {\n bestTurn = turn;\n best = p;\n }\n }\n return best;\n}\n\nfunction loopsToContours(loops: Node[][]): FlattenedContours {\n const out: FlattenedContours = { coords: [], contourStarts: [], anchorA: [], anchorB: [], anchorT: [] };\n for (const loop of loops) {\n out.contourStarts.push(out.coords.length / 2);\n for (const n of loop) {\n out.coords.push(n.x, n.y);\n out.anchorA.push(n.a);\n out.anchorB.push(n.b);\n out.anchorT.push(n.t);\n }\n }\n return out;\n}\n","/** How the rings of a fill that does not cross itself sit inside one another. */\n\nimport { pointInPolygon } from '../polyline';\nimport type { FlattenedContours } from './crossings';\n\nexport interface Ring {\n start: number;\n end: number;\n area: number;\n /** The smallest ring this one lies inside, or -1. */\n parent: number;\n /** Nonzero winding number just inside this ring. */\n winding: number;\n}\n\n/** Each contour's ring. A zero-area ring has no parent and winding 0. */\nexport function nestRings(flat: FlattenedContours): Ring[] {\n const { coords, contourStarts } = flat;\n const total = coords.length / 2;\n const rings: Ring[] = contourStarts.map((start, c) => {\n const end = c + 1 < contourStarts.length ? contourStarts[c + 1] : total;\n return { start, end, area: signedArea(coords, start, end), parent: -1, winding: 0 };\n });\n const boxes = rings.map((r) => boxOf(coords, r.start, r.end));\n const bySize = rings.map((_, i) => i).filter((i) => rings[i].area !== 0);\n bySize.sort((i, j) => Math.abs(rings[j].area) - Math.abs(rings[i].area));\n for (let k = 0; k < bySize.length; k++) {\n const r = rings[bySize[k]];\n for (let m = k - 1; m >= 0; m--) {\n const o = bySize[m];\n if (contains(coords, rings[o], boxes[o], r)) {\n r.parent = o;\n break;\n }\n }\n r.winding = Math.sign(r.area) + (r.parent >= 0 ? rings[r.parent].winding : 0);\n }\n return rings;\n}\n\n/** Whether `r` lies inside `o`, given that neither crosses the other. Judged\n * at the first vertex of `r` not on `o`'s outline, since one on it is\n * inside or out by rounding. */\nfunction contains(coords: number[], o: Ring, box: number[], r: Ring): boolean {\n const eps = Math.max(box[2] - box[0], box[3] - box[1]) * 1e-9;\n for (let i = r.start; i < r.end; i++) {\n const x = coords[i * 2], y = coords[i * 2 + 1];\n if (x < box[0] || x > box[2] || y < box[1] || y > box[3]) return false;\n if (!onOutline(coords, o, x, y, eps)) return pointInPolygon(coords, x, y, o.start, o.end);\n }\n return false;\n}\n\nfunction onOutline(coords: number[], o: Ring, x: number, y: number, eps: number): boolean {\n for (let i = o.start; i < o.end; i++) {\n const j = i + 1 === o.end ? o.start : i + 1;\n const ax = coords[i * 2], ay = coords[i * 2 + 1];\n const dx = coords[j * 2] - ax, dy = coords[j * 2 + 1] - ay;\n const len2 = dx * dx + dy * dy;\n const s = len2 > 0 ? Math.max(0, Math.min(1, ((x - ax) * dx + (y - ay) * dy) / len2)) : 0;\n if (Math.hypot(ax + dx * s - x, ay + dy * s - y) <= eps) return true;\n }\n return false;\n}\n\nfunction boxOf(coords: number[], start: number, end: number): number[] {\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (let i = start; i < end; i++) {\n const x = coords[i * 2], y = coords[i * 2 + 1];\n minX = Math.min(minX, x); maxX = Math.max(maxX, x);\n minY = Math.min(minY, y); maxY = Math.max(maxY, y);\n }\n return [minX, minY, maxX, maxY];\n}\n\nfunction signedArea(coords: number[], start: number, end: number): number {\n let a = 0;\n for (let i = start; i < end; i++) {\n const j = i + 1 === end ? start : i + 1;\n a += coords[i * 2] * coords[j * 2 + 1] - coords[j * 2] * coords[i * 2 + 1];\n }\n return a * 0.5;\n}\n","/** Even-odd fills whose outlines never meet, which triangulate like nonzero ones. */\n\nimport type { FlattenedContours } from './crossings';\nimport { nestRings, type Ring } from './nesting';\n\n/**\n * The rings of an even-odd fill with each `winding` set to 1 where the fill\n * lies just inside it and 0 where a hole does, or `null` when two edges touch\n * anywhere but the vertex two neighbors share, or a ring has no area. Without\n * contact, each ring is filled or empty by how many rings enclose it, so the\n * fill is the even-depth rings less their children and earcut can draw it.\n * Contact is judged with a tolerance, so a near miss reads as a touch.\n */\nexport function evenOddRings(flat: FlattenedContours): Ring[] | null {\n if (anyContact(flat)) return null;\n const rings = nestRings(flat);\n if (rings.some((r) => r.area === 0)) return null;\n for (const r of rings) {\n let depth = 0;\n for (let p = r.parent; p >= 0; p = rings[p].parent) depth++;\n r.winding = depth % 2 === 0 ? 1 : 0;\n }\n return rings;\n}\n\n/** Segments as `x0, y0, x1, y1`, with each one's contour and position in it. */\ninterface Segments {\n ends: Float64Array;\n contour: Uint32Array;\n pos: Uint32Array;\n /** Segments in each contour. */\n count: number[];\n n: number;\n}\n\nfunction segmentsOf(flat: FlattenedContours): Segments {\n const { coords, contourStarts } = flat;\n const total = coords.length / 2;\n const ends = new Float64Array(total * 4);\n const contour = new Uint32Array(total);\n const pos = new Uint32Array(total);\n const count: number[] = [];\n let n = 0;\n contourStarts.forEach((start, c) => {\n const end = c + 1 < contourStarts.length ? contourStarts[c + 1] : total;\n let k = 0;\n for (let i = start; i < end; i++) {\n const j = i + 1 < end ? i + 1 : start;\n const x0 = coords[i * 2], y0 = coords[i * 2 + 1], x1 = coords[j * 2], y1 = coords[j * 2 + 1];\n if (x0 === x1 && y0 === y1) continue;\n ends.set([x0, y0, x1, y1], n * 4);\n contour[n] = c;\n pos[n] = k++;\n n++;\n }\n count.push(k);\n });\n return { ends, contour, pos, count, n };\n}\n\n/** Whether any two segments meet other than at the end two neighbors share. */\nfunction anyContact(flat: FlattenedContours): boolean {\n const s = segmentsOf(flat);\n const { ends, n } = s;\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (let i = 0; i < n * 4; i += 2) {\n minX = Math.min(minX, ends[i]); maxX = Math.max(maxX, ends[i]);\n minY = Math.min(minY, ends[i + 1]); maxY = Math.max(maxY, ends[i + 1]);\n }\n const eps = Math.max(maxX - minX, maxY - minY, Math.abs(minX), Math.abs(maxX), Math.abs(minY), Math.abs(maxY)) * 1e-9;\n const order = Array.from({ length: n }, (_, i) => i);\n const lo = (e: number): number => Math.min(ends[e * 4], ends[e * 4 + 2]);\n order.sort((a, b) => lo(a) - lo(b));\n for (let a = 0; a < n; a++) {\n const e = order[a];\n const stop = Math.max(ends[e * 4], ends[e * 4 + 2]) + eps;\n for (let b = a + 1; b < n; b++) {\n const f = order[b];\n if (lo(f) > stop) break;\n if (touches(s, e, f, eps)) return true;\n }\n }\n return false;\n}\n\nfunction touches(s: Segments, e: number, f: number, eps: number): boolean {\n const { ends } = s;\n const ax = ends[e * 4], ay = ends[e * 4 + 1], bx = ends[e * 4 + 2], by = ends[e * 4 + 3];\n const cx = ends[f * 4], cy = ends[f * 4 + 1], dx = ends[f * 4 + 2], dy = ends[f * 4 + 3];\n if (Math.max(ay, by) + eps < Math.min(cy, dy) || Math.max(cy, dy) + eps < Math.min(ay, by)) return false;\n const shared = sharedEnd(s, e, f);\n if (shared === 'e-to') {\n // f starts where e ends: they meet only there unless f doubles back along e.\n return foldsBack(bx - ax, by - ay, dx - cx, dy - cy) || near(ax, ay, cx, cy, dx, dy, eps);\n }\n if (shared === 'f-to') {\n return foldsBack(dx - cx, dy - cy, bx - ax, by - ay) || near(cx, cy, ax, ay, bx, by, eps);\n }\n return near(ax, ay, cx, cy, dx, dy, eps) || near(bx, by, cx, cy, dx, dy, eps)\n || near(cx, cy, ax, ay, bx, by, eps) || near(dx, dy, ax, ay, bx, by, eps)\n || properCross(ax, ay, bx, by, cx, cy, dx, dy);\n}\n\n/** Which of the pair hands its end to the other as its start, when they are\n * neighbors in one contour. A contour of two segments has them meet at both\n * ends, and is caught for having no area. */\nfunction sharedEnd(s: Segments, e: number, f: number): 'e-to' | 'f-to' | null {\n if (s.contour[e] !== s.contour[f]) return null;\n const k = s.count[s.contour[e]];\n if (k < 3) return null;\n if ((s.pos[e] + 1) % k === s.pos[f]) return 'e-to';\n if ((s.pos[f] + 1) % k === s.pos[e]) return 'f-to';\n return null;\n}\n\n/** Whether the second direction turns back along the first. */\nfunction foldsBack(ux: number, uy: number, vx: number, vy: number): boolean {\n const cross = ux * vy - uy * vx;\n return Math.abs(cross) <= 1e-9 * Math.hypot(ux, uy) * Math.hypot(vx, vy) && ux * vx + uy * vy < 0;\n}\n\n/** Whether point P lies within `eps` of segment AB. */\nfunction near(px: number, py: number, ax: number, ay: number, bx: number, by: number, eps: number): boolean {\n const dx = bx - ax, dy = by - ay;\n const len2 = dx * dx + dy * dy;\n const t = len2 > 0 ? Math.max(0, Math.min(1, ((px - ax) * dx + (py - ay) * dy) / len2)) : 0;\n return Math.hypot(ax + dx * t - px, ay + dy * t - py) <= eps;\n}\n\nfunction properCross(\n ax: number, ay: number, bx: number, by: number,\n cx: number, cy: number, dx: number, dy: number,\n): boolean {\n const o1 = orient(ax, ay, bx, by, cx, cy), o2 = orient(ax, ay, bx, by, dx, dy);\n const o3 = orient(cx, cy, dx, dy, ax, ay), o4 = orient(cx, cy, dx, dy, bx, by);\n return o1 * o2 <= 0 && o3 * o4 <= 0;\n}\n\nconst orient = (ax: number, ay: number, bx: number, by: number, px: number, py: number): number =>\n Math.sign((bx - ax) * (py - ay) - (by - ay) * (px - ax));\n","import earcut from 'earcut';\nimport { forEachSegment, PATH_M, PATH_L, PATH_Z, PATH_C, PATH_Q } from '../commands';\nimport { resolveCorners } from '../paths/corners';\nimport { coordsFrom, originFor } from '../paths/pathOrigin';\nimport { rectToContour } from '../box';\nimport type { Path, PolygonPath, RectPath } from '../path';\nimport { fillsOpenSubpaths } from '../openFill';\nimport {\n DEFAULT_FLATTEN_TOLERANCE,\n flattenCubicWithArcLen,\n flattenQuadraticWithArcLen,\n} from '../flatten';\nimport type { Mesh } from './mesh';\nimport { resolveCrossings, resolveEvenOdd, type FlattenedContours } from './crossings';\nimport { nestRings, type Ring } from './nesting';\nimport { evenOddRings } from './evenOdd';\n\n/** Options for `tessellate`. A smaller tolerance means more triangles and\n * smoother curves; it is in path-local units, so callers rendering at a\n * larger scale should tighten it. */\nexport interface TessellateOptions {\n /** Flatness tolerance for bezier subdivision in path-local units. */\n flattenTolerance?: number;\n}\n\n/** Turn a path into a triangle mesh the renderer can draw: curves flattened to\n * line segments, then the resulting polygon triangulated. */\nexport function tessellate(path: Path, opts: TessellateOptions = {}): Mesh {\n if (path.kind === 'rect') return tessellateRect(path);\n const mesh = tessellatePolygon(resolveCorners(path), opts);\n return path.origin ? { ...mesh, origin: path.origin } : mesh;\n}\n\nfunction tessellateRect(p: RectPath): Mesh {\n const corners = rectToContour(p.x, p.y, p.width, p.height);\n const origin = originFor(corners);\n return {\n vertices: coordsFrom(origin, corners),\n indices: new Uint32Array([0, 1, 2, 0, 2, 3]),\n anchorA: new Uint32Array([0, 1, 2, 3]),\n anchorB: new Uint32Array([0, 1, 2, 3]),\n anchorT: new Float32Array([0, 0, 0, 0]),\n ...(origin ? { origin } : {}),\n };\n}\n\n/** The contours a fill covers: all of them, or only those a `Z` closed. */\nexport function flattenPolygon(p: PolygonPath, tolerance: number): FlattenedContours {\n const closed = new Set<number>();\n const all = flattenContours(p, tolerance, closed);\n if (fillsOpenSubpaths(p)) return all;\n const kept: FlattenedContours = { coords: [], contourStarts: [], anchorA: [], anchorB: [], anchorT: [] };\n all.contourStarts.forEach((start, c) => {\n if (!closed.has(c)) return;\n const end = c + 1 < all.contourStarts.length ? all.contourStarts[c + 1] : all.coords.length / 2;\n kept.contourStarts.push(kept.coords.length / 2);\n kept.coords.push(...all.coords.slice(start * 2, end * 2));\n kept.anchorA.push(...all.anchorA.slice(start, end));\n kept.anchorB.push(...all.anchorB.slice(start, end));\n kept.anchorT.push(...all.anchorT.slice(start, end));\n });\n return kept;\n}\n\n/** Flatten every contour, noting in `closed` the index of each one a `Z` ends. */\nfunction flattenContours(p: PolygonPath, tolerance: number, closed: Set<number>): FlattenedContours {\n const { commands, coords } = p;\n const out: number[] = [];\n const anchorA: number[] = [];\n const anchorB: number[] = [];\n const anchorT: number[] = [];\n const contourStarts: number[] = [];\n let startAnchor = -1;\n let prevAnchor = -1;\n let anchorCounter = 0;\n\n // Anchor bookkeeping for the points a curve just appended: interior points\n // interpolate (prevAnchor → target); the last is pinned anchor-exact.\n const pushCurveAnchors = (anchorStart: number, arcAccum: number[], total: number, target: number): void => {\n for (let k = 0; k < arcAccum.length; k++) {\n anchorA.push(prevAnchor);\n anchorB.push(target);\n anchorT.push(total > 0 ? arcAccum[k] / total : 0);\n }\n const lastIdx = anchorStart + arcAccum.length - 1;\n anchorA[lastIdx] = target;\n anchorB[lastIdx] = target;\n anchorT[lastIdx] = 0;\n };\n\n forEachSegment(commands, coords, (cmd, coordIdx, prevX, prevY, _i, opensSubpath) => {\n if (opensSubpath) {\n const anchor = Math.max(startAnchor, 0);\n contourStarts.push(out.length / 2);\n out.push(prevX, prevY);\n anchorA.push(anchor);\n anchorB.push(anchor);\n anchorT.push(0);\n prevAnchor = anchor;\n }\n switch (cmd) {\n case PATH_M:\n case PATH_L: {\n if (cmd === PATH_M) {\n contourStarts.push(out.length / 2);\n startAnchor = anchorCounter;\n }\n out.push(coords[coordIdx], coords[coordIdx + 1]);\n anchorA.push(anchorCounter);\n anchorB.push(anchorCounter);\n anchorT.push(0);\n prevAnchor = anchorCounter;\n anchorCounter++;\n break;\n }\n case PATH_Q: {\n const target = anchorCounter;\n const arcAccum: number[] = [];\n const anchorStart = anchorA.length;\n const total = flattenQuadraticWithArcLen(\n prevX, prevY,\n coords[coordIdx], coords[coordIdx + 1],\n coords[coordIdx + 2], coords[coordIdx + 3],\n tolerance, out, arcAccum,\n );\n pushCurveAnchors(anchorStart, arcAccum, total, target);\n prevAnchor = target;\n anchorCounter++;\n break;\n }\n case PATH_C: {\n const target = anchorCounter;\n const arcAccum: number[] = [];\n const anchorStart = anchorA.length;\n const total = flattenCubicWithArcLen(\n prevX, prevY,\n coords[coordIdx], coords[coordIdx + 1],\n coords[coordIdx + 2], coords[coordIdx + 3],\n coords[coordIdx + 4], coords[coordIdx + 5],\n tolerance, out, arcAccum,\n );\n pushCurveAnchors(anchorStart, arcAccum, total, target);\n prevAnchor = target;\n anchorCounter++;\n break;\n }\n case PATH_Z:\n closed.add(contourStarts.length - 1);\n // The pen returns to the subpath start (forEachSegment does that); the\n // anchor it carries has to follow, or a curve after the Z interpolates\n // from the wrong end.\n prevAnchor = startAnchor;\n break;\n default:\n throw new Error(`tessellate: unknown command code ${cmd}`);\n }\n });\n\n return { coords: out, contourStarts, anchorA, anchorB, anchorT };\n}\n\nfunction tessellatePolygon(p: PolygonPath, opts: TessellateOptions): Mesh {\n const tolerance = opts.flattenTolerance ?? DEFAULT_FLATTEN_TOLERANCE;\n const flat = flattenPolygon(p, tolerance);\n\n if (p.fillRule === 'evenodd') {\n const rings = evenOddRings(flat);\n if (rings) return tessellateNonzero(flat, rings);\n const resolved = resolveEvenOdd(flat);\n if (resolved) return tessellateNonzero(resolved, nestRings(resolved));\n const { coords, contourStarts, anchorA, anchorB, anchorT } = flat;\n return tessellateEvenoddWithAnchors(coords, contourStarts, anchorA, anchorB, anchorT);\n }\n const crossed = resolveCrossings(flat);\n if (crossed) return tessellateNonzero(crossed, nestRings(crossed));\n const rings = nestRings(flat);\n if (rings.every((r) => Math.abs(r.winding) <= 1)) return tessellateNonzero(flat, rings);\n // Nested same-wound rings would cover the region they share twice.\n const rebuilt = resolveCrossings(flat, true)!;\n return tessellateNonzero(rebuilt, nestRings(rebuilt));\n}\n\n/** Triangulate rings that do not cross and wind at most once anywhere: each\n * ring with fill inside it, less the rings directly inside it, which are its\n * holes. */\nfunction tessellateNonzero(flat: FlattenedContours, rings: Ring[]): Mesh {\n const { coords, contourStarts, anchorA, anchorB, anchorT } = flat;\n const shapes: number[] = [];\n const holesByShape = new Map<number, number[]>();\n rings.forEach((r, i) => {\n if (r.area === 0) return;\n if (r.winding !== 0) shapes.push(i);\n else if (holesByShape.has(r.parent)) holesByShape.get(r.parent)!.push(i);\n else holesByShape.set(r.parent, [i]);\n });\n\n if (shapes.length <= 1 && (shapes[0] ?? 0) === 0) {\n const tri = earcut(coords, contourStarts.length > 1 ? contourStarts.slice(1) : undefined);\n return {\n vertices: new Float32Array(coords),\n indices: new Uint32Array(tri),\n anchorA: new Uint32Array(anchorA),\n anchorB: new Uint32Array(anchorB),\n anchorT: new Float32Array(anchorT),\n };\n }\n\n const finalCoords: number[] = [];\n const finalAnchorA: number[] = [];\n const finalAnchorB: number[] = [];\n const finalAnchorT: number[] = [];\n const finalIndices: number[] = [];\n for (const pos of shapes) {\n const holes = holesByShape.get(pos) ?? [];\n const offset = finalCoords.length / 2;\n const groupCoords: number[] = [];\n const groupStarts: number[] = [0];\n for (let i = rings[pos].start; i < rings[pos].end; i++) {\n groupCoords.push(coords[i * 2], coords[i * 2 + 1]);\n finalAnchorA.push(anchorA[i]);\n finalAnchorB.push(anchorB[i]);\n finalAnchorT.push(anchorT[i]);\n }\n for (const h of holes) {\n groupStarts.push(groupCoords.length / 2);\n for (let i = rings[h].start; i < rings[h].end; i++) {\n groupCoords.push(coords[i * 2], coords[i * 2 + 1]);\n finalAnchorA.push(anchorA[i]);\n finalAnchorB.push(anchorB[i]);\n finalAnchorT.push(anchorT[i]);\n }\n }\n const tri = earcut(groupCoords, groupStarts.length > 1 ? groupStarts.slice(1) : undefined);\n for (const v of groupCoords) finalCoords.push(v);\n for (const idx of tri) finalIndices.push(idx + offset);\n }\n\n return {\n vertices: new Float32Array(finalCoords),\n indices: new Uint32Array(finalIndices),\n anchorA: new Uint32Array(finalAnchorA),\n anchorB: new Uint32Array(finalAnchorB),\n anchorT: new Float32Array(finalAnchorT),\n };\n}\n\nfunction tessellateEvenoddWithAnchors(\n coords: number[],\n contourStarts: number[],\n anchorA: number[],\n anchorB: number[],\n anchorT: number[],\n): Mesh {\n const indices: number[] = [];\n const totalVerts = coords.length / 2;\n for (let c = 0; c < contourStarts.length; c++) {\n const start = contourStarts[c];\n const end = c + 1 < contourStarts.length ? contourStarts[c + 1] : totalVerts;\n for (let i = start + 1; i < end - 1; i++) {\n indices.push(start, i, i + 1);\n }\n }\n return {\n vertices: new Float32Array(coords),\n indices: new Uint32Array(indices),\n requiresStencil: true,\n anchorA: new Uint32Array(anchorA),\n anchorB: new Uint32Array(anchorB),\n anchorT: new Float32Array(anchorT),\n };\n}\n"]}
@@ -528,6 +528,6 @@ function spiroContoursFromControl(control, before, fallback = "smooth") {
528
528
  }));
529
529
  }
530
530
 
531
- export { SPIRO_KINDS, combTeeth, cubicCurvatureAt, cubicCurvatureSource, cubicDerivativeAt, curvatureComb, eulerAngleAt, eulerCurvatureAt, eulerCurvatureDerivativesAt, eulerPointAt, fitEulerSegment, isSpiroKind, placeEulerSegment, solveSpiro, spiroContoursFromControl, spiroContoursOf, spiroControlPath, spiroToPath };
532
- //# sourceMappingURL=chunk-42TZDN5C.js.map
533
- //# sourceMappingURL=chunk-42TZDN5C.js.map
531
+ export { SPIRO_KINDS, combTeeth, cubicCurvatureAt, cubicCurvatureSource, cubicDerivativeAt, curvatureComb, eulerAngleAt, eulerCubicError, eulerCurvatureAt, eulerCurvatureDerivativesAt, eulerPointAt, eulerSegmentCubic, fitEulerSegment, integrateEuler, isSpiroKind, placeEulerSegment, solveSpiro, spiroContoursFromControl, spiroContoursOf, spiroControlPath, spiroToPath };
532
+ //# sourceMappingURL=chunk-HNLJO3E7.js.map
533
+ //# sourceMappingURL=chunk-HNLJO3E7.js.map