900a7394373af31ec763bf43571d11b5c2b417fc.svn-base 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640
  1. /**
  2. * echarts扩展zrender shape
  3. *
  4. * @author Kener (@Kener-林峰, kener.linfeng@gmail.com)
  5. *
  6. * shape类:icon
  7. * 可配图形属性:
  8. {
  9. // 基础属性
  10. shape : 'icon', // 必须,shape类标识,需要显式指定
  11. id : {string}, // 必须,图形唯一标识,可通过'zrender/tool/guid'方法生成
  12. zlevel : {number}, // 默认为0,z层level,决定绘画在哪层canvas中
  13. invisible : {boolean}, // 默认为false,是否可见
  14. // 样式属性,默认状态样式样式属性
  15. style : {
  16. x : {number}, // 必须,左上角横坐标
  17. y : {number}, // 必须,左上角纵坐标
  18. width : {number}, // 必须,宽度
  19. height : {number}, // 必须,高度
  20. iconType : {string}, // 必须,icon类型
  21. },
  22. // 样式属性,高亮样式属性,当不存在highlightStyle时使用基于默认样式扩展显示
  23. highlightStyle : {
  24. // 同style
  25. }
  26. // 交互属性,详见shape.Base
  27. // 事件属性,详见shape.Base
  28. }
  29. */
  30. define(function (require) {
  31. var zrUtil = require('zrender/tool/util');
  32. function _iconMark(ctx, style) {
  33. var x = style.x;
  34. var y = style.y;
  35. var dx = style.width / 16;
  36. var dy = style.height / 16;
  37. ctx.moveTo(x, y + style.height);
  38. ctx.lineTo(x + 5 * dx, y + 14 * dy);
  39. ctx.lineTo(x + style.width, y + 3 * dy);
  40. ctx.lineTo(x + 13 * dx, y);
  41. ctx.lineTo(x + 2 * dx, y + 11 * dy);
  42. ctx.lineTo(x, y + style.height);
  43. ctx.moveTo(x + 6 * dx, y + 10 * dy);
  44. ctx.lineTo(x + 14 * dx, y + 2 * dy);
  45. ctx.moveTo(x + 10 * dx, y + 13 * dy);
  46. ctx.lineTo(x + style.width, y + 13 * dy);
  47. ctx.moveTo(x + 13 * dx, y + 10 * dy);
  48. ctx.lineTo(x + 13 * dx, y + style.height);
  49. }
  50. function _iconMarkUndo(ctx, style) {
  51. var x = style.x;
  52. var y = style.y;
  53. var dx = style.width / 16;
  54. var dy = style.height / 16;
  55. ctx.moveTo(x, y + style.height);
  56. ctx.lineTo(x + 5 * dx, y + 14 * dy);
  57. ctx.lineTo(x + style.width, y + 3 * dy);
  58. ctx.lineTo(x + 13 * dx, y);
  59. ctx.lineTo(x + 2 * dx, y + 11 * dy);
  60. ctx.lineTo(x, y + style.height);
  61. ctx.moveTo(x + 6 * dx, y + 10 * dy);
  62. ctx.lineTo(x + 14 * dx, y + 2 * dy);
  63. ctx.moveTo(x + 10 * dx, y + 13 * dy);
  64. ctx.lineTo(x + style.width, y + 13 * dy);
  65. }
  66. function _iconMarkClear(ctx, style) {
  67. var x = style.x;
  68. var y = style.y;
  69. var dx = style.width / 16;
  70. var dy = style.height / 16;
  71. ctx.moveTo(x + 4 * dx, y + 15 * dy);
  72. ctx.lineTo(x + 9 * dx, y + 13 * dy);
  73. ctx.lineTo(x + 14 * dx, y + 8 * dy);
  74. ctx.lineTo(x + 11 * dx, y + 5 * dy);
  75. ctx.lineTo(x + 6 * dx, y + 10 * dy);
  76. ctx.lineTo(x + 4 * dx, y + 15 * dy);
  77. ctx.moveTo(x + 5 * dx, y);
  78. ctx.lineTo(x + 11 * dx, y);
  79. ctx.moveTo(x + 5 * dx, y + dy);
  80. ctx.lineTo(x + 11 * dx, y + dy);
  81. ctx.moveTo(x, y + 2 * dy);
  82. ctx.lineTo(x + style.width, y + 2 * dy);
  83. ctx.moveTo(x, y + 5 * dy);
  84. ctx.lineTo(x + 3 * dx, y + style.height);
  85. ctx.lineTo(x + 13 * dx, y + style.height);
  86. ctx.lineTo(x + style.width, y + 5 * dy);
  87. }
  88. function _iconDataZoom(ctx, style) {
  89. var x = style.x;
  90. var y = style.y;
  91. var dx = style.width / 16;
  92. var dy = style.height / 16;
  93. ctx.moveTo(x, y + 3 * dy);
  94. ctx.lineTo(x + 6 * dx, y + 3 * dy);
  95. ctx.moveTo(x + 3 * dx, y);
  96. ctx.lineTo(x + 3 * dx, y + 6 * dy);
  97. ctx.moveTo(x + 3 * dx, y + 8 * dy);
  98. ctx.lineTo(x + 3 * dx, y + style.height);
  99. ctx.lineTo(x + style.width, y + style.height);
  100. ctx.lineTo(x + style.width, y + 3 * dy);
  101. ctx.lineTo(x + 8 * dx, y + 3 * dy);
  102. }
  103. function _iconDataZoomReset(ctx, style) {
  104. var x = style.x;
  105. var y = style.y;
  106. var dx = style.width / 16;
  107. var dy = style.height / 16;
  108. ctx.moveTo(x + 6 * dx, y);
  109. ctx.lineTo(x + 2 * dx, y + 3 * dy);
  110. ctx.lineTo(x + 6 * dx, y + 6 * dy);
  111. ctx.moveTo(x + 2 * dx, y + 3 * dy);
  112. ctx.lineTo(x + 14 * dx, y + 3 * dy);
  113. ctx.lineTo(x + 14 * dx, y + 11 * dy);
  114. ctx.moveTo(x + 2 * dx, y + 5 * dy);
  115. ctx.lineTo(x + 2 * dx, y + 13 * dy);
  116. ctx.lineTo(x + 14 * dx, y + 13 * dy);
  117. ctx.moveTo(x + 10 * dx, y + 10 * dy);
  118. ctx.lineTo(x + 14 * dx, y + 13 * dy);
  119. ctx.lineTo(x + 10 * dx, y + style.height);
  120. }
  121. function _iconRestore(ctx, style) {
  122. var x = style.x;
  123. var y = style.y;
  124. var dx = style.width / 16;
  125. var dy = style.height / 16;
  126. var r = style.width / 2;
  127. ctx.lineWidth = 1.5;
  128. ctx.arc(x + r, y + r, r - dx, 0, Math.PI * 2 / 3);
  129. ctx.moveTo(x + 3 * dx, y + style.height);
  130. ctx.lineTo(x + 0 * dx, y + 12 * dy);
  131. ctx.lineTo(x + 5 * dx, y + 11 * dy);
  132. ctx.moveTo(x, y + 8 * dy);
  133. ctx.arc(x + r, y + r, r - dx, Math.PI, Math.PI * 5 / 3);
  134. ctx.moveTo(x + 13 * dx, y);
  135. ctx.lineTo(x + style.width, y + 4 * dy);
  136. ctx.lineTo(x + 11 * dx, y + 5 * dy);
  137. }
  138. function _iconLineChart(ctx, style) {
  139. var x = style.x;
  140. var y = style.y;
  141. var dx = style.width / 16;
  142. var dy = style.height / 16;
  143. ctx.moveTo(x, y);
  144. ctx.lineTo(x, y + style.height);
  145. ctx.lineTo(x + style.width, y + style.height);
  146. ctx.moveTo(x + 2 * dx, y + 14 * dy);
  147. ctx.lineTo(x + 7 * dx, y + 6 * dy);
  148. ctx.lineTo(x + 11 * dx, y + 11 * dy);
  149. ctx.lineTo(x + 15 * dx, y + 2 * dy);
  150. }
  151. function _iconBarChart(ctx, style) {
  152. var x = style.x;
  153. var y = style.y;
  154. var dx = style.width / 16;
  155. var dy = style.height / 16;
  156. ctx.moveTo(x, y);
  157. ctx.lineTo(x, y + style.height);
  158. ctx.lineTo(x + style.width, y + style.height);
  159. ctx.moveTo(x + 3 * dx, y + 14 * dy);
  160. ctx.lineTo(x + 3 * dx, y + 6 * dy);
  161. ctx.lineTo(x + 4 * dx, y + 6 * dy);
  162. ctx.lineTo(x + 4 * dx, y + 14 * dy);
  163. ctx.moveTo(x + 7 * dx, y + 14 * dy);
  164. ctx.lineTo(x + 7 * dx, y + 2 * dy);
  165. ctx.lineTo(x + 8 * dx, y + 2 * dy);
  166. ctx.lineTo(x + 8 * dx, y + 14 * dy);
  167. ctx.moveTo(x + 11 * dx, y + 14 * dy);
  168. ctx.lineTo(x + 11 * dx, y + 9 * dy);
  169. ctx.lineTo(x + 12 * dx, y + 9 * dy);
  170. ctx.lineTo(x + 12 * dx, y + 14 * dy);
  171. }
  172. function _iconPieChart(ctx, style) {
  173. var x = style.x;
  174. var y = style.y;
  175. var width = style.width - 2;
  176. var height = style.height - 2;
  177. var r = Math.min(width, height) / 2;
  178. y += 2;
  179. ctx.moveTo(x + r + 3, y + r - 3);
  180. ctx.arc(x + r + 3, y + r - 3, r - 1, 0, -Math.PI / 2, true);
  181. ctx.lineTo(x + r + 3, y + r - 3);
  182. ctx.moveTo(x + r, y);
  183. ctx.lineTo(x + r, y + r);
  184. ctx.arc(x + r, y + r, r, -Math.PI / 2, Math.PI * 2, true);
  185. ctx.lineTo(x + r, y + r);
  186. ctx.lineWidth = 1.5;
  187. }
  188. function _iconFunnelChart(ctx, style) {
  189. var x = style.x;
  190. var y = style.y;
  191. var dx = style.width / 16;
  192. var dy = style.height / 16;
  193. y -= dy;
  194. ctx.moveTo(x + 1 * dx, y + 2 * dy);
  195. ctx.lineTo(x + 15 * dx, y + 2 * dy);
  196. ctx.lineTo(x + 14 * dx, y + 3 * dy);
  197. ctx.lineTo(x + 2 * dx, y + 3 * dy);
  198. ctx.moveTo(x + 3 * dx, y + 6 * dy);
  199. ctx.lineTo(x + 13 * dx, y + 6 * dy);
  200. ctx.lineTo(x + 12 * dx, y + 7 * dy);
  201. ctx.lineTo(x + 4 * dx, y + 7 * dy);
  202. ctx.moveTo(x + 5 * dx, y + 10 * dy);
  203. ctx.lineTo(x + 11 * dx, y + 10 * dy);
  204. ctx.lineTo(x + 10 * dx, y + 11 * dy);
  205. ctx.lineTo(x + 6 * dx, y + 11 * dy);
  206. ctx.moveTo(x + 7 * dx, y + 14 * dy);
  207. ctx.lineTo(x + 9 * dx, y + 14 * dy);
  208. ctx.lineTo(x + 8 * dx, y + 15 * dy);
  209. ctx.lineTo(x + 7 * dx, y + 15 * dy);
  210. }
  211. function _iconForceChart(ctx, style) {
  212. var x = style.x;
  213. var y = style.y;
  214. var width = style.width;
  215. var height = style.height;
  216. var dx = width / 16;
  217. var dy = height / 16;
  218. var r = Math.min(dx, dy) * 2;
  219. ctx.moveTo(x + dx + r, y + dy + r);
  220. ctx.arc(x + dx, y + dy, r, Math.PI / 4, Math.PI * 3);
  221. ctx.lineTo(x + 7 * dx - r, y + 6 * dy - r);
  222. ctx.arc(x + 7 * dx, y + 6 * dy, r, Math.PI / 4 * 5, Math.PI * 4);
  223. ctx.arc(x + 7 * dx, y + 6 * dy, r / 2, Math.PI / 4 * 5, Math.PI * 4);
  224. ctx.moveTo(x + 7 * dx - r / 2, y + 6 * dy + r);
  225. ctx.lineTo(x + dx + r, y + 14 * dy - r);
  226. ctx.arc(x + dx, y + 14 * dy, r, -Math.PI / 4, Math.PI * 2);
  227. ctx.moveTo(x + 7 * dx + r / 2, y + 6 * dy);
  228. ctx.lineTo(x + 14 * dx - r, y + 10 * dy - r / 2);
  229. ctx.moveTo(x + 16 * dx, y + 10 * dy);
  230. ctx.arc(x + 14 * dx, y + 10 * dy, r, 0, Math.PI * 3);
  231. ctx.lineWidth = 1.5;
  232. }
  233. function _iconChordChart(ctx, style) {
  234. var x = style.x;
  235. var y = style.y;
  236. var width = style.width;
  237. var height = style.height;
  238. var r = Math.min(width, height) / 2;
  239. ctx.moveTo(x + width, y + height / 2);
  240. ctx.arc(x + r, y + r, r, 0, Math.PI * 2);
  241. ctx.arc(x + r, y, r, Math.PI / 4, Math.PI / 5 * 4);
  242. ctx.arc(x, y + r, r, -Math.PI / 3, Math.PI / 3);
  243. ctx.arc(x + width, y + height, r, Math.PI, Math.PI / 2 * 3);
  244. ctx.lineWidth = 1.5;
  245. }
  246. function _iconStackChart(ctx, style) {
  247. var x = style.x;
  248. var y = style.y;
  249. var width = style.width;
  250. var height = style.height;
  251. var dy = Math.round(height / 3);
  252. var delta = Math.round((dy - 2) / 2);
  253. var len = 3;
  254. while (len--) {
  255. ctx.rect(x, y + dy * len + delta, width, 2);
  256. }
  257. }
  258. function _iconTiledChart(ctx, style) {
  259. var x = style.x;
  260. var y = style.y;
  261. var width = style.width;
  262. var height = style.height;
  263. var dx = Math.round(width / 3);
  264. var delta = Math.round((dx - 2) / 2);
  265. var len = 3;
  266. while (len--) {
  267. ctx.rect(x + dx * len + delta, y, 2, height);
  268. }
  269. }
  270. function _iconDataView(ctx, style) {
  271. var x = style.x;
  272. var y = style.y;
  273. var dx = style.width / 16;
  274. ctx.moveTo(x + dx, y);
  275. ctx.lineTo(x + dx, y + style.height);
  276. ctx.lineTo(x + 15 * dx, y + style.height);
  277. ctx.lineTo(x + 15 * dx, y);
  278. ctx.lineTo(x + dx, y);
  279. ctx.moveTo(x + 3 * dx, y + 3 * dx);
  280. ctx.lineTo(x + 13 * dx, y + 3 * dx);
  281. ctx.moveTo(x + 3 * dx, y + 6 * dx);
  282. ctx.lineTo(x + 13 * dx, y + 6 * dx);
  283. ctx.moveTo(x + 3 * dx, y + 9 * dx);
  284. ctx.lineTo(x + 13 * dx, y + 9 * dx);
  285. ctx.moveTo(x + 3 * dx, y + 12 * dx);
  286. ctx.lineTo(x + 9 * dx, y + 12 * dx);
  287. }
  288. function _iconSave(ctx, style) {
  289. var x = style.x;
  290. var y = style.y;
  291. var dx = style.width / 16;
  292. var dy = style.height / 16;
  293. ctx.moveTo(x, y);
  294. ctx.lineTo(x, y + style.height);
  295. ctx.lineTo(x + style.width, y + style.height);
  296. ctx.lineTo(x + style.width, y);
  297. ctx.lineTo(x, y);
  298. ctx.moveTo(x + 4 * dx, y);
  299. ctx.lineTo(x + 4 * dx, y + 8 * dy);
  300. ctx.lineTo(x + 12 * dx, y + 8 * dy);
  301. ctx.lineTo(x + 12 * dx, y);
  302. ctx.moveTo(x + 6 * dx, y + 11 * dy);
  303. ctx.lineTo(x + 6 * dx, y + 13 * dy);
  304. ctx.lineTo(x + 10 * dx, y + 13 * dy);
  305. ctx.lineTo(x + 10 * dx, y + 11 * dy);
  306. ctx.lineTo(x + 6 * dx, y + 11 * dy);
  307. }
  308. function _iconCross(ctx, style) {
  309. var x = style.x;
  310. var y = style.y;
  311. var width = style.width;
  312. var height = style.height;
  313. ctx.moveTo(x, y + height / 2);
  314. ctx.lineTo(x + width, y + height / 2);
  315. ctx.moveTo(x + width / 2, y);
  316. ctx.lineTo(x + width / 2, y + height);
  317. }
  318. function _iconCircle(ctx, style) {
  319. var width = style.width / 2;
  320. var height = style.height / 2;
  321. var r = Math.min(width, height);
  322. ctx.moveTo(
  323. style.x + width + r,
  324. style.y + height
  325. );
  326. ctx.arc(
  327. style.x + width,
  328. style.y + height,
  329. r,
  330. 0,
  331. Math.PI * 2
  332. );
  333. ctx.closePath();
  334. }
  335. function _iconRectangle(ctx, style) {
  336. ctx.rect(style.x, style.y, style.width, style.height);
  337. ctx.closePath();
  338. }
  339. function _iconTriangle(ctx, style) {
  340. var width = style.width / 2;
  341. var height = style.height / 2;
  342. var x = style.x + width;
  343. var y = style.y + height;
  344. var symbolSize = Math.min(width, height);
  345. ctx.moveTo(x, y - symbolSize);
  346. ctx.lineTo(x + symbolSize, y + symbolSize);
  347. ctx.lineTo(x - symbolSize, y + symbolSize);
  348. ctx.lineTo(x, y - symbolSize);
  349. ctx.closePath();
  350. }
  351. function _iconDiamond(ctx, style) {
  352. var width = style.width / 2;
  353. var height = style.height / 2;
  354. var x = style.x + width;
  355. var y = style.y + height;
  356. var symbolSize = Math.min(width, height);
  357. ctx.moveTo(x, y - symbolSize);
  358. ctx.lineTo(x + symbolSize, y);
  359. ctx.lineTo(x, y + symbolSize);
  360. ctx.lineTo(x - symbolSize, y);
  361. ctx.lineTo(x, y - symbolSize);
  362. ctx.closePath();
  363. }
  364. function _iconArrow(ctx, style) {
  365. var x = style.x;
  366. var y = style.y;
  367. var dx = style.width / 16;
  368. ctx.moveTo(x + 8 * dx, y);
  369. ctx.lineTo(x + dx, y + style.height);
  370. ctx.lineTo(x + 8 * dx, y + style.height / 4 * 3);
  371. ctx.lineTo(x + 15 * dx, y + style.height);
  372. ctx.lineTo(x + 8 * dx, y);
  373. ctx.closePath();
  374. }
  375. function _iconStar(ctx, style) {
  376. var StarShape = require('zrender/shape/Star');
  377. var width = style.width / 2;
  378. var height = style.height / 2;
  379. StarShape.prototype.buildPath(ctx, {
  380. x : style.x + width,
  381. y : style.y + height,
  382. r : Math.min(width, height),
  383. n : style.n || 5
  384. });
  385. }
  386. function _iconHeart(ctx, style) {
  387. var HeartShape = require('zrender/shape/Heart');
  388. HeartShape.prototype.buildPath(ctx, {
  389. x : style.x + style.width / 2,
  390. y : style.y + style.height * 0.2,
  391. a : style.width / 2,
  392. b : style.height * 0.8
  393. });
  394. }
  395. function _iconDroplet(ctx, style) {
  396. var DropletShape = require('zrender/shape/Droplet');
  397. DropletShape.prototype.buildPath(ctx, {
  398. x : style.x + style.width * 0.5,
  399. y : style.y + style.height * 0.5,
  400. a : style.width * 0.5,
  401. b : style.height * 0.8
  402. });
  403. }
  404. function _iconPin(ctx, style) {
  405. var x = style.x;
  406. var y = style.y - style.height / 2 * 1.5;
  407. var width = style.width / 2;
  408. var height = style.height / 2;
  409. var r = Math.min(width, height);
  410. ctx.arc(
  411. x + width,
  412. y + height,
  413. r,
  414. Math.PI / 5 * 4,
  415. Math.PI / 5
  416. );
  417. ctx.lineTo(x + width, y + height + r * 1.5);
  418. ctx.closePath();
  419. }
  420. function _iconImage(ctx, style, refreshNextFrame) {
  421. var ImageShape = require('zrender/shape/Image');
  422. this._imageShape = this._imageShape || new ImageShape({
  423. style: {}
  424. });
  425. for (var name in style) {
  426. this._imageShape.style[name] = style[name];
  427. }
  428. this._imageShape.brush(ctx, false, refreshNextFrame);
  429. }
  430. var Base = require('zrender/shape/Base');
  431. function Icon(options) {
  432. Base.call(this, options);
  433. }
  434. Icon.prototype = {
  435. type : 'icon',
  436. iconLibrary : {
  437. mark : _iconMark,
  438. markUndo : _iconMarkUndo,
  439. markClear : _iconMarkClear,
  440. dataZoom : _iconDataZoom,
  441. dataZoomReset : _iconDataZoomReset,
  442. restore : _iconRestore,
  443. lineChart : _iconLineChart,
  444. barChart : _iconBarChart,
  445. pieChart : _iconPieChart,
  446. funnelChart : _iconFunnelChart,
  447. forceChart : _iconForceChart,
  448. chordChart : _iconChordChart,
  449. stackChart : _iconStackChart,
  450. tiledChart : _iconTiledChart,
  451. dataView : _iconDataView,
  452. saveAsImage : _iconSave,
  453. cross : _iconCross,
  454. circle : _iconCircle,
  455. rectangle : _iconRectangle,
  456. triangle : _iconTriangle,
  457. diamond : _iconDiamond,
  458. arrow : _iconArrow,
  459. star : _iconStar,
  460. heart : _iconHeart,
  461. droplet : _iconDroplet,
  462. pin : _iconPin,
  463. image : _iconImage
  464. },
  465. brush: function (ctx, isHighlight, refreshNextFrame) {
  466. var style = isHighlight ? this.highlightStyle : this.style;
  467. style = style || {};
  468. var iconType = style.iconType || this.style.iconType;
  469. if (iconType === 'image') {
  470. var ImageShape = require('zrender/shape/Image');
  471. ImageShape.prototype.brush.call(this, ctx, isHighlight, refreshNextFrame);
  472. } else {
  473. var style = this.beforeBrush(ctx, isHighlight);
  474. ctx.beginPath();
  475. this.buildPath(ctx, style, refreshNextFrame);
  476. switch (style.brushType) {
  477. /* jshint ignore:start */
  478. case 'both':
  479. ctx.fill();
  480. case 'stroke':
  481. style.lineWidth > 0 && ctx.stroke();
  482. break;
  483. /* jshint ignore:end */
  484. default:
  485. ctx.fill();
  486. }
  487. this.drawText(ctx, style, this.style);
  488. this.afterBrush(ctx);
  489. }
  490. },
  491. /**
  492. * 创建矩形路径
  493. * @param {Context2D} ctx Canvas 2D上下文
  494. * @param {Object} style 样式
  495. */
  496. buildPath : function (ctx, style, refreshNextFrame) {
  497. if (this.iconLibrary[style.iconType]) {
  498. this.iconLibrary[style.iconType].call(this, ctx, style, refreshNextFrame);
  499. }
  500. else {
  501. ctx.moveTo(style.x, style.y);
  502. ctx.lineTo(style.x + style.width, style.y);
  503. ctx.lineTo(style.x + style.width, style.y + style.height);
  504. ctx.lineTo(style.x, style.y + style.height);
  505. ctx.lineTo(style.x, style.y);
  506. ctx.closePath();
  507. }
  508. return;
  509. },
  510. /**
  511. * 返回矩形区域,用于局部刷新和文字定位
  512. * @param {Object} style
  513. */
  514. getRect : function (style) {
  515. if (style.__rect) {
  516. return style.__rect;
  517. }
  518. // pin比较特殊,让尖端在目标x,y上
  519. style.__rect = {
  520. x : Math.round(style.x),
  521. y : Math.round(style.y - (style.iconType == 'pin'
  522. ? (style.height / 2 * 1.5) : 0)
  523. ),
  524. width : style.width,
  525. height : style.height * (
  526. style.iconType === 'pin' ? 1.25 : 1
  527. )
  528. };
  529. return style.__rect;
  530. },
  531. isCover : function (x, y) {
  532. var originPos = this.transformCoordToLocal(x, y);
  533. x = originPos[0];
  534. y = originPos[1];
  535. // 快速预判并保留判断矩形
  536. var rect = this.style.__rect;
  537. if (!rect) {
  538. rect = this.style.__rect = this.getRect(this.style);
  539. }
  540. // 提高交互体验,太小的图形包围盒四向扩大4px
  541. var delta = (rect.height < 8 || rect.width < 8 ) ? 4 : 0;
  542. return x >= rect.x - delta
  543. && x <= (rect.x + rect.width + delta)
  544. && y >= rect.y - delta
  545. && y <= (rect.y + rect.height + delta);
  546. }
  547. };
  548. zrUtil.inherits(Icon, Base);
  549. return Icon;
  550. });