@codexo/exojs 0.8.3 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (317) hide show
  1. package/CHANGELOG.md +107 -0
  2. package/README.md +26 -5
  3. package/dist/esm/animation/Tween.d.ts +20 -3
  4. package/dist/esm/animation/Tween.js +16 -8
  5. package/dist/esm/animation/Tween.js.map +1 -1
  6. package/dist/esm/animation/TweenManager.d.ts +16 -1
  7. package/dist/esm/animation/TweenManager.js +27 -2
  8. package/dist/esm/animation/TweenManager.js.map +1 -1
  9. package/dist/esm/audio/AudioAnalyser.d.ts +2 -0
  10. package/dist/esm/audio/AudioAnalyser.js +24 -9
  11. package/dist/esm/audio/AudioAnalyser.js.map +1 -1
  12. package/dist/esm/audio/AudioBus.d.ts +1 -0
  13. package/dist/esm/audio/AudioBus.js +8 -4
  14. package/dist/esm/audio/AudioBus.js.map +1 -1
  15. package/dist/esm/audio/AudioListener.d.ts +1 -0
  16. package/dist/esm/audio/AudioListener.js +7 -5
  17. package/dist/esm/audio/AudioListener.js.map +1 -1
  18. package/dist/esm/audio/AudioManager.d.ts +8 -2
  19. package/dist/esm/audio/AudioManager.js +14 -1
  20. package/dist/esm/audio/AudioManager.js.map +1 -1
  21. package/dist/esm/audio/BeatDetector.d.ts +2 -0
  22. package/dist/esm/audio/BeatDetector.js +27 -661
  23. package/dist/esm/audio/BeatDetector.js.map +1 -1
  24. package/dist/esm/audio/Music.d.ts +1 -0
  25. package/dist/esm/audio/Music.js +7 -3
  26. package/dist/esm/audio/Music.js.map +1 -1
  27. package/dist/esm/audio/OscillatorSound.d.ts +1 -0
  28. package/dist/esm/audio/OscillatorSound.js +7 -3
  29. package/dist/esm/audio/OscillatorSound.js.map +1 -1
  30. package/dist/esm/audio/Sound.d.ts +1 -0
  31. package/dist/esm/audio/Sound.js +7 -3
  32. package/dist/esm/audio/Sound.js.map +1 -1
  33. package/dist/esm/audio/audio-context.d.ts +2 -2
  34. package/dist/esm/audio/audio-context.js +4 -4
  35. package/dist/esm/audio/audio-context.js.map +1 -1
  36. package/dist/esm/audio/filters/ChorusFilter.d.ts +1 -0
  37. package/dist/esm/audio/filters/ChorusFilter.js +7 -3
  38. package/dist/esm/audio/filters/ChorusFilter.js.map +1 -1
  39. package/dist/esm/audio/filters/CompressorFilter.d.ts +1 -0
  40. package/dist/esm/audio/filters/CompressorFilter.js +7 -3
  41. package/dist/esm/audio/filters/CompressorFilter.js.map +1 -1
  42. package/dist/esm/audio/filters/DelayFilter.d.ts +1 -0
  43. package/dist/esm/audio/filters/DelayFilter.js +7 -3
  44. package/dist/esm/audio/filters/DelayFilter.js.map +1 -1
  45. package/dist/esm/audio/filters/EqualizerFilter.d.ts +1 -0
  46. package/dist/esm/audio/filters/EqualizerFilter.js +7 -3
  47. package/dist/esm/audio/filters/EqualizerFilter.js.map +1 -1
  48. package/dist/esm/audio/filters/GranularFilter.js +1 -86
  49. package/dist/esm/audio/filters/GranularFilter.js.map +1 -1
  50. package/dist/esm/audio/filters/HighpassFilter.d.ts +1 -0
  51. package/dist/esm/audio/filters/HighpassFilter.js +7 -3
  52. package/dist/esm/audio/filters/HighpassFilter.js.map +1 -1
  53. package/dist/esm/audio/filters/LowpassFilter.d.ts +1 -0
  54. package/dist/esm/audio/filters/LowpassFilter.js +7 -3
  55. package/dist/esm/audio/filters/LowpassFilter.js.map +1 -1
  56. package/dist/esm/audio/filters/PitchShiftFilter.js +1 -71
  57. package/dist/esm/audio/filters/PitchShiftFilter.js.map +1 -1
  58. package/dist/esm/audio/filters/ReverbFilter.d.ts +1 -0
  59. package/dist/esm/audio/filters/ReverbFilter.js +7 -3
  60. package/dist/esm/audio/filters/ReverbFilter.js.map +1 -1
  61. package/dist/esm/audio/filters/VocoderFilter.js +1 -89
  62. package/dist/esm/audio/filters/VocoderFilter.js.map +1 -1
  63. package/dist/esm/audio/filters/WorkletFilter.d.ts +2 -0
  64. package/dist/esm/audio/filters/WorkletFilter.js +10 -5
  65. package/dist/esm/audio/filters/WorkletFilter.js.map +1 -1
  66. package/dist/esm/audio/index.d.ts +15 -10
  67. package/dist/esm/audio/worklet/registerWorklet.d.ts +1 -1
  68. package/dist/esm/audio/worklet/registerWorklet.js +2 -2
  69. package/dist/esm/audio/worklet/registerWorklet.js.map +1 -1
  70. package/dist/esm/audio/worklets/beat-detector.worklet.d.ts +1 -0
  71. package/dist/esm/audio/worklets/beat-detector.worklet.js +647 -0
  72. package/dist/esm/audio/worklets/beat-detector.worklet.js.map +1 -0
  73. package/dist/esm/audio/worklets/granular.worklet.d.ts +1 -0
  74. package/dist/esm/audio/worklets/granular.worklet.js +89 -0
  75. package/dist/esm/audio/worklets/granular.worklet.js.map +1 -0
  76. package/dist/esm/audio/worklets/pitch-shift.worklet.d.ts +1 -0
  77. package/dist/esm/audio/worklets/pitch-shift.worklet.js +74 -0
  78. package/dist/esm/audio/worklets/pitch-shift.worklet.js.map +1 -0
  79. package/dist/esm/audio/worklets/vocoder.worklet.d.ts +1 -0
  80. package/dist/esm/audio/worklets/vocoder.worklet.js +92 -0
  81. package/dist/esm/audio/worklets/vocoder.worklet.js.map +1 -0
  82. package/dist/esm/core/Application.d.ts +62 -24
  83. package/dist/esm/core/Application.js +116 -40
  84. package/dist/esm/core/Application.js.map +1 -1
  85. package/dist/esm/core/Color.d.ts +0 -8
  86. package/dist/esm/core/Color.js +0 -24
  87. package/dist/esm/core/Color.js.map +1 -1
  88. package/dist/esm/core/Scene.d.ts +32 -72
  89. package/dist/esm/core/Scene.js +56 -36
  90. package/dist/esm/core/Scene.js.map +1 -1
  91. package/dist/esm/core/SceneManager.d.ts +11 -25
  92. package/dist/esm/core/SceneManager.js +37 -100
  93. package/dist/esm/core/SceneManager.js.map +1 -1
  94. package/dist/esm/core/SceneNode.d.ts +28 -14
  95. package/dist/esm/core/SceneNode.js +66 -33
  96. package/dist/esm/core/SceneNode.js.map +1 -1
  97. package/dist/esm/core/Signal.d.ts +24 -28
  98. package/dist/esm/core/Signal.js +64 -50
  99. package/dist/esm/core/Signal.js.map +1 -1
  100. package/dist/esm/core/Timer.d.ts +1 -0
  101. package/dist/esm/core/Timer.js +3 -0
  102. package/dist/esm/core/Timer.js.map +1 -1
  103. package/dist/esm/debug/BoundingBoxesLayer.js +1 -1
  104. package/dist/esm/debug/BoundingBoxesLayer.js.map +1 -1
  105. package/dist/esm/debug/HitTestLayer.js +1 -1
  106. package/dist/esm/debug/HitTestLayer.js.map +1 -1
  107. package/dist/esm/debug/PerformanceLayer.js +1 -2
  108. package/dist/esm/debug/PerformanceLayer.js.map +1 -1
  109. package/dist/esm/debug/PointerStackLayer.js +1 -2
  110. package/dist/esm/debug/PointerStackLayer.js.map +1 -1
  111. package/dist/esm/debug/RenderPassInspectorLayer.js +1 -2
  112. package/dist/esm/debug/RenderPassInspectorLayer.js.map +1 -1
  113. package/dist/esm/index.js +23 -7
  114. package/dist/esm/index.js.map +1 -1
  115. package/dist/esm/input/InputManager.d.ts +1 -0
  116. package/dist/esm/input/InputManager.js +30 -3
  117. package/dist/esm/input/InputManager.js.map +1 -1
  118. package/dist/esm/input/InteractionManager.d.ts +5 -2
  119. package/dist/esm/input/InteractionManager.js +29 -18
  120. package/dist/esm/input/InteractionManager.js.map +1 -1
  121. package/dist/esm/input/Pointer.js +3 -2
  122. package/dist/esm/input/Pointer.js.map +1 -1
  123. package/dist/esm/input/internal/interactionManagerRegistry.d.ts +9 -0
  124. package/dist/esm/input/internal/interactionManagerRegistry.js +10 -0
  125. package/dist/esm/input/internal/interactionManagerRegistry.js.map +1 -0
  126. package/dist/esm/math/AbstractVector.d.ts +1 -7
  127. package/dist/esm/math/AbstractVector.js +6 -20
  128. package/dist/esm/math/AbstractVector.js.map +1 -1
  129. package/dist/esm/math/Circle.js +0 -2
  130. package/dist/esm/math/Circle.js.map +1 -1
  131. package/dist/esm/math/Collision.d.ts +9 -3
  132. package/dist/esm/math/Ellipse.d.ts +2 -5
  133. package/dist/esm/math/Ellipse.js +10 -7
  134. package/dist/esm/math/Ellipse.js.map +1 -1
  135. package/dist/esm/math/ObservableVector.d.ts +1 -1
  136. package/dist/esm/math/ObservableVector.js +3 -3
  137. package/dist/esm/math/ObservableVector.js.map +1 -1
  138. package/dist/esm/math/Polygon.d.ts +0 -2
  139. package/dist/esm/math/Polygon.js +1 -9
  140. package/dist/esm/math/Polygon.js.map +1 -1
  141. package/dist/esm/math/Rectangle.js +0 -2
  142. package/dist/esm/math/Rectangle.js.map +1 -1
  143. package/dist/esm/math/collision-detection.d.ts +19 -4
  144. package/dist/esm/math/collision-detection.js +61 -4
  145. package/dist/esm/math/collision-detection.js.map +1 -1
  146. package/dist/esm/math/swept-collision.d.ts +16 -12
  147. package/dist/esm/math/swept-collision.js +109 -19
  148. package/dist/esm/math/swept-collision.js.map +1 -1
  149. package/dist/esm/particles/ParticleSystem.js +1 -1
  150. package/dist/esm/particles/ParticleSystem.js.map +1 -1
  151. package/dist/esm/particles/index.d.ts +1 -0
  152. package/dist/esm/rendering/CallbackRenderPass.d.ts +1 -0
  153. package/dist/esm/rendering/CallbackRenderPass.js +1 -0
  154. package/dist/esm/rendering/CallbackRenderPass.js.map +1 -1
  155. package/dist/esm/rendering/Container.d.ts +2 -1
  156. package/dist/esm/rendering/Container.js +17 -16
  157. package/dist/esm/rendering/Container.js.map +1 -1
  158. package/dist/esm/rendering/RenderBackend.d.ts +1 -0
  159. package/dist/esm/rendering/RenderNode.d.ts +1 -3
  160. package/dist/esm/rendering/RenderNode.js +12 -19
  161. package/dist/esm/rendering/RenderNode.js.map +1 -1
  162. package/dist/esm/rendering/RenderPass.d.ts +1 -0
  163. package/dist/esm/rendering/RenderStats.d.ts +9 -0
  164. package/dist/esm/rendering/RenderStats.js +2 -0
  165. package/dist/esm/rendering/RenderStats.js.map +1 -1
  166. package/dist/esm/rendering/RendererRegistry.d.ts +1 -0
  167. package/dist/esm/rendering/RendererRegistry.js +1 -0
  168. package/dist/esm/rendering/RendererRegistry.js.map +1 -1
  169. package/dist/esm/rendering/View.d.ts +23 -0
  170. package/dist/esm/rendering/View.js +42 -0
  171. package/dist/esm/rendering/View.js.map +1 -1
  172. package/dist/esm/rendering/index.d.ts +89 -59
  173. package/dist/esm/rendering/mesh/Mesh.js +1 -1
  174. package/dist/esm/rendering/mesh/Mesh.js.map +1 -1
  175. package/dist/esm/rendering/mesh/MeshShader.d.ts +1 -0
  176. package/dist/esm/rendering/mesh/MeshShader.js +1 -0
  177. package/dist/esm/rendering/mesh/MeshShader.js.map +1 -1
  178. package/dist/esm/rendering/shader/Shader.d.ts +1 -0
  179. package/dist/esm/rendering/shader/Shader.js +1 -0
  180. package/dist/esm/rendering/shader/Shader.js.map +1 -1
  181. package/dist/esm/rendering/shader/ShaderUniform.d.ts +1 -0
  182. package/dist/esm/rendering/shader/ShaderUniform.js +1 -0
  183. package/dist/esm/rendering/shader/ShaderUniform.js.map +1 -1
  184. package/dist/esm/rendering/sprite/Sprite.d.ts +3 -2
  185. package/dist/esm/rendering/sprite/Sprite.js +15 -13
  186. package/dist/esm/rendering/sprite/Sprite.js.map +1 -1
  187. package/dist/esm/rendering/text/AbstractText.d.ts +36 -0
  188. package/dist/esm/rendering/text/AbstractText.js +49 -0
  189. package/dist/esm/rendering/text/AbstractText.js.map +1 -0
  190. package/dist/esm/rendering/text/BitmapText.d.ts +97 -0
  191. package/dist/esm/rendering/text/BitmapText.js +220 -0
  192. package/dist/esm/rendering/text/BitmapText.js.map +1 -0
  193. package/dist/esm/rendering/text/BmFont.d.ts +50 -0
  194. package/dist/esm/rendering/text/BmFont.js +24 -0
  195. package/dist/esm/rendering/text/BmFont.js.map +1 -0
  196. package/dist/esm/rendering/text/GlyphAtlas.d.ts +104 -0
  197. package/dist/esm/rendering/text/GlyphAtlas.js +347 -0
  198. package/dist/esm/rendering/text/GlyphAtlas.js.map +1 -0
  199. package/dist/esm/rendering/text/GlyphAtlasPool.d.ts +40 -0
  200. package/dist/esm/rendering/text/GlyphAtlasPool.js +67 -0
  201. package/dist/esm/rendering/text/GlyphAtlasPool.js.map +1 -0
  202. package/dist/esm/rendering/text/GlyphSdf.d.ts +92 -0
  203. package/dist/esm/rendering/text/GlyphSdf.js +220 -0
  204. package/dist/esm/rendering/text/GlyphSdf.js.map +1 -0
  205. package/dist/esm/rendering/text/HTMLText.d.ts +107 -0
  206. package/dist/esm/rendering/text/HTMLText.js +284 -0
  207. package/dist/esm/rendering/text/HTMLText.js.map +1 -0
  208. package/dist/esm/rendering/text/LayoutOptions.d.ts +30 -0
  209. package/dist/esm/rendering/text/Text.d.ts +89 -20
  210. package/dist/esm/rendering/text/Text.js +176 -101
  211. package/dist/esm/rendering/text/Text.js.map +1 -1
  212. package/dist/esm/rendering/text/TextLayout.d.ts +20 -8
  213. package/dist/esm/rendering/text/TextLayout.js +234 -25
  214. package/dist/esm/rendering/text/TextLayout.js.map +1 -1
  215. package/dist/esm/rendering/text/TextStyle.d.ts +154 -87
  216. package/dist/esm/rendering/text/TextStyle.js +257 -203
  217. package/dist/esm/rendering/text/TextStyle.js.map +1 -1
  218. package/dist/esm/rendering/text/types.d.ts +73 -13
  219. package/dist/esm/rendering/texture/Texture.d.ts +1 -0
  220. package/dist/esm/rendering/texture/Texture.js +1 -0
  221. package/dist/esm/rendering/texture/Texture.js.map +1 -1
  222. package/dist/esm/rendering/types.d.ts +3 -1
  223. package/dist/esm/rendering/types.js +2 -0
  224. package/dist/esm/rendering/types.js.map +1 -1
  225. package/dist/esm/rendering/video/Video.d.ts +2 -1
  226. package/dist/esm/rendering/video/Video.js +9 -5
  227. package/dist/esm/rendering/video/Video.js.map +1 -1
  228. package/dist/esm/rendering/webgl2/WebGl2Backend.js +41 -5
  229. package/dist/esm/rendering/webgl2/WebGl2Backend.js.map +1 -1
  230. package/dist/esm/rendering/webgl2/WebGl2MeshRenderer.js +4 -4
  231. package/dist/esm/rendering/webgl2/WebGl2MeshRenderer.js.map +1 -1
  232. package/dist/esm/rendering/webgl2/WebGl2TextRenderer.d.ts +56 -0
  233. package/dist/esm/rendering/webgl2/WebGl2TextRenderer.js +482 -0
  234. package/dist/esm/rendering/webgl2/WebGl2TextRenderer.js.map +1 -0
  235. package/dist/esm/rendering/webgl2/glsl/text-color.frag.js +4 -0
  236. package/dist/esm/rendering/webgl2/glsl/text-color.frag.js.map +1 -0
  237. package/dist/esm/rendering/webgl2/glsl/text-msdf.frag.js +4 -0
  238. package/dist/esm/rendering/webgl2/glsl/text-msdf.frag.js.map +1 -0
  239. package/dist/esm/rendering/webgl2/glsl/text-sdf.frag.js +4 -0
  240. package/dist/esm/rendering/webgl2/glsl/text-sdf.frag.js.map +1 -0
  241. package/dist/esm/rendering/webgl2/glsl/text.vert.js +4 -0
  242. package/dist/esm/rendering/webgl2/glsl/text.vert.js.map +1 -0
  243. package/dist/esm/rendering/webgpu/WebGpuBackend.js +16 -8
  244. package/dist/esm/rendering/webgpu/WebGpuBackend.js.map +1 -1
  245. package/dist/esm/rendering/webgpu/WebGpuBlendState.js +26 -0
  246. package/dist/esm/rendering/webgpu/WebGpuBlendState.js.map +1 -1
  247. package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.d.ts +2 -2
  248. package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.js +23 -15
  249. package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.js.map +1 -1
  250. package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.js +9 -1
  251. package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.js.map +1 -1
  252. package/dist/esm/rendering/webgpu/WebGpuTextRenderer.d.ts +70 -0
  253. package/dist/esm/rendering/webgpu/WebGpuTextRenderer.js +773 -0
  254. package/dist/esm/rendering/webgpu/WebGpuTextRenderer.js.map +1 -0
  255. package/dist/esm/rendering/webgpu/compute/WebGpuComputePipeline.js +96 -0
  256. package/dist/esm/rendering/webgpu/compute/WebGpuComputePipeline.js.map +1 -0
  257. package/dist/esm/rendering/webgpu/compute/WebGpuStorageBuffer.js +68 -0
  258. package/dist/esm/rendering/webgpu/compute/WebGpuStorageBuffer.js.map +1 -0
  259. package/dist/esm/resources/Asset.d.ts +23 -0
  260. package/dist/esm/resources/Asset.js +23 -0
  261. package/dist/esm/resources/Asset.js.map +1 -0
  262. package/dist/esm/resources/AssetDefinitions.d.ts +137 -0
  263. package/dist/esm/resources/Assets.d.ts +35 -0
  264. package/dist/esm/resources/Assets.js +32 -0
  265. package/dist/esm/resources/Assets.js.map +1 -0
  266. package/dist/esm/resources/IndexedDbDatabase.js +17 -1
  267. package/dist/esm/resources/IndexedDbDatabase.js.map +1 -1
  268. package/dist/esm/resources/IndexedDbStore.js +17 -1
  269. package/dist/esm/resources/IndexedDbStore.js.map +1 -1
  270. package/dist/esm/resources/Loader.d.ts +244 -18
  271. package/dist/esm/resources/Loader.js +456 -50
  272. package/dist/esm/resources/Loader.js.map +1 -1
  273. package/dist/esm/resources/LoadingQueue.d.ts +28 -0
  274. package/dist/esm/resources/LoadingQueue.js +59 -0
  275. package/dist/esm/resources/LoadingQueue.js.map +1 -0
  276. package/dist/esm/resources/factories/BmFontFactory.d.ts +25 -0
  277. package/dist/esm/resources/factories/BmFontFactory.js +96 -0
  278. package/dist/esm/resources/factories/BmFontFactory.js.map +1 -0
  279. package/dist/esm/resources/factories/CsvFactory.d.ts +35 -0
  280. package/dist/esm/resources/factories/CsvFactory.js +87 -0
  281. package/dist/esm/resources/factories/CsvFactory.js.map +1 -0
  282. package/dist/esm/resources/factories/MusicFactory.d.ts +8 -2
  283. package/dist/esm/resources/factories/MusicFactory.js +25 -14
  284. package/dist/esm/resources/factories/MusicFactory.js.map +1 -1
  285. package/dist/esm/resources/factories/SoundFactory.d.ts +2 -2
  286. package/dist/esm/resources/factories/SoundFactory.js.map +1 -1
  287. package/dist/esm/resources/factories/SubtitleFactory.d.ts +28 -0
  288. package/dist/esm/resources/factories/SubtitleFactory.js +203 -0
  289. package/dist/esm/resources/factories/SubtitleFactory.js.map +1 -0
  290. package/dist/esm/resources/factories/SvgFactory.d.ts +18 -1
  291. package/dist/esm/resources/factories/SvgFactory.js +21 -2
  292. package/dist/esm/resources/factories/SvgFactory.js.map +1 -1
  293. package/dist/esm/resources/factories/VideoFactory.d.ts +8 -2
  294. package/dist/esm/resources/factories/VideoFactory.js +27 -20
  295. package/dist/esm/resources/factories/VideoFactory.js.map +1 -1
  296. package/dist/esm/resources/factories/XmlFactory.d.ts +24 -0
  297. package/dist/esm/resources/factories/XmlFactory.js +37 -0
  298. package/dist/esm/resources/factories/XmlFactory.js.map +1 -0
  299. package/dist/esm/resources/index.d.ts +8 -1
  300. package/dist/esm/resources/tokens.d.ts +49 -3
  301. package/dist/esm/resources/tokens.js +50 -4
  302. package/dist/esm/resources/tokens.js.map +1 -1
  303. package/dist/exo.esm.js +6635 -2550
  304. package/dist/exo.esm.js.map +1 -1
  305. package/package.json +19 -6
  306. package/dist/esm/input/interaction-hooks.d.ts +0 -34
  307. package/dist/esm/input/interaction-hooks.js +0 -35
  308. package/dist/esm/input/interaction-hooks.js.map +0 -1
  309. package/dist/esm/rendering/text/DynamicGlyphAtlas.d.ts +0 -33
  310. package/dist/esm/rendering/text/DynamicGlyphAtlas.js +0 -134
  311. package/dist/esm/rendering/text/DynamicGlyphAtlas.js.map +0 -1
  312. package/dist/esm/rendering/text/atlas-singleton.d.ts +0 -7
  313. package/dist/esm/rendering/text/atlas-singleton.js +0 -17
  314. package/dist/esm/rendering/text/atlas-singleton.js.map +0 -1
  315. package/dist/esm/resources/factories/VttFactory.d.ts +0 -24
  316. package/dist/esm/resources/factories/VttFactory.js +0 -158
  317. package/dist/esm/resources/factories/VttFactory.js.map +0 -1
@@ -1,32 +1,101 @@
1
- import { Container } from '@/rendering/Container';
1
+ import { AbstractText } from './AbstractText';
2
+ import type { AtlasMode } from './GlyphAtlas';
3
+ import type { GlyphAtlas } from './GlyphAtlas';
4
+ import { SDF_RADIUS } from './GlyphAtlas';
5
+ import type { LayoutOptions } from './LayoutOptions';
2
6
  import type { TextStyleOptions } from './TextStyle';
3
7
  import { TextStyle } from './TextStyle';
8
+ import type { TextPageQuads, TextSize } from './types';
9
+ export type { TextPageQuads };
4
10
  /**
5
11
  * GPU-accelerated text node that rasterizes individual glyphs into a shared
6
- * atlas ({@link DynamicGlyphAtlas}) and renders them as a single quad-per-
7
- * glyph {@link Mesh} (one draw call per Text instance).
12
+ * per-font-variant {@link GlyphAtlas} using the SDF (Signed Distance Field)
13
+ * technique and renders them through the `text-sdf` shader.
8
14
  *
9
- * Glyphs are always rasterized in white and tinted at runtime via
10
- * `Mesh.tint`; changing `style.fillColor` only updates the mesh tint
11
- * no atlas re-rasterization is needed.
15
+ * Style mutations are applied automatically before the next draw no manual
16
+ * `update()` call required. Mutating `text.style` any number of times in the
17
+ * same frame is cheap; the geometry is rebuilt at most once, on demand.
12
18
  *
13
- * The internal {@link Mesh} is the sole child of this {@link Container}.
14
- * All transform properties (position, rotation, scale, origin) are
15
- * inherited from {@link Container} → {@link RenderNode}.
19
+ * ```ts
20
+ * const label = new Text('Hello', { fontSize: 24 });
21
+ * scene.addChild(label);
22
+ *
23
+ * label.style.fillColor = new Color(255, 0, 0); // cheap — no atlas work
24
+ * label.style.outlineWidth = 0.08; // cheap — only shader uniforms
25
+ * // changes are picked up automatically on the next render pass
26
+ * ```
27
+ *
28
+ * **FontFace-first:** load fonts via {@link FontFactory} before constructing
29
+ * the node, then pass the loaded `FontFace` via the `font` style option. The
30
+ * label renders immediately with the correct glyphs — no async waiting needed.
31
+ *
32
+ * ```ts
33
+ * const face = await loader.load(FontFactory, 'roboto.woff2', { family: 'Roboto' });
34
+ * const label = new Text('Score: 0', { font: face, fontSize: 24 });
35
+ * scene.addChild(label); // renders immediately with Roboto
36
+ * ```
37
+ *
38
+ * Enable colour-glyph (emoji) mode via `colorGlyphs: true` in the constructor
39
+ * options. Colour-glyph nodes use the `text-color` shader instead of `text-sdf`.
40
+ * @stable
16
41
  */
17
- export declare class Text extends Container {
18
- private _text;
42
+ export declare class Text extends AbstractText {
19
43
  private _style;
20
- private _mesh;
21
- constructor(text: string, style?: TextStyle | TextStyleOptions);
22
- get text(): string;
23
- set text(value: string);
44
+ private _layout;
45
+ private _colorGlyphs;
46
+ private _sdfRadius;
47
+ private _atlas;
48
+ private _destroyed;
49
+ private _faceLoadVersion;
50
+ /** Resolves when an in-flight FontFace load finishes. Null when no face load is pending. */
51
+ private _faceLoadPromise;
52
+ /** Per-page quad geometry built by `_rebuild()`. */
53
+ private _pageQuads;
54
+ private _textBounds;
55
+ constructor(text: string, style?: TextStyle | TextStyleOptions, layout?: LayoutOptions, options?: {
56
+ colorGlyphs?: boolean;
57
+ sdfRadius?: number;
58
+ });
24
59
  get style(): TextStyle;
25
- set style(style: TextStyle | TextStyleOptions);
26
- /** Replace the displayed string and rebuild the glyph mesh if the value changed. */
27
- setText(text: string): this;
28
- /** Replace the active style and rebuild the glyph mesh unconditionally. */
29
- setStyle(style: TextStyle | TextStyleOptions): this;
60
+ set style(v: TextStyle | TextStyleOptions);
61
+ get text(): string;
62
+ set text(v: string);
63
+ get layout(): LayoutOptions;
64
+ set layout(v: LayoutOptions);
65
+ /**
66
+ * `true` if this node was constructed with `colorGlyphs: true`.
67
+ * Colour-glyph nodes use a RGBA atlas (emoji / colour fonts) and
68
+ * the `text-color` shader instead of `text-sdf`.
69
+ */
70
+ get colorGlyphs(): boolean;
71
+ /**
72
+ * SDF buffer radius (pixels) used when rasterizing glyphs for this node.
73
+ * Determines the maximum usable outline/shadow reach.
74
+ * Nodes with different radii use separate atlas instances.
75
+ */
76
+ get sdfRadius(): number;
77
+ /**
78
+ * The atlas mode used by this node: `'color'` for colour glyphs,
79
+ * `'sdf'` for standard text.
80
+ */
81
+ get atlasMode(): AtlasMode;
82
+ /** Per-page quad data consumed by the text renderer. */
83
+ get pageQuads(): readonly TextPageQuads[];
84
+ get textBounds(): TextSize;
85
+ /** The {@link GlyphAtlas} this node currently draws from. */
86
+ get atlas(): GlyphAtlas | null;
87
+ syncDirty(): void;
30
88
  destroy(): void;
89
+ /** Extract a {@link FontFace} from raw style options, or return null. */
90
+ private _extractFace;
91
+ /**
92
+ * Register `face` with `document.fonts` if needed, await its load, then
93
+ * clear the relevant atlas slice and rebuild geometry.
94
+ *
95
+ * Uses a version counter to discard stale loads when the style is replaced
96
+ * before the previous face finishes loading.
97
+ */
98
+ private _loadFace;
31
99
  private _rebuild;
32
100
  }
101
+ export { SDF_RADIUS };
@@ -1,132 +1,207 @@
1
- import { Container } from '../Container.js';
2
- import { Mesh } from '../mesh/Mesh.js';
3
- import { getDefaultGlyphAtlas } from './atlas-singleton.js';
4
- import { layoutText } from './TextLayout.js';
1
+ import { AbstractText } from './AbstractText.js';
2
+ import { SDF_RADIUS } from './GlyphAtlas.js';
3
+ import { getDefaultGlyphAtlasPool } from './GlyphAtlasPool.js';
4
+ import { layoutText, buildTextPageQuads } from './TextLayout.js';
5
5
  import { TextStyle } from './TextStyle.js';
6
6
 
7
- function buildMesh(placements, style) {
8
- const n = placements.length;
9
- const vertices = new Float32Array(n * 4 * 2);
10
- const uvs = new Float32Array(n * 4 * 2);
11
- const indices = new Uint16Array(n * 6);
12
- for (let i = 0; i < n; i++) {
13
- const p = placements[i];
14
- const v = i * 8;
15
- const u = i * 8;
16
- const indexBase = i * 6;
17
- const baseV = i * 4;
18
- // Vertices: TL, TR, BR, BL
19
- vertices[v + 0] = p.x;
20
- vertices[v + 1] = p.y;
21
- vertices[v + 2] = p.x + p.width;
22
- vertices[v + 3] = p.y;
23
- vertices[v + 4] = p.x + p.width;
24
- vertices[v + 5] = p.y + p.height;
25
- vertices[v + 6] = p.x;
26
- vertices[v + 7] = p.y + p.height;
27
- // UVs: TL, TR, BR, BL
28
- uvs[u + 0] = p.uvLeft;
29
- uvs[u + 1] = p.uvTop;
30
- uvs[u + 2] = p.uvRight;
31
- uvs[u + 3] = p.uvTop;
32
- uvs[u + 4] = p.uvRight;
33
- uvs[u + 5] = p.uvBottom;
34
- uvs[u + 6] = p.uvLeft;
35
- uvs[u + 7] = p.uvBottom;
36
- // Indices: [TL, TR, BR, TL, BR, BL]
37
- indices[indexBase + 0] = baseV + 0;
38
- indices[indexBase + 1] = baseV + 1;
39
- indices[indexBase + 2] = baseV + 2;
40
- indices[indexBase + 3] = baseV + 0;
41
- indices[indexBase + 4] = baseV + 2;
42
- indices[indexBase + 5] = baseV + 3;
43
- }
44
- const atlas = getDefaultGlyphAtlas();
45
- const mesh = new Mesh({
46
- vertices,
47
- uvs,
48
- indices,
49
- texture: atlas.texture,
50
- });
51
- mesh.tint = style.fillColor;
52
- return mesh;
53
- }
54
7
  /**
55
8
  * GPU-accelerated text node that rasterizes individual glyphs into a shared
56
- * atlas ({@link DynamicGlyphAtlas}) and renders them as a single quad-per-
57
- * glyph {@link Mesh} (one draw call per Text instance).
9
+ * per-font-variant {@link GlyphAtlas} using the SDF (Signed Distance Field)
10
+ * technique and renders them through the `text-sdf` shader.
11
+ *
12
+ * Style mutations are applied automatically before the next draw — no manual
13
+ * `update()` call required. Mutating `text.style` any number of times in the
14
+ * same frame is cheap; the geometry is rebuilt at most once, on demand.
15
+ *
16
+ * ```ts
17
+ * const label = new Text('Hello', { fontSize: 24 });
18
+ * scene.addChild(label);
19
+ *
20
+ * label.style.fillColor = new Color(255, 0, 0); // cheap — no atlas work
21
+ * label.style.outlineWidth = 0.08; // cheap — only shader uniforms
22
+ * // changes are picked up automatically on the next render pass
23
+ * ```
58
24
  *
59
- * Glyphs are always rasterized in white and tinted at runtime via
60
- * `Mesh.tint`; changing `style.fillColor` only updates the mesh tint
61
- * no atlas re-rasterization is needed.
25
+ * **FontFace-first:** load fonts via {@link FontFactory} before constructing
26
+ * the node, then pass the loaded `FontFace` via the `font` style option. The
27
+ * label renders immediately with the correct glyphs — no async waiting needed.
62
28
  *
63
- * The internal {@link Mesh} is the sole child of this {@link Container}.
64
- * All transform properties (position, rotation, scale, origin) are
65
- * inherited from {@link Container} {@link RenderNode}.
29
+ * ```ts
30
+ * const face = await loader.load(FontFactory, 'roboto.woff2', { family: 'Roboto' });
31
+ * const label = new Text('Score: 0', { font: face, fontSize: 24 });
32
+ * scene.addChild(label); // renders immediately with Roboto
33
+ * ```
34
+ *
35
+ * Enable colour-glyph (emoji) mode via `colorGlyphs: true` in the constructor
36
+ * options. Colour-glyph nodes use the `text-color` shader instead of `text-sdf`.
37
+ * @stable
66
38
  */
67
- class Text extends Container {
68
- _text;
39
+ class Text extends AbstractText {
69
40
  _style;
70
- _mesh = null;
71
- constructor(text, style) {
72
- super();
73
- this._text = text;
74
- this._style = style && style instanceof TextStyle ? style : new TextStyle(style);
75
- this._rebuild();
41
+ _layout;
42
+ _colorGlyphs;
43
+ _sdfRadius;
44
+ _atlas = null;
45
+ _destroyed = false;
46
+ _faceLoadVersion = 0;
47
+ /** Resolves when an in-flight FontFace load finishes. Null when no face load is pending. */
48
+ _faceLoadPromise = null;
49
+ /** Per-page quad geometry built by `_rebuild()`. */
50
+ _pageQuads = [];
51
+ _textBounds = { width: 0, height: 0 };
52
+ constructor(text, style, layout, options = {}) {
53
+ super(text);
54
+ this._style = style instanceof TextStyle ? style : new TextStyle(style);
55
+ this._layout = layout ?? {};
56
+ this._colorGlyphs = options.colorGlyphs ?? false;
57
+ this._sdfRadius = options.sdfRadius ?? SDF_RADIUS;
58
+ if (!(style instanceof TextStyle) && style !== undefined) {
59
+ const face = this._extractFace(style);
60
+ if (face !== null)
61
+ this._faceLoadPromise = this._loadFace(face);
62
+ }
63
+ this._rebuild('font');
64
+ }
65
+ get style() {
66
+ return this._style;
67
+ }
68
+ set style(v) {
69
+ this._style = v instanceof TextStyle ? v : new TextStyle(v);
70
+ if (!(v instanceof TextStyle)) {
71
+ const face = this._extractFace(v);
72
+ if (face !== null)
73
+ this._faceLoadPromise = this._loadFace(face);
74
+ }
75
+ this._rebuild('font');
76
76
  }
77
77
  get text() {
78
78
  return this._text;
79
79
  }
80
- set text(value) {
81
- this.setText(value);
80
+ set text(v) {
81
+ if (this._text === v)
82
+ return;
83
+ this._text = v;
84
+ this._rebuild('layout');
82
85
  }
83
- get style() {
84
- return this._style;
86
+ get layout() {
87
+ return this._layout;
85
88
  }
86
- set style(style) {
87
- this.setStyle(style);
89
+ set layout(v) {
90
+ this._layout = v;
91
+ this._rebuild('layout');
88
92
  }
89
- /** Replace the displayed string and rebuild the glyph mesh if the value changed. */
90
- setText(text) {
91
- if (this._text !== text) {
92
- this._text = text;
93
- this._rebuild();
94
- }
95
- return this;
93
+ /**
94
+ * `true` if this node was constructed with `colorGlyphs: true`.
95
+ * Colour-glyph nodes use a RGBA atlas (emoji / colour fonts) and
96
+ * the `text-color` shader instead of `text-sdf`.
97
+ */
98
+ get colorGlyphs() {
99
+ return this._colorGlyphs;
96
100
  }
97
- /** Replace the active style and rebuild the glyph mesh unconditionally. */
98
- setStyle(style) {
99
- this._style = style instanceof TextStyle ? style : new TextStyle(style);
100
- this._rebuild();
101
- return this;
101
+ /**
102
+ * SDF buffer radius (pixels) used when rasterizing glyphs for this node.
103
+ * Determines the maximum usable outline/shadow reach.
104
+ * Nodes with different radii use separate atlas instances.
105
+ */
106
+ get sdfRadius() {
107
+ return this._sdfRadius;
102
108
  }
103
- destroy() {
104
- if (this._mesh !== null) {
105
- this._mesh.destroy();
106
- this._mesh = null;
109
+ /**
110
+ * The atlas mode used by this node: `'color'` for colour glyphs,
111
+ * `'sdf'` for standard text.
112
+ */
113
+ get atlasMode() {
114
+ return this._colorGlyphs ? 'color' : 'sdf';
115
+ }
116
+ /** Per-page quad data consumed by the text renderer. */
117
+ get pageQuads() {
118
+ return this._pageQuads;
119
+ }
120
+ get textBounds() {
121
+ return this._textBounds;
122
+ }
123
+ /** The {@link GlyphAtlas} this node currently draws from. */
124
+ get atlas() {
125
+ return this._atlas;
126
+ }
127
+ syncDirty() {
128
+ const hint = this._style.consumeDirty();
129
+ if (hint !== null && hint !== 'tint') {
130
+ this._rebuild(hint);
107
131
  }
132
+ }
133
+ destroy() {
134
+ this._destroyed = true;
135
+ this._faceLoadVersion++;
136
+ this._faceLoadPromise = null;
137
+ this._pageQuads = [];
138
+ this._atlas = null;
108
139
  super.destroy();
109
140
  }
110
- // -----------------------------------------------------------------------
111
- _rebuild() {
112
- // Remove and discard the old mesh (if any).
113
- if (this._mesh !== null) {
114
- this.removeChild(this._mesh);
115
- this._mesh.destroy();
116
- this._mesh = null;
141
+ // ── Private ──────────────────────────────────────────────────────────────
142
+ /** Extract a {@link FontFace} from raw style options, or return null. */
143
+ _extractFace(opts) {
144
+ if (typeof FontFace === 'undefined')
145
+ return null;
146
+ if (opts.font instanceof FontFace)
147
+ return opts.font;
148
+ return null;
149
+ }
150
+ /**
151
+ * Register `face` with `document.fonts` if needed, await its load, then
152
+ * clear the relevant atlas slice and rebuild geometry.
153
+ *
154
+ * Uses a version counter to discard stale loads when the style is replaced
155
+ * before the previous face finishes loading.
156
+ */
157
+ async _loadFace(face) {
158
+ if (typeof document === 'undefined' || !document.fonts)
159
+ return;
160
+ const version = ++this._faceLoadVersion;
161
+ if (!document.fonts.has(face)) {
162
+ document.fonts.add(face);
163
+ }
164
+ try {
165
+ await face.load();
166
+ }
167
+ catch {
168
+ return;
117
169
  }
170
+ if (this._destroyed || version !== this._faceLoadVersion)
171
+ return;
172
+ const pool = getDefaultGlyphAtlasPool();
173
+ pool.getAtlas(this._style.fontFamily, this._style.fontStyle, this._style.fontWeight, this.atlasMode, this._sdfRadius).clear();
174
+ this._rebuild('font');
175
+ }
176
+ _rebuild(_hint) {
177
+ this._pageQuads = [];
178
+ this._textBounds = { width: 0, height: 0 };
118
179
  if (this._text.length === 0) {
180
+ this._style.consumeDirty();
119
181
  return;
120
182
  }
121
- const atlas = getDefaultGlyphAtlas();
122
- const placements = layoutText(this._text, this._style, atlas);
183
+ const pool = getDefaultGlyphAtlasPool();
184
+ const atlas = pool.getAtlas(this._style.fontFamily, this._style.fontStyle, this._style.fontWeight, this.atlasMode, this._sdfRadius);
185
+ this._atlas = atlas;
186
+ const placements = layoutText(this._text, this._style, this._layout, atlas);
123
187
  if (placements.length === 0) {
188
+ this._style.consumeDirty();
124
189
  return;
125
190
  }
126
- this._mesh = buildMesh(placements, this._style);
127
- this.addChild(this._mesh);
191
+ let maxX = 0, maxY = 0;
192
+ for (const p of placements) {
193
+ const px = p.x + p.width;
194
+ const py = p.y + p.height;
195
+ if (px > maxX)
196
+ maxX = px;
197
+ if (py > maxY)
198
+ maxY = py;
199
+ }
200
+ this._textBounds = { width: maxX, height: maxY };
201
+ this._pageQuads = buildTextPageQuads(placements);
202
+ this._style.consumeDirty();
128
203
  }
129
204
  }
130
205
 
131
- export { Text };
206
+ export { SDF_RADIUS, Text };
132
207
  //# sourceMappingURL=Text.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Text.js","sources":["../../../../../src/rendering/text/Text.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Text.js","sources":["../../../../../src/rendering/text/Text.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;;AAaA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BG;AACG,MAAO,IAAK,SAAQ,YAAY,CAAA;AAC5B,IAAA,MAAM;AACN,IAAA,OAAO;AACP,IAAA,YAAY;AACZ,IAAA,UAAU;IACV,MAAM,GAAsB,IAAI;IAChC,UAAU,GAAG,KAAK;IAClB,gBAAgB,GAAG,CAAC;;IAGpB,gBAAgB,GAAyB,IAAI;;IAG7C,UAAU,GAAoB,EAAE;IAChC,WAAW,GAAa,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;AAEvD,IAAA,WAAA,CAAmB,IAAY,EAAE,KAAoC,EAAE,MAAsB,EAAE,UAAyD,EAAE,EAAA;QACxJ,KAAK,CAAC,IAAI,CAAC;AACX,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK,YAAY,SAAS,GAAG,KAAK,GAAG,IAAI,SAAS,CAAC,KAAK,CAAC;AACvE,QAAA,IAAI,CAAC,OAAO,GAAG,MAAM,IAAI,EAAE;QAC3B,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,WAAW,IAAI,KAAK;QAChD,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,SAAS,IAAI,UAAU;QAEjD,IAAI,EAAE,KAAK,YAAY,SAAS,CAAC,IAAI,KAAK,KAAK,SAAS,EAAE;YACxD,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;YACrC,IAAI,IAAI,KAAK,IAAI;gBAAE,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;QACjE;AAEA,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;IACvB;AAEA,IAAA,IAAW,KAAK,GAAA;QACd,OAAO,IAAI,CAAC,MAAM;IACpB;IAEA,IAAW,KAAK,CAAC,CAA+B,EAAA;AAC9C,QAAA,IAAI,CAAC,MAAM,GAAG,CAAC,YAAY,SAAS,GAAG,CAAC,GAAG,IAAI,SAAS,CAAC,CAAC,CAAC;AAC3D,QAAA,IAAI,EAAE,CAAC,YAAY,SAAS,CAAC,EAAE;YAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;YACjC,IAAI,IAAI,KAAK,IAAI;gBAAE,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;QACjE;AACA,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;IACvB;AAEA,IAAA,IAAoB,IAAI,GAAA;QACtB,OAAO,IAAI,CAAC,KAAK;IACnB;IAEA,IAAoB,IAAI,CAAC,CAAS,EAAA;AAChC,QAAA,IAAI,IAAI,CAAC,KAAK,KAAK,CAAC;YAAE;AACtB,QAAA,IAAI,CAAC,KAAK,GAAG,CAAC;AACd,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;IACzB;AAEA,IAAA,IAAW,MAAM,GAAA;QACf,OAAO,IAAI,CAAC,OAAO;IACrB;IAEA,IAAW,MAAM,CAAC,CAAgB,EAAA;AAChC,QAAA,IAAI,CAAC,OAAO,GAAG,CAAC;AAChB,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;IACzB;AAEA;;;;AAIG;AACH,IAAA,IAAW,WAAW,GAAA;QACpB,OAAO,IAAI,CAAC,YAAY;IAC1B;AAEA;;;;AAIG;AACH,IAAA,IAAW,SAAS,GAAA;QAClB,OAAO,IAAI,CAAC,UAAU;IACxB;AAEA;;;AAGG;AACH,IAAA,IAAW,SAAS,GAAA;QAClB,OAAO,IAAI,CAAC,YAAY,GAAG,OAAO,GAAG,KAAK;IAC5C;;AAGA,IAAA,IAAW,SAAS,GAAA;QAClB,OAAO,IAAI,CAAC,UAAU;IACxB;AAEA,IAAA,IAAoB,UAAU,GAAA;QAC5B,OAAO,IAAI,CAAC,WAAW;IACzB;;AAGA,IAAA,IAAW,KAAK,GAAA;QACd,OAAO,IAAI,CAAC,MAAM;IACpB;IAEgB,SAAS,GAAA;QACvB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE;QACvC,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,MAAM,EAAE;AACpC,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QACrB;IACF;IAEgB,OAAO,GAAA;AACrB,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI;QACtB,IAAI,CAAC,gBAAgB,EAAE;AACvB,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;AAC5B,QAAA,IAAI,CAAC,UAAU,GAAG,EAAE;AACpB,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI;QAClB,KAAK,CAAC,OAAO,EAAE;IACjB;;;AAKQ,IAAA,YAAY,CAAC,IAAsB,EAAA;QACzC,IAAI,OAAO,QAAQ,KAAK,WAAW;AAAE,YAAA,OAAO,IAAI;AAChD,QAAA,IAAI,IAAI,CAAC,IAAI,YAAY,QAAQ;YAAE,OAAO,IAAI,CAAC,IAAI;AACnD,QAAA,OAAO,IAAI;IACb;AAEA;;;;;;AAMG;IACK,MAAM,SAAS,CAAC,IAAc,EAAA;QACpC,IAAI,OAAO,QAAQ,KAAK,WAAW,IAAI,CAAC,QAAQ,CAAC,KAAK;YAAE;AAExD,QAAA,MAAM,OAAO,GAAG,EAAE,IAAI,CAAC,gBAAgB;QAEvC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;AAC7B,YAAA,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;QAC1B;AAEA,QAAA,IAAI;AACF,YAAA,MAAM,IAAI,CAAC,IAAI,EAAE;QACnB;AAAE,QAAA,MAAM;YACN;QACF;QAEA,IAAI,IAAI,CAAC,UAAU,IAAI,OAAO,KAAK,IAAI,CAAC,gBAAgB;YAAE;AAE1D,QAAA,MAAM,IAAI,GAAG,wBAAwB,EAAE;AACvC,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,KAAK,EAAE;AAC7H,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;IACvB;AAEQ,IAAA,QAAQ,CAAC,KAAsB,EAAA;AACrC,QAAA,IAAI,CAAC,UAAU,GAAG,EAAE;AACpB,QAAA,IAAI,CAAC,WAAW,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;QAE1C,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AAC3B,YAAA,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE;YAC1B;QACF;AAEA,QAAA,MAAM,IAAI,GAAG,wBAAwB,EAAE;AACvC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC;AACnI,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AAEnB,QAAA,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC;AAE3E,QAAA,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE;AAC3B,YAAA,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE;YAC1B;QACF;AAEA,QAAA,IAAI,IAAI,GAAG,CAAC,EACV,IAAI,GAAG,CAAC;AACV,QAAA,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE;YAC1B,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK;YACxB,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM;YACzB,IAAI,EAAE,GAAG,IAAI;gBAAE,IAAI,GAAG,EAAE;YACxB,IAAI,EAAE,GAAG,IAAI;gBAAE,IAAI,GAAG,EAAE;QAC1B;AACA,QAAA,IAAI,CAAC,WAAW,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;AAEhD,QAAA,IAAI,CAAC,UAAU,GAAG,kBAAkB,CAAC,UAAU,CAAC;AAChD,QAAA,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE;IAC5B;AACD;;;;"}
@@ -1,13 +1,25 @@
1
- import type { DynamicGlyphAtlas } from './DynamicGlyphAtlas';
2
- import type { TextStyle } from './TextStyle';
3
- import type { GlyphPlacement } from './types';
1
+ import type { LayoutOptions } from './LayoutOptions';
2
+ import type { GlyphPlacement, GlyphProvider, TextLayoutStyle, TextPageQuads, TextSize } from './types';
4
3
  /**
5
- * Computes per-glyph quad placements for the given text and style.
4
+ * Compute the bounding pixel dimensions of `text` without allocating quad
5
+ * placements. Returns `{ width: 0, height: 0 }` for empty text.
6
+ */
7
+ export declare function measureText(text: string, style: TextLayoutStyle, provider: GlyphProvider): TextSize;
8
+ /**
9
+ * Computes per-glyph quad placements for the given text, style, and layout
10
+ * options.
6
11
  *
7
- * Handles `\n` line breaks and left/center/right alignment. No word-wrap,
8
- * no RTL, no ligature shaping Unicode/diacritics are delegated to the
9
- * browser's font engine via canvas `fillText`.
12
+ * Handles `\n` line breaks, left/center/right/justify alignment, `letterSpacing`,
13
+ * `leading`, `breakWords`, `whiteSpace` preprocessing, and optional kerning
14
+ * (if the provider implements `getKerning`). RTL and ligature shaping are out
15
+ * of scope; Unicode/diacritics are delegated to the browser's canvas engine.
10
16
  *
11
17
  * Returns an empty array for empty text.
12
18
  */
13
- export declare function layoutText(text: string, style: TextStyle, atlas: DynamicGlyphAtlas): readonly GlyphPlacement[];
19
+ export declare function layoutText(text: string, style: TextLayoutStyle, layout: LayoutOptions, provider: GlyphProvider): readonly GlyphPlacement[];
20
+ /**
21
+ * Convert {@link GlyphPlacement} arrays into per-atlas-page quad geometry
22
+ * ready for GPU upload. Zero-size placements (e.g. whitespace glyphs that
23
+ * have no atlas entry) are skipped.
24
+ */
25
+ export declare function buildTextPageQuads(placements: readonly GlyphPlacement[]): TextPageQuads[];