@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
@@ -1,37 +1,137 @@
1
- /*
2
- * If not stated otherwise in this file or this component's LICENSE file the
3
- * following copyright and licenses apply:
4
- *
5
- * Copyright 2025 Comcast Cable Communications Management, LLC.
6
- *
7
- * Licensed under the Apache License, Version 2.0 (the License);
8
- * you may not use this file except in compliance with the License.
9
- * You may obtain a copy of the License at
10
- *
11
- * http://www.apache.org/licenses/LICENSE-2.0
12
- *
13
- * Unless required by applicable law or agreed to in writing, software
14
- * distributed under the License is distributed on an "AS IS" BASIS,
15
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
- * See the License for the specific language governing permissions and
17
- * limitations under the License.
18
- */
1
+ import type {
2
+ FontMetrics,
3
+ MeasureTextFn,
4
+ NormalizedFontMetrics,
5
+ TextLayoutStruct,
6
+ TextLineStruct,
7
+ WrappedLinesStruct,
8
+ } from './TextRenderer.js';
9
+
10
+ export const defaultFontMetrics: FontMetrics = {
11
+ ascender: 800,
12
+ descender: -200,
13
+ lineGap: 200,
14
+ unitsPerEm: 1000,
15
+ };
16
+
17
+ export const normalizeFontMetrics = (
18
+ metrics: FontMetrics,
19
+ fontSize: number,
20
+ ): NormalizedFontMetrics => {
21
+ const scale = fontSize / metrics.unitsPerEm;
22
+ return {
23
+ ascender: metrics.ascender * scale,
24
+ descender: metrics.descender * scale,
25
+ lineGap: metrics.lineGap * scale,
26
+ };
27
+ };
28
+
29
+ export const mapTextLayout = (
30
+ measureText: MeasureTextFn,
31
+ metrics: NormalizedFontMetrics,
32
+ text: string,
33
+ textAlign: string,
34
+ verticalAlign: string,
35
+ fontFamily: string,
36
+ lineHeight: number,
37
+ overflowSuffix: string,
38
+ wordBreak: string,
39
+ letterSpacing: number,
40
+ maxLines: number,
41
+ maxWidth: number,
42
+ maxHeight: number,
43
+ ): TextLayoutStruct => {
44
+ const ascPx = metrics.ascender;
45
+ const descPx = metrics.descender;
46
+
47
+ const bareLineHeight = ascPx - descPx;
48
+ const lineHeightPx =
49
+ lineHeight <= 3 ? lineHeight * bareLineHeight : lineHeight;
50
+ const lineHeightDelta = lineHeightPx - bareLineHeight;
51
+ const halfDelta = lineHeightDelta * 0.5;
52
+
53
+ let effectiveMaxLines = maxLines;
54
+ if (maxHeight > 0) {
55
+ const maxFromHeight = Math.floor(maxHeight / lineHeightPx);
56
+ if (effectiveMaxLines === 0 || maxFromHeight < effectiveMaxLines) {
57
+ effectiveMaxLines = maxFromHeight;
58
+ }
59
+ }
60
+
61
+ const wrappedText = maxWidth > 0;
62
+ //wrapText or just measureLines based on maxWidth
63
+ const [lines, remainingLines, remainingText] =
64
+ wrappedText === true
65
+ ? wrapText(
66
+ measureText,
67
+ text,
68
+ fontFamily,
69
+ maxWidth,
70
+ letterSpacing,
71
+ overflowSuffix,
72
+ wordBreak,
73
+ maxLines,
74
+ )
75
+ : measureLines(
76
+ measureText,
77
+ text.split('\n'),
78
+ fontFamily,
79
+ letterSpacing,
80
+ maxLines,
81
+ );
82
+
83
+ let effectiveLineAmount = lines.length;
84
+ let effectiveMaxWidth = lines[0]![1];
85
+
86
+ //check for longest line
87
+ if (effectiveLineAmount > 1) {
88
+ for (let i = 1; i < effectiveLineAmount; i++) {
89
+ effectiveMaxWidth = Math.max(effectiveMaxWidth, lines[i]![1]);
90
+ }
91
+ }
92
+
93
+ //update line x offsets
94
+ if (textAlign !== 'left') {
95
+ for (let i = 0; i < effectiveLineAmount; i++) {
96
+ const line = lines[i]!;
97
+ const w = line[1];
98
+ line[2] =
99
+ textAlign === 'right'
100
+ ? effectiveMaxWidth - w
101
+ : (effectiveMaxWidth - w) / 2;
102
+ }
103
+ }
104
+
105
+ const effectiveMaxHeight = effectiveLineAmount * lineHeightPx;
106
+
107
+ let firstBaseLine = halfDelta;
19
108
 
20
- import { isZeroWidthSpace } from '../Utils.js';
21
- import * as SdfFontHandler from '../SdfFontHandler.js';
22
- import type { TextLineStruct, WrappedLinesStruct } from '../TextRenderer.js';
109
+ const startY = firstBaseLine;
110
+ for (let i = 0; i < effectiveLineAmount; i++) {
111
+ const line = lines[i] as TextLineStruct;
112
+ line[3] = startY + lineHeightPx * i;
113
+ }
114
+
115
+ return [
116
+ lines,
117
+ remainingLines,
118
+ remainingText,
119
+ bareLineHeight,
120
+ lineHeightPx,
121
+ effectiveMaxWidth,
122
+ effectiveMaxHeight,
123
+ ];
124
+ };
23
125
 
24
126
  export const measureLines = (
127
+ measureText: MeasureTextFn,
25
128
  lines: string[],
26
129
  fontFamily: string,
27
130
  letterSpacing: number,
28
- fontScale: number,
29
131
  maxLines: number,
30
- hasMaxLines: boolean,
31
132
  ): WrappedLinesStruct => {
32
133
  const measuredLines: TextLineStruct[] = [];
33
- const designLetterSpacing = letterSpacing * fontScale;
34
- let remainingLines = hasMaxLines === true ? maxLines : lines.length;
134
+ let remainingLines = maxLines > 0 ? maxLines : lines.length;
35
135
  let i = 0;
36
136
 
37
137
  while (remainingLines > 0) {
@@ -41,71 +141,90 @@ export const measureLines = (
41
141
  if (line === undefined) {
42
142
  continue;
43
143
  }
44
- const width = measureText(line, fontFamily, designLetterSpacing);
45
- measuredLines.push([line, width]);
144
+ const width = measureText(line, fontFamily, letterSpacing);
145
+ measuredLines.push([line, width, 0, 0]);
46
146
  }
47
147
 
48
148
  return [
49
149
  measuredLines,
50
150
  remainingLines,
51
- hasMaxLines === true ? lines.length - measuredLines.length > 0 : false,
151
+ maxLines > 0 ? lines.length - measuredLines.length > 0 : false,
52
152
  ];
53
153
  };
54
- /**
55
- * Wrap text for SDF rendering with proper width constraints
56
- */
154
+
57
155
  export const wrapText = (
156
+ measureText: MeasureTextFn,
58
157
  text: string,
59
158
  fontFamily: string,
60
- fontScale: number,
61
159
  maxWidth: number,
62
160
  letterSpacing: number,
63
161
  overflowSuffix: string,
64
162
  wordBreak: string,
65
163
  maxLines: number,
66
- hasMaxLines: boolean,
67
164
  ): WrappedLinesStruct => {
68
165
  const lines = text.split('\n');
69
166
  const wrappedLines: TextLineStruct[] = [];
70
- const maxWidthInDesignUnits = maxWidth / fontScale;
71
- const designLetterSpacing = letterSpacing * fontScale;
72
167
 
73
168
  // Calculate space width for line wrapping
74
- const spaceWidth = measureText(' ', fontFamily, designLetterSpacing);
169
+ const spaceWidth = measureText(' ', fontFamily, letterSpacing);
75
170
 
76
171
  let wrappedLine: TextLineStruct[] = [];
77
172
  let remainingLines = maxLines;
78
173
  let hasRemainingText = true;
174
+ let hasMaxLines = maxLines > 0;
79
175
 
80
176
  for (let i = 0; i < lines.length; i++) {
81
- const line = lines[i]!;
177
+ const line = lines[i];
178
+ if (line === undefined) {
179
+ continue;
180
+ }
82
181
 
83
- [wrappedLine, remainingLines, hasRemainingText] = wrapLine(
84
- line,
85
- fontFamily,
86
- maxWidthInDesignUnits,
87
- designLetterSpacing,
88
- spaceWidth,
89
- overflowSuffix,
90
- wordBreak,
91
- remainingLines,
92
- hasMaxLines,
93
- );
182
+ [wrappedLine, remainingLines, hasRemainingText] =
183
+ line.length > 0
184
+ ? wrapLine(
185
+ measureText,
186
+ line,
187
+ fontFamily,
188
+ maxWidth,
189
+ letterSpacing,
190
+ spaceWidth,
191
+ overflowSuffix,
192
+ wordBreak,
193
+ remainingLines,
194
+ hasMaxLines,
195
+ )
196
+ : [[['', 0, 0, 0]], remainingLines, i < lines.length - 1];
94
197
 
198
+ remainingLines--;
95
199
  wrappedLines.push(...wrappedLine);
200
+
201
+ if (hasMaxLines === true && remainingLines <= 0) {
202
+ const lastLine = wrappedLines[wrappedLines.length - 1]!;
203
+ if (i < lines.length - 1) {
204
+ if (lastLine[0].endsWith(overflowSuffix) === false) {
205
+ lastLine[0] = truncateLineWithSuffix(
206
+ measureText,
207
+ lastLine[0],
208
+ fontFamily,
209
+ maxWidth,
210
+ letterSpacing,
211
+ overflowSuffix,
212
+ );
213
+ }
214
+ }
215
+ break;
216
+ }
96
217
  }
97
218
 
98
219
  return [wrappedLines, remainingLines, hasRemainingText];
99
220
  };
100
221
 
101
- /**
102
- * Wrap a single line of text for SDF rendering
103
- */
104
222
  export const wrapLine = (
223
+ measureText: MeasureTextFn,
105
224
  line: string,
106
225
  fontFamily: string,
107
226
  maxWidth: number,
108
- designLetterSpacing: number,
227
+ letterSpacing: number,
109
228
  spaceWidth: number,
110
229
  overflowSuffix: string,
111
230
  wordBreak: string,
@@ -129,7 +248,7 @@ export const wrapLine = (
129
248
  continue;
130
249
  }
131
250
  const space = spaces[i - 1] || '';
132
- const wordWidth = measureText(word, fontFamily, designLetterSpacing);
251
+ const wordWidth = measureText(word, fontFamily, letterSpacing);
133
252
  // For width calculation, treat ZWSP as having 0 width but regular space functionality
134
253
  const effectiveSpaceWidth = space === '\u200B' ? 0 : spaceWidth;
135
254
  const totalWidth = currentLineWidth + effectiveSpaceWidth + wordWidth;
@@ -165,25 +284,23 @@ export const wrapLine = (
165
284
  }
166
285
 
167
286
  if (wordBreak !== 'break-all' && currentLine.length > 0) {
168
- wrappedLines.push([currentLine, currentLineWidth]);
169
- currentLine = '';
170
- currentLineWidth = 0;
171
- remainingLines--;
287
+ wrappedLines.push([currentLine, currentLineWidth, 0, 0]);
172
288
  }
173
289
 
174
290
  if (wordBreak !== 'break-all') {
291
+ remainingLines--;
175
292
  currentLine = word;
176
293
  currentLineWidth = wordWidth;
177
294
  }
178
295
 
179
296
  if (wordBreak === 'break-word') {
180
297
  const [lines, rl, rt] = breakWord(
298
+ measureText,
181
299
  word,
182
300
  fontFamily,
183
301
  maxWidth,
184
- designLetterSpacing,
302
+ letterSpacing,
185
303
  remainingLines,
186
- hasMaxLines,
187
304
  );
188
305
  remainingLines = rl;
189
306
  hasRemainingText = rt;
@@ -198,16 +315,17 @@ export const wrapLine = (
198
315
  }
199
316
  }
200
317
  } else if (wordBreak === 'break-all') {
201
- const codepoint = word.codePointAt(0)!;
202
- const glyph = SdfFontHandler.getGlyph(fontFamily, codepoint);
203
- const firstLetterWidth =
204
- glyph !== null ? glyph.xadvance + designLetterSpacing : 0;
318
+ const firstLetterWidth = measureText(
319
+ word.charAt(0),
320
+ fontFamily,
321
+ letterSpacing,
322
+ );
205
323
  let linebreak = false;
206
324
  if (
207
325
  currentLineWidth + firstLetterWidth + effectiveSpaceWidth >
208
326
  maxWidth
209
327
  ) {
210
- wrappedLines.push([currentLine, currentLineWidth]);
328
+ wrappedLines.push([currentLine, currentLineWidth, 0, 0]);
211
329
  remainingLines -= 1;
212
330
  currentLine = '';
213
331
  currentLineWidth = 0;
@@ -215,109 +333,68 @@ export const wrapLine = (
215
333
  }
216
334
  const initial = maxWidth - currentLineWidth;
217
335
  const [lines, rl, rt] = breakAll(
336
+ measureText,
218
337
  word,
219
338
  fontFamily,
220
339
  initial,
221
340
  maxWidth,
222
- designLetterSpacing,
341
+ letterSpacing,
223
342
  remainingLines,
224
- hasMaxLines,
225
343
  );
226
344
  remainingLines = rl;
227
345
  hasRemainingText = rt;
228
346
  if (linebreak === false) {
229
347
  const [text, width] = lines[0]!;
230
- currentLine += ' ' + text;
231
- currentLineWidth = width;
232
- wrappedLines.push([currentLine, currentLineWidth]);
348
+ currentLine += text;
349
+ currentLineWidth += width;
350
+ wrappedLines.push([currentLine, currentLineWidth, 0, 0]);
233
351
  }
234
352
 
235
353
  for (let j = 1; j < lines.length; j++) {
236
354
  [currentLine, currentLineWidth] = lines[j]!;
237
355
  if (j < lines.length - 1) {
238
- wrappedLines.push([currentLine, currentLineWidth]);
356
+ wrappedLines.push([currentLine, currentLineWidth, 0, 0]);
239
357
  }
240
358
  }
359
+
360
+ if (i < words.length - 1 && currentLine.endsWith(' ') === false) {
361
+ currentLine += ' ';
362
+ currentLineWidth += effectiveSpaceWidth;
363
+ }
241
364
  }
242
365
  }
243
366
  }
244
367
 
245
368
  // Add the last line if it has content
246
- if (currentLine.length > 0 && remainingLines === 0) {
369
+ if (currentLine.length > 0 && hasMaxLines === true && remainingLines === 0) {
247
370
  currentLine = truncateLineWithSuffix(
371
+ measureText,
248
372
  currentLine,
249
373
  fontFamily,
250
374
  maxWidth,
251
- designLetterSpacing,
375
+ letterSpacing,
252
376
  overflowSuffix,
253
377
  );
254
378
  }
255
379
 
256
380
  if (currentLine.length > 0) {
257
- wrappedLines.push([currentLine, currentLineWidth]);
258
- } else {
259
- wrappedLines.push(['', 0]);
381
+ wrappedLines.push([currentLine, currentLineWidth, 0, 0]);
260
382
  }
261
383
  return [wrappedLines, remainingLines, hasRemainingText];
262
384
  };
263
385
 
264
- /**
265
- * Measure the width of text in SDF design units
266
- */
267
- export const measureText = (
268
- text: string,
269
- fontFamily: string,
270
- designLetterSpacing: number,
271
- ): number => {
272
- let width = 0;
273
- let prevCodepoint = 0;
274
- for (let i = 0; i < text.length; i++) {
275
- const char = text.charAt(i);
276
- const codepoint = text.codePointAt(i);
277
- if (codepoint === undefined) continue;
278
-
279
- // Skip zero-width spaces in width calculations
280
- if (isZeroWidthSpace(char)) {
281
- continue;
282
- }
283
-
284
- const glyph = SdfFontHandler.getGlyph(fontFamily, codepoint);
285
- if (glyph === null) continue;
286
-
287
- let advance = glyph.xadvance;
288
-
289
- // Add kerning if there's a previous character
290
- if (prevCodepoint !== 0) {
291
- const kerning = SdfFontHandler.getKerning(
292
- fontFamily,
293
- prevCodepoint,
294
- codepoint,
295
- );
296
- advance += kerning;
297
- }
298
-
299
- width += advance + designLetterSpacing;
300
- prevCodepoint = codepoint;
301
- }
302
-
303
- return width;
304
- };
305
-
306
386
  /**
307
387
  * Truncate a line with overflow suffix to fit within width
308
388
  */
309
389
  export const truncateLineWithSuffix = (
390
+ measureText: MeasureTextFn,
310
391
  line: string,
311
392
  fontFamily: string,
312
393
  maxWidth: number,
313
- designLetterSpacing: number,
394
+ letterSpacing: number,
314
395
  overflowSuffix: string,
315
396
  ): string => {
316
- const suffixWidth = measureText(
317
- overflowSuffix,
318
- fontFamily,
319
- designLetterSpacing,
320
- );
397
+ const suffixWidth = measureText(overflowSuffix, fontFamily, letterSpacing);
321
398
 
322
399
  if (suffixWidth >= maxWidth) {
323
400
  return overflowSuffix.substring(0, Math.max(1, overflowSuffix.length - 1));
@@ -325,11 +402,7 @@ export const truncateLineWithSuffix = (
325
402
 
326
403
  let truncatedLine = line;
327
404
  while (truncatedLine.length > 0) {
328
- const lineWidth = measureText(
329
- truncatedLine,
330
- fontFamily,
331
- designLetterSpacing,
332
- );
405
+ const lineWidth = measureText(truncatedLine, fontFamily, letterSpacing);
333
406
  if (lineWidth + suffixWidth <= maxWidth) {
334
407
  return truncatedLine + overflowSuffix;
335
408
  }
@@ -343,12 +416,12 @@ export const truncateLineWithSuffix = (
343
416
  * wordbreak function: https://developer.mozilla.org/en-US/docs/Web/CSS/word-break#break-word
344
417
  */
345
418
  export const breakWord = (
419
+ measureText: MeasureTextFn,
346
420
  word: string,
347
421
  fontFamily: string,
348
422
  maxWidth: number,
349
- designLetterSpacing: number,
423
+ letterSpacing: number,
350
424
  remainingLines: number,
351
- hasMaxLines: boolean,
352
425
  ): WrappedLinesStruct => {
353
426
  const lines: TextLineStruct[] = [];
354
427
  let currentPart = '';
@@ -360,17 +433,14 @@ export const breakWord = (
360
433
  const codepoint = char.codePointAt(0);
361
434
  if (codepoint === undefined) continue;
362
435
 
363
- const glyph = SdfFontHandler.getGlyph(fontFamily, codepoint);
364
- if (glyph === null) continue;
365
-
366
- const charWidth = glyph.xadvance + designLetterSpacing;
436
+ const charWidth = measureText(char, fontFamily, letterSpacing);
367
437
 
368
438
  if (currentWidth + charWidth > maxWidth && currentPart.length > 0) {
369
439
  remainingLines--;
370
440
  if (remainingLines === 0) {
371
441
  break;
372
442
  }
373
- lines.push([currentPart, currentWidth]);
443
+ lines.push([currentPart, currentWidth, 0, 0]);
374
444
  currentPart = char;
375
445
  currentWidth = charWidth;
376
446
  } else {
@@ -380,7 +450,7 @@ export const breakWord = (
380
450
  }
381
451
 
382
452
  if (currentPart.length > 0) {
383
- lines.push([currentPart, currentWidth]);
453
+ lines.push([currentPart, currentWidth, 0, 0]);
384
454
  }
385
455
 
386
456
  return [lines, remainingLines, i < word.length - 1];
@@ -390,13 +460,13 @@ export const breakWord = (
390
460
  * wordbreak function: https://developer.mozilla.org/en-US/docs/Web/CSS/word-break#break-word
391
461
  */
392
462
  export const breakAll = (
463
+ measureText: MeasureTextFn,
393
464
  word: string,
394
465
  fontFamily: string,
395
466
  initial: number,
396
467
  maxWidth: number,
397
- designLetterSpacing: number,
468
+ letterSpacing: number,
398
469
  remainingLines: number,
399
- hasMaxLines: boolean,
400
470
  ): WrappedLinesStruct => {
401
471
  const lines: TextLineStruct[] = [];
402
472
  let currentPart = '';
@@ -411,13 +481,9 @@ export const breakAll = (
411
481
  break;
412
482
  }
413
483
  const char = word.charAt(i);
414
- const codepoint = char.codePointAt(0)!;
415
- const glyph = SdfFontHandler.getGlyph(fontFamily, codepoint);
416
- if (glyph === null) continue;
417
-
418
- const charWidth = glyph.xadvance + designLetterSpacing;
484
+ const charWidth = measureText(char, fontFamily, letterSpacing);
419
485
  if (currentWidth + charWidth > max && currentPart.length > 0) {
420
- lines.push([currentPart, currentWidth]);
486
+ lines.push([currentPart, currentWidth, 0, 0]);
421
487
  currentPart = char;
422
488
  currentWidth = charWidth;
423
489
  max = maxWidth;
@@ -429,7 +495,7 @@ export const breakAll = (
429
495
  }
430
496
 
431
497
  if (currentPart.length > 0) {
432
- lines.push([currentPart, currentWidth]);
498
+ lines.push([currentPart, currentWidth, 0, 0]);
433
499
  }
434
500
 
435
501
  return [lines, remainingLines, hasRemainingText];
@@ -198,16 +198,6 @@ export interface TrProps extends TrFontProps {
198
198
  * @default 0
199
199
  */
200
200
  maxLines: number;
201
- /**
202
- * Baseline for text
203
- *
204
- * @remarks
205
- * This property sets the text baseline used when drawing text.
206
- * Not yet implemented in the SDF renderer.
207
- *
208
- * @default alphabetic
209
- */
210
- textBaseline: TextBaseline;
211
201
  /**
212
202
  * Vertical Align for text when lineHeight > fontSize
213
203
  *
@@ -335,6 +325,15 @@ export interface FontLoadOptions {
335
325
  atlasDataUrl?: string;
336
326
  }
337
327
 
328
+ /**
329
+ * Measure Width of Text function to be defined in font handlers, used in TextLayoutEngine
330
+ */
331
+ export type MeasureTextFn = (
332
+ text: string,
333
+ fontFamily: string,
334
+ letterSpacing: number,
335
+ ) => number;
336
+
338
337
  export interface FontHandler {
339
338
  init: (
340
339
  c: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D,
@@ -350,7 +349,7 @@ export interface FontHandler {
350
349
  fontFamily: string,
351
350
  fontSize: number,
352
351
  ) => NormalizedFontMetrics;
353
- setFontMetrics: (fontFamily: string, metrics: NormalizedFontMetrics) => void;
352
+ measureText: MeasureTextFn;
354
353
  }
355
354
 
356
355
  export interface TextRenderProps {
@@ -371,6 +370,8 @@ export interface TextRenderProps {
371
370
  export interface TextRenderInfo {
372
371
  width: number;
373
372
  height: number;
373
+ hasRemainingText?: boolean;
374
+ remainingLines?: number;
374
375
  imageData?: ImageData | null; // Image data for Canvas Text Renderer
375
376
  layout?: TextLayout; // Layout data for SDF renderer caching
376
377
  }
@@ -378,7 +379,7 @@ export interface TextRenderInfo {
378
379
  export interface TextRenderer {
379
380
  type: 'canvas' | 'sdf';
380
381
  font: FontHandler;
381
- renderText: (stage: Stage, props: CoreTextNodeProps) => TextRenderInfo;
382
+ renderText: (props: CoreTextNodeProps) => TextRenderInfo;
382
383
  // Updated to accept layout data and return vertex buffer for performance
383
384
  addQuads: (layout?: TextLayout) => Float32Array | null;
384
385
  renderQuads: (
@@ -394,8 +395,10 @@ export interface TextRenderer {
394
395
  * Text line struct for text mapping
395
396
  * 0 - text
396
397
  * 1 - width
398
+ * 2 - line offset x
399
+ * 3 - line offset y
397
400
  */
398
- export type TextLineStruct = [string, number];
401
+ export type TextLineStruct = [string, number, number, number];
399
402
 
400
403
  /**
401
404
  * Wrapped lines struct for text mapping
@@ -404,3 +407,23 @@ export type TextLineStruct = [string, number];
404
407
  * 2 - remaining text
405
408
  */
406
409
  export type WrappedLinesStruct = [TextLineStruct[], number, boolean];
410
+
411
+ /**
412
+ * Wrapped lines struct for text mapping
413
+ * 0 - line structs
414
+ * 1 - remaining lines
415
+ * 2 - remaining text
416
+ * 3 - bare line height
417
+ * 4 - line height pixels
418
+ * 5 - effective width
419
+ * 6 - effective height
420
+ */
421
+ export type TextLayoutStruct = [
422
+ TextLineStruct[],
423
+ number,
424
+ boolean,
425
+ number,
426
+ number,
427
+ number,
428
+ number,
429
+ ];