fonteditor-core
Version:
fonts (ttf, woff, woff2, eot, svg, otf) parse, write, transform, glyph adjust.
143 lines (134 loc) • 4.88 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = write;
var _componentFlag = _interopRequireDefault(require("../../enum/componentFlag"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* @file 写glyf数据
* @author mengke01(kekee000@gmail.com)
*/
/**
* 写glyf
*
* @param {Object} writer 写入器
* @param {Object} ttf ttf对象
* @return {Object} 写入器
*/
function write(writer, ttf) {
var hinting = ttf.writeOptions ? ttf.writeOptions.hinting : false;
var writeZeroContoursGlyfData = ttf.writeOptions ? ttf.writeOptions.writeZeroContoursGlyfData : false;
ttf.glyf.forEach(function (glyf, index) {
// 非复合图元没有轮廓则不写
if (!glyf.compound && !writeZeroContoursGlyfData && (!glyf.contours || !glyf.contours.length)) {
return;
}
// header
writer.writeInt16(glyf.compound ? -1 : (glyf.contours || []).length);
writer.writeInt16(glyf.xMin);
writer.writeInt16(glyf.yMin);
writer.writeInt16(glyf.xMax);
writer.writeInt16(glyf.yMax);
var i;
var l;
var flags;
// 复合图元
if (glyf.compound) {
for (i = 0, l = glyf.glyfs.length; i < l; i++) {
var g = glyf.glyfs[i];
flags = g.points ? 0 : _componentFlag.default.ARGS_ARE_XY_VALUES + _componentFlag.default.ROUND_XY_TO_GRID; // xy values
// more components
if (i < l - 1) {
flags += _componentFlag.default.MORE_COMPONENTS;
}
// use my metrics
flags += g.useMyMetrics ? _componentFlag.default.USE_MY_METRICS : 0;
// overlap compound
flags += g.overlapCompound ? _componentFlag.default.OVERLAP_COMPOUND : 0;
var transform = g.transform;
var a = transform.a;
var b = transform.b;
var c = transform.c;
var d = transform.d;
var e = g.points ? g.points[0] : transform.e;
var f = g.points ? g.points[1] : transform.f;
// xy values or points
// int 8 放不下,则用int16放
if (e < 0 || e > 0x7F || f < 0 || f > 0x7F) {
flags += _componentFlag.default.ARG_1_AND_2_ARE_WORDS;
}
if (b || c) {
flags += _componentFlag.default.WE_HAVE_A_TWO_BY_TWO;
} else if ((a !== 1 || d !== 1) && a === d) {
flags += _componentFlag.default.WE_HAVE_A_SCALE;
} else if (a !== 1 || d !== 1) {
flags += _componentFlag.default.WE_HAVE_AN_X_AND_Y_SCALE;
}
writer.writeUint16(flags);
writer.writeUint16(g.glyphIndex);
if (_componentFlag.default.ARG_1_AND_2_ARE_WORDS & flags) {
writer.writeInt16(e);
writer.writeInt16(f);
} else {
writer.writeUint8(e);
writer.writeUint8(f);
}
if (_componentFlag.default.WE_HAVE_A_SCALE & flags) {
writer.writeInt16(Math.round(a * 16384));
} else if (_componentFlag.default.WE_HAVE_AN_X_AND_Y_SCALE & flags) {
writer.writeInt16(Math.round(a * 16384));
writer.writeInt16(Math.round(d * 16384));
} else if (_componentFlag.default.WE_HAVE_A_TWO_BY_TWO & flags) {
writer.writeInt16(Math.round(a * 16384));
writer.writeInt16(Math.round(b * 16384));
writer.writeInt16(Math.round(c * 16384));
writer.writeInt16(Math.round(d * 16384));
}
}
} else {
var endPtsOfContours = -1;
(glyf.contours || []).forEach(function (contour) {
endPtsOfContours += contour.length;
writer.writeUint16(endPtsOfContours);
});
// instruction
if (hinting && glyf.instructions) {
var instructions = glyf.instructions;
writer.writeUint16(instructions.length);
for (i = 0, l = instructions.length; i < l; i++) {
writer.writeUint8(instructions[i]);
}
} else {
writer.writeUint16(0);
}
// 获取暂存中的flags
flags = ttf.support.glyf[index].flags || [];
for (i = 0, l = flags.length; i < l; i++) {
writer.writeUint8(flags[i]);
}
var xCoord = ttf.support.glyf[index].xCoord || [];
for (i = 0, l = xCoord.length; i < l; i++) {
if (0 <= xCoord[i] && xCoord[i] <= 0xFF) {
writer.writeUint8(xCoord[i]);
} else {
writer.writeInt16(xCoord[i]);
}
}
var yCoord = ttf.support.glyf[index].yCoord || [];
for (i = 0, l = yCoord.length; i < l; i++) {
if (0 <= yCoord[i] && yCoord[i] <= 0xFF) {
writer.writeUint8(yCoord[i]);
} else {
writer.writeInt16(yCoord[i]);
}
}
}
// 4字节对齐
var glyfSize = ttf.support.glyf[index].glyfSize;
if (glyfSize % 4) {
writer.writeEmpty(4 - glyfSize % 4);
}
});
return writer;
}