UNPKG

fonteditor-core

Version:

fonts (ttf, woff, woff2, eot, svg, otf) parse, write, transform, glyph adjust.

124 lines (113 loc) 5.22 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = ttf2eot; var _reader = _interopRequireDefault(require("./reader")); var _writer = _interopRequireDefault(require("./writer")); var _string = _interopRequireDefault(require("./util/string")); var _error = _interopRequireDefault(require("./error")); var _table = _interopRequireDefault(require("./table/table")); var _struct = _interopRequireDefault(require("./table/struct")); var _name = _interopRequireDefault(require("./table/name")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * @file ttf转eot * @author mengke01(kekee000@gmail.com) * * reference: * http://www.w3.org/Submission/EOT/ * https://github.com/fontello/ttf2eot/blob/master/index.js */ var EotHead = _table.default.create('head', [['EOTSize', _struct.default.Uint32], ['FontDataSize', _struct.default.Uint32], ['Version', _struct.default.Uint32], ['Flags', _struct.default.Uint32], ['PANOSE', _struct.default.Bytes, 10], ['Charset', _struct.default.Uint8], ['Italic', _struct.default.Uint8], ['Weight', _struct.default.Uint32], ['fsType', _struct.default.Uint16], ['MagicNumber', _struct.default.Uint16], ['UnicodeRange', _struct.default.Bytes, 16], ['CodePageRange', _struct.default.Bytes, 8], ['CheckSumAdjustment', _struct.default.Uint32], ['Reserved', _struct.default.Bytes, 16], ['Padding1', _struct.default.Uint16]]); /** * ttf格式转换成eot字体格式 * * @param {ArrayBuffer} ttfBuffer ttf缓冲数组 * @param {Object} options 选项 * @return {ArrayBuffer} eot格式byte流 */ // eslint-disable-next-line no-unused-vars function ttf2eot(ttfBuffer) { var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; // 构造eot头部 var eotHead = new EotHead(); var eotHeaderSize = eotHead.size(); var eot = {}; eot.head = eotHead.read(new _reader.default(new ArrayBuffer(eotHeaderSize))); // set fields eot.head.FontDataSize = ttfBuffer.byteLength || ttfBuffer.length; eot.head.Version = 0x20001; eot.head.Flags = 0; eot.head.Charset = 0x1; eot.head.MagicNumber = 0x504C; eot.head.Padding1 = 0; var ttfReader = new _reader.default(ttfBuffer); // 读取ttf表个数 var numTables = ttfReader.readUint16(4); if (numTables <= 0 || numTables > 100) { _error.default.raise(10101); } // 读取ttf表索引信息 ttfReader.seek(12); // 需要读取3个表内容,设置3个byte var tblReaded = 0; for (var i = 0; i < numTables && tblReaded !== 0x7; ++i) { var tableEntry = { tag: ttfReader.readString(ttfReader.offset, 4), checkSum: ttfReader.readUint32(), offset: ttfReader.readUint32(), length: ttfReader.readUint32() }; var entryOffset = ttfReader.offset; if (tableEntry.tag === 'head') { eot.head.CheckSumAdjustment = ttfReader.readUint32(tableEntry.offset + 8); tblReaded += 0x1; } else if (tableEntry.tag === 'OS/2') { eot.head.PANOSE = ttfReader.readBytes(tableEntry.offset + 32, 10); eot.head.Italic = ttfReader.readUint16(tableEntry.offset + 62); eot.head.Weight = ttfReader.readUint16(tableEntry.offset + 4); eot.head.fsType = ttfReader.readUint16(tableEntry.offset + 8); eot.head.UnicodeRange = ttfReader.readBytes(tableEntry.offset + 42, 16); eot.head.CodePageRange = ttfReader.readBytes(tableEntry.offset + 78, 8); tblReaded += 0x2; } // 设置名字信息 else if (tableEntry.tag === 'name') { var names = new _name.default(tableEntry.offset).read(ttfReader); eot.FamilyName = _string.default.toUCS2Bytes(names.fontFamily || ''); eot.FamilyNameSize = eot.FamilyName.length; eot.StyleName = _string.default.toUCS2Bytes(names.fontStyle || ''); eot.StyleNameSize = eot.StyleName.length; eot.VersionName = _string.default.toUCS2Bytes(names.version || ''); eot.VersionNameSize = eot.VersionName.length; eot.FullName = _string.default.toUCS2Bytes(names.fullName || ''); eot.FullNameSize = eot.FullName.length; tblReaded += 0x3; } ttfReader.seek(entryOffset); } // 计算size eot.head.EOTSize = eotHeaderSize + 4 + eot.FamilyNameSize + 4 + eot.StyleNameSize + 4 + eot.VersionNameSize + 4 + eot.FullNameSize + 2 + eot.head.FontDataSize; // 这里用小尾方式写入 var eotWriter = new _writer.default(new ArrayBuffer(eot.head.EOTSize), 0, eot.head.EOTSize, true); // write head eotHead.write(eotWriter, eot); // write names eotWriter.writeUint16(eot.FamilyNameSize); eotWriter.writeBytes(eot.FamilyName, eot.FamilyNameSize); eotWriter.writeUint16(0); eotWriter.writeUint16(eot.StyleNameSize); eotWriter.writeBytes(eot.StyleName, eot.StyleNameSize); eotWriter.writeUint16(0); eotWriter.writeUint16(eot.VersionNameSize); eotWriter.writeBytes(eot.VersionName, eot.VersionNameSize); eotWriter.writeUint16(0); eotWriter.writeUint16(eot.FullNameSize); eotWriter.writeBytes(eot.FullName, eot.FullNameSize); eotWriter.writeUint16(0); // write rootstring eotWriter.writeUint16(0); eotWriter.writeBytes(ttfBuffer, eot.head.FontDataSize); return eotWriter.getBuffer(); }