@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
@@ -28,6 +28,8 @@ import type { ImageTexture } from '../textures/ImageTexture.js';
28
28
  import type { Stage } from '../Stage.js';
29
29
  import type { CoreTextNode } from '../CoreTextNode.js';
30
30
  import { UpdateType } from '../CoreNode.js';
31
+ import { hasZeroWidthSpace } from './Utils.js';
32
+ import { normalizeFontMetrics } from './TextLayoutEngine.js';
31
33
 
32
34
  /**
33
35
  * SDF Font Data structure matching msdf-bmfont-xml output
@@ -115,31 +117,24 @@ type KerningTable = Record<
115
117
  * @typedef {Object} SdfFontCache
116
118
  * Cached font data for performance
117
119
  */
118
- interface SdfFontCache {
120
+ export interface SdfFont {
119
121
  data: SdfFontData;
120
122
  glyphMap: Map<number, SdfFontData['chars'][0]>;
121
123
  kernings: KerningTable;
122
124
  atlasTexture: ImageTexture;
123
- metrics: NormalizedFontMetrics;
125
+ metrics: FontMetrics;
124
126
  maxCharHeight: number;
125
127
  }
126
128
 
127
129
  //global state variables for SdfFontHandler
128
- const fontCache: Record<string, SdfFontCache> = Object.create(null);
129
- const loadedFonts = new Set<string>();
130
+ const fontCache = new Map<string, SdfFont>();
130
131
  const fontLoadPromises = new Map<string, Promise<void>>();
131
- const nodesWaitingForFont: Record<string, CoreTextNode[]> = Object.create(null);
132
+ const normalizedMetrics = new Map<string, NormalizedFontMetrics>();
133
+ const nodesWaitingForFont: Record<string, CoreTextNode[]> = Object.create(
134
+ null,
135
+ ) as Record<string, CoreTextNode[]>;
132
136
  let initialized = false;
133
137
 
134
- /**
135
- * Normalize font metrics to be in the range of 0 to 1
136
- */
137
- const normalizeMetrics = (metrics: FontMetrics): NormalizedFontMetrics => ({
138
- ascender: metrics.ascender / metrics.unitsPerEm,
139
- descender: metrics.descender / metrics.unitsPerEm,
140
- lineGap: metrics.lineGap / metrics.unitsPerEm,
141
- });
142
-
143
138
  /**
144
139
  * Build kerning lookup table for fast access
145
140
  * @param {Array} kernings - Kerning data from font
@@ -236,35 +231,31 @@ const processFontData = (
236
231
  i++;
237
232
  }
238
233
 
239
- // Determine metrics
240
- let normalizedMetrics: NormalizedFontMetrics;
241
-
242
- if (metrics !== undefined) {
243
- normalizedMetrics = normalizeMetrics(metrics);
244
- } else if (fontData.lightningMetrics !== undefined) {
245
- normalizedMetrics = normalizeMetrics(fontData.lightningMetrics);
246
- } else {
234
+ if (metrics === undefined && fontData.lightningMetrics === undefined) {
247
235
  console.warn(
248
236
  `Font metrics not found for SDF font ${fontFamily}. ` +
249
237
  'Make sure you are using the latest version of the Lightning ' +
250
238
  '3 msdf-generator tool to generate your SDF fonts. Using default metrics.',
251
239
  );
252
- // Use default metrics
253
- normalizedMetrics = {
254
- ascender: 0.8,
255
- descender: -0.2,
256
- lineGap: 0.2,
257
- };
258
240
  }
241
+
242
+ metrics = metrics ||
243
+ fontData.lightningMetrics || {
244
+ ascender: 800,
245
+ descender: -200,
246
+ lineGap: 200,
247
+ unitsPerEm: 1000,
248
+ };
249
+
259
250
  // Cache processed data
260
- fontCache[fontFamily] = {
251
+ fontCache.set(fontFamily, {
261
252
  data: fontData,
262
253
  glyphMap,
263
254
  kernings,
264
255
  atlasTexture,
265
- metrics: normalizedMetrics,
256
+ metrics,
266
257
  maxCharHeight,
267
- };
258
+ });
268
259
  };
269
260
 
270
261
  /**
@@ -292,7 +283,7 @@ export const loadFont = async (
292
283
  ): Promise<void> => {
293
284
  const { fontFamily, atlasUrl, atlasDataUrl, metrics } = options;
294
285
  // Early return if already loaded
295
- if (loadedFonts.has(fontFamily) === true) {
286
+ if (fontCache.get(fontFamily) !== undefined) {
296
287
  return;
297
288
  }
298
289
 
@@ -341,7 +332,6 @@ export const loadFont = async (
341
332
  if (atlasTexture.state === 'loaded') {
342
333
  // If already loaded, process immediately
343
334
  processFontData(fontFamily, fontData, atlasTexture, metrics);
344
- loadedFonts.add(fontFamily);
345
335
  fontLoadPromises.delete(fontFamily);
346
336
 
347
337
  for (let key in nwff) {
@@ -355,8 +345,7 @@ export const loadFont = async (
355
345
  // Process and cache font data
356
346
  processFontData(fontFamily, fontData, atlasTexture, metrics);
357
347
 
358
- // Mark as loaded
359
- loadedFonts.add(fontFamily);
348
+ // remove from promises
360
349
  fontLoadPromises.delete(fontFamily);
361
350
 
362
351
  for (let key in nwff) {
@@ -388,6 +377,9 @@ export const loadFont = async (
388
377
  * @param {CoreTextNode} node - Node that was waiting for the font
389
378
  */
390
379
  export const waitingForFont = (fontFamily: string, node: CoreTextNode) => {
380
+ if (nodesWaitingForFont[fontFamily] === undefined) {
381
+ return;
382
+ }
391
383
  nodesWaitingForFont[fontFamily]![node.id] = node;
392
384
  };
393
385
 
@@ -435,7 +427,7 @@ export const type = 'sdf';
435
427
  * Check if a font is already loaded by font family
436
428
  */
437
429
  export const isFontLoaded = (fontFamily: string): boolean => {
438
- return loadedFonts.has(fontFamily);
430
+ return fontCache.has(fontFamily);
439
431
  };
440
432
 
441
433
  /**
@@ -443,24 +435,26 @@ export const isFontLoaded = (fontFamily: string): boolean => {
443
435
  */
444
436
  export const getFontMetrics = (
445
437
  fontFamily: string,
446
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
438
+
447
439
  fontSize: number,
448
440
  ): NormalizedFontMetrics => {
449
- const cache = fontCache[fontFamily];
450
- return cache ? cache.metrics : { ascender: 0, descender: 0, lineGap: 0 };
441
+ const out = normalizedMetrics.get(fontFamily);
442
+ if (out !== undefined) {
443
+ return out;
444
+ }
445
+ let metrics = fontCache.get(fontFamily)!.metrics;
446
+ return processFontMetrics(fontFamily, fontSize, metrics);
451
447
  };
452
448
 
453
- /**
454
- * Set font metrics for a font family
455
- */
456
- export const setFontMetrics = (
449
+ export const processFontMetrics = (
457
450
  fontFamily: string,
458
- metrics: NormalizedFontMetrics,
459
- ): void => {
460
- const cache = fontCache[fontFamily];
461
- if (cache !== undefined) {
462
- cache.metrics = metrics;
463
- }
451
+ fontSize: number,
452
+ metrics: FontMetrics,
453
+ ): NormalizedFontMetrics => {
454
+ const label = fontFamily + fontSize;
455
+ const normalized = normalizeFontMetrics(metrics, fontSize);
456
+ normalizedMetrics.set(label, normalized);
457
+ return normalized;
464
458
  };
465
459
 
466
460
  /**
@@ -473,7 +467,7 @@ export const getGlyph = (
473
467
  fontFamily: string,
474
468
  codepoint: number,
475
469
  ): SdfFontData['chars'][0] | null => {
476
- const cache = fontCache[fontFamily];
470
+ const cache = fontCache.get(fontFamily);
477
471
  if (cache === undefined) return null;
478
472
 
479
473
  return cache.glyphMap.get(codepoint) || cache.glyphMap.get(63) || null; // 63 = '?'
@@ -491,7 +485,7 @@ export const getKerning = (
491
485
  firstGlyph: number,
492
486
  secondGlyph: number,
493
487
  ): number => {
494
- const cache = fontCache[fontFamily];
488
+ const cache = fontCache.get(fontFamily);
495
489
  if (cache === undefined) return 0;
496
490
 
497
491
  const seconds = cache.kernings[secondGlyph];
@@ -504,7 +498,7 @@ export const getKerning = (
504
498
  * @returns {ImageTexture|null} Atlas texture or null
505
499
  */
506
500
  export const getAtlas = (fontFamily: string): ImageTexture | null => {
507
- const cache = fontCache[fontFamily];
501
+ const cache = fontCache.get(fontFamily);
508
502
  return cache !== undefined ? cache.atlasTexture : null;
509
503
  };
510
504
 
@@ -513,9 +507,8 @@ export const getAtlas = (fontFamily: string): ImageTexture | null => {
513
507
  * @param {string} fontFamily - Font family name
514
508
  * @returns {SdfFontData|null} Font data or null
515
509
  */
516
- export const getFontData = (fontFamily: string): SdfFontData | null => {
517
- const cache = fontCache[fontFamily];
518
- return cache !== undefined ? cache.data : null;
510
+ export const getFontData = (fontFamily: string): SdfFont | undefined => {
511
+ return fontCache.get(fontFamily);
519
512
  };
520
513
 
521
514
  /**
@@ -524,7 +517,7 @@ export const getFontData = (fontFamily: string): SdfFontData | null => {
524
517
  * @returns {number} Max character height or 0
525
518
  */
526
519
  export const getMaxCharHeight = (fontFamily: string): number => {
527
- const cache = fontCache[fontFamily];
520
+ const cache = fontCache.get(fontFamily);
528
521
  return cache !== undefined ? cache.maxCharHeight : 0;
529
522
  };
530
523
 
@@ -533,7 +526,7 @@ export const getMaxCharHeight = (fontFamily: string): number => {
533
526
  * @returns {string[]} Array of font family names
534
527
  */
535
528
  export const getLoadedFonts = (): string[] => {
536
- return Array.from(loadedFonts);
529
+ return Array.from(fontCache.keys());
537
530
  };
538
531
 
539
532
  /**
@@ -541,14 +534,58 @@ export const getLoadedFonts = (): string[] => {
541
534
  * @param {string} fontFamily - Font family name
542
535
  */
543
536
  export const unloadFont = (fontFamily: string): void => {
544
- const cache = fontCache[fontFamily];
537
+ const cache = fontCache.get(fontFamily);
545
538
  if (cache !== undefined) {
546
539
  // Free texture if needed
547
540
  if (typeof cache.atlasTexture.free === 'function') {
548
541
  cache.atlasTexture.free();
549
542
  }
550
543
 
551
- delete fontCache[fontFamily];
552
- loadedFonts.delete(fontFamily);
544
+ fontCache.delete(fontFamily);
553
545
  }
554
546
  };
547
+
548
+ export const measureText = (
549
+ text: string,
550
+ fontFamily: string,
551
+ letterSpacing: number,
552
+ ): number => {
553
+ if (text.length === 1) {
554
+ const char = text.charAt(0);
555
+ const codepoint = text.codePointAt(0);
556
+ if (codepoint === undefined) return 0;
557
+ if (hasZeroWidthSpace(char) === true) return 0;
558
+
559
+ const glyph = getGlyph(fontFamily, codepoint);
560
+ if (glyph === null) return 0;
561
+ return glyph.xadvance + letterSpacing;
562
+ }
563
+ let width = 0;
564
+ let prevCodepoint = 0;
565
+ for (let i = 0; i < text.length; i++) {
566
+ const char = text.charAt(i);
567
+ const codepoint = text.codePointAt(i);
568
+ if (codepoint === undefined) continue;
569
+
570
+ // Skip zero-width spaces in width calculations
571
+ if (hasZeroWidthSpace(char)) {
572
+ continue;
573
+ }
574
+
575
+ const glyph = getGlyph(fontFamily, codepoint);
576
+ if (glyph === null) continue;
577
+
578
+ let advance = glyph.xadvance;
579
+
580
+ // Add kerning if there's a previous character
581
+ if (prevCodepoint !== 0) {
582
+ const kerning = getKerning(fontFamily, prevCodepoint, codepoint);
583
+ advance += kerning;
584
+ }
585
+
586
+ width += advance + letterSpacing;
587
+ prevCodepoint = codepoint;
588
+ }
589
+
590
+ return width;
591
+ };
@@ -20,11 +20,12 @@
20
20
  import type { Stage } from '../Stage.js';
21
21
  import type {
22
22
  FontHandler,
23
+ TextLineStruct,
23
24
  TextRenderInfo,
24
25
  TextRenderProps,
25
26
  } from './TextRenderer.js';
26
27
  import type { CoreTextNodeProps } from '../CoreTextNode.js';
27
- import { isZeroWidthSpace } from './Utils.js';
28
+ import { hasZeroWidthSpace } from './Utils.js';
28
29
  import * as SdfFontHandler from './SdfFontHandler.js';
29
30
  import type { CoreRenderer } from '../renderers/CoreRenderer.js';
30
31
  import { WebGlRenderer } from '../renderers/webgl/WebGlRenderer.js';
@@ -35,7 +36,7 @@ import type { WebGlCtxTexture } from '../renderers/webgl/WebGlCtxTexture.js';
35
36
  import type { WebGlShaderNode } from '../renderers/webgl/WebGlShaderNode.js';
36
37
  import { mergeColorAlpha } from '../../utils.js';
37
38
  import type { TextLayout, GlyphLayout } from './TextRenderer.js';
38
- import { wrapText, measureLines } from './sdf/index.js';
39
+ import { mapTextLayout } from './TextLayoutEngine.js';
39
40
 
40
41
  // Each glyph requires 6 vertices (2 triangles) with 4 floats each (x, y, u, v)
41
42
  const FLOATS_PER_VERTEX = 4;
@@ -64,7 +65,7 @@ const font: FontHandler = SdfFontHandler;
64
65
  * @param props - Text rendering properties
65
66
  * @returns Object containing ImageData and dimensions
66
67
  */
67
- const renderText = (stage: Stage, props: CoreTextNodeProps): TextRenderInfo => {
68
+ const renderText = (props: CoreTextNodeProps): TextRenderInfo => {
68
69
  // Early return if no text
69
70
  if (props.text.length === 0) {
70
71
  return {
@@ -75,7 +76,7 @@ const renderText = (stage: Stage, props: CoreTextNodeProps): TextRenderInfo => {
75
76
 
76
77
  // Get font cache for this font family
77
78
  const fontData = SdfFontHandler.getFontData(props.fontFamily);
78
- if (fontData === null) {
79
+ if (fontData === undefined) {
79
80
  // Font not loaded, return empty result
80
81
  return {
81
82
  width: 0,
@@ -88,6 +89,8 @@ const renderText = (stage: Stage, props: CoreTextNodeProps): TextRenderInfo => {
88
89
 
89
90
  // For SDF renderer, ImageData is null since we render via WebGL
90
91
  return {
92
+ remainingLines: 0,
93
+ hasRemainingText: false,
91
94
  width: layout.width,
92
95
  height: layout.height,
93
96
  layout, // Cache layout for addQuads
@@ -187,7 +190,6 @@ const renderQuads = (
187
190
  ): void => {
188
191
  const fontFamily = renderProps.fontFamily;
189
192
  const color = renderProps.color;
190
- const offsetY = renderProps.offsetY;
191
193
  const worldAlpha = renderProps.worldAlpha;
192
194
  const globalTransform = renderProps.globalTransform;
193
195
 
@@ -243,9 +245,7 @@ const renderQuads = (
243
245
  transform: globalTransform,
244
246
  color: mergeColorAlpha(color, worldAlpha),
245
247
  size: layout.fontScale, // Use proper font scaling in shader
246
- scrollY: offsetY || 0,
247
248
  distanceRange: layout.distanceRange,
248
- debug: false, // Disable debug mode
249
249
  } satisfies SdfShaderProps,
250
250
  sdfBuffers: webGlBuffers,
251
251
  shader: sdfShader,
@@ -274,132 +274,79 @@ const renderQuads = (
274
274
  */
275
275
  const generateTextLayout = (
276
276
  props: CoreTextNodeProps,
277
- fontData: SdfFontHandler.SdfFontData,
277
+ fontCache: SdfFontHandler.SdfFont,
278
278
  ): TextLayout => {
279
- const commonFontData = fontData.common;
280
- const text = props.text;
281
279
  const fontSize = props.fontSize;
282
- const letterSpacing = props.letterSpacing;
283
280
  const fontFamily = props.fontFamily;
284
- const textAlign = props.textAlign;
285
- const maxWidth = props.maxWidth;
286
- const maxHeight = props.maxHeight;
287
- const maxLines = props.maxLines;
288
- const overflowSuffix = props.overflowSuffix;
289
- const wordBreak = props.wordBreak;
290
-
291
- // Use the font's design size for proper scaling
292
- const designLineHeight = commonFontData.lineHeight;
281
+ const lineHeight = props.lineHeight;
282
+ const metrics = SdfFontHandler.getFontMetrics(fontFamily, fontSize);
283
+ const verticalAlign = props.verticalAlign;
293
284
 
285
+ const fontData = fontCache.data;
286
+ const commonFontData = fontData.common;
294
287
  const designFontSize = fontData.info.size;
295
288
 
296
- const lineHeight =
297
- props.lineHeight || (designLineHeight * fontSize) / designFontSize;
298
289
  const atlasWidth = commonFontData.scaleW;
299
290
  const atlasHeight = commonFontData.scaleH;
300
291
 
301
292
  // Calculate the pixel scale from design units to pixels
302
- const finalScale = fontSize / designFontSize;
303
-
304
- // Calculate design letter spacing
305
- const designLetterSpacing = (letterSpacing * designFontSize) / fontSize;
306
-
307
- // Determine text wrapping behavior based on contain mode
308
- const shouldWrapText = maxWidth > 0;
309
- const heightConstraint = maxHeight > 0;
310
-
311
- // Calculate maximum lines constraint from height if needed
312
- let effectiveMaxLines = maxLines;
313
- if (heightConstraint === true) {
314
- const maxLinesFromHeight = Math.floor(
315
- maxHeight / (lineHeight * finalScale),
316
- );
317
- if (effectiveMaxLines === 0 || maxLinesFromHeight < effectiveMaxLines) {
318
- effectiveMaxLines = maxLinesFromHeight;
319
- }
320
- }
293
+ const fontScale = fontSize / designFontSize;
294
+ const letterSpacing = props.letterSpacing / fontScale;
295
+
296
+ const maxWidth = props.maxWidth / fontScale;
297
+ const maxHeight = props.maxHeight;
298
+ const [
299
+ lines,
300
+ remainingLines,
301
+ hasRemainingText,
302
+ bareLineHeight,
303
+ lineHeightPx,
304
+ effectiveWidth,
305
+ effectiveHeight,
306
+ ] = mapTextLayout(
307
+ SdfFontHandler.measureText,
308
+ metrics,
309
+ props.text,
310
+ props.textAlign,
311
+ verticalAlign,
312
+ fontFamily,
313
+ lineHeight,
314
+ props.overflowSuffix,
315
+ props.wordBreak,
316
+ letterSpacing,
317
+ props.maxLines,
318
+ maxWidth,
319
+ maxHeight,
320
+ );
321
321
 
322
- const hasMaxLines = effectiveMaxLines > 0;
323
-
324
- // Split text into lines based on wrapping constraints
325
- const [lines, remainingLines, remainingText] = shouldWrapText
326
- ? wrapText(
327
- text,
328
- fontFamily,
329
- finalScale,
330
- maxWidth,
331
- letterSpacing,
332
- overflowSuffix,
333
- wordBreak,
334
- effectiveMaxLines,
335
- hasMaxLines,
336
- )
337
- : measureLines(
338
- text.split('\n'),
339
- fontFamily,
340
- letterSpacing,
341
- finalScale,
342
- effectiveMaxLines,
343
- hasMaxLines,
344
- );
322
+ const lineAmount = lines.length;
345
323
 
346
324
  const glyphs: GlyphLayout[] = [];
347
- let maxWidthFound = 0;
325
+ let currentX = 0;
348
326
  let currentY = 0;
349
-
350
- for (let i = 0; i < lines.length; i++) {
351
- if (lines[i]![1] > maxWidthFound) {
352
- maxWidthFound = lines[i]![1];
353
- }
354
- }
355
-
356
- // Second pass: Generate glyph layouts with proper alignment
357
- let lineIndex = 0;
358
- const linesLength = lines.length;
359
-
360
- while (lineIndex < linesLength) {
361
- const [line, lineWidth] = lines[lineIndex]!;
362
- lineIndex++;
363
-
364
- // Calculate line X offset based on text alignment
365
- let lineXOffset = 0;
366
- if (textAlign === 'center') {
367
- const availableWidth = shouldWrapText
368
- ? maxWidth / finalScale
369
- : maxWidthFound;
370
- lineXOffset = (availableWidth - lineWidth) / 2;
371
- } else if (textAlign === 'right') {
372
- const availableWidth = shouldWrapText
373
- ? maxWidth / finalScale
374
- : maxWidthFound;
375
- lineXOffset = availableWidth - lineWidth;
376
- }
377
-
378
- let currentX = lineXOffset;
379
- let charIndex = 0;
380
- const lineLength = line.length;
327
+ for (let i = 0; i < lineAmount; i++) {
328
+ const line = lines[i] as TextLineStruct;
329
+ const textLine = line[0];
330
+ const textLineLength = textLine.length;
381
331
  let prevCodepoint = 0;
332
+ currentX = line[2];
333
+ //convert Y coord to vertex value
334
+ currentY = line[3] / fontScale;
382
335
 
383
- while (charIndex < lineLength) {
384
- const char = line.charAt(charIndex);
385
- const codepoint = char.codePointAt(0);
386
- charIndex++;
387
-
388
- if (codepoint === undefined) {
336
+ for (let j = 0; j < textLineLength; j++) {
337
+ const char = textLine.charAt(j);
338
+ if (hasZeroWidthSpace(char) === true) {
389
339
  continue;
390
340
  }
391
-
392
- // Skip zero-width spaces for rendering but keep them in the text flow
393
- if (isZeroWidthSpace(char)) {
341
+ const codepoint = char.codePointAt(0);
342
+ if (codepoint === undefined) {
394
343
  continue;
395
344
  }
396
-
397
345
  // Get glyph data from font handler
398
346
  const glyph = SdfFontHandler.getGlyph(fontFamily, codepoint);
399
347
  if (glyph === null) {
400
348
  continue;
401
349
  }
402
-
403
350
  // Calculate advance with kerning (in design units)
404
351
  let advance = glyph.xadvance;
405
352
 
@@ -432,21 +379,20 @@ const generateTextLayout = (
432
379
  glyphs.push(glyphLayout);
433
380
 
434
381
  // Advance position with letter spacing (in design units)
435
- currentX += advance + designLetterSpacing;
382
+ currentX += advance + letterSpacing;
436
383
  prevCodepoint = codepoint;
437
384
  }
438
-
439
- currentY += designLineHeight;
385
+ currentY += lineHeightPx;
440
386
  }
441
387
 
442
388
  // Convert final dimensions to pixel space for the layout
443
389
  return {
444
390
  glyphs,
445
- distanceRange: finalScale * fontData.distanceField.distanceRange,
446
- width: Math.ceil(maxWidthFound * finalScale),
447
- height: Math.ceil(designLineHeight * lines.length * finalScale),
448
- fontScale: finalScale,
449
- lineHeight,
391
+ distanceRange: fontScale * fontData.distanceField.distanceRange,
392
+ width: effectiveWidth * fontScale,
393
+ height: effectiveHeight,
394
+ fontScale: fontScale,
395
+ lineHeight: lineHeightPx,
450
396
  fontFamily,
451
397
  };
452
398
  };