60 lines
2.2 KiB
JavaScript
60 lines
2.2 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.nextFontError = exports.calculateFallbackFontValues = void 0;
|
|
const DEFAULT_SANS_SERIF_FONT = {
|
|
name: 'Arial',
|
|
azAvgWidth: 934.5116279069767,
|
|
unitsPerEm: 2048,
|
|
};
|
|
const DEFAULT_SERIF_FONT = {
|
|
name: 'Times New Roman',
|
|
azAvgWidth: 854.3953488372093,
|
|
unitsPerEm: 2048,
|
|
};
|
|
function calcAverageWidth(font) {
|
|
try {
|
|
const avgCharacters = 'aaabcdeeeefghiijklmnnoopqrrssttuvwxyz ';
|
|
const hasAllChars = font
|
|
.glyphsForString(avgCharacters)
|
|
.flatMap((glyph) => glyph.codePoints)
|
|
.every((codePoint) => font.hasGlyphForCodePoint(codePoint));
|
|
if (!hasAllChars)
|
|
return undefined;
|
|
const widths = font
|
|
.glyphsForString(avgCharacters)
|
|
.map((glyph) => glyph.advanceWidth);
|
|
const totalWidth = widths.reduce((sum, width) => sum + width, 0);
|
|
return totalWidth / widths.length;
|
|
}
|
|
catch {
|
|
// Could not calculate average width from the font file, skip size-adjust
|
|
return undefined;
|
|
}
|
|
}
|
|
function formatOverrideValue(val) {
|
|
return Math.abs(val * 100).toFixed(2) + '%';
|
|
}
|
|
function calculateFallbackFontValues(font, category = 'serif') {
|
|
const fallbackFont = category === 'serif' ? DEFAULT_SERIF_FONT : DEFAULT_SANS_SERIF_FONT;
|
|
const azAvgWidth = calcAverageWidth(font);
|
|
const { ascent, descent, lineGap, unitsPerEm } = font;
|
|
const fallbackFontAvgWidth = fallbackFont.azAvgWidth / fallbackFont.unitsPerEm;
|
|
let sizeAdjust = azAvgWidth
|
|
? azAvgWidth / unitsPerEm / fallbackFontAvgWidth
|
|
: 1;
|
|
return {
|
|
ascentOverride: formatOverrideValue(ascent / (unitsPerEm * sizeAdjust)),
|
|
descentOverride: formatOverrideValue(descent / (unitsPerEm * sizeAdjust)),
|
|
lineGapOverride: formatOverrideValue(lineGap / (unitsPerEm * sizeAdjust)),
|
|
fallbackFont: fallbackFont.name,
|
|
sizeAdjust: formatOverrideValue(sizeAdjust),
|
|
};
|
|
}
|
|
exports.calculateFallbackFontValues = calculateFallbackFontValues;
|
|
function nextFontError(message) {
|
|
const err = new Error(message);
|
|
err.name = 'NextFontError';
|
|
throw err;
|
|
}
|
|
exports.nextFontError = nextFontError;
|