@flighthq/render 0.3.1-next.625.675880d → 0.3.1-next.704.69286f6
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/explainScene2DCoverage.js +5 -5
- package/dist/explainScene2DCoverage.js.map +1 -1
- package/dist/explainScene2DRender.d.ts.map +1 -1
- package/dist/explainScene2DRender.js +2 -1
- package/dist/explainScene2DRender.js.map +1 -1
- package/dist/renderProxy.d.ts.map +1 -1
- package/dist/renderProxy.js +6 -4
- package/dist/renderProxy.js.map +1 -1
- package/dist/renderState.d.ts.map +1 -1
- package/dist/renderState.js +6 -4
- package/dist/renderState.js.map +1 -1
- package/dist/renderer.d.ts.map +1 -1
- package/dist/renderer.js +36 -16
- package/dist/renderer.js.map +1 -1
- package/package.json +12 -11
- package/src/explainScene2DCoverage.test.ts +8 -3
- package/src/renderCache.test.ts +2 -1
- package/src/renderProxy.test.ts +7 -1
- package/src/renderState.test.ts +16 -5
- package/src/renderer.test.ts +96 -25
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { RenderRegistry, RequirementFacet, SceneCoverage } from '@flighthq/types/contract';
|
|
1
|
+
import { RegistryEntryState, RenderRegistry, RequirementFacet, SceneCoverage } from '@flighthq/types/contract';
|
|
2
2
|
import { getRenderStateRuntime } from './renderState';
|
|
3
3
|
// Clears `out`, then reports every requirement in `usage` that any 2D backend answers the same way,
|
|
4
4
|
// with how well this state is wired for it — satisfied entries included, so one call is a manifest.
|
|
5
5
|
//
|
|
6
6
|
// This covers the two registries that live on the BASE render-state runtime and so mean the same thing
|
|
7
|
-
// on Canvas, DOM, GL and WebGPU: the node-renderer
|
|
7
|
+
// on Canvas, DOM, GL and WebGPU: the node-renderer table every backend dispatches through, and the shape
|
|
8
8
|
// command set every backend replays through when it rasterizes. A backend adds its own specifics — GL
|
|
9
9
|
// blend realizations, per-backend material renderers — on top of this, rather than restating it.
|
|
10
10
|
//
|
|
@@ -30,7 +30,7 @@ function collectScene2DCoverageGaps(out, state, usage, stopAtFirst, catalog) {
|
|
|
30
30
|
// absent from the frame — the loudest failure in this seam and the one worth asking about first.
|
|
31
31
|
for (let i = 0; i < usage.nodeKinds.length; i++) {
|
|
32
32
|
const kind = usage.nodeKinds[i];
|
|
33
|
-
if (runtime.
|
|
33
|
+
if (runtime.registries.renderers.entries.get(kind)?.state === RegistryEntryState.Bound) {
|
|
34
34
|
out?.push({
|
|
35
35
|
coverage: SceneCoverage.Satisfied,
|
|
36
36
|
facet: RequirementFacet.SceneNodeKind,
|
|
@@ -47,10 +47,10 @@ function collectScene2DCoverageGaps(out, state, usage, stopAtFirst, catalog) {
|
|
|
47
47
|
// Only meaningful for a state that rasterizes shapes. A GL or WebGPU state drawing every shape
|
|
48
48
|
// through the mesh path never replays a command, so these entries are reported and simply not acted
|
|
49
49
|
// on — the same shape as reporting 3D node kinds a backend collects structurally.
|
|
50
|
-
const commands = runtime.
|
|
50
|
+
const commands = runtime.registries.canvasShapeCommands?.entries;
|
|
51
51
|
for (let i = 0; i < usage.shapeCommandKeys.length; i++) {
|
|
52
52
|
const kind = usage.shapeCommandKeys[i];
|
|
53
|
-
if (commands?.
|
|
53
|
+
if (commands?.get(kind)?.state === 'bound') {
|
|
54
54
|
out?.push({
|
|
55
55
|
coverage: SceneCoverage.Satisfied,
|
|
56
56
|
facet: RequirementFacet.SceneShapeCommand,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"explainScene2DCoverage.js","sourceRoot":"","sources":["../src/explainScene2DCoverage.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"explainScene2DCoverage.js","sourceRoot":"","sources":["../src/explainScene2DCoverage.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"explainScene2DRender.d.ts","sourceRoot":"","sources":["../src/explainScene2DRender.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,wBAAwB,EAExB,UAAU,EACV,WAAW,EACZ,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"explainScene2DRender.d.ts","sourceRoot":"","sources":["../src/explainScene2DRender.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,wBAAwB,EAExB,UAAU,EACV,WAAW,EACZ,MAAM,0BAA0B,CAAC;AAsBlC,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,GAAG,wBAAwB,CAoBrG"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { RegistryEntryState } from '@flighthq/types/contract';
|
|
1
2
|
import { getRenderProxy2D } from './renderProxy';
|
|
2
3
|
import { getRenderStateRuntime } from './renderState';
|
|
3
4
|
// Recomputes why `source` would or would not draw against `state`, and returns it as plain data. Pure:
|
|
@@ -18,7 +19,7 @@ import { getRenderStateRuntime } from './renderState';
|
|
|
18
19
|
// a new blank-reason gate, this function must gain the matching check or it silently goes stale.
|
|
19
20
|
export function explainScene2DRender(state, source) {
|
|
20
21
|
const kind = source.kind;
|
|
21
|
-
const hasRenderer = getRenderStateRuntime(state).
|
|
22
|
+
const hasRenderer = getRenderStateRuntime(state).registries.renderers.entries.get(kind)?.state === RegistryEntryState.Bound;
|
|
22
23
|
const proxy = getRenderProxy2D(state, source);
|
|
23
24
|
const prepared = proxy !== undefined;
|
|
24
25
|
const appearance = source;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"explainScene2DRender.js","sourceRoot":"","sources":["../src/explainScene2DRender.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"explainScene2DRender.js","sourceRoot":"","sources":["../src/explainScene2DRender.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAEtD,uGAAuG;AACvG,qGAAqG;AACrG,oGAAoG;AACpG,uFAAuF;AACvF,EAAE;AACF,oGAAoG;AACpG,gGAAgG;AAChG,kGAAkG;AAClG,uGAAuG;AACvG,6FAA6F;AAC7F,yFAAyF;AACzF,EAAE;AACF,sGAAsG;AACtG,4FAA4F;AAC5F,uGAAuG;AACvG,iGAAiG;AACjG,MAAM,UAAU,oBAAoB,CAAC,KAAkB,EAAE,MAAkB;IACzE,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IACzB,MAAM,WAAW,GACf,qBAAqB,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,KAAK,kBAAkB,CAAC,KAAK,CAAC;IAE1G,MAAM,KAAK,GAAG,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,KAAK,KAAK,SAAS,CAAC;IAErC,MAAM,UAAU,GAAG,MAAkC,CAAC;IACtD,MAAM,OAAO,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC;IACzE,MAAM,cAAc,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC;IAE5E,IAAI,MAAgC,CAAC;IACrC,IAAI,CAAC,WAAW;QAAE,MAAM,GAAG,aAAa,CAAC;SACpC,IAAI,CAAC,QAAQ;QAAE,MAAM,GAAG,cAAc,CAAC;SACvC,IAAI,CAAC,OAAO;QAAE,MAAM,GAAG,aAAa,CAAC;SACrC,IAAI,cAAc,IAAI,CAAC;QAAE,MAAM,GAAG,YAAY,CAAC;;QAC/C,MAAM,GAAG,IAAI,CAAC;IAEnB,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC;AAC1E,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderProxy.d.ts","sourceRoot":"","sources":["../src/renderProxy.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAEV,kBAAkB,EAClB,cAAc,EAEd,UAAU,EACV,WAAW,EACX,aAAa,EACb,kBAAkB,EAClB,WAAW,EACZ,MAAM,0BAA0B,CAAC;AAQlC,KAAK,SAAS,GAAG,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,KAAK,IAAI,CAAC;AAEvF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,GAAG,WAAW,CA2BrF;AAKD,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,UAAU,GAAG,cAAc,GAAG,kBAAkB,GACvD,aAAa,CAMf;AAMD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CAQ/E;AASD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,GAAG,IAAI,CAE/E;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,GAAG,aAAa,CAa9F;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,GAAG,aAAa,GAAG,SAAS,CAElG;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE,SAAS,GAAG,IAAI,CAE9E;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,WAAW,EACjB,UAAU,CAAC,EAAE,WAAW,GACvB,OAAO,CAeT;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAEjE;AAOD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAEpF;AAMD,wBAAgB,cAAc,CAC5B,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,aAAa,EACnB,UAAU,EAAE,aAAa,GAAG,SAAS,GACpC,IAAI,CAGN;AAID,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,aAAa,EACnB,UAAU,EAAE,aAAa,GAAG,SAAS,GACpC,IAAI,CAmBN;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,GAAG,IAAI,CAWrF;
|
|
1
|
+
{"version":3,"file":"renderProxy.d.ts","sourceRoot":"","sources":["../src/renderProxy.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAEV,kBAAkB,EAClB,cAAc,EAEd,UAAU,EACV,WAAW,EACX,aAAa,EACb,kBAAkB,EAClB,WAAW,EACZ,MAAM,0BAA0B,CAAC;AAQlC,KAAK,SAAS,GAAG,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,KAAK,IAAI,CAAC;AAEvF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,GAAG,WAAW,CA2BrF;AAKD,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,UAAU,GAAG,cAAc,GAAG,kBAAkB,GACvD,aAAa,CAMf;AAMD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CAQ/E;AASD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,GAAG,IAAI,CAE/E;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,GAAG,aAAa,CAa9F;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,GAAG,aAAa,GAAG,SAAS,CAElG;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE,SAAS,GAAG,IAAI,CAE9E;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,WAAW,EACjB,UAAU,CAAC,EAAE,WAAW,GACvB,OAAO,CAeT;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAEjE;AAOD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAEpF;AAMD,wBAAgB,cAAc,CAC5B,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,aAAa,EACnB,UAAU,EAAE,aAAa,GAAG,SAAS,GACpC,IAAI,CAGN;AAID,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,aAAa,EACnB,UAAU,EAAE,aAAa,GAAG,SAAS,GACpC,IAAI,CAmBN;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,GAAG,IAAI,CAWrF;AAgBD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAgDjG"}
|
package/dist/renderProxy.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createEntity } from '@flighthq/entity/contract';
|
|
2
2
|
import { createMatrix } from '@flighthq/geometry/contract';
|
|
3
3
|
import { getNodeAppearanceRevision, getNodeChildrenRevision, getNodeLocalContentRevision, getNodeLocalTransformRevision, getNodeParentReferenceRevision, getNodeParent, getNodeRuntime, } from '@flighthq/node/contract';
|
|
4
|
-
import { BlendMode, RenderRegistry } from '@flighthq/types/contract';
|
|
4
|
+
import { BlendMode, RegistryEntryState, RenderRegistry } from '@flighthq/types/contract';
|
|
5
5
|
import { updateRenderProxyAppearance } from './renderAppearance';
|
|
6
6
|
import { updateRenderProxyMaterial } from './renderMaterial';
|
|
7
7
|
import { getRenderStateRuntime } from './renderState';
|
|
@@ -158,10 +158,12 @@ export function updateRenderProxyRenderer(state, node) {
|
|
|
158
158
|
}
|
|
159
159
|
function resolveRenderProxyRenderer(state, kind) {
|
|
160
160
|
const runtime = getRenderStateRuntime(state);
|
|
161
|
-
const
|
|
162
|
-
if (
|
|
161
|
+
const entry = runtime.registries.renderers.entries.get(kind);
|
|
162
|
+
if (entry?.state !== RegistryEntryState.Bound) {
|
|
163
163
|
runtime.registryMiss?.(RenderRegistry.NodeRenderer, kind);
|
|
164
|
-
|
|
164
|
+
return null;
|
|
165
|
+
}
|
|
166
|
+
return entry.value;
|
|
165
167
|
}
|
|
166
168
|
// One generic, dirty-checked pre-order walk over the 2D node graph. `visit` composes the trait
|
|
167
169
|
// update* steps. Sprites and display objects share this single traversal and a single render-node
|
package/dist/renderProxy.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderProxy.js","sourceRoot":"","sources":["../src/renderProxy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EACL,yBAAyB,EACzB,uBAAuB,EACvB,2BAA2B,EAC3B,6BAA6B,EAC7B,8BAA8B,EAC9B,aAAa,EACb,cAAc,GACf,MAAM,yBAAyB,CAAC;AAYjC,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"renderProxy.js","sourceRoot":"","sources":["../src/renderProxy.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderState.d.ts","sourceRoot":"","sources":["../src/renderState.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"renderState.d.ts","sourceRoot":"","sources":["../src/renderState.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAc,WAAW,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAG5F,wBAAgB,iBAAiB,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,WAAW,CAiBzE;AAOD,wBAAgB,wBAAwB,IAAI,kBAAkB,CAkB7D;AAID,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAO3D;AAID,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,WAAW,GAAG,kBAAkB,CAE5E"}
|
package/dist/renderState.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { createEntity, createEntityRuntime } from '@flighthq/entity/contract';
|
|
2
|
+
import { createKeyedTable, createSlotTable } from '@flighthq/registry/contract';
|
|
2
3
|
import { BlendMode, EntityRuntimeKey } from '@flighthq/types/contract';
|
|
3
4
|
export function createRenderState(obj) {
|
|
4
5
|
const state = createEntity({
|
|
@@ -33,10 +34,11 @@ export function createRenderStateRuntime() {
|
|
|
33
34
|
runtime.renderProxyMap = new WeakMap();
|
|
34
35
|
runtime.renderProxySources = new Set();
|
|
35
36
|
runtime.registryMiss = null;
|
|
36
|
-
runtime.
|
|
37
|
+
runtime.registries = {
|
|
38
|
+
renderers: createKeyedTable('NodeRenderer', 'Unregistered'),
|
|
39
|
+
strokeTessellator: createSlotTable('StrokeTessellator', 'Rasterize'),
|
|
40
|
+
};
|
|
37
41
|
runtime.renderRootGuard = null;
|
|
38
|
-
runtime.strokeTessellator = null;
|
|
39
|
-
runtime.rendererMap = new Map();
|
|
40
42
|
runtime.rendererMapId = 0;
|
|
41
43
|
runtime.tempStack = [];
|
|
42
44
|
return runtime;
|
|
@@ -49,7 +51,7 @@ export function destroyRenderState(state) {
|
|
|
49
51
|
disposeRenderProxyForShutdown(state, source);
|
|
50
52
|
runtime.registryMiss?.clear();
|
|
51
53
|
runtime.registryMiss = null;
|
|
52
|
-
runtime.
|
|
54
|
+
runtime.registries.effectPaddingResolvers = undefined;
|
|
53
55
|
runtime.tempStack.length = 0;
|
|
54
56
|
}
|
|
55
57
|
// Resolves the package-private machinery runtime attached to a RenderState. Mutable by design: the
|
package/dist/renderState.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderState.js","sourceRoot":"","sources":["../src/renderState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"renderState.js","sourceRoot":"","sources":["../src/renderState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAC9E,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAEhF,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAEvE,MAAM,UAAU,iBAAiB,CAAC,GAA0B;IAC1D,MAAM,KAAK,GAAG,YAAY,CAAC;QACzB,cAAc,EAAE,GAAG,EAAE,cAAc,IAAI,IAAI;QAC3C,eAAe,EAAE,GAAG,EAAE,eAAe,IAAI,CAAC;QAC1C,mBAAmB,EAAE,GAAG,EAAE,mBAAmB,IAAI,EAAE;QACnD,qBAAqB,EAAE,GAAG,EAAE,qBAAqB,IAAI,EAAE;QACvD,gBAAgB,EAAE,GAAG,EAAE,gBAAgB,IAAI,CAAC;QAC5C,sBAAsB,EAAE,GAAG,EAAE,sBAAsB,IAAI,IAAI;QAC3D,UAAU,EAAE,GAAG,EAAE,UAAU,IAAI,CAAC;QAChC,WAAW,EAAE,GAAG,EAAE,WAAW,IAAI,CAAC;QAClC,eAAe,EAAE,GAAG,EAAE,eAAe,IAAI,SAAS,CAAC,MAAM;QACzD,iBAAiB,EAAE,GAAG,EAAE,iBAAiB,IAAI,IAAI;QACjD,WAAW,EAAE,GAAG,EAAE,WAAW,IAAI,KAAK;QACtC,oBAAoB,EAAE,GAAG,EAAE,oBAAoB,IAAI,qBAAqB;KACzE,CAAgB,CAAC;IAClB,KAAK,CAAC,gBAAgB,CAAC,GAAG,wBAAwB,EAAE,CAAC;IACrD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,oGAAoG;AACpG,0FAA0F;AAC1F,sGAAsG;AACtG,2FAA2F;AAC3F,wCAAwC;AACxC,MAAM,UAAU,wBAAwB;IACtC,MAAM,OAAO,GAAG,mBAAmB,EAAwB,CAAC;IAC5D,OAAO,CAAC,uBAAuB,GAAG,IAAI,CAAC;IACvC,OAAO,CAAC,+BAA+B,GAAG,IAAI,CAAC;IAC/C,OAAO,CAAC,cAAc,GAAG,CAAC,CAAC;IAC3B,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAC/B,OAAO,CAAC,qBAAqB,GAAG,IAAI,OAAO,EAAE,CAAC;IAC9C,OAAO,CAAC,cAAc,GAAG,IAAI,OAAO,EAAE,CAAC;IACvC,OAAO,CAAC,kBAAkB,GAAG,IAAI,GAAG,EAAE,CAAC;IACvC,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAC5B,OAAO,CAAC,UAAU,GAAG;QACnB,SAAS,EAAE,gBAAgB,CAAC,cAAc,EAAE,cAAc,CAAC;QAC3D,iBAAiB,EAAE,eAAe,CAAC,mBAAmB,EAAE,WAAW,CAAC;KACrE,CAAC;IACF,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAC/B,OAAO,CAAC,aAAa,GAAG,CAAC,CAAC;IAC1B,OAAO,CAAC,SAAS,GAAG,EAAE,CAAC;IACvB,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,mGAAmG;AACnG,uFAAuF;AACvF,MAAM,UAAU,kBAAkB,CAAC,KAAkB;IACnD,MAAM,OAAO,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAC7C,KAAK,MAAM,MAAM,IAAI,CAAC,GAAG,OAAO,CAAC,kBAAkB,CAAC;QAAE,6BAA6B,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACnG,OAAO,CAAC,YAAY,EAAE,KAAK,EAAE,CAAC;IAC9B,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAC5B,OAAO,CAAC,UAAU,CAAC,sBAAsB,GAAG,SAAS,CAAC;IACtD,OAAO,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;AAC/B,CAAC;AAED,mGAAmG;AACnG,6CAA6C;AAC7C,MAAM,UAAU,qBAAqB,CAAC,KAAkB;IACtD,OAAO,KAAK,CAAC,gBAAgB,CAAuB,CAAC;AACvD,CAAC;AAED,SAAS,6BAA6B,CAAC,KAAkB,EAAE,MAAkB;IAC3E,MAAM,OAAO,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACjD,IAAI,KAAK,EAAE,YAAY,KAAK,IAAI,IAAI,KAAK,EAAE,YAAY,KAAK,SAAS,EAAE,CAAC;QACtE,KAAK,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACtC,OAAO,CAAC,kBAAkB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAC5C,CAAC"}
|
package/dist/renderer.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAOtG,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI,CAG9F;AAED,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI,CAsB3F;AAKD,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI,CAU3F;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,GAAG,YAAY,GAAG,IAAI,CAE9F;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAMzF;AAKD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,GAAG,IAAI,CAE7G"}
|
package/dist/renderer.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { getRegistryTableEntry, withRegistryTableEntry } from '@flighthq/registry/contract';
|
|
2
|
+
import { RegistryEntryState } from '@flighthq/types/contract';
|
|
1
3
|
import { getRenderStateRuntime } from './renderState';
|
|
2
4
|
// Mask renderers were retired (a mask is now a path ClipRegion realized by the backend clip hooks), so
|
|
3
5
|
// there is no mask-renderer registry to copy — only the kind→renderer map and the clip hooks.
|
|
@@ -7,35 +9,53 @@ export function copyAllRenderersFromRenderState(target, source) {
|
|
|
7
9
|
target.displayObjectClipHooks = source.displayObjectClipHooks;
|
|
8
10
|
}
|
|
9
11
|
export function copyRenderersFromRenderState(target, source) {
|
|
10
|
-
getRenderStateRuntime(
|
|
11
|
-
|
|
12
|
-
|
|
12
|
+
const targetRuntime = getRenderStateRuntime(target);
|
|
13
|
+
const sourceTable = getRenderStateRuntime(source).registries.renderers;
|
|
14
|
+
const targetTable = targetRuntime.registries.renderers;
|
|
15
|
+
// A fresh derived pipeline can share the immutable source snapshot directly. A target that already
|
|
16
|
+
// has policy keeps its target-only registrations, matching the additive copy contract, while source
|
|
17
|
+
// bindings remain last-write-wins through registerRenderer.
|
|
18
|
+
if (targetTable.entries.size === 0) {
|
|
19
|
+
let registrationCount = 0;
|
|
20
|
+
for (const entry of sourceTable.entries.values()) {
|
|
21
|
+
if (entry.state === RegistryEntryState.Bound)
|
|
22
|
+
registrationCount++;
|
|
23
|
+
}
|
|
24
|
+
if (registrationCount === 0)
|
|
25
|
+
return;
|
|
26
|
+
targetRuntime.registries.renderers = sourceTable;
|
|
27
|
+
targetRuntime.rendererMapId = (targetRuntime.rendererMapId + registrationCount) >>> 0;
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
for (const [kind, entry] of sourceTable.entries) {
|
|
31
|
+
if (entry.state === RegistryEntryState.Bound)
|
|
32
|
+
registerRenderer(target, kind, entry.value);
|
|
33
|
+
}
|
|
13
34
|
}
|
|
14
|
-
// Copies the backend-agnostic policy registries that participate in pipeline derivation.
|
|
15
|
-
//
|
|
35
|
+
// Copies the backend-agnostic policy registries that participate in pipeline derivation. Persistent
|
|
36
|
+
// tables share an immutable snapshot through distinct aggregates, so later replacements diverge until
|
|
37
|
+
// an explicit re-copy.
|
|
16
38
|
export function copyRenderStateRegistrations(target, source) {
|
|
17
39
|
const targetRuntime = getRenderStateRuntime(target);
|
|
18
40
|
const sourceRuntime = getRenderStateRuntime(source);
|
|
19
41
|
targetRuntime.colorAdjustmentResolver = sourceRuntime.colorAdjustmentResolver;
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
//
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
const sourceShapeCommands = sourceRuntime.canvasShapeCommandRegistry;
|
|
27
|
-
targetRuntime.canvasShapeCommandRegistry =
|
|
28
|
-
sourceShapeCommands === null || sourceShapeCommands === undefined ? null : new Map(sourceShapeCommands);
|
|
42
|
+
targetRuntime.registries.effectPaddingResolvers = sourceRuntime.registries.effectPaddingResolvers;
|
|
43
|
+
// The shape-command set is base policy every backend replays through, so a pipeline that inherits
|
|
44
|
+
// the renderers must inherit the commands too. Without it an offscreen state resolves no handler for
|
|
45
|
+
// any command in a shape's stream and bakes an empty target.
|
|
46
|
+
targetRuntime.registries.canvasShapeCommands = sourceRuntime.registries.canvasShapeCommands;
|
|
47
|
+
targetRuntime.registries.strokeTessellator = sourceRuntime.registries.strokeTessellator;
|
|
29
48
|
}
|
|
30
49
|
export function noopRendererData(_state, _source) {
|
|
31
50
|
return null;
|
|
32
51
|
}
|
|
33
52
|
export function registerRenderer(state, kind, renderer) {
|
|
34
53
|
const runtime = getRenderStateRuntime(state);
|
|
35
|
-
|
|
54
|
+
const table = runtime.registries.renderers;
|
|
55
|
+
if (getRegistryTableEntry(table, kind) === renderer)
|
|
36
56
|
return;
|
|
57
|
+
runtime.registries.renderers = withRegistryTableEntry(table, kind, renderer);
|
|
37
58
|
runtime.rendererMapId = (runtime.rendererMapId + 1) >>> 0;
|
|
38
|
-
runtime.rendererMap.set(kind, renderer);
|
|
39
59
|
}
|
|
40
60
|
// Batch form of registerRenderer over a caller-supplied set of [kind, renderer] pairs. The registry
|
|
41
61
|
// stays open and tree-shakable: only the renderers the caller references are pulled in — there is no
|
package/dist/renderer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderer.js","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"renderer.js","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flighthq/render",
|
|
3
|
-
"version": "0.3.1-next.
|
|
3
|
+
"version": "0.3.1-next.704.69286f6",
|
|
4
4
|
"author": "Joshua Granick and other contributors",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -38,16 +38,17 @@
|
|
|
38
38
|
"clean:dist": "tsx ../../scripts/clean-package-dist.ts"
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"@flighthq/adjustments": "0.3.1-next.
|
|
42
|
-
"@flighthq/color": "0.3.1-next.
|
|
43
|
-
"@flighthq/entity": "0.3.1-next.
|
|
44
|
-
"@flighthq/geometry": "0.3.1-next.
|
|
45
|
-
"@flighthq/log": "0.3.1-next.
|
|
46
|
-
"@flighthq/materials": "0.3.1-next.
|
|
47
|
-
"@flighthq/mesh": "0.3.1-next.
|
|
48
|
-
"@flighthq/node": "0.3.1-next.
|
|
49
|
-
"@flighthq/
|
|
50
|
-
"@flighthq/
|
|
41
|
+
"@flighthq/adjustments": "0.3.1-next.704.69286f6",
|
|
42
|
+
"@flighthq/color": "0.3.1-next.704.69286f6",
|
|
43
|
+
"@flighthq/entity": "0.3.1-next.704.69286f6",
|
|
44
|
+
"@flighthq/geometry": "0.3.1-next.704.69286f6",
|
|
45
|
+
"@flighthq/log": "0.3.1-next.704.69286f6",
|
|
46
|
+
"@flighthq/materials": "0.3.1-next.704.69286f6",
|
|
47
|
+
"@flighthq/mesh": "0.3.1-next.704.69286f6",
|
|
48
|
+
"@flighthq/node": "0.3.1-next.704.69286f6",
|
|
49
|
+
"@flighthq/registry": "0.3.1-next.704.69286f6",
|
|
50
|
+
"@flighthq/signals": "0.3.1-next.704.69286f6",
|
|
51
|
+
"@flighthq/types": "0.3.1-next.704.69286f6"
|
|
51
52
|
},
|
|
52
53
|
"devDependencies": {
|
|
53
54
|
"@flighthq/camera": "*",
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Renderer, Scene2DKindUsage, SceneCoverageCatalog, SceneCoverageEntry } from '@flighthq/types/contract';
|
|
2
|
-
import { RenderRegistry, RequirementFacet, SceneCoverage } from '@flighthq/types/contract';
|
|
2
|
+
import { RegistryEntryState, RenderRegistry, RequirementFacet, SceneCoverage } from '@flighthq/types/contract';
|
|
3
3
|
import { describe, expect, it } from 'vitest';
|
|
4
4
|
|
|
5
5
|
import { explainScene2DCoverage, hasScene2DCoverage } from './explainScene2DCoverage';
|
|
@@ -43,11 +43,16 @@ function entries(
|
|
|
43
43
|
return out;
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
-
// The registry
|
|
46
|
+
// The registry lives on the base runtime; registering a real command means reaching through
|
|
47
47
|
// scene2d-canvas, which render cannot depend on, so the test installs the binding directly.
|
|
48
48
|
function wireShapeCommand(state: ReturnType<typeof createRenderState>, key: string): void {
|
|
49
49
|
const runtime = getRenderStateRuntime(state);
|
|
50
|
-
|
|
50
|
+
runtime.registries.canvasShapeCommands = {
|
|
51
|
+
entries: new Map([[key, { state: RegistryEntryState.Bound, value: { key, draw: () => {} } as never }]]),
|
|
52
|
+
onMiss: 'Unregistered',
|
|
53
|
+
registry: 'CanvasShapeCommand',
|
|
54
|
+
shape: 'keyed',
|
|
55
|
+
};
|
|
51
56
|
}
|
|
52
57
|
|
|
53
58
|
describe('explainScene2DCoverage', () => {
|
package/src/renderCache.test.ts
CHANGED
|
@@ -117,7 +117,7 @@ describe('registerRenderCacheRenderer', () => {
|
|
|
117
117
|
const state = createRenderState();
|
|
118
118
|
const renderer = { createData: () => null, submit: vi.fn() };
|
|
119
119
|
registerRenderCacheRenderer(state, renderer as any);
|
|
120
|
-
expect(getRenderStateRuntime(state).
|
|
120
|
+
expect(getRegistryTableEntry(getRenderStateRuntime(state).registries.renderers, RenderCacheKind)).toBe(renderer);
|
|
121
121
|
});
|
|
122
122
|
});
|
|
123
123
|
|
|
@@ -149,3 +149,4 @@ describe('useRenderCache', () => {
|
|
|
149
149
|
expect(getRenderProxyAdapter(stateB, obj as any)).toBeNull();
|
|
150
150
|
});
|
|
151
151
|
});
|
|
152
|
+
import { getRegistryTableEntry } from '@flighthq/registry/contract';
|
package/src/renderProxy.test.ts
CHANGED
|
@@ -224,17 +224,23 @@ describe('getOrCreateRenderProxy2D', () => {
|
|
|
224
224
|
expect(a).toBe(b);
|
|
225
225
|
});
|
|
226
226
|
|
|
227
|
-
it('syncs
|
|
227
|
+
it('invalidates and syncs an existing proxy when the renderer table is replaced', () => {
|
|
228
228
|
const state = createRenderState();
|
|
229
229
|
const source = createSprite();
|
|
230
230
|
const node = getOrCreateRenderProxy2D(state, source);
|
|
231
231
|
expect(node.renderer).toBeNull();
|
|
232
232
|
|
|
233
233
|
const renderer = makeRenderer();
|
|
234
|
+
const runtime = getRenderStateRuntime(state);
|
|
235
|
+
const tableBeforeRegistration = runtime.registries.renderers;
|
|
236
|
+
const idBeforeRegistration = runtime.rendererMapId;
|
|
234
237
|
registerRenderer(state, source.kind, renderer as any);
|
|
238
|
+
expect(runtime.registries.renderers).not.toBe(tableBeforeRegistration);
|
|
239
|
+
expect(runtime.rendererMapId).toBe(idBeforeRegistration + 1);
|
|
235
240
|
getOrCreateRenderProxy2D(state, source);
|
|
236
241
|
|
|
237
242
|
expect(node.renderer).toBe(renderer);
|
|
243
|
+
expect(node.rendererMapId).toBe(runtime.rendererMapId);
|
|
238
244
|
});
|
|
239
245
|
});
|
|
240
246
|
|
package/src/renderState.test.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { createMatrix } from '@flighthq/geometry/contract';
|
|
2
|
+
import { createKeyedTable, createSlotTable } from '@flighthq/registry/contract';
|
|
2
3
|
import type { RenderState } from '@flighthq/types/contract';
|
|
3
4
|
import { BlendMode, EntityRuntimeKey } from '@flighthq/types/contract';
|
|
4
5
|
|
|
@@ -30,7 +31,10 @@ describe('createRenderState', () => {
|
|
|
30
31
|
expect(runtime.currentFrameId).toStrictEqual(0);
|
|
31
32
|
expect(runtime.renderProxyMap).toStrictEqual(new WeakMap());
|
|
32
33
|
expect(runtime.renderProxyAdapterMap).toStrictEqual(new WeakMap());
|
|
33
|
-
expect(runtime.
|
|
34
|
+
expect(runtime.registries).toStrictEqual({
|
|
35
|
+
renderers: createKeyedTable('NodeRenderer', 'Unregistered'),
|
|
36
|
+
strokeTessellator: createSlotTable('StrokeTessellator', 'Rasterize'),
|
|
37
|
+
});
|
|
34
38
|
expect(runtime.rendererMapId).toStrictEqual(0);
|
|
35
39
|
expect(runtime.tempStack).toStrictEqual([]);
|
|
36
40
|
});
|
|
@@ -73,7 +77,8 @@ describe('createRenderStateRuntime', () => {
|
|
|
73
77
|
expect(runtime.currentFrameId).toStrictEqual(0);
|
|
74
78
|
expect(runtime.renderProxyMap).toStrictEqual(new WeakMap());
|
|
75
79
|
expect(runtime.renderProxyAdapterMap).toStrictEqual(new WeakMap());
|
|
76
|
-
expect(runtime.
|
|
80
|
+
expect(runtime.registries.renderers).toStrictEqual(createKeyedTable('NodeRenderer', 'Unregistered'));
|
|
81
|
+
expect(runtime.registries.strokeTessellator).toStrictEqual(createSlotTable('StrokeTessellator', 'Rasterize'));
|
|
77
82
|
expect(runtime.rendererMapId).toStrictEqual(0);
|
|
78
83
|
expect(runtime.tempStack).toStrictEqual([]);
|
|
79
84
|
});
|
|
@@ -82,7 +87,8 @@ describe('createRenderStateRuntime', () => {
|
|
|
82
87
|
const a = createRenderStateRuntime();
|
|
83
88
|
const b = createRenderStateRuntime();
|
|
84
89
|
expect(a).not.toBe(b);
|
|
85
|
-
expect(a.
|
|
90
|
+
expect(a.registries.renderers).not.toBe(b.registries.renderers);
|
|
91
|
+
expect(a.registries.strokeTessellator).not.toBe(b.registries.strokeTessellator);
|
|
86
92
|
});
|
|
87
93
|
});
|
|
88
94
|
|
|
@@ -91,12 +97,17 @@ describe('destroyRenderState', () => {
|
|
|
91
97
|
const state = createRenderState();
|
|
92
98
|
const runtime = getRenderStateRuntime(state);
|
|
93
99
|
runtime.tempStack.push({} as never);
|
|
94
|
-
runtime.
|
|
100
|
+
runtime.registries.effectPaddingResolvers = {
|
|
101
|
+
entries: new Map(),
|
|
102
|
+
onMiss: 'Zero',
|
|
103
|
+
registry: 'RenderEffectPaddingResolver',
|
|
104
|
+
shape: 'keyed',
|
|
105
|
+
};
|
|
95
106
|
|
|
96
107
|
destroyRenderState(state);
|
|
97
108
|
|
|
98
109
|
expect(runtime.tempStack).toHaveLength(0);
|
|
99
|
-
expect(runtime.
|
|
110
|
+
expect(runtime.registries.effectPaddingResolvers).toBeUndefined();
|
|
100
111
|
});
|
|
101
112
|
});
|
|
102
113
|
|
package/src/renderer.test.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { getRegistryTableEntry } from '@flighthq/registry/contract';
|
|
2
|
+
import type { Renderer, RenderState, Scene2DClipHooks } from '@flighthq/types/contract';
|
|
3
|
+
import { RegistryEntryState } from '@flighthq/types/contract';
|
|
2
4
|
|
|
3
5
|
import {
|
|
4
6
|
copyAllRenderersFromRenderState,
|
|
@@ -26,7 +28,7 @@ describe('copyAllRenderersFromRenderState', () => {
|
|
|
26
28
|
|
|
27
29
|
copyAllRenderersFromRenderState(target, source);
|
|
28
30
|
|
|
29
|
-
expect(getRenderStateRuntime(target).
|
|
31
|
+
expect(getRegistryTableEntry(getRenderStateRuntime(target).registries.renderers, kind)).toBe(renderer);
|
|
30
32
|
expect(target.displayObjectClipHooks).toBe(hooks);
|
|
31
33
|
});
|
|
32
34
|
|
|
@@ -34,7 +36,7 @@ describe('copyAllRenderersFromRenderState', () => {
|
|
|
34
36
|
const source = createRenderState();
|
|
35
37
|
const target = createRenderState();
|
|
36
38
|
copyAllRenderersFromRenderState(target, source);
|
|
37
|
-
expect(getRenderStateRuntime(target).
|
|
39
|
+
expect(getRenderStateRuntime(target).registries.renderers.entries.size).toBe(0);
|
|
38
40
|
expect(target.displayObjectClipHooks).toBeNull();
|
|
39
41
|
});
|
|
40
42
|
});
|
|
@@ -47,14 +49,15 @@ describe('copyRenderersFromRenderState', () => {
|
|
|
47
49
|
const renderer = { createData: vi.fn(), submit: vi.fn() } as unknown as Renderer;
|
|
48
50
|
registerRenderer(source, kind, renderer);
|
|
49
51
|
copyRenderersFromRenderState(target, source);
|
|
50
|
-
expect(getRenderStateRuntime(target).
|
|
52
|
+
expect(getRenderStateRuntime(target).registries.renderers).toBe(getRenderStateRuntime(source).registries.renderers);
|
|
53
|
+
expect(getRegistryTableEntry(getRenderStateRuntime(target).registries.renderers, kind)).toBe(renderer);
|
|
51
54
|
});
|
|
52
55
|
|
|
53
56
|
it('is a no-op when source has no renderer registrations', () => {
|
|
54
57
|
const source = createRenderState();
|
|
55
58
|
const target = createRenderState();
|
|
56
59
|
copyRenderersFromRenderState(target, source);
|
|
57
|
-
expect(getRenderStateRuntime(target).
|
|
60
|
+
expect(getRenderStateRuntime(target).registries.renderers.entries.size).toBe(0);
|
|
58
61
|
});
|
|
59
62
|
|
|
60
63
|
it('does not affect source rendererMapId', () => {
|
|
@@ -67,38 +70,104 @@ describe('copyRenderersFromRenderState', () => {
|
|
|
67
70
|
copyRenderersFromRenderState(target, source);
|
|
68
71
|
expect(getRenderStateRuntime(source).rendererMapId).toBe(sourceIdBeforeCopy);
|
|
69
72
|
});
|
|
73
|
+
|
|
74
|
+
it('preserves target-only registrations while source registrations win collisions', () => {
|
|
75
|
+
const source = createRenderState();
|
|
76
|
+
const target = createRenderState();
|
|
77
|
+
const sourceRenderer = { submit: vi.fn() } as unknown as Renderer;
|
|
78
|
+
const targetRenderer = { submit: vi.fn() } as unknown as Renderer;
|
|
79
|
+
const targetOnlyRenderer = { submit: vi.fn() } as unknown as Renderer;
|
|
80
|
+
registerRenderer(source, 'shared', sourceRenderer);
|
|
81
|
+
registerRenderer(target, 'shared', targetRenderer);
|
|
82
|
+
registerRenderer(target, 'target-only', targetOnlyRenderer);
|
|
83
|
+
|
|
84
|
+
copyRenderersFromRenderState(target, source);
|
|
85
|
+
|
|
86
|
+
const targetTable = getRenderStateRuntime(target).registries.renderers;
|
|
87
|
+
expect(getRegistryTableEntry(targetTable, 'shared')).toBe(sourceRenderer);
|
|
88
|
+
expect(getRegistryTableEntry(targetTable, 'target-only')).toBe(targetOnlyRenderer);
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
it('shares a fresh immutable snapshot and diverges on later registration', () => {
|
|
92
|
+
const source = createRenderState();
|
|
93
|
+
const target = createRenderState();
|
|
94
|
+
const renderer = { submit: vi.fn() } as unknown as Renderer;
|
|
95
|
+
const lateRenderer = { submit: vi.fn() } as unknown as Renderer;
|
|
96
|
+
registerRenderer(source, 'shared', renderer);
|
|
97
|
+
|
|
98
|
+
copyRenderersFromRenderState(target, source);
|
|
99
|
+
|
|
100
|
+
const sharedSnapshot = getRenderStateRuntime(target).registries.renderers;
|
|
101
|
+
expect(sharedSnapshot).toBe(getRenderStateRuntime(source).registries.renderers);
|
|
102
|
+
registerRenderer(source, 'late', lateRenderer);
|
|
103
|
+
expect(getRenderStateRuntime(target).registries.renderers).toBe(sharedSnapshot);
|
|
104
|
+
expect(getRenderStateRuntime(source).registries.renderers).not.toBe(sharedSnapshot);
|
|
105
|
+
expect(getRegistryTableEntry(sharedSnapshot, 'late')).toBeNull();
|
|
106
|
+
});
|
|
70
107
|
});
|
|
71
108
|
|
|
72
109
|
describe('copyRenderStateRegistrations', () => {
|
|
73
|
-
it('
|
|
110
|
+
it('shares the effect-padding snapshot through distinct aggregates', () => {
|
|
74
111
|
const source = createRenderState();
|
|
75
112
|
const target = createRenderState();
|
|
76
113
|
const resolver = vi.fn();
|
|
77
114
|
const colorAdjustmentResolver = vi.fn();
|
|
115
|
+
const strokeTessellator = vi.fn(() => null);
|
|
78
116
|
getRenderStateRuntime(source).colorAdjustmentResolver = colorAdjustmentResolver;
|
|
79
|
-
getRenderStateRuntime(source).
|
|
117
|
+
getRenderStateRuntime(source).registries.strokeTessellator = {
|
|
118
|
+
...getRenderStateRuntime(source).registries.strokeTessellator,
|
|
119
|
+
entry: { state: RegistryEntryState.Bound, value: strokeTessellator },
|
|
120
|
+
};
|
|
121
|
+
getRenderStateRuntime(source).registries.effectPaddingResolvers = {
|
|
122
|
+
entries: new Map([['acme.Effect', { state: RegistryEntryState.Bound, value: resolver }]]),
|
|
123
|
+
onMiss: 'Zero',
|
|
124
|
+
registry: 'RenderEffectPaddingResolver',
|
|
125
|
+
shape: 'keyed',
|
|
126
|
+
};
|
|
80
127
|
|
|
81
128
|
copyRenderStateRegistrations(target, source);
|
|
82
129
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
);
|
|
87
|
-
expect(
|
|
130
|
+
const sourceRuntime = getRenderStateRuntime(source);
|
|
131
|
+
const targetRuntime = getRenderStateRuntime(target);
|
|
132
|
+
expect(targetRuntime.colorAdjustmentResolver).toBe(colorAdjustmentResolver);
|
|
133
|
+
expect(targetRuntime.registries).not.toBe(sourceRuntime.registries);
|
|
134
|
+
expect(targetRuntime.registries.strokeTessellator).toBe(sourceRuntime.registries.strokeTessellator);
|
|
135
|
+
expect(targetRuntime.registries.strokeTessellator.entry).toEqual({
|
|
136
|
+
state: RegistryEntryState.Bound,
|
|
137
|
+
value: strokeTessellator,
|
|
138
|
+
});
|
|
139
|
+
const sharedStrokeSnapshot = targetRuntime.registries.strokeTessellator;
|
|
140
|
+
sourceRuntime.registries.strokeTessellator = { ...sourceRuntime.registries.strokeTessellator, entry: null };
|
|
141
|
+
expect(sourceRuntime.registries.strokeTessellator).not.toBe(sharedStrokeSnapshot);
|
|
142
|
+
expect(targetRuntime.registries.strokeTessellator).toBe(sharedStrokeSnapshot);
|
|
143
|
+
expect(targetRuntime.registries.strokeTessellator.entry?.state).toBe(RegistryEntryState.Bound);
|
|
144
|
+
expect(targetRuntime.registries.effectPaddingResolvers).toBe(sourceRuntime.registries.effectPaddingResolvers);
|
|
145
|
+
expect(targetRuntime.registries.effectPaddingResolvers?.entries.get('acme.Effect')).toEqual({
|
|
146
|
+
state: RegistryEntryState.Bound,
|
|
147
|
+
value: resolver,
|
|
148
|
+
});
|
|
88
149
|
});
|
|
89
150
|
|
|
90
151
|
it('snapshot-copies the shape-command registry without aliasing the map', () => {
|
|
91
152
|
const source = createRenderState();
|
|
92
153
|
const target = createRenderState();
|
|
93
|
-
const command = { key: 'beginFill', draw: vi.fn() } as
|
|
94
|
-
getRenderStateRuntime(source).
|
|
154
|
+
const command = { key: 'beginFill', draw: vi.fn() } as never;
|
|
155
|
+
getRenderStateRuntime(source).registries.canvasShapeCommands = {
|
|
156
|
+
entries: new Map([['beginFill', { state: RegistryEntryState.Bound, value: command }]]),
|
|
157
|
+
onMiss: 'Unregistered',
|
|
158
|
+
registry: 'CanvasShapeCommand',
|
|
159
|
+
shape: 'keyed',
|
|
160
|
+
};
|
|
95
161
|
|
|
96
162
|
copyRenderStateRegistrations(target, source);
|
|
97
163
|
|
|
98
|
-
expect(getRenderStateRuntime(target).
|
|
99
|
-
getRenderStateRuntime(source).
|
|
164
|
+
expect(getRenderStateRuntime(target).registries.canvasShapeCommands).toBe(
|
|
165
|
+
getRenderStateRuntime(source).registries.canvasShapeCommands,
|
|
100
166
|
);
|
|
101
|
-
expect(getRenderStateRuntime(target).
|
|
167
|
+
expect(getRenderStateRuntime(target).registries.canvasShapeCommands?.entries.get('beginFill')).toEqual({
|
|
168
|
+
state: RegistryEntryState.Bound,
|
|
169
|
+
value: command,
|
|
170
|
+
});
|
|
102
171
|
});
|
|
103
172
|
|
|
104
173
|
it('leaves the shape-command registry null when the source never registered one', () => {
|
|
@@ -107,7 +176,7 @@ describe('copyRenderStateRegistrations', () => {
|
|
|
107
176
|
|
|
108
177
|
copyRenderStateRegistrations(target, source);
|
|
109
178
|
|
|
110
|
-
expect(getRenderStateRuntime(target).
|
|
179
|
+
expect(getRenderStateRuntime(target).registries.canvasShapeCommands).toBeUndefined();
|
|
111
180
|
});
|
|
112
181
|
});
|
|
113
182
|
|
|
@@ -134,9 +203,11 @@ describe('registerRenderer', () => {
|
|
|
134
203
|
});
|
|
135
204
|
|
|
136
205
|
it('should register a new renderer', () => {
|
|
137
|
-
|
|
206
|
+
const before = getRenderStateRuntime(state).registries.renderers;
|
|
207
|
+
expect(getRegistryTableEntry(before, kindA)).toBeNull();
|
|
138
208
|
registerRenderer(state, kindA, renderer1);
|
|
139
|
-
expect(getRenderStateRuntime(state).
|
|
209
|
+
expect(getRenderStateRuntime(state).registries.renderers).not.toBe(before);
|
|
210
|
+
expect(getRegistryTableEntry(getRenderStateRuntime(state).registries.renderers, kindA)).toBe(renderer1);
|
|
140
211
|
expect(getRenderStateRuntime(state).rendererMapId).toBe(1);
|
|
141
212
|
});
|
|
142
213
|
|
|
@@ -144,7 +215,7 @@ describe('registerRenderer', () => {
|
|
|
144
215
|
registerRenderer(state, kindA, renderer1);
|
|
145
216
|
const idAfterFirst = getRenderStateRuntime(state).rendererMapId;
|
|
146
217
|
registerRenderer(state, kindB, renderer2);
|
|
147
|
-
expect(getRenderStateRuntime(state).
|
|
218
|
+
expect(getRegistryTableEntry(getRenderStateRuntime(state).registries.renderers, kindB)).toBe(renderer2);
|
|
148
219
|
expect(getRenderStateRuntime(state).rendererMapId).toBe(idAfterFirst + 1);
|
|
149
220
|
});
|
|
150
221
|
|
|
@@ -152,7 +223,7 @@ describe('registerRenderer', () => {
|
|
|
152
223
|
registerRenderer(state, kindA, renderer1);
|
|
153
224
|
const idBefore = getRenderStateRuntime(state).rendererMapId;
|
|
154
225
|
registerRenderer(state, kindA, renderer1);
|
|
155
|
-
expect(getRenderStateRuntime(state).
|
|
226
|
+
expect(getRegistryTableEntry(getRenderStateRuntime(state).registries.renderers, kindA)).toBe(renderer1);
|
|
156
227
|
expect(getRenderStateRuntime(state).rendererMapId).toBe(idBefore);
|
|
157
228
|
});
|
|
158
229
|
|
|
@@ -160,7 +231,7 @@ describe('registerRenderer', () => {
|
|
|
160
231
|
registerRenderer(state, kindA, renderer1);
|
|
161
232
|
const idBefore = getRenderStateRuntime(state).rendererMapId;
|
|
162
233
|
registerRenderer(state, kindA, renderer2);
|
|
163
|
-
expect(getRenderStateRuntime(state).
|
|
234
|
+
expect(getRegistryTableEntry(getRenderStateRuntime(state).registries.renderers, kindA)).toBe(renderer2);
|
|
164
235
|
expect(getRenderStateRuntime(state).rendererMapId).toBe(idBefore + 1);
|
|
165
236
|
});
|
|
166
237
|
|
|
@@ -182,8 +253,8 @@ describe('registerRenderers', () => {
|
|
|
182
253
|
[kindA, rendererA],
|
|
183
254
|
[kindB, rendererB],
|
|
184
255
|
]);
|
|
185
|
-
expect(getRenderStateRuntime(state).
|
|
186
|
-
expect(getRenderStateRuntime(state).
|
|
256
|
+
expect(getRegistryTableEntry(getRenderStateRuntime(state).registries.renderers, kindA)).toBe(rendererA);
|
|
257
|
+
expect(getRegistryTableEntry(getRenderStateRuntime(state).registries.renderers, kindB)).toBe(rendererB);
|
|
187
258
|
});
|
|
188
259
|
|
|
189
260
|
it('should register nothing for an empty set', () => {
|