svg2ttf
Version:
Converts SVG font to TTF font
73 lines (56 loc) • 1.96 kB
JavaScript
// 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