index.js 13 KB

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