70 lines
2.4 KiB
JavaScript
70 lines
2.4 KiB
JavaScript
export function measureText(font, text) {
|
|
let x = 0;
|
|
for (let i = 0; i < text.length; i++) {
|
|
const char = text[i];
|
|
const fontChar = font.chars[char];
|
|
if (fontChar) {
|
|
const fontKerning = font.kernings[char];
|
|
const nextChar = text[i + 1];
|
|
const kerning = fontKerning && nextChar && fontKerning[nextChar]
|
|
? fontKerning[nextChar] || 0
|
|
: 0;
|
|
x += (fontChar.xadvance || 0) + kerning;
|
|
}
|
|
}
|
|
return x;
|
|
}
|
|
export function splitLines(font, text, maxWidth) {
|
|
const words = text.replace(/[\r\n]+/g, " \n").split(" ");
|
|
const lines = [];
|
|
let currentLine = [];
|
|
let longestLine = 0;
|
|
words.forEach((word) => {
|
|
const wordWidth = measureText(font, word + (words.length > 1 ? " " : ""));
|
|
// If a word is longer than the allowable width we need to split it across lines.
|
|
if (wordWidth > maxWidth) {
|
|
const characterIterator = word[Symbol.iterator]();
|
|
let current = "";
|
|
for (const char of characterIterator) {
|
|
const nextLine = [...currentLine, current + char].join(" ");
|
|
const length = measureText(font, nextLine);
|
|
if (length < maxWidth) {
|
|
current += char;
|
|
}
|
|
else if (length > maxWidth) {
|
|
lines.push([...currentLine, current]);
|
|
currentLine = [];
|
|
current = char;
|
|
}
|
|
else {
|
|
lines.push([...currentLine, current + char]);
|
|
currentLine = [];
|
|
current = "";
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
const line = [...currentLine, word].join(" ");
|
|
const length = measureText(font, line);
|
|
if (length <= maxWidth && !word.includes("\n")) {
|
|
if (length > longestLine) {
|
|
longestLine = length;
|
|
}
|
|
currentLine.push(word);
|
|
}
|
|
else {
|
|
lines.push(currentLine);
|
|
currentLine = [word.replace("\n", "")];
|
|
}
|
|
});
|
|
lines.push(currentLine);
|
|
return {
|
|
lines,
|
|
longestLine,
|
|
};
|
|
}
|
|
export function measureTextHeight(font, text, maxWidth) {
|
|
const { lines } = splitLines(font, text, maxWidth);
|
|
return lines.length * font.common.lineHeight;
|
|
}
|
|
//# sourceMappingURL=measure-text.js.map
|