@flighthq/path-boolean 0.5.1-next.3302.76ece6b → 0.5.1-next.4304.322dc96

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/README.md +2 -2
  2. package/dist/.tsbuildinfo.contract +1 -0
  3. package/dist/.tsbuildinfo.runtime +1 -0
  4. package/dist/booleanPaths.d.ts +33 -6
  5. package/dist/booleanPaths.d.ts.map +1 -1
  6. package/dist/booleanPaths.js +42 -3
  7. package/dist/booleanPaths.js.map +1 -1
  8. package/dist/contract.d.ts +12 -8
  9. package/dist/contract.d.ts.map +1 -1
  10. package/dist/contract.js +11 -8
  11. package/dist/contract.js.map +1 -1
  12. package/dist/contract.path-boolean-types.d.ts +4 -0
  13. package/dist/contract.path-boolean-types.d.ts.map +1 -0
  14. package/dist/contract.path-boolean-types.js +2 -0
  15. package/dist/contract.path-boolean-types.js.map +1 -0
  16. package/dist/explainPathBoolean.d.ts +15 -3
  17. package/dist/explainPathBoolean.d.ts.map +1 -1
  18. package/dist/explainPathBoolean.js +35 -9
  19. package/dist/explainPathBoolean.js.map +1 -1
  20. package/dist/index.d.ts +3 -8
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +3 -8
  23. package/dist/index.js.map +1 -1
  24. package/dist/martinezKernel.d.ts +44 -4
  25. package/dist/martinezKernel.d.ts.map +1 -1
  26. package/dist/martinezKernel.js +777 -559
  27. package/dist/martinezKernel.js.map +1 -1
  28. package/dist/offsetPath.d.ts +15 -2
  29. package/dist/offsetPath.d.ts.map +1 -1
  30. package/dist/offsetPath.js +205 -215
  31. package/dist/offsetPath.js.map +1 -1
  32. package/dist/pathBoolean.d.ts +53 -0
  33. package/dist/pathBoolean.d.ts.map +1 -0
  34. package/dist/pathBoolean.js +115 -0
  35. package/dist/pathBoolean.js.map +1 -0
  36. package/dist/pathBooleanCompat.d.ts +3 -0
  37. package/dist/pathBooleanCompat.d.ts.map +1 -0
  38. package/dist/pathBooleanCompat.js +2 -0
  39. package/dist/pathBooleanCompat.js.map +1 -0
  40. package/dist/resolvePathRegions.d.ts +8 -2
  41. package/dist/resolvePathRegions.d.ts.map +1 -1
  42. package/dist/resolvePathRegions.js +11 -3
  43. package/dist/resolvePathRegions.js.map +1 -1
  44. package/dist/simplifyPath.d.ts +9 -2
  45. package/dist/simplifyPath.d.ts.map +1 -1
  46. package/dist/simplifyPath.js +12 -2
  47. package/dist/simplifyPath.js.map +1 -1
  48. package/dist/unionAllPaths.d.ts +9 -2
  49. package/dist/unionAllPaths.d.ts.map +1 -1
  50. package/dist/unionAllPaths.js +23 -8
  51. package/dist/unionAllPaths.js.map +1 -1
  52. package/dist/writePathBooleanContours.d.ts +8 -2
  53. package/dist/writePathBooleanContours.d.ts.map +1 -1
  54. package/dist/writePathBooleanContours.js +16 -4
  55. package/dist/writePathBooleanContours.js.map +1 -1
  56. package/package.json +5 -4
  57. package/src/booleanPaths.test.ts +237 -114
  58. package/src/explainPathBoolean.test.ts +35 -21
  59. package/src/fuzzInvariants.test.ts +241 -154
  60. package/src/martinezKernel.test.ts +334 -328
  61. package/src/offsetPath.test.ts +296 -166
  62. package/src/pathBoolean.test.ts +95 -0
  63. package/src/resolvePathRegions.test.ts +41 -30
  64. package/src/simplifyPath.test.ts +143 -112
  65. package/src/unionAllPaths.test.ts +93 -61
  66. package/src/writePathBooleanContours.test.ts +44 -6
@@ -1,102 +1,42 @@
1
+ // Generated from crates/flight-path-boolean/src/offset_path.rs by flight-compiler.
2
+ // Rust is authoritative; run `npm run generate` after changing it.
1
3
  import { flattenPath } from '@flighthq/path/contract';
2
4
  import { resolvePathRegions } from "./resolvePathRegions.js";
3
- // Offsets a path outward (positive `delta`, inflate) or inward (negative `delta`, deflate) by a signed
4
- // distance, writing a polygon outline into `out`. The input is flattened to polygon contours at the
5
- // option tolerance; each closed contour is offset into a grown/shrunk ring and each open contour is
6
- // offset into a closed slab outline capped at both terminals. Corner style on the convex side of a
7
- // vertex is chosen by `options.join` (miter/bevel/round/square); open-path terminals by `options.end`
8
- // (butt/round/square). The raw offset rings are then self-unioned by the active boolean kernel under
9
- // non-zero fill to resolve the self-overlap concave corners produce, merge touching rings, and emit a
10
- // clean, hole-correct outline. `delta` is signed against a canonical orientation, so positive always
11
- // grows regardless of input winding. Over-deflating a region past self-collapse drops it, so the result
12
- // can be an empty path (no commands).
13
- export function offsetPath(out, pathBooleanKernel, path, delta, options) {
14
- const join = options?.join ?? 'miter';
15
- const end = options?.end ?? 'butt';
16
- const miterLimit = options?.miterLimit ?? DEFAULT_MITER_LIMIT;
17
- const arcTolerance = options?.arcTolerance ?? DEFAULT_ARC_TOLERANCE;
18
- const contours = flattenPath(path, options?.tolerance);
19
- // Coincident-point tolerance, made relative to the input's coordinate extent so the same corners
20
- // collapse whether the contour is in pixels or micrometres; falls back to a fixed absolute when the
21
- // extent is degenerate. Squared to match the squared-distance comparisons it feeds.
22
- const pointEpsSq = getContourPointEps(contours) ** 2;
23
- const rawRings = [];
24
- for (const contour of contours) {
25
- const closed = isClosedContour(contour, pointEpsSq);
26
- const vertices = getCleanContourVertices(contour, closed, pointEpsSq);
27
- if (closed) {
28
- // Fewer than three distinct vertices enclose no area to offset.
29
- if (vertices.length < 6)
30
- continue;
31
- const orientation = getRingOrientationSign(vertices);
32
- const ring = buildOffsetRing(vertices, delta * orientation, NO_CAPS, join, end, miterLimit, arcTolerance);
33
- if (ring.length < 6)
34
- continue;
35
- // Drop a ring deflated past self-collapse. Such a ring either fully inverts (its winding flips) or
36
- // folds back so an inward offset fails to reduce the enclosed area — the global signature of a full
37
- // collapse. (Partial self-overlap that stays same-signed is left for the positive-fill union below.)
38
- const offsetArea = getRingSignedArea(ring);
39
- const inverted = Math.sign(offsetArea) !== orientation;
40
- const notReduced = delta < 0 && Math.abs(offsetArea) >= Math.abs(getRingSignedArea(vertices));
41
- if (inverted || notReduced)
42
- continue;
43
- // Orient the surviving ring counter-clockwise (positive area) so the positive-fill self-union keeps
44
- // it whatever the source winding was.
45
- rawRings.push(offsetArea < 0 ? reverseVertexLoop(ring) : ring);
46
- }
47
- else {
48
- // Fewer than two distinct vertices form no segment to stroke.
49
- if (vertices.length < 4)
50
- continue;
51
- const caps = new Set([0, vertices.length / 2 - 1]);
52
- const loop = getOpenContourLoop(vertices);
53
- const ring = buildOffsetRing(loop, Math.abs(delta), caps, join, end, miterLimit, arcTolerance);
54
- // A stroked slab always bounds a positive-area band; orient it counter-clockwise so positive-fill
55
- // union keeps it regardless of which way the doubled loop happened to wind.
56
- if (ring.length >= 6)
57
- rawRings.push(getRingSignedArea(ring) < 0 ? reverseVertexLoop(ring) : ring);
58
- }
59
- }
60
- // Self-union the raw rings under positive fill (Clipper's InflatePaths cleanup fill): where a concave
61
- // corner's inner-miter emission overshoots on a feature narrower than 2·|delta|, it dissolves the
62
- // negatively-wound self-overlap that non-zero fill would have kept; it also merges touching rings and
63
- // emits a clean, hole-correct outline (empty ring set → empty path).
64
- resolvePathRegions(out, pathBooleanKernel, rawRings, 'positive');
65
- }
66
- // Assembles one offset ring for a closed vertex loop by walking its vertices and emitting, at each, the
67
- // join (or end cap, for the flagged terminal indices of an open-path loop) that bridges the offset end
68
- // of the previous edge to the offset start of the next. `signedDelta` is the outward offset distance;
69
- // the outward direction is the per-edge right normal, so a positively-oriented loop grows on positive
70
- // `signedDelta`. `capIndices` is empty for a genuine closed contour and holds the two terminal indices
71
- // for an open contour's doubled loop.
5
+ const DEFAULT_ARC_TOLERANCE = 0.25;
6
+ const DEFAULT_MITER_LIMIT = 2.0;
7
+ const DEFAULT_FLATTEN_TOLERANCE = 0.25;
8
+ const HALF_PI = Math.PI / 2.0;
9
+ const POINT_EPS = 1e-9;
10
+ const POINT_EPS_RELATIVE = 1e-9;
11
+ const PARALLEL_EPS = 1e-12;
12
+ const TWO_PI = Math.PI * 2.0;
72
13
  function buildOffsetRing(vertices, signedDelta, capIndices, join, end, miterLimit, arcTolerance) {
73
- const count = vertices.length / 2;
74
- // Per-edge unit direction and right normal; edge k runs from vertex k to vertex (k + 1) mod count.
75
- const dirX = new Array(count);
76
- const dirY = new Array(count);
77
- const normalX = new Array(count);
78
- const normalY = new Array(count);
79
- for (let k = 0; k < count; k++) {
14
+ const count = Math.trunc(vertices.length / 2);
15
+ let dirX = new Array(count).fill(0.0);
16
+ let dirY = new Array(count).fill(0.0);
17
+ let normalX = new Array(count).fill(0.0);
18
+ let normalY = new Array(count).fill(0.0);
19
+ for (let k = 0; k < count; k += 1) {
80
20
  const kn = (k + 1) % count;
81
21
  const dx = vertices[2 * kn] - vertices[2 * k];
82
22
  const dy = vertices[2 * kn + 1] - vertices[2 * k + 1];
83
- const length = Math.hypot(dx, dy);
84
- const inverse = length > 0 ? 1 / length : 0;
23
+ const length = Math.sqrt(dx * dx + dy * dy);
24
+ const inverse = length > 0.0 ? 1.0 / length : 0.0;
85
25
  dirX[k] = dx * inverse;
86
26
  dirY[k] = dy * inverse;
87
27
  normalX[k] = dirY[k];
88
28
  normalY[k] = -dirX[k];
89
29
  }
90
- const ring = [];
91
- for (let k = 0; k < count; k++) {
92
- const previous = (k - 1 + count) % count;
30
+ let ring = [];
31
+ for (let k = 0; k < count; k += 1) {
32
+ const previous = (k + count - 1) % count;
93
33
  const vx = vertices[2 * k];
94
34
  const vy = vertices[2 * k + 1];
95
35
  const previousEndX = vx + signedDelta * normalX[previous];
96
36
  const previousEndY = vy + signedDelta * normalY[previous];
97
37
  const thisStartX = vx + signedDelta * normalX[k];
98
38
  const thisStartY = vy + signedDelta * normalY[k];
99
- if (capIndices.has(k)) {
39
+ if (capIndices.includes(k)) {
100
40
  emitOffsetEndCap(ring, vx, vy, previousEndX, previousEndY, thisStartX, thisStartY, dirX[previous], dirY[previous], dirX[k], dirY[k], Math.abs(signedDelta), end, arcTolerance);
101
41
  }
102
42
  else {
@@ -105,214 +45,264 @@ function buildOffsetRing(vertices, signedDelta, capIndices, join, end, miterLimi
105
45
  }
106
46
  return ring;
107
47
  }
108
- // Emits the terminal cap of an open path at vertex (vx, vy), bridging the offset end of the incoming
109
- // side (previousEnd) to the offset start of the outgoing side (thisStart), which sit on opposite sides
110
- // of the terminal. `butt` connects them flat, `square` extends both out past the terminal by `radius`,
111
- // and `round` sweeps a half-circle of that radius around the terminal. `previousEnd` is emitted first;
112
- // `thisStart` is always emitted last.
113
48
  function emitOffsetEndCap(ring, vx, vy, previousEndX, previousEndY, thisStartX, thisStartY, previousDirX, previousDirY, thisDirX, thisDirY, radius, end, arcTolerance) {
114
- ring.push(previousEndX, previousEndY);
115
- if (end === 'square') {
116
- ring.push(previousEndX + radius * previousDirX, previousEndY + radius * previousDirY);
117
- ring.push(thisStartX - radius * thisDirX, thisStartY - radius * thisDirY);
118
- }
119
- else if (end === 'round') {
120
- const startAngle = Math.atan2(previousEndY - vy, previousEndX - vx);
121
- // Sweep the half-circle that bulges past the terminal — the side the incoming direction points.
122
- const midX = Math.cos(startAngle + HALF_PI);
123
- const midY = Math.sin(startAngle + HALF_PI);
124
- const sweep = (midX * previousDirX + midY * previousDirY >= 0 ? 1 : -1) * Math.PI;
125
- pushOffsetArc(ring, vx, vy, radius, startAngle, sweep, arcTolerance);
49
+ ring.push(previousEndX);
50
+ ring.push(previousEndY);
51
+ switch (end) {
52
+ case 'square':
53
+ ring.push(previousEndX + radius * previousDirX);
54
+ ring.push(previousEndY + radius * previousDirY);
55
+ ring.push(thisStartX - radius * thisDirX);
56
+ ring.push(thisStartY - radius * thisDirY);
57
+ break;
58
+ case 'round':
59
+ const startAngle = Math.atan2(previousEndY - vy, previousEndX - vx);
60
+ const midX = Math.cos(startAngle + HALF_PI);
61
+ const midY = Math.sin(startAngle + HALF_PI);
62
+ const sweep = (midX * previousDirX + midY * previousDirY >= 0.0 ? 1.0 : -1.0) * Math.PI;
63
+ pushOffsetArc(ring, vx, vy, radius, startAngle, sweep, arcTolerance);
64
+ break;
65
+ case 'butt':
66
+ break;
126
67
  }
127
- ring.push(thisStartX, thisStartY);
68
+ ring.push(thisStartX);
69
+ ring.push(thisStartY);
128
70
  }
129
- // Emits the join at vertex (vx, vy) on the convex (gap) side, bridging the offset end of the previous
130
- // edge (previousEnd) to the offset start of the next edge (thisStart). On the concave side the two
131
- // offset edges overlap; the outline routes back through the original vertex (previousEnd → vertex →
132
- // thisStart), leaving a self-crossing spur with consistent winding for the kernel's self-union to
133
- // resolve. `miter` extends the two offset edges to their apex, falling back to a bevel
134
- // when that apex is farther than `miterLimit * |signedDelta|`; `bevel` chamfers straight across;
135
- // `round` sweeps an arc of radius `|signedDelta|`; `square` extends both edges by `|signedDelta|`.
136
- // `previousEnd` is emitted first; `thisStart` is always emitted last.
137
71
  function emitOffsetJoin(ring, vx, vy, previousEndX, previousEndY, thisStartX, thisStartY, previousDirX, previousDirY, thisDirX, thisDirY, signedDelta, join, miterLimit, arcTolerance) {
138
- ring.push(previousEndX, previousEndY);
72
+ ring.push(previousEndX);
73
+ ring.push(previousEndY);
139
74
  const turn = previousDirX * thisDirY - previousDirY * thisDirX;
140
- const convex = turn * signedDelta > 0;
75
+ const convex = turn * signedDelta > 0.0;
141
76
  if (!convex) {
142
- // Inner (overlap) corner: emit where the two offset edge lines cross — the inner miter point. For a
143
- // mild corner this is the correct clean vertex; for a feature narrower than 2·|delta| it overshoots
144
- // past the offset edges, and the resulting self-crossing spur is dissolved by the positive-fill
145
- // self-union, which drops the negatively-wound overshoot region. Positive fill is what makes this
146
- // robust where non-zero fill (which keeps the overshoot) could not.
147
77
  if (Math.abs(turn) > PARALLEL_EPS) {
148
78
  const advance = ((thisStartX - previousEndX) * thisDirY - (thisStartY - previousEndY) * thisDirX) / turn;
149
- ring.push(previousEndX + advance * previousDirX, previousEndY + advance * previousDirY);
79
+ ring.push(previousEndX + advance * previousDirX);
80
+ ring.push(previousEndY + advance * previousDirY);
150
81
  }
151
82
  }
152
83
  else {
153
- if (join === 'miter') {
154
- // Intersect the two offset edge lines; the apex is where the extended normals meet.
155
- if (Math.abs(turn) > PARALLEL_EPS) {
156
- const advance = ((thisStartX - previousEndX) * thisDirY - (thisStartY - previousEndY) * thisDirX) / turn;
157
- const apexX = previousEndX + advance * previousDirX;
158
- const apexY = previousEndY + advance * previousDirY;
159
- const miterLength = Math.hypot(apexX - vx, apexY - vy);
160
- if (miterLength <= miterLimit * Math.abs(signedDelta))
161
- ring.push(apexX, apexY);
162
- }
163
- }
164
- else if (join === 'square') {
165
- const radius = Math.abs(signedDelta);
166
- ring.push(previousEndX + radius * previousDirX, previousEndY + radius * previousDirY);
167
- ring.push(thisStartX - radius * thisDirX, thisStartY - radius * thisDirY);
84
+ switch (join) {
85
+ case 'miter':
86
+ if (Math.abs(turn) > PARALLEL_EPS) {
87
+ const advance = ((thisStartX - previousEndX) * thisDirY - (thisStartY - previousEndY) * thisDirX) / turn;
88
+ const apexX = previousEndX + advance * previousDirX;
89
+ const apexY = previousEndY + advance * previousDirY;
90
+ const miterLength = Math.sqrt((apexX - vx) * (apexX - vx) + (apexY - vy) * (apexY - vy));
91
+ if (miterLength <= miterLimit * Math.abs(signedDelta)) {
92
+ ring.push(apexX);
93
+ ring.push(apexY);
94
+ }
95
+ }
96
+ break;
97
+ case 'square':
98
+ const squareExtent = Math.abs(signedDelta);
99
+ ring.push(previousEndX + squareExtent * previousDirX);
100
+ ring.push(previousEndY + squareExtent * previousDirY);
101
+ ring.push(thisStartX - squareExtent * thisDirX);
102
+ ring.push(thisStartY - squareExtent * thisDirY);
103
+ break;
104
+ case 'round':
105
+ const radius = Math.abs(signedDelta);
106
+ const startAngle = Math.atan2(previousEndY - vy, previousEndX - vx);
107
+ const endAngle = Math.atan2(thisStartY - vy, thisStartX - vx);
108
+ pushOffsetArc(ring, vx, vy, radius, startAngle, getShortSweep(startAngle, endAngle), arcTolerance);
109
+ break;
110
+ case 'bevel':
111
+ break;
168
112
  }
169
- else if (join === 'round') {
170
- const radius = Math.abs(signedDelta);
171
- const startAngle = Math.atan2(previousEndY - vy, previousEndX - vx);
172
- const endAngle = Math.atan2(thisStartY - vy, thisStartX - vx);
173
- pushOffsetArc(ring, vx, vy, radius, startAngle, getShortSweep(startAngle, endAngle), arcTolerance);
174
- }
175
- // A bevel adds nothing between previousEnd and thisStart — the straight edge is the chamfer.
176
113
  }
177
- ring.push(thisStartX, thisStartY);
114
+ ring.push(thisStartX);
115
+ ring.push(thisStartY);
178
116
  }
179
- // Removes consecutive coincident points from a flattened contour and, for a closed contour, the closing
180
- // vertex that repeats the first, yielding a clean `[x0, y0, ...]` vertex loop with no zero-length edges.
181
- // `pointEpsSq` is the squared coincidence tolerance (magnitude-relative, computed by the caller).
182
117
  function getCleanContourVertices(contour, closed, pointEpsSq) {
183
- const out = [];
184
- for (let i = 0; i < contour.length; i += 2) {
118
+ let out = [];
119
+ let i = 0;
120
+ while (i < contour.length) {
185
121
  const x = contour[i];
186
122
  const y = contour[i + 1];
187
123
  if (out.length >= 2) {
188
124
  const dx = x - out[out.length - 2];
189
125
  const dy = y - out[out.length - 1];
190
- if (dx * dx + dy * dy <= pointEpsSq)
126
+ if (dx * dx + dy * dy <= pointEpsSq) {
127
+ i += 2;
191
128
  continue;
129
+ }
192
130
  }
193
- out.push(x, y);
131
+ out.push(x);
132
+ out.push(y);
133
+ i += 2;
194
134
  }
195
135
  if (closed && out.length >= 4) {
196
136
  const dx = out[0] - out[out.length - 2];
197
137
  const dy = out[1] - out[out.length - 1];
198
- if (dx * dx + dy * dy <= pointEpsSq)
199
- out.length -= 2;
138
+ if (dx * dx + dy * dy <= pointEpsSq) {
139
+ out = [...out.slice(0, out.length - 2)];
140
+ }
200
141
  }
201
142
  return out;
202
143
  }
203
- // The coincident-point tolerance for a contour set, scaled to the largest coordinate span across all
204
- // contours so it tracks the input magnitude; falls back to a fixed absolute for degenerate extent.
205
144
  function getContourPointEps(contours) {
206
- let minX = Infinity;
207
- let minY = Infinity;
208
- let maxX = -Infinity;
209
- let maxY = -Infinity;
145
+ let minX = Number.POSITIVE_INFINITY;
146
+ let minY = Number.POSITIVE_INFINITY;
147
+ let maxX = Number.NEGATIVE_INFINITY;
148
+ let maxY = Number.NEGATIVE_INFINITY;
210
149
  for (const contour of contours) {
211
- for (let i = 0; i < contour.length; i += 2) {
150
+ let i = 0;
151
+ while (i < contour.length) {
212
152
  const x = contour[i];
213
153
  const y = contour[i + 1];
214
- if (x < minX)
154
+ if (x < minX) {
215
155
  minX = x;
216
- if (x > maxX)
156
+ }
157
+ if (x > maxX) {
217
158
  maxX = x;
218
- if (y < minY)
159
+ }
160
+ if (y < minY) {
219
161
  minY = y;
220
- if (y > maxY)
162
+ }
163
+ if (y > maxY) {
221
164
  maxY = y;
165
+ }
166
+ i += 2;
222
167
  }
223
168
  }
224
169
  const extent = Math.max(maxX - minX, maxY - minY);
225
- return extent > 0 ? extent * POINT_EPS_RELATIVE : POINT_EPS;
170
+ return extent > 0.0 ? extent * POINT_EPS_RELATIVE : POINT_EPS;
226
171
  }
227
- // Builds the doubled vertex loop for an open contour: the forward vertices followed by the interior
228
- // vertices in reverse. Offsetting this as a closed loop strokes both sides of the polyline, with the
229
- // two terminal vertices (indices 0 and count - 1) reversing 180° so they take an end cap, not a join.
230
172
  function getOpenContourLoop(vertices) {
231
- const count = vertices.length / 2;
232
- const loop = vertices.slice();
233
- for (let k = count - 2; k >= 1; k--)
234
- loop.push(vertices[2 * k], vertices[2 * k + 1]);
235
- return loop;
173
+ const count = Math.trunc(vertices.length / 2);
174
+ let result = [...vertices];
175
+ let k = count - 2;
176
+ while (k >= 1) {
177
+ result.push(vertices[2 * (k >>> 0)]);
178
+ result.push(vertices[2 * (k >>> 0) + 1]);
179
+ k -= 1;
180
+ }
181
+ return result;
236
182
  }
237
- // Signed orientation of a vertex loop under the standard shoelace convention: +1 counter-clockwise,
238
- // -1 clockwise, +1 for a degenerate zero-area loop.
239
183
  function getRingOrientationSign(vertices) {
240
- const sign = Math.sign(getRingSignedArea(vertices));
241
- return sign === 0 ? 1 : sign;
184
+ const sign = getRingSignedArea(vertices);
185
+ if (sign > 0.0) {
186
+ return 1;
187
+ }
188
+ if (sign < 0.0) {
189
+ return -1;
190
+ }
191
+ return 1;
242
192
  }
243
- // Twice-halved shoelace signed area of an implicitly-closed vertex loop.
244
193
  function getRingSignedArea(vertices) {
245
- let area = 0;
246
- const count = vertices.length / 2;
247
- for (let k = 0; k < count; k++) {
194
+ let area = 0.0;
195
+ const count = Math.trunc(vertices.length / 2);
196
+ for (let k = 0; k < count; k += 1) {
248
197
  const kn = (k + 1) % count;
249
198
  area += vertices[2 * k] * vertices[2 * kn + 1] - vertices[2 * kn] * vertices[2 * k + 1];
250
199
  }
251
200
  return area * 0.5;
252
201
  }
253
- // The signed angular sweep from `startAngle` to `endAngle` taking the short way around, in (-PI, PI].
254
- // Convex offset corners subtend the exterior turn angle, which is always the short arc.
255
202
  function getShortSweep(startAngle, endAngle) {
256
203
  let sweep = endAngle - startAngle;
257
- while (sweep <= -Math.PI)
204
+ while (sweep <= -Math.PI) {
258
205
  sweep += TWO_PI;
259
- while (sweep > Math.PI)
206
+ }
207
+ while (sweep > Math.PI) {
260
208
  sweep -= TWO_PI;
209
+ }
261
210
  return sweep;
262
211
  }
263
- // Whether a flattened contour is closed: it has at least three points and its last point coincides with
264
- // its first (the explicit closing vertex `flattenPath` appends on a CLOSE). An open polyline whose ends
265
- // happen to coincide is treated as closed — an acceptable inference at pixel scale. `pointEpsSq` is the
266
- // squared coincidence tolerance (magnitude-relative, computed by the caller).
267
212
  function isClosedContour(contour, pointEpsSq) {
268
213
  const n = contour.length;
269
- if (n < 6)
214
+ if (n < 6) {
270
215
  return false;
216
+ }
271
217
  const dx = contour[0] - contour[n - 2];
272
218
  const dy = contour[1] - contour[n - 1];
273
219
  return dx * dx + dy * dy <= pointEpsSq;
274
220
  }
275
- // Tessellates a circular arc about (cx, cy) of the given radius from `startAngle` sweeping by the signed
276
- // `sweep`, pushing only the interior points (the caller emits the arc endpoints). Segment count is set
277
- // so no chord deviates from the true circle by more than `arcTolerance`.
221
+ /**
222
+ * Offsets a path outward (positive `delta`, inflate) or inward (negative `delta`,
223
+ * deflate) by a signed distance. The input is flattened to polygon contours;
224
+ * closed contours are offset into grown/shrunk rings and open contours are offset
225
+ * into closed slab outlines with end caps. Corner style is controlled by
226
+ * `options.join`; open-path terminals by `options.end`. The raw offset rings are
227
+ * then self-unioned under positive fill to resolve self-overlap, merge touching
228
+ * rings, and emit a clean, hole-correct outline.
229
+ *
230
+ * Alias-safe: the input path is fully captured (flattened) before any write to `out`.
231
+ */
232
+ export function offsetPath(out, pathBooleanKernel, path, delta, options) {
233
+ const join = options?.join ?? 'miter';
234
+ const end = options?.end ?? 'butt';
235
+ const miterLimit = options?.miterLimit ?? DEFAULT_MITER_LIMIT;
236
+ const arcTolerance = options?.arcTolerance ?? DEFAULT_ARC_TOLERANCE;
237
+ const tolerance = options?.tolerance ?? DEFAULT_FLATTEN_TOLERANCE;
238
+ const contours = flattenPath(path, tolerance);
239
+ const pointEpsSq = Math.pow(getContourPointEps(contours), 2);
240
+ let rawRings = [];
241
+ for (const contour of contours) {
242
+ const closed = isClosedContour(contour, pointEpsSq);
243
+ const vertices = getCleanContourVertices(contour, closed, pointEpsSq);
244
+ if (closed) {
245
+ if (vertices.length < 6) {
246
+ continue;
247
+ }
248
+ const orientation = getRingOrientationSign(vertices);
249
+ const noCaps = [];
250
+ const ring = buildOffsetRing(vertices, delta * orientation, noCaps, join, end, miterLimit, arcTolerance);
251
+ if (ring.length < 6) {
252
+ continue;
253
+ }
254
+ const offsetArea = getRingSignedArea(ring);
255
+ const inverted = (Math.sign(offsetArea) | 0) !== orientation;
256
+ const notReduced = delta < 0.0 && Math.abs(offsetArea) >= Math.abs(getRingSignedArea(vertices));
257
+ if (inverted || notReduced) {
258
+ continue;
259
+ }
260
+ if (offsetArea < 0.0) {
261
+ rawRings.push(reverseVertexLoop(ring));
262
+ }
263
+ else {
264
+ rawRings.push(ring);
265
+ }
266
+ }
267
+ else {
268
+ if (vertices.length < 4) {
269
+ continue;
270
+ }
271
+ const count = Math.trunc(vertices.length / 2);
272
+ const caps = [0, count - 1];
273
+ const loopVerts = getOpenContourLoop(vertices);
274
+ const ring = buildOffsetRing(loopVerts, Math.abs(delta), caps, join, end, miterLimit, arcTolerance);
275
+ if (ring.length >= 6) {
276
+ if (getRingSignedArea(ring) < 0.0) {
277
+ rawRings.push(reverseVertexLoop(ring));
278
+ }
279
+ else {
280
+ rawRings.push(ring);
281
+ }
282
+ }
283
+ }
284
+ }
285
+ resolvePathRegions(out, pathBooleanKernel, rawRings, 'positive');
286
+ }
278
287
  function pushOffsetArc(ring, cx, cy, radius, startAngle, sweep, arcTolerance) {
279
- const maxAngle = arcTolerance > 0 && arcTolerance < radius ? 2 * Math.acos(1 - arcTolerance / radius) : Math.PI;
280
- const steps = Math.max(1, Math.ceil(Math.abs(sweep) / maxAngle));
281
- for (let i = 1; i < steps; i++) {
288
+ const maxAngle = arcTolerance > 0.0 && arcTolerance < radius ? 2.0 * Math.acos(1.0 - arcTolerance / radius) : Math.PI;
289
+ const steps = Math.max(1, Math.ceil(Math.abs(sweep) / maxAngle) >>> 0);
290
+ for (let i = 1; i < steps; i += 1) {
282
291
  const angle = startAngle + sweep * (i / steps);
283
- ring.push(cx + radius * Math.cos(angle), cy + radius * Math.sin(angle));
292
+ ring.push(cx + radius * Math.cos(angle));
293
+ ring.push(cy + radius * Math.sin(angle));
284
294
  }
285
295
  }
286
- // Reverses a flat `[x0, y0, ...]` vertex loop in place-free fashion, flipping its winding while keeping
287
- // vertex 0 first, so a clockwise loop becomes counter-clockwise and vice versa.
288
296
  function reverseVertexLoop(vertices) {
289
- const count = vertices.length / 2;
290
- const out = new Array(vertices.length);
297
+ const count = Math.trunc(vertices.length / 2);
298
+ let out = new Array(vertices.length).fill(0.0);
291
299
  out[0] = vertices[0];
292
300
  out[1] = vertices[1];
293
- for (let k = 1; k < count; k++) {
301
+ for (let k = 1; k < count; k += 1) {
294
302
  const source = count - k;
295
303
  out[2 * k] = vertices[2 * source];
296
304
  out[2 * k + 1] = vertices[2 * source + 1];
297
305
  }
298
306
  return out;
299
307
  }
300
- // Default maximum deviation between a round join/end arc and its true circle, in path units — a quarter
301
- // pixel, matching the flattener's default and sane for pixel-scale output.
302
- const DEFAULT_ARC_TOLERANCE = 0.25;
303
- // Default miter length ceiling as a multiple of |delta|, the Clipper2 default: corners sharper than
304
- // ~60° fall back to a bevel.
305
- const DEFAULT_MITER_LIMIT = 2;
306
- const HALF_PI = Math.PI / 2;
307
- const NO_CAPS = new Set();
308
- // Fallback absolute coincidence epsilon for degenerate zero-extent input, where the relative form has
309
- // nothing to scale against. Well below any realistic flatten tolerance.
310
- const POINT_EPS = 1e-9;
311
- // Relative coincidence factor: the point-merge tolerance is this fraction of the input's coordinate
312
- // extent, so corners collapse consistently whether the contour is in pixels or micrometres.
313
- const POINT_EPS_RELATIVE = 1e-9;
314
- // Below this cross-product magnitude the two offset edges are effectively parallel and a miter apex is
315
- // unstable, so the join degrades to a bevel.
316
- const PARALLEL_EPS = 1e-12;
317
- const TWO_PI = Math.PI * 2;
318
308
  //# sourceMappingURL=offsetPath.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"offsetPath.js","sourceRoot":"","sources":["../src/offsetPath.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"offsetPath.js","sourceRoot":"","sources":["../src/offsetPath.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import type { PathWinding } from '@flighthq/path/contract';
2
+ /**
3
+ * The kind of boolean operation that was attempted.
4
+ */
5
+ export type PathBooleanExplanationOperation = 'offset' | 'simplify';
6
+ /**
7
+ * The reason the operation produced a degenerate or empty result.
8
+ */
9
+ export type PathBooleanExplanationReason = 'collapsed-or-degenerate' | 'empty-input' | 'non-finite-delta';
10
+ /**
11
+ * Join style for the convex side of offset path corners.
12
+ */
13
+ export type PathOffsetJoin = 'bevel' | 'miter' | 'round' | 'square';
14
+ /**
15
+ * End cap style for open path terminals.
16
+ */
17
+ export type PathOffsetEnd = 'butt' | 'round' | 'square';
18
+ /**
19
+ * Options controlling the boolean path operations (TS `PathBooleanOptions`). `fillRule` is a
20
+ * `PathWinding`, exactly TS (`fillRule?: PathWinding`): only even-odd and non-zero are public
21
+ * options. The positive/negative rules of `PathBooleanFillRule` stay kernel/offset conventions.
22
+ */
23
+ export interface PathBooleanOptions {
24
+ fillRule?: PathWinding;
25
+ tolerance?: number;
26
+ }
27
+ /**
28
+ * Explains why a boolean path operation (offset or simplify) produced a
29
+ * degenerate or empty result. `undefined` means the operation succeeded normally.
30
+ */
31
+ export interface PathBooleanExplanation {
32
+ readonly operation: PathBooleanExplanationOperation;
33
+ readonly reason: PathBooleanExplanationReason;
34
+ }
35
+ /**
36
+ * Options controlling the offset path operation.
37
+ */
38
+ export interface PathOffsetOptions {
39
+ join?: PathOffsetJoin;
40
+ end?: PathOffsetEnd;
41
+ miterLimit?: number;
42
+ tolerance?: number;
43
+ arcTolerance?: number;
44
+ }
45
+ export declare function getPathBooleanExplanationOperationString(value: PathBooleanExplanationOperation): string;
46
+ export declare function getPathBooleanExplanationReasonString(value: PathBooleanExplanationReason): string;
47
+ export declare function getPathOffsetEndString(value: PathOffsetEnd): string;
48
+ export declare function getPathOffsetJoinString(value: PathOffsetJoin): string;
49
+ export declare function parsePathBooleanExplanationOperation(value: string): PathBooleanExplanationOperation | undefined;
50
+ export declare function parsePathBooleanExplanationReason(value: string): PathBooleanExplanationReason | undefined;
51
+ export declare function parsePathOffsetEnd(value: string): PathOffsetEnd | undefined;
52
+ export declare function parsePathOffsetJoin(value: string): PathOffsetJoin | undefined;
53
+ //# sourceMappingURL=pathBoolean.d.ts.map