@lightningjs/renderer 2.9.2 → 2.11.0

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 (329) hide show
  1. package/LICENSE +202 -202
  2. package/NOTICE +3 -3
  3. package/README.md +147 -147
  4. package/dist/exports/core-api.d.ts +74 -0
  5. package/dist/exports/core-api.js +96 -0
  6. package/dist/exports/core-api.js.map +1 -0
  7. package/dist/exports/main-api.d.ts +30 -0
  8. package/dist/exports/main-api.js +45 -0
  9. package/dist/exports/main-api.js.map +1 -0
  10. package/dist/src/core/CoreExtension.d.ts +12 -0
  11. package/dist/src/core/CoreExtension.js +29 -0
  12. package/dist/src/core/CoreExtension.js.map +1 -0
  13. package/dist/src/core/CoreStuff.d.ts +1 -0
  14. package/dist/src/core/CoreStuff.js +138 -0
  15. package/dist/src/core/CoreStuff.js.map +1 -0
  16. package/dist/src/core/CoreTextureManager.d.ts +5 -2
  17. package/dist/src/core/CoreTextureManager.js +20 -11
  18. package/dist/src/core/CoreTextureManager.js.map +1 -1
  19. package/dist/src/core/LngNode.d.ts +736 -0
  20. package/dist/src/core/LngNode.js +1174 -0
  21. package/dist/src/core/LngNode.js.map +1 -0
  22. package/dist/src/core/Matrix2DContext.d.ts +15 -0
  23. package/dist/src/core/Matrix2DContext.js +45 -0
  24. package/dist/src/core/Matrix2DContext.js.map +1 -0
  25. package/dist/src/core/ShaderNode.d.ts +10 -0
  26. package/dist/src/core/ShaderNode.js +30 -0
  27. package/dist/src/core/ShaderNode.js.map +1 -0
  28. package/dist/src/core/Stage.d.ts +1 -1
  29. package/dist/src/core/Stage.js +2 -2
  30. package/dist/src/core/Stage.js.map +1 -1
  31. package/dist/src/core/TextNode.d.ts +103 -0
  32. package/dist/src/core/TextNode.js +331 -0
  33. package/dist/src/core/TextNode.js.map +1 -0
  34. package/dist/src/core/TextureMemoryManager.d.ts +30 -0
  35. package/dist/src/core/TextureMemoryManager.js +58 -38
  36. package/dist/src/core/TextureMemoryManager.js.map +1 -1
  37. package/dist/src/core/lib/Coords.d.ts +14 -0
  38. package/dist/src/core/lib/Coords.js +55 -0
  39. package/dist/src/core/lib/Coords.js.map +1 -0
  40. package/dist/src/core/lib/glm/common.d.ts +162 -0
  41. package/dist/src/core/lib/glm/common.js +81 -0
  42. package/dist/src/core/lib/glm/common.js.map +1 -0
  43. package/dist/src/core/lib/glm/index.d.ts +11 -0
  44. package/dist/src/core/lib/glm/index.js +30 -0
  45. package/dist/src/core/lib/glm/index.js.map +1 -0
  46. package/dist/src/core/lib/glm/mat2.d.ts +219 -0
  47. package/dist/src/core/lib/glm/mat2.js +396 -0
  48. package/dist/src/core/lib/glm/mat2.js.map +1 -0
  49. package/dist/src/core/lib/glm/mat2d.d.ts +237 -0
  50. package/dist/src/core/lib/glm/mat2d.js +442 -0
  51. package/dist/src/core/lib/glm/mat2d.js.map +1 -0
  52. package/dist/src/core/lib/glm/mat3.d.ts +283 -0
  53. package/dist/src/core/lib/glm/mat3.js +680 -0
  54. package/dist/src/core/lib/glm/mat3.js.map +1 -0
  55. package/dist/src/core/lib/glm/mat4.d.ts +550 -0
  56. package/dist/src/core/lib/glm/mat4.js +1802 -0
  57. package/dist/src/core/lib/glm/mat4.js.map +1 -0
  58. package/dist/src/core/lib/glm/quat.d.ts +363 -0
  59. package/dist/src/core/lib/glm/quat.js +693 -0
  60. package/dist/src/core/lib/glm/quat.js.map +1 -0
  61. package/dist/src/core/lib/glm/quat2.d.ts +356 -0
  62. package/dist/src/core/lib/glm/quat2.js +754 -0
  63. package/dist/src/core/lib/glm/quat2.js.map +1 -0
  64. package/dist/src/core/lib/glm/vec2.d.ts +365 -0
  65. package/dist/src/core/lib/glm/vec2.js +569 -0
  66. package/dist/src/core/lib/glm/vec2.js.map +1 -0
  67. package/dist/src/core/lib/glm/vec3.d.ts +406 -0
  68. package/dist/src/core/lib/glm/vec3.js +720 -0
  69. package/dist/src/core/lib/glm/vec3.js.map +1 -0
  70. package/dist/src/core/lib/glm/vec4.d.ts +330 -0
  71. package/dist/src/core/lib/glm/vec4.js +608 -0
  72. package/dist/src/core/lib/glm/vec4.js.map +1 -0
  73. package/dist/src/core/lib/textureSvg.js +1 -1
  74. package/dist/src/core/lib/textureSvg.js.map +1 -1
  75. package/dist/src/core/renderers/CoreShaderManager.d.ts +19 -0
  76. package/dist/src/core/renderers/CoreShaderManager.js +33 -0
  77. package/dist/src/core/renderers/CoreShaderManager.js.map +1 -0
  78. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.js +4 -2
  79. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.js.map +1 -1
  80. package/dist/src/core/renderers/canvas/CanvasCoreTexture.js +4 -4
  81. package/dist/src/core/renderers/canvas/CanvasCoreTexture.js.map +1 -1
  82. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js +9 -12
  83. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js.map +1 -1
  84. package/dist/src/core/renderers/webgl/WebGlCoreShaderManager.d.ts +27 -0
  85. package/dist/src/core/renderers/webgl/WebGlCoreShaderManager.js +82 -0
  86. package/dist/src/core/renderers/webgl/WebGlCoreShaderManager.js.map +1 -0
  87. package/dist/src/core/renderers/webgl/WebGlCoreShaderProgram.d.ts +11 -0
  88. package/dist/src/core/renderers/webgl/WebGlCoreShaderProgram.js +34 -0
  89. package/dist/src/core/renderers/webgl/WebGlCoreShaderProgram.js.map +1 -0
  90. package/dist/src/core/renderers/webgl/shaders/DefaultShader.js +45 -45
  91. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.js +61 -61
  92. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js +93 -93
  93. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.js +63 -63
  94. package/dist/src/core/renderers/webgl/shaders/SdfShader.js +62 -62
  95. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.js +15 -15
  96. package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.js +6 -6
  97. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.js +15 -15
  98. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.js +15 -15
  99. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.js +15 -15
  100. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.js +42 -42
  101. package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.js +44 -44
  102. package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.js +3 -3
  103. package/dist/src/core/renderers/webgl/shaders/effects/HolePunchEffect.js +22 -22
  104. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js +28 -28
  105. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js +10 -10
  106. package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.js +37 -37
  107. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.js +19 -19
  108. package/dist/src/core/scene/Scene.d.ts +59 -0
  109. package/dist/src/core/scene/Scene.js +106 -0
  110. package/dist/src/core/scene/Scene.js.map +1 -0
  111. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/makeRenderWindow.d.ts +20 -0
  112. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/makeRenderWindow.js +55 -0
  113. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/makeRenderWindow.js.map +1 -0
  114. package/dist/src/core/textures/ColorTexture.js +1 -1
  115. package/dist/src/core/textures/ColorTexture.js.map +1 -1
  116. package/dist/src/core/textures/ImageTexture.js +3 -3
  117. package/dist/src/core/textures/ImageTexture.js.map +1 -1
  118. package/dist/src/core/textures/NoiseTexture.js +1 -1
  119. package/dist/src/core/textures/NoiseTexture.js.map +1 -1
  120. package/dist/src/core/textures/RenderTexture.js +1 -1
  121. package/dist/src/core/textures/RenderTexture.js.map +1 -1
  122. package/dist/src/core/textures/SubTexture.d.ts +4 -0
  123. package/dist/src/core/textures/SubTexture.js +54 -16
  124. package/dist/src/core/textures/SubTexture.js.map +1 -1
  125. package/dist/src/core/textures/Texture.d.ts +2 -34
  126. package/dist/src/core/textures/Texture.js +13 -69
  127. package/dist/src/core/textures/Texture.js.map +1 -1
  128. package/dist/src/main-api/ICoreDriver.d.ts +27 -0
  129. package/dist/src/main-api/ICoreDriver.js +20 -0
  130. package/dist/src/main-api/ICoreDriver.js.map +1 -0
  131. package/dist/src/main-api/IRenderDriver.d.ts +20 -0
  132. package/dist/src/main-api/IRenderDriver.js +20 -0
  133. package/dist/src/main-api/IRenderDriver.js.map +1 -0
  134. package/dist/src/main-api/IShaderController.d.ts +14 -0
  135. package/dist/src/main-api/IShaderController.js +30 -0
  136. package/dist/src/main-api/IShaderController.js.map +1 -0
  137. package/dist/src/main-api/IShaderNode.d.ts +17 -0
  138. package/dist/src/main-api/IShaderNode.js +19 -0
  139. package/dist/src/main-api/IShaderNode.js.map +1 -0
  140. package/dist/src/main-api/Renderer.d.ts +6 -5
  141. package/dist/src/main-api/Renderer.js +3 -2
  142. package/dist/src/main-api/Renderer.js.map +1 -1
  143. package/dist/src/main-api/RendererMain.d.ts +375 -0
  144. package/dist/src/main-api/RendererMain.js +365 -0
  145. package/dist/src/main-api/RendererMain.js.map +1 -0
  146. package/dist/src/main-api/texture-usage-trackers/FinalizationRegistryTextureUsageTracker.d.ts +9 -0
  147. package/dist/src/main-api/texture-usage-trackers/FinalizationRegistryTextureUsageTracker.js +38 -0
  148. package/dist/src/main-api/texture-usage-trackers/FinalizationRegistryTextureUsageTracker.js.map +1 -0
  149. package/dist/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.d.ts +56 -0
  150. package/dist/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.js +101 -0
  151. package/dist/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.js.map +1 -0
  152. package/dist/src/main-api/texture-usage-trackers/TextureUsageTracker.d.ts +32 -0
  153. package/dist/src/main-api/texture-usage-trackers/TextureUsageTracker.js +28 -0
  154. package/dist/src/main-api/texture-usage-trackers/TextureUsageTracker.js.map +1 -0
  155. package/dist/src/render-drivers/main/MainCoreDriver.d.ts +24 -0
  156. package/dist/src/render-drivers/main/MainCoreDriver.js +118 -0
  157. package/dist/src/render-drivers/main/MainCoreDriver.js.map +1 -0
  158. package/dist/src/render-drivers/main/MainOnlyNode.d.ts +99 -0
  159. package/dist/src/render-drivers/main/MainOnlyNode.js +396 -0
  160. package/dist/src/render-drivers/main/MainOnlyNode.js.map +1 -0
  161. package/dist/src/render-drivers/main/MainOnlyShaderController.d.ts +6 -0
  162. package/dist/src/render-drivers/main/MainOnlyShaderController.js +15 -0
  163. package/dist/src/render-drivers/main/MainOnlyShaderController.js.map +1 -0
  164. package/dist/src/render-drivers/main/MainOnlyShaderNode.d.ts +7 -0
  165. package/dist/src/render-drivers/main/MainOnlyShaderNode.js +34 -0
  166. package/dist/src/render-drivers/main/MainOnlyShaderNode.js.map +1 -0
  167. package/dist/src/render-drivers/main/MainOnlyTextNode.d.ts +47 -0
  168. package/dist/src/render-drivers/main/MainOnlyTextNode.js +205 -0
  169. package/dist/src/render-drivers/main/MainOnlyTextNode.js.map +1 -0
  170. package/dist/src/render-drivers/main/MainRenderDriver.d.ts +17 -0
  171. package/dist/src/render-drivers/main/MainRenderDriver.js +88 -0
  172. package/dist/src/render-drivers/main/MainRenderDriver.js.map +1 -0
  173. package/dist/src/render-drivers/threadx/NodeStruct.d.ts +90 -0
  174. package/dist/src/render-drivers/threadx/NodeStruct.js +281 -0
  175. package/dist/src/render-drivers/threadx/NodeStruct.js.map +1 -0
  176. package/dist/src/render-drivers/threadx/SharedNode.d.ts +39 -0
  177. package/dist/src/render-drivers/threadx/SharedNode.js +60 -0
  178. package/dist/src/render-drivers/threadx/SharedNode.js.map +1 -0
  179. package/dist/src/render-drivers/threadx/TextNodeStruct.d.ts +44 -0
  180. package/dist/src/render-drivers/threadx/TextNodeStruct.js +201 -0
  181. package/dist/src/render-drivers/threadx/TextNodeStruct.js.map +1 -0
  182. package/dist/src/render-drivers/threadx/ThreadXCoreDriver.d.ts +28 -0
  183. package/dist/src/render-drivers/threadx/ThreadXCoreDriver.js +234 -0
  184. package/dist/src/render-drivers/threadx/ThreadXCoreDriver.js.map +1 -0
  185. package/dist/src/render-drivers/threadx/ThreadXMainAnimationController.d.ts +20 -0
  186. package/dist/src/render-drivers/threadx/ThreadXMainAnimationController.js +84 -0
  187. package/dist/src/render-drivers/threadx/ThreadXMainAnimationController.js.map +1 -0
  188. package/dist/src/render-drivers/threadx/ThreadXMainNode.d.ts +44 -0
  189. package/dist/src/render-drivers/threadx/ThreadXMainNode.js +154 -0
  190. package/dist/src/render-drivers/threadx/ThreadXMainNode.js.map +1 -0
  191. package/dist/src/render-drivers/threadx/ThreadXMainShaderController.d.ts +6 -0
  192. package/dist/src/render-drivers/threadx/ThreadXMainShaderController.js +16 -0
  193. package/dist/src/render-drivers/threadx/ThreadXMainShaderController.js.map +1 -0
  194. package/dist/src/render-drivers/threadx/ThreadXMainShaderNode.d.ts +7 -0
  195. package/dist/src/render-drivers/threadx/ThreadXMainShaderNode.js +15 -0
  196. package/dist/src/render-drivers/threadx/ThreadXMainShaderNode.js.map +1 -0
  197. package/dist/src/render-drivers/threadx/ThreadXMainTextNode.d.ts +28 -0
  198. package/dist/src/render-drivers/threadx/ThreadXMainTextNode.js +55 -0
  199. package/dist/src/render-drivers/threadx/ThreadXMainTextNode.js.map +1 -0
  200. package/dist/src/render-drivers/threadx/ThreadXRenderDriver.d.ts +21 -0
  201. package/dist/src/render-drivers/threadx/ThreadXRenderDriver.js +198 -0
  202. package/dist/src/render-drivers/threadx/ThreadXRenderDriver.js.map +1 -0
  203. package/dist/src/render-drivers/threadx/ThreadXRendererMessage.d.ts +70 -0
  204. package/dist/src/render-drivers/threadx/ThreadXRendererMessage.js +32 -0
  205. package/dist/src/render-drivers/threadx/ThreadXRendererMessage.js.map +1 -0
  206. package/dist/src/render-drivers/threadx/worker/ThreadXRendererNode.d.ts +19 -0
  207. package/dist/src/render-drivers/threadx/worker/ThreadXRendererNode.js +177 -0
  208. package/dist/src/render-drivers/threadx/worker/ThreadXRendererNode.js.map +1 -0
  209. package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.d.ts +27 -0
  210. package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.js +108 -0
  211. package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.js.map +1 -0
  212. package/dist/src/render-drivers/threadx/worker/renderer.d.ts +1 -0
  213. package/dist/src/render-drivers/threadx/worker/renderer.js +145 -0
  214. package/dist/src/render-drivers/threadx/worker/renderer.js.map +1 -0
  215. package/dist/src/render-drivers/utils.d.ts +12 -0
  216. package/dist/src/render-drivers/utils.js +69 -0
  217. package/dist/src/render-drivers/utils.js.map +1 -0
  218. package/dist/tsconfig.dist.tsbuildinfo +1 -1
  219. package/exports/canvas.ts +39 -39
  220. package/exports/index.ts +89 -89
  221. package/exports/inspector.ts +24 -24
  222. package/exports/utils.ts +44 -44
  223. package/exports/webgl.ts +38 -38
  224. package/package.json +2 -1
  225. package/scripts/please-use-pnpm.js +13 -13
  226. package/src/common/CommonTypes.ts +139 -139
  227. package/src/common/EventEmitter.ts +77 -77
  228. package/src/common/IAnimationController.ts +92 -92
  229. package/src/common/IEventEmitter.ts +28 -28
  230. package/src/core/CoreNode.test.ts +199 -199
  231. package/src/core/CoreNode.ts +2335 -2335
  232. package/src/core/CoreShaderManager.ts +292 -292
  233. package/src/core/CoreTextNode.ts +455 -455
  234. package/src/core/CoreTextureManager.ts +561 -548
  235. package/src/core/Stage.ts +700 -700
  236. package/src/core/TextureMemoryManager.ts +292 -277
  237. package/src/core/animations/AnimationManager.ts +38 -38
  238. package/src/core/animations/CoreAnimation.ts +340 -340
  239. package/src/core/animations/CoreAnimationController.ts +157 -157
  240. package/src/core/lib/ContextSpy.ts +41 -41
  241. package/src/core/lib/ImageWorker.ts +270 -270
  242. package/src/core/lib/Matrix3d.ts +244 -244
  243. package/src/core/lib/RenderCoords.ts +86 -86
  244. package/src/core/lib/WebGlContextWrapper.ts +1322 -1322
  245. package/src/core/lib/textureCompression.ts +152 -152
  246. package/src/core/lib/textureSvg.ts +78 -78
  247. package/src/core/lib/utils.ts +310 -310
  248. package/src/core/platform.ts +61 -61
  249. package/src/core/renderers/CoreContextTexture.ts +43 -43
  250. package/src/core/renderers/CoreRenderOp.ts +22 -22
  251. package/src/core/renderers/CoreRenderer.ts +114 -114
  252. package/src/core/renderers/CoreShader.ts +41 -41
  253. package/src/core/renderers/canvas/CanvasCoreRenderer.ts +371 -369
  254. package/src/core/renderers/canvas/CanvasCoreTexture.ts +150 -150
  255. package/src/core/renderers/canvas/internal/C2DShaderUtils.ts +231 -231
  256. package/src/core/renderers/canvas/internal/ColorUtils.ts +69 -69
  257. package/src/core/renderers/canvas/shaders/UnsupportedShader.ts +48 -48
  258. package/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.ts +79 -79
  259. package/src/core/renderers/webgl/WebGlCoreCtxSubTexture.ts +50 -50
  260. package/src/core/renderers/webgl/WebGlCoreCtxTexture.ts +295 -298
  261. package/src/core/renderers/webgl/WebGlCoreRenderOp.ts +125 -125
  262. package/src/core/renderers/webgl/WebGlCoreRenderer.ts +805 -805
  263. package/src/core/renderers/webgl/WebGlCoreShader.ts +362 -362
  264. package/src/core/renderers/webgl/internal/BufferCollection.ts +54 -54
  265. package/src/core/renderers/webgl/internal/RendererUtils.ts +155 -155
  266. package/src/core/renderers/webgl/internal/ShaderUtils.ts +143 -143
  267. package/src/core/renderers/webgl/internal/WebGlUtils.ts +35 -35
  268. package/src/core/renderers/webgl/shaders/DefaultShader.ts +93 -93
  269. package/src/core/renderers/webgl/shaders/DefaultShaderBatched.ts +132 -132
  270. package/src/core/renderers/webgl/shaders/DynamicShader.ts +580 -580
  271. package/src/core/renderers/webgl/shaders/RoundedRectangle.ts +167 -167
  272. package/src/core/renderers/webgl/shaders/SdfShader.ts +204 -204
  273. package/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.ts +101 -101
  274. package/src/core/renderers/webgl/shaders/effects/BorderEffect.ts +87 -87
  275. package/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.ts +101 -101
  276. package/src/core/renderers/webgl/shaders/effects/BorderRightEffect.ts +101 -101
  277. package/src/core/renderers/webgl/shaders/effects/BorderTopEffect.ts +101 -101
  278. package/src/core/renderers/webgl/shaders/effects/EffectUtils.ts +159 -159
  279. package/src/core/renderers/webgl/shaders/effects/FadeOutEffect.ts +127 -127
  280. package/src/core/renderers/webgl/shaders/effects/GlitchEffect.ts +148 -148
  281. package/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.ts +67 -67
  282. package/src/core/renderers/webgl/shaders/effects/HolePunchEffect.ts +157 -157
  283. package/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.ts +171 -171
  284. package/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.ts +168 -168
  285. package/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.ts +187 -187
  286. package/src/core/renderers/webgl/shaders/effects/RadiusEffect.ts +110 -110
  287. package/src/core/renderers/webgl/shaders/effects/ShaderEffect.ts +196 -196
  288. package/src/core/text-rendering/TextRenderingUtils.ts +36 -36
  289. package/src/core/text-rendering/TextTextureRendererUtils.ts +263 -263
  290. package/src/core/text-rendering/TrFontManager.ts +183 -183
  291. package/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.ts +176 -176
  292. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.ts +139 -139
  293. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.test.ts +173 -173
  294. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.ts +171 -171
  295. package/src/core/text-rendering/font-face-types/TrFontFace.ts +187 -187
  296. package/src/core/text-rendering/font-face-types/WebTrFontFace.ts +94 -94
  297. package/src/core/text-rendering/renderers/CanvasTextRenderer.ts +509 -509
  298. package/src/core/text-rendering/renderers/LightningTextTextureRenderer.ts +808 -808
  299. package/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.ts +853 -853
  300. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.test.ts +48 -48
  301. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.ts +66 -66
  302. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.ts +52 -52
  303. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.ts +32 -32
  304. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.ts +117 -117
  305. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.test.ts +133 -133
  306. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.ts +38 -38
  307. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.ts +408 -408
  308. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.test.ts +49 -49
  309. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.ts +52 -52
  310. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.test.ts +205 -205
  311. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.ts +93 -93
  312. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.ts +40 -40
  313. package/src/core/text-rendering/renderers/TextRenderer.ts +557 -557
  314. package/src/core/textures/ColorTexture.ts +102 -102
  315. package/src/core/textures/ImageTexture.ts +379 -379
  316. package/src/core/textures/NoiseTexture.ts +104 -104
  317. package/src/core/textures/RenderTexture.ts +85 -85
  318. package/src/core/textures/SubTexture.ts +225 -179
  319. package/src/core/textures/Texture.ts +347 -435
  320. package/src/core/utils.ts +227 -227
  321. package/src/env.d.ts +7 -7
  322. package/src/main-api/DynamicShaderController.ts +104 -104
  323. package/src/main-api/INode.ts +101 -101
  324. package/src/main-api/Inspector.ts +505 -505
  325. package/src/main-api/Renderer.ts +698 -693
  326. package/src/main-api/ShaderController.ts +80 -80
  327. package/src/main-api/utils.ts +45 -45
  328. package/src/utils.ts +248 -248
  329. package/COPYING +0 -1
@@ -1,557 +1,557 @@
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 2023 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
- */
19
-
20
- import type { Dimensions } from '../../../common/CommonTypes.js';
21
- import type { EventEmitter } from '../../../common/EventEmitter.js';
22
- import type { CoreTextNode } from '../../CoreTextNode.js';
23
- import type { Stage } from '../../Stage.js';
24
- import type { Matrix3d } from '../../lib/Matrix3d.js';
25
- import type { Rect, RectWithValid } from '../../lib/utils.js';
26
- import type {
27
- TrFontFace,
28
- TrFontFaceDescriptors,
29
- } from '../font-face-types/TrFontFace.js';
30
- import type {
31
- TextBaseline,
32
- TextVerticalAlign,
33
- } from './LightningTextTextureRenderer.js';
34
-
35
- /**
36
- * Augmentable map of text renderer type IDs to text renderer types.
37
- *
38
- * @example
39
- * ```ts
40
- * declare module './TextRenderer' {
41
- * interface TextRendererMap {
42
- * canvas: CanvasTextRenderer;
43
- * }
44
- * }
45
- * ```
46
- */
47
- // eslint-disable-next-line @typescript-eslint/no-empty-interface
48
- export interface TextRendererMap {}
49
-
50
- export interface TextRendererState {
51
- props: TrProps;
52
- /**
53
- * Whether or not the text renderer state is scheduled to be updated
54
- * via queueMicrotask.
55
- */
56
- updateScheduled: boolean;
57
- status: 'initialState' | 'loading' | 'loaded' | 'failed' | 'destroyed';
58
- /**
59
- * Event emitter for the text renderer
60
- */
61
- emitter: EventEmitter;
62
-
63
- /**
64
- * Force a full layout pass for the calculation of the
65
- * total dimensions of the text
66
- */
67
- forceFullLayoutCalc: boolean;
68
- textW: number | undefined;
69
- textH: number | undefined;
70
-
71
- isRenderable: boolean;
72
-
73
- debugData: {
74
- updateCount: number;
75
- layoutCount: number;
76
- drawCount: number;
77
- lastLayoutNumCharacters: number;
78
- layoutSum: number;
79
- drawSum: number;
80
- bufferSize: number;
81
- };
82
- }
83
-
84
- export interface TextRendererDebugProps {
85
- showRenderWindow: boolean;
86
- showVisibleRect: boolean;
87
- showElementRect: boolean;
88
- disableScissor: boolean;
89
- printLayoutTime: boolean;
90
- }
91
-
92
- /**
93
- * Text renderer properties that are used in resolving appropriate font faces
94
- *
95
- * @remarks
96
- * Extended by {@link TrProps}
97
- */
98
- export interface TrFontProps {
99
- /**
100
- * Font Family
101
- *
102
- * @internalRemarks
103
- * `fontFamily` is defined currently as single string, but in the future we may want to
104
- * support multiple font family fallbacks, as this is supported by CSS / Canvas2d. We can
105
- * do this in a backwards compatible way by unioning an array of strings to the
106
- * `fontFamily` property.
107
- */
108
- fontFamily: string;
109
- /**
110
- * Font Weight
111
- *
112
- * @remarks
113
- * The font weight to use when looking up the font face. This can be a numeric
114
- * value between 1 and 1000, or one of the following strings:
115
- * - `'normal'` - same as 400
116
- * - `'bold'` - same as 700
117
- * - `'bolder'` - (Not yet properly supported)
118
- */
119
- fontWeight: TrFontFaceDescriptors['weight'] | 'bolder' | 'lighter';
120
- /**
121
- * Font Style
122
- *
123
- * @remarks
124
- * The font style to use when looking up the font face. This can be one of the
125
- * following strings:
126
- * - `'normal'`
127
- * - `'italic'`
128
- * - `'oblique'`
129
- */
130
- fontStyle: TrFontFaceDescriptors['style'];
131
- /**
132
- * Font Stretch
133
- *
134
- * @remarks
135
- * The font stretch to use when looking up the font face. This can be one of the
136
- * following strings:
137
- * - `'normal'`
138
- * - `'ultra-condensed'`
139
- * - `'extra-condensed'`
140
- * - `'condensed'`
141
- * - `'semi-condensed'`
142
- * - `'semi-expanded'`
143
- * - `'expanded'`
144
- * - `'extra-expanded'`
145
- * - `'ultra-expanded'`
146
- *
147
- * @default 'normal'
148
- */
149
- fontStretch: TrFontFaceDescriptors['stretch'];
150
- /**
151
- * Font Size
152
- *
153
- * @remarks
154
- * The font size to use when looking up the font face.
155
- *
156
- * The font size is specified in pixels and is the height of the font's
157
- * em-square. The em-square is essentially the height of the capital letters
158
- * for the font. The actual height of the text can be larger than the
159
- * specified font size, as the font may have ascenders and descenders that
160
- * extend beyond the em-square.
161
- *
162
- * @default 16
163
- */
164
- fontSize: number;
165
- }
166
-
167
- export interface TrProps extends TrFontProps {
168
- /**
169
- * Text to display
170
- *
171
- * @default ''
172
- */
173
- text: string;
174
- /**
175
- * Text alignment
176
- *
177
- * @remarks
178
- * Alignment of the text relative to it's contained bounds. For best results,
179
- * use {@link contain} mode `'width'` or `'both'` and a set an explicit
180
- * {@link width} for the text to be aligned within.
181
- *
182
- * @default 'left'
183
- */
184
- textAlign: 'left' | 'center' | 'right';
185
- /**
186
- * Color of text
187
- *
188
- * @remarks
189
- * The color value is a number in the format 0xRRGGBBAA, where RR is the red
190
- * component, GG is the green component, BB is the blue component, and AA is
191
- * the alpha component.
192
- *
193
- * @default 0xffffffff (opaque white)
194
- */
195
- color: number;
196
- x: number;
197
- y: number;
198
- /**
199
- * Contain mode for text
200
- *
201
- * @remarks
202
- * The contain mode determines how the text is contained within the bounds
203
- * of the Text Node. The default value is `'none'`, which means that the
204
- * Text Renderer will not constrain the text in any way. `'width'` mode will
205
- * constrain the text to the set width wrapping lines as necessary, and
206
- * `'both'` mode will constrain the text to both the set width and height
207
- * wrapping lines and truncating text as necessary.
208
- *
209
- * ## Text Auto-size Behavior
210
- * Depending on the set contain mode, after the text 'loaded' event is emitted,
211
- * the text node may have either its {@link width} and {@link height} updated
212
- * to match the rendered size of the text.
213
- *
214
- * When contain mode is 'none', both the {@link width} and {@link height}
215
- * properties are updated.
216
- *
217
- * When contain mode is 'width', only the {@link height} property is updated.
218
- *
219
- * When contain mode is 'both', neither property is updated.
220
- *
221
- * @default 'none'
222
- */
223
- contain: 'none' | 'width' | 'both';
224
- width: number;
225
- height: number;
226
- /**
227
- * Whether or not the text is scrollable
228
- *
229
- * @remarks
230
- * If `scrollable` is `true`, the text can be scrolled vertically within the
231
- * bounds of the Text Node. You can set the scroll position using the
232
- * {@link scrollY} property.
233
- *
234
- * @default false
235
- */
236
- scrollable: boolean;
237
- /**
238
- * Vertical scroll position for text
239
- *
240
- * @remarks
241
- * The vertical scroll position of the text. This property is only used if
242
- * {@link scrollable} is `true`.
243
- *
244
- * @default 0
245
- */
246
- scrollY: number;
247
- /**
248
- * Vertical offset for text
249
- *
250
- * @remarks
251
- * The vertical offset of the text. This property is only used if
252
- * {@link scrollable} is `true`.
253
- *
254
- * @default 0
255
- */
256
- offsetY: number;
257
- /**
258
- * Letter spacing for text (in pixels)
259
- *
260
- * @remarks
261
- * This property sets additional (or reduced, if value is negative) spacing
262
- * between characters in the text.
263
- *
264
- * @default 0
265
- */
266
- letterSpacing: number;
267
- /**
268
- * Line height for text (in pixels)
269
- *
270
- * @remarks
271
- * This property sets the height of each line. If set to `undefined`, the
272
- * line height will be calculated based on the font and font size to be the
273
- * minimal height required to completely contain a line of text.
274
- *
275
- * See: https://github.com/lightning-js/renderer/issues/170
276
- *
277
- * @default `undefined`
278
- */
279
- lineHeight: number | undefined;
280
- /**
281
- * Max lines for text
282
- *
283
- * @remarks
284
- * This property sets max number of lines of a text paragraph.
285
- * Not yet implemented in the SDF renderer.
286
- *
287
- * @default 0
288
- */
289
- maxLines: number;
290
- /**
291
- * Baseline for text
292
- *
293
- * @remarks
294
- * This property sets the text baseline used when drawing text.
295
- * Not yet implemented in the SDF renderer.
296
- *
297
- * @default alphabetic
298
- */
299
- textBaseline: TextBaseline;
300
- /**
301
- * Vertical Align for text when lineHeight > fontSize
302
- *
303
- * @remarks
304
- * This property sets the vertical align of the text.
305
- * Not yet implemented in the SDF renderer.
306
- *
307
- * @default middle
308
- */
309
- verticalAlign: TextVerticalAlign;
310
- /**
311
- * Overflow Suffix for text
312
- *
313
- * @remarks
314
- * The suffix to be added when text is cropped due to overflow.
315
- * Not yet implemented in the SDF renderer.
316
- *
317
- * @default "..."
318
- */
319
- overflowSuffix: string;
320
-
321
- zIndex: number;
322
-
323
- debug: Partial<TextRendererDebugProps>;
324
- }
325
-
326
- export type TrPropSetters<StateT = TextRendererState> = {
327
- [key in keyof TrProps]: (state: StateT, value: TrProps[key]) => void;
328
- };
329
-
330
- const trPropSetterDefaults: TrPropSetters = {
331
- x: (state, value) => {
332
- state.props.x = value;
333
- },
334
- y: (state, value) => {
335
- state.props.y = value;
336
- },
337
- width: (state, value) => {
338
- state.props.width = value;
339
- },
340
- height: (state, value) => {
341
- state.props.height = value;
342
- },
343
- color: (state, value) => {
344
- state.props.color = value;
345
- },
346
- zIndex: (state, value) => {
347
- state.props.zIndex = value;
348
- },
349
- fontFamily: (state, value) => {
350
- state.props.fontFamily = value;
351
- },
352
- fontWeight: (state, value) => {
353
- state.props.fontWeight = value;
354
- },
355
- fontStyle: (state, value) => {
356
- state.props.fontStyle = value;
357
- },
358
- fontStretch: (state, value) => {
359
- state.props.fontStretch = value;
360
- },
361
- fontSize: (state, value) => {
362
- state.props.fontSize = value;
363
- },
364
- text: (state, value) => {
365
- state.props.text = value;
366
- },
367
- textAlign: (state, value) => {
368
- state.props.textAlign = value;
369
- },
370
- contain: (state, value) => {
371
- state.props.contain = value;
372
- },
373
- offsetY: (state, value) => {
374
- state.props.offsetY = value;
375
- },
376
- scrollable: (state, value) => {
377
- state.props.scrollable = value;
378
- },
379
- scrollY: (state, value) => {
380
- state.props.scrollY = value;
381
- },
382
- letterSpacing: (state, value) => {
383
- state.props.letterSpacing = value;
384
- },
385
- lineHeight: (state, value) => {
386
- state.props.lineHeight = value;
387
- },
388
- maxLines: (state, value) => {
389
- state.props.maxLines = value;
390
- },
391
- textBaseline: (state, value) => {
392
- state.props.textBaseline = value;
393
- },
394
- verticalAlign: (state, value) => {
395
- state.props.verticalAlign = value;
396
- },
397
- overflowSuffix: (state, value) => {
398
- state.props.overflowSuffix = value;
399
- },
400
- debug: (state, value) => {
401
- state.props.debug = value;
402
- },
403
- };
404
-
405
- /**
406
- * Event handler for when text is loaded
407
- *
408
- * @remarks
409
- * Emitted by state.emitter
410
- */
411
- export type TrLoadedEventHandler = (target: any) => void;
412
-
413
- /**
414
- * Event handler for when text failed to load
415
- *
416
- * @remarks
417
- * Emitted by state.emitter
418
- */
419
- export type TrFailedEventHandler = (target: any, error: Error) => void;
420
-
421
- export abstract class TextRenderer<
422
- StateT extends TextRendererState = TextRendererState,
423
- > {
424
- readonly set: Readonly<TrPropSetters<StateT>>;
425
- abstract type: 'canvas' | 'sdf';
426
-
427
- constructor(protected stage: Stage) {
428
- const propSetters = {
429
- ...trPropSetterDefaults,
430
- ...this.getPropertySetters(),
431
- };
432
- // For each prop setter add a wrapper method that checks if the prop is
433
- // different before calling the setter
434
- const propSet = {};
435
- Object.keys(propSetters).forEach((key) => {
436
- Object.defineProperty(propSet, key, {
437
- value: (state: StateT, value: TrProps[keyof TrProps]) => {
438
- // Check if the current prop value is different before calling the setter
439
- if (state.props[key as keyof TrProps] !== value) {
440
- propSetters[key as keyof TrPropSetters](state, value as never);
441
-
442
- // Assume any prop change will require a render
443
- // This ensures that renders are triggered appropriately even with RAF paused
444
- this.stage.requestRender();
445
- }
446
- },
447
- writable: false, // Prevents property from being changed
448
- configurable: false, // Prevents property from being deleted
449
- });
450
- });
451
- this.set = propSet as Readonly<TrPropSetters<StateT>>;
452
- }
453
-
454
- setStatus(state: StateT, status: StateT['status'], error?: Error) {
455
- // Don't emit the same status twice
456
- if (state.status === status) {
457
- return;
458
- }
459
- state.status = status;
460
- state.emitter.emit(status, error);
461
- }
462
-
463
- /**
464
- * Allows the CoreTextNode to communicate changes to the isRenderable state of
465
- * the itself.
466
- *
467
- * @param state
468
- * @param renderable
469
- */
470
- setIsRenderable(state: StateT, renderable: boolean) {
471
- state.isRenderable = renderable;
472
- }
473
-
474
- /**
475
- * Called by constructor to get a map of property setter functions for this renderer.
476
- */
477
- abstract getPropertySetters(): Partial<TrPropSetters<StateT>>;
478
-
479
- /**
480
- * Given text renderer properties (particularly the specific properties related to font selection)
481
- * returns whether or not the renderer can render it.
482
- *
483
- * @param props
484
- */
485
- abstract canRenderFont(props: TrFontProps): boolean;
486
-
487
- /**
488
- * Called by the TrFontManager to find out if a newly added font face is supported
489
- * by this renderer.
490
- *
491
- * @param fontFace
492
- */
493
- abstract isFontFaceSupported(fontFace: TrFontFace): boolean;
494
-
495
- /**
496
- * Called by the TrFontManager to add a font face to the renderer's font registry.
497
- *
498
- * @remarks
499
- * This method MUST ONLY be called for a fontFace that previously passed the
500
- * {@link isFontFaceSupported} check.
501
- *
502
- * @param fontFace
503
- */
504
- abstract addFontFace(fontFace: TrFontFace): void;
505
-
506
- abstract createState(props: TrProps, node: CoreTextNode): StateT;
507
-
508
- /**
509
- * Destroy/Clean up the state object
510
- *
511
- * @remarks
512
- * Opposite of createState(). Frees any event listeners / resources held by
513
- * the state that may not reliably get garbage collected.
514
- *
515
- * @param state
516
- */
517
- destroyState(state: StateT) {
518
- this.setStatus(state, 'destroyed');
519
- state.emitter.removeAllListeners();
520
- }
521
-
522
- /**
523
- * Schedule a state update via queueMicrotask
524
- *
525
- * @remarks
526
- * This method is used to schedule a state update via queueMicrotask. This
527
- * method should be called whenever a state update is needed, and it will
528
- * ensure that the state is only updated once per microtask.
529
- * @param state
530
- * @returns
531
- */
532
- scheduleUpdateState(state: StateT): void {
533
- if (state.updateScheduled) {
534
- return;
535
- }
536
- state.updateScheduled = true;
537
- queueMicrotask(() => {
538
- // If the state has been destroyed, don't update it
539
- if (state.status === 'destroyed') {
540
- return;
541
- }
542
- state.updateScheduled = false;
543
- this.updateState(state);
544
- });
545
- }
546
-
547
- abstract updateState(state: StateT): void;
548
-
549
- renderQuads?(
550
- state: StateT,
551
- transform: Matrix3d,
552
- clippingRect: RectWithValid,
553
- alpha: number,
554
- parentHasRenderTexture: boolean,
555
- framebufferDimensions: Dimensions | undefined,
556
- ): void;
557
- }
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 2023 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
+ */
19
+
20
+ import type { Dimensions } from '../../../common/CommonTypes.js';
21
+ import type { EventEmitter } from '../../../common/EventEmitter.js';
22
+ import type { CoreTextNode } from '../../CoreTextNode.js';
23
+ import type { Stage } from '../../Stage.js';
24
+ import type { Matrix3d } from '../../lib/Matrix3d.js';
25
+ import type { Rect, RectWithValid } from '../../lib/utils.js';
26
+ import type {
27
+ TrFontFace,
28
+ TrFontFaceDescriptors,
29
+ } from '../font-face-types/TrFontFace.js';
30
+ import type {
31
+ TextBaseline,
32
+ TextVerticalAlign,
33
+ } from './LightningTextTextureRenderer.js';
34
+
35
+ /**
36
+ * Augmentable map of text renderer type IDs to text renderer types.
37
+ *
38
+ * @example
39
+ * ```ts
40
+ * declare module './TextRenderer' {
41
+ * interface TextRendererMap {
42
+ * canvas: CanvasTextRenderer;
43
+ * }
44
+ * }
45
+ * ```
46
+ */
47
+ // eslint-disable-next-line @typescript-eslint/no-empty-interface
48
+ export interface TextRendererMap {}
49
+
50
+ export interface TextRendererState {
51
+ props: TrProps;
52
+ /**
53
+ * Whether or not the text renderer state is scheduled to be updated
54
+ * via queueMicrotask.
55
+ */
56
+ updateScheduled: boolean;
57
+ status: 'initialState' | 'loading' | 'loaded' | 'failed' | 'destroyed';
58
+ /**
59
+ * Event emitter for the text renderer
60
+ */
61
+ emitter: EventEmitter;
62
+
63
+ /**
64
+ * Force a full layout pass for the calculation of the
65
+ * total dimensions of the text
66
+ */
67
+ forceFullLayoutCalc: boolean;
68
+ textW: number | undefined;
69
+ textH: number | undefined;
70
+
71
+ isRenderable: boolean;
72
+
73
+ debugData: {
74
+ updateCount: number;
75
+ layoutCount: number;
76
+ drawCount: number;
77
+ lastLayoutNumCharacters: number;
78
+ layoutSum: number;
79
+ drawSum: number;
80
+ bufferSize: number;
81
+ };
82
+ }
83
+
84
+ export interface TextRendererDebugProps {
85
+ showRenderWindow: boolean;
86
+ showVisibleRect: boolean;
87
+ showElementRect: boolean;
88
+ disableScissor: boolean;
89
+ printLayoutTime: boolean;
90
+ }
91
+
92
+ /**
93
+ * Text renderer properties that are used in resolving appropriate font faces
94
+ *
95
+ * @remarks
96
+ * Extended by {@link TrProps}
97
+ */
98
+ export interface TrFontProps {
99
+ /**
100
+ * Font Family
101
+ *
102
+ * @internalRemarks
103
+ * `fontFamily` is defined currently as single string, but in the future we may want to
104
+ * support multiple font family fallbacks, as this is supported by CSS / Canvas2d. We can
105
+ * do this in a backwards compatible way by unioning an array of strings to the
106
+ * `fontFamily` property.
107
+ */
108
+ fontFamily: string;
109
+ /**
110
+ * Font Weight
111
+ *
112
+ * @remarks
113
+ * The font weight to use when looking up the font face. This can be a numeric
114
+ * value between 1 and 1000, or one of the following strings:
115
+ * - `'normal'` - same as 400
116
+ * - `'bold'` - same as 700
117
+ * - `'bolder'` - (Not yet properly supported)
118
+ */
119
+ fontWeight: TrFontFaceDescriptors['weight'] | 'bolder' | 'lighter';
120
+ /**
121
+ * Font Style
122
+ *
123
+ * @remarks
124
+ * The font style to use when looking up the font face. This can be one of the
125
+ * following strings:
126
+ * - `'normal'`
127
+ * - `'italic'`
128
+ * - `'oblique'`
129
+ */
130
+ fontStyle: TrFontFaceDescriptors['style'];
131
+ /**
132
+ * Font Stretch
133
+ *
134
+ * @remarks
135
+ * The font stretch to use when looking up the font face. This can be one of the
136
+ * following strings:
137
+ * - `'normal'`
138
+ * - `'ultra-condensed'`
139
+ * - `'extra-condensed'`
140
+ * - `'condensed'`
141
+ * - `'semi-condensed'`
142
+ * - `'semi-expanded'`
143
+ * - `'expanded'`
144
+ * - `'extra-expanded'`
145
+ * - `'ultra-expanded'`
146
+ *
147
+ * @default 'normal'
148
+ */
149
+ fontStretch: TrFontFaceDescriptors['stretch'];
150
+ /**
151
+ * Font Size
152
+ *
153
+ * @remarks
154
+ * The font size to use when looking up the font face.
155
+ *
156
+ * The font size is specified in pixels and is the height of the font's
157
+ * em-square. The em-square is essentially the height of the capital letters
158
+ * for the font. The actual height of the text can be larger than the
159
+ * specified font size, as the font may have ascenders and descenders that
160
+ * extend beyond the em-square.
161
+ *
162
+ * @default 16
163
+ */
164
+ fontSize: number;
165
+ }
166
+
167
+ export interface TrProps extends TrFontProps {
168
+ /**
169
+ * Text to display
170
+ *
171
+ * @default ''
172
+ */
173
+ text: string;
174
+ /**
175
+ * Text alignment
176
+ *
177
+ * @remarks
178
+ * Alignment of the text relative to it's contained bounds. For best results,
179
+ * use {@link contain} mode `'width'` or `'both'` and a set an explicit
180
+ * {@link width} for the text to be aligned within.
181
+ *
182
+ * @default 'left'
183
+ */
184
+ textAlign: 'left' | 'center' | 'right';
185
+ /**
186
+ * Color of text
187
+ *
188
+ * @remarks
189
+ * The color value is a number in the format 0xRRGGBBAA, where RR is the red
190
+ * component, GG is the green component, BB is the blue component, and AA is
191
+ * the alpha component.
192
+ *
193
+ * @default 0xffffffff (opaque white)
194
+ */
195
+ color: number;
196
+ x: number;
197
+ y: number;
198
+ /**
199
+ * Contain mode for text
200
+ *
201
+ * @remarks
202
+ * The contain mode determines how the text is contained within the bounds
203
+ * of the Text Node. The default value is `'none'`, which means that the
204
+ * Text Renderer will not constrain the text in any way. `'width'` mode will
205
+ * constrain the text to the set width wrapping lines as necessary, and
206
+ * `'both'` mode will constrain the text to both the set width and height
207
+ * wrapping lines and truncating text as necessary.
208
+ *
209
+ * ## Text Auto-size Behavior
210
+ * Depending on the set contain mode, after the text 'loaded' event is emitted,
211
+ * the text node may have either its {@link width} and {@link height} updated
212
+ * to match the rendered size of the text.
213
+ *
214
+ * When contain mode is 'none', both the {@link width} and {@link height}
215
+ * properties are updated.
216
+ *
217
+ * When contain mode is 'width', only the {@link height} property is updated.
218
+ *
219
+ * When contain mode is 'both', neither property is updated.
220
+ *
221
+ * @default 'none'
222
+ */
223
+ contain: 'none' | 'width' | 'both';
224
+ width: number;
225
+ height: number;
226
+ /**
227
+ * Whether or not the text is scrollable
228
+ *
229
+ * @remarks
230
+ * If `scrollable` is `true`, the text can be scrolled vertically within the
231
+ * bounds of the Text Node. You can set the scroll position using the
232
+ * {@link scrollY} property.
233
+ *
234
+ * @default false
235
+ */
236
+ scrollable: boolean;
237
+ /**
238
+ * Vertical scroll position for text
239
+ *
240
+ * @remarks
241
+ * The vertical scroll position of the text. This property is only used if
242
+ * {@link scrollable} is `true`.
243
+ *
244
+ * @default 0
245
+ */
246
+ scrollY: number;
247
+ /**
248
+ * Vertical offset for text
249
+ *
250
+ * @remarks
251
+ * The vertical offset of the text. This property is only used if
252
+ * {@link scrollable} is `true`.
253
+ *
254
+ * @default 0
255
+ */
256
+ offsetY: number;
257
+ /**
258
+ * Letter spacing for text (in pixels)
259
+ *
260
+ * @remarks
261
+ * This property sets additional (or reduced, if value is negative) spacing
262
+ * between characters in the text.
263
+ *
264
+ * @default 0
265
+ */
266
+ letterSpacing: number;
267
+ /**
268
+ * Line height for text (in pixels)
269
+ *
270
+ * @remarks
271
+ * This property sets the height of each line. If set to `undefined`, the
272
+ * line height will be calculated based on the font and font size to be the
273
+ * minimal height required to completely contain a line of text.
274
+ *
275
+ * See: https://github.com/lightning-js/renderer/issues/170
276
+ *
277
+ * @default `undefined`
278
+ */
279
+ lineHeight: number | undefined;
280
+ /**
281
+ * Max lines for text
282
+ *
283
+ * @remarks
284
+ * This property sets max number of lines of a text paragraph.
285
+ * Not yet implemented in the SDF renderer.
286
+ *
287
+ * @default 0
288
+ */
289
+ maxLines: number;
290
+ /**
291
+ * Baseline for text
292
+ *
293
+ * @remarks
294
+ * This property sets the text baseline used when drawing text.
295
+ * Not yet implemented in the SDF renderer.
296
+ *
297
+ * @default alphabetic
298
+ */
299
+ textBaseline: TextBaseline;
300
+ /**
301
+ * Vertical Align for text when lineHeight > fontSize
302
+ *
303
+ * @remarks
304
+ * This property sets the vertical align of the text.
305
+ * Not yet implemented in the SDF renderer.
306
+ *
307
+ * @default middle
308
+ */
309
+ verticalAlign: TextVerticalAlign;
310
+ /**
311
+ * Overflow Suffix for text
312
+ *
313
+ * @remarks
314
+ * The suffix to be added when text is cropped due to overflow.
315
+ * Not yet implemented in the SDF renderer.
316
+ *
317
+ * @default "..."
318
+ */
319
+ overflowSuffix: string;
320
+
321
+ zIndex: number;
322
+
323
+ debug: Partial<TextRendererDebugProps>;
324
+ }
325
+
326
+ export type TrPropSetters<StateT = TextRendererState> = {
327
+ [key in keyof TrProps]: (state: StateT, value: TrProps[key]) => void;
328
+ };
329
+
330
+ const trPropSetterDefaults: TrPropSetters = {
331
+ x: (state, value) => {
332
+ state.props.x = value;
333
+ },
334
+ y: (state, value) => {
335
+ state.props.y = value;
336
+ },
337
+ width: (state, value) => {
338
+ state.props.width = value;
339
+ },
340
+ height: (state, value) => {
341
+ state.props.height = value;
342
+ },
343
+ color: (state, value) => {
344
+ state.props.color = value;
345
+ },
346
+ zIndex: (state, value) => {
347
+ state.props.zIndex = value;
348
+ },
349
+ fontFamily: (state, value) => {
350
+ state.props.fontFamily = value;
351
+ },
352
+ fontWeight: (state, value) => {
353
+ state.props.fontWeight = value;
354
+ },
355
+ fontStyle: (state, value) => {
356
+ state.props.fontStyle = value;
357
+ },
358
+ fontStretch: (state, value) => {
359
+ state.props.fontStretch = value;
360
+ },
361
+ fontSize: (state, value) => {
362
+ state.props.fontSize = value;
363
+ },
364
+ text: (state, value) => {
365
+ state.props.text = value;
366
+ },
367
+ textAlign: (state, value) => {
368
+ state.props.textAlign = value;
369
+ },
370
+ contain: (state, value) => {
371
+ state.props.contain = value;
372
+ },
373
+ offsetY: (state, value) => {
374
+ state.props.offsetY = value;
375
+ },
376
+ scrollable: (state, value) => {
377
+ state.props.scrollable = value;
378
+ },
379
+ scrollY: (state, value) => {
380
+ state.props.scrollY = value;
381
+ },
382
+ letterSpacing: (state, value) => {
383
+ state.props.letterSpacing = value;
384
+ },
385
+ lineHeight: (state, value) => {
386
+ state.props.lineHeight = value;
387
+ },
388
+ maxLines: (state, value) => {
389
+ state.props.maxLines = value;
390
+ },
391
+ textBaseline: (state, value) => {
392
+ state.props.textBaseline = value;
393
+ },
394
+ verticalAlign: (state, value) => {
395
+ state.props.verticalAlign = value;
396
+ },
397
+ overflowSuffix: (state, value) => {
398
+ state.props.overflowSuffix = value;
399
+ },
400
+ debug: (state, value) => {
401
+ state.props.debug = value;
402
+ },
403
+ };
404
+
405
+ /**
406
+ * Event handler for when text is loaded
407
+ *
408
+ * @remarks
409
+ * Emitted by state.emitter
410
+ */
411
+ export type TrLoadedEventHandler = (target: any) => void;
412
+
413
+ /**
414
+ * Event handler for when text failed to load
415
+ *
416
+ * @remarks
417
+ * Emitted by state.emitter
418
+ */
419
+ export type TrFailedEventHandler = (target: any, error: Error) => void;
420
+
421
+ export abstract class TextRenderer<
422
+ StateT extends TextRendererState = TextRendererState,
423
+ > {
424
+ readonly set: Readonly<TrPropSetters<StateT>>;
425
+ abstract type: 'canvas' | 'sdf';
426
+
427
+ constructor(protected stage: Stage) {
428
+ const propSetters = {
429
+ ...trPropSetterDefaults,
430
+ ...this.getPropertySetters(),
431
+ };
432
+ // For each prop setter add a wrapper method that checks if the prop is
433
+ // different before calling the setter
434
+ const propSet = {};
435
+ Object.keys(propSetters).forEach((key) => {
436
+ Object.defineProperty(propSet, key, {
437
+ value: (state: StateT, value: TrProps[keyof TrProps]) => {
438
+ // Check if the current prop value is different before calling the setter
439
+ if (state.props[key as keyof TrProps] !== value) {
440
+ propSetters[key as keyof TrPropSetters](state, value as never);
441
+
442
+ // Assume any prop change will require a render
443
+ // This ensures that renders are triggered appropriately even with RAF paused
444
+ this.stage.requestRender();
445
+ }
446
+ },
447
+ writable: false, // Prevents property from being changed
448
+ configurable: false, // Prevents property from being deleted
449
+ });
450
+ });
451
+ this.set = propSet as Readonly<TrPropSetters<StateT>>;
452
+ }
453
+
454
+ setStatus(state: StateT, status: StateT['status'], error?: Error) {
455
+ // Don't emit the same status twice
456
+ if (state.status === status) {
457
+ return;
458
+ }
459
+ state.status = status;
460
+ state.emitter.emit(status, error);
461
+ }
462
+
463
+ /**
464
+ * Allows the CoreTextNode to communicate changes to the isRenderable state of
465
+ * the itself.
466
+ *
467
+ * @param state
468
+ * @param renderable
469
+ */
470
+ setIsRenderable(state: StateT, renderable: boolean) {
471
+ state.isRenderable = renderable;
472
+ }
473
+
474
+ /**
475
+ * Called by constructor to get a map of property setter functions for this renderer.
476
+ */
477
+ abstract getPropertySetters(): Partial<TrPropSetters<StateT>>;
478
+
479
+ /**
480
+ * Given text renderer properties (particularly the specific properties related to font selection)
481
+ * returns whether or not the renderer can render it.
482
+ *
483
+ * @param props
484
+ */
485
+ abstract canRenderFont(props: TrFontProps): boolean;
486
+
487
+ /**
488
+ * Called by the TrFontManager to find out if a newly added font face is supported
489
+ * by this renderer.
490
+ *
491
+ * @param fontFace
492
+ */
493
+ abstract isFontFaceSupported(fontFace: TrFontFace): boolean;
494
+
495
+ /**
496
+ * Called by the TrFontManager to add a font face to the renderer's font registry.
497
+ *
498
+ * @remarks
499
+ * This method MUST ONLY be called for a fontFace that previously passed the
500
+ * {@link isFontFaceSupported} check.
501
+ *
502
+ * @param fontFace
503
+ */
504
+ abstract addFontFace(fontFace: TrFontFace): void;
505
+
506
+ abstract createState(props: TrProps, node: CoreTextNode): StateT;
507
+
508
+ /**
509
+ * Destroy/Clean up the state object
510
+ *
511
+ * @remarks
512
+ * Opposite of createState(). Frees any event listeners / resources held by
513
+ * the state that may not reliably get garbage collected.
514
+ *
515
+ * @param state
516
+ */
517
+ destroyState(state: StateT) {
518
+ this.setStatus(state, 'destroyed');
519
+ state.emitter.removeAllListeners();
520
+ }
521
+
522
+ /**
523
+ * Schedule a state update via queueMicrotask
524
+ *
525
+ * @remarks
526
+ * This method is used to schedule a state update via queueMicrotask. This
527
+ * method should be called whenever a state update is needed, and it will
528
+ * ensure that the state is only updated once per microtask.
529
+ * @param state
530
+ * @returns
531
+ */
532
+ scheduleUpdateState(state: StateT): void {
533
+ if (state.updateScheduled) {
534
+ return;
535
+ }
536
+ state.updateScheduled = true;
537
+ queueMicrotask(() => {
538
+ // If the state has been destroyed, don't update it
539
+ if (state.status === 'destroyed') {
540
+ return;
541
+ }
542
+ state.updateScheduled = false;
543
+ this.updateState(state);
544
+ });
545
+ }
546
+
547
+ abstract updateState(state: StateT): void;
548
+
549
+ renderQuads?(
550
+ state: StateT,
551
+ transform: Matrix3d,
552
+ clippingRect: RectWithValid,
553
+ alpha: number,
554
+ parentHasRenderTexture: boolean,
555
+ framebufferDimensions: Dimensions | undefined,
556
+ ): void;
557
+ }