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
74 lines
1.9 KiB
2 years ago
|
'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;
|