@lightningtv/renderer 3.0.0-beta1 → 3.2.4

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 (503) hide show
  1. package/NOTICE +4 -0
  2. package/README.md +22 -28
  3. package/dist/exports/canvas-shaders.js +0 -16
  4. package/dist/exports/canvas-shaders.js.map +1 -1
  5. package/dist/exports/canvas.d.ts +1 -1
  6. package/dist/exports/canvas.js +1 -19
  7. package/dist/exports/canvas.js.map +1 -1
  8. package/dist/exports/index.d.ts +2 -5
  9. package/dist/exports/index.js +1 -23
  10. package/dist/exports/index.js.map +1 -1
  11. package/dist/exports/inspector.js +0 -18
  12. package/dist/exports/inspector.js.map +1 -1
  13. package/dist/exports/utils.d.ts +2 -1
  14. package/dist/exports/utils.js +2 -19
  15. package/dist/exports/utils.js.map +1 -1
  16. package/dist/exports/webgl-shaders.js +0 -16
  17. package/dist/exports/webgl-shaders.js.map +1 -1
  18. package/dist/exports/webgl.d.ts +2 -1
  19. package/dist/exports/webgl.js +2 -19
  20. package/dist/exports/webgl.js.map +1 -1
  21. package/dist/src/common/CommonTypes.d.ts +15 -3
  22. package/dist/src/common/CommonTypes.js +0 -18
  23. package/dist/src/common/CommonTypes.js.map +1 -1
  24. package/dist/src/common/EventEmitter.js +0 -18
  25. package/dist/src/common/EventEmitter.js.map +1 -1
  26. package/dist/src/common/IEventEmitter.js +0 -16
  27. package/dist/src/common/IEventEmitter.js.map +1 -1
  28. package/dist/src/core/Autosizer.d.ts +35 -0
  29. package/dist/src/core/Autosizer.js +178 -0
  30. package/dist/src/core/Autosizer.js.map +1 -0
  31. package/dist/src/core/CoreNode.d.ts +139 -101
  32. package/dist/src/core/CoreNode.js +813 -528
  33. package/dist/src/core/CoreNode.js.map +1 -1
  34. package/dist/src/core/CoreShaderManager.d.ts +3 -3
  35. package/dist/src/core/CoreShaderManager.js +0 -18
  36. package/dist/src/core/CoreShaderManager.js.map +1 -1
  37. package/dist/src/core/CoreTextNode.d.ts +75 -87
  38. package/dist/src/core/CoreTextNode.js +380 -258
  39. package/dist/src/core/CoreTextNode.js.map +1 -1
  40. package/dist/src/core/CoreTextureManager.d.ts +25 -14
  41. package/dist/src/core/CoreTextureManager.js +83 -140
  42. package/dist/src/core/CoreTextureManager.js.map +1 -1
  43. package/dist/src/core/Stage.d.ts +102 -36
  44. package/dist/src/core/Stage.js +424 -191
  45. package/dist/src/core/Stage.js.map +1 -1
  46. package/dist/src/core/TextureError.d.ts +11 -0
  47. package/dist/src/core/TextureError.js +37 -0
  48. package/dist/src/core/TextureError.js.map +1 -0
  49. package/dist/src/core/TextureMemoryManager.d.ts +11 -4
  50. package/dist/src/core/TextureMemoryManager.js +114 -134
  51. package/dist/src/core/TextureMemoryManager.js.map +1 -1
  52. package/dist/src/core/animations/AnimationManager.js +0 -18
  53. package/dist/src/core/animations/AnimationManager.js.map +1 -1
  54. package/dist/src/core/animations/CoreAnimation.d.ts +3 -3
  55. package/dist/src/core/animations/CoreAnimation.js +8 -24
  56. package/dist/src/core/animations/CoreAnimation.js.map +1 -1
  57. package/dist/src/core/animations/CoreAnimationController.d.ts +1 -0
  58. package/dist/src/core/animations/CoreAnimationController.js +11 -22
  59. package/dist/src/core/animations/CoreAnimationController.js.map +1 -1
  60. package/dist/src/core/lib/ContextSpy.js +0 -18
  61. package/dist/src/core/lib/ContextSpy.js.map +1 -1
  62. package/dist/src/core/lib/ImageWorker.d.ts +2 -2
  63. package/dist/src/core/lib/ImageWorker.js +33 -31
  64. package/dist/src/core/lib/ImageWorker.js.map +1 -1
  65. package/dist/src/core/lib/Matrix3d.d.ts +1 -0
  66. package/dist/src/core/lib/Matrix3d.js +7 -19
  67. package/dist/src/core/lib/Matrix3d.js.map +1 -1
  68. package/dist/src/core/lib/RenderCoords.d.ts +9 -10
  69. package/dist/src/core/lib/RenderCoords.js +27 -55
  70. package/dist/src/core/lib/RenderCoords.js.map +1 -1
  71. package/dist/src/core/lib/WebGlContextWrapper.d.ts +78 -3
  72. package/dist/src/core/lib/WebGlContextWrapper.js +150 -25
  73. package/dist/src/core/lib/WebGlContextWrapper.js.map +1 -1
  74. package/dist/src/core/lib/collectionUtils.d.ts +5 -0
  75. package/dist/src/core/lib/collectionUtils.js +82 -0
  76. package/dist/src/core/lib/collectionUtils.js.map +1 -0
  77. package/dist/src/core/lib/colorCache.d.ts +1 -0
  78. package/dist/src/core/lib/colorCache.js +19 -0
  79. package/dist/src/core/lib/colorCache.js.map +1 -0
  80. package/dist/src/core/{renderers/canvas/internal/ColorUtils.js → lib/colorParser.js} +1 -19
  81. package/dist/src/core/lib/colorParser.js.map +1 -0
  82. package/dist/src/core/lib/textureCompression.d.ts +14 -2
  83. package/dist/src/core/lib/textureCompression.js +320 -85
  84. package/dist/src/core/lib/textureCompression.js.map +1 -1
  85. package/dist/src/core/lib/textureSvg.js +0 -18
  86. package/dist/src/core/lib/textureSvg.js.map +1 -1
  87. package/dist/src/core/lib/utils.d.ts +8 -1
  88. package/dist/src/core/lib/utils.js +44 -20
  89. package/dist/src/core/lib/utils.js.map +1 -1
  90. package/dist/src/core/lib/validateImageBitmap.d.ts +2 -1
  91. package/dist/src/core/lib/validateImageBitmap.js +4 -4
  92. package/dist/src/core/lib/validateImageBitmap.js.map +1 -1
  93. package/dist/src/core/platforms/Platform.d.ts +42 -0
  94. package/dist/src/core/platforms/Platform.js +4 -0
  95. package/dist/src/core/platforms/Platform.js.map +1 -0
  96. package/dist/src/core/platforms/web/WebPlatform.d.ts +10 -0
  97. package/dist/src/core/platforms/web/WebPlatform.js +90 -0
  98. package/dist/src/core/platforms/web/WebPlatform.js.map +1 -0
  99. package/dist/src/core/renderers/CoreContextTexture.d.ts +2 -1
  100. package/dist/src/core/renderers/CoreContextTexture.js +0 -18
  101. package/dist/src/core/renderers/CoreContextTexture.js.map +1 -1
  102. package/dist/src/core/renderers/CoreRenderOp.js +0 -18
  103. package/dist/src/core/renderers/CoreRenderOp.js.map +1 -1
  104. package/dist/src/core/renderers/CoreRenderer.d.ts +15 -3
  105. package/dist/src/core/renderers/CoreRenderer.js +1 -18
  106. package/dist/src/core/renderers/CoreRenderer.js.map +1 -1
  107. package/dist/src/core/renderers/CoreShaderNode.d.ts +13 -3
  108. package/dist/src/core/renderers/CoreShaderNode.js +25 -2
  109. package/dist/src/core/renderers/CoreShaderNode.js.map +1 -1
  110. package/dist/src/core/renderers/CoreShaderProgram.js +0 -18
  111. package/dist/src/core/renderers/CoreShaderProgram.js.map +1 -1
  112. package/dist/src/core/renderers/canvas/CanvasRenderer.d.ts +4 -5
  113. package/dist/src/core/renderers/canvas/CanvasRenderer.js +89 -83
  114. package/dist/src/core/renderers/canvas/CanvasRenderer.js.map +1 -1
  115. package/dist/src/core/renderers/canvas/CanvasShaderNode.js +3 -21
  116. package/dist/src/core/renderers/canvas/CanvasShaderNode.js.map +1 -1
  117. package/dist/src/core/renderers/canvas/CanvasTexture.d.ts +3 -2
  118. package/dist/src/core/renderers/canvas/CanvasTexture.js +18 -31
  119. package/dist/src/core/renderers/canvas/CanvasTexture.js.map +1 -1
  120. package/dist/src/core/renderers/webgl/BatchRenderOp.d.ts +25 -0
  121. package/dist/src/core/renderers/webgl/BatchRenderOp.js +60 -0
  122. package/dist/src/core/renderers/webgl/BatchRenderOp.js.map +1 -0
  123. package/dist/src/core/renderers/webgl/SdfRenderOp.d.ts +33 -0
  124. package/dist/src/core/renderers/webgl/SdfRenderOp.js +80 -0
  125. package/dist/src/core/renderers/webgl/SdfRenderOp.js.map +1 -0
  126. package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.d.ts +2 -0
  127. package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.js +14 -24
  128. package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.js.map +1 -1
  129. package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.d.ts +13 -0
  130. package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.js +34 -23
  131. package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.js.map +1 -1
  132. package/dist/src/core/renderers/webgl/WebGlCtxTexture.d.ts +16 -6
  133. package/dist/src/core/renderers/webgl/WebGlCtxTexture.js +102 -70
  134. package/dist/src/core/renderers/webgl/WebGlCtxTexture.js.map +1 -1
  135. package/dist/src/core/renderers/webgl/WebGlRenderer.d.ts +34 -20
  136. package/dist/src/core/renderers/webgl/WebGlRenderer.js +319 -195
  137. package/dist/src/core/renderers/webgl/WebGlRenderer.js.map +1 -1
  138. package/dist/src/core/renderers/webgl/WebGlShaderNode.d.ts +2 -3
  139. package/dist/src/core/renderers/webgl/WebGlShaderNode.js +1 -4
  140. package/dist/src/core/renderers/webgl/WebGlShaderNode.js.map +1 -1
  141. package/dist/src/core/renderers/webgl/WebGlShaderProgram.d.ts +9 -7
  142. package/dist/src/core/renderers/webgl/WebGlShaderProgram.js +99 -48
  143. package/dist/src/core/renderers/webgl/WebGlShaderProgram.js.map +1 -1
  144. package/dist/src/core/renderers/webgl/internal/BufferCollection.d.ts +1 -0
  145. package/dist/src/core/renderers/webgl/internal/BufferCollection.js +12 -21
  146. package/dist/src/core/renderers/webgl/internal/BufferCollection.js.map +1 -1
  147. package/dist/src/core/renderers/webgl/internal/RendererUtils.js +0 -18
  148. package/dist/src/core/renderers/webgl/internal/RendererUtils.js.map +1 -1
  149. package/dist/src/core/renderers/webgl/internal/ShaderUtils.js +0 -18
  150. package/dist/src/core/renderers/webgl/internal/ShaderUtils.js.map +1 -1
  151. package/dist/src/core/renderers/webgl/internal/WebGlUtils.js +0 -18
  152. package/dist/src/core/renderers/webgl/internal/WebGlUtils.js.map +1 -1
  153. package/dist/src/core/shaders/canvas/Border.d.ts +8 -2
  154. package/dist/src/core/shaders/canvas/Border.js +67 -41
  155. package/dist/src/core/shaders/canvas/Border.js.map +1 -1
  156. package/dist/src/core/shaders/canvas/HolePunch.js +3 -19
  157. package/dist/src/core/shaders/canvas/HolePunch.js.map +1 -1
  158. package/dist/src/core/shaders/canvas/LinearGradient.js +7 -21
  159. package/dist/src/core/shaders/canvas/LinearGradient.js.map +1 -1
  160. package/dist/src/core/shaders/canvas/RadialGradient.js +14 -28
  161. package/dist/src/core/shaders/canvas/RadialGradient.js.map +1 -1
  162. package/dist/src/core/shaders/canvas/Rounded.js +1 -17
  163. package/dist/src/core/shaders/canvas/Rounded.js.map +1 -1
  164. package/dist/src/core/shaders/canvas/RoundedWithBorder.d.ts +6 -3
  165. package/dist/src/core/shaders/canvas/RoundedWithBorder.js +44 -22
  166. package/dist/src/core/shaders/canvas/RoundedWithBorder.js.map +1 -1
  167. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.d.ts +2 -3
  168. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.js +47 -25
  169. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.js.map +1 -1
  170. package/dist/src/core/shaders/canvas/RoundedWithShadow.js +9 -21
  171. package/dist/src/core/shaders/canvas/RoundedWithShadow.js.map +1 -1
  172. package/dist/src/core/shaders/canvas/Shadow.js +0 -16
  173. package/dist/src/core/shaders/canvas/Shadow.js.map +1 -1
  174. package/dist/src/core/shaders/canvas/utils/render.d.ts +1 -1
  175. package/dist/src/core/shaders/canvas/utils/render.js +31 -34
  176. package/dist/src/core/shaders/canvas/utils/render.js.map +1 -1
  177. package/dist/src/core/shaders/templates/BorderTemplate.d.ts +12 -2
  178. package/dist/src/core/shaders/templates/BorderTemplate.js +31 -27
  179. package/dist/src/core/shaders/templates/BorderTemplate.js.map +1 -1
  180. package/dist/src/core/shaders/templates/HolePunchTemplate.d.ts +2 -2
  181. package/dist/src/core/shaders/templates/HolePunchTemplate.js +3 -19
  182. package/dist/src/core/shaders/templates/HolePunchTemplate.js.map +1 -1
  183. package/dist/src/core/shaders/templates/LinearGradientTemplate.js +0 -16
  184. package/dist/src/core/shaders/templates/LinearGradientTemplate.js.map +1 -1
  185. package/dist/src/core/shaders/templates/RadialGradientTemplate.d.ts +8 -6
  186. package/dist/src/core/shaders/templates/RadialGradientTemplate.js +2 -18
  187. package/dist/src/core/shaders/templates/RadialGradientTemplate.js.map +1 -1
  188. package/dist/src/core/shaders/templates/RoundedTemplate.js +1 -17
  189. package/dist/src/core/shaders/templates/RoundedTemplate.js.map +1 -1
  190. package/dist/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.d.ts +1 -1
  191. package/dist/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.js +0 -16
  192. package/dist/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.js.map +1 -1
  193. package/dist/src/core/shaders/templates/RoundedWithBorderTemplate.d.ts +4 -2
  194. package/dist/src/core/shaders/templates/RoundedWithBorderTemplate.js +3 -17
  195. package/dist/src/core/shaders/templates/RoundedWithBorderTemplate.js.map +1 -1
  196. package/dist/src/core/shaders/templates/RoundedWithShadowTemplate.d.ts +1 -1
  197. package/dist/src/core/shaders/templates/RoundedWithShadowTemplate.js +0 -16
  198. package/dist/src/core/shaders/templates/RoundedWithShadowTemplate.js.map +1 -1
  199. package/dist/src/core/shaders/templates/ShadowTemplate.d.ts +1 -1
  200. package/dist/src/core/shaders/templates/ShadowTemplate.js +0 -16
  201. package/dist/src/core/shaders/templates/ShadowTemplate.js.map +1 -1
  202. package/dist/src/core/shaders/{templates/shaderUtils.d.ts → utils.d.ts} +1 -1
  203. package/dist/src/core/shaders/utils.js +25 -0
  204. package/dist/src/core/shaders/utils.js.map +1 -0
  205. package/dist/src/core/shaders/webgl/Border.js +118 -51
  206. package/dist/src/core/shaders/webgl/Border.js.map +1 -1
  207. package/dist/src/core/shaders/webgl/Default.js +6 -41
  208. package/dist/src/core/shaders/webgl/Default.js.map +1 -1
  209. package/dist/src/core/shaders/webgl/HolePunch.js +4 -19
  210. package/dist/src/core/shaders/webgl/HolePunch.js.map +1 -1
  211. package/dist/src/core/shaders/webgl/LinearGradient.js +73 -34
  212. package/dist/src/core/shaders/webgl/LinearGradient.js.map +1 -1
  213. package/dist/src/core/shaders/webgl/RadialGradient.js +56 -48
  214. package/dist/src/core/shaders/webgl/RadialGradient.js.map +1 -1
  215. package/dist/src/core/shaders/webgl/Rounded.js +25 -23
  216. package/dist/src/core/shaders/webgl/Rounded.js.map +1 -1
  217. package/dist/src/core/shaders/webgl/RoundedWithBorder.js +160 -55
  218. package/dist/src/core/shaders/webgl/RoundedWithBorder.js.map +1 -1
  219. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js +168 -58
  220. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js.map +1 -1
  221. package/dist/src/core/shaders/webgl/RoundedWithShadow.js +73 -34
  222. package/dist/src/core/shaders/webgl/RoundedWithShadow.js.map +1 -1
  223. package/dist/src/core/shaders/webgl/SdfShader.d.ts +0 -2
  224. package/dist/src/core/shaders/webgl/SdfShader.js +8 -36
  225. package/dist/src/core/shaders/webgl/SdfShader.js.map +1 -1
  226. package/dist/src/core/shaders/webgl/Shadow.js +39 -34
  227. package/dist/src/core/shaders/webgl/Shadow.js.map +1 -1
  228. package/dist/src/core/text-rendering/CanvasFontHandler.d.ts +59 -0
  229. package/dist/src/core/text-rendering/CanvasFontHandler.js +206 -0
  230. package/dist/src/core/text-rendering/CanvasFontHandler.js.map +1 -0
  231. package/dist/src/core/text-rendering/CanvasTextRenderer.d.ts +17 -0
  232. package/dist/src/core/text-rendering/CanvasTextRenderer.js +139 -0
  233. package/dist/src/core/text-rendering/CanvasTextRenderer.js.map +1 -0
  234. package/dist/src/core/text-rendering/SdfFontHandler.d.ts +167 -0
  235. package/dist/src/core/text-rendering/SdfFontHandler.js +371 -0
  236. package/dist/src/core/text-rendering/SdfFontHandler.js.map +1 -0
  237. package/dist/src/core/text-rendering/SdfTextRenderer.d.ts +18 -0
  238. package/dist/src/core/text-rendering/SdfTextRenderer.js +301 -0
  239. package/dist/src/core/text-rendering/SdfTextRenderer.js.map +1 -0
  240. package/dist/src/core/text-rendering/TextLayoutEngine.d.ts +18 -0
  241. package/dist/src/core/text-rendering/TextLayoutEngine.js +380 -0
  242. package/dist/src/core/text-rendering/TextLayoutEngine.js.map +1 -0
  243. package/dist/src/core/text-rendering/TextRenderer.d.ts +384 -0
  244. package/dist/src/core/text-rendering/TextRenderer.js +2 -0
  245. package/dist/src/core/text-rendering/TextRenderer.js.map +1 -0
  246. package/dist/src/core/text-rendering/Utils.d.ts +30 -0
  247. package/dist/src/core/text-rendering/Utils.js +66 -0
  248. package/dist/src/core/text-rendering/Utils.js.map +1 -0
  249. package/dist/src/core/textures/ColorTexture.d.ts +1 -1
  250. package/dist/src/core/textures/ColorTexture.js +3 -22
  251. package/dist/src/core/textures/ColorTexture.js.map +1 -1
  252. package/dist/src/core/textures/ImageTexture.d.ts +13 -6
  253. package/dist/src/core/textures/ImageTexture.js +57 -66
  254. package/dist/src/core/textures/ImageTexture.js.map +1 -1
  255. package/dist/src/core/textures/NoiseTexture.d.ts +3 -3
  256. package/dist/src/core/textures/NoiseTexture.js +8 -26
  257. package/dist/src/core/textures/NoiseTexture.js.map +1 -1
  258. package/dist/src/core/textures/RenderTexture.d.ts +7 -7
  259. package/dist/src/core/textures/RenderTexture.js +12 -30
  260. package/dist/src/core/textures/RenderTexture.js.map +1 -1
  261. package/dist/src/core/textures/SubTexture.d.ts +6 -8
  262. package/dist/src/core/textures/SubTexture.js +19 -55
  263. package/dist/src/core/textures/SubTexture.js.map +1 -1
  264. package/dist/src/core/textures/Texture.d.ts +90 -12
  265. package/dist/src/core/textures/Texture.js +160 -35
  266. package/dist/src/core/textures/Texture.js.map +1 -1
  267. package/dist/src/core/utils.d.ts +2 -1
  268. package/dist/src/core/utils.js +1 -19
  269. package/dist/src/core/utils.js.map +1 -1
  270. package/dist/src/main-api/INode.js.map +1 -1
  271. package/dist/src/main-api/Inspector.d.ts +135 -2
  272. package/dist/src/main-api/Inspector.js +507 -30
  273. package/dist/src/main-api/Inspector.js.map +1 -1
  274. package/dist/src/main-api/Renderer.d.ts +294 -81
  275. package/dist/src/main-api/Renderer.js +225 -96
  276. package/dist/src/main-api/Renderer.js.map +1 -1
  277. package/dist/src/utils.d.ts +19 -6
  278. package/dist/src/utils.js +32 -27
  279. package/dist/src/utils.js.map +1 -1
  280. package/dist/tsconfig.dist.tsbuildinfo +1 -1
  281. package/dist/tsconfig.tsbuildinfo +1 -0
  282. package/exports/canvas-shaders.ts +0 -17
  283. package/exports/canvas.ts +1 -19
  284. package/exports/index.ts +6 -27
  285. package/exports/inspector.ts +0 -19
  286. package/exports/utils.ts +7 -19
  287. package/exports/webgl-shaders.ts +0 -16
  288. package/exports/webgl.ts +3 -20
  289. package/package.json +23 -22
  290. package/src/common/CommonTypes.ts +20 -22
  291. package/src/common/EventEmitter.ts +0 -19
  292. package/src/common/IAnimationController.ts +0 -18
  293. package/src/common/IEventEmitter.ts +0 -17
  294. package/src/core/Autosizer.ts +205 -0
  295. package/src/core/CoreNode.test.ts +376 -45
  296. package/src/core/CoreNode.ts +1017 -656
  297. package/src/core/CoreShaderManager.ts +3 -21
  298. package/src/core/CoreTextNode.ts +457 -314
  299. package/src/core/CoreTextureManager.ts +123 -168
  300. package/src/core/Stage.ts +526 -236
  301. package/src/core/TextureError.ts +46 -0
  302. package/src/core/TextureMemoryManager.ts +150 -167
  303. package/src/core/animations/AnimationManager.ts +0 -19
  304. package/src/core/animations/CoreAnimation.ts +15 -32
  305. package/src/core/animations/CoreAnimationController.ts +13 -23
  306. package/src/core/lib/ContextSpy.ts +0 -19
  307. package/src/core/lib/ImageWorker.ts +45 -32
  308. package/src/core/lib/Matrix3d.ts +7 -20
  309. package/src/core/lib/RenderCoords.ts +36 -67
  310. package/src/core/lib/WebGlContextWrapper.ts +196 -72
  311. package/src/core/lib/collectionUtils.ts +99 -0
  312. package/src/core/lib/colorCache.ts +20 -0
  313. package/src/core/{renderers/canvas/internal/ColorUtils.ts → lib/colorParser.ts} +2 -21
  314. package/src/core/lib/textureCompression.ts +433 -93
  315. package/src/core/lib/textureSvg.ts +0 -19
  316. package/src/core/lib/utils.ts +58 -19
  317. package/src/core/lib/validateImageBitmap.ts +17 -6
  318. package/src/core/platforms/Platform.ts +64 -0
  319. package/src/core/platforms/web/WebPlatform.ts +132 -0
  320. package/src/core/renderers/CoreContextTexture.ts +2 -20
  321. package/src/core/renderers/CoreRenderOp.ts +0 -19
  322. package/src/core/renderers/CoreRenderer.ts +16 -23
  323. package/src/core/renderers/CoreShaderNode.ts +37 -6
  324. package/src/core/renderers/CoreShaderProgram.ts +0 -19
  325. package/src/core/renderers/canvas/CanvasRenderer.ts +108 -137
  326. package/src/core/renderers/canvas/CanvasShaderNode.ts +3 -23
  327. package/src/core/renderers/canvas/CanvasTexture.ts +25 -37
  328. package/src/core/renderers/webgl/SdfRenderOp.ts +88 -0
  329. package/src/core/renderers/webgl/WebGlCtxRenderTexture.ts +18 -34
  330. package/src/core/renderers/webgl/WebGlCtxSubTexture.ts +50 -24
  331. package/src/core/renderers/webgl/WebGlCtxTexture.ts +134 -103
  332. package/src/core/renderers/webgl/WebGlRenderer.ts +368 -233
  333. package/src/core/renderers/webgl/WebGlShaderNode.ts +4 -7
  334. package/src/core/renderers/webgl/WebGlShaderProgram.ts +122 -76
  335. package/src/core/renderers/webgl/internal/BufferCollection.ts +15 -23
  336. package/src/core/renderers/webgl/internal/RendererUtils.ts +0 -19
  337. package/src/core/renderers/webgl/internal/ShaderUtils.ts +0 -19
  338. package/src/core/renderers/webgl/internal/WebGlUtils.ts +0 -19
  339. package/src/core/shaders/canvas/Border.ts +91 -50
  340. package/src/core/shaders/canvas/HolePunch.ts +4 -28
  341. package/src/core/shaders/canvas/LinearGradient.ts +10 -25
  342. package/src/core/shaders/canvas/RadialGradient.ts +23 -54
  343. package/src/core/shaders/canvas/Rounded.ts +2 -19
  344. package/src/core/shaders/canvas/RoundedWithBorder.ts +72 -35
  345. package/src/core/shaders/canvas/RoundedWithBorderAndShadow.ts +77 -47
  346. package/src/core/shaders/canvas/RoundedWithShadow.ts +21 -34
  347. package/src/core/shaders/canvas/Shadow.ts +0 -17
  348. package/src/core/shaders/canvas/utils/render.ts +45 -53
  349. package/src/core/shaders/templates/BorderTemplate.ts +42 -29
  350. package/src/core/shaders/templates/HolePunchTemplate.ts +5 -22
  351. package/src/core/shaders/templates/LinearGradientTemplate.ts +0 -17
  352. package/src/core/shaders/templates/RadialGradientTemplate.ts +10 -25
  353. package/src/core/shaders/templates/RoundedTemplate.ts +1 -18
  354. package/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.ts +1 -18
  355. package/src/core/shaders/templates/RoundedWithBorderTemplate.ts +7 -19
  356. package/src/core/shaders/templates/RoundedWithShadowTemplate.ts +1 -18
  357. package/src/core/shaders/templates/ShadowTemplate.ts +1 -18
  358. package/src/core/shaders/utils.ts +30 -0
  359. package/src/core/shaders/webgl/Border.ts +118 -55
  360. package/src/core/shaders/webgl/Default.ts +6 -43
  361. package/src/core/shaders/webgl/HolePunch.ts +4 -24
  362. package/src/core/shaders/webgl/LinearGradient.ts +73 -35
  363. package/src/core/shaders/webgl/RadialGradient.ts +58 -51
  364. package/src/core/shaders/webgl/Rounded.ts +25 -45
  365. package/src/core/shaders/webgl/RoundedWithBorder.ts +161 -63
  366. package/src/core/shaders/webgl/RoundedWithBorderAndShadow.ts +169 -68
  367. package/src/core/shaders/webgl/RoundedWithShadow.ts +73 -39
  368. package/src/core/shaders/webgl/SdfShader.ts +8 -41
  369. package/src/core/shaders/webgl/Shadow.ts +39 -35
  370. package/src/core/text-rendering/CanvasFontHandler.ts +285 -0
  371. package/src/core/text-rendering/CanvasTextRenderer.ts +236 -0
  372. package/src/core/text-rendering/SdfFontHandler.ts +566 -0
  373. package/src/core/text-rendering/SdfTextRenderer.ts +406 -0
  374. package/src/core/text-rendering/TextLayoutEngine.ts +672 -0
  375. package/src/core/text-rendering/TextRenderer.ts +426 -0
  376. package/src/core/text-rendering/Utils.ts +80 -0
  377. package/src/core/text-rendering/tests/TextLayoutEngine.test.ts +434 -0
  378. package/src/core/textures/ColorTexture.ts +7 -24
  379. package/src/core/textures/ImageTexture.ts +110 -92
  380. package/src/core/textures/NoiseTexture.ts +14 -31
  381. package/src/core/textures/RenderTexture.ts +18 -35
  382. package/src/core/textures/SubTexture.ts +25 -65
  383. package/src/core/textures/Texture.ts +214 -46
  384. package/src/core/utils.ts +9 -26
  385. package/src/main-api/INode.ts +0 -18
  386. package/src/main-api/Inspector.ts +794 -38
  387. package/src/main-api/Renderer.ts +519 -159
  388. package/src/utils.ts +64 -29
  389. package/dist/src/core/platform.d.ts +0 -10
  390. package/dist/src/core/platform.js +0 -56
  391. package/dist/src/core/platform.js.map +0 -1
  392. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.d.ts +0 -1
  393. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.js +0 -217
  394. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.js.map +0 -1
  395. package/dist/src/core/renderers/canvas/internal/ColorUtils.js.map +0 -1
  396. package/dist/src/core/renderers/webgl/WebGlRenderOp.d.ts +0 -36
  397. package/dist/src/core/renderers/webgl/WebGlRenderOp.js +0 -107
  398. package/dist/src/core/renderers/webgl/WebGlRenderOp.js.map +0 -1
  399. package/dist/src/core/shaders/templates/shaderUtils.js +0 -41
  400. package/dist/src/core/shaders/templates/shaderUtils.js.map +0 -1
  401. package/dist/src/core/shaders/webgl/DefaultBatched.d.ts +0 -2
  402. package/dist/src/core/shaders/webgl/DefaultBatched.js +0 -104
  403. package/dist/src/core/shaders/webgl/DefaultBatched.js.map +0 -1
  404. package/dist/src/core/text-rendering/TextRenderingUtils.d.ts +0 -12
  405. package/dist/src/core/text-rendering/TextRenderingUtils.js +0 -14
  406. package/dist/src/core/text-rendering/TextRenderingUtils.js.map +0 -1
  407. package/dist/src/core/text-rendering/TextTextureRendererUtils.d.ts +0 -72
  408. package/dist/src/core/text-rendering/TextTextureRendererUtils.js +0 -217
  409. package/dist/src/core/text-rendering/TextTextureRendererUtils.js.map +0 -1
  410. package/dist/src/core/text-rendering/TrFontManager.d.ts +0 -26
  411. package/dist/src/core/text-rendering/TrFontManager.js +0 -131
  412. package/dist/src/core/text-rendering/TrFontManager.js.map +0 -1
  413. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.d.ts +0 -39
  414. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js +0 -125
  415. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js.map +0 -1
  416. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.d.ts +0 -103
  417. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.js +0 -21
  418. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.js.map +0 -1
  419. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.d.ts +0 -62
  420. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.js +0 -88
  421. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.js.map +0 -1
  422. package/dist/src/core/text-rendering/font-face-types/TrFontFace.d.ts +0 -118
  423. package/dist/src/core/text-rendering/font-face-types/TrFontFace.js +0 -63
  424. package/dist/src/core/text-rendering/font-face-types/TrFontFace.js.map +0 -1
  425. package/dist/src/core/text-rendering/font-face-types/WebTrFontFace.d.ts +0 -14
  426. package/dist/src/core/text-rendering/font-face-types/WebTrFontFace.js +0 -66
  427. package/dist/src/core/text-rendering/font-face-types/WebTrFontFace.js.map +0 -1
  428. package/dist/src/core/text-rendering/font-face-types/utils.d.ts +0 -1
  429. package/dist/src/core/text-rendering/font-face-types/utils.js +0 -38
  430. package/dist/src/core/text-rendering/font-face-types/utils.js.map +0 -1
  431. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.d.ts +0 -59
  432. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js +0 -397
  433. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js.map +0 -1
  434. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.d.ts +0 -126
  435. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js +0 -551
  436. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js.map +0 -1
  437. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.d.ts +0 -91
  438. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js +0 -611
  439. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js.map +0 -1
  440. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.d.ts +0 -12
  441. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.js +0 -61
  442. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.js.map +0 -1
  443. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.d.ts +0 -33
  444. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.js +0 -52
  445. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.js.map +0 -1
  446. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.d.ts +0 -13
  447. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.js +0 -32
  448. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.js.map +0 -1
  449. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.d.ts +0 -23
  450. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.js +0 -84
  451. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.js.map +0 -1
  452. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.d.ts +0 -4
  453. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.js +0 -34
  454. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.js.map +0 -1
  455. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.d.ts +0 -20
  456. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js +0 -308
  457. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js.map +0 -1
  458. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.d.ts +0 -10
  459. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.js +0 -40
  460. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.js.map +0 -1
  461. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.d.ts +0 -26
  462. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.js +0 -70
  463. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.js.map +0 -1
  464. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.d.ts +0 -16
  465. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.js +0 -39
  466. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.js.map +0 -1
  467. package/dist/src/core/text-rendering/renderers/TextRenderer.d.ts +0 -370
  468. package/dist/src/core/text-rendering/renderers/TextRenderer.js +0 -178
  469. package/dist/src/core/text-rendering/renderers/TextRenderer.js.map +0 -1
  470. package/scripts/please-use-pnpm.js +0 -13
  471. package/src/core/platform.ts +0 -64
  472. package/src/core/renderers/canvas/internal/C2DShaderUtils.ts +0 -220
  473. package/src/core/renderers/webgl/WebGlRenderOp.ts +0 -145
  474. package/src/core/shaders/templates/shaderUtils.ts +0 -47
  475. package/src/core/shaders/webgl/DefaultBatched.ts +0 -129
  476. package/src/core/text-rendering/TextRenderingUtils.ts +0 -36
  477. package/src/core/text-rendering/TextTextureRendererUtils.ts +0 -263
  478. package/src/core/text-rendering/TrFontManager.ts +0 -183
  479. package/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.ts +0 -176
  480. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.ts +0 -139
  481. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.test.ts +0 -173
  482. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.ts +0 -171
  483. package/src/core/text-rendering/font-face-types/TrFontFace.ts +0 -187
  484. package/src/core/text-rendering/font-face-types/WebTrFontFace.ts +0 -94
  485. package/src/core/text-rendering/font-face-types/utils.ts +0 -39
  486. package/src/core/text-rendering/renderers/CanvasTextRenderer.ts +0 -509
  487. package/src/core/text-rendering/renderers/LightningTextTextureRenderer.ts +0 -815
  488. package/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.ts +0 -841
  489. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.test.ts +0 -48
  490. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.ts +0 -66
  491. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.ts +0 -52
  492. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.ts +0 -32
  493. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.ts +0 -117
  494. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.test.ts +0 -133
  495. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.ts +0 -38
  496. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.ts +0 -408
  497. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.test.ts +0 -49
  498. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.ts +0 -52
  499. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.test.ts +0 -205
  500. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.ts +0 -93
  501. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.ts +0 -40
  502. package/src/core/text-rendering/renderers/TextRenderer.ts +0 -550
  503. /package/dist/src/core/{renderers/canvas/internal/ColorUtils.d.ts → lib/colorParser.d.ts} +0 -0
package/src/core/Stage.ts CHANGED
@@ -1,23 +1,10 @@
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 { startLoop, getTimeStamp } from './platform.js';
20
- import { assertTruthy, setPremultiplyMode } from '../utils.js';
1
+ import {
2
+ assertTruthy,
3
+ CALCULATE_FPS,
4
+ isProductionEnvironment,
5
+ setPremultiplyMode,
6
+ USE_RTT,
7
+ } from '../utils.js';
21
8
  import { AnimationManager } from './animations/AnimationManager.js';
22
9
  import {
23
10
  UpdateType,
@@ -26,13 +13,14 @@ import {
26
13
  type CoreNodeProps,
27
14
  } from './CoreNode.js';
28
15
  import { CoreTextureManager } from './CoreTextureManager.js';
29
- import { TrFontManager } from './text-rendering/TrFontManager.js';
30
16
  import { CoreShaderManager } from './CoreShaderManager.js';
31
17
  import {
32
- TextRenderer,
33
- type TextRendererMap,
18
+ type FontHandler,
19
+ type FontLoadOptions,
20
+ type TextRenderer,
21
+ type TextRenderers,
34
22
  type TrProps,
35
- } from './text-rendering/renderers/TextRenderer.js';
23
+ } from './text-rendering/TextRenderer.js';
36
24
 
37
25
  import { EventEmitter } from '../common/EventEmitter.js';
38
26
  import { ContextSpy } from './lib/ContextSpy.js';
@@ -46,39 +34,31 @@ import {
46
34
  type TextureMemoryManagerSettings,
47
35
  } from './TextureMemoryManager.js';
48
36
  import { CoreRenderer } from './renderers/CoreRenderer.js';
49
- import type { WebGlRenderer } from './renderers/webgl/WebGlRenderer.js';
50
- import type { CanvasRenderer } from './renderers/canvas/CanvasRenderer.js';
51
37
  import { CoreTextNode, type CoreTextNodeProps } from './CoreTextNode.js';
52
38
  import { santizeCustomDataMap } from '../main-api/utils.js';
53
- import type { SdfTextRenderer } from './text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js';
54
- import type { CanvasTextRenderer } from './text-rendering/renderers/CanvasTextRenderer.js';
39
+ import { pointInBound } from './lib/utils.js';
55
40
  import type { CoreShaderNode } from './renderers/CoreShaderNode.js';
41
+ import { Matrix3d } from './lib/Matrix3d.js';
56
42
  import { createBound, createPreloadBounds, type Bound } from './lib/utils.js';
57
43
  import type { Texture } from './textures/Texture.js';
58
44
  import { ColorTexture } from './textures/ColorTexture.js';
59
-
60
- export interface StageOptions {
61
- appWidth: number;
62
- appHeight: number;
45
+ import type { Platform } from './platforms/Platform.js';
46
+ import type { WebPlatform } from './platforms/web/WebPlatform.js';
47
+ import type { RendererMainSettings } from '../main-api/Renderer.js';
48
+
49
+ export type StageOptions = Omit<
50
+ RendererMainSettings,
51
+ 'inspector' | 'platform' | 'maxRetryCount'
52
+ > & {
63
53
  textureMemory: TextureMemoryManagerSettings;
64
- boundsMargin: number | [number, number, number, number];
65
- deviceLogicalPixelRatio: number;
66
- devicePhysicalPixelRatio: number;
67
54
  canvas: HTMLCanvasElement | OffscreenCanvas;
68
- clearColor: number;
69
55
  fpsUpdateInterval: number;
70
- enableContextSpy: boolean;
71
- forceWebGL2: boolean;
72
- numImageWorkers: number;
73
- renderEngine: typeof WebGlRenderer | typeof CanvasRenderer;
74
56
  eventBus: EventEmitter;
75
- quadBufferSize: number;
76
- fontEngines: (typeof CanvasTextRenderer | typeof SdfTextRenderer)[];
57
+ platform: Platform | WebPlatform;
77
58
  inspector: boolean;
78
- strictBounds: boolean;
79
- textureProcessingTimeLimit: number;
80
- createImageBitmapSupport: 'auto' | 'basic' | 'options' | 'full';
81
- }
59
+ maxRetryCount: number;
60
+ enableClear: boolean;
61
+ };
82
62
 
83
63
  export type StageFpsUpdateHandler = (
84
64
  stage: Stage,
@@ -90,6 +70,11 @@ export type StageFrameTickHandler = (
90
70
  frameTickData: FrameTickPayload,
91
71
  ) => void;
92
72
 
73
+ export interface Point {
74
+ x: number;
75
+ y: number;
76
+ }
77
+
93
78
  const autoStart = true;
94
79
 
95
80
  export class Stage {
@@ -97,19 +82,32 @@ export class Stage {
97
82
  public readonly animationManager: AnimationManager;
98
83
  public readonly txManager: CoreTextureManager;
99
84
  public readonly txMemManager: TextureMemoryManager;
100
- public readonly fontManager: TrFontManager;
101
- public readonly textRenderers: Partial<TextRendererMap>;
85
+ public readonly textRenderers: Record<string, TextRenderer> = {};
86
+ public readonly fontHandlers: Record<string, FontHandler> = {};
102
87
  public readonly shManager: CoreShaderManager;
103
88
  public readonly renderer: CoreRenderer;
104
89
  public readonly root: CoreNode;
90
+ public readonly interactiveNodes: Set<CoreNode> = new Set();
105
91
  public boundsMargin: [number, number, number, number];
106
92
  public readonly defShaderNode: CoreShaderNode | null = null;
107
- public readonly strictBound: Bound;
108
- public readonly preloadBound: Bound;
109
- public readonly strictBounds: boolean;
93
+ public strictBound: Bound;
94
+ public preloadBound: Bound;
110
95
  public readonly defaultTexture: Texture | null = null;
111
- public readonly pixelRatio: number;
96
+ public pixelRatio: number;
112
97
  public readonly bufferMemory: number = 2e6;
98
+ public readonly platform: Platform | WebPlatform;
99
+ public readonly calculateTextureCoord: boolean;
100
+
101
+ /**
102
+ * Target frame time in milliseconds (calculated from targetFPS)
103
+ *
104
+ * @remarks
105
+ * This is pre-calculated to avoid recalculating on every frame.
106
+ * - 0 means no throttling (use display refresh rate)
107
+ * - >0 means throttle to this frame time (1000 / targetFPS)
108
+ */
109
+ public targetFrameTime: number = 0;
110
+
113
111
  /**
114
112
  * Renderer Event Bus for the Stage to emit events onto
115
113
  *
@@ -121,25 +119,39 @@ export class Stage {
121
119
  public readonly eventBus: EventEmitter;
122
120
 
123
121
  /// State
122
+ startTime = 0;
124
123
  deltaTime = 0;
125
124
  lastFrameTime = 0;
126
125
  currentFrameTime = 0;
126
+ elapsedTime = 0;
127
+ private timedNodes: CoreNode[] = [];
127
128
  private clrColor = 0x00000000;
128
129
  private fpsNumFrames = 0;
129
130
  private fpsElapsedTime = 0;
130
131
  private numQuadsRendered = 0;
131
132
  private renderRequested = false;
133
+ private reprocessFrame = false;
134
+ private reprocessCallback: (() => void) | null = null;
132
135
  private frameEventQueue: [name: string, payload: unknown][] = [];
133
- private fontResolveMap: Record<string, CanvasTextRenderer | SdfTextRenderer> =
134
- {};
135
136
 
136
- /// Debug data
137
+ // Flattened render list optimization
138
+ public renderList: CoreNode[] = [];
139
+ public renderListDirty: boolean = true;
140
+
141
+ // Font resolve optimisation flags
142
+ private hasOnlyOneFontEngine: boolean;
143
+ private hasOnlyCanvasFontEngine: boolean;
144
+ private hasCanvasEngine: boolean;
145
+ private singleFontEngine: TextRenderer | null = null;
146
+ private singleFontHandler: FontHandler | null = null;
147
+
148
+ // Debug data
137
149
  contextSpy: ContextSpy | null = null;
138
150
 
139
151
  /**
140
152
  * Stage constructor
141
153
  */
142
- constructor(readonly options: StageOptions) {
154
+ constructor(public options: StageOptions) {
143
155
  const {
144
156
  canvas,
145
157
  clearColor,
@@ -153,12 +165,28 @@ export class Stage {
153
165
  renderEngine,
154
166
  fontEngines,
155
167
  createImageBitmapSupport,
168
+ platform,
169
+ maxRetryCount,
156
170
  } = options;
157
171
 
172
+ assertTruthy(
173
+ platform !== null,
174
+ 'A CorePlatform is not provided in the options',
175
+ );
176
+
177
+ this.platform = platform;
178
+
179
+ this.startTime = platform.getTimeStamp();
180
+
158
181
  this.eventBus = options.eventBus;
182
+
183
+ // Calculate target frame time from targetFPS option
184
+ this.targetFrameTime = options.targetFPS > 0 ? 1000 / options.targetFPS : 0;
185
+
159
186
  this.txManager = new CoreTextureManager(this, {
160
187
  numImageWorkers,
161
188
  createImageBitmapSupport,
189
+ maxRetryCount,
162
190
  });
163
191
 
164
192
  // Wait for the Texture Manager to initialize
@@ -171,7 +199,6 @@ export class Stage {
171
199
 
172
200
  this.animationManager = new AnimationManager();
173
201
  this.contextSpy = enableContextSpy ? new ContextSpy() : null;
174
- this.strictBounds = options.strictBounds;
175
202
 
176
203
  let bm = [0, 0, 0, 0] as [number, number, number, number];
177
204
  if (boundsMargin) {
@@ -200,6 +227,7 @@ export class Stage {
200
227
  this.shManager = new CoreShaderManager(this);
201
228
 
202
229
  this.defShaderNode = this.renderer.getDefaultShaderNode();
230
+ this.calculateTextureCoord = this.renderer.getTextureCoords !== undefined;
203
231
 
204
232
  const renderMode = this.renderer.mode || 'webgl';
205
233
 
@@ -210,40 +238,92 @@ export class Stage {
210
238
  this.txManager.renderer = this.renderer;
211
239
 
212
240
  // Create text renderers
213
- this.textRenderers = {};
214
- fontEngines.forEach((fontEngineConstructor) => {
215
- const fontEngineInstance = new fontEngineConstructor(this);
216
- const className = fontEngineInstance.type;
241
+ this.hasOnlyOneFontEngine = fontEngines.length === 1;
242
+ this.hasOnlyCanvasFontEngine =
243
+ fontEngines.length === 1 && fontEngines[0]!.type === 'canvas';
244
+ this.hasCanvasEngine = false;
245
+ this.singleFontEngine = this.hasOnlyOneFontEngine
246
+ ? (fontEngines[0] as TextRenderer)
247
+ : null;
248
+ this.singleFontHandler = this.hasOnlyOneFontEngine
249
+ ? (fontEngines[0]?.font as FontHandler)
250
+ : null;
251
+
252
+ if (this.singleFontEngine === null) {
253
+ // Multiple font engines case
254
+ // Filter out incompatible engines first
255
+ const compatibleEngines = fontEngines.filter(
256
+ (fontEngine: TextRenderer) => {
257
+ const type = fontEngine.type;
258
+
259
+ if (type === 'sdf' && renderMode === 'canvas') {
260
+ console.warn(
261
+ 'MsdfTextRenderer is not compatible with Canvas renderer. Skipping...',
262
+ );
263
+ return false;
264
+ }
265
+
266
+ if (type === 'canvas') {
267
+ this.hasCanvasEngine = true;
268
+ }
269
+
270
+ return true;
271
+ },
272
+ );
273
+
274
+ // Sort engines: SDF first, Canvas last, others in between
275
+ const sortedEngines = compatibleEngines.sort(
276
+ (a: TextRenderer, b: TextRenderer) => {
277
+ if (a.type === 'sdf') return -1;
278
+ if (b.type === 'sdf') return 1;
279
+ if (a.type === 'canvas') return 1;
280
+ if (b.type === 'canvas') return -1;
281
+ return 0;
282
+ },
283
+ );
284
+
285
+ // Initialize engines in sorted order
286
+ sortedEngines.forEach((fontEngine: TextRenderer) => {
287
+ const type = fontEngine.type;
217
288
 
218
- if (className === 'sdf' && renderMode === 'canvas') {
289
+ // Add to map for type-based access
290
+ this.textRenderers[type] = fontEngine;
291
+ this.textRenderers[type].init(this);
292
+
293
+ this.fontHandlers[type] = fontEngine.font;
294
+ });
295
+ } else {
296
+ // Single font engine case - initialize it directly
297
+ const fontEngine = this.singleFontEngine;
298
+ const type = fontEngine.type;
299
+
300
+ // Check compatibility
301
+ if (type === 'sdf' && renderMode === 'canvas') {
219
302
  console.warn(
220
- 'SdfTextRenderer is not compatible with Canvas renderer. Skipping...',
303
+ 'MsdfTextRenderer is not compatible with Canvas renderer. Skipping...',
221
304
  );
222
- return;
223
- }
224
-
225
- if (fontEngineInstance instanceof TextRenderer) {
226
- if (className === 'canvas') {
227
- this.textRenderers['canvas'] =
228
- fontEngineInstance as CanvasTextRenderer;
229
- } else if (className === 'sdf') {
230
- this.textRenderers['sdf'] = fontEngineInstance as SdfTextRenderer;
305
+ } else {
306
+ if (type === 'canvas') {
307
+ this.hasCanvasEngine = true;
231
308
  }
309
+
310
+ // Add to map for type-based access
311
+ this.textRenderers[type] = fontEngine;
312
+ this.fontHandlers[type] = fontEngine.font;
313
+ this.textRenderers[type].init(this);
232
314
  }
233
- });
315
+ }
234
316
 
235
317
  if (Object.keys(this.textRenderers).length === 0) {
236
318
  console.warn('No text renderers available. Your text will not render.');
237
319
  }
238
320
 
239
- this.fontManager = new TrFontManager(this.textRenderers);
240
-
241
321
  // create root node
242
322
  const rootNode = new CoreNode(this, {
243
323
  x: 0,
244
324
  y: 0,
245
- width: appWidth,
246
- height: appHeight,
325
+ w: appWidth,
326
+ h: appHeight,
247
327
  alpha: 1,
248
328
  autosize: false,
249
329
  boundsMargin: null,
@@ -258,7 +338,6 @@ export class Stage {
258
338
  colorBl: 0x00000000,
259
339
  colorBr: 0x00000000,
260
340
  zIndex: 0,
261
- zIndexLocked: 0,
262
341
  scaleX: 1,
263
342
  scaleY: 1,
264
343
  mountX: 0,
@@ -275,15 +354,30 @@ export class Stage {
275
354
  rtt: false,
276
355
  src: null,
277
356
  scale: 1,
278
- preventCleanup: false,
279
- strictBounds: this.strictBounds,
280
357
  });
281
358
 
282
359
  this.root = rootNode;
283
360
 
361
+ // Initialize root node properties
362
+ rootNode.updateLocalTransform();
363
+ rootNode.globalTransform = Matrix3d.copy(rootNode.localTransform!);
364
+ rootNode.sceneGlobalTransform = Matrix3d.copy(rootNode.localTransform!);
365
+ rootNode.calculateRenderCoords();
366
+ rootNode.updateBoundingRect();
367
+ rootNode.createRenderBounds();
368
+ rootNode.updateRenderState(CoreNodeRenderState.InViewport);
369
+ rootNode.updateIsRenderable();
370
+
371
+ // Initialize premultiplied colors (default is transparent 0x00000000)
372
+ rootNode.premultipliedColorTl =
373
+ rootNode.premultipliedColorTr =
374
+ rootNode.premultipliedColorBl =
375
+ rootNode.premultipliedColorBr =
376
+ 0;
377
+
284
378
  // execute platform start loop
285
- if (autoStart) {
286
- startLoop(this);
379
+ if (autoStart === true) {
380
+ this.platform.startLoop(this);
287
381
  }
288
382
  }
289
383
 
@@ -293,10 +387,25 @@ export class Stage {
293
387
  this.renderRequested = true;
294
388
  }
295
389
 
390
+ /**
391
+ * Update the target frame time based on the current targetFPS setting
392
+ *
393
+ * @remarks
394
+ * This should be called whenever the targetFPS option is changed
395
+ * to ensure targetFrameTime stays in sync.
396
+ * targetFPS of 0 means no throttling (targetFrameTime = 0)
397
+ * targetFPS > 0 means throttle to 1000/targetFPS milliseconds
398
+ */
399
+ updateTargetFrameTime() {
400
+ this.targetFrameTime =
401
+ this.options.targetFPS > 0 ? 1000 / this.options.targetFPS : 0;
402
+ }
403
+
296
404
  updateFrameTime() {
297
- const newFrameTime = getTimeStamp();
405
+ const newFrameTime = this.platform.getTimeStamp();
298
406
  this.lastFrameTime = this.currentFrameTime;
299
407
  this.currentFrameTime = newFrameTime;
408
+ this.elapsedTime = newFrameTime - this.startTime;
300
409
  this.deltaTime = !this.lastFrameTime
301
410
  ? 100 / 6
302
411
  : newFrameTime - this.lastFrameTime;
@@ -315,7 +424,6 @@ export class Stage {
315
424
  * Create default PixelTexture
316
425
  */
317
426
  createDefaultTexture() {
318
- console.log('Creating default texture');
319
427
  (this.defaultTexture as ColorTexture) = this.txManager.createTexture(
320
428
  'ColorTexture',
321
429
  {
@@ -329,7 +437,7 @@ export class Stage {
329
437
  // Mark the default texture as ALWAYS renderable
330
438
  // This prevents it from ever being cleaned up.
331
439
  // Fixes https://github.com/lightning-js/renderer/issues/262
332
- this.defaultTexture.setRenderableOwner(this, true);
440
+ this.defaultTexture.setRenderableOwner('stage', true);
333
441
 
334
442
  // When the default texture is loaded, request a render in case the
335
443
  // RAF is paused. Fixes: https://github.com/lightning-js/renderer/issues/123
@@ -341,13 +449,14 @@ export class Stage {
341
449
  /**
342
450
  * Update animations
343
451
  */
344
- updateAnimations() {
452
+ updateAnimations(): boolean {
345
453
  const { animationManager } = this;
346
454
  if (!this.root) {
347
- return;
455
+ return false;
348
456
  }
349
457
  // step animation
350
458
  animationManager.update(this.deltaTime);
459
+ return animationManager.activeAnimations.size > 0;
351
460
  }
352
461
 
353
462
  /**
@@ -364,50 +473,99 @@ export class Stage {
364
473
  /**
365
474
  * Start a new frame draw
366
475
  */
367
- drawFrame() {
368
- const { renderer, renderRequested } = this;
369
- assertTruthy(renderer);
476
+ drawFrame(hasActiveAnimations: boolean = false) {
477
+ const { renderer, renderRequested, root } = this;
370
478
 
371
479
  // Update tree if needed
372
- if (this.root.updateType !== 0) {
373
- this.root.update(this.deltaTime, this.root.clippingRect);
374
- }
480
+ do {
481
+ const forceUpdate = this.reprocessFrame;
482
+ this.reprocessFrame = false;
375
483
 
376
- // Process some textures
377
- this.txManager.processSome(this.options.textureProcessingTimeLimit);
484
+ if (root.updateType !== 0 || forceUpdate) {
485
+ root.updateType = 0;
486
+ const childUpdateType = root.childUpdateType;
487
+ root.childUpdateType = 0;
378
488
 
379
- // Reset render operations and clear the canvas
380
- renderer.reset();
489
+ for (let i = 0, length = root.children.length; i < length; i++) {
490
+ const child = root.children[i] as CoreNode;
381
491
 
382
- // Check if we need to cleanup textures
383
- if (this.txMemManager.criticalCleanupRequested === true) {
384
- this.txMemManager.cleanup(false);
492
+ if (childUpdateType !== 0) {
493
+ child.setUpdateType(childUpdateType);
494
+ }
385
495
 
386
- if (this.txMemManager.criticalCleanupRequested === true) {
387
- // If we still need to cleanup, request another but aggressive cleanup
388
- this.txMemManager.cleanup(true);
496
+ if (child.updateType === 0) {
497
+ continue;
498
+ }
499
+
500
+ child.update(this.deltaTime, root.clippingRect);
501
+ }
389
502
  }
503
+
504
+ if (this.reprocessCallback !== null) {
505
+ this.reprocessCallback();
506
+ this.reprocessCallback = null;
507
+ }
508
+ } while (this.reprocessFrame);
509
+
510
+ // Process some textures asynchronously but don't block the frame
511
+ // Use a background task to prevent frame drops
512
+ if (this.txManager.hasUpdates() === true) {
513
+ const timeLimit = hasActiveAnimations
514
+ ? this.options.textureProcessingTimeLimit / 2
515
+ : this.options.textureProcessingTimeLimit;
516
+
517
+ this.txManager.processSome(timeLimit).catch((err) => {
518
+ console.error('Error processing textures:', err);
519
+ });
390
520
  }
391
521
 
522
+ // Reset render operations and clear the canvas
523
+ renderer.reset();
524
+
392
525
  // If we have RTT nodes draw them first
393
526
  // So we can use them as textures in the main scene
394
- if (renderer.rttNodes.length > 0) {
527
+ if (USE_RTT && renderer.rttNodes.length > 0) {
395
528
  renderer.renderRTTNodes();
396
529
  }
397
530
 
398
- // Fill quads buffer
399
- this.addQuads(this.root);
531
+ // Update render list if dirty
532
+ if (this.renderListDirty === true) {
533
+ this.renderList.length = 0;
534
+ this.buildRenderList(this.root);
535
+ this.renderListDirty = false;
536
+ } else {
537
+ // Fill quads buffer
538
+ const renderList = this.renderList;
539
+ for (let i = 0, len = renderList.length; i < len; i++) {
540
+ renderList[i]!.renderQuads(renderer);
541
+ }
542
+ }
400
543
 
401
544
  // Perform render pass
402
- renderer?.render();
545
+ renderer.render();
403
546
 
404
- this.calculateFps();
405
- this.calculateQuads();
547
+ if (CALCULATE_FPS) {
548
+ this.calculateFps();
549
+ this.calculateQuads();
550
+ }
406
551
 
407
552
  // Reset renderRequested flag if it was set
408
- if (renderRequested) {
553
+ if (renderRequested === true) {
409
554
  this.renderRequested = false;
410
555
  }
556
+
557
+ if (this.timedNodes.length > 0) {
558
+ for (let key in this.timedNodes) {
559
+ if (this.timedNodes[key]!.isRenderable === true) {
560
+ this.requestRender();
561
+ break;
562
+ }
563
+ }
564
+ }
565
+ // Check if we need to cleanup textures
566
+ if (this.txMemManager.criticalCleanupRequested === true) {
567
+ this.txMemManager.cleanup();
568
+ }
411
569
  }
412
570
 
413
571
  /**
@@ -476,30 +634,38 @@ export class Stage {
476
634
  }
477
635
  }
478
636
 
479
- addQuads(node: CoreNode) {
480
- assertTruthy(this.renderer);
637
+ requestRenderListUpdate() {
638
+ // Notify the renderer that the render list is structurally changing.
639
+ // For the WebGL renderer this resets per-node buffer slot assignments
640
+ // and schedules a full GPU buffer re-upload on the next frame.
641
+ if (this.renderer.invalidateQuadBuffer !== undefined) {
642
+ this.renderer.invalidateQuadBuffer();
643
+ }
644
+ this.renderListDirty = true;
645
+ this.requestRender();
646
+ }
481
647
 
482
- // If the node is renderable and has a loaded texture, render it
648
+ buildRenderList(node: CoreNode) {
649
+ // If the node is renderable and has a loaded texture, add it
483
650
  if (node.isRenderable === true) {
484
651
  node.renderQuads(this.renderer);
652
+ this.renderList.push(node);
485
653
  }
486
654
 
487
- for (let i = 0; i < node.children.length; i++) {
488
- const child = node.children[i];
489
-
490
- if (child === undefined) {
491
- continue;
492
- }
655
+ const children = node.children;
656
+ const len = children.length;
657
+ for (let i = 0; i < len; i++) {
658
+ const child = children[i] as CoreNode;
493
659
 
660
+ // Skip invisible subtrees
494
661
  if (
495
662
  child.worldAlpha === 0 ||
496
- (child.strictBounds === true &&
497
- child.renderState === CoreNodeRenderState.OutOfBounds)
663
+ child.renderState === CoreNodeRenderState.OutOfBounds
498
664
  ) {
499
665
  continue;
500
666
  }
501
667
 
502
- this.addQuads(child);
668
+ this.buildRenderList(child);
503
669
  }
504
670
  }
505
671
 
@@ -510,6 +676,13 @@ export class Stage {
510
676
  this.renderRequested = true;
511
677
  }
512
678
 
679
+ reprocessUpdates(callback?: () => void) {
680
+ this.reprocessFrame = true;
681
+ if (callback) {
682
+ this.reprocessCallback = callback;
683
+ }
684
+ }
685
+
513
686
  /**
514
687
  * Given a font name, and possible renderer override, return the best compatible text renderer.
515
688
  *
@@ -522,72 +695,52 @@ export class Stage {
522
695
  */
523
696
  resolveTextRenderer(
524
697
  trProps: TrProps,
525
- textRendererOverride: keyof TextRendererMap | null = null,
698
+ textRendererOverride: keyof TextRenderers | null = null,
526
699
  ): TextRenderer | null {
527
- const fontCacheString = `${trProps.fontFamily}${trProps.fontStyle}${
528
- trProps.fontWeight
529
- }${trProps.fontStretch}${textRendererOverride ? textRendererOverride : ''}`;
700
+ // If we have an overide, return it
701
+ if (textRendererOverride !== null) {
702
+ const overrideKey = String(textRendererOverride);
703
+ if (this.textRenderers[overrideKey] === undefined) {
704
+ console.warn(`Text renderer override '${overrideKey}' not found.`);
705
+ return null;
706
+ }
530
707
 
531
- // check our resolve cache first
532
- if (this.fontResolveMap[fontCacheString] !== undefined) {
533
- return this.fontResolveMap[fontCacheString] as unknown as TextRenderer;
708
+ return this.textRenderers[overrideKey];
534
709
  }
535
710
 
536
- // Resolve the text renderer
537
- let rendererId = textRendererOverride;
538
- let overrideFallback = false;
539
-
540
- // Check if the override is valid (if one is provided)
541
- if (rendererId) {
542
- const possibleRenderer = this.textRenderers[rendererId];
543
- if (!possibleRenderer) {
544
- console.warn(`Text renderer override '${rendererId}' not found.`);
545
- rendererId = null;
546
- overrideFallback = true;
547
- } else if (!possibleRenderer.canRenderFont(trProps)) {
548
- console.warn(
549
- `Cannot use override text renderer '${rendererId}' for font`,
550
- trProps,
551
- );
552
- rendererId = null;
553
- overrideFallback = true;
711
+ // If we have only one font engine early return it
712
+ if (this.singleFontEngine !== null) {
713
+ // If we have only one font engine and its the canvas engine, we can just return it
714
+ if (this.hasOnlyCanvasFontEngine === true) {
715
+ return this.singleFontEngine;
554
716
  }
555
- }
556
717
 
557
- if (!rendererId) {
558
- // Iterate through the text renderers and find the first one that can render the font
559
- for (const [trId, tr] of Object.entries(this.textRenderers)) {
560
- if (tr.canRenderFont(trProps)) {
561
- rendererId = trId as keyof TextRendererMap;
562
- break;
563
- }
564
- }
565
- if (!rendererId && this.textRenderers.canvas !== undefined) {
566
- // If no renderer can be found, use the canvas renderer
567
- rendererId = 'canvas';
718
+ // If we have only one font engine and it can render the font, return it
719
+ if (this.singleFontHandler?.canRenderFont(trProps) === true) {
720
+ return this.singleFontEngine;
568
721
  }
569
- }
570
722
 
571
- if (overrideFallback) {
572
- console.warn(`Falling back to text renderer ${String(rendererId)}`);
573
- }
723
+ // If we have only one font engine and it cannot render the font, return null
724
+ console.warn(`Text renderer cannot render font`, trProps);
574
725
 
575
- if (!rendererId) {
576
- // silently fail if no renderer can be found, the error is already created
577
- // at the constructor level
578
726
  return null;
579
727
  }
580
728
 
581
- // By now we are guaranteed to have a valid rendererId (at least Canvas);
582
- const resolvedTextRenderer = this.textRenderers[rendererId];
583
- assertTruthy(resolvedTextRenderer, 'resolvedTextRenderer undefined');
729
+ // Multi font handling - If we have multiple font engines, we need to resolve the best one
584
730
 
585
- // cache the resolved renderer for future use with these trProps
586
- this.fontResolveMap[fontCacheString] = resolvedTextRenderer;
731
+ // First check SDF
732
+ if (this.fontHandlers['sdf']?.canRenderFont(trProps) === true) {
733
+ return this.textRenderers.sdf || null;
734
+ }
735
+
736
+ // If we have a canvas engine, we can return it (it can render all fonts)
737
+ if (this.hasCanvasEngine === true) {
738
+ return this.textRenderers.canvas || null;
739
+ }
587
740
 
588
- // Need to explicitly cast to TextRenderer because TS doesn't like
589
- // the covariant state argument in the setter method map
590
- return resolvedTextRenderer as unknown as TextRenderer;
741
+ // If we have no font engines, return null
742
+ console.warn('No text renderers available. Your text will not render.');
743
+ return null;
591
744
  }
592
745
 
593
746
  createNode(props: Partial<CoreNodeProps>) {
@@ -596,34 +749,30 @@ export class Stage {
596
749
  }
597
750
 
598
751
  createTextNode(props: Partial<CoreTextNodeProps>) {
599
- const fontSize = props.fontSize ?? 16;
600
- const resolvedProps = {
601
- ...this.resolveNodeDefaults(props),
602
- text: props.text ?? '',
603
- textRendererOverride: props.textRendererOverride ?? null,
604
- fontSize,
605
- fontFamily: props.fontFamily ?? 'sans-serif',
606
- fontStyle: props.fontStyle ?? 'normal',
607
- fontWeight: props.fontWeight ?? 'normal',
608
- fontStretch: props.fontStretch ?? 'normal',
609
- textAlign: props.textAlign ?? 'left',
610
- contain: props.contain ?? 'none',
611
- scrollable: props.scrollable ?? false,
612
- scrollY: props.scrollY ?? 0,
613
- offsetY: props.offsetY ?? 0,
614
- letterSpacing: props.letterSpacing ?? 0,
615
- lineHeight: props.lineHeight, // `undefined` is a valid value
616
- maxLines: props.maxLines ?? 0,
617
- textBaseline: props.textBaseline ?? 'alphabetic',
618
- verticalAlign: props.verticalAlign ?? 'middle',
619
- overflowSuffix: props.overflowSuffix ?? '...',
620
- debug: props.debug ?? {},
621
- shaderProps: null,
622
- };
752
+ const fontSize = props.fontSize || 16;
753
+ const resolvedProps = this.resolveNodeDefaults(props) as CoreTextNodeProps;
754
+
755
+ resolvedProps.text = props.text ?? '';
756
+ resolvedProps.textRendererOverride = props.textRendererOverride ?? null;
757
+ resolvedProps.fontSize = fontSize;
758
+ resolvedProps.fontFamily = props.fontFamily || 'sans-serif';
759
+ resolvedProps.fontStyle = props.fontStyle || 'normal';
760
+ resolvedProps.textAlign = props.textAlign || 'left';
761
+ resolvedProps.offsetY = props.offsetY || 0;
762
+ resolvedProps.letterSpacing = props.letterSpacing || 0;
763
+ resolvedProps.lineHeight = props.lineHeight || 1.2;
764
+ resolvedProps.maxLines = props.maxLines || 0;
765
+ resolvedProps.verticalAlign = props.verticalAlign || 'top';
766
+ resolvedProps.overflowSuffix = props.overflowSuffix || '...';
767
+ resolvedProps.wordBreak = props.wordBreak || 'break-word';
768
+ resolvedProps.contain = props.contain || 'none';
769
+ resolvedProps.maxWidth = props.maxWidth || 0;
770
+ resolvedProps.maxHeight = props.maxHeight || 0;
771
+ resolvedProps.forceLoad = props.forceLoad || false;
623
772
 
624
773
  const resolvedTextRenderer = this.resolveTextRenderer(
625
774
  resolvedProps,
626
- props.textRendererOverride,
775
+ resolvedProps.textRendererOverride as keyof TextRenderers | null,
627
776
  );
628
777
 
629
778
  if (!resolvedTextRenderer) {
@@ -640,7 +789,84 @@ export class Stage {
640
789
  ? value
641
790
  : [value, value, value, value];
642
791
 
643
- this.root.setUpdateType(UpdateType.RenderBounds);
792
+ this.updateViewportBounds();
793
+ }
794
+
795
+ /**
796
+ * Update the viewport bounds
797
+ */
798
+ updateViewportBounds() {
799
+ const { appWidth, appHeight } = this.options;
800
+ this.strictBound = createBound(0, 0, appWidth, appHeight);
801
+ this.preloadBound = createPreloadBounds(
802
+ this.strictBound,
803
+ this.boundsMargin,
804
+ );
805
+ this.root.setUpdateType(UpdateType.RenderBounds | UpdateType.Children);
806
+ this.root.childUpdateType |= UpdateType.RenderBounds;
807
+ }
808
+
809
+ /** Find all nodes at a given point
810
+ * @param data
811
+ */
812
+ findNodesAtPoint(data: Point): CoreNode[] {
813
+ const x = data.x / this.options.deviceLogicalPixelRatio;
814
+ const y = data.y / this.options.deviceLogicalPixelRatio;
815
+ const nodes: CoreNode[] = [];
816
+ for (const node of this.interactiveNodes) {
817
+ if (node.isRenderable === false) {
818
+ continue;
819
+ }
820
+ if (pointInBound(x, y, node.renderBound!) === true) {
821
+ nodes.push(node);
822
+ }
823
+ }
824
+ return nodes;
825
+ }
826
+
827
+ /**
828
+ * Find the top node at a given point
829
+ * @param data
830
+ * @returns
831
+ */
832
+ getNodeFromPosition(data: Point): CoreNode | null {
833
+ const nodes: CoreNode[] = this.findNodesAtPoint(data);
834
+ if (nodes.length === 0) {
835
+ return null;
836
+ }
837
+
838
+ //get last node in array (as top node)
839
+ let topNode = nodes[nodes.length - 1] as CoreNode;
840
+ for (let i = 0; i < nodes.length; i++) {
841
+ if (nodes[i]!.zIndex > topNode.zIndex) {
842
+ topNode = nodes[i]!;
843
+ }
844
+ }
845
+ return topNode || null;
846
+ }
847
+
848
+ /**
849
+ * add node to timeNodes arrays
850
+ * @param node
851
+ * @returns
852
+ */
853
+ trackTimedNode(node: CoreNode) {
854
+ if (this.timedNodes[node.id] !== undefined) {
855
+ return;
856
+ }
857
+ this.timedNodes[node.id] = node;
858
+ }
859
+
860
+ /**
861
+ * remove node from timeNodes arrays
862
+ * @param node
863
+ * @returns
864
+ */
865
+ untrackTimedNode(node: CoreNode) {
866
+ if (this.timedNodes[node.id] === undefined) {
867
+ return;
868
+ }
869
+ delete this.timedNodes[node.id];
644
870
  }
645
871
 
646
872
  /**
@@ -656,65 +882,96 @@ export class Stage {
656
882
  */
657
883
  protected resolveNodeDefaults(props: Partial<CoreNodeProps>): CoreNodeProps {
658
884
  const color = props.color ?? 0xffffffff;
659
- const colorTl = props.colorTl ?? props.colorTop ?? props.colorLeft ?? color;
660
- const colorTr =
661
- props.colorTr ?? props.colorTop ?? props.colorRight ?? color;
662
- const colorBl =
663
- props.colorBl ?? props.colorBottom ?? props.colorLeft ?? color;
664
- const colorBr =
665
- props.colorBr ?? props.colorBottom ?? props.colorRight ?? color;
666
-
667
- let data = {};
668
- if (this.options.inspector === true) {
669
- data = santizeCustomDataMap(props.data ?? {});
885
+ let colorTop = color;
886
+ let colorBottom = color;
887
+ let colorLeft = color;
888
+ let colorRight = color;
889
+ let colorTl = color;
890
+ let colorTr = color;
891
+ let colorBl = color;
892
+ let colorBr = color;
893
+
894
+ // Fast-path: Check if any complex color props are present
895
+ // We check values directly to avoid destructuring
896
+ if (
897
+ props.colorTop !== undefined ||
898
+ props.colorBottom !== undefined ||
899
+ props.colorLeft !== undefined ||
900
+ props.colorRight !== undefined ||
901
+ props.colorTl !== undefined ||
902
+ props.colorTr !== undefined ||
903
+ props.colorBl !== undefined ||
904
+ props.colorBr !== undefined
905
+ ) {
906
+ const {
907
+ colorTop: top,
908
+ colorBottom: bottom,
909
+ colorLeft: left,
910
+ colorRight: right,
911
+ } = props;
912
+
913
+ colorTop = top ?? color;
914
+ colorBottom = bottom ?? color;
915
+ colorLeft = left ?? color;
916
+ colorRight = right ?? color;
917
+
918
+ colorTl = props.colorTl ?? top ?? left ?? color;
919
+ colorTr = props.colorTr ?? top ?? right ?? color;
920
+ colorBl = props.colorBl ?? bottom ?? left ?? color;
921
+ colorBr = props.colorBr ?? bottom ?? right ?? color;
670
922
  }
671
923
 
924
+ const scale = props.scale ?? null;
925
+ const mount = props.mount ?? 0;
926
+ const pivot = props.pivot ?? 0.5;
927
+
928
+ const data =
929
+ !isProductionEnvironment && this.options.inspector
930
+ ? santizeCustomDataMap(props.data ?? {})
931
+ : {};
932
+
672
933
  return {
673
934
  x: props.x ?? 0,
674
935
  y: props.y ?? 0,
675
- width: props.width ?? 0,
676
- height: props.height ?? 0,
936
+ w: props.w ?? 0,
937
+ h: props.h ?? 0,
677
938
  alpha: props.alpha ?? 1,
678
939
  autosize: props.autosize ?? false,
679
940
  boundsMargin: props.boundsMargin ?? null,
680
941
  clipping: props.clipping ?? false,
681
942
  color,
682
- colorTop: props.colorTop ?? color,
683
- colorBottom: props.colorBottom ?? color,
684
- colorLeft: props.colorLeft ?? color,
685
- colorRight: props.colorRight ?? color,
686
- colorBl,
687
- colorBr,
943
+ colorTop,
944
+ colorBottom,
945
+ colorLeft,
946
+ colorRight,
688
947
  colorTl,
689
948
  colorTr,
949
+ colorBl,
950
+ colorBr,
690
951
  zIndex: props.zIndex ?? 0,
691
- zIndexLocked: props.zIndexLocked ?? 0,
692
952
  parent: props.parent ?? null,
693
953
  texture: props.texture ?? null,
694
954
  textureOptions: props.textureOptions ?? {},
695
955
  shader: props.shader ?? this.defShaderNode,
696
- // Since setting the `src` will trigger a texture load, we need to set it after
697
- // we set the texture. Otherwise, problems happen.
698
956
  src: props.src ?? null,
699
957
  srcHeight: props.srcHeight,
700
958
  srcWidth: props.srcWidth,
701
959
  srcX: props.srcX,
702
960
  srcY: props.srcY,
703
- scale: props.scale ?? null,
704
- scaleX: props.scaleX ?? props.scale ?? 1,
705
- scaleY: props.scaleY ?? props.scale ?? 1,
706
- mount: props.mount ?? 0,
707
- mountX: props.mountX ?? props.mount ?? 0,
708
- mountY: props.mountY ?? props.mount ?? 0,
709
- pivot: props.pivot ?? 0.5,
710
- pivotX: props.pivotX ?? props.pivot ?? 0.5,
711
- pivotY: props.pivotY ?? props.pivot ?? 0.5,
961
+ scale,
962
+ scaleX: props.scaleX ?? scale ?? 1,
963
+ scaleY: props.scaleY ?? scale ?? 1,
964
+ mount,
965
+ mountX: props.mountX ?? mount,
966
+ mountY: props.mountY ?? mount,
967
+ pivot,
968
+ pivotX: props.pivotX ?? pivot,
969
+ pivotY: props.pivotY ?? pivot,
712
970
  rotation: props.rotation ?? 0,
713
971
  rtt: props.rtt ?? false,
714
- data: data,
715
- preventCleanup: props.preventCleanup ?? false,
972
+ data,
716
973
  imageType: props.imageType,
717
- strictBounds: props.strictBounds ?? this.strictBounds,
974
+ interactive: props.interactive ?? false,
718
975
  };
719
976
  }
720
977
 
@@ -724,8 +981,8 @@ export class Stage {
724
981
  * @remarks
725
982
  * This method is used to cleanup orphaned textures that are no longer in use.
726
983
  */
727
- cleanup(aggressive: boolean) {
728
- this.txMemManager.cleanup(aggressive);
984
+ cleanup(full: boolean = false) {
985
+ this.txMemManager.cleanup(full);
729
986
  }
730
987
 
731
988
  set clearColor(value: number) {
@@ -737,4 +994,37 @@ export class Stage {
737
994
  get clearColor() {
738
995
  return this.clrColor;
739
996
  }
997
+
998
+ /**
999
+ * Load a font using a specific text renderer type
1000
+ *
1001
+ * @remarks
1002
+ * This method allows consumers to explicitly load fonts for a specific
1003
+ * text renderer type (e.g., 'canvas', 'sdf'). Consumers must specify
1004
+ * the renderer type to ensure fonts are loaded with the correct pipeline.
1005
+ *
1006
+ * For Canvas fonts, provide fontUrl (e.g., .ttf, .woff, .woff2)
1007
+ * For SDF fonts, provide atlasUrl (image) and atlasDataUrl (JSON glyph data)
1008
+ *
1009
+ * @param rendererType - The type of text renderer ('canvas', 'sdf', etc.)
1010
+ * @param options - Font loading options specific to the renderer type
1011
+ * @returns Promise that resolves when the font is loaded
1012
+ */
1013
+ async loadFont(
1014
+ rendererType: TextRenderers,
1015
+ options: FontLoadOptions,
1016
+ ): Promise<void> {
1017
+ const rendererTypeKey = String(rendererType);
1018
+ const fontHandler = this.fontHandlers[rendererTypeKey];
1019
+
1020
+ if (!fontHandler) {
1021
+ throw new Error(
1022
+ `Font handler for renderer type '${rendererTypeKey}' not found. Available types: ${Object.keys(
1023
+ this.fontHandlers,
1024
+ ).join(', ')}`,
1025
+ );
1026
+ }
1027
+
1028
+ return fontHandler.loadFont(this, options);
1029
+ }
740
1030
  }