@lightningjs/renderer 2.14.4 → 2.16.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 (210) hide show
  1. package/dist/exports/canvas-shaders.d.ts +10 -0
  2. package/dist/exports/canvas-shaders.js +27 -0
  3. package/dist/exports/canvas-shaders.js.map +1 -0
  4. package/dist/exports/webgl-shaders.d.ts +11 -0
  5. package/dist/exports/webgl-shaders.js +28 -0
  6. package/dist/exports/webgl-shaders.js.map +1 -0
  7. package/dist/src/core/CoreNode.d.ts +8 -0
  8. package/dist/src/core/CoreNode.js +11 -0
  9. package/dist/src/core/CoreNode.js.map +1 -1
  10. package/dist/src/core/Stage.d.ts +36 -0
  11. package/dist/src/core/Stage.js +63 -1
  12. package/dist/src/core/Stage.js.map +1 -1
  13. package/dist/src/core/lib/utils.d.ts +1 -0
  14. package/dist/src/core/lib/utils.js +3 -0
  15. package/dist/src/core/lib/utils.js.map +1 -1
  16. package/dist/src/core/platform.js +29 -3
  17. package/dist/src/core/platform.js.map +1 -1
  18. package/dist/src/core/platforms/Platform.d.ts +37 -0
  19. package/dist/src/core/platforms/Platform.js +22 -0
  20. package/dist/src/core/platforms/Platform.js.map +1 -0
  21. package/dist/src/core/platforms/web/WebPlatform.d.ts +9 -0
  22. package/dist/src/core/platforms/web/WebPlatform.js +58 -0
  23. package/dist/src/core/platforms/web/WebPlatform.js.map +1 -0
  24. package/dist/src/core/renderers/CoreShaderNode.d.ts +59 -0
  25. package/dist/src/core/renderers/CoreShaderNode.js +113 -0
  26. package/dist/src/core/renderers/CoreShaderNode.js.map +1 -0
  27. package/dist/src/core/renderers/CoreShaderProgram.d.ts +4 -0
  28. package/dist/src/core/renderers/CoreShaderProgram.js +20 -0
  29. package/dist/src/core/renderers/CoreShaderProgram.js.map +1 -0
  30. package/dist/src/core/renderers/canvas/CanvasRenderer.d.ts +37 -0
  31. package/dist/src/core/renderers/canvas/CanvasRenderer.js +215 -0
  32. package/dist/src/core/renderers/canvas/CanvasRenderer.js.map +1 -0
  33. package/dist/src/core/renderers/canvas/CanvasShaderNode.d.ts +21 -0
  34. package/dist/src/core/renderers/canvas/CanvasShaderNode.js +57 -0
  35. package/dist/src/core/renderers/canvas/CanvasShaderNode.js.map +1 -0
  36. package/dist/src/core/renderers/canvas/CanvasTexture.d.ts +16 -0
  37. package/dist/src/core/renderers/canvas/CanvasTexture.js +124 -0
  38. package/dist/src/core/renderers/canvas/CanvasTexture.js.map +1 -0
  39. package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.d.ts +12 -0
  40. package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.js +55 -0
  41. package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.js.map +1 -0
  42. package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.d.ts +9 -0
  43. package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.js +38 -0
  44. package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.js.map +1 -0
  45. package/dist/src/core/renderers/webgl/WebGlCtxTexture.d.ts +57 -0
  46. package/dist/src/core/renderers/webgl/WebGlCtxTexture.js +224 -0
  47. package/dist/src/core/renderers/webgl/WebGlCtxTexture.js.map +1 -0
  48. package/dist/src/core/renderers/webgl/WebGlRenderOp.d.ts +44 -0
  49. package/dist/src/core/renderers/webgl/WebGlRenderOp.js +125 -0
  50. package/dist/src/core/renderers/webgl/WebGlRenderOp.js.map +1 -0
  51. package/dist/src/core/renderers/webgl/WebGlRenderer.d.ts +136 -0
  52. package/dist/src/core/renderers/webgl/WebGlRenderer.js +573 -0
  53. package/dist/src/core/renderers/webgl/WebGlRenderer.js.map +1 -0
  54. package/dist/src/core/renderers/webgl/WebGlShaderNode.d.ts +222 -0
  55. package/dist/src/core/renderers/webgl/WebGlShaderNode.js +331 -0
  56. package/dist/src/core/renderers/webgl/WebGlShaderNode.js.map +1 -0
  57. package/dist/src/core/renderers/webgl/WebGlShaderProgram.d.ts +35 -0
  58. package/dist/src/core/renderers/webgl/WebGlShaderProgram.js +201 -0
  59. package/dist/src/core/renderers/webgl/WebGlShaderProgram.js.map +1 -0
  60. package/dist/src/core/shaders/canvas/Border.d.ts +9 -0
  61. package/dist/src/core/shaders/canvas/Border.js +57 -0
  62. package/dist/src/core/shaders/canvas/Border.js.map +1 -0
  63. package/dist/src/core/shaders/canvas/HolePunch.d.ts +7 -0
  64. package/dist/src/core/shaders/canvas/HolePunch.js +38 -0
  65. package/dist/src/core/shaders/canvas/HolePunch.js.map +1 -0
  66. package/dist/src/core/shaders/canvas/LinearGradient.d.ts +10 -0
  67. package/dist/src/core/shaders/canvas/LinearGradient.js +48 -0
  68. package/dist/src/core/shaders/canvas/LinearGradient.js.map +1 -0
  69. package/dist/src/core/shaders/canvas/RadialGradient.d.ts +11 -0
  70. package/dist/src/core/shaders/canvas/RadialGradient.js +70 -0
  71. package/dist/src/core/shaders/canvas/RadialGradient.js.map +1 -0
  72. package/dist/src/core/shaders/canvas/Rounded.d.ts +7 -0
  73. package/dist/src/core/shaders/canvas/Rounded.js +33 -0
  74. package/dist/src/core/shaders/canvas/Rounded.js.map +1 -0
  75. package/dist/src/core/shaders/canvas/RoundedWithBorder.d.ts +7 -0
  76. package/dist/src/core/shaders/canvas/RoundedWithBorder.js +43 -0
  77. package/dist/src/core/shaders/canvas/RoundedWithBorder.js.map +1 -0
  78. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.d.ts +8 -0
  79. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.js +41 -0
  80. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.js.map +1 -0
  81. package/dist/src/core/shaders/canvas/RoundedWithShadow.d.ts +7 -0
  82. package/dist/src/core/shaders/canvas/RoundedWithShadow.js +40 -0
  83. package/dist/src/core/shaders/canvas/RoundedWithShadow.js.map +1 -0
  84. package/dist/src/core/shaders/canvas/Shadow.d.ts +8 -0
  85. package/dist/src/core/shaders/canvas/Shadow.js +31 -0
  86. package/dist/src/core/shaders/canvas/Shadow.js.map +1 -0
  87. package/dist/src/core/shaders/canvas/utils/render.d.ts +5 -0
  88. package/dist/src/core/shaders/canvas/utils/render.js +84 -0
  89. package/dist/src/core/shaders/canvas/utils/render.js.map +1 -0
  90. package/dist/src/core/shaders/templates/BorderTemplate.d.ts +37 -0
  91. package/dist/src/core/shaders/templates/BorderTemplate.js +73 -0
  92. package/dist/src/core/shaders/templates/BorderTemplate.js.map +1 -0
  93. package/dist/src/core/shaders/templates/HolePunchTemplate.d.ts +46 -0
  94. package/dist/src/core/shaders/templates/HolePunchTemplate.js +35 -0
  95. package/dist/src/core/shaders/templates/HolePunchTemplate.js.map +1 -0
  96. package/dist/src/core/shaders/templates/LinearGradientTemplate.d.ts +23 -0
  97. package/dist/src/core/shaders/templates/LinearGradientTemplate.js +47 -0
  98. package/dist/src/core/shaders/templates/LinearGradientTemplate.js.map +1 -0
  99. package/dist/src/core/shaders/templates/RadialGradientTemplate.d.ts +31 -0
  100. package/dist/src/core/shaders/templates/RadialGradientTemplate.js +49 -0
  101. package/dist/src/core/shaders/templates/RadialGradientTemplate.js.map +1 -0
  102. package/dist/src/core/shaders/templates/RoundedTemplate.d.ts +29 -0
  103. package/dist/src/core/shaders/templates/RoundedTemplate.js +67 -0
  104. package/dist/src/core/shaders/templates/RoundedTemplate.js.map +1 -0
  105. package/dist/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.d.ts +7 -0
  106. package/dist/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.js +24 -0
  107. package/dist/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.js.map +1 -0
  108. package/dist/src/core/shaders/templates/RoundedWithBorderTemplate.d.ts +6 -0
  109. package/dist/src/core/shaders/templates/RoundedWithBorderTemplate.js +23 -0
  110. package/dist/src/core/shaders/templates/RoundedWithBorderTemplate.js.map +1 -0
  111. package/dist/src/core/shaders/templates/RoundedWithShadowTemplate.d.ts +6 -0
  112. package/dist/src/core/shaders/templates/RoundedWithShadowTemplate.js +23 -0
  113. package/dist/src/core/shaders/templates/RoundedWithShadowTemplate.js.map +1 -0
  114. package/dist/src/core/shaders/templates/ShadowTemplate.d.ts +34 -0
  115. package/dist/src/core/shaders/templates/ShadowTemplate.js +66 -0
  116. package/dist/src/core/shaders/templates/ShadowTemplate.js.map +1 -0
  117. package/dist/src/core/shaders/templates/shaderUtils.d.ts +5 -0
  118. package/dist/src/core/shaders/templates/shaderUtils.js +41 -0
  119. package/dist/src/core/shaders/templates/shaderUtils.js.map +1 -0
  120. package/dist/src/core/shaders/utils.d.ts +5 -0
  121. package/dist/src/core/shaders/utils.js +41 -0
  122. package/dist/src/core/shaders/utils.js.map +1 -0
  123. package/dist/src/core/shaders/webgl/Border.d.ts +3 -0
  124. package/dist/src/core/shaders/webgl/Border.js +110 -0
  125. package/dist/src/core/shaders/webgl/Border.js.map +1 -0
  126. package/dist/src/core/shaders/webgl/Default.d.ts +2 -0
  127. package/dist/src/core/shaders/webgl/Default.js +86 -0
  128. package/dist/src/core/shaders/webgl/Default.js.map +1 -0
  129. package/dist/src/core/shaders/webgl/DefaultBatched.d.ts +2 -0
  130. package/dist/src/core/shaders/webgl/DefaultBatched.js +104 -0
  131. package/dist/src/core/shaders/webgl/DefaultBatched.js.map +1 -0
  132. package/dist/src/core/shaders/webgl/HolePunch.d.ts +3 -0
  133. package/dist/src/core/shaders/webgl/HolePunch.js +65 -0
  134. package/dist/src/core/shaders/webgl/HolePunch.js.map +1 -0
  135. package/dist/src/core/shaders/webgl/LinearGradient.d.ts +3 -0
  136. package/dist/src/core/shaders/webgl/LinearGradient.js +76 -0
  137. package/dist/src/core/shaders/webgl/LinearGradient.js.map +1 -0
  138. package/dist/src/core/shaders/webgl/RadialGradient.d.ts +3 -0
  139. package/dist/src/core/shaders/webgl/RadialGradient.js +74 -0
  140. package/dist/src/core/shaders/webgl/RadialGradient.js.map +1 -0
  141. package/dist/src/core/shaders/webgl/Rounded.d.ts +7 -0
  142. package/dist/src/core/shaders/webgl/Rounded.js +86 -0
  143. package/dist/src/core/shaders/webgl/Rounded.js.map +1 -0
  144. package/dist/src/core/shaders/webgl/RoundedWithBorder.d.ts +3 -0
  145. package/dist/src/core/shaders/webgl/RoundedWithBorder.js +140 -0
  146. package/dist/src/core/shaders/webgl/RoundedWithBorder.js.map +1 -0
  147. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.d.ts +3 -0
  148. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js +162 -0
  149. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js.map +1 -0
  150. package/dist/src/core/shaders/webgl/RoundedWithShadow.d.ts +3 -0
  151. package/dist/src/core/shaders/webgl/RoundedWithShadow.js +84 -0
  152. package/dist/src/core/shaders/webgl/RoundedWithShadow.js.map +1 -0
  153. package/dist/src/core/shaders/webgl/SdfShader.d.ts +32 -0
  154. package/dist/src/core/shaders/webgl/SdfShader.js +116 -0
  155. package/dist/src/core/shaders/webgl/SdfShader.js.map +1 -0
  156. package/dist/src/core/shaders/webgl/Shadow.d.ts +3 -0
  157. package/dist/src/core/shaders/webgl/Shadow.js +110 -0
  158. package/dist/src/core/shaders/webgl/Shadow.js.map +1 -0
  159. package/dist/src/core/shaders/webgl/Spinner.js +2 -0
  160. package/dist/src/core/shaders/webgl/Spinner.js.map +1 -0
  161. package/dist/src/core/text-rendering/CanvasFontHandler.d.ts +25 -0
  162. package/dist/src/core/text-rendering/CanvasFontHandler.js +117 -0
  163. package/dist/src/core/text-rendering/CanvasFontHandler.js.map +1 -0
  164. package/dist/src/core/text-rendering/CanvasTextRenderer.d.ts +6 -0
  165. package/dist/src/core/text-rendering/CanvasTextRenderer.js +139 -0
  166. package/dist/src/core/text-rendering/CanvasTextRenderer.js.map +1 -0
  167. package/dist/src/core/text-rendering/SdfFontHandler.d.ts +137 -0
  168. package/dist/src/core/text-rendering/SdfFontHandler.js +336 -0
  169. package/dist/src/core/text-rendering/SdfFontHandler.js.map +1 -0
  170. package/dist/src/core/text-rendering/SdfTextRenderer.d.ts +21 -0
  171. package/dist/src/core/text-rendering/SdfTextRenderer.js +324 -0
  172. package/dist/src/core/text-rendering/SdfTextRenderer.js.map +1 -0
  173. package/dist/src/core/text-rendering/TextRenderer.d.ts +425 -0
  174. package/dist/src/core/text-rendering/TextRenderer.js +70 -0
  175. package/dist/src/core/text-rendering/TextRenderer.js.map +1 -0
  176. package/dist/src/core/text-rendering/Utils.d.ts +71 -0
  177. package/dist/src/core/text-rendering/Utils.js +212 -0
  178. package/dist/src/core/text-rendering/Utils.js.map +1 -0
  179. package/dist/src/core/text-rendering/canvas/Settings.d.ts +53 -0
  180. package/dist/src/core/text-rendering/canvas/Settings.js +20 -0
  181. package/dist/src/core/text-rendering/canvas/Settings.js.map +1 -0
  182. package/dist/src/core/text-rendering/canvas/Utils.d.ts +19 -0
  183. package/dist/src/core/text-rendering/canvas/Utils.js +139 -0
  184. package/dist/src/core/text-rendering/canvas/Utils.js.map +1 -0
  185. package/dist/src/core/text-rendering/canvas/calculateRenderInfo.d.ts +37 -0
  186. package/dist/src/core/text-rendering/canvas/calculateRenderInfo.js +188 -0
  187. package/dist/src/core/text-rendering/canvas/calculateRenderInfo.js.map +1 -0
  188. package/dist/src/core/text-rendering/canvas/draw.d.ts +12 -0
  189. package/dist/src/core/text-rendering/canvas/draw.js +133 -0
  190. package/dist/src/core/text-rendering/canvas/draw.js.map +1 -0
  191. package/dist/src/core/text-rendering/sdf/PeekableGenerator.d.ts +12 -0
  192. package/dist/src/core/text-rendering/sdf/PeekableGenerator.js +61 -0
  193. package/dist/src/core/text-rendering/sdf/PeekableGenerator.js.map +1 -0
  194. package/dist/src/core/text-rendering/sdf/SimpleFontShaper.d.ts +45 -0
  195. package/dist/src/core/text-rendering/sdf/SimpleFontShaper.js +69 -0
  196. package/dist/src/core/text-rendering/sdf/SimpleFontShaper.js.map +1 -0
  197. package/dist/src/core/utils.d.ts +1 -1
  198. package/dist/src/main-api/Renderer.d.ts +46 -0
  199. package/dist/src/main-api/Renderer.js +38 -0
  200. package/dist/src/main-api/Renderer.js.map +1 -1
  201. package/dist/tsconfig.dist.tsbuildinfo +1 -1
  202. package/package.json +2 -1
  203. package/src/core/CoreNode.ts +19 -0
  204. package/src/core/Stage.ts +79 -1
  205. package/src/core/lib/utils.ts +4 -0
  206. package/src/core/platform.ts +40 -3
  207. package/src/main-api/Renderer.ts +56 -0
  208. package/dist/src/core/renderers/webgl/WebGlCoreShader.destroy.js +0 -2
  209. package/dist/src/core/renderers/webgl/WebGlCoreShader.destroy.js.map +0 -1
  210. /package/dist/src/core/{renderers/webgl/WebGlCoreShader.destroy.d.ts → shaders/webgl/Spinner.d.ts} +0 -0
@@ -0,0 +1,188 @@
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 { calculateFontMetrics } from '../Utils.js';
20
+ import { wrapText, wrapWord, measureText, calcHeight } from './Utils.js';
21
+ import { getFontMetrics, setFontMetrics } from '../CanvasFontHandler.js';
22
+ import { TextAlign, TextBaselineValueToKey } from '../TextRenderer.js';
23
+ export function calculateRenderInfo({ context, settings, }) {
24
+ const precision = settings.precision;
25
+ const paddingLeft = settings.paddingLeft * precision;
26
+ const paddingRight = settings.paddingRight * precision;
27
+ const fontSize = settings.fontSize * precision;
28
+ let offsetY = settings.offsetY === null ? null : settings.offsetY * precision;
29
+ const w = settings.w * precision;
30
+ const h = settings.h * precision;
31
+ let wordWrapWidth = settings.wordWrapWidth * precision;
32
+ const cutSx = settings.cutSx * precision;
33
+ const cutEx = settings.cutEx * precision;
34
+ const cutSy = settings.cutSy * precision;
35
+ const cutEy = settings.cutEy * precision;
36
+ const letterSpacing = (settings.letterSpacing || 0) * precision;
37
+ const textIndent = settings.textIndent * precision;
38
+ const fontFamily = settings.fontFamily;
39
+ // Set font properties
40
+ context.font = `${settings.fontStyle} ${fontSize}px ${fontFamily}`;
41
+ context.textBaseline = TextBaselineValueToKey[settings.textBaseline];
42
+ let metrics = getFontMetrics(fontFamily);
43
+ if (metrics === null) {
44
+ metrics = calculateFontMetrics(context, fontFamily, fontSize);
45
+ setFontMetrics(fontFamily, metrics);
46
+ }
47
+ const defLineHeight = fontSize *
48
+ (metrics.ascender - metrics.descender + metrics.lineGap) *
49
+ precision;
50
+ const lineHeight = settings.lineHeight !== null
51
+ ? settings.lineHeight * precision
52
+ : defLineHeight;
53
+ const maxHeight = settings.maxHeight;
54
+ const containedMaxLines = maxHeight !== null && lineHeight > 0
55
+ ? Math.floor(maxHeight / lineHeight)
56
+ : 0;
57
+ const setMaxLines = settings.maxLines;
58
+ const calcMaxLines = containedMaxLines > 0 && setMaxLines > 0
59
+ ? Math.min(containedMaxLines, setMaxLines)
60
+ : Math.max(containedMaxLines, setMaxLines);
61
+ const textOverflow = settings.textOverflow;
62
+ const wordWrap = settings.wordWrap;
63
+ // Total width
64
+ let width = w || 2048 / precision;
65
+ // Inner width
66
+ let innerWidth = width - paddingLeft;
67
+ if (innerWidth < 10) {
68
+ width += 10 - innerWidth;
69
+ innerWidth = 10;
70
+ }
71
+ if (wordWrapWidth === 0) {
72
+ wordWrapWidth = innerWidth;
73
+ }
74
+ // Text overflow
75
+ let text = settings.text;
76
+ if (textOverflow !== null && wordWrap === false) {
77
+ let suffix;
78
+ switch (textOverflow) {
79
+ case 'clip':
80
+ suffix = '';
81
+ break;
82
+ case 'ellipsis':
83
+ suffix = settings.overflowSuffix;
84
+ break;
85
+ default:
86
+ suffix = String(textOverflow);
87
+ }
88
+ text = wrapWord(context, text, wordWrapWidth - textIndent, suffix, letterSpacing);
89
+ }
90
+ // Word wrap
91
+ let linesInfo;
92
+ if (wordWrap === true) {
93
+ linesInfo = wrapText(context, text, wordWrapWidth, letterSpacing, textIndent);
94
+ }
95
+ else {
96
+ linesInfo = { l: text.split(/(?:\r\n|\r|\n)/), n: [] };
97
+ const n = linesInfo.l.length;
98
+ for (let i = 0; i < n - 1; i++) {
99
+ linesInfo.n.push(i);
100
+ }
101
+ }
102
+ let lines = linesInfo.l;
103
+ let remainingText = '';
104
+ let moreTextLines = false;
105
+ if (calcMaxLines > 0 && lines.length > calcMaxLines) {
106
+ const usedLines = lines.slice(0, calcMaxLines);
107
+ let otherLines = [];
108
+ const overflowSuffix = settings.overflowSuffix;
109
+ if (overflowSuffix.length > 0) {
110
+ const w = measureText(context, overflowSuffix, letterSpacing);
111
+ const al = wrapText(context, usedLines[usedLines.length - 1], wordWrapWidth - w, letterSpacing, textIndent);
112
+ usedLines[usedLines.length - 1] = `${al.l[0]}${overflowSuffix}`;
113
+ otherLines = [al.l.length > 1 ? al.l[1] : ''];
114
+ }
115
+ else {
116
+ otherLines = [''];
117
+ }
118
+ // Re-assemble the remaining text
119
+ let i;
120
+ const n = lines.length;
121
+ let j = 0;
122
+ const m = linesInfo.n.length;
123
+ for (i = calcMaxLines; i < n; i++) {
124
+ otherLines[j] += `${otherLines[j] ? ' ' : ''}${lines[i] ?? ''}`;
125
+ if (i + 1 < m && linesInfo.n[i + 1] !== undefined) {
126
+ j++;
127
+ }
128
+ }
129
+ remainingText = otherLines.join('\n');
130
+ moreTextLines = true;
131
+ lines = usedLines;
132
+ }
133
+ // Calculate text width
134
+ let maxLineWidth = 0;
135
+ const lineWidths = [];
136
+ for (let i = 0; i < lines.length; i++) {
137
+ const lineWidth = measureText(context, lines[i], letterSpacing) +
138
+ (i === 0 ? textIndent : 0);
139
+ lineWidths.push(lineWidth);
140
+ maxLineWidth = Math.max(maxLineWidth, lineWidth);
141
+ }
142
+ if (w === 0) {
143
+ width = maxLineWidth + paddingLeft + paddingRight;
144
+ innerWidth = maxLineWidth;
145
+ }
146
+ if (wordWrap === true &&
147
+ w > maxLineWidth &&
148
+ settings.textAlign === TextAlign.left &&
149
+ lines.length === 1) {
150
+ width = maxLineWidth + paddingLeft + paddingRight;
151
+ }
152
+ let height;
153
+ if (h > 0) {
154
+ height = h;
155
+ }
156
+ else {
157
+ height = calcHeight(settings.textBaseline, fontSize, lineHeight, lines.length, offsetY);
158
+ }
159
+ if (offsetY === null) {
160
+ offsetY = fontSize;
161
+ }
162
+ return {
163
+ w: width,
164
+ h: height,
165
+ lines,
166
+ precision,
167
+ remainingText,
168
+ moreTextLines,
169
+ width,
170
+ innerWidth,
171
+ height,
172
+ fontSize,
173
+ cutSx,
174
+ cutSy,
175
+ cutEx,
176
+ cutEy,
177
+ lineHeight,
178
+ defLineHeight,
179
+ lineWidths,
180
+ offsetY: offsetY,
181
+ paddingLeft,
182
+ paddingRight,
183
+ letterSpacing,
184
+ textIndent,
185
+ metrics,
186
+ };
187
+ }
188
+ //# sourceMappingURL=calculateRenderInfo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calculateRenderInfo.js","sourceRoot":"","sources":["../../../../../src/core/text-rendering/canvas/calculateRenderInfo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { RenderInfo } from './calculateRenderInfo.js';
2
+ import type { Settings } from './Settings.js';
3
+ export declare const draw: ({ canvas, context, renderInfo, settings, linesOverride, }: {
4
+ canvas: OffscreenCanvas | HTMLCanvasElement;
5
+ context: OffscreenCanvasRenderingContext2D | CanvasRenderingContext2D;
6
+ renderInfo: RenderInfo;
7
+ settings: Settings;
8
+ linesOverride?: {
9
+ lines: string[];
10
+ lineWidths: number[];
11
+ };
12
+ }) => void;
@@ -0,0 +1,133 @@
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 { getRgbaString } from '../../lib/utils.js';
20
+ import { calcHeight, measureText } from './Utils.js';
21
+ import { TextAlign, TextBaselineValueToKey, TextVerticalAlign } from '../TextRenderer.js';
22
+ const MAX_TEXTURE_DIMENSION = 4096;
23
+ export const draw = ({ canvas, context, renderInfo, settings, linesOverride, }) => {
24
+ const fontSize = renderInfo.fontSize;
25
+ const lineHeight = renderInfo.lineHeight;
26
+ const precision = settings.precision;
27
+ const lines = linesOverride?.lines || renderInfo.lines;
28
+ const lineWidths = linesOverride?.lineWidths || renderInfo.lineWidths;
29
+ const height = linesOverride !== undefined
30
+ ? calcHeight(settings.textBaseline, fontSize, lineHeight, linesOverride.lines.length, settings.offsetY === null ? null : settings.offsetY * precision)
31
+ : renderInfo.height;
32
+ // Add extra margin to prevent issue with clipped text when scaling.
33
+ canvas.width = Math.min(Math.ceil(renderInfo.width + settings.textRenderIssueMargin), MAX_TEXTURE_DIMENSION);
34
+ canvas.height = Math.min(Math.ceil(height), MAX_TEXTURE_DIMENSION);
35
+ // Canvas context has been reset.
36
+ context.font = `${settings.fontStyle} ${fontSize}px ${settings.fontFamily}`;
37
+ context.textBaseline = TextBaselineValueToKey[settings.textBaseline];
38
+ if (fontSize >= 128) {
39
+ context.globalAlpha = 0.01;
40
+ context.fillRect(0, 0, 0.01, 0.01);
41
+ context.globalAlpha = 1.0;
42
+ }
43
+ if (renderInfo.cutSx || renderInfo.cutSy) {
44
+ context.translate(-renderInfo.cutSx, -renderInfo.cutSy);
45
+ }
46
+ let linePositionX;
47
+ let linePositionY;
48
+ const drawLines = [];
49
+ const metrics = renderInfo.metrics;
50
+ const ascenderPx = metrics ? metrics.ascender * fontSize : fontSize;
51
+ const bareLineHeightPx = metrics
52
+ ? (metrics.ascender - metrics.descender) * fontSize
53
+ : fontSize;
54
+ for (let i = 0, n = lines.length; i < n; i++) {
55
+ linePositionX = i === 0 ? renderInfo.textIndent : 0;
56
+ linePositionY = i * lineHeight + ascenderPx;
57
+ if (settings.verticalAlign === TextVerticalAlign.middle) {
58
+ linePositionY += (lineHeight - bareLineHeightPx) / 2;
59
+ }
60
+ else if (settings.verticalAlign === TextVerticalAlign.bottom) {
61
+ linePositionY += lineHeight - bareLineHeightPx;
62
+ }
63
+ if (settings.textAlign === TextAlign.right) {
64
+ linePositionX += renderInfo.innerWidth - lineWidths[i];
65
+ }
66
+ else if (settings.textAlign === TextAlign.center) {
67
+ linePositionX += (renderInfo.innerWidth - lineWidths[i]) / 2;
68
+ }
69
+ linePositionX += renderInfo.paddingLeft;
70
+ drawLines.push({
71
+ text: lines[i],
72
+ x: linePositionX,
73
+ y: linePositionY,
74
+ w: lineWidths[i],
75
+ });
76
+ }
77
+ // Highlight
78
+ if (settings.highlight === true) {
79
+ const color = settings.highlightColor;
80
+ const hlHeight = settings.highlightHeight * precision || fontSize * 1.5;
81
+ const offset = settings.highlightOffset * precision;
82
+ const hlPaddingLeft = settings.highlightPaddingLeft !== null
83
+ ? settings.highlightPaddingLeft * precision
84
+ : renderInfo.paddingLeft;
85
+ const hlPaddingRight = settings.highlightPaddingRight !== null
86
+ ? settings.highlightPaddingRight * precision
87
+ : renderInfo.paddingRight;
88
+ context.fillStyle = getRgbaString(color);
89
+ for (let i = 0; i < drawLines.length; i++) {
90
+ const drawLine = drawLines[i];
91
+ context.fillRect(drawLine.x - hlPaddingLeft, drawLine.y - renderInfo.offsetY + offset, drawLine.w + hlPaddingRight + hlPaddingLeft, hlHeight);
92
+ }
93
+ }
94
+ // Text shadow
95
+ let prevShadowSettings = null;
96
+ if (settings.shadow === true) {
97
+ prevShadowSettings = [
98
+ context.shadowColor,
99
+ context.shadowOffsetX,
100
+ context.shadowOffsetY,
101
+ context.shadowBlur,
102
+ ];
103
+ context.shadowColor = getRgbaString(settings.shadowColor);
104
+ context.shadowOffsetX = settings.shadowOffsetX * precision;
105
+ context.shadowOffsetY = settings.shadowOffsetY * precision;
106
+ context.shadowBlur = settings.shadowBlur * precision;
107
+ }
108
+ context.fillStyle = getRgbaString(settings.textColor);
109
+ for (let i = 0, n = drawLines.length; i < n; i++) {
110
+ const drawLine = drawLines[i];
111
+ if (renderInfo.letterSpacing === 0) {
112
+ context.fillText(drawLine.text, drawLine.x, drawLine.y);
113
+ }
114
+ else {
115
+ const textSplit = drawLine.text.split('');
116
+ let x = drawLine.x;
117
+ for (let i = 0, j = textSplit.length; i < j; i++) {
118
+ context.fillText(textSplit[i], x, drawLine.y);
119
+ x += measureText(context, textSplit[i], renderInfo.letterSpacing);
120
+ }
121
+ }
122
+ }
123
+ if (prevShadowSettings) {
124
+ context.shadowColor = prevShadowSettings[0];
125
+ context.shadowOffsetX = prevShadowSettings[1];
126
+ context.shadowOffsetY = prevShadowSettings[2];
127
+ context.shadowBlur = prevShadowSettings[3];
128
+ }
129
+ if (renderInfo.cutSx || renderInfo.cutSy) {
130
+ context.translate(renderInfo.cutSx, renderInfo.cutSy);
131
+ }
132
+ };
133
+ //# sourceMappingURL=draw.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"draw.js","sourceRoot":"","sources":["../../../../../src/core/text-rendering/canvas/draw.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAIrD,OAAO,EAAE,SAAS,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE1F,MAAM,qBAAqB,GAAG,IAAI,CAAC;AAEnC,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,EACnB,MAAM,EACN,OAAO,EACP,UAAU,EACV,QAAQ,EACR,aAAa,GAOd,EAAE,EAAE;IACH,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC;IACrC,MAAM,UAAU,GAAG,UAAU,CAAC,UAAU,CAAC;IACzC,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC;IACrC,MAAM,KAAK,GAAG,aAAa,EAAE,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC;IACvD,MAAM,UAAU,GAAG,aAAa,EAAE,UAAU,IAAI,UAAU,CAAC,UAAU,CAAC;IACtE,MAAM,MAAM,GACV,aAAa,KAAK,SAAS;QACzB,CAAC,CAAC,UAAU,CACR,QAAQ,CAAC,YAAY,EACrB,QAAQ,EACR,UAAU,EACV,aAAa,CAAC,KAAK,CAAC,MAAM,EAC1B,QAAQ,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,GAAG,SAAS,CAChE;QACH,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC;IAExB,oEAAoE;IACpE,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CACrB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,GAAG,QAAQ,CAAC,qBAAqB,CAAC,EAC5D,qBAAqB,CACtB,CAAC;IACF,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,qBAAqB,CAAC,CAAC;IAEnE,iCAAiC;IACjC,OAAO,CAAC,IAAI,GAAG,GAAG,QAAQ,CAAC,SAAS,IAAI,QAAQ,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC;IAC5E,OAAO,CAAC,YAAY,GAAG,sBAAsB,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IAErE,IAAI,QAAQ,IAAI,GAAG,EAAE,CAAC;QACpB,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;QAC3B,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACnC,OAAO,CAAC,WAAW,GAAG,GAAG,CAAC;IAC5B,CAAC;IAED,IAAI,UAAU,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;QACzC,OAAO,CAAC,SAAS,CAAC,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IAC1D,CAAC;IAED,IAAI,aAAqB,CAAC;IAC1B,IAAI,aAAqB,CAAC;IAC1B,MAAM,SAAS,GAAe,EAAE,CAAC;IACjC,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC;IACnC,MAAM,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;IACpE,MAAM,gBAAgB,GAAG,OAAO;QAC9B,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,GAAG,QAAQ;QACnD,CAAC,CAAC,QAAQ,CAAC;IAEb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7C,aAAa,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QACpD,aAAa,GAAG,CAAC,GAAG,UAAU,GAAG,UAAU,CAAC;QAC5C,IAAI,QAAQ,CAAC,aAAa,KAAK,iBAAiB,CAAC,MAAM,EAAE,CAAC;YACxD,aAAa,IAAI,CAAC,UAAU,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;QACvD,CAAC;aAAM,IAAI,QAAQ,CAAC,aAAa,KAAK,iBAAiB,CAAC,MAAM,EAAE,CAAC;YAC/D,aAAa,IAAI,UAAU,GAAG,gBAAgB,CAAC;QACjD,CAAC;QACD,IAAI,QAAQ,CAAC,SAAS,KAAK,SAAS,CAAC,KAAK,EAAE,CAAC;YAC3C,aAAa,IAAI,UAAU,CAAC,UAAU,GAAG,UAAU,CAAC,CAAC,CAAE,CAAC;QAC1D,CAAC;aAAM,IAAI,QAAQ,CAAC,SAAS,KAAK,SAAS,CAAC,MAAM,EAAE,CAAC;YACnD,aAAa,IAAI,CAAC,UAAU,CAAC,UAAU,GAAG,UAAU,CAAC,CAAC,CAAE,CAAC,GAAG,CAAC,CAAC;QAChE,CAAC;QACD,aAAa,IAAI,UAAU,CAAC,WAAW,CAAC;QACxC,SAAS,CAAC,IAAI,CAAC;YACb,IAAI,EAAE,KAAK,CAAC,CAAC,CAAE;YACf,CAAC,EAAE,aAAa;YAChB,CAAC,EAAE,aAAa;YAChB,CAAC,EAAE,UAAU,CAAC,CAAC,CAAE;SAClB,CAAC,CAAC;IACL,CAAC;IAED,YAAY;IACZ,IAAI,QAAQ,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,QAAQ,CAAC,cAAc,CAAC;QACtC,MAAM,QAAQ,GAAG,QAAQ,CAAC,eAAe,GAAG,SAAS,IAAI,QAAQ,GAAG,GAAG,CAAC;QACxE,MAAM,MAAM,GAAG,QAAQ,CAAC,eAAe,GAAG,SAAS,CAAC;QACpD,MAAM,aAAa,GACjB,QAAQ,CAAC,oBAAoB,KAAK,IAAI;YACpC,CAAC,CAAC,QAAQ,CAAC,oBAAoB,GAAG,SAAS;YAC3C,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC;QAC7B,MAAM,cAAc,GAClB,QAAQ,CAAC,qBAAqB,KAAK,IAAI;YACrC,CAAC,CAAC,QAAQ,CAAC,qBAAqB,GAAG,SAAS;YAC5C,CAAC,CAAC,UAAU,CAAC,YAAY,CAAC;QAC9B,OAAO,CAAC,SAAS,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;QACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1C,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAE,CAAC;YAC/B,OAAO,CAAC,QAAQ,CACd,QAAQ,CAAC,CAAC,GAAG,aAAa,EAC1B,QAAQ,CAAC,CAAC,GAAG,UAAU,CAAC,OAAO,GAAG,MAAM,EACxC,QAAQ,CAAC,CAAC,GAAG,cAAc,GAAG,aAAa,EAC3C,QAAQ,CACT,CAAC;QACJ,CAAC;IACH,CAAC;IAED,cAAc;IACd,IAAI,kBAAkB,GAA4C,IAAI,CAAC;IACvE,IAAI,QAAQ,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;QAC7B,kBAAkB,GAAG;YACnB,OAAO,CAAC,WAAW;YACnB,OAAO,CAAC,aAAa;YACrB,OAAO,CAAC,aAAa;YACrB,OAAO,CAAC,UAAU;SACnB,CAAC;QACF,OAAO,CAAC,WAAW,GAAG,aAAa,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QAC1D,OAAO,CAAC,aAAa,GAAG,QAAQ,CAAC,aAAa,GAAG,SAAS,CAAC;QAC3D,OAAO,CAAC,aAAa,GAAG,QAAQ,CAAC,aAAa,GAAG,SAAS,CAAC;QAC3D,OAAO,CAAC,UAAU,GAAG,QAAQ,CAAC,UAAU,GAAG,SAAS,CAAC;IACvD,CAAC;IAED,OAAO,CAAC,SAAS,GAAG,aAAa,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACtD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACjD,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAE,CAAC;QAC/B,IAAI,UAAU,CAAC,aAAa,KAAK,CAAC,EAAE,CAAC;YACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC1D,CAAC;aAAM,CAAC;YACN,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC1C,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;YACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBACjD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAE,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAC/C,CAAC,IAAI,WAAW,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAE,EAAE,UAAU,CAAC,aAAa,CAAC,CAAC;YACrE,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,kBAAkB,EAAE,CAAC;QACvB,OAAO,CAAC,WAAW,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;QAC5C,OAAO,CAAC,aAAa,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;QAC9C,OAAO,CAAC,aAAa,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;QAC9C,OAAO,CAAC,UAAU,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED,IAAI,UAAU,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;QACzC,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;IACxD,CAAC;AACH,CAAC,CAAC"}
@@ -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"}
@@ -4,7 +4,7 @@
4
4
  * @module
5
5
  */
6
6
  export declare const EPSILON = 0.000001;
7
- export declare let ARRAY_TYPE: Float32ArrayConstructor | ArrayConstructor;
7
+ export declare let ARRAY_TYPE: ArrayConstructor | Float32ArrayConstructor;
8
8
  export declare const RANDOM: () => number;
9
9
  export declare const ANGLE_ORDER = "zyx";
10
10
  export declare const setMatrixArrayType: (type: Float32ArrayConstructor | ArrayConstructor) => void;
@@ -113,6 +113,21 @@ export interface RendererMainSettings {
113
113
  * @defaultValue `0` (disabled)
114
114
  */
115
115
  fpsUpdateInterval?: number;
116
+ /**
117
+ * Target FPS for the global render loop
118
+ *
119
+ * @remarks
120
+ * Controls the maximum frame rate of the entire rendering system.
121
+ * When set to 0, no throttling is applied (use display refresh rate).
122
+ * When set to a positive number, the global requestAnimationFrame loop
123
+ * will be throttled to this target FPS, affecting all animations and rendering.
124
+ *
125
+ * This provides global performance control for the entire application,
126
+ * useful for managing performance on lower-end devices.
127
+ *
128
+ * @defaultValue `0` (no throttling, use display refresh rate)
129
+ */
130
+ targetFPS?: number;
116
131
  /**
117
132
  * Include context call (i.e. WebGL) information in FPS updates
118
133
  *
@@ -493,5 +508,36 @@ export declare class RendererMain extends EventEmitter {
493
508
  * @param color - The color to set as the clear color.
494
509
  */
495
510
  setClearColor(color: number): void;
511
+ /**
512
+ * Gets the target FPS for the global render loop
513
+ *
514
+ * @returns The current target FPS (0 means no throttling)
515
+ *
516
+ * @remarks
517
+ * This controls the maximum frame rate of the entire rendering system.
518
+ * When 0, the system runs at display refresh rate.
519
+ */
520
+ get targetFPS(): number;
521
+ /**
522
+ * Sets the target FPS for the global render loop
523
+ *
524
+ * @param fps - The target FPS to set for the global render loop.
525
+ * Set to 0 or a negative value to disable throttling.
526
+ *
527
+ * @remarks
528
+ * This setting affects the entire rendering system immediately.
529
+ * All animations, rendering, and frame updates will be throttled
530
+ * to this target FPS. Provides global performance control.
531
+ *
532
+ * @example
533
+ * ```typescript
534
+ * // Set global target to 30fps for better performance
535
+ * renderer.targetFPS = 30;
536
+ *
537
+ * // Disable global throttling (use display refresh rate)
538
+ * renderer.targetFPS = 0;
539
+ * ```
540
+ */
541
+ set targetFPS(fps: number);
496
542
  }
497
543
  export {};