blob: 1361df8585f42fda5cd4f324c430c77d4b659786 [file] [log] [blame]
dojo.provide("dojo.gfx.svg");
dojo.require("dojo.lang.declare");
dojo.require("dojo.svg");
dojo.require("dojo.gfx.color");
dojo.require("dojo.gfx.common");
dojo.require("dojo.gfx.shape");
dojo.require("dojo.gfx.path");
dojo.require("dojo.experimental");
dojo.experimental("dojo.gfx.svg");
dojo.gfx.svg.getRef=function(_1){
if(!_1||_1=="none"){
return null;
}
if(_1.match(/^url\(#.+\)$/)){
return dojo.byId(_1.slice(5,-1));
}
if(dojo.render.html.opera&&_1.match(/^#dj_unique_.+$/)){
return dojo.byId(_1.slice(1));
}
return null;
};
dojo.lang.extend(dojo.gfx.Shape,{setFill:function(_2){
if(!_2){
this.fillStyle=null;
this.rawNode.setAttribute("fill","none");
this.rawNode.setAttribute("fill-opacity",0);
return this;
}
if(typeof (_2)=="object"&&"type" in _2){
switch(_2.type){
case "linear":
var f=dojo.gfx.makeParameters(dojo.gfx.defaultLinearGradient,_2);
var _4=this._setFillObject(f,"linearGradient");
dojo.lang.forEach(["x1","y1","x2","y2"],function(x){
_4.setAttribute(x,f[x].toFixed(8));
});
break;
case "radial":
var f=dojo.gfx.makeParameters(dojo.gfx.defaultRadialGradient,_2);
var _4=this._setFillObject(f,"radialGradient");
dojo.lang.forEach(["cx","cy","r"],function(x){
_4.setAttribute(x,f[x].toFixed(8));
});
break;
case "pattern":
var f=dojo.gfx.makeParameters(dojo.gfx.defaultPattern,_2);
var _7=this._setFillObject(f,"pattern");
dojo.lang.forEach(["x","y","width","height"],function(x){
_7.setAttribute(x,f[x].toFixed(8));
});
break;
}
return this;
}
var f=dojo.gfx.normalizeColor(_2);
this.fillStyle=f;
this.rawNode.setAttribute("fill",f.toCss());
this.rawNode.setAttribute("fill-opacity",f.a);
return this;
},setStroke:function(_9){
if(!_9){
this.strokeStyle=null;
this.rawNode.setAttribute("stroke","none");
this.rawNode.setAttribute("stroke-opacity",0);
return this;
}
this.strokeStyle=dojo.gfx.makeParameters(dojo.gfx.defaultStroke,_9);
this.strokeStyle.color=dojo.gfx.normalizeColor(this.strokeStyle.color);
var s=this.strokeStyle;
var rn=this.rawNode;
if(s){
rn.setAttribute("stroke",s.color.toCss());
rn.setAttribute("stroke-opacity",s.color.a);
rn.setAttribute("stroke-width",s.width);
rn.setAttribute("stroke-linecap",s.cap);
if(typeof (s.join)=="number"){
rn.setAttribute("stroke-linejoin","miter");
rn.setAttribute("stroke-miterlimit",s.join);
}else{
rn.setAttribute("stroke-linejoin",s.join);
}
}
return this;
},_setFillObject:function(f,_d){
var _e=this.rawNode.parentNode.getElementsByTagName("defs");
if(_e.length==0){
return this;
}
this.fillStyle=f;
var _f=_e[0];
var _10=this.rawNode.getAttribute("fill");
var ref=dojo.gfx.svg.getRef(_10);
if(ref){
_10=ref;
if(_10.tagName.toLowerCase()!=_d.toLowerCase()){
var id=_10.id;
_10.parentNode.removeChild(_10);
_10=document.createElementNS(dojo.svg.xmlns.svg,_d);
_10.setAttribute("id",id);
_f.appendChild(_10);
}else{
while(_10.childNodes.length){
_10.removeChild(_10.lastChild);
}
}
}else{
_10=document.createElementNS(dojo.svg.xmlns.svg,_d);
_10.setAttribute("id",dojo.dom.getUniqueId());
_f.appendChild(_10);
}
if(_d=="pattern"){
_10.setAttribute("patternUnits","userSpaceOnUse");
var img=document.createElementNS(dojo.svg.xmlns.svg,"image");
img.setAttribute("x",0);
img.setAttribute("y",0);
img.setAttribute("width",f.width.toFixed(8));
img.setAttribute("height",f.height.toFixed(8));
img.setAttributeNS(dojo.svg.xmlns.xlink,"href",f.src);
_10.appendChild(img);
}else{
_10.setAttribute("gradientUnits","userSpaceOnUse");
for(var i=0;i<f.colors.length;++i){
f.colors[i].color=dojo.gfx.normalizeColor(f.colors[i].color);
var t=document.createElementNS(dojo.svg.xmlns.svg,"stop");
t.setAttribute("offset",f.colors[i].offset.toFixed(8));
t.setAttribute("stop-color",f.colors[i].color.toCss());
_10.appendChild(t);
}
}
this.rawNode.setAttribute("fill","url(#"+_10.getAttribute("id")+")");
this.rawNode.removeAttribute("fill-opacity");
return _10;
},_applyTransform:function(){
var _16=this._getRealMatrix();
if(_16){
var tm=this.matrix;
this.rawNode.setAttribute("transform","matrix("+tm.xx.toFixed(8)+","+tm.yx.toFixed(8)+","+tm.xy.toFixed(8)+","+tm.yy.toFixed(8)+","+tm.dx.toFixed(8)+","+tm.dy.toFixed(8)+")");
}else{
this.rawNode.removeAttribute("transform");
}
return this;
},setRawNode:function(_18){
with(_18){
setAttribute("fill","none");
setAttribute("fill-opacity",0);
setAttribute("stroke","none");
setAttribute("stroke-opacity",0);
setAttribute("stroke-width",1);
setAttribute("stroke-linecap","butt");
setAttribute("stroke-linejoin","miter");
setAttribute("stroke-miterlimit",4);
}
this.rawNode=_18;
},moveToFront:function(){
this.rawNode.parentNode.appendChild(this.rawNode);
return this;
},moveToBack:function(){
this.rawNode.parentNode.insertBefore(this.rawNode,this.rawNode.parentNode.firstChild);
return this;
},setShape:function(_19){
this.shape=dojo.gfx.makeParameters(this.shape,_19);
for(var i in this.shape){
if(i!="type"){
this.rawNode.setAttribute(i,this.shape[i]);
}
}
return this;
},attachFill:function(_1b){
var _1c=null;
if(_1b){
var _1d=_1b.getAttribute("fill");
if(_1d=="none"){
return;
}
var ref=dojo.gfx.svg.getRef(_1d);
if(ref){
var _1f=ref;
switch(_1f.tagName.toLowerCase()){
case "lineargradient":
_1c=this._getGradient(dojo.gfx.defaultLinearGradient,_1f);
dojo.lang.forEach(["x1","y1","x2","y2"],function(x){
_1c[x]=_1f.getAttribute(x);
});
break;
case "radialgradient":
_1c=this._getGradient(dojo.gfx.defaultRadialGradient,_1f);
dojo.lang.forEach(["cx","cy","r"],function(x){
_1c[x]=_1f.getAttribute(x);
});
_1c.cx=_1f.getAttribute("cx");
_1c.cy=_1f.getAttribute("cy");
_1c.r=_1f.getAttribute("r");
break;
case "pattern":
_1c=dojo.lang.shallowCopy(dojo.gfx.defaultPattern,true);
dojo.lang.forEach(["x","y","width","height"],function(x){
_1c[x]=_1f.getAttribute(x);
});
_1c.src=_1f.firstChild.getAttributeNS(dojo.svg.xmlns.xlink,"href");
break;
}
}else{
_1c=new dojo.gfx.color.Color(_1d);
var _23=_1b.getAttribute("fill-opacity");
if(_23!=null){
_1c.a=_23;
}
}
}
return _1c;
},_getGradient:function(_24,_25){
var _26=dojo.lang.shallowCopy(_24,true);
_26.colors=[];
for(var i=0;i<_25.childNodes.length;++i){
_26.colors.push({offset:_25.childNodes[i].getAttribute("offset"),color:new dojo.gfx.color.Color(_25.childNodes[i].getAttribute("stop-color"))});
}
return _26;
},attachStroke:function(_28){
if(!_28){
return;
}
var _29=_28.getAttribute("stroke");
if(_29==null||_29=="none"){
return null;
}
var _2a=dojo.lang.shallowCopy(dojo.gfx.defaultStroke,true);
var _2b=new dojo.gfx.color.Color(_29);
if(_2b){
_2a.color=_2b;
_2a.color.a=_28.getAttribute("stroke-opacity");
_2a.width=_28.getAttribute("stroke-width");
_2a.cap=_28.getAttribute("stroke-linecap");
_2a.join=_28.getAttribute("stroke-linejoin");
if(_2a.join=="miter"){
_2a.join=_28.getAttribute("stroke-miterlimit");
}
}
return _2a;
},attachTransform:function(_2c){
var _2d=null;
if(_2c){
_2d=_2c.getAttribute("transform");
if(_2d.match(/^matrix\(.+\)$/)){
var t=_2d.slice(7,-1).split(",");
_2d=dojo.gfx.matrix.normalize({xx:parseFloat(t[0]),xy:parseFloat(t[2]),yx:parseFloat(t[1]),yy:parseFloat(t[3]),dx:parseFloat(t[4]),dy:parseFloat(t[5])});
}
}
return _2d;
},attachShape:function(_2f){
var _30=null;
if(_2f){
_30=dojo.lang.shallowCopy(this.shape,true);
for(var i in _30){
_30[i]=_2f.getAttribute(i);
}
}
return _30;
},attach:function(_32){
if(_32){
this.rawNode=_32;
this.fillStyle=this.attachFill(_32);
this.strokeStyle=this.attachStroke(_32);
this.matrix=this.attachTransform(_32);
this.shape=this.attachShape(_32);
}
}});
dojo.declare("dojo.gfx.Group",dojo.gfx.Shape,{setRawNode:function(_33){
this.rawNode=_33;
}});
dojo.gfx.Group.nodeType="g";
dojo.declare("dojo.gfx.Rect",dojo.gfx.shape.Rect,{attachShape:function(_34){
var _35=null;
if(_34){
_35=dojo.gfx.Rect.superclass.attachShape.apply(this,arguments);
_35.r=Math.min(_34.getAttribute("rx"),_34.getAttribute("ry"));
}
return _35;
},setShape:function(_36){
this.shape=dojo.gfx.makeParameters(this.shape,_36);
this.bbox=null;
for(var i in this.shape){
if(i!="type"&&i!="r"){
this.rawNode.setAttribute(i,this.shape[i]);
}
}
this.rawNode.setAttribute("rx",this.shape.r);
this.rawNode.setAttribute("ry",this.shape.r);
return this;
}});
dojo.gfx.Rect.nodeType="rect";
dojo.gfx.Ellipse=dojo.gfx.shape.Ellipse;
dojo.gfx.Ellipse.nodeType="ellipse";
dojo.gfx.Circle=dojo.gfx.shape.Circle;
dojo.gfx.Circle.nodeType="circle";
dojo.gfx.Line=dojo.gfx.shape.Line;
dojo.gfx.Line.nodeType="line";
dojo.declare("dojo.gfx.Polyline",dojo.gfx.shape.Polyline,{setShape:function(_38){
if(_38&&_38 instanceof Array){
this.shape=dojo.gfx.makeParameters(this.shape,{points:_38});
if(closed&&this.shape.points.length){
this.shape.points.push(this.shape.points[0]);
}
}else{
this.shape=dojo.gfx.makeParameters(this.shape,_38);
}
this.box=null;
var _39=[];
var p=this.shape.points;
for(var i=0;i<p.length;++i){
_39.push(p[i].x.toFixed(8));
_39.push(p[i].y.toFixed(8));
}
this.rawNode.setAttribute("points",_39.join(" "));
return this;
}});
dojo.gfx.Polyline.nodeType="polyline";
dojo.declare("dojo.gfx.Image",dojo.gfx.shape.Image,{setShape:function(_3c){
this.shape=dojo.gfx.makeParameters(this.shape,_3c);
this.bbox=null;
var _3d=this.rawNode;
for(var i in this.shape){
if(i!="type"&&i!="src"){
_3d.setAttribute(i,this.shape[i]);
}
}
_3d.setAttributeNS(dojo.svg.xmlns.xlink,"href",this.shape.src);
return this;
},setStroke:function(){
return this;
},setFill:function(){
return this;
},attachStroke:function(_3f){
return null;
},attachFill:function(_40){
return null;
}});
dojo.gfx.Image.nodeType="image";
dojo.declare("dojo.gfx.Path",dojo.gfx.path.Path,{_updateWithSegment:function(_41){
dojo.gfx.Path.superclass._updateWithSegment.apply(this,arguments);
if(typeof (this.shape.path)=="string"){
this.rawNode.setAttribute("d",this.shape.path);
}
},setShape:function(_42){
dojo.gfx.Path.superclass.setShape.apply(this,arguments);
this.rawNode.setAttribute("d",this.shape.path);
return this;
}});
dojo.gfx.Path.nodeType="path";
dojo.gfx._creators={createPath:function(_43){
return this.createObject(dojo.gfx.Path,_43);
},createRect:function(_44){
return this.createObject(dojo.gfx.Rect,_44);
},createCircle:function(_45){
return this.createObject(dojo.gfx.Circle,_45);
},createEllipse:function(_46){
return this.createObject(dojo.gfx.Ellipse,_46);
},createLine:function(_47){
return this.createObject(dojo.gfx.Line,_47);
},createPolyline:function(_48){
return this.createObject(dojo.gfx.Polyline,_48);
},createImage:function(_49){
return this.createObject(dojo.gfx.Image,_49);
},createGroup:function(){
return this.createObject(dojo.gfx.Group);
},createObject:function(_4a,_4b){
if(!this.rawNode){
return null;
}
var _4c=new _4a();
var _4d=document.createElementNS(dojo.svg.xmlns.svg,_4a.nodeType);
_4c.setRawNode(_4d);
this.rawNode.appendChild(_4d);
_4c.setShape(_4b);
this.add(_4c);
return _4c;
},add:function(_4e){
var _4f=_4e.getParent();
if(_4f){
_4f.remove(_4e,true);
}
_4e._setParent(this,null);
this.rawNode.appendChild(_4e.rawNode);
return this;
},remove:function(_50,_51){
if(this.rawNode==_50.rawNode.parentNode){
this.rawNode.removeChild(_50.rawNode);
}
_50._setParent(null,null);
return this;
}};
dojo.gfx.attachNode=function(_52){
if(!_52){
return null;
}
var s=null;
switch(_52.tagName.toLowerCase()){
case dojo.gfx.Rect.nodeType:
s=new dojo.gfx.Rect();
break;
case dojo.gfx.Ellipse.nodeType:
s=new dojo.gfx.Ellipse();
break;
case dojo.gfx.Polyline.nodeType:
s=new dojo.gfx.Polyline();
break;
case dojo.gfx.Path.nodeType:
s=new dojo.gfx.Path();
break;
case dojo.gfx.Circle.nodeType:
s=new dojo.gfx.Circle();
break;
case dojo.gfx.Line.nodeType:
s=new dojo.gfx.Line();
break;
case dojo.gfx.Image.nodeType:
s=new dojo.gfx.Image();
break;
default:
dojo.debug("FATAL ERROR! tagName = "+_52.tagName);
}
s.attach(_52);
return s;
};
dojo.lang.extend(dojo.gfx.Surface,{setDimensions:function(_54,_55){
if(!this.rawNode){
return this;
}
this.rawNode.setAttribute("width",_54);
this.rawNode.setAttribute("height",_55);
return this;
},getDimensions:function(){
return this.rawNode?{width:this.rawNode.getAttribute("width"),height:this.rawNode.getAttribute("height")}:null;
}});
dojo.gfx.createSurface=function(_56,_57,_58){
var s=new dojo.gfx.Surface();
s.rawNode=document.createElementNS(dojo.svg.xmlns.svg,"svg");
s.rawNode.setAttribute("width",_57);
s.rawNode.setAttribute("height",_58);
var _5a=new dojo.gfx.svg.Defines();
var _5b=document.createElementNS(dojo.svg.xmlns.svg,dojo.gfx.svg.Defines.nodeType);
_5a.setRawNode(_5b);
s.rawNode.appendChild(_5b);
dojo.byId(_56).appendChild(s.rawNode);
return s;
};
dojo.gfx.attachSurface=function(_5c){
var s=new dojo.gfx.Surface();
s.rawNode=_5c;
return s;
};
dojo.lang.extend(dojo.gfx.Group,dojo.gfx._creators);
dojo.lang.extend(dojo.gfx.Surface,dojo.gfx._creators);
delete dojo.gfx._creators;
dojo.gfx.svg.Defines=function(){
this.rawNode=null;
};
dojo.lang.extend(dojo.gfx.svg.Defines,{setRawNode:function(_5e){
this.rawNode=_5e;
}});
dojo.gfx.svg.Defines.nodeType="defs";