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.
73 lines
1.9 KiB
73 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;
|
|
|