fonteditor-core
Version:
fonts (ttf, woff, woff2, eot, svg, otf) parse, write, transform, glyph adjust.
143 lines (135 loc) • 4.65 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = readWindowsAllCodes;
/* eslint-disable */
/**
* @file 读取windows支持的字符集
* @author mengke01(kekee000@gmail.com)
*
* @see
* https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6cmap.html
*/
/**
* 读取ttf中windows字符表的字符
*
* @param {Array} tables cmap表结构
* @param {Object} ttf ttf对象
* @return {Object} 字符字典索引,unicode => glyf index
*/
function readWindowsAllCodes(tables, ttf) {
var codes = {};
// 读取windows unicode 编码段
var format0 = tables.find(function (item) {
return item.format === 0;
});
// 读取windows unicode 编码段
var format12 = tables.find(function (item) {
return item.platformID === 3 && item.encodingID === 10 && item.format === 12;
});
var format4 = tables.find(function (item) {
return item.platformID === 3 && item.encodingID === 1 && item.format === 4;
});
var format2 = tables.find(function (item) {
return item.platformID === 3 && item.encodingID === 3 && item.format === 2;
});
var format14 = tables.find(function (item) {
return item.platformID === 0 && item.encodingID === 5 && item.format === 14;
});
if (format0) {
for (var i = 0, l = format0.glyphIdArray.length; i < l; i++) {
if (format0.glyphIdArray[i]) {
codes[i] = format0.glyphIdArray[i];
}
}
}
// format 14 support
if (format14) {
for (var _i = 0, _l = format14.groups.length; _i < _l; _i++) {
var _format14$groups$_i = format14.groups[_i],
unicode = _format14$groups$_i.unicode,
glyphId = _format14$groups$_i.glyphId;
if (unicode) {
codes[unicode] = glyphId;
}
}
}
// 读取format12表
if (format12) {
for (var _i2 = 0, _l2 = format12.nGroups; _i2 < _l2; _i2++) {
var group = format12.groups[_i2];
var startId = group.startId;
var start = group.start;
var end = group.end;
for (; start <= end;) {
codes[start++] = startId++;
}
}
}
// 读取format4表
else if (format4) {
var segCount = format4.segCountX2 / 2;
// graphIdArray 和idRangeOffset的偏移量
var graphIdArrayIndexOffset = (format4.glyphIdArrayOffset - format4.idRangeOffsetOffset) / 2;
for (var _i3 = 0; _i3 < segCount; ++_i3) {
// 读取单个字符
for (var _start = format4.startCode[_i3], _end = format4.endCode[_i3]; _start <= _end; ++_start) {
// range offset = 0
if (format4.idRangeOffset[_i3] === 0) {
codes[_start] = (_start + format4.idDelta[_i3]) % 0x10000;
}
// rely on to glyphIndexArray
else {
var index = _i3 + format4.idRangeOffset[_i3] / 2 + (_start - format4.startCode[_i3]) - graphIdArrayIndexOffset;
var graphId = format4.glyphIdArray[index];
if (graphId !== 0) {
codes[_start] = (graphId + format4.idDelta[_i3]) % 0x10000;
} else {
codes[_start] = 0;
}
}
}
}
delete codes[65535];
}
// 读取format2表
// see https://github.com/fontforge/fontforge/blob/master/fontforge/parsettf.c
else if (format2) {
var subHeadKeys = format2.subHeadKeys;
var subHeads = format2.subHeads;
var glyphs = format2.glyphs;
var numGlyphs = ttf.maxp.numGlyphs;
var _index = 0;
for (var _i4 = 0; _i4 < 256; _i4++) {
// 单字节编码
if (subHeadKeys[_i4] === 0) {
if (_i4 >= format2.maxPos) {
_index = 0;
} else if (_i4 < subHeads[0].firstCode || _i4 >= subHeads[0].firstCode + subHeads[0].entryCount || subHeads[0].idRangeOffset + (_i4 - subHeads[0].firstCode) >= glyphs.length) {
_index = 0;
} else if ((_index = glyphs[subHeads[0].idRangeOffset + (_i4 - subHeads[0].firstCode)]) !== 0) {
_index = _index + subHeads[0].idDelta;
}
// 单字节解码
if (_index !== 0 && _index < numGlyphs) {
codes[_i4] = _index;
}
} else {
var k = subHeadKeys[_i4];
for (var j = 0, entryCount = subHeads[k].entryCount; j < entryCount; j++) {
if (subHeads[k].idRangeOffset + j >= glyphs.length) {
_index = 0;
} else if ((_index = glyphs[subHeads[k].idRangeOffset + j]) !== 0) {
_index = _index + subHeads[k].idDelta;
}
if (_index !== 0 && _index < numGlyphs) {
var _unicode = (_i4 << 8 | j + subHeads[k].firstCode) % 0xffff;
codes[_unicode] = _index;
}
}
}
}
}
return codes;
}