52 lines
1.8 KiB
Plaintext
52 lines
1.8 KiB
Plaintext
|
// The `hmtx` table contains the horizontal metrics for all glyphs.
|
||
|
// https://www.microsoft.com/typography/OTSPEC/hmtx.htm
|
||
|
|
||
|
import parse from '../parse';
|
||
|
|
||
|
function parseHmtxTableAll(data, start, numMetrics, numGlyphs, glyphs) {
|
||
|
let advanceWidth;
|
||
|
let leftSideBearing;
|
||
|
const p = new parse.Parser(data, start);
|
||
|
for (let i = 0; i < numGlyphs; i += 1) {
|
||
|
// If the font is monospaced, only one entry is needed. This last entry applies to all subsequent glyphs.
|
||
|
if (i < numMetrics) {
|
||
|
advanceWidth = p.parseUShort();
|
||
|
leftSideBearing = p.parseShort();
|
||
|
}
|
||
|
|
||
|
const glyph = glyphs.get(i);
|
||
|
glyph.advanceWidth = advanceWidth;
|
||
|
glyph.leftSideBearing = leftSideBearing;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function parseHmtxTableOnLowMemory(font, data, start, numMetrics, numGlyphs) {
|
||
|
font._hmtxTableData = {};
|
||
|
|
||
|
let advanceWidth;
|
||
|
let leftSideBearing;
|
||
|
const p = new parse.Parser(data, start);
|
||
|
for (let i = 0; i < numGlyphs; i += 1) {
|
||
|
// If the font is monospaced, only one entry is needed. This last entry applies to all subsequent glyphs.
|
||
|
if (i < numMetrics) {
|
||
|
advanceWidth = p.parseUShort();
|
||
|
leftSideBearing = p.parseShort();
|
||
|
}
|
||
|
|
||
|
font._hmtxTableData[i] = {
|
||
|
advanceWidth: advanceWidth,
|
||
|
leftSideBearing: leftSideBearing,
|
||
|
};
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Parse the `hmtx` table, which contains the horizontal metrics for all glyphs.
|
||
|
// This function augments the glyph array, adding the advanceWidth and leftSideBearing to each glyph.
|
||
|
function parseHmtxTable(font, data, start, numMetrics, numGlyphs, glyphs, opt) {
|
||
|
if (opt.lowMemory)
|
||
|
parseHmtxTableOnLowMemory(font, data, start, numMetrics, numGlyphs);
|
||
|
else parseHmtxTableAll(data, start, numMetrics, numGlyphs, glyphs);
|
||
|
}
|
||
|
|
||
|
export default { parse: parseHmtxTable };
|