003aea973ddd207e519bfd9da15abfa9d322223c6dc5f389b797327d1a48b3ee97775efeb3d27671288efebf26101f6c554dfeac5d26a5c55743fc1f8a86cc 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import PathProxy from '../core/PathProxy';
  2. import {applyTransform as v2ApplyTransform, VectorArray} from '../core/vector';
  3. import { MatrixArray } from '../core/matrix';
  4. const CMD = PathProxy.CMD;
  5. const points: VectorArray[] = [[], [], []];
  6. const mathSqrt = Math.sqrt;
  7. const mathAtan2 = Math.atan2;
  8. export default function transformPath(path: PathProxy, m: MatrixArray) {
  9. if (!m) {
  10. return;
  11. }
  12. let data = path.data;
  13. const len = path.len();
  14. let cmd;
  15. let nPoint: number;
  16. let i: number;
  17. let j: number;
  18. let k: number;
  19. let p: VectorArray;
  20. const M = CMD.M;
  21. const C = CMD.C;
  22. const L = CMD.L;
  23. const R = CMD.R;
  24. const A = CMD.A;
  25. const Q = CMD.Q;
  26. for (i = 0, j = 0; i < len;) {
  27. cmd = data[i++];
  28. j = i;
  29. nPoint = 0;
  30. switch (cmd) {
  31. case M:
  32. nPoint = 1;
  33. break;
  34. case L:
  35. nPoint = 1;
  36. break;
  37. case C:
  38. nPoint = 3;
  39. break;
  40. case Q:
  41. nPoint = 2;
  42. break;
  43. case A:
  44. const x = m[4];
  45. const y = m[5];
  46. const sx = mathSqrt(m[0] * m[0] + m[1] * m[1]);
  47. const sy = mathSqrt(m[2] * m[2] + m[3] * m[3]);
  48. const angle = mathAtan2(-m[1] / sy, m[0] / sx);
  49. // cx
  50. data[i] *= sx;
  51. data[i++] += x;
  52. // cy
  53. data[i] *= sy;
  54. data[i++] += y;
  55. // Scale rx and ry
  56. // FIXME Assume psi is 0 here
  57. data[i++] *= sx;
  58. data[i++] *= sy;
  59. // Start angle
  60. data[i++] += angle;
  61. // end angle
  62. data[i++] += angle;
  63. // FIXME psi
  64. i += 2;
  65. j = i;
  66. break;
  67. case R:
  68. // x0, y0
  69. p[0] = data[i++];
  70. p[1] = data[i++];
  71. v2ApplyTransform(p, p, m);
  72. data[j++] = p[0];
  73. data[j++] = p[1];
  74. // x1, y1
  75. p[0] += data[i++];
  76. p[1] += data[i++];
  77. v2ApplyTransform(p, p, m);
  78. data[j++] = p[0];
  79. data[j++] = p[1];
  80. }
  81. for (k = 0; k < nPoint; k++) {
  82. let p = points[k];
  83. p[0] = data[i++];
  84. p[1] = data[i++];
  85. v2ApplyTransform(p, p, m);
  86. // Write back
  87. data[j++] = p[0];
  88. data[j++] = p[1];
  89. }
  90. }
  91. path.increaseVersion();
  92. }