fabric 5.3.0 → 6.0.0-beta1

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 (533) hide show
  1. package/.babelrc +11 -0
  2. package/.babelrcAlt +19 -0
  3. package/.browserslistrc +5 -0
  4. package/.eslintrc.js +43 -0
  5. package/.eslintrc.json +38 -46
  6. package/.eslintrc_tests +12 -0
  7. package/.gitattributes +2 -0
  8. package/.prettierignore +16 -0
  9. package/.prettierrc +4 -0
  10. package/CHANGELOG.md +491 -189
  11. package/CONTRIBUTING.md +226 -58
  12. package/README.md +188 -239
  13. package/bower.json +1 -3
  14. package/dist/fabric.d.ts +1021 -0
  15. package/dist/index.cjs +28027 -0
  16. package/dist/index.cjs.map +1 -0
  17. package/dist/index.d.ts +2 -0
  18. package/dist/index.min.js +1 -0
  19. package/dist/index.mjs +27964 -0
  20. package/dist/index.mjs.map +1 -0
  21. package/dist/index.node.cjs +28092 -0
  22. package/dist/index.node.cjs.map +1 -0
  23. package/dist/index.node.d.ts +15 -0
  24. package/dist/index.node.mjs +28035 -0
  25. package/dist/index.node.mjs.map +1 -0
  26. package/dist/src/Collection.d.ts +126 -0
  27. package/dist/src/CommonMethods.d.ts +32 -0
  28. package/dist/src/EventTypeDefs.d.ts +226 -0
  29. package/dist/src/Intersection.d.ts +100 -0
  30. package/dist/src/Observable.d.ts +54 -0
  31. package/dist/src/Pattern.d.ts +104 -0
  32. package/dist/src/Point.d.ts +232 -0
  33. package/dist/src/Shadow.d.ts +87 -0
  34. package/dist/src/brushes/BaseBrush.d.ts +105 -0
  35. package/dist/src/brushes/CircleBrush.d.ts +49 -0
  36. package/dist/src/brushes/PatternBrush.d.ts +23 -0
  37. package/dist/src/brushes/PencilBrush.d.ts +92 -0
  38. package/dist/src/brushes/SprayBrush.d.ts +79 -0
  39. package/dist/src/cache.d.ts +46 -0
  40. package/dist/src/canvas/Canvas.d.ts +567 -0
  41. package/dist/src/canvas/SelectableCanvas.d.ts +723 -0
  42. package/dist/src/canvas/StaticCanvas.d.ts +751 -0
  43. package/dist/src/canvas/TextEditingManager.d.ts +17 -0
  44. package/dist/src/canvas/canvas_gestures.mixin.d.ts +2 -0
  45. package/dist/src/color/Color.d.ts +174 -0
  46. package/dist/src/color/color_map.d.ts +155 -0
  47. package/dist/src/color/constants.d.ts +22 -0
  48. package/dist/src/color/util.d.ts +12 -0
  49. package/dist/src/config.d.ts +115 -0
  50. package/dist/src/constants.d.ts +14 -0
  51. package/dist/src/controls/Control.d.ts +228 -0
  52. package/dist/src/controls/changeWidth.d.ts +13 -0
  53. package/dist/src/controls/controls.render.d.ts +29 -0
  54. package/dist/src/controls/default_controls.d.ts +50 -0
  55. package/dist/src/controls/drag.d.ts +12 -0
  56. package/dist/src/controls/polyControl.d.ts +5 -0
  57. package/dist/src/controls/rotate.d.ts +12 -0
  58. package/dist/src/controls/scale.d.ts +47 -0
  59. package/dist/src/controls/scaleSkew.d.ts +39 -0
  60. package/dist/src/controls/skew.d.ts +33 -0
  61. package/dist/src/controls/util.d.ts +41 -0
  62. package/dist/src/controls/wrapWithFireEvent.d.ts +8 -0
  63. package/dist/src/controls/wrapWithFixedAnchor.d.ts +9 -0
  64. package/dist/src/env/browser.d.ts +3 -0
  65. package/dist/src/env/index.d.ts +7 -0
  66. package/dist/src/env/node.d.ts +3 -0
  67. package/dist/src/env/types.d.ts +15 -0
  68. package/dist/src/filters/BaseFilter.d.ts +156 -0
  69. package/dist/src/filters/BlendColor.d.ts +80 -0
  70. package/dist/src/filters/BlendImage.d.ts +90 -0
  71. package/dist/src/filters/Blur.d.ts +50 -0
  72. package/dist/src/filters/Boilerplate.d.ts +46 -0
  73. package/dist/src/filters/Brightness.d.ts +46 -0
  74. package/dist/src/filters/Canvas2dFilterBackend.d.ts +27 -0
  75. package/dist/src/filters/ColorMatrix.d.ts +62 -0
  76. package/dist/src/filters/ColorMatrixFilters.d.ts +1169 -0
  77. package/dist/src/filters/Composed.d.ts +47 -0
  78. package/dist/src/filters/Contrast.d.ts +44 -0
  79. package/dist/src/filters/Convolute.d.ts +82 -0
  80. package/dist/src/filters/FilterBackend.d.ts +14 -0
  81. package/dist/src/filters/Gamma.d.ts +53 -0
  82. package/dist/src/filters/Grayscale.d.ts +45 -0
  83. package/dist/src/filters/HueRotation.d.ts +24 -0
  84. package/dist/src/filters/Invert.d.ts +54 -0
  85. package/dist/src/filters/Noise.d.ts +53 -0
  86. package/dist/src/filters/Pixelate.d.ts +43 -0
  87. package/dist/src/filters/RemoveColor.d.ts +62 -0
  88. package/dist/src/filters/Resize.d.ts +134 -0
  89. package/dist/src/filters/Saturation.d.ts +47 -0
  90. package/dist/src/filters/Vibrance.d.ts +47 -0
  91. package/dist/src/filters/WebGLFilterBackend.d.ts +126 -0
  92. package/dist/src/filters/WebGLProbe.d.ts +28 -0
  93. package/dist/src/filters/typedefs.d.ts +49 -0
  94. package/dist/src/gradient/Gradient.d.ts +149 -0
  95. package/dist/src/gradient/constants.d.ts +15 -0
  96. package/dist/src/gradient/parser/index.d.ts +4 -0
  97. package/dist/src/gradient/parser/misc.d.ts +4 -0
  98. package/dist/src/gradient/parser/parseColorStops.d.ts +6 -0
  99. package/dist/src/gradient/parser/parseCoords.d.ts +17 -0
  100. package/dist/src/gradient/typedefs.d.ts +93 -0
  101. package/dist/src/mixins/eraser_brush.mixin.d.ts +2 -0
  102. package/dist/src/mixins/stateful.mixin.d.ts +18 -0
  103. package/dist/src/parkinglot/canvas_animation.mixin.d.ts +2 -0
  104. package/dist/src/parkinglot/straighten.d.ts +2 -0
  105. package/dist/src/parser/applyViewboxTransform.d.ts +5 -0
  106. package/dist/src/parser/attributes.d.ts +6 -0
  107. package/dist/src/parser/constants.d.ts +54 -0
  108. package/dist/src/parser/doesSomeParentMatch.d.ts +2 -0
  109. package/dist/src/parser/elementById.d.ts +6 -0
  110. package/dist/src/parser/elementMatchesRule.d.ts +5 -0
  111. package/dist/src/parser/elements_parser.d.ts +3 -0
  112. package/dist/src/parser/getCSSRules.d.ts +7 -0
  113. package/dist/src/parser/getGlobalStylesForElement.d.ts +5 -0
  114. package/dist/src/parser/getGradientDefs.d.ts +7 -0
  115. package/dist/src/parser/getMultipleNodes.d.ts +2 -0
  116. package/dist/src/parser/getSvgRegex.d.ts +2 -0
  117. package/dist/src/parser/hasAncestorWithNodeName.d.ts +2 -0
  118. package/dist/src/parser/loadSVGFromString.d.ts +12 -0
  119. package/dist/src/parser/loadSVGFromURL.d.ts +13 -0
  120. package/dist/src/parser/normalizeAttr.d.ts +2 -0
  121. package/dist/src/parser/normalizeValue.d.ts +2 -0
  122. package/dist/src/parser/parseAttributes.d.ts +9 -0
  123. package/dist/src/parser/parseElements.d.ts +11 -0
  124. package/dist/src/parser/parseFontDeclaration.d.ts +10 -0
  125. package/dist/src/parser/parsePointsAttribute.d.ts +12 -0
  126. package/dist/src/parser/parseSVGDocument.d.ts +15 -0
  127. package/dist/src/parser/parseStyleAttribute.d.ts +9 -0
  128. package/dist/src/parser/parseStyleObject.d.ts +2 -0
  129. package/dist/src/parser/parseStyleString.d.ts +2 -0
  130. package/dist/src/parser/parseTransformAttribute.d.ts +10 -0
  131. package/dist/src/parser/parseUseDirectives.d.ts +2 -0
  132. package/dist/src/parser/percent.d.ts +9 -0
  133. package/dist/src/parser/recursivelyParseGradientsXlink.d.ts +2 -0
  134. package/dist/src/parser/rotateMatrix.d.ts +2 -0
  135. package/dist/src/parser/scaleMatrix.d.ts +2 -0
  136. package/dist/src/parser/selectorMatches.d.ts +2 -0
  137. package/dist/src/parser/setStrokeFillOpacity.d.ts +6 -0
  138. package/dist/src/parser/skewMatrix.d.ts +2 -0
  139. package/dist/src/parser/translateMatrix.d.ts +2 -0
  140. package/dist/src/shapes/ActiveSelection.d.ts +66 -0
  141. package/dist/src/shapes/Circle.d.ts +80 -0
  142. package/dist/src/shapes/Ellipse.d.ts +74 -0
  143. package/dist/src/shapes/Group.d.ts +381 -0
  144. package/dist/src/shapes/IText/DraggableTextDelegate.d.ts +78 -0
  145. package/dist/src/shapes/IText/IText.d.ts +322 -0
  146. package/dist/src/shapes/IText/ITextBehavior.d.ts +285 -0
  147. package/dist/src/shapes/IText/ITextClickBehavior.d.ts +81 -0
  148. package/dist/src/shapes/IText/ITextKeyBehavior.d.ts +193 -0
  149. package/dist/src/shapes/IText/constants.d.ts +13 -0
  150. package/dist/src/shapes/Image.d.ts +283 -0
  151. package/dist/src/shapes/Line.d.ts +117 -0
  152. package/dist/src/shapes/Object/AnimatableObject.d.ts +33 -0
  153. package/dist/src/shapes/Object/FabricObject.d.ts +9 -0
  154. package/dist/src/shapes/Object/FabricObjectSVGExportMixin.d.ts +74 -0
  155. package/dist/src/shapes/Object/InteractiveObject.d.ts +282 -0
  156. package/dist/src/shapes/Object/Object.d.ts +906 -0
  157. package/dist/src/shapes/Object/ObjectGeometry.d.ts +343 -0
  158. package/dist/src/shapes/Object/ObjectOrigin.d.ts +178 -0
  159. package/dist/src/shapes/Object/StackedObject.d.ts +62 -0
  160. package/dist/src/shapes/Object/defaultValues.d.ts +77 -0
  161. package/dist/src/shapes/Path.d.ts +123 -0
  162. package/dist/src/shapes/Polygon.d.ts +7 -0
  163. package/dist/src/shapes/Polyline.d.ts +130 -0
  164. package/dist/src/shapes/Rect.d.ts +62 -0
  165. package/dist/src/shapes/Text/StyledText.d.ts +118 -0
  166. package/dist/src/shapes/Text/Text.d.ts +656 -0
  167. package/dist/src/shapes/Text/TextSVGExportMixin.d.ts +32 -0
  168. package/dist/src/shapes/Textbox.d.ts +170 -0
  169. package/dist/src/shapes/Triangle.d.ts +17 -0
  170. package/dist/src/typedefs.d.ts +93 -0
  171. package/dist/src/util/animation/AnimationBase.d.ts +54 -0
  172. package/dist/src/util/animation/AnimationFrameProvider.d.ts +8 -0
  173. package/dist/src/util/animation/AnimationRegistry.d.ts +29 -0
  174. package/dist/src/util/animation/ArrayAnimation.d.ts +10 -0
  175. package/dist/src/util/animation/ColorAnimation.d.ts +11 -0
  176. package/dist/src/util/animation/ValueAnimation.d.ts +10 -0
  177. package/dist/src/util/animation/animate.d.ts +37 -0
  178. package/dist/src/util/animation/easing.d.ts +130 -0
  179. package/dist/src/util/animation/types.d.ts +87 -0
  180. package/dist/src/util/applyMixins.d.ts +8 -0
  181. package/dist/src/util/class_registry.d.ts +14 -0
  182. package/dist/src/util/dom_event.d.ts +5 -0
  183. package/dist/src/util/dom_misc.d.ts +40 -0
  184. package/dist/src/util/dom_request.d.ts +14 -0
  185. package/dist/src/util/dom_style.d.ts +7 -0
  186. package/dist/src/util/fireEvent.d.ts +3 -0
  187. package/dist/src/util/internals/cloneDeep.d.ts +2 -0
  188. package/dist/src/util/internals/getRandomInt.d.ts +8 -0
  189. package/dist/src/util/internals/ifNaN.d.ts +8 -0
  190. package/dist/src/util/internals/index.d.ts +4 -0
  191. package/dist/src/util/internals/removeFromArray.d.ts +9 -0
  192. package/dist/src/util/internals/uid.d.ts +2 -0
  193. package/dist/src/util/lang_class.d.ts +12 -0
  194. package/dist/src/util/lang_string.d.ts +22 -0
  195. package/dist/src/util/misc/boundingBoxFromPoints.d.ts +9 -0
  196. package/dist/src/util/misc/capValue.d.ts +2 -0
  197. package/dist/src/util/misc/cos.d.ts +10 -0
  198. package/dist/src/util/misc/dom.d.ts +28 -0
  199. package/dist/src/util/misc/findScaleTo.d.ts +29 -0
  200. package/dist/src/util/misc/groupSVGElements.d.ts +9 -0
  201. package/dist/src/util/misc/isTransparent.d.ts +11 -0
  202. package/dist/src/util/misc/matrix.d.ts +92 -0
  203. package/dist/src/util/misc/mergeClipPaths.d.ts +23 -0
  204. package/dist/src/util/misc/objectEnlive.d.ts +56 -0
  205. package/dist/src/util/misc/objectTransforms.d.ts +68 -0
  206. package/dist/src/util/misc/pick.d.ts +8 -0
  207. package/dist/src/util/misc/planeChange.d.ts +84 -0
  208. package/dist/src/util/misc/projectStroke/StrokeLineCapProjections.d.ts +51 -0
  209. package/dist/src/util/misc/projectStroke/StrokeLineJoinProjections.d.ts +81 -0
  210. package/dist/src/util/misc/projectStroke/StrokeProjectionsBase.d.ts +25 -0
  211. package/dist/src/util/misc/projectStroke/index.d.ts +11 -0
  212. package/dist/src/util/misc/projectStroke/types.d.ts +23 -0
  213. package/dist/src/util/misc/radiansDegreesConversion.d.ts +14 -0
  214. package/dist/src/util/misc/resolveOrigin.d.ts +9 -0
  215. package/dist/src/util/misc/rotatePoint.d.ts +12 -0
  216. package/dist/src/util/misc/sin.d.ts +10 -0
  217. package/dist/src/util/misc/svgParsing.d.ts +53 -0
  218. package/dist/src/util/misc/textStyles.d.ts +32 -0
  219. package/dist/src/util/misc/toFixed.d.ts +8 -0
  220. package/dist/src/util/misc/vectors.d.ts +57 -0
  221. package/dist/src/util/path.d.ts +108 -0
  222. package/dist/src/util/transform_matrix_removal.d.ts +14 -0
  223. package/dist/src/util/types.d.ts +19 -0
  224. package/fabric.ts +427 -0
  225. package/index.node.ts +43 -0
  226. package/index.ts +1 -0
  227. package/package.json +90 -39
  228. package/publish.js +0 -26
  229. package/rollup.config.mjs +79 -0
  230. package/rollup.test.config.js +24 -0
  231. package/scripts/build.mjs +50 -0
  232. package/scripts/buildLock.mjs +115 -0
  233. package/scripts/buildReporter.mjs +15 -0
  234. package/scripts/buildStats.mjs +139 -0
  235. package/scripts/dirname.mjs +14 -0
  236. package/scripts/index.mjs +679 -0
  237. package/scripts/transform_files.mjs +504 -0
  238. package/src/Collection.ts +311 -0
  239. package/src/CommonMethods.ts +63 -0
  240. package/src/EventTypeDefs.ts +294 -0
  241. package/src/Intersection.ts +273 -0
  242. package/src/Observable.ts +175 -0
  243. package/src/Pattern.ts +211 -0
  244. package/src/Point.ts +388 -0
  245. package/src/Shadow.ts +215 -0
  246. package/src/brushes/{base_brush.class.js → BaseBrush.ts} +65 -42
  247. package/src/brushes/CircleBrush.ts +145 -0
  248. package/src/brushes/PatternBrush.ts +70 -0
  249. package/src/brushes/PencilBrush.ts +300 -0
  250. package/src/brushes/SprayBrush.ts +219 -0
  251. package/src/cache.ts +89 -0
  252. package/src/canvas/Canvas.ts +1672 -0
  253. package/src/canvas/SelectableCanvas.ts +1636 -0
  254. package/src/canvas/StaticCanvas.ts +1709 -0
  255. package/src/canvas/TextEditingManager.ts +48 -0
  256. package/src/canvas/canvas_gestures.mixin.ts +207 -0
  257. package/src/color/Color.ts +404 -0
  258. package/src/color/color_map.ts +154 -0
  259. package/src/color/constants.ts +26 -0
  260. package/src/color/util.ts +32 -0
  261. package/src/config.ts +159 -0
  262. package/src/constants.ts +19 -0
  263. package/src/controls/Control.ts +377 -0
  264. package/src/controls/changeWidth.ts +52 -0
  265. package/src/controls/controls.render.ts +138 -0
  266. package/src/controls/default_controls.ts +132 -0
  267. package/src/controls/drag.ts +31 -0
  268. package/src/controls/polyControl.ts +135 -0
  269. package/src/controls/rotate.ts +87 -0
  270. package/src/controls/scale.ts +277 -0
  271. package/src/controls/scaleSkew.ts +92 -0
  272. package/src/controls/skew.ts +242 -0
  273. package/src/controls/util.ts +154 -0
  274. package/src/controls/wrapWithFireEvent.ts +25 -0
  275. package/src/controls/wrapWithFixedAnchor.ts +20 -0
  276. package/src/env/browser.ts +28 -0
  277. package/src/env/index.ts +19 -0
  278. package/src/env/node.ts +52 -0
  279. package/src/env/types.ts +15 -0
  280. package/src/filters/{base_filter.class.js → BaseFilter.ts} +201 -149
  281. package/src/filters/BlendColor.ts +258 -0
  282. package/src/filters/BlendImage.ts +254 -0
  283. package/src/filters/Blur.ts +202 -0
  284. package/src/filters/Boilerplate.ts +91 -0
  285. package/src/filters/Brightness.ts +93 -0
  286. package/src/filters/Canvas2dFilterBackend.ts +65 -0
  287. package/src/filters/ColorMatrix.ts +156 -0
  288. package/src/filters/ColorMatrixFilters.ts +106 -0
  289. package/src/filters/Composed.ts +85 -0
  290. package/src/filters/Contrast.ts +94 -0
  291. package/src/filters/Convolute.ts +341 -0
  292. package/src/filters/FilterBackend.ts +32 -0
  293. package/src/filters/Gamma.ts +127 -0
  294. package/src/filters/Grayscale.ts +137 -0
  295. package/src/filters/HueRotation.ts +66 -0
  296. package/src/filters/Invert.ts +117 -0
  297. package/src/filters/Noise.ts +109 -0
  298. package/src/filters/Pixelate.ts +114 -0
  299. package/src/filters/RemoveColor.ts +148 -0
  300. package/src/filters/Resize.ts +540 -0
  301. package/src/filters/Saturation.ts +100 -0
  302. package/src/filters/Vibrance.ts +103 -0
  303. package/src/filters/WebGLFilterBackend.ts +430 -0
  304. package/src/filters/WebGLProbe.ts +62 -0
  305. package/src/filters/typedefs.ts +65 -0
  306. package/src/gradient/Gradient.ts +401 -0
  307. package/src/gradient/constants.ts +12 -0
  308. package/src/gradient/parser/index.ts +3 -0
  309. package/src/gradient/parser/misc.ts +13 -0
  310. package/src/gradient/parser/parseColorStops.ts +55 -0
  311. package/src/gradient/parser/parseCoords.ts +73 -0
  312. package/src/gradient/typedefs.ts +104 -0
  313. package/src/mixins/{eraser_brush.mixin.js → eraser_brush.mixin.ts} +350 -239
  314. package/src/mixins/stateful.mixin.ts +104 -0
  315. package/src/parkinglot/canvas_animation.mixin.ts +121 -0
  316. package/src/parkinglot/straighten.ts +58 -0
  317. package/src/parser/applyViewboxTransform.ts +162 -0
  318. package/src/parser/attributes.ts +25 -0
  319. package/src/parser/constants.ts +118 -0
  320. package/src/parser/doesSomeParentMatch.ts +19 -0
  321. package/src/parser/elementById.ts +23 -0
  322. package/src/parser/elementMatchesRule.ts +19 -0
  323. package/src/parser/elements_parser.ts +191 -0
  324. package/src/parser/getCSSRules.ts +62 -0
  325. package/src/parser/getGlobalStylesForElement.ts +19 -0
  326. package/src/parser/getGradientDefs.ts +32 -0
  327. package/src/parser/getMultipleNodes.ts +15 -0
  328. package/src/parser/getSvgRegex.ts +5 -0
  329. package/src/parser/hasAncestorWithNodeName.ts +14 -0
  330. package/src/parser/loadSVGFromString.ts +26 -0
  331. package/src/parser/loadSVGFromURL.ts +40 -0
  332. package/src/parser/normalizeAttr.ts +10 -0
  333. package/src/parser/normalizeValue.ts +63 -0
  334. package/src/parser/parseAttributes.ts +90 -0
  335. package/src/parser/parseElements.ts +28 -0
  336. package/src/parser/parseFontDeclaration.ts +44 -0
  337. package/src/parser/parsePointsAttribute.ts +36 -0
  338. package/src/parser/parseSVGDocument.ts +106 -0
  339. package/src/parser/parseStyleAttribute.ts +27 -0
  340. package/src/parser/parseStyleObject.ts +15 -0
  341. package/src/parser/parseStyleString.ts +16 -0
  342. package/src/parser/parseTransformAttribute.ts +155 -0
  343. package/src/parser/parseUseDirectives.ts +79 -0
  344. package/src/parser/percent.ts +27 -0
  345. package/src/parser/recursivelyParseGradientsXlink.ts +42 -0
  346. package/src/parser/rotateMatrix.ts +21 -0
  347. package/src/parser/scaleMatrix.ts +9 -0
  348. package/src/parser/selectorMatches.ts +25 -0
  349. package/src/parser/setStrokeFillOpacity.ts +40 -0
  350. package/src/parser/skewMatrix.ts +6 -0
  351. package/src/parser/translateMatrix.ts +8 -0
  352. package/src/shapes/ActiveSelection.ts +157 -0
  353. package/src/shapes/Circle.ts +205 -0
  354. package/src/shapes/Ellipse.ts +154 -0
  355. package/src/shapes/Group.ts +1053 -0
  356. package/src/shapes/IText/DraggableTextDelegate.ts +394 -0
  357. package/src/shapes/IText/IText.ts +666 -0
  358. package/src/shapes/IText/ITextBehavior.ts +1055 -0
  359. package/src/shapes/IText/ITextClickBehavior.ts +321 -0
  360. package/src/shapes/IText/ITextKeyBehavior.ts +683 -0
  361. package/src/shapes/IText/constants.ts +47 -0
  362. package/src/shapes/Image.ts +789 -0
  363. package/src/shapes/Line.ts +329 -0
  364. package/src/shapes/Object/AnimatableObject.ts +106 -0
  365. package/src/shapes/Object/FabricObject.ts +19 -0
  366. package/src/shapes/Object/FabricObjectSVGExportMixin.ts +277 -0
  367. package/src/shapes/Object/InteractiveObject.ts +645 -0
  368. package/src/shapes/Object/Object.ts +1896 -0
  369. package/src/shapes/Object/ObjectGeometry.ts +830 -0
  370. package/src/shapes/Object/ObjectOrigin.ts +354 -0
  371. package/src/shapes/Object/StackedObject.ts +191 -0
  372. package/src/shapes/Object/defaultValues.ts +112 -0
  373. package/src/shapes/Path.ts +395 -0
  374. package/src/shapes/Polygon.ts +19 -0
  375. package/src/shapes/Polyline.ts +333 -0
  376. package/src/shapes/Rect.ts +199 -0
  377. package/src/shapes/Text/StyledText.ts +319 -0
  378. package/src/shapes/Text/Text.ts +1948 -0
  379. package/src/shapes/Text/TextSVGExportMixin.ts +288 -0
  380. package/src/shapes/Textbox.ts +471 -0
  381. package/src/shapes/Triangle.ts +45 -0
  382. package/src/typedefs.ts +119 -0
  383. package/src/util/animation/AnimationBase.ts +166 -0
  384. package/src/util/animation/AnimationFrameProvider.ts +28 -0
  385. package/src/util/animation/AnimationRegistry.ts +58 -0
  386. package/src/util/animation/ArrayAnimation.ts +27 -0
  387. package/src/util/animation/ColorAnimation.ts +74 -0
  388. package/src/util/animation/ValueAnimation.ts +29 -0
  389. package/src/util/animation/animate.ts +74 -0
  390. package/src/util/animation/easing.ts +327 -0
  391. package/src/util/animation/types.ts +136 -0
  392. package/src/util/applyMixins.ts +22 -0
  393. package/src/util/class_registry.ts +54 -0
  394. package/src/util/dom_event.ts +28 -0
  395. package/src/util/dom_misc.ts +138 -0
  396. package/src/util/dom_request.ts +64 -0
  397. package/src/util/dom_style.ts +20 -0
  398. package/src/util/fireEvent.ts +15 -0
  399. package/src/util/internals/cloneDeep.ts +2 -0
  400. package/src/util/internals/getRandomInt.ts +8 -0
  401. package/src/util/internals/ifNaN.ts +9 -0
  402. package/src/util/internals/index.ts +3 -0
  403. package/src/util/internals/removeFromArray.ts +14 -0
  404. package/src/util/internals/uid.ts +3 -0
  405. package/src/util/lang_class.ts +90 -0
  406. package/src/util/lang_string.ts +79 -0
  407. package/src/util/misc/boundingBoxFromPoints.ts +37 -0
  408. package/src/util/misc/capValue.ts +2 -0
  409. package/src/util/misc/cos.ts +24 -0
  410. package/src/util/misc/dom.ts +50 -0
  411. package/src/util/misc/findScaleTo.ts +44 -0
  412. package/src/util/misc/groupSVGElements.ts +15 -0
  413. package/src/util/misc/isTransparent.ts +51 -0
  414. package/src/util/misc/matrix.ts +207 -0
  415. package/src/util/misc/mergeClipPaths.ts +40 -0
  416. package/src/util/misc/objectEnlive.ts +189 -0
  417. package/src/util/misc/objectTransforms.ts +129 -0
  418. package/src/util/misc/pick.ts +17 -0
  419. package/src/util/misc/planeChange.ts +136 -0
  420. package/src/util/misc/projectStroke/StrokeLineCapProjections.ts +112 -0
  421. package/src/util/misc/projectStroke/StrokeLineJoinProjections.ts +231 -0
  422. package/src/util/misc/projectStroke/StrokeProjectionsBase.ts +75 -0
  423. package/src/util/misc/projectStroke/index.ts +53 -0
  424. package/src/util/misc/projectStroke/types.ts +24 -0
  425. package/src/util/misc/radiansDegreesConversion.ts +18 -0
  426. package/src/util/misc/resolveOrigin.ts +22 -0
  427. package/src/util/misc/rotatePoint.ts +15 -0
  428. package/src/util/misc/sin.ts +26 -0
  429. package/src/util/misc/svgParsing.ts +181 -0
  430. package/src/util/misc/textStyles.ts +133 -0
  431. package/src/util/misc/toFixed.ts +8 -0
  432. package/src/util/misc/vectors.ts +82 -0
  433. package/src/util/path.ts +941 -0
  434. package/src/util/transform_matrix_removal.ts +60 -0
  435. package/src/util/types.ts +78 -0
  436. package/tsconfig.json +106 -0
  437. package/HEADER.js +0 -203
  438. package/build.js +0 -287
  439. package/dist/fabric.js +0 -31187
  440. package/dist/fabric.min.js +0 -1
  441. package/old-travis-reference.yml +0 -97
  442. package/src/brushes/circle_brush.class.js +0 -144
  443. package/src/brushes/pattern_brush.class.js +0 -61
  444. package/src/brushes/pencil_brush.class.js +0 -310
  445. package/src/brushes/spray_brush.class.js +0 -219
  446. package/src/canvas.class.js +0 -1312
  447. package/src/color.class.js +0 -636
  448. package/src/control.class.js +0 -339
  449. package/src/controls.actions.js +0 -740
  450. package/src/controls.render.js +0 -99
  451. package/src/elements_parser.js +0 -152
  452. package/src/filters/2d_backend.class.js +0 -65
  453. package/src/filters/blendcolor_filter.class.js +0 -251
  454. package/src/filters/blendimage_filter.class.js +0 -247
  455. package/src/filters/blur_filter.class.js +0 -217
  456. package/src/filters/brightness_filter.class.js +0 -113
  457. package/src/filters/colormatrix_filter.class.js +0 -159
  458. package/src/filters/composed_filter.class.js +0 -72
  459. package/src/filters/contrast_filter.class.js +0 -113
  460. package/src/filters/convolute_filter.class.js +0 -352
  461. package/src/filters/filter_boilerplate.js +0 -111
  462. package/src/filters/filter_generator.js +0 -85
  463. package/src/filters/gamma_filter.class.js +0 -136
  464. package/src/filters/grayscale_filter.class.js +0 -154
  465. package/src/filters/hue_rotation.class.js +0 -107
  466. package/src/filters/invert_filter.class.js +0 -111
  467. package/src/filters/noise_filter.class.js +0 -134
  468. package/src/filters/pixelate_filter.class.js +0 -137
  469. package/src/filters/removecolor_filter.class.js +0 -173
  470. package/src/filters/resize_filter.class.js +0 -490
  471. package/src/filters/saturate_filter.class.js +0 -119
  472. package/src/filters/vibrance_filter.class.js +0 -122
  473. package/src/filters/webgl_backend.class.js +0 -396
  474. package/src/globalFabric.js +0 -4
  475. package/src/gradient.class.js +0 -490
  476. package/src/intersection.class.js +0 -172
  477. package/src/log.js +0 -11
  478. package/src/mixins/animation.mixin.js +0 -231
  479. package/src/mixins/canvas_dataurl_exporter.mixin.js +0 -97
  480. package/src/mixins/canvas_events.mixin.js +0 -974
  481. package/src/mixins/canvas_gestures.mixin.js +0 -149
  482. package/src/mixins/canvas_grouping.mixin.js +0 -177
  483. package/src/mixins/canvas_serialization.mixin.js +0 -228
  484. package/src/mixins/collection.mixin.js +0 -170
  485. package/src/mixins/default_controls.js +0 -114
  486. package/src/mixins/itext.svg_export.js +0 -241
  487. package/src/mixins/itext_behavior.mixin.js +0 -940
  488. package/src/mixins/itext_click_behavior.mixin.js +0 -278
  489. package/src/mixins/itext_key_behavior.mixin.js +0 -694
  490. package/src/mixins/object.svg_export.js +0 -258
  491. package/src/mixins/object_geometry.mixin.js +0 -683
  492. package/src/mixins/object_interactivity.mixin.js +0 -314
  493. package/src/mixins/object_origin.mixin.js +0 -255
  494. package/src/mixins/object_stacking.mixin.js +0 -80
  495. package/src/mixins/object_straightening.mixin.js +0 -80
  496. package/src/mixins/observable.mixin.js +0 -141
  497. package/src/mixins/shared_methods.mixin.js +0 -94
  498. package/src/mixins/stateful.mixin.js +0 -107
  499. package/src/mixins/text_style.mixin.js +0 -324
  500. package/src/parser.js +0 -1090
  501. package/src/pattern.class.js +0 -189
  502. package/src/point.class.js +0 -337
  503. package/src/shadow.class.js +0 -195
  504. package/src/shapes/active_selection.class.js +0 -155
  505. package/src/shapes/circle.class.js +0 -210
  506. package/src/shapes/ellipse.class.js +0 -181
  507. package/src/shapes/group.class.js +0 -593
  508. package/src/shapes/image.class.js +0 -764
  509. package/src/shapes/itext.class.js +0 -526
  510. package/src/shapes/line.class.js +0 -324
  511. package/src/shapes/object.class.js +0 -2008
  512. package/src/shapes/path.class.js +0 -384
  513. package/src/shapes/polygon.class.js +0 -81
  514. package/src/shapes/polyline.class.js +0 -268
  515. package/src/shapes/rect.class.js +0 -187
  516. package/src/shapes/text.class.js +0 -1696
  517. package/src/shapes/textbox.class.js +0 -461
  518. package/src/shapes/triangle.class.js +0 -93
  519. package/src/static_canvas.class.js +0 -1881
  520. package/src/util/anim_ease.js +0 -398
  521. package/src/util/animate.js +0 -254
  522. package/src/util/animate_color.js +0 -74
  523. package/src/util/dom_event.js +0 -50
  524. package/src/util/dom_misc.js +0 -300
  525. package/src/util/dom_request.js +0 -54
  526. package/src/util/dom_style.js +0 -70
  527. package/src/util/lang_array.js +0 -94
  528. package/src/util/lang_class.js +0 -115
  529. package/src/util/lang_object.js +0 -75
  530. package/src/util/lang_string.js +0 -110
  531. package/src/util/misc.js +0 -1330
  532. package/src/util/named_accessors.mixin.js +0 -428
  533. package/src/util/path.js +0 -829
@@ -1,16 +1,17 @@
1
- (function () {
2
- /** ERASER_START */
1
+ //@ts-nocheck
2
+ import { Point } from '../Point';
3
+ import { uid } from '../util/internals/uid';
3
4
 
4
- /**
5
- * add `eraser` to enlivened props
6
- */
7
- fabric.Object.ENLIVEN_PROPS.push('eraser');
5
+ (function (global) {
6
+ /** ERASER_START */
8
7
 
9
- var __drawClipPath = fabric.Object.prototype._drawClipPath;
8
+ var fabric = global.fabric,
9
+ __drawClipPath = fabric.Object.prototype._drawClipPath;
10
10
  var _needsItsOwnCache = fabric.Object.prototype.needsItsOwnCache;
11
11
  var _toObject = fabric.Object.prototype.toObject;
12
12
  var _getSvgCommons = fabric.Object.prototype.getSvgCommons;
13
- var __createBaseClipPathSVGMarkup = fabric.Object.prototype._createBaseClipPathSVGMarkup;
13
+ var __createBaseClipPathSVGMarkup =
14
+ fabric.Object.prototype._createBaseClipPathSVGMarkup;
14
15
  var __createBaseSVGMarkup = fabric.Object.prototype._createBaseSVGMarkup;
15
16
 
16
17
  fabric.Object.prototype.cacheProperties.push('eraser');
@@ -58,10 +59,11 @@
58
59
  if (this.eraser) {
59
60
  // update eraser size to match instance
60
61
  var size = this._getNonTransformedDimensions();
61
- this.eraser.isType('eraser') && this.eraser.set({
62
- width: size.x,
63
- height: size.y
64
- });
62
+ this.eraser.isType('eraser') &&
63
+ this.eraser.set({
64
+ width: size.x,
65
+ height: size.y,
66
+ });
65
67
  __drawClipPath.call(this, ctx, this.eraser);
66
68
  }
67
69
  },
@@ -72,7 +74,10 @@
72
74
  * @return {Object} Object representation of an instance
73
75
  */
74
76
  toObject: function (propertiesToInclude) {
75
- var object = _toObject.call(this, ['erasable'].concat(propertiesToInclude));
77
+ var object = _toObject.call(
78
+ this,
79
+ ['erasable'].concat(propertiesToInclude)
80
+ );
76
81
  if (this.eraser && !this.eraser.excludeFromExport) {
77
82
  object.eraser = this.eraser.toObject(propertiesToInclude);
78
83
  }
@@ -86,7 +91,10 @@
86
91
  * @return {String}
87
92
  */
88
93
  getSvgCommons: function () {
89
- return _getSvgCommons.call(this) + (this.eraser ? 'mask="url(#' + this.eraser.clipPathId + ')" ' : '');
94
+ return (
95
+ _getSvgCommons.call(this) +
96
+ (this.eraser ? 'mask="url(#' + this.eraser.clipPathId + ')" ' : '')
97
+ );
90
98
  },
91
99
 
92
100
  /**
@@ -98,11 +106,14 @@
98
106
  */
99
107
  _createEraserSVGMarkup: function (reviver) {
100
108
  if (this.eraser) {
101
- this.eraser.clipPathId = 'MASK_' + fabric.Object.__uid++;
109
+ this.eraser.clipPathId = 'MASK_' + uid();
102
110
  return [
103
- '<mask id="', this.eraser.clipPathId, '" >',
111
+ '<mask id="',
112
+ this.eraser.clipPathId,
113
+ '" >',
104
114
  this.eraser.toSVG(reviver),
105
- '</mask>', '\n'
115
+ '</mask>',
116
+ '\n',
106
117
  ].join('');
107
118
  }
108
119
  return '';
@@ -114,7 +125,7 @@
114
125
  _createBaseClipPathSVGMarkup: function (objectMarkup, options) {
115
126
  return [
116
127
  this._createEraserSVGMarkup(options && options.reviver),
117
- __createBaseClipPathSVGMarkup.call(this, objectMarkup, options)
128
+ __createBaseClipPathSVGMarkup.call(this, objectMarkup, options),
118
129
  ].join('');
119
130
  },
120
131
 
@@ -124,74 +135,73 @@
124
135
  _createBaseSVGMarkup: function (objectMarkup, options) {
125
136
  return [
126
137
  this._createEraserSVGMarkup(options && options.reviver),
127
- __createBaseSVGMarkup.call(this, objectMarkup, options)
138
+ __createBaseSVGMarkup.call(this, objectMarkup, options),
128
139
  ].join('');
129
- }
140
+ },
130
141
  /* _TO_SVG_END_ */
131
142
  });
132
143
 
133
- var __restoreObjectsState = fabric.Group.prototype._restoreObjectsState;
134
144
  fabric.util.object.extend(fabric.Group.prototype, {
135
145
  /**
136
146
  * @private
137
147
  * @param {fabric.Path} path
148
+ * @returns {Promise<fabric.Path[]>}
138
149
  */
139
150
  _addEraserPathToObjects: function (path) {
140
- this._objects.forEach(function (object) {
141
- fabric.EraserBrush.prototype._addPathToObjectEraser.call(
142
- fabric.EraserBrush.prototype,
143
- object,
144
- path
145
- );
146
- });
151
+ return Promise.all(
152
+ this._objects.map(function (object) {
153
+ return fabric.EraserBrush.prototype._addPathToObjectEraser.call(
154
+ fabric.EraserBrush.prototype,
155
+ object,
156
+ path
157
+ );
158
+ })
159
+ );
147
160
  },
148
161
 
149
162
  /**
150
163
  * Applies the group's eraser to its objects
151
164
  * @tutorial {@link http://fabricjs.com/erasing#erasable_property}
165
+ * @returns {Promise<fabric.Path[]|fabric.Path[][]|void>}
152
166
  */
153
167
  applyEraserToObjects: function () {
154
- var _this = this, eraser = this.eraser;
155
- if (eraser) {
156
- delete this.eraser;
157
- var transform = _this.calcTransformMatrix();
158
- eraser.clone(function (eraser) {
159
- var clipPath = _this.clipPath;
160
- eraser.getObjects('path')
161
- .forEach(function (path) {
162
- // first we transform the path from the group's coordinate system to the canvas'
163
- var originalTransform = fabric.util.multiplyTransformMatrices(
164
- transform,
165
- path.calcTransformMatrix()
166
- );
167
- fabric.util.applyTransformToObject(path, originalTransform);
168
- if (clipPath) {
169
- clipPath.clone(function (_clipPath) {
170
- var eraserPath = fabric.EraserBrush.prototype.applyClipPathToPath.call(
171
- fabric.EraserBrush.prototype,
172
- path,
173
- _clipPath,
174
- transform
175
- );
176
- _this._addEraserPathToObjects(eraserPath);
177
- }, ['absolutePositioned', 'inverted']);
178
- }
179
- else {
180
- _this._addEraserPathToObjects(path);
181
- }
182
- });
183
- });
184
- }
168
+ var _this = this,
169
+ eraser = this.eraser;
170
+ return Promise.resolve().then(function () {
171
+ if (eraser) {
172
+ delete _this.eraser;
173
+ var transform = _this.calcTransformMatrix();
174
+ return eraser.clone().then(function (eraser) {
175
+ var clipPath = _this.clipPath;
176
+ return Promise.all(
177
+ eraser.getObjects('path').map(function (path) {
178
+ // first we transform the path from the group's coordinate system to the canvas'
179
+ var originalTransform = fabric.util.multiplyTransformMatrices(
180
+ transform,
181
+ path.calcTransformMatrix()
182
+ );
183
+ fabric.util.applyTransformToObject(path, originalTransform);
184
+ return clipPath
185
+ ? clipPath.clone().then(
186
+ function (_clipPath) {
187
+ var eraserPath =
188
+ fabric.EraserBrush.prototype.applyClipPathToPath.call(
189
+ fabric.EraserBrush.prototype,
190
+ path,
191
+ _clipPath,
192
+ transform
193
+ );
194
+ return _this._addEraserPathToObjects(eraserPath);
195
+ },
196
+ ['absolutePositioned', 'inverted']
197
+ )
198
+ : _this._addEraserPathToObjects(path);
199
+ })
200
+ );
201
+ });
202
+ }
203
+ });
185
204
  },
186
-
187
- /**
188
- * Propagate the group's eraser to its objects, crucial for proper functionality of the eraser within the group and nested objects.
189
- * @private
190
- */
191
- _restoreObjectsState: function () {
192
- this.erasable === true && this.applyEraserToObjects();
193
- return __restoreObjectsState.call(this);
194
- }
195
205
  });
196
206
 
197
207
  /**
@@ -218,14 +228,6 @@
218
228
  */
219
229
  originY: 'center',
220
230
 
221
- drawObject: function (ctx) {
222
- ctx.save();
223
- ctx.fillStyle = 'black';
224
- ctx.fillRect(-this.width / 2, -this.height / 2, this.width, this.height);
225
- ctx.restore();
226
- this.callSuper('drawObject', ctx);
227
- },
228
-
229
231
  /**
230
232
  * eraser should retain size
231
233
  * dimensions should not change when paths are added or removed
@@ -233,8 +235,14 @@
233
235
  * @override
234
236
  * @private
235
237
  */
236
- _getBounds: function () {
237
- // noop
238
+ layout: 'fixed',
239
+
240
+ drawObject: function (ctx) {
241
+ ctx.save();
242
+ ctx.fillStyle = 'black';
243
+ ctx.fillRect(-this.width / 2, -this.height / 2, this.width, this.height);
244
+ ctx.restore();
245
+ this.callSuper('drawObject', ctx);
238
246
  },
239
247
 
240
248
  /* _TO_SVG_START_ */
@@ -248,12 +256,20 @@
248
256
  */
249
257
  _toSVG: function (reviver) {
250
258
  var svgString = ['<g ', 'COMMON_PARTS', ' >\n'];
251
- var x = -this.width / 2, y = -this.height / 2;
259
+ var x = -this.width / 2,
260
+ y = -this.height / 2;
252
261
  var rectSvg = [
253
- '<rect ', 'fill="white" ',
254
- 'x="', x, '" y="', y,
255
- '" width="', this.width, '" height="', this.height,
256
- '" />\n'
262
+ '<rect ',
263
+ 'fill="white" ',
264
+ 'x="',
265
+ x,
266
+ '" y="',
267
+ y,
268
+ '" width="',
269
+ this.width,
270
+ '" height="',
271
+ this.height,
272
+ '" />\n',
257
273
  ].join('');
258
274
  svgString.push('\t\t', rectSvg);
259
275
  for (var i = 0, len = this._objects.length; i < len; i++) {
@@ -266,20 +282,25 @@
266
282
  });
267
283
 
268
284
  /**
269
- * Returns {@link fabric.Eraser} instance from an object representation
285
+ * Returns instance from an object representation
270
286
  * @static
271
287
  * @memberOf fabric.Eraser
272
288
  * @param {Object} object Object to create an Eraser from
273
- * @param {Function} [callback] Callback to invoke when an eraser instance is created
289
+ * @returns {Promise<fabric.Eraser>}
274
290
  */
275
- fabric.Eraser.fromObject = function (object, callback) {
276
- var objects = object.objects;
277
- fabric.util.enlivenObjects(objects, function (enlivenedObjects) {
278
- var options = fabric.util.object.clone(object, true);
279
- delete options.objects;
280
- fabric.util.enlivenObjectEnlivables(object, options, function () {
281
- callback && callback(new fabric.Eraser(enlivenedObjects, options, true));
282
- });
291
+ fabric.Eraser.fromObject = function (object) {
292
+ var objects = object.objects || [],
293
+ options = fabric.util.object.clone(object, true);
294
+ delete options.objects;
295
+ return Promise.all([
296
+ fabric.util.enlivenObjects(objects),
297
+ fabric.util.enlivenObjectEnlivables(options),
298
+ ]).then(function (enlivedProps) {
299
+ return new fabric.Eraser(
300
+ enlivedProps[0],
301
+ Object.assign(options, enlivedProps[1]),
302
+ true
303
+ );
283
304
  });
284
305
  };
285
306
 
@@ -309,10 +330,8 @@
309
330
  */
310
331
  _renderOverlay: function (ctx) {
311
332
  __renderOverlay.call(this, ctx);
312
- if (this.isErasing() && !this.freeDrawingBrush.inverted) {
313
- this.freeDrawingBrush._render();
314
- }
315
- }
333
+ this.isErasing() && this.freeDrawingBrush._render();
334
+ },
316
335
  });
317
336
 
318
337
  /**
@@ -341,9 +360,17 @@
341
360
 
342
361
  /**
343
362
  * When set to `true` the brush will create a visual effect of undoing erasing
363
+ * @type boolean
344
364
  */
345
365
  inverted: false,
346
366
 
367
+ /**
368
+ * Used to fix https://github.com/fabricjs/fabric.js/issues/7984
369
+ * Reduces the path width while clipping the main context, resulting in a better visual overlap of both contexts
370
+ * @type number
371
+ */
372
+ erasingWidthAliasing: 4,
373
+
347
374
  /**
348
375
  * @private
349
376
  */
@@ -361,60 +388,73 @@
361
388
 
362
389
  /**
363
390
  * @private
364
- * This is designed to support erasing a collection with both erasable and non-erasable objects.
365
- * Iterates over collections to allow nested selective erasing.
366
- * Prepares the pattern brush that will draw on the top context to achieve the desired visual effect.
367
- * If brush is **NOT** inverted render all non-erasable objects.
368
- * If brush is inverted render all erasable objects that have been erased with their clip path inverted.
369
- * This will render the erased parts as if they were not erased.
391
+ * This is designed to support erasing a collection with both erasable and non-erasable objects while maintaining object stacking.\
392
+ * Iterates over collections to allow nested selective erasing.\
393
+ * Prepares objects before rendering the pattern brush.\
394
+ * If brush is **NOT** inverted render all non-erasable objects.\
395
+ * If brush is inverted render all objects, erasable objects without their eraser.
396
+ * This will render the erased parts as if they were not erased in the first place, achieving an undo effect.
370
397
  *
371
398
  * @param {fabric.Collection} collection
399
+ * @param {fabric.Object[]} objects
372
400
  * @param {CanvasRenderingContext2D} ctx
373
401
  * @param {{ visibility: fabric.Object[], eraser: fabric.Object[], collection: fabric.Object[] }} restorationContext
374
402
  */
375
- _prepareCollectionTraversal: function (collection, ctx, restorationContext) {
376
- collection.forEachObject(function (obj) {
403
+ _prepareCollectionTraversal: function (
404
+ collection,
405
+ objects,
406
+ ctx,
407
+ restorationContext
408
+ ) {
409
+ objects.forEach(function (obj) {
410
+ var dirty = false;
377
411
  if (obj.forEachObject && obj.erasable === 'deep') {
378
412
  // traverse
379
- this._prepareCollectionTraversal(obj, ctx, restorationContext);
380
- }
381
- else if (!this.inverted && obj.erasable && obj.visible) {
413
+ this._prepareCollectionTraversal(
414
+ obj,
415
+ obj._objects,
416
+ ctx,
417
+ restorationContext
418
+ );
419
+ } else if (!this.inverted && obj.erasable && obj.visible) {
382
420
  // render only non-erasable objects
383
421
  obj.visible = false;
384
- collection.dirty = true;
385
422
  restorationContext.visibility.push(obj);
386
- restorationContext.collection.push(collection);
423
+ dirty = true;
424
+ } else if (
425
+ this.inverted &&
426
+ obj.erasable &&
427
+ obj.eraser &&
428
+ obj.visible
429
+ ) {
430
+ // render all objects without eraser
431
+ var eraser = obj.eraser;
432
+ obj.eraser = undefined;
433
+ obj.dirty = true;
434
+ restorationContext.eraser.push([obj, eraser]);
435
+ dirty = true;
387
436
  }
388
- else if (this.inverted && obj.visible) {
389
- // render only erasable objects that were erased
390
- if (obj.erasable && obj.eraser) {
391
- obj.eraser.inverted = true;
392
- obj.dirty = true;
393
- collection.dirty = true;
394
- restorationContext.eraser.push(obj);
395
- restorationContext.collection.push(collection);
396
- }
397
- else {
398
- obj.visible = false;
399
- collection.dirty = true;
400
- restorationContext.visibility.push(obj);
401
- restorationContext.collection.push(collection);
402
- }
437
+ if (dirty && collection instanceof fabric.Object) {
438
+ collection.dirty = true;
439
+ restorationContext.collection.push(collection);
403
440
  }
404
441
  }, this);
405
442
  },
406
443
 
407
444
  /**
408
445
  * Prepare the pattern for the erasing brush
409
- * This pattern will be drawn on the top context, achieving a visual effect of erasing only erasable objects
410
- * @todo decide how overlay color should behave when `inverted === true`, currently draws over it which is undesirable
446
+ * This pattern will be drawn on the top context after clipping the main context,
447
+ * achieving a visual effect of erasing only erasable objects
411
448
  * @private
449
+ * @param {fabric.Object[]} [objects] override default behavior by passing objects to render on pattern
412
450
  */
413
- preparePattern: function () {
451
+ preparePattern: function (objects) {
414
452
  if (!this._patternCanvas) {
415
453
  this._patternCanvas = fabric.util.createCanvasElement();
416
454
  }
417
455
  var canvas = this._patternCanvas;
456
+ objects =
457
+ objects || this.canvas._objectsToRender || this.canvas._objects;
418
458
  canvas.width = this.canvas.width;
419
459
  canvas.height = this.canvas.height;
420
460
  var patternCtx = canvas.getContext('2d');
@@ -423,42 +463,77 @@
423
463
  this.canvas.__initRetinaScaling(retinaScaling, canvas, patternCtx);
424
464
  }
425
465
  var backgroundImage = this.canvas.backgroundImage,
426
- bgErasable = backgroundImage && this._isErasable(backgroundImage),
427
- overlayImage = this.canvas.overlayImage,
428
- overlayErasable = overlayImage && this._isErasable(overlayImage);
429
- if (!this.inverted && ((backgroundImage && !bgErasable) || !!this.canvas.backgroundColor)) {
430
- if (bgErasable) { this.canvas.backgroundImage = undefined; }
466
+ bgErasable = backgroundImage && this._isErasable(backgroundImage),
467
+ overlayImage = this.canvas.overlayImage,
468
+ overlayErasable = overlayImage && this._isErasable(overlayImage);
469
+ if (
470
+ !this.inverted &&
471
+ ((backgroundImage && !bgErasable) || !!this.canvas.backgroundColor)
472
+ ) {
473
+ if (bgErasable) {
474
+ this.canvas.backgroundImage = undefined;
475
+ }
431
476
  this.canvas._renderBackground(patternCtx);
432
- if (bgErasable) { this.canvas.backgroundImage = backgroundImage; }
433
- }
434
- else if (this.inverted && (backgroundImage && bgErasable)) {
435
- var color = this.canvas.backgroundColor;
436
- this.canvas.backgroundColor = undefined;
477
+ if (bgErasable) {
478
+ this.canvas.backgroundImage = backgroundImage;
479
+ }
480
+ } else if (this.inverted) {
481
+ var eraser = backgroundImage && backgroundImage.eraser;
482
+ if (eraser) {
483
+ backgroundImage.eraser = undefined;
484
+ backgroundImage.dirty = true;
485
+ }
437
486
  this.canvas._renderBackground(patternCtx);
438
- this.canvas.backgroundColor = color;
487
+ if (eraser) {
488
+ backgroundImage.eraser = eraser;
489
+ backgroundImage.dirty = true;
490
+ }
439
491
  }
440
492
  patternCtx.save();
441
493
  patternCtx.transform.apply(patternCtx, this.canvas.viewportTransform);
442
494
  var restorationContext = { visibility: [], eraser: [], collection: [] };
443
- this._prepareCollectionTraversal(this.canvas, patternCtx, restorationContext);
444
- this.canvas._renderObjects(patternCtx, this.canvas._objects);
445
- restorationContext.visibility.forEach(function (obj) { obj.visible = true; });
446
- restorationContext.eraser.forEach(function (obj) {
447
- obj.eraser.inverted = false;
495
+ this._prepareCollectionTraversal(
496
+ this.canvas,
497
+ objects,
498
+ patternCtx,
499
+ restorationContext
500
+ );
501
+ this.canvas._renderObjects(patternCtx, objects);
502
+ restorationContext.visibility.forEach(function (obj) {
503
+ obj.visible = true;
504
+ });
505
+ restorationContext.eraser.forEach(function (entry) {
506
+ var obj = entry[0],
507
+ eraser = entry[1];
508
+ obj.eraser = eraser;
509
+ obj.dirty = true;
510
+ });
511
+ restorationContext.collection.forEach(function (obj) {
448
512
  obj.dirty = true;
449
513
  });
450
- restorationContext.collection.forEach(function (obj) { obj.dirty = true; });
451
514
  patternCtx.restore();
452
- if (!this.inverted && ((overlayImage && !overlayErasable) || !!this.canvas.overlayColor)) {
453
- if (overlayErasable) { this.canvas.overlayImage = undefined; }
515
+ if (
516
+ !this.inverted &&
517
+ ((overlayImage && !overlayErasable) || !!this.canvas.overlayColor)
518
+ ) {
519
+ if (overlayErasable) {
520
+ this.canvas.overlayImage = undefined;
521
+ }
454
522
  __renderOverlay.call(this.canvas, patternCtx);
455
- if (overlayErasable) { this.canvas.overlayImage = overlayImage; }
456
- }
457
- else if (this.inverted && (overlayImage && overlayErasable)) {
458
- var color = this.canvas.overlayColor;
459
- this.canvas.overlayColor = undefined;
523
+ if (overlayErasable) {
524
+ this.canvas.overlayImage = overlayImage;
525
+ }
526
+ } else if (this.inverted) {
527
+ var eraser = overlayImage && overlayImage.eraser;
528
+ if (eraser) {
529
+ overlayImage.eraser = undefined;
530
+ overlayImage.dirty = true;
531
+ }
460
532
  __renderOverlay.call(this.canvas, patternCtx);
461
- this.canvas.overlayColor = color;
533
+ if (eraser) {
534
+ overlayImage.eraser = eraser;
535
+ overlayImage.dirty = true;
536
+ }
462
537
  }
463
538
  },
464
539
 
@@ -489,7 +564,10 @@
489
564
  _saveAndTransform: function (ctx) {
490
565
  this.callSuper('_saveAndTransform', ctx);
491
566
  this._setBrushStyles(ctx);
492
- ctx.globalCompositeOperation = ctx === this.canvas.getContext() ? 'destination-out' : 'source-over';
567
+ ctx.globalCompositeOperation =
568
+ ctx === this.canvas.getContext()
569
+ ? 'destination-out'
570
+ : 'destination-in';
493
571
  },
494
572
 
495
573
  /**
@@ -502,7 +580,7 @@
502
580
 
503
581
  /**
504
582
  *
505
- * @param {fabric.Point} pointer
583
+ * @param {Point} pointer
506
584
  * @param {fabric.IEvent} options
507
585
  * @returns
508
586
  */
@@ -527,24 +605,30 @@
527
605
  * 1. Use brush to clip canvas by rendering it on top of canvas (unnecessary if `inverted === true`)
528
606
  * 2. Render brush with canvas pattern on top context
529
607
  *
608
+ * @todo provide a better solution to https://github.com/fabricjs/fabric.js/issues/7984
530
609
  */
531
610
  _render: function () {
532
- var ctx;
533
- if (!this.inverted) {
534
- // clip canvas
535
- ctx = this.canvas.getContext();
611
+ var ctx,
612
+ lineWidth = this.width;
613
+ var t = this.canvas.getRetinaScaling(),
614
+ s = 1 / t;
615
+ // clip canvas
616
+ ctx = this.canvas.getContext();
617
+ // a hack that fixes https://github.com/fabricjs/fabric.js/issues/7984 by reducing path width
618
+ // the issue's cause is unknown at time of writing (@ShaMan123 06/2022)
619
+ if (lineWidth - this.erasingWidthAliasing > 0) {
620
+ this.width = lineWidth - this.erasingWidthAliasing;
536
621
  this.callSuper('_render', ctx);
622
+ this.width = lineWidth;
537
623
  }
538
- // render brush and mask it with image of non erasables
624
+ // render brush and mask it with pattern
539
625
  ctx = this.canvas.contextTop;
540
626
  this.canvas.clearContext(ctx);
541
- this.callSuper('_render', ctx);
542
627
  ctx.save();
543
- var t = this.canvas.getRetinaScaling(), s = 1 / t;
544
628
  ctx.scale(s, s);
545
- ctx.globalCompositeOperation = 'source-in';
546
629
  ctx.drawImage(this._patternCanvas, 0, 0);
547
630
  ctx.restore();
631
+ this.callSuper('_render', ctx);
548
632
  },
549
633
 
550
634
  /**
@@ -557,7 +641,9 @@
557
641
  */
558
642
  createPath: function (pathData) {
559
643
  var path = this.callSuper('createPath', pathData);
560
- path.globalCompositeOperation = this.inverted ? 'source-over' : 'destination-out';
644
+ path.globalCompositeOperation = this.inverted
645
+ ? 'source-over'
646
+ : 'destination-out';
561
647
  path.stroke = this.inverted ? 'white' : 'black';
562
648
  return path;
563
649
  },
@@ -571,12 +657,18 @@
571
657
  * @param {number[]} clipPathContainerTransformMatrix The transform matrix of the object that the clip path belongs to
572
658
  * @returns {fabric.Path} path with clip path
573
659
  */
574
- applyClipPathToPath: function (path, clipPath, clipPathContainerTransformMatrix) {
575
- var pathInvTransform = fabric.util.invertTransform(path.calcTransformMatrix()),
576
- clipPathTransform = clipPath.calcTransformMatrix(),
577
- transform = clipPath.absolutePositioned ?
578
- pathInvTransform :
579
- fabric.util.multiplyTransformMatrices(
660
+ applyClipPathToPath: function (
661
+ path,
662
+ clipPath,
663
+ clipPathContainerTransformMatrix
664
+ ) {
665
+ var pathInvTransform = fabric.util.invertTransform(
666
+ path.calcTransformMatrix()
667
+ ),
668
+ clipPathTransform = clipPath.calcTransformMatrix(),
669
+ transform = clipPath.absolutePositioned
670
+ ? pathInvTransform
671
+ : fabric.util.multiplyTransformMatrices(
580
672
  pathInvTransform,
581
673
  clipPathContainerTransformMatrix
582
674
  );
@@ -585,16 +677,15 @@
585
677
  clipPath.absolutePositioned = false;
586
678
  fabric.util.applyTransformToObject(
587
679
  clipPath,
588
- fabric.util.multiplyTransformMatrices(
589
- transform,
590
- clipPathTransform
591
- )
680
+ fabric.util.multiplyTransformMatrices(transform, clipPathTransform)
592
681
  );
593
682
  // We need to clip `path` with both `clipPath` and it's own clip path if existing (`path.clipPath`)
594
683
  // so in turn `path` erases an object only where it overlaps with all it's clip paths, regardless of how many there are.
595
684
  // this is done because both clip paths may have nested clip paths of their own (this method walks down a collection => this may reccur),
596
685
  // so we can't assign one to the other's clip path property.
597
- path.clipPath = path.clipPath ? fabric.util.mergeClipPaths(clipPath, path.clipPath) : clipPath;
686
+ path.clipPath = path.clipPath
687
+ ? fabric.util.mergeClipPaths(clipPath, path.clipPath)
688
+ : clipPath;
598
689
  return path;
599
690
  },
600
691
 
@@ -604,27 +695,31 @@
604
695
  * Called when a group has a clip path that should be applied to the path before applying erasing on the group's objects.
605
696
  * @param {fabric.Path} path The eraser path
606
697
  * @param {fabric.Object} object The clipPath to apply to path belongs to object
607
- * @param {Function} callback Callback to be invoked with the cloned path after applying the clip path
698
+ * @returns {Promise<fabric.Path>}
608
699
  */
609
- clonePathWithClipPath: function (path, object, callback) {
700
+ clonePathWithClipPath: function (path, object) {
610
701
  var objTransform = object.calcTransformMatrix();
611
702
  var clipPath = object.clipPath;
612
703
  var _this = this;
613
- path.clone(function (_path) {
614
- clipPath.clone(function (_clipPath) {
615
- callback(_this.applyClipPathToPath(_path, _clipPath, objTransform));
616
- }, ['absolutePositioned', 'inverted']);
704
+ return Promise.all([
705
+ path.clone(),
706
+ clipPath.clone(['absolutePositioned', 'inverted']),
707
+ ]).then(function (clones) {
708
+ return _this.applyClipPathToPath(clones[0], clones[1], objTransform);
617
709
  });
618
710
  },
619
711
 
620
712
  /**
621
713
  * Adds path to object's eraser, walks down object's descendants if necessary
622
714
  *
715
+ * @public
623
716
  * @fires erasing:end on object
624
717
  * @param {fabric.Object} obj
625
718
  * @param {fabric.Path} path
719
+ * @param {Object} [context] context to assign erased objects to
720
+ * @returns {Promise<fabric.Path | fabric.Path[]>}
626
721
  */
627
- _addPathToObjectEraser: function (obj, path) {
722
+ _addPathToObjectEraser: function (obj, path, context) {
628
723
  var _this = this;
629
724
  // object is collection, i.e group
630
725
  if (obj.forEachObject && obj.erasable === 'deep') {
@@ -632,16 +727,19 @@
632
727
  return _obj.erasable;
633
728
  });
634
729
  if (targets.length > 0 && obj.clipPath) {
635
- this.clonePathWithClipPath(path, obj, function (_path) {
636
- targets.forEach(function (_obj) {
637
- _this._addPathToObjectEraser(_obj, _path);
638
- });
639
- });
640
- }
641
- else if (targets.length > 0) {
642
- targets.forEach(function (_obj) {
643
- _this._addPathToObjectEraser(_obj, path);
730
+ return this.clonePathWithClipPath(path, obj).then(function (_path) {
731
+ return Promise.all(
732
+ targets.map(function (_obj) {
733
+ return _this._addPathToObjectEraser(_obj, _path, context);
734
+ })
735
+ );
644
736
  });
737
+ } else if (targets.length > 0) {
738
+ return Promise.all(
739
+ targets.map(function (_obj) {
740
+ return _this._addPathToObjectEraser(_obj, path, context);
741
+ })
742
+ );
645
743
  }
646
744
  return;
647
745
  }
@@ -652,23 +750,23 @@
652
750
  obj.eraser = eraser;
653
751
  }
654
752
  // clone and add path
655
- path.clone(function (path) {
753
+ return path.clone().then(function (path) {
656
754
  // http://fabricjs.com/using-transformations
657
755
  var desiredTransform = fabric.util.multiplyTransformMatrices(
658
- fabric.util.invertTransform(
659
- obj.calcTransformMatrix()
660
- ),
756
+ fabric.util.invertTransform(obj.calcTransformMatrix()),
661
757
  path.calcTransformMatrix()
662
758
  );
663
759
  fabric.util.applyTransformToObject(path, desiredTransform);
664
- eraser.addWithUpdate(path);
760
+ eraser.add(path);
665
761
  obj.set('dirty', true);
666
762
  obj.fire('erasing:end', {
667
- path: path
763
+ path: path,
668
764
  });
669
- if (obj.group && Array.isArray(_this.__subTargets)) {
670
- _this.__subTargets.push(obj);
765
+ if (context) {
766
+ (obj.group ? context.subTargets : context.targets).push(obj);
767
+ //context.paths.set(obj, path);
671
768
  }
769
+ return path;
672
770
  });
673
771
  },
674
772
 
@@ -677,22 +775,27 @@
677
775
  *
678
776
  * @param {fabric.Canvas} source
679
777
  * @param {fabric.Canvas} path
680
- * @returns {Object} canvas drawables that were erased by the path
778
+ * @param {Object} [context] context to assign erased objects to
779
+ * @returns {Promise<fabric.Path[]|void>} eraser paths
681
780
  */
682
- applyEraserToCanvas: function (path) {
781
+ applyEraserToCanvas: function (path, context) {
683
782
  var canvas = this.canvas;
684
- var drawables = {};
685
- [
686
- 'backgroundImage',
687
- 'overlayImage',
688
- ].forEach(function (prop) {
689
- var drawable = canvas[prop];
690
- if (drawable && drawable.erasable) {
691
- this._addPathToObjectEraser(drawable, path);
692
- drawables[prop] = drawable;
693
- }
694
- }, this);
695
- return drawables;
783
+ return Promise.all(
784
+ ['backgroundImage', 'overlayImage'].map(function (prop) {
785
+ var drawable = canvas[prop];
786
+ return (
787
+ drawable &&
788
+ drawable.erasable &&
789
+ this._addPathToObjectEraser(drawable, path).then(function (path) {
790
+ if (context) {
791
+ context.drawables[prop] = drawable;
792
+ //context.paths.set(drawable, path);
793
+ }
794
+ return path;
795
+ })
796
+ );
797
+ }, this)
798
+ );
696
799
  },
697
800
 
698
801
  /**
@@ -701,7 +804,8 @@
701
804
  * and add it to every intersected erasable object.
702
805
  */
703
806
  _finalizeAndAddPath: function () {
704
- var ctx = this.canvas.contextTop, canvas = this.canvas;
807
+ var ctx = this.canvas.contextTop,
808
+ canvas = this.canvas;
705
809
  ctx.closePath();
706
810
  if (this.decimate) {
707
811
  this._points = this.decimatePoints(this._points, this.decimate);
@@ -711,9 +815,10 @@
711
815
  canvas.clearContext(canvas.contextTop);
712
816
  this._isErasing = false;
713
817
 
714
- var pathData = this._points && this._points.length > 1 ?
715
- this.convertPointsToSVGPath(this._points) :
716
- null;
818
+ var pathData =
819
+ this._points && this._points.length > 1
820
+ ? this.convertPointsToSVGPath(this._points)
821
+ : null;
717
822
  if (!pathData || this._isEmptySVGPath(pathData)) {
718
823
  canvas.fire('erasing:end');
719
824
  // do not create 0 width/height paths, as they are
@@ -731,33 +836,39 @@
731
836
  canvas.fire('before:path:created', { path: path });
732
837
 
733
838
  // finalize erasing
734
- var drawables = this.applyEraserToCanvas(path);
735
839
  var _this = this;
736
- this.__subTargets = [];
737
- var targets = [];
738
- canvas.forEachObject(function (obj) {
739
- if (obj.erasable && obj.intersectsWithObject(path, true, true)) {
740
- _this._addPathToObjectEraser(obj, path);
741
- targets.push(obj);
742
- }
743
- });
744
- // fire erasing:end
745
- canvas.fire('erasing:end', {
746
- path: path,
747
- targets: targets,
748
- subTargets: this.__subTargets,
749
- drawables: drawables
840
+ var context = {
841
+ targets: [],
842
+ subTargets: [],
843
+ //paths: new Map(),
844
+ drawables: {},
845
+ };
846
+ var tasks = canvas._objects.map(function (obj) {
847
+ return (
848
+ obj.erasable &&
849
+ obj.intersectsWithObject(path, true, true) &&
850
+ _this._addPathToObjectEraser(obj, path, context)
851
+ );
750
852
  });
751
- delete this.__subTargets;
853
+ tasks.push(_this.applyEraserToCanvas(path, context));
854
+ return Promise.all(tasks).then(function () {
855
+ // fire erasing:end
856
+ canvas.fire(
857
+ 'erasing:end',
858
+ Object.assign(context, {
859
+ path: path,
860
+ })
861
+ );
752
862
 
753
- canvas.requestRenderAll();
754
- this._resetShadow();
863
+ canvas.requestRenderAll();
864
+ _this._resetShadow();
755
865
 
756
- // fire event 'path' created
757
- canvas.fire('path:created', { path: path });
758
- }
866
+ // fire event 'path' created
867
+ canvas.fire('path:created', { path: path });
868
+ });
869
+ },
759
870
  }
760
871
  );
761
872
 
762
873
  /** ERASER_END */
763
- })();
874
+ })(typeof exports !== 'undefined' ? exports : window);