@lightningjs/renderer 3.0.0-beta22 → 3.0.0-beta24

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 (190) hide show
  1. package/README.md +93 -0
  2. package/dist/exports/index.d.ts +3 -1
  3. package/dist/exports/index.js +2 -0
  4. package/dist/exports/index.js.map +1 -1
  5. package/dist/exports/platform.d.ts +7 -0
  6. package/dist/exports/platform.js +27 -0
  7. package/dist/exports/platform.js.map +1 -0
  8. package/dist/src/core/AutosizeManager.d.ts +29 -0
  9. package/dist/src/core/AutosizeManager.js +169 -0
  10. package/dist/src/core/AutosizeManager.js.map +1 -0
  11. package/dist/src/core/CoreNode.d.ts +0 -1
  12. package/dist/src/core/CoreNode.js +47 -41
  13. package/dist/src/core/CoreNode.js.map +1 -1
  14. package/dist/src/core/CoreTextureManager.d.ts +0 -13
  15. package/dist/src/core/CoreTextureManager.js +4 -78
  16. package/dist/src/core/CoreTextureManager.js.map +1 -1
  17. package/dist/src/core/Stage.js +2 -12
  18. package/dist/src/core/Stage.js.map +1 -1
  19. package/dist/src/core/animations/Animation.d.ts +21 -0
  20. package/dist/src/core/animations/Animation.js +194 -0
  21. package/dist/src/core/animations/Animation.js.map +1 -0
  22. package/dist/src/core/animations/CoreAnimationController.d.ts +1 -1
  23. package/dist/src/core/animations/CoreAnimationController.js +4 -2
  24. package/dist/src/core/animations/CoreAnimationController.js.map +1 -1
  25. package/dist/src/core/animations/Playback.d.ts +64 -0
  26. package/dist/src/core/animations/Playback.js +169 -0
  27. package/dist/src/core/animations/Playback.js.map +1 -0
  28. package/dist/src/core/animations/Transition.d.ts +27 -0
  29. package/dist/src/core/animations/Transition.js +52 -0
  30. package/dist/src/core/animations/Transition.js.map +1 -0
  31. package/dist/src/core/animations/utils.d.ts +2 -0
  32. package/dist/src/core/animations/utils.js +136 -0
  33. package/dist/src/core/animations/utils.js.map +1 -0
  34. package/dist/src/core/lib/collectionUtils.d.ts +0 -1
  35. package/dist/src/core/lib/collectionUtils.js +0 -28
  36. package/dist/src/core/lib/collectionUtils.js.map +1 -1
  37. package/dist/src/core/lib/utils.d.ts +0 -5
  38. package/dist/src/core/lib/utils.js +0 -63
  39. package/dist/src/core/lib/utils.js.map +1 -1
  40. package/dist/src/core/platforms/GlContextWrapper.d.ts +136 -0
  41. package/dist/src/core/platforms/GlContextWrapper.js +32 -0
  42. package/dist/src/core/platforms/GlContextWrapper.js.map +1 -0
  43. package/dist/src/core/platforms/Platform.d.ts +74 -13
  44. package/dist/src/core/platforms/Platform.js +18 -0
  45. package/dist/src/core/platforms/Platform.js.map +1 -1
  46. package/dist/src/core/platforms/web/WebGlContextWrapper.d.ts +776 -0
  47. package/dist/src/core/platforms/web/WebGlContextWrapper.js +1208 -0
  48. package/dist/src/core/platforms/web/WebGlContextWrapper.js.map +1 -0
  49. package/dist/src/core/platforms/web/WebPlatform.d.ts +13 -2
  50. package/dist/src/core/platforms/web/WebPlatform.js +109 -8
  51. package/dist/src/core/platforms/web/WebPlatform.js.map +1 -1
  52. package/dist/src/core/platforms/web/WebPlatformChrome50.d.ts +17 -0
  53. package/dist/src/core/platforms/web/WebPlatformChrome50.js +50 -0
  54. package/dist/src/core/platforms/web/WebPlatformChrome50.js.map +1 -0
  55. package/dist/src/core/platforms/web/WebPlatformLegacy.d.ts +18 -0
  56. package/dist/src/core/platforms/web/WebPlatformLegacy.js +99 -0
  57. package/dist/src/core/platforms/web/WebPlatformLegacy.js.map +1 -0
  58. package/dist/src/core/platforms/web/WebPlatformNext.d.ts +21 -0
  59. package/dist/src/core/platforms/web/WebPlatformNext.js +52 -0
  60. package/dist/src/core/platforms/web/WebPlatformNext.js.map +1 -0
  61. package/dist/src/core/platforms/web/lib/ImageWorker.d.ts +15 -0
  62. package/dist/src/core/platforms/web/lib/ImageWorker.js +189 -0
  63. package/dist/src/core/platforms/web/lib/ImageWorker.js.map +1 -0
  64. package/dist/src/core/platforms/web/lib/createImageBitmap.d.ts +1 -0
  65. package/dist/src/core/platforms/web/lib/createImageBitmap.js +27 -0
  66. package/dist/src/core/platforms/web/lib/createImageBitmap.js.map +1 -0
  67. package/dist/src/core/platforms/web/lib/textureCompression.d.ts +26 -0
  68. package/dist/src/core/platforms/web/lib/textureCompression.js +301 -0
  69. package/dist/src/core/platforms/web/lib/textureCompression.js.map +1 -0
  70. package/dist/src/core/platforms/web/lib/textureSvg.d.ts +7 -0
  71. package/dist/src/core/platforms/web/lib/textureSvg.js +51 -0
  72. package/dist/src/core/platforms/web/lib/textureSvg.js.map +1 -0
  73. package/dist/src/core/platforms/web/lib/utils.d.ts +5 -0
  74. package/dist/src/core/platforms/web/lib/utils.js +86 -0
  75. package/dist/src/core/platforms/web/lib/utils.js.map +1 -0
  76. package/dist/src/core/renderers/CoreRenderer.d.ts +1 -9
  77. package/dist/src/core/renderers/CoreRenderer.js +2 -4
  78. package/dist/src/core/renderers/CoreRenderer.js.map +1 -1
  79. package/dist/src/core/renderers/canvas/CanvasRenderer.d.ts +3 -2
  80. package/dist/src/core/renderers/canvas/CanvasRenderer.js +6 -5
  81. package/dist/src/core/renderers/canvas/CanvasRenderer.js.map +1 -1
  82. package/dist/src/core/renderers/canvas/CanvasShaderNode.js +3 -3
  83. package/dist/src/core/renderers/canvas/CanvasShaderNode.js.map +1 -1
  84. package/dist/src/core/renderers/webgl/SdfRenderOp.js +3 -2
  85. package/dist/src/core/renderers/webgl/SdfRenderOp.js.map +1 -1
  86. package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.d.ts +2 -2
  87. package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.js.map +1 -1
  88. package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.d.ts +2 -2
  89. package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.js.map +1 -1
  90. package/dist/src/core/renderers/webgl/WebGlCtxTexture.d.ts +3 -3
  91. package/dist/src/core/renderers/webgl/WebGlCtxTexture.js +1 -2
  92. package/dist/src/core/renderers/webgl/WebGlCtxTexture.js.map +1 -1
  93. package/dist/src/core/renderers/webgl/WebGlRenderer.d.ts +5 -5
  94. package/dist/src/core/renderers/webgl/WebGlRenderer.js +10 -11
  95. package/dist/src/core/renderers/webgl/WebGlRenderer.js.map +1 -1
  96. package/dist/src/core/renderers/webgl/WebGlShaderNode.d.ts +2 -2
  97. package/dist/src/core/renderers/webgl/WebGlShaderNode.js +3 -3
  98. package/dist/src/core/renderers/webgl/WebGlShaderNode.js.map +1 -1
  99. package/dist/src/core/renderers/webgl/WebGlShaderProgram.d.ts +2 -2
  100. package/dist/src/core/renderers/webgl/WebGlShaderProgram.js +0 -3
  101. package/dist/src/core/renderers/webgl/WebGlShaderProgram.js.map +1 -1
  102. package/dist/src/core/renderers/webgl/internal/RendererUtils.d.ts +4 -4
  103. package/dist/src/core/renderers/webgl/internal/RendererUtils.js.map +1 -1
  104. package/dist/src/core/renderers/webgl/internal/ShaderUtils.d.ts +3 -3
  105. package/dist/src/core/renderers/webgl/internal/ShaderUtils.js +3 -2
  106. package/dist/src/core/renderers/webgl/internal/ShaderUtils.js.map +1 -1
  107. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js +24 -8
  108. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js.map +1 -1
  109. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js +25 -8
  110. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js.map +1 -1
  111. package/dist/src/core/shaders/webgl/Border.js +6 -4
  112. package/dist/src/core/shaders/webgl/Border.js.map +1 -1
  113. package/dist/src/core/shaders/webgl/RoundedWithBorder.js +16 -17
  114. package/dist/src/core/shaders/webgl/RoundedWithBorder.js.map +1 -1
  115. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js +19 -21
  116. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js.map +1 -1
  117. package/dist/src/core/shaders/webgl/SdfShadowShader.d.ts +9 -0
  118. package/dist/src/core/shaders/webgl/SdfShadowShader.js +100 -0
  119. package/dist/src/core/shaders/webgl/SdfShadowShader.js.map +1 -0
  120. package/dist/src/core/text-rendering/CanvasFont.d.ts +1 -1
  121. package/dist/src/core/text-rendering/CanvasFont.js +2 -6
  122. package/dist/src/core/text-rendering/CanvasFont.js.map +1 -1
  123. package/dist/src/core/text-rendering/CoreFont.d.ts +1 -1
  124. package/dist/src/core/text-rendering/CoreFont.js +1 -1
  125. package/dist/src/core/text-rendering/CoreFont.js.map +1 -1
  126. package/dist/src/core/text-rendering/FontManager.js +2 -1
  127. package/dist/src/core/text-rendering/FontManager.js.map +1 -1
  128. package/dist/src/core/text-rendering/SdfFontHandler.js +10 -20
  129. package/dist/src/core/text-rendering/SdfFontHandler.js.map +1 -1
  130. package/dist/src/core/text-rendering/SdfTextRenderer.js +10 -12
  131. package/dist/src/core/text-rendering/SdfTextRenderer.js.map +1 -1
  132. package/dist/src/core/textures/ImageTexture.d.ts +24 -11
  133. package/dist/src/core/textures/ImageTexture.js +32 -95
  134. package/dist/src/core/textures/ImageTexture.js.map +1 -1
  135. package/dist/src/core/textures/SubTexture.js +3 -3
  136. package/dist/src/core/textures/SubTexture.js.map +1 -1
  137. package/dist/src/core/textures/Texture.d.ts +1 -1
  138. package/dist/src/core/textures/Texture.js +1 -1
  139. package/dist/src/core/textures/Texture.js.map +1 -1
  140. package/dist/src/main-api/Renderer.js +18 -21
  141. package/dist/src/main-api/Renderer.js.map +1 -1
  142. package/dist/src/utils.d.ts +0 -2
  143. package/dist/src/utils.js +0 -36
  144. package/dist/src/utils.js.map +1 -1
  145. package/dist/tsconfig.dist.tsbuildinfo +1 -1
  146. package/dist/tsconfig.tsbuildinfo +1 -0
  147. package/exports/index.ts +3 -1
  148. package/exports/platform.ts +31 -0
  149. package/package.json +3 -2
  150. package/src/core/CoreNode.ts +52 -49
  151. package/src/core/CoreTextureManager.ts +10 -103
  152. package/src/core/Stage.ts +1 -14
  153. package/src/core/animations/CoreAnimationController.ts +5 -2
  154. package/src/core/lib/collectionUtils.ts +0 -35
  155. package/src/core/lib/utils.ts +0 -78
  156. package/src/core/platforms/GlContextWrapper.ts +291 -0
  157. package/src/core/platforms/Platform.ts +121 -28
  158. package/src/core/{lib → platforms/web}/WebGlContextWrapper.ts +129 -4
  159. package/src/core/platforms/web/WebPlatform.ts +171 -22
  160. package/src/core/platforms/web/WebPlatformChrome50.ts +57 -0
  161. package/src/core/platforms/web/WebPlatformLegacy.ts +140 -0
  162. package/src/core/platforms/web/WebPlatformNext.ts +57 -0
  163. package/src/core/{lib → platforms/web/lib}/ImageWorker.ts +10 -74
  164. package/src/core/platforms/web/lib/createImageBitmap.ts +40 -0
  165. package/src/core/{lib → platforms/web/lib}/textureCompression.ts +19 -138
  166. package/src/core/{lib → platforms/web/lib}/textureSvg.ts +3 -15
  167. package/src/core/platforms/web/lib/utils.ts +105 -0
  168. package/src/core/renderers/CoreRenderer.ts +2 -11
  169. package/src/core/renderers/canvas/CanvasRenderer.ts +8 -6
  170. package/src/core/renderers/canvas/CanvasShaderNode.ts +3 -3
  171. package/src/core/renderers/webgl/SdfRenderOp.ts +3 -2
  172. package/src/core/renderers/webgl/WebGlCtxRenderTexture.ts +2 -2
  173. package/src/core/renderers/webgl/WebGlCtxSubTexture.ts +2 -2
  174. package/src/core/renderers/webgl/WebGlCtxTexture.ts +3 -4
  175. package/src/core/renderers/webgl/WebGlRenderer.ts +15 -22
  176. package/src/core/renderers/webgl/WebGlShaderNode.ts +5 -5
  177. package/src/core/renderers/webgl/WebGlShaderProgram.ts +2 -6
  178. package/src/core/renderers/webgl/internal/RendererUtils.ts +4 -8
  179. package/src/core/renderers/webgl/internal/ShaderUtils.ts +7 -5
  180. package/src/core/shaders/webgl/Border.ts +6 -4
  181. package/src/core/shaders/webgl/RoundedWithBorder.ts +16 -17
  182. package/src/core/shaders/webgl/RoundedWithBorderAndShadow.ts +19 -21
  183. package/src/core/text-rendering/SdfFontHandler.ts +10 -17
  184. package/src/core/text-rendering/SdfTextRenderer.ts +11 -16
  185. package/src/core/textures/ImageTexture.ts +42 -161
  186. package/src/core/textures/SubTexture.ts +3 -3
  187. package/src/core/textures/Texture.ts +2 -2
  188. package/src/main-api/Renderer.ts +24 -22
  189. package/src/utils.ts +0 -47
  190. package/src/core/lib/validateImageBitmap.ts +0 -87
package/README.md CHANGED
@@ -45,6 +45,99 @@ Any JavaScript language features or browser APIs that cannot be automatically tr
45
45
 
46
46
  For a more detailed and comprehensive list of browsers and their features please see [browsers](./BROWSERS.md).
47
47
 
48
+ ## Platform Architecture
49
+
50
+ The Lightning 3 Renderer uses a modular platform architecture that allows it to adapt to different browser capabilities and environments. This enables optimal performance across a wide range of devices, from modern browsers to legacy embedded systems.
51
+
52
+ ### Available Platforms
53
+
54
+ The Renderer includes several platform implementations, each tailored for specific browser capabilities:
55
+
56
+ #### WebPlatform (Default)
57
+
58
+ The standard platform for modern browsers with full WebGL and createImageBitmap support.
59
+
60
+ - Uses XMLHttpRequest for loading resources
61
+ - Full createImageBitmap API with options (premultiplyAlpha, colorSpaceConversion, imageOrientation)
62
+ - Supports image cropping
63
+ - Multi-threaded image processing via Web Workers
64
+ - **Use case:** Modern browsers, default choice for most applications
65
+
66
+ #### WebPlatformNext
67
+
68
+ Platform using the modern Fetch API instead of XMLHttpRequest.
69
+
70
+ - Uses Fetch API for loading resources (promise-based, Service Worker compatible)
71
+ - Full createImageBitmap API with options
72
+ - Supports image cropping
73
+ - Multi-threaded image processing via Web Workers
74
+ - **Use case:** Modern browsers where Fetch API is preferred, progressive web apps
75
+
76
+ #### WebPlatformChrome50
77
+
78
+ Compatibility platform for browsers with limited createImageBitmap support (Chrome 50-51).
79
+
80
+ - Uses XMLHttpRequest for loading resources
81
+ - Limited createImageBitmap API (no options or cropping parameters)
82
+ - Multi-threaded image processing via Web Workers (if enabled)
83
+ - **Use case:** Chrome 50-51, browsers with basic createImageBitmap support
84
+
85
+ #### WebPlatformLegacy
86
+
87
+ Legacy platform for older browsers without createImageBitmap support.
88
+
89
+ - Uses direct Image element loading (no blob conversion for URLs)
90
+ - HTMLImageElement instead of createImageBitmap
91
+ - Single-threaded image processing (no Web Workers)
92
+ - No image cropping support
93
+ - No compressed texture support
94
+ - **Use case:** Chrome 38-49, older embedded device browsers
95
+
96
+ ### Using a Platform
97
+
98
+ Platforms can be specified when initializing the Renderer:
99
+
100
+ ```ts
101
+ import { RendererMain } from '@lightningjs/renderer';
102
+ import { WebGlRenderer } from '@lightningjs/renderer/webgl';
103
+ import {
104
+ WebPlatform,
105
+ WebPlatformNext,
106
+ WebPlatformChrome50,
107
+ WebPlatformLegacy,
108
+ } from '@lightningjs/renderer/platforms';
109
+
110
+ const renderer = new RendererMain(
111
+ {
112
+ appWidth: 1920,
113
+ appHeight: 1080,
114
+ renderEngine: WebGlRenderer,
115
+ platform: WebPlatformLegacy, // Use legacy platform for older browsers
116
+ // ...Other Renderer Config
117
+ },
118
+ 'app',
119
+ );
120
+ ```
121
+
122
+ **Note:** `WebPlatformLegacy` automatically sets `numImageWorkers` to 0 since it doesn't support Web Workers.
123
+
124
+ ### Creating Custom Platforms
125
+
126
+ You can create your own custom platform tailored to your specific device or environment by extending the `Platform` base class or one of the existing platform implementations.
127
+
128
+ **Key methods you can override:**
129
+
130
+ - `fetch(url: string): Promise<Blob>` - Resource loading
131
+ - `createImage(...)` - Image bitmap creation
132
+ - `loadImage(...)` - Complete image loading pipeline
133
+ - `loadSvg(...)` - SVG loading
134
+ - `loadCompressedTexture(...)` - Compressed texture loading
135
+ - `createCanvas()` - Canvas element creation
136
+ - `createContext()` - WebGL context creation
137
+ - `startLoop(stage)` - Animation loop implementation
138
+
139
+ This allows you to optimize the Renderer for proprietary platforms, embedded systems, or environments with unique capabilities and constraints.
140
+
48
141
  ## Example Tests
49
142
 
50
143
  The Example Tests sub-project define a set of tests for various Renderer
@@ -23,11 +23,13 @@ export * from '../src/common/IAnimationController.js';
23
23
  export * from '../src/common/CommonTypes.js';
24
24
  export { CoreTextureManager, type TextureMap, } from '../src/core/CoreTextureManager.js';
25
25
  export { TextureError, TextureErrorCode, isTextureError, } from '../src/core/TextureError.js';
26
+ export type { TextRenderer } from '../src/core/text-rendering/TextRenderer.js';
26
27
  export type { MemoryInfo } from '../src/core/TextureMemoryManager.js';
27
28
  export type { AnimationSettings } from '../src/core/animations/CoreAnimation.js';
28
29
  export type { TimingFunction } from '../src/core/utils.js';
29
30
  export type { Inspector } from '../src/main-api/Inspector.js';
30
- export type { CoreNodeRenderState } from '../src/core/CoreNode.js';
31
+ export { CoreNode, type CoreNodeProps, type CoreNodeRenderState } from '../src/core/CoreNode.js';
32
+ export { CoreTextNode, type CoreTextNodeProps } from '../src/core/CoreTextNode.js';
31
33
  export * from '../src/core/renderers/CoreShaderNode.js';
32
34
  export * from '../src/core/shaders/templates/BorderTemplate.js';
33
35
  export * from '../src/core/shaders/templates/HolePunchTemplate.js';
@@ -43,6 +43,8 @@ export * from '../src/common/CommonTypes.js';
43
43
  // context of the main API.
44
44
  export { CoreTextureManager, } from '../src/core/CoreTextureManager.js';
45
45
  export { TextureError, TextureErrorCode, isTextureError, } from '../src/core/TextureError.js';
46
+ export { CoreNode } from '../src/core/CoreNode.js';
47
+ export { CoreTextNode } from '../src/core/CoreTextNode.js';
46
48
  export * from '../src/core/renderers/CoreShaderNode.js';
47
49
  export * from '../src/core/shaders/templates/BorderTemplate.js';
48
50
  export * from '../src/core/shaders/templates/HolePunchTemplate.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../exports/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH;;;;;;;;;;;;;;;;;;GAkBG;AAEH,cAAc,0BAA0B,CAAC;AACzC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,uCAAuC,CAAC;AACtD,cAAc,8BAA8B,CAAC;AAE7C,yEAAyE;AACzE,2BAA2B;AAC3B,OAAO,EACL,kBAAkB,GAEnB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,cAAc,GACf,MAAM,6BAA6B,CAAC;AAOrC,cAAc,yCAAyC,CAAC;AACxD,cAAc,iDAAiD,CAAC;AAChE,cAAc,oDAAoD,CAAC;AACnE,cAAc,kDAAkD,CAAC;AACjE,cAAc,iDAAiD,CAAC;AAChE,cAAc,yDAAyD,CAAC;AACxE,cAAc,yDAAyD,CAAC;AAExE,UAAU;AACV,cAAc,mDAAmD,CAAC;AAGlE,WAAW;AACX,cAAc,iCAAiC,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../exports/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH;;;;;;;;;;;;;;;;;;GAkBG;AAEH,cAAc,0BAA0B,CAAC;AACzC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,uCAAuC,CAAC;AACtD,cAAc,8BAA8B,CAAC;AAE7C,yEAAyE;AACzE,2BAA2B;AAC3B,OAAO,EACL,kBAAkB,GAEnB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,cAAc,GACf,MAAM,6BAA6B,CAAC;AAMrC,OAAO,EAAE,QAAQ,EAAgD,MAAM,yBAAyB,CAAC;AACjG,OAAO,EAAE,YAAY,EAA0B,MAAM,6BAA6B,CAAC;AAEnF,cAAc,yCAAyC,CAAC;AACxD,cAAc,iDAAiD,CAAC;AAChE,cAAc,oDAAoD,CAAC;AACnE,cAAc,kDAAkD,CAAC;AACjE,cAAc,iDAAiD,CAAC;AAChE,cAAc,yDAAyD,CAAC;AACxE,cAAc,yDAAyD,CAAC;AAExE,UAAU;AACV,cAAc,mDAAmD,CAAC;AAGlE,WAAW;AACX,cAAc,iCAAiC,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC"}
@@ -0,0 +1,7 @@
1
+ export { Platform, type PlatformSettings, } from '../src/core/platforms/Platform.js';
2
+ export { WebPlatform } from '../src/core/platforms/web/WebPlatform.js';
3
+ export { WebPlatformNext } from '../src/core/platforms/web/WebPlatformNext.js';
4
+ export { WebPlatformChrome50 } from '../src/core/platforms/web/WebPlatformChrome50.js';
5
+ export { WebPlatformLegacy } from '../src/core/platforms/web/WebPlatformLegacy.js';
6
+ export { GlContextWrapper } from '../src/core/platforms/GlContextWrapper.js';
7
+ export { WebGlContextWrapper } from '../src/core/platforms/web/WebGlContextWrapper.js';
@@ -0,0 +1,27 @@
1
+ /*
2
+ * If not stated otherwise in this file or this component's LICENSE file the
3
+ * following copyright and licenses apply:
4
+ *
5
+ * Copyright 2026 Comcast Cable Communications Management, LLC.
6
+ *
7
+ * Licensed under the Apache License, Version 2.0 (the License);
8
+ * you may not use this file except in compliance with the License.
9
+ * You may obtain a copy of the License at
10
+ *
11
+ * http://www.apache.org/licenses/LICENSE-2.0
12
+ *
13
+ * Unless required by applicable law or agreed to in writing, software
14
+ * distributed under the License is distributed on an "AS IS" BASIS,
15
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ * See the License for the specific language governing permissions and
17
+ * limitations under the License.
18
+ */
19
+ export { Platform, } from '../src/core/platforms/Platform.js';
20
+ export { WebPlatform } from '../src/core/platforms/web/WebPlatform.js';
21
+ export { WebPlatformNext } from '../src/core/platforms/web/WebPlatformNext.js';
22
+ export { WebPlatformChrome50 } from '../src/core/platforms/web/WebPlatformChrome50.js';
23
+ export { WebPlatformLegacy } from '../src/core/platforms/web/WebPlatformLegacy.js';
24
+ // GL Context Wrappers
25
+ export { GlContextWrapper } from '../src/core/platforms/GlContextWrapper.js';
26
+ export { WebGlContextWrapper } from '../src/core/platforms/web/WebGlContextWrapper.js';
27
+ //# sourceMappingURL=platform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.js","sourceRoot":"","sources":["../../exports/platform.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EACL,QAAQ,GAET,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,0CAA0C,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,8CAA8C,CAAC;AAC/E,OAAO,EAAE,mBAAmB,EAAE,MAAM,kDAAkD,CAAC;AACvF,OAAO,EAAE,iBAAiB,EAAE,MAAM,gDAAgD,CAAC;AAEnF,sBAAsB;AACtB,OAAO,EAAE,gBAAgB,EAAE,MAAM,2CAA2C,CAAC;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,kDAAkD,CAAC"}
@@ -0,0 +1,29 @@
1
+ import type { CoreNode } from './CoreNode.js';
2
+ /**
3
+ * Result of autosize calculation containing the new dimensions
4
+ */
5
+ interface AutosizeResult {
6
+ width: number;
7
+ height: number;
8
+ hasChanged: boolean;
9
+ }
10
+ /**
11
+ * Creates an autosize manager for efficient child bounds calculation
12
+ *
13
+ * @remarks
14
+ * This function creates a closure-based manager that tracks child transform
15
+ * changes and calculates parent dimensions based on children's bounding boxes.
16
+ * It's optimized for performance with minimal allocations and fast lookups.
17
+ *
18
+ * @param parentNode - The autosize parent node
19
+ * @returns Object with autosize management methods
20
+ */
21
+ export declare function createAutosizeManager(parentNode: CoreNode): {
22
+ addOrUpdateChild: (child: CoreNode) => void;
23
+ removeChild: (child: CoreNode) => void;
24
+ calculateAutosize: () => AutosizeResult;
25
+ deactivate: () => void;
26
+ readonly active: boolean;
27
+ readonly childCount: number;
28
+ };
29
+ export {};
@@ -0,0 +1,169 @@
1
+ /*
2
+ * If not stated otherwise in this file or this component's LICENSE file the
3
+ * following copyright and licenses apply:
4
+ *
5
+ * Copyright 2023 Comcast Cable Communications Management, LLC.
6
+ *
7
+ * Licensed under the Apache License, Version 2.0 (the License);
8
+ * you may not use this file except in compliance with the License.
9
+ * You may obtain a copy of the License at
10
+ *
11
+ * http://www.apache.org/licenses/LICENSE-2.0
12
+ *
13
+ * Unless required by applicable law or agreed to in writing, software
14
+ * distributed under the License is distributed on an "AS IS" BASIS,
15
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ * See the License for the specific language governing permissions and
17
+ * limitations under the License.
18
+ */
19
+ import { Matrix3d } from './lib/Matrix3d.js';
20
+ /**
21
+ * Creates an autosize manager for efficient child bounds calculation
22
+ *
23
+ * @remarks
24
+ * This function creates a closure-based manager that tracks child transform
25
+ * changes and calculates parent dimensions based on children's bounding boxes.
26
+ * It's optimized for performance with minimal allocations and fast lookups.
27
+ *
28
+ * @param parentNode - The autosize parent node
29
+ * @returns Object with autosize management methods
30
+ */
31
+ export function createAutosizeManager(parentNode) {
32
+ const childDataMap = new Map();
33
+ let isActive = true;
34
+ let lastWidth = 0;
35
+ let lastHeight = 0;
36
+ let lastHasChanged = false;
37
+ const corners = [
38
+ { x: 0, y: 0 },
39
+ { x: 0, y: 0 },
40
+ { x: 0, y: 0 },
41
+ { x: 0, y: 0 },
42
+ ];
43
+ /**
44
+ * Add or update a child node in the autosize calculation chain
45
+ * @param child - Child node to add or update
46
+ */
47
+ const addOrUpdateChild = (child) => {
48
+ if (isActive === false)
49
+ return;
50
+ if (child === parentNode)
51
+ return; // Avoid circular references
52
+ const currentTransform = child.localTransform || Matrix3d.identity();
53
+ const existingData = childDataMap.get(child);
54
+ if (existingData !== undefined) {
55
+ // Update existing child
56
+ Matrix3d.copy(currentTransform, existingData.localTransform);
57
+ existingData.width = child.w;
58
+ existingData.height = child.h;
59
+ existingData.hasChanged = true;
60
+ }
61
+ else {
62
+ // Add new child
63
+ childDataMap.set(child, {
64
+ localTransform: Matrix3d.copy(currentTransform),
65
+ hasChanged: true,
66
+ width: child.w,
67
+ height: child.h,
68
+ });
69
+ }
70
+ // Mark parent for recalculation
71
+ parentNode.autosizeNeedsUpdate = true;
72
+ };
73
+ /**
74
+ * Remove a child node from the autosize calculation chain
75
+ * @param child - Child node to remove
76
+ */
77
+ const removeChild = (child) => {
78
+ if (childDataMap.delete(child) === true) {
79
+ parentNode.autosizeNeedsUpdate = true;
80
+ }
81
+ };
82
+ /**
83
+ * Calculate the autosize dimensions based on all child bounds
84
+ * @returns Autosize calculation result
85
+ */
86
+ const calculateAutosize = () => {
87
+ if (isActive === false || childDataMap.size === 0) {
88
+ return { width: 0, height: 0, hasChanged: false };
89
+ }
90
+ let hasAnyChildChanged = false;
91
+ for (const childData of childDataMap.values()) {
92
+ if (childData.hasChanged) {
93
+ hasAnyChildChanged = true;
94
+ break;
95
+ }
96
+ }
97
+ if (hasAnyChildChanged === false) {
98
+ return {
99
+ width: lastWidth,
100
+ height: lastHeight,
101
+ hasChanged: lastHasChanged,
102
+ };
103
+ }
104
+ let minX = Infinity;
105
+ let minY = Infinity;
106
+ let maxX = -Infinity;
107
+ let maxY = -Infinity;
108
+ for (const [child, childData] of childDataMap) {
109
+ if (!child.isRenderable)
110
+ continue;
111
+ const transform = child.localTransform || Matrix3d.identity();
112
+ const width = childData.width;
113
+ const height = childData.height;
114
+ corners[0].x = 0;
115
+ corners[0].y = 0;
116
+ corners[1].x = width;
117
+ corners[1].y = 0;
118
+ corners[2].x = width;
119
+ corners[2].y = height;
120
+ corners[3].x = 0;
121
+ corners[3].y = height;
122
+ for (let i = 0; i < 4; i++) {
123
+ const corner = corners[i];
124
+ const localX = transform.ta * corner.x + transform.tb * corner.y + transform.tx;
125
+ const localY = transform.tc * corner.x + transform.td * corner.y + transform.ty;
126
+ if (localX < minX)
127
+ minX = localX;
128
+ if (localY < minY)
129
+ minY = localY;
130
+ if (localX > maxX)
131
+ maxX = localX;
132
+ if (localY > maxY)
133
+ maxY = localY;
134
+ }
135
+ childData.hasChanged = false;
136
+ }
137
+ const newWidth = maxX > minX ? maxX - minX : 0;
138
+ const newHeight = maxY > minY ? maxY - minY : 0;
139
+ const dimensionsChanged = lastWidth !== newWidth || lastHeight !== newHeight;
140
+ lastWidth = newWidth;
141
+ lastHeight = newHeight;
142
+ lastHasChanged = dimensionsChanged;
143
+ return {
144
+ width: newWidth,
145
+ height: newHeight,
146
+ hasChanged: dimensionsChanged,
147
+ };
148
+ };
149
+ /**
150
+ * Deactivate this autosize manager and clean up resources
151
+ */
152
+ const deactivate = () => {
153
+ isActive = false;
154
+ childDataMap.clear();
155
+ };
156
+ return {
157
+ addOrUpdateChild,
158
+ removeChild,
159
+ calculateAutosize,
160
+ deactivate,
161
+ get active() {
162
+ return isActive;
163
+ },
164
+ get childCount() {
165
+ return childDataMap.size;
166
+ },
167
+ };
168
+ }
169
+ //# sourceMappingURL=AutosizeManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AutosizeManager.js","sourceRoot":"","sources":["../../../src/core/AutosizeManager.ts"],"names":[],"mappings":"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"}
@@ -658,7 +658,6 @@ export declare class CoreNode extends EventEmitter {
658
658
  private zIndexMin;
659
659
  private zIndexMax;
660
660
  previousZIndex: number;
661
- zIndexSortList: CoreNode[];
662
661
  updateType: UpdateType;
663
662
  childUpdateType: UpdateType;
664
663
  globalTransform?: Matrix3d;
@@ -25,7 +25,7 @@ import { RenderCoords } from './lib/RenderCoords.js';
25
25
  import { CoreAnimation } from './animations/CoreAnimation.js';
26
26
  import { CoreAnimationController } from './animations/CoreAnimationController.js';
27
27
  import { AutosizeMode, Autosizer } from './Autosizer.js';
28
- import { bucketSortByZIndex, incrementalRepositionByZIndex, removeChild, } from './lib/collectionUtils.js';
28
+ import { bucketSortByZIndex, removeChild } from './lib/collectionUtils.js';
29
29
  export var CoreNodeRenderState;
30
30
  (function (CoreNodeRenderState) {
31
31
  CoreNodeRenderState[CoreNodeRenderState["Init"] = 0] = "Init";
@@ -173,7 +173,6 @@ export class CoreNode extends EventEmitter {
173
173
  zIndexMin = 0;
174
174
  zIndexMax = 0;
175
175
  previousZIndex = -1;
176
- zIndexSortList = [];
177
176
  updateType = UpdateType.All;
178
177
  childUpdateType = UpdateType.None;
179
178
  globalTransform;
@@ -295,7 +294,7 @@ export class CoreNode extends EventEmitter {
295
294
  this.setUpdateType(initialUpdateType);
296
295
  // if the default texture isn't loaded yet, wait for it to load
297
296
  // this only happens when the node is created before the stage is ready
298
- const dt = this.stage.defaultTexture;
297
+ const dt = stage.defaultTexture;
299
298
  if (dt !== null && dt.state !== 'loaded') {
300
299
  dt.once('loaded', () => this.setUpdateType(UpdateType.IsRenderable));
301
300
  }
@@ -330,15 +329,6 @@ export class CoreNode extends EventEmitter {
330
329
  texture.on('loaded', this.onTextureLoaded);
331
330
  texture.on('failed', this.onTextureFailed);
332
331
  texture.on('freed', this.onTextureFreed);
333
- // If the parent is a render texture, the initial texture status
334
- // will be set to freed until the texture is processed by the
335
- // Render RTT nodes. So we only need to listen fo changes and
336
- // no need to check the texture.state until we restructure how
337
- // textures are being processed.
338
- if (this.parentHasRenderTexture) {
339
- this.notifyParentRTTOfUpdate();
340
- return;
341
- }
342
332
  if (texture.state === 'loaded') {
343
333
  this.onTextureLoaded(texture, texture.dimensions);
344
334
  }
@@ -1020,42 +1010,39 @@ export class CoreNode extends EventEmitter {
1020
1010
  return this.stage.elapsedTime;
1021
1011
  }
1022
1012
  sortChildren() {
1023
- const changedCount = this.zIndexSortList.length;
1024
- if (changedCount === 0) {
1013
+ const children = this.children;
1014
+ const n = children.length;
1015
+ if (n === 0) {
1016
+ this.zIndexMin = 0;
1017
+ this.zIndexMax = 0;
1025
1018
  return;
1026
1019
  }
1027
- const children = this.children;
1028
- let min = Infinity;
1029
- let max = -Infinity;
1030
- // find min and max zIndex
1031
- for (let i = 0; i < children.length; i++) {
1020
+ let firstZIndex = children[0].props.zIndex;
1021
+ let min = firstZIndex;
1022
+ let max = firstZIndex;
1023
+ let prevZIndex = firstZIndex;
1024
+ let isSorted = true;
1025
+ for (let i = 1; i < n; i++) {
1032
1026
  const zIndex = children[i].props.zIndex;
1033
1027
  if (zIndex < min) {
1034
1028
  min = zIndex;
1035
1029
  }
1036
- if (zIndex > max) {
1030
+ else if (zIndex > max) {
1037
1031
  max = zIndex;
1038
1032
  }
1033
+ if (prevZIndex > zIndex) {
1034
+ isSorted = false;
1035
+ }
1036
+ prevZIndex = zIndex;
1039
1037
  }
1040
1038
  // update min and max zIndex
1041
1039
  this.zIndexMin = min;
1042
1040
  this.zIndexMax = max;
1043
1041
  // if min and max are the same, no need to sort
1044
- if (min === max) {
1042
+ if (min === max || isSorted === true) {
1045
1043
  return;
1046
1044
  }
1047
- const n = children.length;
1048
- // decide whether to use incremental sort or bucket sort
1049
- const useIncremental = changedCount <= 2 || changedCount < n * 0.05;
1050
- // when changed count is less than 2 or 5% of total children, use incremental sort
1051
- if (useIncremental === true) {
1052
- incrementalRepositionByZIndex(this.zIndexSortList, children);
1053
- }
1054
- else {
1055
- bucketSortByZIndex(children, min);
1056
- }
1057
- this.zIndexSortList.length = 0;
1058
- this.zIndexSortList = [];
1045
+ bucketSortByZIndex(children, min);
1059
1046
  }
1060
1047
  removeChild(node, targetParent = null) {
1061
1048
  if (targetParent === null) {
@@ -1067,13 +1054,21 @@ export class CoreNode extends EventEmitter {
1067
1054
  autosizeTarget.detach(node);
1068
1055
  }
1069
1056
  }
1070
- removeChild(node, this.children);
1057
+ const children = this.children;
1058
+ removeChild(node, children);
1059
+ if (children.length === 0) {
1060
+ this.zIndexMin = 0;
1061
+ this.zIndexMax = 0;
1062
+ return;
1063
+ }
1064
+ const removedZIndex = node.zIndex;
1065
+ if (removedZIndex === this.zIndexMin || removedZIndex === this.zIndexMax) {
1066
+ this.setUpdateType(UpdateType.SortZIndexChildren);
1067
+ }
1071
1068
  }
1072
1069
  addChild(node, previousParent = null) {
1073
1070
  const inRttCluster = this.props.rtt === true || this.parentHasRenderTexture === true;
1074
1071
  const children = this.children;
1075
- const min = this.zIndexMin;
1076
- const max = this.zIndexMax;
1077
1072
  const zIndex = node.zIndex;
1078
1073
  const autosizeTarget = this.autosizer || this.parentAutosizer;
1079
1074
  let attachToAutosizer = autosizeTarget !== null;
@@ -1102,8 +1097,19 @@ export class CoreNode extends EventEmitter {
1102
1097
  node.markChildrenWithRTT(this);
1103
1098
  }
1104
1099
  children.push(node);
1105
- if (min !== max || (zIndex !== min && zIndex !== max)) {
1106
- this.zIndexSortList.push(node);
1100
+ if (children.length === 1) {
1101
+ this.zIndexMin = zIndex;
1102
+ this.zIndexMax = zIndex;
1103
+ }
1104
+ else {
1105
+ if (zIndex < this.zIndexMin) {
1106
+ this.zIndexMin = zIndex;
1107
+ }
1108
+ if (zIndex > this.zIndexMax) {
1109
+ this.zIndexMax = zIndex;
1110
+ }
1111
+ }
1112
+ if (this.zIndexMax !== this.zIndexMin) {
1107
1113
  this.setUpdateType(UpdateType.SortZIndexChildren);
1108
1114
  }
1109
1115
  this.setUpdateType(UpdateType.Children);
@@ -1473,7 +1479,6 @@ export class CoreNode extends EventEmitter {
1473
1479
  const min = parent.zIndexMin;
1474
1480
  const max = parent.zIndexMax;
1475
1481
  if (min !== max || sanitizedValue < min || sanitizedValue > max) {
1476
- parent.zIndexSortList.push(this);
1477
1482
  parent.setUpdateType(UpdateType.SortZIndexChildren);
1478
1483
  }
1479
1484
  }
@@ -1746,7 +1751,8 @@ export class CoreNode extends EventEmitter {
1746
1751
  return length;
1747
1752
  }
1748
1753
  draw(renderer) {
1749
- const { glw, options, stage } = renderer;
1754
+ const { glw, stage } = renderer;
1755
+ const canvas = stage.platform.canvas;
1750
1756
  const shader = this.props.shader;
1751
1757
  stage.shManager.useShader(shader.program);
1752
1758
  shader.program.bindRenderOp(this);
@@ -1756,7 +1762,7 @@ export class CoreNode extends EventEmitter {
1756
1762
  const clipX = Math.round(this.clippingRect.x * pixelRatio);
1757
1763
  const clipWidth = Math.round(this.clippingRect.w * pixelRatio);
1758
1764
  const clipHeight = Math.round(this.clippingRect.h * pixelRatio);
1759
- let clipY = Math.round(options.canvas.height - clipHeight - this.clippingRect.y * pixelRatio);
1765
+ let clipY = Math.round(canvas.height - clipHeight - this.clippingRect.y * pixelRatio);
1760
1766
  // if parent has render texture, we need to adjust the scissor rect
1761
1767
  // to be relative to the parent's framebuffer
1762
1768
  if (this.parentHasRenderTexture) {