@flighthq/displayobject 0.1.0 → 0.2.1-next.410.a23f189

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.
@@ -1,8 +1,12 @@
1
- import type { ClipRegion, DisplayObject, DisplayObjectDataFactory, DisplayObjectRuntime, DisplayObjectRuntimeFactory, Kind, MethodsOf, NodeAny, PartialNode } from '@flighthq/types';
1
+ import type { Adjustment, ClipRegion, ColorTransform, DisplayObject, DisplayObjectDataFactory, DisplayObjectRuntime, DisplayObjectRuntimeFactory, Kind, MethodsOf, NodeAny, PartialNode } from '@flighthq/types';
2
+ export declare function addDisplayObjectColorAdjustment(source: DisplayObject, adjustment: Adjustment): void;
2
3
  export declare function createDisplayObject(obj?: Readonly<PartialNode<DisplayObject>>): DisplayObject;
3
4
  export declare function createDisplayObjectGeneric<R extends DisplayObjectRuntime>(kind: Kind, obj?: Readonly<PartialNode<DisplayObject>>, createData?: DisplayObjectDataFactory, createDisplayObjectRuntimeFactory?: DisplayObjectRuntimeFactory<R>): DisplayObject;
4
5
  export declare function createDisplayObjectRuntime(methods?: Readonly<Partial<MethodsOf<DisplayObjectRuntime>>>): DisplayObjectRuntime;
6
+ export declare function getDisplayObjectColorAdjustments(source: Readonly<DisplayObject>): readonly Adjustment[] | null;
5
7
  export declare function getDisplayObjectRuntime(source: Readonly<DisplayObject>): Readonly<DisplayObjectRuntime>;
6
8
  export declare function isDisplayObject(node: NodeAny): node is DisplayObject;
7
9
  export declare function setDisplayObjectClip(source: DisplayObject, value: ClipRegion | null): void;
10
+ export declare function setDisplayObjectColorAdjustments(source: DisplayObject, value: readonly Adjustment[] | null): void;
11
+ export declare function setDisplayObjectColorTransform(source: DisplayObject, colorTransform: Readonly<ColorTransform> | null): void;
8
12
  //# sourceMappingURL=displayObject.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"displayObject.d.ts","sourceRoot":"","sources":["../src/displayObject.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EACV,UAAU,EACV,aAAa,EACb,wBAAwB,EACxB,oBAAoB,EACpB,2BAA2B,EAC3B,IAAI,EACJ,SAAS,EACT,OAAO,EAEP,WAAW,EACZ,MAAM,iBAAiB,CAAC;AAGzB,wBAAgB,mBAAmB,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,GAAG,aAAa,CAE7F;AAED,wBAAgB,0BAA0B,CAAC,CAAC,SAAS,oBAAoB,EACvE,IAAI,EAAE,IAAI,EACV,GAAG,CAAC,EAAE,QAAQ,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,EAC1C,UAAU,CAAC,EAAE,wBAAwB,EACrC,iCAAiC,CAAC,EAAE,2BAA2B,CAAC,CAAC,CAAC,GACjE,aAAa,CAaf;AAED,wBAAgB,0BAA0B,CACxC,OAAO,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC,CAAC,GAC3D,oBAAoB,CAMtB;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,QAAQ,CAAC,aAAa,CAAC,GAAG,QAAQ,CAAC,oBAAoB,CAAC,CAEvG;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,aAAa,CAEpE;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI,GAAG,IAAI,CAG1F"}
1
+ {"version":3,"file":"displayObject.d.ts","sourceRoot":"","sources":["../src/displayObject.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EACV,UAAU,EACV,UAAU,EACV,cAAc,EACd,aAAa,EACb,wBAAwB,EACxB,oBAAoB,EACpB,2BAA2B,EAC3B,IAAI,EACJ,SAAS,EACT,OAAO,EAEP,WAAW,EACZ,MAAM,iBAAiB,CAAC;AAMzB,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,GAAG,IAAI,CAMnG;AAED,wBAAgB,mBAAmB,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,GAAG,aAAa,CAE7F;AAED,wBAAgB,0BAA0B,CAAC,CAAC,SAAS,oBAAoB,EACvE,IAAI,EAAE,IAAI,EACV,GAAG,CAAC,EAAE,QAAQ,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,EAC1C,UAAU,CAAC,EAAE,wBAAwB,EACrC,iCAAiC,CAAC,EAAE,2BAA2B,CAAC,CAAC,CAAC,GACjE,aAAa,CAcf;AAED,wBAAgB,0BAA0B,CACxC,OAAO,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC,CAAC,GAC3D,oBAAoB,CAOtB;AAID,wBAAgB,gCAAgC,CAAC,MAAM,EAAE,QAAQ,CAAC,aAAa,CAAC,GAAG,SAAS,UAAU,EAAE,GAAG,IAAI,CAE9G;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,QAAQ,CAAC,aAAa,CAAC,GAAG,QAAQ,CAAC,oBAAoB,CAAC,CAEvG;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,aAAa,CAEpE;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI,GAAG,IAAI,CAG1F;AAMD,wBAAgB,gCAAgC,CAAC,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,SAAS,UAAU,EAAE,GAAG,IAAI,GAAG,IAAI,CAKjH;AAKD,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,aAAa,EACrB,cAAc,EAAE,QAAQ,CAAC,cAAc,CAAC,GAAG,IAAI,GAC9C,IAAI,CAKN"}
@@ -1,5 +1,17 @@
1
- import { createNode, createNodeRuntime, getNodeRuntime, initAppearanceTrait, initBoundsRectangleRuntimeTrait, initBoundsRectangleTrait, initClipTrait, initMaterialTrait, initTransform2DRuntimeTrait, initTransform2DTrait, invalidateNodeAppearance, } from '@flighthq/node';
1
+ import { COLOR_ADJUSTMENT_CHANNEL_MIXING, COLOR_ADJUSTMENT_NONE, createColorTransformAdjustment, resolveColorAdjustmentsColorTransform, } from '@flighthq/adjustments';
2
+ import { createColorTransform } from '@flighthq/materials';
3
+ import { createNode, createNodeRuntime, getNodeRuntime, initAppearanceTrait, initBlendModeTrait, initBoundsRectangleRuntimeTrait, initBoundsRectangleTrait, initClipTrait, initMaterialTrait, initTransform2DRuntimeTrait, initTransform2DTrait, invalidateNodeAppearance, } from '@flighthq/node';
2
4
  import { DisplayObjectKind, DisplayObjectTraitsKey } from '@flighthq/types';
5
+ // Appends one pointwise color adjustment to this object's stack (creating the stack if absent), re-fuses
6
+ // the resolved cache, and invalidates appearance so the render walk hands the fold the new value.
7
+ // Allocates a new array — the stack is a plain `readonly Adjustment[]`, never mutated in place.
8
+ export function addDisplayObjectColorAdjustment(source, adjustment) {
9
+ const runtime = getNodeRuntime(source);
10
+ const current = runtime.colorAdjustments;
11
+ runtime.colorAdjustments = current === null ? [adjustment] : [...current, adjustment];
12
+ resolveDisplayObjectColorAdjustments(runtime);
13
+ invalidateNodeAppearance(source);
14
+ }
3
15
  export function createDisplayObject(obj) {
4
16
  return createDisplayObjectGeneric(DisplayObjectKind, obj);
5
17
  }
@@ -8,6 +20,7 @@ export function createDisplayObjectGeneric(kind, obj, createData, createDisplayO
8
20
  initTransform2DTrait(out, obj);
9
21
  initBoundsRectangleTrait(out, obj);
10
22
  initAppearanceTrait(out, obj);
23
+ initBlendModeTrait(out, obj);
11
24
  initMaterialTrait(out, obj);
12
25
  initClipTrait(out, obj);
13
26
  return out;
@@ -15,10 +28,16 @@ export function createDisplayObjectGeneric(kind, obj, createData, createDisplayO
15
28
  export function createDisplayObjectRuntime(methods) {
16
29
  const out = createNodeRuntime(methods);
17
30
  out.traits = DisplayObjectTraitsKey;
31
+ out.stage = null;
18
32
  initTransform2DRuntimeTrait(out, methods);
19
33
  initBoundsRectangleRuntimeTrait(out, methods);
20
34
  return out;
21
35
  }
36
+ // Returns this object's pointwise color-adjustment stack (the source of truth on the node runtime), or
37
+ // null when it carries none.
38
+ export function getDisplayObjectColorAdjustments(source) {
39
+ return getNodeRuntime(source).colorAdjustments;
40
+ }
22
41
  export function getDisplayObjectRuntime(source) {
23
42
  return getNodeRuntime(source);
24
43
  }
@@ -29,4 +48,42 @@ export function setDisplayObjectClip(source, value) {
29
48
  source.clip = value;
30
49
  invalidateNodeAppearance(source);
31
50
  }
51
+ // Sets (or clears with null) this object's pointwise color-adjustment stack — the generic replacement for
52
+ // the removed color-transform trait. A color transform is one member: `createColorTransformAdjustment`.
53
+ // Re-fuses the resolved cache once here (not per frame) and invalidates appearance so the render walk
54
+ // hands the fold the affine ColorTransform the stack resolves to. Null is the untinted default.
55
+ export function setDisplayObjectColorAdjustments(source, value) {
56
+ const runtime = getNodeRuntime(source);
57
+ runtime.colorAdjustments = value;
58
+ resolveDisplayObjectColorAdjustments(runtime);
59
+ invalidateNodeAppearance(source);
60
+ }
61
+ // Convenience for the common single-tint path (the color-transform an agent looks for): sets this object's
62
+ // adjustment stack to one `ColorTransformAdjustment`, or clears it with null. Thin wrapper over
63
+ // `setDisplayObjectColorAdjustments` — a color transform is just one adjustment in the generic stack.
64
+ export function setDisplayObjectColorTransform(source, colorTransform) {
65
+ setDisplayObjectColorAdjustments(source, colorTransform === null ? null : [createColorTransformAdjustment(colorTransform)]);
66
+ }
67
+ // Fuses the runtime's color-adjustment stack once into its cached affine `resolvedColorTransform`, setting
68
+ // `colorAdjustmentsChannelMixing` when the fused stack has off-diagonal channel-mixing terms the 8-float
69
+ // fold cannot represent yet (the render walk reports that through the shakeable guard). Called by the
70
+ // accessors on change — the render walk only reads the cache, so no fuse math weighs on the base render
71
+ // path. The cached ColorTransform is reused in place across re-fuses to avoid per-set allocation churn.
72
+ function resolveDisplayObjectColorAdjustments(runtime) {
73
+ const adjustments = runtime.colorAdjustments;
74
+ if (adjustments === null || adjustments.length === 0) {
75
+ runtime.resolvedColorTransform = null;
76
+ runtime.colorAdjustmentsChannelMixing = false;
77
+ return;
78
+ }
79
+ const out = runtime.resolvedColorTransform ?? createColorTransform();
80
+ const status = resolveColorAdjustmentsColorTransform(adjustments, out);
81
+ if (status === COLOR_ADJUSTMENT_NONE) {
82
+ runtime.resolvedColorTransform = null;
83
+ runtime.colorAdjustmentsChannelMixing = false;
84
+ return;
85
+ }
86
+ runtime.resolvedColorTransform = out;
87
+ runtime.colorAdjustmentsChannelMixing = status === COLOR_ADJUSTMENT_CHANNEL_MIXING;
88
+ }
32
89
  //# sourceMappingURL=displayObject.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"displayObject.js","sourceRoot":"","sources":["../src/displayObject.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,iBAAiB,EACjB,cAAc,EACd,mBAAmB,EACnB,+BAA+B,EAC/B,wBAAwB,EACxB,aAAa,EACb,iBAAiB,EACjB,2BAA2B,EAC3B,oBAAoB,EACpB,wBAAwB,GACzB,MAAM,gBAAgB,CAAC;AAaxB,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAE5E,MAAM,UAAU,mBAAmB,CAAC,GAA0C;IAC5E,OAAO,0BAA0B,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,IAAU,EACV,GAA0C,EAC1C,UAAqC,EACrC,iCAAkE;IAElE,MAAM,GAAG,GAAG,UAAU,CACpB,IAAI,EACJ,GAAG,EACH,UAAU,EACV,iCAAiC,IAAK,0BAA+D,CACrF,CAAC;IACnB,oBAAoB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC/B,wBAAwB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACnC,mBAAmB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC9B,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC5B,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACxB,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,OAA4D;IAE5D,MAAM,GAAG,GAAG,iBAAiB,CAAC,OAAO,CAAyB,CAAC;IAC/D,GAAG,CAAC,MAAM,GAAG,sBAAsB,CAAC;IACpC,2BAA2B,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC1C,+BAA+B,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC9C,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,MAA+B;IACrE,OAAO,cAAc,CAAC,MAAM,CAAyB,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAa;IAC3C,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,sBAAsB,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAqB,EAAE,KAAwB;IAClF,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC;IACpB,wBAAwB,CAAC,MAAM,CAAC,CAAC;AACnC,CAAC"}
1
+ {"version":3,"file":"displayObject.js","sourceRoot":"","sources":["../src/displayObject.ts"],"names":[],"mappings":"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"}
package/dist/stage.d.ts CHANGED
@@ -1,7 +1,5 @@
1
- import type { DisplayObject, Node, PartialNode, Rectangle, Stage, StageData, StageRuntime, StageSignals } from '@flighthq/types';
2
- export declare function computeStageLocalBoundsRectangle(out: Rectangle, source: Readonly<Node>): void;
3
- export declare function createStage(obj?: Readonly<PartialNode<Stage>>): Stage;
4
- export declare function createStageData(data?: Readonly<Partial<StageData>>): StageData;
1
+ import type { DisplayObject, Stage, StageRuntime, StageSignals } from '@flighthq/types';
2
+ export declare function createStage(obj?: Readonly<Partial<Pick<Stage, 'align' | 'color' | 'scaleMode' | 'stageHeight' | 'stageWidth'>>>): Stage;
5
3
  export declare function createStageRuntime(): StageRuntime;
6
4
  export declare function createStageSignals(): StageSignals;
7
5
  export declare function enableStageSignals(source: Stage): StageSignals;
@@ -1 +1 @@
1
- {"version":3,"file":"stage.d.ts","sourceRoot":"","sources":["../src/stage.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,aAAa,EAEb,IAAI,EACJ,WAAW,EACX,SAAS,EACT,KAAK,EACL,SAAS,EACT,YAAY,EACZ,YAAY,EACb,MAAM,iBAAiB,CAAC;AAKzB,wBAAgB,gCAAgC,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,CAI7F;AAED,wBAAgB,WAAW,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,CAErE;AAED,wBAAgB,eAAe,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,GAAG,SAAS,CAM9E;AAED,wBAAgB,kBAAkB,IAAI,YAAY,CAIjD;AAED,wBAAgB,kBAAkB,IAAI,YAAY,CAMjD;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,KAAK,GAAG,YAAY,CAG9D;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,QAAQ,CAAC,aAAa,CAAC,GAAG,KAAK,GAAG,IAAI,CAGnF;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC,YAAY,CAAC,CAE/E;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,YAAY,GAAG,IAAI,CAE5E;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAO/E"}
1
+ {"version":3,"file":"stage.d.ts","sourceRoot":"","sources":["../src/stage.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,aAAa,EAGb,KAAK,EACL,YAAY,EACZ,YAAY,EACb,MAAM,iBAAiB,CAAC;AAUzB,wBAAgB,WAAW,CACzB,GAAG,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,GAAG,WAAW,GAAG,aAAa,GAAG,YAAY,CAAC,CAAC,CAAC,GACnG,KAAK,CAQP;AAED,wBAAgB,kBAAkB,IAAI,YAAY,CAKjD;AAED,wBAAgB,kBAAkB,IAAI,YAAY,CAMjD;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,KAAK,GAAG,YAAY,CAG9D;AAID,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,QAAQ,CAAC,aAAa,CAAC,GAAG,KAAK,GAAG,IAAI,CAGnF;AAID,wBAAgB,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC,YAAY,CAAC,CAE/E;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,YAAY,GAAG,IAAI,CAG5E;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAM/E"}
package/dist/stage.js CHANGED
@@ -1,27 +1,27 @@
1
- import { getNodeRoot, invalidateNodeLocalBounds } from '@flighthq/node';
1
+ import { createViewport, getNodeRoot, getNodeRuntime } from '@flighthq/node';
2
2
  import { createSignal, emitSignal } from '@flighthq/signals';
3
- import { EntityRuntimeKey, StageKind } from '@flighthq/types';
4
- import { createDisplayObjectGeneric, createDisplayObjectRuntime, getDisplayObjectRuntime } from './displayObject';
5
- export function computeStageLocalBoundsRectangle(out, source) {
6
- const data = source.data;
7
- out.width = data.stageWidth;
8
- out.height = data.stageHeight;
9
- }
3
+ import { EntityRuntimeKey } from '@flighthq/types';
4
+ import { createDisplayObject } from './displayObject';
5
+ // Allocates a Stage: a presentation-context Entity that owns a display-object `root` (allocated here), not a
6
+ // node in the tree. Composes createViewport for the shared root/align/scaleMode base, then layers on the
7
+ // stage-only view dimensions and background color. The entity runtime stays unbound (createViewport →
8
+ // createEntity); the root's runtime carries a back-pointer so getDisplayObjectStage resolves membership by a
9
+ // lazy walk to the root.
10
10
  export function createStage(obj) {
11
- return createDisplayObjectGeneric(StageKind, obj, createStageData, createStageRuntime);
11
+ const root = createDisplayObject();
12
+ const stage = createViewport({ align: obj?.align, root, scaleMode: obj?.scaleMode });
13
+ stage.color = obj?.color ?? null;
14
+ stage.stageHeight = obj?.stageHeight ?? 550;
15
+ stage.stageWidth = obj?.stageWidth ?? 400;
16
+ getNodeRuntime(root).stage = stage;
17
+ return stage;
12
18
  }
13
- export function createStageData(data) {
19
+ export function createStageRuntime() {
14
20
  return {
15
- color: data?.color ?? null,
16
- stageHeight: data?.stageHeight ?? 550,
17
- stageWidth: data?.stageWidth ?? 400,
21
+ binding: null,
22
+ stageSignals: null,
18
23
  };
19
24
  }
20
- export function createStageRuntime() {
21
- const out = createDisplayObjectRuntime(defaultMethods);
22
- out.stageSignals = null;
23
- return out;
24
- }
25
25
  export function createStageSignals() {
26
26
  return {
27
27
  onFullscreenChanged: createSignal(),
@@ -30,30 +30,39 @@ export function createStageSignals() {
30
30
  };
31
31
  }
32
32
  export function enableStageSignals(source) {
33
- const runtime = source[EntityRuntimeKey];
33
+ const runtime = ensureStageRuntime(source);
34
34
  return (runtime.stageSignals ??= createStageSignals());
35
35
  }
36
+ // Resolves the Stage a display object belongs to, or null when its root is not owned by a stage. Walks to the
37
+ // root (a cheap parent walk) and reads the stage back-pointer the root runtime carries.
36
38
  export function getDisplayObjectStage(source) {
37
39
  const root = getNodeRoot(source);
38
- return root.kind === StageKind ? root : null;
40
+ return getNodeRuntime(root).stage;
39
41
  }
42
+ // The stage's runtime, allocated on first access (the entity is created unbound). Callers that only read
43
+ // enabled signals should use getStageSignals, which does not allocate.
40
44
  export function getStageRuntime(source) {
41
- return getDisplayObjectRuntime(source);
45
+ return ensureStageRuntime(source);
42
46
  }
43
47
  export function getStageSignals(source) {
44
- return source[EntityRuntimeKey].stageSignals;
48
+ const runtime = source[EntityRuntimeKey];
49
+ return runtime?.stageSignals ?? null;
45
50
  }
46
51
  export function setStageSize(source, width, height) {
47
- if (source.data.stageWidth === width && source.data.stageHeight === height)
52
+ if (source.stageWidth === width && source.stageHeight === height)
48
53
  return;
49
- source.data.stageWidth = width;
50
- source.data.stageHeight = height;
51
- invalidateNodeLocalBounds(source);
54
+ source.stageWidth = width;
55
+ source.stageHeight = height;
52
56
  const runtime = source[EntityRuntimeKey];
53
- if (runtime.stageSignals)
57
+ if (runtime?.stageSignals)
54
58
  emitSignal(runtime.stageSignals.onResize);
55
59
  }
56
- const defaultMethods = {
57
- computeLocalBoundsRectangle: computeStageLocalBoundsRectangle,
58
- };
60
+ function ensureStageRuntime(source) {
61
+ const existing = source[EntityRuntimeKey];
62
+ if (existing !== undefined)
63
+ return existing;
64
+ const runtime = createStageRuntime();
65
+ source[EntityRuntimeKey] = runtime;
66
+ return runtime;
67
+ }
59
68
  //# sourceMappingURL=stage.js.map
package/dist/stage.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"stage.js","sourceRoot":"","sources":["../src/stage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AACxE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAY7D,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE9D,OAAO,EAAE,0BAA0B,EAAE,0BAA0B,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAElH,MAAM,UAAU,gCAAgC,CAAC,GAAc,EAAE,MAAsB;IACrF,MAAM,IAAI,GAAI,MAAgB,CAAC,IAAI,CAAC;IACpC,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC;IAC5B,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,GAAkC;IAC5D,OAAO,0BAA0B,CAAC,SAAS,EAAE,GAAG,EAAE,eAAe,EAAE,kBAAkB,CAAU,CAAC;AAClG,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAmC;IACjE,OAAO;QACL,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,IAAI;QAC1B,WAAW,EAAE,IAAI,EAAE,WAAW,IAAI,GAAG;QACrC,UAAU,EAAE,IAAI,EAAE,UAAU,IAAI,GAAG;KACpC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,MAAM,GAAG,GAAG,0BAA0B,CAAC,cAAc,CAAiB,CAAC;IACvE,GAAG,CAAC,YAAY,GAAG,IAAI,CAAC;IACxB,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO;QACL,mBAAmB,EAAE,YAAY,EAAE;QACnC,oBAAoB,EAAE,YAAY,EAAE;QACpC,QAAQ,EAAE,YAAY,EAAE;KACzB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAAa;IAC9C,MAAM,OAAO,GAAG,MAAM,CAAC,gBAAgB,CAAiB,CAAC;IACzD,OAAO,CAAC,OAAO,CAAC,YAAY,KAAK,kBAAkB,EAAE,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAA+B;IACnE,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IACjC,OAAO,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAE,IAAc,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAuB;IACrD,OAAO,uBAAuB,CAAC,MAAM,CAAiB,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAuB;IACrD,OAAQ,MAAM,CAAC,gBAAgB,CAAkB,CAAC,YAAY,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAa,EAAE,KAAa,EAAE,MAAc;IACvE,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,KAAK,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,KAAK,MAAM;QAAE,OAAO;IACnF,MAAM,CAAC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IAC/B,MAAM,CAAC,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC;IACjC,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAClC,MAAM,OAAO,GAAG,MAAM,CAAC,gBAAgB,CAAiB,CAAC;IACzD,IAAI,OAAO,CAAC,YAAY;QAAE,UAAU,CAAC,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,cAAc,GAAqC;IACvD,2BAA2B,EAAE,gCAAgC;CAC9D,CAAC"}
1
+ {"version":3,"file":"stage.js","sourceRoot":"","sources":["../src/stage.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,11 @@
1
1
  {
2
2
  "name": "@flighthq/displayobject",
3
- "version": "0.1.0",
3
+ "version": "0.2.1-next.410.a23f189",
4
+ "repository": {
5
+ "type": "git",
6
+ "url": "https://github.com/flighthq/flight.git",
7
+ "directory": "packages/displayobject"
8
+ },
4
9
  "type": "module",
5
10
  "main": "dist/index.js",
6
11
  "types": "dist/index.d.ts",
@@ -27,10 +32,12 @@
27
32
  "clean:dist": "tsx ../../scripts/clean-package-dist.ts"
28
33
  },
29
34
  "dependencies": {
30
- "@flighthq/geometry": "0.1.0",
31
- "@flighthq/node": "0.1.0",
32
- "@flighthq/signals": "0.1.0",
33
- "@flighthq/types": "0.1.0"
35
+ "@flighthq/adjustments": "0.2.1-next.410.a23f189",
36
+ "@flighthq/geometry": "0.2.1-next.410.a23f189",
37
+ "@flighthq/materials": "0.2.1-next.410.a23f189",
38
+ "@flighthq/node": "0.2.1-next.410.a23f189",
39
+ "@flighthq/signals": "0.2.1-next.410.a23f189",
40
+ "@flighthq/types": "0.2.1-next.410.a23f189"
34
41
  },
35
42
  "devDependencies": {
36
43
  "@flighthq/entity": "*",
@@ -1,5 +1,6 @@
1
1
  import { getEntityRuntime } from '@flighthq/entity';
2
2
  import { createRectangle } from '@flighthq/geometry';
3
+ import { getNodeLocalBoundsRevision, getNodeLocalContentRevision, getNodeLocalTransformRevision } from '@flighthq/node';
3
4
  import type { Bitmap, BitmapRuntime, ImageResource, Node } from '@flighthq/types';
4
5
  import { BitmapKind } from '@flighthq/types';
5
6
 
@@ -1,4 +1,5 @@
1
1
  import { getEntityRuntime } from '@flighthq/entity';
2
+ import { createColorTransform } from '@flighthq/materials';
2
3
  import type {
3
4
  BoundsNode,
4
5
  DisplayObject,
@@ -10,18 +11,47 @@ import type {
10
11
  import { BlendMode, DisplayObjectKind, DisplayObjectTraitsKey } from '@flighthq/types';
11
12
 
12
13
  import {
14
+ addDisplayObjectColorAdjustment,
13
15
  createDisplayObject,
14
16
  createDisplayObjectGeneric,
15
17
  createDisplayObjectRuntime,
18
+ getDisplayObjectColorAdjustments,
16
19
  getDisplayObjectRuntime,
17
20
  isDisplayObject,
18
21
  setDisplayObjectClip,
22
+ setDisplayObjectColorAdjustments,
23
+ setDisplayObjectColorTransform,
19
24
  } from './displayObject';
20
25
 
21
26
  function getRuntime_(obj: DisplayObject): DisplayObjectRuntime {
22
27
  return getEntityRuntime(obj) as DisplayObjectRuntime;
23
28
  }
24
29
 
30
+ describe('addDisplayObjectColorAdjustment', () => {
31
+ let obj: DisplayObject;
32
+ beforeEach(() => {
33
+ obj = createDisplayObject();
34
+ });
35
+
36
+ it('appends to a fresh (null) stack and invalidates appearance', () => {
37
+ const idBefore = getRuntime_(obj).appearanceId;
38
+ const adjustment = { kind: 'ColorTransformAdjustment' } as never;
39
+ addDisplayObjectColorAdjustment(obj, adjustment);
40
+ expect(getDisplayObjectColorAdjustments(obj)).toEqual([adjustment]);
41
+ expect(getRuntime_(obj).appearanceId).not.toBe(idBefore);
42
+ });
43
+
44
+ it('appends to an existing stack without mutating the previous array', () => {
45
+ const a = { kind: 'A' } as never;
46
+ const b = { kind: 'B' } as never;
47
+ addDisplayObjectColorAdjustment(obj, a);
48
+ const first = getDisplayObjectColorAdjustments(obj);
49
+ addDisplayObjectColorAdjustment(obj, b);
50
+ expect(getDisplayObjectColorAdjustments(obj)).toEqual([a, b]);
51
+ expect(first).toEqual([a]); // the earlier array was not mutated
52
+ });
53
+ });
54
+
25
55
  describe('createDisplayObject', () => {
26
56
  let displayObject: DisplayObject;
27
57
 
@@ -113,6 +143,12 @@ describe('createDisplayObjectRuntime', () => {
113
143
  });
114
144
  });
115
145
 
146
+ describe('getDisplayObjectColorAdjustments', () => {
147
+ it('defaults to null on a fresh node', () => {
148
+ expect(getDisplayObjectColorAdjustments(createDisplayObject())).toBeNull();
149
+ });
150
+ });
151
+
116
152
  describe('getDisplayObjectRuntime', () => {
117
153
  it('returns the runtime for a DisplayObject', () => {
118
154
  const obj = createDisplayObject();
@@ -161,6 +197,44 @@ describe('setDisplayObjectClip', () => {
161
197
  });
162
198
  });
163
199
 
200
+ describe('setDisplayObjectColorAdjustments', () => {
201
+ let obj: DisplayObject;
202
+ beforeEach(() => {
203
+ obj = createDisplayObject();
204
+ });
205
+
206
+ it('sets the stack and invalidates appearance', () => {
207
+ const idBefore = getRuntime_(obj).appearanceId;
208
+ const stack = [{ kind: 'ColorTransformAdjustment' }] as never;
209
+ setDisplayObjectColorAdjustments(obj, stack);
210
+ expect(getDisplayObjectColorAdjustments(obj)).toBe(stack);
211
+ expect(getRuntime_(obj).appearanceId).not.toBe(idBefore);
212
+ });
213
+
214
+ it('accepts null', () => {
215
+ setDisplayObjectColorAdjustments(obj, [{ kind: 'ColorTransformAdjustment' }] as never);
216
+ setDisplayObjectColorAdjustments(obj, null);
217
+ expect(getDisplayObjectColorAdjustments(obj)).toBeNull();
218
+ });
219
+ });
220
+
221
+ describe('setDisplayObjectColorTransform', () => {
222
+ it('wraps a color transform as one ColorTransformAdjustment on the stack', () => {
223
+ const obj = createDisplayObject();
224
+ setDisplayObjectColorTransform(obj, createColorTransform({ redMultiplier: 0.5 }));
225
+ const stack = getDisplayObjectColorAdjustments(obj);
226
+ expect(stack?.length).toBe(1);
227
+ expect(stack?.[0].kind).toBe('ColorTransformAdjustment');
228
+ });
229
+
230
+ it('clears with null', () => {
231
+ const obj = createDisplayObject();
232
+ setDisplayObjectColorTransform(obj, createColorTransform({ redMultiplier: 0.5 }));
233
+ setDisplayObjectColorTransform(obj, null);
234
+ expect(getDisplayObjectColorAdjustments(obj)).toBeNull();
235
+ });
236
+ });
237
+
164
238
  interface DisplayObjectTest extends DisplayObject {}
165
239
 
166
240
  interface DisplayObjectTestData extends DisplayObjectData {
package/src/stage.test.ts CHANGED
@@ -1,14 +1,10 @@
1
- import { createRectangle } from '@flighthq/geometry';
2
1
  import { addNodeChild } from '@flighthq/node';
3
2
  import { connectSignal } from '@flighthq/signals';
4
- import type { Node, PartialNode, Stage } from '@flighthq/types';
5
- import { StageKind } from '@flighthq/types';
3
+ import type { Stage } from '@flighthq/types';
6
4
 
7
5
  import { createDisplayObject } from './displayObject';
8
6
  import {
9
- computeStageLocalBoundsRectangle,
10
7
  createStage,
11
- createStageData,
12
8
  createStageRuntime,
13
9
  createStageSignals,
14
10
  enableStageSignals,
@@ -18,16 +14,6 @@ import {
18
14
  setStageSize,
19
15
  } from './stage';
20
16
 
21
- describe('computeStageLocalBoundsRectangle', () => {
22
- it('sets out dimensions from stageWidth and stageHeight', () => {
23
- const stage = createStage({ data: { stageWidth: 800, stageHeight: 600 } });
24
- const out = createRectangle();
25
- computeStageLocalBoundsRectangle(out, stage as unknown as Node);
26
- expect(out.width).toBe(800);
27
- expect(out.height).toBe(600);
28
- });
29
- });
30
-
31
17
  describe('createStage', () => {
32
18
  let stage: Stage;
33
19
 
@@ -36,58 +22,31 @@ describe('createStage', () => {
36
22
  });
37
23
 
38
24
  it('initializes default values', () => {
39
- expect(stage.data.color).toBe(null);
40
- expect(stage.data.stageHeight).toBe(550);
41
- expect(stage.data.stageWidth).toBe(400);
42
- expect(stage.kind).toStrictEqual(StageKind);
43
- });
44
-
45
- it('allows pre-defined values', () => {
46
- const base: PartialNode<Stage> = {
47
- data: {
48
- color: 0xff0000ff,
49
- stageHeight: 1000,
50
- stageWidth: 2000,
51
- },
52
- };
53
- const obj = createStage(base);
54
- const data = base.data!;
55
- expect(obj.data.color).toStrictEqual(data.color);
56
- expect(obj.data.stageHeight).toStrictEqual(data.stageHeight);
57
- expect(obj.data.stageWidth).toStrictEqual(data.stageWidth);
58
- });
59
-
60
- it('returns a new object for better hidden-class performance', () => {
61
- const base = {};
62
- const obj = createStage(base);
63
- expect(obj).not.toStrictEqual(base);
25
+ expect(stage.color).toBe(null);
26
+ expect(stage.stageHeight).toBe(550);
27
+ expect(stage.stageWidth).toBe(400);
28
+ expect(stage.align).toBe('topleft');
29
+ expect(stage.scaleMode).toBe('noscale');
64
30
  });
65
- });
66
31
 
67
- describe('createStageData', () => {
68
- it('returns default values', () => {
69
- const data = createStageData();
70
- expect(data.stageWidth).toBe(400);
71
- expect(data.stageHeight).toBe(550);
72
- expect(data.color).toBe(null);
32
+ it('allocates a display-object root the stage points back to', () => {
33
+ expect(stage.root).toBeDefined();
34
+ expect(getDisplayObjectStage(stage.root)).toBe(stage);
73
35
  });
74
36
 
75
37
  it('allows pre-defined values', () => {
76
- const data = createStageData({ stageWidth: 1920, stageHeight: 1080 });
77
- expect(data.stageWidth).toBe(1920);
78
- expect(data.stageHeight).toBe(1080);
38
+ const obj = createStage({ color: 0xff0000ff, stageHeight: 1000, stageWidth: 2000 });
39
+ expect(obj.color).toStrictEqual(0xff0000ff);
40
+ expect(obj.stageHeight).toStrictEqual(1000);
41
+ expect(obj.stageWidth).toStrictEqual(2000);
79
42
  });
80
43
  });
81
44
 
82
45
  describe('createStageRuntime', () => {
83
- it('returns a non-null runtime', () => {
46
+ it('returns a non-null runtime with stageSignals initialized to null', () => {
84
47
  const runtime = createStageRuntime();
85
48
  expect(runtime).not.toBeNull();
86
- });
87
-
88
- it('uses computeStageLocalBoundsRectangle', () => {
89
- const runtime = createStageRuntime();
90
- expect(runtime.computeLocalBoundsRectangle).toStrictEqual(computeStageLocalBoundsRectangle);
49
+ expect(runtime.stageSignals).toBeNull();
91
50
  });
92
51
  });
93
52
 
@@ -126,17 +85,17 @@ describe('getDisplayObjectStage', () => {
126
85
  expect(getDisplayObjectStage(obj)).toBeNull();
127
86
  });
128
87
 
129
- it('returns null when the root is not a Stage', () => {
88
+ it('returns null when the root is not owned by a Stage', () => {
130
89
  const root = createDisplayObject();
131
90
  const child = createDisplayObject();
132
91
  addNodeChild(root, child);
133
92
  expect(getDisplayObjectStage(child)).toBeNull();
134
93
  });
135
94
 
136
- it('returns the Stage when it is the root', () => {
95
+ it('returns the Stage when a child is added under its root', () => {
137
96
  const stage = createStage();
138
97
  const child = createDisplayObject();
139
- addNodeChild(stage, child);
98
+ addNodeChild(stage.root, child);
140
99
  expect(getDisplayObjectStage(child)).toBe(stage);
141
100
  });
142
101
 
@@ -144,7 +103,7 @@ describe('getDisplayObjectStage', () => {
144
103
  const stage = createStage();
145
104
  const mid = createDisplayObject();
146
105
  const leaf = createDisplayObject();
147
- addNodeChild(stage, mid);
106
+ addNodeChild(stage.root, mid);
148
107
  addNodeChild(mid, leaf);
149
108
  expect(getDisplayObjectStage(leaf)).toBe(stage);
150
109
  });
@@ -156,11 +115,6 @@ describe('getStageRuntime', () => {
156
115
  const runtime = getStageRuntime(stage);
157
116
  expect(runtime).not.toBeNull();
158
117
  });
159
-
160
- it('initializes stageSignals to null', () => {
161
- const runtime = createStageRuntime();
162
- expect(runtime.stageSignals).toBeNull();
163
- });
164
118
  });
165
119
 
166
120
  describe('getStageSignals', () => {
@@ -180,8 +134,8 @@ describe('setStageSize', () => {
180
134
  it('updates stageWidth and stageHeight', () => {
181
135
  const stage = createStage();
182
136
  setStageSize(stage, 1920, 1080);
183
- expect(stage.data.stageWidth).toBe(1920);
184
- expect(stage.data.stageHeight).toBe(1080);
137
+ expect(stage.stageWidth).toBe(1920);
138
+ expect(stage.stageHeight).toBe(1080);
185
139
  });
186
140
 
187
141
  it('emits onResize when dimensions change', () => {
@@ -195,7 +149,7 @@ describe('setStageSize', () => {
195
149
  });
196
150
 
197
151
  it('does not emit onResize when dimensions are unchanged', () => {
198
- const stage = createStage({ data: { stageWidth: 400, stageHeight: 300 } });
152
+ const stage = createStage({ stageWidth: 400, stageHeight: 300 });
199
153
  let called = false;
200
154
  connectSignal(enableStageSignals(stage).onResize, () => {
201
155
  called = true;
package/src/video.test.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import { getNodeLocalBoundsRevision, getNodeLocalContentRevision, getNodeLocalTransformRevision } from '@flighthq/node';
1
2
  import type { Video } from '@flighthq/types';
2
3
  import { VideoKind } from '@flighthq/types';
3
4
 
@@ -1,7 +0,0 @@
1
- import type { DisplayObject, Stage } from '@flighthq/types';
2
- export type DisplayObjectInternal = Omit<DisplayObject, 'children' | 'parent' | 'stage'> & {
3
- children: DisplayObject[] | null;
4
- parent: DisplayObject | null;
5
- stage: Stage | null;
6
- };
7
- //# sourceMappingURL=internal.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../src/internal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAE5D,MAAM,MAAM,qBAAqB,GAAG,IAAI,CAAC,aAAa,EAAE,UAAU,GAAG,QAAQ,GAAG,OAAO,CAAC,GAAG;IACzF,QAAQ,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC;IACjC,MAAM,EAAE,aAAa,GAAG,IAAI,CAAC;IAC7B,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;CACrB,CAAC"}
package/dist/internal.js DELETED
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=internal.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"internal.js","sourceRoot":"","sources":["../src/internal.ts"],"names":[],"mappings":""}