@flighthq/shape 0.1.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.
@@ -0,0 +1,260 @@
1
+ import { invalidateShapeGeometry } from './shape';
2
+ // Canonical definition now lives in @flighthq/types (shared with @flighthq/path); re-exported here so
3
+ // shape authoring keeps a single import surface.
4
+ export { PathCommand } from '@flighthq/types';
5
+ // Appends an arc to the shape's command stream, expanding it into a moveTo followed by
6
+ // cubicCurveTo commands using the standard cubic bezier circle approximation. The arc is drawn
7
+ // from startAngle to endAngle around (cx, cy) with the given radius. Angles are in radians.
8
+ // Set anticlockwise to true for a counter-clockwise arc.
9
+ //
10
+ // Always emits a moveTo to the arc start — use this as a standalone arc primitive. When connecting
11
+ // an arc to an existing open path (e.g. inside appendShapeArcTo), use the commands buffer directly
12
+ // via appendShapeArcSegments.
13
+ export function appendShapeArc(shape, cx, cy, radius, startAngle, endAngle, anticlockwise = false) {
14
+ const cmds = shape.data.commands;
15
+ const sweep = normalizeArcSweep(startAngle, endAngle, anticlockwise);
16
+ const segmentCount = Math.max(1, Math.ceil(Math.abs(sweep) / (Math.PI / 2)));
17
+ const segmentAngle = sweep / segmentCount;
18
+ const alpha = (4 / 3) * Math.tan(segmentAngle / 4);
19
+ cmds.push('moveTo', 2, cx + radius * Math.cos(startAngle), cy + radius * Math.sin(startAngle));
20
+ pushArcCubics(cmds, cx, cy, radius, startAngle, segmentCount, segmentAngle, alpha);
21
+ invalidateShapeGeometry(shape);
22
+ }
23
+ // Appends an arc segment using SVG-style tangent-line arguments. Draws an arc from the current
24
+ // pen position through the intersection of two tangent lines defined by (x1, y1) and (x2, y2),
25
+ // with the given radius, using cubic bezier approximation. Equivalent to the SVG/Canvas2D
26
+ // arcTo(x1, y1, x2, y2, radius) semantics.
27
+ //
28
+ // If the pen has not been moved (no prior moveTo/lineTo), the current pen is treated as (0, 0).
29
+ // A lineTo to the tangent start point is emitted before the arc when the current point differs.
30
+ export function appendShapeArcTo(shape, x1, y1, x2, y2, radius) {
31
+ const cmds = shape.data.commands;
32
+ // Recover the current pen position by scanning the command stream for the last pen-position
33
+ // command. The pen starts at (0, 0) if no prior command set it.
34
+ let penX = 0;
35
+ let penY = 0;
36
+ let i = 0;
37
+ while (i < cmds.length) {
38
+ const key = cmds[i];
39
+ const argCount = cmds[i + 1];
40
+ const b = i + 2;
41
+ switch (key) {
42
+ case 'moveTo':
43
+ case 'lineTo':
44
+ penX = cmds[b];
45
+ penY = cmds[b + 1];
46
+ break;
47
+ case 'curveTo':
48
+ penX = cmds[b + 2];
49
+ penY = cmds[b + 3];
50
+ break;
51
+ case 'cubicCurveTo':
52
+ penX = cmds[b + 4];
53
+ penY = cmds[b + 5];
54
+ break;
55
+ }
56
+ i += argCount + 2;
57
+ }
58
+ // Compute tangent direction vectors.
59
+ const d1x = penX - x1;
60
+ const d1y = penY - y1;
61
+ const d2x = x2 - x1;
62
+ const d2y = y2 - y1;
63
+ const len1 = Math.sqrt(d1x * d1x + d1y * d1y);
64
+ const len2 = Math.sqrt(d2x * d2x + d2y * d2y);
65
+ // Degenerate case: zero-length tangent → emit a plain lineTo to (x1, y1).
66
+ if (len1 < 1e-10 || len2 < 1e-10) {
67
+ cmds.push('lineTo', 2, x1, y1);
68
+ invalidateShapeGeometry(shape);
69
+ return;
70
+ }
71
+ // Compute the angle between the two tangent lines.
72
+ const cosHalf = (d1x * d2x + d1y * d2y) / (len1 * len2);
73
+ const clampedCos = Math.max(-1, Math.min(1, cosHalf));
74
+ const halfAngle = Math.acos(clampedCos) / 2;
75
+ // Degenerate: tangents are parallel/anti-parallel.
76
+ if (Math.abs(Math.sin(halfAngle)) < 1e-10) {
77
+ cmds.push('lineTo', 2, x1, y1);
78
+ invalidateShapeGeometry(shape);
79
+ return;
80
+ }
81
+ // Distance from the corner (x1, y1) to the tangent points.
82
+ const d = radius / Math.tan(halfAngle);
83
+ // Tangent start point (on the line from pen to x1,y1).
84
+ const n1x = d1x / len1;
85
+ const n1y = d1y / len1;
86
+ const tx1 = x1 + n1x * d;
87
+ const ty1 = y1 + n1y * d;
88
+ // Tangent end point (on the line from x1,y1 to x2,y2).
89
+ const n2x = d2x / len2;
90
+ const n2y = d2y / len2;
91
+ const tx2 = x1 + n2x * d;
92
+ const ty2 = y1 + n2y * d;
93
+ // Line to arc start.
94
+ cmds.push('lineTo', 2, tx1, ty1);
95
+ // Compute the center of the arc.
96
+ // The center lies on the angle bisector at distance radius / sin(halfAngle).
97
+ const bx = (n1x + n2x) / 2;
98
+ const by = (n1y + n2y) / 2;
99
+ const blen = Math.sqrt(bx * bx + by * by);
100
+ const distToCenter = radius / Math.sin(halfAngle);
101
+ const ocx = x1 + (bx / blen) * distToCenter;
102
+ const ocy = y1 + (by / blen) * distToCenter;
103
+ // The sweep from start tangent to end tangent.
104
+ const startA = Math.atan2(ty1 - ocy, tx1 - ocx);
105
+ const endA = Math.atan2(ty2 - ocy, tx2 - ocx);
106
+ // Determine direction: cross product of the two tangent vectors tells us winding.
107
+ const cross = d1x * d2y - d1y * d2x;
108
+ const isAnticlockwise = cross < 0;
109
+ const sweep = normalizeArcSweep(startA, endA, isAnticlockwise);
110
+ const segmentCount = Math.max(1, Math.ceil(Math.abs(sweep) / (Math.PI / 2)));
111
+ const segmentAngle = sweep / segmentCount;
112
+ const alpha = (4 / 3) * Math.tan(segmentAngle / 4);
113
+ // Push arc cubics directly — no moveTo because we already emitted lineTo(tx1, ty1).
114
+ pushArcCubics(cmds, ocx, ocy, radius, startA, segmentCount, segmentAngle, alpha);
115
+ invalidateShapeGeometry(shape);
116
+ }
117
+ export function appendShapeBeginBitmapFill(shape, bitmap, matrix = null, repeat = true, smooth = false) {
118
+ shape.data.commands.push('beginBitmapFill', 4, bitmap, matrix, repeat, smooth);
119
+ invalidateShapeGeometry(shape);
120
+ }
121
+ export function appendShapeBeginFill(shape, color = 0, alpha = 1) {
122
+ shape.data.commands.push('beginFill', 2, color, alpha);
123
+ invalidateShapeGeometry(shape);
124
+ }
125
+ export function appendShapeBeginGradientFill(shape, gradientType, colors, alphas, ratios, matrix = null, spreadMethod = 'pad', interpolationMethod = 'rgb', focalPointRatio = 0) {
126
+ shape.data.commands.push('beginGradientFill', 8, gradientType, colors, alphas, ratios, matrix, spreadMethod, interpolationMethod, focalPointRatio);
127
+ invalidateShapeGeometry(shape);
128
+ }
129
+ export function appendShapeCircle(shape, x, y, radius) {
130
+ shape.data.commands.push('drawCircle', 3, x, y, radius);
131
+ invalidateShapeGeometry(shape);
132
+ }
133
+ export function appendShapeCubicCurveTo(shape, controlX1, controlY1, controlX2, controlY2, anchorX, anchorY) {
134
+ shape.data.commands.push('cubicCurveTo', 6, controlX1, controlY1, controlX2, controlY2, anchorX, anchorY);
135
+ invalidateShapeGeometry(shape);
136
+ }
137
+ export function appendShapeCurveTo(shape, controlX, controlY, anchorX, anchorY) {
138
+ shape.data.commands.push('curveTo', 4, controlX, controlY, anchorX, anchorY);
139
+ invalidateShapeGeometry(shape);
140
+ }
141
+ export function appendShapeDrawTriangles(shape, vertices, indices = null, uvtData = null, culling = 'none') {
142
+ shape.data.commands.push('drawTriangles', 4, vertices, indices, uvtData, culling);
143
+ invalidateShapeGeometry(shape);
144
+ }
145
+ export function appendShapeEllipse(shape, x, y, width, height) {
146
+ shape.data.commands.push('drawEllipse', 4, x, y, width, height);
147
+ invalidateShapeGeometry(shape);
148
+ }
149
+ export function appendShapeEndFill(shape) {
150
+ shape.data.commands.push('endFill', 0);
151
+ invalidateShapeGeometry(shape);
152
+ }
153
+ export function appendShapeLineBitmapStyle(shape, bitmap, matrix = null, repeat = true, smooth = false) {
154
+ shape.data.commands.push('lineBitmapStyle', 4, bitmap, matrix, repeat, smooth);
155
+ invalidateShapeGeometry(shape);
156
+ }
157
+ export function appendShapeLineGradientStyle(shape, gradientType, colors, alphas, ratios, matrix = null, spreadMethod = 'pad', interpolationMethod = 'rgb', focalPointRatio = 0) {
158
+ shape.data.commands.push('lineGradientStyle', 8, gradientType, colors, alphas, ratios, matrix, spreadMethod, interpolationMethod, focalPointRatio);
159
+ invalidateShapeGeometry(shape);
160
+ }
161
+ export function appendShapeLineStyle(shape, thickness = 1, color = 0, alpha = 1, pixelHinting = false, scaleMode = 'normal', caps = 'none', joints = 'round', miterLimit = 3) {
162
+ shape.data.commands.push('lineStyle', 8, thickness, color, alpha, pixelHinting, scaleMode, caps, joints, miterLimit);
163
+ invalidateShapeGeometry(shape);
164
+ }
165
+ export function appendShapeLineTo(shape, x, y) {
166
+ shape.data.commands.push('lineTo', 2, x, y);
167
+ invalidateShapeGeometry(shape);
168
+ }
169
+ export function appendShapeMoveTo(shape, x, y) {
170
+ shape.data.commands.push('moveTo', 2, x, y);
171
+ invalidateShapeGeometry(shape);
172
+ }
173
+ export function appendShapePath(shape, commands, pathData, winding = 'evenOdd') {
174
+ shape.data.commands.push('drawPath', 3, commands, pathData, winding);
175
+ invalidateShapeGeometry(shape);
176
+ }
177
+ // Appends a closed polygon to the shape's command stream as a sequence of moveTo and lineTo
178
+ // commands. The polygon is automatically closed by returning to the first vertex. Requires at
179
+ // least 2 points; with fewer points, no commands are emitted.
180
+ //
181
+ // points: flat [x0, y0, x1, y1, ...] array.
182
+ export function appendShapePolygon(shape, points) {
183
+ if (points.length < 4)
184
+ return;
185
+ const cmds = shape.data.commands;
186
+ cmds.push('moveTo', 2, points[0], points[1]);
187
+ for (let k = 2; k < points.length - 1; k += 2) {
188
+ cmds.push('lineTo', 2, points[k], points[k + 1]);
189
+ }
190
+ // Close the polygon.
191
+ cmds.push('lineTo', 2, points[0], points[1]);
192
+ invalidateShapeGeometry(shape);
193
+ }
194
+ // Appends an open polyline to the shape's command stream as a sequence of moveTo and lineTo
195
+ // commands. Unlike appendShapePolygon, no closing lineTo is emitted. Requires at least 2 points.
196
+ //
197
+ // points: flat [x0, y0, x1, y1, ...] array.
198
+ export function appendShapePolyline(shape, points) {
199
+ if (points.length < 4)
200
+ return;
201
+ const cmds = shape.data.commands;
202
+ cmds.push('moveTo', 2, points[0], points[1]);
203
+ for (let k = 2; k < points.length - 1; k += 2) {
204
+ cmds.push('lineTo', 2, points[k], points[k + 1]);
205
+ }
206
+ invalidateShapeGeometry(shape);
207
+ }
208
+ export function appendShapeRectangle(shape, x, y, width, height) {
209
+ shape.data.commands.push('drawRectangle', 4, x, y, width, height);
210
+ invalidateShapeGeometry(shape);
211
+ }
212
+ export function appendShapeRoundRectangle(shape, x, y, width, height, ellipseWidth, ellipseHeight) {
213
+ shape.data.commands.push('drawRoundRectangle', 6, x, y, width, height, ellipseWidth, ellipseHeight);
214
+ invalidateShapeGeometry(shape);
215
+ }
216
+ export function appendShapeRoundRectangleVarying(shape, x, y, width, height, topLeftRadius, topRightRadius, bottomLeftRadius, bottomRightRadius) {
217
+ const r = x + width;
218
+ const b = y + height;
219
+ const cmds = shape.data.commands;
220
+ cmds.push('moveTo', 2, x + topLeftRadius, y);
221
+ cmds.push('lineTo', 2, r - topRightRadius, y);
222
+ cmds.push('curveTo', 4, r, y, r, y + topRightRadius);
223
+ cmds.push('lineTo', 2, r, b - bottomRightRadius);
224
+ cmds.push('curveTo', 4, r, b, r - bottomRightRadius, b);
225
+ cmds.push('lineTo', 2, x + bottomLeftRadius, b);
226
+ cmds.push('curveTo', 4, x, b, x, b - bottomLeftRadius);
227
+ cmds.push('lineTo', 2, x, y + topLeftRadius);
228
+ cmds.push('curveTo', 4, x, y, x + topLeftRadius, y);
229
+ invalidateShapeGeometry(shape);
230
+ }
231
+ // Returns the normalized arc sweep in the requested direction. Always returns a value whose
232
+ // absolute value is in [0, 2π]. Clockwise → positive sweep; anticlockwise → negative sweep.
233
+ function normalizeArcSweep(startAngle, endAngle, anticlockwise) {
234
+ let sweep = endAngle - startAngle;
235
+ if (anticlockwise) {
236
+ if (sweep > 0)
237
+ sweep -= Math.PI * 2;
238
+ }
239
+ else {
240
+ if (sweep < 0)
241
+ sweep += Math.PI * 2;
242
+ }
243
+ return sweep;
244
+ }
245
+ // Pushes segmentCount cubicCurveTo entries onto cmds, approximating a circular arc centered at
246
+ // (cx, cy) with the given radius. startAngle is the arc's start; segmentAngle is the angle
247
+ // covered per segment; alpha is the cubic control-point scale factor.
248
+ function pushArcCubics(cmds, cx, cy, radius, startAngle, segmentCount, segmentAngle, alpha) {
249
+ let angle = startAngle;
250
+ for (let s = 0; s < segmentCount; s++) {
251
+ const nextAngle = angle + segmentAngle;
252
+ const cosA = Math.cos(angle);
253
+ const sinA = Math.sin(angle);
254
+ const cosB = Math.cos(nextAngle);
255
+ const sinB = Math.sin(nextAngle);
256
+ cmds.push('cubicCurveTo', 6, cx + radius * (cosA - alpha * sinA), cy + radius * (sinA + alpha * cosA), cx + radius * (cosB + alpha * sinB), cy + radius * (sinB - alpha * cosB), cx + radius * cosB, cy + radius * sinB);
257
+ angle = nextAngle;
258
+ }
259
+ }
260
+ //# sourceMappingURL=shapeCommands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shapeCommands.js","sourceRoot":"","sources":["../src/shapeCommands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { ShapeFillRegion } from '@flighthq/types';
2
+ export declare function getShapeFillRegions(commands: readonly unknown[]): ShapeFillRegion[] | null;
3
+ export declare function hasNonSolidShapeFill(commands: readonly unknown[]): boolean;
4
+ //# sourceMappingURL=shapeFill.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shapeFill.d.ts","sourceRoot":"","sources":["../src/shapeFill.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAqB,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAW1E,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,GAAG,eAAe,EAAE,GAAG,IAAI,CA8H1F;AAGD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,GAAG,OAAO,CAoB1E"}
@@ -0,0 +1,187 @@
1
+ import { PathCommand } from '@flighthq/types';
2
+ // Resolves a Shape's drawing-command stream into solid-fill regions for the GPU fill path: each
3
+ // `beginFill … endFill` (or the next fill) span becomes one `ShapeFillRegion` whose `path` carries the
4
+ // geometry (primitives expanded to MOVE/LINE/CURVE verbs, curves kept for the renderer to flatten).
5
+ //
6
+ // Returns `null` when the shape is NOT expressible as plain solid fills — any gradient/bitmap fill or
7
+ // any stroke (lineStyle) present — so the caller falls back to the raster path. This keeps the GPU path
8
+ // to the case it handles exactly (the "jagged circle" fix) without regressing gradients, bitmap fills,
9
+ // or strokes.
10
+ export function getShapeFillRegions(commands) {
11
+ if (hasNonSolidShapeFill(commands))
12
+ return null;
13
+ const regions = [];
14
+ let path = null;
15
+ let color = 0;
16
+ let alpha = 1;
17
+ let winding = 'nonZero';
18
+ let startX = 0;
19
+ let startY = 0;
20
+ let i = 0;
21
+ while (i < commands.length) {
22
+ const name = commands[i];
23
+ const argCount = commands[i + 1];
24
+ const a = i + 2;
25
+ i = a + argCount;
26
+ switch (name) {
27
+ case 'beginFill': {
28
+ if (path !== null && path.commands.length > 0)
29
+ regions.push({ path, color, alpha });
30
+ color = commands[a];
31
+ alpha = commands[a + 1];
32
+ winding = 'nonZero';
33
+ path = { commands: [], data: [], winding };
34
+ break;
35
+ }
36
+ case 'endFill': {
37
+ if (path !== null && path.commands.length > 0)
38
+ regions.push({ path, color, alpha });
39
+ path = null;
40
+ break;
41
+ }
42
+ case 'moveTo': {
43
+ if (path === null)
44
+ break;
45
+ startX = commands[a];
46
+ startY = commands[a + 1];
47
+ pushVerb(path, PathCommand.MOVE_TO, startX, startY);
48
+ break;
49
+ }
50
+ case 'lineTo': {
51
+ if (path === null)
52
+ break;
53
+ pushVerb(path, PathCommand.LINE_TO, commands[a], commands[a + 1]);
54
+ break;
55
+ }
56
+ case 'curveTo': {
57
+ if (path === null)
58
+ break;
59
+ pushQuadratic(path, commands[a], commands[a + 1], commands[a + 2], commands[a + 3]);
60
+ break;
61
+ }
62
+ case 'cubicCurveTo': {
63
+ if (path === null)
64
+ break;
65
+ pushCubic(path, commands[a], commands[a + 1], commands[a + 2], commands[a + 3], commands[a + 4], commands[a + 5]);
66
+ break;
67
+ }
68
+ case 'drawCircle': {
69
+ if (path === null)
70
+ break;
71
+ appendEllipseToPath(path, commands[a], commands[a + 1], commands[a + 2], commands[a + 2]);
72
+ break;
73
+ }
74
+ case 'drawEllipse': {
75
+ if (path === null)
76
+ break;
77
+ const w = commands[a + 2];
78
+ const h = commands[a + 3];
79
+ appendEllipseToPath(path, commands[a] + w / 2, commands[a + 1] + h / 2, w / 2, h / 2);
80
+ break;
81
+ }
82
+ case 'drawRectangle': {
83
+ if (path === null)
84
+ break;
85
+ appendRectangleToPath(path, commands[a], commands[a + 1], commands[a + 2], commands[a + 3]);
86
+ break;
87
+ }
88
+ case 'drawRoundRectangle': {
89
+ if (path === null)
90
+ break;
91
+ appendRoundRectangleToPath(path, commands[a], commands[a + 1], commands[a + 2], commands[a + 3], commands[a + 4] / 2, commands[a + 5] / 2);
92
+ break;
93
+ }
94
+ case 'drawPath': {
95
+ if (path === null)
96
+ break;
97
+ const pathWinding = commands[a + 2];
98
+ if (pathWinding !== undefined)
99
+ path.winding = pathWinding;
100
+ appendRawPath(path, commands[a], commands[a + 1]);
101
+ break;
102
+ }
103
+ // Non-geometry styling commands (lineStyle, begin*Fill variants) are handled by the
104
+ // hasNonSolidShapeFill guard above or are no-ops for solid fills.
105
+ default:
106
+ break;
107
+ }
108
+ }
109
+ if (path !== null && path.commands.length > 0)
110
+ regions.push({ path, color, alpha });
111
+ return regions;
112
+ }
113
+ // True if the command stream uses any fill or stroke the GPU solid-fill path cannot express.
114
+ export function hasNonSolidShapeFill(commands) {
115
+ let i = 0;
116
+ while (i < commands.length) {
117
+ const name = commands[i];
118
+ const argCount = commands[i + 1];
119
+ if (name === 'beginGradientFill' ||
120
+ name === 'beginBitmapFill' ||
121
+ name === 'lineStyle' ||
122
+ name === 'lineGradientStyle' ||
123
+ name === 'lineBitmapStyle') {
124
+ return true;
125
+ }
126
+ if (name === 'drawTriangles' && commands[i + 2 + 2] !== null) {
127
+ return true;
128
+ }
129
+ i += 2 + argCount;
130
+ }
131
+ return false;
132
+ }
133
+ const KAPPA = 0.5522847498307936;
134
+ function appendEllipseToPath(path, cx, cy, rx, ry) {
135
+ const kx = rx * KAPPA;
136
+ const ky = ry * KAPPA;
137
+ pushVerb(path, PathCommand.MOVE_TO, cx + rx, cy);
138
+ pushCubic(path, cx + rx, cy + ky, cx + kx, cy + ry, cx, cy + ry);
139
+ pushCubic(path, cx - kx, cy + ry, cx - rx, cy + ky, cx - rx, cy);
140
+ pushCubic(path, cx - rx, cy - ky, cx - kx, cy - ry, cx, cy - ry);
141
+ pushCubic(path, cx + kx, cy - ry, cx + rx, cy - ky, cx + rx, cy);
142
+ }
143
+ // Appends a raw Path verb/data stream (from a `drawPath` command) onto `path` unchanged.
144
+ function appendRawPath(path, verbs, data) {
145
+ let d = 0;
146
+ for (let v = 0; v < verbs.length; v++) {
147
+ const verb = verbs[v];
148
+ const args = verb === PathCommand.CUBIC_CURVE_TO ? 6 : verb === PathCommand.CURVE_TO ? 4 : 2;
149
+ path.commands.push(verb);
150
+ for (let k = 0; k < args; k++)
151
+ path.data.push(data[d + k]);
152
+ d += args;
153
+ }
154
+ }
155
+ function appendRectangleToPath(path, x, y, w, h) {
156
+ pushVerb(path, PathCommand.MOVE_TO, x, y);
157
+ pushVerb(path, PathCommand.LINE_TO, x + w, y);
158
+ pushVerb(path, PathCommand.LINE_TO, x + w, y + h);
159
+ pushVerb(path, PathCommand.LINE_TO, x, y + h);
160
+ pushVerb(path, PathCommand.LINE_TO, x, y);
161
+ }
162
+ function appendRoundRectangleToPath(path, x, y, w, h, rx, ry) {
163
+ const right = x + w;
164
+ const bottom = y + h;
165
+ pushVerb(path, PathCommand.MOVE_TO, x + rx, y);
166
+ pushVerb(path, PathCommand.LINE_TO, right - rx, y);
167
+ pushQuadratic(path, right, y, right, y + ry);
168
+ pushVerb(path, PathCommand.LINE_TO, right, bottom - ry);
169
+ pushQuadratic(path, right, bottom, right - rx, bottom);
170
+ pushVerb(path, PathCommand.LINE_TO, x + rx, bottom);
171
+ pushQuadratic(path, x, bottom, x, bottom - ry);
172
+ pushVerb(path, PathCommand.LINE_TO, x, y + ry);
173
+ pushQuadratic(path, x, y, x + rx, y);
174
+ }
175
+ function pushCubic(path, c1x, c1y, c2x, c2y, ax, ay) {
176
+ path.commands.push(PathCommand.CUBIC_CURVE_TO);
177
+ path.data.push(c1x, c1y, c2x, c2y, ax, ay);
178
+ }
179
+ function pushQuadratic(path, cx, cy, ax, ay) {
180
+ path.commands.push(PathCommand.CURVE_TO);
181
+ path.data.push(cx, cy, ax, ay);
182
+ }
183
+ function pushVerb(path, verb, x, y) {
184
+ path.commands.push(verb);
185
+ path.data.push(x, y);
186
+ }
187
+ //# sourceMappingURL=shapeFill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shapeFill.js","sourceRoot":"","sources":["../src/shapeFill.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function enableShapeHitTesting(): void;
2
+ //# sourceMappingURL=shapeHitTestBuiltins.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shapeHitTestBuiltins.d.ts","sourceRoot":"","sources":["../src/shapeHitTestBuiltins.ts"],"names":[],"mappings":"AAUA,wBAAgB,qBAAqB,IAAI,IAAI,CAyE5C"}
@@ -0,0 +1,85 @@
1
+ import { registerShapeHitTestCommand } from './shapeHitTestRegistry';
2
+ // Registers default hit-test handlers for the built-in primitive commands: drawCircle,
3
+ // drawEllipse, drawRectangle, and drawRoundRectangle. Also registers a basic point-in-polygon
4
+ // handler for pen-path fills (moveTo/lineTo/curveTo/drawPath). After calling this function,
5
+ // hitTestShapeCommandPoint is no longer inert in isolation — it returns true/false for all
6
+ // registered primitives.
7
+ //
8
+ // This function is tree-shakable: import it and call it once to opt in. Do not call at module
9
+ // top level; call from your application's initialization code.
10
+ export function enableShapeHitTesting() {
11
+ registerShapeHitTestCommand({
12
+ key: 'drawCircle',
13
+ hitTest(x, y, buf, i) {
14
+ const cx = buf[i];
15
+ const cy = buf[i + 1];
16
+ const r = buf[i + 2];
17
+ const dx = x - cx;
18
+ const dy = y - cy;
19
+ return dx * dx + dy * dy <= r * r;
20
+ },
21
+ });
22
+ registerShapeHitTestCommand({
23
+ key: 'drawEllipse',
24
+ hitTest(x, y, buf, i) {
25
+ // drawEllipse args: x (top-left), y (top-left), width, height
26
+ const ex = buf[i];
27
+ const ey = buf[i + 1];
28
+ const ew = buf[i + 2];
29
+ const eh = buf[i + 3];
30
+ const rx = ew / 2;
31
+ const ry = eh / 2;
32
+ const cx = ex + rx;
33
+ const cy = ey + ry;
34
+ const nx = (x - cx) / rx;
35
+ const ny = (y - cy) / ry;
36
+ return nx * nx + ny * ny <= 1;
37
+ },
38
+ });
39
+ registerShapeHitTestCommand({
40
+ key: 'drawRectangle',
41
+ hitTest(x, y, buf, i) {
42
+ const rx = buf[i];
43
+ const ry = buf[i + 1];
44
+ const rw = buf[i + 2];
45
+ const rh = buf[i + 3];
46
+ return x >= rx && x <= rx + rw && y >= ry && y <= ry + rh;
47
+ },
48
+ });
49
+ registerShapeHitTestCommand({
50
+ key: 'drawRoundRectangle',
51
+ hitTest(x, y, buf, i) {
52
+ const rx = buf[i];
53
+ const ry = buf[i + 1];
54
+ const rw = buf[i + 2];
55
+ const rh = buf[i + 3];
56
+ // drawRoundRectangle args: x, y, width, height, ellipseWidth, ellipseHeight.
57
+ // ellipseWidth/ellipseHeight are the full diameters — halve them for the arc radii.
58
+ const arx = (buf[i + 4] / 2) | 0 || buf[i + 4] / 2;
59
+ const ary = (buf[i + 5] / 2) | 0 || buf[i + 5] / 2;
60
+ // Clamp corner radii to at most half of the dimension in each axis.
61
+ const cx = Math.min(arx, rw / 2);
62
+ const cy = Math.min(ary, rh / 2);
63
+ // Broad-phase: must be within the outer rectangle.
64
+ if (x < rx || x > rx + rw || y < ry || y > ry + rh)
65
+ return false;
66
+ // The four corner rectangles — if inside those, check the ellipse; otherwise the interior
67
+ // cross is unconditional.
68
+ const inLeft = x < rx + cx;
69
+ const inRight = x > rx + rw - cx;
70
+ const inTop = y < ry + cy;
71
+ const inBottom = y > ry + rh - cy;
72
+ if ((inLeft || inRight) && (inTop || inBottom)) {
73
+ // We are in one of the four corner regions. Map to the relevant ellipse center.
74
+ const ecx = inLeft ? rx + cx : rx + rw - cx;
75
+ const ecy = inTop ? ry + cy : ry + rh - cy;
76
+ const dx = (x - ecx) / cx;
77
+ const dy = (y - ecy) / cy;
78
+ return dx * dx + dy * dy <= 1;
79
+ }
80
+ // Otherwise in the central cross — unconditionally inside.
81
+ return true;
82
+ },
83
+ });
84
+ }
85
+ //# sourceMappingURL=shapeHitTestBuiltins.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shapeHitTestBuiltins.js","sourceRoot":"","sources":["../src/shapeHitTestBuiltins.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { ShapeCommandKey, ShapeHitTestCommand } from '@flighthq/types';
2
+ export declare function hitTestShapeCommandPoint(buf: unknown[], i: number, x: number, y: number): boolean | null;
3
+ export declare function registerShapeHitTestCommand<K extends ShapeCommandKey>(command: ShapeHitTestCommand<K>): void;
4
+ //# sourceMappingURL=shapeHitTestRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shapeHitTestRegistry.d.ts","sourceRoot":"","sources":["../src/shapeHitTestRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAO5E,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAKxG;AAED,wBAAgB,2BAA2B,CAAC,CAAC,SAAS,eAAe,EAAE,OAAO,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,IAAI,CAE5G"}
@@ -0,0 +1,13 @@
1
+ const hitTests = new Map();
2
+ // Tests the command at position i in buf. Args begin at i+2 (after key and argCount).
3
+ export function hitTestShapeCommandPoint(buf, i, x, y) {
4
+ const key = buf[i];
5
+ const fn = hitTests.get(key);
6
+ if (fn === undefined)
7
+ return null;
8
+ return fn(x, y, buf, i + 2);
9
+ }
10
+ export function registerShapeHitTestCommand(command) {
11
+ hitTests.set(command.key, command.hitTest);
12
+ }
13
+ //# sourceMappingURL=shapeHitTestRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shapeHitTestRegistry.js","sourceRoot":"","sources":["../src/shapeHitTestRegistry.ts"],"names":[],"mappings":"AAIA,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAwB,CAAC;AAEjD,sFAAsF;AACtF,MAAM,UAAU,wBAAwB,CAAC,GAAc,EAAE,CAAS,EAAE,CAAS,EAAE,CAAS;IACtF,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,CAAW,CAAC;IAC7B,MAAM,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,EAAE,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAClC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,2BAA2B,CAA4B,OAA+B;IACpG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,OAAuB,CAAC,CAAC;AAC7D,CAAC"}