svg.js
上传用户:kimgenplus
上传日期:2016-06-05
资源大小:20877k
文件大小:15k
源码类别:

OA系统

开发平台:

Java

  1. /*
  2. Copyright (c) 2004-2006, The Dojo Foundation
  3. All Rights Reserved.
  4. Licensed under the Academic Free License version 2.1 or above OR the
  5. modified BSD license. For more information on Dojo licensing, see:
  6. http://dojotoolkit.org/community/licensing.shtml
  7. */
  8. dojo.provide("dojo.gfx.svg");
  9. dojo.require("dojo.lang.declare");
  10. dojo.require("dojo.svg");
  11. dojo.require("dojo.gfx.color");
  12. dojo.require("dojo.gfx.common");
  13. dojo.require("dojo.gfx.shape");
  14. dojo.require("dojo.gfx.path");
  15. dojo.require("dojo.experimental");
  16. dojo.experimental("dojo.gfx.svg");
  17. dojo.gfx.svg.getRef = function (fill) {
  18. if (!fill || fill == "none") {
  19. return null;
  20. }
  21. if (fill.match(/^url(#.+)$/)) {
  22. return dojo.byId(fill.slice(5, -1));
  23. }
  24. if (dojo.render.html.opera && fill.match(/^#dj_unique_.+$/)) {
  25. return dojo.byId(fill.slice(1));
  26. }
  27. return null;
  28. };
  29. dojo.lang.extend(dojo.gfx.Shape, {setFill:function (fill) {
  30. if (!fill) {
  31. this.fillStyle = null;
  32. this.rawNode.setAttribute("fill", "none");
  33. this.rawNode.setAttribute("fill-opacity", 0);
  34. return this;
  35. }
  36. if (typeof (fill) == "object" && "type" in fill) {
  37. switch (fill.type) {
  38.   case "linear":
  39. var f = dojo.gfx.makeParameters(dojo.gfx.defaultLinearGradient, fill);
  40. var gradient = this._setFillObject(f, "linearGradient");
  41. dojo.lang.forEach(["x1", "y1", "x2", "y2"], function (x) {
  42. gradient.setAttribute(x, f[x].toFixed(8));
  43. });
  44. break;
  45.   case "radial":
  46. var f = dojo.gfx.makeParameters(dojo.gfx.defaultRadialGradient, fill);
  47. var gradient = this._setFillObject(f, "radialGradient");
  48. dojo.lang.forEach(["cx", "cy", "r"], function (x) {
  49. gradient.setAttribute(x, f[x].toFixed(8));
  50. });
  51. break;
  52.   case "pattern":
  53. var f = dojo.gfx.makeParameters(dojo.gfx.defaultPattern, fill);
  54. var pattern = this._setFillObject(f, "pattern");
  55. dojo.lang.forEach(["x", "y", "width", "height"], function (x) {
  56. pattern.setAttribute(x, f[x].toFixed(8));
  57. });
  58. break;
  59. }
  60. return this;
  61. }
  62. var f = dojo.gfx.normalizeColor(fill);
  63. this.fillStyle = f;
  64. this.rawNode.setAttribute("fill", f.toCss());
  65. this.rawNode.setAttribute("fill-opacity", f.a);
  66. return this;
  67. }, setStroke:function (stroke) {
  68. if (!stroke) {
  69. this.strokeStyle = null;
  70. this.rawNode.setAttribute("stroke", "none");
  71. this.rawNode.setAttribute("stroke-opacity", 0);
  72. return this;
  73. }
  74. this.strokeStyle = dojo.gfx.makeParameters(dojo.gfx.defaultStroke, stroke);
  75. this.strokeStyle.color = dojo.gfx.normalizeColor(this.strokeStyle.color);
  76. var s = this.strokeStyle;
  77. var rn = this.rawNode;
  78. if (s) {
  79. rn.setAttribute("stroke", s.color.toCss());
  80. rn.setAttribute("stroke-opacity", s.color.a);
  81. rn.setAttribute("stroke-width", s.width);
  82. rn.setAttribute("stroke-linecap", s.cap);
  83. if (typeof (s.join) == "number") {
  84. rn.setAttribute("stroke-linejoin", "miter");
  85. rn.setAttribute("stroke-miterlimit", s.join);
  86. } else {
  87. rn.setAttribute("stroke-linejoin", s.join);
  88. }
  89. }
  90. return this;
  91. }, _setFillObject:function (f, nodeType) {
  92. var def_elems = this.rawNode.parentNode.getElementsByTagName("defs");
  93. if (def_elems.length == 0) {
  94. return this;
  95. }
  96. this.fillStyle = f;
  97. var defs = def_elems[0];
  98. var fill = this.rawNode.getAttribute("fill");
  99. var ref = dojo.gfx.svg.getRef(fill);
  100. if (ref) {
  101. fill = ref;
  102. if (fill.tagName.toLowerCase() != nodeType.toLowerCase()) {
  103. var id = fill.id;
  104. fill.parentNode.removeChild(fill);
  105. fill = document.createElementNS(dojo.svg.xmlns.svg, nodeType);
  106. fill.setAttribute("id", id);
  107. defs.appendChild(fill);
  108. } else {
  109. while (fill.childNodes.length) {
  110. fill.removeChild(fill.lastChild);
  111. }
  112. }
  113. } else {
  114. fill = document.createElementNS(dojo.svg.xmlns.svg, nodeType);
  115. fill.setAttribute("id", dojo.dom.getUniqueId());
  116. defs.appendChild(fill);
  117. }
  118. if (nodeType == "pattern") {
  119. fill.setAttribute("patternUnits", "userSpaceOnUse");
  120. var img = document.createElementNS(dojo.svg.xmlns.svg, "image");
  121. img.setAttribute("x", 0);
  122. img.setAttribute("y", 0);
  123. img.setAttribute("width", f.width.toFixed(8));
  124. img.setAttribute("height", f.height.toFixed(8));
  125. img.setAttributeNS(dojo.svg.xmlns.xlink, "href", f.src);
  126. fill.appendChild(img);
  127. } else {
  128. fill.setAttribute("gradientUnits", "userSpaceOnUse");
  129. for (var i = 0; i < f.colors.length; ++i) {
  130. f.colors[i].color = dojo.gfx.normalizeColor(f.colors[i].color);
  131. var t = document.createElementNS(dojo.svg.xmlns.svg, "stop");
  132. t.setAttribute("offset", f.colors[i].offset.toFixed(8));
  133. t.setAttribute("stop-color", f.colors[i].color.toCss());
  134. fill.appendChild(t);
  135. }
  136. }
  137. this.rawNode.setAttribute("fill", "url(#" + fill.getAttribute("id") + ")");
  138. this.rawNode.removeAttribute("fill-opacity");
  139. return fill;
  140. }, _applyTransform:function () {
  141. var matrix = this._getRealMatrix();
  142. if (matrix) {
  143. var tm = this.matrix;
  144. 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) + ")");
  145. } else {
  146. this.rawNode.removeAttribute("transform");
  147. }
  148. return this;
  149. }, setRawNode:function (rawNode) {
  150. with (rawNode) {
  151. setAttribute("fill", "none");
  152. setAttribute("fill-opacity", 0);
  153. setAttribute("stroke", "none");
  154. setAttribute("stroke-opacity", 0);
  155. setAttribute("stroke-width", 1);
  156. setAttribute("stroke-linecap", "butt");
  157. setAttribute("stroke-linejoin", "miter");
  158. setAttribute("stroke-miterlimit", 4);
  159. }
  160. this.rawNode = rawNode;
  161. }, moveToFront:function () {
  162. this.rawNode.parentNode.appendChild(this.rawNode);
  163. return this;
  164. }, moveToBack:function () {
  165. this.rawNode.parentNode.insertBefore(this.rawNode, this.rawNode.parentNode.firstChild);
  166. return this;
  167. }, setShape:function (newShape) {
  168. this.shape = dojo.gfx.makeParameters(this.shape, newShape);
  169. for (var i in this.shape) {
  170. if (i != "type") {
  171. this.rawNode.setAttribute(i, this.shape[i]);
  172. }
  173. }
  174. return this;
  175. }, attachFill:function (rawNode) {
  176. var fillStyle = null;
  177. if (rawNode) {
  178. var fill = rawNode.getAttribute("fill");
  179. if (fill == "none") {
  180. return;
  181. }
  182. var ref = dojo.gfx.svg.getRef(fill);
  183. if (ref) {
  184. var gradient = ref;
  185. switch (gradient.tagName.toLowerCase()) {
  186.   case "lineargradient":
  187. fillStyle = this._getGradient(dojo.gfx.defaultLinearGradient, gradient);
  188. dojo.lang.forEach(["x1", "y1", "x2", "y2"], function (x) {
  189. fillStyle[x] = gradient.getAttribute(x);
  190. });
  191. break;
  192.   case "radialgradient":
  193. fillStyle = this._getGradient(dojo.gfx.defaultRadialGradient, gradient);
  194. dojo.lang.forEach(["cx", "cy", "r"], function (x) {
  195. fillStyle[x] = gradient.getAttribute(x);
  196. });
  197. fillStyle.cx = gradient.getAttribute("cx");
  198. fillStyle.cy = gradient.getAttribute("cy");
  199. fillStyle.r = gradient.getAttribute("r");
  200. break;
  201.   case "pattern":
  202. fillStyle = dojo.lang.shallowCopy(dojo.gfx.defaultPattern, true);
  203. dojo.lang.forEach(["x", "y", "width", "height"], function (x) {
  204. fillStyle[x] = gradient.getAttribute(x);
  205. });
  206. fillStyle.src = gradient.firstChild.getAttributeNS(dojo.svg.xmlns.xlink, "href");
  207. break;
  208. }
  209. } else {
  210. fillStyle = new dojo.gfx.color.Color(fill);
  211. var opacity = rawNode.getAttribute("fill-opacity");
  212. if (opacity != null) {
  213. fillStyle.a = opacity;
  214. }
  215. }
  216. }
  217. return fillStyle;
  218. }, _getGradient:function (defaultGradient, gradient) {
  219. var fillStyle = dojo.lang.shallowCopy(defaultGradient, true);
  220. fillStyle.colors = [];
  221. for (var i = 0; i < gradient.childNodes.length; ++i) {
  222. fillStyle.colors.push({offset:gradient.childNodes[i].getAttribute("offset"), color:new dojo.gfx.color.Color(gradient.childNodes[i].getAttribute("stop-color"))});
  223. }
  224. return fillStyle;
  225. }, attachStroke:function (rawNode) {
  226. if (!rawNode) {
  227. return;
  228. }
  229. var stroke = rawNode.getAttribute("stroke");
  230. if (stroke == null || stroke == "none") {
  231. return null;
  232. }
  233. var strokeStyle = dojo.lang.shallowCopy(dojo.gfx.defaultStroke, true);
  234. var color = new dojo.gfx.color.Color(stroke);
  235. if (color) {
  236. strokeStyle.color = color;
  237. strokeStyle.color.a = rawNode.getAttribute("stroke-opacity");
  238. strokeStyle.width = rawNode.getAttribute("stroke-width");
  239. strokeStyle.cap = rawNode.getAttribute("stroke-linecap");
  240. strokeStyle.join = rawNode.getAttribute("stroke-linejoin");
  241. if (strokeStyle.join == "miter") {
  242. strokeStyle.join = rawNode.getAttribute("stroke-miterlimit");
  243. }
  244. }
  245. return strokeStyle;
  246. }, attachTransform:function (rawNode) {
  247. var matrix = null;
  248. if (rawNode) {
  249. matrix = rawNode.getAttribute("transform");
  250. if (matrix.match(/^matrix(.+)$/)) {
  251. var t = matrix.slice(7, -1).split(",");
  252. matrix = 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])});
  253. }
  254. }
  255. return matrix;
  256. }, attachShape:function (rawNode) {
  257. var shape = null;
  258. if (rawNode) {
  259. shape = dojo.lang.shallowCopy(this.shape, true);
  260. for (var i in shape) {
  261. shape[i] = rawNode.getAttribute(i);
  262. }
  263. }
  264. return shape;
  265. }, attach:function (rawNode) {
  266. if (rawNode) {
  267. this.rawNode = rawNode;
  268. this.fillStyle = this.attachFill(rawNode);
  269. this.strokeStyle = this.attachStroke(rawNode);
  270. this.matrix = this.attachTransform(rawNode);
  271. this.shape = this.attachShape(rawNode);
  272. }
  273. }});
  274. dojo.declare("dojo.gfx.Group", dojo.gfx.Shape, {setRawNode:function (rawNode) {
  275. this.rawNode = rawNode;
  276. }});
  277. dojo.gfx.Group.nodeType = "g";
  278. dojo.declare("dojo.gfx.Rect", dojo.gfx.shape.Rect, {attachShape:function (rawNode) {
  279. var shape = null;
  280. if (rawNode) {
  281. shape = dojo.gfx.Rect.superclass.attachShape.apply(this, arguments);
  282. shape.r = Math.min(rawNode.getAttribute("rx"), rawNode.getAttribute("ry"));
  283. }
  284. return shape;
  285. }, setShape:function (newShape) {
  286. this.shape = dojo.gfx.makeParameters(this.shape, newShape);
  287. this.bbox = null;
  288. for (var i in this.shape) {
  289. if (i != "type" && i != "r") {
  290. this.rawNode.setAttribute(i, this.shape[i]);
  291. }
  292. }
  293. this.rawNode.setAttribute("rx", this.shape.r);
  294. this.rawNode.setAttribute("ry", this.shape.r);
  295. return this;
  296. }});
  297. dojo.gfx.Rect.nodeType = "rect";
  298. dojo.gfx.Ellipse = dojo.gfx.shape.Ellipse;
  299. dojo.gfx.Ellipse.nodeType = "ellipse";
  300. dojo.gfx.Circle = dojo.gfx.shape.Circle;
  301. dojo.gfx.Circle.nodeType = "circle";
  302. dojo.gfx.Line = dojo.gfx.shape.Line;
  303. dojo.gfx.Line.nodeType = "line";
  304. dojo.declare("dojo.gfx.Polyline", dojo.gfx.shape.Polyline, {setShape:function (points) {
  305. if (points && points instanceof Array) {
  306. this.shape = dojo.gfx.makeParameters(this.shape, {points:points});
  307. if (closed && this.shape.points.length) {
  308. this.shape.points.push(this.shape.points[0]);
  309. }
  310. } else {
  311. this.shape = dojo.gfx.makeParameters(this.shape, points);
  312. }
  313. this.box = null;
  314. var attr = [];
  315. var p = this.shape.points;
  316. for (var i = 0; i < p.length; ++i) {
  317. attr.push(p[i].x.toFixed(8));
  318. attr.push(p[i].y.toFixed(8));
  319. }
  320. this.rawNode.setAttribute("points", attr.join(" "));
  321. return this;
  322. }});
  323. dojo.gfx.Polyline.nodeType = "polyline";
  324. dojo.declare("dojo.gfx.Image", dojo.gfx.shape.Image, {setShape:function (newShape) {
  325. this.shape = dojo.gfx.makeParameters(this.shape, newShape);
  326. this.bbox = null;
  327. var rawNode = this.rawNode;
  328. for (var i in this.shape) {
  329. if (i != "type" && i != "src") {
  330. rawNode.setAttribute(i, this.shape[i]);
  331. }
  332. }
  333. rawNode.setAttributeNS(dojo.svg.xmlns.xlink, "href", this.shape.src);
  334. return this;
  335. }, setStroke:function () {
  336. return this;
  337. }, setFill:function () {
  338. return this;
  339. }, attachStroke:function (rawNode) {
  340. return null;
  341. }, attachFill:function (rawNode) {
  342. return null;
  343. }});
  344. dojo.gfx.Image.nodeType = "image";
  345. dojo.declare("dojo.gfx.Path", dojo.gfx.path.Path, {_updateWithSegment:function (segment) {
  346. dojo.gfx.Path.superclass._updateWithSegment.apply(this, arguments);
  347. if (typeof (this.shape.path) == "string") {
  348. this.rawNode.setAttribute("d", this.shape.path);
  349. }
  350. }, setShape:function (newShape) {
  351. dojo.gfx.Path.superclass.setShape.apply(this, arguments);
  352. this.rawNode.setAttribute("d", this.shape.path);
  353. return this;
  354. }});
  355. dojo.gfx.Path.nodeType = "path";
  356. dojo.gfx._creators = {createPath:function (path) {
  357. return this.createObject(dojo.gfx.Path, path);
  358. }, createRect:function (rect) {
  359. return this.createObject(dojo.gfx.Rect, rect);
  360. }, createCircle:function (circle) {
  361. return this.createObject(dojo.gfx.Circle, circle);
  362. }, createEllipse:function (ellipse) {
  363. return this.createObject(dojo.gfx.Ellipse, ellipse);
  364. }, createLine:function (line) {
  365. return this.createObject(dojo.gfx.Line, line);
  366. }, createPolyline:function (points) {
  367. return this.createObject(dojo.gfx.Polyline, points);
  368. }, createImage:function (image) {
  369. return this.createObject(dojo.gfx.Image, image);
  370. }, createGroup:function () {
  371. return this.createObject(dojo.gfx.Group);
  372. }, createObject:function (shapeType, rawShape) {
  373. if (!this.rawNode) {
  374. return null;
  375. }
  376. var shape = new shapeType();
  377. var node = document.createElementNS(dojo.svg.xmlns.svg, shapeType.nodeType);
  378. shape.setRawNode(node);
  379. this.rawNode.appendChild(node);
  380. shape.setShape(rawShape);
  381. this.add(shape);
  382. return shape;
  383. }, add:function (shape) {
  384. var oldParent = shape.getParent();
  385. if (oldParent) {
  386. oldParent.remove(shape, true);
  387. }
  388. shape._setParent(this, null);
  389. this.rawNode.appendChild(shape.rawNode);
  390. return this;
  391. }, remove:function (shape, silently) {
  392. if (this.rawNode == shape.rawNode.parentNode) {
  393. this.rawNode.removeChild(shape.rawNode);
  394. }
  395. shape._setParent(null, null);
  396. return this;
  397. }};
  398. dojo.gfx.attachNode = function (node) {
  399. if (!node) {
  400. return null;
  401. }
  402. var s = null;
  403. switch (node.tagName.toLowerCase()) {
  404.   case dojo.gfx.Rect.nodeType:
  405. s = new dojo.gfx.Rect();
  406. break;
  407.   case dojo.gfx.Ellipse.nodeType:
  408. s = new dojo.gfx.Ellipse();
  409. break;
  410.   case dojo.gfx.Polyline.nodeType:
  411. s = new dojo.gfx.Polyline();
  412. break;
  413.   case dojo.gfx.Path.nodeType:
  414. s = new dojo.gfx.Path();
  415. break;
  416.   case dojo.gfx.Circle.nodeType:
  417. s = new dojo.gfx.Circle();
  418. break;
  419.   case dojo.gfx.Line.nodeType:
  420. s = new dojo.gfx.Line();
  421. break;
  422.   case dojo.gfx.Image.nodeType:
  423. s = new dojo.gfx.Image();
  424. break;
  425.   default:
  426. dojo.debug("FATAL ERROR! tagName = " + node.tagName);
  427. }
  428. s.attach(node);
  429. return s;
  430. };
  431. dojo.lang.extend(dojo.gfx.Surface, {setDimensions:function (width, height) {
  432. if (!this.rawNode) {
  433. return this;
  434. }
  435. this.rawNode.setAttribute("width", width);
  436. this.rawNode.setAttribute("height", height);
  437. return this;
  438. }, getDimensions:function () {
  439. return this.rawNode ? {width:this.rawNode.getAttribute("width"), height:this.rawNode.getAttribute("height")} : null;
  440. }});
  441. dojo.gfx.createSurface = function (parentNode, width, height) {
  442. var s = new dojo.gfx.Surface();
  443. s.rawNode = document.createElementNS(dojo.svg.xmlns.svg, "svg");
  444. s.rawNode.setAttribute("width", width);
  445. s.rawNode.setAttribute("height", height);
  446. var defs = new dojo.gfx.svg.Defines();
  447. var node = document.createElementNS(dojo.svg.xmlns.svg, dojo.gfx.svg.Defines.nodeType);
  448. defs.setRawNode(node);
  449. s.rawNode.appendChild(node);
  450. dojo.byId(parentNode).appendChild(s.rawNode);
  451. return s;
  452. };
  453. dojo.gfx.attachSurface = function (node) {
  454. var s = new dojo.gfx.Surface();
  455. s.rawNode = node;
  456. return s;
  457. };
  458. dojo.lang.extend(dojo.gfx.Group, dojo.gfx._creators);
  459. dojo.lang.extend(dojo.gfx.Surface, dojo.gfx._creators);
  460. delete dojo.gfx._creators;
  461. dojo.gfx.svg.Defines = function () {
  462. this.rawNode = null;
  463. };
  464. dojo.lang.extend(dojo.gfx.svg.Defines, {setRawNode:function (rawNode) {
  465. this.rawNode = rawNode;
  466. }});
  467. dojo.gfx.svg.Defines.nodeType = "defs";