@lightningjs/renderer 3.0.0-beta9 → 3.0.1

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 (541) hide show
  1. package/LICENSE +202 -202
  2. package/NOTICE +3 -3
  3. package/README.md +230 -147
  4. package/dist/exports/canvas.d.ts +1 -1
  5. package/dist/exports/canvas.js +1 -1
  6. package/dist/exports/canvas.js.map +1 -1
  7. package/dist/exports/index.d.ts +5 -6
  8. package/dist/exports/index.js +3 -5
  9. package/dist/exports/index.js.map +1 -1
  10. package/dist/exports/platform.d.ts +7 -0
  11. package/dist/exports/platform.js +27 -0
  12. package/dist/exports/platform.js.map +1 -0
  13. package/dist/exports/webgl.d.ts +2 -1
  14. package/dist/exports/webgl.js +2 -1
  15. package/dist/exports/webgl.js.map +1 -1
  16. package/dist/src/common/CommonTypes.d.ts +15 -3
  17. package/dist/src/core/Autosizer.d.ts +35 -0
  18. package/dist/src/core/Autosizer.js +196 -0
  19. package/dist/src/core/Autosizer.js.map +1 -0
  20. package/dist/src/core/CoreNode.d.ts +107 -59
  21. package/dist/src/core/CoreNode.js +524 -282
  22. package/dist/src/core/CoreNode.js.map +1 -1
  23. package/dist/src/core/CoreTextNode.d.ts +73 -88
  24. package/dist/src/core/CoreTextNode.js +383 -236
  25. package/dist/src/core/CoreTextNode.js.map +1 -1
  26. package/dist/src/core/CoreTextureManager.d.ts +19 -17
  27. package/dist/src/core/CoreTextureManager.js +52 -120
  28. package/dist/src/core/CoreTextureManager.js.map +1 -1
  29. package/dist/src/core/Stage.d.ts +63 -9
  30. package/dist/src/core/Stage.js +233 -133
  31. package/dist/src/core/Stage.js.map +1 -1
  32. package/dist/src/core/TextureError.d.ts +11 -0
  33. package/dist/src/core/TextureError.js +37 -0
  34. package/dist/src/core/TextureError.js.map +1 -0
  35. package/dist/src/core/TextureMemoryManager.d.ts +2 -4
  36. package/dist/src/core/TextureMemoryManager.js +80 -113
  37. package/dist/src/core/TextureMemoryManager.js.map +1 -1
  38. package/dist/src/core/animations/CoreAnimation.d.ts +3 -3
  39. package/dist/src/core/animations/CoreAnimation.js +3 -3
  40. package/dist/src/core/animations/CoreAnimation.js.map +1 -1
  41. package/dist/src/core/animations/CoreAnimationController.d.ts +1 -1
  42. package/dist/src/core/animations/CoreAnimationController.js +4 -2
  43. package/dist/src/core/animations/CoreAnimationController.js.map +1 -1
  44. package/dist/src/core/lib/ImageWorker.js +1 -1
  45. package/dist/src/core/lib/ImageWorker.js.map +1 -1
  46. package/dist/src/core/lib/WebGlContextWrapper.d.ts +69 -97
  47. package/dist/src/core/lib/WebGlContextWrapper.js +192 -152
  48. package/dist/src/core/lib/WebGlContextWrapper.js.map +1 -1
  49. package/dist/src/core/lib/collectionUtils.d.ts +4 -0
  50. package/dist/src/core/lib/collectionUtils.js +72 -0
  51. package/dist/src/core/lib/collectionUtils.js.map +1 -0
  52. package/dist/src/core/lib/colorCache.d.ts +1 -0
  53. package/dist/src/core/lib/colorCache.js +19 -0
  54. package/dist/src/core/lib/colorCache.js.map +1 -0
  55. package/dist/src/core/lib/colorParser.d.ts +21 -0
  56. package/dist/src/core/lib/colorParser.js +72 -0
  57. package/dist/src/core/lib/colorParser.js.map +1 -0
  58. package/dist/src/core/lib/textureCompression.d.ts +14 -2
  59. package/dist/src/core/lib/textureCompression.js +311 -67
  60. package/dist/src/core/lib/textureCompression.js.map +1 -1
  61. package/dist/src/core/lib/utils.d.ts +6 -6
  62. package/dist/src/core/lib/utils.js +21 -65
  63. package/dist/src/core/lib/utils.js.map +1 -1
  64. package/dist/src/core/lib/validateImageBitmap.d.ts +1 -2
  65. package/dist/src/core/lib/validateImageBitmap.js +4 -4
  66. package/dist/src/core/lib/validateImageBitmap.js.map +1 -1
  67. package/dist/src/core/platform.d.ts +10 -0
  68. package/dist/src/core/platform.js +84 -0
  69. package/dist/src/core/platform.js.map +1 -0
  70. package/dist/src/core/platforms/GlContextWrapper.d.ts +136 -0
  71. package/{src/core/text-rendering/TextRenderingUtils.ts → dist/src/core/platforms/GlContextWrapper.js} +32 -36
  72. package/dist/src/core/platforms/GlContextWrapper.js.map +1 -0
  73. package/dist/src/core/platforms/Platform.d.ts +78 -12
  74. package/dist/src/core/platforms/Platform.js +18 -0
  75. package/dist/src/core/platforms/Platform.js.map +1 -1
  76. package/dist/src/core/platforms/web/WebGlContextWrapper.d.ts +776 -0
  77. package/dist/src/core/platforms/web/WebGlContextWrapper.js +1208 -0
  78. package/dist/src/core/platforms/web/WebGlContextWrapper.js.map +1 -0
  79. package/dist/src/core/platforms/web/WebPlatform.d.ts +17 -2
  80. package/dist/src/core/platforms/web/WebPlatform.js +158 -13
  81. package/dist/src/core/platforms/web/WebPlatform.js.map +1 -1
  82. package/dist/src/core/platforms/web/WebPlatformChrome50.d.ts +19 -0
  83. package/dist/src/core/platforms/web/WebPlatformChrome50.js +54 -0
  84. package/dist/src/core/platforms/web/WebPlatformChrome50.js.map +1 -0
  85. package/dist/src/core/platforms/web/WebPlatformLegacy.d.ts +20 -0
  86. package/dist/src/core/platforms/web/WebPlatformLegacy.js +105 -0
  87. package/dist/src/core/platforms/web/WebPlatformLegacy.js.map +1 -0
  88. package/dist/src/core/platforms/web/WebPlatformNext.d.ts +21 -0
  89. package/dist/src/core/platforms/web/WebPlatformNext.js +52 -0
  90. package/dist/src/core/platforms/web/WebPlatformNext.js.map +1 -0
  91. package/dist/src/core/platforms/web/lib/ImageWorker.d.ts +21 -0
  92. package/dist/src/core/platforms/web/lib/ImageWorker.js +136 -0
  93. package/dist/src/core/platforms/web/lib/ImageWorker.js.map +1 -0
  94. package/dist/src/core/platforms/web/lib/ImageWorkerDefault.d.ts +6 -0
  95. package/dist/src/core/platforms/web/lib/ImageWorkerDefault.js +92 -0
  96. package/dist/src/core/platforms/web/lib/ImageWorkerDefault.js.map +1 -0
  97. package/dist/src/core/platforms/web/lib/ImageWorkerLegacy.d.ts +1 -0
  98. package/dist/src/core/platforms/web/lib/ImageWorkerLegacy.js +63 -0
  99. package/dist/src/core/platforms/web/lib/ImageWorkerLegacy.js.map +1 -0
  100. package/dist/src/core/platforms/web/lib/ImageWorkerNoOptions.d.ts +7 -0
  101. package/dist/src/core/platforms/web/lib/ImageWorkerNoOptions.js +75 -0
  102. package/dist/src/core/platforms/web/lib/ImageWorkerNoOptions.js.map +1 -0
  103. package/dist/src/core/platforms/web/lib/createImageBitmap.d.ts +1 -0
  104. package/dist/src/core/platforms/web/lib/createImageBitmap.js +27 -0
  105. package/dist/src/core/platforms/web/lib/createImageBitmap.js.map +1 -0
  106. package/dist/src/core/platforms/web/lib/textureCompression.d.ts +26 -0
  107. package/dist/src/core/platforms/web/lib/textureCompression.js +301 -0
  108. package/dist/src/core/platforms/web/lib/textureCompression.js.map +1 -0
  109. package/dist/src/core/platforms/web/lib/textureSvg.d.ts +7 -0
  110. package/dist/src/core/platforms/web/lib/textureSvg.js +51 -0
  111. package/dist/src/core/platforms/web/lib/textureSvg.js.map +1 -0
  112. package/dist/src/core/platforms/web/lib/utils.d.ts +5 -0
  113. package/dist/src/core/platforms/web/lib/utils.js +86 -0
  114. package/dist/src/core/platforms/web/lib/utils.js.map +1 -0
  115. package/dist/src/core/renderers/CoreContextTexture.d.ts +2 -1
  116. package/dist/src/core/renderers/CoreContextTexture.js.map +1 -1
  117. package/dist/src/core/renderers/CoreRenderer.d.ts +4 -40
  118. package/dist/src/core/renderers/CoreRenderer.js +3 -4
  119. package/dist/src/core/renderers/CoreRenderer.js.map +1 -1
  120. package/dist/src/core/renderers/CoreShader.d.ts +9 -0
  121. package/{src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.ts → dist/src/core/renderers/CoreShader.js} +28 -32
  122. package/dist/src/core/renderers/CoreShader.js.map +1 -0
  123. package/dist/src/core/renderers/CoreShaderNode.d.ts +10 -0
  124. package/dist/src/core/renderers/CoreShaderNode.js +19 -2
  125. package/dist/src/core/renderers/CoreShaderNode.js.map +1 -1
  126. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.d.ts +33 -0
  127. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.js +250 -0
  128. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.js.map +1 -0
  129. package/dist/src/core/renderers/canvas/CanvasCoreTexture.d.ts +17 -0
  130. package/dist/src/core/renderers/canvas/CanvasCoreTexture.js +125 -0
  131. package/dist/src/core/renderers/canvas/CanvasCoreTexture.js.map +1 -0
  132. package/dist/src/core/renderers/canvas/CanvasRenderer.d.ts +5 -6
  133. package/dist/src/core/renderers/canvas/CanvasRenderer.js +67 -91
  134. package/dist/src/core/renderers/canvas/CanvasRenderer.js.map +1 -1
  135. package/dist/src/core/renderers/canvas/CanvasShaderNode.d.ts +1 -2
  136. package/dist/src/core/renderers/canvas/CanvasShaderNode.js +5 -4
  137. package/dist/src/core/renderers/canvas/CanvasShaderNode.js.map +1 -1
  138. package/dist/src/core/renderers/canvas/CanvasTexture.d.ts +3 -2
  139. package/dist/src/core/renderers/canvas/CanvasTexture.js +17 -13
  140. package/dist/src/core/renderers/canvas/CanvasTexture.js.map +1 -1
  141. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.d.ts +13 -0
  142. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.js +113 -192
  143. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.js.map +1 -1
  144. package/dist/src/core/renderers/canvas/internal/ColorUtils.d.ts +0 -2
  145. package/dist/src/core/renderers/canvas/internal/ColorUtils.js +0 -14
  146. package/dist/src/core/renderers/canvas/internal/ColorUtils.js.map +1 -1
  147. package/dist/src/core/renderers/canvas/shaders/UnsupportedShader.d.ts +10 -0
  148. package/{src/core/text-rendering/renderers/SdfTextRenderer/internal/util.ts → dist/src/core/renderers/canvas/shaders/UnsupportedShader.js} +43 -40
  149. package/dist/src/core/renderers/canvas/shaders/UnsupportedShader.js.map +1 -0
  150. package/dist/src/core/renderers/webgl/SdfRenderOp.d.ts +33 -0
  151. package/dist/src/core/renderers/webgl/SdfRenderOp.js +98 -0
  152. package/dist/src/core/renderers/webgl/SdfRenderOp.js.map +1 -0
  153. package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.d.ts +12 -0
  154. package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.js +58 -0
  155. package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.js.map +1 -0
  156. package/dist/src/core/renderers/webgl/WebGlCoreCtxSubTexture.d.ts +9 -0
  157. package/dist/src/core/renderers/webgl/WebGlCoreCtxSubTexture.js +38 -0
  158. package/dist/src/core/renderers/webgl/WebGlCoreCtxSubTexture.js.map +1 -0
  159. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.d.ts +69 -0
  160. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js +272 -0
  161. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js.map +1 -0
  162. package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.d.ts +34 -0
  163. package/dist/src/core/renderers/webgl/{WebGlRenderOp.js → WebGlCoreRenderOp.js} +43 -47
  164. package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.js.map +1 -0
  165. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.d.ts +133 -0
  166. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js +649 -0
  167. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js.map +1 -0
  168. package/dist/src/core/renderers/webgl/WebGlCoreShader.d.ts +78 -0
  169. package/dist/src/core/renderers/webgl/WebGlCoreShader.destroy.d.ts +1 -0
  170. package/dist/src/core/renderers/webgl/WebGlCoreShader.destroy.js +2 -0
  171. package/dist/src/core/renderers/webgl/WebGlCoreShader.destroy.js.map +1 -0
  172. package/dist/src/core/renderers/webgl/WebGlCoreShader.js +202 -0
  173. package/dist/src/core/renderers/webgl/WebGlCoreShader.js.map +1 -0
  174. package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.d.ts +4 -2
  175. package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.js +14 -6
  176. package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.js.map +1 -1
  177. package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.d.ts +15 -2
  178. package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.js +34 -5
  179. package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.js.map +1 -1
  180. package/dist/src/core/renderers/webgl/WebGlCtxTexture.d.ts +19 -9
  181. package/dist/src/core/renderers/webgl/WebGlCtxTexture.js +101 -49
  182. package/dist/src/core/renderers/webgl/WebGlCtxTexture.js.map +1 -1
  183. package/dist/src/core/renderers/webgl/WebGlRenderer.d.ts +11 -23
  184. package/dist/src/core/renderers/webgl/WebGlRenderer.js +124 -133
  185. package/dist/src/core/renderers/webgl/WebGlRenderer.js.map +1 -1
  186. package/dist/src/core/renderers/webgl/WebGlShaderNode.d.ts +4 -6
  187. package/dist/src/core/renderers/webgl/WebGlShaderNode.js +3 -3
  188. package/dist/src/core/renderers/webgl/WebGlShaderNode.js.map +1 -1
  189. package/dist/src/core/renderers/webgl/WebGlShaderProgram.d.ts +7 -7
  190. package/dist/src/core/renderers/webgl/WebGlShaderProgram.js +60 -38
  191. package/dist/src/core/renderers/webgl/WebGlShaderProgram.js.map +1 -1
  192. package/dist/src/core/renderers/webgl/internal/RendererUtils.d.ts +4 -4
  193. package/dist/src/core/renderers/webgl/internal/RendererUtils.js +1 -2
  194. package/dist/src/core/renderers/webgl/internal/RendererUtils.js.map +1 -1
  195. package/dist/src/core/renderers/webgl/internal/ShaderUtils.d.ts +3 -3
  196. package/dist/src/core/renderers/webgl/internal/ShaderUtils.js +38 -37
  197. package/dist/src/core/renderers/webgl/internal/ShaderUtils.js.map +1 -1
  198. package/dist/src/core/renderers/webgl/shaders/DefaultShader.d.ts +9 -0
  199. package/dist/src/core/renderers/webgl/shaders/DefaultShader.js +84 -0
  200. package/dist/src/core/renderers/webgl/shaders/DefaultShader.js.map +1 -0
  201. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.d.ts +10 -0
  202. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.js +108 -0
  203. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.js.map +1 -0
  204. package/dist/src/core/renderers/webgl/shaders/DynamicShader.d.ts +29 -0
  205. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js +408 -0
  206. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js.map +1 -0
  207. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.d.ts +28 -0
  208. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.js +126 -0
  209. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.js.map +1 -0
  210. package/dist/src/core/renderers/webgl/shaders/SdfShader.d.ts +47 -0
  211. package/dist/src/core/renderers/webgl/shaders/SdfShader.js +148 -0
  212. package/dist/src/core/renderers/webgl/shaders/SdfShader.js.map +1 -0
  213. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.d.ts +31 -0
  214. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.js +71 -0
  215. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.js.map +1 -0
  216. package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.d.ts +30 -0
  217. package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.js +58 -0
  218. package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.js.map +1 -0
  219. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.d.ts +31 -0
  220. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.js +71 -0
  221. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.js.map +1 -0
  222. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.d.ts +31 -0
  223. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.js +71 -0
  224. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.js.map +1 -0
  225. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.d.ts +31 -0
  226. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.js +71 -0
  227. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.js.map +1 -0
  228. package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.d.ts +9 -0
  229. package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.js +136 -0
  230. package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.js.map +1 -0
  231. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.d.ts +36 -0
  232. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.js +85 -0
  233. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.js.map +1 -0
  234. package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.d.ts +45 -0
  235. package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.js +104 -0
  236. package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.js.map +1 -0
  237. package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.d.ts +22 -0
  238. package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.js +45 -0
  239. package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.js.map +1 -0
  240. package/dist/src/core/renderers/webgl/shaders/effects/HolePunchEffect.d.ts +58 -0
  241. package/dist/src/core/renderers/webgl/shaders/effects/HolePunchEffect.js +80 -0
  242. package/dist/src/core/renderers/webgl/shaders/effects/HolePunchEffect.js.map +1 -0
  243. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.d.ts +34 -0
  244. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js +113 -0
  245. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js.map +1 -0
  246. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.d.ts +40 -0
  247. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js +126 -0
  248. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js.map +1 -0
  249. package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.d.ts +61 -0
  250. package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.js +127 -0
  251. package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.js.map +1 -0
  252. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.d.ts +40 -0
  253. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.js +71 -0
  254. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.js.map +1 -0
  255. package/dist/src/core/renderers/webgl/shaders/effects/ShaderEffect.d.ts +115 -0
  256. package/dist/src/core/renderers/webgl/shaders/effects/ShaderEffect.js +61 -0
  257. package/dist/src/core/renderers/webgl/shaders/effects/ShaderEffect.js.map +1 -0
  258. package/dist/src/core/shaders/canvas/Border.d.ts +8 -2
  259. package/dist/src/core/shaders/canvas/Border.js +64 -25
  260. package/dist/src/core/shaders/canvas/Border.js.map +1 -1
  261. package/dist/src/core/shaders/canvas/HolePunch.js +4 -3
  262. package/dist/src/core/shaders/canvas/HolePunch.js.map +1 -1
  263. package/dist/src/core/shaders/canvas/LinearGradient.js +7 -5
  264. package/dist/src/core/shaders/canvas/LinearGradient.js.map +1 -1
  265. package/dist/src/core/shaders/canvas/RadialGradient.js +12 -10
  266. package/dist/src/core/shaders/canvas/RadialGradient.js.map +1 -1
  267. package/dist/src/core/shaders/canvas/Rounded.js +3 -3
  268. package/dist/src/core/shaders/canvas/Rounded.js.map +1 -1
  269. package/dist/src/core/shaders/canvas/RoundedWithBorder.d.ts +6 -3
  270. package/dist/src/core/shaders/canvas/RoundedWithBorder.js +41 -11
  271. package/dist/src/core/shaders/canvas/RoundedWithBorder.js.map +1 -1
  272. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.d.ts +2 -3
  273. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.js +46 -9
  274. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.js.map +1 -1
  275. package/dist/src/core/shaders/canvas/RoundedWithShadow.js +6 -5
  276. package/dist/src/core/shaders/canvas/RoundedWithShadow.js.map +1 -1
  277. package/dist/src/core/shaders/canvas/Shadow.js +4 -2
  278. package/dist/src/core/shaders/canvas/Shadow.js.map +1 -1
  279. package/dist/src/core/shaders/canvas/utils/render.d.ts +1 -1
  280. package/dist/src/core/shaders/canvas/utils/render.js +31 -18
  281. package/dist/src/core/shaders/canvas/utils/render.js.map +1 -1
  282. package/dist/src/core/shaders/templates/BorderTemplate.d.ts +11 -1
  283. package/dist/src/core/shaders/templates/BorderTemplate.js +30 -10
  284. package/dist/src/core/shaders/templates/BorderTemplate.js.map +1 -1
  285. package/dist/src/core/shaders/templates/HolePunchTemplate.d.ts +2 -2
  286. package/dist/src/core/shaders/templates/HolePunchTemplate.js +2 -2
  287. package/dist/src/core/shaders/templates/HolePunchTemplate.js.map +1 -1
  288. package/dist/src/core/shaders/templates/RadialGradientTemplate.d.ts +8 -6
  289. package/dist/src/core/shaders/templates/RadialGradientTemplate.js +2 -2
  290. package/dist/src/core/shaders/templates/RadialGradientTemplate.js.map +1 -1
  291. package/dist/src/core/shaders/webgl/Border.js +138 -84
  292. package/dist/src/core/shaders/webgl/Border.js.map +1 -1
  293. package/dist/src/core/shaders/webgl/Default.js +46 -47
  294. package/dist/src/core/shaders/webgl/Default.js.map +1 -1
  295. package/dist/src/core/shaders/webgl/DefaultBatched.js +61 -61
  296. package/dist/src/core/shaders/webgl/HolePunch.js +34 -34
  297. package/dist/src/core/shaders/webgl/HolePunch.js.map +1 -1
  298. package/dist/src/core/shaders/webgl/LinearGradient.js +60 -36
  299. package/dist/src/core/shaders/webgl/LinearGradient.js.map +1 -1
  300. package/dist/src/core/shaders/webgl/RadialGradient.js +60 -37
  301. package/dist/src/core/shaders/webgl/RadialGradient.js.map +1 -1
  302. package/dist/src/core/shaders/webgl/Rounded.js +74 -72
  303. package/dist/src/core/shaders/webgl/Rounded.js.map +1 -1
  304. package/dist/src/core/shaders/webgl/RoundedWithBorder.js +172 -113
  305. package/dist/src/core/shaders/webgl/RoundedWithBorder.js.map +1 -1
  306. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js +191 -132
  307. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js.map +1 -1
  308. package/dist/src/core/shaders/webgl/RoundedWithShadow.js +57 -55
  309. package/dist/src/core/shaders/webgl/RoundedWithShadow.js.map +1 -1
  310. package/dist/src/core/shaders/webgl/SdfShader.d.ts +0 -2
  311. package/dist/src/core/shaders/webgl/SdfShader.js +56 -66
  312. package/dist/src/core/shaders/webgl/SdfShader.js.map +1 -1
  313. package/dist/src/core/shaders/webgl/Shadow.js +89 -83
  314. package/dist/src/core/shaders/webgl/Shadow.js.map +1 -1
  315. package/dist/src/core/text-rendering/CanvasFontHandler.d.ts +59 -0
  316. package/dist/src/core/text-rendering/CanvasFontHandler.js +224 -0
  317. package/dist/src/core/text-rendering/CanvasFontHandler.js.map +1 -0
  318. package/dist/src/core/text-rendering/CanvasTextRenderer.d.ts +17 -0
  319. package/dist/src/core/text-rendering/CanvasTextRenderer.js +157 -0
  320. package/dist/src/core/text-rendering/CanvasTextRenderer.js.map +1 -0
  321. package/dist/src/core/text-rendering/SdfFontHandler.d.ts +182 -0
  322. package/dist/src/core/text-rendering/SdfFontHandler.js +379 -0
  323. package/dist/src/core/text-rendering/SdfFontHandler.js.map +1 -0
  324. package/dist/src/core/text-rendering/SdfTextRenderer.d.ts +17 -0
  325. package/dist/src/core/text-rendering/SdfTextRenderer.js +301 -0
  326. package/dist/src/core/text-rendering/SdfTextRenderer.js.map +1 -0
  327. package/dist/src/core/text-rendering/TextLayoutEngine.d.ts +18 -0
  328. package/dist/src/core/text-rendering/TextLayoutEngine.js +380 -0
  329. package/dist/src/core/text-rendering/TextLayoutEngine.js.map +1 -0
  330. package/dist/src/core/text-rendering/TextRenderer.d.ts +383 -0
  331. package/{src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.ts → dist/src/core/text-rendering/TextRenderer.js} +20 -38
  332. package/dist/src/core/text-rendering/TextRenderer.js.map +1 -0
  333. package/dist/src/core/text-rendering/TextTextureRendererUtils.js.map +1 -1
  334. package/dist/src/core/text-rendering/Utils.d.ts +30 -0
  335. package/dist/src/core/text-rendering/Utils.js +84 -0
  336. package/dist/src/core/text-rendering/Utils.js.map +1 -0
  337. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js +2 -2
  338. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js.map +1 -1
  339. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js +0 -5
  340. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js.map +1 -1
  341. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.d.ts +1 -7
  342. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js +2 -50
  343. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js.map +1 -1
  344. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.d.ts +3 -2
  345. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js +87 -46
  346. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js.map +1 -1
  347. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.d.ts +1 -1
  348. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js +8 -66
  349. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js.map +1 -1
  350. package/dist/src/core/text-rendering/renderers/TextRenderer.d.ts +4 -14
  351. package/dist/src/core/text-rendering/renderers/TextRenderer.js +0 -3
  352. package/dist/src/core/text-rendering/renderers/TextRenderer.js.map +1 -1
  353. package/dist/src/core/textures/ColorTexture.d.ts +1 -1
  354. package/dist/src/core/textures/ColorTexture.js +3 -4
  355. package/dist/src/core/textures/ColorTexture.js.map +1 -1
  356. package/dist/src/core/textures/ImageTexture.d.ts +33 -14
  357. package/dist/src/core/textures/ImageTexture.js +46 -125
  358. package/dist/src/core/textures/ImageTexture.js.map +1 -1
  359. package/dist/src/core/textures/NoiseTexture.d.ts +3 -3
  360. package/dist/src/core/textures/NoiseTexture.js +8 -8
  361. package/dist/src/core/textures/NoiseTexture.js.map +1 -1
  362. package/dist/src/core/textures/RenderTexture.d.ts +7 -7
  363. package/dist/src/core/textures/RenderTexture.js +12 -12
  364. package/dist/src/core/textures/RenderTexture.js.map +1 -1
  365. package/dist/src/core/textures/SubTexture.d.ts +6 -8
  366. package/dist/src/core/textures/SubTexture.js +22 -40
  367. package/dist/src/core/textures/SubTexture.js.map +1 -1
  368. package/dist/src/core/textures/Texture.d.ts +74 -15
  369. package/dist/src/core/textures/Texture.js +131 -19
  370. package/dist/src/core/textures/Texture.js.map +1 -1
  371. package/dist/src/core/utils.d.ts +2 -1
  372. package/dist/src/core/utils.js +1 -1
  373. package/dist/src/core/utils.js.map +1 -1
  374. package/dist/src/main-api/DynamicShaderController.d.ts +29 -0
  375. package/dist/src/main-api/DynamicShaderController.js +58 -0
  376. package/dist/src/main-api/DynamicShaderController.js.map +1 -0
  377. package/dist/src/main-api/Inspector.d.ts +129 -1
  378. package/dist/src/main-api/Inspector.js +462 -23
  379. package/dist/src/main-api/Inspector.js.map +1 -1
  380. package/dist/src/main-api/Renderer.d.ts +223 -41
  381. package/dist/src/main-api/Renderer.js +107 -62
  382. package/dist/src/main-api/Renderer.js.map +1 -1
  383. package/dist/src/main-api/ShaderController.d.ts +31 -0
  384. package/dist/src/main-api/ShaderController.js +37 -0
  385. package/dist/src/main-api/ShaderController.js.map +1 -0
  386. package/dist/src/utils.d.ts +0 -2
  387. package/dist/src/utils.js +0 -36
  388. package/dist/src/utils.js.map +1 -1
  389. package/dist/tsconfig.dist.tsbuildinfo +1 -1
  390. package/exports/canvas-shaders.ts +28 -28
  391. package/exports/canvas.ts +45 -45
  392. package/exports/index.ts +90 -90
  393. package/exports/inspector.ts +24 -24
  394. package/exports/platform.ts +31 -0
  395. package/exports/utils.ts +50 -50
  396. package/exports/webgl-shaders.ts +28 -28
  397. package/exports/webgl.ts +52 -50
  398. package/package.json +16 -15
  399. package/src/common/CommonTypes.ts +163 -146
  400. package/src/common/EventEmitter.ts +77 -77
  401. package/src/common/IAnimationController.ts +92 -92
  402. package/src/common/IEventEmitter.ts +28 -28
  403. package/src/core/Autosizer.ts +224 -0
  404. package/src/core/CoreNode.test.ts +365 -202
  405. package/src/core/CoreNode.ts +2785 -2489
  406. package/src/core/CoreShaderManager.ts +188 -188
  407. package/src/core/CoreTextNode.test.ts +311 -0
  408. package/src/core/CoreTextNode.ts +607 -451
  409. package/src/core/CoreTextureManager.ts +484 -548
  410. package/src/core/Stage.ts +927 -800
  411. package/src/core/TextureError.ts +46 -0
  412. package/src/core/TextureMemoryManager.ts +418 -462
  413. package/src/core/animations/AnimationManager.ts +38 -38
  414. package/src/core/animations/CoreAnimation.ts +290 -291
  415. package/src/core/animations/CoreAnimationController.ts +169 -166
  416. package/src/core/lib/ContextSpy.ts +41 -41
  417. package/src/core/lib/Matrix3d.ts +244 -244
  418. package/src/core/lib/RenderCoords.ts +71 -71
  419. package/src/core/lib/collectionUtils.ts +83 -0
  420. package/src/core/lib/colorCache.ts +20 -0
  421. package/src/core/{renderers/canvas/internal/ColorUtils.ts → lib/colorParser.ts} +85 -85
  422. package/src/core/lib/utils.ts +337 -390
  423. package/src/core/platforms/GlContextWrapper.ts +291 -0
  424. package/src/core/platforms/Platform.ts +176 -77
  425. package/src/core/{lib → platforms/web}/WebGlContextWrapper.ts +1547 -1368
  426. package/src/core/platforms/web/WebPlatform.ts +306 -84
  427. package/src/core/platforms/web/WebPlatformChrome50.ts +63 -0
  428. package/src/core/platforms/web/WebPlatformLegacy.ts +150 -0
  429. package/src/core/platforms/web/WebPlatformNext.ts +57 -0
  430. package/src/core/platforms/web/lib/ImageWorker.ts +192 -0
  431. package/src/core/platforms/web/lib/ImageWorkerDefault.ts +117 -0
  432. package/src/core/platforms/web/lib/ImageWorkerLegacy.ts +87 -0
  433. package/src/core/platforms/web/lib/ImageWorkerNoOptions.ts +99 -0
  434. package/src/core/platforms/web/lib/createImageBitmap.ts +40 -0
  435. package/src/core/platforms/web/lib/textureCompression.ts +391 -0
  436. package/src/core/{lib → platforms/web/lib}/textureSvg.ts +66 -78
  437. package/src/core/platforms/web/lib/utils.ts +105 -0
  438. package/src/core/renderers/CoreContextTexture.ts +44 -43
  439. package/src/core/renderers/CoreRenderOp.ts +22 -22
  440. package/src/core/renderers/CoreRenderer.ts +71 -110
  441. package/src/core/renderers/CoreShaderNode.ts +202 -175
  442. package/src/core/renderers/CoreShaderProgram.ts +23 -23
  443. package/src/core/renderers/canvas/CanvasRenderer.ts +258 -302
  444. package/src/core/renderers/canvas/CanvasShaderNode.ts +95 -96
  445. package/src/core/renderers/canvas/CanvasTexture.ts +160 -156
  446. package/src/core/renderers/webgl/SdfRenderOp.ts +106 -0
  447. package/src/core/renderers/webgl/WebGlCtxRenderTexture.ts +89 -86
  448. package/src/core/renderers/webgl/WebGlCtxSubTexture.ts +95 -50
  449. package/src/core/renderers/webgl/WebGlCtxTexture.test.ts +113 -0
  450. package/src/core/renderers/webgl/WebGlCtxTexture.ts +350 -298
  451. package/src/core/renderers/webgl/WebGlRenderer.ts +727 -747
  452. package/src/core/renderers/webgl/WebGlShaderNode.ts +430 -435
  453. package/src/core/renderers/webgl/WebGlShaderProgram.ts +364 -341
  454. package/src/core/renderers/webgl/internal/BufferCollection.ts +54 -54
  455. package/src/core/renderers/webgl/internal/RendererUtils.ts +150 -155
  456. package/src/core/renderers/webgl/internal/ShaderUtils.ts +283 -281
  457. package/src/core/renderers/webgl/internal/WebGlUtils.ts +35 -35
  458. package/src/core/shaders/canvas/Border.ts +132 -78
  459. package/src/core/shaders/canvas/HolePunch.ts +56 -62
  460. package/src/core/shaders/canvas/LinearGradient.ts +73 -71
  461. package/src/core/shaders/canvas/RadialGradient.ts +96 -99
  462. package/src/core/shaders/canvas/Rounded.ts +55 -55
  463. package/src/core/shaders/canvas/RoundedWithBorder.ts +122 -74
  464. package/src/core/shaders/canvas/RoundedWithBorderAndShadow.ts +136 -90
  465. package/src/core/shaders/canvas/RoundedWithShadow.ts +71 -70
  466. package/src/core/shaders/canvas/Shadow.ts +54 -52
  467. package/src/core/shaders/canvas/utils/render.ts +160 -151
  468. package/src/core/shaders/templates/BorderTemplate.ts +145 -115
  469. package/src/core/shaders/templates/HolePunchTemplate.ts +82 -82
  470. package/src/core/shaders/templates/LinearGradientTemplate.ts +71 -71
  471. package/src/core/shaders/templates/RadialGradientTemplate.ts +83 -81
  472. package/src/core/shaders/templates/RoundedTemplate.ts +98 -98
  473. package/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.ts +38 -38
  474. package/src/core/shaders/templates/RoundedWithBorderTemplate.ts +35 -35
  475. package/src/core/shaders/templates/RoundedWithShadowTemplate.ts +35 -35
  476. package/src/core/shaders/templates/ShadowTemplate.ts +106 -106
  477. package/src/core/shaders/utils.ts +46 -46
  478. package/src/core/shaders/webgl/Border.ts +169 -116
  479. package/src/core/shaders/webgl/Default.ts +88 -89
  480. package/src/core/shaders/webgl/DefaultBatched.ts +129 -129
  481. package/src/core/shaders/webgl/HolePunch.ts +75 -75
  482. package/src/core/shaders/webgl/LinearGradient.ts +106 -82
  483. package/src/core/shaders/webgl/RadialGradient.ts +108 -85
  484. package/src/core/shaders/webgl/Rounded.ts +115 -117
  485. package/src/core/shaders/webgl/RoundedWithBorder.ts +210 -155
  486. package/src/core/shaders/webgl/RoundedWithBorderAndShadow.ts +234 -175
  487. package/src/core/shaders/webgl/RoundedWithShadow.ts +96 -98
  488. package/src/core/shaders/webgl/SdfShader.ts +122 -134
  489. package/src/core/shaders/webgl/Shadow.ts +121 -115
  490. package/src/core/text-rendering/CanvasFontHandler.ts +304 -0
  491. package/src/core/text-rendering/CanvasTextRenderer.ts +255 -0
  492. package/src/core/text-rendering/SdfFontHandler.ts +581 -0
  493. package/src/core/text-rendering/SdfTextRenderer.ts +403 -0
  494. package/src/core/text-rendering/TextLayoutEngine.ts +672 -0
  495. package/src/core/text-rendering/TextRenderer.ts +444 -0
  496. package/src/core/text-rendering/Utils.ts +99 -0
  497. package/src/core/text-rendering/tests/TextLayoutEngine.test.ts +453 -0
  498. package/src/core/textures/ColorTexture.ts +104 -102
  499. package/src/core/textures/ImageTexture.ts +292 -418
  500. package/src/core/textures/NoiseTexture.ts +106 -104
  501. package/src/core/textures/RenderTexture.ts +87 -85
  502. package/src/core/textures/SubTexture.ts +184 -205
  503. package/src/core/textures/Texture.ts +524 -381
  504. package/src/core/utils.ts +229 -227
  505. package/src/env.d.ts +7 -7
  506. package/src/main-api/INode.ts +100 -100
  507. package/src/main-api/Inspector.ts +1278 -569
  508. package/src/main-api/Renderer.ts +1030 -818
  509. package/src/main-api/utils.ts +45 -45
  510. package/src/utils.ts +220 -267
  511. package/COPYING +0 -1
  512. package/dist/src/core/renderers/webgl/WebGlRenderOp.d.ts +0 -44
  513. package/dist/src/core/renderers/webgl/WebGlRenderOp.js.map +0 -1
  514. package/src/core/lib/ImageWorker.ts +0 -286
  515. package/src/core/lib/textureCompression.ts +0 -152
  516. package/src/core/lib/validateImageBitmap.ts +0 -87
  517. package/src/core/renderers/canvas/internal/C2DShaderUtils.ts +0 -220
  518. package/src/core/renderers/webgl/WebGlRenderOp.ts +0 -161
  519. package/src/core/text-rendering/TextTextureRendererUtils.ts +0 -263
  520. package/src/core/text-rendering/TrFontManager.ts +0 -183
  521. package/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.ts +0 -176
  522. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.ts +0 -139
  523. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.test.ts +0 -173
  524. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.ts +0 -171
  525. package/src/core/text-rendering/font-face-types/TrFontFace.ts +0 -187
  526. package/src/core/text-rendering/font-face-types/WebTrFontFace.ts +0 -94
  527. package/src/core/text-rendering/font-face-types/utils.ts +0 -39
  528. package/src/core/text-rendering/renderers/CanvasTextRenderer.ts +0 -514
  529. package/src/core/text-rendering/renderers/LightningTextTextureRenderer.ts +0 -863
  530. package/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.ts +0 -793
  531. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.test.ts +0 -48
  532. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.ts +0 -66
  533. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.ts +0 -52
  534. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.ts +0 -117
  535. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.test.ts +0 -133
  536. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.ts +0 -497
  537. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.test.ts +0 -49
  538. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.ts +0 -52
  539. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.test.ts +0 -205
  540. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.ts +0 -93
  541. package/src/core/text-rendering/renderers/TextRenderer.ts +0 -567
@@ -1,451 +1,607 @@
1
- /*
2
- * If not stated otherwise in this file or this component's LICENSE file the
3
- * following copyright and licenses apply:
4
- *
5
- * Copyright 2023 Comcast Cable Communications Management, LLC.
6
- *
7
- * Licensed under the Apache License, Version 2.0 (the License);
8
- * you may not use this file except in compliance with the License.
9
- * You may obtain a copy of the License at
10
- *
11
- * http://www.apache.org/licenses/LICENSE-2.0
12
- *
13
- * Unless required by applicable law or agreed to in writing, software
14
- * distributed under the License is distributed on an "AS IS" BASIS,
15
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
- * See the License for the specific language governing permissions and
17
- * limitations under the License.
18
- */
19
-
20
- import type {
21
- TextRenderer,
22
- TextRendererMap,
23
- TrProps,
24
- TextRendererState,
25
- TrFailedEventHandler,
26
- TrLoadedEventHandler,
27
- } from './text-rendering/renderers/TextRenderer.js';
28
- import {
29
- CoreNode,
30
- CoreNodeRenderState,
31
- UpdateType,
32
- type CoreNodeProps,
33
- } from './CoreNode.js';
34
- import type { Stage } from './Stage.js';
35
- import type { CoreRenderer } from './renderers/CoreRenderer.js';
36
- import type {
37
- NodeTextFailedPayload,
38
- NodeTextLoadedPayload,
39
- } from '../common/CommonTypes.js';
40
- import type { RectWithValid } from './lib/utils.js';
41
-
42
- export interface CoreTextNodeProps extends CoreNodeProps, TrProps {
43
- /**
44
- * Force Text Node to use a specific Text Renderer
45
- *
46
- * @remarks
47
- * By default, Text Nodes resolve the Text Renderer to use based on the font
48
- * that is matched using the font family and other font selection properties.
49
- *
50
- * If two fonts supported by two separate Text Renderers are matched setting
51
- * this override forces the Text Node to resolve to the Text Renderer defined
52
- * here.
53
- *
54
- * @default null
55
- */
56
- textRendererOverride: keyof TextRendererMap | null;
57
- }
58
-
59
- /**
60
- * An CoreNode in the Renderer scene graph that renders text.
61
- *
62
- * @remarks
63
- * A Text Node is the second graphical building block of the Renderer scene
64
- * graph. It renders text using a specific text renderer that is automatically
65
- * chosen based on the font requested and what type of fonts are installed
66
- * into an app.
67
- *
68
- * The text renderer can be overridden by setting the `textRendererOverride`
69
- *
70
- * The `texture` and `shader` properties are managed by loaded text renderer and
71
- * should not be set directly.
72
- *
73
- * For non-text rendering, see {@link CoreNode}.
74
- */
75
- export class CoreTextNode extends CoreNode implements CoreTextNodeProps {
76
- textRenderer: TextRenderer;
77
- trState: TextRendererState;
78
- private _textRendererOverride: CoreTextNodeProps['textRendererOverride'] =
79
- null;
80
-
81
- constructor(
82
- stage: Stage,
83
- props: CoreTextNodeProps,
84
- textRenderer: TextRenderer,
85
- ) {
86
- super(stage, props);
87
- this._textRendererOverride = props.textRendererOverride;
88
- this.textRenderer = textRenderer;
89
- const textRendererState = this.createState({
90
- x: this.absX,
91
- y: this.absY,
92
- width: props.width,
93
- height: props.height,
94
- textAlign: props.textAlign,
95
- color: props.color,
96
- zIndex: props.zIndex,
97
- contain: props.contain,
98
- scrollable: props.scrollable,
99
- scrollY: props.scrollY,
100
- offsetY: props.offsetY,
101
- letterSpacing: props.letterSpacing,
102
- debug: props.debug,
103
- fontFamily: props.fontFamily,
104
- fontSize: props.fontSize,
105
- fontStretch: props.fontStretch,
106
- fontStyle: props.fontStyle,
107
- fontWeight: props.fontWeight,
108
- text: props.text,
109
- lineHeight: props.lineHeight,
110
- maxLines: props.maxLines,
111
- textBaseline: props.textBaseline,
112
- verticalAlign: props.verticalAlign,
113
- overflowSuffix: props.overflowSuffix,
114
- wordBreak: props.wordBreak,
115
- });
116
-
117
- this.trState = textRendererState;
118
- }
119
-
120
- private onTextLoaded: TrLoadedEventHandler = () => {
121
- const { contain } = this;
122
- const setWidth = this.trState.props.width;
123
- const setHeight = this.trState.props.height;
124
- const calcWidth = this.trState.textW || 0;
125
- const calcHeight = this.trState.textH || 0;
126
-
127
- if (contain === 'both') {
128
- this.props.width = setWidth;
129
- this.props.height = setHeight;
130
- } else if (contain === 'width') {
131
- this.props.width = setWidth;
132
- this.props.height = calcHeight;
133
- } else if (contain === 'none') {
134
- this.props.width = calcWidth;
135
- this.props.height = calcHeight;
136
- }
137
- this.setUpdateType(UpdateType.Local);
138
-
139
- // Incase the RAF loop has been stopped already before text was loaded,
140
- // we request a render so it can be drawn.
141
- this.stage.requestRender();
142
- this.emit('loaded', {
143
- type: 'text',
144
- dimensions: {
145
- width: this.trState.textW || 0,
146
- height: this.trState.textH || 0,
147
- },
148
- } satisfies NodeTextLoadedPayload);
149
- };
150
-
151
- private onTextFailed: TrFailedEventHandler = (target, error) => {
152
- this.emit('failed', {
153
- type: 'text',
154
- error,
155
- } satisfies NodeTextFailedPayload);
156
- };
157
-
158
- override get width(): number {
159
- return this.props.width;
160
- }
161
-
162
- override set width(value: number) {
163
- this.props.width = value;
164
- this.textRenderer.set.width(this.trState, value);
165
-
166
- // If not containing, we must update the local transform to account for the
167
- // new width
168
- if (this.contain === 'none') {
169
- this.setUpdateType(UpdateType.Local);
170
- }
171
- }
172
-
173
- override get height(): number {
174
- return this.props.height;
175
- }
176
-
177
- override set height(value: number) {
178
- this.props.height = value;
179
- this.textRenderer.set.height(this.trState, value);
180
-
181
- // If not containing in the horizontal direction, we must update the local
182
- // transform to account for the new height
183
- if (this.contain !== 'both') {
184
- this.setUpdateType(UpdateType.Local);
185
- }
186
- }
187
-
188
- override get color(): number {
189
- return this.trState.props.color;
190
- }
191
-
192
- override set color(value: number) {
193
- this.textRenderer.set.color(this.trState, value);
194
- this.setUpdateType(UpdateType.RenderTexture);
195
- }
196
-
197
- get text(): string {
198
- return this.trState.props.text;
199
- }
200
-
201
- set text(value: string) {
202
- this.textRenderer.set.text(this.trState, value);
203
- }
204
-
205
- get textRendererOverride(): CoreTextNodeProps['textRendererOverride'] {
206
- return this._textRendererOverride;
207
- }
208
-
209
- set textRendererOverride(value: CoreTextNodeProps['textRendererOverride']) {
210
- this._textRendererOverride = value;
211
- this.textRenderer.destroyState(this.trState);
212
-
213
- const textRenderer = this.stage.resolveTextRenderer(
214
- this.trState.props,
215
- this._textRendererOverride,
216
- );
217
-
218
- if (textRenderer === null) {
219
- console.warn(
220
- 'Text Renderer not found for font',
221
- this.trState.props.fontFamily,
222
- );
223
- return;
224
- }
225
-
226
- this.textRenderer = textRenderer;
227
- this.trState = this.createState(this.trState.props);
228
- }
229
-
230
- get fontSize(): CoreTextNodeProps['fontSize'] {
231
- return this.trState.props.fontSize;
232
- }
233
-
234
- set fontSize(value: CoreTextNodeProps['fontSize']) {
235
- this.textRenderer.set.fontSize(this.trState, value);
236
- }
237
-
238
- get fontFamily(): CoreTextNodeProps['fontFamily'] {
239
- return this.trState.props.fontFamily;
240
- }
241
-
242
- set fontFamily(value: CoreTextNodeProps['fontFamily']) {
243
- this.textRenderer.set.fontFamily(this.trState, value);
244
- }
245
-
246
- get fontStretch(): CoreTextNodeProps['fontStretch'] {
247
- return this.trState.props.fontStretch;
248
- }
249
-
250
- set fontStretch(value: CoreTextNodeProps['fontStretch']) {
251
- this.textRenderer.set.fontStretch(this.trState, value);
252
- }
253
-
254
- get fontStyle(): CoreTextNodeProps['fontStyle'] {
255
- return this.trState.props.fontStyle;
256
- }
257
-
258
- set fontStyle(value: CoreTextNodeProps['fontStyle']) {
259
- this.textRenderer.set.fontStyle(this.trState, value);
260
- }
261
-
262
- get fontWeight(): CoreTextNodeProps['fontWeight'] {
263
- return this.trState.props.fontWeight;
264
- }
265
-
266
- set fontWeight(value: CoreTextNodeProps['fontWeight']) {
267
- this.textRenderer.set.fontWeight(this.trState, value);
268
- }
269
-
270
- get textAlign(): CoreTextNodeProps['textAlign'] {
271
- return this.trState.props.textAlign;
272
- }
273
-
274
- set textAlign(value: CoreTextNodeProps['textAlign']) {
275
- this.textRenderer.set.textAlign(this.trState, value);
276
- }
277
-
278
- get contain(): CoreTextNodeProps['contain'] {
279
- return this.trState.props.contain;
280
- }
281
-
282
- set contain(value: CoreTextNodeProps['contain']) {
283
- this.textRenderer.set.contain(this.trState, value);
284
- }
285
-
286
- get scrollable(): CoreTextNodeProps['scrollable'] {
287
- return this.trState.props.scrollable;
288
- }
289
-
290
- set scrollable(value: CoreTextNodeProps['scrollable']) {
291
- this.textRenderer.set.scrollable(this.trState, value);
292
- }
293
-
294
- get scrollY(): CoreTextNodeProps['scrollY'] {
295
- return this.trState.props.scrollY;
296
- }
297
-
298
- set scrollY(value: CoreTextNodeProps['scrollY']) {
299
- this.textRenderer.set.scrollY(this.trState, value);
300
- }
301
-
302
- get offsetY(): CoreTextNodeProps['offsetY'] {
303
- return this.trState.props.offsetY;
304
- }
305
-
306
- set offsetY(value: CoreTextNodeProps['offsetY']) {
307
- this.textRenderer.set.offsetY(this.trState, value);
308
- }
309
-
310
- get letterSpacing(): CoreTextNodeProps['letterSpacing'] {
311
- return this.trState.props.letterSpacing;
312
- }
313
-
314
- set letterSpacing(value: CoreTextNodeProps['letterSpacing']) {
315
- this.textRenderer.set.letterSpacing(this.trState, value);
316
- }
317
-
318
- get lineHeight(): CoreTextNodeProps['lineHeight'] {
319
- return this.trState.props.lineHeight;
320
- }
321
-
322
- set lineHeight(value: CoreTextNodeProps['lineHeight']) {
323
- this.textRenderer.set.lineHeight(this.trState, value);
324
- }
325
-
326
- get maxLines(): CoreTextNodeProps['maxLines'] {
327
- return this.trState.props.maxLines;
328
- }
329
-
330
- set maxLines(value: CoreTextNodeProps['maxLines']) {
331
- this.textRenderer.set.maxLines(this.trState, value);
332
- }
333
-
334
- get textBaseline(): CoreTextNodeProps['textBaseline'] {
335
- return this.trState.props.textBaseline;
336
- }
337
-
338
- set textBaseline(value: CoreTextNodeProps['textBaseline']) {
339
- this.textRenderer.set.textBaseline(this.trState, value);
340
- }
341
-
342
- get verticalAlign(): CoreTextNodeProps['verticalAlign'] {
343
- return this.trState.props.verticalAlign;
344
- }
345
-
346
- set verticalAlign(value: CoreTextNodeProps['verticalAlign']) {
347
- this.textRenderer.set.verticalAlign(this.trState, value);
348
- }
349
-
350
- get overflowSuffix(): CoreTextNodeProps['overflowSuffix'] {
351
- return this.trState.props.overflowSuffix;
352
- }
353
-
354
- set overflowSuffix(value: CoreTextNodeProps['overflowSuffix']) {
355
- this.textRenderer.set.overflowSuffix(this.trState, value);
356
- }
357
-
358
- get wordBreak(): CoreTextNodeProps['wordBreak'] {
359
- return this.trState.props.wordBreak;
360
- }
361
-
362
- set wordBreak(value: CoreTextNodeProps['wordBreak']) {
363
- this.textRenderer.set.wordBreak(this.trState, value);
364
- }
365
-
366
- get debug(): CoreTextNodeProps['debug'] {
367
- return this.trState.props.debug;
368
- }
369
-
370
- set debug(value: CoreTextNodeProps['debug']) {
371
- this.textRenderer.set.debug(this.trState, value);
372
- }
373
-
374
- override update(delta: number, parentClippingRect: RectWithValid) {
375
- super.update(delta, parentClippingRect);
376
-
377
- // globalTransform is updated in super.update(delta)
378
- this.textRenderer.set.x(this.trState, this.globalTransform!.tx);
379
- this.textRenderer.set.y(this.trState, this.globalTransform!.ty);
380
- }
381
-
382
- override updateIsRenderable() {
383
- // If the node is out of bounds or has an alpha of 0, it is not renderable
384
- if (
385
- this.worldAlpha === 0 ||
386
- this.renderState <= CoreNodeRenderState.OutOfBounds
387
- ) {
388
- this.setRenderable(false);
389
- return;
390
- }
391
-
392
- if (this.trState !== undefined && this.trState.props.text !== '') {
393
- this.setRenderable(true);
394
- }
395
- }
396
-
397
- override setRenderable(isRenderable: boolean) {
398
- super.setRenderable(isRenderable);
399
- this.textRenderer.setIsRenderable(this.trState, isRenderable);
400
- }
401
-
402
- override renderQuads(renderer: CoreRenderer) {
403
- // If the text renderer does not support rendering quads, fallback to the
404
- // default renderQuads method
405
- if (this.textRenderer.renderQuads === undefined) {
406
- super.renderQuads(renderer);
407
- return;
408
- }
409
-
410
- // If the text renderer does support rendering quads, use it...
411
-
412
- // Prevent quad rendering if parent has a render texture
413
- // and this node is not the render texture
414
- if (this.parentHasRenderTexture === true) {
415
- if (renderer.renderToTextureActive === false) {
416
- return;
417
- }
418
- // Prevent quad rendering if parent render texture is not the active render texture
419
- if (this.parentRenderTexture !== renderer.activeRttNode) {
420
- return;
421
- }
422
- }
423
-
424
- this.textRenderer.renderQuads(this);
425
- }
426
-
427
- /**
428
- * Destroy the node and cleanup all resources
429
- */
430
- override destroy(): void {
431
- super.destroy();
432
-
433
- this.textRenderer.destroyState(this.trState);
434
- }
435
-
436
- /**
437
- * Resolve a text renderer and a new state based on the current text renderer props provided
438
- * @param props
439
- * @returns
440
- */
441
- private createState(props: TrProps) {
442
- const textRendererState = this.textRenderer.createState(props, this);
443
-
444
- textRendererState.emitter.on('loaded', this.onTextLoaded);
445
- textRendererState.emitter.on('failed', this.onTextFailed);
446
-
447
- this.textRenderer.scheduleUpdateState(textRendererState);
448
-
449
- return textRendererState;
450
- }
451
- }
1
+ /*
2
+ * If not stated otherwise in this file or this component's LICENSE file the
3
+ * following copyright and licenses apply:
4
+ *
5
+ * Copyright 2023 Comcast Cable Communications Management, LLC.
6
+ *
7
+ * Licensed under the Apache License, Version 2.0 (the License);
8
+ * you may not use this file except in compliance with the License.
9
+ * You may obtain a copy of the License at
10
+ *
11
+ * http://www.apache.org/licenses/LICENSE-2.0
12
+ *
13
+ * Unless required by applicable law or agreed to in writing, software
14
+ * distributed under the License is distributed on an "AS IS" BASIS,
15
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ * See the License for the specific language governing permissions and
17
+ * limitations under the License.
18
+ */
19
+
20
+ import type {
21
+ FontHandler,
22
+ TextRenderer,
23
+ TrProps,
24
+ TextLayout,
25
+ TextRenderInfo,
26
+ } from './text-rendering/TextRenderer.js';
27
+ import {
28
+ CoreNode,
29
+ CoreNodeRenderState,
30
+ UpdateType,
31
+ type CoreNodeProps,
32
+ } from './CoreNode.js';
33
+ import type { Stage } from './Stage.js';
34
+ import type {
35
+ NodeTextFailedPayload,
36
+ NodeTextLoadedPayload,
37
+ NodeTextureLoadedPayload,
38
+ } from '../common/CommonTypes.js';
39
+ import type { RectWithValid } from './lib/utils.js';
40
+ import type { CoreRenderer } from './renderers/CoreRenderer.js';
41
+ import type { TextureLoadedEventHandler } from './textures/Texture.js';
42
+ import { Matrix3d } from './lib/Matrix3d.js';
43
+ export interface CoreTextNodeProps extends CoreNodeProps, TrProps {
44
+ /**
45
+ * Force Text Node to use a specific Text Renderer
46
+ */
47
+ textRendererOverride?: string | null;
48
+ forceLoad: boolean;
49
+ }
50
+
51
+ export enum TextConstraint {
52
+ 'none' = 0,
53
+ 'width' = 1,
54
+ 'height' = 2,
55
+ 'both' = 3,
56
+ }
57
+
58
+ export class CoreTextNode extends CoreNode implements CoreTextNodeProps {
59
+ private textRenderer: TextRenderer;
60
+ private fontHandler: FontHandler;
61
+
62
+ private _layoutGenerated = false;
63
+ private _waitingForFont = false;
64
+ private _containType: TextConstraint = TextConstraint.none;
65
+
66
+ // SDF layout caching for performance
67
+ private _cachedLayout: TextLayout | null = null;
68
+ private _lastVertexBuffer: Float32Array | null = null;
69
+
70
+ // Text renderer properties - stored directly on the node
71
+ private textProps: CoreTextNodeProps;
72
+
73
+ private _renderInfo: TextRenderInfo = {
74
+ width: 0,
75
+ height: 0,
76
+ };
77
+
78
+ private _type: 'sdf' | 'canvas' = 'sdf'; // Default to SDF renderer
79
+
80
+ constructor(
81
+ stage: Stage,
82
+ props: CoreTextNodeProps,
83
+ textRenderer: TextRenderer,
84
+ ) {
85
+ super(stage, props);
86
+ this.textRenderer = textRenderer;
87
+ this.fontHandler = textRenderer.font;
88
+ this._type = textRenderer.type;
89
+
90
+ // Initialize text properties from props
91
+ // Props are guaranteed to have all defaults resolved by Stage.createTextNode
92
+ this.textProps = props;
93
+ this._containType = TextConstraint[props.contain];
94
+
95
+ this.setUpdateType(UpdateType.All);
96
+ }
97
+
98
+ protected override onTextureLoaded: TextureLoadedEventHandler = (
99
+ _,
100
+ dimensions,
101
+ ) => {
102
+ // If parent has a render texture, flag that we need to update
103
+ if (this.parentHasRenderTexture) {
104
+ this.notifyParentRTTOfUpdate();
105
+ }
106
+ // ignore 1x1 pixel textures
107
+ if (dimensions.w > 1 && dimensions.h > 1) {
108
+ this.emit('loaded', {
109
+ type: 'texture',
110
+ dimensions,
111
+ } satisfies NodeTextureLoadedPayload);
112
+ }
113
+ this.setUpdateType(UpdateType.IsRenderable);
114
+ };
115
+
116
+ allowTextGeneration() {
117
+ const p = this.props.parent;
118
+ if (p === null) {
119
+ return false;
120
+ }
121
+ if (p.worldAlpha > 0 && p.renderState > CoreNodeRenderState.OutOfBounds) {
122
+ return true;
123
+ }
124
+ return false;
125
+ }
126
+
127
+ override updateLocalTransform() {
128
+ const p = this.props;
129
+ let { x, y, w, h } = p;
130
+ const mountX = p.mountX;
131
+ const mountY = p.mountY;
132
+ let mountTranslateX = p.mountX * w;
133
+ let mountTranslateY = p.mountY * h;
134
+
135
+ let localTextTransform: Matrix3d | null = null;
136
+
137
+ const tProps = this.textProps;
138
+ const { textAlign, verticalAlign, maxWidth, maxHeight } = tProps;
139
+ const contain = this._containType;
140
+
141
+ const hasMaxWidth = maxWidth > 0;
142
+ const hasMaxHeight = maxHeight > 0;
143
+
144
+ if (contain > 0 && (hasMaxWidth || hasMaxHeight)) {
145
+ let containX = 0;
146
+ let containY = 0;
147
+ if (contain & TextConstraint.width && hasMaxWidth === true) {
148
+ if (textAlign === 'right') {
149
+ containX = maxWidth - w;
150
+ } else if (textAlign === 'center') {
151
+ containX = (maxWidth - w) * 0.5;
152
+ }
153
+ mountTranslateX = mountX * maxWidth;
154
+ }
155
+ if (contain & TextConstraint.height && maxHeight > 0) {
156
+ if (verticalAlign === 'bottom') {
157
+ containY = maxHeight - h;
158
+ } else if (verticalAlign === 'middle') {
159
+ containY = (maxHeight - h) * 0.5;
160
+ }
161
+ mountTranslateY = mountY * maxHeight;
162
+ }
163
+ localTextTransform = Matrix3d.translate(containX, containY);
164
+ }
165
+
166
+ if (p.rotation !== 0 || p.scaleX !== 1 || p.scaleY !== 1) {
167
+ const scaleRotate = Matrix3d.rotate(p.rotation).scale(p.scaleX, p.scaleY);
168
+ const pivotW =
169
+ contain & TextConstraint.width && maxWidth > 0 ? maxWidth : w;
170
+ const pivotH =
171
+ contain & TextConstraint.height && maxHeight > 0 ? maxHeight : h;
172
+ const pivotTranslateX = p.pivotX * pivotW;
173
+ const pivotTranslateY = p.pivotY * pivotH;
174
+
175
+ this.localTransform = Matrix3d.translate(
176
+ x - mountTranslateX + pivotTranslateX,
177
+ y - mountTranslateY + pivotTranslateY,
178
+ this.localTransform,
179
+ )
180
+ .multiply(scaleRotate)
181
+ .translate(-pivotTranslateX, -pivotTranslateY);
182
+ } else {
183
+ this.localTransform = Matrix3d.translate(
184
+ x - mountTranslateX,
185
+ y - mountTranslateY,
186
+ this.localTransform,
187
+ );
188
+ }
189
+
190
+ if (localTextTransform !== null) {
191
+ this.localTransform = this.localTransform.multiply(localTextTransform);
192
+ }
193
+ }
194
+
195
+ /**
196
+ * Override CoreNode's update method to handle text-specific updates
197
+ */
198
+ override update(delta: number, parentClippingRect: RectWithValid): void {
199
+ const hasValidText = this.textProps.text && this.textProps.text.length > 0;
200
+
201
+ if (
202
+ hasValidText === true &&
203
+ (this.textProps.forceLoad === true ||
204
+ this.allowTextGeneration() === true) &&
205
+ this._layoutGenerated === false
206
+ ) {
207
+ if (this.fontHandler.isFontLoaded(this.textProps.fontFamily) === true) {
208
+ this._waitingForFont = false;
209
+ this._cachedLayout = null; // Invalidate cached layout
210
+ this._lastVertexBuffer = null; // Invalidate last vertex buffer
211
+ const resp = this.textRenderer.renderText(this.textProps);
212
+ this.handleRenderResult(resp);
213
+ this._layoutGenerated = true;
214
+ } else if (this._waitingForFont === false) {
215
+ this.fontHandler.waitingForFont(this.textProps.fontFamily, this);
216
+ this._waitingForFont = true;
217
+ }
218
+ } else if (hasValidText === false) {
219
+ // If text is invalid, ensure node is not renderable
220
+ this.setRenderable(false);
221
+ this._layoutGenerated = false;
222
+ this._cachedLayout = null;
223
+ this._lastVertexBuffer = null;
224
+ }
225
+
226
+ // First run the standard CoreNode update
227
+ super.update(delta, parentClippingRect);
228
+ }
229
+
230
+ /**
231
+ * Override is renderable check for SDF text nodes
232
+ */
233
+ override updateIsRenderable(): void {
234
+ // Guard: Text nodes are never renderable without valid text
235
+ const hasValidText = this.textProps.text && this.textProps.text.length > 0;
236
+ if (hasValidText === false) {
237
+ this.setRenderable(false);
238
+ return;
239
+ }
240
+
241
+ // SDF text nodes are always renderable if they have a valid layout
242
+ if (this._type === 'canvas') {
243
+ super.updateIsRenderable();
244
+ return;
245
+ }
246
+
247
+ // For SDF, check if we have a cached layout
248
+ this.setRenderable(this._cachedLayout !== null);
249
+ }
250
+
251
+ /**
252
+ * Handle the result of text rendering for both Canvas and SDF renderers
253
+ */
254
+ private handleRenderResult(result: TextRenderInfo): void {
255
+ // Host paths on top
256
+ const textRendererType = this._type;
257
+ let width = result.width;
258
+ let height = result.height;
259
+
260
+ // Handle Canvas renderer (uses ImageData)
261
+ if (textRendererType === 'canvas') {
262
+ if (result.imageData === undefined) {
263
+ this.emit('failed', {
264
+ type: 'text',
265
+ error: new Error(
266
+ 'Canvas text rendering failed, no image data returned',
267
+ ),
268
+ } satisfies NodeTextFailedPayload);
269
+ return;
270
+ }
271
+
272
+ this.texture = this.stage.txManager.createTexture('ImageTexture', {
273
+ premultiplyAlpha: true,
274
+ src: result.imageData as ImageData,
275
+ });
276
+ // It isn't renderable until the texture is loaded we have to set it to false here to avoid it
277
+ // being detected as a renderable default color node in the next frame
278
+ // it will be corrected once the texture is loaded
279
+ this.setRenderable(false);
280
+
281
+ if (this.renderState > CoreNodeRenderState.OutOfBounds) {
282
+ // We do want the texture to load immediately
283
+ this.texture.setRenderableOwner(this._id, true);
284
+ }
285
+ }
286
+
287
+ // Handle zero-dimension case (can happen with certain text inputs or font issues)
288
+ if (width === 0 || height === 0) {
289
+ this.emit('failed', {
290
+ type: 'text',
291
+ error: new Error('Text rendering failed, width or height zero'),
292
+ } satisfies NodeTextFailedPayload);
293
+ return;
294
+ }
295
+
296
+ this._cachedLayout = result.layout || null;
297
+ this.props.w = width;
298
+ this.props.h = height;
299
+
300
+ // Handle SDF renderer (uses layout caching)
301
+ if (textRendererType === 'sdf') {
302
+ this.setRenderable(true);
303
+ this.setUpdateType(UpdateType.Local);
304
+ }
305
+
306
+ this._renderInfo = result;
307
+ queueMicrotask(this.emitTextLoadedEvent);
308
+ }
309
+
310
+ // Reusable bound method for emitting loaded event
311
+ private emitTextLoadedEvent = () => {
312
+ this.emit('loaded', {
313
+ type: 'text',
314
+ dimensions: {
315
+ w: this._renderInfo.width,
316
+ h: this._renderInfo.height,
317
+ },
318
+ } satisfies NodeTextLoadedPayload);
319
+ };
320
+
321
+ /**
322
+ * Override renderQuads to handle SDF vs Canvas rendering
323
+ */
324
+ override renderQuads(renderer: CoreRenderer): void {
325
+ if (this.parentHasRenderTexture === true) {
326
+ const rtt = renderer.renderToTextureActive;
327
+ if (rtt === false || this.parentRenderTexture !== renderer.activeRttNode)
328
+ return;
329
+ }
330
+
331
+ // Canvas renderer: use standard texture rendering via CoreNode
332
+ if (this._type === 'canvas') {
333
+ super.renderQuads(renderer);
334
+ return;
335
+ }
336
+
337
+ // Early return if no cached data
338
+ if (!this._cachedLayout) {
339
+ return;
340
+ }
341
+
342
+ if (this._lastVertexBuffer === null) {
343
+ this._lastVertexBuffer = this.textRenderer.addQuads(this._cachedLayout);
344
+ }
345
+
346
+ const props = this.textProps;
347
+ this.textRenderer.renderQuads(
348
+ renderer,
349
+ this._cachedLayout as TextLayout,
350
+ this._lastVertexBuffer!,
351
+ {
352
+ fontFamily: this.textProps.fontFamily,
353
+ fontSize: props.fontSize,
354
+ color: this.props.color || 0xffffffff,
355
+ offsetY: props.offsetY,
356
+ worldAlpha: this.worldAlpha,
357
+ globalTransform: this.globalTransform!.getFloatArr(),
358
+ clippingRect: this.clippingRect,
359
+ width: this.props.w,
360
+ height: this.props.h,
361
+ parentHasRenderTexture: this.parentHasRenderTexture,
362
+ framebufferDimensions:
363
+ this.parentHasRenderTexture === true
364
+ ? this.parentFramebufferDimensions
365
+ : null,
366
+ stage: this.stage,
367
+ },
368
+ );
369
+ }
370
+
371
+ override destroy(): void {
372
+ if (this._waitingForFont === true && this.fontHandler) {
373
+ this.fontHandler.stopWaitingForFont(this.textProps.fontFamily, this);
374
+ }
375
+
376
+ // Clear cached layout and vertex buffer
377
+ this._cachedLayout = null;
378
+ this._lastVertexBuffer = null;
379
+
380
+ this.fontHandler = null!; // Clear reference to avoid memory leaks
381
+ this.textRenderer = null!; // Clear reference to avoid memory leaks
382
+
383
+ super.destroy();
384
+ }
385
+
386
+ override set w(value: number) {
387
+ this.maxWidth = value;
388
+ }
389
+
390
+ override get w(): number {
391
+ return this.props.w;
392
+ }
393
+
394
+ override set h(value: number) {
395
+ this.maxHeight = value;
396
+ }
397
+
398
+ override get h(): number {
399
+ return this.props.h;
400
+ }
401
+
402
+ get maxWidth() {
403
+ return this.textProps.maxWidth;
404
+ }
405
+
406
+ set maxWidth(value: number) {
407
+ if (this.textProps.maxWidth !== value) {
408
+ this.textProps.maxWidth = value;
409
+ this._layoutGenerated = false;
410
+ this.setUpdateType(UpdateType.Local);
411
+ }
412
+ }
413
+
414
+ // Property getters and setters
415
+ get maxHeight() {
416
+ return this.textProps.maxHeight;
417
+ }
418
+
419
+ set maxHeight(value: number) {
420
+ if (this.textProps.maxHeight !== value) {
421
+ this.textProps.maxHeight = value;
422
+ this._layoutGenerated = false;
423
+ this.setUpdateType(UpdateType.Local);
424
+ }
425
+ }
426
+
427
+ get contain(): TrProps['contain'] {
428
+ return this.textProps.contain;
429
+ }
430
+
431
+ set contain(value: TrProps['contain']) {
432
+ if (this.textProps.contain !== value) {
433
+ this.textProps.contain = value;
434
+ this._containType = TextConstraint[value];
435
+ this.setUpdateType(UpdateType.Local);
436
+ }
437
+ }
438
+
439
+ get text(): string {
440
+ return this.textProps.text;
441
+ }
442
+
443
+ set text(value: string) {
444
+ let normalizedValue = value;
445
+ if (value === undefined || value === null) {
446
+ normalizedValue = '';
447
+ } else if (typeof value !== 'string') {
448
+ normalizedValue = String(value);
449
+ }
450
+
451
+ if (this.textProps.text !== normalizedValue) {
452
+ this.textProps.text = normalizedValue;
453
+ this._layoutGenerated = false;
454
+ this.setUpdateType(UpdateType.Local);
455
+ }
456
+ }
457
+
458
+ get fontSize(): number {
459
+ return this.textProps.fontSize;
460
+ }
461
+
462
+ set fontSize(value: number) {
463
+ if (this.textProps.fontSize !== value) {
464
+ this.textProps.fontSize = value;
465
+ this._layoutGenerated = false;
466
+ this.setUpdateType(UpdateType.Local);
467
+ }
468
+ }
469
+
470
+ get fontFamily(): string {
471
+ return this.textProps.fontFamily;
472
+ }
473
+
474
+ set fontFamily(value: string) {
475
+ if (this.textProps.fontFamily !== value) {
476
+ if (this._waitingForFont === true) {
477
+ this.fontHandler.stopWaitingForFont(this.textProps.fontFamily, this);
478
+ }
479
+ this.textProps.fontFamily = value;
480
+ this._layoutGenerated = false;
481
+ this.setUpdateType(UpdateType.Local);
482
+ }
483
+ }
484
+
485
+ get fontStyle(): TrProps['fontStyle'] {
486
+ return this.textProps.fontStyle;
487
+ }
488
+
489
+ set fontStyle(value: TrProps['fontStyle']) {
490
+ if (this.textProps.fontStyle !== value) {
491
+ this.textProps.fontStyle = value;
492
+ this._layoutGenerated = false;
493
+ this.setUpdateType(UpdateType.Local);
494
+ }
495
+ }
496
+
497
+ get textAlign(): TrProps['textAlign'] {
498
+ return this.textProps.textAlign;
499
+ }
500
+
501
+ set textAlign(value: TrProps['textAlign']) {
502
+ if (this.textProps.textAlign !== value) {
503
+ this.textProps.textAlign = value;
504
+ this._layoutGenerated = false;
505
+ this.setUpdateType(UpdateType.Local);
506
+ }
507
+ }
508
+
509
+ get letterSpacing(): number {
510
+ return this.textProps.letterSpacing;
511
+ }
512
+
513
+ set letterSpacing(value: number) {
514
+ if (this.textProps.letterSpacing !== value) {
515
+ this.textProps.letterSpacing = value;
516
+ this._layoutGenerated = false;
517
+ this.setUpdateType(UpdateType.Local);
518
+ }
519
+ }
520
+
521
+ get lineHeight(): number {
522
+ return this.textProps.lineHeight;
523
+ }
524
+
525
+ set lineHeight(value: number) {
526
+ if (this.textProps.lineHeight !== value) {
527
+ this.textProps.lineHeight = value;
528
+ this._layoutGenerated = false;
529
+ this.setUpdateType(UpdateType.Local);
530
+ }
531
+ }
532
+
533
+ get maxLines(): number {
534
+ return this.textProps.maxLines;
535
+ }
536
+
537
+ set maxLines(value: number) {
538
+ if (this.textProps.maxLines !== value) {
539
+ this.textProps.maxLines = value;
540
+ this._layoutGenerated = false;
541
+ this.setUpdateType(UpdateType.Local);
542
+ }
543
+ }
544
+
545
+ get verticalAlign(): TrProps['verticalAlign'] {
546
+ return this.textProps.verticalAlign;
547
+ }
548
+
549
+ set verticalAlign(value: TrProps['verticalAlign']) {
550
+ if (this.textProps.verticalAlign !== value) {
551
+ this.textProps.verticalAlign = value;
552
+ this._layoutGenerated = false;
553
+ this.setUpdateType(UpdateType.Local);
554
+ }
555
+ }
556
+
557
+ get overflowSuffix(): string {
558
+ return this.textProps.overflowSuffix;
559
+ }
560
+
561
+ set overflowSuffix(value: string) {
562
+ if (this.textProps.overflowSuffix !== value) {
563
+ this.textProps.overflowSuffix = value;
564
+ this._layoutGenerated = false;
565
+ this.setUpdateType(UpdateType.Local);
566
+ }
567
+ }
568
+
569
+ get wordBreak(): TrProps['wordBreak'] {
570
+ return this.textProps.wordBreak;
571
+ }
572
+
573
+ set wordBreak(value: TrProps['wordBreak']) {
574
+ if (this.textProps.wordBreak !== value) {
575
+ this.textProps.wordBreak = value;
576
+ this._layoutGenerated = false;
577
+ this.setUpdateType(UpdateType.Local);
578
+ }
579
+ }
580
+
581
+ get offsetY(): number {
582
+ return this.textProps.offsetY;
583
+ }
584
+
585
+ set offsetY(value: number) {
586
+ if (this.textProps.offsetY !== value) {
587
+ this.textProps.offsetY = value;
588
+ this._layoutGenerated = false;
589
+ this.setUpdateType(UpdateType.Local);
590
+ }
591
+ }
592
+
593
+ get forceLoad() {
594
+ return this.textProps.forceLoad;
595
+ }
596
+
597
+ set forceLoad(value: boolean) {
598
+ if (this.textProps.forceLoad !== value) {
599
+ this.textProps.forceLoad = value;
600
+ this.setUpdateType(UpdateType.Local);
601
+ }
602
+ }
603
+
604
+ get renderInfo(): TextRenderInfo {
605
+ return this._renderInfo;
606
+ }
607
+ }