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; 
 | 
} 
 |