You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
43 lines
1.1 KiB
43 lines
1.1 KiB
'use strict'; |
|
|
|
// See documentation here: http://www.microsoft.com/typography/otspec/loca.htm |
|
|
|
var _ = require('lodash'); |
|
var ByteBuffer = require('microbuffer'); |
|
|
|
function tableSize(font, isShortFormat) { |
|
var result = (font.glyphs.length + 1) * (isShortFormat ? 2 : 4); // by glyph count + tail |
|
|
|
return result; |
|
} |
|
|
|
function createLocaTable(font) { |
|
|
|
var isShortFormat = font.ttf_glyph_size < 0x20000; |
|
|
|
var buf = new ByteBuffer(tableSize(font, isShortFormat)); |
|
|
|
var location = 0; |
|
|
|
// Array of offsets in GLYF table for each glyph |
|
_.forEach(font.glyphs, function (glyph) { |
|
if (isShortFormat) { |
|
buf.writeUint16(location); |
|
location += glyph.ttf_size / 2; // actual location must be divided to 2 in short format |
|
} else { |
|
buf.writeUint32(location); |
|
location += glyph.ttf_size; //actual location is stored as is in long format |
|
} |
|
}); |
|
|
|
// The last glyph location is stored to get last glyph length |
|
if (isShortFormat) { |
|
buf.writeUint16(location); |
|
} else { |
|
buf.writeUint32(location); |
|
} |
|
|
|
return buf; |
|
} |
|
|
|
module.exports = createLocaTable;
|
|
|