@lightningjs/renderer 3.0.0-beta4 → 3.0.0-beta6

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 (359) 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/CoreNode.d.ts +6 -16
  14. package/dist/src/core/CoreNode.js +25 -38
  15. package/dist/src/core/CoreNode.js.map +1 -1
  16. package/dist/src/core/CoreStuff.js +138 -0
  17. package/dist/src/core/CoreStuff.js.map +1 -0
  18. package/dist/src/core/CoreTextNode.js +1 -1
  19. package/dist/src/core/CoreTextNode.js.map +1 -1
  20. package/dist/src/core/CoreTextureManager.js +4 -5
  21. package/dist/src/core/CoreTextureManager.js.map +1 -1
  22. package/dist/src/core/CoreTexturizer.d.ts +14 -0
  23. package/dist/src/core/CoreTexturizer.js +47 -0
  24. package/dist/src/core/CoreTexturizer.js.map +1 -0
  25. package/dist/src/core/LngNode.d.ts +736 -0
  26. package/dist/src/core/LngNode.js +1174 -0
  27. package/dist/src/core/LngNode.js.map +1 -0
  28. package/dist/src/core/Matrix2DContext.d.ts +15 -0
  29. package/dist/src/core/Matrix2DContext.js +45 -0
  30. package/dist/src/core/Matrix2DContext.js.map +1 -0
  31. package/dist/src/core/ShaderNode.d.ts +10 -0
  32. package/dist/src/core/ShaderNode.js +30 -0
  33. package/dist/src/core/ShaderNode.js.map +1 -0
  34. package/dist/src/core/Stage.js +0 -3
  35. package/dist/src/core/Stage.js.map +1 -1
  36. package/dist/src/core/TextNode.d.ts +103 -0
  37. package/dist/src/core/TextNode.js +331 -0
  38. package/dist/src/core/TextNode.js.map +1 -0
  39. package/dist/src/core/TextureMemoryManager.js +3 -4
  40. package/dist/src/core/TextureMemoryManager.js.map +1 -1
  41. package/dist/src/core/lib/Coords.d.ts +14 -0
  42. package/dist/src/core/lib/Coords.js +55 -0
  43. package/dist/src/core/lib/Coords.js.map +1 -0
  44. package/dist/src/core/lib/glm/common.d.ts +162 -0
  45. package/dist/src/core/lib/glm/common.js +81 -0
  46. package/dist/src/core/lib/glm/common.js.map +1 -0
  47. package/dist/src/core/lib/glm/index.d.ts +11 -0
  48. package/dist/src/core/lib/glm/index.js +30 -0
  49. package/dist/src/core/lib/glm/index.js.map +1 -0
  50. package/dist/src/core/lib/glm/mat2.d.ts +219 -0
  51. package/dist/src/core/lib/glm/mat2.js +396 -0
  52. package/dist/src/core/lib/glm/mat2.js.map +1 -0
  53. package/dist/src/core/lib/glm/mat2d.d.ts +237 -0
  54. package/dist/src/core/lib/glm/mat2d.js +442 -0
  55. package/dist/src/core/lib/glm/mat2d.js.map +1 -0
  56. package/dist/src/core/lib/glm/mat3.d.ts +283 -0
  57. package/dist/src/core/lib/glm/mat3.js +680 -0
  58. package/dist/src/core/lib/glm/mat3.js.map +1 -0
  59. package/dist/src/core/lib/glm/mat4.d.ts +550 -0
  60. package/dist/src/core/lib/glm/mat4.js +1802 -0
  61. package/dist/src/core/lib/glm/mat4.js.map +1 -0
  62. package/dist/src/core/lib/glm/quat.d.ts +363 -0
  63. package/dist/src/core/lib/glm/quat.js +693 -0
  64. package/dist/src/core/lib/glm/quat.js.map +1 -0
  65. package/dist/src/core/lib/glm/quat2.d.ts +356 -0
  66. package/dist/src/core/lib/glm/quat2.js +754 -0
  67. package/dist/src/core/lib/glm/quat2.js.map +1 -0
  68. package/dist/src/core/lib/glm/vec2.d.ts +365 -0
  69. package/dist/src/core/lib/glm/vec2.js +569 -0
  70. package/dist/src/core/lib/glm/vec2.js.map +1 -0
  71. package/dist/src/core/lib/glm/vec3.d.ts +406 -0
  72. package/dist/src/core/lib/glm/vec3.js +720 -0
  73. package/dist/src/core/lib/glm/vec3.js.map +1 -0
  74. package/dist/src/core/lib/glm/vec4.d.ts +330 -0
  75. package/dist/src/core/lib/glm/vec4.js +608 -0
  76. package/dist/src/core/lib/glm/vec4.js.map +1 -0
  77. package/dist/src/core/renderers/CoreRenderer.d.ts +1 -1
  78. package/dist/src/core/renderers/CoreShaderManager.d.ts +19 -0
  79. package/dist/src/core/renderers/CoreShaderManager.js +33 -0
  80. package/dist/src/core/renderers/CoreShaderManager.js.map +1 -0
  81. package/dist/src/core/renderers/webgl/WebGlCoreShaderManager.d.ts +27 -0
  82. package/dist/src/core/renderers/webgl/WebGlCoreShaderManager.js +82 -0
  83. package/dist/src/core/renderers/webgl/WebGlCoreShaderManager.js.map +1 -0
  84. package/dist/src/core/renderers/webgl/WebGlCoreShaderProgram.d.ts +11 -0
  85. package/dist/src/core/renderers/webgl/WebGlCoreShaderProgram.js +34 -0
  86. package/dist/src/core/renderers/webgl/WebGlCoreShaderProgram.js.map +1 -0
  87. package/dist/src/core/renderers/webgl/WebGlRenderOp.d.ts +1 -1
  88. package/dist/src/core/renderers/webgl/WebGlRenderOp.js.map +1 -1
  89. package/dist/src/core/renderers/webgl/internal/ShaderUtils.js +35 -35
  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/shaders/canvas/RoundedWithBorder.js +8 -2
  112. package/dist/src/core/shaders/canvas/RoundedWithBorder.js.map +1 -1
  113. package/dist/src/core/shaders/webgl/Border.js +86 -63
  114. package/dist/src/core/shaders/webgl/Border.js.map +1 -1
  115. package/dist/src/core/shaders/webgl/Default.js +47 -47
  116. package/dist/src/core/shaders/webgl/DefaultBatched.js +61 -61
  117. package/dist/src/core/shaders/webgl/HolePunch.js +32 -32
  118. package/dist/src/core/shaders/webgl/LinearGradient.js +36 -36
  119. package/dist/src/core/shaders/webgl/RadialGradient.js +33 -33
  120. package/dist/src/core/shaders/webgl/Rounded.js +71 -71
  121. package/dist/src/core/shaders/webgl/RoundedWithBorder.js +104 -72
  122. package/dist/src/core/shaders/webgl/RoundedWithBorder.js.map +1 -1
  123. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js +123 -86
  124. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js.map +1 -1
  125. package/dist/src/core/shaders/webgl/RoundedWithShadow.js +54 -54
  126. package/dist/src/core/shaders/webgl/SdfShader.js +62 -62
  127. package/dist/src/core/shaders/webgl/Shadow.js +83 -83
  128. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js +3 -1
  129. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js.map +1 -1
  130. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/makeRenderWindow.d.ts +20 -0
  131. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/makeRenderWindow.js +55 -0
  132. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/makeRenderWindow.js.map +1 -0
  133. package/dist/src/main-api/ICoreDriver.d.ts +27 -0
  134. package/dist/src/main-api/ICoreDriver.js +20 -0
  135. package/dist/src/main-api/ICoreDriver.js.map +1 -0
  136. package/dist/src/main-api/IRenderDriver.d.ts +20 -0
  137. package/dist/src/main-api/IRenderDriver.js +20 -0
  138. package/dist/src/main-api/IRenderDriver.js.map +1 -0
  139. package/dist/src/main-api/IShaderController.d.ts +14 -0
  140. package/dist/src/main-api/IShaderController.js +30 -0
  141. package/dist/src/main-api/IShaderController.js.map +1 -0
  142. package/dist/src/main-api/IShaderNode.d.ts +17 -0
  143. package/dist/src/main-api/IShaderNode.js +19 -0
  144. package/dist/src/main-api/IShaderNode.js.map +1 -0
  145. package/dist/src/main-api/Inspector.js +1 -1
  146. package/dist/src/main-api/Inspector.js.map +1 -1
  147. package/dist/src/main-api/Renderer.js +2 -3
  148. package/dist/src/main-api/Renderer.js.map +1 -1
  149. package/dist/src/main-api/RendererMain.d.ts +375 -0
  150. package/dist/src/main-api/RendererMain.js +365 -0
  151. package/dist/src/main-api/RendererMain.js.map +1 -0
  152. package/dist/src/main-api/texture-usage-trackers/FinalizationRegistryTextureUsageTracker.d.ts +9 -0
  153. package/dist/src/main-api/texture-usage-trackers/FinalizationRegistryTextureUsageTracker.js +38 -0
  154. package/dist/src/main-api/texture-usage-trackers/FinalizationRegistryTextureUsageTracker.js.map +1 -0
  155. package/dist/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.d.ts +56 -0
  156. package/dist/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.js +101 -0
  157. package/dist/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.js.map +1 -0
  158. package/dist/src/main-api/texture-usage-trackers/TextureUsageTracker.d.ts +32 -0
  159. package/dist/src/main-api/texture-usage-trackers/TextureUsageTracker.js +28 -0
  160. package/dist/src/main-api/texture-usage-trackers/TextureUsageTracker.js.map +1 -0
  161. package/dist/src/render-drivers/main/MainCoreDriver.d.ts +24 -0
  162. package/dist/src/render-drivers/main/MainCoreDriver.js +118 -0
  163. package/dist/src/render-drivers/main/MainCoreDriver.js.map +1 -0
  164. package/dist/src/render-drivers/main/MainOnlyNode.d.ts +99 -0
  165. package/dist/src/render-drivers/main/MainOnlyNode.js +396 -0
  166. package/dist/src/render-drivers/main/MainOnlyNode.js.map +1 -0
  167. package/dist/src/render-drivers/main/MainOnlyShaderController.d.ts +6 -0
  168. package/dist/src/render-drivers/main/MainOnlyShaderController.js +15 -0
  169. package/dist/src/render-drivers/main/MainOnlyShaderController.js.map +1 -0
  170. package/dist/src/render-drivers/main/MainOnlyShaderNode.d.ts +7 -0
  171. package/dist/src/render-drivers/main/MainOnlyShaderNode.js +34 -0
  172. package/dist/src/render-drivers/main/MainOnlyShaderNode.js.map +1 -0
  173. package/dist/src/render-drivers/main/MainOnlyTextNode.d.ts +47 -0
  174. package/dist/src/render-drivers/main/MainOnlyTextNode.js +205 -0
  175. package/dist/src/render-drivers/main/MainOnlyTextNode.js.map +1 -0
  176. package/dist/src/render-drivers/main/MainRenderDriver.d.ts +17 -0
  177. package/dist/src/render-drivers/main/MainRenderDriver.js +88 -0
  178. package/dist/src/render-drivers/main/MainRenderDriver.js.map +1 -0
  179. package/dist/src/render-drivers/threadx/NodeStruct.d.ts +90 -0
  180. package/dist/src/render-drivers/threadx/NodeStruct.js +281 -0
  181. package/dist/src/render-drivers/threadx/NodeStruct.js.map +1 -0
  182. package/dist/src/render-drivers/threadx/SharedNode.d.ts +39 -0
  183. package/dist/src/render-drivers/threadx/SharedNode.js +60 -0
  184. package/dist/src/render-drivers/threadx/SharedNode.js.map +1 -0
  185. package/dist/src/render-drivers/threadx/TextNodeStruct.d.ts +44 -0
  186. package/dist/src/render-drivers/threadx/TextNodeStruct.js +201 -0
  187. package/dist/src/render-drivers/threadx/TextNodeStruct.js.map +1 -0
  188. package/dist/src/render-drivers/threadx/ThreadXCoreDriver.d.ts +28 -0
  189. package/dist/src/render-drivers/threadx/ThreadXCoreDriver.js +234 -0
  190. package/dist/src/render-drivers/threadx/ThreadXCoreDriver.js.map +1 -0
  191. package/dist/src/render-drivers/threadx/ThreadXMainAnimationController.d.ts +20 -0
  192. package/dist/src/render-drivers/threadx/ThreadXMainAnimationController.js +84 -0
  193. package/dist/src/render-drivers/threadx/ThreadXMainAnimationController.js.map +1 -0
  194. package/dist/src/render-drivers/threadx/ThreadXMainNode.d.ts +44 -0
  195. package/dist/src/render-drivers/threadx/ThreadXMainNode.js +154 -0
  196. package/dist/src/render-drivers/threadx/ThreadXMainNode.js.map +1 -0
  197. package/dist/src/render-drivers/threadx/ThreadXMainShaderController.d.ts +6 -0
  198. package/dist/src/render-drivers/threadx/ThreadXMainShaderController.js +16 -0
  199. package/dist/src/render-drivers/threadx/ThreadXMainShaderController.js.map +1 -0
  200. package/dist/src/render-drivers/threadx/ThreadXMainShaderNode.d.ts +7 -0
  201. package/dist/src/render-drivers/threadx/ThreadXMainShaderNode.js +15 -0
  202. package/dist/src/render-drivers/threadx/ThreadXMainShaderNode.js.map +1 -0
  203. package/dist/src/render-drivers/threadx/ThreadXMainTextNode.d.ts +28 -0
  204. package/dist/src/render-drivers/threadx/ThreadXMainTextNode.js +55 -0
  205. package/dist/src/render-drivers/threadx/ThreadXMainTextNode.js.map +1 -0
  206. package/dist/src/render-drivers/threadx/ThreadXRenderDriver.d.ts +21 -0
  207. package/dist/src/render-drivers/threadx/ThreadXRenderDriver.js +198 -0
  208. package/dist/src/render-drivers/threadx/ThreadXRenderDriver.js.map +1 -0
  209. package/dist/src/render-drivers/threadx/ThreadXRendererMessage.d.ts +70 -0
  210. package/dist/src/render-drivers/threadx/ThreadXRendererMessage.js +32 -0
  211. package/dist/src/render-drivers/threadx/ThreadXRendererMessage.js.map +1 -0
  212. package/dist/src/render-drivers/threadx/worker/ThreadXRendererNode.d.ts +19 -0
  213. package/dist/src/render-drivers/threadx/worker/ThreadXRendererNode.js +177 -0
  214. package/dist/src/render-drivers/threadx/worker/ThreadXRendererNode.js.map +1 -0
  215. package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.d.ts +27 -0
  216. package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.js +108 -0
  217. package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.js.map +1 -0
  218. package/dist/src/render-drivers/threadx/worker/renderer.d.ts +1 -0
  219. package/dist/src/render-drivers/threadx/worker/renderer.js +145 -0
  220. package/dist/src/render-drivers/threadx/worker/renderer.js.map +1 -0
  221. package/dist/src/render-drivers/utils.d.ts +12 -0
  222. package/dist/src/render-drivers/utils.js +69 -0
  223. package/dist/src/render-drivers/utils.js.map +1 -0
  224. package/dist/src/utils.d.ts +1 -6
  225. package/dist/src/utils.js +2 -9
  226. package/dist/src/utils.js.map +1 -1
  227. package/dist/tsconfig.dist.tsbuildinfo +1 -1
  228. package/exports/canvas-shaders.ts +28 -28
  229. package/exports/canvas.ts +45 -45
  230. package/exports/index.ts +90 -90
  231. package/exports/inspector.ts +24 -24
  232. package/exports/utils.ts +44 -44
  233. package/exports/webgl-shaders.ts +28 -28
  234. package/exports/webgl.ts +50 -50
  235. package/package.json +2 -2
  236. package/src/common/CommonTypes.ts +146 -146
  237. package/src/common/EventEmitter.ts +77 -77
  238. package/src/common/IAnimationController.ts +92 -92
  239. package/src/common/IEventEmitter.ts +28 -28
  240. package/src/core/CoreNode.test.ts +202 -203
  241. package/src/core/CoreNode.ts +2469 -2494
  242. package/src/core/CoreShaderManager.ts +188 -188
  243. package/src/core/CoreTextNode.ts +448 -448
  244. package/src/core/CoreTextureManager.ts +600 -601
  245. package/src/core/Stage.ts +751 -754
  246. package/src/core/TextureMemoryManager.ts +394 -395
  247. package/src/core/animations/AnimationManager.ts +38 -38
  248. package/src/core/animations/CoreAnimation.ts +284 -284
  249. package/src/core/animations/CoreAnimationController.ts +157 -157
  250. package/src/core/lib/ContextSpy.ts +41 -41
  251. package/src/core/lib/ImageWorker.ts +280 -280
  252. package/src/core/lib/Matrix3d.ts +244 -244
  253. package/src/core/lib/RenderCoords.ts +71 -71
  254. package/src/core/lib/WebGlContextWrapper.ts +1374 -1374
  255. package/src/core/lib/textureCompression.ts +152 -152
  256. package/src/core/lib/textureSvg.ts +78 -78
  257. package/src/core/lib/utils.ts +386 -386
  258. package/src/core/lib/validateImageBitmap.ts +87 -87
  259. package/src/core/platforms/Platform.ts +77 -77
  260. package/src/core/platforms/web/WebPlatform.ts +84 -84
  261. package/src/core/renderers/CoreContextTexture.ts +43 -43
  262. package/src/core/renderers/CoreRenderOp.ts +22 -22
  263. package/src/core/renderers/CoreRenderer.ts +109 -109
  264. package/src/core/renderers/CoreShaderNode.ts +165 -165
  265. package/src/core/renderers/CoreShaderProgram.ts +23 -23
  266. package/src/core/renderers/canvas/CanvasRenderer.ts +298 -298
  267. package/src/core/renderers/canvas/CanvasShaderNode.ts +99 -99
  268. package/src/core/renderers/canvas/CanvasTexture.ts +156 -156
  269. package/src/core/renderers/canvas/internal/C2DShaderUtils.ts +220 -220
  270. package/src/core/renderers/canvas/internal/ColorUtils.ts +85 -85
  271. package/src/core/renderers/webgl/WebGlCtxRenderTexture.ts +86 -86
  272. package/src/core/renderers/webgl/WebGlCtxSubTexture.ts +50 -50
  273. package/src/core/renderers/webgl/WebGlCtxTexture.ts +301 -301
  274. package/src/core/renderers/webgl/WebGlRenderOp.ts +161 -161
  275. package/src/core/renderers/webgl/WebGlRenderer.ts +750 -750
  276. package/src/core/renderers/webgl/WebGlShaderNode.ts +437 -437
  277. package/src/core/renderers/webgl/WebGlShaderProgram.ts +318 -318
  278. package/src/core/renderers/webgl/internal/BufferCollection.ts +54 -54
  279. package/src/core/renderers/webgl/internal/RendererUtils.ts +155 -155
  280. package/src/core/renderers/webgl/internal/ShaderUtils.ts +281 -281
  281. package/src/core/renderers/webgl/internal/WebGlUtils.ts +35 -35
  282. package/src/core/shaders/canvas/Border.ts +78 -78
  283. package/src/core/shaders/canvas/HolePunch.ts +62 -62
  284. package/src/core/shaders/canvas/LinearGradient.ts +69 -69
  285. package/src/core/shaders/canvas/RadialGradient.ts +113 -113
  286. package/src/core/shaders/canvas/Rounded.ts +55 -55
  287. package/src/core/shaders/canvas/RoundedWithBorder.ts +72 -68
  288. package/src/core/shaders/canvas/RoundedWithBorderAndShadow.ts +88 -88
  289. package/src/core/shaders/canvas/RoundedWithShadow.ts +69 -69
  290. package/src/core/shaders/canvas/Shadow.ts +52 -52
  291. package/src/core/shaders/canvas/utils/render.ts +151 -151
  292. package/src/core/shaders/templates/BorderTemplate.ts +115 -115
  293. package/src/core/shaders/templates/HolePunchTemplate.ts +82 -82
  294. package/src/core/shaders/templates/LinearGradientTemplate.ts +71 -71
  295. package/src/core/shaders/templates/RadialGradientTemplate.ts +81 -81
  296. package/src/core/shaders/templates/RoundedTemplate.ts +98 -98
  297. package/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.ts +38 -38
  298. package/src/core/shaders/templates/RoundedWithBorderTemplate.ts +35 -35
  299. package/src/core/shaders/templates/RoundedWithShadowTemplate.ts +35 -35
  300. package/src/core/shaders/templates/ShadowTemplate.ts +106 -106
  301. package/src/core/shaders/templates/shaderUtils.ts +47 -47
  302. package/src/core/shaders/webgl/Border.ts +116 -96
  303. package/src/core/shaders/webgl/Default.ts +89 -89
  304. package/src/core/shaders/webgl/DefaultBatched.ts +129 -129
  305. package/src/core/shaders/webgl/HolePunch.ts +78 -78
  306. package/src/core/shaders/webgl/LinearGradient.ts +81 -81
  307. package/src/core/shaders/webgl/RadialGradient.ts +84 -84
  308. package/src/core/shaders/webgl/Rounded.ts +117 -117
  309. package/src/core/shaders/webgl/RoundedWithBorder.ts +144 -114
  310. package/src/core/shaders/webgl/RoundedWithBorderAndShadow.ts +166 -133
  311. package/src/core/shaders/webgl/RoundedWithShadow.ts +98 -98
  312. package/src/core/shaders/webgl/SdfShader.ts +134 -134
  313. package/src/core/shaders/webgl/Shadow.ts +115 -115
  314. package/src/core/text-rendering/TextRenderingUtils.ts +36 -36
  315. package/src/core/text-rendering/TextTextureRendererUtils.ts +263 -263
  316. package/src/core/text-rendering/TrFontManager.ts +183 -183
  317. package/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.ts +176 -176
  318. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.ts +139 -139
  319. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.test.ts +173 -173
  320. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.ts +171 -171
  321. package/src/core/text-rendering/font-face-types/TrFontFace.ts +187 -187
  322. package/src/core/text-rendering/font-face-types/WebTrFontFace.ts +94 -94
  323. package/src/core/text-rendering/font-face-types/utils.ts +39 -39
  324. package/src/core/text-rendering/renderers/CanvasTextRenderer.ts +514 -514
  325. package/src/core/text-rendering/renderers/LightningTextTextureRenderer.ts +863 -863
  326. package/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.ts +849 -846
  327. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.test.ts +48 -48
  328. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.ts +66 -66
  329. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.ts +52 -52
  330. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.ts +32 -32
  331. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.ts +117 -117
  332. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.test.ts +133 -133
  333. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.ts +38 -38
  334. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.ts +497 -497
  335. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.test.ts +49 -49
  336. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.ts +52 -52
  337. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.test.ts +205 -205
  338. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.ts +93 -93
  339. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.ts +40 -40
  340. package/src/core/text-rendering/renderers/TextRenderer.ts +567 -567
  341. package/src/core/textures/ColorTexture.ts +102 -102
  342. package/src/core/textures/ImageTexture.ts +410 -410
  343. package/src/core/textures/NoiseTexture.ts +104 -104
  344. package/src/core/textures/RenderTexture.ts +85 -85
  345. package/src/core/textures/SubTexture.ts +205 -205
  346. package/src/core/textures/Texture.ts +358 -358
  347. package/src/core/utils.ts +227 -227
  348. package/src/env.d.ts +7 -7
  349. package/src/main-api/INode.ts +100 -100
  350. package/src/main-api/Inspector.ts +522 -522
  351. package/src/main-api/Renderer.ts +673 -675
  352. package/src/main-api/utils.ts +45 -45
  353. package/src/utils.ts +267 -267
  354. package/COPYING +0 -1
  355. package/dist/src/core/temp.js +0 -77
  356. package/dist/src/core/temp.js.map +0 -1
  357. package/scripts/please-use-pnpm.js +0 -13
  358. package/src/core/platform.ts +0 -64
  359. /package/dist/src/core/{temp.d.ts → CoreStuff.d.ts} +0 -0
@@ -1,567 +1,567 @@
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
-
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
- /**
322
- * Word Break for text
323
- *
324
- * @remarks
325
- * This property sets how words should break when reaching the end of a line.
326
- *
327
- * - `'normal'`: Use the default line break rule.
328
- * - `'break-all'`: To prevent overflow, word breaks should happen between any two characters.
329
- * - `'break-word'`: To prevent overflow, word breaks should happen between words. If words are too long word breaks happen between any two characters.
330
- *
331
- * @default "normal"
332
- */
333
- wordBreak: 'normal' | 'break-all' | 'break-word';
334
-
335
- zIndex: number;
336
-
337
- debug: Partial<TextRendererDebugProps>;
338
- }
339
-
340
- export type TrPropSetters<StateT = TextRendererState> = {
341
- [key in keyof TrProps]: (state: StateT, value: TrProps[key]) => void;
342
- };
343
-
344
- const trPropSetterDefaults: TrPropSetters = {
345
- x: (state, value) => {
346
- state.props.x = value;
347
- },
348
- y: (state, value) => {
349
- state.props.y = value;
350
- },
351
- width: (state, value) => {
352
- state.props.width = value;
353
- },
354
- height: (state, value) => {
355
- state.props.height = value;
356
- },
357
- color: (state, value) => {
358
- state.props.color = value;
359
- },
360
- zIndex: (state, value) => {
361
- state.props.zIndex = value;
362
- },
363
- fontFamily: (state, value) => {
364
- state.props.fontFamily = value;
365
- },
366
- fontWeight: (state, value) => {
367
- state.props.fontWeight = value;
368
- },
369
- fontStyle: (state, value) => {
370
- state.props.fontStyle = value;
371
- },
372
- fontStretch: (state, value) => {
373
- state.props.fontStretch = value;
374
- },
375
- fontSize: (state, value) => {
376
- state.props.fontSize = value;
377
- },
378
- text: (state, value) => {
379
- state.props.text = value;
380
- },
381
- textAlign: (state, value) => {
382
- state.props.textAlign = value;
383
- },
384
- contain: (state, value) => {
385
- state.props.contain = value;
386
- },
387
- offsetY: (state, value) => {
388
- state.props.offsetY = value;
389
- },
390
- scrollable: (state, value) => {
391
- state.props.scrollable = value;
392
- },
393
- scrollY: (state, value) => {
394
- state.props.scrollY = value;
395
- },
396
- letterSpacing: (state, value) => {
397
- state.props.letterSpacing = value;
398
- },
399
- lineHeight: (state, value) => {
400
- state.props.lineHeight = value;
401
- },
402
- maxLines: (state, value) => {
403
- state.props.maxLines = value;
404
- },
405
- textBaseline: (state, value) => {
406
- state.props.textBaseline = value;
407
- },
408
- verticalAlign: (state, value) => {
409
- state.props.verticalAlign = value;
410
- },
411
- overflowSuffix: (state, value) => {
412
- state.props.overflowSuffix = value;
413
- },
414
- wordBreak: (state, value) => {
415
- state.props.wordBreak = value;
416
- },
417
- debug: (state, value) => {
418
- state.props.debug = value;
419
- },
420
- };
421
-
422
- /**
423
- * Event handler for when text is loaded
424
- *
425
- * @remarks
426
- * Emitted by state.emitter
427
- */
428
- export type TrLoadedEventHandler = (target: any) => void;
429
-
430
- /**
431
- * Event handler for when text failed to load
432
- *
433
- * @remarks
434
- * Emitted by state.emitter
435
- */
436
- export type TrFailedEventHandler = (target: any, error: Error) => void;
437
-
438
- export abstract class TextRenderer<
439
- StateT extends TextRendererState = TextRendererState,
440
- > {
441
- readonly set: Readonly<TrPropSetters<StateT>>;
442
- abstract type: 'canvas' | 'sdf';
443
-
444
- constructor(protected stage: Stage) {
445
- const propSetters = {
446
- ...trPropSetterDefaults,
447
- ...this.getPropertySetters(),
448
- };
449
- // For each prop setter add a wrapper method that checks if the prop is
450
- // different before calling the setter
451
- const propSet = {};
452
- Object.keys(propSetters).forEach((key) => {
453
- Object.defineProperty(propSet, key, {
454
- value: (state: StateT, value: TrProps[keyof TrProps]) => {
455
- // Check if the current prop value is different before calling the setter
456
- if (state.props[key as keyof TrProps] !== value) {
457
- propSetters[key as keyof TrPropSetters](state, value as never);
458
-
459
- // Assume any prop change will require a render
460
- // This ensures that renders are triggered appropriately even with RAF paused
461
- this.stage.requestRender();
462
- }
463
- },
464
- writable: false, // Prevents property from being changed
465
- configurable: false, // Prevents property from being deleted
466
- });
467
- });
468
- this.set = propSet as Readonly<TrPropSetters<StateT>>;
469
- }
470
-
471
- setStatus(state: StateT, status: StateT['status'], error?: Error) {
472
- // Don't emit the same status twice
473
- if (state.status === status) {
474
- return;
475
- }
476
- state.status = status;
477
- state.emitter.emit(status, error);
478
- }
479
-
480
- /**
481
- * Allows the CoreTextNode to communicate changes to the isRenderable state of
482
- * the itself.
483
- *
484
- * @param state
485
- * @param renderable
486
- */
487
- setIsRenderable(state: StateT, renderable: boolean) {
488
- state.isRenderable = renderable;
489
- }
490
-
491
- /**
492
- * Called by constructor to get a map of property setter functions for this renderer.
493
- */
494
- abstract getPropertySetters(): Partial<TrPropSetters<StateT>>;
495
-
496
- /**
497
- * Given text renderer properties (particularly the specific properties related to font selection)
498
- * returns whether or not the renderer can render it.
499
- *
500
- * @param props
501
- */
502
- abstract canRenderFont(props: TrFontProps): boolean;
503
-
504
- /**
505
- * Called by the TrFontManager to find out if a newly added font face is supported
506
- * by this renderer.
507
- *
508
- * @param fontFace
509
- */
510
- abstract isFontFaceSupported(fontFace: TrFontFace): boolean;
511
-
512
- /**
513
- * Called by the TrFontManager to add a font face to the renderer's font registry.
514
- *
515
- * @remarks
516
- * This method MUST ONLY be called for a fontFace that previously passed the
517
- * {@link isFontFaceSupported} check.
518
- *
519
- * @param fontFace
520
- */
521
- abstract addFontFace(fontFace: TrFontFace): void;
522
-
523
- abstract createState(props: TrProps, node: CoreTextNode): StateT;
524
-
525
- /**
526
- * Destroy/Clean up the state object
527
- *
528
- * @remarks
529
- * Opposite of createState(). Frees any event listeners / resources held by
530
- * the state that may not reliably get garbage collected.
531
- *
532
- * @param state
533
- */
534
- destroyState(state: StateT) {
535
- this.setStatus(state, 'destroyed');
536
- state.emitter.removeAllListeners();
537
- }
538
-
539
- /**
540
- * Schedule a state update via queueMicrotask
541
- *
542
- * @remarks
543
- * This method is used to schedule a state update via queueMicrotask. This
544
- * method should be called whenever a state update is needed, and it will
545
- * ensure that the state is only updated once per microtask.
546
- * @param state
547
- * @returns
548
- */
549
- scheduleUpdateState(state: StateT): void {
550
- if (state.updateScheduled) {
551
- return;
552
- }
553
- state.updateScheduled = true;
554
- queueMicrotask(() => {
555
- // If the state has been destroyed, don't update it
556
- if (state.status === 'destroyed') {
557
- return;
558
- }
559
- state.updateScheduled = false;
560
- this.updateState(state);
561
- });
562
- }
563
-
564
- abstract updateState(state: StateT): void;
565
-
566
- renderQuads?(node: CoreTextNode): void;
567
- }
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
+
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
+ /**
322
+ * Word Break for text
323
+ *
324
+ * @remarks
325
+ * This property sets how words should break when reaching the end of a line.
326
+ *
327
+ * - `'normal'`: Use the default line break rule.
328
+ * - `'break-all'`: To prevent overflow, word breaks should happen between any two characters.
329
+ * - `'break-word'`: To prevent overflow, word breaks should happen between words. If words are too long word breaks happen between any two characters.
330
+ *
331
+ * @default "normal"
332
+ */
333
+ wordBreak: 'normal' | 'break-all' | 'break-word';
334
+
335
+ zIndex: number;
336
+
337
+ debug: Partial<TextRendererDebugProps>;
338
+ }
339
+
340
+ export type TrPropSetters<StateT = TextRendererState> = {
341
+ [key in keyof TrProps]: (state: StateT, value: TrProps[key]) => void;
342
+ };
343
+
344
+ const trPropSetterDefaults: TrPropSetters = {
345
+ x: (state, value) => {
346
+ state.props.x = value;
347
+ },
348
+ y: (state, value) => {
349
+ state.props.y = value;
350
+ },
351
+ width: (state, value) => {
352
+ state.props.width = value;
353
+ },
354
+ height: (state, value) => {
355
+ state.props.height = value;
356
+ },
357
+ color: (state, value) => {
358
+ state.props.color = value;
359
+ },
360
+ zIndex: (state, value) => {
361
+ state.props.zIndex = value;
362
+ },
363
+ fontFamily: (state, value) => {
364
+ state.props.fontFamily = value;
365
+ },
366
+ fontWeight: (state, value) => {
367
+ state.props.fontWeight = value;
368
+ },
369
+ fontStyle: (state, value) => {
370
+ state.props.fontStyle = value;
371
+ },
372
+ fontStretch: (state, value) => {
373
+ state.props.fontStretch = value;
374
+ },
375
+ fontSize: (state, value) => {
376
+ state.props.fontSize = value;
377
+ },
378
+ text: (state, value) => {
379
+ state.props.text = value;
380
+ },
381
+ textAlign: (state, value) => {
382
+ state.props.textAlign = value;
383
+ },
384
+ contain: (state, value) => {
385
+ state.props.contain = value;
386
+ },
387
+ offsetY: (state, value) => {
388
+ state.props.offsetY = value;
389
+ },
390
+ scrollable: (state, value) => {
391
+ state.props.scrollable = value;
392
+ },
393
+ scrollY: (state, value) => {
394
+ state.props.scrollY = value;
395
+ },
396
+ letterSpacing: (state, value) => {
397
+ state.props.letterSpacing = value;
398
+ },
399
+ lineHeight: (state, value) => {
400
+ state.props.lineHeight = value;
401
+ },
402
+ maxLines: (state, value) => {
403
+ state.props.maxLines = value;
404
+ },
405
+ textBaseline: (state, value) => {
406
+ state.props.textBaseline = value;
407
+ },
408
+ verticalAlign: (state, value) => {
409
+ state.props.verticalAlign = value;
410
+ },
411
+ overflowSuffix: (state, value) => {
412
+ state.props.overflowSuffix = value;
413
+ },
414
+ wordBreak: (state, value) => {
415
+ state.props.wordBreak = value;
416
+ },
417
+ debug: (state, value) => {
418
+ state.props.debug = value;
419
+ },
420
+ };
421
+
422
+ /**
423
+ * Event handler for when text is loaded
424
+ *
425
+ * @remarks
426
+ * Emitted by state.emitter
427
+ */
428
+ export type TrLoadedEventHandler = (target: any) => void;
429
+
430
+ /**
431
+ * Event handler for when text failed to load
432
+ *
433
+ * @remarks
434
+ * Emitted by state.emitter
435
+ */
436
+ export type TrFailedEventHandler = (target: any, error: Error) => void;
437
+
438
+ export abstract class TextRenderer<
439
+ StateT extends TextRendererState = TextRendererState,
440
+ > {
441
+ readonly set: Readonly<TrPropSetters<StateT>>;
442
+ abstract type: 'canvas' | 'sdf';
443
+
444
+ constructor(protected stage: Stage) {
445
+ const propSetters = {
446
+ ...trPropSetterDefaults,
447
+ ...this.getPropertySetters(),
448
+ };
449
+ // For each prop setter add a wrapper method that checks if the prop is
450
+ // different before calling the setter
451
+ const propSet = {};
452
+ Object.keys(propSetters).forEach((key) => {
453
+ Object.defineProperty(propSet, key, {
454
+ value: (state: StateT, value: TrProps[keyof TrProps]) => {
455
+ // Check if the current prop value is different before calling the setter
456
+ if (state.props[key as keyof TrProps] !== value) {
457
+ propSetters[key as keyof TrPropSetters](state, value as never);
458
+
459
+ // Assume any prop change will require a render
460
+ // This ensures that renders are triggered appropriately even with RAF paused
461
+ this.stage.requestRender();
462
+ }
463
+ },
464
+ writable: false, // Prevents property from being changed
465
+ configurable: false, // Prevents property from being deleted
466
+ });
467
+ });
468
+ this.set = propSet as Readonly<TrPropSetters<StateT>>;
469
+ }
470
+
471
+ setStatus(state: StateT, status: StateT['status'], error?: Error) {
472
+ // Don't emit the same status twice
473
+ if (state.status === status) {
474
+ return;
475
+ }
476
+ state.status = status;
477
+ state.emitter.emit(status, error);
478
+ }
479
+
480
+ /**
481
+ * Allows the CoreTextNode to communicate changes to the isRenderable state of
482
+ * the itself.
483
+ *
484
+ * @param state
485
+ * @param renderable
486
+ */
487
+ setIsRenderable(state: StateT, renderable: boolean) {
488
+ state.isRenderable = renderable;
489
+ }
490
+
491
+ /**
492
+ * Called by constructor to get a map of property setter functions for this renderer.
493
+ */
494
+ abstract getPropertySetters(): Partial<TrPropSetters<StateT>>;
495
+
496
+ /**
497
+ * Given text renderer properties (particularly the specific properties related to font selection)
498
+ * returns whether or not the renderer can render it.
499
+ *
500
+ * @param props
501
+ */
502
+ abstract canRenderFont(props: TrFontProps): boolean;
503
+
504
+ /**
505
+ * Called by the TrFontManager to find out if a newly added font face is supported
506
+ * by this renderer.
507
+ *
508
+ * @param fontFace
509
+ */
510
+ abstract isFontFaceSupported(fontFace: TrFontFace): boolean;
511
+
512
+ /**
513
+ * Called by the TrFontManager to add a font face to the renderer's font registry.
514
+ *
515
+ * @remarks
516
+ * This method MUST ONLY be called for a fontFace that previously passed the
517
+ * {@link isFontFaceSupported} check.
518
+ *
519
+ * @param fontFace
520
+ */
521
+ abstract addFontFace(fontFace: TrFontFace): void;
522
+
523
+ abstract createState(props: TrProps, node: CoreTextNode): StateT;
524
+
525
+ /**
526
+ * Destroy/Clean up the state object
527
+ *
528
+ * @remarks
529
+ * Opposite of createState(). Frees any event listeners / resources held by
530
+ * the state that may not reliably get garbage collected.
531
+ *
532
+ * @param state
533
+ */
534
+ destroyState(state: StateT) {
535
+ this.setStatus(state, 'destroyed');
536
+ state.emitter.removeAllListeners();
537
+ }
538
+
539
+ /**
540
+ * Schedule a state update via queueMicrotask
541
+ *
542
+ * @remarks
543
+ * This method is used to schedule a state update via queueMicrotask. This
544
+ * method should be called whenever a state update is needed, and it will
545
+ * ensure that the state is only updated once per microtask.
546
+ * @param state
547
+ * @returns
548
+ */
549
+ scheduleUpdateState(state: StateT): void {
550
+ if (state.updateScheduled) {
551
+ return;
552
+ }
553
+ state.updateScheduled = true;
554
+ queueMicrotask(() => {
555
+ // If the state has been destroyed, don't update it
556
+ if (state.status === 'destroyed') {
557
+ return;
558
+ }
559
+ state.updateScheduled = false;
560
+ this.updateState(state);
561
+ });
562
+ }
563
+
564
+ abstract updateState(state: StateT): void;
565
+
566
+ renderQuads?(node: CoreTextNode): void;
567
+ }