@flighthq/path 0.3.0-next.906.07cea63 → 0.3.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.
- package/dist/contract.d.ts +4 -0
- package/dist/contract.d.ts.map +1 -1
- package/dist/contract.js +4 -0
- package/dist/contract.js.map +1 -1
- package/dist/explainPathMorphCreation.d.ts +4 -0
- package/dist/explainPathMorphCreation.d.ts.map +1 -0
- package/dist/explainPathMorphCreation.js +24 -0
- package/dist/explainPathMorphCreation.js.map +1 -0
- package/dist/explainStrokePathTessellation.d.ts +4 -0
- package/dist/explainStrokePathTessellation.d.ts.map +1 -0
- package/dist/explainStrokePathTessellation.js +26 -0
- package/dist/explainStrokePathTessellation.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/pathMorph.d.ts +5 -0
- package/dist/pathMorph.d.ts.map +1 -0
- package/dist/pathMorph.js +35 -0
- package/dist/pathMorph.js.map +1 -0
- package/dist/pathMorphGeometry.d.ts +14 -0
- package/dist/pathMorphGeometry.d.ts.map +1 -0
- package/dist/pathMorphGeometry.js +347 -0
- package/dist/pathMorphGeometry.js.map +1 -0
- package/dist/strokePath.d.ts.map +1 -1
- package/dist/strokePath.js +30 -451
- package/dist/strokePath.js.map +1 -1
- package/dist/strokePathGeometry.d.ts +23 -0
- package/dist/strokePathGeometry.d.ts.map +1 -0
- package/dist/strokePathGeometry.js +422 -0
- package/dist/strokePathGeometry.js.map +1 -0
- package/dist/tessellateStrokePath.d.ts +3 -0
- package/dist/tessellateStrokePath.d.ts.map +1 -0
- package/dist/tessellateStrokePath.js +66 -0
- package/dist/tessellateStrokePath.js.map +1 -0
- package/package.json +4 -2
- package/src/explainPathMorphCreation.test.ts +81 -0
- package/src/explainStrokePathTessellation.test.ts +39 -0
- package/src/pathMorph.test.ts +290 -0
- package/src/pathMorphGeometry.test.ts +18 -0
- package/src/strokePathGeometry.test.ts +27 -0
- package/src/tessellateStrokePath.test.ts +91 -0
package/dist/strokePath.js
CHANGED
|
@@ -1,462 +1,41 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
// Converts
|
|
4
|
-
//
|
|
5
|
-
//
|
|
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.
|
|
1
|
+
import { appendPathClose, appendPathLineTo, appendPathMoveTo, createPath } from './path';
|
|
2
|
+
import { buildStrokePathGeometry } from './strokePathGeometry';
|
|
3
|
+
// Converts a centerline Path into its fill outline using the same flatten/dash/offset/join/cap kernel
|
|
4
|
+
// as tessellateStrokePath. Open strokes emit one closed contour (left edge, end cap, reversed right
|
|
5
|
+
// edge, start cap). Closed strokes emit the two counter-wound boundary contours of the ring; consumers
|
|
6
|
+
// must honor non-zero winding for that case rather than independently filling both contours.
|
|
13
7
|
export function strokePath(path, style, tolerance = 0.25) {
|
|
14
|
-
const
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
|
|
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
|
-
}
|
|
8
|
+
const result = createPath('nonZero');
|
|
9
|
+
const geometry = buildStrokePathGeometry(path, style, tolerance);
|
|
10
|
+
for (let i = 0; i < geometry.pieces.length; i++)
|
|
11
|
+
appendPieceOutline(result, geometry.pieces[i]);
|
|
36
12
|
return result;
|
|
37
13
|
}
|
|
38
|
-
|
|
39
|
-
|
|
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)
|
|
14
|
+
function appendPieceOutline(path, piece) {
|
|
15
|
+
if (piece.left.length < 4 || piece.right.length < 4)
|
|
56
16
|
return;
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
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
|
-
}
|
|
17
|
+
appendContour(path, piece.left, false, piece.closed ? EMPTY_POINTS : piece.endCap, piece.closed ? EMPTY_POINTS : piece.startCap, piece.right);
|
|
18
|
+
if (piece.closed)
|
|
19
|
+
appendContour(path, piece.right, true, EMPTY_POINTS, EMPTY_POINTS, EMPTY_POINTS);
|
|
99
20
|
}
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
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);
|
|
21
|
+
function appendContour(path, primary, reversePrimary, afterPrimary, afterSecondary, secondary) {
|
|
22
|
+
if (reversePrimary) {
|
|
23
|
+
appendPathMoveTo(path, primary[primary.length - 2], primary[primary.length - 1]);
|
|
24
|
+
for (let i = primary.length - 4; i >= 0; i -= 2)
|
|
25
|
+
appendPathLineTo(path, primary[i], primary[i + 1]);
|
|
153
26
|
}
|
|
154
27
|
else {
|
|
155
|
-
|
|
156
|
-
|
|
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
|
-
}
|
|
28
|
+
appendPathMoveTo(path, primary[0], primary[1]);
|
|
29
|
+
appendPoints(path, primary, 2, 2);
|
|
324
30
|
}
|
|
325
|
-
|
|
31
|
+
appendPoints(path, afterPrimary, 0, 2);
|
|
32
|
+
appendPoints(path, secondary, secondary.length - 2, -2);
|
|
33
|
+
appendPoints(path, afterSecondary, 0, 2);
|
|
34
|
+
appendPathClose(path);
|
|
326
35
|
}
|
|
327
|
-
function
|
|
328
|
-
|
|
329
|
-
|
|
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);
|
|
36
|
+
function appendPoints(path, points, start, step) {
|
|
37
|
+
for (let i = start; i >= 0 && i < points.length; i += step)
|
|
38
|
+
appendPathLineTo(path, points[i], points[i + 1]);
|
|
460
39
|
}
|
|
461
|
-
const
|
|
40
|
+
const EMPTY_POINTS = [];
|
|
462
41
|
//# sourceMappingURL=strokePath.js.map
|
package/dist/strokePath.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"strokePath.js","sourceRoot":"","sources":["../src/strokePath.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"strokePath.js","sourceRoot":"","sources":["../src/strokePath.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Path, StrokeStyle } from '@flighthq/types/contract';
|
|
2
|
+
export declare const StrokePathTessellationIssueNone = 0;
|
|
3
|
+
export declare const StrokePathTessellationIssueInvalidStyle = 1;
|
|
4
|
+
export declare const StrokePathTessellationIssueInvalidPath = 2;
|
|
5
|
+
export declare const StrokePathTessellationIssueSelfIntersectingCenterline = 3;
|
|
6
|
+
export declare const StrokePathTessellationIssueReversingJoin = 4;
|
|
7
|
+
export declare const StrokePathTessellationIssueSelfIntersectingOutline = 5;
|
|
8
|
+
type StrokePathTessellationIssue = 0 | 1 | 2 | 3 | 4 | 5;
|
|
9
|
+
interface StrokePathPieceGeometry {
|
|
10
|
+
closed: boolean;
|
|
11
|
+
endCap: number[];
|
|
12
|
+
left: number[];
|
|
13
|
+
right: number[];
|
|
14
|
+
startCap: number[];
|
|
15
|
+
}
|
|
16
|
+
interface StrokePathGeometry {
|
|
17
|
+
issue: StrokePathTessellationIssue;
|
|
18
|
+
issueSubpath: number | null;
|
|
19
|
+
pieces: StrokePathPieceGeometry[];
|
|
20
|
+
}
|
|
21
|
+
export declare function buildStrokePathGeometry(path: Readonly<Path>, style: Readonly<StrokeStyle>, tolerance: number): StrokePathGeometry;
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=strokePathGeometry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strokePathGeometry.d.ts","sourceRoot":"","sources":["../src/strokePathGeometry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAIlE,eAAO,MAAM,+BAA+B,IAAI,CAAC;AACjD,eAAO,MAAM,uCAAuC,IAAI,CAAC;AACzD,eAAO,MAAM,sCAAsC,IAAI,CAAC;AACxD,eAAO,MAAM,qDAAqD,IAAI,CAAC;AACvE,eAAO,MAAM,wCAAwC,IAAI,CAAC;AAC1D,eAAO,MAAM,kDAAkD,IAAI,CAAC;AAEpE,KAAK,2BAA2B,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAEzD,UAAU,uBAAuB;IAC/B,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,UAAU,kBAAkB;IAC1B,KAAK,EAAE,2BAA2B,CAAC;IACnC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,EAAE,uBAAuB,EAAE,CAAC;CACnC;AAmBD,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,EACpB,KAAK,EAAE,QAAQ,CAAC,WAAW,CAAC,EAC5B,SAAS,EAAE,MAAM,GAChB,kBAAkB,CA2DpB"}
|