fonteditor-core
Version:
fonts (ttf, woff, woff2, eot, svg, otf) parse, write, transform, glyph adjust.
146 lines (136 loc) • 4.76 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _table = _interopRequireDefault(require("./table"));
var _nameId = _interopRequireDefault(require("../enum/nameId"));
var _string = _interopRequireDefault(require("../util/string"));
var _platform = _interopRequireDefault(require("../enum/platform"));
var _encoding = require("../enum/encoding");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* @file name表
* @author mengke01(kekee000@gmail.com)
*/
var _default = exports.default = _table.default.create('name', [], {
read: function read(reader) {
var offset = this.offset;
reader.seek(offset);
var nameTbl = {};
nameTbl.format = reader.readUint16();
nameTbl.count = reader.readUint16();
nameTbl.stringOffset = reader.readUint16();
var nameRecordTbl = [];
var count = nameTbl.count;
var i;
var nameRecord;
for (i = 0; i < count; ++i) {
nameRecord = {};
nameRecord.platform = reader.readUint16();
nameRecord.encoding = reader.readUint16();
nameRecord.language = reader.readUint16();
nameRecord.nameId = reader.readUint16();
nameRecord.length = reader.readUint16();
nameRecord.offset = reader.readUint16();
nameRecordTbl.push(nameRecord);
}
offset += nameTbl.stringOffset;
// 读取字符名字
for (i = 0; i < count; ++i) {
nameRecord = nameRecordTbl[i];
nameRecord.name = reader.readBytes(offset + nameRecord.offset, nameRecord.length);
}
var names = {};
// mac 下的english name
var platform = _platform.default.Macintosh;
var encoding = _encoding.mac.Default;
var language = 0;
// 如果有windows 下的 english,则用windows下的 name
if (nameRecordTbl.some(function (record) {
return record.platform === _platform.default.Microsoft && record.encoding === _encoding.win.UCS2 && record.language === 1033;
})) {
platform = _platform.default.Microsoft;
encoding = _encoding.win.UCS2;
language = 1033;
}
for (i = 0; i < count; ++i) {
nameRecord = nameRecordTbl[i];
if (nameRecord.platform === platform && nameRecord.encoding === encoding && nameRecord.language === language && _nameId.default[nameRecord.nameId]) {
names[_nameId.default[nameRecord.nameId]] = language === 0 ? _string.default.getUTF8String(nameRecord.name) : _string.default.getUCS2String(nameRecord.name);
}
}
return names;
},
write: function write(writer, ttf) {
var nameRecordTbl = ttf.support.name;
writer.writeUint16(0); // format
writer.writeUint16(nameRecordTbl.length); // count
writer.writeUint16(6 + nameRecordTbl.length * 12); // string offset
// write name tbl header
var offset = 0;
nameRecordTbl.forEach(function (nameRecord) {
writer.writeUint16(nameRecord.platform);
writer.writeUint16(nameRecord.encoding);
writer.writeUint16(nameRecord.language);
writer.writeUint16(nameRecord.nameId);
writer.writeUint16(nameRecord.name.length);
writer.writeUint16(offset); // offset
offset += nameRecord.name.length;
});
// write name tbl strings
nameRecordTbl.forEach(function (nameRecord) {
writer.writeBytes(nameRecord.name);
});
return writer;
},
size: function size(ttf) {
var names = ttf.name;
var nameRecordTbl = [];
// 写入name信息
// 这里为了简化书写,仅支持英文编码字符,
// 中文编码字符将被转化成url encode
var size = 6;
Object.keys(names).forEach(function (name) {
var id = _nameId.default.names[name];
var utf8Bytes = _string.default.toUTF8Bytes(names[name]);
var usc2Bytes = _string.default.toUCS2Bytes(names[name]);
if (undefined !== id) {
// mac
nameRecordTbl.push({
nameId: id,
platform: 1,
encoding: 0,
language: 0,
name: utf8Bytes
});
// windows
nameRecordTbl.push({
nameId: id,
platform: 3,
encoding: 1,
language: 1033,
name: usc2Bytes
});
// 子表大小
size += 12 * 2 + utf8Bytes.length + usc2Bytes.length;
}
});
var namingOrder = ['platform', 'encoding', 'language', 'nameId'];
nameRecordTbl = nameRecordTbl.sort(function (a, b) {
var l = 0;
namingOrder.some(function (name) {
var o = a[name] - b[name];
if (o) {
l = o;
return true;
}
return false;
});
return l;
});
// 保存预处理信息
ttf.support.name = nameRecordTbl;
return size;
}
});