|
|
|
|
@ -797,6 +797,33 @@ if (!document.createElement('canvas').getContext) {
|
|
|
|
|
this.m_ = this.mStack_.pop();
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
function matrixIsFinite(m) {
|
|
|
|
|
for (var j = 0; j < 3; j++) {
|
|
|
|
|
for (var k = 0; k < 2; k++) {
|
|
|
|
|
if (!isFinite(m[j][k]) || isNaN(m[j][k])) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function setM(ctx, m, updateLineScale) {
|
|
|
|
|
if (!matrixIsFinite(m)) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
ctx.m_ = m;
|
|
|
|
|
|
|
|
|
|
if (updateLineScale) {
|
|
|
|
|
// Get the line scale.
|
|
|
|
|
// Determinant of this.m_ means how much the area is enlarged by the
|
|
|
|
|
// transformation. So its square root can be used as a scale factor
|
|
|
|
|
// for width.
|
|
|
|
|
var det = m[0][0] * m[1][1] - m[0][1] * m[1][0];
|
|
|
|
|
ctx.lineScale_ = sqrt(abs(det));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
contextPrototype.translate = function(aX, aY) {
|
|
|
|
|
var m1 = [
|
|
|
|
|
[1, 0, 0],
|
|
|
|
|
@ -804,7 +831,7 @@ if (!document.createElement('canvas').getContext) {
|
|
|
|
|
[aX, aY, 1]
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
this.m_ = matrixMultiply(m1, this.m_);
|
|
|
|
|
setM(this, matrixMultiply(m1, this.m_), false);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
contextPrototype.rotate = function(aRot) {
|
|
|
|
|
@ -817,7 +844,7 @@ if (!document.createElement('canvas').getContext) {
|
|
|
|
|
[0, 0, 1]
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
this.m_ = matrixMultiply(m1, this.m_);
|
|
|
|
|
setM(this, matrixMultiply(m1, this.m_), false);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
contextPrototype.scale = function(aX, aY) {
|
|
|
|
|
@ -829,14 +856,27 @@ if (!document.createElement('canvas').getContext) {
|
|
|
|
|
[0, 0, 1]
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
var m = this.m_ = matrixMultiply(m1, this.m_);
|
|
|
|
|
setM(this, matrixMultiply(m1, this.m_), true);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
contextPrototype.transform = function(m11, m12, m21, m22, dx, dy) {
|
|
|
|
|
var m1 = [
|
|
|
|
|
[m11, m12, 0],
|
|
|
|
|
[m21, m22, 0],
|
|
|
|
|
[dx, dy, 1]
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
setM(this, matrixMultiply(m1, this.m_), true);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
contextPrototype.setTransform = function(m11, m12, m21, m22, dx, dy) {
|
|
|
|
|
var m = [
|
|
|
|
|
[m11, m12, 0],
|
|
|
|
|
[m21, m22, 0],
|
|
|
|
|
[dx, dy, 1]
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
// Get the line scale.
|
|
|
|
|
// Determinant of this.m_ means how much the area is enlarged by the
|
|
|
|
|
// transformation. So its square root can be used as a scale factor
|
|
|
|
|
// for width.
|
|
|
|
|
var det = m[0][0] * m[1][1] - m[0][1] * m[1][0];
|
|
|
|
|
this.lineScale_ = sqrt(abs(det));
|
|
|
|
|
setM(this, m, true);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/******** STUBS ********/
|
|
|
|
|
|