index.umd.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365
  1. (function (global, factory) {
  2. typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@antv/g-lite')) :
  3. typeof define === 'function' && define.amd ? define(['exports', '@antv/g-lite'], factory) :
  4. (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory((global.G = global.G || {}, global.G.CanvasPathGenerator = {}), global.window.G));
  5. }(this, (function (exports, gLite) { 'use strict';
  6. function _inheritsLoose(subClass, superClass) {
  7. subClass.prototype = Object.create(superClass.prototype);
  8. subClass.prototype.constructor = subClass;
  9. _setPrototypeOf(subClass, superClass);
  10. }
  11. function _setPrototypeOf(o, p) {
  12. _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) {
  13. o.__proto__ = p;
  14. return o;
  15. };
  16. return _setPrototypeOf(o, p);
  17. }
  18. function generatePath(context, parsedStyle) {
  19. var r = parsedStyle.r;
  20. context.arc(r, r, r, 0, Math.PI * 2, false);
  21. }
  22. function generatePath$1(context, parsedStyle) {
  23. var rxInPixels = parsedStyle.rx,
  24. ryInPixels = parsedStyle.ry;
  25. var rx = rxInPixels;
  26. var ry = ryInPixels;
  27. // @see https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/ellipse
  28. if (context.ellipse) {
  29. context.ellipse(rx, ry, rx, ry, 0, 0, Math.PI * 2, false);
  30. } else {
  31. // 如果不支持,则使用圆来绘制,进行变形
  32. var r = rx > ry ? rx : ry;
  33. var scaleX = rx > ry ? 1 : rx / ry;
  34. var scaleY = rx > ry ? ry / rx : 1;
  35. context.save();
  36. context.scale(scaleX, scaleY);
  37. context.arc(0, 0, r, 0, Math.PI * 2);
  38. }
  39. }
  40. function generatePath$2(context, parsedStyle) {
  41. var x1 = parsedStyle.x1,
  42. y1 = parsedStyle.y1,
  43. x2 = parsedStyle.x2,
  44. y2 = parsedStyle.y2,
  45. _parsedStyle$defX = parsedStyle.defX,
  46. defX = _parsedStyle$defX === void 0 ? 0 : _parsedStyle$defX,
  47. _parsedStyle$defY = parsedStyle.defY,
  48. defY = _parsedStyle$defY === void 0 ? 0 : _parsedStyle$defY,
  49. markerStart = parsedStyle.markerStart,
  50. markerEnd = parsedStyle.markerEnd,
  51. markerStartOffset = parsedStyle.markerStartOffset,
  52. markerEndOffset = parsedStyle.markerEndOffset;
  53. var startOffsetX = 0;
  54. var startOffsetY = 0;
  55. var endOffsetX = 0;
  56. var endOffsetY = 0;
  57. var rad = 0;
  58. var x;
  59. var y;
  60. if (markerStart && gLite.isDisplayObject(markerStart) && markerStartOffset) {
  61. x = x2 - x1;
  62. y = y2 - y1;
  63. rad = Math.atan2(y, x);
  64. startOffsetX = Math.cos(rad) * (markerStartOffset || 0);
  65. startOffsetY = Math.sin(rad) * (markerStartOffset || 0);
  66. }
  67. if (markerEnd && gLite.isDisplayObject(markerEnd) && markerEndOffset) {
  68. x = x1 - x2;
  69. y = y1 - y2;
  70. rad = Math.atan2(y, x);
  71. endOffsetX = Math.cos(rad) * (markerEndOffset || 0);
  72. endOffsetY = Math.sin(rad) * (markerEndOffset || 0);
  73. }
  74. context.moveTo(x1 - defX + startOffsetX, y1 - defY + startOffsetY);
  75. context.lineTo(x2 - defX + endOffsetX, y2 - defY + endOffsetY);
  76. }
  77. function generatePath$3(context, parsedStyle) {
  78. var _parsedStyle$defX = parsedStyle.defX,
  79. defX = _parsedStyle$defX === void 0 ? 0 : _parsedStyle$defX,
  80. _parsedStyle$defY = parsedStyle.defY,
  81. defY = _parsedStyle$defY === void 0 ? 0 : _parsedStyle$defY,
  82. markerStart = parsedStyle.markerStart,
  83. markerEnd = parsedStyle.markerEnd,
  84. markerStartOffset = parsedStyle.markerStartOffset,
  85. markerEndOffset = parsedStyle.markerEndOffset;
  86. var _parsedStyle$path = parsedStyle.path,
  87. absolutePath = _parsedStyle$path.absolutePath,
  88. segments = _parsedStyle$path.segments;
  89. var startOffsetX = 0;
  90. var startOffsetY = 0;
  91. var endOffsetX = 0;
  92. var endOffsetY = 0;
  93. var rad = 0;
  94. var x;
  95. var y;
  96. if (markerStart && gLite.isDisplayObject(markerStart) && markerStartOffset) {
  97. var _markerStart$parentNo = markerStart.parentNode.getStartTangent(),
  98. p1 = _markerStart$parentNo[0],
  99. p2 = _markerStart$parentNo[1];
  100. x = p1[0] - p2[0];
  101. y = p1[1] - p2[1];
  102. rad = Math.atan2(y, x);
  103. startOffsetX = Math.cos(rad) * (markerStartOffset || 0);
  104. startOffsetY = Math.sin(rad) * (markerStartOffset || 0);
  105. }
  106. if (markerEnd && gLite.isDisplayObject(markerEnd) && markerEndOffset) {
  107. var _markerEnd$parentNode = markerEnd.parentNode.getEndTangent(),
  108. _p = _markerEnd$parentNode[0],
  109. _p2 = _markerEnd$parentNode[1];
  110. x = _p[0] - _p2[0];
  111. y = _p[1] - _p2[1];
  112. rad = Math.atan2(y, x);
  113. endOffsetX = Math.cos(rad) * (markerEndOffset || 0);
  114. endOffsetY = Math.sin(rad) * (markerEndOffset || 0);
  115. }
  116. for (var i = 0; i < absolutePath.length; i++) {
  117. var params = absolutePath[i];
  118. var command = params[0];
  119. var nextSegment = absolutePath[i + 1];
  120. var useStartOffset = i === 0 && (startOffsetX !== 0 || startOffsetY !== 0);
  121. var useEndOffset = (i === absolutePath.length - 1 || nextSegment && (nextSegment[0] === 'M' || nextSegment[0] === 'Z')) && endOffsetX !== 0 && endOffsetY !== 0;
  122. switch (command) {
  123. case 'M':
  124. // Use start marker offset
  125. if (useStartOffset) {
  126. context.moveTo(params[1] - defX + startOffsetX, params[2] - defY + startOffsetY);
  127. context.lineTo(params[1] - defX, params[2] - defY);
  128. } else {
  129. context.moveTo(params[1] - defX, params[2] - defY);
  130. }
  131. break;
  132. case 'L':
  133. if (useEndOffset) {
  134. context.lineTo(params[1] - defX + endOffsetX, params[2] - defY + endOffsetY);
  135. } else {
  136. context.lineTo(params[1] - defX, params[2] - defY);
  137. }
  138. break;
  139. case 'Q':
  140. context.quadraticCurveTo(params[1] - defX, params[2] - defY, params[3] - defX, params[4] - defY);
  141. if (useEndOffset) {
  142. context.lineTo(params[3] - defX + endOffsetX, params[4] - defY + endOffsetY);
  143. }
  144. break;
  145. case 'C':
  146. context.bezierCurveTo(params[1] - defX, params[2] - defY, params[3] - defX, params[4] - defY, params[5] - defX, params[6] - defY);
  147. if (useEndOffset) {
  148. context.lineTo(params[5] - defX + endOffsetX, params[6] - defY + endOffsetY);
  149. }
  150. break;
  151. case 'A':
  152. {
  153. var arcParams = segments[i].arcParams;
  154. var cx = arcParams.cx,
  155. cy = arcParams.cy,
  156. rx = arcParams.rx,
  157. ry = arcParams.ry,
  158. startAngle = arcParams.startAngle,
  159. endAngle = arcParams.endAngle,
  160. xRotation = arcParams.xRotation,
  161. sweepFlag = arcParams.sweepFlag;
  162. // @see https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/ellipse
  163. if (context.ellipse) {
  164. context.ellipse(cx - defX, cy - defY, rx, ry, xRotation, startAngle, endAngle, !!(1 - sweepFlag));
  165. } else {
  166. // @see https://stackoverflow.com/a/47494351
  167. var r = rx > ry ? rx : ry;
  168. var scaleX = rx > ry ? 1 : rx / ry;
  169. var scaleY = rx > ry ? ry / rx : 1;
  170. context.translate(cx - defX, cy - defY);
  171. context.rotate(xRotation);
  172. context.scale(scaleX, scaleY);
  173. context.arc(0, 0, r, startAngle, endAngle, !!(1 - sweepFlag));
  174. context.scale(1 / scaleX, 1 / scaleY);
  175. context.rotate(-xRotation);
  176. context.translate(-(cx - defX), -(cy - defY));
  177. }
  178. if (useEndOffset) {
  179. context.lineTo(params[6] - defX + endOffsetX, params[7] - defY + endOffsetY);
  180. }
  181. break;
  182. }
  183. case 'Z':
  184. context.closePath();
  185. break;
  186. }
  187. }
  188. }
  189. function generatePath$4(context, parsedStyle) {
  190. var _parsedStyle$defX = parsedStyle.defX,
  191. defX = _parsedStyle$defX === void 0 ? 0 : _parsedStyle$defX,
  192. _parsedStyle$defY = parsedStyle.defY,
  193. defY = _parsedStyle$defY === void 0 ? 0 : _parsedStyle$defY,
  194. markerStart = parsedStyle.markerStart,
  195. markerEnd = parsedStyle.markerEnd,
  196. markerStartOffset = parsedStyle.markerStartOffset,
  197. markerEndOffset = parsedStyle.markerEndOffset;
  198. var points = parsedStyle.points.points;
  199. var length = points.length;
  200. var x1 = points[0][0] - defX;
  201. var y1 = points[0][1] - defY;
  202. var x2 = points[length - 1][0] - defX;
  203. var y2 = points[length - 1][1] - defY;
  204. var startOffsetX = 0;
  205. var startOffsetY = 0;
  206. var endOffsetX = 0;
  207. var endOffsetY = 0;
  208. var rad = 0;
  209. var x;
  210. var y;
  211. if (markerStart && gLite.isDisplayObject(markerStart) && markerStartOffset) {
  212. x = points[1][0] - points[0][0];
  213. y = points[1][1] - points[0][1];
  214. rad = Math.atan2(y, x);
  215. startOffsetX = Math.cos(rad) * (markerStartOffset || 0);
  216. startOffsetY = Math.sin(rad) * (markerStartOffset || 0);
  217. }
  218. if (markerEnd && gLite.isDisplayObject(markerEnd) && markerEndOffset) {
  219. x = points[length - 1][0] - points[0][0];
  220. y = points[length - 1][1] - points[0][1];
  221. rad = Math.atan2(y, x);
  222. endOffsetX = Math.cos(rad) * (markerEndOffset || 0);
  223. endOffsetY = Math.sin(rad) * (markerEndOffset || 0);
  224. }
  225. context.moveTo(x1 + (startOffsetX || endOffsetX), y1 + (startOffsetY || endOffsetY));
  226. for (var i = 1; i < length - 1; i++) {
  227. var point = points[i];
  228. context.lineTo(point[0] - defX, point[1] - defY);
  229. }
  230. context.lineTo(x2, y2);
  231. }
  232. function generatePath$5(context, parsedStyle) {
  233. var _parsedStyle$defX = parsedStyle.defX,
  234. defX = _parsedStyle$defX === void 0 ? 0 : _parsedStyle$defX,
  235. _parsedStyle$defY = parsedStyle.defY,
  236. defY = _parsedStyle$defY === void 0 ? 0 : _parsedStyle$defY,
  237. markerStart = parsedStyle.markerStart,
  238. markerEnd = parsedStyle.markerEnd,
  239. markerStartOffset = parsedStyle.markerStartOffset,
  240. markerEndOffset = parsedStyle.markerEndOffset;
  241. var points = parsedStyle.points.points;
  242. var length = points.length;
  243. var x1 = points[0][0] - defX;
  244. var y1 = points[0][1] - defY;
  245. var x2 = points[length - 1][0] - defX;
  246. var y2 = points[length - 1][1] - defY;
  247. var startOffsetX = 0;
  248. var startOffsetY = 0;
  249. var endOffsetX = 0;
  250. var endOffsetY = 0;
  251. var rad = 0;
  252. var x;
  253. var y;
  254. if (markerStart && gLite.isDisplayObject(markerStart) && markerStartOffset) {
  255. x = points[1][0] - points[0][0];
  256. y = points[1][1] - points[0][1];
  257. rad = Math.atan2(y, x);
  258. startOffsetX = Math.cos(rad) * (markerStartOffset || 0);
  259. startOffsetY = Math.sin(rad) * (markerStartOffset || 0);
  260. }
  261. if (markerEnd && gLite.isDisplayObject(markerEnd) && markerEndOffset) {
  262. x = points[length - 2][0] - points[length - 1][0];
  263. y = points[length - 2][1] - points[length - 1][1];
  264. rad = Math.atan2(y, x);
  265. endOffsetX = Math.cos(rad) * (markerEndOffset || 0);
  266. endOffsetY = Math.sin(rad) * (markerEndOffset || 0);
  267. }
  268. context.moveTo(x1 + startOffsetX, y1 + startOffsetY);
  269. for (var i = 1; i < length - 1; i++) {
  270. var point = points[i];
  271. context.lineTo(point[0] - defX, point[1] - defY);
  272. }
  273. context.lineTo(x2 + endOffsetX, y2 + endOffsetY);
  274. }
  275. var clamp = function (a, min, max) {
  276. if (a < min) {
  277. return min;
  278. }
  279. else if (a > max) {
  280. return max;
  281. }
  282. return a;
  283. };
  284. function generatePath$6(context, parsedStyle) {
  285. var radius = parsedStyle.radius,
  286. width = parsedStyle.width,
  287. height = parsedStyle.height;
  288. var w = width;
  289. var h = height;
  290. var hasRadius = radius && radius.some(function (r) {
  291. return r !== 0;
  292. });
  293. if (!hasRadius) {
  294. // Canvas support negative width/height of rect
  295. context.rect(0, 0, w, h);
  296. } else {
  297. var signX = width > 0 ? 1 : -1;
  298. var signY = height > 0 ? 1 : -1;
  299. var sweepFlag = signX + signY === 0;
  300. var _radius$map = radius.map(function (r) {
  301. return clamp(r, 0, Math.min(Math.abs(w) / 2, Math.abs(h) / 2));
  302. }),
  303. tlr = _radius$map[0],
  304. trr = _radius$map[1],
  305. brr = _radius$map[2],
  306. blr = _radius$map[3];
  307. context.moveTo(signX * tlr, 0);
  308. context.lineTo(w - signX * trr, 0);
  309. if (trr !== 0) {
  310. context.arc(w - signX * trr, signY * trr, trr, -signY * Math.PI / 2, signX > 0 ? 0 : Math.PI, sweepFlag);
  311. }
  312. context.lineTo(w, h - signY * brr);
  313. if (brr !== 0) {
  314. context.arc(w - signX * brr, h - signY * brr, brr, signX > 0 ? 0 : Math.PI, signY > 0 ? Math.PI / 2 : 1.5 * Math.PI, sweepFlag);
  315. }
  316. context.lineTo(signX * blr, h);
  317. if (blr !== 0) {
  318. context.arc(signX * blr, h - signY * blr, blr, signY > 0 ? Math.PI / 2 : -Math.PI / 2, signX > 0 ? Math.PI : 0, sweepFlag);
  319. }
  320. context.lineTo(0, signY * tlr);
  321. if (tlr !== 0) {
  322. context.arc(signX * tlr, signY * tlr, tlr, signX > 0 ? Math.PI : 0, signY > 0 ? Math.PI * 1.5 : Math.PI / 2, sweepFlag);
  323. }
  324. }
  325. }
  326. var Plugin = /*#__PURE__*/function (_AbstractRendererPlug) {
  327. _inheritsLoose(Plugin, _AbstractRendererPlug);
  328. function Plugin() {
  329. var _this;
  330. for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
  331. args[_key] = arguments[_key];
  332. }
  333. _this = _AbstractRendererPlug.call.apply(_AbstractRendererPlug, [this].concat(args)) || this;
  334. _this.name = 'canvas-path-generator';
  335. return _this;
  336. }
  337. var _proto = Plugin.prototype;
  338. _proto.init = function init() {
  339. var _pathGeneratorFactory;
  340. var pathGeneratorFactory = (_pathGeneratorFactory = {}, _pathGeneratorFactory[gLite.Shape.CIRCLE] = generatePath, _pathGeneratorFactory[gLite.Shape.ELLIPSE] = generatePath$1, _pathGeneratorFactory[gLite.Shape.RECT] = generatePath$6, _pathGeneratorFactory[gLite.Shape.LINE] = generatePath$2, _pathGeneratorFactory[gLite.Shape.POLYLINE] = generatePath$5, _pathGeneratorFactory[gLite.Shape.POLYGON] = generatePath$4, _pathGeneratorFactory[gLite.Shape.PATH] = generatePath$3, _pathGeneratorFactory[gLite.Shape.TEXT] = undefined, _pathGeneratorFactory[gLite.Shape.GROUP] = undefined, _pathGeneratorFactory[gLite.Shape.IMAGE] = undefined, _pathGeneratorFactory[gLite.Shape.HTML] = undefined, _pathGeneratorFactory[gLite.Shape.MESH] = undefined, _pathGeneratorFactory);
  341. // @ts-ignore
  342. this.context.pathGeneratorFactory = pathGeneratorFactory;
  343. };
  344. _proto.destroy = function destroy() {
  345. // @ts-ignore
  346. delete this.context.pathGeneratorFactory;
  347. };
  348. return Plugin;
  349. }(gLite.AbstractRendererPlugin);
  350. exports.Plugin = Plugin;
  351. Object.defineProperty(exports, '__esModule', { value: true });
  352. })));