UNPKG

zrender

Version:

A lightweight graphic library providing 2d draw for Apache ECharts

104 lines (92 loc) 2.69 kB
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(); }