@flighthq/scene2d-dom 0.3.0-next.906.07cea63 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/contract.d.ts +7 -2
- package/dist/contract.d.ts.map +1 -1
- package/dist/contract.js +7 -2
- package/dist/contract.js.map +1 -1
- package/dist/domBitmapTextureResolver.d.ts +3 -0
- package/dist/domBitmapTextureResolver.d.ts.map +1 -0
- package/dist/domBitmapTextureResolver.js +23 -0
- package/dist/domBitmapTextureResolver.js.map +1 -0
- package/dist/domHtmlView.d.ts +1 -1
- package/dist/domHtmlView.d.ts.map +1 -1
- package/dist/domHtmlView.js +1 -1
- package/dist/domHtmlView.js.map +1 -1
- package/dist/domImageSource.d.ts +2 -3
- package/dist/domImageSource.d.ts.map +1 -1
- package/dist/domImageSource.js +5 -32
- package/dist/domImageSource.js.map +1 -1
- package/dist/domImageTextureResolver.d.ts +3 -0
- package/dist/domImageTextureResolver.d.ts.map +1 -0
- package/dist/domImageTextureResolver.js +10 -0
- package/dist/domImageTextureResolver.js.map +1 -0
- package/dist/domScale9Shape.d.ts +1 -1
- package/dist/domScale9Shape.d.ts.map +1 -1
- package/dist/domScale9Shape.js +21 -8
- package/dist/domScale9Shape.js.map +1 -1
- package/dist/domShape.d.ts +1 -0
- package/dist/domShape.d.ts.map +1 -1
- package/dist/domShape.js +22 -8
- package/dist/domShape.js.map +1 -1
- package/dist/domShapeRasterizer.d.ts +4 -0
- package/dist/domShapeRasterizer.d.ts.map +1 -0
- package/dist/domShapeRasterizer.js +11 -0
- package/dist/domShapeRasterizer.js.map +1 -0
- package/dist/domSprite.d.ts +4 -0
- package/dist/domSprite.d.ts.map +1 -0
- package/dist/domSprite.js +95 -0
- package/dist/domSprite.js.map +1 -0
- package/dist/domTextureResolver.d.ts +4 -0
- package/dist/domTextureResolver.d.ts.map +1 -0
- package/dist/domTextureResolver.js +26 -0
- package/dist/domTextureResolver.js.map +1 -0
- package/dist/enableDomTextureResolverGuards.d.ts +4 -0
- package/dist/enableDomTextureResolverGuards.d.ts.map +1 -0
- package/dist/enableDomTextureResolverGuards.js +8 -0
- package/dist/enableDomTextureResolverGuards.js.map +1 -0
- package/dist/explainDomTextureResolution.d.ts +3 -0
- package/dist/explainDomTextureResolution.d.ts.map +1 -0
- package/dist/explainDomTextureResolution.js +14 -0
- package/dist/explainDomTextureResolution.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/package.json +20 -14
- package/src/domBitmapTextureResolver.test.ts +17 -0
- package/src/domHtmlView.test.ts +5 -5
- package/src/domImageSource.test.ts +35 -28
- package/src/domImageTextureResolver.test.ts +24 -0
- package/src/domScale9Shape.test.ts +7 -0
- package/src/domShape.test.ts +9 -4
- package/src/domShapeRasterizer.test.ts +32 -0
- package/src/domSprite.test.ts +58 -0
- package/src/domTextureResolver.test.ts +28 -0
- package/src/enableDomTextureResolverGuards.test.ts +58 -0
- package/src/explainDomTextureResolution.test.ts +32 -0
- package/dist/domBitmap.d.ts +0 -4
- package/dist/domBitmap.d.ts.map +0 -1
- package/dist/domBitmap.js +0 -81
- package/dist/domBitmap.js.map +0 -1
- package/dist/domVideo.d.ts +0 -4
- package/dist/domVideo.d.ts.map +0 -1
- package/dist/domVideo.js +0 -27
- package/dist/domVideo.js.map +0 -1
- package/src/domBitmap.test.ts +0 -117
- package/src/domVideo.test.ts +0 -30
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enableDomTextureResolverGuards.js","sourceRoot":"","sources":["../src/enableDomTextureResolverGuards.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,8BAA8B,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AAGvG,MAAM,UAAU,kCAAkC,CAAC,KAAqB;IACtE,OAAO,8BAA8B,CAAC,KAAK,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,KAAqB;IAClE,0BAA0B,CAAC,KAAK,CAAC,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { DomRenderState, Texture, TextureResolutionExplanation } from '@flighthq/types/contract';
|
|
2
|
+
export declare function explainDomTextureResolution(state: DomRenderState, texture: Readonly<Texture>): TextureResolutionExplanation;
|
|
3
|
+
//# sourceMappingURL=explainDomTextureResolution.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"explainDomTextureResolution.d.ts","sourceRoot":"","sources":["../src/explainDomTextureResolution.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,4BAA4B,EAAE,MAAM,0BAA0B,CAAC;AAItG,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,cAAc,EACrB,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,GACzB,4BAA4B,CAU9B"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { getTextureSourceKind } from '@flighthq/texture/contract';
|
|
2
|
+
import { getDomRenderStateRuntime } from './domRenderState';
|
|
3
|
+
export function explainDomTextureResolution(state, texture) {
|
|
4
|
+
const kind = getTextureSourceKind(texture);
|
|
5
|
+
if (kind === null)
|
|
6
|
+
return { kind, status: 'missing-kind' };
|
|
7
|
+
return {
|
|
8
|
+
kind,
|
|
9
|
+
status: getDomRenderStateRuntime(state).domTextureResolverRegistry?.has(kind) === true
|
|
10
|
+
? 'registered'
|
|
11
|
+
: 'missing-resolver',
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=explainDomTextureResolution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"explainDomTextureResolution.js","sourceRoot":"","sources":["../src/explainDomTextureResolution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAGlE,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAE5D,MAAM,UAAU,2BAA2B,CACzC,KAAqB,EACrB,OAA0B;IAE1B,MAAM,IAAI,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC3C,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;IAC3D,OAAO;QACL,IAAI;QACJ,MAAM,EACJ,wBAAwB,CAAC,KAAK,CAAC,CAAC,0BAA0B,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI;YAC5E,CAAC,CAAC,YAAY;YACd,CAAC,CAAC,kBAAkB;KACzB,CAAC;AACJ,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
export { createDomRenderState,
|
|
1
|
+
export { createDomRenderState, defaultDomHtmlViewRenderer, defaultDomMorphShapeRenderer, defaultDomNativeTextRenderer, defaultDomRichTextRenderer, defaultDomScale9ShapeRenderer, defaultDomShapeRenderer, defaultDomSpriteRenderer, defaultDomTextLabelRenderer, enableDomBlendModeSupport, enableDomClipSupport, enableDomCssFilterSupport, enableDomRenderCache, enableDomTextInput, enableDomTextureResolverGuards, explainDomTextureResolution, registerDomBitmapTextureResolver, registerDomImageTextureResolver, registerDomTextureResolver, renderDomBackground, renderDomScene2D, setDomCssFilter, } from './contract';
|
|
2
|
+
export { getDomShapeRasterizer, registerDomShapeRasterizer } from './domShapeRasterizer';
|
|
2
3
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,0BAA0B,EAC1B,4BAA4B,EAC5B,4BAA4B,EAC5B,0BAA0B,EAC1B,6BAA6B,EAC7B,uBAAuB,EACvB,wBAAwB,EACxB,2BAA2B,EAC3B,yBAAyB,EACzB,oBAAoB,EACpB,yBAAyB,EACzB,oBAAoB,EACpB,kBAAkB,EAClB,8BAA8B,EAC9B,2BAA2B,EAC3B,gCAAgC,EAChC,+BAA+B,EAC/B,0BAA0B,EAC1B,mBAAmB,EACnB,gBAAgB,EAChB,eAAe,GAChB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
export { createDomRenderState,
|
|
1
|
+
export { createDomRenderState, defaultDomHtmlViewRenderer, defaultDomMorphShapeRenderer, defaultDomNativeTextRenderer, defaultDomRichTextRenderer, defaultDomScale9ShapeRenderer, defaultDomShapeRenderer, defaultDomSpriteRenderer, defaultDomTextLabelRenderer, enableDomBlendModeSupport, enableDomClipSupport, enableDomCssFilterSupport, enableDomRenderCache, enableDomTextInput, enableDomTextureResolverGuards, explainDomTextureResolution, registerDomBitmapTextureResolver, registerDomImageTextureResolver, registerDomTextureResolver, renderDomBackground, renderDomScene2D, setDomCssFilter, } from './contract';
|
|
2
|
+
export { getDomShapeRasterizer, registerDomShapeRasterizer } from './domShapeRasterizer';
|
|
2
3
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,0BAA0B,EAC1B,4BAA4B,EAC5B,4BAA4B,EAC5B,0BAA0B,EAC1B,6BAA6B,EAC7B,uBAAuB,EACvB,wBAAwB,EACxB,2BAA2B,EAC3B,yBAAyB,EACzB,oBAAoB,EACpB,yBAAyB,EACzB,oBAAoB,EACpB,kBAAkB,EAClB,8BAA8B,EAC9B,2BAA2B,EAC3B,gCAAgC,EAChC,+BAA+B,EAC/B,0BAA0B,EAC1B,mBAAmB,EACnB,gBAAgB,EAChB,eAAe,GAChB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flighthq/scene2d-dom",
|
|
3
|
-
"version": "0.3.0
|
|
3
|
+
"version": "0.3.0",
|
|
4
|
+
"author": "Joshua Granick and other contributors",
|
|
5
|
+
"license": "MIT",
|
|
4
6
|
"repository": {
|
|
5
7
|
"type": "git",
|
|
6
8
|
"url": "https://github.com/flighthq/flight.git",
|
|
@@ -36,21 +38,25 @@
|
|
|
36
38
|
"clean:dist": "tsx ../../scripts/clean-package-dist.ts"
|
|
37
39
|
},
|
|
38
40
|
"dependencies": {
|
|
39
|
-
"@flighthq/color": "0.3.0
|
|
40
|
-
"@flighthq/scene2d": "0.3.0
|
|
41
|
-
"@flighthq/scene2d-canvas": "0.3.0
|
|
42
|
-
"@flighthq/entity": "0.3.0
|
|
43
|
-
"@flighthq/geometry": "0.3.0
|
|
44
|
-
"@flighthq/image": "0.3.0
|
|
45
|
-
"@flighthq/
|
|
46
|
-
"@flighthq/
|
|
47
|
-
"@flighthq/
|
|
48
|
-
"@flighthq/
|
|
49
|
-
"@flighthq/
|
|
50
|
-
"@flighthq/
|
|
51
|
-
"@flighthq/
|
|
41
|
+
"@flighthq/color": "0.3.0",
|
|
42
|
+
"@flighthq/scene2d": "0.3.0",
|
|
43
|
+
"@flighthq/scene2d-canvas": "0.3.0",
|
|
44
|
+
"@flighthq/entity": "0.3.0",
|
|
45
|
+
"@flighthq/geometry": "0.3.0",
|
|
46
|
+
"@flighthq/image": "0.3.0",
|
|
47
|
+
"@flighthq/log": "0.3.0",
|
|
48
|
+
"@flighthq/node": "0.3.0",
|
|
49
|
+
"@flighthq/render": "0.3.0",
|
|
50
|
+
"@flighthq/signals": "0.3.0",
|
|
51
|
+
"@flighthq/shape": "0.3.0",
|
|
52
|
+
"@flighthq/text": "0.3.0",
|
|
53
|
+
"@flighthq/textinput": "0.3.0",
|
|
54
|
+
"@flighthq/textlayout": "0.3.0",
|
|
55
|
+
"@flighthq/texture": "0.3.0",
|
|
56
|
+
"@flighthq/types": "0.3.0"
|
|
52
57
|
},
|
|
53
58
|
"devDependencies": {
|
|
59
|
+
"@flighthq/bitmap": "*",
|
|
54
60
|
"@flighthq/image": "*",
|
|
55
61
|
"typescript": "^5.3.0"
|
|
56
62
|
},
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { createBitmap } from '@flighthq/bitmap/contract';
|
|
2
|
+
import { createTexture } from '@flighthq/texture/contract';
|
|
3
|
+
|
|
4
|
+
import { registerDomBitmapTextureResolver } from './domBitmapTextureResolver';
|
|
5
|
+
import { createDomRenderState } from './domRenderState';
|
|
6
|
+
import { resolveDomTexture } from './domTextureResolver';
|
|
7
|
+
|
|
8
|
+
describe('registerDomBitmapTextureResolver', () => {
|
|
9
|
+
it('materializes a Bitmap as a canvas source', () => {
|
|
10
|
+
const state = createDomRenderState(document.createElement('div'));
|
|
11
|
+
const bitmap = createBitmap(2, 2, 0xffffffff);
|
|
12
|
+
registerDomBitmapTextureResolver(state);
|
|
13
|
+
expect(resolveDomTexture(state, createTexture({ dimension: '2d', source: bitmap }))).toBeInstanceOf(
|
|
14
|
+
HTMLCanvasElement,
|
|
15
|
+
);
|
|
16
|
+
});
|
|
17
|
+
});
|
package/src/domHtmlView.test.ts
CHANGED
|
@@ -3,13 +3,13 @@ import { getOrCreateRenderProxy2D } from '@flighthq/render/contract';
|
|
|
3
3
|
import { createHtmlView } from '@flighthq/scene2d/contract';
|
|
4
4
|
import { HtmlViewKind } from '@flighthq/types/contract';
|
|
5
5
|
|
|
6
|
-
import {
|
|
6
|
+
import { defaultDomHtmlViewRenderer, drawDomHtmlView } from './domHtmlView';
|
|
7
7
|
import { createDomRenderState, getDomRenderStateRuntime } from './domRenderState';
|
|
8
8
|
|
|
9
9
|
function makeState() {
|
|
10
10
|
const container = document.createElement('div');
|
|
11
11
|
const state = createDomRenderState(container);
|
|
12
|
-
registerRenderer(state, HtmlViewKind,
|
|
12
|
+
registerRenderer(state, HtmlViewKind, defaultDomHtmlViewRenderer);
|
|
13
13
|
return state;
|
|
14
14
|
}
|
|
15
15
|
|
|
@@ -19,10 +19,10 @@ function drawGetEl(state: ReturnType<typeof makeState>, drawFn: () => void): HTM
|
|
|
19
19
|
return getDomRenderStateRuntime(state).domCurrentElement;
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
describe('
|
|
22
|
+
describe('defaultDomHtmlViewRenderer', () => {
|
|
23
23
|
it('has submit, and createData', () => {
|
|
24
|
-
expect(typeof
|
|
25
|
-
expect(typeof
|
|
24
|
+
expect(typeof defaultDomHtmlViewRenderer.submit).toBe('function');
|
|
25
|
+
expect(typeof defaultDomHtmlViewRenderer.createData).toBe('function');
|
|
26
26
|
});
|
|
27
27
|
});
|
|
28
28
|
|
|
@@ -1,47 +1,54 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import
|
|
1
|
+
import { createBitmap, invalidateBitmap } from '@flighthq/bitmap/contract';
|
|
2
|
+
import { createImageResource } from '@flighthq/image/contract';
|
|
3
|
+
import { createTexture } from '@flighthq/texture/contract';
|
|
3
4
|
|
|
4
|
-
import {
|
|
5
|
+
import { registerDomBitmapTextureResolver } from './domBitmapTextureResolver';
|
|
6
|
+
import { explainDomImageSource } from './domImageSource';
|
|
7
|
+
import { registerDomImageTextureResolver } from './domImageTextureResolver';
|
|
5
8
|
import { createDomRenderState } from './domRenderState';
|
|
9
|
+
import { resolveDomTexture } from './domTextureResolver';
|
|
6
10
|
|
|
7
11
|
function makeState() {
|
|
8
12
|
return createDomRenderState(document.createElement('div'));
|
|
9
13
|
}
|
|
10
14
|
|
|
11
|
-
function makeDataOnlyResource(width = 4, height = 4): ImageResource {
|
|
12
|
-
const resource = createImageResource();
|
|
13
|
-
resource.width = width;
|
|
14
|
-
resource.height = height;
|
|
15
|
-
resource.data = new Uint8ClampedArray(width * height * 4).fill(255);
|
|
16
|
-
return resource;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
15
|
describe('explainDomImageSource', () => {
|
|
20
|
-
it('reports element
|
|
21
|
-
expect(explainDomImageSource(createImageResource(document.createElement('img')))).toBe('element');
|
|
22
|
-
expect(explainDomImageSource(
|
|
23
|
-
expect(explainDomImageSource(createImageResource())).toBe('none');
|
|
16
|
+
it('reports element and data for the two drawable representations', () => {
|
|
17
|
+
expect(explainDomImageSource(createImageResource(globalThis.document.createElement('img')))).toBe('element');
|
|
18
|
+
expect(explainDomImageSource(createBitmap(4, 4, 0xffffffff))).toBe('data');
|
|
24
19
|
});
|
|
25
20
|
});
|
|
26
21
|
|
|
27
|
-
describe('
|
|
28
|
-
it('
|
|
22
|
+
describe('registerDomBitmapTextureResolver', () => {
|
|
23
|
+
it('materializes and caches a Bitmap, rebuilding on version bump', () => {
|
|
29
24
|
const state = makeState();
|
|
30
|
-
const
|
|
31
|
-
|
|
25
|
+
const bitmap = createBitmap(4, 4, 0xffffffff);
|
|
26
|
+
const texture = createTexture({ dimension: '2d', source: bitmap });
|
|
27
|
+
registerDomBitmapTextureResolver(state);
|
|
28
|
+
const first = resolveDomTexture(state, texture);
|
|
29
|
+
expect(first).toBeInstanceOf(HTMLCanvasElement);
|
|
30
|
+
expect(resolveDomTexture(state, texture)).toBe(first);
|
|
31
|
+
invalidateBitmap(bitmap);
|
|
32
|
+
expect(resolveDomTexture(state, texture)).not.toBe(first);
|
|
32
33
|
});
|
|
34
|
+
});
|
|
33
35
|
|
|
34
|
-
|
|
36
|
+
describe('registerDomImageTextureResolver', () => {
|
|
37
|
+
it('returns the host source element directly', () => {
|
|
35
38
|
const state = makeState();
|
|
36
|
-
const
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
expect(
|
|
40
|
-
invalidateImageResource(resource);
|
|
41
|
-
expect(resolveDomImageSource(state, resource)).not.toBe(first);
|
|
39
|
+
const img = document.createElement('img');
|
|
40
|
+
const texture = createTexture({ dimension: '2d', source: createImageResource(img) });
|
|
41
|
+
registerDomImageTextureResolver(state);
|
|
42
|
+
expect(resolveDomTexture(state, texture)).toBe(img);
|
|
42
43
|
});
|
|
44
|
+
});
|
|
43
45
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
+
describe('resolveDomTexture', () => {
|
|
47
|
+
it('returns null when no matching source resolver is registered', () => {
|
|
48
|
+
const texture = createTexture({
|
|
49
|
+
dimension: '2d',
|
|
50
|
+
source: createImageResource(globalThis.document.createElement('img')),
|
|
51
|
+
});
|
|
52
|
+
expect(resolveDomTexture(makeState(), texture)).toBeNull();
|
|
46
53
|
});
|
|
47
54
|
});
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { createImageResource } from '@flighthq/image/contract';
|
|
2
|
+
import { createTexture } from '@flighthq/texture/contract';
|
|
3
|
+
|
|
4
|
+
import { registerDomImageTextureResolver } from './domImageTextureResolver';
|
|
5
|
+
import { createDomRenderState } from './domRenderState';
|
|
6
|
+
import { resolveDomTexture } from './domTextureResolver';
|
|
7
|
+
|
|
8
|
+
describe('registerDomImageTextureResolver', () => {
|
|
9
|
+
it('returns the host image source directly', () => {
|
|
10
|
+
const state = createDomRenderState(document.createElement('div'));
|
|
11
|
+
const source = document.createElement('img');
|
|
12
|
+
const texture = createTexture({ dimension: '2d', source: createImageResource(source) });
|
|
13
|
+
registerDomImageTextureResolver(state);
|
|
14
|
+
expect(resolveDomTexture(state, texture)).toBe(source);
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it('returns a host video through the same image source kind', () => {
|
|
18
|
+
const state = createDomRenderState(document.createElement('div'));
|
|
19
|
+
const source = document.createElement('video');
|
|
20
|
+
const texture = createTexture({ dimension: '2d', source: createImageResource(source) });
|
|
21
|
+
registerDomImageTextureResolver(state);
|
|
22
|
+
expect(resolveDomTexture(state, texture)).toBe(source);
|
|
23
|
+
});
|
|
24
|
+
});
|
|
@@ -3,6 +3,9 @@ import { appendShapeBeginFill, appendShapeRectangle, createScale9Shape } from '@
|
|
|
3
3
|
|
|
4
4
|
import { createDomRenderState, getDomRenderStateRuntime } from './domRenderState';
|
|
5
5
|
import { createDomScale9ShapeData, defaultDomScale9ShapeRenderer, drawDomScale9Shape } from './domScale9Shape';
|
|
6
|
+
import { registerDomShapeRasterizer } from './domShapeRasterizer';
|
|
7
|
+
|
|
8
|
+
const noopRasterizer = (): void => {};
|
|
6
9
|
|
|
7
10
|
const grid = { height: 80, width: 80, x: 10, y: 10 };
|
|
8
11
|
|
|
@@ -13,6 +16,7 @@ function getCurrentElement(state: ReturnType<typeof createDomRenderState>): HTML
|
|
|
13
16
|
describe('createDomScale9ShapeData', () => {
|
|
14
17
|
it('creates empty renderer data', () => {
|
|
15
18
|
const state = createDomRenderState(document.createElement('div'));
|
|
19
|
+
registerDomShapeRasterizer(state, noopRasterizer);
|
|
16
20
|
const shape = createScale9Shape(grid);
|
|
17
21
|
|
|
18
22
|
const data = createDomScale9ShapeData(state, shape);
|
|
@@ -32,6 +36,7 @@ describe('defaultDomScale9ShapeRenderer', () => {
|
|
|
32
36
|
describe('drawDomScale9Shape', () => {
|
|
33
37
|
it('returns early when commands are empty', () => {
|
|
34
38
|
const state = createDomRenderState(document.createElement('div'));
|
|
39
|
+
registerDomShapeRasterizer(state, noopRasterizer);
|
|
35
40
|
const shape = createScale9Shape(grid);
|
|
36
41
|
const data = getOrCreateRenderProxy2D(state, shape);
|
|
37
42
|
data.rendererData = createDomScale9ShapeData(state, shape);
|
|
@@ -43,6 +48,7 @@ describe('drawDomScale9Shape', () => {
|
|
|
43
48
|
|
|
44
49
|
it('returns early when rendererData is null', () => {
|
|
45
50
|
const state = createDomRenderState(document.createElement('div'));
|
|
51
|
+
registerDomShapeRasterizer(state, noopRasterizer);
|
|
46
52
|
const shape = createScale9Shape(grid);
|
|
47
53
|
appendShapeBeginFill(shape, 0xff0000);
|
|
48
54
|
appendShapeRectangle(shape, 0, 0, 100, 100);
|
|
@@ -55,6 +61,7 @@ describe('drawDomScale9Shape', () => {
|
|
|
55
61
|
|
|
56
62
|
it('renders remapped commands into a canvas and strips object scale from the transform', () => {
|
|
57
63
|
const state = createDomRenderState(document.createElement('div'));
|
|
64
|
+
registerDomShapeRasterizer(state, noopRasterizer);
|
|
58
65
|
const shape = createScale9Shape(grid);
|
|
59
66
|
shape.scaleX = 2;
|
|
60
67
|
shape.scaleY = 3;
|
package/src/domShape.test.ts
CHANGED
|
@@ -5,15 +5,16 @@ import { appendShapeBeginFill, appendShapeEndFill, appendShapeRectangle, createS
|
|
|
5
5
|
import { ShapeKind } from '@flighthq/types/contract';
|
|
6
6
|
|
|
7
7
|
import { createDomRenderState, getDomRenderStateRuntime } from './domRenderState';
|
|
8
|
-
import { defaultDomShapeRenderer, drawDomShape } from './domShape';
|
|
8
|
+
import { defaultDomMorphShapeRenderer, defaultDomShapeRenderer, drawDomShape } from './domShape';
|
|
9
|
+
import { registerDomShapeRasterizer } from './domShapeRasterizer';
|
|
9
10
|
|
|
10
|
-
|
|
11
|
-
registerCanvasShapeCommands(defaultCanvasShapeCommands);
|
|
12
|
-
});
|
|
11
|
+
const noopRasterizer = (): void => {};
|
|
13
12
|
|
|
14
13
|
function makeState() {
|
|
15
14
|
const container = document.createElement('div');
|
|
16
15
|
const state = createDomRenderState(container);
|
|
16
|
+
registerCanvasShapeCommands(state, defaultCanvasShapeCommands);
|
|
17
|
+
registerDomShapeRasterizer(state, noopRasterizer);
|
|
17
18
|
registerRenderer(state, ShapeKind, defaultDomShapeRenderer);
|
|
18
19
|
return state;
|
|
19
20
|
}
|
|
@@ -29,6 +30,10 @@ describe('defaultDomShapeRenderer', () => {
|
|
|
29
30
|
expect(typeof defaultDomShapeRenderer.submit).toBe('function');
|
|
30
31
|
expect(typeof defaultDomShapeRenderer.createData).toBe('function');
|
|
31
32
|
});
|
|
33
|
+
|
|
34
|
+
it('provides the MorphShape renderer alias', () => {
|
|
35
|
+
expect(defaultDomMorphShapeRenderer).toBe(defaultDomShapeRenderer);
|
|
36
|
+
});
|
|
32
37
|
});
|
|
33
38
|
|
|
34
39
|
describe('drawDomShape', () => {
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { createRenderState, enableRenderRegistryGuards, explainRenderRegistryMisses } from '@flighthq/render/contract';
|
|
2
|
+
import { RenderRegistry } from '@flighthq/types/contract';
|
|
3
|
+
|
|
4
|
+
import { createDomRenderState } from './domRenderState';
|
|
5
|
+
import { getDomShapeRasterizer, registerDomShapeRasterizer } from './domShapeRasterizer';
|
|
6
|
+
|
|
7
|
+
describe('getDomShapeRasterizer', () => {
|
|
8
|
+
it('reports none until one is registered', () => {
|
|
9
|
+
const state = createDomRenderState(document.createElement('div'));
|
|
10
|
+
expect(getDomShapeRasterizer(state)).toBeNull();
|
|
11
|
+
});
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
describe('registerDomShapeRasterizer', () => {
|
|
15
|
+
it('installs the rasterizer the shape path draws non-solid fills through', () => {
|
|
16
|
+
const state = createDomRenderState(document.createElement('div'));
|
|
17
|
+
const rasterizer = (): void => {};
|
|
18
|
+
|
|
19
|
+
registerDomShapeRasterizer(state, rasterizer);
|
|
20
|
+
|
|
21
|
+
expect(getDomShapeRasterizer(state)).toBe(rasterizer);
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
it('removes one again, so a state can drop back to tessellation only', () => {
|
|
25
|
+
const state = createDomRenderState(document.createElement('div'));
|
|
26
|
+
registerDomShapeRasterizer(state, (): void => {});
|
|
27
|
+
|
|
28
|
+
registerDomShapeRasterizer(state, null);
|
|
29
|
+
|
|
30
|
+
expect(getDomShapeRasterizer(state)).toBeNull();
|
|
31
|
+
});
|
|
32
|
+
});
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { createImageResource, createImageResourceFromCanvas } from '@flighthq/image/contract';
|
|
2
|
+
import { getOrCreateRenderProxy2D, registerRenderer } from '@flighthq/render/contract';
|
|
3
|
+
import { createSprite } from '@flighthq/scene2d/contract';
|
|
4
|
+
import { createTexture } from '@flighthq/texture/contract';
|
|
5
|
+
import { SpriteKind } from '@flighthq/types/contract';
|
|
6
|
+
|
|
7
|
+
import { registerDomImageTextureResolver } from './domImageTextureResolver';
|
|
8
|
+
import { createDomRenderState, getDomRenderStateRuntime } from './domRenderState';
|
|
9
|
+
import { defaultDomSpriteRenderer, drawDomSprite } from './domSprite';
|
|
10
|
+
|
|
11
|
+
function drawElement(source: CanvasImageSource): HTMLElement | null {
|
|
12
|
+
const state = createDomRenderState(document.createElement('div'));
|
|
13
|
+
registerDomImageTextureResolver(state);
|
|
14
|
+
registerRenderer(state, SpriteKind, defaultDomSpriteRenderer);
|
|
15
|
+
const image = createImageResource(source);
|
|
16
|
+
image.width = 64;
|
|
17
|
+
image.height = 64;
|
|
18
|
+
const sprite = createSprite({
|
|
19
|
+
data: { texture: createTexture({ dimension: '2d', source: image }) },
|
|
20
|
+
});
|
|
21
|
+
drawDomSprite(state, getOrCreateRenderProxy2D(state, sprite));
|
|
22
|
+
return getDomRenderStateRuntime(state).domCurrentElement;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
describe('defaultDomSpriteRenderer', () => {
|
|
26
|
+
it('has submit and createData functions', () => {
|
|
27
|
+
expect(typeof defaultDomSpriteRenderer.createData).toBe('function');
|
|
28
|
+
expect(typeof defaultDomSpriteRenderer.isDirty).toBe('function');
|
|
29
|
+
expect(defaultDomSpriteRenderer.submit).toBe(drawDomSprite);
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
describe('drawDomSprite', () => {
|
|
34
|
+
it('renders an image texture as an img element', () => {
|
|
35
|
+
const image = document.createElement('img');
|
|
36
|
+
image.src = 'test.png';
|
|
37
|
+
expect(drawElement(image)?.tagName).toBe('IMG');
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
it('renders a canvas-backed texture as a canvas element', () => {
|
|
41
|
+
const canvas = document.createElement('canvas');
|
|
42
|
+
canvas.width = 64;
|
|
43
|
+
canvas.height = 64;
|
|
44
|
+
const image = createImageResourceFromCanvas(canvas);
|
|
45
|
+
const state = createDomRenderState(document.createElement('div'));
|
|
46
|
+
registerDomImageTextureResolver(state);
|
|
47
|
+
registerRenderer(state, SpriteKind, defaultDomSpriteRenderer);
|
|
48
|
+
const sprite = createSprite({
|
|
49
|
+
data: { texture: createTexture({ dimension: '2d', source: image }) },
|
|
50
|
+
});
|
|
51
|
+
drawDomSprite(state, getOrCreateRenderProxy2D(state, sprite));
|
|
52
|
+
expect(getDomRenderStateRuntime(state).domCurrentElement?.tagName).toBe('CANVAS');
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it('uses the source video element directly', () => {
|
|
56
|
+
expect(drawElement(document.createElement('video'))?.tagName).toBe('VIDEO');
|
|
57
|
+
});
|
|
58
|
+
});
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { createEntity } from '@flighthq/entity/contract';
|
|
2
|
+
import { createImageResource } from '@flighthq/image/contract';
|
|
3
|
+
import { createTexture } from '@flighthq/texture/contract';
|
|
4
|
+
import type { TextureSource } from '@flighthq/types/contract';
|
|
5
|
+
|
|
6
|
+
import { createDomRenderState } from './domRenderState';
|
|
7
|
+
import { registerDomTextureResolver, resolveDomTexture } from './domTextureResolver';
|
|
8
|
+
|
|
9
|
+
describe('registerDomTextureResolver', () => {
|
|
10
|
+
it('registers and removes one state-scoped resolver', () => {
|
|
11
|
+
const state = createDomRenderState(document.createElement('div'));
|
|
12
|
+
const textureSource = createEntity({ height: 1, kind: 'acme.test', version: 0, width: 1 }) as TextureSource;
|
|
13
|
+
const texture = createTexture({ dimension: '2d', source: textureSource });
|
|
14
|
+
const canvas = document.createElement('canvas');
|
|
15
|
+
registerDomTextureResolver(state, 'acme.test', () => canvas);
|
|
16
|
+
expect(resolveDomTexture(state, texture)).toBe(canvas);
|
|
17
|
+
registerDomTextureResolver(state, 'acme.test', null);
|
|
18
|
+
expect(resolveDomTexture(state, texture)).toBeNull();
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
describe('resolveDomTexture', () => {
|
|
23
|
+
it('returns null without a matching resolver', () => {
|
|
24
|
+
const state = createDomRenderState(document.createElement('div'));
|
|
25
|
+
const image = createImageResource(globalThis.document.createElement('img'));
|
|
26
|
+
expect(resolveDomTexture(state, createTexture({ dimension: '2d', source: image }))).toBeNull();
|
|
27
|
+
});
|
|
28
|
+
});
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { addLogSink, createMemoryLogSink, getMemoryLogSinkEntries, removeLogSink } from '@flighthq/log/contract';
|
|
2
|
+
import { createTexture } from '@flighthq/texture/contract';
|
|
3
|
+
import type { Image } from '@flighthq/types/contract';
|
|
4
|
+
|
|
5
|
+
import { createDomRenderState } from './domRenderState';
|
|
6
|
+
import { registerDomTextureResolver, resolveDomTexture } from './domTextureResolver';
|
|
7
|
+
import { areDomTextureResolverGuardsEnabled, enableDomTextureResolverGuards } from './enableDomTextureResolverGuards';
|
|
8
|
+
|
|
9
|
+
describe('areDomTextureResolverGuardsEnabled', () => {
|
|
10
|
+
it('reports whether diagnostics were installed for the state', () => {
|
|
11
|
+
const state = createDomRenderState(document.createElement('div'));
|
|
12
|
+
expect(areDomTextureResolverGuardsEnabled(state)).toBe(false);
|
|
13
|
+
|
|
14
|
+
enableDomTextureResolverGuards(state);
|
|
15
|
+
expect(areDomTextureResolverGuardsEnabled(state)).toBe(true);
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
describe('enableDomTextureResolverGuards', () => {
|
|
20
|
+
it('is idempotent', () => {
|
|
21
|
+
const state = createDomRenderState(document.createElement('div'));
|
|
22
|
+
enableDomTextureResolverGuards(state);
|
|
23
|
+
enableDomTextureResolverGuards(state);
|
|
24
|
+
expect(areDomTextureResolverGuardsEnabled(state)).toBe(true);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
it('warns once for a missing resolver and stays silent for a registered resolver returning null', () => {
|
|
28
|
+
const state = createDomRenderState(document.createElement('div'));
|
|
29
|
+
const missing = textureWithKind('acme.missing.dom');
|
|
30
|
+
const registered = textureWithKind('acme.registered.dom');
|
|
31
|
+
const sink = createMemoryLogSink(4);
|
|
32
|
+
addLogSink(sink.sink);
|
|
33
|
+
enableDomTextureResolverGuards(state);
|
|
34
|
+
registerDomTextureResolver(state, 'acme.registered.dom', () => null);
|
|
35
|
+
try {
|
|
36
|
+
expect(resolveDomTexture(state, missing)).toBeNull();
|
|
37
|
+
expect(resolveDomTexture(state, missing)).toBeNull();
|
|
38
|
+
expect(resolveDomTexture(state, registered)).toBeNull();
|
|
39
|
+
|
|
40
|
+
const entries = getMemoryLogSinkEntries(sink);
|
|
41
|
+
expect(entries).toHaveLength(1);
|
|
42
|
+
expect(entries[0]?.data).toMatchObject({
|
|
43
|
+
kind: 'acme.missing.dom',
|
|
44
|
+
message:
|
|
45
|
+
'resolveDomTexture: texture source kind has no registered resolver — call registerDomTextureResolver(state, sourceKind, resolver)',
|
|
46
|
+
});
|
|
47
|
+
} finally {
|
|
48
|
+
removeLogSink(sink.sink);
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
function textureWithKind(kind: string) {
|
|
54
|
+
return createTexture({
|
|
55
|
+
dimension: '2d',
|
|
56
|
+
source: { kind } as Image,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { createEntity } from '@flighthq/entity/contract';
|
|
2
|
+
import { createTexture } from '@flighthq/texture/contract';
|
|
3
|
+
import type { TextureSource } from '@flighthq/types/contract';
|
|
4
|
+
|
|
5
|
+
import { createDomRenderState } from './domRenderState';
|
|
6
|
+
import { registerDomTextureResolver } from './domTextureResolver';
|
|
7
|
+
import { explainDomTextureResolution } from './explainDomTextureResolution';
|
|
8
|
+
|
|
9
|
+
describe('explainDomTextureResolution', () => {
|
|
10
|
+
it('distinguishes missing kinds, missing resolvers, and registered resolvers', () => {
|
|
11
|
+
const state = createDomRenderState(document.createElement('div'));
|
|
12
|
+
const texture = createTexture({
|
|
13
|
+
dimension: '2d',
|
|
14
|
+
source: createEntity({ height: 1, kind: 'acme.test', version: 0, width: 1 }) as TextureSource,
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
expect(explainDomTextureResolution(state, createTexture())).toEqual({
|
|
18
|
+
kind: null,
|
|
19
|
+
status: 'missing-kind',
|
|
20
|
+
});
|
|
21
|
+
expect(explainDomTextureResolution(state, texture)).toEqual({
|
|
22
|
+
kind: 'acme.test',
|
|
23
|
+
status: 'missing-resolver',
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
registerDomTextureResolver(state, 'acme.test', () => null);
|
|
27
|
+
expect(explainDomTextureResolution(state, texture)).toEqual({
|
|
28
|
+
kind: 'acme.test',
|
|
29
|
+
status: 'registered',
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
});
|
package/dist/domBitmap.d.ts
DELETED
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import type { Scene2DRenderer, DomRenderState, RenderProxy2D } from '@flighthq/types/contract';
|
|
2
|
-
export declare function drawDomBitmap(state: DomRenderState, renderProxy: RenderProxy2D): void;
|
|
3
|
-
export declare const defaultDomBitmapRenderer: Scene2DRenderer;
|
|
4
|
-
//# sourceMappingURL=domBitmap.d.ts.map
|
package/dist/domBitmap.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"domBitmap.d.ts","sourceRoot":"","sources":["../src/domBitmap.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,eAAe,EACf,cAAc,EAGd,aAAa,EAEd,MAAM,0BAA0B,CAAC;AAelC,wBAAgB,aAAa,CAAC,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,GAAG,IAAI,CAkBrF;AAoFD,eAAO,MAAM,wBAAwB,EAAE,eAGtC,CAAC"}
|
package/dist/domBitmap.js
DELETED
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
import { createEntity } from '@flighthq/entity/contract';
|
|
2
|
-
import { resolveDomImageSource } from './domImageSource';
|
|
3
|
-
import { applyDomStyle, prepareDomElement, setDomRendererElement } from './domStyle';
|
|
4
|
-
function createDomBitmapData(_state, _source) {
|
|
5
|
-
return createEntity({ canvas: null, context: null, image: null });
|
|
6
|
-
}
|
|
7
|
-
export function drawDomBitmap(state, renderProxy) {
|
|
8
|
-
const data = renderProxy.rendererData;
|
|
9
|
-
if (data === null)
|
|
10
|
-
return;
|
|
11
|
-
const source = renderProxy.source;
|
|
12
|
-
const imageSource = source.data.image;
|
|
13
|
-
if (imageSource === null)
|
|
14
|
-
return;
|
|
15
|
-
// Resolve to a drawable element, materializing one from raw pixels for a data-only Surface.
|
|
16
|
-
const src = resolveDomImageSource(state, imageSource);
|
|
17
|
-
if (src === null)
|
|
18
|
-
return;
|
|
19
|
-
const sr = source.data.sourceRectangle ?? null;
|
|
20
|
-
if (sr === null && src instanceof HTMLImageElement) {
|
|
21
|
-
renderBitmapAsImage(state, renderProxy, data, src);
|
|
22
|
-
}
|
|
23
|
-
else {
|
|
24
|
-
renderBitmapAsCanvas(state, renderProxy, data, imageSource.width, imageSource.height, src, sr);
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
function renderBitmapAsImage(state, renderProxy, data, src) {
|
|
28
|
-
if (data.canvas !== null) {
|
|
29
|
-
data.canvas = null;
|
|
30
|
-
data.context = null;
|
|
31
|
-
}
|
|
32
|
-
if (data.image === null) {
|
|
33
|
-
data.image = document.createElement('img');
|
|
34
|
-
data.image.crossOrigin = 'anonymous';
|
|
35
|
-
prepareDomElement(data.image);
|
|
36
|
-
}
|
|
37
|
-
if (data.image.src !== src.src) {
|
|
38
|
-
data.image.src = src.src;
|
|
39
|
-
}
|
|
40
|
-
applyDomStyle(state, data.image, renderProxy);
|
|
41
|
-
setDomRendererElement(state, data.image);
|
|
42
|
-
}
|
|
43
|
-
function renderBitmapAsCanvas(state, renderProxy, data, width, height, src, sourceRectangle = null) {
|
|
44
|
-
if (data.image !== null) {
|
|
45
|
-
data.image = null;
|
|
46
|
-
}
|
|
47
|
-
if (data.canvas === null) {
|
|
48
|
-
data.canvas = document.createElement('canvas');
|
|
49
|
-
data.context = data.canvas.getContext('2d');
|
|
50
|
-
prepareDomElement(data.canvas);
|
|
51
|
-
}
|
|
52
|
-
const source = renderProxy.source;
|
|
53
|
-
const smoothing = source.data.smoothing && state.allowSmoothing;
|
|
54
|
-
const drawWidth = sourceRectangle !== null ? sourceRectangle.width : width;
|
|
55
|
-
const drawHeight = sourceRectangle !== null ? sourceRectangle.height : height;
|
|
56
|
-
// Size the backing store at physical pixels and constrain layout to logical pixels via CSS so the
|
|
57
|
-
// bitmap stays crisp on HiDPI displays, matching the canvas backend's createCanvasElement. Resizing
|
|
58
|
-
// clears the canvas and resets context state, so apply the scale afterward.
|
|
59
|
-
const pixelRatio = state.pixelRatio;
|
|
60
|
-
data.canvas.width = drawWidth * pixelRatio;
|
|
61
|
-
data.canvas.height = drawHeight * pixelRatio;
|
|
62
|
-
data.canvas.style.width = `${drawWidth}px`;
|
|
63
|
-
data.canvas.style.height = `${drawHeight}px`;
|
|
64
|
-
const ctx = data.context;
|
|
65
|
-
if (pixelRatio !== 1)
|
|
66
|
-
ctx.scale(pixelRatio, pixelRatio);
|
|
67
|
-
ctx.imageSmoothingEnabled = smoothing;
|
|
68
|
-
if (sourceRectangle !== null) {
|
|
69
|
-
ctx.drawImage(src, sourceRectangle.x, sourceRectangle.y, sourceRectangle.width, sourceRectangle.height, 0, 0, sourceRectangle.width, sourceRectangle.height);
|
|
70
|
-
}
|
|
71
|
-
else {
|
|
72
|
-
ctx.drawImage(src, 0, 0, width, height);
|
|
73
|
-
}
|
|
74
|
-
applyDomStyle(state, data.canvas, renderProxy);
|
|
75
|
-
setDomRendererElement(state, data.canvas);
|
|
76
|
-
}
|
|
77
|
-
export const defaultDomBitmapRenderer = {
|
|
78
|
-
createData: createDomBitmapData,
|
|
79
|
-
submit: drawDomBitmap,
|
|
80
|
-
};
|
|
81
|
-
//# sourceMappingURL=domBitmap.js.map
|