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.

74 lines
1.9 KiB

'use strict';
// See documentation here: http://www.microsoft.com/typography/otspec/post.htm
var _ = require('lodash');
var ByteBuffer = require('microbuffer');
function tableSize(font, names) {
var result = 36; // table header
result += font.glyphs.length * 2; // name declarations
_.forEach(names, function (name) {
result += name.length;
});
return result;
}
function pascalString(str) {
var bytes = [];
var len = str ? (str.length < 256 ? str.length : 255) : 0; //length in Pascal string is limited with 255
bytes.push(len);
for (var i = 0; i < len; i++) {
var char = str.charCodeAt(i);
bytes.push(char < 128 ? char : 95); //non-ASCII characters are substituted with '_'
}
return bytes;
}
function createPostTable(font) {
var names = [];
_.forEach(font.glyphs, function (glyph) {
if (glyph.unicode !== 0) {
names.push(pascalString(glyph.name));
}
});
var buf = new ByteBuffer(tableSize(font, names));
buf.writeInt32(0x20000); // formatType, version 2.0
buf.writeInt32(font.italicAngle); // italicAngle
buf.writeInt16(font.underlinePosition); // underlinePosition
buf.writeInt16(font.underlineThickness); // underlineThickness
buf.writeUint32(font.isFixedPitch); // isFixedPitch
buf.writeUint32(0); // minMemType42
buf.writeUint32(0); // maxMemType42
buf.writeUint32(0); // minMemType1
buf.writeUint32(0); // maxMemType1
buf.writeUint16(font.glyphs.length); // numberOfGlyphs
// Array of glyph name indexes
var index = 258; // first index of custom glyph name, it is calculated as glyph name index + 258
_.forEach(font.glyphs, function (glyph) {
if (glyph.unicode === 0) {
buf.writeUint16(0);// missed element should have .notDef name in the Macintosh standard order.
} else {
buf.writeUint16(index++);
}
});
// Array of glyph name indexes
_.forEach(names, function (name) {
buf.writeBytes(name);
});
return buf;
}
module.exports = createPostTable;