@lightningjs/renderer 2.9.0 → 2.9.1

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