@lightningtv/renderer 3.0.0-beta1 → 3.2.3

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 (497) hide show
  1. package/NOTICE +4 -0
  2. package/README.md +22 -28
  3. package/dist/exports/canvas-shaders.js +0 -16
  4. package/dist/exports/canvas-shaders.js.map +1 -1
  5. package/dist/exports/canvas.d.ts +1 -1
  6. package/dist/exports/canvas.js +1 -19
  7. package/dist/exports/canvas.js.map +1 -1
  8. package/dist/exports/index.d.ts +2 -5
  9. package/dist/exports/index.js +1 -23
  10. package/dist/exports/index.js.map +1 -1
  11. package/dist/exports/inspector.js +0 -18
  12. package/dist/exports/inspector.js.map +1 -1
  13. package/dist/exports/utils.d.ts +2 -1
  14. package/dist/exports/utils.js +2 -19
  15. package/dist/exports/utils.js.map +1 -1
  16. package/dist/exports/webgl-shaders.js +0 -16
  17. package/dist/exports/webgl-shaders.js.map +1 -1
  18. package/dist/exports/webgl.d.ts +2 -1
  19. package/dist/exports/webgl.js +2 -19
  20. package/dist/exports/webgl.js.map +1 -1
  21. package/dist/src/common/CommonTypes.d.ts +15 -3
  22. package/dist/src/common/CommonTypes.js +0 -18
  23. package/dist/src/common/CommonTypes.js.map +1 -1
  24. package/dist/src/common/EventEmitter.js +0 -18
  25. package/dist/src/common/EventEmitter.js.map +1 -1
  26. package/dist/src/common/IEventEmitter.js +0 -16
  27. package/dist/src/common/IEventEmitter.js.map +1 -1
  28. package/dist/src/core/Autosizer.d.ts +35 -0
  29. package/dist/src/core/Autosizer.js +178 -0
  30. package/dist/src/core/Autosizer.js.map +1 -0
  31. package/dist/src/core/CoreNode.d.ts +140 -102
  32. package/dist/src/core/CoreNode.js +812 -528
  33. package/dist/src/core/CoreNode.js.map +1 -1
  34. package/dist/src/core/CoreShaderManager.d.ts +3 -3
  35. package/dist/src/core/CoreShaderManager.js +0 -18
  36. package/dist/src/core/CoreShaderManager.js.map +1 -1
  37. package/dist/src/core/CoreTextNode.d.ts +75 -87
  38. package/dist/src/core/CoreTextNode.js +380 -258
  39. package/dist/src/core/CoreTextNode.js.map +1 -1
  40. package/dist/src/core/CoreTextureManager.d.ts +25 -14
  41. package/dist/src/core/CoreTextureManager.js +82 -139
  42. package/dist/src/core/CoreTextureManager.js.map +1 -1
  43. package/dist/src/core/Stage.d.ts +102 -36
  44. package/dist/src/core/Stage.js +424 -191
  45. package/dist/src/core/Stage.js.map +1 -1
  46. package/dist/src/core/TextureError.d.ts +11 -0
  47. package/dist/src/core/TextureError.js +37 -0
  48. package/dist/src/core/TextureError.js.map +1 -0
  49. package/dist/src/core/TextureMemoryManager.d.ts +11 -4
  50. package/dist/src/core/TextureMemoryManager.js +114 -134
  51. package/dist/src/core/TextureMemoryManager.js.map +1 -1
  52. package/dist/src/core/animations/AnimationManager.js +0 -18
  53. package/dist/src/core/animations/AnimationManager.js.map +1 -1
  54. package/dist/src/core/animations/CoreAnimation.d.ts +3 -3
  55. package/dist/src/core/animations/CoreAnimation.js +8 -24
  56. package/dist/src/core/animations/CoreAnimation.js.map +1 -1
  57. package/dist/src/core/animations/CoreAnimationController.d.ts +1 -0
  58. package/dist/src/core/animations/CoreAnimationController.js +11 -22
  59. package/dist/src/core/animations/CoreAnimationController.js.map +1 -1
  60. package/dist/src/core/lib/ContextSpy.js +0 -18
  61. package/dist/src/core/lib/ContextSpy.js.map +1 -1
  62. package/dist/src/core/lib/ImageWorker.d.ts +2 -2
  63. package/dist/src/core/lib/ImageWorker.js +33 -31
  64. package/dist/src/core/lib/ImageWorker.js.map +1 -1
  65. package/dist/src/core/lib/Matrix3d.d.ts +1 -0
  66. package/dist/src/core/lib/Matrix3d.js +7 -19
  67. package/dist/src/core/lib/Matrix3d.js.map +1 -1
  68. package/dist/src/core/lib/RenderCoords.d.ts +9 -10
  69. package/dist/src/core/lib/RenderCoords.js +27 -55
  70. package/dist/src/core/lib/RenderCoords.js.map +1 -1
  71. package/dist/src/core/lib/WebGlContextWrapper.d.ts +83 -8
  72. package/dist/src/core/lib/WebGlContextWrapper.js +150 -25
  73. package/dist/src/core/lib/WebGlContextWrapper.js.map +1 -1
  74. package/dist/src/core/lib/collectionUtils.d.ts +5 -0
  75. package/dist/src/core/lib/collectionUtils.js +82 -0
  76. package/dist/src/core/lib/collectionUtils.js.map +1 -0
  77. package/dist/src/core/lib/colorCache.d.ts +1 -0
  78. package/dist/src/core/lib/colorCache.js +19 -0
  79. package/dist/src/core/lib/colorCache.js.map +1 -0
  80. package/dist/src/core/{renderers/canvas/internal/ColorUtils.js → lib/colorParser.js} +1 -19
  81. package/dist/src/core/lib/colorParser.js.map +1 -0
  82. package/dist/src/core/lib/textureCompression.d.ts +14 -2
  83. package/dist/src/core/lib/textureCompression.js +320 -85
  84. package/dist/src/core/lib/textureCompression.js.map +1 -1
  85. package/dist/src/core/lib/textureSvg.js +0 -18
  86. package/dist/src/core/lib/textureSvg.js.map +1 -1
  87. package/dist/src/core/lib/utils.d.ts +8 -1
  88. package/dist/src/core/lib/utils.js +44 -20
  89. package/dist/src/core/lib/utils.js.map +1 -1
  90. package/dist/src/core/lib/validateImageBitmap.d.ts +2 -1
  91. package/dist/src/core/lib/validateImageBitmap.js +4 -4
  92. package/dist/src/core/lib/validateImageBitmap.js.map +1 -1
  93. package/dist/src/core/platforms/Platform.d.ts +42 -0
  94. package/dist/src/core/platforms/Platform.js +4 -0
  95. package/dist/src/core/platforms/Platform.js.map +1 -0
  96. package/dist/src/core/platforms/web/WebPlatform.d.ts +10 -0
  97. package/dist/src/core/platforms/web/WebPlatform.js +90 -0
  98. package/dist/src/core/platforms/web/WebPlatform.js.map +1 -0
  99. package/dist/src/core/renderers/CoreContextTexture.d.ts +2 -1
  100. package/dist/src/core/renderers/CoreContextTexture.js +0 -18
  101. package/dist/src/core/renderers/CoreContextTexture.js.map +1 -1
  102. package/dist/src/core/renderers/CoreRenderOp.js +0 -18
  103. package/dist/src/core/renderers/CoreRenderOp.js.map +1 -1
  104. package/dist/src/core/renderers/CoreRenderer.d.ts +15 -3
  105. package/dist/src/core/renderers/CoreRenderer.js +1 -18
  106. package/dist/src/core/renderers/CoreRenderer.js.map +1 -1
  107. package/dist/src/core/renderers/CoreShaderNode.d.ts +13 -3
  108. package/dist/src/core/renderers/CoreShaderNode.js +25 -2
  109. package/dist/src/core/renderers/CoreShaderNode.js.map +1 -1
  110. package/dist/src/core/renderers/CoreShaderProgram.js +0 -18
  111. package/dist/src/core/renderers/CoreShaderProgram.js.map +1 -1
  112. package/dist/src/core/renderers/canvas/CanvasRenderer.d.ts +4 -5
  113. package/dist/src/core/renderers/canvas/CanvasRenderer.js +89 -83
  114. package/dist/src/core/renderers/canvas/CanvasRenderer.js.map +1 -1
  115. package/dist/src/core/renderers/canvas/CanvasShaderNode.js +3 -21
  116. package/dist/src/core/renderers/canvas/CanvasShaderNode.js.map +1 -1
  117. package/dist/src/core/renderers/canvas/CanvasTexture.d.ts +3 -2
  118. package/dist/src/core/renderers/canvas/CanvasTexture.js +18 -31
  119. package/dist/src/core/renderers/canvas/CanvasTexture.js.map +1 -1
  120. package/dist/src/core/renderers/webgl/SdfRenderOp.d.ts +33 -0
  121. package/dist/src/core/renderers/webgl/SdfRenderOp.js +80 -0
  122. package/dist/src/core/renderers/webgl/SdfRenderOp.js.map +1 -0
  123. package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.d.ts +2 -0
  124. package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.js +14 -24
  125. package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.js.map +1 -1
  126. package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.d.ts +13 -0
  127. package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.js +34 -23
  128. package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.js.map +1 -1
  129. package/dist/src/core/renderers/webgl/WebGlCtxTexture.d.ts +16 -6
  130. package/dist/src/core/renderers/webgl/WebGlCtxTexture.js +102 -70
  131. package/dist/src/core/renderers/webgl/WebGlCtxTexture.js.map +1 -1
  132. package/dist/src/core/renderers/webgl/WebGlRenderer.d.ts +34 -20
  133. package/dist/src/core/renderers/webgl/WebGlRenderer.js +319 -195
  134. package/dist/src/core/renderers/webgl/WebGlRenderer.js.map +1 -1
  135. package/dist/src/core/renderers/webgl/WebGlShaderNode.d.ts +2 -3
  136. package/dist/src/core/renderers/webgl/WebGlShaderNode.js +1 -4
  137. package/dist/src/core/renderers/webgl/WebGlShaderNode.js.map +1 -1
  138. package/dist/src/core/renderers/webgl/WebGlShaderProgram.d.ts +9 -7
  139. package/dist/src/core/renderers/webgl/WebGlShaderProgram.js +99 -48
  140. package/dist/src/core/renderers/webgl/WebGlShaderProgram.js.map +1 -1
  141. package/dist/src/core/renderers/webgl/internal/BufferCollection.d.ts +1 -0
  142. package/dist/src/core/renderers/webgl/internal/BufferCollection.js +12 -21
  143. package/dist/src/core/renderers/webgl/internal/BufferCollection.js.map +1 -1
  144. package/dist/src/core/renderers/webgl/internal/RendererUtils.js +0 -18
  145. package/dist/src/core/renderers/webgl/internal/RendererUtils.js.map +1 -1
  146. package/dist/src/core/renderers/webgl/internal/ShaderUtils.js +0 -18
  147. package/dist/src/core/renderers/webgl/internal/ShaderUtils.js.map +1 -1
  148. package/dist/src/core/renderers/webgl/internal/WebGlUtils.js +0 -18
  149. package/dist/src/core/renderers/webgl/internal/WebGlUtils.js.map +1 -1
  150. package/dist/src/core/shaders/canvas/Border.d.ts +8 -2
  151. package/dist/src/core/shaders/canvas/Border.js +67 -41
  152. package/dist/src/core/shaders/canvas/Border.js.map +1 -1
  153. package/dist/src/core/shaders/canvas/HolePunch.js +3 -19
  154. package/dist/src/core/shaders/canvas/HolePunch.js.map +1 -1
  155. package/dist/src/core/shaders/canvas/LinearGradient.js +7 -21
  156. package/dist/src/core/shaders/canvas/LinearGradient.js.map +1 -1
  157. package/dist/src/core/shaders/canvas/RadialGradient.js +14 -28
  158. package/dist/src/core/shaders/canvas/RadialGradient.js.map +1 -1
  159. package/dist/src/core/shaders/canvas/Rounded.js +1 -17
  160. package/dist/src/core/shaders/canvas/Rounded.js.map +1 -1
  161. package/dist/src/core/shaders/canvas/RoundedWithBorder.d.ts +6 -3
  162. package/dist/src/core/shaders/canvas/RoundedWithBorder.js +44 -22
  163. package/dist/src/core/shaders/canvas/RoundedWithBorder.js.map +1 -1
  164. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.d.ts +2 -3
  165. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.js +47 -25
  166. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.js.map +1 -1
  167. package/dist/src/core/shaders/canvas/RoundedWithShadow.js +9 -21
  168. package/dist/src/core/shaders/canvas/RoundedWithShadow.js.map +1 -1
  169. package/dist/src/core/shaders/canvas/Shadow.js +0 -16
  170. package/dist/src/core/shaders/canvas/Shadow.js.map +1 -1
  171. package/dist/src/core/shaders/canvas/utils/render.d.ts +1 -1
  172. package/dist/src/core/shaders/canvas/utils/render.js +31 -34
  173. package/dist/src/core/shaders/canvas/utils/render.js.map +1 -1
  174. package/dist/src/core/shaders/templates/BorderTemplate.d.ts +12 -2
  175. package/dist/src/core/shaders/templates/BorderTemplate.js +31 -27
  176. package/dist/src/core/shaders/templates/BorderTemplate.js.map +1 -1
  177. package/dist/src/core/shaders/templates/HolePunchTemplate.d.ts +2 -2
  178. package/dist/src/core/shaders/templates/HolePunchTemplate.js +3 -19
  179. package/dist/src/core/shaders/templates/HolePunchTemplate.js.map +1 -1
  180. package/dist/src/core/shaders/templates/LinearGradientTemplate.js +0 -16
  181. package/dist/src/core/shaders/templates/LinearGradientTemplate.js.map +1 -1
  182. package/dist/src/core/shaders/templates/RadialGradientTemplate.d.ts +8 -6
  183. package/dist/src/core/shaders/templates/RadialGradientTemplate.js +2 -18
  184. package/dist/src/core/shaders/templates/RadialGradientTemplate.js.map +1 -1
  185. package/dist/src/core/shaders/templates/RoundedTemplate.js +1 -17
  186. package/dist/src/core/shaders/templates/RoundedTemplate.js.map +1 -1
  187. package/dist/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.d.ts +1 -1
  188. package/dist/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.js +0 -16
  189. package/dist/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.js.map +1 -1
  190. package/dist/src/core/shaders/templates/RoundedWithBorderTemplate.d.ts +4 -2
  191. package/dist/src/core/shaders/templates/RoundedWithBorderTemplate.js +3 -17
  192. package/dist/src/core/shaders/templates/RoundedWithBorderTemplate.js.map +1 -1
  193. package/dist/src/core/shaders/templates/RoundedWithShadowTemplate.d.ts +1 -1
  194. package/dist/src/core/shaders/templates/RoundedWithShadowTemplate.js +0 -16
  195. package/dist/src/core/shaders/templates/RoundedWithShadowTemplate.js.map +1 -1
  196. package/dist/src/core/shaders/templates/ShadowTemplate.d.ts +1 -1
  197. package/dist/src/core/shaders/templates/ShadowTemplate.js +0 -16
  198. package/dist/src/core/shaders/templates/ShadowTemplate.js.map +1 -1
  199. package/dist/src/core/shaders/{templates/shaderUtils.d.ts → utils.d.ts} +1 -1
  200. package/dist/src/core/shaders/utils.js +25 -0
  201. package/dist/src/core/shaders/utils.js.map +1 -0
  202. package/dist/src/core/shaders/webgl/Border.js +118 -51
  203. package/dist/src/core/shaders/webgl/Border.js.map +1 -1
  204. package/dist/src/core/shaders/webgl/Default.js +6 -41
  205. package/dist/src/core/shaders/webgl/Default.js.map +1 -1
  206. package/dist/src/core/shaders/webgl/HolePunch.js +4 -19
  207. package/dist/src/core/shaders/webgl/HolePunch.js.map +1 -1
  208. package/dist/src/core/shaders/webgl/LinearGradient.js +73 -34
  209. package/dist/src/core/shaders/webgl/LinearGradient.js.map +1 -1
  210. package/dist/src/core/shaders/webgl/RadialGradient.js +56 -48
  211. package/dist/src/core/shaders/webgl/RadialGradient.js.map +1 -1
  212. package/dist/src/core/shaders/webgl/Rounded.js +25 -23
  213. package/dist/src/core/shaders/webgl/Rounded.js.map +1 -1
  214. package/dist/src/core/shaders/webgl/RoundedWithBorder.js +160 -55
  215. package/dist/src/core/shaders/webgl/RoundedWithBorder.js.map +1 -1
  216. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js +168 -58
  217. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js.map +1 -1
  218. package/dist/src/core/shaders/webgl/RoundedWithShadow.js +73 -34
  219. package/dist/src/core/shaders/webgl/RoundedWithShadow.js.map +1 -1
  220. package/dist/src/core/shaders/webgl/SdfShader.d.ts +0 -2
  221. package/dist/src/core/shaders/webgl/SdfShader.js +8 -36
  222. package/dist/src/core/shaders/webgl/SdfShader.js.map +1 -1
  223. package/dist/src/core/shaders/webgl/Shadow.js +39 -34
  224. package/dist/src/core/shaders/webgl/Shadow.js.map +1 -1
  225. package/dist/src/core/text-rendering/CanvasFontHandler.d.ts +59 -0
  226. package/dist/src/core/text-rendering/CanvasFontHandler.js +206 -0
  227. package/dist/src/core/text-rendering/CanvasFontHandler.js.map +1 -0
  228. package/dist/src/core/text-rendering/CanvasTextRenderer.d.ts +17 -0
  229. package/dist/src/core/text-rendering/CanvasTextRenderer.js +139 -0
  230. package/dist/src/core/text-rendering/CanvasTextRenderer.js.map +1 -0
  231. package/dist/src/core/text-rendering/SdfFontHandler.d.ts +167 -0
  232. package/dist/src/core/text-rendering/SdfFontHandler.js +371 -0
  233. package/dist/src/core/text-rendering/SdfFontHandler.js.map +1 -0
  234. package/dist/src/core/text-rendering/SdfTextRenderer.d.ts +18 -0
  235. package/dist/src/core/text-rendering/SdfTextRenderer.js +301 -0
  236. package/dist/src/core/text-rendering/SdfTextRenderer.js.map +1 -0
  237. package/dist/src/core/text-rendering/TextLayoutEngine.d.ts +18 -0
  238. package/dist/src/core/text-rendering/TextLayoutEngine.js +380 -0
  239. package/dist/src/core/text-rendering/TextLayoutEngine.js.map +1 -0
  240. package/dist/src/core/text-rendering/TextRenderer.d.ts +384 -0
  241. package/dist/src/core/text-rendering/TextRenderer.js +2 -0
  242. package/dist/src/core/text-rendering/TextRenderer.js.map +1 -0
  243. package/dist/src/core/text-rendering/Utils.d.ts +30 -0
  244. package/dist/src/core/text-rendering/Utils.js +66 -0
  245. package/dist/src/core/text-rendering/Utils.js.map +1 -0
  246. package/dist/src/core/textures/ColorTexture.d.ts +1 -1
  247. package/dist/src/core/textures/ColorTexture.js +3 -22
  248. package/dist/src/core/textures/ColorTexture.js.map +1 -1
  249. package/dist/src/core/textures/ImageTexture.d.ts +13 -6
  250. package/dist/src/core/textures/ImageTexture.js +57 -66
  251. package/dist/src/core/textures/ImageTexture.js.map +1 -1
  252. package/dist/src/core/textures/NoiseTexture.d.ts +3 -3
  253. package/dist/src/core/textures/NoiseTexture.js +8 -26
  254. package/dist/src/core/textures/NoiseTexture.js.map +1 -1
  255. package/dist/src/core/textures/RenderTexture.d.ts +7 -7
  256. package/dist/src/core/textures/RenderTexture.js +12 -30
  257. package/dist/src/core/textures/RenderTexture.js.map +1 -1
  258. package/dist/src/core/textures/SubTexture.d.ts +6 -8
  259. package/dist/src/core/textures/SubTexture.js +19 -55
  260. package/dist/src/core/textures/SubTexture.js.map +1 -1
  261. package/dist/src/core/textures/Texture.d.ts +90 -12
  262. package/dist/src/core/textures/Texture.js +160 -35
  263. package/dist/src/core/textures/Texture.js.map +1 -1
  264. package/dist/src/core/utils.d.ts +2 -1
  265. package/dist/src/core/utils.js +1 -19
  266. package/dist/src/core/utils.js.map +1 -1
  267. package/dist/src/main-api/INode.js.map +1 -1
  268. package/dist/src/main-api/Inspector.d.ts +135 -2
  269. package/dist/src/main-api/Inspector.js +507 -30
  270. package/dist/src/main-api/Inspector.js.map +1 -1
  271. package/dist/src/main-api/Renderer.d.ts +294 -81
  272. package/dist/src/main-api/Renderer.js +225 -96
  273. package/dist/src/main-api/Renderer.js.map +1 -1
  274. package/dist/src/utils.d.ts +19 -6
  275. package/dist/src/utils.js +32 -27
  276. package/dist/src/utils.js.map +1 -1
  277. package/dist/tsconfig.dist.tsbuildinfo +1 -1
  278. package/dist/tsconfig.tsbuildinfo +1 -0
  279. package/exports/canvas-shaders.ts +0 -17
  280. package/exports/canvas.ts +1 -19
  281. package/exports/index.ts +6 -27
  282. package/exports/inspector.ts +0 -19
  283. package/exports/utils.ts +7 -19
  284. package/exports/webgl-shaders.ts +0 -16
  285. package/exports/webgl.ts +3 -20
  286. package/package.json +23 -22
  287. package/src/common/CommonTypes.ts +20 -22
  288. package/src/common/EventEmitter.ts +0 -19
  289. package/src/common/IAnimationController.ts +0 -18
  290. package/src/common/IEventEmitter.ts +0 -17
  291. package/src/core/Autosizer.ts +205 -0
  292. package/src/core/CoreNode.test.ts +376 -45
  293. package/src/core/CoreNode.ts +1015 -656
  294. package/src/core/CoreShaderManager.ts +3 -21
  295. package/src/core/CoreTextNode.ts +457 -314
  296. package/src/core/CoreTextureManager.ts +110 -167
  297. package/src/core/Stage.ts +526 -236
  298. package/src/core/TextureError.ts +46 -0
  299. package/src/core/TextureMemoryManager.ts +150 -167
  300. package/src/core/animations/AnimationManager.ts +0 -19
  301. package/src/core/animations/CoreAnimation.ts +15 -32
  302. package/src/core/animations/CoreAnimationController.ts +13 -23
  303. package/src/core/lib/ContextSpy.ts +0 -19
  304. package/src/core/lib/ImageWorker.ts +45 -32
  305. package/src/core/lib/Matrix3d.ts +7 -20
  306. package/src/core/lib/RenderCoords.ts +36 -67
  307. package/src/core/lib/WebGlContextWrapper.ts +196 -72
  308. package/src/core/lib/collectionUtils.ts +99 -0
  309. package/src/core/lib/colorCache.ts +20 -0
  310. package/src/core/{renderers/canvas/internal/ColorUtils.ts → lib/colorParser.ts} +2 -21
  311. package/src/core/lib/textureCompression.ts +433 -93
  312. package/src/core/lib/textureSvg.ts +0 -19
  313. package/src/core/lib/utils.ts +58 -19
  314. package/src/core/lib/validateImageBitmap.ts +17 -6
  315. package/src/core/platforms/Platform.ts +64 -0
  316. package/src/core/platforms/web/WebPlatform.ts +132 -0
  317. package/src/core/renderers/CoreContextTexture.ts +2 -20
  318. package/src/core/renderers/CoreRenderOp.ts +0 -19
  319. package/src/core/renderers/CoreRenderer.ts +16 -23
  320. package/src/core/renderers/CoreShaderNode.ts +37 -6
  321. package/src/core/renderers/CoreShaderProgram.ts +0 -19
  322. package/src/core/renderers/canvas/CanvasRenderer.ts +108 -137
  323. package/src/core/renderers/canvas/CanvasShaderNode.ts +3 -23
  324. package/src/core/renderers/canvas/CanvasTexture.ts +25 -37
  325. package/src/core/renderers/webgl/SdfRenderOp.ts +88 -0
  326. package/src/core/renderers/webgl/WebGlCtxRenderTexture.ts +18 -34
  327. package/src/core/renderers/webgl/WebGlCtxSubTexture.ts +50 -24
  328. package/src/core/renderers/webgl/WebGlCtxTexture.ts +134 -103
  329. package/src/core/renderers/webgl/WebGlRenderer.ts +368 -233
  330. package/src/core/renderers/webgl/WebGlShaderNode.ts +4 -7
  331. package/src/core/renderers/webgl/WebGlShaderProgram.ts +122 -76
  332. package/src/core/renderers/webgl/internal/BufferCollection.ts +15 -23
  333. package/src/core/renderers/webgl/internal/RendererUtils.ts +0 -19
  334. package/src/core/renderers/webgl/internal/ShaderUtils.ts +0 -19
  335. package/src/core/renderers/webgl/internal/WebGlUtils.ts +0 -19
  336. package/src/core/shaders/canvas/Border.ts +91 -50
  337. package/src/core/shaders/canvas/HolePunch.ts +4 -28
  338. package/src/core/shaders/canvas/LinearGradient.ts +10 -25
  339. package/src/core/shaders/canvas/RadialGradient.ts +23 -54
  340. package/src/core/shaders/canvas/Rounded.ts +2 -19
  341. package/src/core/shaders/canvas/RoundedWithBorder.ts +72 -35
  342. package/src/core/shaders/canvas/RoundedWithBorderAndShadow.ts +77 -47
  343. package/src/core/shaders/canvas/RoundedWithShadow.ts +21 -34
  344. package/src/core/shaders/canvas/Shadow.ts +0 -17
  345. package/src/core/shaders/canvas/utils/render.ts +45 -53
  346. package/src/core/shaders/templates/BorderTemplate.ts +42 -29
  347. package/src/core/shaders/templates/HolePunchTemplate.ts +5 -22
  348. package/src/core/shaders/templates/LinearGradientTemplate.ts +0 -17
  349. package/src/core/shaders/templates/RadialGradientTemplate.ts +10 -25
  350. package/src/core/shaders/templates/RoundedTemplate.ts +1 -18
  351. package/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.ts +1 -18
  352. package/src/core/shaders/templates/RoundedWithBorderTemplate.ts +7 -19
  353. package/src/core/shaders/templates/RoundedWithShadowTemplate.ts +1 -18
  354. package/src/core/shaders/templates/ShadowTemplate.ts +1 -18
  355. package/src/core/shaders/utils.ts +30 -0
  356. package/src/core/shaders/webgl/Border.ts +118 -55
  357. package/src/core/shaders/webgl/Default.ts +6 -43
  358. package/src/core/shaders/webgl/HolePunch.ts +4 -24
  359. package/src/core/shaders/webgl/LinearGradient.ts +73 -35
  360. package/src/core/shaders/webgl/RadialGradient.ts +58 -51
  361. package/src/core/shaders/webgl/Rounded.ts +25 -45
  362. package/src/core/shaders/webgl/RoundedWithBorder.ts +161 -63
  363. package/src/core/shaders/webgl/RoundedWithBorderAndShadow.ts +169 -68
  364. package/src/core/shaders/webgl/RoundedWithShadow.ts +73 -39
  365. package/src/core/shaders/webgl/SdfShader.ts +8 -41
  366. package/src/core/shaders/webgl/Shadow.ts +39 -35
  367. package/src/core/text-rendering/CanvasFontHandler.ts +285 -0
  368. package/src/core/text-rendering/CanvasTextRenderer.ts +236 -0
  369. package/src/core/text-rendering/SdfFontHandler.ts +566 -0
  370. package/src/core/text-rendering/SdfTextRenderer.ts +406 -0
  371. package/src/core/text-rendering/TextLayoutEngine.ts +672 -0
  372. package/src/core/text-rendering/TextRenderer.ts +426 -0
  373. package/src/core/text-rendering/Utils.ts +80 -0
  374. package/src/core/text-rendering/tests/TextLayoutEngine.test.ts +434 -0
  375. package/src/core/textures/ColorTexture.ts +7 -24
  376. package/src/core/textures/ImageTexture.ts +110 -92
  377. package/src/core/textures/NoiseTexture.ts +14 -31
  378. package/src/core/textures/RenderTexture.ts +18 -35
  379. package/src/core/textures/SubTexture.ts +25 -65
  380. package/src/core/textures/Texture.ts +214 -46
  381. package/src/core/utils.ts +9 -26
  382. package/src/main-api/INode.ts +0 -18
  383. package/src/main-api/Inspector.ts +794 -38
  384. package/src/main-api/Renderer.ts +519 -159
  385. package/src/utils.ts +64 -29
  386. package/dist/src/core/platform.d.ts +0 -10
  387. package/dist/src/core/platform.js +0 -56
  388. package/dist/src/core/platform.js.map +0 -1
  389. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.d.ts +0 -1
  390. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.js +0 -217
  391. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.js.map +0 -1
  392. package/dist/src/core/renderers/canvas/internal/ColorUtils.js.map +0 -1
  393. package/dist/src/core/renderers/webgl/WebGlRenderOp.d.ts +0 -36
  394. package/dist/src/core/renderers/webgl/WebGlRenderOp.js +0 -107
  395. package/dist/src/core/renderers/webgl/WebGlRenderOp.js.map +0 -1
  396. package/dist/src/core/shaders/templates/shaderUtils.js +0 -41
  397. package/dist/src/core/shaders/templates/shaderUtils.js.map +0 -1
  398. package/dist/src/core/text-rendering/TextRenderingUtils.d.ts +0 -12
  399. package/dist/src/core/text-rendering/TextRenderingUtils.js +0 -14
  400. package/dist/src/core/text-rendering/TextRenderingUtils.js.map +0 -1
  401. package/dist/src/core/text-rendering/TextTextureRendererUtils.d.ts +0 -72
  402. package/dist/src/core/text-rendering/TextTextureRendererUtils.js +0 -217
  403. package/dist/src/core/text-rendering/TextTextureRendererUtils.js.map +0 -1
  404. package/dist/src/core/text-rendering/TrFontManager.d.ts +0 -26
  405. package/dist/src/core/text-rendering/TrFontManager.js +0 -131
  406. package/dist/src/core/text-rendering/TrFontManager.js.map +0 -1
  407. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.d.ts +0 -39
  408. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js +0 -125
  409. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js.map +0 -1
  410. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.d.ts +0 -103
  411. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.js +0 -21
  412. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.js.map +0 -1
  413. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.d.ts +0 -62
  414. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.js +0 -88
  415. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.js.map +0 -1
  416. package/dist/src/core/text-rendering/font-face-types/TrFontFace.d.ts +0 -118
  417. package/dist/src/core/text-rendering/font-face-types/TrFontFace.js +0 -63
  418. package/dist/src/core/text-rendering/font-face-types/TrFontFace.js.map +0 -1
  419. package/dist/src/core/text-rendering/font-face-types/WebTrFontFace.d.ts +0 -14
  420. package/dist/src/core/text-rendering/font-face-types/WebTrFontFace.js +0 -66
  421. package/dist/src/core/text-rendering/font-face-types/WebTrFontFace.js.map +0 -1
  422. package/dist/src/core/text-rendering/font-face-types/utils.d.ts +0 -1
  423. package/dist/src/core/text-rendering/font-face-types/utils.js +0 -38
  424. package/dist/src/core/text-rendering/font-face-types/utils.js.map +0 -1
  425. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.d.ts +0 -59
  426. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js +0 -397
  427. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js.map +0 -1
  428. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.d.ts +0 -126
  429. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js +0 -551
  430. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js.map +0 -1
  431. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.d.ts +0 -91
  432. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js +0 -611
  433. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js.map +0 -1
  434. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.d.ts +0 -12
  435. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.js +0 -61
  436. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.js.map +0 -1
  437. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.d.ts +0 -33
  438. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.js +0 -52
  439. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.js.map +0 -1
  440. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.d.ts +0 -13
  441. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.js +0 -32
  442. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.js.map +0 -1
  443. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.d.ts +0 -23
  444. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.js +0 -84
  445. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.js.map +0 -1
  446. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.d.ts +0 -4
  447. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.js +0 -34
  448. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.js.map +0 -1
  449. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.d.ts +0 -20
  450. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js +0 -308
  451. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js.map +0 -1
  452. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.d.ts +0 -10
  453. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.js +0 -40
  454. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.js.map +0 -1
  455. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.d.ts +0 -26
  456. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.js +0 -70
  457. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.js.map +0 -1
  458. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.d.ts +0 -16
  459. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.js +0 -39
  460. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.js.map +0 -1
  461. package/dist/src/core/text-rendering/renderers/TextRenderer.d.ts +0 -370
  462. package/dist/src/core/text-rendering/renderers/TextRenderer.js +0 -178
  463. package/dist/src/core/text-rendering/renderers/TextRenderer.js.map +0 -1
  464. package/scripts/please-use-pnpm.js +0 -13
  465. package/src/core/platform.ts +0 -64
  466. package/src/core/renderers/canvas/internal/C2DShaderUtils.ts +0 -220
  467. package/src/core/renderers/webgl/WebGlRenderOp.ts +0 -145
  468. package/src/core/shaders/templates/shaderUtils.ts +0 -47
  469. package/src/core/shaders/webgl/DefaultBatched.ts +0 -129
  470. package/src/core/text-rendering/TextRenderingUtils.ts +0 -36
  471. package/src/core/text-rendering/TextTextureRendererUtils.ts +0 -263
  472. package/src/core/text-rendering/TrFontManager.ts +0 -183
  473. package/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.ts +0 -176
  474. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.ts +0 -139
  475. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.test.ts +0 -173
  476. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.ts +0 -171
  477. package/src/core/text-rendering/font-face-types/TrFontFace.ts +0 -187
  478. package/src/core/text-rendering/font-face-types/WebTrFontFace.ts +0 -94
  479. package/src/core/text-rendering/font-face-types/utils.ts +0 -39
  480. package/src/core/text-rendering/renderers/CanvasTextRenderer.ts +0 -509
  481. package/src/core/text-rendering/renderers/LightningTextTextureRenderer.ts +0 -815
  482. package/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.ts +0 -841
  483. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.test.ts +0 -48
  484. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.ts +0 -66
  485. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.ts +0 -52
  486. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.ts +0 -32
  487. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.ts +0 -117
  488. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.test.ts +0 -133
  489. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.ts +0 -38
  490. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.ts +0 -408
  491. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.test.ts +0 -49
  492. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.ts +0 -52
  493. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.test.ts +0 -205
  494. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.ts +0 -93
  495. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.ts +0 -40
  496. package/src/core/text-rendering/renderers/TextRenderer.ts +0 -550
  497. /package/dist/src/core/{renderers/canvas/internal/ColorUtils.d.ts → lib/colorParser.d.ts} +0 -0
@@ -0,0 +1,566 @@
1
+ import type {
2
+ FontFamilyMap,
3
+ FontMetrics,
4
+ NormalizedFontMetrics,
5
+ TrProps,
6
+ FontLoadOptions,
7
+ } from './TextRenderer.js';
8
+ import type { ImageTexture } from '../textures/ImageTexture.js';
9
+ import type { Stage } from '../Stage.js';
10
+ import type { CoreTextNode } from '../CoreTextNode.js';
11
+ import { UpdateType } from '../CoreNode.js';
12
+ import { hasZeroWidthSpace } from './Utils.js';
13
+ import { normalizeFontMetrics } from './TextLayoutEngine.js';
14
+ import { isProductionEnvironment } from '../../utils.js';
15
+
16
+ /**
17
+ * SDF Font Data structure matching msdf-bmfont-xml output
18
+ */
19
+ export interface SdfFontData {
20
+ pages: string[];
21
+ chars: Array<{
22
+ id: number;
23
+ char: string;
24
+ x: number;
25
+ y: number;
26
+ width: number;
27
+ height: number;
28
+ xoffset: number;
29
+ yoffset: number;
30
+ xadvance: number;
31
+ page: number;
32
+ chnl: number;
33
+ }>;
34
+
35
+ kernings: Array<{
36
+ first: number;
37
+ second: number;
38
+ amount: number;
39
+ }>;
40
+ info: {
41
+ face: string;
42
+ size: number;
43
+ bold: number;
44
+ italic: number;
45
+ charset: string[];
46
+ unicode: number;
47
+ stretchH: number;
48
+ smooth: number;
49
+ aa: number;
50
+ padding: [number, number, number, number]; // [up, right, down, left]
51
+ spacing: [number, number]; // [horizontal, vertical]
52
+ outline: number;
53
+ };
54
+ common: {
55
+ lineHeight: number;
56
+ base: number;
57
+ scaleW: number;
58
+ scaleH: number;
59
+ pages: number;
60
+ packed: number;
61
+ alphaChnl: number;
62
+ redChnl: number;
63
+ greenChnl: number;
64
+ blueChnl: number;
65
+ };
66
+ distanceField: {
67
+ // msdf-bmfont-xml uses the string 'sdf' for single-channel SDF.
68
+ fieldType: 'sdf' | 'msdf';
69
+ distanceRange: number;
70
+ };
71
+ lightningMetrics?: FontMetrics;
72
+ }
73
+
74
+ /**
75
+ * @typedef {Object} SdfGlyph
76
+ * @property {number} id - Glyph ID
77
+ * @property {string} char - Character
78
+ * @property {number} x - Atlas x position
79
+ * @property {number} y - Atlas y position
80
+ * @property {number} width - Glyph width
81
+ * @property {number} height - Glyph height
82
+ * @property {number} xoffset - X offset
83
+ * @property {number} yoffset - Y offset
84
+ * @property {number} xadvance - Character advance width
85
+ * @property {number} page - Page number
86
+ * @property {number} chnl - Channel
87
+ */
88
+
89
+ /**
90
+ * @typedef {Object} KerningTable
91
+ * Fast lookup table for kerning values
92
+ */
93
+ type KerningTable = Record<
94
+ number,
95
+ Record<number, number | undefined> | undefined
96
+ >;
97
+
98
+ /**
99
+ * @typedef {Object} SdfFontCache
100
+ * Cached font data for performance
101
+ */
102
+ export interface SdfFont {
103
+ data: SdfFontData;
104
+ glyphMap: Map<number, SdfFontData['chars'][0]>;
105
+ kernings: KerningTable;
106
+ atlasTexture: ImageTexture;
107
+ metrics: FontMetrics;
108
+ maxCharHeight: number;
109
+ }
110
+
111
+ //global state variables for SdfFontHandler
112
+ const fontCache = new Map<string, SdfFont>();
113
+ const fontLoadPromises = new Map<string, Promise<void>>();
114
+ const normalizedMetrics = new Map<string, NormalizedFontMetrics>();
115
+ const nodesWaitingForFont: Record<string, CoreTextNode[]> = Object.create(
116
+ null,
117
+ ) as Record<string, CoreTextNode[]>;
118
+ let initialized = false;
119
+
120
+ /**
121
+ * Build kerning lookup table for fast access
122
+ * @param {Array} kernings - Kerning data from font
123
+ * @returns {KerningTable} Optimized kerning lookup table
124
+ */
125
+ const buildKerningTable = (kernings: SdfFontData['kernings']): KerningTable => {
126
+ const kerningTable: KerningTable = {};
127
+
128
+ let i = 0;
129
+ const length = kernings.length;
130
+
131
+ while (i < length) {
132
+ const kerning = kernings[i];
133
+ i++;
134
+ if (kerning === undefined) {
135
+ continue;
136
+ }
137
+ const second = kerning.second;
138
+
139
+ let firsts = kerningTable[second];
140
+ if (firsts === undefined) {
141
+ firsts = {};
142
+ kerningTable[second] = firsts;
143
+ }
144
+ firsts[kerning.first] = kerning.amount;
145
+ }
146
+
147
+ return kerningTable;
148
+ };
149
+
150
+ /**
151
+ * Build glyph map from font data for fast character lookup
152
+ * @param {Array} chars - Character data from font
153
+ * @returns {Map} Glyph map for character to glyph lookup
154
+ */
155
+ const buildGlyphMap = (
156
+ chars: SdfFontData['chars'],
157
+ ): Map<number, SdfFontData['chars'][0]> => {
158
+ const glyphMap = new Map<number, SdfFontData['chars'][0]>();
159
+ let maxCharHeight = 0;
160
+
161
+ let i = 0;
162
+ const length = chars.length;
163
+
164
+ while (i < length) {
165
+ const glyph = chars[i];
166
+
167
+ i++;
168
+ if (glyph === undefined) {
169
+ continue;
170
+ }
171
+
172
+ glyphMap.set(glyph.id, glyph);
173
+
174
+ const charHeight = glyph.yoffset + glyph.height;
175
+ if (charHeight > maxCharHeight) {
176
+ maxCharHeight = charHeight;
177
+ }
178
+ }
179
+
180
+ return glyphMap;
181
+ };
182
+
183
+ /**
184
+ * Process font data and create optimized cache entry
185
+ * @param {string} fontFamily - Font family name
186
+ * @param {SdfFontData} fontData - Raw font data
187
+ * @param {ImageTexture} atlasTexture - Atlas texture
188
+ * @param {FontMetrics} metrics - Font metrics
189
+ */
190
+ const processFontData = (
191
+ fontFamily: string,
192
+ fontData: SdfFontData,
193
+ atlasTexture: ImageTexture,
194
+ metrics?: FontMetrics,
195
+ ): void => {
196
+ // Build optimized data structures
197
+ const glyphMap = buildGlyphMap(fontData.chars);
198
+ const kernings = buildKerningTable(fontData.kernings);
199
+
200
+ // Calculate max char height
201
+ let maxCharHeight = 0;
202
+ let i = 0;
203
+ const length = fontData.chars.length;
204
+
205
+ while (i < length) {
206
+ const glyph = fontData.chars[i];
207
+ if (glyph !== undefined) {
208
+ const charHeight = glyph.yoffset + glyph.height;
209
+ if (charHeight > maxCharHeight) {
210
+ maxCharHeight = charHeight;
211
+ }
212
+ }
213
+ i++;
214
+ }
215
+
216
+ if (metrics === undefined && fontData.lightningMetrics === undefined) {
217
+ console.warn(
218
+ `Font metrics not found for SDF font ${fontFamily}. ` +
219
+ 'Make sure you are using the latest version of the Lightning ' +
220
+ '3 msdf-generator tool to generate your SDF fonts. Using default metrics.',
221
+ );
222
+ }
223
+
224
+ metrics = metrics ||
225
+ fontData.lightningMetrics || {
226
+ ascender: 800,
227
+ descender: -200,
228
+ lineGap: 200,
229
+ unitsPerEm: 1000,
230
+ };
231
+
232
+ // Cache processed data
233
+ fontCache.set(fontFamily, {
234
+ data: fontData,
235
+ glyphMap,
236
+ kernings,
237
+ atlasTexture,
238
+ metrics,
239
+ maxCharHeight,
240
+ });
241
+ };
242
+
243
+ /**
244
+ * Check if the SDF font handler can render a font
245
+ * @param {TrProps} trProps - Text rendering properties
246
+ * @returns {boolean} True if the font can be rendered
247
+ */
248
+ export const canRenderFont = (trProps: TrProps): boolean => {
249
+ return (
250
+ isFontLoaded(trProps.fontFamily) || fontLoadPromises.has(trProps.fontFamily)
251
+ );
252
+ };
253
+
254
+ /**
255
+ * Load SDF font from JSON + PNG atlas
256
+ * @param {Object} options - Font loading options
257
+ * @param {string} options.fontFamily - Font family name
258
+ * @param {string} options.fontUrl - JSON font data URL (atlasDataUrl)
259
+ * @param {string} options.atlasUrl - PNG atlas texture URL
260
+ * @param {FontMetrics} options.metrics - Optional font metrics
261
+ */
262
+ export const loadFont = async (
263
+ stage: Stage,
264
+ options: FontLoadOptions,
265
+ ): Promise<void> => {
266
+ const { fontFamily, atlasUrl, atlasDataUrl, metrics } = options;
267
+ // Early return if already loaded
268
+ if (fontCache.get(fontFamily) !== undefined) {
269
+ return;
270
+ }
271
+
272
+ // Early return if already loading
273
+ const existingPromise = fontLoadPromises.get(fontFamily);
274
+ if (existingPromise !== undefined) {
275
+ return existingPromise;
276
+ }
277
+
278
+ if (atlasDataUrl === undefined) {
279
+ throw new Error(
280
+ `Atlas data URL must be provided for SDF font: ${fontFamily}`,
281
+ );
282
+ }
283
+
284
+ const nwff: CoreTextNode[] = (nodesWaitingForFont[fontFamily] = []);
285
+ // Create loading promise
286
+ const loadPromise = (async (): Promise<void> => {
287
+ // Load font JSON data
288
+ const response = await fetch(atlasDataUrl);
289
+ if (!response.ok) {
290
+ throw new Error(`Failed to load font data: ${response.statusText}`);
291
+ }
292
+
293
+ const fontData = (await response.json()) as SdfFontData;
294
+ if (!fontData || !fontData.chars) {
295
+ throw new Error('Invalid SDF font data format');
296
+ }
297
+
298
+ // Atlas texture should be provided externally
299
+ if (!atlasUrl) {
300
+ throw new Error('Atlas texture must be provided for SDF fonts');
301
+ }
302
+
303
+ // Wait for atlas texture to load
304
+ return new Promise<void>((resolve, reject) => {
305
+ // create new atlas texture using ImageTexture
306
+ const atlasTexture = stage.txManager.createTexture('ImageTexture', {
307
+ src: atlasUrl,
308
+ premultiplyAlpha: false,
309
+ });
310
+
311
+ atlasTexture.setRenderableOwner(fontFamily, true);
312
+ atlasTexture.preventCleanup = true; // Prevent automatic cleanup
313
+
314
+ if (atlasTexture.state === 'loaded') {
315
+ // If already loaded, process immediately
316
+ processFontData(fontFamily, fontData, atlasTexture, metrics);
317
+ fontLoadPromises.delete(fontFamily);
318
+
319
+ for (let key in nwff) {
320
+ nwff[key]!.setUpdateType(UpdateType.Local);
321
+ }
322
+ delete nodesWaitingForFont[fontFamily];
323
+ return resolve();
324
+ }
325
+
326
+ atlasTexture.on('loaded', () => {
327
+ // Process and cache font data
328
+ processFontData(fontFamily, fontData, atlasTexture, metrics);
329
+
330
+ // remove from promises
331
+ fontLoadPromises.delete(fontFamily);
332
+
333
+ for (let key in nwff) {
334
+ nwff[key]!.setUpdateType(UpdateType.Local);
335
+ }
336
+ delete nodesWaitingForFont[fontFamily];
337
+ resolve();
338
+ });
339
+
340
+ atlasTexture.on('failed', (error: Error) => {
341
+ // Cleanup on error
342
+ fontLoadPromises.delete(fontFamily);
343
+ if (fontCache[fontFamily]) {
344
+ delete fontCache[fontFamily];
345
+ }
346
+ console.error(`Failed to load SDF font: ${fontFamily}`, error);
347
+ reject(error);
348
+ });
349
+ });
350
+ })();
351
+
352
+ fontLoadPromises.set(fontFamily, loadPromise);
353
+ return loadPromise;
354
+ };
355
+
356
+ /**
357
+ * Stop waiting for a font to load
358
+ * @param {string} fontFamily - Font family name
359
+ * @param {CoreTextNode} node - Node that was waiting for the font
360
+ */
361
+ export const waitingForFont = (fontFamily: string, node: CoreTextNode) => {
362
+ if (nodesWaitingForFont[fontFamily] === undefined) {
363
+ return;
364
+ }
365
+ nodesWaitingForFont[fontFamily]![node.id] = node;
366
+ };
367
+
368
+ /**
369
+ * Stop waiting for a font to load
370
+ *
371
+ * @param fontFamily
372
+ * @param node
373
+ * @returns
374
+ */
375
+ export const stopWaitingForFont = (fontFamily: string, node: CoreTextNode) => {
376
+ if (nodesWaitingForFont[fontFamily] === undefined) {
377
+ return;
378
+ }
379
+ delete nodesWaitingForFont[fontFamily][node.id];
380
+ };
381
+
382
+ /**
383
+ * Get the font families map for resolving fonts
384
+ */
385
+ export const getFontFamilies = (): FontFamilyMap => {
386
+ const families: FontFamilyMap = {};
387
+
388
+ // SDF fonts don't use the traditional FontFamilyMap structure
389
+ // Return empty map since SDF fonts are handled differently
390
+ return families;
391
+ };
392
+
393
+ /**
394
+ * Initialize the SDF font handler
395
+ */
396
+ export const init = (
397
+ c?: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D,
398
+ ): void => {
399
+ if (initialized === true) {
400
+ return;
401
+ }
402
+
403
+ initialized = true;
404
+ };
405
+
406
+ export const type = 'sdf';
407
+
408
+ /**
409
+ * Check if a font is already loaded by font family
410
+ */
411
+ export const isFontLoaded = (fontFamily: string): boolean => {
412
+ return fontCache.has(fontFamily);
413
+ };
414
+
415
+ /**
416
+ * Get normalized font metrics for a font family
417
+ */
418
+ export const getFontMetrics = (
419
+ fontFamily: string,
420
+
421
+ fontSize: number,
422
+ ): NormalizedFontMetrics => {
423
+ const out = normalizedMetrics.get(fontFamily);
424
+ if (out !== undefined) {
425
+ return out;
426
+ }
427
+ let metrics = fontCache.get(fontFamily)!.metrics;
428
+ return processFontMetrics(fontFamily, fontSize, metrics);
429
+ };
430
+
431
+ export const processFontMetrics = (
432
+ fontFamily: string,
433
+ fontSize: number,
434
+ metrics: FontMetrics,
435
+ ): NormalizedFontMetrics => {
436
+ const label = fontFamily + fontSize;
437
+ const normalized = normalizeFontMetrics(metrics, fontSize);
438
+ normalizedMetrics.set(label, normalized);
439
+ return normalized;
440
+ };
441
+
442
+ /**
443
+ * Get atlas texture for a font family
444
+ * @param {string} fontFamily - Font family name
445
+ * @returns {ImageTexture|null} Atlas texture or null
446
+ */
447
+ export const getAtlas = (fontFamily: string): ImageTexture | null => {
448
+ const cache = fontCache.get(fontFamily);
449
+ return cache !== undefined ? cache.atlasTexture : null;
450
+ };
451
+
452
+ /**
453
+ * Get font data for a font family
454
+ * @param {string} fontFamily - Font family name
455
+ * @returns {SdfFontData|null} Font data or null
456
+ */
457
+ export const getFontData = (fontFamily: string): SdfFont | undefined => {
458
+ return fontCache.get(fontFamily);
459
+ };
460
+
461
+ /**
462
+ * Get maximum character height for a font family
463
+ * @param {string} fontFamily - Font family name
464
+ * @returns {number} Max character height or 0
465
+ */
466
+ export const getMaxCharHeight = (fontFamily: string): number => {
467
+ const cache = fontCache.get(fontFamily);
468
+ return cache !== undefined ? cache.maxCharHeight : 0;
469
+ };
470
+
471
+ /**
472
+ * Get all loaded font families
473
+ * @returns {string[]} Array of font family names
474
+ */
475
+ export const getLoadedFonts = (): string[] => {
476
+ return Array.from(fontCache.keys());
477
+ };
478
+
479
+ /**
480
+ * Unload a font and free resources
481
+ * @param {string} fontFamily - Font family name
482
+ */
483
+ export const unloadFont = (fontFamily: string): void => {
484
+ const cache = fontCache.get(fontFamily);
485
+ if (cache !== undefined) {
486
+ // Free texture if needed
487
+ if (typeof cache.atlasTexture.free === 'function') {
488
+ cache.atlasTexture.free();
489
+ }
490
+
491
+ fontCache.delete(fontFamily);
492
+ }
493
+ };
494
+
495
+ export const measureText = (
496
+ text: string,
497
+ fontFamily: string,
498
+ letterSpacing: number,
499
+ ): number => {
500
+ const cache = fontCache.get(fontFamily);
501
+ if (cache === undefined) return 0;
502
+
503
+ const glyphMap = cache.glyphMap;
504
+ const kernings = cache.kernings;
505
+ const fallbackGlyphId = isProductionEnvironment ? 32 : 63;
506
+ const textLength = text.length;
507
+
508
+ if (textLength === 1) {
509
+ const codepoint = text.codePointAt(0) as number;
510
+ if (codepoint === 0x200b) return 0;
511
+ const char = text[0] as string;
512
+ if (hasZeroWidthSpace(char) === true) return 0;
513
+
514
+ let glyph = glyphMap.get(codepoint);
515
+ if (glyph === undefined) {
516
+ glyph = glyphMap.get(fallbackGlyphId);
517
+ if (glyph === undefined) return 0;
518
+ }
519
+ return glyph.xadvance + letterSpacing;
520
+ }
521
+
522
+ let width = 0;
523
+ let prevCodepoint = 0;
524
+ for (let i = 0; i < textLength; i++) {
525
+ const codepoint = text.codePointAt(i) as number;
526
+ if (codepoint > 0xffff) {
527
+ i++;
528
+ }
529
+
530
+ if (codepoint === 0x200b) {
531
+ continue;
532
+ }
533
+
534
+ const char = text[i] as string;
535
+ // Skip zero-width spaces in width calculations
536
+ if (hasZeroWidthSpace(char) === true) {
537
+ continue;
538
+ }
539
+
540
+ let glyph = glyphMap.get(codepoint);
541
+ if (glyph === undefined) {
542
+ glyph = glyphMap.get(fallbackGlyphId);
543
+ if (glyph === undefined) {
544
+ continue;
545
+ }
546
+ }
547
+
548
+ let advance = glyph.xadvance;
549
+
550
+ // Add kerning if there's a previous character
551
+ if (prevCodepoint !== 0) {
552
+ const seconds = kernings[codepoint];
553
+ if (seconds !== undefined) {
554
+ const amount = seconds[prevCodepoint];
555
+ if (amount !== undefined) {
556
+ advance += amount;
557
+ }
558
+ }
559
+ }
560
+
561
+ width += advance + letterSpacing;
562
+ prevCodepoint = codepoint;
563
+ }
564
+
565
+ return width;
566
+ };