@flighthq/scene2d-canvas 0.2.1-next.840.857425c

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 (155) 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 +36 -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/canvasElement.d.ts +2 -0
  26. package/dist/canvasElement.d.ts.map +1 -0
  27. package/dist/canvasElement.js +9 -0
  28. package/dist/canvasElement.js.map +1 -0
  29. package/dist/canvasFillPattern.d.ts +4 -0
  30. package/dist/canvasFillPattern.d.ts.map +1 -0
  31. package/dist/canvasFillPattern.js +108 -0
  32. package/dist/canvasFillPattern.js.map +1 -0
  33. package/dist/canvasImageSource.d.ts +4 -0
  34. package/dist/canvasImageSource.d.ts.map +1 -0
  35. package/dist/canvasImageSource.js +45 -0
  36. package/dist/canvasImageSource.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 +39 -0
  44. package/dist/canvasMaterials.js.map +1 -0
  45. package/dist/canvasNode2D.d.ts +5 -0
  46. package/dist/canvasNode2D.d.ts.map +1 -0
  47. package/dist/canvasNode2D.js +46 -0
  48. package/dist/canvasNode2D.js.map +1 -0
  49. package/dist/canvasParticleEmitter2D.d.ts +4 -0
  50. package/dist/canvasParticleEmitter2D.d.ts.map +1 -0
  51. package/dist/canvasParticleEmitter2D.js +64 -0
  52. package/dist/canvasParticleEmitter2D.js.map +1 -0
  53. package/dist/canvasQuadBatch.d.ts +4 -0
  54. package/dist/canvasQuadBatch.d.ts.map +1 -0
  55. package/dist/canvasQuadBatch.js +64 -0
  56. package/dist/canvasQuadBatch.js.map +1 -0
  57. package/dist/canvasRegistration.d.ts +4 -0
  58. package/dist/canvasRegistration.d.ts.map +1 -0
  59. package/dist/canvasRegistration.js +39 -0
  60. package/dist/canvasRegistration.js.map +1 -0
  61. package/dist/canvasRenderState.d.ts +5 -0
  62. package/dist/canvasRenderState.d.ts.map +1 -0
  63. package/dist/canvasRenderState.js +44 -0
  64. package/dist/canvasRenderState.js.map +1 -0
  65. package/dist/canvasRenderTarget.d.ts +26 -0
  66. package/dist/canvasRenderTarget.d.ts.map +1 -0
  67. package/dist/canvasRenderTarget.js +80 -0
  68. package/dist/canvasRenderTarget.js.map +1 -0
  69. package/dist/canvasRichText.d.ts +6 -0
  70. package/dist/canvasRichText.d.ts.map +1 -0
  71. package/dist/canvasRichText.js +128 -0
  72. package/dist/canvasRichText.js.map +1 -0
  73. package/dist/canvasScale9Mapper.d.ts +10 -0
  74. package/dist/canvasScale9Mapper.d.ts.map +1 -0
  75. package/dist/canvasScale9Mapper.js +148 -0
  76. package/dist/canvasScale9Mapper.js.map +1 -0
  77. package/dist/canvasScale9Shape.d.ts +5 -0
  78. package/dist/canvasScale9Shape.d.ts.map +1 -0
  79. package/dist/canvasScale9Shape.js +156 -0
  80. package/dist/canvasScale9Shape.js.map +1 -0
  81. package/dist/canvasShape.d.ts +5 -0
  82. package/dist/canvasShape.d.ts.map +1 -0
  83. package/dist/canvasShape.js +79 -0
  84. package/dist/canvasShape.js.map +1 -0
  85. package/dist/canvasShapeCommands.d.ts +19 -0
  86. package/dist/canvasShapeCommands.d.ts.map +1 -0
  87. package/dist/canvasShapeCommands.js +352 -0
  88. package/dist/canvasShapeCommands.js.map +1 -0
  89. package/dist/canvasShapeRegistry.d.ts +5 -0
  90. package/dist/canvasShapeRegistry.d.ts.map +1 -0
  91. package/dist/canvasShapeRegistry.js +17 -0
  92. package/dist/canvasShapeRegistry.js.map +1 -0
  93. package/dist/canvasSprite.d.ts +5 -0
  94. package/dist/canvasSprite.d.ts.map +1 -0
  95. package/dist/canvasSprite.js +61 -0
  96. package/dist/canvasSprite.js.map +1 -0
  97. package/dist/canvasTextInput.d.ts +4 -0
  98. package/dist/canvasTextInput.d.ts.map +1 -0
  99. package/dist/canvasTextInput.js +67 -0
  100. package/dist/canvasTextInput.js.map +1 -0
  101. package/dist/canvasTextLabel.d.ts +4 -0
  102. package/dist/canvasTextLabel.d.ts.map +1 -0
  103. package/dist/canvasTextLabel.js +56 -0
  104. package/dist/canvasTextLabel.js.map +1 -0
  105. package/dist/canvasTextMeasure.d.ts +3 -0
  106. package/dist/canvasTextMeasure.d.ts.map +1 -0
  107. package/dist/canvasTextMeasure.js +15 -0
  108. package/dist/canvasTextMeasure.js.map +1 -0
  109. package/dist/canvasTilemap.d.ts +4 -0
  110. package/dist/canvasTilemap.d.ts.map +1 -0
  111. package/dist/canvasTilemap.js +50 -0
  112. package/dist/canvasTilemap.js.map +1 -0
  113. package/dist/canvasTransform.d.ts +3 -0
  114. package/dist/canvasTransform.d.ts.map +1 -0
  115. package/dist/canvasTransform.js +9 -0
  116. package/dist/canvasTransform.js.map +1 -0
  117. package/dist/canvasVideo.d.ts +4 -0
  118. package/dist/canvasVideo.d.ts.map +1 -0
  119. package/dist/canvasVideo.js +26 -0
  120. package/dist/canvasVideo.js.map +1 -0
  121. package/dist/index.d.ts +31 -0
  122. package/dist/index.d.ts.map +1 -0
  123. package/dist/index.js +31 -0
  124. package/dist/index.js.map +1 -0
  125. package/package.json +55 -0
  126. package/src/canvasBackground.test.ts +65 -0
  127. package/src/canvasBitmap.test.ts +92 -0
  128. package/src/canvasCSSFilterBinding.test.ts +86 -0
  129. package/src/canvasCache.test.ts +189 -0
  130. package/src/canvasClip.test.ts +12 -0
  131. package/src/canvasClipRectangle.test.ts +101 -0
  132. package/src/canvasElement.test.ts +21 -0
  133. package/src/canvasFillPattern.test.ts +96 -0
  134. package/src/canvasImageSource.test.ts +79 -0
  135. package/src/canvasMaterialRegistry.test.ts +69 -0
  136. package/src/canvasMaterials.test.ts +85 -0
  137. package/src/canvasNode2D.test.ts +113 -0
  138. package/src/canvasParticleEmitter2D.test.ts +105 -0
  139. package/src/canvasQuadBatch.test.ts +119 -0
  140. package/src/canvasRegistration.test.ts +57 -0
  141. package/src/canvasRenderState.test.ts +186 -0
  142. package/src/canvasRenderTarget.test.ts +162 -0
  143. package/src/canvasRichText.test.ts +93 -0
  144. package/src/canvasScale9Mapper.test.ts +53 -0
  145. package/src/canvasScale9Shape.test.ts +89 -0
  146. package/src/canvasShape.test.ts +183 -0
  147. package/src/canvasShapeCommands.test.ts +448 -0
  148. package/src/canvasShapeRegistry.test.ts +42 -0
  149. package/src/canvasSprite.test.ts +106 -0
  150. package/src/canvasTextInput.test.ts +67 -0
  151. package/src/canvasTextLabel.test.ts +32 -0
  152. package/src/canvasTextMeasure.test.ts +9 -0
  153. package/src/canvasTilemap.test.ts +69 -0
  154. package/src/canvasTransform.test.ts +42 -0
  155. package/src/canvasVideo.test.ts +43 -0
@@ -0,0 +1,45 @@
1
+ import { createCanvasFromImageResource } from '@flighthq/image';
2
+ import { getCanvasRenderStateRuntime } from './canvasRenderState';
3
+ // Reports how a resource will resolve on the Canvas backend without drawing or materializing anything
4
+ // — the shakeable diagnostic for the otherwise-silent data→element transcode. `element` is free;
5
+ // `data` means resolveCanvasImageSource transcodes the pixels into a cached canvas on first use and
6
+ // after every `version` bump (a CPU copy the GL/wgpu data path does not incur, since those upload raw
7
+ // texels natively). A guard or dev tool surfaces this so the cost is legible, per the diagnostics rule.
8
+ export function explainCanvasImageSource(image) {
9
+ if (image.source !== null)
10
+ return 'element';
11
+ if (image.data !== null)
12
+ return 'data';
13
+ return 'none';
14
+ }
15
+ // Resolves a (possibly data-only) ImageResource to a CanvasImageSource the 2D context can draw. An
16
+ // element-backed resource returns its host `source` directly with no copy. A data-only resource — a
17
+ // generated Surface with no element — materializes an HTMLCanvasElement from its raw pixels and caches
18
+ // it per render state, re-materializing only when `version` bumps (see invalidateImageResource).
19
+ // Returns null when the resource carries neither pixel form.
20
+ //
21
+ // This is the Canvas parallel to the GL backend's bindGlImageResourceTexture: derived, renderer-owned
22
+ // state keyed on the caller's explicit invalidation signal, never written back onto the shared
23
+ // resource. It closes the gap where a data-only Surface previously drew nothing on Canvas/DOM unless
24
+ // the caller manually built an element (createImageResourceFromSurface) first. The transcode cost is
25
+ // reportable via explainCanvasImageSource rather than hidden.
26
+ export function resolveCanvasImageSource(state, image) {
27
+ if (image.source !== null)
28
+ return image.source;
29
+ if (image.data === null)
30
+ return null;
31
+ const runtime = getCanvasRenderStateRuntime(state);
32
+ let cache = runtime.imageResourceElementCache;
33
+ if (cache === undefined) {
34
+ cache = new WeakMap();
35
+ runtime.imageResourceElementCache = cache;
36
+ }
37
+ let entry = cache.get(image);
38
+ if (entry === undefined || entry.version !== image.version) {
39
+ // data is non-null here, so the transcode never returns null.
40
+ entry = { element: createCanvasFromImageResource(image), version: image.version };
41
+ cache.set(image, entry);
42
+ }
43
+ return entry.element;
44
+ }
45
+ //# sourceMappingURL=canvasImageSource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvasImageSource.js","sourceRoot":"","sources":["../src/canvasImageSource.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,6BAA6B,EAAE,MAAM,iBAAiB,CAAC;AAGhE,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAElE,sGAAsG;AACtG,iGAAiG;AACjG,oGAAoG;AACpG,sGAAsG;AACtG,wGAAwG;AACxG,MAAM,UAAU,wBAAwB,CAAC,KAA8B;IACrE,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5C,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IACvC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,mGAAmG;AACnG,oGAAoG;AACpG,uGAAuG;AACvG,iGAAiG;AACjG,6DAA6D;AAC7D,EAAE;AACF,sGAAsG;AACtG,+FAA+F;AAC/F,qGAAqG;AACrG,qGAAqG;AACrG,8DAA8D;AAC9D,MAAM,UAAU,wBAAwB,CACtC,KAAwB,EACxB,KAA8B;IAE9B,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC,MAAM,CAAC;IAC/C,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAErC,MAAM,OAAO,GAAG,2BAA2B,CAAC,KAAK,CAAC,CAAC;IACnD,IAAI,KAAK,GAAG,OAAO,CAAC,yBAAyB,CAAC;IAC9C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,KAAK,GAAG,IAAI,OAAO,EAAE,CAAC;QACtB,OAAO,CAAC,yBAAyB,GAAG,KAAK,CAAC;IAC5C,CAAC;IAED,IAAI,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC7B,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;QAC3D,8DAA8D;QAC9D,KAAK,GAAG,EAAE,OAAO,EAAE,6BAA6B,CAAC,KAAK,CAAE,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;QACnF,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,KAAK,CAAC,OAAO,CAAC;AACvB,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { CanvasMaterialRenderer, CanvasRenderState, Kind, Material } from '@flighthq/types';
2
+ export declare function applyCanvasMaterial(state: CanvasRenderState, material: Material | null): boolean;
3
+ export declare function getCanvasMaterialRenderer(state: CanvasRenderState, kind: Kind): CanvasMaterialRenderer | null;
4
+ export declare function registerCanvasMaterialRenderer(state: CanvasRenderState, kind: Kind, renderer: CanvasMaterialRenderer): void;
5
+ export declare function resolveCanvasMaterialRenderer(state: CanvasRenderState, material: Material | null): CanvasMaterialRenderer | null;
6
+ //# sourceMappingURL=canvasMaterialRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvasMaterialRegistry.d.ts","sourceRoot":"","sources":["../src/canvasMaterialRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAQjG,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI,GAAG,OAAO,CAUhG;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,IAAI,GAAG,sBAAsB,GAAG,IAAI,CAE7G;AAED,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,iBAAiB,EACxB,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,sBAAsB,GAC/B,IAAI,CAGN;AAKD,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,iBAAiB,EACxB,QAAQ,EAAE,QAAQ,GAAG,IAAI,GACxB,sBAAsB,GAAG,IAAI,CAQ/B"}
@@ -0,0 +1,42 @@
1
+ import { DefaultMaterialKind } from '@flighthq/types';
2
+ import { getCanvasRenderStateRuntime } from './canvasRenderState';
3
+ // Applies a node's material draw-state delta before a canvas draw, bracketed with ctx.save().
4
+ // Returns true when it saved and the caller must ctx.restore() after drawing; false (no save) when
5
+ // there is no material or no registered renderer, so the common path pays nothing.
6
+ export function applyCanvasMaterial(state, material) {
7
+ if (material === null)
8
+ return false;
9
+ const renderer = resolveCanvasMaterialRenderer(state, material);
10
+ if (renderer === null)
11
+ return false;
12
+ const drawState = renderer.getState(material);
13
+ const context = state.context;
14
+ context.save();
15
+ if (drawState.composite !== undefined)
16
+ context.globalCompositeOperation = drawState.composite;
17
+ if (drawState.filter !== undefined)
18
+ context.filter = drawState.filter;
19
+ return true;
20
+ }
21
+ export function getCanvasMaterialRenderer(state, kind) {
22
+ return getCanvasRenderStateRuntime(state).materialRendererMap?.get(kind) ?? null;
23
+ }
24
+ export function registerCanvasMaterialRenderer(state, kind, renderer) {
25
+ const runtime = getCanvasRenderStateRuntime(state);
26
+ (runtime.materialRendererMap ??= new Map()).set(kind, renderer);
27
+ }
28
+ // Resolves a node's material to its Canvas renderer, else the registered default, else null.
29
+ // Unlike Gl there is no built-in fallback: a null result means "draw normally", since the
30
+ // canvas renderer already performs the draw and a material only contributes extra draw state.
31
+ export function resolveCanvasMaterialRenderer(state, material) {
32
+ const map = getCanvasRenderStateRuntime(state).materialRendererMap;
33
+ if (map === undefined)
34
+ return null;
35
+ if (material !== null) {
36
+ const renderer = map.get(material.kind);
37
+ if (renderer !== undefined)
38
+ return renderer;
39
+ }
40
+ return map.get(DefaultMaterialKind) ?? null;
41
+ }
42
+ //# sourceMappingURL=canvasMaterialRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvasMaterialRegistry.js","sourceRoot":"","sources":["../src/canvasMaterialRegistry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEtD,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAElE,8FAA8F;AAC9F,mGAAmG;AACnG,mFAAmF;AACnF,MAAM,UAAU,mBAAmB,CAAC,KAAwB,EAAE,QAAyB;IACrF,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IACpC,MAAM,QAAQ,GAAG,6BAA6B,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAChE,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IACpC,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAC9B,OAAO,CAAC,IAAI,EAAE,CAAC;IACf,IAAI,SAAS,CAAC,SAAS,KAAK,SAAS;QAAE,OAAO,CAAC,wBAAwB,GAAG,SAAS,CAAC,SAAS,CAAC;IAC9F,IAAI,SAAS,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;IACtE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,KAAwB,EAAE,IAAU;IAC5E,OAAO,2BAA2B,CAAC,KAAK,CAAC,CAAC,mBAAmB,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;AACnF,CAAC;AAED,MAAM,UAAU,8BAA8B,CAC5C,KAAwB,EACxB,IAAU,EACV,QAAgC;IAEhC,MAAM,OAAO,GAAG,2BAA2B,CAAC,KAAK,CAAC,CAAC;IACnD,CAAC,OAAO,CAAC,mBAAmB,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAClE,CAAC;AAED,6FAA6F;AAC7F,0FAA0F;AAC1F,8FAA8F;AAC9F,MAAM,UAAU,6BAA6B,CAC3C,KAAwB,EACxB,QAAyB;IAEzB,MAAM,GAAG,GAAG,2BAA2B,CAAC,KAAK,CAAC,CAAC,mBAAmB,CAAC;IACnE,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACnC,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,QAAQ,KAAK,SAAS;YAAE,OAAO,QAAQ,CAAC;IAC9C,CAAC;IACD,OAAO,GAAG,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,IAAI,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { CanvasRenderState } from '@flighthq/types';
2
+ import { BlendMode } from '@flighthq/types';
3
+ export declare function applyCanvasBlendMode(state: CanvasRenderState, value: BlendMode | null): void;
4
+ export declare function enableCanvasBlendMode(state: CanvasRenderState): void;
5
+ //# sourceMappingURL=canvasMaterials.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvasMaterials.d.ts","sourceRoot":"","sources":["../src/canvasMaterials.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAqB,SAAS,EAAE,MAAM,iBAAiB,CAAC;AA+B/D,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,SAAS,GAAG,IAAI,GAAG,IAAI,CAK5F;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAEpE"}
@@ -0,0 +1,39 @@
1
+ import { AdvancedBlendMode, BlendMode } from '@flighthq/types';
2
+ import { getCanvasRenderStateRuntime } from './canvasRenderState';
3
+ // Auditable map from a blend-mode intent to the Canvas2D globalCompositeOperation
4
+ // that realizes it. `null` means there is no faithful Canvas2D equivalent, so the
5
+ // mode degrades to normal ('source-over') compositing. Canvas2D is the one backend that natively
6
+ // realizes the destination-reading AdvancedBlendMode set too (via globalCompositeOperation), so those
7
+ // keys are carried here — a caller can hand a display object either a fixed-function BlendMode or an
8
+ // AdvancedBlendMode string and Canvas resolves both, even though only the fixed-function set is exposed
9
+ // as a node property.
10
+ const CANVAS_BLEND_MODE = {
11
+ [BlendMode.Add]: 'lighter',
12
+ [BlendMode.Darken]: 'darken',
13
+ [BlendMode.Lighten]: 'lighten',
14
+ [BlendMode.Multiply]: 'multiply',
15
+ [BlendMode.Normal]: 'source-over',
16
+ [BlendMode.Screen]: 'screen',
17
+ [AdvancedBlendMode.Color]: 'color',
18
+ [AdvancedBlendMode.ColorBurn]: 'color-burn',
19
+ [AdvancedBlendMode.ColorDodge]: 'color-dodge',
20
+ [AdvancedBlendMode.Difference]: 'difference',
21
+ [AdvancedBlendMode.Exclusion]: 'exclusion',
22
+ [AdvancedBlendMode.HardLight]: 'hard-light',
23
+ [AdvancedBlendMode.Hue]: 'hue',
24
+ [AdvancedBlendMode.Luminosity]: 'luminosity',
25
+ [AdvancedBlendMode.Overlay]: 'overlay',
26
+ [AdvancedBlendMode.Saturation]: 'saturation',
27
+ [AdvancedBlendMode.SoftLight]: 'soft-light',
28
+ };
29
+ export function applyCanvasBlendMode(state, value) {
30
+ const runtime = getCanvasRenderStateRuntime(state);
31
+ if (value === runtime.currentBlendMode)
32
+ return;
33
+ runtime.currentBlendMode = value;
34
+ state.context.globalCompositeOperation = (value !== null ? CANVAS_BLEND_MODE[value] : null) ?? 'source-over';
35
+ }
36
+ export function enableCanvasBlendMode(state) {
37
+ state.applyBlendMode = applyCanvasBlendMode;
38
+ }
39
+ //# sourceMappingURL=canvasMaterials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvasMaterials.js","sourceRoot":"","sources":["../src/canvasMaterials.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE/D,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAElE,kFAAkF;AAClF,kFAAkF;AAClF,iGAAiG;AACjG,sGAAsG;AACtG,qGAAqG;AACrG,wGAAwG;AACxG,sBAAsB;AACtB,MAAM,iBAAiB,GAAuD;IAC5E,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,SAAS;IAC1B,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,QAAQ;IAC5B,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,SAAS;IAC9B,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,UAAU;IAChC,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,aAAa;IACjC,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,QAAQ;IAC5B,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,OAAO;IAClC,CAAC,iBAAiB,CAAC,SAAS,CAAC,EAAE,YAAY;IAC3C,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAAE,aAAa;IAC7C,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAAE,YAAY;IAC5C,CAAC,iBAAiB,CAAC,SAAS,CAAC,EAAE,WAAW;IAC1C,CAAC,iBAAiB,CAAC,SAAS,CAAC,EAAE,YAAY;IAC3C,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,KAAK;IAC9B,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAAE,YAAY;IAC5C,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE,SAAS;IACtC,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAAE,YAAY;IAC5C,CAAC,iBAAiB,CAAC,SAAS,CAAC,EAAE,YAAY;CAC5C,CAAC;AAEF,MAAM,UAAU,oBAAoB,CAAC,KAAwB,EAAE,KAAuB;IACpF,MAAM,OAAO,GAAG,2BAA2B,CAAC,KAAK,CAAC,CAAC;IACnD,IAAI,KAAK,KAAK,OAAO,CAAC,gBAAgB;QAAE,OAAO;IAC/C,OAAO,CAAC,gBAAgB,GAAG,KAAK,CAAC;IACjC,KAAK,CAAC,OAAO,CAAC,wBAAwB,GAAG,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,aAAa,CAAC;AAC/G,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAwB;IAC5D,KAAK,CAAC,cAAc,GAAG,oBAAoB,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { CanvasRenderState, Node2D, Scene2DRenderer, RenderProxy2D } from '@flighthq/types';
2
+ export declare function drawCanvasScene2D(_state: CanvasRenderState, _renderProxy: RenderProxy2D): void;
3
+ export declare const defaultCanvasScene2DRenderer: Scene2DRenderer;
4
+ export declare function renderCanvasScene2D(state: CanvasRenderState, source: Node2D): void;
5
+ //# sourceMappingURL=canvasNode2D.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvasNode2D.d.ts","sourceRoot":"","sources":["../src/canvasNode2D.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAKjG,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,EAAE,YAAY,EAAE,aAAa,GAAG,IAAI,CAE9F;AAED,eAAO,MAAM,4BAA4B,EAAE,eAG1C,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAmClF"}
@@ -0,0 +1,46 @@
1
+ import { getRenderProxy2D, isRenderProxyVisible, noopRendererData } from '@flighthq/render';
2
+ import { getNode2DRuntime } from '@flighthq/scene2d';
3
+ import { resolveCanvasCssFilter } from './canvasCSSFilterBinding';
4
+ import { getCanvasRenderStateRuntime } from './canvasRenderState';
5
+ export function drawCanvasScene2D(_state, _renderProxy) {
6
+ // Plain display objects have no visual geometry of their own.
7
+ }
8
+ export const defaultCanvasScene2DRenderer = {
9
+ createData: noopRendererData,
10
+ submit: drawCanvasScene2D,
11
+ };
12
+ export function renderCanvasScene2D(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 = getNode2DRuntime(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=canvasNode2D.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvasNode2D.js","sourceRoot":"","sources":["../src/canvasNode2D.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAC5F,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAGrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAElE,MAAM,UAAU,iBAAiB,CAAC,MAAyB,EAAE,YAA2B;IACtF,8DAA8D;AAChE,CAAC;AAED,MAAM,CAAC,MAAM,4BAA4B,GAAoB;IAC3D,UAAU,EAAE,gBAAgB;IAC5B,MAAM,EAAE,iBAAiB;CAC1B,CAAC;AAEF,MAAM,UAAU,mBAAmB,CAAC,KAAwB,EAAE,MAAc;IAC1E,MAAM,SAAS,GAAG,2BAA2B,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC;IAC/D,MAAM,SAAS,GAAG,KAAK,CAAC,sBAAsB,CAAC;IAE/C,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,SAAS,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;IAEtB,OAAO,WAAW,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,SAAS,CAAC,EAAE,WAAW,CAAW,CAAC;QACnD,IAAI,CAAC,OAAO,CAAC,OAAO;YAAE,SAAS;QAE/B,MAAM,IAAI,GAAG,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC9C,IAAI,IAAI,KAAK,SAAS;YAAE,SAAS;QAEjC,SAAS,EAAE,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAEzC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC;YAAE,SAAS;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,gBAAgB,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC;YACpD,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;gBACtB,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC9C,SAAS,CAAC,WAAW,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAW,CAAC;gBACnD,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,SAAS,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { CanvasRenderState, RenderProxy2D, SpriteRenderer } from '@flighthq/types';
2
+ export declare function drawCanvasParticleEmitter2D(state: CanvasRenderState, renderProxy: RenderProxy2D): void;
3
+ export declare const defaultCanvasParticleEmitter2DRenderer: SpriteRenderer;
4
+ //# sourceMappingURL=canvasParticleEmitter2D.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvasParticleEmitter2D.d.ts","sourceRoot":"","sources":["../src/canvasParticleEmitter2D.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAqB,aAAa,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAM3G,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,aAAa,GAAG,IAAI,CAuDtG;AAED,eAAO,MAAM,sCAAsC,EAAE,cAGpD,CAAC"}
@@ -0,0 +1,64 @@
1
+ import { noopRendererData } from '@flighthq/render';
2
+ // Canvas 2D does not support per-pixel color multiplication, so only alpha
3
+ // and transform (position, rotation, scale) are applied. Color tint values
4
+ // from the emitter config are silently ignored. Use the Gl renderer for
5
+ // full color-over-lifetime support.
6
+ export function drawCanvasParticleEmitter2D(state, renderProxy) {
7
+ const source = renderProxy.source;
8
+ const { atlas, alphas, ids, particleCount, transforms } = source.data;
9
+ if (atlas === null || atlas.image === null || atlas.image.source === null || particleCount === 0)
10
+ return;
11
+ const regions = atlas.regions;
12
+ const numRegions = regions.length;
13
+ const nodeAlpha = renderProxy.alpha;
14
+ const t = renderProxy.transform2D;
15
+ const imageSource = atlas.image.source;
16
+ const context = state.context;
17
+ state.applyBlendMode?.(state, renderProxy.blendMode);
18
+ if (!state.allowSmoothing)
19
+ context.imageSmoothingEnabled = false;
20
+ for (let i = 0; i < particleCount; i++) {
21
+ const id = ids[i];
22
+ if (id < 0 || id >= numRegions)
23
+ continue;
24
+ const region = regions[id];
25
+ if (region.width <= 0 || region.height <= 0)
26
+ continue;
27
+ const tt = i * 4;
28
+ const px = transforms[tt];
29
+ const py = transforms[tt + 1];
30
+ const rotation = transforms[tt + 2];
31
+ const scale = transforms[tt + 3];
32
+ // Build world matrix. In world-space mode particle positions are already in
33
+ // world (pixel) space, so we skip the node transform.
34
+ const cosR = Math.cos(rotation) * scale;
35
+ const sinR = Math.sin(rotation) * scale;
36
+ let a, b, c, d, tx, ty;
37
+ if (source.data.worldSpace) {
38
+ a = cosR;
39
+ b = sinR;
40
+ c = -sinR;
41
+ d = cosR;
42
+ tx = px;
43
+ ty = py;
44
+ }
45
+ else {
46
+ a = t.a * cosR + t.c * sinR;
47
+ b = t.b * cosR + t.d * sinR;
48
+ c = t.a * -sinR + t.c * cosR;
49
+ d = t.b * -sinR + t.d * cosR;
50
+ tx = t.a * px + t.c * py + t.tx;
51
+ ty = t.b * px + t.d * py + t.ty;
52
+ }
53
+ context.globalAlpha = nodeAlpha * alphas[i];
54
+ context.setTransform(a, b, c, d, tx, ty);
55
+ context.drawImage(imageSource, region.x, region.y, region.width, region.height, 0, 0, region.width, region.height);
56
+ }
57
+ if (!state.allowSmoothing)
58
+ context.imageSmoothingEnabled = true;
59
+ }
60
+ export const defaultCanvasParticleEmitter2DRenderer = {
61
+ createData: noopRendererData,
62
+ submit: drawCanvasParticleEmitter2D,
63
+ };
64
+ //# sourceMappingURL=canvasParticleEmitter2D.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvasParticleEmitter2D.js","sourceRoot":"","sources":["../src/canvasParticleEmitter2D.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { CanvasRenderState, RenderProxy2D, SpriteRenderer } from '@flighthq/types';
2
+ export declare function drawCanvasQuadBatch(state: CanvasRenderState, quadBatch: RenderProxy2D): void;
3
+ export declare const defaultCanvasQuadBatchRenderer: SpriteRenderer;
4
+ //# sourceMappingURL=canvasQuadBatch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvasQuadBatch.d.ts","sourceRoot":"","sources":["../src/canvasQuadBatch.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAa,aAAa,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAInG,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,aAAa,GAAG,IAAI,CAqF5F;AAED,eAAO,MAAM,8BAA8B,EAAE,cAG5C,CAAC"}
@@ -0,0 +1,64 @@
1
+ import { acquireMatrix, multiplyMatrix, releaseMatrix, setMatrixFromFloat32Array } from '@flighthq/geometry';
2
+ import { noopRendererData } from '@flighthq/render';
3
+ import { applyCanvasMaterial } from './canvasMaterialRegistry';
4
+ export function drawCanvasQuadBatch(state, quadBatch) {
5
+ const source = quadBatch.source;
6
+ const data = source.data;
7
+ const { atlas, instanceCount, ids, transforms } = data;
8
+ if (atlas === null || atlas.image === null || atlas.image.source === null || instanceCount === 0)
9
+ return;
10
+ state.applyBlendMode?.(state, quadBatch.blendMode);
11
+ const context = state.context;
12
+ const image = atlas.image.source;
13
+ const regions = atlas.regions;
14
+ const numRegions = regions.length;
15
+ const transform = quadBatch.transform2D;
16
+ const roundPixels = state.roundPixels;
17
+ const quadTransform = acquireMatrix();
18
+ const stride = data.transformType === 'vector2' ? 2 : 6;
19
+ context.globalAlpha = quadBatch.alpha;
20
+ if (!state.allowSmoothing /*|| !quadBatch.smoothing*/) {
21
+ context.imageSmoothingEnabled = false;
22
+ }
23
+ const restoreMaterial = applyCanvasMaterial(state, quadBatch.material);
24
+ context.setTransform(transform.a, transform.b, transform.c, transform.d, transform.tx, transform.ty);
25
+ for (let i = 0; i < instanceCount; i++) {
26
+ const id = ids[i];
27
+ if (id < 0 || id >= numRegions)
28
+ continue;
29
+ const region = regions[id];
30
+ if (region.width <= 0 || region.height <= 0) {
31
+ continue;
32
+ }
33
+ const offset = i * stride;
34
+ if (stride === 2) {
35
+ const dx = transforms[offset];
36
+ const dy = transforms[offset + 1];
37
+ context.drawImage(image, region.x, region.y, region.width, region.height, roundPixels ? dx | 0 : dx, roundPixels ? dy | 0 : dy, region.width, region.height);
38
+ }
39
+ else {
40
+ setMatrixFromFloat32Array(quadTransform, offset, transforms);
41
+ multiplyMatrix(quadTransform, transform, quadTransform);
42
+ if (roundPixels) {
43
+ quadTransform.tx = Math.round(quadTransform.tx);
44
+ quadTransform.ty = Math.round(quadTransform.ty);
45
+ }
46
+ context.setTransform(quadTransform.a, quadTransform.b, quadTransform.c, quadTransform.d, quadTransform.tx, quadTransform.ty);
47
+ context.drawImage(image, region.x, region.y, region.width, region.height, 0, 0, region.width, region.height);
48
+ }
49
+ }
50
+ if (restoreMaterial)
51
+ context.restore();
52
+ context.setTransform(1, 0, 0, 1, 0, 0);
53
+ releaseMatrix(quadTransform);
54
+ if (!state.allowSmoothing /*|| !quadBatch.smoothing*/) {
55
+ context.imageSmoothingEnabled = true;
56
+ }
57
+ // popClip(state);
58
+ // rectanglePool.releaseMatrix(rect);
59
+ }
60
+ export const defaultCanvasQuadBatchRenderer = {
61
+ createData: noopRendererData,
62
+ submit: drawCanvasQuadBatch,
63
+ };
64
+ //# sourceMappingURL=canvasQuadBatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvasQuadBatch.js","sourceRoot":"","sources":["../src/canvasQuadBatch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { CanvasRenderState, Kind, Renderer } from '@flighthq/types';
2
+ export declare const canvasScene2DRendererEntries: ReadonlyArray<readonly [Kind, Renderer]>;
3
+ export declare function registerCanvasScene2DRenderers(state: CanvasRenderState): void;
4
+ //# sourceMappingURL=canvasRegistration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvasRegistration.d.ts","sourceRoot":"","sources":["../src/canvasRegistration.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AA8BzE,eAAO,MAAM,4BAA4B,EAAE,aAAa,CAAC,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC,CAYjF,CAAC;AAMF,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAI7E"}
@@ -0,0 +1,39 @@
1
+ import { registerRenderer } from '@flighthq/render';
2
+ import { BitmapKind, DisplayObjectKind, ParticleEmitter2DKind, QuadBatchKind, RichTextKind, Scale9ShapeKind, ShapeKind, SpriteKind, TextLabelKind, TilemapKind, VideoKind, } from '@flighthq/types';
3
+ import { defaultCanvasBitmapRenderer } from './canvasBitmap';
4
+ import { defaultCanvasScene2DRenderer } from './canvasNode2D';
5
+ import { defaultCanvasParticleEmitter2DRenderer } from './canvasParticleEmitter2D';
6
+ import { defaultCanvasQuadBatchRenderer } from './canvasQuadBatch';
7
+ import { defaultCanvasRichTextRenderer } from './canvasRichText';
8
+ import { defaultCanvasScale9ShapeRenderer } from './canvasScale9Shape';
9
+ import { defaultCanvasShapeRenderer } from './canvasShape';
10
+ import { defaultCanvasSpriteRenderer } from './canvasSprite';
11
+ import { defaultCanvasTextLabelRenderer } from './canvasTextLabel';
12
+ import { defaultCanvasTilemapRenderer } from './canvasTilemap';
13
+ import { defaultCanvasVideoRenderer } from './canvasVideo';
14
+ // Ordered list of [kind, renderer] pairs for every 2D display-object kind the Canvas backend
15
+ // supports. Exported as a data array so GL/WGPU backends can mirror the same shape without
16
+ // hardcoding the full kind list independently.
17
+ export const canvasScene2DRendererEntries = [
18
+ [BitmapKind, defaultCanvasBitmapRenderer],
19
+ [DisplayObjectKind, defaultCanvasScene2DRenderer],
20
+ [ParticleEmitter2DKind, defaultCanvasParticleEmitter2DRenderer],
21
+ [QuadBatchKind, defaultCanvasQuadBatchRenderer],
22
+ [RichTextKind, defaultCanvasRichTextRenderer],
23
+ [Scale9ShapeKind, defaultCanvasScale9ShapeRenderer],
24
+ [ShapeKind, defaultCanvasShapeRenderer],
25
+ [SpriteKind, defaultCanvasSpriteRenderer],
26
+ [TextLabelKind, defaultCanvasTextLabelRenderer],
27
+ [TilemapKind, defaultCanvasTilemapRenderer],
28
+ [VideoKind, defaultCanvasVideoRenderer],
29
+ ];
30
+ // Registers every default Canvas 2D display-object renderer into `state` in one call,
31
+ // replacing the ~11 individual registerRenderer calls a consumer would otherwise need.
32
+ // Tree-shakable: importing this is the opt-in; unused renderers in the entries array
33
+ // will be eliminated by the bundler if canvasScene2DRendererEntries itself is tree-shaken.
34
+ export function registerCanvasScene2DRenderers(state) {
35
+ for (const [kind, renderer] of canvasScene2DRendererEntries) {
36
+ registerRenderer(state, kind, renderer);
37
+ }
38
+ }
39
+ //# sourceMappingURL=canvasRegistration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvasRegistration.js","sourceRoot":"","sources":["../src/canvasRegistration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,EACL,UAAU,EACV,iBAAiB,EACjB,qBAAqB,EACrB,aAAa,EACb,YAAY,EACZ,eAAe,EACf,SAAS,EACT,UAAU,EACV,aAAa,EACb,WAAW,EACX,SAAS,GACV,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,2BAA2B,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,4BAA4B,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAAE,sCAAsC,EAAE,MAAM,2BAA2B,CAAC;AACnF,OAAO,EAAE,8BAA8B,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,6BAA6B,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,gCAAgC,EAAE,MAAM,qBAAqB,CAAC;AACvE,OAAO,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAE,2BAA2B,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,8BAA8B,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,4BAA4B,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAE3D,6FAA6F;AAC7F,2FAA2F;AAC3F,+CAA+C;AAC/C,MAAM,CAAC,MAAM,4BAA4B,GAA6C;IACpF,CAAC,UAAU,EAAE,2BAA2B,CAAC;IACzC,CAAC,iBAAiB,EAAE,4BAA4B,CAAC;IACjD,CAAC,qBAAqB,EAAE,sCAAsC,CAAC;IAC/D,CAAC,aAAa,EAAE,8BAA8B,CAAC;IAC/C,CAAC,YAAY,EAAE,6BAA6B,CAAC;IAC7C,CAAC,eAAe,EAAE,gCAAgC,CAAC;IACnD,CAAC,SAAS,EAAE,0BAA0B,CAAC;IACvC,CAAC,UAAU,EAAE,2BAA2B,CAAC;IACzC,CAAC,aAAa,EAAE,8BAA8B,CAAC;IAC/C,CAAC,WAAW,EAAE,4BAA4B,CAAC;IAC3C,CAAC,SAAS,EAAE,0BAA0B,CAAC;CACxC,CAAC;AAEF,sFAAsF;AACtF,uFAAuF;AACvF,qFAAqF;AACrF,2FAA2F;AAC3F,MAAM,UAAU,8BAA8B,CAAC,KAAwB;IACrE,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,4BAA4B,EAAE,CAAC;QAC5D,gBAAgB,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC1C,CAAC;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { CanvasRenderOptions, CanvasRenderState, CanvasRenderStateRuntime } from '@flighthq/types';
2
+ export declare function createCanvasRenderState(canvas: HTMLCanvasElement, options?: Partial<CanvasRenderOptions>): CanvasRenderState;
3
+ export declare function createCanvasRenderStateRuntime(): CanvasRenderStateRuntime;
4
+ export declare function getCanvasRenderStateRuntime(state: CanvasRenderState): CanvasRenderStateRuntime;
5
+ //# sourceMappingURL=canvasRenderState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvasRenderState.d.ts","sourceRoot":"","sources":["../src/canvasRenderState.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAGxG,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,iBAAiB,EACzB,OAAO,GAAE,OAAO,CAAC,mBAAmB,CAAM,GACzC,iBAAiB,CA8BnB;AAMD,wBAAgB,8BAA8B,IAAI,wBAAwB,CAEzE;AAID,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,iBAAiB,GAAG,wBAAwB,CAE9F"}
@@ -0,0 +1,44 @@
1
+ import { createMatrix } from '@flighthq/geometry';
2
+ import { createRenderState as _createRenderState, createRenderStateRuntime, setRenderStateBackgroundColor, } from '@flighthq/render';
3
+ import { EntityRuntimeKey } from '@flighthq/types';
4
+ export function createCanvasRenderState(canvas, options = {}) {
5
+ const context = canvas.getContext('2d', options.contextAttributes || undefined);
6
+ if (!context)
7
+ throw new Error('Failed to get context for canvas.');
8
+ const state = _createRenderState({
9
+ pixelRatio: options.pixelRatio ?? 1,
10
+ renderTransform2D: options.renderTransform ?? createMatrix(),
11
+ roundPixels: options.roundPixels ?? false,
12
+ sceneGraphSyncPolicy: options.sceneGraphSyncPolicy,
13
+ });
14
+ if (options.backgroundColor != null)
15
+ setRenderStateBackgroundColor(state, options.backgroundColor);
16
+ // canvas/context/contextAttributes are readonly handles on the entity; written once here at the
17
+ // construction boundary.
18
+ state.applyBlendMode = null;
19
+ state.canvasCssFilterResolver = null;
20
+ state.canvas = canvas;
21
+ state.context = context;
22
+ state.contextAttributes = context.getContextAttributes();
23
+ const runtime = createCanvasRenderStateRuntime();
24
+ state[EntityRuntimeKey] = runtime;
25
+ runtime.currentBlendMode = null;
26
+ runtime.imageSmoothingEnabled = options.imageSmoothingEnabled ?? true;
27
+ runtime.imageSmoothingQuality = options.imageSmoothingQuality ?? 'high';
28
+ context.imageSmoothingEnabled = runtime.imageSmoothingEnabled;
29
+ context.imageSmoothingQuality = runtime.imageSmoothingQuality;
30
+ return state;
31
+ }
32
+ // Allocates the package-private 2D-canvas runtime for a CanvasRenderState. createCanvasRenderState
33
+ // attaches one to each state under EntityRuntimeKey and populates its fields;
34
+ // getCanvasRenderStateRuntime reads it back. The render path writes the returned object every frame,
35
+ // so the return is intentionally mutable (not Readonly).
36
+ export function createCanvasRenderStateRuntime() {
37
+ return createRenderStateRuntime();
38
+ }
39
+ // Resolves the package-private 2D-canvas runtime attached to a CanvasRenderState. Mutable by design:
40
+ // the render path writes its fields every frame.
41
+ export function getCanvasRenderStateRuntime(state) {
42
+ return state[EntityRuntimeKey];
43
+ }
44
+ //# sourceMappingURL=canvasRenderState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvasRenderState.js","sourceRoot":"","sources":["../src/canvasRenderState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EACL,iBAAiB,IAAI,kBAAkB,EACvC,wBAAwB,EACxB,6BAA6B,GAC9B,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,MAAM,UAAU,uBAAuB,CACrC,MAAyB,EACzB,UAAwC,EAAE;IAE1C,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,iBAAiB,IAAI,SAAS,CAAC,CAAC;IAChF,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IAEnE,MAAM,KAAK,GAAG,kBAAkB,CAAC;QAC/B,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,CAAC;QACnC,iBAAiB,EAAE,OAAO,CAAC,eAAe,IAAI,YAAY,EAAE;QAC5D,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,KAAK;QACzC,oBAAoB,EAAE,OAAO,CAAC,oBAAoB;KACnD,CAAsB,CAAC;IAExB,IAAI,OAAO,CAAC,eAAe,IAAI,IAAI;QAAE,6BAA6B,CAAC,KAAK,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;IAEnG,gGAAgG;IAChG,yBAAyB;IACzB,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC;IAC5B,KAAK,CAAC,uBAAuB,GAAG,IAAI,CAAC;IACpC,KAAuC,CAAC,MAAM,GAAG,MAAM,CAAC;IACxD,KAA+C,CAAC,OAAO,GAAG,OAAO,CAAC;IAClE,KAAiE,CAAC,iBAAiB,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAEtH,MAAM,OAAO,GAAG,8BAA8B,EAAE,CAAC;IACjD,KAAK,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC;IAClC,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAChC,OAAO,CAAC,qBAAqB,GAAG,OAAO,CAAC,qBAAqB,IAAI,IAAI,CAAC;IACtE,OAAO,CAAC,qBAAqB,GAAG,OAAO,CAAC,qBAAqB,IAAI,MAAM,CAAC;IAExE,OAAO,CAAC,qBAAqB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAC9D,OAAO,CAAC,qBAAqB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAC9D,OAAO,KAAK,CAAC;AACf,CAAC;AAED,mGAAmG;AACnG,8EAA8E;AAC9E,qGAAqG;AACrG,yDAAyD;AACzD,MAAM,UAAU,8BAA8B;IAC5C,OAAO,wBAAwB,EAA8B,CAAC;AAChE,CAAC;AAED,qGAAqG;AACrG,iDAAiD;AACjD,MAAM,UAAU,2BAA2B,CAAC,KAAwB;IAClE,OAAO,KAAK,CAAC,gBAAgB,CAA6B,CAAC;AAC7D,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { CanvasRenderState, CanvasRenderTarget, Matrix, RenderPassPreserve } from '@flighthq/types';
2
+ /**
3
+ * Begins a render pass into `target`: redirects subsequent canvas rendering into it (saving the state's
4
+ * current canvas, context, and 2D transform for restore, so passes nest) and CLEARS it by default.
5
+ * `preserve` keeps the target's pixels instead. Canvas clears by erasing (clearRect), so there is no
6
+ * colored render-target clear here; a colored backdrop is drawn as content. Carries no transform — a 2D
7
+ * pass that needs a specific root transform calls setCanvasRenderTransform2D after begin. Pair with
8
+ * endCanvasRenderPass. Mirrors beginGlRenderPass / beginWgpuRenderPass.
9
+ */
10
+ export declare function beginCanvasRenderPass(state: CanvasRenderState, target: CanvasRenderTarget, preserve?: Readonly<RenderPassPreserve>): void;
11
+ export declare function createCanvasRenderTarget(width: number, height: number): CanvasRenderTarget;
12
+ export declare function destroyCanvasRenderTarget(target: CanvasRenderTarget): void;
13
+ /**
14
+ * Ends the pass opened by beginCanvasRenderPass: restores the canvas, context, and 2D transform saved at
15
+ * begin. A call with no matching begin is a no-op. Mirrors endGlRenderPass / endWgpuRenderPass.
16
+ */
17
+ export declare function endCanvasRenderPass(state: CanvasRenderState): void;
18
+ export declare function resizeCanvasRenderTarget(target: CanvasRenderTarget, width: number, height: number): void;
19
+ /**
20
+ * Sets the 2D root device transform the display-object update pass reads to place nodes with no parent.
21
+ * Call after beginCanvasRenderPass when a 2D pass renders into a target with its own coordinate system;
22
+ * the value is restored by the matching endCanvasRenderPass. Allocates a fresh matrix so the bracket's
23
+ * saved reference stays intact for restore. Mirrors setGlRenderTransform2D / setWgpuRenderTransform2D.
24
+ */
25
+ export declare function setCanvasRenderTransform2D(state: CanvasRenderState, transform: Readonly<Matrix>): void;
26
+ //# sourceMappingURL=canvasRenderTarget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvasRenderTarget.d.ts","sourceRoot":"","sources":["../src/canvasRenderTarget.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAoBzG;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,iBAAiB,EACxB,MAAM,EAAE,kBAAkB,EAC1B,QAAQ,CAAC,EAAE,QAAQ,CAAC,kBAAkB,CAAC,GACtC,IAAI,CAwBN;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,kBAAkB,CAM1F;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI,CAO1E;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAOlE;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,kBAAkB,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAKxG;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI,CAKtG"}