import PathProxy from '../core/PathProxy'; 
 | 
import {applyTransform as v2ApplyTransform, VectorArray} from '../core/vector'; 
 | 
import { MatrixArray } from '../core/matrix'; 
 | 
  
 | 
const CMD = PathProxy.CMD; 
 | 
  
 | 
const points: VectorArray[] = [[], [], []]; 
 | 
const mathSqrt = Math.sqrt; 
 | 
const mathAtan2 = Math.atan2; 
 | 
  
 | 
export default function transformPath(path: PathProxy, m: MatrixArray) { 
 | 
    if (!m) { 
 | 
        return; 
 | 
    } 
 | 
  
 | 
    let data = path.data; 
 | 
    const len = path.len(); 
 | 
    let cmd; 
 | 
    let nPoint: number; 
 | 
    let i: number; 
 | 
    let j: number; 
 | 
    let k: number; 
 | 
    let p: VectorArray; 
 | 
  
 | 
    const M = CMD.M; 
 | 
    const C = CMD.C; 
 | 
    const L = CMD.L; 
 | 
    const R = CMD.R; 
 | 
    const A = CMD.A; 
 | 
    const Q = CMD.Q; 
 | 
  
 | 
    for (i = 0, j = 0; i < len;) { 
 | 
        cmd = data[i++]; 
 | 
        j = i; 
 | 
        nPoint = 0; 
 | 
  
 | 
        switch (cmd) { 
 | 
            case M: 
 | 
                nPoint = 1; 
 | 
                break; 
 | 
            case L: 
 | 
                nPoint = 1; 
 | 
                break; 
 | 
            case C: 
 | 
                nPoint = 3; 
 | 
                break; 
 | 
            case Q: 
 | 
                nPoint = 2; 
 | 
                break; 
 | 
            case A: 
 | 
                const x = m[4]; 
 | 
                const y = m[5]; 
 | 
                const sx = mathSqrt(m[0] * m[0] + m[1] * m[1]); 
 | 
                const sy = mathSqrt(m[2] * m[2] + m[3] * m[3]); 
 | 
                const angle = mathAtan2(-m[1] / sy, m[0] / sx); 
 | 
                // cx 
 | 
                data[i] *= sx; 
 | 
                data[i++] += x; 
 | 
                // cy 
 | 
                data[i] *= sy; 
 | 
                data[i++] += y; 
 | 
                // Scale rx and ry 
 | 
                // FIXME Assume psi is 0 here 
 | 
                data[i++] *= sx; 
 | 
                data[i++] *= sy; 
 | 
  
 | 
                // Start angle 
 | 
                data[i++] += angle; 
 | 
                // end angle 
 | 
                data[i++] += angle; 
 | 
                // FIXME psi 
 | 
                i += 2; 
 | 
                j = i; 
 | 
                break; 
 | 
            case R: 
 | 
                // x0, y0 
 | 
                p[0] = data[i++]; 
 | 
                p[1] = data[i++]; 
 | 
                v2ApplyTransform(p, p, m); 
 | 
                data[j++] = p[0]; 
 | 
                data[j++] = p[1]; 
 | 
                // x1, y1 
 | 
                p[0] += data[i++]; 
 | 
                p[1] += data[i++]; 
 | 
                v2ApplyTransform(p, p, m); 
 | 
                data[j++] = p[0]; 
 | 
                data[j++] = p[1]; 
 | 
        } 
 | 
  
 | 
        for (k = 0; k < nPoint; k++) { 
 | 
            let p = points[k]; 
 | 
            p[0] = data[i++]; 
 | 
            p[1] = data[i++]; 
 | 
  
 | 
            v2ApplyTransform(p, p, m); 
 | 
            // Write back 
 | 
            data[j++] = p[0]; 
 | 
            data[j++] = p[1]; 
 | 
        } 
 | 
    } 
 | 
  
 | 
    path.increaseVersion(); 
 | 
} 
 |