@lightningjs/renderer 3.0.0-beta1 → 3.0.0-beta11

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