@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
@@ -5,10 +5,62 @@ import {
5
5
  } from '../core/CoreNode.js';
6
6
  import { type RendererMainSettings } from './Renderer.js';
7
7
  import type { AnimationSettings } from '../core/animations/CoreAnimation.js';
8
- import type { IAnimationController } from '../common/IAnimationController.js';
8
+ import type {
9
+ IAnimationController,
10
+ AnimationControllerState,
11
+ } from '../common/IAnimationController.js';
9
12
  import { isProductionEnvironment } from '../utils.js';
10
13
  import { CoreTextNode, type CoreTextNodeProps } from '../core/CoreTextNode.js';
11
14
 
15
+ /**
16
+ * Inspector Options
17
+ *
18
+ * Configuration options for the Inspector's performance monitoring features.
19
+ */
20
+ export interface InspectorOptions {
21
+ /**
22
+ * Enable performance monitoring for setter calls
23
+ *
24
+ * @defaultValue true
25
+ */
26
+ enablePerformanceMonitoring: boolean;
27
+
28
+ /**
29
+ * Threshold for excessive setter calls before logging a warning
30
+ *
31
+ * @defaultValue 100
32
+ */
33
+ excessiveCallThreshold: number;
34
+
35
+ /**
36
+ * Time interval in milliseconds to reset the setter call counters
37
+ *
38
+ * @defaultValue 5000
39
+ */
40
+ resetInterval: number;
41
+
42
+ /**
43
+ * Enable animation monitoring and statistics tracking
44
+ *
45
+ * @defaultValue true
46
+ */
47
+ enableAnimationMonitoring: boolean;
48
+
49
+ /**
50
+ * Maximum number of animations to keep in history for statistics
51
+ *
52
+ * @defaultValue 1000
53
+ */
54
+ maxAnimationHistory: number;
55
+
56
+ /**
57
+ * Automatically print animation statistics every X seconds (0 to disable)
58
+ *
59
+ * @defaultValue 0
60
+ */
61
+ animationStatsInterval: number;
62
+ }
63
+
12
64
  /**
13
65
  * Inspector
14
66
  *
@@ -48,16 +100,18 @@ const stylePropertyMap: {
48
100
  y: (y) => {
49
101
  return { prop: 'top', value: `${y}px` };
50
102
  },
51
- width: (w) => {
103
+ w: (w) => {
52
104
  if (w === 0) {
53
- return null;
105
+ // Set to 1px instead of 0px so Playwright's toBeVisible() passes
106
+ return { prop: 'width', value: '1px' };
54
107
  }
55
108
 
56
109
  return { prop: 'width', value: `${w}px` };
57
110
  },
58
- height: (h) => {
111
+ h: (h) => {
59
112
  if (h === 0) {
60
- return null;
113
+ // Set to 1px instead of 0px so Playwright's toBeVisible() passes
114
+ return { prop: 'height', value: '1px' };
61
115
  }
62
116
 
63
117
  return { prop: 'height', value: `${h}px` };
@@ -159,6 +213,7 @@ const knownProperties = new Set<string>([
159
213
  'src',
160
214
  'parent',
161
215
  'data',
216
+ 'text',
162
217
  ]);
163
218
 
164
219
  export class Inspector {
@@ -171,6 +226,51 @@ export class Inspector {
171
226
  private scaleX = 1;
172
227
  private scaleY = 1;
173
228
 
229
+ // Performance monitoring for frequent setter calls
230
+ private static setterCallCount = new Map<
231
+ string,
232
+ { count: number; lastReset: number; nodeId: number }
233
+ >();
234
+
235
+ // Animation monitoring structures
236
+ private static activeAnimations = new Map<
237
+ string,
238
+ {
239
+ nodeId: number;
240
+ animationId: string;
241
+ startTime: number;
242
+ props: CoreNodeAnimateProps;
243
+ settings: AnimationSettings;
244
+ controller: IAnimationController;
245
+ state: AnimationControllerState;
246
+ }
247
+ >();
248
+
249
+ private static animationHistory: Array<{
250
+ nodeId: number;
251
+ animationId: string;
252
+ startTime: number;
253
+ endTime: number;
254
+ duration: number;
255
+ actualDuration: number;
256
+ props: CoreNodeAnimateProps;
257
+ settings: AnimationSettings;
258
+ completionType: 'finished' | 'stopped' | 'cancelled';
259
+ }> = [];
260
+
261
+ // Performance monitoring settings (configured via constructor)
262
+ private performanceSettings: InspectorOptions = {
263
+ enablePerformanceMonitoring: false,
264
+ excessiveCallThreshold: 100,
265
+ resetInterval: 5000,
266
+ enableAnimationMonitoring: false,
267
+ maxAnimationHistory: 1000,
268
+ animationStatsInterval: 0,
269
+ };
270
+
271
+ // Animation stats printing timer
272
+ private animationStatsTimer: number | null = null;
273
+
174
274
  constructor(canvas: HTMLCanvasElement, settings: RendererMainSettings) {
175
275
  if (isProductionEnvironment === true) return;
176
276
 
@@ -178,6 +278,21 @@ export class Inspector {
178
278
  throw new Error('settings is required');
179
279
  }
180
280
 
281
+ // Initialize performance monitoring settings with defaults
282
+ this.performanceSettings = {
283
+ enablePerformanceMonitoring:
284
+ settings.inspectorOptions?.enablePerformanceMonitoring ?? false,
285
+ excessiveCallThreshold:
286
+ settings.inspectorOptions?.excessiveCallThreshold ?? 100,
287
+ resetInterval: settings.inspectorOptions?.resetInterval ?? 5000,
288
+ enableAnimationMonitoring:
289
+ settings.inspectorOptions?.enableAnimationMonitoring ?? false,
290
+ maxAnimationHistory:
291
+ settings.inspectorOptions?.maxAnimationHistory ?? 1000,
292
+ animationStatsInterval:
293
+ settings.inspectorOptions?.animationStatsInterval ?? 0,
294
+ };
295
+
181
296
  // calc dimensions based on the devicePixelRatio
182
297
  this.height = Math.ceil(
183
298
  settings.appHeight ?? 1080 / (settings.deviceLogicalPixelRatio ?? 1),
@@ -212,9 +327,379 @@ export class Inspector {
212
327
  //listen for changes on window
213
328
  window.addEventListener('resize', this.setRootPosition.bind(this));
214
329
 
330
+ // Start animation stats timer if enabled
331
+ this.startAnimationStatsTimer();
332
+
215
333
  console.warn('Inspector is enabled, this will impact performance');
216
334
  }
217
335
 
336
+ /**
337
+ * Track setter calls for performance monitoring
338
+ * Only active when Inspector is loaded
339
+ */
340
+ private trackSetterCall(nodeId: number, setterName: string): void {
341
+ if (!this.performanceSettings.enablePerformanceMonitoring) {
342
+ return;
343
+ }
344
+
345
+ const key = `${nodeId}_${setterName}`;
346
+ const now = Date.now();
347
+ const existing = Inspector.setterCallCount.get(key);
348
+
349
+ if (!existing) {
350
+ Inspector.setterCallCount.set(key, { count: 1, lastReset: now, nodeId });
351
+ return;
352
+ }
353
+
354
+ // Reset counter if enough time has passed
355
+ if (now - existing.lastReset > this.performanceSettings.resetInterval) {
356
+ existing.count = 1;
357
+ existing.lastReset = now;
358
+ return;
359
+ }
360
+
361
+ existing.count++;
362
+
363
+ // Log if threshold exceeded
364
+ if (existing.count === this.performanceSettings.excessiveCallThreshold) {
365
+ console.warn(
366
+ `🚨 Inspector Performance Warning: Setter '${setterName}' called ${existing.count} times in ${this.performanceSettings.resetInterval}ms on node ${nodeId}`,
367
+ );
368
+ } else if (
369
+ existing.count > this.performanceSettings.excessiveCallThreshold &&
370
+ existing.count % 50 === 0
371
+ ) {
372
+ console.warn(
373
+ `🚨 Inspector Performance Warning: Setter '${setterName}' called ${existing.count} times in ${this.performanceSettings.resetInterval}ms on node ${nodeId} (continuing...)`,
374
+ );
375
+ }
376
+ }
377
+
378
+ /**
379
+ * Get current performance monitoring statistics
380
+ */
381
+ public static getPerformanceStats(): Array<{
382
+ nodeId: number;
383
+ setterName: string;
384
+ count: number;
385
+ timeWindow: number;
386
+ }> {
387
+ const stats: Array<{
388
+ nodeId: number;
389
+ setterName: string;
390
+ count: number;
391
+ timeWindow: number;
392
+ }> = [];
393
+ const now = Date.now();
394
+
395
+ Inspector.setterCallCount.forEach((data, key) => {
396
+ const parts = key.split('_');
397
+ const nodeIdStr = parts[0];
398
+ const setterName = parts[1];
399
+
400
+ if (nodeIdStr && setterName) {
401
+ const timeWindow = now - data.lastReset;
402
+
403
+ stats.push({
404
+ nodeId: parseInt(nodeIdStr, 10),
405
+ setterName,
406
+ count: data.count,
407
+ timeWindow,
408
+ });
409
+ }
410
+ });
411
+
412
+ return stats.sort((a, b) => b.count - a.count);
413
+ }
414
+
415
+ /**
416
+ * Clear performance monitoring statistics
417
+ */
418
+ public static clearPerformanceStats(): void {
419
+ Inspector.setterCallCount.clear();
420
+ }
421
+
422
+ /**
423
+ * Generate a unique animation ID
424
+ */
425
+ private static generateAnimationId(): string {
426
+ return `anim_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;
427
+ }
428
+
429
+ /**
430
+ * Wrap animation controller with monitoring capabilities
431
+ */
432
+ private wrapAnimationController(
433
+ controller: IAnimationController,
434
+ nodeId: number,
435
+ props: CoreNodeAnimateProps,
436
+ settings: AnimationSettings,
437
+ div: HTMLElement,
438
+ ): IAnimationController {
439
+ if (!this.performanceSettings.enableAnimationMonitoring) {
440
+ // Just add the basic DOM animation without tracking
441
+ const originalStart = controller.start.bind(controller);
442
+ controller.start = () => {
443
+ this.animateNode(div, props, settings);
444
+ return originalStart();
445
+ };
446
+ return controller;
447
+ }
448
+
449
+ const animationId = Inspector.generateAnimationId();
450
+
451
+ // Create wrapper controller
452
+ const wrappedController: IAnimationController = {
453
+ start: () => {
454
+ this.trackAnimationStart(
455
+ animationId,
456
+ nodeId,
457
+ props,
458
+ settings,
459
+ controller,
460
+ );
461
+ this.animateNode(div, props, settings);
462
+ return controller.start();
463
+ },
464
+
465
+ stop: () => {
466
+ this.trackAnimationEnd(animationId, 'stopped');
467
+ return controller.stop();
468
+ },
469
+
470
+ pause: () => {
471
+ this.updateAnimationState(animationId, 'paused');
472
+ return controller.pause();
473
+ },
474
+
475
+ restore: () => {
476
+ this.trackAnimationEnd(animationId, 'cancelled');
477
+ return controller.restore();
478
+ },
479
+
480
+ waitUntilStopped: () => {
481
+ return controller.waitUntilStopped().then(() => {
482
+ this.trackAnimationEnd(animationId, 'finished');
483
+ });
484
+ },
485
+
486
+ get state() {
487
+ return controller.state;
488
+ },
489
+
490
+ // Event emitter methods
491
+ on: controller.on.bind(controller),
492
+ off: controller.off.bind(controller),
493
+ once: controller.once.bind(controller),
494
+ emit: controller.emit.bind(controller),
495
+ };
496
+
497
+ // Track animation events
498
+ controller.on('animating', () => {
499
+ this.updateAnimationState(animationId, 'running');
500
+ });
501
+
502
+ controller.on('stopped', () => {
503
+ this.trackAnimationEnd(animationId, 'finished');
504
+ });
505
+
506
+ return wrappedController;
507
+ }
508
+
509
+ /**
510
+ * Track animation start
511
+ */
512
+ private trackAnimationStart(
513
+ animationId: string,
514
+ nodeId: number,
515
+ props: CoreNodeAnimateProps,
516
+ settings: AnimationSettings,
517
+ controller: IAnimationController,
518
+ ): void {
519
+ const startTime = Date.now();
520
+
521
+ Inspector.activeAnimations.set(animationId, {
522
+ nodeId,
523
+ animationId,
524
+ startTime,
525
+ props,
526
+ settings,
527
+ controller,
528
+ state: 'scheduled',
529
+ });
530
+ }
531
+
532
+ /**
533
+ * Update animation state
534
+ */
535
+ private updateAnimationState(
536
+ animationId: string,
537
+ state: AnimationControllerState,
538
+ ): void {
539
+ const animation = Inspector.activeAnimations.get(animationId);
540
+ if (animation) {
541
+ animation.state = state;
542
+ }
543
+ }
544
+
545
+ /**
546
+ * Track animation end
547
+ */
548
+ private trackAnimationEnd(
549
+ animationId: string,
550
+ completionType: 'finished' | 'stopped' | 'cancelled',
551
+ ): void {
552
+ const animation = Inspector.activeAnimations.get(animationId);
553
+ if (!animation) return;
554
+
555
+ const endTime = Date.now();
556
+ const actualDuration = endTime - animation.startTime;
557
+ const expectedDuration = animation.settings.duration || 1000;
558
+
559
+ // Move to history
560
+ Inspector.animationHistory.unshift({
561
+ nodeId: animation.nodeId,
562
+ animationId: animation.animationId,
563
+ startTime: animation.startTime,
564
+ endTime,
565
+ duration: expectedDuration,
566
+ actualDuration,
567
+ props: animation.props,
568
+ settings: animation.settings,
569
+ completionType,
570
+ });
571
+
572
+ // Limit history size for performance
573
+ if (
574
+ Inspector.animationHistory.length >
575
+ this.performanceSettings.maxAnimationHistory
576
+ ) {
577
+ Inspector.animationHistory.splice(
578
+ this.performanceSettings.maxAnimationHistory,
579
+ );
580
+ }
581
+
582
+ // Remove from active animations
583
+ Inspector.activeAnimations.delete(animationId);
584
+ }
585
+
586
+ /**
587
+ * Get currently active animations
588
+ */
589
+ public static getActiveAnimations(): Array<{
590
+ nodeId: number;
591
+ animationId: string;
592
+ startTime: number;
593
+ duration: number;
594
+ elapsedTime: number;
595
+ props: CoreNodeAnimateProps;
596
+ settings: AnimationSettings;
597
+ state: AnimationControllerState;
598
+ }> {
599
+ const now = Date.now();
600
+ const activeAnimations: Array<{
601
+ nodeId: number;
602
+ animationId: string;
603
+ startTime: number;
604
+ duration: number;
605
+ elapsedTime: number;
606
+ props: CoreNodeAnimateProps;
607
+ settings: AnimationSettings;
608
+ state: AnimationControllerState;
609
+ }> = [];
610
+
611
+ Inspector.activeAnimations.forEach((animation) => {
612
+ activeAnimations.push({
613
+ nodeId: animation.nodeId,
614
+ animationId: animation.animationId,
615
+ startTime: animation.startTime,
616
+ duration: animation.settings.duration || 1000,
617
+ elapsedTime: now - animation.startTime,
618
+ props: animation.props,
619
+ settings: animation.settings,
620
+ state: animation.state,
621
+ });
622
+ });
623
+
624
+ return activeAnimations.sort((a, b) => b.startTime - a.startTime);
625
+ }
626
+
627
+ /**
628
+ * Get animation statistics
629
+ */
630
+ public static getAnimationStats(): {
631
+ totalAnimations: number;
632
+ activeCount: number;
633
+ averageDuration: number;
634
+ } {
635
+ const totalAnimations = Inspector.animationHistory.length;
636
+ const activeCount = Inspector.activeAnimations.size;
637
+
638
+ // Calculate average duration from finished animations only
639
+ const finishedAnimations = Inspector.animationHistory.filter(
640
+ (anim) => anim.completionType === 'finished',
641
+ );
642
+
643
+ const averageDuration =
644
+ finishedAnimations.length > 0
645
+ ? finishedAnimations.reduce(
646
+ (sum, anim) => sum + anim.actualDuration,
647
+ 0,
648
+ ) / finishedAnimations.length
649
+ : 0;
650
+
651
+ return {
652
+ totalAnimations,
653
+ activeCount,
654
+ averageDuration,
655
+ };
656
+ }
657
+
658
+ /**
659
+ * Clear animation monitoring data
660
+ */
661
+ public static clearAnimationStats(): void {
662
+ Inspector.activeAnimations.clear();
663
+ Inspector.animationHistory.length = 0;
664
+ }
665
+
666
+ /**
667
+ * Start the animation stats timer if enabled
668
+ */
669
+ private startAnimationStatsTimer(): void {
670
+ console.log(
671
+ `Starting animation stats timer with interval: ${this.performanceSettings.animationStatsInterval} seconds`,
672
+ );
673
+
674
+ if (this.performanceSettings.animationStatsInterval > 0) {
675
+ this.animationStatsTimer = setInterval(() => {
676
+ this.printAnimationStats();
677
+ }, this.performanceSettings.animationStatsInterval * 1000) as unknown as number;
678
+ }
679
+ }
680
+
681
+ /**
682
+ * Stop the animation stats timer
683
+ */
684
+ private stopAnimationStatsTimer(): void {
685
+ if (this.animationStatsTimer) {
686
+ clearInterval(this.animationStatsTimer);
687
+ this.animationStatsTimer = null;
688
+ }
689
+ }
690
+
691
+ /**
692
+ * Print current animation statistics to console
693
+ */
694
+ private printAnimationStats(): void {
695
+ const stats = Inspector.getAnimationStats();
696
+
697
+ console.log(
698
+ `🎬 Animation Stats: ${stats.activeCount} active, ${
699
+ stats.totalAnimations
700
+ } completed, ${Math.round(stats.averageDuration)}ms avg duration`,
701
+ );
702
+ }
218
703
  setRootPosition() {
219
704
  if (this.root === null || this.canvas === null) {
220
705
  return;
@@ -322,6 +807,9 @@ export class Inspector {
322
807
  return originalProp?.get?.call(node);
323
808
  },
324
809
  set: (value) => {
810
+ // Track setter call for performance monitoring
811
+ this.trackSetterCall(node.id, property);
812
+
325
813
  originalProp?.set?.call(node, value);
326
814
  this.updateNodeProperty(
327
815
  div,
@@ -352,15 +840,14 @@ export class Inspector {
352
840
  ): IAnimationController => {
353
841
  const animationController = originalAnimate.call(node, props, settings);
354
842
 
355
- const originalStart =
356
- animationController.start.bind(animationController);
357
- animationController.start = () => {
358
- this.animateNode(div, props, settings);
359
-
360
- return originalStart();
361
- };
362
-
363
- return animationController;
843
+ // Wrap animation controller with monitoring
844
+ return this.wrapAnimationController(
845
+ animationController,
846
+ node.id,
847
+ props,
848
+ settings,
849
+ div,
850
+ );
364
851
  },
365
852
  configurable: true,
366
853
  });
@@ -369,6 +856,9 @@ export class Inspector {
369
856
  }
370
857
 
371
858
  public destroy() {
859
+ // Stop animation stats timer
860
+ this.stopAnimationStatsTimer();
861
+
372
862
  // Remove DOM observers
373
863
  this.mutationObserver.disconnect();
374
864
  this.resizeObserver.disconnect();
@@ -378,6 +868,9 @@ export class Inspector {
378
868
  if (this.root && this.root.parentNode) {
379
869
  this.root.remove();
380
870
  }
871
+
872
+ // Clean up animation monitoring data
873
+ Inspector.clearAnimationStats();
381
874
  }
382
875
 
383
876
  destroyNode(id: number) {
@@ -418,9 +911,10 @@ export class Inspector {
418
911
  if (property === 'text') {
419
912
  div.innerHTML = String(value);
420
913
 
421
- // hide text because we can't render SDF fonts
422
- // it would look weird and obstruct the WebGL rendering
423
- div.style.visibility = 'hidden';
914
+ // Keep DOM text invisible without breaking Playwright visibility checks by using color:transparent instead of opacity:0
915
+ div.style.color = 'transparent';
916
+ div.style.pointerEvents = 'none';
917
+ div.style.userSelect = 'none';
424
918
  return;
425
919
  }
426
920