@lightningjs/renderer 0.3.0 → 0.3.2

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 (295) hide show
  1. package/NOTICE +1 -2
  2. package/dist/exports/core-api.js +1 -1
  3. package/dist/exports/main-api.js +1 -1
  4. package/dist/exports/utils.js +1 -1
  5. package/dist/src/common/CommonTypes.js +1 -1
  6. package/dist/src/common/EventEmitter.js +1 -1
  7. package/dist/src/common/IAnimationController.js +1 -1
  8. package/dist/src/core/CoreExtension.js +1 -1
  9. package/dist/src/core/CoreNode.d.ts +5 -1
  10. package/dist/src/core/CoreNode.js +9 -2
  11. package/dist/src/core/CoreNode.js.map +1 -1
  12. package/dist/src/core/CoreTextNode.d.ts +2 -1
  13. package/dist/src/core/CoreTextNode.js +3 -3
  14. package/dist/src/core/CoreTextNode.js.map +1 -1
  15. package/dist/src/core/CoreTextureManager.js +1 -1
  16. package/dist/src/core/Matrix2DContext.js +1 -1
  17. package/dist/src/core/Stage.d.ts +2 -1
  18. package/dist/src/core/Stage.js +20 -6
  19. package/dist/src/core/Stage.js.map +1 -1
  20. package/dist/src/core/animations/AnimationManager.js +1 -1
  21. package/dist/src/core/animations/CoreAnimation.js +1 -1
  22. package/dist/src/core/animations/CoreAnimationController.js +1 -1
  23. package/dist/src/core/lib/glm/common.js +1 -1
  24. package/dist/src/core/lib/glm/index.js +1 -1
  25. package/dist/src/core/lib/glm/mat2.js +1 -1
  26. package/dist/src/core/lib/glm/mat2d.js +1 -1
  27. package/dist/src/core/lib/glm/mat3.js +1 -1
  28. package/dist/src/core/lib/glm/mat4.js +1 -1
  29. package/dist/src/core/lib/glm/quat.js +1 -1
  30. package/dist/src/core/lib/glm/quat2.js +1 -1
  31. package/dist/src/core/lib/glm/vec2.js +1 -1
  32. package/dist/src/core/lib/glm/vec3.js +1 -1
  33. package/dist/src/core/lib/glm/vec4.js +1 -1
  34. package/dist/src/core/lib/utils.d.ts +1 -0
  35. package/dist/src/core/lib/utils.js +10 -1
  36. package/dist/src/core/lib/utils.js.map +1 -1
  37. package/dist/src/core/platform.js +1 -1
  38. package/dist/src/core/renderers/CoreContextTexture.js +1 -1
  39. package/dist/src/core/renderers/CoreRenderOp.js +1 -1
  40. package/dist/src/core/renderers/CoreRenderer.d.ts +2 -0
  41. package/dist/src/core/renderers/CoreRenderer.js +1 -1
  42. package/dist/src/core/renderers/CoreRenderer.js.map +1 -1
  43. package/dist/src/core/renderers/CoreShader.d.ts +2 -2
  44. package/dist/src/core/renderers/CoreShader.js +1 -1
  45. package/dist/src/core/renderers/CoreShader.js.map +1 -1
  46. package/dist/src/core/renderers/webgl/WebGlCoreCtxSubTexture.js +1 -1
  47. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js +1 -1
  48. package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.d.ts +4 -1
  49. package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.js +22 -4
  50. package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.js.map +1 -1
  51. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.d.ts +2 -2
  52. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js +29 -15
  53. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js.map +1 -1
  54. package/dist/src/core/renderers/webgl/WebGlCoreShader.d.ts +46 -3
  55. package/dist/src/core/renderers/webgl/WebGlCoreShader.js +44 -9
  56. package/dist/src/core/renderers/webgl/WebGlCoreShader.js.map +1 -1
  57. package/dist/src/core/renderers/webgl/internal/BufferCollection.js +1 -1
  58. package/dist/src/core/renderers/webgl/internal/RendererUtils.js +1 -1
  59. package/dist/src/core/renderers/webgl/internal/ShaderUtils.js +1 -1
  60. package/dist/src/core/renderers/webgl/internal/WebGlUtils.js +1 -1
  61. package/dist/src/core/renderers/webgl/shaders/DefaultShader.js +1 -1
  62. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.js +1 -1
  63. package/dist/src/core/renderers/webgl/shaders/DynamicShader.d.ts +8 -6
  64. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js +20 -13
  65. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js.map +1 -1
  66. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.d.ts +5 -6
  67. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.js +12 -11
  68. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.js.map +1 -1
  69. package/dist/src/core/renderers/webgl/shaders/SdfShader.d.ts +1 -1
  70. package/dist/src/core/renderers/webgl/shaders/SdfShader.js +1 -1
  71. package/dist/src/core/renderers/webgl/shaders/SdfShader.js.map +1 -1
  72. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.d.ts +16 -0
  73. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.js +5 -2
  74. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.js.map +1 -1
  75. package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.d.ts +16 -0
  76. package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.js +5 -2
  77. package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.js.map +1 -1
  78. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.d.ts +16 -0
  79. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.js +5 -2
  80. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.js.map +1 -1
  81. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.d.ts +16 -0
  82. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.js +5 -2
  83. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.js.map +1 -1
  84. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.d.ts +16 -0
  85. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.js +5 -2
  86. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.js.map +1 -1
  87. package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.js +1 -1
  88. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.d.ts +12 -0
  89. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.js +100 -0
  90. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.js.map +1 -0
  91. package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.d.ts +28 -0
  92. package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.js +3 -0
  93. package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.js.map +1 -1
  94. package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.d.ts +3 -0
  95. package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.js +4 -1
  96. package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.js.map +1 -1
  97. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.d.ts +19 -0
  98. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js +5 -2
  99. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js.map +1 -1
  100. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.d.ts +38 -0
  101. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js +116 -0
  102. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js.map +1 -0
  103. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.d.ts +11 -0
  104. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.js +4 -1
  105. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.js.map +1 -1
  106. package/dist/src/core/scene/Scene.js +1 -1
  107. package/dist/src/core/text-rendering/TextTextureRendererUtils.js +1 -1
  108. package/dist/src/core/text-rendering/TrFontManager.js +1 -1
  109. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js +1 -1
  110. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.js +1 -1
  111. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.js +1 -1
  112. package/dist/src/core/text-rendering/font-face-types/TrFontFace.js +1 -1
  113. package/dist/src/core/text-rendering/font-face-types/WebTrFontFace.js +1 -1
  114. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.d.ts +2 -2
  115. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js +5 -2
  116. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js.map +1 -1
  117. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js +1 -1
  118. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.d.ts +2 -2
  119. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js +3 -3
  120. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js.map +1 -1
  121. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.js +1 -1
  122. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.js +1 -1
  123. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.js +1 -1
  124. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.js +1 -1
  125. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.js +1 -1
  126. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js +1 -1
  127. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/makeRenderWindow.js +1 -1
  128. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.js +1 -1
  129. package/dist/src/core/text-rendering/renderers/TextRenderer.d.ts +2 -1
  130. package/dist/src/core/text-rendering/renderers/TextRenderer.js +1 -1
  131. package/dist/src/core/text-rendering/renderers/TextRenderer.js.map +1 -1
  132. package/dist/src/core/textures/ColorTexture.js +1 -1
  133. package/dist/src/core/textures/ImageTexture.js +1 -1
  134. package/dist/src/core/textures/NoiseTexture.js +1 -1
  135. package/dist/src/core/textures/SubTexture.js +1 -1
  136. package/dist/src/core/textures/Texture.js +1 -1
  137. package/dist/src/core/utils.js +1 -1
  138. package/dist/src/main-api/INode.d.ts +19 -0
  139. package/dist/src/main-api/INode.js +1 -1
  140. package/dist/src/main-api/IRenderDriver.js +1 -1
  141. package/dist/src/main-api/RendererMain.d.ts +1 -1
  142. package/dist/src/main-api/RendererMain.js +2 -1
  143. package/dist/src/main-api/RendererMain.js.map +1 -1
  144. package/dist/src/main-api/TextureRegistry.d.ts +33 -0
  145. package/dist/src/main-api/TextureRegistry.js +97 -0
  146. package/dist/src/main-api/TextureRegistry.js.map +1 -0
  147. package/dist/src/main-api/TextureUsageRegistry/TextureRegistry.d.ts +33 -0
  148. package/dist/src/main-api/TextureUsageRegistry/TextureRegistry.js +97 -0
  149. package/dist/src/main-api/TextureUsageRegistry/TextureRegistry.js.map +1 -0
  150. package/dist/src/main-api/texture-usage-trackers/FinalizationRegistryTextureUsageTracker.d.ts +9 -0
  151. package/dist/src/main-api/texture-usage-trackers/FinalizationRegistryTextureUsageTracker.js +38 -0
  152. package/dist/src/main-api/texture-usage-trackers/FinalizationRegistryTextureUsageTracker.js.map +1 -0
  153. package/dist/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.d.ts +56 -0
  154. package/dist/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.js +101 -0
  155. package/dist/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.js.map +1 -0
  156. package/dist/src/main-api/texture-usage-trackers/TextureUsageTracker.d.ts +32 -0
  157. package/dist/src/main-api/texture-usage-trackers/TextureUsageTracker.js +28 -0
  158. package/dist/src/main-api/texture-usage-trackers/TextureUsageTracker.js.map +1 -0
  159. package/dist/src/render-drivers/main/MainOnlyNode.d.ts +2 -0
  160. package/dist/src/render-drivers/main/MainOnlyNode.js +8 -1
  161. package/dist/src/render-drivers/main/MainOnlyNode.js.map +1 -1
  162. package/dist/src/render-drivers/main/MainOnlyTextNode.js +2 -1
  163. package/dist/src/render-drivers/main/MainOnlyTextNode.js.map +1 -1
  164. package/dist/src/render-drivers/main/MainRenderDriver.js +1 -1
  165. package/dist/src/render-drivers/threadx/NodeStruct.d.ts +3 -0
  166. package/dist/src/render-drivers/threadx/NodeStruct.js +10 -1
  167. package/dist/src/render-drivers/threadx/NodeStruct.js.map +1 -1
  168. package/dist/src/render-drivers/threadx/SharedNode.d.ts +1 -0
  169. package/dist/src/render-drivers/threadx/SharedNode.js +2 -1
  170. package/dist/src/render-drivers/threadx/SharedNode.js.map +1 -1
  171. package/dist/src/render-drivers/threadx/TextNodeStruct.js +1 -1
  172. package/dist/src/render-drivers/threadx/ThreadXMainAnimationController.js +1 -1
  173. package/dist/src/render-drivers/threadx/ThreadXMainNode.js +1 -1
  174. package/dist/src/render-drivers/threadx/ThreadXMainTextNode.js +1 -1
  175. package/dist/src/render-drivers/threadx/ThreadXRenderDriver.js +3 -1
  176. package/dist/src/render-drivers/threadx/ThreadXRenderDriver.js.map +1 -1
  177. package/dist/src/render-drivers/threadx/ThreadXRendererMessage.js +1 -1
  178. package/dist/src/render-drivers/threadx/worker/ThreadXRendererNode.js +2 -1
  179. package/dist/src/render-drivers/threadx/worker/ThreadXRendererNode.js.map +1 -1
  180. package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.js +2 -1
  181. package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.js.map +1 -1
  182. package/dist/src/render-drivers/threadx/worker/renderer.js +2 -1
  183. package/dist/src/render-drivers/threadx/worker/renderer.js.map +1 -1
  184. package/dist/src/utils.d.ts +10 -2
  185. package/dist/src/utils.js +13 -3
  186. package/dist/src/utils.js.map +1 -1
  187. package/dist/tsconfig.dist.tsbuildinfo +1 -1
  188. package/package.json +6 -5
  189. package/src/common/CommonTypes.ts +70 -0
  190. package/src/common/EventEmitter.ts +77 -0
  191. package/src/common/IAnimationController.ts +29 -0
  192. package/src/core/CoreExtension.ts +32 -0
  193. package/src/core/CoreNode.ts +700 -0
  194. package/src/core/CoreShaderManager.ts +111 -0
  195. package/src/core/CoreTextNode.ts +342 -0
  196. package/src/core/CoreTextureManager.ts +323 -0
  197. package/src/core/Matrix2DContext.ts +52 -0
  198. package/src/core/Stage.ts +280 -0
  199. package/src/core/animations/AnimationManager.ts +38 -0
  200. package/src/core/animations/CoreAnimation.ts +139 -0
  201. package/src/core/animations/CoreAnimationController.ts +117 -0
  202. package/src/core/lib/glm/common.ts +231 -0
  203. package/src/core/lib/glm/index.ts +31 -0
  204. package/src/core/lib/glm/mat2.ts +499 -0
  205. package/src/core/lib/glm/mat2d.ts +547 -0
  206. package/src/core/lib/glm/mat3.ts +849 -0
  207. package/src/core/lib/glm/mat4.ts +2169 -0
  208. package/src/core/lib/glm/quat.ts +828 -0
  209. package/src/core/lib/glm/quat2.ts +951 -0
  210. package/src/core/lib/glm/vec2.ts +671 -0
  211. package/src/core/lib/glm/vec3.ts +859 -0
  212. package/src/core/lib/glm/vec4.ts +708 -0
  213. package/src/core/lib/utils.ts +144 -0
  214. package/src/core/platform.ts +40 -0
  215. package/src/core/renderers/CoreContextTexture.ts +30 -0
  216. package/src/core/renderers/CoreRenderOp.ts +22 -0
  217. package/src/core/renderers/CoreRenderer.ts +66 -0
  218. package/src/core/renderers/CoreShader.ts +41 -0
  219. package/src/core/renderers/webgl/WebGlCoreCtxSubTexture.ts +36 -0
  220. package/src/core/renderers/webgl/WebGlCoreCtxTexture.ts +208 -0
  221. package/src/core/renderers/webgl/WebGlCoreRenderOp.ts +111 -0
  222. package/src/core/renderers/webgl/WebGlCoreRenderer.ts +567 -0
  223. package/src/core/renderers/webgl/WebGlCoreShader.ts +328 -0
  224. package/src/core/renderers/webgl/internal/BufferCollection.ts +54 -0
  225. package/src/core/renderers/webgl/internal/RendererUtils.ts +134 -0
  226. package/src/core/renderers/webgl/internal/ShaderUtils.ts +135 -0
  227. package/src/core/renderers/webgl/internal/WebGlUtils.ts +35 -0
  228. package/src/core/renderers/webgl/shaders/DefaultShader.ts +95 -0
  229. package/src/core/renderers/webgl/shaders/DefaultShaderBatched.ts +132 -0
  230. package/src/core/renderers/webgl/shaders/DynamicShader.ts +430 -0
  231. package/src/core/renderers/webgl/shaders/RoundedRectangle.ts +168 -0
  232. package/src/core/renderers/webgl/shaders/SdfShader.ts +165 -0
  233. package/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.ts +101 -0
  234. package/src/core/renderers/webgl/shaders/effects/BorderEffect.ts +86 -0
  235. package/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.ts +101 -0
  236. package/src/core/renderers/webgl/shaders/effects/BorderRightEffect.ts +101 -0
  237. package/src/core/renderers/webgl/shaders/effects/BorderTopEffect.ts +101 -0
  238. package/src/core/renderers/webgl/shaders/effects/EffectUtils.ts +33 -0
  239. package/src/core/renderers/webgl/shaders/effects/FadeOutEffect.ts +111 -0
  240. package/src/core/renderers/webgl/shaders/effects/GlitchEffect.ts +145 -0
  241. package/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.ts +37 -0
  242. package/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.ts +182 -0
  243. package/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.ts +159 -0
  244. package/src/core/renderers/webgl/shaders/effects/RadiusEffect.ts +106 -0
  245. package/src/core/renderers/webgl/shaders/effects/ShaderEffect.ts +114 -0
  246. package/src/core/scene/Scene.ts +120 -0
  247. package/src/core/text-rendering/TextTextureRendererUtils.ts +189 -0
  248. package/src/core/text-rendering/TrFontManager.ts +96 -0
  249. package/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.ts +128 -0
  250. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.ts +139 -0
  251. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.test.ts +159 -0
  252. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.ts +164 -0
  253. package/src/core/text-rendering/font-face-types/TrFontFace.ts +105 -0
  254. package/src/core/text-rendering/font-face-types/WebTrFontFace.ts +77 -0
  255. package/src/core/text-rendering/renderers/CanvasTextRenderer.ts +634 -0
  256. package/src/core/text-rendering/renderers/LightningTextTextureRenderer.ts +705 -0
  257. package/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.ts +647 -0
  258. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.test.ts +48 -0
  259. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.ts +66 -0
  260. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.ts +52 -0
  261. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.ts +32 -0
  262. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.ts +76 -0
  263. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.test.ts +133 -0
  264. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.ts +38 -0
  265. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.ts +381 -0
  266. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/makeRenderWindow.test.ts +136 -0
  267. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/makeRenderWindow.ts +64 -0
  268. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.test.ts +41 -0
  269. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.ts +51 -0
  270. package/src/core/text-rendering/renderers/TextRenderer.ts +371 -0
  271. package/src/core/textures/ColorTexture.ts +85 -0
  272. package/src/core/textures/ImageTexture.ts +113 -0
  273. package/src/core/textures/NoiseTexture.ts +96 -0
  274. package/src/core/textures/SubTexture.ts +140 -0
  275. package/src/core/textures/Texture.ts +162 -0
  276. package/src/core/utils.ts +222 -0
  277. package/src/main-api/INode.ts +443 -0
  278. package/src/main-api/IRenderDriver.ts +58 -0
  279. package/src/main-api/RendererMain.ts +451 -0
  280. package/src/render-drivers/main/MainOnlyNode.ts +429 -0
  281. package/src/render-drivers/main/MainOnlyTextNode.ts +220 -0
  282. package/src/render-drivers/main/MainRenderDriver.ts +117 -0
  283. package/src/render-drivers/threadx/NodeStruct.ts +290 -0
  284. package/src/render-drivers/threadx/SharedNode.ts +95 -0
  285. package/src/render-drivers/threadx/TextNodeStruct.ts +166 -0
  286. package/src/render-drivers/threadx/ThreadXMainAnimationController.ts +99 -0
  287. package/src/render-drivers/threadx/ThreadXMainNode.ts +151 -0
  288. package/src/render-drivers/threadx/ThreadXMainTextNode.ts +75 -0
  289. package/src/render-drivers/threadx/ThreadXRenderDriver.ts +247 -0
  290. package/src/render-drivers/threadx/ThreadXRendererMessage.ts +82 -0
  291. package/src/render-drivers/threadx/worker/ThreadXRendererNode.ts +232 -0
  292. package/src/render-drivers/threadx/worker/ThreadXRendererTextNode.ts +146 -0
  293. package/src/render-drivers/threadx/worker/renderer.ts +138 -0
  294. package/src/render-drivers/utils.ts +57 -0
  295. package/src/utils.ts +202 -0
@@ -0,0 +1,705 @@
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
+ /* eslint-disable @typescript-eslint/no-non-null-assertion */
21
+
22
+ import { getRgbaString, type RGBA } from '../../lib/utils.js';
23
+
24
+ const MAX_TEXTURE_DIMENSION = 2048;
25
+
26
+ /**
27
+ * Text Overflow Values
28
+ */
29
+ export type TextOverflow =
30
+ | 'ellipsis'
31
+ | 'clip'
32
+ | (string & Record<never, never>);
33
+
34
+ /***
35
+ * Text Horizontal Align Values
36
+ */
37
+ export type TextAlign = 'left' | 'center' | 'right';
38
+
39
+ /***
40
+ * Text Baseline Values
41
+ */
42
+ export type TextBaseline =
43
+ | 'alphabetic'
44
+ | 'top'
45
+ | 'hanging'
46
+ | 'middle'
47
+ | 'ideographic'
48
+ | 'bottom';
49
+
50
+ /***
51
+ * Text Vertical Align Values
52
+ */
53
+ export type TextVerticalAlign = 'top' | 'middle' | 'bottom';
54
+
55
+ /**
56
+ * Text Texture Settings
57
+ */
58
+ export interface Settings {
59
+ w: number;
60
+ h: number;
61
+ text: string;
62
+ fontStyle: string;
63
+ fontSize: number;
64
+ fontBaselineRatio: number;
65
+ fontFace: string | null;
66
+ wordWrap: boolean;
67
+ wordWrapWidth: number;
68
+ wordBreak: boolean;
69
+ textOverflow: TextOverflow | null;
70
+ lineHeight: number | null;
71
+ textBaseline: TextBaseline;
72
+ textAlign: TextAlign;
73
+ verticalAlign: TextVerticalAlign;
74
+ offsetY: number | null;
75
+ maxLines: number;
76
+ maxLinesSuffix: string;
77
+ precision: number;
78
+ textColor: RGBA;
79
+ paddingLeft: number;
80
+ paddingRight: number;
81
+ shadow: boolean;
82
+ shadowColor: RGBA;
83
+ shadowOffsetX: number;
84
+ shadowOffsetY: number;
85
+ shadowBlur: number;
86
+ highlight: boolean;
87
+ highlightHeight: number;
88
+ highlightColor: RGBA;
89
+ highlightOffset: number;
90
+ highlightPaddingLeft: number;
91
+ highlightPaddingRight: number;
92
+ letterSpacing: number;
93
+ textIndent: number;
94
+ cutSx: number;
95
+ cutSy: number;
96
+ cutEx: number;
97
+ cutEy: number;
98
+ advancedRenderer: boolean;
99
+
100
+ // Normally stage options
101
+ textRenderIssueMargin: number;
102
+ }
103
+
104
+ export interface RenderInfo {
105
+ w: number;
106
+ h: number;
107
+ lines: string[];
108
+ precision: number;
109
+ remainingText: string;
110
+ moreTextLines: boolean;
111
+ width: number;
112
+ innerWidth: number;
113
+ height: number;
114
+ fontSize: number;
115
+ cutSx: number;
116
+ cutSy: number;
117
+ cutEx: number;
118
+ cutEy: number;
119
+ lineHeight: number;
120
+ lineWidths: number[];
121
+ offsetY: number;
122
+ paddingLeft: number;
123
+ paddingRight: number;
124
+ letterSpacing: number;
125
+ textIndent: number;
126
+ }
127
+
128
+ export class LightningTextTextureRenderer {
129
+ private _canvas: OffscreenCanvas;
130
+ private _context: OffscreenCanvasRenderingContext2D;
131
+ private _settings: Settings;
132
+ private renderInfo: RenderInfo | undefined;
133
+
134
+ constructor(
135
+ canvas: OffscreenCanvas,
136
+ context: OffscreenCanvasRenderingContext2D,
137
+ ) {
138
+ this._canvas = canvas;
139
+ this._context = context;
140
+ this._settings = this.mergeDefaults({});
141
+ }
142
+
143
+ set settings(v: Partial<Settings>) {
144
+ this._settings = this.mergeDefaults(v);
145
+ }
146
+
147
+ get settings(): Settings {
148
+ return this._settings;
149
+ }
150
+
151
+ getPrecision() {
152
+ return this._settings.precision;
153
+ }
154
+
155
+ setFontProperties() {
156
+ this._context.font = this._getFontSetting();
157
+ this._context.textBaseline = this._settings.textBaseline;
158
+ }
159
+
160
+ _getFontSetting() {
161
+ const ff = [this._settings.fontFace];
162
+
163
+ const ffs = [];
164
+ for (let i = 0, n = ff.length; i < n; i++) {
165
+ if (ff[i] === 'serif' || ff[i] === 'sans-serif') {
166
+ ffs.push(ff[i]);
167
+ } else {
168
+ ffs.push(`"${ff[i]!}"`);
169
+ }
170
+ }
171
+
172
+ return `${this._settings.fontStyle} ${
173
+ this._settings.fontSize * this.getPrecision()
174
+ }px ${ffs.join(',')}`;
175
+ }
176
+
177
+ _load() {
178
+ if (true && document.fonts) {
179
+ const fontSetting = this._getFontSetting();
180
+ try {
181
+ if (!document.fonts.check(fontSetting, this._settings.text)) {
182
+ // Use a promise that waits for loading.
183
+ return document.fonts
184
+ .load(fontSetting, this._settings.text)
185
+ .catch((err) => {
186
+ // Just load the fallback font.
187
+ console.warn('[Lightning] Font load error', err, fontSetting);
188
+ })
189
+ .then(() => {
190
+ if (!document.fonts.check(fontSetting, this._settings.text)) {
191
+ console.warn('[Lightning] Font not found', fontSetting);
192
+ }
193
+ });
194
+ }
195
+ } catch (e) {
196
+ console.warn("[Lightning] Can't check font loading for " + fontSetting);
197
+ }
198
+ }
199
+ }
200
+
201
+ calculateRenderInfo(): RenderInfo {
202
+ const renderInfo: Partial<RenderInfo> = {};
203
+
204
+ const precision = this.getPrecision();
205
+
206
+ const paddingLeft = this._settings.paddingLeft * precision;
207
+ const paddingRight = this._settings.paddingRight * precision;
208
+ const fontSize = this._settings.fontSize * precision;
209
+ let offsetY =
210
+ this._settings.offsetY === null
211
+ ? null
212
+ : this._settings.offsetY * precision;
213
+ let lineHeight = (this._settings.lineHeight || fontSize) * precision;
214
+ const w = this._settings.w * precision;
215
+ const h = this._settings.h * precision;
216
+ let wordWrapWidth = this._settings.wordWrapWidth * precision;
217
+ const cutSx = this._settings.cutSx * precision;
218
+ const cutEx = this._settings.cutEx * precision;
219
+ const cutSy = this._settings.cutSy * precision;
220
+ const cutEy = this._settings.cutEy * precision;
221
+ const letterSpacing = (this._settings.letterSpacing || 0) * precision;
222
+ const textIndent = this._settings.textIndent * precision;
223
+
224
+ // Set font properties.
225
+ this.setFontProperties();
226
+
227
+ // Total width.
228
+ let width = w || 2048 / this.getPrecision();
229
+
230
+ // Inner width.
231
+ let innerWidth = width - paddingLeft;
232
+ if (innerWidth < 10) {
233
+ width += 10 - innerWidth;
234
+ innerWidth = 10;
235
+ }
236
+
237
+ if (!wordWrapWidth) {
238
+ wordWrapWidth = innerWidth;
239
+ }
240
+
241
+ // Text overflow
242
+ if (this._settings.textOverflow && !this._settings.wordWrap) {
243
+ let suffix;
244
+ switch (this._settings.textOverflow) {
245
+ case 'clip':
246
+ suffix = '';
247
+ break;
248
+ case 'ellipsis':
249
+ suffix = this._settings.maxLinesSuffix;
250
+ break;
251
+ default:
252
+ suffix = this._settings.textOverflow;
253
+ }
254
+ this._settings.text = this.wrapWord(
255
+ this._settings.text,
256
+ wordWrapWidth - textIndent,
257
+ suffix,
258
+ );
259
+ }
260
+
261
+ // word wrap
262
+ // preserve original text
263
+ let linesInfo: { n: number[]; l: string[] };
264
+ if (this._settings.wordWrap) {
265
+ linesInfo = this.wrapText(
266
+ this._settings.text,
267
+ wordWrapWidth,
268
+ letterSpacing,
269
+ textIndent,
270
+ );
271
+ } else {
272
+ linesInfo = { l: this._settings.text.split(/(?:\r\n|\r|\n)/), n: [] };
273
+ const n = linesInfo.l.length;
274
+ for (let i = 0; i < n - 1; i++) {
275
+ linesInfo.n.push(i);
276
+ }
277
+ }
278
+ let lines = linesInfo.l;
279
+
280
+ if (this._settings.maxLines && lines.length > this._settings.maxLines) {
281
+ const usedLines = lines.slice(0, this._settings.maxLines);
282
+
283
+ let otherLines = null;
284
+ if (this._settings.maxLinesSuffix) {
285
+ // Wrap again with max lines suffix enabled.
286
+ const w = this._settings.maxLinesSuffix
287
+ ? this.measureText(this._settings.maxLinesSuffix)
288
+ : 0;
289
+ const al = this.wrapText(
290
+ usedLines[usedLines.length - 1]!,
291
+ wordWrapWidth - w,
292
+ letterSpacing,
293
+ textIndent,
294
+ );
295
+ usedLines[usedLines.length - 1] = `${al.l[0]!}${
296
+ this._settings.maxLinesSuffix
297
+ }`;
298
+ otherLines = [al.l.length > 1 ? al.l[1] : ''];
299
+ } else {
300
+ otherLines = [''];
301
+ }
302
+
303
+ // Re-assemble the remaining text.
304
+ let i;
305
+ const n = lines.length;
306
+ let j = 0;
307
+ const m = linesInfo.n.length;
308
+ for (i = this._settings.maxLines; i < n; i++) {
309
+ otherLines[j] += `${otherLines[j] ? ' ' : ''}${lines[i]!}`;
310
+ if (i + 1 < m && linesInfo.n[i + 1]) {
311
+ j++;
312
+ }
313
+ }
314
+
315
+ renderInfo.remainingText = otherLines.join('\n');
316
+
317
+ renderInfo.moreTextLines = true;
318
+
319
+ lines = usedLines;
320
+ } else {
321
+ renderInfo.moreTextLines = false;
322
+ renderInfo.remainingText = '';
323
+ }
324
+
325
+ // calculate text width
326
+ let maxLineWidth = 0;
327
+ const lineWidths: number[] = [];
328
+ for (let i = 0; i < lines.length; i++) {
329
+ const lineWidth =
330
+ this.measureText(lines[i]!, letterSpacing) + (i === 0 ? textIndent : 0);
331
+ lineWidths.push(lineWidth);
332
+ maxLineWidth = Math.max(maxLineWidth, lineWidth);
333
+ }
334
+
335
+ renderInfo.lineWidths = lineWidths;
336
+
337
+ if (!w) {
338
+ // Auto-set width to max text length.
339
+ width = maxLineWidth + paddingLeft + paddingRight;
340
+ innerWidth = maxLineWidth;
341
+ }
342
+
343
+ // calculate text height
344
+ lineHeight = lineHeight || fontSize;
345
+
346
+ let height;
347
+ if (h) {
348
+ height = h;
349
+ } else {
350
+ const baselineOffset =
351
+ this._settings.textBaseline != 'bottom' ? 0.5 * fontSize : 0;
352
+ height =
353
+ lineHeight * (lines.length - 1) +
354
+ baselineOffset +
355
+ Math.max(lineHeight, fontSize) +
356
+ (offsetY || 0);
357
+ }
358
+
359
+ if (offsetY === null) {
360
+ offsetY = fontSize;
361
+ }
362
+
363
+ renderInfo.w = width;
364
+ renderInfo.h = height;
365
+ renderInfo.lines = lines;
366
+ renderInfo.precision = precision;
367
+
368
+ if (!width) {
369
+ // To prevent canvas errors.
370
+ width = 1;
371
+ }
372
+
373
+ if (!height) {
374
+ // To prevent canvas errors.
375
+ height = 1;
376
+ }
377
+
378
+ if (cutSx || cutEx) {
379
+ width = Math.min(width, cutEx - cutSx);
380
+ }
381
+
382
+ if (cutSy || cutEy) {
383
+ height = Math.min(height, cutEy - cutSy);
384
+ }
385
+
386
+ renderInfo.width = width;
387
+ renderInfo.innerWidth = innerWidth;
388
+ renderInfo.height = height;
389
+ renderInfo.fontSize = fontSize;
390
+ renderInfo.cutSx = cutSx;
391
+ renderInfo.cutSy = cutSy;
392
+ renderInfo.cutEx = cutEx;
393
+ renderInfo.cutEy = cutEy;
394
+ renderInfo.lineHeight = lineHeight;
395
+ renderInfo.lineWidths = lineWidths;
396
+ renderInfo.offsetY = offsetY;
397
+ renderInfo.paddingLeft = paddingLeft;
398
+ renderInfo.paddingRight = paddingRight;
399
+ renderInfo.letterSpacing = letterSpacing;
400
+ renderInfo.textIndent = textIndent;
401
+
402
+ return renderInfo as RenderInfo;
403
+ }
404
+
405
+ draw(
406
+ renderInfo: RenderInfo,
407
+ linesOverride?: { lines: string[]; lineWidths: number[] },
408
+ ) {
409
+ const precision = this.getPrecision();
410
+
411
+ // Allow lines to be overriden for partial rendering.
412
+ const lines = linesOverride?.lines || renderInfo.lines;
413
+ const lineWidths = linesOverride?.lineWidths || renderInfo.lineWidths;
414
+ const height = linesOverride
415
+ ? linesOverride.lines.length * renderInfo.lineHeight
416
+ : renderInfo.height;
417
+
418
+ // Add extra margin to prevent issue with clipped text when scaling.
419
+ this._canvas.width = Math.min(
420
+ Math.ceil(renderInfo.width + this._settings.textRenderIssueMargin),
421
+ MAX_TEXTURE_DIMENSION,
422
+ );
423
+ this._canvas.height = Math.min(Math.ceil(height), MAX_TEXTURE_DIMENSION);
424
+
425
+ // Canvas context has been reset.
426
+ this.setFontProperties();
427
+
428
+ if (renderInfo.fontSize >= 128) {
429
+ // WpeWebKit bug: must force compositing because cairo-traps-compositor will not work with text first.
430
+ this._context.globalAlpha = 0.01;
431
+ this._context.fillRect(0, 0, 0.01, 0.01);
432
+ this._context.globalAlpha = 1.0;
433
+ }
434
+
435
+ if (renderInfo.cutSx || renderInfo.cutSy) {
436
+ this._context.translate(-renderInfo.cutSx, -renderInfo.cutSy);
437
+ }
438
+
439
+ let linePositionX;
440
+ let linePositionY;
441
+
442
+ const drawLines = [];
443
+
444
+ // Draw lines line by line.
445
+ for (let i = 0, n = lines.length; i < n; i++) {
446
+ linePositionX = i === 0 ? renderInfo.textIndent : 0;
447
+
448
+ // By default, text is aligned to top
449
+ linePositionY = i * renderInfo.lineHeight + renderInfo.offsetY;
450
+
451
+ if (this._settings.verticalAlign == 'middle') {
452
+ linePositionY += (renderInfo.lineHeight - renderInfo.fontSize) / 2;
453
+ } else if (this._settings.verticalAlign == 'bottom') {
454
+ linePositionY += renderInfo.lineHeight - renderInfo.fontSize;
455
+ }
456
+
457
+ if (this._settings.textAlign === 'right') {
458
+ linePositionX += renderInfo.innerWidth - lineWidths[i]!;
459
+ } else if (this._settings.textAlign === 'center') {
460
+ linePositionX += (renderInfo.innerWidth - lineWidths[i]!) / 2;
461
+ }
462
+ linePositionX += renderInfo.paddingLeft;
463
+
464
+ drawLines.push({
465
+ text: lines[i]!,
466
+ x: linePositionX,
467
+ y: linePositionY,
468
+ w: lineWidths[i]!,
469
+ });
470
+ }
471
+
472
+ // Highlight.
473
+ if (this._settings.highlight) {
474
+ const color = this._settings.highlightColor;
475
+
476
+ const hlHeight =
477
+ this._settings.highlightHeight * precision || renderInfo.fontSize * 1.5;
478
+ const offset = this._settings.highlightOffset * precision;
479
+ const hlPaddingLeft =
480
+ this._settings.highlightPaddingLeft !== null
481
+ ? this._settings.highlightPaddingLeft * precision
482
+ : renderInfo.paddingLeft;
483
+ const hlPaddingRight =
484
+ this._settings.highlightPaddingRight !== null
485
+ ? this._settings.highlightPaddingRight * precision
486
+ : renderInfo.paddingRight;
487
+
488
+ this._context.fillStyle = getRgbaString(color);
489
+ for (let i = 0; i < drawLines.length; i++) {
490
+ const drawLine = drawLines[i]!;
491
+ this._context.fillRect(
492
+ drawLine.x - hlPaddingLeft,
493
+ drawLine.y - renderInfo.offsetY + offset,
494
+ drawLine.w + hlPaddingRight + hlPaddingLeft,
495
+ hlHeight,
496
+ );
497
+ }
498
+ }
499
+
500
+ // Text shadow.
501
+ let prevShadowSettings: null | [string, number, number, number] = null;
502
+ if (this._settings.shadow) {
503
+ prevShadowSettings = [
504
+ this._context.shadowColor,
505
+ this._context.shadowOffsetX,
506
+ this._context.shadowOffsetY,
507
+ this._context.shadowBlur,
508
+ ];
509
+
510
+ this._context.shadowColor = getRgbaString(this._settings.shadowColor);
511
+ this._context.shadowOffsetX = this._settings.shadowOffsetX * precision;
512
+ this._context.shadowOffsetY = this._settings.shadowOffsetY * precision;
513
+ this._context.shadowBlur = this._settings.shadowBlur * precision;
514
+ }
515
+
516
+ this._context.fillStyle = getRgbaString(this._settings.textColor);
517
+ for (let i = 0, n = drawLines.length; i < n; i++) {
518
+ const drawLine = drawLines[i]!;
519
+
520
+ if (renderInfo.letterSpacing === 0) {
521
+ this._context.fillText(drawLine.text, drawLine.x, drawLine.y);
522
+ } else {
523
+ const textSplit = drawLine.text.split('');
524
+ let x = drawLine.x;
525
+ for (let i = 0, j = textSplit.length; i < j; i++) {
526
+ this._context.fillText(textSplit[i]!, x, drawLine.y);
527
+ x += this.measureText(textSplit[i]!, renderInfo.letterSpacing);
528
+ }
529
+ }
530
+ }
531
+
532
+ if (prevShadowSettings) {
533
+ this._context.shadowColor = prevShadowSettings[0];
534
+ this._context.shadowOffsetX = prevShadowSettings[1];
535
+ this._context.shadowOffsetY = prevShadowSettings[2];
536
+ this._context.shadowBlur = prevShadowSettings[3];
537
+ }
538
+
539
+ if (renderInfo.cutSx || renderInfo.cutSy) {
540
+ this._context.translate(renderInfo.cutSx, renderInfo.cutSy);
541
+ }
542
+
543
+ this.renderInfo = renderInfo;
544
+ }
545
+
546
+ wrapWord(word: string, wordWrapWidth: number, suffix: string) {
547
+ const suffixWidth = this._context.measureText(suffix).width;
548
+ const wordLen = word.length;
549
+ const wordWidth = this._context.measureText(word).width;
550
+
551
+ /* If word fits wrapWidth, do nothing */
552
+ if (wordWidth <= wordWrapWidth) {
553
+ return word;
554
+ }
555
+
556
+ /* Make initial guess for text cuttoff */
557
+ let cutoffIndex = Math.floor((wordWrapWidth * wordLen) / wordWidth);
558
+ let truncWordWidth =
559
+ this._context.measureText(word.substring(0, cutoffIndex)).width +
560
+ suffixWidth;
561
+
562
+ /* In case guess was overestimated, shrink it letter by letter. */
563
+ if (truncWordWidth > wordWrapWidth) {
564
+ while (cutoffIndex > 0) {
565
+ truncWordWidth =
566
+ this._context.measureText(word.substring(0, cutoffIndex)).width +
567
+ suffixWidth;
568
+ if (truncWordWidth > wordWrapWidth) {
569
+ cutoffIndex -= 1;
570
+ } else {
571
+ break;
572
+ }
573
+ }
574
+
575
+ /* In case guess was underestimated, extend it letter by letter. */
576
+ } else {
577
+ while (cutoffIndex < wordLen) {
578
+ truncWordWidth =
579
+ this._context.measureText(word.substring(0, cutoffIndex)).width +
580
+ suffixWidth;
581
+ if (truncWordWidth < wordWrapWidth) {
582
+ cutoffIndex += 1;
583
+ } else {
584
+ // Finally, when bound is crossed, retract last letter.
585
+ cutoffIndex -= 1;
586
+ break;
587
+ }
588
+ }
589
+ }
590
+
591
+ /* If wrapWidth is too short to even contain suffix alone, return empty string */
592
+ return (
593
+ word.substring(0, cutoffIndex) +
594
+ (wordWrapWidth >= suffixWidth ? suffix : '')
595
+ );
596
+ }
597
+
598
+ /**
599
+ * Applies newlines to a string to have it optimally fit into the horizontal
600
+ * bounds set by the Text object's wordWrapWidth property.
601
+ */
602
+ wrapText(
603
+ text: string,
604
+ wordWrapWidth: number,
605
+ letterSpacing: number,
606
+ indent = 0,
607
+ ) {
608
+ // Greedy wrapping algorithm that will wrap words as the line grows longer.
609
+ // than its horizontal bounds.
610
+ const lines = text.split(/\r?\n/g);
611
+ let allLines: string[] = [];
612
+ const realNewlines = [];
613
+ for (let i = 0; i < lines.length; i++) {
614
+ const resultLines = [];
615
+ let result = '';
616
+ let spaceLeft = wordWrapWidth - indent;
617
+ const words = lines[i]!.split(' ');
618
+ for (let j = 0; j < words.length; j++) {
619
+ const wordWidth = this.measureText(words[j]!, letterSpacing);
620
+ const wordWidthWithSpace =
621
+ wordWidth + this.measureText(' ', letterSpacing);
622
+ if (j === 0 || wordWidthWithSpace > spaceLeft) {
623
+ // Skip printing the newline if it's the first word of the line that is.
624
+ // greater than the word wrap width.
625
+ if (j > 0) {
626
+ resultLines.push(result);
627
+ result = '';
628
+ }
629
+ result += words[j];
630
+ spaceLeft = wordWrapWidth - wordWidth - (j === 0 ? indent : 0);
631
+ } else {
632
+ spaceLeft -= wordWidthWithSpace;
633
+ result += ` ${words[j]!}`;
634
+ }
635
+ }
636
+
637
+ resultLines.push(result);
638
+ result = '';
639
+
640
+ allLines = allLines.concat(resultLines);
641
+
642
+ if (i < lines.length - 1) {
643
+ realNewlines.push(allLines.length);
644
+ }
645
+ }
646
+
647
+ return { l: allLines, n: realNewlines };
648
+ }
649
+
650
+ measureText(word: string, space = 0) {
651
+ if (!space) {
652
+ return this._context.measureText(word).width;
653
+ }
654
+ return word.split('').reduce((acc, char) => {
655
+ return acc + this._context.measureText(char).width + space;
656
+ }, 0);
657
+ }
658
+
659
+ mergeDefaults(settings: Partial<Settings>): Settings {
660
+ return {
661
+ text: '',
662
+ w: 0,
663
+ h: 0,
664
+ fontStyle: 'normal',
665
+ fontSize: 40,
666
+ fontFace: null,
667
+ wordWrap: true,
668
+ wordWrapWidth: 0,
669
+ wordBreak: false,
670
+ textOverflow: '',
671
+ lineHeight: null,
672
+ textBaseline: 'alphabetic',
673
+ textAlign: 'left',
674
+ verticalAlign: 'top',
675
+ offsetY: null,
676
+ maxLines: 0,
677
+ maxLinesSuffix: '..',
678
+ textColor: [1.0, 1.0, 1.0, 1.0],
679
+ paddingLeft: 0,
680
+ paddingRight: 0,
681
+ shadow: false,
682
+ shadowColor: [0.0, 0.0, 0.0, 1.0],
683
+ shadowOffsetX: 0,
684
+ shadowOffsetY: 0,
685
+ shadowBlur: 5,
686
+ highlight: false,
687
+ highlightHeight: 0,
688
+ highlightColor: [0.0, 0.0, 0.0, 1.0],
689
+ highlightOffset: 0,
690
+ highlightPaddingLeft: 0,
691
+ highlightPaddingRight: 0,
692
+ letterSpacing: 0,
693
+ textIndent: 0,
694
+ cutSx: 0,
695
+ cutEx: 0,
696
+ cutSy: 0,
697
+ cutEy: 0,
698
+ advancedRenderer: false,
699
+ fontBaselineRatio: 0,
700
+ precision: 1,
701
+ textRenderIssueMargin: 0,
702
+ ...settings,
703
+ };
704
+ }
705
+ }