var save = ctx.save; ctx.save = function () { savedTransforms.push(xform.translate(0, 0)); return save.call(ctx); }; xform = xform.scaleNonUniform(sx, sy); return scale.call(ctx, sx, sy); }; var rotate = ctx.rotate; ctx.rotate = function (radians) { xform = xform.rotate(radians * 180 / Math.PI); return rotate.call(ctx, radians); }; var translate = ctx.translate; ctx.translate = function (dx, dy) { xform = xform.translate(dx, dy); return translate.call(ctx, dx, dy); }; m2.e = e; m2.f = f; xform = xform.multiply(m2); return transform.call(ctx, a, b, c, d, e, f); }; pt.x = x; pt.y = y; return pt.matrixTransform(xform.inverse());