@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.
- package/dist/exports/canvas-shaders.d.ts +10 -0
- package/dist/exports/canvas-shaders.js +27 -0
- package/dist/exports/canvas-shaders.js.map +1 -0
- package/dist/exports/webgl-shaders.d.ts +11 -0
- package/dist/exports/webgl-shaders.js +28 -0
- package/dist/exports/webgl-shaders.js.map +1 -0
- package/dist/src/core/CoreNode.d.ts +8 -0
- package/dist/src/core/CoreNode.js +11 -0
- package/dist/src/core/CoreNode.js.map +1 -1
- package/dist/src/core/Stage.d.ts +36 -0
- package/dist/src/core/Stage.js +63 -1
- package/dist/src/core/Stage.js.map +1 -1
- package/dist/src/core/lib/utils.d.ts +1 -0
- package/dist/src/core/lib/utils.js +3 -0
- package/dist/src/core/lib/utils.js.map +1 -1
- package/dist/src/core/platform.js +29 -3
- package/dist/src/core/platform.js.map +1 -1
- package/dist/src/core/platforms/Platform.d.ts +37 -0
- package/dist/src/core/platforms/Platform.js +22 -0
- package/dist/src/core/platforms/Platform.js.map +1 -0
- package/dist/src/core/platforms/web/WebPlatform.d.ts +9 -0
- package/dist/src/core/platforms/web/WebPlatform.js +58 -0
- package/dist/src/core/platforms/web/WebPlatform.js.map +1 -0
- package/dist/src/core/renderers/CoreShaderNode.d.ts +59 -0
- package/dist/src/core/renderers/CoreShaderNode.js +113 -0
- package/dist/src/core/renderers/CoreShaderNode.js.map +1 -0
- package/dist/src/core/renderers/CoreShaderProgram.d.ts +4 -0
- package/dist/src/core/renderers/CoreShaderProgram.js +20 -0
- package/dist/src/core/renderers/CoreShaderProgram.js.map +1 -0
- package/dist/src/core/renderers/canvas/CanvasRenderer.d.ts +37 -0
- package/dist/src/core/renderers/canvas/CanvasRenderer.js +215 -0
- package/dist/src/core/renderers/canvas/CanvasRenderer.js.map +1 -0
- package/dist/src/core/renderers/canvas/CanvasShaderNode.d.ts +21 -0
- package/dist/src/core/renderers/canvas/CanvasShaderNode.js +57 -0
- package/dist/src/core/renderers/canvas/CanvasShaderNode.js.map +1 -0
- package/dist/src/core/renderers/canvas/CanvasTexture.d.ts +16 -0
- package/dist/src/core/renderers/canvas/CanvasTexture.js +124 -0
- package/dist/src/core/renderers/canvas/CanvasTexture.js.map +1 -0
- package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.d.ts +12 -0
- package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.js +55 -0
- package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.js.map +1 -0
- package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.d.ts +9 -0
- package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.js +38 -0
- package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.js.map +1 -0
- package/dist/src/core/renderers/webgl/WebGlCtxTexture.d.ts +57 -0
- package/dist/src/core/renderers/webgl/WebGlCtxTexture.js +224 -0
- package/dist/src/core/renderers/webgl/WebGlCtxTexture.js.map +1 -0
- package/dist/src/core/renderers/webgl/WebGlRenderOp.d.ts +44 -0
- package/dist/src/core/renderers/webgl/WebGlRenderOp.js +125 -0
- package/dist/src/core/renderers/webgl/WebGlRenderOp.js.map +1 -0
- package/dist/src/core/renderers/webgl/WebGlRenderer.d.ts +136 -0
- package/dist/src/core/renderers/webgl/WebGlRenderer.js +573 -0
- package/dist/src/core/renderers/webgl/WebGlRenderer.js.map +1 -0
- package/dist/src/core/renderers/webgl/WebGlShaderNode.d.ts +222 -0
- package/dist/src/core/renderers/webgl/WebGlShaderNode.js +331 -0
- package/dist/src/core/renderers/webgl/WebGlShaderNode.js.map +1 -0
- package/dist/src/core/renderers/webgl/WebGlShaderProgram.d.ts +35 -0
- package/dist/src/core/renderers/webgl/WebGlShaderProgram.js +201 -0
- package/dist/src/core/renderers/webgl/WebGlShaderProgram.js.map +1 -0
- package/dist/src/core/shaders/canvas/Border.d.ts +9 -0
- package/dist/src/core/shaders/canvas/Border.js +57 -0
- package/dist/src/core/shaders/canvas/Border.js.map +1 -0
- package/dist/src/core/shaders/canvas/HolePunch.d.ts +7 -0
- package/dist/src/core/shaders/canvas/HolePunch.js +38 -0
- package/dist/src/core/shaders/canvas/HolePunch.js.map +1 -0
- package/dist/src/core/shaders/canvas/LinearGradient.d.ts +10 -0
- package/dist/src/core/shaders/canvas/LinearGradient.js +48 -0
- package/dist/src/core/shaders/canvas/LinearGradient.js.map +1 -0
- package/dist/src/core/shaders/canvas/RadialGradient.d.ts +11 -0
- package/dist/src/core/shaders/canvas/RadialGradient.js +70 -0
- package/dist/src/core/shaders/canvas/RadialGradient.js.map +1 -0
- package/dist/src/core/shaders/canvas/Rounded.d.ts +7 -0
- package/dist/src/core/shaders/canvas/Rounded.js +33 -0
- package/dist/src/core/shaders/canvas/Rounded.js.map +1 -0
- package/dist/src/core/shaders/canvas/RoundedWithBorder.d.ts +7 -0
- package/dist/src/core/shaders/canvas/RoundedWithBorder.js +43 -0
- package/dist/src/core/shaders/canvas/RoundedWithBorder.js.map +1 -0
- package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.d.ts +8 -0
- package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.js +41 -0
- package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.js.map +1 -0
- package/dist/src/core/shaders/canvas/RoundedWithShadow.d.ts +7 -0
- package/dist/src/core/shaders/canvas/RoundedWithShadow.js +40 -0
- package/dist/src/core/shaders/canvas/RoundedWithShadow.js.map +1 -0
- package/dist/src/core/shaders/canvas/Shadow.d.ts +8 -0
- package/dist/src/core/shaders/canvas/Shadow.js +31 -0
- package/dist/src/core/shaders/canvas/Shadow.js.map +1 -0
- package/dist/src/core/shaders/canvas/utils/render.d.ts +5 -0
- package/dist/src/core/shaders/canvas/utils/render.js +84 -0
- package/dist/src/core/shaders/canvas/utils/render.js.map +1 -0
- package/dist/src/core/shaders/templates/BorderTemplate.d.ts +37 -0
- package/dist/src/core/shaders/templates/BorderTemplate.js +73 -0
- package/dist/src/core/shaders/templates/BorderTemplate.js.map +1 -0
- package/dist/src/core/shaders/templates/HolePunchTemplate.d.ts +46 -0
- package/dist/src/core/shaders/templates/HolePunchTemplate.js +35 -0
- package/dist/src/core/shaders/templates/HolePunchTemplate.js.map +1 -0
- package/dist/src/core/shaders/templates/LinearGradientTemplate.d.ts +23 -0
- package/dist/src/core/shaders/templates/LinearGradientTemplate.js +47 -0
- package/dist/src/core/shaders/templates/LinearGradientTemplate.js.map +1 -0
- package/dist/src/core/shaders/templates/RadialGradientTemplate.d.ts +31 -0
- package/dist/src/core/shaders/templates/RadialGradientTemplate.js +49 -0
- package/dist/src/core/shaders/templates/RadialGradientTemplate.js.map +1 -0
- package/dist/src/core/shaders/templates/RoundedTemplate.d.ts +29 -0
- package/dist/src/core/shaders/templates/RoundedTemplate.js +67 -0
- package/dist/src/core/shaders/templates/RoundedTemplate.js.map +1 -0
- package/dist/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.d.ts +7 -0
- package/dist/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.js +24 -0
- package/dist/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.js.map +1 -0
- package/dist/src/core/shaders/templates/RoundedWithBorderTemplate.d.ts +6 -0
- package/dist/src/core/shaders/templates/RoundedWithBorderTemplate.js +23 -0
- package/dist/src/core/shaders/templates/RoundedWithBorderTemplate.js.map +1 -0
- package/dist/src/core/shaders/templates/RoundedWithShadowTemplate.d.ts +6 -0
- package/dist/src/core/shaders/templates/RoundedWithShadowTemplate.js +23 -0
- package/dist/src/core/shaders/templates/RoundedWithShadowTemplate.js.map +1 -0
- package/dist/src/core/shaders/templates/ShadowTemplate.d.ts +34 -0
- package/dist/src/core/shaders/templates/ShadowTemplate.js +66 -0
- package/dist/src/core/shaders/templates/ShadowTemplate.js.map +1 -0
- package/dist/src/core/shaders/templates/shaderUtils.d.ts +5 -0
- package/dist/src/core/shaders/templates/shaderUtils.js +41 -0
- package/dist/src/core/shaders/templates/shaderUtils.js.map +1 -0
- package/dist/src/core/shaders/utils.d.ts +5 -0
- package/dist/src/core/shaders/utils.js +41 -0
- package/dist/src/core/shaders/utils.js.map +1 -0
- package/dist/src/core/shaders/webgl/Border.d.ts +3 -0
- package/dist/src/core/shaders/webgl/Border.js +110 -0
- package/dist/src/core/shaders/webgl/Border.js.map +1 -0
- package/dist/src/core/shaders/webgl/Default.d.ts +2 -0
- package/dist/src/core/shaders/webgl/Default.js +86 -0
- package/dist/src/core/shaders/webgl/Default.js.map +1 -0
- package/dist/src/core/shaders/webgl/DefaultBatched.d.ts +2 -0
- package/dist/src/core/shaders/webgl/DefaultBatched.js +104 -0
- package/dist/src/core/shaders/webgl/DefaultBatched.js.map +1 -0
- package/dist/src/core/shaders/webgl/HolePunch.d.ts +3 -0
- package/dist/src/core/shaders/webgl/HolePunch.js +65 -0
- package/dist/src/core/shaders/webgl/HolePunch.js.map +1 -0
- package/dist/src/core/shaders/webgl/LinearGradient.d.ts +3 -0
- package/dist/src/core/shaders/webgl/LinearGradient.js +76 -0
- package/dist/src/core/shaders/webgl/LinearGradient.js.map +1 -0
- package/dist/src/core/shaders/webgl/RadialGradient.d.ts +3 -0
- package/dist/src/core/shaders/webgl/RadialGradient.js +74 -0
- package/dist/src/core/shaders/webgl/RadialGradient.js.map +1 -0
- package/dist/src/core/shaders/webgl/Rounded.d.ts +7 -0
- package/dist/src/core/shaders/webgl/Rounded.js +86 -0
- package/dist/src/core/shaders/webgl/Rounded.js.map +1 -0
- package/dist/src/core/shaders/webgl/RoundedWithBorder.d.ts +3 -0
- package/dist/src/core/shaders/webgl/RoundedWithBorder.js +140 -0
- package/dist/src/core/shaders/webgl/RoundedWithBorder.js.map +1 -0
- package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.d.ts +3 -0
- package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js +162 -0
- package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js.map +1 -0
- package/dist/src/core/shaders/webgl/RoundedWithShadow.d.ts +3 -0
- package/dist/src/core/shaders/webgl/RoundedWithShadow.js +84 -0
- package/dist/src/core/shaders/webgl/RoundedWithShadow.js.map +1 -0
- package/dist/src/core/shaders/webgl/SdfShader.d.ts +32 -0
- package/dist/src/core/shaders/webgl/SdfShader.js +116 -0
- package/dist/src/core/shaders/webgl/SdfShader.js.map +1 -0
- package/dist/src/core/shaders/webgl/Shadow.d.ts +3 -0
- package/dist/src/core/shaders/webgl/Shadow.js +110 -0
- package/dist/src/core/shaders/webgl/Shadow.js.map +1 -0
- package/dist/src/core/shaders/webgl/Spinner.js +2 -0
- package/dist/src/core/shaders/webgl/Spinner.js.map +1 -0
- package/dist/src/core/text-rendering/CanvasFontHandler.d.ts +25 -0
- package/dist/src/core/text-rendering/CanvasFontHandler.js +117 -0
- package/dist/src/core/text-rendering/CanvasFontHandler.js.map +1 -0
- package/dist/src/core/text-rendering/CanvasTextRenderer.d.ts +6 -0
- package/dist/src/core/text-rendering/CanvasTextRenderer.js +139 -0
- package/dist/src/core/text-rendering/CanvasTextRenderer.js.map +1 -0
- package/dist/src/core/text-rendering/SdfFontHandler.d.ts +137 -0
- package/dist/src/core/text-rendering/SdfFontHandler.js +336 -0
- package/dist/src/core/text-rendering/SdfFontHandler.js.map +1 -0
- package/dist/src/core/text-rendering/SdfTextRenderer.d.ts +21 -0
- package/dist/src/core/text-rendering/SdfTextRenderer.js +324 -0
- package/dist/src/core/text-rendering/SdfTextRenderer.js.map +1 -0
- package/dist/src/core/text-rendering/TextRenderer.d.ts +425 -0
- package/dist/src/core/text-rendering/TextRenderer.js +70 -0
- package/dist/src/core/text-rendering/TextRenderer.js.map +1 -0
- package/dist/src/core/text-rendering/Utils.d.ts +71 -0
- package/dist/src/core/text-rendering/Utils.js +212 -0
- package/dist/src/core/text-rendering/Utils.js.map +1 -0
- package/dist/src/core/text-rendering/canvas/Settings.d.ts +53 -0
- package/dist/src/core/text-rendering/canvas/Settings.js +20 -0
- package/dist/src/core/text-rendering/canvas/Settings.js.map +1 -0
- package/dist/src/core/text-rendering/canvas/Utils.d.ts +19 -0
- package/dist/src/core/text-rendering/canvas/Utils.js +139 -0
- package/dist/src/core/text-rendering/canvas/Utils.js.map +1 -0
- package/dist/src/core/text-rendering/canvas/calculateRenderInfo.d.ts +37 -0
- package/dist/src/core/text-rendering/canvas/calculateRenderInfo.js +188 -0
- package/dist/src/core/text-rendering/canvas/calculateRenderInfo.js.map +1 -0
- package/dist/src/core/text-rendering/canvas/draw.d.ts +12 -0
- package/dist/src/core/text-rendering/canvas/draw.js +133 -0
- package/dist/src/core/text-rendering/canvas/draw.js.map +1 -0
- package/dist/src/core/text-rendering/sdf/PeekableGenerator.d.ts +12 -0
- package/dist/src/core/text-rendering/sdf/PeekableGenerator.js +61 -0
- package/dist/src/core/text-rendering/sdf/PeekableGenerator.js.map +1 -0
- package/dist/src/core/text-rendering/sdf/SimpleFontShaper.d.ts +45 -0
- package/dist/src/core/text-rendering/sdf/SimpleFontShaper.js +69 -0
- package/dist/src/core/text-rendering/sdf/SimpleFontShaper.js.map +1 -0
- package/dist/src/core/utils.d.ts +1 -1
- package/dist/src/main-api/Renderer.d.ts +46 -0
- package/dist/src/main-api/Renderer.js +38 -0
- package/dist/src/main-api/Renderer.js.map +1 -1
- package/dist/tsconfig.dist.tsbuildinfo +1 -1
- package/package.json +2 -1
- package/src/core/CoreNode.ts +19 -0
- package/src/core/Stage.ts +79 -1
- package/src/core/lib/utils.ts +4 -0
- package/src/core/platform.ts +40 -3
- package/src/main-api/Renderer.ts +56 -0
- package/dist/src/core/renderers/webgl/WebGlCoreShader.destroy.js +0 -2
- package/dist/src/core/renderers/webgl/WebGlCoreShader.destroy.js.map +0 -1
- /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":"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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"}
|
package/dist/src/core/utils.d.ts
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* @module
|
|
5
5
|
*/
|
|
6
6
|
export declare const EPSILON = 0.000001;
|
|
7
|
-
export declare let ARRAY_TYPE:
|
|
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 {};
|