@solidtv/renderer 1.0.0

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