@lightningjs/renderer 3.0.0-beta13 → 3.0.0-beta15

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 (278) 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 +0 -2
  5. package/dist/src/core/CoreTextNode.js +4 -16
  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 -2
  13. package/dist/src/core/animations/CoreAnimation.js +3 -2
  14. package/dist/src/core/animations/CoreAnimation.js.map +1 -1
  15. package/dist/src/core/lib/WebGlContextWrapper.d.ts +6 -6
  16. package/dist/src/core/lib/WebGlContextWrapper.js +2 -2
  17. package/dist/src/core/lib/WebGlContextWrapper.js.map +1 -1
  18. package/dist/src/core/lib/textureCompression.js +1 -1
  19. package/dist/src/core/lib/textureCompression.js.map +1 -1
  20. package/dist/src/core/platform.d.ts +10 -0
  21. package/dist/src/core/platform.js +81 -0
  22. package/dist/src/core/platform.js.map +1 -0
  23. package/dist/src/core/renderers/CoreShader.d.ts +9 -0
  24. package/{src/core/text-rendering/sdf/index.ts → dist/src/core/renderers/CoreShader.js} +11 -3
  25. package/dist/src/core/renderers/CoreShader.js.map +1 -0
  26. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.d.ts +33 -0
  27. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.js +250 -0
  28. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.js.map +1 -0
  29. package/dist/src/core/renderers/canvas/CanvasCoreTexture.d.ts +17 -0
  30. package/dist/src/core/renderers/canvas/CanvasCoreTexture.js +125 -0
  31. package/dist/src/core/renderers/canvas/CanvasCoreTexture.js.map +1 -0
  32. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.d.ts +14 -0
  33. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.js +138 -0
  34. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.js.map +1 -0
  35. package/dist/src/core/renderers/canvas/internal/ColorUtils.d.ts +19 -0
  36. package/dist/src/core/renderers/canvas/internal/ColorUtils.js +58 -0
  37. package/dist/src/core/renderers/canvas/internal/ColorUtils.js.map +1 -0
  38. package/dist/src/core/renderers/canvas/shaders/UnsupportedShader.d.ts +10 -0
  39. package/dist/src/core/renderers/canvas/shaders/UnsupportedShader.js +43 -0
  40. package/dist/src/core/renderers/canvas/shaders/UnsupportedShader.js.map +1 -0
  41. package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.d.ts +12 -0
  42. package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.js +58 -0
  43. package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.js.map +1 -0
  44. package/dist/src/core/renderers/webgl/WebGlCoreCtxSubTexture.d.ts +9 -0
  45. package/dist/src/core/renderers/webgl/WebGlCoreCtxSubTexture.js +38 -0
  46. package/dist/src/core/renderers/webgl/WebGlCoreCtxSubTexture.js.map +1 -0
  47. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.d.ts +65 -0
  48. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js +269 -0
  49. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js.map +1 -0
  50. package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.d.ts +34 -0
  51. package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.js +114 -0
  52. package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.js.map +1 -0
  53. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.d.ts +133 -0
  54. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js +616 -0
  55. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js.map +1 -0
  56. package/dist/src/core/renderers/webgl/WebGlCoreShader.d.ts +83 -0
  57. package/dist/src/core/renderers/webgl/WebGlCoreShader.js +233 -0
  58. package/dist/src/core/renderers/webgl/WebGlCoreShader.js.map +1 -0
  59. package/dist/src/core/renderers/webgl/WebGlShaderProgram.d.ts +1 -1
  60. package/dist/src/core/renderers/webgl/WebGlShaderProgram.js +4 -5
  61. package/dist/src/core/renderers/webgl/WebGlShaderProgram.js.map +1 -1
  62. package/dist/src/core/renderers/webgl/shaders/DefaultShader.d.ts +9 -0
  63. package/dist/src/core/renderers/webgl/shaders/DefaultShader.js +87 -0
  64. package/dist/src/core/renderers/webgl/shaders/DefaultShader.js.map +1 -0
  65. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.d.ts +10 -0
  66. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.js +119 -0
  67. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.js.map +1 -0
  68. package/dist/src/core/renderers/webgl/shaders/DynamicShader.d.ts +29 -0
  69. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js +413 -0
  70. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js.map +1 -0
  71. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.d.ts +28 -0
  72. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.js +131 -0
  73. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.js.map +1 -0
  74. package/dist/src/core/renderers/webgl/shaders/SdfShader.d.ts +47 -0
  75. package/dist/src/core/renderers/webgl/shaders/SdfShader.js +160 -0
  76. package/dist/src/core/renderers/webgl/shaders/SdfShader.js.map +1 -0
  77. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.d.ts +31 -0
  78. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.js +71 -0
  79. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.js.map +1 -0
  80. package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.d.ts +30 -0
  81. package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.js +58 -0
  82. package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.js.map +1 -0
  83. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.d.ts +31 -0
  84. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.js +71 -0
  85. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.js.map +1 -0
  86. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.d.ts +31 -0
  87. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.js +71 -0
  88. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.js.map +1 -0
  89. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.d.ts +31 -0
  90. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.js +71 -0
  91. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.js.map +1 -0
  92. package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.d.ts +9 -0
  93. package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.js +136 -0
  94. package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.js.map +1 -0
  95. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.d.ts +36 -0
  96. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.js +85 -0
  97. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.js.map +1 -0
  98. package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.d.ts +45 -0
  99. package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.js +104 -0
  100. package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.js.map +1 -0
  101. package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.d.ts +22 -0
  102. package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.js +45 -0
  103. package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.js.map +1 -0
  104. package/dist/src/core/renderers/webgl/shaders/effects/HolePunchEffect.d.ts +58 -0
  105. package/dist/src/core/renderers/webgl/shaders/effects/HolePunchEffect.js +80 -0
  106. package/dist/src/core/renderers/webgl/shaders/effects/HolePunchEffect.js.map +1 -0
  107. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.d.ts +35 -0
  108. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js +129 -0
  109. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js.map +1 -0
  110. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.d.ts +39 -0
  111. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js +116 -0
  112. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js.map +1 -0
  113. package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.d.ts +61 -0
  114. package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.js +127 -0
  115. package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.js.map +1 -0
  116. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.d.ts +40 -0
  117. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.js +71 -0
  118. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.js.map +1 -0
  119. package/dist/src/core/renderers/webgl/shaders/effects/ShaderEffect.d.ts +115 -0
  120. package/dist/src/core/renderers/webgl/shaders/effects/ShaderEffect.js +61 -0
  121. package/dist/src/core/renderers/webgl/shaders/effects/ShaderEffect.js.map +1 -0
  122. package/dist/src/core/shaders/canvas/RoundedWithBorder.js +1 -1
  123. package/dist/src/core/shaders/canvas/RoundedWithBorder.js.map +1 -1
  124. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.js +1 -1
  125. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.js.map +1 -1
  126. package/dist/src/core/shaders/webgl/LinearGradient.js +26 -3
  127. package/dist/src/core/shaders/webgl/LinearGradient.js.map +1 -1
  128. package/dist/src/core/shaders/webgl/RadialGradient.js +49 -27
  129. package/dist/src/core/shaders/webgl/RadialGradient.js.map +1 -1
  130. package/dist/src/core/shaders/webgl/SdfShader.d.ts +0 -2
  131. package/dist/src/core/shaders/webgl/SdfShader.js +1 -10
  132. package/dist/src/core/shaders/webgl/SdfShader.js.map +1 -1
  133. package/dist/src/core/text-rendering/CanvasFontHandler.d.ts +21 -3
  134. package/dist/src/core/text-rendering/CanvasFontHandler.js +94 -32
  135. package/dist/src/core/text-rendering/CanvasFontHandler.js.map +1 -1
  136. package/dist/src/core/text-rendering/CanvasTextRenderer.d.ts +2 -7
  137. package/dist/src/core/text-rendering/CanvasTextRenderer.js +51 -260
  138. package/dist/src/core/text-rendering/CanvasTextRenderer.js.map +1 -1
  139. package/dist/src/core/text-rendering/SdfFontHandler.d.ts +35 -5
  140. package/dist/src/core/text-rendering/SdfFontHandler.js +76 -56
  141. package/dist/src/core/text-rendering/SdfFontHandler.js.map +1 -1
  142. package/dist/src/core/text-rendering/SdfTextRenderer.d.ts +1 -1
  143. package/dist/src/core/text-rendering/SdfTextRenderer.js +38 -82
  144. package/dist/src/core/text-rendering/SdfTextRenderer.js.map +1 -1
  145. package/dist/src/core/text-rendering/TextLayoutEngine.d.ts +19 -0
  146. package/dist/src/core/text-rendering/{sdf/Utils.js → TextLayoutEngine.js} +125 -105
  147. package/dist/src/core/text-rendering/TextLayoutEngine.js.map +1 -0
  148. package/dist/src/core/text-rendering/TextRenderer.d.ts +30 -13
  149. package/dist/src/core/text-rendering/TextRenderingUtils.d.ts +12 -0
  150. package/dist/src/core/text-rendering/TextRenderingUtils.js +14 -0
  151. package/dist/src/core/text-rendering/TextRenderingUtils.js.map +1 -0
  152. package/dist/src/core/text-rendering/TextTextureRendererUtils.d.ts +72 -0
  153. package/dist/src/core/text-rendering/TextTextureRendererUtils.js +217 -0
  154. package/dist/src/core/text-rendering/TextTextureRendererUtils.js.map +1 -0
  155. package/dist/src/core/text-rendering/TrFontManager.d.ts +26 -0
  156. package/dist/src/core/text-rendering/TrFontManager.js +131 -0
  157. package/dist/src/core/text-rendering/TrFontManager.js.map +1 -0
  158. package/dist/src/core/text-rendering/Utils.d.ts +1 -42
  159. package/dist/src/core/text-rendering/Utils.js +4 -132
  160. package/dist/src/core/text-rendering/Utils.js.map +1 -1
  161. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.d.ts +39 -0
  162. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js +125 -0
  163. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js.map +1 -0
  164. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.d.ts +103 -0
  165. package/dist/src/core/text-rendering/{sdf/index.js → font-face-types/SdfTrFontFace/internal/FontShaper.js} +4 -3
  166. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.js.map +1 -0
  167. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.d.ts +62 -0
  168. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.js +88 -0
  169. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.js.map +1 -0
  170. package/dist/src/core/text-rendering/font-face-types/TrFontFace.d.ts +118 -0
  171. package/dist/src/core/text-rendering/font-face-types/TrFontFace.js +63 -0
  172. package/dist/src/core/text-rendering/font-face-types/TrFontFace.js.map +1 -0
  173. package/dist/src/core/text-rendering/font-face-types/WebTrFontFace.d.ts +14 -0
  174. package/dist/src/core/text-rendering/font-face-types/WebTrFontFace.js +66 -0
  175. package/dist/src/core/text-rendering/font-face-types/WebTrFontFace.js.map +1 -0
  176. package/dist/src/core/text-rendering/font-face-types/utils.d.ts +1 -0
  177. package/dist/src/core/text-rendering/font-face-types/utils.js +38 -0
  178. package/dist/src/core/text-rendering/font-face-types/utils.js.map +1 -0
  179. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.d.ts +59 -0
  180. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js +397 -0
  181. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js.map +1 -0
  182. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.d.ts +120 -0
  183. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js +551 -0
  184. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js.map +1 -0
  185. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.d.ts +92 -0
  186. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js +607 -0
  187. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js.map +1 -0
  188. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.d.ts +12 -0
  189. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.js +61 -0
  190. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.js.map +1 -0
  191. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.d.ts +33 -0
  192. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.js +52 -0
  193. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.js.map +1 -0
  194. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.d.ts +13 -0
  195. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.js +32 -0
  196. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.js.map +1 -0
  197. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.d.ts +23 -0
  198. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.js +84 -0
  199. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.js.map +1 -0
  200. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.d.ts +4 -0
  201. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.js +34 -0
  202. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.js.map +1 -0
  203. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.d.ts +20 -0
  204. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js +308 -0
  205. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js.map +1 -0
  206. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.d.ts +10 -0
  207. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.js +40 -0
  208. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.js.map +1 -0
  209. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.d.ts +26 -0
  210. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.js +70 -0
  211. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.js.map +1 -0
  212. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.d.ts +16 -0
  213. package/dist/src/core/text-rendering/{canvas/Settings.js → renderers/SdfTextRenderer/internal/util.js} +22 -3
  214. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.js.map +1 -0
  215. package/dist/src/core/text-rendering/renderers/TextRenderer.d.ts +373 -0
  216. package/dist/src/core/text-rendering/renderers/TextRenderer.js +178 -0
  217. package/dist/src/core/text-rendering/renderers/TextRenderer.js.map +1 -0
  218. package/dist/src/core/utils.d.ts +2 -1
  219. package/dist/src/core/utils.js +1 -1
  220. package/dist/src/core/utils.js.map +1 -1
  221. package/dist/src/main-api/DynamicShaderController.d.ts +29 -0
  222. package/dist/src/main-api/DynamicShaderController.js +58 -0
  223. package/dist/src/main-api/DynamicShaderController.js.map +1 -0
  224. package/dist/src/main-api/Inspector.d.ts +124 -0
  225. package/dist/src/main-api/Inspector.js +283 -8
  226. package/dist/src/main-api/Inspector.js.map +1 -1
  227. package/dist/src/main-api/Renderer.d.ts +150 -26
  228. package/dist/src/main-api/Renderer.js +27 -25
  229. package/dist/src/main-api/Renderer.js.map +1 -1
  230. package/dist/src/main-api/ShaderController.d.ts +31 -0
  231. package/dist/src/main-api/ShaderController.js +37 -0
  232. package/dist/src/main-api/ShaderController.js.map +1 -0
  233. package/dist/tsconfig.dist.tsbuildinfo +1 -1
  234. package/exports/index.ts +1 -0
  235. package/package.json +14 -15
  236. package/src/core/CoreTextNode.ts +4 -22
  237. package/src/core/Stage.ts +2 -3
  238. package/src/core/animations/CoreAnimation.ts +8 -7
  239. package/src/core/lib/WebGlContextWrapper.ts +4 -3
  240. package/src/core/lib/textureCompression.ts +4 -2
  241. package/src/core/renderers/webgl/WebGlShaderProgram.ts +5 -6
  242. package/src/core/shaders/canvas/RoundedWithBorder.ts +1 -1
  243. package/src/core/shaders/canvas/RoundedWithBorderAndShadow.ts +1 -1
  244. package/src/core/shaders/webgl/LinearGradient.ts +26 -3
  245. package/src/core/shaders/webgl/RadialGradient.ts +50 -28
  246. package/src/core/shaders/webgl/SdfShader.ts +1 -12
  247. package/src/core/text-rendering/CanvasFontHandler.ts +136 -39
  248. package/src/core/text-rendering/CanvasTextRenderer.ts +75 -440
  249. package/src/core/text-rendering/SdfFontHandler.ts +94 -60
  250. package/src/core/text-rendering/SdfTextRenderer.ts +62 -116
  251. package/src/core/text-rendering/{sdf/Utils.ts → TextLayoutEngine.ts} +209 -143
  252. package/src/core/text-rendering/TextRenderer.ts +36 -13
  253. package/src/core/text-rendering/Utils.ts +5 -163
  254. package/src/core/text-rendering/{sdf/Utils.test.ts → tests/Canvas.test.ts} +98 -122
  255. package/src/core/text-rendering/tests/SdfTests.test.ts +414 -0
  256. package/src/core/utils.ts +9 -7
  257. package/src/main-api/Inspector.ts +502 -12
  258. package/src/main-api/Renderer.ts +158 -26
  259. package/dist/src/core/text-rendering/canvas/Settings.d.ts +0 -64
  260. package/dist/src/core/text-rendering/canvas/Settings.js.map +0 -1
  261. package/dist/src/core/text-rendering/canvas/Utils.d.ts +0 -20
  262. package/dist/src/core/text-rendering/canvas/Utils.js +0 -144
  263. package/dist/src/core/text-rendering/canvas/Utils.js.map +0 -1
  264. package/dist/src/core/text-rendering/canvas/calculateRenderInfo.d.ts +0 -60
  265. package/dist/src/core/text-rendering/canvas/calculateRenderInfo.js +0 -183
  266. package/dist/src/core/text-rendering/canvas/calculateRenderInfo.js.map +0 -1
  267. package/dist/src/core/text-rendering/canvas/draw.d.ts +0 -5
  268. package/dist/src/core/text-rendering/canvas/draw.js +0 -132
  269. package/dist/src/core/text-rendering/canvas/draw.js.map +0 -1
  270. package/dist/src/core/text-rendering/sdf/Utils.d.ts +0 -26
  271. package/dist/src/core/text-rendering/sdf/Utils.js.map +0 -1
  272. package/dist/src/core/text-rendering/sdf/index.d.ts +0 -1
  273. package/dist/src/core/text-rendering/sdf/index.js.map +0 -1
  274. package/src/core/text-rendering/canvas/Settings.ts +0 -99
  275. package/src/core/text-rendering/canvas/Utils.test.ts +0 -206
  276. package/src/core/text-rendering/canvas/Utils.ts +0 -178
  277. package/src/core/text-rendering/canvas/calculateRenderInfo.ts +0 -299
  278. package/src/core/text-rendering/canvas/draw.ts +0 -165
@@ -19,17 +19,11 @@
19
19
 
20
20
  import { assertTruthy } from '../../utils.js';
21
21
  import type { Stage } from '../Stage.js';
22
- import type {
23
- TextLayout,
24
- NormalizedFontMetrics,
25
- TextBaseline,
26
- } from './TextRenderer.js';
22
+ import type { TextLineStruct, TextRenderInfo } from './TextRenderer.js';
27
23
  import * as CanvasFontHandler from './CanvasFontHandler.js';
28
- import { type LineType } from './canvas/calculateRenderInfo.js';
29
- import { calcHeight, measureText, wrapText, wrapWord } from './canvas/Utils.js';
30
- import { normalizeCanvasColor } from '../lib/colorCache.js';
31
24
  import type { CoreTextNodeProps } from '../CoreTextNode.js';
32
- import { isZeroWidthSpace } from './Utils.js';
25
+ import { hasZeroWidthSpace } from './Utils.js';
26
+ import { mapTextLayout } from './TextLayoutEngine.js';
33
27
 
34
28
  const MAX_TEXTURE_DIMENSION = 4096;
35
29
 
@@ -62,12 +56,17 @@ const layoutCache = new Map<
62
56
 
63
57
  // Initialize the Text Renderer
64
58
  const init = (stage: Stage): void => {
59
+ const dpr = window.devicePixelRatio || 1;
60
+
65
61
  // Drawing canvas and context
66
62
  canvas = stage.platform.createCanvas() as HTMLCanvasElement | OffscreenCanvas;
67
63
  context = canvas.getContext('2d', { willReadFrequently: true }) as
68
64
  | CanvasRenderingContext2D
69
65
  | OffscreenCanvasRenderingContext2D;
70
66
 
67
+ context.setTransform(dpr, 0, 0, dpr, 0, 0);
68
+ context.textRendering = 'optimizeSpeed';
69
+
71
70
  // Separate measuring canvas and context
72
71
  measureCanvas = stage.platform.createCanvas() as
73
72
  | HTMLCanvasElement
@@ -76,11 +75,14 @@ const init = (stage: Stage): void => {
76
75
  | CanvasRenderingContext2D
77
76
  | OffscreenCanvasRenderingContext2D;
78
77
 
78
+ measureContext.setTransform(dpr, 0, 0, dpr, 0, 0);
79
+ measureContext.textRendering = 'optimizeSpeed';
80
+
79
81
  // Set up a minimal size for the measuring canvas since we only use it for measurements
80
82
  measureCanvas.width = 1;
81
83
  measureCanvas.height = 1;
82
84
 
83
- CanvasFontHandler.init(context);
85
+ CanvasFontHandler.init(context, measureContext);
84
86
  };
85
87
 
86
88
  /**
@@ -90,18 +92,10 @@ const init = (stage: Stage): void => {
90
92
  * @param props - Text rendering properties
91
93
  * @returns Object containing ImageData and dimensions
92
94
  */
93
- const renderText = (
94
- stage: Stage,
95
- props: CoreTextNodeProps,
96
- ): {
97
- imageData: ImageData | null;
98
- width: number;
99
- height: number;
100
- layout?: TextLayout;
101
- } => {
95
+ const renderText = (props: CoreTextNodeProps): TextRenderInfo => {
102
96
  assertTruthy(canvas, 'Canvas is not initialized');
103
97
  assertTruthy(context, 'Canvas context is not available');
104
-
98
+ assertTruthy(measureContext, 'Canvas measureContext is not available');
105
99
  // Extract already normalized properties
106
100
  const {
107
101
  text,
@@ -109,161 +103,103 @@ const renderText = (
109
103
  fontStyle,
110
104
  fontSize,
111
105
  textAlign,
112
- lineHeight: propLineHeight,
113
106
  maxLines,
114
- textBaseline,
107
+ lineHeight,
115
108
  verticalAlign,
116
109
  overflowSuffix,
117
110
  maxWidth,
118
111
  maxHeight,
119
- offsetY,
120
- letterSpacing,
112
+ wordBreak,
121
113
  } = props;
122
114
 
123
- // Performance optimization constants
124
- const precision = 1;
125
- const paddingLeft = 0;
126
- const paddingRight = 0;
127
- const textIndent = 0;
128
- const textRenderIssueMargin = 0;
129
- const textColor = 0xffffffff;
130
-
131
- // Determine word wrap behavior
132
- const wordWrap = maxWidth > 0;
133
- const textOverflow = overflowSuffix ? 'ellipsis' : null;
134
-
135
- // Calculate scaled values
136
- const scaledFontSize = fontSize * precision;
137
- const scaledOffsetY = offsetY * precision;
138
- const scaledLetterSpacing = letterSpacing * precision;
115
+ const font = `${fontStyle} ${fontSize}px Unknown, ${fontFamily}`;
139
116
  // Get font metrics and calculate line height
140
- context.font = `${fontStyle} ${scaledFontSize}px ${fontFamily}`;
141
- context.textBaseline = textBaseline;
142
-
143
- const metrics = CanvasFontHandler.getFontMetrics(fontFamily, scaledFontSize);
144
- const lineHeight =
145
- propLineHeight === 0
146
- ? scaledFontSize *
147
- (metrics.ascender - metrics.descender + metrics.lineGap) *
148
- precision
149
- : propLineHeight;
117
+ measureContext.font = font;
118
+ measureContext.textBaseline = 'hanging';
150
119
 
151
- // Calculate max lines constraint
152
- const containedMaxLines =
153
- maxHeight !== null ? Math.floor(maxHeight / lineHeight) : 0;
154
- const computedMaxLines = calculateMaxLines(containedMaxLines, maxLines);
120
+ const metrics = CanvasFontHandler.getFontMetrics(fontFamily, fontSize);
155
121
 
156
- // Calculate initial width and inner width
157
- let width = maxWidth || 2048 / precision;
158
- let innerWidth = width - paddingLeft;
159
- if (innerWidth < 10) {
160
- width += 10 - innerWidth;
161
- innerWidth = 10;
162
- }
163
- const finalWordWrapWidth = maxWidth === 0 ? innerWidth : maxWidth;
122
+ const letterSpacing = props.letterSpacing;
164
123
 
165
- // Calculate text layout using cached helper function
166
- const layout = calculateTextLayout(
124
+ const [
125
+ lines,
126
+ remainingLines,
127
+ hasRemainingText,
128
+ bareLineHeight,
129
+ lineHeightPx,
130
+ effectiveWidth,
131
+ effectiveHeight,
132
+ ] = mapTextLayout(
133
+ CanvasFontHandler.measureText,
134
+ metrics,
167
135
  text,
136
+ textAlign,
137
+ verticalAlign,
168
138
  fontFamily,
169
- scaledFontSize,
170
- fontStyle,
171
- wordWrap,
172
- finalWordWrapWidth,
173
- scaledLetterSpacing,
174
- textIndent,
175
- computedMaxLines,
176
- overflowSuffix,
177
- textOverflow,
178
- );
179
-
180
- // Calculate final dimensions
181
- const dimensions = calculateTextDimensions(
182
- layout,
183
- paddingLeft,
184
- paddingRight,
185
- textBaseline,
186
- scaledFontSize,
187
139
  lineHeight,
188
- scaledOffsetY,
140
+ overflowSuffix,
141
+ wordBreak,
142
+ letterSpacing,
143
+ maxLines,
189
144
  maxWidth,
190
145
  maxHeight,
191
- wordWrap,
192
- textAlign,
193
146
  );
194
147
 
195
- // Set up canvas dimensions
196
- canvas.width = Math.min(
197
- Math.ceil(dimensions.width + textRenderIssueMargin),
198
- MAX_TEXTURE_DIMENSION,
199
- );
200
- canvas.height = Math.min(Math.ceil(dimensions.height), MAX_TEXTURE_DIMENSION);
148
+ const lineAmount = lines.length;
149
+ const canvasW = Math.ceil(maxWidth || effectiveWidth);
150
+ const canvasH = Math.ceil(maxHeight || effectiveHeight);
201
151
 
202
- // Reset font context after canvas resize
203
- context.font = `${fontStyle} ${scaledFontSize}px ${fontFamily}`;
204
- context.textBaseline = textBaseline;
152
+ canvas.width = canvasW;
153
+ canvas.height = canvasH;
154
+ context.fillStyle = 'white';
155
+ context.font = font;
156
+ context.textBaseline = 'hanging';
205
157
 
206
158
  // Performance optimization for large fonts
207
- if (scaledFontSize >= 128) {
159
+ if (fontSize >= 128) {
208
160
  context.globalAlpha = 0.01;
209
161
  context.fillRect(0, 0, 0.01, 0.01);
210
162
  context.globalAlpha = 1.0;
211
163
  }
212
164
 
213
- // Calculate drawing positions
214
- const drawLines = calculateDrawPositions(
215
- layout.lines,
216
- layout.lineWidths,
217
- textAlign,
218
- verticalAlign,
219
- innerWidth,
220
- paddingLeft,
221
- textIndent,
222
- lineHeight,
223
- metrics,
224
- scaledFontSize,
225
- );
226
-
227
- // Render text to canvas
228
- renderTextToCanvas(
229
- context,
230
- drawLines,
231
- scaledLetterSpacing,
232
- textColor,
233
- fontStyle,
234
- scaledFontSize,
235
- fontFamily,
236
- );
165
+ for (let i = 0; i < lineAmount; i++) {
166
+ const line = lines[i] as TextLineStruct;
167
+ const textLine = line[0];
168
+ let currentX = Math.ceil(line[2]);
169
+ const currentY = Math.ceil(line[3]);
170
+ if (letterSpacing === 0) {
171
+ context.fillText(textLine, currentX, currentY);
172
+ } else {
173
+ const textLineLength = textLine.length;
174
+ for (let j = 0; j < textLineLength; j++) {
175
+ const char = textLine.charAt(j);
176
+ if (hasZeroWidthSpace(char) === true) {
177
+ continue;
178
+ }
179
+ context.fillText(char, currentX, currentY);
180
+ currentX += CanvasFontHandler.measureText(
181
+ char,
182
+ fontFamily,
183
+ letterSpacing,
184
+ );
185
+ }
186
+ }
187
+ }
237
188
 
238
- width = dimensions.width;
239
- const height = lineHeight * layout.lines.length;
240
189
  // Extract image data
241
190
  let imageData: ImageData | null = null;
242
191
  if (canvas.width > 0 && canvas.height > 0) {
243
- imageData = context.getImageData(0, 0, width, height);
192
+ imageData = context.getImageData(0, 0, canvasW, canvasH);
244
193
  }
245
-
246
194
  return {
247
195
  imageData,
248
- width,
249
- height,
196
+ width: canvasW,
197
+ height: canvasH,
198
+ remainingLines,
199
+ hasRemainingText,
250
200
  };
251
201
  };
252
202
 
253
- /**
254
- * Calculate the effective max lines constraint
255
- */
256
- function calculateMaxLines(
257
- containedMaxLines: number,
258
- maxLines: number,
259
- ): number {
260
- if (containedMaxLines > 0 && maxLines > 0) {
261
- return containedMaxLines < maxLines ? containedMaxLines : maxLines;
262
- } else {
263
- return containedMaxLines > maxLines ? containedMaxLines : maxLines;
264
- }
265
- }
266
-
267
203
  /**
268
204
  * Generate a cache key for text layout calculations
269
205
  */
@@ -281,307 +217,6 @@ function generateLayoutCacheKey(
281
217
  return `${text}-${fontFamily}-${fontSize}-${fontStyle}-${wordWrap}-${wordWrapWidth}-${letterSpacing}-${maxLines}-${overflowSuffix}`;
282
218
  }
283
219
 
284
- /**
285
- * Calculate text dimensions and wrapping
286
- */
287
- function calculateTextLayout(
288
- text: string,
289
- fontFamily: string,
290
- fontSize: number,
291
- fontStyle: string,
292
- wordWrap: boolean,
293
- wordWrapWidth: number,
294
- letterSpacing: number,
295
- textIndent: number,
296
- maxLines: number,
297
- overflowSuffix: string,
298
- textOverflow: string | null,
299
- ): {
300
- lines: string[];
301
- lineWidths: number[];
302
- maxLineWidth: number;
303
- remainingText: string;
304
- moreTextLines: boolean;
305
- } {
306
- assertTruthy(measureContext, 'Measure context is not available');
307
-
308
- // Check cache first
309
- const cacheKey = generateLayoutCacheKey(
310
- text,
311
- fontFamily,
312
- fontSize,
313
- fontStyle,
314
- wordWrap,
315
- wordWrapWidth,
316
- letterSpacing,
317
- maxLines,
318
- overflowSuffix,
319
- );
320
-
321
- const cached = layoutCache.get(cacheKey);
322
- if (cached) {
323
- return cached;
324
- }
325
-
326
- // Set font context for measurements on the dedicated measuring context
327
- measureContext.font = `${fontStyle} ${fontSize}px ${fontFamily}`;
328
-
329
- // Handle text overflow for non-wrapped text
330
- let processedText = text;
331
- if (textOverflow !== null && wordWrap === false) {
332
- let suffix: string;
333
- if (textOverflow === 'clip') {
334
- suffix = '';
335
- } else if (textOverflow === 'ellipsis') {
336
- suffix = overflowSuffix;
337
- } else {
338
- suffix = textOverflow;
339
- }
340
- processedText = wrapWord(
341
- measureContext,
342
- text,
343
- wordWrapWidth - textIndent,
344
- suffix,
345
- letterSpacing,
346
- );
347
- }
348
-
349
- // Word wrap
350
- let linesInfo: { n: number[]; l: string[] };
351
- if (wordWrap === true) {
352
- linesInfo = wrapText(
353
- measureContext,
354
- processedText,
355
- wordWrapWidth,
356
- letterSpacing,
357
- textIndent,
358
- );
359
- } else {
360
- linesInfo = { l: processedText.split(/(?:\r\n|\r|\n)/), n: [] };
361
- const n = linesInfo.l.length;
362
- for (let i = 0; i < n - 1; i++) {
363
- linesInfo.n.push(i);
364
- }
365
- }
366
- let lines: string[] = linesInfo.l;
367
-
368
- let remainingText = '';
369
- let moreTextLines = false;
370
-
371
- // Handle max lines constraint
372
- if (maxLines > 0 && lines.length > maxLines) {
373
- const usedLines = lines.slice(0, maxLines);
374
- let otherLines: string[] = [];
375
- if (overflowSuffix.length > 0) {
376
- const w = measureText(measureContext, overflowSuffix, letterSpacing);
377
- const al = wrapText(
378
- measureContext,
379
- usedLines[usedLines.length - 1] || '',
380
- wordWrapWidth - w,
381
- letterSpacing,
382
- textIndent,
383
- );
384
- usedLines[usedLines.length - 1] = `${al.l[0] || ''}${overflowSuffix}`;
385
- otherLines = [al.l.length > 1 ? al.l[1] || '' : ''];
386
- } else {
387
- otherLines = [''];
388
- }
389
-
390
- // Re-assemble the remaining text
391
- let i: number;
392
- const n = lines.length;
393
- let j = 0;
394
- const m = linesInfo.n.length;
395
- for (i = maxLines; i < n; i++) {
396
- otherLines[j] += `${otherLines[j] ? ' ' : ''}${lines[i] ?? ''}`;
397
- if (i + 1 < m && linesInfo.n[i + 1] !== undefined) {
398
- j++;
399
- }
400
- }
401
- remainingText = otherLines.join('\n');
402
- moreTextLines = true;
403
- lines = usedLines;
404
- }
405
-
406
- // Calculate line widths using the dedicated measuring context
407
- let maxLineWidth = 0;
408
- const lineWidths: number[] = [];
409
- for (let i = 0; i < lines.length; i++) {
410
- const lineWidth =
411
- measureText(measureContext, lines[i] || '', letterSpacing) +
412
- (i === 0 ? textIndent : 0);
413
- lineWidths.push(lineWidth);
414
- maxLineWidth = Math.max(maxLineWidth, lineWidth);
415
- }
416
-
417
- const result = {
418
- lines,
419
- lineWidths,
420
- maxLineWidth,
421
- remainingText,
422
- moreTextLines,
423
- };
424
-
425
- // Cache the result
426
- layoutCache.set(cacheKey, result);
427
-
428
- return result;
429
- }
430
-
431
- /**
432
- * Calculate text dimensions based on layout
433
- */
434
- function calculateTextDimensions(
435
- layout: {
436
- lines: string[];
437
- lineWidths: number[];
438
- maxLineWidth: number;
439
- },
440
- paddingLeft: number,
441
- paddingRight: number,
442
- textBaseline: TextBaseline,
443
- fontSize: number,
444
- lineHeight: number,
445
- offsetY: number,
446
- initialWidth: number,
447
- initialHeight: number,
448
- wordWrap: boolean,
449
- textAlign: string,
450
- ): { width: number; height: number } {
451
- let width = initialWidth;
452
- let height = initialHeight;
453
-
454
- // Calculate width
455
- if (initialWidth === 0) {
456
- width = layout.maxLineWidth + paddingLeft + paddingRight;
457
- }
458
-
459
- // Adjust width for single-line left-aligned wrapped text
460
- if (
461
- wordWrap === true &&
462
- width > layout.maxLineWidth &&
463
- textAlign === 'left' &&
464
- layout.lines.length === 1
465
- ) {
466
- width = layout.maxLineWidth + paddingLeft + paddingRight;
467
- }
468
-
469
- // Calculate height if not provided
470
- if (height === 0) {
471
- height = calcHeight(
472
- textBaseline,
473
- fontSize,
474
- lineHeight,
475
- layout.lines.length,
476
- offsetY,
477
- );
478
- }
479
-
480
- return { width, height };
481
- }
482
-
483
- /**
484
- * Calculate drawing positions for text lines
485
- */
486
- function calculateDrawPositions(
487
- lines: string[],
488
- lineWidths: number[],
489
- textAlign: string,
490
- verticalAlign: string,
491
- innerWidth: number,
492
- paddingLeft: number,
493
- textIndent: number,
494
- lineHeight: number,
495
- metrics: NormalizedFontMetrics,
496
- fontSize: number,
497
- ): LineType[] {
498
- const drawLines: LineType[] = [];
499
- const ascenderPx = metrics.ascender * fontSize;
500
- const bareLineHeightPx = (metrics.ascender - metrics.descender) * fontSize;
501
-
502
- for (let i = 0, n = lines.length; i < n; i++) {
503
- let linePositionX = i === 0 ? textIndent : 0;
504
- let linePositionY = i * lineHeight + ascenderPx;
505
-
506
- // Vertical alignment
507
- if (verticalAlign == 'middle') {
508
- linePositionY += (lineHeight - bareLineHeightPx) / 2;
509
- } else if (verticalAlign == 'bottom') {
510
- linePositionY += lineHeight - bareLineHeightPx;
511
- }
512
-
513
- // Horizontal alignment
514
- const lineWidth = lineWidths[i];
515
- if (lineWidth !== undefined) {
516
- if (textAlign === 'right') {
517
- linePositionX += innerWidth - lineWidth;
518
- } else if (textAlign === 'center') {
519
- linePositionX += (innerWidth - lineWidth) / 2;
520
- }
521
- }
522
-
523
- linePositionX += paddingLeft;
524
-
525
- const lineText = lines[i];
526
- if (lineText !== undefined) {
527
- drawLines.push({
528
- text: lineText,
529
- x: linePositionX,
530
- y: linePositionY,
531
- w: lineWidth || 0,
532
- });
533
- }
534
- }
535
-
536
- return drawLines;
537
- }
538
-
539
- /**
540
- * Render text lines to canvas
541
- */
542
- function renderTextToCanvas(
543
- context: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D,
544
- drawLines: LineType[],
545
- letterSpacing: number,
546
- textColor: number,
547
- fontStyle: string,
548
- fontSize: number,
549
- fontFamily: string,
550
- ): void {
551
- assertTruthy(measureContext, 'Measure context is not available');
552
-
553
- context.fillStyle = normalizeCanvasColor(textColor);
554
-
555
- // Sync font settings to measure context if we need to use it for letter spacing
556
- if (letterSpacing > 0) {
557
- measureContext.font = `${fontStyle} ${fontSize}px ${fontFamily}`;
558
- }
559
-
560
- for (let i = 0, n = drawLines.length; i < n; i++) {
561
- const drawLine = drawLines[i];
562
- if (drawLine) {
563
- if (letterSpacing === 0) {
564
- context.fillText(drawLine.text, drawLine.x, drawLine.y);
565
- } else {
566
- const textSplit = drawLine.text.split('');
567
- let x = drawLine.x;
568
- for (let j = 0, k = textSplit.length; j < k; j++) {
569
- const char = textSplit[j];
570
- if (char) {
571
- // Skip zero-width spaces for rendering but keep them in the text flow
572
- if (isZeroWidthSpace(char)) {
573
- continue;
574
- }
575
- context.fillText(char, x, drawLine.y);
576
- // Use the dedicated measuring context for letter spacing calculations
577
- x += measureText(measureContext, char, letterSpacing);
578
- }
579
- }
580
- }
581
- }
582
- }
583
- }
584
-
585
220
  /**
586
221
  * Clear layout cache for memory management
587
222
  */