@flighthq/scene2d-canvas 0.5.1-next.1069.554a2ac → 0.5.1-next.1201.9b49dee
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/README.md +2 -2
- package/dist/canvasBitmapTextureResolver.d.ts +2 -2
- package/dist/canvasBitmapTextureResolver.d.ts.map +1 -1
- package/dist/canvasBitmapTextureResolver.js +4 -4
- package/dist/canvasBitmapTextureResolver.js.map +1 -1
- package/dist/canvasCache.d.ts +5 -5
- package/dist/canvasCache.d.ts.map +1 -1
- package/dist/canvasCache.js +28 -22
- package/dist/canvasCache.js.map +1 -1
- package/dist/canvasNode2D.d.ts +2 -2
- package/dist/canvasNode2D.d.ts.map +1 -1
- package/dist/canvasNode2D.js +4 -1
- package/dist/canvasNode2D.js.map +1 -1
- package/dist/canvasRenderPass.d.ts +6 -0
- package/dist/canvasRenderPass.d.ts.map +1 -0
- package/dist/canvasRenderPass.js +135 -0
- package/dist/canvasRenderPass.js.map +1 -0
- package/dist/canvasRenderState.d.ts +2 -2
- package/dist/canvasRenderState.d.ts.map +1 -1
- package/dist/canvasRenderState.js +7 -14
- package/dist/canvasRenderState.js.map +1 -1
- package/dist/canvasRenderSurface.d.ts +3 -1
- package/dist/canvasRenderSurface.d.ts.map +1 -1
- package/dist/canvasRenderSurface.js +14 -0
- package/dist/canvasRenderSurface.js.map +1 -1
- package/dist/canvasRenderTexture.d.ts +7 -6
- package/dist/canvasRenderTexture.d.ts.map +1 -1
- package/dist/canvasRenderTexture.js +13 -10
- package/dist/canvasRenderTexture.js.map +1 -1
- package/dist/canvasRenderTexturePool.d.ts.map +1 -1
- package/dist/canvasRenderTexturePool.js +2 -4
- package/dist/canvasRenderTexturePool.js.map +1 -1
- package/dist/canvasScreenRenderTarget.d.ts +6 -0
- package/dist/canvasScreenRenderTarget.d.ts.map +1 -0
- package/dist/canvasScreenRenderTarget.js +35 -0
- package/dist/canvasScreenRenderTarget.js.map +1 -0
- package/dist/canvasTestSupport.d.ts +8 -3
- package/dist/canvasTestSupport.d.ts.map +1 -1
- package/dist/canvasTestSupport.js +32 -5
- package/dist/canvasTestSupport.js.map +1 -1
- package/dist/canvasTextureRenderTarget.d.ts +6 -0
- package/dist/canvasTextureRenderTarget.d.ts.map +1 -0
- package/dist/canvasTextureRenderTarget.js +37 -0
- package/dist/canvasTextureRenderTarget.js.map +1 -0
- package/dist/contract.d.ts +5 -3
- package/dist/contract.d.ts.map +1 -1
- package/dist/contract.js +5 -3
- package/dist/contract.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +21 -18
- package/src/canvasBitmapText.test.ts +15 -1
- package/src/canvasBitmapTextureResolver.test.ts +23 -9
- package/src/canvasCache.test.ts +26 -32
- package/src/canvasFillPattern.test.ts +19 -5
- package/src/canvasImageSource.test.ts +22 -8
- package/src/canvasImageTextureResolver.test.ts +15 -1
- package/src/canvasMaterials.test.ts +8 -2
- package/src/canvasNode2D.test.ts +6 -6
- package/src/canvasParticleEmitter2D.test.ts +15 -1
- package/src/canvasQuadBatch.test.ts +15 -1
- package/src/canvasRenderPass.test.ts +180 -0
- package/src/canvasRenderState.test.ts +13 -30
- package/src/canvasRenderSurface.test.ts +33 -0
- package/src/canvasRenderTexture.test.ts +4 -4
- package/src/canvasRenderTexturePool.test.ts +11 -15
- package/src/canvasScale9Sprite.test.ts +15 -1
- package/src/canvasScreenRenderTarget.test.ts +75 -0
- package/src/canvasShape.test.ts +19 -5
- package/src/canvasShapeCommands.test.ts +17 -5
- package/src/canvasShapeRasterizer.test.ts +24 -10
- package/src/canvasSprite.test.ts +15 -1
- package/src/canvasTestSupport.test.ts +42 -3
- package/src/canvasTextureRenderTarget.test.ts +68 -0
- package/src/canvasTextureResolver.test.ts +15 -1
- package/src/canvasTextureView.test.ts +18 -1
- package/src/canvasTextureWindowSource.test.ts +15 -1
- package/src/canvasTilemap.test.ts +15 -1
- package/dist/canvasBackground.d.ts +0 -3
- package/dist/canvasBackground.d.ts.map +0 -1
- package/dist/canvasBackground.js +0 -21
- package/dist/canvasBackground.js.map +0 -1
- package/dist/canvasRenderStateHandles.d.ts +0 -3
- package/dist/canvasRenderStateHandles.d.ts.map +0 -1
- package/dist/canvasRenderStateHandles.js +0 -15
- package/dist/canvasRenderStateHandles.js.map +0 -1
- package/dist/canvasRenderTarget.d.ts +0 -27
- package/dist/canvasRenderTarget.d.ts.map +0 -1
- package/dist/canvasRenderTarget.js +0 -89
- package/dist/canvasRenderTarget.js.map +0 -1
- package/src/canvasBackground.test.ts +0 -65
- package/src/canvasRenderStateHandles.test.ts +0 -42
- package/src/canvasRenderTarget.test.ts +0 -168
package/README.md
CHANGED
|
@@ -13,5 +13,5 @@ Import the supported application-facing API from `@flighthq/scene2d-canvas`. The
|
|
|
13
13
|
This package is part of the locked-version Flight SDK graph. Applications may instead install and import `@flighthq/sdk` when package-level tree shaking is sufficient.
|
|
14
14
|
|
|
15
15
|
- [Flight project](https://github.com/flighthq/flight)
|
|
16
|
-
- [Source for @flighthq/scene2d-canvas@0.5.1-next.
|
|
17
|
-
- [License](https://github.com/flighthq/flight/blob/
|
|
16
|
+
- [Source for @flighthq/scene2d-canvas@0.5.1-next.1201.9b49dee](https://github.com/flighthq/flight/tree/9b49dee3f22f6b2838c3d237edcc77bca65734f2/packages/scene2d-canvas)
|
|
17
|
+
- [License](https://github.com/flighthq/flight/blob/9b49dee3f22f6b2838c3d237edcc77bca65734f2/LICENSE.md)
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import type { CanvasTextureResolvers,
|
|
2
|
-
export declare function registerCanvasBitmapTextureResolver(
|
|
1
|
+
import type { CanvasTextureResolvers, HostImageProvider } from '@flighthq/types/contract';
|
|
2
|
+
export declare function registerCanvasBitmapTextureResolver(hostImage: Readonly<HostImageProvider>, resolvers: CanvasTextureResolvers): void;
|
|
3
3
|
//# sourceMappingURL=canvasBitmapTextureResolver.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canvasBitmapTextureResolver.d.ts","sourceRoot":"","sources":["../src/canvasBitmapTextureResolver.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAU,sBAAsB,EAAE,
|
|
1
|
+
{"version":3,"file":"canvasBitmapTextureResolver.d.ts","sourceRoot":"","sources":["../src/canvasBitmapTextureResolver.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAU,sBAAsB,EAAE,iBAAiB,EAAW,MAAM,0BAA0B,CAAC;AAK3G,wBAAgB,mCAAmC,CACjD,SAAS,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EACtC,SAAS,EAAE,sBAAsB,GAChC,IAAI,CAIN"}
|
|
@@ -2,17 +2,17 @@ import { createImageResourceFromBitmap } from '@flighthq/image/contract';
|
|
|
2
2
|
import { getTextureSource } from '@flighthq/texture/contract';
|
|
3
3
|
import { BitmapTextureSourceKind } from '@flighthq/types/contract';
|
|
4
4
|
import { registerCanvasTextureResolver } from './canvasTextureResolver';
|
|
5
|
-
export function registerCanvasBitmapTextureResolver(
|
|
6
|
-
registerCanvasTextureResolver(resolvers, BitmapTextureSourceKind, (r, texture) => resolveCanvasBitmapTexture(
|
|
5
|
+
export function registerCanvasBitmapTextureResolver(hostImage, resolvers) {
|
|
6
|
+
registerCanvasTextureResolver(resolvers, BitmapTextureSourceKind, (r, texture) => resolveCanvasBitmapTexture(hostImage, r, texture));
|
|
7
7
|
}
|
|
8
|
-
function resolveCanvasBitmapTexture(
|
|
8
|
+
function resolveCanvasBitmapTexture(hostImage, resolvers, texture) {
|
|
9
9
|
const bitmap = getTextureSource(texture);
|
|
10
10
|
if (bitmap === null)
|
|
11
11
|
return null;
|
|
12
12
|
const cache = (resolvers.bitmapElementCache ??= new WeakMap());
|
|
13
13
|
let entry = cache.get(bitmap);
|
|
14
14
|
if (entry === undefined || entry.version !== bitmap.version) {
|
|
15
|
-
const image = createImageResourceFromBitmap(
|
|
15
|
+
const image = createImageResourceFromBitmap(hostImage, bitmap);
|
|
16
16
|
if (image === null)
|
|
17
17
|
return null;
|
|
18
18
|
entry = { element: image.source, version: bitmap.version };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canvasBitmapTextureResolver.js","sourceRoot":"","sources":["../src/canvasBitmapTextureResolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,6BAA6B,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAE9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAEnE,OAAO,EAAE,6BAA6B,EAAE,MAAM,yBAAyB,CAAC;AAExE,MAAM,UAAU,mCAAmC,CACjD,
|
|
1
|
+
{"version":3,"file":"canvasBitmapTextureResolver.js","sourceRoot":"","sources":["../src/canvasBitmapTextureResolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,6BAA6B,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAE9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAEnE,OAAO,EAAE,6BAA6B,EAAE,MAAM,yBAAyB,CAAC;AAExE,MAAM,UAAU,mCAAmC,CACjD,SAAsC,EACtC,SAAiC;IAEjC,6BAA6B,CAAC,SAAS,EAAE,uBAAuB,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,CAC/E,0BAA0B,CAAC,SAAS,EAAE,CAAC,EAAE,OAAO,CAAC,CAClD,CAAC;AACJ,CAAC;AAED,SAAS,0BAA0B,CACjC,SAAsC,EACtC,SAAiC,EACjC,OAA0B;IAE1B,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAA4B,CAAC;IACpE,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAEjC,MAAM,KAAK,GAAG,CAAC,SAAS,CAAC,kBAAkB,KAAK,IAAI,OAAO,EAAE,CAAC,CAAC;IAC/D,IAAI,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9B,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,KAAK,MAAM,CAAC,OAAO,EAAE,CAAC;QAC5D,MAAM,KAAK,GAAG,6BAA6B,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAC/D,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAChC,KAAK,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,MAA2B,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;QAChF,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,KAAK,CAAC,OAAO,CAAC;AACvB,CAAC"}
|
package/dist/canvasCache.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { CanvasPipeline, CanvasRenderOptions,
|
|
1
|
+
import type { CanvasPipeline, CanvasRenderOptions, CanvasRenderState, CanvasTextureRenderTarget, CanvasTextureResolvers, Node2D, Scene2DRenderer, RenderCache, RenderCacheRefreshOptions, RenderState } from '@flighthq/types/contract';
|
|
2
2
|
/**
|
|
3
3
|
* Creates a dedicated offscreen render state for baking render caches consumed by
|
|
4
4
|
* `screenState`. It copies the screen state's renderers and propagates the settings that
|
|
@@ -6,13 +6,13 @@ import type { CanvasPipeline, CanvasRenderOptions, CanvasRenderSurface, CanvasRe
|
|
|
6
6
|
* baked subtree looks the same offscreen as it would on screen — but keeps its own render
|
|
7
7
|
* node map, adapter map, and frame counter, so baking never touches the screen state.
|
|
8
8
|
*/
|
|
9
|
-
export declare function createCanvasCacheState(ownerState: CanvasRenderState,
|
|
9
|
+
export declare function createCanvasCacheState(ownerState: CanvasRenderState, pipeline: Readonly<CanvasPipeline>, canvasTextureResolvers: CanvasTextureResolvers, options?: Partial<CanvasRenderOptions>): CanvasRenderState;
|
|
10
10
|
/**
|
|
11
11
|
* Creates an independent offscreen pipeline whose Canvas targets remain owned by `screenState`.
|
|
12
12
|
* Renderers and policy registrations are creation-time snapshots; traversal/proxy state and host
|
|
13
13
|
* canvases remain independent.
|
|
14
14
|
*/
|
|
15
|
-
export declare function createCanvasOffscreenRenderState(
|
|
15
|
+
export declare function createCanvasOffscreenRenderState(pipeline: Readonly<CanvasPipeline>, canvasTextureResolvers: CanvasTextureResolvers, options?: Partial<CanvasRenderOptions>): CanvasRenderState;
|
|
16
16
|
export declare function destroyCanvasRenderCacheTarget(state: CanvasRenderState, cache: RenderCache): void;
|
|
17
17
|
export declare function enableCanvasRenderCache(state: RenderState): void;
|
|
18
18
|
/**
|
|
@@ -20,8 +20,8 @@ export declare function enableCanvasRenderCache(state: RenderState): void;
|
|
|
20
20
|
* so a caller can draw custom content into `target.context` directly (for example a filtered
|
|
21
21
|
* image). For engine-baked content prefer refreshCanvasRenderCache.
|
|
22
22
|
*/
|
|
23
|
-
export declare function ensureCanvasRenderCacheTarget(state: CanvasRenderState, cache: RenderCache, width: number, height: number):
|
|
24
|
-
export declare function getCanvasRenderCacheTarget(state: CanvasRenderState, cache: RenderCache):
|
|
23
|
+
export declare function ensureCanvasRenderCacheTarget(state: CanvasRenderState, cache: RenderCache, width: number, height: number): CanvasTextureRenderTarget;
|
|
24
|
+
export declare function getCanvasRenderCacheTarget(state: CanvasRenderState, cache: RenderCache): CanvasTextureRenderTarget | null;
|
|
25
25
|
/**
|
|
26
26
|
* Bakes `source`'s subtree into its cache target using the offscreen `cacheState`, then
|
|
27
27
|
* records the transform that places the result back in scene space. The bake runs on the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canvasCache.d.ts","sourceRoot":"","sources":["../src/canvasCache.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EACV,cAAc,EACd,mBAAmB,EACnB,
|
|
1
|
+
{"version":3,"file":"canvasCache.d.ts","sourceRoot":"","sources":["../src/canvasCache.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EACV,cAAc,EACd,mBAAmB,EACnB,iBAAiB,EACjB,yBAAyB,EACzB,sBAAsB,EACtB,MAAM,EACN,eAAe,EAEf,WAAW,EACX,yBAAyB,EAEzB,WAAW,EACZ,MAAM,0BAA0B,CAAC;AAiBlC;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,iBAAiB,EAC7B,QAAQ,EAAE,QAAQ,CAAC,cAAc,CAAC,EAClC,sBAAsB,EAAE,sBAAsB,EAC9C,OAAO,GAAE,OAAO,CAAC,mBAAmB,CAAM,GACzC,iBAAiB,CAInB;AAED;;;;GAIG;AACH,wBAAgB,gCAAgC,CAC9C,QAAQ,EAAE,QAAQ,CAAC,cAAc,CAAC,EAClC,sBAAsB,EAAE,sBAAsB,EAC9C,OAAO,GAAE,OAAO,CAAC,mBAAmB,CAAM,GACzC,iBAAiB,CAEnB;AAED,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CAUjG;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAEhE;AAED;;;;GAIG;AACH,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,iBAAiB,EACxB,KAAK,EAAE,WAAW,EAClB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,yBAAyB,CAW3B;AAED,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,iBAAiB,EACxB,KAAK,EAAE,WAAW,GACjB,yBAAyB,GAAG,IAAI,CAElC;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,iBAAiB,EAC7B,UAAU,EAAE,iBAAiB,EAC7B,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,QAAQ,CAAC,yBAAyB,CAAC,GAC5C,OAAO,CA+BT;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CAM3F;AAgCD,eAAO,MAAM,gCAAgC,EAAE,eAG9C,CAAC"}
|
package/dist/canvasCache.js
CHANGED
|
@@ -2,9 +2,10 @@ import { createMatrix, createRectangle } from '@flighthq/geometry/contract';
|
|
|
2
2
|
import { computeNodeBoundsRectangle } from '@flighthq/node/contract';
|
|
3
3
|
import { computeScene2DRenderTargetTransform, computeRenderCacheTransform, computeRenderTargetSize, getRenderProxyCache, noopRendererData, prepareScene2DRender, registerRenderCacheRenderer, } from '@flighthq/render/contract';
|
|
4
4
|
import { renderCanvasScene2D } from './canvasNode2D';
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
5
|
+
import { beginCanvasRenderPass, endCanvasRenderPass, setCanvasRenderTransform2D } from './canvasRenderPass';
|
|
6
|
+
import { createCanvasRenderState, destroyCanvasRenderState, registerCanvasRenderStateTeardown, } from './canvasRenderState';
|
|
7
|
+
import { getCanvasSurfaceCreator } from './canvasRenderSurface';
|
|
8
|
+
import { createCanvasTextureRenderTarget, destroyCanvasTextureRenderTarget, resizeCanvasTextureRenderTarget, } from './canvasTextureRenderTarget';
|
|
8
9
|
import { setCanvasTransform } from './canvasTransform';
|
|
9
10
|
/**
|
|
10
11
|
* Creates a dedicated offscreen render state for baking render caches consumed by
|
|
@@ -13,8 +14,8 @@ import { setCanvasTransform } from './canvasTransform';
|
|
|
13
14
|
* baked subtree looks the same offscreen as it would on screen — but keeps its own render
|
|
14
15
|
* node map, adapter map, and frame counter, so baking never touches the screen state.
|
|
15
16
|
*/
|
|
16
|
-
export function createCanvasCacheState(ownerState,
|
|
17
|
-
const cacheState = createCanvasOffscreenRenderState(
|
|
17
|
+
export function createCanvasCacheState(ownerState, pipeline, canvasTextureResolvers, options = {}) {
|
|
18
|
+
const cacheState = createCanvasOffscreenRenderState(pipeline, canvasTextureResolvers, options);
|
|
18
19
|
registerCanvasRenderStateTeardown(ownerState, () => destroyCanvasRenderState(cacheState));
|
|
19
20
|
return cacheState;
|
|
20
21
|
}
|
|
@@ -23,8 +24,8 @@ export function createCanvasCacheState(ownerState, surface, pipeline, canvasText
|
|
|
23
24
|
* Renderers and policy registrations are creation-time snapshots; traversal/proxy state and host
|
|
24
25
|
* canvases remain independent.
|
|
25
26
|
*/
|
|
26
|
-
export function createCanvasOffscreenRenderState(
|
|
27
|
-
return createCanvasRenderState(
|
|
27
|
+
export function createCanvasOffscreenRenderState(pipeline, canvasTextureResolvers, options = {}) {
|
|
28
|
+
return createCanvasRenderState(pipeline, canvasTextureResolvers, options);
|
|
28
29
|
}
|
|
29
30
|
export function destroyCanvasRenderCacheTarget(state, cache) {
|
|
30
31
|
// Explicitly collapses the offscreen canvas backing this cache's render target so the browser
|
|
@@ -33,7 +34,7 @@ export function destroyCanvasRenderCacheTarget(state, cache) {
|
|
|
33
34
|
const targets = getTargets(state);
|
|
34
35
|
const target = targets.get(cache);
|
|
35
36
|
if (target !== undefined) {
|
|
36
|
-
|
|
37
|
+
destroyCanvasTextureRenderTarget(target);
|
|
37
38
|
targets.delete(cache);
|
|
38
39
|
}
|
|
39
40
|
}
|
|
@@ -46,14 +47,15 @@ export function enableCanvasRenderCache(state) {
|
|
|
46
47
|
* image). For engine-baked content prefer refreshCanvasRenderCache.
|
|
47
48
|
*/
|
|
48
49
|
export function ensureCanvasRenderCacheTarget(state, cache, width, height) {
|
|
50
|
+
const creator = getCanvasSurfaceCreator(state);
|
|
49
51
|
const targets = getTargets(state);
|
|
50
52
|
let target = targets.get(cache);
|
|
51
53
|
if (target === undefined) {
|
|
52
|
-
target =
|
|
54
|
+
target = createCanvasTextureRenderTarget(creator, width, height);
|
|
53
55
|
targets.set(cache, target);
|
|
54
56
|
}
|
|
55
57
|
else {
|
|
56
|
-
|
|
58
|
+
resizeCanvasTextureRenderTarget(target, width, height);
|
|
57
59
|
}
|
|
58
60
|
return target;
|
|
59
61
|
}
|
|
@@ -84,24 +86,28 @@ export function refreshCanvasRenderCache(ownerState, cacheState, cache, source,
|
|
|
84
86
|
const target = ensureCanvasRenderCacheTarget(ownerState, cache, width, height);
|
|
85
87
|
computeScene2DRenderTargetTransform(_renderTransform, source, _bounds, padding, padding);
|
|
86
88
|
computeRenderCacheTransform(cache.transform, _bounds, padding, padding);
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
89
|
+
// The bake is an ordinary pass into the cache target: begin installs its context and resets
|
|
90
|
+
// compositing, and end restores whatever the caller was drawing through.
|
|
91
|
+
const pass = beginCanvasRenderPass(cacheState, target);
|
|
92
|
+
try {
|
|
93
|
+
setCanvasRenderTransform2D(pass, _renderTransform);
|
|
94
|
+
const dirty = prepareScene2DRender(cacheState, source);
|
|
95
|
+
if (dirty || resized) {
|
|
96
|
+
pass.context.clearRect(0, 0, target.canvas.width, target.canvas.height);
|
|
97
|
+
renderCanvasScene2D(pass, source);
|
|
98
|
+
}
|
|
99
|
+
return dirty || resized;
|
|
100
|
+
}
|
|
101
|
+
finally {
|
|
102
|
+
endCanvasRenderPass(pass);
|
|
96
103
|
}
|
|
97
|
-
return dirty || resized;
|
|
98
104
|
}
|
|
99
105
|
export function releaseCanvasRenderCache(state, cache) {
|
|
100
106
|
const targets = _renderCacheTargets.get(state);
|
|
101
107
|
const target = targets?.get(cache);
|
|
102
108
|
if (target === undefined)
|
|
103
109
|
return;
|
|
104
|
-
|
|
110
|
+
destroyCanvasTextureRenderTarget(target);
|
|
105
111
|
targets.delete(cache);
|
|
106
112
|
}
|
|
107
113
|
function drawCanvasRenderCache(state, renderProxy) {
|
|
@@ -131,7 +137,7 @@ function destroyOwnedCanvasRenderCacheTargets(state) {
|
|
|
131
137
|
if (targets === undefined)
|
|
132
138
|
return;
|
|
133
139
|
for (const target of targets.values())
|
|
134
|
-
|
|
140
|
+
destroyCanvasTextureRenderTarget(target);
|
|
135
141
|
targets.clear();
|
|
136
142
|
_renderCacheTargets.delete(state);
|
|
137
143
|
}
|
package/dist/canvasCache.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canvasCache.js","sourceRoot":"","sources":["../src/canvasCache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC5E,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EACL,mCAAmC,EACnC,2BAA2B,EAC3B,uBAAuB,EACvB,mBAAmB,EACnB,gBAAgB,EAChB,oBAAoB,EACpB,2BAA2B,GAC5B,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"canvasCache.js","sourceRoot":"","sources":["../src/canvasCache.ts"],"names":[],"mappings":"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"}
|
package/dist/canvasNode2D.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { CanvasRenderState, Node2D, RenderProxy2D, Scene2DRenderer } from '@flighthq/types/contract';
|
|
1
|
+
import type { CanvasRenderPass, CanvasRenderState, Node2D, RenderProxy2D, Scene2DRenderer } from '@flighthq/types/contract';
|
|
2
2
|
export declare function drawCanvasScene2D(_state: CanvasRenderState, _renderProxy: RenderProxy2D): void;
|
|
3
3
|
export declare const defaultCanvasScene2DRenderer: Scene2DRenderer;
|
|
4
|
-
export declare function renderCanvasScene2D(
|
|
4
|
+
export declare function renderCanvasScene2D(pass: CanvasRenderPass, source: Node2D): void;
|
|
5
5
|
//# sourceMappingURL=canvasNode2D.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canvasNode2D.d.ts","sourceRoot":"","sources":["../src/canvasNode2D.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"canvasNode2D.d.ts","sourceRoot":"","sources":["../src/canvasNode2D.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,gBAAgB,EAChB,iBAAiB,EACjB,MAAM,EACN,aAAa,EACb,eAAe,EAChB,MAAM,0BAA0B,CAAC;AAKlC,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,EAAE,YAAY,EAAE,aAAa,GAAG,IAAI,CAE9F;AAED,eAAO,MAAM,4BAA4B,EAAE,eAG1C,CAAC;AAIF,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAqChF"}
|
package/dist/canvasNode2D.js
CHANGED
|
@@ -9,7 +9,10 @@ export const defaultCanvasScene2DRenderer = {
|
|
|
9
9
|
createData: noopRendererData,
|
|
10
10
|
submit: drawCanvasScene2D,
|
|
11
11
|
};
|
|
12
|
-
|
|
12
|
+
// Draws `source`'s subtree into the pass. The pass names the target, so the same scene renders to the
|
|
13
|
+
// screen or into an offscreen canvas with no argument but this one changing.
|
|
14
|
+
export function renderCanvasScene2D(pass, source) {
|
|
15
|
+
const state = pass.state;
|
|
13
16
|
const tempStack = getCanvasRenderStateRuntime(state).tempStack;
|
|
14
17
|
const clipHooks = state.displayObjectClipHooks;
|
|
15
18
|
let stackLength = 1;
|
package/dist/canvasNode2D.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canvasNode2D.js","sourceRoot":"","sources":["../src/canvasNode2D.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AACrG,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"canvasNode2D.js","sourceRoot":"","sources":["../src/canvasNode2D.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AACrG,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAS9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAElE,MAAM,UAAU,iBAAiB,CAAC,MAAyB,EAAE,YAA2B;IACtF,8DAA8D;AAChE,CAAC;AAED,MAAM,CAAC,MAAM,4BAA4B,GAAoB;IAC3D,UAAU,EAAE,gBAAgB;IAC5B,MAAM,EAAE,iBAAiB;CAC1B,CAAC;AAEF,sGAAsG;AACtG,6EAA6E;AAC7E,MAAM,UAAU,mBAAmB,CAAC,IAAsB,EAAE,MAAc;IACxE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IACzB,MAAM,SAAS,GAAG,2BAA2B,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC;IAC/D,MAAM,SAAS,GAAG,KAAK,CAAC,sBAAsB,CAAC;IAE/C,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,SAAS,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;IAEtB,OAAO,WAAW,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,SAAS,CAAC,EAAE,WAAW,CAAW,CAAC;QACnD,IAAI,CAAC,OAAO,CAAC,OAAO;YAAE,SAAS;QAE/B,MAAM,IAAI,GAAG,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC9C,IAAI,IAAI,KAAK,SAAS;YAAE,SAAS;QAEjC,SAAS,EAAE,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAEzC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC;YAAE,SAAS;QAC1C,IAAI,2BAA2B,CAAC,IAAI,CAAC;YAAE,SAAS;QAEhD,SAAS,EAAE,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAE1C,MAAM,MAAM,GAAG,sBAAsB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACnD,IAAI,MAAM,KAAK,IAAI;YAAE,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;QACnD,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI;YAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC9D,IAAI,MAAM,KAAK,IAAI;YAAE,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;QACnD,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,MAAM,QAAQ,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC;YACpD,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;gBACtB,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC9C,SAAS,CAAC,WAAW,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAW,CAAC;gBACnD,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,SAAS,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC7B,CAAC;AAED,kGAAkG;AAClG,iGAAiG;AACjG,oGAAoG;AACpG,+EAA+E;AAC/E,SAAS,2BAA2B,CAAC,IAAmB;IACtD,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC;IAC3B,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AACrC,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { CanvasRenderPass, CanvasRenderState, CanvasRenderTarget, Matrix, RenderTargetClear } from '@flighthq/types/contract';
|
|
2
|
+
export declare function beginCanvasRenderPass(state: CanvasRenderState, target: CanvasRenderTarget, clear?: Readonly<RenderTargetClear>): CanvasRenderPass;
|
|
3
|
+
export declare function endCanvasRenderPass(pass: CanvasRenderPass): void;
|
|
4
|
+
export declare function getCanvasActiveRenderPass(state: CanvasRenderState): CanvasRenderPass | null;
|
|
5
|
+
export declare function setCanvasRenderTransform2D(pass: CanvasRenderPass, transform: Readonly<Matrix>): void;
|
|
6
|
+
//# sourceMappingURL=canvasRenderPass.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvasRenderPass.d.ts","sourceRoot":"","sources":["../src/canvasRenderPass.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAElB,MAAM,EACN,iBAAiB,EAClB,MAAM,0BAA0B,CAAC;AAqBlC,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,iBAAiB,EACxB,MAAM,EAAE,kBAAkB,EAC1B,KAAK,CAAC,EAAE,QAAQ,CAAC,iBAAiB,CAAC,GAClC,gBAAgB,CAkClB;AAKD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI,CAgBhE;AAKD,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,iBAAiB,GAAG,gBAAgB,GAAG,IAAI,CAE3F;AAMD,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,gBAAgB,EAAE,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI,CAIpG"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { allocateEntity, finishEntity } from '@flighthq/entity/contract';
|
|
2
|
+
import { copyMatrix, createMatrix } from '@flighthq/geometry/contract';
|
|
3
|
+
import { BlendMode } from '@flighthq/types/contract';
|
|
4
|
+
import { getCanvasRenderStateRuntime } from './canvasRenderState';
|
|
5
|
+
// Opens a render pass into `target` and returns the handle to draw through. Binding a target on this
|
|
6
|
+
// backend means installing its context on the state — each canvas element has its own — so the pass
|
|
7
|
+
// also resets compositing to a known state: source-over, alpha 1, identity transform, and the state's
|
|
8
|
+
// smoothing policy. A fresh context starts at its own defaults, and a reused one is still carrying
|
|
9
|
+
// whatever the last draw into it left behind; neither is what the next frame expects.
|
|
10
|
+
//
|
|
11
|
+
// `clear` names what the target starts from. Canvas has one color attachment and no depth or stencil,
|
|
12
|
+
// so an opaque color fills the target and a transparent one erases it; depth and stencil are ignored.
|
|
13
|
+
// Omit it to preserve the existing pixels.
|
|
14
|
+
//
|
|
15
|
+
// const pass = beginCanvasRenderPass(state, screen, { color: [0.1, 0.1, 0.18, 1.0] });
|
|
16
|
+
// renderCanvasScene2D(pass, root);
|
|
17
|
+
// endCanvasRenderPass(pass);
|
|
18
|
+
//
|
|
19
|
+
// The handle is pooled: begin claims one, end returns it. Using a handle after its end is a bug, the
|
|
20
|
+
// same contract as every other acquire/release bracket.
|
|
21
|
+
export function beginCanvasRenderPass(state, target, clear) {
|
|
22
|
+
const runtime = getCanvasRenderStateRuntime(state);
|
|
23
|
+
const saved = {
|
|
24
|
+
// Undefined on the first pass a state ever opens, which restores cleanly: end puts back exactly what
|
|
25
|
+
// begin found, and nothing may draw through a state with no pass open anyway.
|
|
26
|
+
canvas: state.canvas ?? null,
|
|
27
|
+
context: state.context ?? null,
|
|
28
|
+
currentAlpha: runtime.currentAlpha,
|
|
29
|
+
currentBlendMode: runtime.currentBlendMode,
|
|
30
|
+
renderTransform2D: state.renderTransform2D,
|
|
31
|
+
target: runtime.currentRenderTarget ?? null,
|
|
32
|
+
};
|
|
33
|
+
const context = target.context;
|
|
34
|
+
state.canvas = target.canvas;
|
|
35
|
+
state.context = context;
|
|
36
|
+
runtime.currentRenderTarget = target;
|
|
37
|
+
// Reset compositing directly rather than through the blend-mode map, so opening a pass never pulls
|
|
38
|
+
// blend-mode support into a bundle that draws nothing blended; each display object re-applies its own
|
|
39
|
+
// mode through state.applyBlendMode when it draws.
|
|
40
|
+
context.globalCompositeOperation = 'source-over';
|
|
41
|
+
runtime.currentBlendMode = BlendMode.Normal;
|
|
42
|
+
context.globalAlpha = 1;
|
|
43
|
+
runtime.currentAlpha = 1;
|
|
44
|
+
context.setTransform(1, 0, 0, 1, 0, 0);
|
|
45
|
+
context.imageSmoothingEnabled = runtime.imageSmoothingEnabled;
|
|
46
|
+
context.imageSmoothingQuality = runtime.imageSmoothingQuality;
|
|
47
|
+
clearCanvasRenderPassTarget(target, clear);
|
|
48
|
+
const pass = acquireCanvasRenderPassHandle(state, target, context, saved);
|
|
49
|
+
runtime.passStack.push(pass);
|
|
50
|
+
return pass;
|
|
51
|
+
}
|
|
52
|
+
// Ends the pass: restores the enclosing pass's canvas, context, compositing shadow, and 2D transform.
|
|
53
|
+
// Ending a pass twice, or out of order, throws — an unbalanced bracket is a programmer error, and
|
|
54
|
+
// accepting it silently leaves later draws going to whichever canvas happened to be installed.
|
|
55
|
+
export function endCanvasRenderPass(pass) {
|
|
56
|
+
const state = pass.state;
|
|
57
|
+
const runtime = getCanvasRenderStateRuntime(state);
|
|
58
|
+
if (runtime.passStack.at(-1) !== pass) {
|
|
59
|
+
throw new Error('endCanvasRenderPass: this pass is not the innermost open pass');
|
|
60
|
+
}
|
|
61
|
+
runtime.passStack.pop();
|
|
62
|
+
const saved = pass.saved;
|
|
63
|
+
state.canvas = saved.canvas;
|
|
64
|
+
state.context = saved.context;
|
|
65
|
+
state.renderTransform2D = saved.renderTransform2D;
|
|
66
|
+
runtime.currentRenderTarget = saved.target;
|
|
67
|
+
runtime.currentAlpha = saved.currentAlpha;
|
|
68
|
+
runtime.currentBlendMode = saved.currentBlendMode;
|
|
69
|
+
releaseCanvasRenderPassHandle(pass);
|
|
70
|
+
}
|
|
71
|
+
// The pass a draw entered through, when a caller holds the state rather than the handle: a registered
|
|
72
|
+
// renderer is dispatched with the state, and the active pass is what tells it where its draw lands.
|
|
73
|
+
// Null outside any pass.
|
|
74
|
+
export function getCanvasActiveRenderPass(state) {
|
|
75
|
+
return getCanvasRenderStateRuntime(state).passStack.at(-1) ?? null;
|
|
76
|
+
}
|
|
77
|
+
// Sets the 2D root device transform the display-object update pass reads to place nodes with no scene
|
|
78
|
+
// parent. Call after beginCanvasRenderPass when a pass renders into a target with its own coordinate
|
|
79
|
+
// system (the render cache); the matching end restores the previous value. A fresh matrix is allocated
|
|
80
|
+
// rather than mutated in place, because the bracket saved the previous reference.
|
|
81
|
+
export function setCanvasRenderTransform2D(pass, transform) {
|
|
82
|
+
const next = createMatrix();
|
|
83
|
+
copyMatrix(next, transform);
|
|
84
|
+
pass.state.renderTransform2D = next;
|
|
85
|
+
}
|
|
86
|
+
function acquireCanvasRenderPassHandle(state, target, context, saved) {
|
|
87
|
+
const pooled = _passPool.pop();
|
|
88
|
+
if (pooled !== undefined) {
|
|
89
|
+
pooled.context = context;
|
|
90
|
+
pooled.saved = saved;
|
|
91
|
+
pooled.state = state;
|
|
92
|
+
pooled.target = target;
|
|
93
|
+
pooled.viewport = { height: target.height, width: target.width };
|
|
94
|
+
return pooled;
|
|
95
|
+
}
|
|
96
|
+
const out = allocateEntity();
|
|
97
|
+
out.context = context;
|
|
98
|
+
out.saved = saved;
|
|
99
|
+
out.state = state;
|
|
100
|
+
out.target = target;
|
|
101
|
+
out.viewport = { height: target.height, width: target.width };
|
|
102
|
+
return finishEntity(out);
|
|
103
|
+
}
|
|
104
|
+
// Canvas clears by painting: an opaque colour fills, a transparent one erases. Depth and stencil have no
|
|
105
|
+
// meaning on this backend and are ignored rather than emulated — the pass model is shared, the storage
|
|
106
|
+
// is not.
|
|
107
|
+
function clearCanvasRenderPassTarget(target, clear) {
|
|
108
|
+
const rgba = clear?.colors?.[0] ?? clear?.color;
|
|
109
|
+
if (rgba === undefined)
|
|
110
|
+
return;
|
|
111
|
+
const context = target.context;
|
|
112
|
+
if (rgba[3] <= 0) {
|
|
113
|
+
context.clearRect(0, 0, target.width, target.height);
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
context.fillStyle = canvasClearColorString(rgba);
|
|
117
|
+
context.fillRect(0, 0, target.width, target.height);
|
|
118
|
+
}
|
|
119
|
+
// Linear float RGBA is the clear representation every backend takes; Canvas needs it as a CSS colour.
|
|
120
|
+
// The channels are the same values a GL clear would receive, so the two backends clear to one colour.
|
|
121
|
+
function canvasClearColorString(rgba) {
|
|
122
|
+
const channel = (value) => Math.max(0, Math.min(255, Math.round(value * 0xff)));
|
|
123
|
+
return `rgba(${channel(rgba[0])}, ${channel(rgba[1])}, ${channel(rgba[2])}, ${Math.max(0, Math.min(1, rgba[3]))})`;
|
|
124
|
+
}
|
|
125
|
+
// A released handle keeps its state/target references until the next acquire overwrites them: they are
|
|
126
|
+
// plain references to objects the caller still owns, and nulling them would cost the non-null field
|
|
127
|
+
// types that make a live handle safe to read.
|
|
128
|
+
function releaseCanvasRenderPassHandle(pass) {
|
|
129
|
+
_passPool.push(pass);
|
|
130
|
+
}
|
|
131
|
+
// Pass handles are per-frame scaffolding, so a render loop must not allocate one per frame. The pool is
|
|
132
|
+
// module-scoped rather than per-state: a handle carries no canvas resource of its own, only references
|
|
133
|
+
// replaced on acquire.
|
|
134
|
+
const _passPool = [];
|
|
135
|
+
//# sourceMappingURL=canvasRenderPass.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvasRenderPass.js","sourceRoot":"","sources":["../src/canvasRenderPass.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { CanvasPipeline, CanvasRenderOptions,
|
|
2
|
-
export declare function createCanvasRenderState(
|
|
1
|
+
import type { CanvasPipeline, CanvasRenderOptions, CanvasRenderState, CanvasRenderStateRuntime, CanvasTextureResolvers } from '@flighthq/types/contract';
|
|
2
|
+
export declare function createCanvasRenderState(pipeline: Readonly<CanvasPipeline>, canvasTextureResolvers: CanvasTextureResolvers, options?: Partial<CanvasRenderOptions>): CanvasRenderState;
|
|
3
3
|
export declare function createCanvasRenderStateRuntime(pipeline: Readonly<CanvasPipeline>, canvasTextureResolvers: CanvasTextureResolvers): CanvasRenderStateRuntime;
|
|
4
4
|
export declare function destroyCanvasRenderState(state: CanvasRenderState): void;
|
|
5
5
|
export declare function getCanvasRenderStateRuntime(state: CanvasRenderState): CanvasRenderStateRuntime;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canvasRenderState.d.ts","sourceRoot":"","sources":["../src/canvasRenderState.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"canvasRenderState.d.ts","sourceRoot":"","sources":["../src/canvasRenderState.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,cAAc,EACd,mBAAmB,EACnB,iBAAiB,EACjB,wBAAwB,EACxB,sBAAsB,EACvB,MAAM,0BAA0B,CAAC;AAQlC,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,QAAQ,CAAC,cAAc,CAAC,EAClC,sBAAsB,EAAE,sBAAsB,EAC9C,OAAO,GAAE,OAAO,CAAC,mBAAmB,CAAM,GACzC,iBAAiB,CAsBnB;AAMD,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,QAAQ,CAAC,cAAc,CAAC,EAClC,sBAAsB,EAAE,sBAAsB,GAC7C,wBAAwB,CAQ1B;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAQvE;AAID,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,iBAAiB,GAAG,wBAAwB,CAE9F;AAID,wBAAgB,oCAAoC,CAAC,KAAK,EAAE,iBAAiB,GAAG,sBAAsB,CAErG;AAED,wBAAgB,iCAAiC,CAC/C,KAAK,EAAE,iBAAiB,EACxB,QAAQ,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,GAC3C,IAAI,CAEN;AAED,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAElG;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAKlF;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAKxF"}
|
|
@@ -1,26 +1,20 @@
|
|
|
1
1
|
import { createMatrix } from '@flighthq/geometry/contract';
|
|
2
|
-
import { createRenderState as _createRenderState, createRenderStateRuntime, destroyRenderState,
|
|
2
|
+
import { createRenderState as _createRenderState, createRenderStateRuntime, destroyRenderState, } from '@flighthq/render/contract';
|
|
3
3
|
import { EntityRuntimeKey } from '@flighthq/types/contract';
|
|
4
|
-
import { destroyCanvasRenderSurface } from './canvasRenderSurface';
|
|
5
4
|
import { destroyCanvasTextureResolvers } from './canvasTextureResolver';
|
|
6
|
-
|
|
5
|
+
// Takes no driver handle: a state is "how to draw" — the pipeline, the resolvers, the smoothing policy
|
|
6
|
+
// — while "where" is a render target that flows in at beginCanvasRenderPass. On this backend that
|
|
7
|
+
// separation is what lets one state draw to several canvases, since each canvas carries its own context.
|
|
8
|
+
export function createCanvasRenderState(pipeline, canvasTextureResolvers, options = {}) {
|
|
7
9
|
const state = _createRenderState({
|
|
8
10
|
pixelRatio: options.pixelRatio ?? 1,
|
|
9
11
|
renderTransform2D: options.renderTransform ?? createMatrix(),
|
|
10
12
|
roundPixels: options.roundPixels ?? false,
|
|
11
13
|
sceneGraphSyncPolicy: options.sceneGraphSyncPolicy,
|
|
12
14
|
});
|
|
13
|
-
if (options.backgroundColor != null)
|
|
14
|
-
setRenderStateBackgroundColor(state, options.backgroundColor);
|
|
15
|
-
// canvas/context/contextAttributes are readonly handles on the entity; written once here at the
|
|
16
|
-
// construction boundary.
|
|
17
15
|
state.applyBlendMode = pipeline.registries.blendModeApplication ?? null;
|
|
18
16
|
state.canvasCssFilterResolver = null;
|
|
19
|
-
state.canvas = surface.canvas;
|
|
20
|
-
state.context = surface.context;
|
|
21
|
-
state.contextAttributes = surface.contextAttributes;
|
|
22
17
|
state.pipeline = pipeline;
|
|
23
|
-
state.surface = surface;
|
|
24
18
|
const runtime = createCanvasRenderStateRuntime(pipeline, canvasTextureResolvers);
|
|
25
19
|
state[EntityRuntimeKey] = runtime;
|
|
26
20
|
// The state owns a resolution set and points its miss seam at its own emitter. The closure reads the
|
|
@@ -30,8 +24,6 @@ export function createCanvasRenderState(surface, pipeline, canvasTextureResolver
|
|
|
30
24
|
runtime.currentBlendMode = null;
|
|
31
25
|
runtime.imageSmoothingEnabled = options.imageSmoothingEnabled ?? true;
|
|
32
26
|
runtime.imageSmoothingQuality = options.imageSmoothingQuality ?? 'high';
|
|
33
|
-
surface.context.imageSmoothingEnabled = runtime.imageSmoothingEnabled;
|
|
34
|
-
surface.context.imageSmoothingQuality = runtime.imageSmoothingQuality;
|
|
35
27
|
return state;
|
|
36
28
|
}
|
|
37
29
|
// Allocates the package-private 2D-canvas runtime for a CanvasRenderState. createCanvasRenderState
|
|
@@ -42,6 +34,8 @@ export function createCanvasRenderStateRuntime(pipeline, canvasTextureResolvers)
|
|
|
42
34
|
const runtime = createRenderStateRuntime();
|
|
43
35
|
runtime.registries = { ...pipeline.registries };
|
|
44
36
|
runtime.canvasTextureResolvers = canvasTextureResolvers;
|
|
37
|
+
runtime.currentRenderTarget = null;
|
|
38
|
+
runtime.passStack = [];
|
|
45
39
|
runtime.teardowns = [];
|
|
46
40
|
return runtime;
|
|
47
41
|
}
|
|
@@ -55,7 +49,6 @@ export function destroyCanvasRenderState(state) {
|
|
|
55
49
|
runtime.teardowns.length = 0;
|
|
56
50
|
destroyRenderState(state);
|
|
57
51
|
destroyCanvasTextureResolvers(runtime.canvasTextureResolvers);
|
|
58
|
-
destroyCanvasRenderSurface(state.surface);
|
|
59
52
|
}
|
|
60
53
|
// Resolves the package-private 2D-canvas runtime attached to a CanvasRenderState. Mutable by design:
|
|
61
54
|
// the render path writes its fields every frame.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canvasRenderState.js","sourceRoot":"","sources":["../src/canvasRenderState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EACL,iBAAiB,IAAI,kBAAkB,EACvC,wBAAwB,EACxB,kBAAkB,
|
|
1
|
+
{"version":3,"file":"canvasRenderState.js","sourceRoot":"","sources":["../src/canvasRenderState.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
import type { CanvasRenderSurface, CanvasRenderSurfaceCreator, CanvasRenderSurfaceOptions, EntityConstruction } from '@flighthq/types/contract';
|
|
1
|
+
import type { CanvasRenderState, CanvasRenderSurface, CanvasRenderSurfaceCreator, CanvasRenderSurfaceOptions, EntityConstruction } from '@flighthq/types/contract';
|
|
2
2
|
export declare function acquireCanvasRenderSurface(creator: Readonly<CanvasRenderSurfaceCreator>, options: Readonly<CanvasRenderSurfaceOptions>): CanvasRenderSurface | null;
|
|
3
3
|
export declare function createCanvasRenderSurface(creator: Readonly<CanvasRenderSurfaceCreator>, canvas: HTMLCanvasElement, options?: Partial<CanvasRenderSurfaceOptions>): CanvasRenderSurface;
|
|
4
4
|
export declare function destroyCanvasRenderSurface(surface: CanvasRenderSurface): void;
|
|
5
|
+
export declare function getCanvasSurfaceCreator(state: CanvasRenderState): Readonly<CanvasRenderSurfaceCreator>;
|
|
5
6
|
export declare function initializeCanvasRenderSurface(out: EntityConstruction<CanvasRenderSurface>, creator: Readonly<CanvasRenderSurfaceCreator>, canvas: HTMLCanvasElement, context: CanvasRenderingContext2D, options: Partial<CanvasRenderSurfaceOptions>): void;
|
|
7
|
+
export declare function registerCanvasSurfaceCreator(state: CanvasRenderState, creator: Readonly<CanvasRenderSurfaceCreator>): void;
|
|
6
8
|
//# sourceMappingURL=canvasRenderSurface.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canvasRenderSurface.d.ts","sourceRoot":"","sources":["../src/canvasRenderSurface.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,mBAAmB,EACnB,0BAA0B,EAC1B,0BAA0B,EAC1B,kBAAkB,EACnB,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"canvasRenderSurface.d.ts","sourceRoot":"","sources":["../src/canvasRenderSurface.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,iBAAiB,EACjB,mBAAmB,EACnB,0BAA0B,EAC1B,0BAA0B,EAC1B,kBAAkB,EACnB,MAAM,0BAA0B,CAAC;AAKlC,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,QAAQ,CAAC,0BAA0B,CAAC,EAC7C,OAAO,EAAE,QAAQ,CAAC,0BAA0B,CAAC,GAC5C,mBAAmB,GAAG,IAAI,CAY5B;AAED,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,QAAQ,CAAC,0BAA0B,CAAC,EAC7C,MAAM,EAAE,iBAAiB,EACzB,OAAO,GAAE,OAAO,CAAC,0BAA0B,CAAM,GAChD,mBAAmB,CAErB;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI,CAK7E;AAKD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,iBAAiB,GAAG,QAAQ,CAAC,0BAA0B,CAAC,CAMtG;AAED,wBAAgB,6BAA6B,CAC3C,GAAG,EAAE,kBAAkB,CAAC,mBAAmB,CAAC,EAC5C,OAAO,EAAE,QAAQ,CAAC,0BAA0B,CAAC,EAC7C,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,wBAAwB,EACjC,OAAO,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAC3C,IAAI,CAYN;AAED,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,iBAAiB,EACxB,OAAO,EAAE,QAAQ,CAAC,0BAA0B,CAAC,GAC5C,IAAI,CAEN"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { allocateEntity, finishEntity } from '@flighthq/entity/contract';
|
|
2
2
|
import { EntityRuntimeKey } from '@flighthq/types/contract';
|
|
3
|
+
import { getCanvasRenderStateRuntime } from './canvasRenderState';
|
|
3
4
|
export function acquireCanvasRenderSurface(creator, options) {
|
|
4
5
|
const canvas = creator.createRenderSurface(options.width, options.height, options.pixelRatio);
|
|
5
6
|
if (canvas === null)
|
|
@@ -25,6 +26,16 @@ export function destroyCanvasRenderSurface(surface) {
|
|
|
25
26
|
_ownedSurfaceCreators.delete(surface);
|
|
26
27
|
creator.destroyRenderSurface(surface.canvas);
|
|
27
28
|
}
|
|
29
|
+
// The creator this state allocates offscreen canvases through: render-cache targets and render textures
|
|
30
|
+
// both ask for one, and neither can invent it — a canvas element comes from the host. Registered once,
|
|
31
|
+
// read by name, and absent until then so a screen-only state carries nothing.
|
|
32
|
+
export function getCanvasSurfaceCreator(state) {
|
|
33
|
+
const creator = getCanvasRenderStateRuntime(state).canvasSurfaceCreator;
|
|
34
|
+
if (creator === undefined) {
|
|
35
|
+
throw new Error('This CanvasRenderState has no surface creator — call registerCanvasSurfaceCreator first');
|
|
36
|
+
}
|
|
37
|
+
return creator;
|
|
38
|
+
}
|
|
28
39
|
export function initializeCanvasRenderSurface(out, creator, canvas, context, options) {
|
|
29
40
|
out.canvas = canvas;
|
|
30
41
|
out.context = context;
|
|
@@ -38,6 +49,9 @@ export function initializeCanvasRenderSurface(out, creator, canvas, context, opt
|
|
|
38
49
|
});
|
|
39
50
|
out[EntityRuntimeKey] = { binding: null };
|
|
40
51
|
}
|
|
52
|
+
export function registerCanvasSurfaceCreator(state, creator) {
|
|
53
|
+
getCanvasRenderStateRuntime(state).canvasSurfaceCreator = creator;
|
|
54
|
+
}
|
|
41
55
|
function finishCanvasRenderSurface(creator, canvas, options) {
|
|
42
56
|
const context = canvas.getContext('2d', options.contextAttributes);
|
|
43
57
|
if (context === null)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canvasRenderSurface.js","sourceRoot":"","sources":["../src/canvasRenderSurface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"canvasRenderSurface.js","sourceRoot":"","sources":["../src/canvasRenderSurface.ts"],"names":[],"mappings":"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"}
|