UNPKG

fonteditor-core

Version:

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

102 lines (97 loc) 3.07 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _table = _interopRequireDefault(require("./table")); var _parse = _interopRequireDefault(require("./glyf/parse")); var _write = _interopRequireDefault(require("./glyf/write")); var _sizeof = _interopRequireDefault(require("./glyf/sizeof")); var _lang = require("../../common/lang"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * @file glyf表 * @author mengke01(kekee000@gmail.com) * * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6glyf.html */ var _default = exports.default = _table.default.create('glyf', [], { read: function read(reader, ttf) { var startOffset = this.offset; var loca = ttf.loca; var numGlyphs = ttf.maxp.numGlyphs; var glyphs = []; reader.seek(startOffset); // subset var subset = ttf.readOptions.subset; if (subset && subset.length > 0) { var subsetMap = { 0: true // 设置.notdef }; subsetMap[0] = true; // subset map var cmap = ttf.cmap; // unicode to index Object.keys(cmap).forEach(function (c) { if (subset.indexOf(+c) > -1) { var _i = cmap[c]; subsetMap[_i] = true; } }); ttf.subsetMap = subsetMap; var parsedGlyfMap = {}; // 循环解析subset相关的glyf,包括复合字形相关的字形 var travelsParse = function travels(subsetMap) { var newSubsetMap = {}; Object.keys(subsetMap).forEach(function (i) { var index = +i; parsedGlyfMap[index] = true; // 当前的和下一个一样,或者最后一个无轮廓 if (loca[index] === loca[index + 1]) { glyphs[index] = { contours: [] }; } else { glyphs[index] = (0, _parse.default)(reader, ttf, startOffset + loca[index]); } if (glyphs[index].compound) { glyphs[index].glyfs.forEach(function (g) { if (!parsedGlyfMap[g.glyphIndex]) { newSubsetMap[g.glyphIndex] = true; } }); } }); if (!(0, _lang.isEmptyObject)(newSubsetMap)) { travels(newSubsetMap); } }; travelsParse(subsetMap); return glyphs; } // 解析字体轮廓, 前n-1个 var i; var l; for (i = 0, l = numGlyphs - 1; i < l; i++) { // 当前的和下一个一样,或者最后一个无轮廓 if (loca[i] === loca[i + 1]) { glyphs[i] = { contours: [] }; } else { glyphs[i] = (0, _parse.default)(reader, ttf, startOffset + loca[i]); } } // 最后一个轮廓 if (ttf.tables.glyf.length - loca[i] < 5) { glyphs[i] = { contours: [] }; } else { glyphs[i] = (0, _parse.default)(reader, ttf, startOffset + loca[i]); } return glyphs; }, write: _write.default, size: _sizeof.default });