@babylonjs/lottie-player 9.3.0 → 9.3.2
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/maths/boundingBox.d.ts +4 -4
- package/maths/boundingBox.d.ts.map +1 -1
- package/maths/boundingBox.js +13 -35
- package/maths/boundingBox.js.map +1 -1
- package/nodes/node.d.ts +36 -0
- package/nodes/node.d.ts.map +1 -1
- package/nodes/node.js +147 -91
- package/nodes/node.js.map +1 -1
- package/package.json +1 -1
- package/parsing/parser.d.ts +3 -0
- package/parsing/parser.d.ts.map +1 -1
- package/parsing/parser.js +64 -31
- package/parsing/parser.js.map +1 -1
- package/parsing/rawTypes.d.ts +2 -0
- package/parsing/rawTypes.d.ts.map +1 -1
- package/parsing/spritePacker.d.ts.map +1 -1
- package/parsing/spritePacker.js +22 -34
- package/parsing/spritePacker.js.map +1 -1
- package/parsing/textLayout.d.ts +207 -0
- package/parsing/textLayout.d.ts.map +1 -0
- package/parsing/textLayout.js +356 -0
- package/parsing/textLayout.js.map +1 -0
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import { type IVector2Like } from "@babylonjs/core/Maths/math.like.js";
|
|
2
|
+
import { type RawFont, type RawTextData, type RawTextDocument, type RawTextJustify } from "./rawTypes.js";
|
|
3
|
+
/**
|
|
4
|
+
* Minimal text metrics shape used by the Lottie text layout helpers.
|
|
5
|
+
*/
|
|
6
|
+
export type TextMetricsLike = {
|
|
7
|
+
/**
|
|
8
|
+
* Horizontal advance of the measured text.
|
|
9
|
+
*/
|
|
10
|
+
width: number;
|
|
11
|
+
/**
|
|
12
|
+
* Distance from the alignment point to the left-most rendered pixel.
|
|
13
|
+
*/
|
|
14
|
+
actualBoundingBoxLeft?: number;
|
|
15
|
+
/**
|
|
16
|
+
* Distance from the alignment point to the right-most rendered pixel.
|
|
17
|
+
*/
|
|
18
|
+
actualBoundingBoxRight?: number;
|
|
19
|
+
/**
|
|
20
|
+
* Distance from the alphabetic baseline to the top of the measured text.
|
|
21
|
+
*/
|
|
22
|
+
actualBoundingBoxAscent?: number;
|
|
23
|
+
/**
|
|
24
|
+
* Distance from the alphabetic baseline to the bottom of the measured text.
|
|
25
|
+
*/
|
|
26
|
+
actualBoundingBoxDescent?: number;
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Rendering context surface required by the Lottie text layout helpers.
|
|
30
|
+
*/
|
|
31
|
+
export type TextRenderContextLike = {
|
|
32
|
+
/**
|
|
33
|
+
* Current font used for text measurement and rendering.
|
|
34
|
+
*/
|
|
35
|
+
font: string;
|
|
36
|
+
/**
|
|
37
|
+
* Current stroke width for text outlines.
|
|
38
|
+
*/
|
|
39
|
+
lineWidth: number;
|
|
40
|
+
/**
|
|
41
|
+
* Optional font kerning mode used by canvas text rendering.
|
|
42
|
+
*/
|
|
43
|
+
fontKerning?: string;
|
|
44
|
+
/**
|
|
45
|
+
* Measures text using the active font.
|
|
46
|
+
* @param text The text to measure.
|
|
47
|
+
* @returns The measured text metrics.
|
|
48
|
+
*/
|
|
49
|
+
measureText(text: string): TextMetricsLike;
|
|
50
|
+
/**
|
|
51
|
+
* Draws filled text at the provided baseline position.
|
|
52
|
+
* @param text The text to draw.
|
|
53
|
+
* @param x The x coordinate of the text baseline origin.
|
|
54
|
+
* @param y The y coordinate of the text baseline origin.
|
|
55
|
+
*/
|
|
56
|
+
fillText(text: string, x: number, y: number): void;
|
|
57
|
+
/**
|
|
58
|
+
* Draws stroked text at the provided baseline position.
|
|
59
|
+
* @param text The text to draw.
|
|
60
|
+
* @param x The x coordinate of the text baseline origin.
|
|
61
|
+
* @param y The y coordinate of the text baseline origin.
|
|
62
|
+
*/
|
|
63
|
+
strokeText(text: string, x: number, y: number): void;
|
|
64
|
+
};
|
|
65
|
+
/**
|
|
66
|
+
* Resolved text document data needed for measurement and rendering.
|
|
67
|
+
*/
|
|
68
|
+
export type ResolvedLottieText = {
|
|
69
|
+
/**
|
|
70
|
+
* Original raw text document data.
|
|
71
|
+
*/
|
|
72
|
+
textInfo: RawTextDocument;
|
|
73
|
+
/**
|
|
74
|
+
* Resolved font metadata.
|
|
75
|
+
*/
|
|
76
|
+
rawFont: RawFont;
|
|
77
|
+
/**
|
|
78
|
+
* CSS canvas font shorthand used for measurement and rendering.
|
|
79
|
+
*/
|
|
80
|
+
font: string;
|
|
81
|
+
/**
|
|
82
|
+
* Text split into Lottie lines.
|
|
83
|
+
*/
|
|
84
|
+
lines: string[];
|
|
85
|
+
/**
|
|
86
|
+
* Tracking amount converted to pixels.
|
|
87
|
+
*/
|
|
88
|
+
trackingPx: number;
|
|
89
|
+
/**
|
|
90
|
+
* Distance between consecutive baselines.
|
|
91
|
+
*/
|
|
92
|
+
lineHeightPx: number;
|
|
93
|
+
/**
|
|
94
|
+
* Distance from the top of the text block to the first baseline.
|
|
95
|
+
*/
|
|
96
|
+
baselineOffsetPx: number;
|
|
97
|
+
/**
|
|
98
|
+
* Optional paragraph box top-left position relative to the text anchor.
|
|
99
|
+
*/
|
|
100
|
+
boxPosition?: IVector2Like;
|
|
101
|
+
/**
|
|
102
|
+
* Optional paragraph box size.
|
|
103
|
+
*/
|
|
104
|
+
boxSize?: IVector2Like;
|
|
105
|
+
/**
|
|
106
|
+
* Resolved text justification.
|
|
107
|
+
*/
|
|
108
|
+
justify: RawTextJustify;
|
|
109
|
+
/**
|
|
110
|
+
* Whether a visible stroke should be rendered.
|
|
111
|
+
*/
|
|
112
|
+
hasStroke: boolean;
|
|
113
|
+
/**
|
|
114
|
+
* Whether the stroke should be rendered after the fill.
|
|
115
|
+
*/
|
|
116
|
+
strokeOverFill: boolean;
|
|
117
|
+
};
|
|
118
|
+
/**
|
|
119
|
+
* Layout information for a single text line.
|
|
120
|
+
*/
|
|
121
|
+
export type LottieTextLineLayout = {
|
|
122
|
+
/**
|
|
123
|
+
* Raw text for the line.
|
|
124
|
+
*/
|
|
125
|
+
text: string;
|
|
126
|
+
/**
|
|
127
|
+
* Final line width including tracking.
|
|
128
|
+
*/
|
|
129
|
+
width: number;
|
|
130
|
+
/**
|
|
131
|
+
* Left position of the line inside the text texture.
|
|
132
|
+
*/
|
|
133
|
+
x: number;
|
|
134
|
+
/**
|
|
135
|
+
* Baseline position of the line inside the text texture.
|
|
136
|
+
*/
|
|
137
|
+
baselineY: number;
|
|
138
|
+
};
|
|
139
|
+
/**
|
|
140
|
+
* Layout information for a resolved Lottie text document.
|
|
141
|
+
*/
|
|
142
|
+
export type LottieTextLayout = {
|
|
143
|
+
/**
|
|
144
|
+
* Width of the text texture.
|
|
145
|
+
*/
|
|
146
|
+
width: number;
|
|
147
|
+
/**
|
|
148
|
+
* Height of the text texture.
|
|
149
|
+
*/
|
|
150
|
+
height: number;
|
|
151
|
+
/**
|
|
152
|
+
* X offset required to convert from the text anchor to the sprite center.
|
|
153
|
+
*/
|
|
154
|
+
offsetX: number;
|
|
155
|
+
/**
|
|
156
|
+
* Y offset required to convert from the text anchor to the sprite center.
|
|
157
|
+
*/
|
|
158
|
+
offsetY: number;
|
|
159
|
+
/**
|
|
160
|
+
* Distance from the top of the texture to the first baseline.
|
|
161
|
+
*/
|
|
162
|
+
baselineOffsetY: number;
|
|
163
|
+
/**
|
|
164
|
+
* Distance from the last baseline to the bottom of the texture.
|
|
165
|
+
*/
|
|
166
|
+
descent: number;
|
|
167
|
+
/**
|
|
168
|
+
* Per-line layout data.
|
|
169
|
+
*/
|
|
170
|
+
lines: LottieTextLineLayout[];
|
|
171
|
+
};
|
|
172
|
+
/**
|
|
173
|
+
* Resolves the text document, font, variables, and line splitting required for layout.
|
|
174
|
+
* @param textData Raw Lottie text data.
|
|
175
|
+
* @param rawFonts Map of font names to font metadata.
|
|
176
|
+
* @param variables Variables that can replace the raw text content.
|
|
177
|
+
* @returns The resolved text data, or undefined when the text cannot be rendered.
|
|
178
|
+
*/
|
|
179
|
+
export declare function ResolveLottieText(textData: RawTextData, rawFonts: Map<string, RawFont>, variables: Map<string, string>): ResolvedLottieText | undefined;
|
|
180
|
+
/**
|
|
181
|
+
* Measures the final texture layout for resolved Lottie text.
|
|
182
|
+
* @param resolvedText Resolved text data.
|
|
183
|
+
* @param measureText Callback used to measure text with the active font.
|
|
184
|
+
* @returns The measured text layout.
|
|
185
|
+
*/
|
|
186
|
+
export declare function MeasureLottieText(resolvedText: ResolvedLottieText, measureText: (text: string) => TextMetricsLike): LottieTextLayout;
|
|
187
|
+
/**
|
|
188
|
+
* Renders resolved text using the measured layout.
|
|
189
|
+
* @param context Rendering context used to draw text.
|
|
190
|
+
* @param resolvedText Resolved text data.
|
|
191
|
+
* @param layout Measured text layout.
|
|
192
|
+
*/
|
|
193
|
+
export declare function DrawLottieText(context: TextRenderContextLike, resolvedText: ResolvedLottieText, layout: LottieTextLayout): void;
|
|
194
|
+
/**
|
|
195
|
+
* Applies the resolved Lottie text font settings to a canvas-like text context.
|
|
196
|
+
* @param context Rendering context used for text measurement and drawing.
|
|
197
|
+
* @param resolvedText Resolved text data.
|
|
198
|
+
*/
|
|
199
|
+
export declare function ApplyLottieTextContext(context: Pick<TextRenderContextLike, "font" | "lineWidth" | "fontKerning">, resolvedText: ResolvedLottieText): void;
|
|
200
|
+
/**
|
|
201
|
+
* Builds the CSS canvas font string for a Lottie font entry.
|
|
202
|
+
* @param rawFont Font metadata from the Lottie file.
|
|
203
|
+
* @param fontSize Font size in pixels.
|
|
204
|
+
* @returns The CSS canvas font shorthand.
|
|
205
|
+
*/
|
|
206
|
+
export declare function BuildCanvasFont(rawFont: RawFont, fontSize: number): string;
|
|
207
|
+
//# sourceMappingURL=textLayout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"textLayout.d.ts","sourceRoot":"","sources":["../../../../dev/lottiePlayer/src/parsing/textLayout.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
const LineBreakRegex = /\u2028\r?|\r\n?|\n/g;
|
|
2
|
+
const MinimumTextBottomPaddingPx = 1;
|
|
3
|
+
/**
|
|
4
|
+
* Resolves the text document, font, variables, and line splitting required for layout.
|
|
5
|
+
* @param textData Raw Lottie text data.
|
|
6
|
+
* @param rawFonts Map of font names to font metadata.
|
|
7
|
+
* @param variables Variables that can replace the raw text content.
|
|
8
|
+
* @returns The resolved text data, or undefined when the text cannot be rendered.
|
|
9
|
+
*/
|
|
10
|
+
export function ResolveLottieText(textData, rawFonts, variables) {
|
|
11
|
+
const textInfo = textData.d?.k?.[0]?.s;
|
|
12
|
+
if (!textInfo) {
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
const rawFont = rawFonts.get(textInfo.f);
|
|
16
|
+
if (!rawFont) {
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
const variableText = variables.get(textInfo.t);
|
|
20
|
+
const resolvedText = variableText !== undefined ? variableText : textInfo.t;
|
|
21
|
+
const lines = NormalizeLottieTextLines(resolvedText);
|
|
22
|
+
const font = BuildCanvasFont(rawFont, textInfo.s);
|
|
23
|
+
const trackingPx = ((textInfo.tr ?? 0) * textInfo.s) / 1000;
|
|
24
|
+
const lineHeightPx = textInfo.lh || textInfo.s;
|
|
25
|
+
const rawAscentPx = rawFont.ascent !== undefined ? (textInfo.s * rawFont.ascent) / 100 : textInfo.s * 0.75;
|
|
26
|
+
const baselineOffsetPx = rawAscentPx - (textInfo.ls ?? 0);
|
|
27
|
+
const hasStroke = !!(textInfo.sc && textInfo.sc.length >= 3 && textInfo.sw !== undefined && textInfo.sw > 0);
|
|
28
|
+
const boxPosition = textInfo.ps !== undefined && textInfo.ps.length >= 2 ? { x: textInfo.ps[0], y: textInfo.ps[1] } : undefined;
|
|
29
|
+
const boxSize = textInfo.sz !== undefined && textInfo.sz.length >= 2 ? { x: textInfo.sz[0], y: textInfo.sz[1] } : undefined;
|
|
30
|
+
return {
|
|
31
|
+
textInfo,
|
|
32
|
+
rawFont,
|
|
33
|
+
font,
|
|
34
|
+
lines,
|
|
35
|
+
trackingPx,
|
|
36
|
+
lineHeightPx,
|
|
37
|
+
baselineOffsetPx,
|
|
38
|
+
boxPosition,
|
|
39
|
+
boxSize,
|
|
40
|
+
justify: textInfo.j,
|
|
41
|
+
hasStroke,
|
|
42
|
+
strokeOverFill: textInfo.of === true,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Measures the final texture layout for resolved Lottie text.
|
|
47
|
+
* @param resolvedText Resolved text data.
|
|
48
|
+
* @param measureText Callback used to measure text with the active font.
|
|
49
|
+
* @returns The measured text layout.
|
|
50
|
+
*/
|
|
51
|
+
export function MeasureLottieText(resolvedText, measureText) {
|
|
52
|
+
const hasParagraphBox = resolvedText.boxPosition !== undefined && resolvedText.boxSize !== undefined;
|
|
53
|
+
const lineMeasurements = CreateLineMeasurements(resolvedText, measureText, hasParagraphBox);
|
|
54
|
+
const bottomPaddingPx = resolvedText.hasStroke ? Math.max(MinimumTextBottomPaddingPx, resolvedText.textInfo.sw / 2) : MinimumTextBottomPaddingPx;
|
|
55
|
+
let minX = Number.POSITIVE_INFINITY;
|
|
56
|
+
let maxX = Number.NEGATIVE_INFINITY;
|
|
57
|
+
let minY = Number.POSITIVE_INFINITY;
|
|
58
|
+
let maxY = Number.NEGATIVE_INFINITY;
|
|
59
|
+
let descent = 0;
|
|
60
|
+
const localLineLayouts = lineMeasurements.map((line) => {
|
|
61
|
+
const x = hasParagraphBox
|
|
62
|
+
? resolvedText.boxPosition.x + GetLineX(resolvedText.justify, resolvedText.boxSize.x, line.width)
|
|
63
|
+
: GetPointTextLineX(resolvedText.justify, line.width);
|
|
64
|
+
descent = Math.max(descent, line.descent);
|
|
65
|
+
if (hasParagraphBox) {
|
|
66
|
+
minX = Math.min(minX, x);
|
|
67
|
+
maxX = Math.max(maxX, x + line.width);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
minX = Math.min(minX, x - line.actualLeft);
|
|
71
|
+
maxX = Math.max(maxX, x + line.actualRight);
|
|
72
|
+
}
|
|
73
|
+
minY = Math.min(minY, line.baselineY - resolvedText.baselineOffsetPx);
|
|
74
|
+
maxY = Math.max(maxY, line.baselineY + line.descent + bottomPaddingPx);
|
|
75
|
+
return {
|
|
76
|
+
text: line.text,
|
|
77
|
+
width: line.width,
|
|
78
|
+
x,
|
|
79
|
+
baselineY: line.baselineY,
|
|
80
|
+
};
|
|
81
|
+
});
|
|
82
|
+
if (hasParagraphBox) {
|
|
83
|
+
minX = Math.min(minX, resolvedText.boxPosition.x);
|
|
84
|
+
maxX = Math.max(maxX, resolvedText.boxPosition.x + resolvedText.boxSize.x);
|
|
85
|
+
minY = Math.min(minY, resolvedText.boxPosition.y);
|
|
86
|
+
maxY = Math.max(maxY, resolvedText.boxPosition.y + resolvedText.boxSize.y);
|
|
87
|
+
}
|
|
88
|
+
if (!Number.isFinite(minX)) {
|
|
89
|
+
minX = 0;
|
|
90
|
+
maxX = 0;
|
|
91
|
+
minY = 0;
|
|
92
|
+
maxY = 0;
|
|
93
|
+
}
|
|
94
|
+
const width = maxX - minX;
|
|
95
|
+
const height = maxY - minY;
|
|
96
|
+
return {
|
|
97
|
+
width,
|
|
98
|
+
height,
|
|
99
|
+
offsetX: (minX + maxX) / 2,
|
|
100
|
+
offsetY: (minY + maxY) / 2,
|
|
101
|
+
baselineOffsetY: localLineLayouts.length > 0 ? localLineLayouts[0].baselineY - minY : 0,
|
|
102
|
+
descent,
|
|
103
|
+
lines: localLineLayouts.map((line) => ({
|
|
104
|
+
text: line.text,
|
|
105
|
+
width: line.width,
|
|
106
|
+
x: line.x - minX,
|
|
107
|
+
baselineY: line.baselineY - minY,
|
|
108
|
+
})),
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
function CreateLineMeasurements(resolvedText, measureText, hasParagraphBox) {
|
|
112
|
+
const lines = hasParagraphBox ? resolvedText.lines.flatMap((line) => WrapParagraphTextLine(line, resolvedText, measureText)) : resolvedText.lines;
|
|
113
|
+
return lines.map((line, index) => {
|
|
114
|
+
const metrics = measureText(line);
|
|
115
|
+
const trackingWidth = GetTrackingWidth(line, resolvedText.trackingPx);
|
|
116
|
+
const trackedWidth = metrics.width + trackingWidth;
|
|
117
|
+
return {
|
|
118
|
+
text: line,
|
|
119
|
+
width: trackedWidth,
|
|
120
|
+
baselineY: GetLineBaselineY(resolvedText, hasParagraphBox, index),
|
|
121
|
+
descent: metrics.actualBoundingBoxDescent ?? 0,
|
|
122
|
+
actualLeft: hasParagraphBox ? 0 : (metrics.actualBoundingBoxLeft ?? 0),
|
|
123
|
+
actualRight: hasParagraphBox ? trackedWidth : (metrics.actualBoundingBoxRight ?? metrics.width) + trackingWidth,
|
|
124
|
+
};
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
function GetLineBaselineY(resolvedText, hasParagraphBox, lineIndex) {
|
|
128
|
+
const paragraphTop = hasParagraphBox ? resolvedText.boxPosition.y + resolvedText.baselineOffsetPx : 0;
|
|
129
|
+
return paragraphTop + lineIndex * resolvedText.lineHeightPx;
|
|
130
|
+
}
|
|
131
|
+
function WrapParagraphTextLine(line, resolvedText, measureText) {
|
|
132
|
+
const maxWidth = resolvedText.boxSize?.x ?? 0;
|
|
133
|
+
if (line.length === 0 || maxWidth <= 0 || GetTrackedTextWidth(line, measureText, resolvedText.trackingPx) <= maxWidth) {
|
|
134
|
+
return [line];
|
|
135
|
+
}
|
|
136
|
+
const words = line
|
|
137
|
+
.trim()
|
|
138
|
+
.split(/\s+/)
|
|
139
|
+
.filter((word) => word.length > 0);
|
|
140
|
+
if (words.length === 0) {
|
|
141
|
+
return [""];
|
|
142
|
+
}
|
|
143
|
+
const wrappedLines = [];
|
|
144
|
+
let currentLine = "";
|
|
145
|
+
for (let index = 0; index < words.length; index++) {
|
|
146
|
+
const word = words[index];
|
|
147
|
+
const candidate = currentLine.length === 0 ? word : `${currentLine} ${word}`;
|
|
148
|
+
if (currentLine.length === 0 && GetTrackedTextWidth(word, measureText, resolvedText.trackingPx) > maxWidth) {
|
|
149
|
+
const brokenWordLines = BreakLongWord(word, resolvedText, measureText);
|
|
150
|
+
wrappedLines.push(...brokenWordLines.slice(0, -1));
|
|
151
|
+
currentLine = brokenWordLines[brokenWordLines.length - 1];
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
if (GetTrackedTextWidth(candidate, measureText, resolvedText.trackingPx) <= maxWidth) {
|
|
155
|
+
currentLine = candidate;
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
wrappedLines.push(currentLine);
|
|
159
|
+
if (GetTrackedTextWidth(word, measureText, resolvedText.trackingPx) <= maxWidth) {
|
|
160
|
+
currentLine = word;
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
const brokenWordLines = BreakLongWord(word, resolvedText, measureText);
|
|
164
|
+
wrappedLines.push(...brokenWordLines.slice(0, -1));
|
|
165
|
+
currentLine = brokenWordLines[brokenWordLines.length - 1];
|
|
166
|
+
}
|
|
167
|
+
if (currentLine.length > 0 || wrappedLines.length === 0) {
|
|
168
|
+
wrappedLines.push(currentLine);
|
|
169
|
+
}
|
|
170
|
+
return wrappedLines;
|
|
171
|
+
}
|
|
172
|
+
function BreakLongWord(word, resolvedText, measureText) {
|
|
173
|
+
const maxWidth = resolvedText.boxSize?.x ?? 0;
|
|
174
|
+
const characters = Array.from(word);
|
|
175
|
+
const wrappedLines = [];
|
|
176
|
+
let currentLine = "";
|
|
177
|
+
for (let index = 0; index < characters.length; index++) {
|
|
178
|
+
const candidate = currentLine + characters[index];
|
|
179
|
+
if (currentLine.length > 0 && GetTrackedTextWidth(candidate, measureText, resolvedText.trackingPx) > maxWidth) {
|
|
180
|
+
wrappedLines.push(currentLine);
|
|
181
|
+
currentLine = characters[index];
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
currentLine = candidate;
|
|
185
|
+
}
|
|
186
|
+
if (currentLine.length > 0) {
|
|
187
|
+
wrappedLines.push(currentLine);
|
|
188
|
+
}
|
|
189
|
+
return wrappedLines;
|
|
190
|
+
}
|
|
191
|
+
function GetTrackedTextWidth(text, measureText, trackingPx) {
|
|
192
|
+
return GetTrackedTextWidthFromMetrics(text, measureText(text), trackingPx);
|
|
193
|
+
}
|
|
194
|
+
function GetTrackedTextWidthFromMetrics(text, metrics, trackingPx) {
|
|
195
|
+
return metrics.width + GetTrackingWidth(text, trackingPx);
|
|
196
|
+
}
|
|
197
|
+
function GetTrackingWidth(text, trackingPx) {
|
|
198
|
+
return Math.max(Array.from(text).length - 1, 0) * trackingPx;
|
|
199
|
+
}
|
|
200
|
+
function NormalizeLottieTextLines(text) {
|
|
201
|
+
const lines = text.replace(LineBreakRegex, "\n").split("\n");
|
|
202
|
+
while (lines.length > 1 && lines[lines.length - 1].length === 0) {
|
|
203
|
+
lines.pop();
|
|
204
|
+
}
|
|
205
|
+
return lines;
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Renders resolved text using the measured layout.
|
|
209
|
+
* @param context Rendering context used to draw text.
|
|
210
|
+
* @param resolvedText Resolved text data.
|
|
211
|
+
* @param layout Measured text layout.
|
|
212
|
+
*/
|
|
213
|
+
export function DrawLottieText(context, resolvedText, layout) {
|
|
214
|
+
ApplyLottieTextContext(context, resolvedText);
|
|
215
|
+
for (let index = 0; index < layout.lines.length; index++) {
|
|
216
|
+
const line = layout.lines[index];
|
|
217
|
+
if (resolvedText.hasStroke && !resolvedText.strokeOverFill) {
|
|
218
|
+
DrawTrackedText(context, line, resolvedText.trackingPx, (text, x, y) => context.strokeText(text, x, y));
|
|
219
|
+
}
|
|
220
|
+
DrawTrackedText(context, line, resolvedText.trackingPx, (text, x, y) => context.fillText(text, x, y));
|
|
221
|
+
if (resolvedText.hasStroke && resolvedText.strokeOverFill) {
|
|
222
|
+
DrawTrackedText(context, line, resolvedText.trackingPx, (text, x, y) => context.strokeText(text, x, y));
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Applies the resolved Lottie text font settings to a canvas-like text context.
|
|
228
|
+
* @param context Rendering context used for text measurement and drawing.
|
|
229
|
+
* @param resolvedText Resolved text data.
|
|
230
|
+
*/
|
|
231
|
+
export function ApplyLottieTextContext(context, resolvedText) {
|
|
232
|
+
context.font = resolvedText.font;
|
|
233
|
+
// fontKerning is optional on the context type because some runtimes (older browsers, OffscreenCanvas
|
|
234
|
+
// implementations without the CanvasTextDrawingStyles update) may not expose it. Guard before writing.
|
|
235
|
+
if ("fontKerning" in context) {
|
|
236
|
+
context.fontKerning = "none";
|
|
237
|
+
}
|
|
238
|
+
if (resolvedText.hasStroke) {
|
|
239
|
+
context.lineWidth = resolvedText.textInfo.sw;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Builds the CSS canvas font string for a Lottie font entry.
|
|
244
|
+
* @param rawFont Font metadata from the Lottie file.
|
|
245
|
+
* @param fontSize Font size in pixels.
|
|
246
|
+
* @returns The CSS canvas font shorthand.
|
|
247
|
+
*/
|
|
248
|
+
export function BuildCanvasFont(rawFont, fontSize) {
|
|
249
|
+
const fontStyle = GetCanvasFontStyle(rawFont);
|
|
250
|
+
const fontWeight = GetCanvasFontWeight(rawFont);
|
|
251
|
+
const fontFamily = QuoteFontFamily(rawFont.fFamily);
|
|
252
|
+
return fontStyle === "normal" ? `${fontWeight} ${fontSize}px ${fontFamily}` : `${fontStyle} ${fontWeight} ${fontSize}px ${fontFamily}`;
|
|
253
|
+
}
|
|
254
|
+
function DrawTrackedText(context, line, trackingPx, drawGlyph) {
|
|
255
|
+
if (line.text.length === 0) {
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
if (trackingPx === 0) {
|
|
259
|
+
drawGlyph(line.text, line.x, line.baselineY);
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
// When tracking is non-zero, lay glyphs out one at a time and accumulate the measured advance
|
|
263
|
+
// instead of re-measuring the growing prefix on each step (which would be O(n²) in measureText calls).
|
|
264
|
+
const characters = Array.from(line.text);
|
|
265
|
+
let advance = 0;
|
|
266
|
+
for (let index = 0; index < characters.length; index++) {
|
|
267
|
+
const character = characters[index];
|
|
268
|
+
drawGlyph(character, line.x + advance + trackingPx * index, line.baselineY);
|
|
269
|
+
advance += context.measureText(character).width;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
function GetPointTextLineX(justify, lineWidth) {
|
|
273
|
+
switch (GetHorizontalAlignment(justify)) {
|
|
274
|
+
case "right":
|
|
275
|
+
return -lineWidth;
|
|
276
|
+
case "center":
|
|
277
|
+
return -lineWidth / 2;
|
|
278
|
+
case "left":
|
|
279
|
+
default:
|
|
280
|
+
return 0;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
function GetLineX(justify, maxWidth, lineWidth) {
|
|
284
|
+
switch (GetHorizontalAlignment(justify)) {
|
|
285
|
+
case "right":
|
|
286
|
+
return maxWidth - lineWidth;
|
|
287
|
+
case "center":
|
|
288
|
+
return (maxWidth - lineWidth) / 2;
|
|
289
|
+
case "left":
|
|
290
|
+
default:
|
|
291
|
+
return 0;
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
function GetHorizontalAlignment(justify) {
|
|
295
|
+
// 0: left, 1: right, 2: center. Codes 3–6 are full-justify variants that differ only in how the
|
|
296
|
+
// last line is aligned (3: left, 4: right, 5: center, 6: full). We do not implement full-justify
|
|
297
|
+
// (which would stretch non-last lines to the paragraph-box width), so approximate all four by
|
|
298
|
+
// using the last-line alignment for every line. This matches the reference renderer for the
|
|
299
|
+
// common case of single-line text and is the closest behavior otherwise.
|
|
300
|
+
switch (justify) {
|
|
301
|
+
case 1:
|
|
302
|
+
case 4:
|
|
303
|
+
return "right";
|
|
304
|
+
case 2:
|
|
305
|
+
case 5:
|
|
306
|
+
return "center";
|
|
307
|
+
case 0:
|
|
308
|
+
case 3:
|
|
309
|
+
case 6:
|
|
310
|
+
default:
|
|
311
|
+
return "left";
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
function QuoteFontFamily(fontFamily) {
|
|
315
|
+
return /[\s,"']/.test(fontFamily) ? `"${fontFamily.replace(/\\/g, "\\\\").replace(/"/g, '\\"')}"` : fontFamily;
|
|
316
|
+
}
|
|
317
|
+
function GetCanvasFontStyle(rawFont) {
|
|
318
|
+
const style = rawFont.fStyle?.toLowerCase() ?? "";
|
|
319
|
+
return /\b(italic|oblique)\b/.test(style) ? "italic" : "normal";
|
|
320
|
+
}
|
|
321
|
+
function GetCanvasFontWeight(rawFont) {
|
|
322
|
+
const explicitWeight = rawFont.fWeight?.trim();
|
|
323
|
+
if (explicitWeight) {
|
|
324
|
+
return explicitWeight;
|
|
325
|
+
}
|
|
326
|
+
const style = rawFont.fStyle?.toLowerCase() ?? "";
|
|
327
|
+
if (/\b(thin|hairline)\b/.test(style)) {
|
|
328
|
+
return "100";
|
|
329
|
+
}
|
|
330
|
+
if (/\b(extra|ultra)[ -]?light\b/.test(style)) {
|
|
331
|
+
return "200";
|
|
332
|
+
}
|
|
333
|
+
if (/\b(light)\b/.test(style)) {
|
|
334
|
+
return "300";
|
|
335
|
+
}
|
|
336
|
+
if (/\bsemi[ -]?bold\b/.test(style)) {
|
|
337
|
+
return "700";
|
|
338
|
+
}
|
|
339
|
+
if (/\bdemi[ -]?bold\b/.test(style)) {
|
|
340
|
+
return "600";
|
|
341
|
+
}
|
|
342
|
+
if (/\b(extra|ultra)[ -]?bold\b/.test(style)) {
|
|
343
|
+
return "800";
|
|
344
|
+
}
|
|
345
|
+
if (/\b(black|heavy)\b/.test(style)) {
|
|
346
|
+
return "900";
|
|
347
|
+
}
|
|
348
|
+
if (/\bbold\b/.test(style)) {
|
|
349
|
+
return "700";
|
|
350
|
+
}
|
|
351
|
+
if (/\bmedium\b/.test(style)) {
|
|
352
|
+
return "500";
|
|
353
|
+
}
|
|
354
|
+
return "400";
|
|
355
|
+
}
|
|
356
|
+
//# sourceMappingURL=textLayout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"textLayout.js","sourceRoot":"","sources":["../../../../dev/lottiePlayer/src/parsing/textLayout.ts"],"names":[],"mappings":"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"}
|