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