ding-image-editor 3.15.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (374) hide show
  1. package/README.md +193 -0
  2. package/dist/svg/icon-a.svg +376 -0
  3. package/dist/svg/icon-b.svg +369 -0
  4. package/dist/svg/icon-c.svg +369 -0
  5. package/dist/svg/icon-d.svg +369 -0
  6. package/dist/tui-image-editor.css +6 -0
  7. package/dist/tui-image-editor.js +62329 -0
  8. package/dist/tui-image-editor.min.css +5 -0
  9. package/dist/tui-image-editor.min.js +15 -0
  10. package/index.d.ts +334 -0
  11. package/package.json +52 -0
  12. package/src/css/buttons.styl +102 -0
  13. package/src/css/checkbox.styl +86 -0
  14. package/src/css/colorpicker.styl +98 -0
  15. package/src/css/gridtable.styl +45 -0
  16. package/src/css/icon.styl +44 -0
  17. package/src/css/index.styl +17 -0
  18. package/src/css/main.styl +163 -0
  19. package/src/css/position.styl +309 -0
  20. package/src/css/range.styl +91 -0
  21. package/src/css/submenu.styl +168 -0
  22. package/src/index.js +29 -0
  23. package/src/js/action.js +686 -0
  24. package/src/js/command/addIcon.js +42 -0
  25. package/src/js/command/addImageObject.js +34 -0
  26. package/src/js/command/addObject.js +43 -0
  27. package/src/js/command/addShape.js +51 -0
  28. package/src/js/command/addText.js +73 -0
  29. package/src/js/command/applyFilter.js +95 -0
  30. package/src/js/command/changeIconColor.js +48 -0
  31. package/src/js/command/changeSelection.js +31 -0
  32. package/src/js/command/changeShape.js +84 -0
  33. package/src/js/command/changeText.js +44 -0
  34. package/src/js/command/changeTextStyle.js +80 -0
  35. package/src/js/command/clearObjects.js +33 -0
  36. package/src/js/command/flip.js +36 -0
  37. package/src/js/command/loadImage.js +58 -0
  38. package/src/js/command/removeFilter.js +38 -0
  39. package/src/js/command/removeObject.js +37 -0
  40. package/src/js/command/resize.js +41 -0
  41. package/src/js/command/resizeCanvasDimension.js +40 -0
  42. package/src/js/command/rotate.js +64 -0
  43. package/src/js/command/setObjectPosition.js +50 -0
  44. package/src/js/command/setObjectProperties.js +55 -0
  45. package/src/js/component/cropper.js +407 -0
  46. package/src/js/component/filter.js +229 -0
  47. package/src/js/component/flip.js +146 -0
  48. package/src/js/component/freeDrawing.js +144 -0
  49. package/src/js/component/icon.js +246 -0
  50. package/src/js/component/imageLoader.js +84 -0
  51. package/src/js/component/line.js +205 -0
  52. package/src/js/component/resize.js +103 -0
  53. package/src/js/component/rotation.js +91 -0
  54. package/src/js/component/shape.js +601 -0
  55. package/src/js/component/text.js +572 -0
  56. package/src/js/component/zoom.js +708 -0
  57. package/src/js/consts.js +404 -0
  58. package/src/js/drawingMode/cropper.js +35 -0
  59. package/src/js/drawingMode/freeDrawing.js +36 -0
  60. package/src/js/drawingMode/icon.js +35 -0
  61. package/src/js/drawingMode/lineDrawing.js +36 -0
  62. package/src/js/drawingMode/resize.js +35 -0
  63. package/src/js/drawingMode/shape.js +35 -0
  64. package/src/js/drawingMode/text.js +35 -0
  65. package/src/js/drawingMode/zoom.js +37 -0
  66. package/src/js/extension/arrowLine.js +172 -0
  67. package/src/js/extension/blur.js +29 -0
  68. package/src/js/extension/colorFilter.js +104 -0
  69. package/src/js/extension/cropzone.js +568 -0
  70. package/src/js/extension/emboss.js +29 -0
  71. package/src/js/extension/mask.js +90 -0
  72. package/src/js/extension/sharpen.js +29 -0
  73. package/src/js/factory/command.js +36 -0
  74. package/src/js/factory/errorMessage.js +27 -0
  75. package/src/js/graphics.js +1539 -0
  76. package/src/js/helper/imagetracer.js +1396 -0
  77. package/src/js/helper/selectionModifyHelper.js +86 -0
  78. package/src/js/helper/shapeFilterFillHelper.js +564 -0
  79. package/src/js/helper/shapeResizeHelper.js +237 -0
  80. package/src/js/imageEditor.js +1795 -0
  81. package/src/js/interface/command.js +131 -0
  82. package/src/js/interface/component.js +127 -0
  83. package/src/js/interface/drawingMode.js +47 -0
  84. package/src/js/invoker.js +292 -0
  85. package/src/js/polyfill.js +498 -0
  86. package/src/js/ui/crop.js +139 -0
  87. package/src/js/ui/draw.js +187 -0
  88. package/src/js/ui/filter.js +510 -0
  89. package/src/js/ui/flip.js +87 -0
  90. package/src/js/ui/history.js +171 -0
  91. package/src/js/ui/icon.js +191 -0
  92. package/src/js/ui/locale/locale.js +19 -0
  93. package/src/js/ui/mask.js +96 -0
  94. package/src/js/ui/panelMenu.js +130 -0
  95. package/src/js/ui/resize.js +241 -0
  96. package/src/js/ui/rotate.js +123 -0
  97. package/src/js/ui/shape.js +265 -0
  98. package/src/js/ui/submenuBase.js +122 -0
  99. package/src/js/ui/template/controls.js +21 -0
  100. package/src/js/ui/template/mainContainer.js +38 -0
  101. package/src/js/ui/template/style.js +146 -0
  102. package/src/js/ui/template/submenu/crop.js +73 -0
  103. package/src/js/ui/template/submenu/draw.js +42 -0
  104. package/src/js/ui/template/submenu/filter.js +157 -0
  105. package/src/js/ui/template/submenu/flip.js +41 -0
  106. package/src/js/ui/template/submenu/history.js +22 -0
  107. package/src/js/ui/template/submenu/icon.js +108 -0
  108. package/src/js/ui/template/submenu/mask.js +30 -0
  109. package/src/js/ui/template/submenu/resize.js +54 -0
  110. package/src/js/ui/template/submenu/rotate.js +32 -0
  111. package/src/js/ui/template/submenu/shape.js +45 -0
  112. package/src/js/ui/template/submenu/text.js +67 -0
  113. package/src/js/ui/template/submenu/zoom.js +41 -0
  114. package/src/js/ui/text.js +279 -0
  115. package/src/js/ui/theme/standard.js +220 -0
  116. package/src/js/ui/theme/theme.js +249 -0
  117. package/src/js/ui/tools/colorpicker.js +250 -0
  118. package/src/js/ui/tools/range.js +390 -0
  119. package/src/js/ui.js +858 -0
  120. package/src/js/util.js +551 -0
  121. package/src/svg/default.svg +335 -0
  122. package/src/svg/icon-a/ic-apply.svg +6 -0
  123. package/src/svg/icon-a/ic-cancel.svg +6 -0
  124. package/src/svg/icon-a/ic-color-transparent-w.svg +12 -0
  125. package/src/svg/icon-a/ic-crop.svg +7 -0
  126. package/src/svg/icon-a/ic-delete-all.svg +6 -0
  127. package/src/svg/icon-a/ic-delete.svg +6 -0
  128. package/src/svg/icon-a/ic-draw-free.svg +5 -0
  129. package/src/svg/icon-a/ic-draw-line.svg +5 -0
  130. package/src/svg/icon-a/ic-draw.svg +6 -0
  131. package/src/svg/icon-a/ic-filter.svg +7 -0
  132. package/src/svg/icon-a/ic-flip-reset.svg +7 -0
  133. package/src/svg/icon-a/ic-flip-x.svg +6 -0
  134. package/src/svg/icon-a/ic-flip-y.svg +6 -0
  135. package/src/svg/icon-a/ic-flip.svg +6 -0
  136. package/src/svg/icon-a/ic-history-check.svg +5 -0
  137. package/src/svg/icon-a/ic-history-crop.svg +7 -0
  138. package/src/svg/icon-a/ic-history-delete.svg +9 -0
  139. package/src/svg/icon-a/ic-history-draw.svg +7 -0
  140. package/src/svg/icon-a/ic-history-filter.svg +8 -0
  141. package/src/svg/icon-a/ic-history-flip.svg +6 -0
  142. package/src/svg/icon-a/ic-history-group.svg +9 -0
  143. package/src/svg/icon-a/ic-history-icon.svg +6 -0
  144. package/src/svg/icon-a/ic-history-load.svg +7 -0
  145. package/src/svg/icon-a/ic-history-mask.svg +9 -0
  146. package/src/svg/icon-a/ic-history-resize.svg +12 -0
  147. package/src/svg/icon-a/ic-history-rotate.svg +16 -0
  148. package/src/svg/icon-a/ic-history-shape.svg +7 -0
  149. package/src/svg/icon-a/ic-history-text.svg +8 -0
  150. package/src/svg/icon-a/ic-history.svg +6 -0
  151. package/src/svg/icon-a/ic-icon-arrow-2.svg +5 -0
  152. package/src/svg/icon-a/ic-icon-arrow-3.svg +5 -0
  153. package/src/svg/icon-a/ic-icon-arrow.svg +5 -0
  154. package/src/svg/icon-a/ic-icon-bubble.svg +5 -0
  155. package/src/svg/icon-a/ic-icon-heart.svg +5 -0
  156. package/src/svg/icon-a/ic-icon-load.svg +8 -0
  157. package/src/svg/icon-a/ic-icon-location.svg +8 -0
  158. package/src/svg/icon-a/ic-icon-polygon.svg +5 -0
  159. package/src/svg/icon-a/ic-icon-star-2.svg +5 -0
  160. package/src/svg/icon-a/ic-icon-star.svg +5 -0
  161. package/src/svg/icon-a/ic-icon.svg +5 -0
  162. package/src/svg/icon-a/ic-mask-load.svg +8 -0
  163. package/src/svg/icon-a/ic-mask.svg +6 -0
  164. package/src/svg/icon-a/ic-redo.svg +7 -0
  165. package/src/svg/icon-a/ic-reset.svg +7 -0
  166. package/src/svg/icon-a/ic-resize.svg +13 -0
  167. package/src/svg/icon-a/ic-rotate-clockwise.svg +7 -0
  168. package/src/svg/icon-a/ic-rotate-counterclockwise.svg +7 -0
  169. package/src/svg/icon-a/ic-rotate.svg +7 -0
  170. package/src/svg/icon-a/ic-shape-circle.svg +5 -0
  171. package/src/svg/icon-a/ic-shape-rectangle.svg +5 -0
  172. package/src/svg/icon-a/ic-shape-triangle.svg +5 -0
  173. package/src/svg/icon-a/ic-shape.svg +6 -0
  174. package/src/svg/icon-a/ic-text-align-center.svg +6 -0
  175. package/src/svg/icon-a/ic-text-align-left.svg +6 -0
  176. package/src/svg/icon-a/ic-text-align-right.svg +6 -0
  177. package/src/svg/icon-a/ic-text-bold.svg +7 -0
  178. package/src/svg/icon-a/ic-text-italic.svg +6 -0
  179. package/src/svg/icon-a/ic-text-underline.svg +7 -0
  180. package/src/svg/icon-a/ic-text.svg +7 -0
  181. package/src/svg/icon-a/ic-undo.svg +7 -0
  182. package/src/svg/icon-a/ic-zoom-hand.svg +8 -0
  183. package/src/svg/icon-a/ic-zoom-zoom-in.svg +10 -0
  184. package/src/svg/icon-a/ic-zoom-zoom-out.svg +9 -0
  185. package/src/svg/icon-a/img-bi.svg +5 -0
  186. package/src/svg/icon-b/ic-apply.svg +6 -0
  187. package/src/svg/icon-b/ic-cancel.svg +6 -0
  188. package/src/svg/icon-b/ic-crop.svg +7 -0
  189. package/src/svg/icon-b/ic-delete-all.svg +6 -0
  190. package/src/svg/icon-b/ic-delete.svg +6 -0
  191. package/src/svg/icon-b/ic-draw-free.svg +5 -0
  192. package/src/svg/icon-b/ic-draw-line.svg +5 -0
  193. package/src/svg/icon-b/ic-draw.svg +6 -0
  194. package/src/svg/icon-b/ic-filter.svg +7 -0
  195. package/src/svg/icon-b/ic-flip-reset.svg +7 -0
  196. package/src/svg/icon-b/ic-flip-x.svg +6 -0
  197. package/src/svg/icon-b/ic-flip-y.svg +6 -0
  198. package/src/svg/icon-b/ic-flip.svg +6 -0
  199. package/src/svg/icon-b/ic-history-check.svg +5 -0
  200. package/src/svg/icon-b/ic-history-crop.svg +7 -0
  201. package/src/svg/icon-b/ic-history-delete.svg +9 -0
  202. package/src/svg/icon-b/ic-history-draw.svg +7 -0
  203. package/src/svg/icon-b/ic-history-filter.svg +8 -0
  204. package/src/svg/icon-b/ic-history-flip.svg +6 -0
  205. package/src/svg/icon-b/ic-history-group.svg +9 -0
  206. package/src/svg/icon-b/ic-history-icon.svg +6 -0
  207. package/src/svg/icon-b/ic-history-load.svg +7 -0
  208. package/src/svg/icon-b/ic-history-mask.svg +9 -0
  209. package/src/svg/icon-b/ic-history-resize.svg +12 -0
  210. package/src/svg/icon-b/ic-history-rotate.svg +16 -0
  211. package/src/svg/icon-b/ic-history-shape.svg +7 -0
  212. package/src/svg/icon-b/ic-history-text.svg +8 -0
  213. package/src/svg/icon-b/ic-history.svg +6 -0
  214. package/src/svg/icon-b/ic-icon-arrow-2.svg +5 -0
  215. package/src/svg/icon-b/ic-icon-arrow-3.svg +5 -0
  216. package/src/svg/icon-b/ic-icon-arrow.svg +5 -0
  217. package/src/svg/icon-b/ic-icon-bubble.svg +5 -0
  218. package/src/svg/icon-b/ic-icon-heart.svg +5 -0
  219. package/src/svg/icon-b/ic-icon-load.svg +8 -0
  220. package/src/svg/icon-b/ic-icon-location.svg +8 -0
  221. package/src/svg/icon-b/ic-icon-polygon.svg +5 -0
  222. package/src/svg/icon-b/ic-icon-star-2.svg +5 -0
  223. package/src/svg/icon-b/ic-icon-star.svg +5 -0
  224. package/src/svg/icon-b/ic-icon.svg +5 -0
  225. package/src/svg/icon-b/ic-mask-load.svg +8 -0
  226. package/src/svg/icon-b/ic-mask.svg +6 -0
  227. package/src/svg/icon-b/ic-redo.svg +7 -0
  228. package/src/svg/icon-b/ic-reset.svg +7 -0
  229. package/src/svg/icon-b/ic-resize.svg +13 -0
  230. package/src/svg/icon-b/ic-rotate-clockwise.svg +7 -0
  231. package/src/svg/icon-b/ic-rotate-counterclockwise.svg +7 -0
  232. package/src/svg/icon-b/ic-rotate.svg +7 -0
  233. package/src/svg/icon-b/ic-shape-circle.svg +5 -0
  234. package/src/svg/icon-b/ic-shape-rectangle.svg +5 -0
  235. package/src/svg/icon-b/ic-shape-triangle.svg +5 -0
  236. package/src/svg/icon-b/ic-shape.svg +6 -0
  237. package/src/svg/icon-b/ic-text-align-center.svg +6 -0
  238. package/src/svg/icon-b/ic-text-align-left.svg +6 -0
  239. package/src/svg/icon-b/ic-text-align-right.svg +6 -0
  240. package/src/svg/icon-b/ic-text-bold.svg +7 -0
  241. package/src/svg/icon-b/ic-text-italic.svg +6 -0
  242. package/src/svg/icon-b/ic-text-underline.svg +7 -0
  243. package/src/svg/icon-b/ic-text.svg +7 -0
  244. package/src/svg/icon-b/ic-undo.svg +7 -0
  245. package/src/svg/icon-b/ic-zoom-hand.svg +8 -0
  246. package/src/svg/icon-b/ic-zoom-zoom-in.svg +12 -0
  247. package/src/svg/icon-b/ic-zoom-zoom-out.svg +11 -0
  248. package/src/svg/icon-b/img-bi.svg +5 -0
  249. package/src/svg/icon-c/ic-apply.svg +6 -0
  250. package/src/svg/icon-c/ic-cancel.svg +6 -0
  251. package/src/svg/icon-c/ic-crop.svg +7 -0
  252. package/src/svg/icon-c/ic-delete-all.svg +6 -0
  253. package/src/svg/icon-c/ic-delete.svg +6 -0
  254. package/src/svg/icon-c/ic-draw-free.svg +5 -0
  255. package/src/svg/icon-c/ic-draw-line.svg +5 -0
  256. package/src/svg/icon-c/ic-draw.svg +6 -0
  257. package/src/svg/icon-c/ic-filter.svg +7 -0
  258. package/src/svg/icon-c/ic-flip-reset.svg +7 -0
  259. package/src/svg/icon-c/ic-flip-x.svg +6 -0
  260. package/src/svg/icon-c/ic-flip-y.svg +6 -0
  261. package/src/svg/icon-c/ic-flip.svg +6 -0
  262. package/src/svg/icon-c/ic-history-check.svg +5 -0
  263. package/src/svg/icon-c/ic-history-crop.svg +7 -0
  264. package/src/svg/icon-c/ic-history-delete.svg +9 -0
  265. package/src/svg/icon-c/ic-history-draw.svg +7 -0
  266. package/src/svg/icon-c/ic-history-filter.svg +8 -0
  267. package/src/svg/icon-c/ic-history-flip.svg +6 -0
  268. package/src/svg/icon-c/ic-history-group.svg +9 -0
  269. package/src/svg/icon-c/ic-history-icon.svg +6 -0
  270. package/src/svg/icon-c/ic-history-load.svg +7 -0
  271. package/src/svg/icon-c/ic-history-mask.svg +9 -0
  272. package/src/svg/icon-c/ic-history-resize.svg +12 -0
  273. package/src/svg/icon-c/ic-history-rotate.svg +16 -0
  274. package/src/svg/icon-c/ic-history-shape.svg +7 -0
  275. package/src/svg/icon-c/ic-history-text.svg +8 -0
  276. package/src/svg/icon-c/ic-history.svg +6 -0
  277. package/src/svg/icon-c/ic-icon-arrow-2.svg +5 -0
  278. package/src/svg/icon-c/ic-icon-arrow-3.svg +5 -0
  279. package/src/svg/icon-c/ic-icon-arrow.svg +5 -0
  280. package/src/svg/icon-c/ic-icon-bubble.svg +5 -0
  281. package/src/svg/icon-c/ic-icon-heart.svg +5 -0
  282. package/src/svg/icon-c/ic-icon-load.svg +8 -0
  283. package/src/svg/icon-c/ic-icon-location.svg +8 -0
  284. package/src/svg/icon-c/ic-icon-polygon.svg +5 -0
  285. package/src/svg/icon-c/ic-icon-star-2.svg +5 -0
  286. package/src/svg/icon-c/ic-icon-star.svg +5 -0
  287. package/src/svg/icon-c/ic-icon.svg +5 -0
  288. package/src/svg/icon-c/ic-mask-load.svg +8 -0
  289. package/src/svg/icon-c/ic-mask.svg +6 -0
  290. package/src/svg/icon-c/ic-redo.svg +7 -0
  291. package/src/svg/icon-c/ic-reset.svg +7 -0
  292. package/src/svg/icon-c/ic-resize.svg +13 -0
  293. package/src/svg/icon-c/ic-rotate-clockwise.svg +7 -0
  294. package/src/svg/icon-c/ic-rotate-counterclockwise.svg +7 -0
  295. package/src/svg/icon-c/ic-rotate.svg +7 -0
  296. package/src/svg/icon-c/ic-shape-circle.svg +5 -0
  297. package/src/svg/icon-c/ic-shape-rectangle.svg +5 -0
  298. package/src/svg/icon-c/ic-shape-triangle.svg +5 -0
  299. package/src/svg/icon-c/ic-shape.svg +6 -0
  300. package/src/svg/icon-c/ic-text-align-center.svg +6 -0
  301. package/src/svg/icon-c/ic-text-align-left.svg +6 -0
  302. package/src/svg/icon-c/ic-text-align-right.svg +6 -0
  303. package/src/svg/icon-c/ic-text-bold.svg +7 -0
  304. package/src/svg/icon-c/ic-text-italic.svg +6 -0
  305. package/src/svg/icon-c/ic-text-underline.svg +7 -0
  306. package/src/svg/icon-c/ic-text.svg +7 -0
  307. package/src/svg/icon-c/ic-undo.svg +7 -0
  308. package/src/svg/icon-c/ic-zoom-hand.svg +8 -0
  309. package/src/svg/icon-c/ic-zoom-zoom-in.svg +12 -0
  310. package/src/svg/icon-c/ic-zoom-zoom-out.svg +11 -0
  311. package/src/svg/icon-c/img-bi.svg +5 -0
  312. package/src/svg/icon-d/ic-apply.svg +6 -0
  313. package/src/svg/icon-d/ic-cancel.svg +6 -0
  314. package/src/svg/icon-d/ic-crop.svg +7 -0
  315. package/src/svg/icon-d/ic-delete-all.svg +6 -0
  316. package/src/svg/icon-d/ic-delete.svg +6 -0
  317. package/src/svg/icon-d/ic-draw-free.svg +5 -0
  318. package/src/svg/icon-d/ic-draw-line.svg +5 -0
  319. package/src/svg/icon-d/ic-draw.svg +6 -0
  320. package/src/svg/icon-d/ic-filter.svg +7 -0
  321. package/src/svg/icon-d/ic-flip-reset.svg +7 -0
  322. package/src/svg/icon-d/ic-flip-x.svg +6 -0
  323. package/src/svg/icon-d/ic-flip-y.svg +6 -0
  324. package/src/svg/icon-d/ic-flip.svg +6 -0
  325. package/src/svg/icon-d/ic-history-check.svg +5 -0
  326. package/src/svg/icon-d/ic-history-crop.svg +7 -0
  327. package/src/svg/icon-d/ic-history-delete.svg +9 -0
  328. package/src/svg/icon-d/ic-history-draw.svg +7 -0
  329. package/src/svg/icon-d/ic-history-filter.svg +8 -0
  330. package/src/svg/icon-d/ic-history-flip.svg +6 -0
  331. package/src/svg/icon-d/ic-history-group.svg +9 -0
  332. package/src/svg/icon-d/ic-history-icon.svg +6 -0
  333. package/src/svg/icon-d/ic-history-load.svg +7 -0
  334. package/src/svg/icon-d/ic-history-mask.svg +9 -0
  335. package/src/svg/icon-d/ic-history-resize.svg +12 -0
  336. package/src/svg/icon-d/ic-history-rotate.svg +16 -0
  337. package/src/svg/icon-d/ic-history-shape.svg +7 -0
  338. package/src/svg/icon-d/ic-history-text.svg +8 -0
  339. package/src/svg/icon-d/ic-history.svg +6 -0
  340. package/src/svg/icon-d/ic-icon-arrow-2.svg +5 -0
  341. package/src/svg/icon-d/ic-icon-arrow-3.svg +5 -0
  342. package/src/svg/icon-d/ic-icon-arrow.svg +5 -0
  343. package/src/svg/icon-d/ic-icon-bubble.svg +5 -0
  344. package/src/svg/icon-d/ic-icon-heart.svg +5 -0
  345. package/src/svg/icon-d/ic-icon-load.svg +8 -0
  346. package/src/svg/icon-d/ic-icon-location.svg +8 -0
  347. package/src/svg/icon-d/ic-icon-polygon.svg +5 -0
  348. package/src/svg/icon-d/ic-icon-star-2.svg +5 -0
  349. package/src/svg/icon-d/ic-icon-star.svg +5 -0
  350. package/src/svg/icon-d/ic-icon.svg +5 -0
  351. package/src/svg/icon-d/ic-mask-load.svg +8 -0
  352. package/src/svg/icon-d/ic-mask.svg +6 -0
  353. package/src/svg/icon-d/ic-redo.svg +7 -0
  354. package/src/svg/icon-d/ic-reset.svg +7 -0
  355. package/src/svg/icon-d/ic-resize.svg +13 -0
  356. package/src/svg/icon-d/ic-rotate-clockwise.svg +7 -0
  357. package/src/svg/icon-d/ic-rotate-counterclockwise.svg +7 -0
  358. package/src/svg/icon-d/ic-rotate.svg +7 -0
  359. package/src/svg/icon-d/ic-shape-circle.svg +5 -0
  360. package/src/svg/icon-d/ic-shape-rectangle.svg +5 -0
  361. package/src/svg/icon-d/ic-shape-triangle.svg +5 -0
  362. package/src/svg/icon-d/ic-shape.svg +6 -0
  363. package/src/svg/icon-d/ic-text-align-center.svg +6 -0
  364. package/src/svg/icon-d/ic-text-align-left.svg +6 -0
  365. package/src/svg/icon-d/ic-text-align-right.svg +6 -0
  366. package/src/svg/icon-d/ic-text-bold.svg +7 -0
  367. package/src/svg/icon-d/ic-text-italic.svg +6 -0
  368. package/src/svg/icon-d/ic-text-underline.svg +7 -0
  369. package/src/svg/icon-d/ic-text.svg +7 -0
  370. package/src/svg/icon-d/ic-undo.svg +7 -0
  371. package/src/svg/icon-d/ic-zoom-hand.svg +8 -0
  372. package/src/svg/icon-d/ic-zoom-zoom-in.svg +12 -0
  373. package/src/svg/icon-d/ic-zoom-zoom-out.svg +11 -0
  374. package/src/svg/icon-d/img-bi.svg +5 -0
@@ -0,0 +1,686 @@
1
+ import extend from 'tui-code-snippet/object/extend';
2
+ import Imagetracer from '@/helper/imagetracer';
3
+ import { isSupportFileApi, base64ToBlob, toInteger, isEmptyCropzone, includes } from '@/util';
4
+ import { eventNames, historyNames, drawingModes, drawingMenuNames, zoomModes } from '@/consts';
5
+
6
+ export default {
7
+ /**
8
+ * Get ui actions
9
+ * @returns {Object} actions for ui
10
+ * @private
11
+ */
12
+ getActions() {
13
+ return {
14
+ main: this._mainAction(),
15
+ shape: this._shapeAction(),
16
+ crop: this._cropAction(),
17
+ resize: this._resizeAction(),
18
+ flip: this._flipAction(),
19
+ rotate: this._rotateAction(),
20
+ text: this._textAction(),
21
+ mask: this._maskAction(),
22
+ draw: this._drawAction(),
23
+ icon: this._iconAction(),
24
+ filter: this._filterAction(),
25
+ history: this._historyAction(),
26
+ };
27
+ },
28
+
29
+ /**
30
+ * Main Action
31
+ * @returns {Object} actions for ui main
32
+ * @private
33
+ */
34
+ _mainAction() {
35
+ const exitCropOnAction = () => {
36
+ if (this.ui.submenu === 'crop') {
37
+ this.stopDrawingMode();
38
+ this.ui.changeMenu('crop');
39
+ }
40
+ };
41
+ const setAngleRangeBarOnAction = (angle) => {
42
+ if (this.ui.submenu === 'rotate') {
43
+ this.ui.rotate.setRangeBarAngle('setAngle', angle);
44
+ }
45
+ };
46
+ const setFilterStateRangeBarOnAction = (filterOptions) => {
47
+ if (this.ui.submenu === 'filter') {
48
+ this.ui.filter.setFilterState(filterOptions);
49
+ }
50
+ };
51
+ const onEndUndoRedo = (result) => {
52
+ setAngleRangeBarOnAction(result);
53
+ setFilterStateRangeBarOnAction(result);
54
+
55
+ return result;
56
+ };
57
+ const toggleZoomMode = () => {
58
+ const zoomMode = this._graphics.getZoomMode();
59
+
60
+ this.stopDrawingMode();
61
+ if (zoomMode !== zoomModes.ZOOM) {
62
+ this.startDrawingMode(drawingModes.ZOOM);
63
+ this._graphics.startZoomInMode();
64
+ } else {
65
+ this._graphics.endZoomInMode();
66
+ }
67
+ };
68
+ const toggleHandMode = () => {
69
+ const zoomMode = this._graphics.getZoomMode();
70
+
71
+ this.stopDrawingMode();
72
+ if (zoomMode !== zoomModes.HAND) {
73
+ this.startDrawingMode(drawingModes.ZOOM);
74
+ this._graphics.startHandMode();
75
+ } else {
76
+ this._graphics.endHandMode();
77
+ }
78
+ };
79
+ const initFilterState = () => {
80
+ if (this.ui.filter) {
81
+ this.ui.filter.initFilterCheckBoxState();
82
+ }
83
+ };
84
+
85
+ return extend(
86
+ {
87
+ initLoadImage: (imagePath, imageName) =>
88
+ this.loadImageFromURL(imagePath, imageName).then((sizeValue) => {
89
+ exitCropOnAction();
90
+ this.ui.initializeImgUrl = imagePath;
91
+ this.ui.resizeEditor({ imageSize: sizeValue });
92
+ this.clearUndoStack();
93
+ this._invoker.fire(eventNames.EXECUTE_COMMAND, historyNames.LOAD_IMAGE);
94
+ }),
95
+ undo: () => {
96
+ if (!this.isEmptyUndoStack()) {
97
+ exitCropOnAction();
98
+ this.deactivateAll();
99
+ this.undo().then(onEndUndoRedo);
100
+ }
101
+ },
102
+ redo: () => {
103
+ if (!this.isEmptyRedoStack()) {
104
+ exitCropOnAction();
105
+ this.deactivateAll();
106
+ this.redo().then(onEndUndoRedo);
107
+ }
108
+ },
109
+ reset: () => {
110
+ exitCropOnAction();
111
+ this.loadImageFromURL(this.ui.initializeImgUrl, 'resetImage').then((sizeValue) => {
112
+ exitCropOnAction();
113
+ initFilterState();
114
+ this.ui.resizeEditor({ imageSize: sizeValue });
115
+ this.clearUndoStack();
116
+ this._initHistory();
117
+ });
118
+ },
119
+ delete: () => {
120
+ this.ui.changeHelpButtonEnabled('delete', false);
121
+ exitCropOnAction();
122
+ this.removeActiveObject();
123
+ this.activeObjectId = null;
124
+ },
125
+ deleteAll: () => {
126
+ exitCropOnAction();
127
+ this.clearObjects();
128
+ this.ui.changeHelpButtonEnabled('delete', false);
129
+ this.ui.changeHelpButtonEnabled('deleteAll', false);
130
+ },
131
+ load: (file) => {
132
+ if (!isSupportFileApi()) {
133
+ alert('This browser does not support file-api');
134
+ }
135
+
136
+ this.ui.initializeImgUrl = URL.createObjectURL(file);
137
+ this.loadImageFromFile(file)
138
+ .then((sizeValue) => {
139
+ exitCropOnAction();
140
+ initFilterState();
141
+ this.clearUndoStack();
142
+ this.ui.activeMenuEvent();
143
+ this.ui.resizeEditor({ imageSize: sizeValue });
144
+ this._clearHistory();
145
+ this._invoker.fire(eventNames.EXECUTE_COMMAND, historyNames.LOAD_IMAGE);
146
+ })
147
+ ['catch']((message) => Promise.reject(message));
148
+ },
149
+ download: () => {
150
+ const dataURL = this.toDataURL();
151
+ let imageName = this.getImageName();
152
+ let blob, type, w;
153
+
154
+ if (isSupportFileApi() && window.saveAs) {
155
+ blob = base64ToBlob(dataURL);
156
+ type = blob.type.split('/')[1];
157
+ if (imageName.split('.').pop() !== type) {
158
+ imageName += `.${type}`;
159
+ }
160
+ saveAs(blob, imageName); // eslint-disable-line
161
+ } else {
162
+ w = window.open();
163
+ w.document.body.innerHTML = `<img src='${dataURL}'>`;
164
+ }
165
+ },
166
+ history: (event) => {
167
+ this.ui.toggleHistoryMenu(event);
168
+ },
169
+ zoomIn: () => {
170
+ this.ui.toggleZoomButtonStatus('zoomIn');
171
+ this.deactivateAll();
172
+ toggleZoomMode();
173
+ },
174
+ zoomOut: () => {
175
+ this._graphics.zoomOut();
176
+ },
177
+ hand: () => {
178
+ this.ui.offZoomInButtonStatus();
179
+ this.ui.toggleZoomButtonStatus('hand');
180
+ this.deactivateAll();
181
+ toggleHandMode();
182
+ },
183
+ },
184
+ this._commonAction()
185
+ );
186
+ },
187
+
188
+ /**
189
+ * Icon Action
190
+ * @returns {Object} actions for ui icon
191
+ * @private
192
+ */
193
+ _iconAction() {
194
+ return extend(
195
+ {
196
+ changeColor: (color) => {
197
+ if (this.activeObjectId) {
198
+ this.changeIconColor(this.activeObjectId, color);
199
+ }
200
+ },
201
+ addIcon: (iconType, iconColor) => {
202
+ this.startDrawingMode('ICON');
203
+ this.setDrawingIcon(iconType, iconColor);
204
+ },
205
+ cancelAddIcon: () => {
206
+ this.ui.icon.clearIconType();
207
+ this.changeSelectableAll(true);
208
+ this.changeCursor('default');
209
+ this.stopDrawingMode();
210
+ },
211
+ registerDefaultIcons: (type, path) => {
212
+ const iconObj = {};
213
+ iconObj[type] = path;
214
+ this.registerIcons(iconObj);
215
+ },
216
+ registerCustomIcon: (imgUrl, file) => {
217
+ const imagetracer = new Imagetracer();
218
+ imagetracer.imageToSVG(
219
+ imgUrl,
220
+ (svgstr) => {
221
+ const [, svgPath] = svgstr.match(/path[^>]*d="([^"]*)"/);
222
+ const iconObj = {};
223
+ iconObj[file.name] = svgPath;
224
+ this.registerIcons(iconObj);
225
+ this.addIcon(file.name, {
226
+ left: 100,
227
+ top: 100,
228
+ });
229
+ },
230
+ Imagetracer.tracerDefaultOption()
231
+ );
232
+ },
233
+ },
234
+ this._commonAction()
235
+ );
236
+ },
237
+
238
+ /**
239
+ * Draw Action
240
+ * @returns {Object} actions for ui draw
241
+ * @private
242
+ */
243
+ _drawAction() {
244
+ return extend(
245
+ {
246
+ setDrawMode: (type, settings) => {
247
+ this.stopDrawingMode();
248
+ if (type === 'free') {
249
+ this.startDrawingMode('FREE_DRAWING', settings);
250
+ } else {
251
+ this.startDrawingMode('LINE_DRAWING', settings);
252
+ }
253
+ },
254
+ setColor: (color) => {
255
+ this.setBrush({
256
+ color,
257
+ });
258
+ },
259
+ },
260
+ this._commonAction()
261
+ );
262
+ },
263
+
264
+ /**
265
+ * Mask Action
266
+ * @returns {Object} actions for ui mask
267
+ * @private
268
+ */
269
+ _maskAction() {
270
+ return extend(
271
+ {
272
+ loadImageFromURL: (imgUrl, file) => {
273
+ return this.loadImageFromURL(this.toDataURL(), 'FilterImage').then(() => {
274
+ this.addImageObject(imgUrl).then(() => {
275
+ URL.revokeObjectURL(file);
276
+ });
277
+ this._invoker.fire(eventNames.EXECUTE_COMMAND, historyNames.LOAD_MASK_IMAGE);
278
+ });
279
+ },
280
+ applyFilter: () => {
281
+ this.applyFilter('mask', {
282
+ maskObjId: this.activeObjectId,
283
+ });
284
+ },
285
+ },
286
+ this._commonAction()
287
+ );
288
+ },
289
+
290
+ /**
291
+ * Text Action
292
+ * @returns {Object} actions for ui text
293
+ * @private
294
+ */
295
+ _textAction() {
296
+ return extend(
297
+ {
298
+ changeTextStyle: (styleObj, isSilent) => {
299
+ if (this.activeObjectId) {
300
+ this.changeTextStyle(this.activeObjectId, styleObj, isSilent);
301
+ }
302
+ },
303
+ },
304
+ this._commonAction()
305
+ );
306
+ },
307
+
308
+ /**
309
+ * Rotate Action
310
+ * @returns {Object} actions for ui rotate
311
+ * @private
312
+ */
313
+ _rotateAction() {
314
+ return extend(
315
+ {
316
+ rotate: (angle, isSilent) => {
317
+ this.rotate(angle, isSilent);
318
+ this.ui.resizeEditor();
319
+ this.ui.rotate.setRangeBarAngle('rotate', angle);
320
+ },
321
+ setAngle: (angle, isSilent) => {
322
+ this.setAngle(angle, isSilent);
323
+ this.ui.resizeEditor();
324
+ this.ui.rotate.setRangeBarAngle('setAngle', angle);
325
+ },
326
+ },
327
+ this._commonAction()
328
+ );
329
+ },
330
+
331
+ /**
332
+ * Shape Action
333
+ * @returns {Object} actions for ui shape
334
+ * @private
335
+ */
336
+ _shapeAction() {
337
+ return extend(
338
+ {
339
+ changeShape: (changeShapeObject, isSilent) => {
340
+ if (this.activeObjectId) {
341
+ this.changeShape(this.activeObjectId, changeShapeObject, isSilent);
342
+ }
343
+ },
344
+ setDrawingShape: (shapeType) => {
345
+ this.setDrawingShape(shapeType);
346
+ },
347
+ },
348
+ this._commonAction()
349
+ );
350
+ },
351
+
352
+ /**
353
+ * Crop Action
354
+ * @returns {Object} actions for ui crop
355
+ * @private
356
+ */
357
+ _cropAction() {
358
+ return extend(
359
+ {
360
+ crop: () => {
361
+ const cropRect = this.getCropzoneRect();
362
+ if (cropRect && !isEmptyCropzone(cropRect)) {
363
+ this.crop(cropRect)
364
+ .then(() => {
365
+ this.stopDrawingMode();
366
+ this.ui.resizeEditor();
367
+ this.ui.changeMenu('crop');
368
+ this._invoker.fire(eventNames.EXECUTE_COMMAND, historyNames.CROP);
369
+ })
370
+ ['catch']((message) => Promise.reject(message));
371
+ }
372
+ },
373
+ cancel: () => {
374
+ this.stopDrawingMode();
375
+ this.ui.changeMenu('crop');
376
+ },
377
+ /* eslint-disable */
378
+ preset: (presetType) => {
379
+ switch (presetType) {
380
+ case 'preset-square':
381
+ this.setCropzoneRect(1 / 1);
382
+ break;
383
+ case 'preset-3-2':
384
+ this.setCropzoneRect(3 / 2);
385
+ break;
386
+ case 'preset-4-3':
387
+ this.setCropzoneRect(4 / 3);
388
+ break;
389
+ case 'preset-5-4':
390
+ this.setCropzoneRect(5 / 4);
391
+ break;
392
+ case 'preset-7-5':
393
+ this.setCropzoneRect(7 / 5);
394
+ break;
395
+ case 'preset-16-9':
396
+ this.setCropzoneRect(16 / 9);
397
+ break;
398
+ default:
399
+ this.setCropzoneRect();
400
+ this.ui.crop.changeApplyButtonStatus(false);
401
+ break;
402
+ }
403
+ },
404
+ },
405
+ this._commonAction()
406
+ );
407
+ },
408
+
409
+ /**
410
+ * Resize Action
411
+ * @returns {Object} actions for ui resize
412
+ * @private
413
+ */
414
+ _resizeAction() {
415
+ return extend(
416
+ {
417
+ getCurrentDimensions: () => this._graphics.getCurrentDimensions(),
418
+ preview: (actor, value, lockState) => {
419
+ const currentDimensions = this._graphics.getCurrentDimensions();
420
+ const calcAspectRatio = () => currentDimensions.width / currentDimensions.height;
421
+
422
+ let dimensions = {};
423
+ switch (actor) {
424
+ case 'width':
425
+ dimensions.width = value;
426
+ if (lockState) {
427
+ dimensions.height = value / calcAspectRatio();
428
+ } else {
429
+ dimensions.height = currentDimensions.height;
430
+ }
431
+ break;
432
+ case 'height':
433
+ dimensions.height = value;
434
+ if (lockState) {
435
+ dimensions.width = value * calcAspectRatio();
436
+ } else {
437
+ dimensions.width = currentDimensions.width;
438
+ }
439
+ break;
440
+ default:
441
+ dimensions = currentDimensions;
442
+ }
443
+
444
+ this._graphics.resize(dimensions).then(() => {
445
+ this.ui.resizeEditor();
446
+ });
447
+
448
+ if (lockState) {
449
+ this.ui.resize.setWidthValue(dimensions.width);
450
+ this.ui.resize.setHeightValue(dimensions.height);
451
+ }
452
+ },
453
+ resize: (dimensions = null) => {
454
+ if (!dimensions) {
455
+ dimensions = this._graphics.getCurrentDimensions();
456
+ }
457
+
458
+ this.resize(dimensions)
459
+ .then(() => {
460
+ this._graphics.setOriginalDimensions(dimensions);
461
+ this.stopDrawingMode();
462
+ this.ui.resizeEditor();
463
+ this.ui.changeMenu('resize');
464
+ })
465
+ ['catch']((message) => Promise.reject(message));
466
+ },
467
+ reset: (standByMode = false) => {
468
+ const dimensions = this._graphics.getOriginalDimensions();
469
+
470
+ this.ui.resize.setWidthValue(dimensions.width, true);
471
+ this.ui.resize.setHeightValue(dimensions.height, true);
472
+
473
+ this._graphics.resize(dimensions).then(() => {
474
+ if (!standByMode) {
475
+ this.stopDrawingMode();
476
+ this.ui.resizeEditor();
477
+ this.ui.changeMenu('resize');
478
+ }
479
+ });
480
+ },
481
+ },
482
+ this._commonAction()
483
+ );
484
+ },
485
+
486
+ /**
487
+ * Flip Action
488
+ * @returns {Object} actions for ui flip
489
+ * @private
490
+ */
491
+ _flipAction() {
492
+ return extend(
493
+ {
494
+ flip: (flipType) => this[flipType](),
495
+ },
496
+ this._commonAction()
497
+ );
498
+ },
499
+
500
+ /**
501
+ * Filter Action
502
+ * @returns {Object} actions for ui filter
503
+ * @private
504
+ */
505
+ _filterAction() {
506
+ return extend(
507
+ {
508
+ applyFilter: (applying, type, options, isSilent) => {
509
+ if (applying) {
510
+ this.applyFilter(type, options, isSilent);
511
+ } else if (this.hasFilter(type)) {
512
+ this.removeFilter(type);
513
+ }
514
+ },
515
+ },
516
+ this._commonAction()
517
+ );
518
+ },
519
+
520
+ /**
521
+ * Image Editor Event Observer
522
+ */
523
+ setReAction() {
524
+ this.on({
525
+ undoStackChanged: (length) => {
526
+ if (length) {
527
+ this.ui.changeHelpButtonEnabled('undo', true);
528
+ this.ui.changeHelpButtonEnabled('reset', true);
529
+ } else {
530
+ this.ui.changeHelpButtonEnabled('undo', false);
531
+ this.ui.changeHelpButtonEnabled('reset', false);
532
+ }
533
+ this.ui.resizeEditor();
534
+ },
535
+ redoStackChanged: (length) => {
536
+ if (length) {
537
+ this.ui.changeHelpButtonEnabled('redo', true);
538
+ } else {
539
+ this.ui.changeHelpButtonEnabled('redo', false);
540
+ }
541
+ this.ui.resizeEditor();
542
+ },
543
+ /* eslint-disable complexity */
544
+ objectActivated: (obj) => {
545
+ this.activeObjectId = obj.id;
546
+
547
+ this.ui.changeHelpButtonEnabled('delete', true);
548
+ this.ui.changeHelpButtonEnabled('deleteAll', true);
549
+
550
+ if (obj.type === 'cropzone') {
551
+ this.ui.crop.changeApplyButtonStatus(true);
552
+ } else if (['rect', 'circle', 'triangle'].indexOf(obj.type) > -1) {
553
+ this.stopDrawingMode();
554
+ if (this.ui.submenu !== 'shape') {
555
+ this.ui.changeMenu('shape', false, false);
556
+ }
557
+ this.ui.shape.setShapeStatus({
558
+ strokeColor: obj.stroke,
559
+ strokeWidth: obj.strokeWidth,
560
+ fillColor: obj.fill,
561
+ });
562
+
563
+ this.ui.shape.setMaxStrokeValue(Math.min(obj.width, obj.height));
564
+ } else if (obj.type === 'path' || obj.type === 'line') {
565
+ if (this.ui.submenu !== 'draw') {
566
+ this.ui.changeMenu('draw', false, false);
567
+ this.ui.draw.changeStandbyMode();
568
+ }
569
+ } else if (['i-text', 'text'].indexOf(obj.type) > -1) {
570
+ if (this.ui.submenu !== 'text') {
571
+ this.ui.changeMenu('text', false, false);
572
+ }
573
+
574
+ this.ui.text.setTextStyleStateOnAction(obj);
575
+ } else if (obj.type === 'icon') {
576
+ this.stopDrawingMode();
577
+ if (this.ui.submenu !== 'icon') {
578
+ this.ui.changeMenu('icon', false, false);
579
+ }
580
+ this.ui.icon.setIconPickerColor(obj.fill);
581
+ }
582
+ },
583
+ /* eslint-enable complexity */
584
+ addText: (pos) => {
585
+ const { textColor: fill, fontSize, fontStyle, fontWeight, underline } = this.ui.text;
586
+ const fontFamily = 'Noto Sans';
587
+
588
+ this.addText('Double Click', {
589
+ position: pos.originPosition,
590
+ styles: { fill, fontSize, fontFamily, fontStyle, fontWeight, underline },
591
+ }).then(() => {
592
+ this.changeCursor('default');
593
+ });
594
+ },
595
+ addObjectAfter: (obj) => {
596
+ if (obj.type === 'icon') {
597
+ this.ui.icon.changeStandbyMode();
598
+ } else if (['rect', 'circle', 'triangle'].indexOf(obj.type) > -1) {
599
+ this.ui.shape.setMaxStrokeValue(Math.min(obj.width, obj.height));
600
+ this.ui.shape.changeStandbyMode();
601
+ }
602
+ },
603
+ objectScaled: (obj) => {
604
+ if (['i-text', 'text'].indexOf(obj.type) > -1) {
605
+ this.ui.text.fontSize = toInteger(obj.fontSize);
606
+ } else if (['rect', 'circle', 'triangle'].indexOf(obj.type) >= 0) {
607
+ const { width, height } = obj;
608
+ const strokeValue = this.ui.shape.getStrokeValue();
609
+
610
+ if (width < strokeValue) {
611
+ this.ui.shape.setStrokeValue(width);
612
+ }
613
+ if (height < strokeValue) {
614
+ this.ui.shape.setStrokeValue(height);
615
+ }
616
+ }
617
+ },
618
+ selectionCleared: () => {
619
+ this.activeObjectId = null;
620
+ if (this.ui.submenu === 'text') {
621
+ this.changeCursor('text');
622
+ } else if (!includes(['draw', 'crop', 'resize'], this.ui.submenu)) {
623
+ this.stopDrawingMode();
624
+ }
625
+ },
626
+ });
627
+ },
628
+
629
+ /**
630
+ * History Action
631
+ * @returns {Object} history actions for ui
632
+ * @private
633
+ */
634
+ _historyAction() {
635
+ return {
636
+ undo: (count) => this.undo(count),
637
+ redo: (count) => this.redo(count),
638
+ };
639
+ },
640
+
641
+ /**
642
+ * Common Action
643
+ * @returns {Object} common actions for ui
644
+ * @private
645
+ */
646
+ _commonAction() {
647
+ const { TEXT, CROPPER, SHAPE, ZOOM, RESIZE } = drawingModes;
648
+
649
+ return {
650
+ modeChange: (menu) => {
651
+ switch (menu) {
652
+ case drawingMenuNames.TEXT:
653
+ this._changeActivateMode(TEXT);
654
+ break;
655
+ case drawingMenuNames.CROP:
656
+ this.startDrawingMode(CROPPER);
657
+ break;
658
+ case drawingMenuNames.SHAPE:
659
+ this._changeActivateMode(SHAPE);
660
+ this.setDrawingShape(this.ui.shape.type, this.ui.shape.options);
661
+ break;
662
+ case drawingMenuNames.ZOOM:
663
+ this.startDrawingMode(ZOOM);
664
+ break;
665
+ case drawingMenuNames.RESIZE:
666
+ this.startDrawingMode(RESIZE);
667
+ break;
668
+ default:
669
+ break;
670
+ }
671
+ },
672
+ deactivateAll: this.deactivateAll.bind(this),
673
+ changeSelectableAll: this.changeSelectableAll.bind(this),
674
+ discardSelection: this.discardSelection.bind(this),
675
+ stopDrawingMode: this.stopDrawingMode.bind(this),
676
+ };
677
+ },
678
+
679
+ /**
680
+ * Mixin
681
+ * @param {ImageEditor} ImageEditor instance
682
+ */
683
+ mixin(ImageEditor) {
684
+ extend(ImageEditor.prototype, this);
685
+ },
686
+ };