@lightningjs/renderer 3.0.0-beta2 → 3.0.0-beta20

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