UNPKG

svg2ttf

Version:

Converts SVG font to TTF font

73 lines (56 loc) 1.96 kB
'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