You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
471 lines
13 KiB
471 lines
13 KiB
/* |
|
Copyright (c) 2004-2006, The Dojo Foundation |
|
All Rights Reserved. |
|
|
|
Licensed under the Academic Free License version 2.1 or above OR the |
|
modified BSD license. For more information on Dojo licensing, see: |
|
|
|
http://dojotoolkit.org/community/licensing.shtml |
|
*/ |
|
|
|
|
|
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";
|
|
|