UNPKG

fonteditor-core

Version:

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

76 lines (64 loc) 1.97 kB
/** * @file otf轮廓转ttf轮廓 * @author mengke01(kekee000@gmail.com) */ import bezierCubic2Q2 from '../../math/bezierCubic2Q2'; import pathCeil from '../../graphics/pathCeil'; /** * 转换轮廓 * * @param {Array} otfContour otf轮廓 * @return {Array} ttf轮廓 */ function transformContour(otfContour) { const contour = []; let prevPoint; let curPoint; let nextPoint; let nextNextPoint; contour.push(prevPoint = otfContour[0]); for (let i = 1, l = otfContour.length; i < l; i++) { curPoint = otfContour[i]; if (curPoint.onCurve) { contour.push(curPoint); prevPoint = curPoint; } // 三次bezier曲线 else { nextPoint = otfContour[i + 1]; nextNextPoint = i === l - 2 ? otfContour[0] : otfContour[i + 2]; const bezierArray = bezierCubic2Q2(prevPoint, curPoint, nextPoint, nextNextPoint); bezierArray[0][2].onCurve = true; contour.push(bezierArray[0][1]); contour.push(bezierArray[0][2]); // 第二个曲线 if (bezierArray[1]) { bezierArray[1][2].onCurve = true; contour.push(bezierArray[1][1]); contour.push(bezierArray[1][2]); } prevPoint = nextNextPoint; i += 2; } } return pathCeil(contour); } /** * otf轮廓转ttf轮廓 * * @param {Array} otfContours otf轮廓数组 * @return {Array} ttf轮廓 */ export default function otfContours2ttfContours(otfContours) { if (!otfContours || !otfContours.length) { return otfContours; } const contours = []; for (let i = 0, l = otfContours.length; i < l; i++) { // 这里可能由于转换错误导致空轮廓,需要去除 if (otfContours[i][0]) { contours.push(transformContour(otfContours[i])); } } return contours; }