@flighthq/shape 0.3.0-next.1530.70058bd → 0.3.0-next.1560.03a2b36

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.
@@ -6,4 +6,5 @@ export * from './shapeStroke';
6
6
  export * from './shapeStrokeOutline';
7
7
  export * from './shapeHitTestBuiltins';
8
8
  export * from './shapeHitTestRegistry';
9
+ export * from './scale9ShapeCommands';
9
10
  //# 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,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC"}
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,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC"}
package/dist/contract.js CHANGED
@@ -6,4 +6,5 @@ export * from './shapeStroke';
6
6
  export * from './shapeStrokeOutline';
7
7
  export * from './shapeHitTestBuiltins';
8
8
  export * from './shapeHitTestRegistry';
9
+ export * from './scale9ShapeCommands';
9
10
  //# 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,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC"}
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,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,2 +1,3 @@
1
1
  export { PathCommand, appendShapeArc, appendShapeArcTo, appendShapeBeginTextureFill, appendShapeBeginFill, appendShapeBeginGradientFill, appendShapeCircle, appendShapeCubicCurveTo, appendShapeCurveTo, appendShapeDrawTriangles, appendShapeEllipse, appendShapeEndFill, appendShapeGeometryCommand, appendShapeLineTextureStyle, appendShapeLineGradientStyle, appendShapeLineStyle, appendShapeLineTo, appendShapeMoveTo, appendShapePath, appendShapePolygon, appendShapePolyline, appendShapeRectangle, appendShapeRoundRectangle, appendShapeRoundRectangleVarying, clearShapeCommands, computeShapeLocalBoundsRectangle, copyShapeCommands, createScale9Shape, createShape, enableShapeHitTesting, getPathCommandOperandCount, getShapeBounds, getShapeCommandCount, getShapeFillRegions, getShapeStrokeRegions, getShapeStrokeOutlineRegions, hasNonSolidShapeFill, hasNonSolidShapeStroke, hasShapeFill, hitTestShapeCommandPoint, isShapeEmpty, registerShapeHitTestCommand, } from './contract';
2
+ export * from './scale9ShapeCommands';
2
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,2BAA2B,EAC3B,oBAAoB,EACpB,4BAA4B,EAC5B,iBAAiB,EACjB,uBAAuB,EACvB,kBAAkB,EAClB,wBAAwB,EACxB,kBAAkB,EAClB,kBAAkB,EAClB,0BAA0B,EAC1B,2BAA2B,EAC3B,4BAA4B,EAC5B,oBAAoB,EACpB,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,yBAAyB,EACzB,gCAAgC,EAChC,kBAAkB,EAClB,gCAAgC,EAChC,iBAAiB,EACjB,iBAAiB,EACjB,WAAW,EACX,qBAAqB,EACrB,0BAA0B,EAC1B,cAAc,EACd,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,4BAA4B,EAC5B,oBAAoB,EACpB,sBAAsB,EACtB,YAAY,EACZ,wBAAwB,EACxB,YAAY,EACZ,2BAA2B,GAC5B,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,2BAA2B,EAC3B,oBAAoB,EACpB,4BAA4B,EAC5B,iBAAiB,EACjB,uBAAuB,EACvB,kBAAkB,EAClB,wBAAwB,EACxB,kBAAkB,EAClB,kBAAkB,EAClB,0BAA0B,EAC1B,2BAA2B,EAC3B,4BAA4B,EAC5B,oBAAoB,EACpB,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,yBAAyB,EACzB,gCAAgC,EAChC,kBAAkB,EAClB,gCAAgC,EAChC,iBAAiB,EACjB,iBAAiB,EACjB,WAAW,EACX,qBAAqB,EACrB,0BAA0B,EAC1B,cAAc,EACd,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,4BAA4B,EAC5B,oBAAoB,EACpB,sBAAsB,EACtB,YAAY,EACZ,wBAAwB,EACxB,YAAY,EACZ,2BAA2B,GAC5B,MAAM,YAAY,CAAC;AACpB,cAAc,uBAAuB,CAAC"}
package/dist/index.js CHANGED
@@ -1,2 +1,3 @@
1
1
  export { PathCommand, appendShapeArc, appendShapeArcTo, appendShapeBeginTextureFill, appendShapeBeginFill, appendShapeBeginGradientFill, appendShapeCircle, appendShapeCubicCurveTo, appendShapeCurveTo, appendShapeDrawTriangles, appendShapeEllipse, appendShapeEndFill, appendShapeGeometryCommand, appendShapeLineTextureStyle, appendShapeLineGradientStyle, appendShapeLineStyle, appendShapeLineTo, appendShapeMoveTo, appendShapePath, appendShapePolygon, appendShapePolyline, appendShapeRectangle, appendShapeRoundRectangle, appendShapeRoundRectangleVarying, clearShapeCommands, computeShapeLocalBoundsRectangle, copyShapeCommands, createScale9Shape, createShape, enableShapeHitTesting, getPathCommandOperandCount, getShapeBounds, getShapeCommandCount, getShapeFillRegions, getShapeStrokeRegions, getShapeStrokeOutlineRegions, hasNonSolidShapeFill, hasNonSolidShapeStroke, hasShapeFill, hitTestShapeCommandPoint, isShapeEmpty, registerShapeHitTestCommand, } from './contract';
2
+ export * from './scale9ShapeCommands';
2
3
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,2BAA2B,EAC3B,oBAAoB,EACpB,4BAA4B,EAC5B,iBAAiB,EACjB,uBAAuB,EACvB,kBAAkB,EAClB,wBAAwB,EACxB,kBAAkB,EAClB,kBAAkB,EAClB,0BAA0B,EAC1B,2BAA2B,EAC3B,4BAA4B,EAC5B,oBAAoB,EACpB,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,yBAAyB,EACzB,gCAAgC,EAChC,kBAAkB,EAClB,gCAAgC,EAChC,iBAAiB,EACjB,iBAAiB,EACjB,WAAW,EACX,qBAAqB,EACrB,0BAA0B,EAC1B,cAAc,EACd,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,4BAA4B,EAC5B,oBAAoB,EACpB,sBAAsB,EACtB,YAAY,EACZ,wBAAwB,EACxB,YAAY,EACZ,2BAA2B,GAC5B,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,2BAA2B,EAC3B,oBAAoB,EACpB,4BAA4B,EAC5B,iBAAiB,EACjB,uBAAuB,EACvB,kBAAkB,EAClB,wBAAwB,EACxB,kBAAkB,EAClB,kBAAkB,EAClB,0BAA0B,EAC1B,2BAA2B,EAC3B,4BAA4B,EAC5B,oBAAoB,EACpB,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,yBAAyB,EACzB,gCAAgC,EAChC,kBAAkB,EAClB,gCAAgC,EAChC,iBAAiB,EACjB,iBAAiB,EACjB,WAAW,EACX,qBAAqB,EACrB,0BAA0B,EAC1B,cAAc,EACd,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,4BAA4B,EAC5B,oBAAoB,EACpB,sBAAsB,EACtB,YAAY,EACZ,wBAAwB,EACxB,YAAY,EACZ,2BAA2B,GAC5B,MAAM,YAAY,CAAC;AACpB,cAAc,uBAAuB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Scale9Mapper, ShapeCommandToken } from '@flighthq/types/contract';
2
+ export declare function mapScale9ShapeCommands(out: ShapeCommandToken[], source: readonly ShapeCommandToken[], mapper: Scale9Mapper): void;
3
+ //# sourceMappingURL=scale9ShapeCommands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scale9ShapeCommands.d.ts","sourceRoot":"","sources":["../src/scale9ShapeCommands.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAQhF,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,iBAAiB,EAAE,EACxB,MAAM,EAAE,SAAS,iBAAiB,EAAE,EACpC,MAAM,EAAE,YAAY,GACnB,IAAI,CAsEN"}
@@ -0,0 +1,119 @@
1
+ // Rewrites a shape's command stream through a nine-slice mapper, so the corners of a scaled shape keep
2
+ // their size while the edges and centre stretch. This is pure command geometry — no renderer, no
3
+ // context — which is why it lives beside the commands rather than in the backend that happens to
4
+ // rasterize the result: every backend that supports nine-slice needs the same rewrite.
5
+ //
6
+ // `out` may be `source`, in which case the rewrite is in place.
7
+ export function mapScale9ShapeCommands(out, source, mapper) {
8
+ if (out !== source) {
9
+ out.length = source.length;
10
+ for (let k = 0; k < source.length; k++)
11
+ out[k] = source[k];
12
+ }
13
+ let i = 0;
14
+ while (i < out.length) {
15
+ const key = out[i];
16
+ const argCount = out[i + 1];
17
+ switch (key) {
18
+ case 'moveTo':
19
+ case 'lineTo':
20
+ out[i + 2] = mapper.mapX(out[i + 2]);
21
+ out[i + 3] = mapper.mapY(out[i + 3]);
22
+ break;
23
+ case 'curveTo':
24
+ out[i + 2] = mapper.mapX(out[i + 2]);
25
+ out[i + 3] = mapper.mapY(out[i + 3]);
26
+ out[i + 4] = mapper.mapX(out[i + 4]);
27
+ out[i + 5] = mapper.mapY(out[i + 5]);
28
+ break;
29
+ case 'cubicCurveTo':
30
+ out[i + 2] = mapper.mapX(out[i + 2]);
31
+ out[i + 3] = mapper.mapY(out[i + 3]);
32
+ out[i + 4] = mapper.mapX(out[i + 4]);
33
+ out[i + 5] = mapper.mapY(out[i + 5]);
34
+ out[i + 6] = mapper.mapX(out[i + 6]);
35
+ out[i + 7] = mapper.mapY(out[i + 7]);
36
+ break;
37
+ case 'drawRectangle':
38
+ case 'drawEllipse': {
39
+ const x = out[i + 2];
40
+ const y = out[i + 3];
41
+ const w = out[i + 4];
42
+ const h = out[i + 5];
43
+ const mx = mapper.mapX(x);
44
+ const my = mapper.mapY(y);
45
+ out[i + 2] = mx;
46
+ out[i + 3] = my;
47
+ out[i + 4] = mapper.mapX(x + w) - mx;
48
+ out[i + 5] = mapper.mapY(y + h) - my;
49
+ break;
50
+ }
51
+ case 'drawRoundRectangle': {
52
+ const x = out[i + 2];
53
+ const y = out[i + 3];
54
+ const w = out[i + 4];
55
+ const h = out[i + 5];
56
+ const mx = mapper.mapX(x);
57
+ const my = mapper.mapY(y);
58
+ out[i + 2] = mx;
59
+ out[i + 3] = my;
60
+ out[i + 4] = mapper.mapX(x + w) - mx;
61
+ out[i + 5] = mapper.mapY(y + h) - my;
62
+ break;
63
+ }
64
+ case 'drawCircle':
65
+ out[i + 2] = mapper.mapX(out[i + 2]);
66
+ out[i + 3] = mapper.mapY(out[i + 3]);
67
+ break;
68
+ case 'drawPath':
69
+ remapPathData(_remappedPathData, out[i + 3], out[i + 2], mapper);
70
+ out[i + 3] = _remappedPathData;
71
+ break;
72
+ }
73
+ i += argCount + 2;
74
+ }
75
+ }
76
+ function remapPathData(out, source, cmds, mapper) {
77
+ if (out !== source) {
78
+ out.length = source.length;
79
+ for (let k = 0; k < source.length; k++)
80
+ out[k] = source[k];
81
+ }
82
+ let di = 0;
83
+ for (const pc of cmds) {
84
+ switch (pc) {
85
+ case 1: // MOVE_TO [x, y]
86
+ case 2: // LINE_TO [x, y]
87
+ out[di] = mapper.mapX(out[di]);
88
+ out[di + 1] = mapper.mapY(out[di + 1]);
89
+ di += 2;
90
+ break;
91
+ case 3: // CURVE_TO [cx, cy, ax, ay]
92
+ out[di] = mapper.mapX(out[di]);
93
+ out[di + 1] = mapper.mapY(out[di + 1]);
94
+ out[di + 2] = mapper.mapX(out[di + 2]);
95
+ out[di + 3] = mapper.mapY(out[di + 3]);
96
+ di += 4;
97
+ break;
98
+ case 4: // WIDE_MOVE_TO [?, ?, x, y]
99
+ case 5: // WIDE_LINE_TO [?, ?, x, y]
100
+ out[di + 2] = mapper.mapX(out[di + 2]);
101
+ out[di + 3] = mapper.mapY(out[di + 3]);
102
+ di += 4;
103
+ break;
104
+ case 6: // CUBIC_CURVE_TO [cx1, cy1, cx2, cy2, ax, ay]
105
+ out[di] = mapper.mapX(out[di]);
106
+ out[di + 1] = mapper.mapY(out[di + 1]);
107
+ out[di + 2] = mapper.mapX(out[di + 2]);
108
+ out[di + 3] = mapper.mapY(out[di + 3]);
109
+ out[di + 4] = mapper.mapX(out[di + 4]);
110
+ out[di + 5] = mapper.mapY(out[di + 5]);
111
+ di += 6;
112
+ break;
113
+ default:
114
+ break;
115
+ }
116
+ }
117
+ }
118
+ const _remappedPathData = [];
119
+ //# sourceMappingURL=scale9ShapeCommands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scale9ShapeCommands.js","sourceRoot":"","sources":["../src/scale9ShapeCommands.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flighthq/shape",
3
- "version": "0.3.0-next.1530.70058bd",
3
+ "version": "0.3.0-next.1560.03a2b36",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/flighthq/flight.git",
@@ -36,11 +36,11 @@
36
36
  "clean:dist": "tsx ../../scripts/clean-package-dist.ts"
37
37
  },
38
38
  "dependencies": {
39
- "@flighthq/scene2d": "0.3.0-next.1530.70058bd",
40
- "@flighthq/geometry": "0.3.0-next.1530.70058bd",
41
- "@flighthq/node": "0.3.0-next.1530.70058bd",
42
- "@flighthq/path": "0.3.0-next.1530.70058bd",
43
- "@flighthq/types": "0.3.0-next.1530.70058bd"
39
+ "@flighthq/scene2d": "0.3.0-next.1560.03a2b36",
40
+ "@flighthq/geometry": "0.3.0-next.1560.03a2b36",
41
+ "@flighthq/node": "0.3.0-next.1560.03a2b36",
42
+ "@flighthq/path": "0.3.0-next.1560.03a2b36",
43
+ "@flighthq/types": "0.3.0-next.1560.03a2b36"
44
44
  },
45
45
  "devDependencies": {
46
46
  "typescript": "^5.3.0"
@@ -0,0 +1,64 @@
1
+ import type { ShapeCommandToken } from '@flighthq/types/contract';
2
+
3
+ import { createScale9Shape } from './scale9Shape';
4
+ import { mapScale9ShapeCommands } from './scale9ShapeCommands';
5
+ import { appendShapeBeginFill, appendShapeRectangle } from './shapeCommands';
6
+
7
+ const grid = { x: 10, y: 10, width: 80, height: 80 };
8
+
9
+ describe('mapScale9ShapeCommands', () => {
10
+ const out: ShapeCommandToken[] = [];
11
+
12
+ it('passes style commands through unchanged', () => {
13
+ const mapper = { mapX: (x: number) => x, mapY: (y: number) => y };
14
+ mapScale9ShapeCommands(out, ['beginFill', 2, 0xff0000, 1], mapper);
15
+ expect(out).toEqual(['beginFill', 2, 0xff0000, 1]);
16
+ });
17
+
18
+ it('remaps moveTo coordinates', () => {
19
+ const mapper = { mapX: (x: number) => x * 2, mapY: (y: number) => y * 3 };
20
+ mapScale9ShapeCommands(out, ['moveTo', 2, 10, 20], mapper);
21
+ expect(out).toEqual(['moveTo', 2, 20, 60]);
22
+ });
23
+
24
+ it('remaps lineTo coordinates', () => {
25
+ const mapper = { mapX: (x: number) => x + 5, mapY: (y: number) => y + 10 };
26
+ mapScale9ShapeCommands(out, ['lineTo', 2, 100, 50], mapper);
27
+ expect(out).toEqual(['lineTo', 2, 105, 60]);
28
+ });
29
+
30
+ it('remaps drawRectangle corners and recomputes size', () => {
31
+ const mapper = { mapX: (x: number) => x * 2, mapY: (y: number) => y * 2 };
32
+ mapScale9ShapeCommands(out, ['drawRectangle', 4, 10, 20, 50, 30], mapper);
33
+ // x=10→20, y=20→40, x+w=60→120 (w=100), y+h=50→100 (h=60)
34
+ expect(out).toEqual(['drawRectangle', 4, 20, 40, 100, 60]);
35
+ });
36
+
37
+ it('remaps drawRoundRectangle corners but leaves ellipse radii unchanged', () => {
38
+ const mapper = { mapX: (x: number) => x * 2, mapY: (y: number) => y * 2 };
39
+ mapScale9ShapeCommands(out, ['drawRoundRectangle', 6, 10, 20, 50, 30, 8, 8], mapper);
40
+ expect(out).toEqual(['drawRoundRectangle', 6, 20, 40, 100, 60, 8, 8]);
41
+ });
42
+
43
+ it('remaps drawCircle center but leaves radius unchanged', () => {
44
+ const mapper = { mapX: (x: number) => x + 5, mapY: (y: number) => y + 10 };
45
+ mapScale9ShapeCommands(out, ['drawCircle', 3, 50, 50, 25], mapper);
46
+ expect(out).toEqual(['drawCircle', 3, 55, 60, 25]);
47
+ });
48
+
49
+ it('remaps drawEllipse corners and recomputes size', () => {
50
+ const mapper = { mapX: (x: number) => x * 2, mapY: (y: number) => y * 2 };
51
+ mapScale9ShapeCommands(out, ['drawEllipse', 4, 0, 0, 100, 50], mapper);
52
+ expect(out).toEqual(['drawEllipse', 4, 0, 0, 200, 100]);
53
+ });
54
+
55
+ it('returns a buffer with the same element count as the input', () => {
56
+ const shape = createScale9Shape(grid);
57
+ appendShapeBeginFill(shape, 0xff0000);
58
+ appendShapeRectangle(shape, 0, 0, 100, 100);
59
+ // A mapper is any pair of coordinate functions; building one from a grid is a renderer's job, and
60
+ // the rewrite under test does not care where the mapping came from.
61
+ mapScale9ShapeCommands(out, shape.data.commands, { mapX: (x) => x * 2, mapY: (y) => y * 2 });
62
+ expect(out).toHaveLength(shape.data.commands.length);
63
+ });
64
+ });