@lightningjs/renderer 3.0.0-beta14 → 3.0.0-beta16

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 (283) hide show
  1. package/dist/exports/index.d.ts +1 -0
  2. package/dist/exports/index.js.map +1 -1
  3. package/dist/src/core/CoreNode.d.ts +1 -1
  4. package/dist/src/core/CoreTextNode.d.ts +1 -2
  5. package/dist/src/core/CoreTextNode.js +43 -21
  6. package/dist/src/core/CoreTextNode.js.map +1 -1
  7. package/dist/src/core/Stage.js +2 -3
  8. package/dist/src/core/Stage.js.map +1 -1
  9. package/dist/src/core/TextureError.d.ts +11 -0
  10. package/dist/src/core/TextureError.js +37 -0
  11. package/dist/src/core/TextureError.js.map +1 -0
  12. package/dist/src/core/animations/CoreAnimation.d.ts +3 -3
  13. package/dist/src/core/animations/CoreAnimation.js +3 -3
  14. package/dist/src/core/animations/CoreAnimation.js.map +1 -1
  15. package/dist/src/core/lib/WebGlContextWrapper.d.ts +5 -5
  16. package/dist/src/core/lib/textureCompression.js +1 -1
  17. package/dist/src/core/lib/textureCompression.js.map +1 -1
  18. package/dist/src/core/platform.d.ts +10 -0
  19. package/dist/src/core/platform.js +81 -0
  20. package/dist/src/core/platform.js.map +1 -0
  21. package/dist/src/core/renderers/CoreShader.d.ts +9 -0
  22. package/{src/core/text-rendering/sdf/index.ts → dist/src/core/renderers/CoreShader.js} +11 -3
  23. package/dist/src/core/renderers/CoreShader.js.map +1 -0
  24. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.d.ts +33 -0
  25. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.js +250 -0
  26. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.js.map +1 -0
  27. package/dist/src/core/renderers/canvas/CanvasCoreTexture.d.ts +17 -0
  28. package/dist/src/core/renderers/canvas/CanvasCoreTexture.js +125 -0
  29. package/dist/src/core/renderers/canvas/CanvasCoreTexture.js.map +1 -0
  30. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.d.ts +14 -0
  31. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.js +138 -0
  32. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.js.map +1 -0
  33. package/dist/src/core/renderers/canvas/internal/ColorUtils.d.ts +19 -0
  34. package/dist/src/core/renderers/canvas/internal/ColorUtils.js +58 -0
  35. package/dist/src/core/renderers/canvas/internal/ColorUtils.js.map +1 -0
  36. package/dist/src/core/renderers/canvas/shaders/UnsupportedShader.d.ts +10 -0
  37. package/dist/src/core/renderers/canvas/shaders/UnsupportedShader.js +43 -0
  38. package/dist/src/core/renderers/canvas/shaders/UnsupportedShader.js.map +1 -0
  39. package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.d.ts +12 -0
  40. package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.js +58 -0
  41. package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.js.map +1 -0
  42. package/dist/src/core/renderers/webgl/WebGlCoreCtxSubTexture.d.ts +9 -0
  43. package/dist/src/core/renderers/webgl/WebGlCoreCtxSubTexture.js +38 -0
  44. package/dist/src/core/renderers/webgl/WebGlCoreCtxSubTexture.js.map +1 -0
  45. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.d.ts +69 -0
  46. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js +272 -0
  47. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js.map +1 -0
  48. package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.d.ts +34 -0
  49. package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.js +114 -0
  50. package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.js.map +1 -0
  51. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.d.ts +133 -0
  52. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js +641 -0
  53. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js.map +1 -0
  54. package/dist/src/core/renderers/webgl/WebGlCoreShader.d.ts +78 -0
  55. package/dist/src/core/renderers/webgl/WebGlCoreShader.js +202 -0
  56. package/dist/src/core/renderers/webgl/WebGlCoreShader.js.map +1 -0
  57. package/dist/src/core/renderers/webgl/shaders/DefaultShader.d.ts +9 -0
  58. package/dist/src/core/renderers/webgl/shaders/DefaultShader.js +84 -0
  59. package/dist/src/core/renderers/webgl/shaders/DefaultShader.js.map +1 -0
  60. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.d.ts +10 -0
  61. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.js +108 -0
  62. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.js.map +1 -0
  63. package/dist/src/core/renderers/webgl/shaders/DynamicShader.d.ts +29 -0
  64. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js +408 -0
  65. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js.map +1 -0
  66. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.d.ts +28 -0
  67. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.js +126 -0
  68. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.js.map +1 -0
  69. package/dist/src/core/renderers/webgl/shaders/SdfShader.d.ts +47 -0
  70. package/dist/src/core/renderers/webgl/shaders/SdfShader.js +148 -0
  71. package/dist/src/core/renderers/webgl/shaders/SdfShader.js.map +1 -0
  72. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.d.ts +31 -0
  73. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.js +71 -0
  74. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.js.map +1 -0
  75. package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.d.ts +30 -0
  76. package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.js +58 -0
  77. package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.js.map +1 -0
  78. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.d.ts +31 -0
  79. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.js +71 -0
  80. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.js.map +1 -0
  81. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.d.ts +31 -0
  82. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.js +71 -0
  83. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.js.map +1 -0
  84. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.d.ts +31 -0
  85. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.js +71 -0
  86. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.js.map +1 -0
  87. package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.d.ts +9 -0
  88. package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.js +136 -0
  89. package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.js.map +1 -0
  90. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.d.ts +36 -0
  91. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.js +85 -0
  92. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.js.map +1 -0
  93. package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.d.ts +45 -0
  94. package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.js +104 -0
  95. package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.js.map +1 -0
  96. package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.d.ts +22 -0
  97. package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.js +45 -0
  98. package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.js.map +1 -0
  99. package/dist/src/core/renderers/webgl/shaders/effects/HolePunchEffect.d.ts +58 -0
  100. package/dist/src/core/renderers/webgl/shaders/effects/HolePunchEffect.js +80 -0
  101. package/dist/src/core/renderers/webgl/shaders/effects/HolePunchEffect.js.map +1 -0
  102. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.d.ts +35 -0
  103. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js +134 -0
  104. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js.map +1 -0
  105. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.d.ts +40 -0
  106. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js +143 -0
  107. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js.map +1 -0
  108. package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.d.ts +61 -0
  109. package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.js +127 -0
  110. package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.js.map +1 -0
  111. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.d.ts +40 -0
  112. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.js +71 -0
  113. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.js.map +1 -0
  114. package/dist/src/core/renderers/webgl/shaders/effects/ShaderEffect.d.ts +115 -0
  115. package/dist/src/core/renderers/webgl/shaders/effects/ShaderEffect.js +61 -0
  116. package/dist/src/core/renderers/webgl/shaders/effects/ShaderEffect.js.map +1 -0
  117. package/dist/src/core/shaders/canvas/RoundedWithBorder.js +1 -1
  118. package/dist/src/core/shaders/canvas/RoundedWithBorder.js.map +1 -1
  119. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.js +1 -1
  120. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.js.map +1 -1
  121. package/dist/src/core/shaders/webgl/LinearGradient.js +26 -3
  122. package/dist/src/core/shaders/webgl/LinearGradient.js.map +1 -1
  123. package/dist/src/core/shaders/webgl/RadialGradient.js +49 -27
  124. package/dist/src/core/shaders/webgl/RadialGradient.js.map +1 -1
  125. package/dist/src/core/shaders/webgl/SdfShader.d.ts +0 -2
  126. package/dist/src/core/shaders/webgl/SdfShader.js +1 -10
  127. package/dist/src/core/shaders/webgl/SdfShader.js.map +1 -1
  128. package/dist/src/core/text-rendering/CanvasFont.d.ts +14 -0
  129. package/dist/src/core/text-rendering/CanvasFont.js +111 -0
  130. package/dist/src/core/text-rendering/CanvasFont.js.map +1 -0
  131. package/dist/src/core/text-rendering/CanvasFontHandler.d.ts +21 -3
  132. package/dist/src/core/text-rendering/CanvasFontHandler.js +97 -32
  133. package/dist/src/core/text-rendering/CanvasFontHandler.js.map +1 -1
  134. package/dist/src/core/text-rendering/CanvasTextRenderer.d.ts +2 -7
  135. package/dist/src/core/text-rendering/CanvasTextRenderer.js +51 -260
  136. package/dist/src/core/text-rendering/CanvasTextRenderer.js.map +1 -1
  137. package/dist/src/core/text-rendering/CoreFont.d.ts +33 -0
  138. package/dist/src/core/text-rendering/CoreFont.js +48 -0
  139. package/dist/src/core/text-rendering/CoreFont.js.map +1 -0
  140. package/dist/src/core/text-rendering/FontManager.d.ts +11 -0
  141. package/dist/src/core/text-rendering/FontManager.js +42 -0
  142. package/dist/src/core/text-rendering/FontManager.js.map +1 -0
  143. package/dist/src/core/text-rendering/SdfFont.d.ts +29 -0
  144. package/dist/src/core/text-rendering/SdfFont.js +142 -0
  145. package/dist/src/core/text-rendering/SdfFont.js.map +1 -0
  146. package/dist/src/core/text-rendering/SdfFontHandler.d.ts +35 -5
  147. package/dist/src/core/text-rendering/SdfFontHandler.js +79 -56
  148. package/dist/src/core/text-rendering/SdfFontHandler.js.map +1 -1
  149. package/dist/src/core/text-rendering/SdfTextRenderer.d.ts +1 -1
  150. package/dist/src/core/text-rendering/SdfTextRenderer.js +38 -82
  151. package/dist/src/core/text-rendering/SdfTextRenderer.js.map +1 -1
  152. package/dist/src/core/text-rendering/TextLayoutEngine.d.ts +19 -0
  153. package/dist/src/core/text-rendering/{sdf/Utils.js → TextLayoutEngine.js} +125 -107
  154. package/dist/src/core/text-rendering/TextLayoutEngine.js.map +1 -0
  155. package/dist/src/core/text-rendering/TextRenderer.d.ts +30 -13
  156. package/dist/src/core/text-rendering/TextRenderingUtils.d.ts +12 -0
  157. package/dist/src/core/text-rendering/TextRenderingUtils.js +14 -0
  158. package/dist/src/core/text-rendering/TextRenderingUtils.js.map +1 -0
  159. package/dist/src/core/text-rendering/TextTextureRendererUtils.d.ts +72 -0
  160. package/dist/src/core/text-rendering/TextTextureRendererUtils.js +217 -0
  161. package/dist/src/core/text-rendering/TextTextureRendererUtils.js.map +1 -0
  162. package/dist/src/core/text-rendering/TrFontManager.d.ts +26 -0
  163. package/dist/src/core/text-rendering/TrFontManager.js +131 -0
  164. package/dist/src/core/text-rendering/TrFontManager.js.map +1 -0
  165. package/dist/src/core/text-rendering/Utils.d.ts +1 -42
  166. package/dist/src/core/text-rendering/Utils.js +4 -132
  167. package/dist/src/core/text-rendering/Utils.js.map +1 -1
  168. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.d.ts +39 -0
  169. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js +125 -0
  170. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js.map +1 -0
  171. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.d.ts +103 -0
  172. package/dist/src/core/text-rendering/{sdf/index.js → font-face-types/SdfTrFontFace/internal/FontShaper.js} +4 -3
  173. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.js.map +1 -0
  174. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.d.ts +62 -0
  175. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.js +88 -0
  176. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.js.map +1 -0
  177. package/dist/src/core/text-rendering/font-face-types/TrFontFace.d.ts +118 -0
  178. package/dist/src/core/text-rendering/font-face-types/TrFontFace.js +63 -0
  179. package/dist/src/core/text-rendering/font-face-types/TrFontFace.js.map +1 -0
  180. package/dist/src/core/text-rendering/font-face-types/WebTrFontFace.d.ts +14 -0
  181. package/dist/src/core/text-rendering/font-face-types/WebTrFontFace.js +66 -0
  182. package/dist/src/core/text-rendering/font-face-types/WebTrFontFace.js.map +1 -0
  183. package/dist/src/core/text-rendering/font-face-types/utils.d.ts +1 -0
  184. package/dist/src/core/text-rendering/font-face-types/utils.js +38 -0
  185. package/dist/src/core/text-rendering/font-face-types/utils.js.map +1 -0
  186. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.d.ts +59 -0
  187. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js +397 -0
  188. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js.map +1 -0
  189. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.d.ts +120 -0
  190. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js +551 -0
  191. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js.map +1 -0
  192. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.d.ts +92 -0
  193. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js +607 -0
  194. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js.map +1 -0
  195. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.d.ts +12 -0
  196. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.js +61 -0
  197. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.js.map +1 -0
  198. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.d.ts +33 -0
  199. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.js +52 -0
  200. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.js.map +1 -0
  201. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.d.ts +13 -0
  202. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.js +32 -0
  203. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.js.map +1 -0
  204. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.d.ts +23 -0
  205. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.js +84 -0
  206. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.js.map +1 -0
  207. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.d.ts +4 -0
  208. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.js +34 -0
  209. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.js.map +1 -0
  210. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.d.ts +20 -0
  211. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js +308 -0
  212. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js.map +1 -0
  213. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.d.ts +10 -0
  214. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.js +40 -0
  215. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.js.map +1 -0
  216. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.d.ts +26 -0
  217. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.js +70 -0
  218. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.js.map +1 -0
  219. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.d.ts +16 -0
  220. package/dist/src/core/text-rendering/{canvas/Settings.js → renderers/SdfTextRenderer/internal/util.js} +22 -3
  221. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.js.map +1 -0
  222. package/dist/src/core/text-rendering/renderers/TextRenderer.d.ts +373 -0
  223. package/dist/src/core/text-rendering/renderers/TextRenderer.js +178 -0
  224. package/dist/src/core/text-rendering/renderers/TextRenderer.js.map +1 -0
  225. package/dist/src/core/utils.d.ts +2 -1
  226. package/dist/src/core/utils.js +1 -1
  227. package/dist/src/core/utils.js.map +1 -1
  228. package/dist/src/main-api/DynamicShaderController.d.ts +29 -0
  229. package/dist/src/main-api/DynamicShaderController.js +58 -0
  230. package/dist/src/main-api/DynamicShaderController.js.map +1 -0
  231. package/dist/src/main-api/Inspector.d.ts +124 -0
  232. package/dist/src/main-api/Inspector.js +292 -13
  233. package/dist/src/main-api/Inspector.js.map +1 -1
  234. package/dist/src/main-api/Renderer.d.ts +150 -26
  235. package/dist/src/main-api/Renderer.js +27 -25
  236. package/dist/src/main-api/Renderer.js.map +1 -1
  237. package/dist/src/main-api/ShaderController.d.ts +31 -0
  238. package/dist/src/main-api/ShaderController.js +37 -0
  239. package/dist/src/main-api/ShaderController.js.map +1 -0
  240. package/dist/tsconfig.dist.tsbuildinfo +1 -1
  241. package/exports/index.ts +1 -0
  242. package/package.json +14 -15
  243. package/src/core/CoreTextNode.ts +55 -27
  244. package/src/core/Stage.ts +2 -3
  245. package/src/core/animations/CoreAnimation.ts +8 -9
  246. package/src/core/lib/textureCompression.ts +4 -2
  247. package/src/core/shaders/canvas/RoundedWithBorder.ts +1 -1
  248. package/src/core/shaders/canvas/RoundedWithBorderAndShadow.ts +1 -1
  249. package/src/core/shaders/webgl/LinearGradient.ts +26 -3
  250. package/src/core/shaders/webgl/RadialGradient.ts +50 -28
  251. package/src/core/shaders/webgl/SdfShader.ts +1 -12
  252. package/src/core/text-rendering/CanvasFontHandler.ts +139 -39
  253. package/src/core/text-rendering/CanvasTextRenderer.ts +75 -440
  254. package/src/core/text-rendering/SdfFontHandler.ts +97 -60
  255. package/src/core/text-rendering/SdfTextRenderer.ts +62 -116
  256. package/src/core/text-rendering/{sdf/Utils.ts → TextLayoutEngine.ts} +211 -145
  257. package/src/core/text-rendering/TextRenderer.ts +36 -13
  258. package/src/core/text-rendering/Utils.ts +5 -163
  259. package/src/core/text-rendering/{sdf/Utils.test.ts → tests/Canvas.test.ts} +98 -122
  260. package/src/core/text-rendering/tests/SdfTests.test.ts +414 -0
  261. package/src/core/utils.ts +9 -7
  262. package/src/main-api/Inspector.ts +511 -17
  263. package/src/main-api/Renderer.ts +158 -26
  264. package/dist/src/core/text-rendering/canvas/Settings.d.ts +0 -64
  265. package/dist/src/core/text-rendering/canvas/Settings.js.map +0 -1
  266. package/dist/src/core/text-rendering/canvas/Utils.d.ts +0 -20
  267. package/dist/src/core/text-rendering/canvas/Utils.js +0 -144
  268. package/dist/src/core/text-rendering/canvas/Utils.js.map +0 -1
  269. package/dist/src/core/text-rendering/canvas/calculateRenderInfo.d.ts +0 -60
  270. package/dist/src/core/text-rendering/canvas/calculateRenderInfo.js +0 -183
  271. package/dist/src/core/text-rendering/canvas/calculateRenderInfo.js.map +0 -1
  272. package/dist/src/core/text-rendering/canvas/draw.d.ts +0 -5
  273. package/dist/src/core/text-rendering/canvas/draw.js +0 -132
  274. package/dist/src/core/text-rendering/canvas/draw.js.map +0 -1
  275. package/dist/src/core/text-rendering/sdf/Utils.d.ts +0 -26
  276. package/dist/src/core/text-rendering/sdf/Utils.js.map +0 -1
  277. package/dist/src/core/text-rendering/sdf/index.d.ts +0 -1
  278. package/dist/src/core/text-rendering/sdf/index.js.map +0 -1
  279. package/src/core/text-rendering/canvas/Settings.ts +0 -99
  280. package/src/core/text-rendering/canvas/Utils.test.ts +0 -206
  281. package/src/core/text-rendering/canvas/Utils.ts +0 -178
  282. package/src/core/text-rendering/canvas/calculateRenderInfo.ts +0 -299
  283. package/src/core/text-rendering/canvas/draw.ts +0 -165
@@ -16,8 +16,9 @@
16
16
  * See the License for the specific language governing permissions and
17
17
  * limitations under the License.
18
18
  */
19
- import { calculateFontMetrics } from './Utils.js';
19
+ import { hasZeroWidthSpace } from './Utils.js';
20
20
  import { UpdateType } from '../CoreNode.js';
21
+ import { defaultFontMetrics, normalizeFontMetrics, } from './TextLayoutEngine.js';
21
22
  /**
22
23
  * Global font set regardless of if run in the main thread or a web worker
23
24
  */
@@ -25,22 +26,13 @@ import { UpdateType } from '../CoreNode.js';
25
26
  // (resolvedGlobal as unknown as { fonts: FontFaceSet }).fonts) as FontFaceSet;
26
27
  // Global state variables for fontHandler
27
28
  const fontFamilies = {};
28
- const loadedFonts = new Set();
29
29
  const fontLoadPromises = new Map();
30
30
  const normalizedMetrics = new Map();
31
31
  const nodesWaitingForFont = Object.create(null);
32
+ const fontCache = new Map();
32
33
  let initialized = false;
33
34
  let context;
34
- /**
35
- * Normalize font metrics to be in the range of 0 to 1
36
- */
37
- function normalizeMetrics(metrics) {
38
- return {
39
- ascender: metrics.ascender / metrics.unitsPerEm,
40
- descender: metrics.descender / metrics.unitsPerEm,
41
- lineGap: metrics.lineGap / metrics.unitsPerEm,
42
- };
43
- }
35
+ let measureContext;
44
36
  /**
45
37
  * Check if a font can be rendered
46
38
  */
@@ -48,13 +40,21 @@ export const canRenderFont = () => {
48
40
  // Canvas can always render any font family (assuming the browser supports it)
49
41
  return true;
50
42
  };
43
+ const processFontData = (fontFamily, fontFace, metrics) => {
44
+ metrics = metrics || defaultFontMetrics;
45
+ fontCache.set(fontFamily, {
46
+ fontFamily,
47
+ fontFace,
48
+ metrics,
49
+ });
50
+ };
51
51
  /**
52
52
  * Load a font by providing fontFamily, fontUrl, and optional metrics
53
53
  */
54
54
  export const loadFont = async (stage, options) => {
55
55
  const { fontFamily, fontUrl, metrics } = options;
56
56
  // If already loaded, return immediately
57
- if (loadedFonts.has(fontFamily) === true) {
57
+ if (fontCache.has(fontFamily) === true) {
58
58
  return;
59
59
  }
60
60
  const existingPromise = fontLoadPromises.get(fontFamily);
@@ -68,12 +68,8 @@ export const loadFont = async (stage, options) => {
68
68
  .load()
69
69
  .then((loadedFont) => {
70
70
  document.fonts.add(loadedFont);
71
- loadedFonts.add(fontFamily);
71
+ processFontData(fontFamily, loadedFont, metrics);
72
72
  fontLoadPromises.delete(fontFamily);
73
- // Store normalized metrics if provided
74
- if (metrics) {
75
- setFontMetrics(fontFamily, normalizeMetrics(metrics));
76
- }
77
73
  for (let key in nwff) {
78
74
  nwff[key].setUpdateType(UpdateType.Local);
79
75
  }
@@ -96,7 +92,7 @@ export const getFontFamilies = () => {
96
92
  /**
97
93
  * Initialize the global font handler
98
94
  */
99
- export const init = (c) => {
95
+ export const init = (c, mc) => {
100
96
  if (initialized === true) {
101
97
  return;
102
98
  }
@@ -104,14 +100,15 @@ export const init = (c) => {
104
100
  throw new Error('Canvas context is not provided for font handler initialization');
105
101
  }
106
102
  context = c;
103
+ measureContext = mc;
107
104
  // Register the default 'sans-serif' font face
108
105
  const defaultMetrics = {
109
- ascender: 0.8,
110
- descender: -0.2,
111
- lineGap: 0.2,
106
+ ascender: 800,
107
+ descender: -200,
108
+ lineGap: 200,
109
+ unitsPerEm: 1000,
112
110
  };
113
- setFontMetrics('sans-serif', defaultMetrics);
114
- loadedFonts.add('sans-serif');
111
+ processFontData('sans-serif', undefined, defaultMetrics);
115
112
  initialized = true;
116
113
  };
117
114
  export const type = 'canvas';
@@ -119,7 +116,7 @@ export const type = 'canvas';
119
116
  * Check if a font is already loaded by font family
120
117
  */
121
118
  export const isFontLoaded = (fontFamily) => {
122
- return loadedFonts.has(fontFamily) || fontFamily === 'sans-serif';
119
+ return fontCache.has(fontFamily);
123
120
  };
124
121
  /**
125
122
  * Wait for a font to load
@@ -128,6 +125,9 @@ export const isFontLoaded = (fontFamily) => {
128
125
  * @param node
129
126
  */
130
127
  export const waitingForFont = (fontFamily, node) => {
128
+ if (nodesWaitingForFont[fontFamily] === undefined) {
129
+ return;
130
+ }
131
131
  nodesWaitingForFont[fontFamily][node.id] = node;
132
132
  };
133
133
  /**
@@ -144,16 +144,81 @@ export const stopWaitingForFont = (fontFamily, node) => {
144
144
  delete nodesWaitingForFont[fontFamily][node.id];
145
145
  };
146
146
  export const getFontMetrics = (fontFamily, fontSize) => {
147
- let out = normalizedMetrics.get(fontFamily) ||
148
- normalizedMetrics.get(fontFamily + fontSize);
147
+ const out = normalizedMetrics.get(fontFamily + fontSize);
149
148
  if (out !== undefined) {
150
149
  return out;
151
150
  }
152
- out = calculateFontMetrics(context, fontFamily, fontSize);
153
- normalizedMetrics.set(fontFamily + fontSize, out);
154
- return out;
151
+ let metrics = fontCache.get(fontFamily).metrics;
152
+ if (metrics === undefined) {
153
+ metrics = calculateFontMetrics(fontFamily, fontSize);
154
+ }
155
+ return processFontMetrics(fontFamily, fontSize, metrics);
155
156
  };
156
- export const setFontMetrics = (fontFamily, metrics) => {
157
- normalizedMetrics.set(fontFamily, metrics);
157
+ export const processFontMetrics = (fontFamily, fontSize, metrics) => {
158
+ const label = fontFamily + fontSize;
159
+ const normalized = normalizeFontMetrics(metrics, fontSize);
160
+ normalizedMetrics.set(label, normalized);
161
+ return normalized;
158
162
  };
163
+ export const measureText = (text, fontFamily, letterSpacing) => {
164
+ if (letterSpacing === 0) {
165
+ return measureContext.measureText(text).width;
166
+ }
167
+ if (hasZeroWidthSpace(text) === false) {
168
+ return measureContext.measureText(text).width + letterSpacing * text.length;
169
+ }
170
+ return text.split('').reduce((acc, char) => {
171
+ if (hasZeroWidthSpace(char) === true) {
172
+ return acc;
173
+ }
174
+ return acc + measureContext.measureText(char).width + letterSpacing;
175
+ }, 0);
176
+ };
177
+ /**
178
+ * Get the font metrics for a font face.
179
+ *
180
+ * @remarks
181
+ * This function will attempt to grab the explicitly defined metrics from the
182
+ * font face first. If the font face does not have metrics defined, it will
183
+ * attempt to calculate the metrics using the browser's measureText method.
184
+ *
185
+ * If the browser does not support the font metrics API, it will use some
186
+ * default values.
187
+ *
188
+ * @param context
189
+ * @param fontFace
190
+ * @param fontSize
191
+ * @returns
192
+ */
193
+ export function calculateFontMetrics(fontFamily, fontSize) {
194
+ // If the font face doesn't have metrics defined, we fallback to using the
195
+ // browser's measureText method to calculate take a best guess at the font
196
+ // actual font's metrics.
197
+ // - fontBoundingBox[Ascent|Descent] is the best estimate but only supported
198
+ // in Chrome 87+ (2020), Firefox 116+ (2023), and Safari 11.1+ (2018).
199
+ // - It is an estimate as it can vary between browsers.
200
+ // - actualBoundingBox[Ascent|Descent] is less accurate and supported in
201
+ // Chrome 77+ (2019), Firefox 74+ (2020), and Safari 11.1+ (2018).
202
+ // - If neither are supported, we'll use some default values which will
203
+ // get text on the screen but likely not be great.
204
+ // NOTE: It's been decided not to rely on fontBoundingBox[Ascent|Descent]
205
+ // as it's browser support is limited and it also tends to produce higher than
206
+ // expected values. It is instead HIGHLY RECOMMENDED that developers provide
207
+ // explicit metrics in the font face definition.
208
+ const metrics = measureContext.measureText('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz');
209
+ console.warn(`Font metrics not provided for Canvas Web font ${fontFamily}. ` +
210
+ 'Using fallback values. It is HIGHLY recommended you use the latest ' +
211
+ 'version of the Lightning 3 `msdf-generator` tool to extract the default ' +
212
+ 'metrics for the font and provide them in the Canvas Web font definition.');
213
+ const ascender = metrics.fontBoundingBoxAscent ?? metrics.actualBoundingBoxAscent ?? 0;
214
+ const descender = metrics.fontBoundingBoxDescent ?? metrics.actualBoundingBoxDescent ?? 0;
215
+ return {
216
+ ascender,
217
+ descender: -descender,
218
+ lineGap: (metrics.emHeightAscent ?? 0) +
219
+ (metrics.emHeightDescent ?? 0) -
220
+ (ascender + descender),
221
+ unitsPerEm: (metrics.emHeightAscent ?? 0) + (metrics.emHeightDescent ?? 0),
222
+ };
223
+ }
159
224
  //# sourceMappingURL=CanvasFontHandler.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CanvasFontHandler.js","sourceRoot":"","sources":["../../../../src/core/text-rendering/CanvasFontHandler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"CanvasFontHandler.js","sourceRoot":"","sources":["../../../../src/core/text-rendering/CanvasFontHandler.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import type { Stage } from '../Stage.js';
2
- import type { TextLayout } from './TextRenderer.js';
2
+ import type { TextRenderInfo } from './TextRenderer.js';
3
3
  import * as CanvasFontHandler from './CanvasFontHandler.js';
4
4
  import type { CoreTextNodeProps } from '../CoreTextNode.js';
5
5
  /**
@@ -8,12 +8,7 @@ import type { CoreTextNodeProps } from '../CoreTextNode.js';
8
8
  declare const CanvasTextRenderer: {
9
9
  type: "canvas";
10
10
  font: typeof CanvasFontHandler;
11
- renderText: (stage: Stage, props: CoreTextNodeProps) => {
12
- imageData: ImageData | null;
13
- width: number;
14
- height: number;
15
- layout?: TextLayout;
16
- };
11
+ renderText: (props: CoreTextNodeProps) => TextRenderInfo;
17
12
  addQuads: () => Float32Array | null;
18
13
  renderQuads: () => void;
19
14
  init: (stage: Stage) => void;
@@ -18,10 +18,8 @@
18
18
  */
19
19
  import { assertTruthy } from '../../utils.js';
20
20
  import * as CanvasFontHandler from './CanvasFontHandler.js';
21
- import {} from './canvas/calculateRenderInfo.js';
22
- import { calcHeight, measureText, wrapText, wrapWord } from './canvas/Utils.js';
23
- import { normalizeCanvasColor } from '../lib/colorCache.js';
24
- import { isZeroWidthSpace } from './Utils.js';
21
+ import { hasZeroWidthSpace } from './Utils.js';
22
+ import { mapTextLayout } from './TextLayoutEngine.js';
25
23
  const MAX_TEXTURE_DIMENSION = 4096;
26
24
  const type = 'canvas';
27
25
  let canvas = null;
@@ -33,16 +31,21 @@ let measureContext = null;
33
31
  const layoutCache = new Map();
34
32
  // Initialize the Text Renderer
35
33
  const init = (stage) => {
34
+ const dpr = window.devicePixelRatio || 1;
36
35
  // Drawing canvas and context
37
36
  canvas = stage.platform.createCanvas();
38
37
  context = canvas.getContext('2d', { willReadFrequently: true });
38
+ context.setTransform(dpr, 0, 0, dpr, 0, 0);
39
+ context.textRendering = 'optimizeSpeed';
39
40
  // Separate measuring canvas and context
40
41
  measureCanvas = stage.platform.createCanvas();
41
42
  measureContext = measureCanvas.getContext('2d');
43
+ measureContext.setTransform(dpr, 0, 0, dpr, 0, 0);
44
+ measureContext.textRendering = 'optimizeSpeed';
42
45
  // Set up a minimal size for the measuring canvas since we only use it for measurements
43
46
  measureCanvas.width = 1;
44
47
  measureCanvas.height = 1;
45
- CanvasFontHandler.init(context);
48
+ CanvasFontHandler.init(context, measureContext);
46
49
  };
47
50
  /**
48
51
  * Canvas text renderer
@@ -51,284 +54,72 @@ const init = (stage) => {
51
54
  * @param props - Text rendering properties
52
55
  * @returns Object containing ImageData and dimensions
53
56
  */
54
- const renderText = (stage, props) => {
57
+ const renderText = (props) => {
55
58
  assertTruthy(canvas, 'Canvas is not initialized');
56
59
  assertTruthy(context, 'Canvas context is not available');
60
+ assertTruthy(measureContext, 'Canvas measureContext is not available');
57
61
  // Extract already normalized properties
58
- const { text, fontFamily, fontStyle, fontSize, textAlign, lineHeight: propLineHeight, maxLines, textBaseline, verticalAlign, overflowSuffix, maxWidth, maxHeight, offsetY, letterSpacing, } = props;
59
- // Performance optimization constants
60
- const precision = 1;
61
- const paddingLeft = 0;
62
- const paddingRight = 0;
63
- const textIndent = 0;
64
- const textRenderIssueMargin = 0;
65
- const textColor = 0xffffffff;
66
- // Determine word wrap behavior
67
- const wordWrap = maxWidth > 0;
68
- const textOverflow = overflowSuffix ? 'ellipsis' : null;
69
- // Calculate scaled values
70
- const scaledFontSize = fontSize * precision;
71
- const scaledOffsetY = offsetY * precision;
72
- const scaledLetterSpacing = letterSpacing * precision;
62
+ const { text, fontFamily, fontStyle, fontSize, textAlign, maxLines, lineHeight, verticalAlign, overflowSuffix, maxWidth, maxHeight, wordBreak, } = props;
63
+ const font = `${fontStyle} ${fontSize}px Unknown, ${fontFamily}`;
73
64
  // Get font metrics and calculate line height
74
- context.font = `${fontStyle} ${scaledFontSize}px ${fontFamily}`;
75
- context.textBaseline = textBaseline;
76
- const metrics = CanvasFontHandler.getFontMetrics(fontFamily, scaledFontSize);
77
- const lineHeight = propLineHeight === 0
78
- ? scaledFontSize *
79
- (metrics.ascender - metrics.descender + metrics.lineGap) *
80
- precision
81
- : propLineHeight;
82
- // Calculate max lines constraint
83
- const containedMaxLines = maxHeight !== null ? Math.floor(maxHeight / lineHeight) : 0;
84
- const computedMaxLines = calculateMaxLines(containedMaxLines, maxLines);
85
- // Calculate initial width and inner width
86
- let width = maxWidth || 2048 / precision;
87
- let innerWidth = width - paddingLeft;
88
- if (innerWidth < 10) {
89
- width += 10 - innerWidth;
90
- innerWidth = 10;
91
- }
92
- const finalWordWrapWidth = maxWidth === 0 ? innerWidth : maxWidth;
93
- // Calculate text layout using cached helper function
94
- const layout = calculateTextLayout(text, fontFamily, scaledFontSize, fontStyle, wordWrap, finalWordWrapWidth, scaledLetterSpacing, textIndent, computedMaxLines, overflowSuffix, textOverflow);
95
- // Calculate final dimensions
96
- const dimensions = calculateTextDimensions(layout, paddingLeft, paddingRight, textBaseline, scaledFontSize, lineHeight, scaledOffsetY, maxWidth, maxHeight, wordWrap, textAlign);
97
- // Set up canvas dimensions
98
- canvas.width = Math.min(Math.ceil(dimensions.width + textRenderIssueMargin), MAX_TEXTURE_DIMENSION);
99
- canvas.height = Math.min(Math.ceil(dimensions.height), MAX_TEXTURE_DIMENSION);
100
- // Reset font context after canvas resize
101
- context.font = `${fontStyle} ${scaledFontSize}px ${fontFamily}`;
102
- context.textBaseline = textBaseline;
65
+ measureContext.font = font;
66
+ measureContext.textBaseline = 'hanging';
67
+ const metrics = CanvasFontHandler.getFontMetrics(fontFamily, fontSize);
68
+ const letterSpacing = props.letterSpacing;
69
+ const [lines, remainingLines, hasRemainingText, bareLineHeight, lineHeightPx, effectiveWidth, effectiveHeight,] = mapTextLayout(CanvasFontHandler.measureText, metrics, text, textAlign, verticalAlign, fontFamily, lineHeight, overflowSuffix, wordBreak, letterSpacing, maxLines, maxWidth, maxHeight);
70
+ const lineAmount = lines.length;
71
+ const canvasW = Math.ceil(effectiveWidth);
72
+ const canvasH = Math.ceil(effectiveHeight);
73
+ canvas.width = canvasW;
74
+ canvas.height = canvasH;
75
+ context.fillStyle = 'white';
76
+ context.font = font;
77
+ context.textBaseline = 'hanging';
103
78
  // Performance optimization for large fonts
104
- if (scaledFontSize >= 128) {
79
+ if (fontSize >= 128) {
105
80
  context.globalAlpha = 0.01;
106
81
  context.fillRect(0, 0, 0.01, 0.01);
107
82
  context.globalAlpha = 1.0;
108
83
  }
109
- // Calculate drawing positions
110
- const drawLines = calculateDrawPositions(layout.lines, layout.lineWidths, textAlign, verticalAlign, innerWidth, paddingLeft, textIndent, lineHeight, metrics, scaledFontSize);
111
- // Render text to canvas
112
- renderTextToCanvas(context, drawLines, scaledLetterSpacing, textColor, fontStyle, scaledFontSize, fontFamily);
113
- width = dimensions.width;
114
- const height = lineHeight * layout.lines.length;
84
+ for (let i = 0; i < lineAmount; i++) {
85
+ const line = lines[i];
86
+ const textLine = line[0];
87
+ let currentX = Math.ceil(line[2]);
88
+ const currentY = Math.ceil(line[3]);
89
+ if (letterSpacing === 0) {
90
+ context.fillText(textLine, currentX, currentY);
91
+ }
92
+ else {
93
+ const textLineLength = textLine.length;
94
+ for (let j = 0; j < textLineLength; j++) {
95
+ const char = textLine.charAt(j);
96
+ if (hasZeroWidthSpace(char) === true) {
97
+ continue;
98
+ }
99
+ context.fillText(char, currentX, currentY);
100
+ currentX += CanvasFontHandler.measureText(char, fontFamily, letterSpacing);
101
+ }
102
+ }
103
+ }
115
104
  // Extract image data
116
105
  let imageData = null;
117
106
  if (canvas.width > 0 && canvas.height > 0) {
118
- imageData = context.getImageData(0, 0, width, height);
107
+ imageData = context.getImageData(0, 0, canvasW, canvasH);
119
108
  }
120
109
  return {
121
110
  imageData,
122
- width,
123
- height,
111
+ width: effectiveWidth,
112
+ height: effectiveHeight,
113
+ remainingLines,
114
+ hasRemainingText,
124
115
  };
125
116
  };
126
- /**
127
- * Calculate the effective max lines constraint
128
- */
129
- function calculateMaxLines(containedMaxLines, maxLines) {
130
- if (containedMaxLines > 0 && maxLines > 0) {
131
- return containedMaxLines < maxLines ? containedMaxLines : maxLines;
132
- }
133
- else {
134
- return containedMaxLines > maxLines ? containedMaxLines : maxLines;
135
- }
136
- }
137
117
  /**
138
118
  * Generate a cache key for text layout calculations
139
119
  */
140
120
  function generateLayoutCacheKey(text, fontFamily, fontSize, fontStyle, wordWrap, wordWrapWidth, letterSpacing, maxLines, overflowSuffix) {
141
121
  return `${text}-${fontFamily}-${fontSize}-${fontStyle}-${wordWrap}-${wordWrapWidth}-${letterSpacing}-${maxLines}-${overflowSuffix}`;
142
122
  }
143
- /**
144
- * Calculate text dimensions and wrapping
145
- */
146
- function calculateTextLayout(text, fontFamily, fontSize, fontStyle, wordWrap, wordWrapWidth, letterSpacing, textIndent, maxLines, overflowSuffix, textOverflow) {
147
- assertTruthy(measureContext, 'Measure context is not available');
148
- // Check cache first
149
- const cacheKey = generateLayoutCacheKey(text, fontFamily, fontSize, fontStyle, wordWrap, wordWrapWidth, letterSpacing, maxLines, overflowSuffix);
150
- const cached = layoutCache.get(cacheKey);
151
- if (cached) {
152
- return cached;
153
- }
154
- // Set font context for measurements on the dedicated measuring context
155
- measureContext.font = `${fontStyle} ${fontSize}px ${fontFamily}`;
156
- // Handle text overflow for non-wrapped text
157
- let processedText = text;
158
- if (textOverflow !== null && wordWrap === false) {
159
- let suffix;
160
- if (textOverflow === 'clip') {
161
- suffix = '';
162
- }
163
- else if (textOverflow === 'ellipsis') {
164
- suffix = overflowSuffix;
165
- }
166
- else {
167
- suffix = textOverflow;
168
- }
169
- processedText = wrapWord(measureContext, text, wordWrapWidth - textIndent, suffix, letterSpacing);
170
- }
171
- // Word wrap
172
- let linesInfo;
173
- if (wordWrap === true) {
174
- linesInfo = wrapText(measureContext, processedText, wordWrapWidth, letterSpacing, textIndent);
175
- }
176
- else {
177
- linesInfo = { l: processedText.split(/(?:\r\n|\r|\n)/), n: [] };
178
- const n = linesInfo.l.length;
179
- for (let i = 0; i < n - 1; i++) {
180
- linesInfo.n.push(i);
181
- }
182
- }
183
- let lines = linesInfo.l;
184
- let remainingText = '';
185
- let moreTextLines = false;
186
- // Handle max lines constraint
187
- if (maxLines > 0 && lines.length > maxLines) {
188
- const usedLines = lines.slice(0, maxLines);
189
- let otherLines = [];
190
- if (overflowSuffix.length > 0) {
191
- const w = measureText(measureContext, overflowSuffix, letterSpacing);
192
- const al = wrapText(measureContext, usedLines[usedLines.length - 1] || '', wordWrapWidth - w, letterSpacing, textIndent);
193
- usedLines[usedLines.length - 1] = `${al.l[0] || ''}${overflowSuffix}`;
194
- otherLines = [al.l.length > 1 ? al.l[1] || '' : ''];
195
- }
196
- else {
197
- otherLines = [''];
198
- }
199
- // Re-assemble the remaining text
200
- let i;
201
- const n = lines.length;
202
- let j = 0;
203
- const m = linesInfo.n.length;
204
- for (i = maxLines; i < n; i++) {
205
- otherLines[j] += `${otherLines[j] ? ' ' : ''}${lines[i] ?? ''}`;
206
- if (i + 1 < m && linesInfo.n[i + 1] !== undefined) {
207
- j++;
208
- }
209
- }
210
- remainingText = otherLines.join('\n');
211
- moreTextLines = true;
212
- lines = usedLines;
213
- }
214
- // Calculate line widths using the dedicated measuring context
215
- let maxLineWidth = 0;
216
- const lineWidths = [];
217
- for (let i = 0; i < lines.length; i++) {
218
- const lineWidth = measureText(measureContext, lines[i] || '', letterSpacing) +
219
- (i === 0 ? textIndent : 0);
220
- lineWidths.push(lineWidth);
221
- maxLineWidth = Math.max(maxLineWidth, lineWidth);
222
- }
223
- const result = {
224
- lines,
225
- lineWidths,
226
- maxLineWidth,
227
- remainingText,
228
- moreTextLines,
229
- };
230
- // Cache the result
231
- layoutCache.set(cacheKey, result);
232
- return result;
233
- }
234
- /**
235
- * Calculate text dimensions based on layout
236
- */
237
- function calculateTextDimensions(layout, paddingLeft, paddingRight, textBaseline, fontSize, lineHeight, offsetY, initialWidth, initialHeight, wordWrap, textAlign) {
238
- let width = initialWidth;
239
- let height = initialHeight;
240
- // Calculate width
241
- if (initialWidth === 0) {
242
- width = layout.maxLineWidth + paddingLeft + paddingRight;
243
- }
244
- // Adjust width for single-line left-aligned wrapped text
245
- if (wordWrap === true &&
246
- width > layout.maxLineWidth &&
247
- textAlign === 'left' &&
248
- layout.lines.length === 1) {
249
- width = layout.maxLineWidth + paddingLeft + paddingRight;
250
- }
251
- // Calculate height if not provided
252
- if (height === 0) {
253
- height = calcHeight(textBaseline, fontSize, lineHeight, layout.lines.length, offsetY);
254
- }
255
- return { width, height };
256
- }
257
- /**
258
- * Calculate drawing positions for text lines
259
- */
260
- function calculateDrawPositions(lines, lineWidths, textAlign, verticalAlign, innerWidth, paddingLeft, textIndent, lineHeight, metrics, fontSize) {
261
- const drawLines = [];
262
- const ascenderPx = metrics.ascender * fontSize;
263
- const bareLineHeightPx = (metrics.ascender - metrics.descender) * fontSize;
264
- for (let i = 0, n = lines.length; i < n; i++) {
265
- let linePositionX = i === 0 ? textIndent : 0;
266
- let linePositionY = i * lineHeight + ascenderPx;
267
- // Vertical alignment
268
- if (verticalAlign == 'middle') {
269
- linePositionY += (lineHeight - bareLineHeightPx) / 2;
270
- }
271
- else if (verticalAlign == 'bottom') {
272
- linePositionY += lineHeight - bareLineHeightPx;
273
- }
274
- // Horizontal alignment
275
- const lineWidth = lineWidths[i];
276
- if (lineWidth !== undefined) {
277
- if (textAlign === 'right') {
278
- linePositionX += innerWidth - lineWidth;
279
- }
280
- else if (textAlign === 'center') {
281
- linePositionX += (innerWidth - lineWidth) / 2;
282
- }
283
- }
284
- linePositionX += paddingLeft;
285
- const lineText = lines[i];
286
- if (lineText !== undefined) {
287
- drawLines.push({
288
- text: lineText,
289
- x: linePositionX,
290
- y: linePositionY,
291
- w: lineWidth || 0,
292
- });
293
- }
294
- }
295
- return drawLines;
296
- }
297
- /**
298
- * Render text lines to canvas
299
- */
300
- function renderTextToCanvas(context, drawLines, letterSpacing, textColor, fontStyle, fontSize, fontFamily) {
301
- assertTruthy(measureContext, 'Measure context is not available');
302
- context.fillStyle = normalizeCanvasColor(textColor);
303
- // Sync font settings to measure context if we need to use it for letter spacing
304
- if (letterSpacing > 0) {
305
- measureContext.font = `${fontStyle} ${fontSize}px ${fontFamily}`;
306
- }
307
- for (let i = 0, n = drawLines.length; i < n; i++) {
308
- const drawLine = drawLines[i];
309
- if (drawLine) {
310
- if (letterSpacing === 0) {
311
- context.fillText(drawLine.text, drawLine.x, drawLine.y);
312
- }
313
- else {
314
- const textSplit = drawLine.text.split('');
315
- let x = drawLine.x;
316
- for (let j = 0, k = textSplit.length; j < k; j++) {
317
- const char = textSplit[j];
318
- if (char) {
319
- // Skip zero-width spaces for rendering but keep them in the text flow
320
- if (isZeroWidthSpace(char)) {
321
- continue;
322
- }
323
- context.fillText(char, x, drawLine.y);
324
- // Use the dedicated measuring context for letter spacing calculations
325
- x += measureText(measureContext, char, letterSpacing);
326
- }
327
- }
328
- }
329
- }
330
- }
331
- }
332
123
  /**
333
124
  * Clear layout cache for memory management
334
125
  */
@@ -1 +1 @@
1
- {"version":3,"file":"CanvasTextRenderer.js","sourceRoot":"","sources":["../../../../src/core/text-rendering/CanvasTextRenderer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"CanvasTextRenderer.js","sourceRoot":"","sources":["../../../../src/core/text-rendering/CanvasTextRenderer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG9C,OAAO,KAAK,iBAAiB,MAAM,wBAAwB,CAAC;AAE5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD,MAAM,qBAAqB,GAAG,IAAI,CAAC;AAEnC,MAAM,IAAI,GAAG,QAAiB,CAAC;AAE/B,IAAI,MAAM,GAA+C,IAAI,CAAC;AAC9D,IAAI,OAAO,GAGA,IAAI,CAAC;AAEhB,oDAAoD;AACpD,IAAI,aAAa,GAA+C,IAAI,CAAC;AACrE,IAAI,cAAc,GAGP,IAAI,CAAC;AAEhB,qCAAqC;AACrC,MAAM,WAAW,GAAG,IAAI,GAAG,EASxB,CAAC;AAEJ,+BAA+B;AAC/B,MAAM,IAAI,GAAG,CAAC,KAAY,EAAQ,EAAE;IAClC,MAAM,GAAG,GAAG,MAAM,CAAC,gBAAgB,IAAI,CAAC,CAAC;IAEzC,6BAA6B;IAC7B,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,YAAY,EAAyC,CAAC;IAC9E,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAEzB,CAAC;IAEtC,OAAO,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3C,OAAO,CAAC,aAAa,GAAG,eAAe,CAAC;IAExC,wCAAwC;IACxC,aAAa,GAAG,KAAK,CAAC,QAAQ,CAAC,YAAY,EAExB,CAAC;IACpB,cAAc,GAAG,aAAa,CAAC,UAAU,CAAC,IAAI,CAET,CAAC;IAEtC,cAAc,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAClD,cAAc,CAAC,aAAa,GAAG,eAAe,CAAC;IAE/C,uFAAuF;IACvF,aAAa,CAAC,KAAK,GAAG,CAAC,CAAC;IACxB,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;IAEzB,iBAAiB,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;AAClD,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,UAAU,GAAG,CAAC,KAAwB,EAAkB,EAAE;IAC9D,YAAY,CAAC,MAAM,EAAE,2BAA2B,CAAC,CAAC;IAClD,YAAY,CAAC,OAAO,EAAE,iCAAiC,CAAC,CAAC;IACzD,YAAY,CAAC,cAAc,EAAE,wCAAwC,CAAC,CAAC;IACvE,wCAAwC;IACxC,MAAM,EACJ,IAAI,EACJ,UAAU,EACV,SAAS,EACT,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,UAAU,EACV,aAAa,EACb,cAAc,EACd,QAAQ,EACR,SAAS,EACT,SAAS,GACV,GAAG,KAAK,CAAC;IAEV,MAAM,IAAI,GAAG,GAAG,SAAS,IAAI,QAAQ,eAAe,UAAU,EAAE,CAAC;IACjE,6CAA6C;IAC7C,cAAc,CAAC,IAAI,GAAG,IAAI,CAAC;IAC3B,cAAc,CAAC,YAAY,GAAG,SAAS,CAAC;IAExC,MAAM,OAAO,GAAG,iBAAiB,CAAC,cAAc,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAEvE,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC;IAE1C,MAAM,CACJ,KAAK,EACL,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,YAAY,EACZ,cAAc,EACd,eAAe,EAChB,GAAG,aAAa,CACf,iBAAiB,CAAC,WAAW,EAC7B,OAAO,EACP,IAAI,EACJ,SAAS,EACT,aAAa,EACb,UAAU,EACV,UAAU,EACV,cAAc,EACd,SAAS,EACT,aAAa,EACb,QAAQ,EACR,QAAQ,EACR,SAAS,CACV,CAAC;IAEF,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC;IAChC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAE3C,MAAM,CAAC,KAAK,GAAG,OAAO,CAAC;IACvB,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC;IACxB,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC;IAC5B,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IACpB,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;IAEjC,2CAA2C;IAC3C,IAAI,QAAQ,IAAI,GAAG,EAAE,CAAC;QACpB,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;QAC3B,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACnC,OAAO,CAAC,WAAW,GAAG,GAAG,CAAC;IAC5B,CAAC;IAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAmB,CAAC;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACzB,IAAI,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACpC,IAAI,aAAa,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACjD,CAAC;aAAM,CAAC;YACN,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC;YACvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,EAAE,CAAC,EAAE,EAAE,CAAC;gBACxC,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBAChC,IAAI,iBAAiB,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;oBACrC,SAAS;gBACX,CAAC;gBACD,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;gBAC3C,QAAQ,IAAI,iBAAiB,CAAC,WAAW,CACvC,IAAI,EACJ,UAAU,EACV,aAAa,CACd,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,qBAAqB;IACrB,IAAI,SAAS,GAAqB,IAAI,CAAC;IACvC,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1C,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO;QACL,SAAS;QACT,KAAK,EAAE,cAAc;QACrB,MAAM,EAAE,eAAe;QACvB,cAAc;QACd,gBAAgB;KACjB,CAAC;AACJ,CAAC,CAAC;AAEF;;GAEG;AACH,SAAS,sBAAsB,CAC7B,IAAY,EACZ,UAAkB,EAClB,QAAgB,EAChB,SAAiB,EACjB,QAAiB,EACjB,aAAqB,EACrB,aAAqB,EACrB,QAAgB,EAChB,cAAsB;IAEtB,OAAO,GAAG,IAAI,IAAI,UAAU,IAAI,QAAQ,IAAI,SAAS,IAAI,QAAQ,IAAI,aAAa,IAAI,aAAa,IAAI,QAAQ,IAAI,cAAc,EAAE,CAAC;AACtI,CAAC;AAED;;GAEG;AACH,MAAM,gBAAgB,GAAG,GAAS,EAAE;IAClC,WAAW,CAAC,KAAK,EAAE,CAAC;AACtB,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,QAAQ,GAAG,GAAwB,EAAE;IACzC,mDAAmD;IACnD,0CAA0C;IAC1C,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,GAAG,GAAS,EAAE;IAC7B,mDAAmD;IACnD,kDAAkD;AACpD,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,kBAAkB,GAAG;IACzB,IAAI;IACJ,IAAI,EAAE,iBAAiB;IACvB,UAAU;IACV,QAAQ;IACR,WAAW;IACX,IAAI;IACJ,gBAAgB;CACjB,CAAC;AAEF,eAAe,kBAAkB,CAAC"}