@lightningjs/renderer 3.0.3 → 3.0.5

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 (240) hide show
  1. package/dist/src/common/EventEmitter.d.ts +7 -4
  2. package/dist/src/common/EventEmitter.js +1 -1
  3. package/dist/src/common/EventEmitter.js.map +1 -1
  4. package/dist/src/core/AutosizeManager.d.ts +29 -0
  5. package/dist/src/core/AutosizeManager.js +169 -0
  6. package/dist/src/core/AutosizeManager.js.map +1 -0
  7. package/dist/src/core/CoreNode.d.ts +2 -1
  8. package/dist/src/core/CoreNode.js +6 -3
  9. package/dist/src/core/CoreNode.js.map +1 -1
  10. package/dist/src/core/CoreTextNode.d.ts +18 -5
  11. package/dist/src/core/CoreTextNode.js +141 -59
  12. package/dist/src/core/CoreTextNode.js.map +1 -1
  13. package/dist/src/core/CoreTextNodeCanvas.d.ts +215 -0
  14. package/dist/src/core/CoreTextNodeCanvas.js +236 -0
  15. package/dist/src/core/CoreTextNodeCanvas.js.map +1 -0
  16. package/dist/src/core/Stage.js +10 -0
  17. package/dist/src/core/Stage.js.map +1 -1
  18. package/dist/src/core/TextureMemoryManager.js +4 -3
  19. package/dist/src/core/TextureMemoryManager.js.map +1 -1
  20. package/dist/src/core/animations/Animation.d.ts +21 -0
  21. package/dist/src/core/animations/Animation.js +194 -0
  22. package/dist/src/core/animations/Animation.js.map +1 -0
  23. package/dist/src/core/animations/AnimationManager.d.ts +1 -1
  24. package/dist/src/core/animations/AnimationManager.js +5 -5
  25. package/dist/src/core/animations/AnimationManager.js.map +1 -1
  26. package/dist/src/core/animations/CoreAnimation.d.ts +11 -2
  27. package/dist/src/core/animations/CoreAnimation.js +44 -38
  28. package/dist/src/core/animations/CoreAnimation.js.map +1 -1
  29. package/dist/src/core/animations/CoreAnimationController.d.ts +6 -0
  30. package/dist/src/core/animations/CoreAnimationController.js +16 -3
  31. package/dist/src/core/animations/CoreAnimationController.js.map +1 -1
  32. package/dist/src/core/animations/Playback.d.ts +64 -0
  33. package/dist/src/core/animations/Playback.js +169 -0
  34. package/dist/src/core/animations/Playback.js.map +1 -0
  35. package/dist/src/core/animations/Ticker.d.ts +71 -0
  36. package/dist/src/core/animations/Ticker.js +89 -0
  37. package/dist/src/core/animations/Ticker.js.map +1 -0
  38. package/dist/src/core/animations/Transition.d.ts +38 -0
  39. package/dist/src/core/animations/Transition.js +35 -0
  40. package/dist/src/core/animations/Transition.js.map +1 -0
  41. package/dist/src/core/animations/TransitionsController.d.ts +10 -0
  42. package/dist/src/core/animations/TransitionsController.js +39 -0
  43. package/dist/src/core/animations/TransitionsController.js.map +1 -0
  44. package/dist/src/core/animations/utils.d.ts +2 -0
  45. package/dist/src/core/animations/utils.js +136 -0
  46. package/dist/src/core/animations/utils.js.map +1 -0
  47. package/dist/src/core/lib/ImageWorker.d.ts +2 -2
  48. package/dist/src/core/lib/ImageWorker.js +11 -30
  49. package/dist/src/core/lib/ImageWorker.js.map +1 -1
  50. package/dist/src/core/lib/WebGlContextWrapper.d.ts +5 -16
  51. package/dist/src/core/lib/WebGlContextWrapper.js +1 -35
  52. package/dist/src/core/lib/WebGlContextWrapper.js.map +1 -1
  53. package/dist/src/core/lib/textureCompression.d.ts +2 -14
  54. package/dist/src/core/lib/textureCompression.js +67 -320
  55. package/dist/src/core/lib/textureCompression.js.map +1 -1
  56. package/dist/src/core/platform.js +9 -38
  57. package/dist/src/core/platform.js.map +1 -1
  58. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.d.ts +0 -1
  59. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.js +3 -11
  60. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.js.map +1 -1
  61. package/dist/src/core/renderers/canvas/CanvasCoreTexture.d.ts +1 -2
  62. package/dist/src/core/renderers/canvas/CanvasCoreTexture.js +11 -16
  63. package/dist/src/core/renderers/canvas/CanvasCoreTexture.js.map +1 -1
  64. package/dist/src/core/renderers/canvas/CanvasRenderer.js +14 -1
  65. package/dist/src/core/renderers/canvas/CanvasRenderer.js.map +1 -1
  66. package/dist/src/core/renderers/canvas/CanvasTexture.d.ts +1 -1
  67. package/dist/src/core/renderers/canvas/CanvasTexture.js +16 -6
  68. package/dist/src/core/renderers/canvas/CanvasTexture.js.map +1 -1
  69. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.d.ts +0 -13
  70. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.js +192 -113
  71. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.js.map +1 -1
  72. package/dist/src/core/renderers/canvas/internal/ColorUtils.d.ts +2 -0
  73. package/dist/src/core/renderers/canvas/internal/ColorUtils.js +14 -0
  74. package/dist/src/core/renderers/canvas/internal/ColorUtils.js.map +1 -1
  75. package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.d.ts +1 -2
  76. package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.js +5 -12
  77. package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.js.map +1 -1
  78. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.d.ts +6 -18
  79. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js +60 -102
  80. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js.map +1 -1
  81. package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.js +1 -1
  82. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.d.ts +1 -3
  83. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js +31 -74
  84. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js.map +1 -1
  85. package/dist/src/core/renderers/webgl/WebGlCoreShader.d.ts +7 -2
  86. package/dist/src/core/renderers/webgl/WebGlCoreShader.js +50 -21
  87. package/dist/src/core/renderers/webgl/WebGlCoreShader.js.map +1 -1
  88. package/dist/src/core/renderers/webgl/WebGlRenderOp.d.ts +2 -3
  89. package/dist/src/core/renderers/webgl/WebGlRenderOp.js +1 -3
  90. package/dist/src/core/renderers/webgl/WebGlRenderOp.js.map +1 -1
  91. package/dist/src/core/renderers/webgl/WebGlRenderer.d.ts +2 -2
  92. package/dist/src/core/renderers/webgl/WebGlRenderer.js.map +1 -1
  93. package/dist/src/core/renderers/webgl/WebGlShaderNode.d.ts +1 -0
  94. package/dist/src/core/renderers/webgl/WebGlShaderNode.js +23 -0
  95. package/dist/src/core/renderers/webgl/WebGlShaderNode.js.map +1 -1
  96. package/dist/src/core/renderers/webgl/WebGlShaderProgram.js +4 -5
  97. package/dist/src/core/renderers/webgl/WebGlShaderProgram.js.map +1 -1
  98. package/dist/src/core/renderers/webgl/internal/ShaderUtils.d.ts +1 -0
  99. package/dist/src/core/renderers/webgl/internal/ShaderUtils.js.map +1 -1
  100. package/dist/src/core/renderers/webgl/shaders/DefaultShader.js +6 -3
  101. package/dist/src/core/renderers/webgl/shaders/DefaultShader.js.map +1 -1
  102. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.js +11 -0
  103. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.js.map +1 -1
  104. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js +10 -5
  105. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js.map +1 -1
  106. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.js +10 -5
  107. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.js.map +1 -1
  108. package/dist/src/core/renderers/webgl/shaders/SdfShader.js +12 -0
  109. package/dist/src/core/renderers/webgl/shaders/SdfShader.js.map +1 -1
  110. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.js +1 -1
  111. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.js +1 -1
  112. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.js +1 -1
  113. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.js +1 -1
  114. package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.js +2 -2
  115. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.js +5 -5
  116. package/dist/src/core/renderers/webgl/shaders/effects/HolePunchEffect.js +1 -1
  117. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.d.ts +1 -0
  118. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js +30 -14
  119. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js.map +1 -1
  120. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.d.ts +0 -1
  121. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js +3 -13
  122. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js.map +1 -1
  123. package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.js +1 -1
  124. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.js +5 -5
  125. package/dist/src/core/shaders/webgl/SdfShadowShader.d.ts +9 -0
  126. package/dist/src/core/shaders/webgl/SdfShadowShader.js +100 -0
  127. package/dist/src/core/shaders/webgl/SdfShadowShader.js.map +1 -0
  128. package/dist/src/core/text-rendering/CanvasFont.d.ts +1 -1
  129. package/dist/src/core/text-rendering/CanvasFont.js +7 -16
  130. package/dist/src/core/text-rendering/CanvasFont.js.map +1 -1
  131. package/dist/src/core/text-rendering/CanvasFontHandler.d.ts +1 -1
  132. package/dist/src/core/text-rendering/CanvasFontHandler.js +1 -1
  133. package/dist/src/core/text-rendering/CanvasFontHandler.js.map +1 -1
  134. package/dist/src/core/text-rendering/CanvasTextRenderer.d.ts +2 -3
  135. package/dist/src/core/text-rendering/CanvasTextRenderer.js +7 -5
  136. package/dist/src/core/text-rendering/CanvasTextRenderer.js.map +1 -1
  137. package/dist/src/core/text-rendering/CoreFont.d.ts +1 -1
  138. package/dist/src/core/text-rendering/CoreFont.js +1 -1
  139. package/dist/src/core/text-rendering/CoreFont.js.map +1 -1
  140. package/dist/src/core/text-rendering/FontManager.js +2 -1
  141. package/dist/src/core/text-rendering/FontManager.js.map +1 -1
  142. package/dist/src/core/text-rendering/SdfTextRenderer.d.ts +3 -5
  143. package/dist/src/core/text-rendering/SdfTextRenderer.js +19 -109
  144. package/dist/src/core/text-rendering/SdfTextRenderer.js.map +1 -1
  145. package/dist/src/core/text-rendering/TextLayoutEngine.js +43 -12
  146. package/dist/src/core/text-rendering/TextLayoutEngine.js.map +1 -1
  147. package/dist/src/core/text-rendering/TextRenderer.d.ts +16 -8
  148. package/dist/src/core/text-rendering/canvas/Settings.d.ts +64 -0
  149. package/dist/src/core/text-rendering/canvas/Settings.js +20 -0
  150. package/dist/src/core/text-rendering/canvas/Settings.js.map +1 -0
  151. package/dist/src/core/text-rendering/canvas/Utils.d.ts +20 -0
  152. package/dist/src/core/text-rendering/canvas/Utils.js +144 -0
  153. package/dist/src/core/text-rendering/canvas/Utils.js.map +1 -0
  154. package/dist/src/core/text-rendering/canvas/calculateRenderInfo.d.ts +60 -0
  155. package/dist/src/core/text-rendering/canvas/calculateRenderInfo.js +183 -0
  156. package/dist/src/core/text-rendering/canvas/calculateRenderInfo.js.map +1 -0
  157. package/dist/src/core/text-rendering/canvas/draw.d.ts +5 -0
  158. package/dist/src/core/text-rendering/canvas/draw.js +132 -0
  159. package/dist/src/core/text-rendering/canvas/draw.js.map +1 -0
  160. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js +2 -2
  161. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js.map +1 -1
  162. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.d.ts +3 -4
  163. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js +46 -98
  164. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js.map +1 -1
  165. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.d.ts +1 -1
  166. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.d.ts +2 -2
  167. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js +66 -8
  168. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js.map +1 -1
  169. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.d.ts +1 -1
  170. package/dist/src/core/text-rendering/renderers/TextRenderer.d.ts +1 -1
  171. package/dist/src/core/text-rendering/renderers/canvas/CanvasTextRenderer.d.ts +26 -0
  172. package/dist/src/core/text-rendering/renderers/canvas/CanvasTextRenderer.js +158 -0
  173. package/dist/src/core/text-rendering/renderers/canvas/CanvasTextRenderer.js.map +1 -0
  174. package/dist/src/core/text-rendering/renderers/canvas/internal/draw.d.ts +5 -0
  175. package/dist/src/core/text-rendering/renderers/canvas/internal/draw.js +127 -0
  176. package/dist/src/core/text-rendering/renderers/canvas/internal/draw.js.map +1 -0
  177. package/dist/src/core/text-rendering/renderers/canvas/internal/mergeDefaults.d.ts +2 -0
  178. package/dist/src/core/text-rendering/renderers/canvas/internal/mergeDefaults.js +50 -0
  179. package/dist/src/core/text-rendering/renderers/canvas/internal/mergeDefaults.js.map +1 -0
  180. package/dist/src/core/text-rendering/renderers/canvas/internal/renderInfo.d.ts +33 -0
  181. package/dist/src/core/text-rendering/renderers/canvas/internal/renderInfo.js +192 -0
  182. package/dist/src/core/text-rendering/renderers/canvas/internal/renderInfo.js.map +1 -0
  183. package/dist/src/core/text-rendering/renderers/canvas/internal/types.d.ts +66 -0
  184. package/dist/src/core/text-rendering/renderers/canvas/internal/types.js +2 -0
  185. package/dist/src/core/text-rendering/renderers/canvas/internal/types.js.map +1 -0
  186. package/dist/src/core/text-rendering/renderers/canvas/internal/utils.d.ts +91 -0
  187. package/dist/src/core/text-rendering/renderers/canvas/internal/utils.js +282 -0
  188. package/dist/src/core/text-rendering/renderers/canvas/internal/utils.js.map +1 -0
  189. package/dist/src/core/text-rendering/sdf/PeekableGenerator.d.ts +12 -0
  190. package/dist/src/core/text-rendering/sdf/PeekableGenerator.js +61 -0
  191. package/dist/src/core/text-rendering/sdf/PeekableGenerator.js.map +1 -0
  192. package/dist/src/core/text-rendering/sdf/SimpleFontShaper.d.ts +45 -0
  193. package/dist/src/core/text-rendering/sdf/SimpleFontShaper.js +69 -0
  194. package/dist/src/core/text-rendering/sdf/SimpleFontShaper.js.map +1 -0
  195. package/dist/src/core/text-rendering/sdf/Utils.d.ts +26 -0
  196. package/dist/src/core/text-rendering/sdf/Utils.js +301 -0
  197. package/dist/src/core/text-rendering/sdf/Utils.js.map +1 -0
  198. package/dist/src/core/text-rendering/sdf/index.d.ts +1 -0
  199. package/dist/src/core/text-rendering/sdf/index.js +20 -0
  200. package/dist/src/core/text-rendering/sdf/index.js.map +1 -0
  201. package/dist/src/core/textures/ImageTexture.js +11 -0
  202. package/dist/src/core/textures/ImageTexture.js.map +1 -1
  203. package/dist/src/core/textures/Texture.js +5 -0
  204. package/dist/src/core/textures/Texture.js.map +1 -1
  205. package/dist/src/main-api/Inspector.d.ts +1 -1
  206. package/dist/src/main-api/Inspector.js +25 -20
  207. package/dist/src/main-api/Inspector.js.map +1 -1
  208. package/dist/tsconfig.dist.tsbuildinfo +1 -1
  209. package/dist/tsconfig.tsbuildinfo +1 -0
  210. package/package.json +1 -1
  211. package/src/common/EventEmitter.ts +6 -8
  212. package/src/core/CoreNode.test.ts +1 -1
  213. package/src/core/CoreNode.ts +8 -4
  214. package/src/core/CoreTextNode.test.ts +138 -25
  215. package/src/core/CoreTextNode.ts +174 -67
  216. package/src/core/Stage.ts +11 -0
  217. package/src/core/TextureMemoryManager.ts +4 -3
  218. package/src/core/animations/AnimationManager.ts +5 -5
  219. package/src/core/animations/CoreAnimation.ts +61 -45
  220. package/src/core/animations/CoreAnimationController.ts +16 -7
  221. package/src/core/renderers/canvas/CanvasRenderer.ts +19 -1
  222. package/src/core/renderers/canvas/CanvasTexture.ts +23 -8
  223. package/src/core/renderers/webgl/WebGlRenderer.ts +2 -3
  224. package/src/core/renderers/webgl/WebGlShaderNode.ts +24 -0
  225. package/src/core/renderers/webgl/WebGlShaderProgram.test.ts +274 -0
  226. package/src/core/renderers/webgl/WebGlShaderProgram.ts +10 -10
  227. package/src/core/renderers/webgl/internal/ShaderUtils.ts +1 -0
  228. package/src/core/text-rendering/CanvasFontHandler.ts +2 -2
  229. package/src/core/text-rendering/CanvasTextRenderer.ts +14 -7
  230. package/src/core/text-rendering/SdfTextRenderer.ts +28 -140
  231. package/src/core/text-rendering/TextLayoutEngine.ts +61 -28
  232. package/src/core/text-rendering/TextRenderer.ts +19 -12
  233. package/src/core/text-rendering/tests/TextLayoutEngine.test.ts +20 -0
  234. package/src/core/textures/ImageTexture.ts +18 -0
  235. package/src/core/textures/Texture.ts +6 -0
  236. package/src/main-api/Inspector.ts +25 -25
  237. package/dist/src/core/text-rendering/TextGenerator.d.ts +0 -10
  238. package/dist/src/core/text-rendering/TextGenerator.js +0 -36
  239. package/dist/src/core/text-rendering/TextGenerator.js.map +0 -1
  240. package/src/core/renderers/webgl/SdfRenderOp.ts +0 -106
@@ -0,0 +1,66 @@
1
+ import type { WebTrFontFace } from '../../../font-face-types/WebTrFontFace.js';
2
+ import { type RGBA } from '../../../../lib/utils.js';
3
+ /**
4
+ * Text Overflow Values
5
+ */
6
+ export type TextOverflow = 'ellipsis' | 'clip' | (string & Record<never, never>);
7
+ /***
8
+ * Text Horizontal Align Values
9
+ */
10
+ export type TextAlign = 'left' | 'center' | 'right';
11
+ /***
12
+ * Text Baseline Values
13
+ */
14
+ export type TextBaseline = 'alphabetic' | 'top' | 'hanging' | 'middle' | 'ideographic' | 'bottom';
15
+ /***
16
+ * Text Vertical Align Values
17
+ */
18
+ export type TextVerticalAlign = 'top' | 'middle' | 'bottom';
19
+ /**
20
+ * Text Texture Settings
21
+ */
22
+ export interface Settings {
23
+ w: number;
24
+ h: number;
25
+ text: string;
26
+ fontStyle: string;
27
+ fontSize: number;
28
+ fontBaselineRatio: number;
29
+ fontFamily: string | null;
30
+ trFontFace: WebTrFontFace | null;
31
+ wordWrap: boolean;
32
+ wordWrapWidth: number;
33
+ wordBreak: boolean;
34
+ textOverflow: TextOverflow | null;
35
+ lineHeight: number | null;
36
+ textBaseline: TextBaseline;
37
+ textAlign: TextAlign;
38
+ verticalAlign: TextVerticalAlign;
39
+ offsetY: number | null;
40
+ maxLines: number;
41
+ maxHeight: number | null;
42
+ overflowSuffix: string;
43
+ precision: number;
44
+ textColor: RGBA;
45
+ paddingLeft: number;
46
+ paddingRight: number;
47
+ shadow: boolean;
48
+ shadowColor: RGBA;
49
+ shadowOffsetX: number;
50
+ shadowOffsetY: number;
51
+ shadowBlur: number;
52
+ highlight: boolean;
53
+ highlightHeight: number;
54
+ highlightColor: RGBA;
55
+ highlightOffset: number;
56
+ highlightPaddingLeft: number;
57
+ highlightPaddingRight: number;
58
+ letterSpacing: number;
59
+ textIndent: number;
60
+ cutSx: number;
61
+ cutSy: number;
62
+ cutEx: number;
63
+ cutEy: number;
64
+ advancedRenderer: boolean;
65
+ textRenderIssueMargin: number;
66
+ }
@@ -0,0 +1,2 @@
1
+ import {} from '../../../../lib/utils.js';
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../../../src/core/text-rendering/renderers/canvas/internal/types.ts"],"names":[],"mappings":"AACA,OAAO,EAAa,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1,91 @@
1
+ import type { NormalizedFontMetrics } from '../../../font-face-types/TrFontFace.js';
2
+ import type { WebTrFontFace } from '../../../font-face-types/WebTrFontFace.js';
3
+ import { type TextBaseline } from './types.js';
4
+ /**
5
+ * Returns CSS font setting string for use in canvas context.
6
+ *
7
+ * @param fontFace
8
+ * @param fontStyle
9
+ * @param fontSize
10
+ * @param precision
11
+ * @param defaultFontFace
12
+ * @returns
13
+ */
14
+ export declare function getFontSetting(fontFace: string | string[], fontStyle: string, fontSize: number, precision: number, defaultFontFace: string): string;
15
+ /**
16
+ * Returns true if the given character is a zero-width space.
17
+ *
18
+ * @param space
19
+ */
20
+ export declare function isZeroWidthSpace(space: string): boolean;
21
+ /**
22
+ * Returns true if the given character is a zero-width space or a regular space.
23
+ *
24
+ * @param space
25
+ */
26
+ export declare function isSpace(space: string): boolean;
27
+ /**
28
+ * Converts a string into an array of tokens and the words between them.
29
+ *
30
+ * @param tokenRegex
31
+ * @param text
32
+ */
33
+ export declare function tokenizeString(tokenRegex: RegExp, text: string): string[];
34
+ /**
35
+ * Measure the width of a string accounting for letter spacing.
36
+ *
37
+ * @param context
38
+ * @param word
39
+ * @param space
40
+ */
41
+ export declare function measureText(word: string, space: number | undefined, context: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D): number;
42
+ /**
43
+ * Get the font metrics for a font face.
44
+ *
45
+ * @remarks
46
+ * This function will attempt to grab the explicitly defined metrics from the
47
+ * font face first. If the font face does not have metrics defined, it will
48
+ * attempt to calculate the metrics using the browser's measureText method.
49
+ *
50
+ * If the browser does not support the font metrics API, it will use some
51
+ * default values.
52
+ *
53
+ * @param context
54
+ * @param fontFace
55
+ * @param fontSize
56
+ * @returns
57
+ */
58
+ export declare function getWebFontMetrics(context: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, fontFace: WebTrFontFace, fontSize: number): NormalizedFontMetrics;
59
+ export interface WrapTextResult {
60
+ l: string[];
61
+ n: number[];
62
+ }
63
+ /**
64
+ * Applies newlines to a string to have it optimally fit into the horizontal
65
+ * bounds set by the Text object's wordWrapWidth property.
66
+ *
67
+ * @param text
68
+ * @param wordWrapWidth
69
+ * @param suffix
70
+ * @param context
71
+ */
72
+ export declare function wrapWord(word: string, wordWrapWidth: number, suffix: string, context: CanvasRenderingContext2D): string;
73
+ /**
74
+ * Applies newlines to a string to have it optimally fit into the horizontal
75
+ * bounds set by the Text object's wordWrapWidth property.
76
+ */
77
+ export declare function wrapText(text: string, wordWrapWidth: number, letterSpacing: number, indent: number | undefined, context: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D): {
78
+ l: string[];
79
+ n: number[];
80
+ };
81
+ /**
82
+ * Calculate height for the canvas
83
+ *
84
+ * @param textBaseline
85
+ * @param fontSize
86
+ * @param lineHeight
87
+ * @param numLines
88
+ * @param offsetY
89
+ * @returns
90
+ */
91
+ export declare function calcHeight(textBaseline: TextBaseline, fontSize: number, lineHeight: number, numLines: number): number;
@@ -0,0 +1,282 @@
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
+ import {} from './types.js';
20
+ /**
21
+ * Returns CSS font setting string for use in canvas context.
22
+ *
23
+ * @param fontFace
24
+ * @param fontStyle
25
+ * @param fontSize
26
+ * @param precision
27
+ * @param defaultFontFace
28
+ * @returns
29
+ */
30
+ export function getFontSetting(fontFace, fontStyle, fontSize, precision, defaultFontFace) {
31
+ let ff = fontFace;
32
+ if (!Array.isArray(ff)) {
33
+ ff = [ff];
34
+ }
35
+ const ffs = [];
36
+ for (let i = 0, n = ff.length; i < n; i++) {
37
+ let curFf = ff[i];
38
+ // Replace the default font face `null` with the actual default font face set
39
+ // on the stage.
40
+ if (curFf === null || curFf === undefined) {
41
+ curFf = defaultFontFace;
42
+ }
43
+ if (curFf === 'serif' || curFf === 'sans-serif') {
44
+ ffs.push(curFf);
45
+ }
46
+ else {
47
+ ffs.push(`"${curFf}"`);
48
+ }
49
+ }
50
+ return `${fontStyle} ${fontSize * precision}px ${ffs.join(',')}`;
51
+ }
52
+ /**
53
+ * Returns true if the given character is a zero-width space.
54
+ *
55
+ * @param space
56
+ */
57
+ export function isZeroWidthSpace(space) {
58
+ return space === '' || space === '\u200B';
59
+ }
60
+ /**
61
+ * Returns true if the given character is a zero-width space or a regular space.
62
+ *
63
+ * @param space
64
+ */
65
+ export function isSpace(space) {
66
+ return isZeroWidthSpace(space) || space === ' ';
67
+ }
68
+ /**
69
+ * Converts a string into an array of tokens and the words between them.
70
+ *
71
+ * @param tokenRegex
72
+ * @param text
73
+ */
74
+ export function tokenizeString(tokenRegex, text) {
75
+ const delimeters = text.match(tokenRegex) || [];
76
+ const words = text.split(tokenRegex) || [];
77
+ const final = [];
78
+ for (let i = 0; i < words.length; i++) {
79
+ final.push(words[i], delimeters[i]);
80
+ }
81
+ final.pop();
82
+ return final.filter((word) => word != '');
83
+ }
84
+ /**
85
+ * Measure the width of a string accounting for letter spacing.
86
+ *
87
+ * @param context
88
+ * @param word
89
+ * @param space
90
+ */
91
+ export function measureText(word, space = 0, context) {
92
+ if (!space) {
93
+ return context.measureText(word).width;
94
+ }
95
+ return word.split('').reduce((acc, char) => {
96
+ // Zero-width spaces should not include letter spacing.
97
+ // And since we know the width of a zero-width space is 0, we can skip
98
+ // measuring it.
99
+ if (isZeroWidthSpace(char)) {
100
+ return acc;
101
+ }
102
+ return acc + context.measureText(char).width + space;
103
+ }, 0);
104
+ }
105
+ /**
106
+ * Get the font metrics for a font face.
107
+ *
108
+ * @remarks
109
+ * This function will attempt to grab the explicitly defined metrics from the
110
+ * font face first. If the font face does not have metrics defined, it will
111
+ * attempt to calculate the metrics using the browser's measureText method.
112
+ *
113
+ * If the browser does not support the font metrics API, it will use some
114
+ * default values.
115
+ *
116
+ * @param context
117
+ * @param fontFace
118
+ * @param fontSize
119
+ * @returns
120
+ */
121
+ export function getWebFontMetrics(context, fontFace, fontSize) {
122
+ if (fontFace.metrics) {
123
+ return fontFace.metrics;
124
+ }
125
+ // If the font face doesn't have metrics defined, we fallback to using the
126
+ // browser's measureText method to calculate take a best guess at the font
127
+ // actual font's metrics.
128
+ // - fontBoundingBox[Ascent|Descent] is the best estimate but only supported
129
+ // in Chrome 87+ (2020), Firefox 116+ (2023), and Safari 11.1+ (2018).
130
+ // - It is an estimate as it can vary between browsers.
131
+ // - actualBoundingBox[Ascent|Descent] is less accurate and supported in
132
+ // Chrome 77+ (2019), Firefox 74+ (2020), and Safari 11.1+ (2018).
133
+ // - If neither are supported, we'll use some default values which will
134
+ // get text on the screen but likely not be great.
135
+ // NOTE: It's been decided not to rely on fontBoundingBox[Ascent|Descent]
136
+ // as it's browser support is limited and it also tends to produce higher than
137
+ // expected values. It is instead HIGHLY RECOMMENDED that developers provide
138
+ // explicit metrics in the font face definition.
139
+ const browserMetrics = context.measureText('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz');
140
+ console.warn(`Font metrics not provided for Canvas Web font ${fontFace.fontFamily}. ` +
141
+ 'Using fallback values. It is HIGHLY recommended you use the latest ' +
142
+ 'version of the Lightning 3 `msdf-generator` tool to extract the default ' +
143
+ 'metrics for the font and provide them in the Canvas Web font definition.');
144
+ let metrics;
145
+ if (browserMetrics.actualBoundingBoxDescent &&
146
+ browserMetrics.actualBoundingBoxAscent) {
147
+ metrics = {
148
+ ascender: browserMetrics.actualBoundingBoxAscent / fontSize,
149
+ descender: -browserMetrics.actualBoundingBoxDescent / fontSize,
150
+ lineGap: 0.2,
151
+ };
152
+ }
153
+ else {
154
+ // If the browser doesn't support the font metrics API, we'll use some
155
+ // default values.
156
+ metrics = {
157
+ ascender: 0.8,
158
+ descender: -0.2,
159
+ lineGap: 0.2,
160
+ };
161
+ }
162
+ // Save the calculated metrics to the font face for future use.
163
+ fontFace.metrics = metrics;
164
+ return metrics;
165
+ }
166
+ /**
167
+ * Applies newlines to a string to have it optimally fit into the horizontal
168
+ * bounds set by the Text object's wordWrapWidth property.
169
+ *
170
+ * @param text
171
+ * @param wordWrapWidth
172
+ * @param suffix
173
+ * @param context
174
+ */
175
+ export function wrapWord(word, wordWrapWidth, suffix, context) {
176
+ const suffixWidth = context.measureText(suffix).width;
177
+ const wordLen = word.length;
178
+ const wordWidth = context.measureText(word).width;
179
+ /* If word fits wrapWidth, do nothing */
180
+ if (wordWidth <= wordWrapWidth) {
181
+ return word;
182
+ }
183
+ /* Make initial guess for text cuttoff */
184
+ let cutoffIndex = Math.floor((wordWrapWidth * wordLen) / wordWidth);
185
+ let truncWordWidth = context.measureText(word.substring(0, cutoffIndex)).width +
186
+ suffixWidth;
187
+ /* In case guess was overestimated, shrink it letter by letter. */
188
+ if (truncWordWidth > wordWrapWidth) {
189
+ while (cutoffIndex > 0) {
190
+ truncWordWidth =
191
+ context.measureText(word.substring(0, cutoffIndex)).width +
192
+ suffixWidth;
193
+ if (truncWordWidth > wordWrapWidth) {
194
+ cutoffIndex -= 1;
195
+ }
196
+ else {
197
+ break;
198
+ }
199
+ }
200
+ /* In case guess was underestimated, extend it letter by letter. */
201
+ }
202
+ else {
203
+ while (cutoffIndex < wordLen) {
204
+ truncWordWidth =
205
+ context.measureText(word.substring(0, cutoffIndex)).width +
206
+ suffixWidth;
207
+ if (truncWordWidth < wordWrapWidth) {
208
+ cutoffIndex += 1;
209
+ }
210
+ else {
211
+ // Finally, when bound is crossed, retract last letter.
212
+ cutoffIndex -= 1;
213
+ break;
214
+ }
215
+ }
216
+ }
217
+ /* If wrapWidth is too short to even contain suffix alone, return empty string */
218
+ return (word.substring(0, cutoffIndex) +
219
+ (wordWrapWidth >= suffixWidth ? suffix : ''));
220
+ }
221
+ /**
222
+ * Applies newlines to a string to have it optimally fit into the horizontal
223
+ * bounds set by the Text object's wordWrapWidth property.
224
+ */
225
+ export function wrapText(text, wordWrapWidth, letterSpacing, indent = 0, context) {
226
+ const spaceRegex = / |\u200B/g; // ZWSP and spaces
227
+ const lines = text.split(/\r?\n/g);
228
+ let allLines = [];
229
+ const realNewlines = [];
230
+ for (let i = 0; i < lines.length; i++) {
231
+ const resultLines = [];
232
+ let result = '';
233
+ let spaceLeft = wordWrapWidth - indent;
234
+ // Split the line into words, considering ZWSP
235
+ const words = lines[i].split(spaceRegex);
236
+ const spaces = lines[i].match(spaceRegex) || [];
237
+ for (let j = 0; j < words.length; j++) {
238
+ const space = spaces[j - 1] || '';
239
+ const word = words[j];
240
+ const wordWidth = measureText(word, letterSpacing, context);
241
+ const wordWidthWithSpace = isZeroWidthSpace(space)
242
+ ? wordWidth
243
+ : wordWidth + measureText(space, letterSpacing, context);
244
+ if (j === 0 || wordWidthWithSpace > spaceLeft) {
245
+ if (j > 0) {
246
+ resultLines.push(result);
247
+ result = '';
248
+ }
249
+ result += word;
250
+ spaceLeft = wordWrapWidth - wordWidth - (j === 0 ? indent : 0);
251
+ }
252
+ else {
253
+ spaceLeft -= wordWidthWithSpace;
254
+ result += space + word;
255
+ }
256
+ }
257
+ resultLines.push(result);
258
+ result = '';
259
+ allLines = allLines.concat(resultLines);
260
+ if (i < lines.length - 1) {
261
+ realNewlines.push(allLines.length);
262
+ }
263
+ }
264
+ return { l: allLines, n: realNewlines };
265
+ }
266
+ /**
267
+ * Calculate height for the canvas
268
+ *
269
+ * @param textBaseline
270
+ * @param fontSize
271
+ * @param lineHeight
272
+ * @param numLines
273
+ * @param offsetY
274
+ * @returns
275
+ */
276
+ export function calcHeight(textBaseline, fontSize, lineHeight, numLines) {
277
+ const baselineOffset = textBaseline !== 'bottom' ? 0.5 * fontSize : 0;
278
+ return (lineHeight * (numLines - 1) +
279
+ baselineOffset +
280
+ Math.max(lineHeight, fontSize));
281
+ }
282
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../../../../src/core/text-rendering/renderers/canvas/internal/utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * A wrapper Generator class that makes a generator peekable.
3
+ */
4
+ export declare class PeekableIterator<T = unknown, TReturn = any, TNext = unknown> implements Iterator<T, TReturn, TNext> {
5
+ private iterator;
6
+ private peekBuffer;
7
+ private _lastIndex;
8
+ constructor(iterator: Iterator<T, TReturn, TNext>, indexBase?: number);
9
+ next(): IteratorResult<T, TReturn>;
10
+ peek(): IteratorResult<T, TReturn>;
11
+ get lastIndex(): number;
12
+ }
@@ -0,0 +1,61 @@
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
+ * A wrapper Generator class that makes a generator peekable.
21
+ */
22
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
23
+ export class PeekableIterator {
24
+ iterator;
25
+ peekBuffer = [];
26
+ _lastIndex = -1;
27
+ constructor(iterator, indexBase = 0) {
28
+ this.iterator = iterator;
29
+ this.iterator = iterator;
30
+ this._lastIndex = indexBase - 1;
31
+ this.peekBuffer = [];
32
+ }
33
+ next() {
34
+ const nextResult = this.peekBuffer.length > 0
35
+ ? // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
36
+ this.peekBuffer.pop()
37
+ : this.iterator.next();
38
+ if (nextResult.done === true) {
39
+ this._lastIndex = -1;
40
+ }
41
+ else {
42
+ this._lastIndex++;
43
+ }
44
+ return nextResult;
45
+ }
46
+ peek() {
47
+ if (this.peekBuffer.length > 0) {
48
+ // We know that the buffer is not empty, so we can safely use the
49
+ // non-null assertion operator
50
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
51
+ return this.peekBuffer[0];
52
+ }
53
+ const result = this.iterator.next();
54
+ this.peekBuffer.push(result);
55
+ return result;
56
+ }
57
+ get lastIndex() {
58
+ return this._lastIndex;
59
+ }
60
+ }
61
+ //# sourceMappingURL=PeekableGenerator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PeekableGenerator.js","sourceRoot":"","sources":["../../../../../src/core/text-rendering/sdf/PeekableGenerator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH;;GAEG;AACH,8DAA8D;AAC9D,MAAM,OAAO,gBAAgB;IAMP;IAHZ,UAAU,GAAiC,EAAE,CAAC;IAC9C,UAAU,GAAG,CAAC,CAAC,CAAC;IAExB,YAAoB,QAAqC,EAAE,SAAS,GAAG,CAAC;QAApD,aAAQ,GAAR,QAAQ,CAA6B;QACvD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,UAAU,GAAG,SAAS,GAAG,CAAC,CAAC;QAChC,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;IACvB,CAAC;IAED,IAAI;QACF,MAAM,UAAU,GACd,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC;YACxB,CAAC,CAAC,oEAAoE;gBACpE,IAAI,CAAC,UAAU,CAAC,GAAG,EAAG;YACxB,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QAE3B,IAAI,UAAU,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YAC7B,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,CAAC;QACD,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,IAAI;QACF,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,iEAAiE;YACjE,8BAA8B;YAC9B,oEAAoE;YACpE,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAE,CAAC;QAC7B,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACpC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;CACF"}
@@ -0,0 +1,45 @@
1
+ import type { PeekableIterator } from './PeekableGenerator.js';
2
+ /**
3
+ * Minimal glyph info for performance-focused text shaping
4
+ */
5
+ export interface SimpleGlyphInfo {
6
+ /**
7
+ * Whether the character was successfully mapped to a glyph
8
+ */
9
+ mapped: boolean;
10
+ /**
11
+ * Unicode codepoint
12
+ */
13
+ codepoint: number;
14
+ /**
15
+ * How much to advance horizontally after rendering this glyph
16
+ */
17
+ xAdvance: number;
18
+ }
19
+ /**
20
+ * Minimal font shaper properties
21
+ */
22
+ export interface FontShaperProps {
23
+ /**
24
+ * Font family name
25
+ */
26
+ fontFamily: string;
27
+ /**
28
+ * Font size in pixels
29
+ */
30
+ fontSize: number;
31
+ /**
32
+ * Letter spacing in pixels
33
+ */
34
+ letterSpacing: number;
35
+ }
36
+ /**
37
+ * Functional font shaper interface
38
+ */
39
+ export interface FontShaper {
40
+ shapeText: (props: FontShaperProps, codepoints: PeekableIterator<number>) => Generator<SimpleGlyphInfo, void>;
41
+ }
42
+ /**
43
+ * Create a simple SDF font shaper
44
+ */
45
+ export declare const createSdfFontShaper: () => FontShaper;
@@ -0,0 +1,69 @@
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 2025 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
+ import * as SdfFontHandler from '../SdfFontHandler.js';
20
+ /**
21
+ * Create a simple SDF font shaper
22
+ */
23
+ export const createSdfFontShaper = () => ({
24
+ shapeText: function* (props, codepoints) {
25
+ // Host paths on top
26
+ const fontFamily = props.fontFamily;
27
+ const fontSize = props.fontSize;
28
+ const letterSpacing = props.letterSpacing;
29
+ const fontData = SdfFontHandler.getFontData(fontFamily);
30
+ if (fontData === null)
31
+ return;
32
+ const fontScale = fontSize / fontData.common.lineHeight;
33
+ let prevCodepoint = 0;
34
+ while (true) {
35
+ const result = codepoints.next();
36
+ if (result.done)
37
+ break;
38
+ const codepoint = result.value;
39
+ if (!codepoint)
40
+ continue;
41
+ // Get glyph data
42
+ const glyph = SdfFontHandler.getGlyph(fontFamily, codepoint);
43
+ if (glyph === null) {
44
+ yield {
45
+ mapped: false,
46
+ codepoint,
47
+ xAdvance: 0,
48
+ };
49
+ continue;
50
+ }
51
+ // Calculate advance with kerning
52
+ let advance = glyph.xadvance * fontScale;
53
+ // Add kerning if there's a previous character
54
+ if (prevCodepoint !== 0) {
55
+ const kerning = SdfFontHandler.getKerning(fontFamily, prevCodepoint, codepoint);
56
+ advance += kerning * fontScale;
57
+ }
58
+ // Add letter spacing
59
+ advance += letterSpacing;
60
+ yield {
61
+ mapped: true,
62
+ codepoint,
63
+ xAdvance: advance,
64
+ };
65
+ prevCodepoint = codepoint;
66
+ }
67
+ },
68
+ });
69
+ //# sourceMappingURL=SimpleFontShaper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SimpleFontShaper.js","sourceRoot":"","sources":["../../../../../src/core/text-rendering/sdf/SimpleFontShaper.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,KAAK,cAAc,MAAM,sBAAsB,CAAC;AAgDvD;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAe,EAAE,CAAC,CAAC;IACpD,SAAS,EAAE,QAAQ,CAAC,EAClB,KAAsB,EACtB,UAAoC;QAEpC,oBAAoB;QACpB,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;QACpC,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;QAChC,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC;QAE1C,MAAM,QAAQ,GAAG,cAAc,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;QACxD,IAAI,QAAQ,KAAK,IAAI;YAAE,OAAO;QAE9B,MAAM,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC;QACxD,IAAI,aAAa,GAAG,CAAC,CAAC;QAEtB,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC;YACjC,IAAI,MAAM,CAAC,IAAI;gBAAE,MAAM;YAEvB,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC;YAC/B,IAAI,CAAC,SAAS;gBAAE,SAAS;YAEzB,iBAAiB;YACjB,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;YAC7D,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACnB,MAAM;oBACJ,MAAM,EAAE,KAAK;oBACb,SAAS;oBACT,QAAQ,EAAE,CAAC;iBACZ,CAAC;gBACF,SAAS;YACX,CAAC;YAED,iCAAiC;YACjC,IAAI,OAAO,GAAG,KAAK,CAAC,QAAQ,GAAG,SAAS,CAAC;YAEzC,8CAA8C;YAC9C,IAAI,aAAa,KAAK,CAAC,EAAE,CAAC;gBACxB,MAAM,OAAO,GAAG,cAAc,CAAC,UAAU,CACvC,UAAU,EACV,aAAa,EACb,SAAS,CACV,CAAC;gBACF,OAAO,IAAI,OAAO,GAAG,SAAS,CAAC;YACjC,CAAC;YAED,qBAAqB;YACrB,OAAO,IAAI,aAAa,CAAC;YAEzB,MAAM;gBACJ,MAAM,EAAE,IAAI;gBACZ,SAAS;gBACT,QAAQ,EAAE,OAAO;aAClB,CAAC;YAEF,aAAa,GAAG,SAAS,CAAC;QAC5B,CAAC;IACH,CAAC;CACF,CAAC,CAAC"}