123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234 |
- 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 node
- if (!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 node
- var 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 shape
- var 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 shape
- var 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 shape
- var 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 shape
- var 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 template
- var 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 shape
- attachShape(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 shape
- var 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 shape
- var 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;
- };
- })();
|