blob: 3e0e145761cc7d5aafe1bcdc06b677cfb2fcc036 [file] [log] [blame]
dojo.provide("dojo.gfx.matrix");
dojo.require("dojo.lang.common");
dojo.require("dojo.math.*");
dojo.gfx.matrix.Matrix2D=function(_1){
if(_1){
if(_1 instanceof Array){
if(_1.length>0){
var m=dojo.gfx.matrix.normalize(_1[0]);
for(var i=1;i<_1.length;++i){
var l=m;
var r=dojo.gfx.matrix.normalize(_1[i]);
m=new dojo.gfx.matrix.Matrix2D();
m.xx=l.xx*r.xx+l.xy*r.yx;
m.xy=l.xx*r.xy+l.xy*r.yy;
m.yx=l.yx*r.xx+l.yy*r.yx;
m.yy=l.yx*r.xy+l.yy*r.yy;
m.dx=l.xx*r.dx+l.xy*r.dy+l.dx;
m.dy=l.yx*r.dx+l.yy*r.dy+l.dy;
}
dojo.mixin(this,m);
}
}else{
dojo.mixin(this,_1);
}
}
};
dojo.extend(dojo.gfx.matrix.Matrix2D,{xx:1,xy:0,yx:0,yy:1,dx:0,dy:0});
dojo.mixin(dojo.gfx.matrix,{identity:new dojo.gfx.matrix.Matrix2D(),flipX:new dojo.gfx.matrix.Matrix2D({xx:-1}),flipY:new dojo.gfx.matrix.Matrix2D({yy:-1}),flipXY:new dojo.gfx.matrix.Matrix2D({xx:-1,yy:-1}),translate:function(a,b){
if(arguments.length>1){
return new dojo.gfx.matrix.Matrix2D({dx:a,dy:b});
}
return new dojo.gfx.matrix.Matrix2D({dx:a.x,dy:a.y});
},scale:function(a,b){
if(arguments.length>1){
return new dojo.gfx.matrix.Matrix2D({xx:a,yy:b});
}
if(typeof a=="number"){
return new dojo.gfx.matrix.Matrix2D({xx:a,yy:a});
}
return new dojo.gfx.matrix.Matrix2D({xx:a.x,yy:a.y});
},rotate:function(_a){
var c=Math.cos(_a);
var s=Math.sin(_a);
return new dojo.gfx.matrix.Matrix2D({xx:c,xy:s,yx:-s,yy:c});
},rotateg:function(_d){
return dojo.gfx.matrix.rotate(dojo.math.degToRad(_d));
},skewX:function(_e){
return new dojo.gfx.matrix.Matrix2D({xy:Math.tan(_e)});
},skewXg:function(_f){
return dojo.gfx.matrix.skewX(dojo.math.degToRad(_f));
},skewY:function(_10){
return new dojo.gfx.matrix.Matrix2D({yx:-Math.tan(_10)});
},skewYg:function(_11){
return dojo.gfx.matrix.skewY(dojo.math.degToRad(_11));
},normalize:function(_12){
return (_12 instanceof dojo.gfx.matrix.Matrix2D)?_12:new dojo.gfx.matrix.Matrix2D(_12);
},clone:function(_13){
var obj=new dojo.gfx.matrix.Matrix2D();
for(var i in _13){
if(typeof (_13[i])=="number"&&typeof (obj[i])=="number"&&obj[i]!=_13[i]){
obj[i]=_13[i];
}
}
return obj;
},invert:function(_16){
var m=dojo.gfx.matrix.normalize(_16);
var D=m.xx*m.yy-m.xy*m.yx;
var M=new dojo.gfx.matrix.Matrix2D({xx:m.yy/D,xy:-m.xy/D,yx:-m.yx/D,yy:m.xx/D,dx:(m.yx*m.dy-m.yy*m.dx)/D,dy:(m.xy*m.dx-m.xx*m.dy)/D});
return M;
},_multiplyPoint:function(m,x,y){
return {x:m.xx*x+m.xy*y+m.dx,y:m.yx*x+m.yy*y+m.dy};
},multiplyPoint:function(_1d,a,b){
var m=dojo.gfx.matrix.normalize(_1d);
if(typeof a=="number"&&typeof b=="number"){
return dojo.gfx.matrix._multiplyPoint(m,a,b);
}
return dojo.gfx.matrix._multiplyPoint(m,a.x,a.y);
},multiply:function(_21){
var m=dojo.gfx.matrix.normalize(_21);
for(var i=1;i<arguments.length;++i){
var l=m;
var r=dojo.gfx.matrix.normalize(arguments[i]);
m=new dojo.gfx.matrix.Matrix2D();
m.xx=l.xx*r.xx+l.xy*r.yx;
m.xy=l.xx*r.xy+l.xy*r.yy;
m.yx=l.yx*r.xx+l.yy*r.yx;
m.yy=l.yx*r.xy+l.yy*r.yy;
m.dx=l.xx*r.dx+l.xy*r.dy+l.dx;
m.dy=l.yx*r.dx+l.yy*r.dy+l.dy;
}
return m;
},_sandwich:function(m,x,y){
return dojo.gfx.matrix.multiply(dojo.gfx.matrix.translate(x,y),m,dojo.gfx.matrix.translate(-x,-y));
},scaleAt:function(a,b,c,d){
switch(arguments.length){
case 4:
return dojo.gfx.matrix._sandwich(dojo.gfx.matrix.scale(a,b),c,d);
case 3:
if(typeof c=="number"){
return dojo.gfx.matrix._sandwich(dojo.gfx.matrix.scale(a),b,c);
}
return dojo.gfx.matrix._sandwich(dojo.gfx.matrix.scale(a,b),c.x,c.y);
}
return dojo.gfx.matrix._sandwich(dojo.gfx.matrix.scale(a),b.x,b.y);
},rotateAt:function(_2d,a,b){
if(arguments.length>2){
return dojo.gfx.matrix._sandwich(dojo.gfx.matrix.rotate(_2d),a,b);
}
return dojo.gfx.matrix._sandwich(dojo.gfx.matrix.rotate(_2d),a.x,a.y);
},rotategAt:function(_30,a,b){
if(arguments.length>2){
return dojo.gfx.matrix._sandwich(dojo.gfx.matrix.rotateg(_30),a,b);
}
return dojo.gfx.matrix._sandwich(dojo.gfx.matrix.rotateg(_30),a.x,a.y);
},skewXAt:function(_33,a,b){
if(arguments.length>2){
return dojo.gfx.matrix._sandwich(dojo.gfx.matrix.skewX(_33),a,b);
}
return dojo.gfx.matrix._sandwich(dojo.gfx.matrix.skewX(_33),a.x,a.y);
},skewXgAt:function(_36,a,b){
if(arguments.length>2){
return dojo.gfx.matrix._sandwich(dojo.gfx.matrix.skewXg(_36),a,b);
}
return dojo.gfx.matrix._sandwich(dojo.gfx.matrix.skewXg(_36),a.x,a.y);
},skewYAt:function(_39,a,b){
if(arguments.length>2){
return dojo.gfx.matrix._sandwich(dojo.gfx.matrix.skewY(_39),a,b);
}
return dojo.gfx.matrix._sandwich(dojo.gfx.matrix.skewY(_39),a.x,a.y);
},skewYgAt:function(_3c,a,b){
if(arguments.length>2){
return dojo.gfx.matrix._sandwich(dojo.gfx.matrix.skewYg(_3c),a,b);
}
return dojo.gfx.matrix._sandwich(dojo.gfx.matrix.skewYg(_3c),a.x,a.y);
}});