@flighthq/displayobject-canvas 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.
Files changed (150) hide show
  1. package/dist/canvasBackground.d.ts +3 -0
  2. package/dist/canvasBackground.d.ts.map +1 -0
  3. package/dist/canvasBackground.js +19 -0
  4. package/dist/canvasBackground.js.map +1 -0
  5. package/dist/canvasBitmap.d.ts +4 -0
  6. package/dist/canvasBitmap.d.ts.map +1 -0
  7. package/dist/canvasBitmap.js +32 -0
  8. package/dist/canvasBitmap.js.map +1 -0
  9. package/dist/canvasCSSFilterBinding.d.ts +24 -0
  10. package/dist/canvasCSSFilterBinding.d.ts.map +1 -0
  11. package/dist/canvasCSSFilterBinding.js +43 -0
  12. package/dist/canvasCSSFilterBinding.js.map +1 -0
  13. package/dist/canvasCache.d.ts +33 -0
  14. package/dist/canvasCache.d.ts.map +1 -0
  15. package/dist/canvasCache.js +141 -0
  16. package/dist/canvasCache.js.map +1 -0
  17. package/dist/canvasClip.d.ts +3 -0
  18. package/dist/canvasClip.d.ts.map +1 -0
  19. package/dist/canvasClip.js +38 -0
  20. package/dist/canvasClip.js.map +1 -0
  21. package/dist/canvasClipRectangle.d.ts +5 -0
  22. package/dist/canvasClipRectangle.d.ts.map +1 -0
  23. package/dist/canvasClipRectangle.js +31 -0
  24. package/dist/canvasClipRectangle.js.map +1 -0
  25. package/dist/canvasDisplayObject.d.ts +5 -0
  26. package/dist/canvasDisplayObject.d.ts.map +1 -0
  27. package/dist/canvasDisplayObject.js +46 -0
  28. package/dist/canvasDisplayObject.js.map +1 -0
  29. package/dist/canvasElement.d.ts +2 -0
  30. package/dist/canvasElement.d.ts.map +1 -0
  31. package/dist/canvasElement.js +9 -0
  32. package/dist/canvasElement.js.map +1 -0
  33. package/dist/canvasFillPattern.d.ts +4 -0
  34. package/dist/canvasFillPattern.d.ts.map +1 -0
  35. package/dist/canvasFillPattern.js +108 -0
  36. package/dist/canvasFillPattern.js.map +1 -0
  37. package/dist/canvasMaterialRegistry.d.ts +6 -0
  38. package/dist/canvasMaterialRegistry.d.ts.map +1 -0
  39. package/dist/canvasMaterialRegistry.js +42 -0
  40. package/dist/canvasMaterialRegistry.js.map +1 -0
  41. package/dist/canvasMaterials.d.ts +5 -0
  42. package/dist/canvasMaterials.d.ts.map +1 -0
  43. package/dist/canvasMaterials.js +33 -0
  44. package/dist/canvasMaterials.js.map +1 -0
  45. package/dist/canvasParticleEmitter.d.ts +4 -0
  46. package/dist/canvasParticleEmitter.d.ts.map +1 -0
  47. package/dist/canvasParticleEmitter.js +64 -0
  48. package/dist/canvasParticleEmitter.js.map +1 -0
  49. package/dist/canvasQuadBatch.d.ts +4 -0
  50. package/dist/canvasQuadBatch.d.ts.map +1 -0
  51. package/dist/canvasQuadBatch.js +64 -0
  52. package/dist/canvasQuadBatch.js.map +1 -0
  53. package/dist/canvasRegistration.d.ts +4 -0
  54. package/dist/canvasRegistration.d.ts.map +1 -0
  55. package/dist/canvasRegistration.js +39 -0
  56. package/dist/canvasRegistration.js.map +1 -0
  57. package/dist/canvasRenderState.d.ts +5 -0
  58. package/dist/canvasRenderState.d.ts.map +1 -0
  59. package/dist/canvasRenderState.js +44 -0
  60. package/dist/canvasRenderState.js.map +1 -0
  61. package/dist/canvasRenderTarget.d.ts +16 -0
  62. package/dist/canvasRenderTarget.d.ts.map +1 -0
  63. package/dist/canvasRenderTarget.js +66 -0
  64. package/dist/canvasRenderTarget.js.map +1 -0
  65. package/dist/canvasRichText.d.ts +7 -0
  66. package/dist/canvasRichText.d.ts.map +1 -0
  67. package/dist/canvasRichText.js +127 -0
  68. package/dist/canvasRichText.js.map +1 -0
  69. package/dist/canvasScale9Mapper.d.ts +10 -0
  70. package/dist/canvasScale9Mapper.d.ts.map +1 -0
  71. package/dist/canvasScale9Mapper.js +148 -0
  72. package/dist/canvasScale9Mapper.js.map +1 -0
  73. package/dist/canvasScale9Shape.d.ts +5 -0
  74. package/dist/canvasScale9Shape.d.ts.map +1 -0
  75. package/dist/canvasScale9Shape.js +156 -0
  76. package/dist/canvasScale9Shape.js.map +1 -0
  77. package/dist/canvasShape.d.ts +5 -0
  78. package/dist/canvasShape.d.ts.map +1 -0
  79. package/dist/canvasShape.js +79 -0
  80. package/dist/canvasShape.js.map +1 -0
  81. package/dist/canvasShapeCommands.d.ts +19 -0
  82. package/dist/canvasShapeCommands.d.ts.map +1 -0
  83. package/dist/canvasShapeCommands.js +352 -0
  84. package/dist/canvasShapeCommands.js.map +1 -0
  85. package/dist/canvasShapeRegistry.d.ts +5 -0
  86. package/dist/canvasShapeRegistry.d.ts.map +1 -0
  87. package/dist/canvasShapeRegistry.js +17 -0
  88. package/dist/canvasShapeRegistry.js.map +1 -0
  89. package/dist/canvasSprite.d.ts +5 -0
  90. package/dist/canvasSprite.d.ts.map +1 -0
  91. package/dist/canvasSprite.js +59 -0
  92. package/dist/canvasSprite.js.map +1 -0
  93. package/dist/canvasTextInput.d.ts +4 -0
  94. package/dist/canvasTextInput.d.ts.map +1 -0
  95. package/dist/canvasTextInput.js +67 -0
  96. package/dist/canvasTextInput.js.map +1 -0
  97. package/dist/canvasTextLabel.d.ts +4 -0
  98. package/dist/canvasTextLabel.d.ts.map +1 -0
  99. package/dist/canvasTextLabel.js +55 -0
  100. package/dist/canvasTextLabel.js.map +1 -0
  101. package/dist/canvasTextMeasure.d.ts +3 -0
  102. package/dist/canvasTextMeasure.d.ts.map +1 -0
  103. package/dist/canvasTextMeasure.js +15 -0
  104. package/dist/canvasTextMeasure.js.map +1 -0
  105. package/dist/canvasTilemap.d.ts +4 -0
  106. package/dist/canvasTilemap.d.ts.map +1 -0
  107. package/dist/canvasTilemap.js +50 -0
  108. package/dist/canvasTilemap.js.map +1 -0
  109. package/dist/canvasTransform.d.ts +3 -0
  110. package/dist/canvasTransform.d.ts.map +1 -0
  111. package/dist/canvasTransform.js +9 -0
  112. package/dist/canvasTransform.js.map +1 -0
  113. package/dist/canvasVideo.d.ts +4 -0
  114. package/dist/canvasVideo.d.ts.map +1 -0
  115. package/dist/canvasVideo.js +26 -0
  116. package/dist/canvasVideo.js.map +1 -0
  117. package/dist/index.d.ts +30 -0
  118. package/dist/index.d.ts.map +1 -0
  119. package/dist/index.js +30 -0
  120. package/dist/index.js.map +1 -0
  121. package/package.json +50 -0
  122. package/src/canvasBackground.test.ts +65 -0
  123. package/src/canvasBitmap.test.ts +92 -0
  124. package/src/canvasCSSFilterBinding.test.ts +86 -0
  125. package/src/canvasCache.test.ts +189 -0
  126. package/src/canvasClip.test.ts +12 -0
  127. package/src/canvasClipRectangle.test.ts +101 -0
  128. package/src/canvasDisplayObject.test.ts +117 -0
  129. package/src/canvasElement.test.ts +21 -0
  130. package/src/canvasFillPattern.test.ts +96 -0
  131. package/src/canvasMaterialRegistry.test.ts +69 -0
  132. package/src/canvasMaterials.test.ts +85 -0
  133. package/src/canvasParticleEmitter.test.ts +105 -0
  134. package/src/canvasQuadBatch.test.ts +119 -0
  135. package/src/canvasRegistration.test.ts +57 -0
  136. package/src/canvasRenderState.test.ts +186 -0
  137. package/src/canvasRenderTarget.test.ts +154 -0
  138. package/src/canvasRichText.test.ts +89 -0
  139. package/src/canvasScale9Mapper.test.ts +53 -0
  140. package/src/canvasScale9Shape.test.ts +89 -0
  141. package/src/canvasShape.test.ts +183 -0
  142. package/src/canvasShapeCommands.test.ts +448 -0
  143. package/src/canvasShapeRegistry.test.ts +42 -0
  144. package/src/canvasSprite.test.ts +90 -0
  145. package/src/canvasTextInput.test.ts +67 -0
  146. package/src/canvasTextLabel.test.ts +32 -0
  147. package/src/canvasTextMeasure.test.ts +9 -0
  148. package/src/canvasTilemap.test.ts +69 -0
  149. package/src/canvasTransform.test.ts +42 -0
  150. package/src/canvasVideo.test.ts +43 -0
@@ -0,0 +1,3 @@
1
+ import type { CanvasRenderState } from '@flighthq/types';
2
+ export declare function renderCanvasBackground(state: CanvasRenderState): void;
3
+ //# sourceMappingURL=canvasBackground.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvasBackground.d.ts","sourceRoot":"","sources":["../src/canvasBackground.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAKzD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAgBrE"}
@@ -0,0 +1,19 @@
1
+ import { BlendMode } from '@flighthq/types';
2
+ import { getCanvasRenderStateRuntime } from './canvasRenderState';
3
+ export function renderCanvasBackground(state) {
4
+ // Reset to normal compositing directly. This deliberately bypasses the blend-mode
5
+ // map so the background path never pulls blend-mode support into the bundle; each
6
+ // display object re-applies its own mode through state.applyBlendMode when drawn.
7
+ state.context.globalCompositeOperation = 'source-over';
8
+ getCanvasRenderStateRuntime(state).currentBlendMode = BlendMode.Normal;
9
+ state.context.setTransform(1, 0, 0, 1, 0, 0);
10
+ state.context.globalAlpha = 1;
11
+ if ((state.backgroundColor & 0xff) !== 0) {
12
+ state.context.fillStyle = state.backgroundColorString;
13
+ state.context.fillRect(0, 0, state.canvas.width, state.canvas.height);
14
+ }
15
+ else {
16
+ state.context.clearRect(0, 0, state.canvas.width, state.canvas.height);
17
+ }
18
+ }
19
+ //# sourceMappingURL=canvasBackground.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvasBackground.js","sourceRoot":"","sources":["../src/canvasBackground.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAElE,MAAM,UAAU,sBAAsB,CAAC,KAAwB;IAC7D,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,KAAK,CAAC,OAAO,CAAC,wBAAwB,GAAG,aAAa,CAAC;IACvD,2BAA2B,CAAC,KAAK,CAAC,CAAC,gBAAgB,GAAG,SAAS,CAAC,MAAM,CAAC;IAEvE,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7C,KAAK,CAAC,OAAO,CAAC,WAAW,GAAG,CAAC,CAAC;IAE9B,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACzC,KAAK,CAAC,OAAO,CAAC,SAAS,GAAG,KAAK,CAAC,qBAAqB,CAAC;QACtD,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACxE,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACzE,CAAC;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { CanvasRenderState, DisplayObjectRenderer, RenderProxy2D } from '@flighthq/types';
2
+ export declare function drawCanvasBitmap(state: CanvasRenderState, bitmap: RenderProxy2D): void;
3
+ export declare const defaultCanvasBitmapRenderer: DisplayObjectRenderer;
4
+ //# sourceMappingURL=canvasBitmap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvasBitmap.d.ts","sourceRoot":"","sources":["../src/canvasBitmap.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAU,iBAAiB,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAKvG,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,iBAAiB,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,CAsCtF;AAED,eAAO,MAAM,2BAA2B,EAAE,qBAGzC,CAAC"}
@@ -0,0 +1,32 @@
1
+ import { noopRendererData } from '@flighthq/render';
2
+ import { drawCanvasDisplayObject } from './canvasDisplayObject';
3
+ import { setCanvasTransform } from './canvasTransform';
4
+ export function drawCanvasBitmap(state, bitmap) {
5
+ drawCanvasDisplayObject(state, bitmap);
6
+ const source = bitmap.source;
7
+ const imageSource = source.data.image;
8
+ if (imageSource !== null && imageSource.source !== null) {
9
+ const context = state.context;
10
+ state.applyBlendMode?.(state, bitmap.blendMode);
11
+ context.globalAlpha = bitmap.alpha;
12
+ const sourceRectangle = source.data.sourceRectangle ?? null;
13
+ setCanvasTransform(state, context, bitmap.transform2D);
14
+ if (!state.allowSmoothing || !source.data.smoothing) {
15
+ context.imageSmoothingEnabled = false;
16
+ }
17
+ if (sourceRectangle === null) {
18
+ context.drawImage(imageSource.source, 0, 0, imageSource.width, imageSource.height);
19
+ }
20
+ else {
21
+ context.drawImage(imageSource.source, sourceRectangle.x, sourceRectangle.y, sourceRectangle.width, sourceRectangle.height, 0, 0, sourceRectangle.width, sourceRectangle.height);
22
+ }
23
+ if (!state.allowSmoothing || !source.data.smoothing) {
24
+ context.imageSmoothingEnabled = true;
25
+ }
26
+ }
27
+ }
28
+ export const defaultCanvasBitmapRenderer = {
29
+ createData: noopRendererData,
30
+ submit: drawCanvasBitmap,
31
+ };
32
+ //# sourceMappingURL=canvasBitmap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvasBitmap.js","sourceRoot":"","sources":["../src/canvasBitmap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAGpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,UAAU,gBAAgB,CAAC,KAAwB,EAAE,MAAqB;IAC9E,uBAAuB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAgB,CAAC;IACvC,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;IACtC,IAAI,WAAW,KAAK,IAAI,IAAI,WAAW,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;QACxD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAE9B,KAAK,CAAC,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QAEhD,OAAO,CAAC,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC;QACnC,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC;QAE5D,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;QAEvD,IAAI,CAAC,KAAK,CAAC,cAAc,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpD,OAAO,CAAC,qBAAqB,GAAG,KAAK,CAAC;QACxC,CAAC;QAED,IAAI,eAAe,KAAK,IAAI,EAAE,CAAC;YAC7B,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;QACrF,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,SAAS,CACf,WAAW,CAAC,MAAM,EAClB,eAAe,CAAC,CAAC,EACjB,eAAe,CAAC,CAAC,EACjB,eAAe,CAAC,KAAK,EACrB,eAAe,CAAC,MAAM,EACtB,CAAC,EACD,CAAC,EACD,eAAe,CAAC,KAAK,EACrB,eAAe,CAAC,MAAM,CACvB,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,cAAc,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpD,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC;QACvC,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,2BAA2B,GAA0B;IAChE,UAAU,EAAE,gBAAgB;IAC5B,MAAM,EAAE,gBAAgB;CACzB,CAAC"}
@@ -0,0 +1,24 @@
1
+ import type { CanvasRenderState, DisplayObject, RenderProxy2D } from '@flighthq/types';
2
+ /**
3
+ * Enables CSS filter support for the render state by installing the resolver the
4
+ * draw loop consults. Bindings made via setCanvasCssFilter only apply once this is
5
+ * called — mirroring enableCanvasBlendMode and the other opt-ins. Because
6
+ * the draw loop reaches the resolver only through this field, filter-free states
7
+ * leave it null and the binding module tree-shakes away entirely.
8
+ */
9
+ export declare function enableCanvasCssFilter(state: CanvasRenderState): void;
10
+ export declare function getCanvasCssFilter(renderProxy: RenderProxy2D): string | undefined;
11
+ /**
12
+ * Returns the CSS filter to draw renderProxy with, or null when none is bound.
13
+ * Installed as state.canvasCssFilterResolver by enableCanvasCssFilter.
14
+ */
15
+ export declare function resolveCanvasCssFilter(_state: CanvasRenderState, renderProxy: RenderProxy2D): string | null;
16
+ /**
17
+ * Binds a CSS filter string (e.g. "blur(4px)") to a display object for the given
18
+ * canvas render state, or clears it when filter is null. The binding lives on the
19
+ * render state side, not the scene graph, so the same display object can carry a
20
+ * different filter (or none) in different render states. The filter is applied via
21
+ * `context.filter` around the object's own draw.
22
+ */
23
+ export declare function setCanvasCssFilter(state: CanvasRenderState, node: DisplayObject, filter: string | null): void;
24
+ //# sourceMappingURL=canvasCSSFilterBinding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvasCSSFilterBinding.d.ts","sourceRoot":"","sources":["../src/canvasCSSFilterBinding.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AASvF;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAEpE;AAED,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,aAAa,GAAG,MAAM,GAAG,SAAS,CAEjF;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,iBAAiB,EAAE,WAAW,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI,CAE3G;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAO7G"}
@@ -0,0 +1,43 @@
1
+ import { getOrCreateRenderProxy2D } from '@flighthq/render';
2
+ // Per-state canvas CSS filter bindings, keyed by the render node. Render nodes are
3
+ // per-state (state.renderProxyMap), so a module-level map keyed by render node is
4
+ // automatically isolated per state — a filter set for one render state is
5
+ // invisible to any other state that renders the same display object. This mirrors
6
+ // the per-state Gl shader bindings.
7
+ const _cssFilterBindings = new WeakMap();
8
+ /**
9
+ * Enables CSS filter support for the render state by installing the resolver the
10
+ * draw loop consults. Bindings made via setCanvasCssFilter only apply once this is
11
+ * called — mirroring enableCanvasBlendMode and the other opt-ins. Because
12
+ * the draw loop reaches the resolver only through this field, filter-free states
13
+ * leave it null and the binding module tree-shakes away entirely.
14
+ */
15
+ export function enableCanvasCssFilter(state) {
16
+ state.canvasCssFilterResolver = resolveCanvasCssFilter;
17
+ }
18
+ export function getCanvasCssFilter(renderProxy) {
19
+ return _cssFilterBindings.get(renderProxy);
20
+ }
21
+ /**
22
+ * Returns the CSS filter to draw renderProxy with, or null when none is bound.
23
+ * Installed as state.canvasCssFilterResolver by enableCanvasCssFilter.
24
+ */
25
+ export function resolveCanvasCssFilter(_state, renderProxy) {
26
+ return _cssFilterBindings.get(renderProxy) ?? null;
27
+ }
28
+ /**
29
+ * Binds a CSS filter string (e.g. "blur(4px)") to a display object for the given
30
+ * canvas render state, or clears it when filter is null. The binding lives on the
31
+ * render state side, not the scene graph, so the same display object can carry a
32
+ * different filter (or none) in different render states. The filter is applied via
33
+ * `context.filter` around the object's own draw.
34
+ */
35
+ export function setCanvasCssFilter(state, node, filter) {
36
+ const renderProxy = getOrCreateRenderProxy2D(state, node);
37
+ if (filter === null) {
38
+ _cssFilterBindings.delete(renderProxy);
39
+ return;
40
+ }
41
+ _cssFilterBindings.set(renderProxy, filter);
42
+ }
43
+ //# sourceMappingURL=canvasCSSFilterBinding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvasCSSFilterBinding.js","sourceRoot":"","sources":["../src/canvasCSSFilterBinding.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAG5D,mFAAmF;AACnF,kFAAkF;AAClF,0EAA0E;AAC1E,kFAAkF;AAClF,oCAAoC;AACpC,MAAM,kBAAkB,GAAG,IAAI,OAAO,EAAyB,CAAC;AAEhE;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAwB;IAC5D,KAAK,CAAC,uBAAuB,GAAG,sBAAsB,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,WAA0B;IAC3D,OAAO,kBAAkB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AAC7C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAAyB,EAAE,WAA0B;IAC1F,OAAO,kBAAkB,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC;AACrD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAwB,EAAE,IAAmB,EAAE,MAAqB;IACrG,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"}
@@ -0,0 +1,33 @@
1
+ import type { CanvasRenderState, CanvasRenderTarget, DisplayObject, DisplayObjectRenderer, RenderCache, RenderCacheRefreshOptions, RenderState } from '@flighthq/types';
2
+ /**
3
+ * Creates a dedicated offscreen render state for baking render caches consumed by
4
+ * `screenState`. It copies the screen state's renderers and propagates the settings that
5
+ * affect rendering (pixel ratio, sync policy, rounding, smoothing, appearance hooks) so a
6
+ * baked subtree looks the same offscreen as it would on screen — but keeps its own render
7
+ * node map, adapter map, and frame counter, so baking never touches the screen state.
8
+ */
9
+ export declare function createCanvasCacheState(screenState: CanvasRenderState): CanvasRenderState;
10
+ export declare function destroyCanvasRenderCacheTarget(state: CanvasRenderState, cache: RenderCache): void;
11
+ export declare function enableCanvasRenderCache(state: RenderState): void;
12
+ /**
13
+ * Allocates or resizes the render target `screenState` composites for `cache`, returning it
14
+ * so a caller can draw custom content into `target.context` directly (for example a filtered
15
+ * image). For engine-baked content prefer refreshCanvasRenderCache.
16
+ */
17
+ export declare function ensureCanvasRenderCacheTarget(state: CanvasRenderState, cache: RenderCache, width: number, height: number): CanvasRenderTarget;
18
+ export declare function getCanvasRenderCacheTarget(state: CanvasRenderState, cache: RenderCache): CanvasRenderTarget | null;
19
+ /**
20
+ * Bakes `source`'s subtree into its cache target using the offscreen `cacheState`, then
21
+ * records the transform that places the result back in scene space. The bake runs on the
22
+ * offscreen state, so it neither substitutes the cache into itself nor disturbs the screen
23
+ * state's render nodes — no adapter suppression needed.
24
+ *
25
+ * Returns whether a bake actually happened: the offscreen state's own dirtiness decides it
26
+ * (honoring its sceneGraphSyncPolicy), so this is cheap to call every frame — it redraws only
27
+ * when the subtree changed or the target was resized. The target is owned by the screen state
28
+ * (keyed by the handle), never by the handle, so one handle can be composited by several states.
29
+ */
30
+ export declare function refreshCanvasRenderCache(cacheState: CanvasRenderState, cache: RenderCache, source: DisplayObject, options?: Readonly<RenderCacheRefreshOptions>): boolean;
31
+ export declare function releaseCanvasRenderCache(state: CanvasRenderState, cache: RenderCache): void;
32
+ export declare const defaultCanvasRenderCacheRenderer: DisplayObjectRenderer;
33
+ //# sourceMappingURL=canvasCache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvasCache.d.ts","sourceRoot":"","sources":["../src/canvasCache.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EAClB,aAAa,EACb,qBAAqB,EAErB,WAAW,EACX,yBAAyB,EAEzB,WAAW,EACZ,MAAM,iBAAiB,CAAC;AAezB;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,iBAAiB,GAAG,iBAAiB,CAYxF;AAED,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CAcjG;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,kBAAkB,CAUpB;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,WAAW,GAAG,kBAAkB,GAAG,IAAI,CAElH;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,iBAAiB,EAC7B,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,aAAa,EACrB,OAAO,CAAC,EAAE,QAAQ,CAAC,yBAAyB,CAAC,GAC5C,OAAO,CAgCT;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CAG3F;AAuBD,eAAO,MAAM,gCAAgC,EAAE,qBAG9C,CAAC"}
@@ -0,0 +1,141 @@
1
+ import { copyMatrix, createMatrix, createRectangle } from '@flighthq/geometry';
2
+ import { computeNodeBoundsRectangle } from '@flighthq/node';
3
+ import { computeDisplayObjectRenderTargetTransform, computeRenderCacheTransform, computeRenderTargetSize, copyAllRenderersFromRenderState, getRenderProxyCache, noopRendererData, prepareDisplayObjectRender, registerRenderCacheRenderer, } from '@flighthq/render';
4
+ import { renderCanvasDisplayObject } from './canvasDisplayObject';
5
+ import { createCanvasRenderState, getCanvasRenderStateRuntime } from './canvasRenderState';
6
+ import { createCanvasRenderTarget, resizeCanvasRenderTarget } from './canvasRenderTarget';
7
+ import { setCanvasTransform } from './canvasTransform';
8
+ /**
9
+ * Creates a dedicated offscreen render state for baking render caches consumed by
10
+ * `screenState`. It copies the screen state's renderers and propagates the settings that
11
+ * affect rendering (pixel ratio, sync policy, rounding, smoothing, appearance hooks) so a
12
+ * baked subtree looks the same offscreen as it would on screen — but keeps its own render
13
+ * node map, adapter map, and frame counter, so baking never touches the screen state.
14
+ */
15
+ export function createCanvasCacheState(screenState) {
16
+ const screen = getCanvasRenderStateRuntime(screenState);
17
+ const cacheState = createCanvasRenderState(document.createElement('canvas'), {
18
+ imageSmoothingEnabled: screen.imageSmoothingEnabled,
19
+ imageSmoothingQuality: screen.imageSmoothingQuality,
20
+ pixelRatio: screenState.pixelRatio,
21
+ roundPixels: screenState.roundPixels,
22
+ sceneGraphSyncPolicy: screenState.sceneGraphSyncPolicy,
23
+ });
24
+ copyAllRenderersFromRenderState(cacheState, screenState);
25
+ _cacheStateScreen.set(cacheState, screenState);
26
+ return cacheState;
27
+ }
28
+ export function destroyCanvasRenderCacheTarget(state, cache) {
29
+ // Explicitly collapses the offscreen canvas backing this cache's render target so the browser
30
+ // can reclaim its compositor/GPU memory immediately, rather than waiting for GC. After calling
31
+ // this, the target is invalid. For a plain slot-release without destroying the backing store,
32
+ // use releaseCanvasRenderCache instead.
33
+ const targets = getTargets(state);
34
+ const target = targets.get(cache);
35
+ if (target !== undefined) {
36
+ target.canvas.width = 0;
37
+ target.canvas.height = 0;
38
+ target.width = 0;
39
+ target.height = 0;
40
+ targets.delete(cache);
41
+ }
42
+ }
43
+ export function enableCanvasRenderCache(state) {
44
+ registerRenderCacheRenderer(state, defaultCanvasRenderCacheRenderer);
45
+ }
46
+ /**
47
+ * Allocates or resizes the render target `screenState` composites for `cache`, returning it
48
+ * so a caller can draw custom content into `target.context` directly (for example a filtered
49
+ * image). For engine-baked content prefer refreshCanvasRenderCache.
50
+ */
51
+ export function ensureCanvasRenderCacheTarget(state, cache, width, height) {
52
+ const targets = getTargets(state);
53
+ let target = targets.get(cache);
54
+ if (target === undefined) {
55
+ target = createCanvasRenderTarget(width, height);
56
+ targets.set(cache, target);
57
+ }
58
+ else {
59
+ resizeCanvasRenderTarget(target, width, height);
60
+ }
61
+ return target;
62
+ }
63
+ export function getCanvasRenderCacheTarget(state, cache) {
64
+ return getTargets(state).get(cache) ?? null;
65
+ }
66
+ /**
67
+ * Bakes `source`'s subtree into its cache target using the offscreen `cacheState`, then
68
+ * records the transform that places the result back in scene space. The bake runs on the
69
+ * offscreen state, so it neither substitutes the cache into itself nor disturbs the screen
70
+ * state's render nodes — no adapter suppression needed.
71
+ *
72
+ * Returns whether a bake actually happened: the offscreen state's own dirtiness decides it
73
+ * (honoring its sceneGraphSyncPolicy), so this is cheap to call every frame — it redraws only
74
+ * when the subtree changed or the target was resized. The target is owned by the screen state
75
+ * (keyed by the handle), never by the handle, so one handle can be composited by several states.
76
+ */
77
+ export function refreshCanvasRenderCache(cacheState, cache, source, options) {
78
+ const screenState = _cacheStateScreen.get(cacheState) ?? cacheState;
79
+ const padding = options?.padding ?? 0;
80
+ const minWidth = options?.minWidth ?? 1;
81
+ const minHeight = options?.minHeight ?? 1;
82
+ computeNodeBoundsRectangle(_bounds, source, source);
83
+ const { width, height } = computeRenderTargetSize(_bounds, padding, minWidth, minHeight);
84
+ const existing = getCanvasRenderCacheTarget(screenState, cache);
85
+ // A canvas resize clears its pixels, so a resized target must be redrawn even if the
86
+ // subtree itself is unchanged.
87
+ const resized = existing === null || existing.width !== width || existing.height !== height;
88
+ const target = ensureCanvasRenderCacheTarget(screenState, cache, width, height);
89
+ computeDisplayObjectRenderTargetTransform(_renderTransform, source, _bounds, padding, padding);
90
+ computeRenderCacheTransform(cache.transform, _bounds, padding, padding);
91
+ const handles = cacheState;
92
+ const runtime = getCanvasRenderStateRuntime(cacheState);
93
+ handles.canvas = target.canvas;
94
+ handles.context = target.context;
95
+ handles.context.imageSmoothingEnabled = runtime.imageSmoothingEnabled;
96
+ handles.context.imageSmoothingQuality = runtime.imageSmoothingQuality;
97
+ copyMatrix(handles.renderTransform2D, _renderTransform);
98
+ const dirty = prepareDisplayObjectRender(cacheState, source);
99
+ if (dirty || resized) {
100
+ handles.context.clearRect(0, 0, target.canvas.width, target.canvas.height);
101
+ renderCanvasDisplayObject(cacheState, source);
102
+ }
103
+ return dirty || resized;
104
+ }
105
+ export function releaseCanvasRenderCache(state, cache) {
106
+ // A CanvasRenderTarget holds no GPU handle; dropping the reference is enough to free it.
107
+ getTargets(state).delete(cache);
108
+ }
109
+ function drawCanvasRenderCache(state, renderProxy) {
110
+ const cache = getRenderProxyCache(state, renderProxy.source);
111
+ if (cache === null)
112
+ return;
113
+ const canvasState = state;
114
+ const target = getTargets(canvasState).get(cache);
115
+ if (target === undefined)
116
+ return;
117
+ // renderProxy.transform2D already carries the cache placement transform (folded in by the
118
+ // adapter), so the cached canvas composites at the origin.
119
+ setCanvasTransform(canvasState, canvasState.context, renderProxy.transform2D);
120
+ canvasState.context.drawImage(target.canvas, 0, 0);
121
+ }
122
+ function getTargets(state) {
123
+ let targets = _renderCacheTargets.get(state);
124
+ if (targets === undefined) {
125
+ targets = new WeakMap();
126
+ _renderCacheTargets.set(state, targets);
127
+ }
128
+ return targets;
129
+ }
130
+ export const defaultCanvasRenderCacheRenderer = {
131
+ createData: noopRendererData,
132
+ submit: drawCanvasRenderCache,
133
+ };
134
+ // The screen state owns each cache's target, keyed by the handle, so one handle can be
135
+ // composited by several states without the handle carrying a backend resource.
136
+ const _renderCacheTargets = new WeakMap();
137
+ // Links an offscreen cache state back to the screen state whose targets it bakes into.
138
+ const _cacheStateScreen = new WeakMap();
139
+ const _bounds = createRectangle();
140
+ const _renderTransform = createMatrix();
141
+ //# sourceMappingURL=canvasCache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvasCache.js","sourceRoot":"","sources":["../src/canvasCache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { CanvasRenderState } from '@flighthq/types';
2
+ export declare function enableCanvasClip(state: CanvasRenderState): void;
3
+ //# sourceMappingURL=canvasClip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvasClip.d.ts","sourceRoot":"","sources":["../src/canvasClip.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EAKlB,MAAM,iBAAiB,CAAC;AAOzB,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAE/D"}
@@ -0,0 +1,38 @@
1
+ import { popCanvasClipRectangle, pushCanvasClipContours, pushCanvasClipRectangle } from './canvasClipRectangle';
2
+ // Masks RETIRED — a former mask is a path ClipRegion. Canvas realizes both clip forms with the native
3
+ // context clip (rect path or contour path), so push/pop is a uniform ctx.save()/ctx.restore() bracket
4
+ // and pop needs no per-form dispatch.
5
+ export function enableCanvasClip(state) {
6
+ state.displayObjectClipHooks = canvasClipHooks;
7
+ }
8
+ const canvasClipHooks = {
9
+ finalize(state) {
10
+ const s = state;
11
+ while (s.currentClipDepth > 0) {
12
+ popCanvasClipRectangle(s);
13
+ s.currentClipDepth--;
14
+ }
15
+ },
16
+ popClip(state, data, source) {
17
+ const s = state;
18
+ const target = data.clipDepth - (source.clip != null ? 1 : 0);
19
+ while (s.currentClipDepth > target) {
20
+ popCanvasClipRectangle(s);
21
+ s.currentClipDepth--;
22
+ }
23
+ },
24
+ pushClip(state, data, source) {
25
+ const s = state;
26
+ const clip = source.clip;
27
+ if (clip === null)
28
+ return;
29
+ if (clip.contours === null) {
30
+ pushCanvasClipRectangle(s, clip.rect, data.transform2D);
31
+ }
32
+ else {
33
+ pushCanvasClipContours(s, clip.contours, clip.winding, data.transform2D);
34
+ }
35
+ s.currentClipDepth++;
36
+ },
37
+ };
38
+ //# sourceMappingURL=canvasClip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvasClip.js","sourceRoot":"","sources":["../src/canvasClip.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAEhH,sGAAsG;AACtG,sGAAsG;AACtG,sCAAsC;AACtC,MAAM,UAAU,gBAAgB,CAAC,KAAwB;IACvD,KAAK,CAAC,sBAAsB,GAAG,eAAe,CAAC;AACjD,CAAC;AAED,MAAM,eAAe,GAA2B;IAC9C,QAAQ,CAAC,KAAkB;QACzB,MAAM,CAAC,GAAG,KAA0B,CAAC;QACrC,OAAO,CAAC,CAAC,gBAAgB,GAAG,CAAC,EAAE,CAAC;YAC9B,sBAAsB,CAAC,CAAC,CAAC,CAAC;YAC1B,CAAC,CAAC,gBAAgB,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;IACD,OAAO,CAAC,KAAkB,EAAE,IAAmB,EAAE,MAAqB;QACpE,MAAM,CAAC,GAAG,KAA0B,CAAC;QACrC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9D,OAAO,CAAC,CAAC,gBAAgB,GAAG,MAAM,EAAE,CAAC;YACnC,sBAAsB,CAAC,CAAC,CAAC,CAAC;YAC1B,CAAC,CAAC,gBAAgB,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;IACD,QAAQ,CAAC,KAAkB,EAAE,IAAmB,EAAE,MAAqB;QACrE,MAAM,CAAC,GAAG,KAA0B,CAAC;QACrC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACzB,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO;QAC1B,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;YAC3B,uBAAuB,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAC1D,CAAC;aAAM,CAAC;YACN,sBAAsB,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAC3E,CAAC;QACD,CAAC,CAAC,gBAAgB,EAAE,CAAC;IACvB,CAAC;CACF,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { CanvasRenderState, Matrix, PathWinding, RectangleLike } from '@flighthq/types';
2
+ export declare function popCanvasClipRectangle(state: CanvasRenderState): void;
3
+ export declare function pushCanvasClipContours(state: CanvasRenderState, contours: readonly (readonly number[])[], winding: PathWinding, transform: Matrix): void;
4
+ export declare function pushCanvasClipRectangle(state: CanvasRenderState, rect: Readonly<RectangleLike>, transform: Matrix): void;
5
+ //# sourceMappingURL=canvasClipRectangle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvasClipRectangle.d.ts","sourceRoot":"","sources":["../src/canvasClipRectangle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAI7F,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAErE;AAKD,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,iBAAiB,EACxB,QAAQ,EAAE,SAAS,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,EACxC,OAAO,EAAE,WAAW,EACpB,SAAS,EAAE,MAAM,GAChB,IAAI,CAgBN;AAED,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,iBAAiB,EACxB,IAAI,EAAE,QAAQ,CAAC,aAAa,CAAC,EAC7B,SAAS,EAAE,MAAM,GAChB,IAAI,CAQN"}
@@ -0,0 +1,31 @@
1
+ import { setCanvasTransform } from './canvasTransform';
2
+ export function popCanvasClipRectangle(state) {
3
+ state.context.restore();
4
+ }
5
+ // Clips the context to arbitrary flattened contours (a path clip) under the given transform, using the
6
+ // native canvas clip — crisp at any zoom, no resolution-bound texture. Paired with popCanvasClipRectangle
7
+ // (a context save/restore bracket, like the rectangle clip). Empty contours leave the context unclipped.
8
+ export function pushCanvasClipContours(state, contours, winding, transform) {
9
+ state.context.save();
10
+ setCanvasTransform(state, state.context, transform);
11
+ state.context.beginPath();
12
+ for (let c = 0; c < contours.length; c++) {
13
+ const contour = contours[c];
14
+ if (contour.length < 2)
15
+ continue;
16
+ state.context.moveTo(contour[0], contour[1]);
17
+ for (let i = 2; i < contour.length; i += 2) {
18
+ state.context.lineTo(contour[i], contour[i + 1]);
19
+ }
20
+ state.context.closePath();
21
+ }
22
+ state.context.clip(winding === 'evenOdd' ? 'evenodd' : 'nonzero');
23
+ }
24
+ export function pushCanvasClipRectangle(state, rect, transform) {
25
+ state.context.save();
26
+ setCanvasTransform(state, state.context, transform);
27
+ state.context.beginPath();
28
+ state.context.rect(rect.x, rect.y, rect.width, rect.height);
29
+ state.context.clip();
30
+ }
31
+ //# sourceMappingURL=canvasClipRectangle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvasClipRectangle.js","sourceRoot":"","sources":["../src/canvasClipRectangle.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,UAAU,sBAAsB,CAAC,KAAwB;IAC7D,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;AAC1B,CAAC;AAED,uGAAuG;AACvG,0GAA0G;AAC1G,yGAAyG;AACzG,MAAM,UAAU,sBAAsB,CACpC,KAAwB,EACxB,QAAwC,EACxC,OAAoB,EACpB,SAAiB;IAEjB,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IAErB,kBAAkB,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAEpD,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;IAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;YAAE,SAAS;QACjC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3C,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACnD,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;IAC5B,CAAC;IACD,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,KAAwB,EACxB,IAA6B,EAC7B,SAAiB;IAEjB,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IAErB,kBAAkB,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAEpD,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;IAC1B,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5D,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;AACvB,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { CanvasRenderState, DisplayObject, DisplayObjectRenderer, RenderProxy2D } from '@flighthq/types';
2
+ export declare function drawCanvasDisplayObject(_state: CanvasRenderState, _renderProxy: RenderProxy2D): void;
3
+ export declare const defaultCanvasDisplayObjectRenderer: DisplayObjectRenderer;
4
+ export declare function renderCanvasDisplayObject(state: CanvasRenderState, source: DisplayObject): void;
5
+ //# sourceMappingURL=canvasDisplayObject.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvasDisplayObject.d.ts","sourceRoot":"","sources":["../src/canvasDisplayObject.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAK9G,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,iBAAiB,EAAE,YAAY,EAAE,aAAa,GAAG,IAAI,CAEpG;AAED,eAAO,MAAM,kCAAkC,EAAE,qBAGhD,CAAC;AAEF,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,iBAAiB,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,CAmC/F"}
@@ -0,0 +1,46 @@
1
+ import { getDisplayObjectRuntime } from '@flighthq/displayobject';
2
+ import { getRenderProxy2D, isRenderProxyVisible, noopRendererData } from '@flighthq/render';
3
+ import { resolveCanvasCssFilter } from './canvasCSSFilterBinding';
4
+ import { getCanvasRenderStateRuntime } from './canvasRenderState';
5
+ export function drawCanvasDisplayObject(_state, _renderProxy) {
6
+ // Plain display objects have no visual geometry of their own.
7
+ }
8
+ export const defaultCanvasDisplayObjectRenderer = {
9
+ createData: noopRendererData,
10
+ submit: drawCanvasDisplayObject,
11
+ };
12
+ export function renderCanvasDisplayObject(state, source) {
13
+ const tempStack = getCanvasRenderStateRuntime(state).tempStack;
14
+ const clipHooks = state.displayObjectClipHooks;
15
+ let stackLength = 1;
16
+ tempStack[0] = source;
17
+ while (stackLength > 0) {
18
+ const current = tempStack[--stackLength];
19
+ if (!current.enabled)
20
+ continue;
21
+ const data = getRenderProxy2D(state, current);
22
+ if (data === undefined)
23
+ continue;
24
+ clipHooks?.popClip(state, data, current);
25
+ if (!isRenderProxyVisible(data))
26
+ continue;
27
+ clipHooks?.pushClip(state, data, current);
28
+ const filter = resolveCanvasCssFilter(state, data);
29
+ if (filter !== null)
30
+ state.context.filter = filter;
31
+ if (data.renderer !== null)
32
+ data.renderer.submit(state, data);
33
+ if (filter !== null)
34
+ state.context.filter = 'none';
35
+ if (data.traverseChildren) {
36
+ const children = getDisplayObjectRuntime(current).children;
37
+ if (children !== null) {
38
+ for (let i = children.length - 1; i >= 0; i--) {
39
+ tempStack[stackLength++] = children[i];
40
+ }
41
+ }
42
+ }
43
+ }
44
+ clipHooks?.finalize(state);
45
+ }
46
+ //# sourceMappingURL=canvasDisplayObject.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvasDisplayObject.js","sourceRoot":"","sources":["../src/canvasDisplayObject.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAG5F,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAElE,MAAM,UAAU,uBAAuB,CAAC,MAAyB,EAAE,YAA2B;IAC5F,8DAA8D;AAChE,CAAC;AAED,MAAM,CAAC,MAAM,kCAAkC,GAA0B;IACvE,UAAU,EAAE,gBAAgB;IAC5B,MAAM,EAAE,uBAAuB;CAChC,CAAC;AAEF,MAAM,UAAU,yBAAyB,CAAC,KAAwB,EAAE,MAAqB;IACvF,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,CAAkB,CAAC;QAC1D,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;QAE1C,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,uBAAuB,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC;YAC3D,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,CAAkB,CAAC;gBAC1D,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,SAAS,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function createCanvasElement(width: number, height: number, pixelRatio?: number): HTMLCanvasElement;
2
+ //# sourceMappingURL=canvasElement.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvasElement.d.ts","sourceRoot":"","sources":["../src/canvasElement.ts"],"names":[],"mappings":"AAAA,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAE,MAAU,GAAG,iBAAiB,CAO5G"}
@@ -0,0 +1,9 @@
1
+ export function createCanvasElement(width, height, pixelRatio = 1) {
2
+ const canvas = document.createElement('canvas');
3
+ canvas.style.width = `${width}px`;
4
+ canvas.style.height = `${height}px`;
5
+ canvas.width = width * pixelRatio;
6
+ canvas.height = height * pixelRatio;
7
+ return canvas;
8
+ }
9
+ //# sourceMappingURL=canvasElement.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvasElement.js","sourceRoot":"","sources":["../src/canvasElement.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,mBAAmB,CAAC,KAAa,EAAE,MAAc,EAAE,aAAqB,CAAC;IACvF,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,KAAK,IAAI,CAAC;IAClC,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC;IACpC,MAAM,CAAC,KAAK,GAAG,KAAK,GAAG,UAAU,CAAC;IAClC,MAAM,CAAC,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC;IACpC,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { GradientType, ImageResource, InterpolationMethod, Matrix, SpreadMethod } from '@flighthq/types';
2
+ export declare function createBitmapPattern(context: CanvasRenderingContext2D, bitmap: ImageResource, repeat: boolean, smooth?: boolean): CanvasPattern | null;
3
+ export declare function createGradientPattern(context: CanvasRenderingContext2D, gradientType: GradientType, colors: number[], alphas: number[], ratios: number[], m: Matrix | null, spreadMethod: SpreadMethod, _interpolationMethod: InterpolationMethod, focalPointRatio: number): CanvasPattern | CanvasGradient | null;
4
+ //# sourceMappingURL=canvasFillPattern.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvasFillPattern.d.ts","sourceRoot":"","sources":["../src/canvasFillPattern.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EACb,mBAAmB,EACnB,MAAM,EAEN,YAAY,EACb,MAAM,iBAAiB,CAAC;AAKzB,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,wBAAwB,EACjC,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,OAAO,EACf,MAAM,UAAQ,GACb,aAAa,GAAG,IAAI,CAItB;AAED,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,wBAAwB,EACjC,YAAY,EAAE,YAAY,EAC1B,MAAM,EAAE,MAAM,EAAE,EAChB,MAAM,EAAE,MAAM,EAAE,EAChB,MAAM,EAAE,MAAM,EAAE,EAChB,CAAC,EAAE,MAAM,GAAG,IAAI,EAChB,YAAY,EAAE,YAAY,EAC1B,oBAAoB,EAAE,mBAAmB,EACzC,eAAe,EAAE,MAAM,GACtB,aAAa,GAAG,cAAc,GAAG,IAAI,CAOvC"}