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