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

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.path");
  9. dojo.require("dojo.math");
  10. dojo.require("dojo.gfx.shape");
  11. dojo.declare("dojo.gfx.path.Path", dojo.gfx.Shape, {initializer:function (rawNode) {
  12. this.shape = dojo.lang.shallowCopy(dojo.gfx.defaultPath, true);
  13. this.segments = [];
  14. this.absolute = true;
  15. this.last = {};
  16. this.attach(rawNode);
  17. }, setAbsoluteMode:function (mode) {
  18. this.absolute = typeof (mode) == "string" ? (mode == "absolute") : mode;
  19. return this;
  20. }, getAbsoluteMode:function () {
  21. return this.absolute;
  22. }, getBoundingBox:function () {
  23. return "l" in this.bbox ? {x:this.bbox.l, y:this.bbox.t, width:this.bbox.r - this.bbox.l, height:this.bbox.b - this.bbox.t} : null;
  24. }, getLastPosition:function () {
  25. return "x" in this.last ? this.last : null;
  26. }, _updateBBox:function (x, y) {
  27. if ("l" in this.bbox) {
  28. if (this.bbox.l > x) {
  29. this.bbox.l = x;
  30. }
  31. if (this.bbox.r < x) {
  32. this.bbox.r = x;
  33. }
  34. if (this.bbox.t > y) {
  35. this.bbox.t = y;
  36. }
  37. if (this.bbox.b < y) {
  38. this.bbox.b = y;
  39. }
  40. } else {
  41. this.bbox = {l:x, b:y, r:x, t:y};
  42. }
  43. }, _updateWithSegment:function (segment) {
  44. var n = segment.args;
  45. var l = n.length;
  46. switch (segment.action) {
  47.   case "M":
  48.   case "L":
  49.   case "C":
  50.   case "S":
  51.   case "Q":
  52.   case "T":
  53. for (var i = 0; i < l; i += 2) {
  54. this._updateBBox(this.bbox, n[i], n[i + 1]);
  55. }
  56. this.last.x = n[l - 2];
  57. this.last.y = n[l - 1];
  58. this.absolute = true;
  59. break;
  60.   case "H":
  61. for (var i = 0; i < l; ++i) {
  62. this._updateBBox(this.bbox, n[i], this.last.y);
  63. }
  64. this.last.x = n[l - 1];
  65. this.absolute = true;
  66. break;
  67.   case "V":
  68. for (var i = 0; i < l; ++i) {
  69. this._updateBBox(this.bbox, this.last.x, n[i]);
  70. }
  71. this.last.y = n[l - 1];
  72. this.absolute = true;
  73. break;
  74.   case "m":
  75. var start = 0;
  76. if (!("x" in this.last)) {
  77. this._updateBBox(this.bbox, this.last.x = n[0], this.last.y = n[1]);
  78. start = 2;
  79. }
  80. for (var i = start; i < l; i += 2) {
  81. this._updateBBox(this.bbox, this.last.x += n[i], this.last.y += n[i + 1]);
  82. }
  83. this.absolute = false;
  84. break;
  85.   case "l":
  86.   case "t":
  87. for (var i = 0; i < l; i += 2) {
  88. this._updateBBox(this.bbox, this.last.x += n[i], this.last.y += n[i + 1]);
  89. }
  90. this.absolute = false;
  91. break;
  92.   case "h":
  93. for (var i = 0; i < l; ++i) {
  94. this._updateBBox(this.bbox, this.last.x += n[i], this.last.y);
  95. }
  96. this.absolute = false;
  97. break;
  98.   case "v":
  99. for (var i = 0; i < l; ++i) {
  100. this._updateBBox(this.bbox, this.last.x, this.last.y += n[i]);
  101. }
  102. this.absolute = false;
  103. break;
  104.   case "c":
  105. for (var i = 0; i < l; i += 6) {
  106. this._updateBBox(this.bbox, this.last.x + n[i], this.last.y + n[i + 1]);
  107. this._updateBBox(this.bbox, this.last.x + n[i + 2], this.last.y + n[i + 3]);
  108. this._updateBBox(this.bbox, this.last.x += n[i + 4], this.last.y += n[i + 5]);
  109. }
  110. this.absolute = false;
  111. break;
  112.   case "s":
  113.   case "q":
  114. for (var i = 0; i < l; i += 4) {
  115. this._updateBBox(this.bbox, this.last.x + n[i], this.last.y + n[i + 1]);
  116. this._updateBBox(this.bbox, this.last.x += n[i + 2], this.last.y += n[i + 3]);
  117. }
  118. this.absolute = false;
  119. break;
  120.   case "A":
  121. for (var i = 0; i < l; i += 7) {
  122. this._updateBBox(this.bbox, n[i + 5], n[i + 6]);
  123. }
  124. this.last.x = n[l - 2];
  125. this.last.y = n[l - 1];
  126. this.absolute = true;
  127. break;
  128.   case "a":
  129. for (var i = 0; i < l; i += 7) {
  130. this._updateBBox(this.bbox, this.last.x += n[i + 5], this.last.y += n[i + 6]);
  131. }
  132. this.absolute = false;
  133. break;
  134. }
  135. var path = [segment.action];
  136. for (var i = 0; i < l; ++i) {
  137. path.push(dojo.gfx.formatNumber(n[i], true));
  138. }
  139. if (typeof (this.shape.path) == "string") {
  140. this.shape.path += path.join("");
  141. } else {
  142. this.shape.path = this.shape.path.concat(path);
  143. }
  144. }, _validSegments:{m:2, l:2, h:1, v:1, c:6, s:4, q:4, t:2, a:7, z:0}, _pushSegment:function (action, args) {
  145. var group = this._validSegments[action.toLowerCase()];
  146. if (typeof (group) == "number") {
  147. if (group) {
  148. if (args.length >= group) {
  149. var segment = {action:action, args:args.slice(0, args.length - args.length % group)};
  150. this.segments.push(segment);
  151. this._updateWithSegment(segment);
  152. }
  153. } else {
  154. var segment = {action:action, args:[]};
  155. this.segments.push(segment);
  156. this._updateWithSegment(segment);
  157. }
  158. }
  159. }, _collectArgs:function (array, args) {
  160. for (var i = 0; i < args.length; ++i) {
  161. var t = args[i];
  162. if (typeof (t) == "boolean") {
  163. array.push(t ? 1 : 0);
  164. } else {
  165. if (typeof (t) == "number") {
  166. array.push(t);
  167. } else {
  168. if (t instanceof Array) {
  169. this._collectArgs(array, t);
  170. } else {
  171. if ("x" in t && "y" in t) {
  172. array.push(t.x);
  173. array.push(t.y);
  174. }
  175. }
  176. }
  177. }
  178. }
  179. }, moveTo:function () {
  180. var args = [];
  181. this._collectArgs(args, arguments);
  182. this._pushSegment(this.absolute ? "M" : "m", args);
  183. return this;
  184. }, lineTo:function () {
  185. var args = [];
  186. this._collectArgs(args, arguments);
  187. this._pushSegment(this.absolute ? "L" : "l", args);
  188. return this;
  189. }, hLineTo:function () {
  190. var args = [];
  191. this._collectArgs(args, arguments);
  192. this._pushSegment(this.absolute ? "H" : "h", args);
  193. return this;
  194. }, vLineTo:function () {
  195. var args = [];
  196. this._collectArgs(args, arguments);
  197. this._pushSegment(this.absolute ? "V" : "v", args);
  198. return this;
  199. }, curveTo:function () {
  200. var args = [];
  201. this._collectArgs(args, arguments);
  202. this._pushSegment(this.absolute ? "C" : "c", args);
  203. return this;
  204. }, smoothCurveTo:function () {
  205. var args = [];
  206. this._collectArgs(args, arguments);
  207. this._pushSegment(this.absolute ? "S" : "s", args);
  208. return this;
  209. }, qCurveTo:function () {
  210. var args = [];
  211. this._collectArgs(args, arguments);
  212. this._pushSegment(this.absolute ? "Q" : "q", args);
  213. return this;
  214. }, qSmoothCurveTo:function () {
  215. var args = [];
  216. this._collectArgs(args, arguments);
  217. this._pushSegment(this.absolute ? "T" : "t", args);
  218. return this;
  219. }, arcTo:function () {
  220. var args = [];
  221. this._collectArgs(args, arguments);
  222. for (var i = 2; i < args.length; i += 7) {
  223. args[i] = -args[i];
  224. }
  225. this._pushSegment(this.absolute ? "A" : "a", args);
  226. return this;
  227. }, closePath:function () {
  228. this._pushSegment("Z", []);
  229. return this;
  230. }, _setPath:function (path) {
  231. var p = path.match(dojo.gfx.pathRegExp);
  232. this.segments = [];
  233. this.absolute = true;
  234. this.bbox = {};
  235. this.last = {};
  236. if (!p) {
  237. return;
  238. }
  239. var action = "";
  240. var args = [];
  241. for (var i = 0; i < p.length; ++i) {
  242. var t = p[i];
  243. var x = parseFloat(t);
  244. if (isNaN(x)) {
  245. if (action) {
  246. this._pushSegment(action, args);
  247. }
  248. args = [];
  249. action = t;
  250. } else {
  251. args.push(x);
  252. }
  253. }
  254. this._pushSegment(action, args);
  255. }, setShape:function (newShape) {
  256. this.shape = dojo.gfx.makeParameters(this.shape, typeof (newShape) == "string" ? {path:newShape} : newShape);
  257. var path = this.shape.path;
  258. this.shape.path = [];
  259. this._setPath(path);
  260. this.shape.path = this.shape.path.join("");
  261. return this;
  262. }, _2PI:Math.PI * 2});