diff --git a/src/ttf/table/glyfwriter.js b/src/ttf/table/glyfwriter.js index 2030db8..8dac8f3 100644 --- a/src/ttf/table/glyfwriter.js +++ b/src/ttf/table/glyfwriter.js @@ -86,8 +86,6 @@ define( return size; } - - /** * 获取flags * @@ -100,18 +98,21 @@ define( return glyfSupport; } - - var prev = {}; var flags = []; var xCoord = []; var yCoord = []; - var first = true; - glyf.contours.forEach(function(contour) { - contour.forEach(function(p) { + var contours = glyf.contours, contour, prev, first = true; + for(var j = 0, cl = contours.length; j < cl; j++) { + contour = contours[j]; + for(var i = 0, l = contour.length; i < l; i++) { + + p = contour[i]; + if (first) { xCoord.push(p.x); yCoord.push(p.y); + first = false; } else { xCoord.push(p.x - prev.x); @@ -119,9 +120,8 @@ define( } flags.push(p.onCurve ? glyFlag.ONCURVE : 0); prev = p; - first = false; - }); - }); + } + } // compress var flagsC = []; diff --git a/src/ttf/ttfwriter.js b/src/ttf/ttfwriter.js index 35169d3..b40a90b 100644 --- a/src/ttf/ttfwriter.js +++ b/src/ttf/ttfwriter.js @@ -16,6 +16,8 @@ define( var supportTables = require('./table/support'); var checkSum = require('./util/checkSum'); + var reduceGlyf = require('./util/reduceGlyf'); + // 支持写的表, 注意表顺序 var tableList = [ 'OS/2', @@ -63,6 +65,10 @@ define( if (glyf.unicode) { glyf.unicode = glyf.unicode.sort(); } + + if (!glyf.compound && glyf.contours) { + reduceGlyf(glyf); + } }); } diff --git a/src/ttf/util/reduceGlyf.js b/src/ttf/util/reduceGlyf.js new file mode 100644 index 0000000..d4d6b5e --- /dev/null +++ b/src/ttf/util/reduceGlyf.js @@ -0,0 +1,66 @@ +/** + * @file reduceGlyf.js + * @author mengke01 + * @date + * @description + * 缩减glyf大小,去除冗余节点 + */ + + +define( + function(require) { + + /** + * 判断点是否多余的点 + * + * @param {Object} p 当前 + * @param {Object} prev 上一个 + * @param {Object} next 下一个 + * @return {boolean} + */ + function redundant(p, prev, next) { + + // 是否重合的点, 只有两个点同在曲线上或者同不在曲线上移出 + if ( Math.pow(p.x - next.x, 2) + Math.pow(p.y - next.y, 2) <= 1) { + return !p.onCurve ^ !!next.onCurve; + } + + // 三点同线 + // else if ((next.y - p.y) * (prev.x - p.x) == (prev.y - p.y) * (next.x - p.x)) { + // return p.onCurve && prev.onCurve && next.onCurve; + // } + + return false; + } + + /** + * 缩减glyf,去除冗余节点 + * + * @param {Object} glyf glyf对象 + * @return {Object} glyf对象 + */ + function reduceGlyf(glyf) { + + var contours = glyf.contours, contour, prev; + for(var j = 0, cl = contours.length; j < cl; j++) { + contour = contours[j]; + + for(var i = contour.length - 1, last = i; i >= 0; i--) { + + // 这里注意逆序 + next = i === last ? contour[0] : contour[i + 1]; + prev = i === 0 ? contour[last] : contour[i - 1]; + p = contour[i]; + + if (redundant(p, prev, next)) { + contour.splice(i, 1); + last--; + continue; + } + } + } + } + + return reduceGlyf; + } +);