@flighthq/shape 0.3.0-next.906.07cea63 → 0.3.1-next.209.43ef1bc

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 (77) hide show
  1. package/dist/compactStrokePath.d.ts +3 -0
  2. package/dist/compactStrokePath.d.ts.map +1 -0
  3. package/dist/compactStrokePath.js +462 -0
  4. package/dist/compactStrokePath.js.map +1 -0
  5. package/dist/contract.d.ts +7 -2
  6. package/dist/contract.d.ts.map +1 -1
  7. package/dist/contract.js +7 -2
  8. package/dist/contract.js.map +1 -1
  9. package/dist/explainMorphShapeGradientEndpoints.d.ts +5 -0
  10. package/dist/explainMorphShapeGradientEndpoints.d.ts.map +1 -0
  11. package/dist/explainMorphShapeGradientEndpoints.js +43 -0
  12. package/dist/explainMorphShapeGradientEndpoints.js.map +1 -0
  13. package/dist/explainShapeTessellation.d.ts +3 -0
  14. package/dist/explainShapeTessellation.d.ts.map +1 -0
  15. package/dist/explainShapeTessellation.js +20 -0
  16. package/dist/explainShapeTessellation.js.map +1 -0
  17. package/dist/index.d.ts +3 -1
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +3 -1
  20. package/dist/index.js.map +1 -1
  21. package/dist/morphShape.d.ts +8 -0
  22. package/dist/morphShape.d.ts.map +1 -0
  23. package/dist/morphShape.js +74 -0
  24. package/dist/morphShape.js.map +1 -0
  25. package/dist/morphShapeAnimation.d.ts +5 -0
  26. package/dist/morphShapeAnimation.d.ts.map +1 -0
  27. package/dist/morphShapeAnimation.js +27 -0
  28. package/dist/morphShapeAnimation.js.map +1 -0
  29. package/dist/morphShapePaint.d.ts +9 -0
  30. package/dist/morphShapePaint.d.ts.map +1 -0
  31. package/dist/morphShapePaint.js +183 -0
  32. package/dist/morphShapePaint.js.map +1 -0
  33. package/dist/scale9ShapeCommands.d.ts +3 -0
  34. package/dist/scale9ShapeCommands.d.ts.map +1 -0
  35. package/dist/scale9ShapeCommands.js +119 -0
  36. package/dist/scale9ShapeCommands.js.map +1 -0
  37. package/dist/shape.d.ts.map +1 -1
  38. package/dist/shape.js +16 -3
  39. package/dist/shape.js.map +1 -1
  40. package/dist/shapeCommands.d.ts +3 -3
  41. package/dist/shapeCommands.d.ts.map +1 -1
  42. package/dist/shapeCommands.js +8 -8
  43. package/dist/shapeCommands.js.map +1 -1
  44. package/dist/shapeFill.d.ts.map +1 -1
  45. package/dist/shapeFill.js +8 -14
  46. package/dist/shapeFill.js.map +1 -1
  47. package/dist/shapeStroke.d.ts +2 -2
  48. package/dist/shapeStroke.d.ts.map +1 -1
  49. package/dist/shapeStroke.js +13 -77
  50. package/dist/shapeStroke.js.map +1 -1
  51. package/dist/shapeStrokeOutline.d.ts +3 -0
  52. package/dist/shapeStrokeOutline.d.ts.map +1 -0
  53. package/dist/shapeStrokeOutline.js +164 -0
  54. package/dist/shapeStrokeOutline.js.map +1 -0
  55. package/package.json +10 -7
  56. package/src/compactStrokePath.test.ts +31 -0
  57. package/src/explainMorphShapeGradientEndpoints.test.ts +47 -0
  58. package/src/explainShapeTessellation.test.ts +65 -0
  59. package/src/morphShape.test.ts +207 -0
  60. package/src/morphShapeAnimation.test.ts +147 -0
  61. package/src/morphShapePaint.test.ts +236 -0
  62. package/src/scale9ShapeCommands.test.ts +64 -0
  63. package/src/shape.test.ts +35 -0
  64. package/src/shapeCommands.test.ts +31 -31
  65. package/src/shapeFill.test.ts +9 -3
  66. package/src/shapeStroke.test.ts +35 -24
  67. package/src/shapeStrokeOutline.test.ts +31 -0
  68. package/dist/shapeHitTestBuiltins.d.ts +0 -2
  69. package/dist/shapeHitTestBuiltins.d.ts.map +0 -1
  70. package/dist/shapeHitTestBuiltins.js +0 -85
  71. package/dist/shapeHitTestBuiltins.js.map +0 -1
  72. package/dist/shapeHitTestRegistry.d.ts +0 -4
  73. package/dist/shapeHitTestRegistry.d.ts.map +0 -1
  74. package/dist/shapeHitTestRegistry.js +0 -13
  75. package/dist/shapeHitTestRegistry.js.map +0 -1
  76. package/src/shapeHitTestBuiltins.test.ts +0 -77
  77. package/src/shapeHitTestRegistry.test.ts +0 -45
@@ -0,0 +1,3 @@
1
+ import type { Path, StrokeStyle } from '@flighthq/types/contract';
2
+ export declare function compactStrokePath(path: Readonly<Path>, style: Readonly<StrokeStyle>, tolerance?: number): Path;
3
+ //# sourceMappingURL=compactStrokePath.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compactStrokePath.d.ts","sourceRoot":"","sources":["../src/compactStrokePath.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAalE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,SAAO,GAAG,IAAI,CAsB5G"}
@@ -0,0 +1,462 @@
1
+ import { appendPathClose } from '@flighthq/path/contract';
2
+ import { PathCommand } from '@flighthq/types/contract';
3
+ // Converts the centerline `path` into a fillable outline `Path` by offsetting both sides by
4
+ // half the stroke width, joining corners per `style.join`, and capping open endpoints per
5
+ // `style.cap`. The result is a collection of closed contours suitable for `tessellatePath`.
6
+ //
7
+ // Curves are pre-flattened to `tolerance` path units before offsetting; the offset contours are
8
+ // themselves composed of straight segments (the flattenPath route means no new curve math is
9
+ // needed at the outline layer). Pass a tight tolerance for smooth rounded joins/caps.
10
+ //
11
+ // This is the direct route to stroke fill; the renderer's stencil-then-cover route for hairline
12
+ // precision is outside this function's scope.
13
+ export function compactStrokePath(path, style, tolerance = 0.25) {
14
+ const width = style.width ?? 1;
15
+ const join = style.join ?? 'miter';
16
+ const cap = style.cap ?? 'butt';
17
+ const miterLimit = style.miterLimit ?? 4;
18
+ const halfWidth = width / 2;
19
+ const result = { commands: [], data: [], winding: 'nonZero' };
20
+ // Decode path into flat subpath polylines, respecting the closed flag.
21
+ const subpaths = decodeSubpaths(path, tolerance);
22
+ const dash = style.dash && style.dash.length > 0 ? style.dash : null;
23
+ const dashOffset = style.dashOffset ?? 0;
24
+ for (const subpath of subpaths) {
25
+ if (subpath.points.length < 2)
26
+ continue;
27
+ const segments = dash
28
+ ? applyDash(subpath.points, subpath.closed, dash, dashOffset)
29
+ : [{ points: subpath.points, closed: subpath.closed }];
30
+ for (const seg of segments) {
31
+ if (seg.points.length < 2)
32
+ continue;
33
+ strokeSubpath(seg.points, seg.closed, halfWidth, join, cap, miterLimit, result, tolerance);
34
+ }
35
+ }
36
+ return result;
37
+ }
38
+ // Adds arc sample points from `startAngle` to `endAngle` around center (cx,cy) at radius `r`
39
+ // into `out`. `ccw=true` goes counter-clockwise (decreasing angle in standard math convention).
40
+ function addArcPoints(cx, cy, r, startAngle, endAngle, ccw, tolerance, out) {
41
+ // Number of steps from tolerance: the chord error for n steps is r*(1-cos(π/n)) ≤ tolerance.
42
+ // n ≥ π / acos(1 - tolerance/r). Clamp to a sensible minimum (4).
43
+ const ratio = Math.max(0, Math.min(1, tolerance / r));
44
+ const n = Math.max(4, Math.ceil(Math.PI / Math.acos(1 - ratio)));
45
+ let delta = endAngle - startAngle;
46
+ if (ccw) {
47
+ if (delta > 0)
48
+ delta -= Math.PI * 2;
49
+ }
50
+ else {
51
+ if (delta < 0)
52
+ delta += Math.PI * 2;
53
+ }
54
+ const steps = Math.ceil(Math.abs(delta) / ((Math.PI * 2) / n));
55
+ if (steps <= 1)
56
+ return;
57
+ const stepAngle = delta / steps;
58
+ for (let i = 1; i < steps; i++) {
59
+ const angle = startAngle + i * stepAngle;
60
+ out.push(cx + Math.cos(angle) * r, cy + Math.sin(angle) * r);
61
+ }
62
+ }
63
+ // Adds a start or end cap for an open subpath.
64
+ // `nx, ny` = left normal of the adjacent segment (perpendicular, pointing left of travel).
65
+ // `edx, edy` = extension direction: the direction to extend the cap outward from the endpoint.
66
+ // For start cap: extend backward (-segment direction).
67
+ // For end cap: extend forward (+segment direction).
68
+ function addCap(px, py, nx, ny, edx, edy, halfWidth, cap, left, right, tolerance, isStart) {
69
+ // Left side offset (in direction of left normal), right side offset (opposite).
70
+ const lx = px + nx * halfWidth;
71
+ const ly = py + ny * halfWidth;
72
+ const rx = px - nx * halfWidth;
73
+ const ry = py - ny * halfWidth;
74
+ if (cap === 'butt') {
75
+ left.push(lx, ly);
76
+ right.push(rx, ry);
77
+ }
78
+ else if (cap === 'square') {
79
+ // Extend by halfWidth in the cap extension direction.
80
+ left.push(lx + edx * halfWidth, ly + edy * halfWidth);
81
+ right.push(rx + edx * halfWidth, ry + edy * halfWidth);
82
+ }
83
+ else {
84
+ // Round cap: semicircle spanning the full width, centered at the endpoint.
85
+ if (isStart) {
86
+ left.push(lx, ly);
87
+ right.push(rx, ry);
88
+ // Arc from right side angle to left side angle in the extension direction.
89
+ const startAngle = Math.atan2(-ny, -nx);
90
+ const endAngle = Math.atan2(ny, nx);
91
+ addArcPoints(px, py, halfWidth, startAngle, endAngle, false, tolerance, right);
92
+ }
93
+ else {
94
+ left.push(lx, ly);
95
+ addArcPoints(px, py, halfWidth, Math.atan2(ny, nx), Math.atan2(-ny, -nx), true, tolerance, left);
96
+ right.push(rx, ry);
97
+ }
98
+ }
99
+ }
100
+ // Adds a join (corner) between two adjacent segments to the left and right offset arrays.
101
+ function addJoin(px, py, nx0, ny0, nx1, ny1, halfWidth, join, miterLimit, left, right, tolerance) {
102
+ // Left side: offset by +normal, Right side: offset by -normal.
103
+ const lx0 = px + nx0 * halfWidth;
104
+ const ly0 = py + ny0 * halfWidth;
105
+ const rx0 = px - nx0 * halfWidth;
106
+ const ry0 = py - ny0 * halfWidth;
107
+ const lx1 = px + nx1 * halfWidth;
108
+ const ly1 = py + ny1 * halfWidth;
109
+ const rx1 = px - nx1 * halfWidth;
110
+ const ry1 = py - ny1 * halfWidth;
111
+ if (join === 'miter') {
112
+ // Miter join: intersect the offset lines. Fall back to bevel if miter length exceeds limit.
113
+ const cross = nx0 * ny1 - ny0 * nx1;
114
+ if (Math.abs(cross) < 1e-8) {
115
+ // Parallel segments: simple bevel (just two points each side).
116
+ left.push(lx0, ly0);
117
+ right.push(rx0, ry0);
118
+ }
119
+ else {
120
+ // Miter point = intersection of the two left-side offset lines. Each passes through its
121
+ // offset endpoint along the segment tangent — perpendicular to that segment's normal, so
122
+ // tangent0 = (ny0, -nx0). Advancing along the NORMAL (nx0, ny0) instead collapsed a symmetric
123
+ // corner's miter onto the centerline vertex, yielding a self-intersecting (untessellatable)
124
+ // outline. Solve P0 + s·T0 = P1 + u·T1 for the left miter, then mirror through the vertex.
125
+ const dx = lx1 - lx0;
126
+ const dy = ly1 - ly0;
127
+ const t = -(dx * nx1 + dy * ny1) / cross;
128
+ const mx = lx0 + t * ny0;
129
+ const my = ly0 - t * nx0;
130
+ const miterLen = Math.sqrt((mx - px) * (mx - px) + (my - py) * (my - py));
131
+ if (miterLen <= halfWidth * miterLimit) {
132
+ left.push(mx, my);
133
+ // Miter on the other side (mirror through center).
134
+ const rmx = px * 2 - mx;
135
+ const rmy = py * 2 - my;
136
+ right.push(rmx, rmy);
137
+ }
138
+ else {
139
+ // Degrade to bevel.
140
+ left.push(lx0, ly0, lx1, ly1);
141
+ right.push(rx0, ry0, rx1, ry1);
142
+ }
143
+ }
144
+ }
145
+ else if (join === 'round') {
146
+ // Round join: arc from (lx0,ly0) to (lx1,ly1) around the outer side.
147
+ left.push(lx0, ly0);
148
+ addArcPoints(px, py, halfWidth, Math.atan2(ny0, nx0), Math.atan2(ny1, nx1), true, tolerance, left);
149
+ left.push(lx1, ly1);
150
+ right.push(rx0, ry0);
151
+ addArcPoints(px, py, halfWidth, Math.atan2(-ny0, -nx0), Math.atan2(-ny1, -nx1), false, tolerance, right);
152
+ right.push(rx1, ry1);
153
+ }
154
+ else {
155
+ // Bevel: two points per side.
156
+ left.push(lx0, ly0, lx1, ly1);
157
+ right.push(rx0, ry0, rx1, ry1);
158
+ }
159
+ }
160
+ // Splits a subpath into dash segments based on the dash pattern.
161
+ function applyDash(pts, closed, dash, dashOffset) {
162
+ const result = [];
163
+ if (dash.length === 0) {
164
+ result.push({ points: pts, closed });
165
+ return result;
166
+ }
167
+ const totalDashLength = dash.reduce((s, d) => s + d, 0);
168
+ if (totalDashLength <= 0) {
169
+ result.push({ points: pts, closed });
170
+ return result;
171
+ }
172
+ // Normalize offset into the pattern.
173
+ const offset = ((dashOffset % totalDashLength) + totalDashLength) % totalDashLength;
174
+ // Find starting dash index and remaining length in that dash.
175
+ let dashIndex = 0;
176
+ let remaining = 0;
177
+ let isOn = true;
178
+ {
179
+ let acc = 0;
180
+ for (let i = 0; i < dash.length; i++) {
181
+ if (acc + dash[i] > offset) {
182
+ dashIndex = i;
183
+ remaining = dash[i] - (offset - acc);
184
+ isOn = i % 2 === 0;
185
+ break;
186
+ }
187
+ acc += dash[i];
188
+ }
189
+ }
190
+ let current = null;
191
+ const n = pts.length >> 1;
192
+ for (let i = 0; i < n - 1; i++) {
193
+ const x0 = pts[i * 2];
194
+ const y0 = pts[i * 2 + 1];
195
+ const x1 = pts[(i + 1) * 2];
196
+ const y1 = pts[(i + 1) * 2 + 1];
197
+ const dx = x1 - x0;
198
+ const dy = y1 - y0;
199
+ const segLen = Math.sqrt(dx * dx + dy * dy);
200
+ if (isOn && current === null) {
201
+ current = [x0, y0];
202
+ }
203
+ let consumed = 0;
204
+ while (consumed < segLen) {
205
+ const step = Math.min(remaining, segLen - consumed);
206
+ const t = (consumed + step) / segLen;
207
+ const ix = x0 + t * dx;
208
+ const iy = y0 + t * dy;
209
+ if (isOn) {
210
+ if (current === null)
211
+ current = [x0 + (consumed / segLen) * dx, y0 + (consumed / segLen) * dy];
212
+ current.push(ix, iy);
213
+ }
214
+ else {
215
+ if (current !== null) {
216
+ if (current.length >= 4)
217
+ result.push({ points: current, closed: false });
218
+ current = null;
219
+ }
220
+ if (step >= remaining) {
221
+ current = [ix, iy];
222
+ }
223
+ }
224
+ consumed += step;
225
+ remaining -= step;
226
+ if (remaining <= 1e-10) {
227
+ dashIndex = (dashIndex + 1) % dash.length;
228
+ remaining = dash[dashIndex];
229
+ isOn = dashIndex % 2 === 0;
230
+ if (isOn && current === null) {
231
+ current = [ix, iy];
232
+ }
233
+ else if (!isOn && current !== null) {
234
+ if (current.length >= 4)
235
+ result.push({ points: current, closed: false });
236
+ current = null;
237
+ }
238
+ }
239
+ }
240
+ }
241
+ if (current !== null && current.length >= 4) {
242
+ result.push({ points: current, closed: false });
243
+ }
244
+ return result;
245
+ }
246
+ function decodeSubpaths(path, tolerance) {
247
+ // Use the flattenPath internal logic (re-implemented here to track closed-ness per subpath
248
+ // and to avoid returning separate contours without their closed flag).
249
+ const commands = path.commands;
250
+ const data = path.data;
251
+ const toleranceSq = tolerance * tolerance;
252
+ const subpaths = [];
253
+ let current = null;
254
+ let x = 0;
255
+ let y = 0;
256
+ let contourStartX = 0;
257
+ let contourStartY = 0;
258
+ let di = 0;
259
+ const ensureCurrent = () => {
260
+ if (current === null) {
261
+ current = { points: [0, 0], closed: false };
262
+ subpaths.push(current);
263
+ x = 0;
264
+ y = 0;
265
+ }
266
+ return current;
267
+ };
268
+ for (let ci = 0; ci < commands.length; ci++) {
269
+ const command = commands[ci];
270
+ if (command === PathCommand.MOVE_TO) {
271
+ x = data[di];
272
+ y = data[di + 1];
273
+ di += 2;
274
+ contourStartX = x;
275
+ contourStartY = y;
276
+ current = { points: [x, y], closed: false };
277
+ subpaths.push(current);
278
+ }
279
+ else if (command === PathCommand.WIDE_MOVE_TO) {
280
+ x = data[di + 2];
281
+ y = data[di + 3];
282
+ di += 4;
283
+ contourStartX = x;
284
+ contourStartY = y;
285
+ current = { points: [x, y], closed: false };
286
+ subpaths.push(current);
287
+ }
288
+ else if (command === PathCommand.LINE_TO) {
289
+ const sp = ensureCurrent();
290
+ x = data[di];
291
+ y = data[di + 1];
292
+ di += 2;
293
+ sp.points.push(x, y);
294
+ }
295
+ else if (command === PathCommand.WIDE_LINE_TO) {
296
+ const sp = ensureCurrent();
297
+ x = data[di + 2];
298
+ y = data[di + 3];
299
+ di += 4;
300
+ sp.points.push(x, y);
301
+ }
302
+ else if (command === PathCommand.CURVE_TO) {
303
+ const sp = ensureCurrent();
304
+ flattenQuadratic(sp.points, x, y, data[di], data[di + 1], data[di + 2], data[di + 3], toleranceSq, 0);
305
+ x = data[di + 2];
306
+ y = data[di + 3];
307
+ di += 4;
308
+ }
309
+ else if (command === PathCommand.CUBIC_CURVE_TO) {
310
+ const sp = ensureCurrent();
311
+ flattenCubic(sp.points, x, y, data[di], data[di + 1], data[di + 2], data[di + 3], data[di + 4], data[di + 5], toleranceSq, 0);
312
+ x = data[di + 4];
313
+ y = data[di + 5];
314
+ di += 6;
315
+ }
316
+ else if (command === PathCommand.CLOSE) {
317
+ if (current !== null) {
318
+ current.closed = true;
319
+ x = contourStartX;
320
+ y = contourStartY;
321
+ current = null;
322
+ }
323
+ }
324
+ }
325
+ return subpaths;
326
+ }
327
+ function distChordSq(px, py, x0, y0, x1, y1) {
328
+ const dx = x1 - x0;
329
+ const dy = y1 - y0;
330
+ const lenSq = dx * dx + dy * dy;
331
+ if (lenSq === 0) {
332
+ const ax = px - x0;
333
+ const ay = py - y0;
334
+ return ax * ax + ay * ay;
335
+ }
336
+ const cross = dx * (y0 - py) - dy * (x0 - px);
337
+ return (cross * cross) / lenSq;
338
+ }
339
+ function flattenCubic(out, x0, y0, c1x, c1y, c2x, c2y, x1, y1, toleranceSq, depth) {
340
+ const dxc1 = distChordSq(c1x, c1y, x0, y0, x1, y1);
341
+ const dxc2 = distChordSq(c2x, c2y, x0, y0, x1, y1);
342
+ if (depth >= MAX_SUBDIVISION_DEPTH || (dxc1 <= toleranceSq && dxc2 <= toleranceSq)) {
343
+ out.push(x1, y1);
344
+ return;
345
+ }
346
+ const x01 = (x0 + c1x) / 2;
347
+ const y01 = (y0 + c1y) / 2;
348
+ const x12 = (c1x + c2x) / 2;
349
+ const y12 = (c1y + c2y) / 2;
350
+ const x23 = (c2x + x1) / 2;
351
+ const y23 = (c2y + y1) / 2;
352
+ const x012 = (x01 + x12) / 2;
353
+ const y012 = (y01 + y12) / 2;
354
+ const x123 = (x12 + x23) / 2;
355
+ const y123 = (y12 + y23) / 2;
356
+ const xm = (x012 + x123) / 2;
357
+ const ym = (y012 + y123) / 2;
358
+ flattenCubic(out, x0, y0, x01, y01, x012, y012, xm, ym, toleranceSq, depth + 1);
359
+ flattenCubic(out, xm, ym, x123, y123, x23, y23, x1, y1, toleranceSq, depth + 1);
360
+ }
361
+ function flattenQuadratic(out, x0, y0, cx, cy, x1, y1, toleranceSq, depth) {
362
+ const dx = x1 - x0;
363
+ const dy = y1 - y0;
364
+ const lengthSq = dx * dx + dy * dy;
365
+ let distSq;
366
+ if (lengthSq === 0) {
367
+ const ax = cx - x0;
368
+ const ay = cy - y0;
369
+ distSq = ax * ax + ay * ay;
370
+ }
371
+ else {
372
+ const cross = dx * (y0 - cy) - dy * (x0 - cx);
373
+ distSq = (cross * cross) / lengthSq;
374
+ }
375
+ if (depth >= MAX_SUBDIVISION_DEPTH || distSq <= toleranceSq) {
376
+ out.push(x1, y1);
377
+ return;
378
+ }
379
+ const x01 = (x0 + cx) / 2;
380
+ const y01 = (y0 + cy) / 2;
381
+ const x12 = (cx + x1) / 2;
382
+ const y12 = (cy + y1) / 2;
383
+ const xm = (x01 + x12) / 2;
384
+ const ym = (y01 + y12) / 2;
385
+ flattenQuadratic(out, x0, y0, x01, y01, xm, ym, toleranceSq, depth + 1);
386
+ flattenQuadratic(out, xm, ym, x12, y12, x1, y1, toleranceSq, depth + 1);
387
+ }
388
+ // Generates the stroke outline for one subpath polyline.
389
+ function strokeSubpath(pts, closed, halfWidth, join, cap, miterLimit, out, tolerance) {
390
+ const n = pts.length >> 1;
391
+ if (n < 2)
392
+ return;
393
+ // Build left and right offset contours.
394
+ const left = [];
395
+ const right = [];
396
+ // Normals for each segment.
397
+ const normals = new Array((n - 1) * 2);
398
+ for (let i = 0; i < n - 1; i++) {
399
+ const dx = pts[(i + 1) * 2] - pts[i * 2];
400
+ const dy = pts[(i + 1) * 2 + 1] - pts[i * 2 + 1];
401
+ const len = Math.sqrt(dx * dx + dy * dy);
402
+ if (len > 0) {
403
+ normals[i * 2] = -dy / len;
404
+ normals[i * 2 + 1] = dx / len;
405
+ }
406
+ else {
407
+ normals[i * 2] = i > 0 ? normals[(i - 1) * 2] : 0;
408
+ normals[i * 2 + 1] = i > 0 ? normals[(i - 1) * 2 + 1] : 1;
409
+ }
410
+ }
411
+ if (closed) {
412
+ // For closed paths: add join at every vertex.
413
+ for (let i = 0; i < n - 1; i++) {
414
+ const prev = (i + n - 2) % (n - 1);
415
+ const curr = i;
416
+ const nx0 = normals[prev * 2];
417
+ const ny0 = normals[prev * 2 + 1];
418
+ const nx1 = normals[curr * 2];
419
+ const ny1 = normals[curr * 2 + 1];
420
+ addJoin(pts[i * 2], pts[i * 2 + 1], nx0, ny0, nx1, ny1, halfWidth, join, miterLimit, left, right, tolerance);
421
+ }
422
+ }
423
+ else {
424
+ // Start cap. The segment direction for the first segment points "forward"; for the start cap we
425
+ // need the perpendicular (left normal at the first point) and the segment direction itself so
426
+ // square/round caps can extend outward.
427
+ const sn0x = normals[0];
428
+ const sn0y = normals[1];
429
+ // Segment direction (forward): perpendicular to left normal = (sn0y, -sn0x).
430
+ // But for start cap we extend BACKWARD: (-sn0y, sn0x).
431
+ addCap(pts[0], pts[1], sn0x, sn0y, -sn0y, sn0x, halfWidth, cap, left, right, tolerance, true);
432
+ // Inner joins.
433
+ for (let i = 1; i < n - 1; i++) {
434
+ const nx0 = normals[(i - 1) * 2];
435
+ const ny0 = normals[(i - 1) * 2 + 1];
436
+ const nx1 = normals[i * 2];
437
+ const ny1 = normals[i * 2 + 1];
438
+ addJoin(pts[i * 2], pts[i * 2 + 1], nx0, ny0, nx1, ny1, halfWidth, join, miterLimit, left, right, tolerance);
439
+ }
440
+ // End cap. Extend FORWARD: (sn_last_y, -sn_last_x).
441
+ const snLx = normals[(n - 2) * 2];
442
+ const snLy = normals[(n - 2) * 2 + 1];
443
+ addCap(pts[(n - 1) * 2], pts[(n - 1) * 2 + 1], snLx, snLy, snLy, -snLx, halfWidth, cap, left, right, tolerance, false);
444
+ }
445
+ // Emit the outline as a single closed path: left side forward, right side backward.
446
+ if (left.length < 4)
447
+ return;
448
+ out.commands.push(PathCommand.MOVE_TO);
449
+ out.data.push(left[0], left[1]);
450
+ for (let i = 2; i < left.length; i += 2) {
451
+ out.commands.push(PathCommand.LINE_TO);
452
+ out.data.push(left[i], left[i + 1]);
453
+ }
454
+ // Traverse right side in reverse.
455
+ for (let i = right.length - 2; i >= 0; i -= 2) {
456
+ out.commands.push(PathCommand.LINE_TO);
457
+ out.data.push(right[i], right[i + 1]);
458
+ }
459
+ appendPathClose(out);
460
+ }
461
+ const MAX_SUBDIVISION_DEPTH = 16;
462
+ //# sourceMappingURL=compactStrokePath.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compactStrokePath.js","sourceRoot":"","sources":["../src/compactStrokePath.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE1D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,4FAA4F;AAC5F,0FAA0F;AAC1F,4FAA4F;AAC5F,EAAE;AACF,gGAAgG;AAChG,6FAA6F;AAC7F,sFAAsF;AACtF,EAAE;AACF,gGAAgG;AAChG,8CAA8C;AAC9C,MAAM,UAAU,iBAAiB,CAAC,IAAoB,EAAE,KAA4B,EAAE,SAAS,GAAG,IAAI;IACpG,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC;IAC/B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,OAAO,CAAC;IACnC,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,IAAI,MAAM,CAAC;IAChC,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,IAAI,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,KAAK,GAAG,CAAC,CAAC;IAC5B,MAAM,MAAM,GAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;IACpE,uEAAuE;IACvE,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACjD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IACrE,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,IAAI,CAAC,CAAC;IACzC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;YAAE,SAAS;QACxC,MAAM,QAAQ,GAAG,IAAI;YACnB,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,UAAU,CAAC;YAC7D,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACzD,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;gBAAE,SAAS;YACpC,aAAa,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;QAC7F,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,6FAA6F;AAC7F,gGAAgG;AAChG,SAAS,YAAY,CACnB,EAAU,EACV,EAAU,EACV,CAAS,EACT,UAAkB,EAClB,QAAgB,EAChB,GAAY,EACZ,SAAiB,EACjB,GAAa;IAEb,6FAA6F;IAC7F,kEAAkE;IAClE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;IACtD,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACjE,IAAI,KAAK,GAAG,QAAQ,GAAG,UAAU,CAAC;IAClC,IAAI,GAAG,EAAE,CAAC;QACR,IAAI,KAAK,GAAG,CAAC;YAAE,KAAK,IAAI,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;IACtC,CAAC;SAAM,CAAC;QACN,IAAI,KAAK,GAAG,CAAC;YAAE,KAAK,IAAI,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;IACtC,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC/D,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO;IACvB,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK,CAAC;IAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,UAAU,GAAG,CAAC,GAAG,SAAS,CAAC;QACzC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC;AAED,+CAA+C;AAC/C,2FAA2F;AAC3F,+FAA+F;AAC/F,yDAAyD;AACzD,yDAAyD;AACzD,SAAS,MAAM,CACb,EAAU,EACV,EAAU,EACV,EAAU,EACV,EAAU,EACV,GAAW,EACX,GAAW,EACX,SAAiB,EACjB,GAAgC,EAChC,IAAc,EACd,KAAe,EACf,SAAiB,EACjB,OAAgB;IAEhB,gFAAgF;IAChF,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,SAAS,CAAC;IAC/B,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,SAAS,CAAC;IAC/B,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,SAAS,CAAC;IAC/B,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,SAAS,CAAC;IAC/B,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACnB,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAClB,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACrB,CAAC;SAAM,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,sDAAsD;QACtD,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,SAAS,EAAE,EAAE,GAAG,GAAG,GAAG,SAAS,CAAC,CAAC;QACtD,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,SAAS,EAAE,EAAE,GAAG,GAAG,GAAG,SAAS,CAAC,CAAC;IACzD,CAAC;SAAM,CAAC;QACN,2EAA2E;QAC3E,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAClB,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YACnB,2EAA2E;YAC3E,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;YACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YACpC,YAAY,CAAC,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QACjF,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAClB,YAAY,CAAC,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;YACjG,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;AACH,CAAC;AAED,0FAA0F;AAC1F,SAAS,OAAO,CACd,EAAU,EACV,EAAU,EACV,GAAW,EACX,GAAW,EACX,GAAW,EACX,GAAW,EACX,SAAiB,EACjB,IAAiC,EACjC,UAAkB,EAClB,IAAc,EACd,KAAe,EACf,SAAiB;IAEjB,+DAA+D;IAC/D,MAAM,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,SAAS,CAAC;IACjC,MAAM,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,SAAS,CAAC;IACjC,MAAM,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,SAAS,CAAC;IACjC,MAAM,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,SAAS,CAAC;IACjC,MAAM,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,SAAS,CAAC;IACjC,MAAM,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,SAAS,CAAC;IACjC,MAAM,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,SAAS,CAAC;IACjC,MAAM,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,SAAS,CAAC;IACjC,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,4FAA4F;QAC5F,MAAM,KAAK,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;QACpC,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,CAAC;YAC3B,+DAA+D;YAC/D,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACpB,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,wFAAwF;YACxF,yFAAyF;YACzF,8FAA8F;YAC9F,4FAA4F;YAC5F,2FAA2F;YAC3F,MAAM,EAAE,GAAG,GAAG,GAAG,GAAG,CAAC;YACrB,MAAM,EAAE,GAAG,GAAG,GAAG,GAAG,CAAC;YACrB,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC;YACzC,MAAM,EAAE,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;YACzB,MAAM,EAAE,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;YACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;YAC1E,IAAI,QAAQ,IAAI,SAAS,GAAG,UAAU,EAAE,CAAC;gBACvC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;gBAClB,mDAAmD;gBACnD,MAAM,GAAG,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;gBACxB,MAAM,GAAG,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;gBACxB,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACvB,CAAC;iBAAM,CAAC;gBACN,oBAAoB;gBACpB,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;gBAC9B,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;IACH,CAAC;SAAM,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QAC5B,qEAAqE;QACrE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACpB,YAAY,CAAC,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;QACnG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACpB,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACrB,YAAY,CAAC,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QACzG,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACvB,CAAC;SAAM,CAAC;QACN,8BAA8B;QAC9B,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IACjC,CAAC;AACH,CAAC;AAED,iEAAiE;AACjE,SAAS,SAAS,CAChB,GAAuB,EACvB,MAAe,EACf,IAAwB,EACxB,UAAkB;IAElB,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAe,EAAE,MAAM,EAAE,CAAC,CAAC;QACjD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,MAAM,eAAe,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACxD,IAAI,eAAe,IAAI,CAAC,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAe,EAAE,MAAM,EAAE,CAAC,CAAC;QACjD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,qCAAqC;IACrC,MAAM,MAAM,GAAG,CAAC,CAAC,UAAU,GAAG,eAAe,CAAC,GAAG,eAAe,CAAC,GAAG,eAAe,CAAC;IACpF,8DAA8D;IAC9D,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,IAAI,GAAG,IAAI,CAAC;IAChB,CAAC;QACC,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,IAAI,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC;gBAC3B,SAAS,GAAG,CAAC,CAAC;gBACd,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;gBACrC,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBACnB,MAAM;YACR,CAAC;YACD,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IACD,IAAI,OAAO,GAAoB,IAAI,CAAC;IACpC,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC;IAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACtB,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1B,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5B,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QAChC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;QACnB,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;QACnB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QAC5C,IAAI,IAAI,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YAC7B,OAAO,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACrB,CAAC;QACD,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,OAAO,QAAQ,GAAG,MAAM,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,QAAQ,CAAC,CAAC;YACpD,MAAM,CAAC,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,MAAM,CAAC;YACrC,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;YACvB,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;YACvB,IAAI,IAAI,EAAE,CAAC;gBACT,IAAI,OAAO,KAAK,IAAI;oBAAE,OAAO,GAAG,CAAC,EAAE,GAAG,CAAC,QAAQ,GAAG,MAAM,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC,QAAQ,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;gBAC/F,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YACvB,CAAC;iBAAM,CAAC;gBACN,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;oBACrB,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC;wBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;oBACzE,OAAO,GAAG,IAAI,CAAC;gBACjB,CAAC;gBACD,IAAI,IAAI,IAAI,SAAS,EAAE,CAAC;oBACtB,OAAO,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;gBACrB,CAAC;YACH,CAAC;YACD,QAAQ,IAAI,IAAI,CAAC;YACjB,SAAS,IAAI,IAAI,CAAC;YAClB,IAAI,SAAS,IAAI,KAAK,EAAE,CAAC;gBACvB,SAAS,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;gBAC1C,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC5B,IAAI,GAAG,SAAS,GAAG,CAAC,KAAK,CAAC,CAAC;gBAC3B,IAAI,IAAI,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;oBAC7B,OAAO,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;gBACrB,CAAC;qBAAM,IAAI,CAAC,IAAI,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;oBACrC,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC;wBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;oBACzE,OAAO,GAAG,IAAI,CAAC;gBACjB,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,cAAc,CAAC,IAAoB,EAAE,SAAiB;IAC7D,2FAA2F;IAC3F,uEAAuE;IACvE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;IAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACvB,MAAM,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC;IAC1C,MAAM,QAAQ,GAAoB,EAAE,CAAC;IACrC,IAAI,OAAO,GAAyB,IAAI,CAAC;IACzC,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,MAAM,aAAa,GAAG,GAAkB,EAAE;QACxC,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACrB,OAAO,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;YAC5C,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACvB,CAAC,GAAG,CAAC,CAAC;YACN,CAAC,GAAG,CAAC,CAAC;QACR,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC;IACF,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC;QAC5C,MAAM,OAAO,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC7B,IAAI,OAAO,KAAK,WAAW,CAAC,OAAO,EAAE,CAAC;YACpC,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;YACb,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YACjB,EAAE,IAAI,CAAC,CAAC;YACR,aAAa,GAAG,CAAC,CAAC;YAClB,aAAa,GAAG,CAAC,CAAC;YAClB,OAAO,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;YAC5C,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzB,CAAC;aAAM,IAAI,OAAO,KAAK,WAAW,CAAC,YAAY,EAAE,CAAC;YAChD,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YACjB,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YACjB,EAAE,IAAI,CAAC,CAAC;YACR,aAAa,GAAG,CAAC,CAAC;YAClB,aAAa,GAAG,CAAC,CAAC;YAClB,OAAO,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;YAC5C,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzB,CAAC;aAAM,IAAI,OAAO,KAAK,WAAW,CAAC,OAAO,EAAE,CAAC;YAC3C,MAAM,EAAE,GAAG,aAAa,EAAE,CAAC;YAC3B,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;YACb,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YACjB,EAAE,IAAI,CAAC,CAAC;YACR,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACvB,CAAC;aAAM,IAAI,OAAO,KAAK,WAAW,CAAC,YAAY,EAAE,CAAC;YAChD,MAAM,EAAE,GAAG,aAAa,EAAE,CAAC;YAC3B,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YACjB,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YACjB,EAAE,IAAI,CAAC,CAAC;YACR,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACvB,CAAC;aAAM,IAAI,OAAO,KAAK,WAAW,CAAC,QAAQ,EAAE,CAAC;YAC5C,MAAM,EAAE,GAAG,aAAa,EAAE,CAAC;YAC3B,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;YACtG,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YACjB,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YACjB,EAAE,IAAI,CAAC,CAAC;QACV,CAAC;aAAM,IAAI,OAAO,KAAK,WAAW,CAAC,cAAc,EAAE,CAAC;YAClD,MAAM,EAAE,GAAG,aAAa,EAAE,CAAC;YAC3B,YAAY,CACV,EAAE,CAAC,MAAM,EACT,CAAC,EACD,CAAC,EACD,IAAI,CAAC,EAAE,CAAC,EACR,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,EACZ,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,EACZ,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,EACZ,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,EACZ,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,EACZ,WAAW,EACX,CAAC,CACF,CAAC;YACF,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YACjB,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YACjB,EAAE,IAAI,CAAC,CAAC;QACV,CAAC;aAAM,IAAI,OAAO,KAAK,WAAW,CAAC,KAAK,EAAE,CAAC;YACzC,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;gBACrB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;gBACtB,CAAC,GAAG,aAAa,CAAC;gBAClB,CAAC,GAAG,aAAa,CAAC;gBAClB,OAAO,GAAG,IAAI,CAAC;YACjB,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,WAAW,CAAC,EAAU,EAAE,EAAU,EAAE,EAAU,EAAE,EAAU,EAAE,EAAU,EAAE,EAAU;IACzF,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IACnB,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IACnB,MAAM,KAAK,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IAChC,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;QAChB,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;QACnB,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;QACnB,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IAC3B,CAAC;IACD,MAAM,KAAK,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;IAC9C,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC;AACjC,CAAC;AAED,SAAS,YAAY,CACnB,GAAa,EACb,EAAU,EACV,EAAU,EACV,GAAW,EACX,GAAW,EACX,GAAW,EACX,GAAW,EACX,EAAU,EACV,EAAU,EACV,WAAmB,EACnB,KAAa;IAEb,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IACnD,IAAI,KAAK,IAAI,qBAAqB,IAAI,CAAC,IAAI,IAAI,WAAW,IAAI,IAAI,IAAI,WAAW,CAAC,EAAE,CAAC;QACnF,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACjB,OAAO;IACT,CAAC;IACD,MAAM,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;IAC3B,MAAM,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;IAC3B,MAAM,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5B,MAAM,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5B,MAAM,GAAG,GAAG,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;IAC3B,MAAM,GAAG,GAAG,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;IAC3B,MAAM,IAAI,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,MAAM,IAAI,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,MAAM,IAAI,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,MAAM,IAAI,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,MAAM,EAAE,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7B,MAAM,EAAE,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7B,YAAY,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IAChF,YAAY,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;AAClF,CAAC;AAED,SAAS,gBAAgB,CACvB,GAAa,EACb,EAAU,EACV,EAAU,EACV,EAAU,EACV,EAAU,EACV,EAAU,EACV,EAAU,EACV,WAAmB,EACnB,KAAa;IAEb,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IACnB,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IACnB,MAAM,QAAQ,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IACnC,IAAI,MAAM,CAAC;IACX,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;QACnB,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;QACnB,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;QACnB,MAAM,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IAC7B,CAAC;SAAM,CAAC;QACN,MAAM,KAAK,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;QAC9C,MAAM,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,QAAQ,CAAC;IACtC,CAAC;IACD,IAAI,KAAK,IAAI,qBAAqB,IAAI,MAAM,IAAI,WAAW,EAAE,CAAC;QAC5D,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACjB,OAAO;IACT,CAAC;IACD,MAAM,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;IAC1B,MAAM,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;IAC1B,MAAM,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;IAC1B,MAAM,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;IAC1B,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;IAC3B,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;IAC3B,gBAAgB,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IACxE,gBAAgB,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;AAC1E,CAAC;AAED,yDAAyD;AACzD,SAAS,aAAa,CACpB,GAAuB,EACvB,MAAe,EACf,SAAiB,EACjB,IAAiC,EACjC,GAAgC,EAChC,UAAkB,EAClB,GAAS,EACT,SAAiB;IAEjB,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC;IAC1B,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO;IAClB,wCAAwC;IACxC,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,4BAA4B;IAC5B,MAAM,OAAO,GAAG,IAAI,KAAK,CAAS,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACzC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QACjD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QACzC,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;YACZ,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC;YAC3B,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC;QAChC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAClD,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IACD,IAAI,MAAM,EAAE,CAAC;QACX,8CAA8C;QAC9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/B,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACnC,MAAM,IAAI,GAAG,CAAC,CAAC;YACf,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;YAC9B,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YAClC,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;YAC9B,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;QAC/G,CAAC;IACH,CAAC;SAAM,CAAC;QACN,gGAAgG;QAChG,8FAA8F;QAC9F,wCAAwC;QACxC,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACxB,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACxB,6EAA6E;QAC7E,uDAAuD;QACvD,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;QAC9F,eAAe;QACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/B,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACjC,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YACrC,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3B,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;QAC/G,CAAC;QACD,oDAAoD;QACpD,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAClC,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QACtC,MAAM,CACJ,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAChB,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EACpB,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,CAAC,IAAI,EACL,SAAS,EACT,GAAG,EACH,IAAI,EACJ,KAAK,EACL,SAAS,EACT,KAAK,CACN,CAAC;IACJ,CAAC;IACD,oFAAoF;IACpF,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO;IAC5B,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACvC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QACvC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACtC,CAAC;IACD,kCAAkC;IAClC,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9C,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QACvC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC;IACD,eAAe,CAAC,GAAG,CAAC,CAAC;AACvB,CAAC;AAYD,MAAM,qBAAqB,GAAG,EAAE,CAAC"}
@@ -1,8 +1,13 @@
1
+ export { explainMorphShapeGradientEndpoints } from './explainMorphShapeGradientEndpoints';
2
+ export * from './morphShape';
3
+ export * from './morphShapeAnimation';
4
+ export { appendMorphShapeBeginFill, appendMorphShapeBeginGradientFill, appendMorphShapeBeginTextureFill, appendMorphShapeLineGradientStyle, appendMorphShapeLineStyle, appendMorphShapeLineTextureStyle, } from './morphShapePaint';
1
5
  export * from './scale9Shape';
2
6
  export * from './shape';
3
7
  export * from './shapeCommands';
4
8
  export * from './shapeFill';
5
9
  export * from './shapeStroke';
6
- export * from './shapeHitTestBuiltins';
7
- export * from './shapeHitTestRegistry';
10
+ export * from './shapeStrokeOutline';
11
+ export * from './scale9ShapeCommands';
12
+ export * from './explainShapeTessellation';
8
13
  //# sourceMappingURL=contract.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,SAAS,CAAC;AACxB,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC"}
1
+ {"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kCAAkC,EAAE,MAAM,sCAAsC,CAAC;AAC1F,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC;AACtC,OAAO,EACL,yBAAyB,EACzB,iCAAiC,EACjC,gCAAgC,EAChC,iCAAiC,EACjC,yBAAyB,EACzB,gCAAgC,GACjC,MAAM,mBAAmB,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,SAAS,CAAC;AACxB,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,4BAA4B,CAAC"}
package/dist/contract.js CHANGED
@@ -1,8 +1,13 @@
1
+ export { explainMorphShapeGradientEndpoints } from './explainMorphShapeGradientEndpoints';
2
+ export * from './morphShape';
3
+ export * from './morphShapeAnimation';
4
+ export { appendMorphShapeBeginFill, appendMorphShapeBeginGradientFill, appendMorphShapeBeginTextureFill, appendMorphShapeLineGradientStyle, appendMorphShapeLineStyle, appendMorphShapeLineTextureStyle, } from './morphShapePaint';
1
5
  export * from './scale9Shape';
2
6
  export * from './shape';
3
7
  export * from './shapeCommands';
4
8
  export * from './shapeFill';
5
9
  export * from './shapeStroke';
6
- export * from './shapeHitTestBuiltins';
7
- export * from './shapeHitTestRegistry';
10
+ export * from './shapeStrokeOutline';
11
+ export * from './scale9ShapeCommands';
12
+ export * from './explainShapeTessellation';
8
13
  //# sourceMappingURL=contract.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"contract.js","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,SAAS,CAAC;AACxB,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC"}
1
+ {"version":3,"file":"contract.js","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kCAAkC,EAAE,MAAM,sCAAsC,CAAC;AAC1F,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC;AACtC,OAAO,EACL,yBAAyB,EACzB,iCAAiC,EACjC,gCAAgC,EAChC,iCAAiC,EACjC,yBAAyB,EACzB,gCAAgC,GACjC,MAAM,mBAAmB,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,SAAS,CAAC;AACxB,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,4BAA4B,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { MorphShapeGradientEndpoint, MorphShapeGradientEndpointExplanation } from '@flighthq/types/contract';
2
+ export type { MorphShapeGradientEndpointExplanation, MorphShapeGradientEndpointReason } from '@flighthq/types/contract';
3
+ export declare function explainMorphShapeGradientEndpoints(start: Readonly<MorphShapeGradientEndpoint>, end: Readonly<MorphShapeGradientEndpoint>): MorphShapeGradientEndpointExplanation;
4
+ export declare function getMorphShapeGradientEndpointIssue(start: Readonly<MorphShapeGradientEndpoint>, end: Readonly<MorphShapeGradientEndpoint>): number;
5
+ //# sourceMappingURL=explainMorphShapeGradientEndpoints.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explainMorphShapeGradientEndpoints.d.ts","sourceRoot":"","sources":["../src/explainMorphShapeGradientEndpoints.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,0BAA0B,EAC1B,qCAAqC,EAEtC,MAAM,0BAA0B,CAAC;AAElC,YAAY,EAAE,qCAAqC,EAAE,gCAAgC,EAAE,MAAM,0BAA0B,CAAC;AAIxH,wBAAgB,kCAAkC,CAChD,KAAK,EAAE,QAAQ,CAAC,0BAA0B,CAAC,EAC3C,GAAG,EAAE,QAAQ,CAAC,0BAA0B,CAAC,GACxC,qCAAqC,CAQvC;AAED,wBAAgB,kCAAkC,CAChD,KAAK,EAAE,QAAQ,CAAC,0BAA0B,CAAC,EAC3C,GAAG,EAAE,QAAQ,CAAC,0BAA0B,CAAC,GACxC,MAAM,CAYR"}
@@ -0,0 +1,43 @@
1
+ // Pure diagnostic twin of the gradient paint appenders. Returns detached data and keeps diagnostic
2
+ // reason strings outside the paint sampling module so applications can tree-shake them independently.
3
+ export function explainMorphShapeGradientEndpoints(start, end) {
4
+ const issue = getMorphShapeGradientEndpointIssue(start, end);
5
+ return {
6
+ endStopCount: end.colors.length,
7
+ reason: getReason(issue),
8
+ startStopCount: start.colors.length,
9
+ supported: issue === GradientEndpointIssueNone,
10
+ };
11
+ }
12
+ export function getMorphShapeGradientEndpointIssue(start, end) {
13
+ const startCount = start.colors.length;
14
+ const endCount = end.colors.length;
15
+ if (startCount === 0 || endCount === 0)
16
+ return GradientEndpointIssueEmpty;
17
+ if (start.alphas.length !== startCount || start.ratios.length !== startCount) {
18
+ return GradientEndpointIssueStartComponents;
19
+ }
20
+ if (end.alphas.length !== endCount || end.ratios.length !== endCount) {
21
+ return GradientEndpointIssueEndComponents;
22
+ }
23
+ if (startCount !== endCount)
24
+ return GradientEndpointIssueStopCount;
25
+ return GradientEndpointIssueNone;
26
+ }
27
+ function getReason(issue) {
28
+ if (issue === GradientEndpointIssueEmpty)
29
+ return 'empty-gradient';
30
+ if (issue === GradientEndpointIssueStartComponents)
31
+ return 'start-stop-component-count-mismatch';
32
+ if (issue === GradientEndpointIssueEndComponents)
33
+ return 'end-stop-component-count-mismatch';
34
+ if (issue === GradientEndpointIssueStopCount)
35
+ return 'stop-count-mismatch';
36
+ return 'ok';
37
+ }
38
+ const GradientEndpointIssueNone = 0;
39
+ const GradientEndpointIssueEmpty = 1;
40
+ const GradientEndpointIssueStartComponents = 2;
41
+ const GradientEndpointIssueEndComponents = 3;
42
+ const GradientEndpointIssueStopCount = 4;
43
+ //# sourceMappingURL=explainMorphShapeGradientEndpoints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explainMorphShapeGradientEndpoints.js","sourceRoot":"","sources":["../src/explainMorphShapeGradientEndpoints.ts"],"names":[],"mappings":"AAQA,mGAAmG;AACnG,sGAAsG;AACtG,MAAM,UAAU,kCAAkC,CAChD,KAA2C,EAC3C,GAAyC;IAEzC,MAAM,KAAK,GAAG,kCAAkC,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC7D,OAAO;QACL,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM;QAC/B,MAAM,EAAE,SAAS,CAAC,KAAK,CAAC;QACxB,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM;QACnC,SAAS,EAAE,KAAK,KAAK,yBAAyB;KAC/C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kCAAkC,CAChD,KAA2C,EAC3C,GAAyC;IAEzC,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;IACvC,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC;IACnC,IAAI,UAAU,KAAK,CAAC,IAAI,QAAQ,KAAK,CAAC;QAAE,OAAO,0BAA0B,CAAC;IAC1E,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,UAAU,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QAC7E,OAAO,oCAAoC,CAAC;IAC9C,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QACrE,OAAO,kCAAkC,CAAC;IAC5C,CAAC;IACD,IAAI,UAAU,KAAK,QAAQ;QAAE,OAAO,8BAA8B,CAAC;IACnE,OAAO,yBAAyB,CAAC;AACnC,CAAC;AAED,SAAS,SAAS,CAAC,KAAa;IAC9B,IAAI,KAAK,KAAK,0BAA0B;QAAE,OAAO,gBAAgB,CAAC;IAClE,IAAI,KAAK,KAAK,oCAAoC;QAAE,OAAO,qCAAqC,CAAC;IACjG,IAAI,KAAK,KAAK,kCAAkC;QAAE,OAAO,mCAAmC,CAAC;IAC7F,IAAI,KAAK,KAAK,8BAA8B;QAAE,OAAO,qBAAqB,CAAC;IAC3E,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,yBAAyB,GAAG,CAAC,CAAC;AACpC,MAAM,0BAA0B,GAAG,CAAC,CAAC;AACrC,MAAM,oCAAoC,GAAG,CAAC,CAAC;AAC/C,MAAM,kCAAkC,GAAG,CAAC,CAAC;AAC7C,MAAM,8BAA8B,GAAG,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ShapeCommandToken, ShapeTessellationExplanation } from '@flighthq/types/contract';
2
+ export declare function explainShapeTessellation(commands: readonly ShapeCommandToken[], strokePathTessellationEnabled?: boolean): ShapeTessellationExplanation;
3
+ //# sourceMappingURL=explainShapeTessellation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explainShapeTessellation.d.ts","sourceRoot":"","sources":["../src/explainShapeTessellation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,4BAA4B,EAAE,MAAM,0BAA0B,CAAC;AAYhG,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,SAAS,iBAAiB,EAAE,EACtC,6BAA6B,UAAQ,GACpC,4BAA4B,CAO9B"}
@@ -0,0 +1,20 @@
1
+ import { hasNonSolidShapeFill } from './shapeFill';
2
+ import { hasNonSolidShapeStroke } from './shapeStroke';
3
+ import { getShapeStrokeOutlineRegions } from './shapeStrokeOutline';
4
+ // Reports whether a command stream can be drawn as mesh regions, and what stops it when it cannot.
5
+ //
6
+ // `strokePathTessellationEnabled` selects which stroke lane the answer describes, because the two
7
+ // differ on exactly the case that catches authors out: the default lane declines a closed stroke — the
8
+ // outline of any rectangle, circle, or closed path — while the opt-in stroke-path tessellator expresses
9
+ // it. Fill alpha never matters to either; a solid fill tessellates at any alpha, including zero.
10
+ export function explainShapeTessellation(commands, strokePathTessellationEnabled = false) {
11
+ if (hasNonSolidShapeFill(commands))
12
+ return { blockedBy: 'non-solid-fill', status: 'needs-rasterizer' };
13
+ if (hasNonSolidShapeStroke(commands))
14
+ return { blockedBy: 'non-solid-stroke', status: 'needs-rasterizer' };
15
+ if (!strokePathTessellationEnabled && getShapeStrokeOutlineRegions(commands) === null) {
16
+ return { blockedBy: 'stroke-outline', status: 'needs-rasterizer' };
17
+ }
18
+ return { blockedBy: 'none', status: 'tessellates' };
19
+ }
20
+ //# sourceMappingURL=explainShapeTessellation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explainShapeTessellation.js","sourceRoot":"","sources":["../src/explainShapeTessellation.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAC;AAEpE,mGAAmG;AACnG,EAAE;AACF,kGAAkG;AAClG,uGAAuG;AACvG,wGAAwG;AACxG,iGAAiG;AACjG,MAAM,UAAU,wBAAwB,CACtC,QAAsC,EACtC,6BAA6B,GAAG,KAAK;IAErC,IAAI,oBAAoB,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC;IACvG,IAAI,sBAAsB,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAC3G,IAAI,CAAC,6BAA6B,IAAI,4BAA4B,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC;QACtF,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC;IACrE,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;AACtD,CAAC"}