Blame | Last modification | View Log | RSS feed
dojo.require("dojox.gfx.svg");dojo.experimental("dojox.gfx.svg_attach");(function(){dojox.gfx.attachNode = function(node){// summary: creates a shape from a Node// node: Node: an SVG nodeif(!node) return null;var s = null;switch(node.tagName.toLowerCase()){case dojox.gfx.Rect.nodeType:s = new dojox.gfx.Rect(node);attachRect(s);break;case dojox.gfx.Ellipse.nodeType:s = new dojox.gfx.Ellipse(node);attachShape(s, dojox.gfx.defaultEllipse);break;case dojox.gfx.Polyline.nodeType:s = new dojox.gfx.Polyline(node);attachShape(s, dojox.gfx.defaultPolyline);break;case dojox.gfx.Path.nodeType:s = new dojox.gfx.Path(node);attachShape(s, dojox.gfx.defaultPath);break;case dojox.gfx.Circle.nodeType:s = new dojox.gfx.Circle(node);attachShape(s, dojox.gfx.defaultCircle);break;case dojox.gfx.Line.nodeType:s = new dojox.gfx.Line(node);attachShape(s, dojox.gfx.defaultLine);break;case dojox.gfx.Image.nodeType:s = new dojox.gfx.Image(node);attachShape(s, dojox.gfx.defaultImage);break;case dojox.gfx.Text.nodeType:var t = node.getElementsByTagName("textPath");if(t && t.length){s = new dojox.gfx.TextPath(node);attachShape(s, dojox.gfx.defaultPath);attachTextPath(s);}else{s = new dojox.gfx.Text(node);attachText(s);}attachFont(s);break;default://console.debug("FATAL ERROR! tagName = " + node.tagName);return null;}if(!(s instanceof dojox.gfx.Image)){attachFill(s);attachStroke(s);}attachTransform(s);return s; // dojox.gfx.Shape};dojox.gfx.attachSurface = function(node){// summary: creates a surface from a Node// node: Node: an SVG nodevar s = new dojox.gfx.Surface();s.rawNode = node;var def_elems = node.getElementsByTagName("defs");if(def_elems.length == 0){return null; // dojox.gfx.Surface}s.defNode = def_elems[0];return s; // dojox.gfx.Surface};var attachFill = function(object){// summary: deduces a fill style from a node.// object: dojox.gfx.Shape: an SVG shapevar fill = object.rawNode.getAttribute("fill");if(fill == "none"){object.fillStyle = null;return;}var fillStyle = null, gradient = dojox.gfx.svg.getRef(fill);if(ref){switch(gradient.tagName.toLowerCase()){case "lineargradient":fillStyle = _getGradient(dojox.gfx.defaultLinearGradient, gradient);dojo.forEach(["x1", "y1", "x2", "y2"], function(x){fillStyle[x] = gradient.getAttribute(x);});break;case "radialgradient":fillStyle = _getGradient(dojox.gfx.defaultRadialGradient, gradient);dojo.forEach(["cx", "cy", "r"], function(x){fillStyle[x] = gradient.getAttribute(x);});fillStyle.cx = gradient.getAttribute("cx");fillStyle.cy = gradient.getAttribute("cy");fillStyle.r = gradient.getAttribute("r");break;case "pattern":fillStyle = dojo.lang.shallowCopy(dojox.gfx.defaultPattern, true);dojo.forEach(["x", "y", "width", "height"], function(x){fillStyle[x] = gradient.getAttribute(x);});fillStyle.src = gradient.firstChild.getAttributeNS(dojox.gfx.svg.xmlns.xlink, "href");break;}}else{fillStyle = new dojo.Color(fill);var opacity = rawNode.getAttribute("fill-opacity");if(opacity != null){ fillStyle.a = opacity; }}object.fillStyle = fillStyle;};var _getGradient = function(defaultGradient, gradient){var fillStyle = dojo.clone(defaultGradient);fillStyle.colors = [];for(var i = 0; i < gradient.childNodes.length; ++i){fillStyle.colors.push({offset: gradient.childNodes[i].getAttribute("offset"),color: new dojo.Color(gradient.childNodes[i].getAttribute("stop-color"))});}return fillStyle;};var attachStroke = function(object){// summary: deduces a stroke style from a node.// object: dojox.gfx.Shape: an SVG shapevar rawNode = object.rawNode, stroke = rawNode.getAttribute("stroke");if(stroke == null || stroke == "none"){object.strokeStyle = null;return;}var strokeStyle = object.strokeStyle = dojo.clone(dojox.gfx.defaultStroke);var color = new dojo.Color(stroke);if(color){strokeStyle.color = color;strokeStyle.color.a = rawNode.getAttribute("stroke-opacity");strokeStyle.width = rawNode.getAttribute("stroke-width");strokeStyle.cap = rawNode.getAttribute("stroke-linecap");strokeStyle.join = rawNode.getAttribute("stroke-linejoin");if(strokeStyle.join == "miter"){strokeStyle.join = rawNode.getAttribute("stroke-miterlimit");}strokeStyle.style = rawNode.getAttribute("dojoGfxStrokeStyle");}};var attachTransform = function(object){// summary: deduces a transformation matrix from a node.// object: dojox.gfx.Shape: an SVG shapevar matrix = object.rawNode.getAttribute("transform");if(matrix.match(/^matrix\(.+\)$/)){var t = matrix.slice(7, -1).split(",");object.matrix = dojox.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])});}else{object.matrix = null;}};var attachFont = function(object){// summary: deduces a font style from a Node.// object: dojox.gfx.Shape: an SVG shapevar fontStyle = object.fontStyle = dojo.clone(dojox.gfx.defaultFont),r = object.rawNode;fontStyle.style = r.getAttribute("font-style");fontStyle.variant = r.getAttribute("font-variant");fontStyle.weight = r.getAttribute("font-weight");fontStyle.size = r.getAttribute("font-size");fontStyle.family = r.getAttribute("font-family");};var attachShape = function(object, def){// summary: builds a shape from a node.// object: dojox.gfx.Shape: an SVG shape// def: Object: a default shape templatevar shape = object.shape = dojo.clone(def), r = object.rawNode;for(var i in shape) {shape[i] = r.getAttribute(i);}};var attachRect = function(object){// summary: builds a rectangle shape from a node.// object: dojox.gfx.Shape: an SVG shapeattachShape(object, dojox.gfx.defaultRect);object.shape.r = Math.min(object.rawNode.getAttribute("rx"), object.rawNode.getAttribute("ry"));};var attachText = function(object){// summary: builds a text shape from a node.// object: dojox.gfx.Shape: an SVG shapevar shape = object.shape = dojo.clone(dojox.gfx.defaultText),r = object.rawNode;shape.x = r.getAttribute("x");shape.y = r.getAttribute("y");shape.align = r.getAttribute("text-anchor");shape.decoration = r.getAttribute("text-decoration");shape.rotated = parseFloat(r.getAttribute("rotate")) != 0;shape.kerning = r.getAttribute("kerning") == "auto";shape.text = r.firstChild.nodeValue;};var attachTextPath = function(object){// summary: builds a textpath shape from a node.// object: dojox.gfx.Shape: an SVG shapevar shape = object.shape = dojo.clone(dojox.gfx.defaultTextPath),r = object.rawNode;shape.align = r.getAttribute("text-anchor");shape.decoration = r.getAttribute("text-decoration");shape.rotated = parseFloat(r.getAttribute("rotate")) != 0;shape.kerning = r.getAttribute("kerning") == "auto";shape.text = r.firstChild.nodeValue;};})();