@lightningjs/renderer 3.0.0-beta2 → 3.0.0-beta21

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