@flighthq/displayobject-dom 0.1.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/domBackground.d.ts +3 -0
- package/dist/domBackground.d.ts.map +1 -0
- package/dist/domBackground.js +9 -0
- package/dist/domBackground.js.map +1 -0
- package/dist/domBitmap.d.ts +4 -0
- package/dist/domBitmap.d.ts.map +1 -0
- package/dist/domBitmap.js +77 -0
- package/dist/domBitmap.js.map +1 -0
- package/dist/domCSSFilterBinding.d.ts +28 -0
- package/dist/domCSSFilterBinding.d.ts.map +1 -0
- package/dist/domCSSFilterBinding.js +56 -0
- package/dist/domCSSFilterBinding.js.map +1 -0
- package/dist/domCache.d.ts +14 -0
- package/dist/domCache.d.ts.map +1 -0
- package/dist/domCache.js +64 -0
- package/dist/domCache.js.map +1 -0
- package/dist/domClip.d.ts +3 -0
- package/dist/domClip.d.ts.map +1 -0
- package/dist/domClip.js +38 -0
- package/dist/domClip.js.map +1 -0
- package/dist/domClipContours.d.ts +6 -0
- package/dist/domClipContours.d.ts.map +1 -0
- package/dist/domClipContours.js +48 -0
- package/dist/domClipContours.js.map +1 -0
- package/dist/domClipRectangle.d.ts +6 -0
- package/dist/domClipRectangle.d.ts.map +1 -0
- package/dist/domClipRectangle.js +148 -0
- package/dist/domClipRectangle.js.map +1 -0
- package/dist/domDisplayObject.d.ts +5 -0
- package/dist/domDisplayObject.d.ts.map +1 -0
- package/dist/domDisplayObject.js +60 -0
- package/dist/domDisplayObject.js.map +1 -0
- package/dist/domFontSource.d.ts +5 -0
- package/dist/domFontSource.d.ts.map +1 -0
- package/dist/domFontSource.js +18 -0
- package/dist/domFontSource.js.map +1 -0
- package/dist/domMaterials.d.ts +15 -0
- package/dist/domMaterials.d.ts.map +1 -0
- package/dist/domMaterials.js +62 -0
- package/dist/domMaterials.js.map +1 -0
- package/dist/domNativeText.d.ts +5 -0
- package/dist/domNativeText.d.ts.map +1 -0
- package/dist/domNativeText.js +65 -0
- package/dist/domNativeText.js.map +1 -0
- package/dist/domReconcile.d.ts +9 -0
- package/dist/domReconcile.d.ts.map +1 -0
- package/dist/domReconcile.js +69 -0
- package/dist/domReconcile.js.map +1 -0
- package/dist/domRenderState.d.ts +5 -0
- package/dist/domRenderState.d.ts.map +1 -0
- package/dist/domRenderState.js +43 -0
- package/dist/domRenderState.js.map +1 -0
- package/dist/domRenderView.d.ts +4 -0
- package/dist/domRenderView.d.ts.map +1 -0
- package/dist/domRenderView.js +24 -0
- package/dist/domRenderView.js.map +1 -0
- package/dist/domRichText.d.ts +7 -0
- package/dist/domRichText.d.ts.map +1 -0
- package/dist/domRichText.js +183 -0
- package/dist/domRichText.js.map +1 -0
- package/dist/domScale9Mapper.d.ts +3 -0
- package/dist/domScale9Mapper.d.ts.map +1 -0
- package/dist/domScale9Mapper.js +37 -0
- package/dist/domScale9Mapper.js.map +1 -0
- package/dist/domScale9Shape.d.ts +10 -0
- package/dist/domScale9Shape.d.ts.map +1 -0
- package/dist/domScale9Shape.js +59 -0
- package/dist/domScale9Shape.js.map +1 -0
- package/dist/domShape.d.ts +4 -0
- package/dist/domShape.d.ts.map +1 -0
- package/dist/domShape.js +45 -0
- package/dist/domShape.js.map +1 -0
- package/dist/domStyle.d.ts +9 -0
- package/dist/domStyle.d.ts.map +1 -0
- package/dist/domStyle.js +25 -0
- package/dist/domStyle.js.map +1 -0
- package/dist/domSvgFilter.d.ts +27 -0
- package/dist/domSvgFilter.d.ts.map +1 -0
- package/dist/domSvgFilter.js +88 -0
- package/dist/domSvgFilter.js.map +1 -0
- package/dist/domTextHelpers.d.ts +6 -0
- package/dist/domTextHelpers.d.ts.map +1 -0
- package/dist/domTextHelpers.js +8 -0
- package/dist/domTextHelpers.js.map +1 -0
- package/dist/domTextInput.d.ts +4 -0
- package/dist/domTextInput.d.ts.map +1 -0
- package/dist/domTextInput.js +60 -0
- package/dist/domTextInput.js.map +1 -0
- package/dist/domTextLabel.d.ts +4 -0
- package/dist/domTextLabel.d.ts.map +1 -0
- package/dist/domTextLabel.js +74 -0
- package/dist/domTextLabel.js.map +1 -0
- package/dist/domTransform.d.ts +4 -0
- package/dist/domTransform.d.ts.map +1 -0
- package/dist/domTransform.js +16 -0
- package/dist/domTransform.js.map +1 -0
- package/dist/domVideo.d.ts +4 -0
- package/dist/domVideo.d.ts.map +1 -0
- package/dist/domVideo.js +27 -0
- package/dist/domVideo.js.map +1 -0
- package/dist/htmlView.d.ts +4 -0
- package/dist/htmlView.d.ts.map +1 -0
- package/dist/htmlView.js +28 -0
- package/dist/htmlView.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/package.json +49 -0
- package/src/domBackground.test.ts +35 -0
- package/src/domBitmap.test.ts +117 -0
- package/src/domCSSFilterBinding.test.ts +104 -0
- package/src/domCache.test.ts +93 -0
- package/src/domClip.test.ts +12 -0
- package/src/domClipContours.test.ts +62 -0
- package/src/domClipRectangle.test.ts +81 -0
- package/src/domDisplayObject.test.ts +236 -0
- package/src/domFontSource.test.ts +30 -0
- package/src/domMaterials.test.ts +111 -0
- package/src/domNativeText.test.ts +71 -0
- package/src/domReconcile.test.ts +158 -0
- package/src/domRenderState.test.ts +87 -0
- package/src/domRenderView.test.ts +69 -0
- package/src/domRichText.test.ts +165 -0
- package/src/domScale9Mapper.test.ts +20 -0
- package/src/domScale9Shape.test.ts +76 -0
- package/src/domShape.test.ts +85 -0
- package/src/domStyle.test.ts +130 -0
- package/src/domSvgFilter.test.ts +116 -0
- package/src/domTextHelpers.test.ts +27 -0
- package/src/domTextInput.test.ts +61 -0
- package/src/domTextLabel.test.ts +92 -0
- package/src/domTransform.test.ts +68 -0
- package/src/domVideo.test.ts +30 -0
- package/src/htmlView.test.ts +117 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domBackground.d.ts","sourceRoot":"","sources":["../src/domBackground.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEtD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAM/D"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export function renderDomBackground(state) {
|
|
2
|
+
if ((state.backgroundColor & 0xff) !== 0) {
|
|
3
|
+
state.element.style.backgroundColor = state.backgroundColorString;
|
|
4
|
+
}
|
|
5
|
+
else {
|
|
6
|
+
state.element.style.backgroundColor = '';
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=domBackground.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domBackground.js","sourceRoot":"","sources":["../src/domBackground.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,mBAAmB,CAAC,KAAqB;IACvD,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACzC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,eAAe,GAAG,KAAK,CAAC,qBAAqB,CAAC;IACpE,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,eAAe,GAAG,EAAE,CAAC;IAC3C,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { DisplayObjectRenderer, DomRenderState, RenderProxy2D } from '@flighthq/types';
|
|
2
|
+
export declare function drawDomBitmap(state: DomRenderState, renderProxy: RenderProxy2D): void;
|
|
3
|
+
export declare const defaultDomBitmapRenderer: DisplayObjectRenderer;
|
|
4
|
+
//# sourceMappingURL=domBitmap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domBitmap.d.ts","sourceRoot":"","sources":["../src/domBitmap.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,qBAAqB,EACrB,cAAc,EAGd,aAAa,EAEd,MAAM,iBAAiB,CAAC;AAczB,wBAAgB,aAAa,CAAC,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,GAAG,IAAI,CAgBrF;AAoFD,eAAO,MAAM,wBAAwB,EAAE,qBAGtC,CAAC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { createEntity } from '@flighthq/entity';
|
|
2
|
+
import { applyDomStyle, prepareDomElement, setDomRendererElement } from './domStyle';
|
|
3
|
+
function createDomBitmapData(_state, _source) {
|
|
4
|
+
return createEntity({ canvas: null, context: null, image: null });
|
|
5
|
+
}
|
|
6
|
+
export function drawDomBitmap(state, renderProxy) {
|
|
7
|
+
const data = renderProxy.rendererData;
|
|
8
|
+
if (data === null)
|
|
9
|
+
return;
|
|
10
|
+
const source = renderProxy.source;
|
|
11
|
+
const imageSource = source.data.image;
|
|
12
|
+
if (imageSource === null || imageSource.source === null)
|
|
13
|
+
return;
|
|
14
|
+
const src = imageSource.source;
|
|
15
|
+
const sr = source.data.sourceRectangle ?? null;
|
|
16
|
+
if (sr === null && src instanceof HTMLImageElement) {
|
|
17
|
+
renderBitmapAsImage(state, renderProxy, data, src);
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
renderBitmapAsCanvas(state, renderProxy, data, imageSource.width, imageSource.height, src, sr);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function renderBitmapAsImage(state, renderProxy, data, src) {
|
|
24
|
+
if (data.canvas !== null) {
|
|
25
|
+
data.canvas = null;
|
|
26
|
+
data.context = null;
|
|
27
|
+
}
|
|
28
|
+
if (data.image === null) {
|
|
29
|
+
data.image = document.createElement('img');
|
|
30
|
+
data.image.crossOrigin = 'anonymous';
|
|
31
|
+
prepareDomElement(data.image);
|
|
32
|
+
}
|
|
33
|
+
if (data.image.src !== src.src) {
|
|
34
|
+
data.image.src = src.src;
|
|
35
|
+
}
|
|
36
|
+
applyDomStyle(state, data.image, renderProxy);
|
|
37
|
+
setDomRendererElement(state, data.image);
|
|
38
|
+
}
|
|
39
|
+
function renderBitmapAsCanvas(state, renderProxy, data, width, height, src, sourceRectangle = null) {
|
|
40
|
+
if (data.image !== null) {
|
|
41
|
+
data.image = null;
|
|
42
|
+
}
|
|
43
|
+
if (data.canvas === null) {
|
|
44
|
+
data.canvas = document.createElement('canvas');
|
|
45
|
+
data.context = data.canvas.getContext('2d');
|
|
46
|
+
prepareDomElement(data.canvas);
|
|
47
|
+
}
|
|
48
|
+
const source = renderProxy.source;
|
|
49
|
+
const smoothing = source.data.smoothing && state.allowSmoothing;
|
|
50
|
+
const drawWidth = sourceRectangle !== null ? sourceRectangle.width : width;
|
|
51
|
+
const drawHeight = sourceRectangle !== null ? sourceRectangle.height : height;
|
|
52
|
+
// Size the backing store at physical pixels and constrain layout to logical pixels via CSS so the
|
|
53
|
+
// bitmap stays crisp on HiDPI displays, matching the canvas backend's createCanvasElement. Resizing
|
|
54
|
+
// clears the canvas and resets context state, so apply the scale afterward.
|
|
55
|
+
const pixelRatio = state.pixelRatio;
|
|
56
|
+
data.canvas.width = drawWidth * pixelRatio;
|
|
57
|
+
data.canvas.height = drawHeight * pixelRatio;
|
|
58
|
+
data.canvas.style.width = `${drawWidth}px`;
|
|
59
|
+
data.canvas.style.height = `${drawHeight}px`;
|
|
60
|
+
const ctx = data.context;
|
|
61
|
+
if (pixelRatio !== 1)
|
|
62
|
+
ctx.scale(pixelRatio, pixelRatio);
|
|
63
|
+
ctx.imageSmoothingEnabled = smoothing;
|
|
64
|
+
if (sourceRectangle !== null) {
|
|
65
|
+
ctx.drawImage(src, sourceRectangle.x, sourceRectangle.y, sourceRectangle.width, sourceRectangle.height, 0, 0, sourceRectangle.width, sourceRectangle.height);
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
ctx.drawImage(src, 0, 0, width, height);
|
|
69
|
+
}
|
|
70
|
+
applyDomStyle(state, data.canvas, renderProxy);
|
|
71
|
+
setDomRendererElement(state, data.canvas);
|
|
72
|
+
}
|
|
73
|
+
export const defaultDomBitmapRenderer = {
|
|
74
|
+
createData: createDomBitmapData,
|
|
75
|
+
submit: drawDomBitmap,
|
|
76
|
+
};
|
|
77
|
+
//# sourceMappingURL=domBitmap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domBitmap.js","sourceRoot":"","sources":["../src/domBitmap.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { BitmapFilter, DisplayObject, DomRenderState, RenderProxy2D } from '@flighthq/types';
|
|
2
|
+
/**
|
|
3
|
+
* Enables CSS filter support for the render state by installing the resolver the
|
|
4
|
+
* draw path consults. Bindings made via setDomCssFilter only apply once this is
|
|
5
|
+
* called — mirroring enableDomBlendModeSupport and the other opt-ins. The draw
|
|
6
|
+
* path reaches the resolver only through this field, so filter-free states leave
|
|
7
|
+
* it null and the binding module tree-shakes away entirely.
|
|
8
|
+
*/
|
|
9
|
+
export declare function enableDomCssFilterSupport(state: DomRenderState): void;
|
|
10
|
+
export declare function getDomCssFilter(renderProxy: RenderProxy2D): string | undefined;
|
|
11
|
+
/**
|
|
12
|
+
* Returns true when the filter has a native CSS `filter` equivalent supported by the DOM
|
|
13
|
+
* backend. Filters not in this set cannot be expressed directly as a CSS filter string.
|
|
14
|
+
*
|
|
15
|
+
* Callers that need a raster fallback for unsupported filters should route the subtree
|
|
16
|
+
* through the render-cache path (ensureDomRenderCacheTarget) instead of calling
|
|
17
|
+
* setDomCssFilter.
|
|
18
|
+
*/
|
|
19
|
+
export declare function hasDomCssFilterEquivalent(filter: Readonly<BitmapFilter>): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Binds a CSS filter string (e.g. "blur(4px)") to a display object for the given
|
|
22
|
+
* DOM render state, or clears it when filter is null. The binding lives on the
|
|
23
|
+
* render state side, not the scene graph, so the same display object can carry a
|
|
24
|
+
* different filter (or none) in different render states. The filter is applied via
|
|
25
|
+
* the element's `style.filter` while CSS filter support is enabled.
|
|
26
|
+
*/
|
|
27
|
+
export declare function setDomCssFilter(state: DomRenderState, node: DisplayObject, filter: string | null): void;
|
|
28
|
+
//# sourceMappingURL=domCSSFilterBinding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domCSSFilterBinding.d.ts","sourceRoot":"","sources":["../src/domCSSFilterBinding.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAElG;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAErE;AAED,wBAAgB,eAAe,CAAC,WAAW,EAAE,aAAa,GAAG,MAAM,GAAG,SAAS,CAE9E;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,GAAG,OAAO,CAEjF;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAOvG"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { getOrCreateRenderProxy2D } from '@flighthq/render';
|
|
2
|
+
/**
|
|
3
|
+
* Enables CSS filter support for the render state by installing the resolver the
|
|
4
|
+
* draw path consults. Bindings made via setDomCssFilter only apply once this is
|
|
5
|
+
* called — mirroring enableDomBlendModeSupport and the other opt-ins. The draw
|
|
6
|
+
* path reaches the resolver only through this field, so filter-free states leave
|
|
7
|
+
* it null and the binding module tree-shakes away entirely.
|
|
8
|
+
*/
|
|
9
|
+
export function enableDomCssFilterSupport(state) {
|
|
10
|
+
state.domCssFilterResolver = getDomCssFilter;
|
|
11
|
+
}
|
|
12
|
+
export function getDomCssFilter(renderProxy) {
|
|
13
|
+
return _cssFilterBindings.get(renderProxy);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Returns true when the filter has a native CSS `filter` equivalent supported by the DOM
|
|
17
|
+
* backend. Filters not in this set cannot be expressed directly as a CSS filter string.
|
|
18
|
+
*
|
|
19
|
+
* Callers that need a raster fallback for unsupported filters should route the subtree
|
|
20
|
+
* through the render-cache path (ensureDomRenderCacheTarget) instead of calling
|
|
21
|
+
* setDomCssFilter.
|
|
22
|
+
*/
|
|
23
|
+
export function hasDomCssFilterEquivalent(filter) {
|
|
24
|
+
return DOM_CSS_FILTER_KINDS.has(filter.kind);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Binds a CSS filter string (e.g. "blur(4px)") to a display object for the given
|
|
28
|
+
* DOM render state, or clears it when filter is null. The binding lives on the
|
|
29
|
+
* render state side, not the scene graph, so the same display object can carry a
|
|
30
|
+
* different filter (or none) in different render states. The filter is applied via
|
|
31
|
+
* the element's `style.filter` while CSS filter support is enabled.
|
|
32
|
+
*/
|
|
33
|
+
export function setDomCssFilter(state, node, filter) {
|
|
34
|
+
const renderProxy = getOrCreateRenderProxy2D(state, node);
|
|
35
|
+
if (filter === null) {
|
|
36
|
+
_cssFilterBindings.delete(renderProxy);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
_cssFilterBindings.set(renderProxy, filter);
|
|
40
|
+
}
|
|
41
|
+
// Per-state DOM CSS filter bindings, keyed by the render node. Render nodes are
|
|
42
|
+
// per-state (state.renderProxyMap), so a module-level map keyed by render node is
|
|
43
|
+
// automatically isolated per state — a filter set for one render state is
|
|
44
|
+
// invisible to any other state that renders the same display object. This mirrors
|
|
45
|
+
// the per-state canvas CSS filter and Gl shader bindings.
|
|
46
|
+
const _cssFilterBindings = new WeakMap();
|
|
47
|
+
// Filter kinds that have a native CSS filter equivalent in the DOM backend.
|
|
48
|
+
// All other filter kinds require rasterization (e.g. via the render-cache path)
|
|
49
|
+
// or are silently unsupported. This set drives hasDomCssFilterEquivalent.
|
|
50
|
+
//
|
|
51
|
+
// Mapping notes:
|
|
52
|
+
// BlurFilter → filter: blur(…px)
|
|
53
|
+
// DropShadowFilter → filter: drop-shadow(offsetX offsetY blur color)
|
|
54
|
+
// OuterGlowFilter → filter: drop-shadow(0 0 blur color) [approximate: glow = shadow with 0 offset]
|
|
55
|
+
const DOM_CSS_FILTER_KINDS = new Set(['BlurFilter', 'DropShadowFilter', 'OuterGlowFilter']);
|
|
56
|
+
//# sourceMappingURL=domCSSFilterBinding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domCSSFilterBinding.js","sourceRoot":"","sources":["../src/domCSSFilterBinding.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAG5D;;;;;;GAMG;AACH,MAAM,UAAU,yBAAyB,CAAC,KAAqB;IAC7D,KAAK,CAAC,oBAAoB,GAAG,eAAe,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,WAA0B;IACxD,OAAO,kBAAkB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AAC7C,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,yBAAyB,CAAC,MAA8B;IACtE,OAAO,oBAAoB,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAC/C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,KAAqB,EAAE,IAAmB,EAAE,MAAqB;IAC/F,MAAM,WAAW,GAAG,wBAAwB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC1D,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,kBAAkB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QACvC,OAAO;IACT,CAAC;IACD,kBAAkB,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;AAC9C,CAAC;AAED,gFAAgF;AAChF,kFAAkF;AAClF,0EAA0E;AAC1E,kFAAkF;AAClF,0DAA0D;AAC1D,MAAM,kBAAkB,GAAG,IAAI,OAAO,EAAyB,CAAC;AAEhE,4EAA4E;AAC5E,gFAAgF;AAChF,0EAA0E;AAC1E,EAAE;AACF,iBAAiB;AACjB,yCAAyC;AACzC,uEAAuE;AACvE,uGAAuG;AACvG,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC,CAAC,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { CanvasRenderTarget, DisplayObjectRenderer, DomRenderState, RenderCache, RenderState } from '@flighthq/types';
|
|
2
|
+
export declare function enableDomRenderCache(state: RenderState): void;
|
|
3
|
+
/**
|
|
4
|
+
* Allocates or resizes the canvas the DOM backend places for `cache`, returning it so a caller
|
|
5
|
+
* can draw the cached content into `target.context`. DOM cannot rasterize a scene graph itself,
|
|
6
|
+
* so its cache is always custom-baked: render the subtree into this canvas with a canvas render
|
|
7
|
+
* pass (or draw any content), set the handle's transform, and the DOM renderer places the canvas
|
|
8
|
+
* element. The returned canvas is pre-styled for DOM placement.
|
|
9
|
+
*/
|
|
10
|
+
export declare function ensureDomRenderCacheTarget(state: DomRenderState, cache: RenderCache, width: number, height: number): CanvasRenderTarget;
|
|
11
|
+
export declare function getDomRenderCacheTarget(state: DomRenderState, cache: RenderCache): CanvasRenderTarget | null;
|
|
12
|
+
export declare function releaseDomRenderCache(state: DomRenderState, cache: RenderCache): void;
|
|
13
|
+
export declare const defaultDomRenderCacheRenderer: DisplayObjectRenderer;
|
|
14
|
+
//# sourceMappingURL=domCache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domCache.d.ts","sourceRoot":"","sources":["../src/domCache.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,kBAAkB,EAClB,qBAAqB,EACrB,cAAc,EACd,WAAW,EAEX,WAAW,EACZ,MAAM,iBAAiB,CAAC;AAKzB,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAE7D;AAED;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,cAAc,EACrB,KAAK,EAAE,WAAW,EAClB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,kBAAkB,CAWpB;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,WAAW,GAAG,kBAAkB,GAAG,IAAI,CAE5G;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CAGrF;AA0BD,eAAO,MAAM,6BAA6B,EAAE,qBAG3C,CAAC"}
|
package/dist/domCache.js
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { createCanvasRenderTarget, resizeCanvasRenderTarget } from '@flighthq/displayobject-canvas';
|
|
2
|
+
import { getRenderProxyCache, noopRendererData, registerRenderCacheRenderer } from '@flighthq/render';
|
|
3
|
+
import { prepareDomElement, setDomRendererElement } from './domStyle';
|
|
4
|
+
import { setDomTransformWithOffset } from './domTransform';
|
|
5
|
+
export function enableDomRenderCache(state) {
|
|
6
|
+
registerRenderCacheRenderer(state, defaultDomRenderCacheRenderer);
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Allocates or resizes the canvas the DOM backend places for `cache`, returning it so a caller
|
|
10
|
+
* can draw the cached content into `target.context`. DOM cannot rasterize a scene graph itself,
|
|
11
|
+
* so its cache is always custom-baked: render the subtree into this canvas with a canvas render
|
|
12
|
+
* pass (or draw any content), set the handle's transform, and the DOM renderer places the canvas
|
|
13
|
+
* element. The returned canvas is pre-styled for DOM placement.
|
|
14
|
+
*/
|
|
15
|
+
export function ensureDomRenderCacheTarget(state, cache, width, height) {
|
|
16
|
+
const targets = getTargets(state);
|
|
17
|
+
let target = targets.get(cache);
|
|
18
|
+
if (target === undefined) {
|
|
19
|
+
target = createCanvasRenderTarget(width, height);
|
|
20
|
+
prepareDomElement(target.canvas);
|
|
21
|
+
targets.set(cache, target);
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
resizeCanvasRenderTarget(target, width, height);
|
|
25
|
+
}
|
|
26
|
+
return target;
|
|
27
|
+
}
|
|
28
|
+
export function getDomRenderCacheTarget(state, cache) {
|
|
29
|
+
return getTargets(state).get(cache) ?? null;
|
|
30
|
+
}
|
|
31
|
+
export function releaseDomRenderCache(state, cache) {
|
|
32
|
+
// The target canvas is a DOM element with no GPU handle; dropping the reference frees it.
|
|
33
|
+
getTargets(state).delete(cache);
|
|
34
|
+
}
|
|
35
|
+
function drawDomRenderCache(state, data) {
|
|
36
|
+
const cache = getRenderProxyCache(state, data.source);
|
|
37
|
+
if (cache === null)
|
|
38
|
+
return;
|
|
39
|
+
const domState = state;
|
|
40
|
+
const target = getTargets(domState).get(cache);
|
|
41
|
+
if (target === undefined)
|
|
42
|
+
return;
|
|
43
|
+
const canvas = target.canvas;
|
|
44
|
+
setDomTransformWithOffset(canvas, data.transform2D, 0, 0, domState.roundPixels);
|
|
45
|
+
canvas.style.opacity = data.alpha < 1 ? String(data.alpha) : '';
|
|
46
|
+
canvas.style.imageRendering = state.allowSmoothing ? '' : 'pixelated';
|
|
47
|
+
domState.applyBlendMode?.(canvas, data.blendMode);
|
|
48
|
+
setDomRendererElement(domState, canvas);
|
|
49
|
+
}
|
|
50
|
+
function getTargets(state) {
|
|
51
|
+
let targets = _renderCacheTargets.get(state);
|
|
52
|
+
if (targets === undefined) {
|
|
53
|
+
targets = new WeakMap();
|
|
54
|
+
_renderCacheTargets.set(state, targets);
|
|
55
|
+
}
|
|
56
|
+
return targets;
|
|
57
|
+
}
|
|
58
|
+
export const defaultDomRenderCacheRenderer = {
|
|
59
|
+
createData: noopRendererData,
|
|
60
|
+
submit: drawDomRenderCache,
|
|
61
|
+
};
|
|
62
|
+
// The screen state owns each cache's target canvas, keyed by the handle.
|
|
63
|
+
const _renderCacheTargets = new WeakMap();
|
|
64
|
+
//# sourceMappingURL=domCache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domCache.js","sourceRoot":"","sources":["../src/domCache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domClip.d.ts","sourceRoot":"","sources":["../src/domClip.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,cAAc,EAGf,MAAM,iBAAiB,CAAC;AASzB,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAGhE"}
|
package/dist/domClip.js
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { pushDomClipContours } from './domClipContours';
|
|
2
|
+
import { pushDomClipRectangle, setDomClipHooks } from './domClipRectangle';
|
|
3
|
+
import { getDomRenderStateRuntime } from './domRenderState';
|
|
4
|
+
// Masks RETIRED — a former mask is a path ClipRegion realized as a CSS clip-path. The DOM clip stack now
|
|
5
|
+
// holds rect entries (DomStageRectangle) and contour entries (DomClipContourEntry); applyDomClipRectangles
|
|
6
|
+
// must emit a clip-path for either (see domClipContours.ts). Unwind by truncating the stack.
|
|
7
|
+
export function enableDomClipSupport(state) {
|
|
8
|
+
state.displayObjectClipHooks = domDisplayObjectClipHooks;
|
|
9
|
+
setDomClipHooks(state);
|
|
10
|
+
}
|
|
11
|
+
const domDisplayObjectClipHooks = {
|
|
12
|
+
finalize(state) {
|
|
13
|
+
const runtime = getDomRenderStateRuntime(state);
|
|
14
|
+
runtime.domClipStack.length = 0;
|
|
15
|
+
state.currentClipDepth = 0;
|
|
16
|
+
},
|
|
17
|
+
popClip(state, data, source) {
|
|
18
|
+
const runtime = getDomRenderStateRuntime(state);
|
|
19
|
+
const target = data.clipDepth - (source.clip != null ? 1 : 0);
|
|
20
|
+
if (runtime.domClipStack.length > target)
|
|
21
|
+
runtime.domClipStack.length = target;
|
|
22
|
+
state.currentClipDepth = runtime.domClipStack.length;
|
|
23
|
+
},
|
|
24
|
+
pushClip(state, data, source) {
|
|
25
|
+
const clip = source.clip;
|
|
26
|
+
if (clip === null)
|
|
27
|
+
return;
|
|
28
|
+
const runtime = getDomRenderStateRuntime(state);
|
|
29
|
+
if (clip.contours === null) {
|
|
30
|
+
pushDomClipRectangle(runtime.domClipStack, clip.rect, data.transform2D);
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
pushDomClipContours(runtime.domClipStack, clip.contours, clip.winding, data.transform2D);
|
|
34
|
+
}
|
|
35
|
+
state.currentClipDepth++;
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=domClip.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domClip.js","sourceRoot":"","sources":["../src/domClip.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAE5D,yGAAyG;AACzG,2GAA2G;AAC3G,6FAA6F;AAC7F,MAAM,UAAU,oBAAoB,CAAC,KAAqB;IACxD,KAAK,CAAC,sBAAsB,GAAG,yBAAyB,CAAC;IACzD,eAAe,CAAC,KAAK,CAAC,CAAC;AACzB,CAAC;AAED,MAAM,yBAAyB,GAA2B;IACxD,QAAQ,CAAC,KAAkB;QACzB,MAAM,OAAO,GAAG,wBAAwB,CAAC,KAAuB,CAAC,CAAC;QAClE,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;QAChC,KAAK,CAAC,gBAAgB,GAAG,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,CAAC,KAAkB,EAAE,IAAmB,EAAE,MAAqB;QACpE,MAAM,OAAO,GAAG,wBAAwB,CAAC,KAAuB,CAAC,CAAC;QAClE,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9D,IAAI,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,MAAM;YAAE,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,MAAM,CAAC;QAC/E,KAAK,CAAC,gBAAgB,GAAG,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC;IACvD,CAAC;IACD,QAAQ,CAAC,KAAkB,EAAE,IAAmB,EAAE,MAAqB;QACrE,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACzB,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO;QAC1B,MAAM,OAAO,GAAG,wBAAwB,CAAC,KAAuB,CAAC,CAAC;QAClE,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;YAC3B,oBAAoB,CAAC,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAC1E,CAAC;aAAM,CAAC;YACN,mBAAmB,CAAC,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAC3F,CAAC;QACD,KAAK,CAAC,gBAAgB,EAAE,CAAC;IAC3B,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { DomClipContourEntry, Matrix, PathWinding } from '@flighthq/types';
|
|
2
|
+
export declare function buildDomContourClipPath(entry: DomClipContourEntry, mapPointToElement: (x: number, y: number) => readonly [number, number]): string;
|
|
3
|
+
export declare function pushDomClipContours(stack: {
|
|
4
|
+
push(entry: DomClipContourEntry): void;
|
|
5
|
+
}, contours: readonly (readonly number[])[], winding: PathWinding, transform: Readonly<Matrix>): void;
|
|
6
|
+
//# sourceMappingURL=domClipContours.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domClipContours.d.ts","sourceRoot":"","sources":["../src/domClipContours.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAchF,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,mBAAmB,EAC1B,iBAAiB,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,GACrE,MAAM,CAqBR;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE;IAAE,IAAI,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI,CAAA;CAAE,EACjD,QAAQ,EAAE,SAAS,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,EACxC,OAAO,EAAE,WAAW,EACpB,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,GAC1B,IAAI,CAaN"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
// DOM contour clip via CSS clip-path. Unlike Gl/Wgpu stencil, the DOM realizes a path clip as a
|
|
2
|
+
// `clip-path` on the masked element(s). Crisp (vector), honors winding via `clip-rule`. Replaces the
|
|
3
|
+
// former domMask bounding-rectangle approximation for path clips. DomClipContourEntry is the stack
|
|
4
|
+
// entry kind; applyDomClipRectangles emits `polygon()`/`path()` for it.
|
|
5
|
+
//
|
|
6
|
+
// LIMITATION (documented): CSS cannot intersect a path clip with other clips in one property. When a
|
|
7
|
+
// contour clip is active, apply it directly and ignore stacked rects for that element (v1), or nest one
|
|
8
|
+
// clip-path per clipping wrapper element (preferred, more DOM churn).
|
|
9
|
+
// Builds a CSS clip-path value from stage-space contours mapped into one element's local space.
|
|
10
|
+
// `elementInverse` maps stage space -> element local (reuse getElementMatrix + invert from
|
|
11
|
+
// domClipRectangle). Single contour -> polygon(); multiple/holes -> path() with clip-rule.
|
|
12
|
+
export function buildDomContourClipPath(entry, mapPointToElement) {
|
|
13
|
+
if (entry.contours.length === 1) {
|
|
14
|
+
const pts = [];
|
|
15
|
+
const contour = entry.contours[0];
|
|
16
|
+
for (let i = 0; i < contour.length; i += 2) {
|
|
17
|
+
const [x, y] = mapPointToElement(contour[i], contour[i + 1]);
|
|
18
|
+
pts.push(`${x}px ${y}px`);
|
|
19
|
+
}
|
|
20
|
+
return `polygon(${pts.join(', ')})`;
|
|
21
|
+
}
|
|
22
|
+
let d = '';
|
|
23
|
+
for (let c = 0; c < entry.contours.length; c++) {
|
|
24
|
+
const contour = entry.contours[c];
|
|
25
|
+
for (let i = 0; i < contour.length; i += 2) {
|
|
26
|
+
const [x, y] = mapPointToElement(contour[i], contour[i + 1]);
|
|
27
|
+
d += `${i === 0 ? 'M' : 'L'}${x} ${y} `;
|
|
28
|
+
}
|
|
29
|
+
d += 'Z ';
|
|
30
|
+
}
|
|
31
|
+
const rule = entry.winding === 'evenOdd' ? 'evenodd' : 'nonzero';
|
|
32
|
+
return `path('${rule}', '${d.trim()}')`;
|
|
33
|
+
}
|
|
34
|
+
export function pushDomClipContours(stack, contours, winding, transform) {
|
|
35
|
+
const staged = [];
|
|
36
|
+
for (let c = 0; c < contours.length; c++) {
|
|
37
|
+
const src = contours[c];
|
|
38
|
+
const out = [];
|
|
39
|
+
for (let i = 0; i < src.length; i += 2) {
|
|
40
|
+
const x = src[i];
|
|
41
|
+
const y = src[i + 1];
|
|
42
|
+
out.push(transform.a * x + transform.c * y + transform.tx, transform.b * x + transform.d * y + transform.ty);
|
|
43
|
+
}
|
|
44
|
+
staged.push(out);
|
|
45
|
+
}
|
|
46
|
+
stack.push({ kind: 'contour', contours: staged, winding });
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=domClipContours.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domClipContours.js","sourceRoot":"","sources":["../src/domClipContours.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { DomClipEntry, DomRenderState, DomStageRectangle, MatrixLike, RectangleLike, RenderProxy2D } from '@flighthq/types';
|
|
2
|
+
export declare function applyDomClipRectangles(state: DomRenderState, data: RenderProxy2D, entries: readonly DomClipEntry[]): void;
|
|
3
|
+
export declare function createDomStageRectangle(rect: Readonly<RectangleLike>, transform: Readonly<MatrixLike>): DomStageRectangle;
|
|
4
|
+
export declare function pushDomClipRectangle(stack: DomClipEntry[], rect: Readonly<RectangleLike>, transform: Readonly<MatrixLike>): void;
|
|
5
|
+
export declare function setDomClipHooks(state: DomRenderState): void;
|
|
6
|
+
//# sourceMappingURL=domClipRectangle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domClipRectangle.d.ts","sourceRoot":"","sources":["../src/domClipRectangle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,YAAY,EAEZ,cAAc,EACd,iBAAiB,EACjB,UAAU,EACV,aAAa,EACb,aAAa,EACd,MAAM,iBAAiB,CAAC;AAKzB,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,cAAc,EACrB,IAAI,EAAE,aAAa,EACnB,OAAO,EAAE,SAAS,YAAY,EAAE,GAC/B,IAAI,CAwCN;AAED,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,QAAQ,CAAC,aAAa,CAAC,EAC7B,SAAS,EAAE,QAAQ,CAAC,UAAU,CAAC,GAC9B,iBAAiB,CAgBnB;AAED,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,YAAY,EAAE,EACrB,IAAI,EAAE,QAAQ,CAAC,aAAa,CAAC,EAC7B,SAAS,EAAE,QAAQ,CAAC,UAAU,CAAC,GAC9B,IAAI,CAEN;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAG3D"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { buildDomContourClipPath } from './domClipContours';
|
|
2
|
+
import { getDomRenderStateRuntime } from './domRenderState';
|
|
3
|
+
export function applyDomClipRectangles(state, data, entries) {
|
|
4
|
+
const element = getDomRenderStateRuntime(state).domElementMap.get(data);
|
|
5
|
+
if (element === undefined)
|
|
6
|
+
return;
|
|
7
|
+
// CSS cannot intersect a path clip with other clips in one property. When a contour clip is active,
|
|
8
|
+
// apply the deepest contour as the element's clip-path and ignore stacked rects for this element
|
|
9
|
+
// (documented v1 limitation). Discriminate by the contour entry's `kind` tag; rects have none.
|
|
10
|
+
let contour = null;
|
|
11
|
+
for (let i = entries.length - 1; i >= 0; i--) {
|
|
12
|
+
const entry = entries[i];
|
|
13
|
+
if ('kind' in entry) {
|
|
14
|
+
contour = entry;
|
|
15
|
+
break;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
if (contour !== null) {
|
|
19
|
+
const mapPoint = createStageToElementPointMapper(element);
|
|
20
|
+
const clipPath = buildDomContourClipPath(contour, mapPoint);
|
|
21
|
+
element.style.clipPath = clipPath;
|
|
22
|
+
element.style.webkitClipPath = clipPath;
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
const rect = intersectDomStageRectangles(entries);
|
|
26
|
+
if (rect === null) {
|
|
27
|
+
element.style.clipPath = '';
|
|
28
|
+
element.style.webkitClipPath = '';
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
if (rect.right <= rect.left || rect.bottom <= rect.top) {
|
|
32
|
+
element.style.clipPath = EMPTY_CLIP_PATH;
|
|
33
|
+
element.style.webkitClipPath = EMPTY_CLIP_PATH;
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
const local = mapStageRectangleToElement(rect, element);
|
|
37
|
+
const clipPath = `polygon(${local.left}px ${local.top}px, ${local.right}px ${local.top}px, ${local.right}px ${local.bottom}px, ${local.left}px ${local.bottom}px)`;
|
|
38
|
+
element.style.clipPath = clipPath;
|
|
39
|
+
element.style.webkitClipPath = clipPath;
|
|
40
|
+
}
|
|
41
|
+
export function createDomStageRectangle(rect, transform) {
|
|
42
|
+
const x0 = transform.a * rect.x + transform.c * rect.y + transform.tx;
|
|
43
|
+
const y0 = transform.b * rect.x + transform.d * rect.y + transform.ty;
|
|
44
|
+
const x1 = transform.a * (rect.x + rect.width) + transform.c * rect.y + transform.tx;
|
|
45
|
+
const y1 = transform.b * (rect.x + rect.width) + transform.d * rect.y + transform.ty;
|
|
46
|
+
const x2 = transform.a * rect.x + transform.c * (rect.y + rect.height) + transform.tx;
|
|
47
|
+
const y2 = transform.b * rect.x + transform.d * (rect.y + rect.height) + transform.ty;
|
|
48
|
+
const x3 = transform.a * (rect.x + rect.width) + transform.c * (rect.y + rect.height) + transform.tx;
|
|
49
|
+
const y3 = transform.b * (rect.x + rect.width) + transform.d * (rect.y + rect.height) + transform.ty;
|
|
50
|
+
return {
|
|
51
|
+
bottom: Math.max(y0, y1, y2, y3),
|
|
52
|
+
left: Math.min(x0, x1, x2, x3),
|
|
53
|
+
right: Math.max(x0, x1, x2, x3),
|
|
54
|
+
top: Math.min(y0, y1, y2, y3),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
export function pushDomClipRectangle(stack, rect, transform) {
|
|
58
|
+
stack.push(createDomStageRectangle(rect, transform));
|
|
59
|
+
}
|
|
60
|
+
export function setDomClipHooks(state) {
|
|
61
|
+
const runtime = getDomRenderStateRuntime(state);
|
|
62
|
+
if (runtime.domClipHooks === null)
|
|
63
|
+
runtime.domClipHooks = domClipHooksImpl;
|
|
64
|
+
}
|
|
65
|
+
// Returns a closure mapping a stage-space point into `element`'s local space (the inverse of the
|
|
66
|
+
// element's CSS matrix), for placing contour clip-path points. Mirrors mapStageRectangleToElement's
|
|
67
|
+
// inverse but per-point, which contour clips need.
|
|
68
|
+
function createStageToElementPointMapper(element) {
|
|
69
|
+
const matrix = getElementMatrix(element);
|
|
70
|
+
const det = matrix.a * matrix.d - matrix.b * matrix.c;
|
|
71
|
+
if (det === 0)
|
|
72
|
+
return () => [0, 0];
|
|
73
|
+
const invA = matrix.d / det;
|
|
74
|
+
const invB = -matrix.b / det;
|
|
75
|
+
const invC = -matrix.c / det;
|
|
76
|
+
const invD = matrix.a / det;
|
|
77
|
+
const invTx = (matrix.c * matrix.ty - matrix.d * matrix.tx) / det;
|
|
78
|
+
const invTy = (matrix.b * matrix.tx - matrix.a * matrix.ty) / det;
|
|
79
|
+
return (x, y) => [invA * x + invC * y + invTx, invB * x + invD * y + invTy];
|
|
80
|
+
}
|
|
81
|
+
function getElementMatrix(element) {
|
|
82
|
+
const transform = element.style.transform;
|
|
83
|
+
const match = /^matrix\(([^)]+)\)$/.exec(transform);
|
|
84
|
+
if (match === null) {
|
|
85
|
+
return { a: 1, b: 0, c: 0, d: 1, tx: 0, ty: 0 };
|
|
86
|
+
}
|
|
87
|
+
const parts = match[1].split(',').map((value) => Number(value.trim()));
|
|
88
|
+
return {
|
|
89
|
+
a: parts[0] ?? 1,
|
|
90
|
+
b: parts[1] ?? 0,
|
|
91
|
+
c: parts[2] ?? 0,
|
|
92
|
+
d: parts[3] ?? 1,
|
|
93
|
+
tx: parts[4] ?? 0,
|
|
94
|
+
ty: parts[5] ?? 0,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
function intersectDomStageRectangles(rectangles) {
|
|
98
|
+
if (rectangles.length === 0)
|
|
99
|
+
return null;
|
|
100
|
+
let left = -Infinity;
|
|
101
|
+
let top = -Infinity;
|
|
102
|
+
let right = Infinity;
|
|
103
|
+
let bottom = Infinity;
|
|
104
|
+
for (const rect of rectangles) {
|
|
105
|
+
if (rect.left > left)
|
|
106
|
+
left = rect.left;
|
|
107
|
+
if (rect.top > top)
|
|
108
|
+
top = rect.top;
|
|
109
|
+
if (rect.right < right)
|
|
110
|
+
right = rect.right;
|
|
111
|
+
if (rect.bottom < bottom)
|
|
112
|
+
bottom = rect.bottom;
|
|
113
|
+
}
|
|
114
|
+
return { bottom, left, right, top };
|
|
115
|
+
}
|
|
116
|
+
function mapStageRectangleToElement(rect, element) {
|
|
117
|
+
const matrix = getElementMatrix(element);
|
|
118
|
+
const det = matrix.a * matrix.d - matrix.b * matrix.c;
|
|
119
|
+
if (det === 0)
|
|
120
|
+
return { bottom: 0, left: 0, right: 0, top: 0 };
|
|
121
|
+
const invA = matrix.d / det;
|
|
122
|
+
const invB = -matrix.b / det;
|
|
123
|
+
const invC = -matrix.c / det;
|
|
124
|
+
const invD = matrix.a / det;
|
|
125
|
+
const invTx = (matrix.c * matrix.ty - matrix.d * matrix.tx) / det;
|
|
126
|
+
const invTy = (matrix.b * matrix.tx - matrix.a * matrix.ty) / det;
|
|
127
|
+
const x0 = invA * rect.left + invC * rect.top + invTx;
|
|
128
|
+
const y0 = invB * rect.left + invD * rect.top + invTy;
|
|
129
|
+
const x1 = invA * rect.right + invC * rect.top + invTx;
|
|
130
|
+
const y1 = invB * rect.right + invD * rect.top + invTy;
|
|
131
|
+
const x2 = invA * rect.left + invC * rect.bottom + invTx;
|
|
132
|
+
const y2 = invB * rect.left + invD * rect.bottom + invTy;
|
|
133
|
+
const x3 = invA * rect.right + invC * rect.bottom + invTx;
|
|
134
|
+
const y3 = invB * rect.right + invD * rect.bottom + invTy;
|
|
135
|
+
return {
|
|
136
|
+
bottom: Math.max(y0, y1, y2, y3),
|
|
137
|
+
left: Math.min(x0, x1, x2, x3),
|
|
138
|
+
right: Math.max(x0, x1, x2, x3),
|
|
139
|
+
top: Math.min(y0, y1, y2, y3),
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
const EMPTY_CLIP_PATH = 'inset(0 100% 100% 0)';
|
|
143
|
+
const domClipHooksImpl = {
|
|
144
|
+
apply(state, data) {
|
|
145
|
+
applyDomClipRectangles(state, data, getDomRenderStateRuntime(state).domClipStack);
|
|
146
|
+
},
|
|
147
|
+
};
|
|
148
|
+
//# sourceMappingURL=domClipRectangle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domClipRectangle.js","sourceRoot":"","sources":["../src/domClipRectangle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { DisplayObject, DisplayObjectRenderer, DomRenderState, RenderProxy2D } from '@flighthq/types';
|
|
2
|
+
export declare function drawDomDisplayObject(_state: DomRenderState, _renderProxy: RenderProxy2D): void;
|
|
3
|
+
export declare const defaultDomDisplayObjectRenderer: DisplayObjectRenderer;
|
|
4
|
+
export declare function renderDomDisplayObject(state: DomRenderState, source: DisplayObject): void;
|
|
5
|
+
//# sourceMappingURL=domDisplayObject.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domDisplayObject.d.ts","sourceRoot":"","sources":["../src/domDisplayObject.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,qBAAqB,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAS3G,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,GAAG,IAAI,CAE9F;AAED,eAAO,MAAM,+BAA+B,EAAE,qBAG7C,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,CAiDzF"}
|