text: var PathProxy = require("../core/PathProxy");
  
  var _vector = require("../core/vector");
  
  var v2ApplyTransform = _vector.applyTransform;
  var CMD = PathProxy.CMD;
  var points = [[], [], []];
  var mathSqrt = Math.sqrt;
  var mathAtan2 = Math.atan2;
  
  function _default(path, m) {
    var data = path.data;
    var cmd;
    var nPoint;
    var i;
    var j;
    var k;
    var p;
    var M = CMD.M;
    var C = CMD.C;
    var L = CMD.L;
    var R = CMD.R;
    var A = CMD.A;
    var Q = CMD.Q;
  
    for (i = 0, j = 0; i < data.length;) {
      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:
          var x = m[4];
          var y = m[5];
          var sx = mathSqrt(m[0] * m[0] + m[1] * m[1]);
          var sy = mathSqrt(m[2] * m[2] + m[3] * m[3]);
          var 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++) {
        var 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];
      }
    }
  }
  
  module.exports = _default;