UNPKG

fonteditor-core

Version:

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

74 lines (62 loc) 1.69 kB
/** * @file 缩减path大小,去除冗余节点 * @author mengke01(kekee000@gmail.com) */ /** * 判断点是否多余的点 * * @param {Object} prev 上一个 * @param {Object} p 当前 * @param {Object} next 下一个 * @return {boolean} */ function redundant(prev, p, next) { // 是否重合的点, 只有两个点同在曲线上或者同不在曲线上移出 if ( (p.onCurve && next.onCurve || !p.onCurve && !next.onCurve) && Math.pow(p.x - next.x, 2) + Math.pow(p.y - next.y, 2) <= 1 ) { return true; } // 三点同线 检查直线点 if ( (p.onCurve && prev.onCurve && next.onCurve) && Math.abs((next.y - p.y) * (prev.x - p.x) - (prev.y - p.y) * (next.x - p.x)) <= 0.001 ) { return true; } // 三点同线 检查控制点 if ( (!p.onCurve && prev.onCurve && next.onCurve) && Math.abs((next.y - p.y) * (prev.x - p.x) - (prev.y - p.y) * (next.x - p.x)) <= 0.001 ) { return true; } return false; } /** * 缩减glyf,去除冗余节点 * * @param {Array} contour 路径对象 * @return {Array} 路径对象 */ export default function reducePath(contour) { if (!contour.length) { return contour; } let prev; let next; let p; for (let i = contour.length - 1, last = i; i >= 0; i--) { // 这里注意逆序 p = contour[i]; next = i === last ? contour[0] : contour[i + 1]; prev = i === 0 ? contour[last] : contour[i - 1]; if (redundant(prev, p, next)) { contour.splice(i, 1); last--; continue; } } return contour; }