import { __extends } from "tslib"; import Path from '../graphic/Path.js'; import PathProxy from '../core/PathProxy.js'; import transformPath from './transformPath.js'; import { extend } from '../core/util.js'; var mathSqrt = Math.sqrt; var mathSin = Math.sin; var mathCos = Math.cos; var PI = Math.PI; function vMag(v) { return Math.sqrt(v[0] * v[0] + v[1] * v[1]); } ; function vRatio(u, v) { return (u[0] * v[0] + u[1] * v[1]) / (vMag(u) * vMag(v)); } ; function vAngle(u, v) { return (u[0] * v[1] < u[1] * v[0] ? -1 : 1) * Math.acos(vRatio(u, v)); } ; function processArc(x1, y1, x2, y2, fa, fs, rx, ry, psiDeg, cmd, path) { var psi = psiDeg * (PI / 180.0); var xp = mathCos(psi) * (x1 - x2) / 2.0 + mathSin(psi) * (y1 - y2) / 2.0; var yp = -1 * mathSin(psi) * (x1 - x2) / 2.0 + mathCos(psi) * (y1 - y2) / 2.0; var lambda = (xp * xp) / (rx * rx) + (yp * yp) / (ry * ry); if (lambda > 1) { rx *= mathSqrt(lambda); ry *= mathSqrt(lambda); } var f = (fa === fs ? -1 : 1) * mathSqrt((((rx * rx) * (ry * ry)) - ((rx * rx) * (yp * yp)) - ((ry * ry) * (xp * xp))) / ((rx * rx) * (yp * yp) + (ry * ry) * (xp * xp))) || 0; var cxp = f * rx * yp / ry; var cyp = f * -ry * xp / rx; var cx = (x1 + x2) / 2.0 + mathCos(psi) * cxp - mathSin(psi) * cyp; var cy = (y1 + y2) / 2.0 + mathSin(psi) * cxp + mathCos(psi) * cyp; var theta = vAngle([1, 0], [(xp - cxp) / rx, (yp - cyp) / ry]); var u = [(xp - cxp) / rx, (yp - cyp) / ry]; var v = [(-1 * xp - cxp) / rx, (-1 * yp - cyp) / ry]; var dTheta = vAngle(u, v); if (vRatio(u, v) <= -1) { dTheta = PI; } if (vRatio(u, v) >= 1) { dTheta = 0; } if (dTheta < 0) { var n = Math.round(dTheta / PI * 1e6) / 1e6; dTheta = PI * 2 + (n % 2) * PI; } path.addData(cmd, cx, cy, rx, ry, theta, dTheta, psi, fs); } var commandReg = /([mlvhzcqtsa])([^mlvhzcqtsa]*)/ig; var numberReg = /-?([0-9]*\.)?[0-9]+([eE]-?[0-9]+)?/g; function createPathProxyFromString(data) { var path = new PathProxy(); if (!data) { return path; } var cpx = 0; var cpy = 0; var subpathX = cpx; var subpathY = cpy; var prevCmd; var CMD = PathProxy.CMD; var cmdList = data.match(commandReg); if (!cmdList) { return path; } for (var l = 0; l < cmdList.length; l++) { var cmdText = cmdList[l]; var cmdStr = cmdText.charAt(0); var cmd = void 0; var p = cmdText.match(numberReg) || []; var pLen = p.length; for (var i = 0; i < pLen; i++) { p[i] = parseFloat(p[i]); } var off = 0; while (off < pLen) { var ctlPtx = void 0; var ctlPty = void 0; var rx = void 0; var ry = void 0; var psi = void 0; var fa = void 0; var fs = void 0; var x1 = cpx; var y1 = cpy; var len = void 0; var pathData = void 0; switch (cmdStr) { case 'l': cpx += p[off++]; cpy += p[off++]; cmd = CMD.L; path.addData(cmd, cpx, cpy); break; case 'L': cpx = p[off++]; cpy = p[off++]; cmd = CMD.L; path.addData(cmd, cpx, cpy); break; case 'm': cpx += p[off++]; cpy += p[off++]; cmd = CMD.M; path.addData(cmd, cpx, cpy); subpathX = cpx; subpathY = cpy; cmdStr = 'l'; break; case 'M': cpx = p[off++]; cpy = p[off++]; cmd = CMD.M; path.addData(cmd, cpx, cpy); subpathX = cpx; subpathY = cpy; cmdStr = 'L'; break; case 'h': cpx += p[off++]; cmd = CMD.L; path.addData(cmd, cpx, cpy); break; case 'H': cpx = p[off++]; cmd = CMD.L; path.addData(cmd, cpx, cpy); break; case 'v': cpy += p[off++]; cmd = CMD.L; path.addData(cmd, cpx, cpy); break; case 'V': cpy = p[off++]; cmd = CMD.L; path.addData(cmd, cpx, cpy); break; case 'C': cmd = CMD.C; path.addData(cmd, p[off++], p[off++], p[off++], p[off++], p[off++], p[off++]); cpx = p[off - 2]; cpy = p[off - 1]; break; case 'c': cmd = CMD.C; path.addData(cmd, p[off++] + cpx, p[off++] + cpy, p[off++] + cpx, p[off++] + cpy, p[off++] + cpx, p[off++] + cpy); cpx += p[off - 2]; cpy += p[off - 1]; break; case 'S': ctlPtx = cpx; ctlPty = cpy; len = path.len(); pathData = path.data; if (prevCmd === CMD.C) { ctlPtx += cpx - pathData[len - 4]; ctlPty += cpy - pathData[len - 3]; } cmd = CMD.C; x1 = p[off++]; y1 = p[off++]; cpx = p[off++]; cpy = p[off++]; path.addData(cmd, ctlPtx, ctlPty, x1, y1, cpx, cpy); break; case 's': ctlPtx = cpx; ctlPty = cpy; len = path.len(); pathData = path.data; if (prevCmd === CMD.C) { ctlPtx += cpx - pathData[len - 4]; ctlPty += cpy - pathData[len - 3]; } cmd = CMD.C; x1 = cpx + p[off++]; y1 = cpy + p[off++]; cpx += p[off++]; cpy += p[off++]; path.addData(cmd, ctlPtx, ctlPty, x1, y1, cpx, cpy); break; case 'Q': x1 = p[off++]; y1 = p[off++]; cpx = p[off++]; cpy = p[off++]; cmd = CMD.Q; path.addData(cmd, x1, y1, cpx, cpy); break; case 'q': x1 = p[off++] + cpx; y1 = p[off++] + cpy; cpx += p[off++]; cpy += p[off++]; cmd = CMD.Q; path.addData(cmd, x1, y1, cpx, cpy); break; case 'T': ctlPtx = cpx; ctlPty = cpy; len = path.len(); pathData = path.data; if (prevCmd === CMD.Q) { ctlPtx += cpx - pathData[len - 4]; ctlPty += cpy - pathData[len - 3]; } cpx = p[off++]; cpy = p[off++]; cmd = CMD.Q; path.addData(cmd, ctlPtx, ctlPty, cpx, cpy); break; case 't': ctlPtx = cpx; ctlPty = cpy; len = path.len(); pathData = path.data; if (prevCmd === CMD.Q) { ctlPtx += cpx - pathData[len - 4]; ctlPty += cpy - pathData[len - 3]; } cpx += p[off++]; cpy += p[off++]; cmd = CMD.Q; path.addData(cmd, ctlPtx, ctlPty, cpx, cpy); break; case 'A': rx = p[off++]; ry = p[off++]; psi = p[off++]; fa = p[off++]; fs = p[off++]; x1 = cpx, y1 = cpy; cpx = p[off++]; cpy = p[off++]; cmd = CMD.A; processArc(x1, y1, cpx, cpy, fa, fs, rx, ry, psi, cmd, path); break; case 'a': rx = p[off++]; ry = p[off++]; psi = p[off++]; fa = p[off++]; fs = p[off++]; x1 = cpx, y1 = cpy; cpx += p[off++]; cpy += p[off++]; cmd = CMD.A; processArc(x1, y1, cpx, cpy, fa, fs, rx, ry, psi, cmd, path); break; } } if (cmdStr === 'z' || cmdStr === 'Z') { cmd = CMD.Z; path.addData(cmd); cpx = subpathX; cpy = subpathY; } prevCmd = cmd; } path.toStatic(); return path; } var SVGPath = (function (_super) { __extends(SVGPath, _super); function SVGPath() { return _super !== null && _super.apply(this, arguments) || this; } SVGPath.prototype.applyTransform = function (m) { }; return SVGPath; }(Path)); function isPathProxy(path) { return path.setData != null; } function createPathOptions(str, opts) { var pathProxy = createPathProxyFromString(str); var innerOpts = extend({}, opts); innerOpts.buildPath = function (path) { if (isPathProxy(path)) { path.setData(pathProxy.data); var ctx = path.getContext(); if (ctx) { path.rebuildPath(ctx, 1); } } else { var ctx = path; pathProxy.rebuildPath(ctx, 1); } }; innerOpts.applyTransform = function (m) { transformPath(pathProxy, m); this.dirtyShape(); }; return innerOpts; } export function createFromString(str, opts) { return new SVGPath(createPathOptions(str, opts)); } export function extendFromString(str, defaultOpts) { var innerOpts = createPathOptions(str, defaultOpts); var Sub = (function (_super) { __extends(Sub, _super); function Sub(opts) { var _this = _super.call(this, opts) || this; _this.applyTransform = innerOpts.applyTransform; _this.buildPath = innerOpts.buildPath; return _this; } return Sub; }(SVGPath)); return Sub; } export function mergePath(pathEls, opts) { var pathList = []; var len = pathEls.length; for (var i = 0; i < len; i++) { var pathEl = pathEls[i]; pathList.push(pathEl.getUpdatedPathProxy(true)); } var pathBundle = new Path(opts); pathBundle.createPathProxy(); pathBundle.buildPath = function (path) { if (isPathProxy(path)) { path.appendPath(pathList); var ctx = path.getContext(); if (ctx) { path.rebuildPath(ctx, 1); } } }; return pathBundle; } export function clonePath(sourcePath, opts) { opts = opts || {}; var path = new Path(); if (sourcePath.shape) { path.setShape(sourcePath.shape); } path.setStyle(sourcePath.style); if (opts.bakeTransform) { transformPath(path.path, sourcePath.getComputedTransform()); } else { if (opts.toLocal) { path.setLocalTransform(sourcePath.getComputedTransform()); } else { path.copyTransform(sourcePath); } } path.buildPath = sourcePath.buildPath; path.applyTransform = path.applyTransform; path.z = sourcePath.z; path.z2 = sourcePath.z2; path.zlevel = sourcePath.zlevel; return path; }