@lightningjs/renderer 0.3.0 → 0.3.2

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 (295) hide show
  1. package/NOTICE +1 -2
  2. package/dist/exports/core-api.js +1 -1
  3. package/dist/exports/main-api.js +1 -1
  4. package/dist/exports/utils.js +1 -1
  5. package/dist/src/common/CommonTypes.js +1 -1
  6. package/dist/src/common/EventEmitter.js +1 -1
  7. package/dist/src/common/IAnimationController.js +1 -1
  8. package/dist/src/core/CoreExtension.js +1 -1
  9. package/dist/src/core/CoreNode.d.ts +5 -1
  10. package/dist/src/core/CoreNode.js +9 -2
  11. package/dist/src/core/CoreNode.js.map +1 -1
  12. package/dist/src/core/CoreTextNode.d.ts +2 -1
  13. package/dist/src/core/CoreTextNode.js +3 -3
  14. package/dist/src/core/CoreTextNode.js.map +1 -1
  15. package/dist/src/core/CoreTextureManager.js +1 -1
  16. package/dist/src/core/Matrix2DContext.js +1 -1
  17. package/dist/src/core/Stage.d.ts +2 -1
  18. package/dist/src/core/Stage.js +20 -6
  19. package/dist/src/core/Stage.js.map +1 -1
  20. package/dist/src/core/animations/AnimationManager.js +1 -1
  21. package/dist/src/core/animations/CoreAnimation.js +1 -1
  22. package/dist/src/core/animations/CoreAnimationController.js +1 -1
  23. package/dist/src/core/lib/glm/common.js +1 -1
  24. package/dist/src/core/lib/glm/index.js +1 -1
  25. package/dist/src/core/lib/glm/mat2.js +1 -1
  26. package/dist/src/core/lib/glm/mat2d.js +1 -1
  27. package/dist/src/core/lib/glm/mat3.js +1 -1
  28. package/dist/src/core/lib/glm/mat4.js +1 -1
  29. package/dist/src/core/lib/glm/quat.js +1 -1
  30. package/dist/src/core/lib/glm/quat2.js +1 -1
  31. package/dist/src/core/lib/glm/vec2.js +1 -1
  32. package/dist/src/core/lib/glm/vec3.js +1 -1
  33. package/dist/src/core/lib/glm/vec4.js +1 -1
  34. package/dist/src/core/lib/utils.d.ts +1 -0
  35. package/dist/src/core/lib/utils.js +10 -1
  36. package/dist/src/core/lib/utils.js.map +1 -1
  37. package/dist/src/core/platform.js +1 -1
  38. package/dist/src/core/renderers/CoreContextTexture.js +1 -1
  39. package/dist/src/core/renderers/CoreRenderOp.js +1 -1
  40. package/dist/src/core/renderers/CoreRenderer.d.ts +2 -0
  41. package/dist/src/core/renderers/CoreRenderer.js +1 -1
  42. package/dist/src/core/renderers/CoreRenderer.js.map +1 -1
  43. package/dist/src/core/renderers/CoreShader.d.ts +2 -2
  44. package/dist/src/core/renderers/CoreShader.js +1 -1
  45. package/dist/src/core/renderers/CoreShader.js.map +1 -1
  46. package/dist/src/core/renderers/webgl/WebGlCoreCtxSubTexture.js +1 -1
  47. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js +1 -1
  48. package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.d.ts +4 -1
  49. package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.js +22 -4
  50. package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.js.map +1 -1
  51. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.d.ts +2 -2
  52. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js +29 -15
  53. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js.map +1 -1
  54. package/dist/src/core/renderers/webgl/WebGlCoreShader.d.ts +46 -3
  55. package/dist/src/core/renderers/webgl/WebGlCoreShader.js +44 -9
  56. package/dist/src/core/renderers/webgl/WebGlCoreShader.js.map +1 -1
  57. package/dist/src/core/renderers/webgl/internal/BufferCollection.js +1 -1
  58. package/dist/src/core/renderers/webgl/internal/RendererUtils.js +1 -1
  59. package/dist/src/core/renderers/webgl/internal/ShaderUtils.js +1 -1
  60. package/dist/src/core/renderers/webgl/internal/WebGlUtils.js +1 -1
  61. package/dist/src/core/renderers/webgl/shaders/DefaultShader.js +1 -1
  62. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.js +1 -1
  63. package/dist/src/core/renderers/webgl/shaders/DynamicShader.d.ts +8 -6
  64. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js +20 -13
  65. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js.map +1 -1
  66. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.d.ts +5 -6
  67. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.js +12 -11
  68. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.js.map +1 -1
  69. package/dist/src/core/renderers/webgl/shaders/SdfShader.d.ts +1 -1
  70. package/dist/src/core/renderers/webgl/shaders/SdfShader.js +1 -1
  71. package/dist/src/core/renderers/webgl/shaders/SdfShader.js.map +1 -1
  72. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.d.ts +16 -0
  73. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.js +5 -2
  74. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.js.map +1 -1
  75. package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.d.ts +16 -0
  76. package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.js +5 -2
  77. package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.js.map +1 -1
  78. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.d.ts +16 -0
  79. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.js +5 -2
  80. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.js.map +1 -1
  81. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.d.ts +16 -0
  82. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.js +5 -2
  83. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.js.map +1 -1
  84. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.d.ts +16 -0
  85. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.js +5 -2
  86. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.js.map +1 -1
  87. package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.js +1 -1
  88. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.d.ts +12 -0
  89. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.js +100 -0
  90. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.js.map +1 -0
  91. package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.d.ts +28 -0
  92. package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.js +3 -0
  93. package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.js.map +1 -1
  94. package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.d.ts +3 -0
  95. package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.js +4 -1
  96. package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.js.map +1 -1
  97. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.d.ts +19 -0
  98. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js +5 -2
  99. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js.map +1 -1
  100. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.d.ts +38 -0
  101. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js +116 -0
  102. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js.map +1 -0
  103. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.d.ts +11 -0
  104. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.js +4 -1
  105. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.js.map +1 -1
  106. package/dist/src/core/scene/Scene.js +1 -1
  107. package/dist/src/core/text-rendering/TextTextureRendererUtils.js +1 -1
  108. package/dist/src/core/text-rendering/TrFontManager.js +1 -1
  109. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js +1 -1
  110. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.js +1 -1
  111. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.js +1 -1
  112. package/dist/src/core/text-rendering/font-face-types/TrFontFace.js +1 -1
  113. package/dist/src/core/text-rendering/font-face-types/WebTrFontFace.js +1 -1
  114. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.d.ts +2 -2
  115. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js +5 -2
  116. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js.map +1 -1
  117. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js +1 -1
  118. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.d.ts +2 -2
  119. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js +3 -3
  120. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js.map +1 -1
  121. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.js +1 -1
  122. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.js +1 -1
  123. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.js +1 -1
  124. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.js +1 -1
  125. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.js +1 -1
  126. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js +1 -1
  127. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/makeRenderWindow.js +1 -1
  128. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.js +1 -1
  129. package/dist/src/core/text-rendering/renderers/TextRenderer.d.ts +2 -1
  130. package/dist/src/core/text-rendering/renderers/TextRenderer.js +1 -1
  131. package/dist/src/core/text-rendering/renderers/TextRenderer.js.map +1 -1
  132. package/dist/src/core/textures/ColorTexture.js +1 -1
  133. package/dist/src/core/textures/ImageTexture.js +1 -1
  134. package/dist/src/core/textures/NoiseTexture.js +1 -1
  135. package/dist/src/core/textures/SubTexture.js +1 -1
  136. package/dist/src/core/textures/Texture.js +1 -1
  137. package/dist/src/core/utils.js +1 -1
  138. package/dist/src/main-api/INode.d.ts +19 -0
  139. package/dist/src/main-api/INode.js +1 -1
  140. package/dist/src/main-api/IRenderDriver.js +1 -1
  141. package/dist/src/main-api/RendererMain.d.ts +1 -1
  142. package/dist/src/main-api/RendererMain.js +2 -1
  143. package/dist/src/main-api/RendererMain.js.map +1 -1
  144. package/dist/src/main-api/TextureRegistry.d.ts +33 -0
  145. package/dist/src/main-api/TextureRegistry.js +97 -0
  146. package/dist/src/main-api/TextureRegistry.js.map +1 -0
  147. package/dist/src/main-api/TextureUsageRegistry/TextureRegistry.d.ts +33 -0
  148. package/dist/src/main-api/TextureUsageRegistry/TextureRegistry.js +97 -0
  149. package/dist/src/main-api/TextureUsageRegistry/TextureRegistry.js.map +1 -0
  150. package/dist/src/main-api/texture-usage-trackers/FinalizationRegistryTextureUsageTracker.d.ts +9 -0
  151. package/dist/src/main-api/texture-usage-trackers/FinalizationRegistryTextureUsageTracker.js +38 -0
  152. package/dist/src/main-api/texture-usage-trackers/FinalizationRegistryTextureUsageTracker.js.map +1 -0
  153. package/dist/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.d.ts +56 -0
  154. package/dist/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.js +101 -0
  155. package/dist/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.js.map +1 -0
  156. package/dist/src/main-api/texture-usage-trackers/TextureUsageTracker.d.ts +32 -0
  157. package/dist/src/main-api/texture-usage-trackers/TextureUsageTracker.js +28 -0
  158. package/dist/src/main-api/texture-usage-trackers/TextureUsageTracker.js.map +1 -0
  159. package/dist/src/render-drivers/main/MainOnlyNode.d.ts +2 -0
  160. package/dist/src/render-drivers/main/MainOnlyNode.js +8 -1
  161. package/dist/src/render-drivers/main/MainOnlyNode.js.map +1 -1
  162. package/dist/src/render-drivers/main/MainOnlyTextNode.js +2 -1
  163. package/dist/src/render-drivers/main/MainOnlyTextNode.js.map +1 -1
  164. package/dist/src/render-drivers/main/MainRenderDriver.js +1 -1
  165. package/dist/src/render-drivers/threadx/NodeStruct.d.ts +3 -0
  166. package/dist/src/render-drivers/threadx/NodeStruct.js +10 -1
  167. package/dist/src/render-drivers/threadx/NodeStruct.js.map +1 -1
  168. package/dist/src/render-drivers/threadx/SharedNode.d.ts +1 -0
  169. package/dist/src/render-drivers/threadx/SharedNode.js +2 -1
  170. package/dist/src/render-drivers/threadx/SharedNode.js.map +1 -1
  171. package/dist/src/render-drivers/threadx/TextNodeStruct.js +1 -1
  172. package/dist/src/render-drivers/threadx/ThreadXMainAnimationController.js +1 -1
  173. package/dist/src/render-drivers/threadx/ThreadXMainNode.js +1 -1
  174. package/dist/src/render-drivers/threadx/ThreadXMainTextNode.js +1 -1
  175. package/dist/src/render-drivers/threadx/ThreadXRenderDriver.js +3 -1
  176. package/dist/src/render-drivers/threadx/ThreadXRenderDriver.js.map +1 -1
  177. package/dist/src/render-drivers/threadx/ThreadXRendererMessage.js +1 -1
  178. package/dist/src/render-drivers/threadx/worker/ThreadXRendererNode.js +2 -1
  179. package/dist/src/render-drivers/threadx/worker/ThreadXRendererNode.js.map +1 -1
  180. package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.js +2 -1
  181. package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.js.map +1 -1
  182. package/dist/src/render-drivers/threadx/worker/renderer.js +2 -1
  183. package/dist/src/render-drivers/threadx/worker/renderer.js.map +1 -1
  184. package/dist/src/utils.d.ts +10 -2
  185. package/dist/src/utils.js +13 -3
  186. package/dist/src/utils.js.map +1 -1
  187. package/dist/tsconfig.dist.tsbuildinfo +1 -1
  188. package/package.json +6 -5
  189. package/src/common/CommonTypes.ts +70 -0
  190. package/src/common/EventEmitter.ts +77 -0
  191. package/src/common/IAnimationController.ts +29 -0
  192. package/src/core/CoreExtension.ts +32 -0
  193. package/src/core/CoreNode.ts +700 -0
  194. package/src/core/CoreShaderManager.ts +111 -0
  195. package/src/core/CoreTextNode.ts +342 -0
  196. package/src/core/CoreTextureManager.ts +323 -0
  197. package/src/core/Matrix2DContext.ts +52 -0
  198. package/src/core/Stage.ts +280 -0
  199. package/src/core/animations/AnimationManager.ts +38 -0
  200. package/src/core/animations/CoreAnimation.ts +139 -0
  201. package/src/core/animations/CoreAnimationController.ts +117 -0
  202. package/src/core/lib/glm/common.ts +231 -0
  203. package/src/core/lib/glm/index.ts +31 -0
  204. package/src/core/lib/glm/mat2.ts +499 -0
  205. package/src/core/lib/glm/mat2d.ts +547 -0
  206. package/src/core/lib/glm/mat3.ts +849 -0
  207. package/src/core/lib/glm/mat4.ts +2169 -0
  208. package/src/core/lib/glm/quat.ts +828 -0
  209. package/src/core/lib/glm/quat2.ts +951 -0
  210. package/src/core/lib/glm/vec2.ts +671 -0
  211. package/src/core/lib/glm/vec3.ts +859 -0
  212. package/src/core/lib/glm/vec4.ts +708 -0
  213. package/src/core/lib/utils.ts +144 -0
  214. package/src/core/platform.ts +40 -0
  215. package/src/core/renderers/CoreContextTexture.ts +30 -0
  216. package/src/core/renderers/CoreRenderOp.ts +22 -0
  217. package/src/core/renderers/CoreRenderer.ts +66 -0
  218. package/src/core/renderers/CoreShader.ts +41 -0
  219. package/src/core/renderers/webgl/WebGlCoreCtxSubTexture.ts +36 -0
  220. package/src/core/renderers/webgl/WebGlCoreCtxTexture.ts +208 -0
  221. package/src/core/renderers/webgl/WebGlCoreRenderOp.ts +111 -0
  222. package/src/core/renderers/webgl/WebGlCoreRenderer.ts +567 -0
  223. package/src/core/renderers/webgl/WebGlCoreShader.ts +328 -0
  224. package/src/core/renderers/webgl/internal/BufferCollection.ts +54 -0
  225. package/src/core/renderers/webgl/internal/RendererUtils.ts +134 -0
  226. package/src/core/renderers/webgl/internal/ShaderUtils.ts +135 -0
  227. package/src/core/renderers/webgl/internal/WebGlUtils.ts +35 -0
  228. package/src/core/renderers/webgl/shaders/DefaultShader.ts +95 -0
  229. package/src/core/renderers/webgl/shaders/DefaultShaderBatched.ts +132 -0
  230. package/src/core/renderers/webgl/shaders/DynamicShader.ts +430 -0
  231. package/src/core/renderers/webgl/shaders/RoundedRectangle.ts +168 -0
  232. package/src/core/renderers/webgl/shaders/SdfShader.ts +165 -0
  233. package/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.ts +101 -0
  234. package/src/core/renderers/webgl/shaders/effects/BorderEffect.ts +86 -0
  235. package/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.ts +101 -0
  236. package/src/core/renderers/webgl/shaders/effects/BorderRightEffect.ts +101 -0
  237. package/src/core/renderers/webgl/shaders/effects/BorderTopEffect.ts +101 -0
  238. package/src/core/renderers/webgl/shaders/effects/EffectUtils.ts +33 -0
  239. package/src/core/renderers/webgl/shaders/effects/FadeOutEffect.ts +111 -0
  240. package/src/core/renderers/webgl/shaders/effects/GlitchEffect.ts +145 -0
  241. package/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.ts +37 -0
  242. package/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.ts +182 -0
  243. package/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.ts +159 -0
  244. package/src/core/renderers/webgl/shaders/effects/RadiusEffect.ts +106 -0
  245. package/src/core/renderers/webgl/shaders/effects/ShaderEffect.ts +114 -0
  246. package/src/core/scene/Scene.ts +120 -0
  247. package/src/core/text-rendering/TextTextureRendererUtils.ts +189 -0
  248. package/src/core/text-rendering/TrFontManager.ts +96 -0
  249. package/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.ts +128 -0
  250. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.ts +139 -0
  251. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.test.ts +159 -0
  252. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.ts +164 -0
  253. package/src/core/text-rendering/font-face-types/TrFontFace.ts +105 -0
  254. package/src/core/text-rendering/font-face-types/WebTrFontFace.ts +77 -0
  255. package/src/core/text-rendering/renderers/CanvasTextRenderer.ts +634 -0
  256. package/src/core/text-rendering/renderers/LightningTextTextureRenderer.ts +705 -0
  257. package/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.ts +647 -0
  258. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.test.ts +48 -0
  259. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.ts +66 -0
  260. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.ts +52 -0
  261. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.ts +32 -0
  262. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.ts +76 -0
  263. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.test.ts +133 -0
  264. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.ts +38 -0
  265. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.ts +381 -0
  266. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/makeRenderWindow.test.ts +136 -0
  267. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/makeRenderWindow.ts +64 -0
  268. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.test.ts +41 -0
  269. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.ts +51 -0
  270. package/src/core/text-rendering/renderers/TextRenderer.ts +371 -0
  271. package/src/core/textures/ColorTexture.ts +85 -0
  272. package/src/core/textures/ImageTexture.ts +113 -0
  273. package/src/core/textures/NoiseTexture.ts +96 -0
  274. package/src/core/textures/SubTexture.ts +140 -0
  275. package/src/core/textures/Texture.ts +162 -0
  276. package/src/core/utils.ts +222 -0
  277. package/src/main-api/INode.ts +443 -0
  278. package/src/main-api/IRenderDriver.ts +58 -0
  279. package/src/main-api/RendererMain.ts +451 -0
  280. package/src/render-drivers/main/MainOnlyNode.ts +429 -0
  281. package/src/render-drivers/main/MainOnlyTextNode.ts +220 -0
  282. package/src/render-drivers/main/MainRenderDriver.ts +117 -0
  283. package/src/render-drivers/threadx/NodeStruct.ts +290 -0
  284. package/src/render-drivers/threadx/SharedNode.ts +95 -0
  285. package/src/render-drivers/threadx/TextNodeStruct.ts +166 -0
  286. package/src/render-drivers/threadx/ThreadXMainAnimationController.ts +99 -0
  287. package/src/render-drivers/threadx/ThreadXMainNode.ts +151 -0
  288. package/src/render-drivers/threadx/ThreadXMainTextNode.ts +75 -0
  289. package/src/render-drivers/threadx/ThreadXRenderDriver.ts +247 -0
  290. package/src/render-drivers/threadx/ThreadXRendererMessage.ts +82 -0
  291. package/src/render-drivers/threadx/worker/ThreadXRendererNode.ts +232 -0
  292. package/src/render-drivers/threadx/worker/ThreadXRendererTextNode.ts +146 -0
  293. package/src/render-drivers/threadx/worker/renderer.ts +138 -0
  294. package/src/render-drivers/utils.ts +57 -0
  295. package/src/utils.ts +202 -0
@@ -0,0 +1,634 @@
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 { EventEmitter } from '../../../common/EventEmitter.js';
21
+ import { assertTruthy } from '../../../utils.js';
22
+ import type { Stage } from '../../Stage.js';
23
+ import {
24
+ intersectRect,
25
+ type Bound,
26
+ intersectBound,
27
+ getNormalizedRgbaComponents,
28
+ type Rect,
29
+ } from '../../lib/utils.js';
30
+ import type { ImageTexture } from '../../textures/ImageTexture.js';
31
+ import type { TrFontFace } from '../font-face-types/TrFontFace.js';
32
+ import { WebTrFontFace } from '../font-face-types/WebTrFontFace.js';
33
+ import {
34
+ LightningTextTextureRenderer,
35
+ type RenderInfo,
36
+ } from './LightningTextTextureRenderer.js';
37
+ import {
38
+ TextRenderer,
39
+ type TextRendererState,
40
+ type TrFontProps,
41
+ type TrPropSetters,
42
+ type TrProps,
43
+ } from './TextRenderer.js';
44
+
45
+ /**
46
+ * Global font set regardless of if run in the main thread or a web worker
47
+ */
48
+ const globalFontSet = ((self.document as any)?.fonts ||
49
+ (self as any).fonts) as FontFaceSet;
50
+
51
+ declare module './TextRenderer.js' {
52
+ interface TextRendererMap {
53
+ canvas: CanvasTextRenderer;
54
+ }
55
+ }
56
+
57
+ interface CanvasPageInfo {
58
+ texture: ImageTexture | undefined;
59
+ lineNumStart: number;
60
+ lineNumEnd: number;
61
+ valid: boolean;
62
+ }
63
+
64
+ function getFontCssString(props: TrProps): string {
65
+ const { fontFamily, fontStyle, fontWeight, fontStretch, fontSize } = props;
66
+ return [fontStyle, fontWeight, fontStretch, `${fontSize}px`, fontFamily].join(
67
+ ' ',
68
+ );
69
+ }
70
+
71
+ export interface CanvasTextRendererState extends TextRendererState {
72
+ props: TrProps;
73
+
74
+ fontFaceLoadedHandler: (() => void) | undefined;
75
+ fontInfo:
76
+ | {
77
+ cssString: string;
78
+ loaded: boolean;
79
+ }
80
+ | undefined;
81
+ canvasPages: [CanvasPageInfo, CanvasPageInfo, CanvasPageInfo] | undefined;
82
+ lightning2TextRenderer: LightningTextTextureRenderer;
83
+ renderInfo: RenderInfo | undefined;
84
+ renderWindow: Bound | undefined;
85
+ }
86
+
87
+ export class CanvasTextRenderer extends TextRenderer<CanvasTextRendererState> {
88
+ protected canvas: OffscreenCanvas;
89
+ protected context: OffscreenCanvasRenderingContext2D;
90
+
91
+ constructor(stage: Stage) {
92
+ super(stage);
93
+ this.canvas = new OffscreenCanvas(0, 0);
94
+ const context = this.canvas.getContext('2d');
95
+ assertTruthy(context);
96
+ this.context = context;
97
+ }
98
+
99
+ //#region Overrides
100
+ override getPropertySetters(): Partial<
101
+ TrPropSetters<CanvasTextRendererState>
102
+ > {
103
+ return {
104
+ fontFamily: (state, value) => {
105
+ state.props.fontFamily = value;
106
+ state.fontInfo = undefined;
107
+ this.markForReload(state);
108
+ },
109
+ fontWeight: (state, value) => {
110
+ state.props.fontWeight = value;
111
+ state.fontInfo = undefined;
112
+ this.markForReload(state);
113
+ },
114
+ fontStyle: (state, value) => {
115
+ state.props.fontStyle = value;
116
+ state.fontInfo = undefined;
117
+ this.markForReload(state);
118
+ },
119
+ fontStretch: (state, value) => {
120
+ state.props.fontStretch = value;
121
+ state.fontInfo = undefined;
122
+ this.markForReload(state);
123
+ },
124
+ fontSize: (state, value) => {
125
+ state.props.fontSize = value;
126
+ state.fontInfo = undefined;
127
+ this.markForReload(state);
128
+ },
129
+ text: (state, value) => {
130
+ state.props.text = value;
131
+ this.markForReload(state);
132
+ },
133
+ textAlign: (state, value) => {
134
+ state.props.textAlign = value;
135
+ this.markForReload(state);
136
+ },
137
+ color: (state, value) => {
138
+ state.props.color = value;
139
+ this.markForReload(state);
140
+ },
141
+ x: (state, value) => {
142
+ state.props.x = value;
143
+ },
144
+ y: (state, value) => {
145
+ state.props.y = value;
146
+ },
147
+ contain: (state, value) => {
148
+ state.props.contain = value;
149
+ this.markForReload(state);
150
+ },
151
+ width: (state, value) => {
152
+ state.props.width = value;
153
+ this.markForReload(state);
154
+ },
155
+ height: (state, value) => {
156
+ state.props.height = value;
157
+ this.markForReload(state);
158
+ },
159
+ offsetY: (state, value) => {
160
+ state.props.offsetY = value;
161
+ this.markForReload(state);
162
+ },
163
+ scrollY: (state, value) => {
164
+ state.props.scrollY = value;
165
+ },
166
+ letterSpacing: (state, value) => {
167
+ state.props.letterSpacing = value;
168
+ this.markForReload(state);
169
+ },
170
+ // debug: (state, value) => {
171
+ // state.props.debug = value;
172
+ // },
173
+ };
174
+ }
175
+
176
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
177
+ override canRenderFont(props: TrFontProps): boolean {
178
+ // The canvas renderer can render any font because it automatically
179
+ // falls back to system fonts. The CanvasTextRenderer should be
180
+ // checked last if other renderers are preferred.
181
+ return true;
182
+ }
183
+
184
+ override isFontFaceSupported(fontFace: TrFontFace): boolean {
185
+ return fontFace instanceof WebTrFontFace;
186
+ }
187
+
188
+ override addFontFace(fontFace: TrFontFace): void {
189
+ // Make sure the font face is an Canvas font face (it should have already passed
190
+ // the `isFontFaceSupported` check)
191
+ assertTruthy(fontFace instanceof WebTrFontFace);
192
+
193
+ // We simply add the font face to the document
194
+ // @ts-expect-error `add()` method should be available from a FontFaceSet
195
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call
196
+ globalFontSet.add(fontFace.fontFace);
197
+ }
198
+
199
+ override createState(props: TrProps): CanvasTextRendererState {
200
+ return {
201
+ props,
202
+ status: 'initialState',
203
+ emitter: new EventEmitter(),
204
+ canvasPages: undefined,
205
+ lightning2TextRenderer: new LightningTextTextureRenderer(
206
+ this.canvas,
207
+ this.context,
208
+ ),
209
+ renderWindow: undefined,
210
+ renderInfo: undefined,
211
+ forceFullLayoutCalc: false,
212
+ textW: 0,
213
+ textH: 0,
214
+ fontInfo: undefined,
215
+ fontFaceLoadedHandler: undefined,
216
+ debugData: {
217
+ updateCount: 0,
218
+ layoutCount: 0,
219
+ drawCount: 0,
220
+ lastLayoutNumCharacters: 0,
221
+ layoutSum: 0,
222
+ drawSum: 0,
223
+ bufferSize: 0,
224
+ },
225
+ };
226
+ }
227
+
228
+ override updateState(state: CanvasTextRendererState): void {
229
+ // On the first update call we need to set the status to loading
230
+ if (state.status === 'initialState') {
231
+ this.setStatus(state, 'loading');
232
+ }
233
+
234
+ // If fontInfo is invalid, we need to establish it
235
+ if (!state.fontInfo) {
236
+ const cssString = getFontCssString(state.props);
237
+ state.fontInfo = {
238
+ cssString: cssString,
239
+ // TODO: For efficiency we would use this here but it's not reliable on WPE -> document.fonts.check(cssString),
240
+ loaded: false,
241
+ };
242
+ // If font is not loaded, set up a handler to update the font info when the font loads
243
+ if (!state.fontInfo.loaded) {
244
+ globalFontSet
245
+ .load(cssString)
246
+ .then(this.onFontLoaded.bind(this, state, cssString))
247
+ .catch(this.onFontLoadError.bind(this, state, cssString));
248
+ return;
249
+ }
250
+ }
251
+
252
+ // If we're waiting for a font face to load, don't render anything
253
+ if (!state.fontInfo.loaded) {
254
+ return;
255
+ }
256
+
257
+ if (!state.renderInfo) {
258
+ state.lightning2TextRenderer.settings = {
259
+ text: state.props.text,
260
+ textAlign: state.props.textAlign,
261
+ fontFace: state.props.fontFamily,
262
+ fontSize: state.props.fontSize,
263
+ fontStyle: [
264
+ state.props.fontStretch,
265
+ state.props.fontStyle,
266
+ state.props.fontWeight,
267
+ ].join(' '),
268
+ textColor: getNormalizedRgbaComponents(state.props.color),
269
+ offsetY: state.props.fontSize + state.props.offsetY,
270
+ wordWrap: state.props.contain !== 'none',
271
+ wordWrapWidth:
272
+ state.props.contain === 'none' ? undefined : state.props.width,
273
+ letterSpacing: state.props.letterSpacing,
274
+ };
275
+ const renderInfoCalculateTime = performance.now();
276
+ state.renderInfo = state.lightning2TextRenderer.calculateRenderInfo();
277
+ console.log(
278
+ 'Render info calculated in',
279
+ performance.now() - renderInfoCalculateTime,
280
+ 'ms',
281
+ );
282
+ state.textH = state.renderInfo.lineHeight * state.renderInfo.lines.length;
283
+ state.textW = state.renderInfo.width;
284
+
285
+ // Invalidate renderWindow because the renderInfo changed
286
+ state.renderWindow = undefined;
287
+ }
288
+
289
+ const { x, y, width, height, scrollY, contain } = state.props;
290
+
291
+ let { renderWindow, canvasPages } = state;
292
+
293
+ // Figure out whats actually in the bounds of the renderer/canvas (visibleWindow)
294
+ const rendererBounds: Bound = {
295
+ x1: 0,
296
+ y1: 0,
297
+ x2: this.stage.options.appWidth,
298
+ y2: this.stage.options.appHeight,
299
+ };
300
+ const elementBounds: Bound = {
301
+ x1: x,
302
+ y1: y,
303
+ x2: contain !== 'none' ? x + width : Infinity,
304
+ y2: contain === 'both' ? y + height : Infinity,
305
+ };
306
+ /**
307
+ * Area that is visible on the screen.
308
+ */
309
+ const visibleWindow: Bound = intersectBound(rendererBounds, elementBounds);
310
+
311
+ const visibleWindowHeight = visibleWindow.y2 - visibleWindow.y1;
312
+
313
+ const maxLinesPerCanvasPage = Math.ceil(
314
+ visibleWindowHeight / state.renderInfo.lineHeight,
315
+ );
316
+
317
+ // Return early if we're still viewing inside the established render window
318
+ // No need to re-render what we've already rendered
319
+ if (renderWindow && canvasPages) {
320
+ const renderWindowScreenX1 = x + renderWindow.x1;
321
+ const renderWindowScreenY1 = y - scrollY + renderWindow.y1;
322
+ const renderWindowScreenX2 = x + renderWindow.x2;
323
+ const renderWindowScreenY2 = y - scrollY + renderWindow.y2;
324
+
325
+ if (
326
+ renderWindowScreenX1 <= visibleWindow.x1 &&
327
+ renderWindowScreenX2 >= visibleWindow.x2 &&
328
+ renderWindowScreenY1 <= visibleWindow.y1 &&
329
+ renderWindowScreenY2 >= visibleWindow.y2
330
+ )
331
+ return;
332
+ if (renderWindowScreenY2 < visibleWindow.y2) {
333
+ // We've scrolled up, so we need to render the next page
334
+ renderWindow.y1 += maxLinesPerCanvasPage * state.renderInfo.lineHeight;
335
+ renderWindow.y2 += maxLinesPerCanvasPage * state.renderInfo.lineHeight;
336
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
337
+ canvasPages.push(canvasPages.shift()!);
338
+ canvasPages[2].lineNumStart =
339
+ canvasPages[1].lineNumStart + maxLinesPerCanvasPage;
340
+ canvasPages[2].lineNumEnd =
341
+ canvasPages[2].lineNumStart + maxLinesPerCanvasPage;
342
+ canvasPages[2].valid = false;
343
+ } else if (renderWindowScreenY1 > visibleWindow.y1) {
344
+ // We've scrolled down, so we need to render the previous page
345
+ renderWindow.y1 -= maxLinesPerCanvasPage * state.renderInfo.lineHeight;
346
+ renderWindow.y2 -= maxLinesPerCanvasPage * state.renderInfo.lineHeight;
347
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
348
+ canvasPages.unshift(canvasPages.pop()!);
349
+ canvasPages[0].lineNumStart =
350
+ canvasPages[1].lineNumStart - maxLinesPerCanvasPage;
351
+ canvasPages[0].lineNumEnd =
352
+ canvasPages[0].lineNumStart + maxLinesPerCanvasPage;
353
+ canvasPages[0].valid = false;
354
+ }
355
+ } else {
356
+ const pageHeight = state.renderInfo.lineHeight * maxLinesPerCanvasPage;
357
+ const page1Block = Math.ceil(scrollY / pageHeight);
358
+ const page1LineStart = page1Block * maxLinesPerCanvasPage;
359
+ const page0LineStart = page1LineStart - maxLinesPerCanvasPage;
360
+ const page2LineStart = page1LineStart + maxLinesPerCanvasPage;
361
+
362
+ // We haven't rendered anything yet, so we need to render the first page
363
+ // If canvasPages already exist, let's re-use the textures
364
+ canvasPages = [
365
+ {
366
+ texture: canvasPages?.[0].texture,
367
+ lineNumStart: page0LineStart,
368
+ lineNumEnd: page0LineStart + maxLinesPerCanvasPage,
369
+ valid: false,
370
+ },
371
+ {
372
+ texture: canvasPages?.[1].texture,
373
+ lineNumStart: page1LineStart,
374
+ lineNumEnd: page1LineStart + maxLinesPerCanvasPage,
375
+ valid: false,
376
+ },
377
+ {
378
+ texture: canvasPages?.[2].texture,
379
+ lineNumStart: page2LineStart,
380
+ lineNumEnd: page2LineStart + maxLinesPerCanvasPage,
381
+ valid: false,
382
+ },
383
+ ];
384
+ state.canvasPages = canvasPages;
385
+
386
+ const scrollYNearestPage = Math.ceil(scrollY / pageHeight) * pageHeight;
387
+
388
+ renderWindow = {
389
+ x1: 0,
390
+ y1: scrollYNearestPage - pageHeight,
391
+ x2: width,
392
+ y2: scrollYNearestPage + pageHeight * 2,
393
+ };
394
+ }
395
+
396
+ state.renderWindow = renderWindow;
397
+
398
+ const pageDrawTime = performance.now();
399
+ for (const pageInfo of canvasPages) {
400
+ if (pageInfo.valid) continue;
401
+ if (pageInfo.lineNumStart < 0) {
402
+ pageInfo.texture = this.stage.txManager.loadTexture('ImageTexture', {
403
+ src: '',
404
+ });
405
+ pageInfo.valid = true;
406
+ continue;
407
+ }
408
+ state.lightning2TextRenderer.draw(state.renderInfo, {
409
+ lines: state.renderInfo.lines.slice(
410
+ pageInfo.lineNumStart,
411
+ pageInfo.lineNumEnd,
412
+ ),
413
+ lineWidths: state.renderInfo.lineWidths.slice(
414
+ pageInfo.lineNumStart,
415
+ pageInfo.lineNumEnd,
416
+ ),
417
+ });
418
+ if (!(this.canvas.width === 0 || this.canvas.height === 0)) {
419
+ pageInfo.texture = this.stage.txManager.loadTexture(
420
+ 'ImageTexture',
421
+ {
422
+ src: this.context.getImageData(
423
+ 0,
424
+ 0,
425
+ this.canvas.width,
426
+ this.canvas.height,
427
+ ),
428
+ },
429
+ {
430
+ preload: true,
431
+ },
432
+ );
433
+ }
434
+ pageInfo.valid = true;
435
+ }
436
+ console.log('pageDrawTime', performance.now() - pageDrawTime, 'ms');
437
+
438
+ // Report final status
439
+ this.setStatus(state, 'loaded');
440
+ }
441
+
442
+ override renderQuads(
443
+ state: CanvasTextRendererState,
444
+ clippingRect: Rect | null,
445
+ ): void {
446
+ const { stage } = this;
447
+
448
+ const { canvasPages, textW = 0, textH = 0, renderWindow } = state;
449
+
450
+ if (!canvasPages || !renderWindow) return;
451
+
452
+ const { x, y, scrollY, contain, width, height /*, debug*/ } = state.props;
453
+
454
+ const elementRect = {
455
+ x: x,
456
+ y: y,
457
+ width: contain !== 'none' ? width : textW,
458
+ height: contain === 'both' ? height : textH,
459
+ };
460
+
461
+ const visibleRect = intersectRect(
462
+ {
463
+ x: 0,
464
+ y: 0,
465
+ width: stage.options.appWidth,
466
+ height: stage.options.appHeight,
467
+ },
468
+ elementRect,
469
+ );
470
+
471
+ // if (!debug.disableScissor) {
472
+ // renderer.enableScissor(
473
+ // visibleRect.x,
474
+ // visibleRect.y,
475
+ // visibleRect.w,
476
+ // visibleRect.h,
477
+ // );
478
+ // }
479
+
480
+ assertTruthy(canvasPages, 'canvasPages is not defined');
481
+ assertTruthy(renderWindow, 'renderWindow is not defined');
482
+
483
+ const renderWindowHeight = renderWindow.y2 - renderWindow.y1;
484
+ const pageSize = renderWindowHeight / 3.0;
485
+
486
+ const { zIndex, alpha } = state.props;
487
+
488
+ if (canvasPages[0].valid) {
489
+ this.stage.renderer.addRenderable({
490
+ alpha,
491
+ clippingRect,
492
+ colorBl: 0xffffffff,
493
+ colorBr: 0xffffffff,
494
+ colorTl: 0xffffffff,
495
+ colorTr: 0xffffffff,
496
+ width: canvasPages[0].texture?.dimensions?.width || 0,
497
+ height: canvasPages[0].texture?.dimensions?.height || 0,
498
+ texture: canvasPages[0].texture!,
499
+ textureOptions: {},
500
+ shader: null,
501
+ shaderProps: null,
502
+ zIndex,
503
+ worldScale: 1,
504
+ scale: 1,
505
+ wpx: x,
506
+ wpy: y - scrollY + renderWindow.y1,
507
+ ta: 1,
508
+ tb: 0,
509
+ tc: 0,
510
+ td: 1,
511
+ });
512
+ }
513
+ if (canvasPages[1].valid) {
514
+ this.stage.renderer.addRenderable({
515
+ alpha,
516
+ clippingRect,
517
+ colorBl: 0xffffffff,
518
+ colorBr: 0xffffffff,
519
+ colorTl: 0xffffffff,
520
+ colorTr: 0xffffffff,
521
+ width: canvasPages[1].texture?.dimensions?.width || 0,
522
+ height: canvasPages[1].texture?.dimensions?.height || 0,
523
+ texture: canvasPages[1].texture!,
524
+ textureOptions: {},
525
+ shader: null,
526
+ shaderProps: null,
527
+ zIndex,
528
+ worldScale: 1,
529
+ scale: 1,
530
+ wpx: x,
531
+ wpy: y - scrollY + renderWindow.y1 + pageSize,
532
+ ta: 1,
533
+ tb: 0,
534
+ tc: 0,
535
+ td: 1,
536
+ });
537
+ }
538
+ if (canvasPages[2].valid) {
539
+ this.stage.renderer.addRenderable({
540
+ alpha,
541
+ clippingRect,
542
+ colorBl: 0xffffffff,
543
+ colorBr: 0xffffffff,
544
+ colorTl: 0xffffffff,
545
+ colorTr: 0xffffffff,
546
+ width: canvasPages[2].texture?.dimensions?.width || 0,
547
+ height: canvasPages[2].texture?.dimensions?.height || 0,
548
+ texture: canvasPages[2].texture!,
549
+ textureOptions: {},
550
+ shader: null,
551
+ shaderProps: null,
552
+ zIndex,
553
+ worldScale: 1,
554
+ scale: 1,
555
+ wpx: x,
556
+ wpy: y - scrollY + renderWindow.y1 + pageSize + pageSize,
557
+ ta: 1,
558
+ tb: 0,
559
+ tc: 0,
560
+ td: 1,
561
+ });
562
+ }
563
+
564
+ // renderer.disableScissor();
565
+
566
+ // if (debug.showElementRect) {
567
+ // this.renderer.drawBorder(
568
+ // Colors.Blue,
569
+ // elementRect.x,
570
+ // elementRect.y,
571
+ // elementRect.w,
572
+ // elementRect.h,
573
+ // );
574
+ // }
575
+
576
+ // if (debug.showVisibleRect) {
577
+ // this.renderer.drawBorder(
578
+ // Colors.Green,
579
+ // visibleRect.x,
580
+ // visibleRect.y,
581
+ // visibleRect.w,
582
+ // visibleRect.h,
583
+ // );
584
+ // }
585
+
586
+ // if (debug.showRenderWindow && renderWindow) {
587
+ // this.renderer.drawBorder(
588
+ // Colors.Red,
589
+ // x + renderWindow.x1,
590
+ // y + renderWindow.y1 - scrollY,
591
+ // x + renderWindow.x2 - (x + renderWindow.x1),
592
+ // y + renderWindow.y2 - scrollY - (y + renderWindow.y1 - scrollY),
593
+ // );
594
+ // }
595
+ }
596
+ //#endregion Overrides
597
+
598
+ private markForReload(state: CanvasTextRendererState): void {
599
+ state.renderInfo = undefined;
600
+ this.setStatus(state, 'loading');
601
+ }
602
+
603
+ private onFontLoaded(
604
+ state: CanvasTextRendererState,
605
+ cssString: string,
606
+ ): void {
607
+ if (cssString !== state.fontInfo?.cssString || !state.fontInfo) {
608
+ return;
609
+ }
610
+ state.fontInfo.loaded = true;
611
+ this.updateState(state);
612
+ }
613
+
614
+ private onFontLoadError(
615
+ state: CanvasTextRendererState,
616
+ cssString: string,
617
+ error: Error,
618
+ ): void {
619
+ if (cssString !== state.fontInfo?.cssString || !state.fontInfo) {
620
+ return;
621
+ }
622
+
623
+ // Font didn't actually load, but we'll log the error and mark it as loaded
624
+ // because the browser can still render with a fallback font.
625
+ state.fontInfo.loaded = true;
626
+
627
+ console.error(
628
+ `CanvasTextRenderer: Error loading font '${state.fontInfo.cssString}'`,
629
+ error,
630
+ );
631
+
632
+ this.updateState(state);
633
+ }
634
+ }