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
@@ -0,0 +1,207 @@
1
+ import { iMatrix } from '../../constants';
2
+ import { IPoint, Point } from '../../Point';
3
+ import { TDegree, TMat2D } from '../../typedefs';
4
+ import { cos } from './cos';
5
+ import { degreesToRadians, radiansToDegrees } from './radiansDegreesConversion';
6
+ import { sin } from './sin';
7
+
8
+ type TRotateMatrixArgs = {
9
+ angle?: TDegree;
10
+ };
11
+
12
+ type TTranslateMatrixArgs = {
13
+ translateX?: number;
14
+ translateY?: number;
15
+ };
16
+
17
+ export type TScaleMatrixArgs = {
18
+ scaleX?: number;
19
+ scaleY?: number;
20
+ flipX?: boolean;
21
+ flipY?: boolean;
22
+ skewX?: TDegree;
23
+ skewY?: TDegree;
24
+ };
25
+
26
+ export type TComposeMatrixArgs = TTranslateMatrixArgs &
27
+ TRotateMatrixArgs &
28
+ TScaleMatrixArgs;
29
+
30
+ export type TQrDecomposeOut = Required<
31
+ Omit<TComposeMatrixArgs, 'flipX' | 'flipY'>
32
+ >;
33
+
34
+ export const isIdentityMatrix = (mat: TMat2D) =>
35
+ mat.every((value, index) => value === iMatrix[index]);
36
+
37
+ /**
38
+ * Apply transform t to point p
39
+ * @param {Point | IPoint} p The point to transform
40
+ * @param {Array} t The transform
41
+ * @param {Boolean} [ignoreOffset] Indicates that the offset should not be applied
42
+ * @return {Point} The transformed point
43
+ */
44
+ export const transformPoint = (
45
+ p: IPoint,
46
+ t: TMat2D,
47
+ ignoreOffset?: boolean
48
+ ): Point => new Point(p).transform(t, ignoreOffset);
49
+
50
+ /**
51
+ * Invert transformation t
52
+ * @param {Array} t The transform
53
+ * @return {Array} The inverted transform
54
+ */
55
+ export const invertTransform = (t: TMat2D): TMat2D => {
56
+ const a = 1 / (t[0] * t[3] - t[1] * t[2]),
57
+ r = [a * t[3], -a * t[1], -a * t[2], a * t[0], 0, 0] as TMat2D,
58
+ { x, y } = transformPoint(new Point(t[4], t[5]), r, true);
59
+ r[4] = -x;
60
+ r[5] = -y;
61
+ return r;
62
+ };
63
+
64
+ /**
65
+ * Multiply matrix A by matrix B to nest transformations
66
+ * @param {TMat2D} a First transformMatrix
67
+ * @param {TMat2D} b Second transformMatrix
68
+ * @param {Boolean} is2x2 flag to multiply matrices as 2x2 matrices
69
+ * @return {TMat2D} The product of the two transform matrices
70
+ */
71
+ export const multiplyTransformMatrices = (
72
+ a: TMat2D,
73
+ b: TMat2D,
74
+ is2x2?: boolean
75
+ ): TMat2D =>
76
+ [
77
+ a[0] * b[0] + a[2] * b[1],
78
+ a[1] * b[0] + a[3] * b[1],
79
+ a[0] * b[2] + a[2] * b[3],
80
+ a[1] * b[2] + a[3] * b[3],
81
+ is2x2 ? 0 : a[0] * b[4] + a[2] * b[5] + a[4],
82
+ is2x2 ? 0 : a[1] * b[4] + a[3] * b[5] + a[5],
83
+ ] as TMat2D;
84
+
85
+ /**
86
+ * Decomposes standard 2x3 matrix into transform components
87
+ * @param {TMat2D} a transformMatrix
88
+ * @return {Object} Components of transform
89
+ */
90
+ export const qrDecompose = (a: TMat2D): TQrDecomposeOut => {
91
+ const angle = Math.atan2(a[1], a[0]),
92
+ denom = Math.pow(a[0], 2) + Math.pow(a[1], 2),
93
+ scaleX = Math.sqrt(denom),
94
+ scaleY = (a[0] * a[3] - a[2] * a[1]) / scaleX,
95
+ skewX = Math.atan2(a[0] * a[2] + a[1] * a[3], denom);
96
+ return {
97
+ angle: radiansToDegrees(angle),
98
+ scaleX,
99
+ scaleY,
100
+ skewX: radiansToDegrees(skewX),
101
+ skewY: 0 as TDegree,
102
+ translateX: a[4] || 0,
103
+ translateY: a[5] || 0,
104
+ };
105
+ };
106
+
107
+ /**
108
+ * Returns a transform matrix starting from an object of the same kind of
109
+ * the one returned from qrDecompose, useful also if you want to calculate some
110
+ * transformations from an object that is not enlived yet
111
+ * @param {Object} options
112
+ * @param {Number} [options.angle] angle in degrees
113
+ * @return {TMat2D} transform matrix
114
+ */
115
+ export const calcRotateMatrix = ({ angle }: TRotateMatrixArgs): TMat2D => {
116
+ if (!angle) {
117
+ return iMatrix;
118
+ }
119
+ const theta = degreesToRadians(angle),
120
+ cosin = cos(theta),
121
+ sinus = sin(theta);
122
+ return [cosin, sinus, -sinus, cosin, 0, 0];
123
+ };
124
+
125
+ /**
126
+ * Returns a transform matrix starting from an object of the same kind of
127
+ * the one returned from qrDecompose, useful also if you want to calculate some
128
+ * transformations from an object that is not enlived yet.
129
+ * is called DimensionsTransformMatrix because those properties are the one that influence
130
+ * the size of the resulting box of the object.
131
+ * @param {Object} options
132
+ * @param {Number} [options.scaleX]
133
+ * @param {Number} [options.scaleY]
134
+ * @param {Boolean} [options.flipX]
135
+ * @param {Boolean} [options.flipY]
136
+ * @param {Number} [options.skewX]
137
+ * @param {Number} [options.skewY]
138
+ * @return {Number[]} transform matrix
139
+ */
140
+ export const calcDimensionsMatrix = ({
141
+ scaleX = 1,
142
+ scaleY = 1,
143
+ flipX = false,
144
+ flipY = false,
145
+ skewX = 0 as TDegree,
146
+ skewY = 0 as TDegree,
147
+ }: TScaleMatrixArgs) => {
148
+ let scaleMatrix = iMatrix;
149
+ if (scaleX !== 1 || scaleY !== 1 || flipX || flipY) {
150
+ scaleMatrix = [
151
+ flipX ? -scaleX : scaleX,
152
+ 0,
153
+ 0,
154
+ flipY ? -scaleY : scaleY,
155
+ 0,
156
+ 0,
157
+ ] as TMat2D;
158
+ }
159
+ if (skewX) {
160
+ scaleMatrix = multiplyTransformMatrices(
161
+ scaleMatrix,
162
+ [1, 0, Math.tan(degreesToRadians(skewX)), 1] as unknown as TMat2D,
163
+ true
164
+ );
165
+ }
166
+ if (skewY) {
167
+ scaleMatrix = multiplyTransformMatrices(
168
+ scaleMatrix,
169
+ [1, Math.tan(degreesToRadians(skewY)), 0, 1] as unknown as TMat2D,
170
+ true
171
+ );
172
+ }
173
+ return scaleMatrix;
174
+ };
175
+
176
+ /**
177
+ * Returns a transform matrix starting from an object of the same kind of
178
+ * the one returned from qrDecompose, useful also if you want to calculate some
179
+ * transformations from an object that is not enlived yet
180
+ * @param {Object} options
181
+ * @param {Number} [options.angle]
182
+ * @param {Number} [options.scaleX]
183
+ * @param {Number} [options.scaleY]
184
+ * @param {Boolean} [options.flipX]
185
+ * @param {Boolean} [options.flipY]
186
+ * @param {Number} [options.skewX]
187
+ * @param {Number} [options.skewY]
188
+ * @param {Number} [options.translateX]
189
+ * @param {Number} [options.translateY]
190
+ * @return {Number[]} transform matrix
191
+ */
192
+ export const composeMatrix = ({
193
+ translateX = 0,
194
+ translateY = 0,
195
+ angle = 0 as TDegree,
196
+ ...otherOptions
197
+ }: TComposeMatrixArgs): TMat2D => {
198
+ let matrix = [1, 0, 0, 1, translateX, translateY] as TMat2D;
199
+ if (angle) {
200
+ matrix = multiplyTransformMatrices(matrix, calcRotateMatrix({ angle }));
201
+ }
202
+ const scaleMatrix = calcDimensionsMatrix(otherOptions);
203
+ if (scaleMatrix !== iMatrix) {
204
+ matrix = multiplyTransformMatrices(matrix, scaleMatrix);
205
+ }
206
+ return matrix;
207
+ };
@@ -0,0 +1,40 @@
1
+ import type { FabricObject } from '../../shapes/Object/FabricObject';
2
+ import { sendObjectToPlane } from './planeChange';
3
+ import { Group } from '../../shapes/Group';
4
+ /**
5
+ * Merges 2 clip paths into one visually equal clip path
6
+ *
7
+ * **IMPORTANT**:\
8
+ * Does **NOT** clone the arguments, clone them proir if necessary.
9
+ *
10
+ * Creates a wrapper (group) that contains one clip path and is clipped by the other so content is kept where both overlap.
11
+ * Use this method if both the clip paths may have nested clip paths of their own, so assigning one to the other's clip path property is not possible.
12
+ *
13
+ * In order to handle the `inverted` property we follow logic described in the following cases:\
14
+ * **(1)** both clip paths are inverted - the clip paths pass the inverted prop to the wrapper and loose it themselves.\
15
+ * **(2)** one is inverted and the other isn't - the wrapper shouldn't become inverted and the inverted clip path must clip the non inverted one to produce an identical visual effect.\
16
+ * **(3)** both clip paths are not inverted - wrapper and clip paths remain unchanged.
17
+ *
18
+ * @memberOf fabric.util
19
+ * @param {fabric.Object} c1
20
+ * @param {fabric.Object} c2
21
+ * @returns {fabric.Object} merged clip path
22
+ */
23
+ export const mergeClipPaths = (c1: FabricObject, c2: FabricObject) => {
24
+ let a = c1,
25
+ b = c2;
26
+ if (a.inverted && !b.inverted) {
27
+ // case (2)
28
+ a = c2;
29
+ b = c1;
30
+ }
31
+ // `b` becomes `a`'s clip path so we transform `b` to `a` coordinate plane
32
+ sendObjectToPlane(b, b.group?.calcTransformMatrix(), a.calcTransformMatrix());
33
+ // assign the `inverted` prop to the wrapping group
34
+ const inverted = a.inverted && b.inverted;
35
+ if (inverted) {
36
+ // case (1)
37
+ a.inverted = b.inverted = false;
38
+ }
39
+ return new Group([a], { clipPath: b, inverted });
40
+ };
@@ -0,0 +1,189 @@
1
+ import { noop } from '../../constants';
2
+ import type { Gradient } from '../../gradient/Gradient';
3
+ import type { Pattern } from '../../Pattern';
4
+ import type { FabricObject } from '../../shapes/Object/FabricObject';
5
+ import type { TCrossOrigin, TFiller } from '../../typedefs';
6
+ import { createImage } from './dom';
7
+ import { classRegistry } from '../class_registry';
8
+
9
+ export type LoadImageOptions = {
10
+ /**
11
+ * see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal
12
+ */
13
+ signal?: AbortSignal;
14
+ /**
15
+ * cors value for the image loading, default to anonymous
16
+ */
17
+ crossOrigin?: TCrossOrigin;
18
+ };
19
+
20
+ /**
21
+ * Loads image element from given url and resolve it, or catch.
22
+ * @param {String} url URL representing an image
23
+ * @param {LoadImageOptions} [options] image loading options
24
+ * @returns {Promise<HTMLImageElement>} the loaded image.
25
+ */
26
+ export const loadImage = (
27
+ url: string,
28
+ { signal, crossOrigin = null }: LoadImageOptions = {}
29
+ ) =>
30
+ new Promise<HTMLImageElement>(function (resolve, reject) {
31
+ if (signal && signal.aborted) {
32
+ return reject(new Error('`options.signal` is in `aborted` state'));
33
+ }
34
+ const img = createImage();
35
+ let abort: EventListenerOrEventListenerObject;
36
+ if (signal) {
37
+ abort = function (err: Event) {
38
+ img.src = '';
39
+ reject(err);
40
+ };
41
+ signal.addEventListener('abort', abort, { once: true });
42
+ }
43
+ const done = function () {
44
+ img.onload = img.onerror = null;
45
+ abort && signal?.removeEventListener('abort', abort);
46
+ resolve(img);
47
+ };
48
+ if (!url) {
49
+ done();
50
+ return;
51
+ }
52
+ img.onload = done;
53
+ img.onerror = function () {
54
+ abort && signal?.removeEventListener('abort', abort);
55
+ reject(new Error('Error loading ' + img.src));
56
+ };
57
+ crossOrigin && (img.crossOrigin = crossOrigin);
58
+ img.src = url;
59
+ });
60
+
61
+ export type EnlivenObjectOptions = {
62
+ /**
63
+ * handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal
64
+ */
65
+ signal?: AbortSignal;
66
+ /**
67
+ * Method for further parsing of object elements,
68
+ * called after each fabric object created.
69
+ */
70
+ reviver?: (
71
+ serializedObj: Record<string, any>,
72
+ instance: FabricObject
73
+ ) => void;
74
+ /**
75
+ * Namespace to get klass "Class" object from
76
+ */
77
+ namespace?: any;
78
+ };
79
+
80
+ /**
81
+ * Creates corresponding fabric instances from their object representations
82
+ * @param {Object[]} objects Objects to enliven
83
+ * @param {EnlivenObjectOptions} [options]
84
+ * @param {object} [options.namespace] Namespace to get klass "Class" object from
85
+ * @param {(serializedObj: object, instance: FabricObject) => any} [options.reviver] Method for further parsing of object elements,
86
+ * called after each fabric object created.
87
+ * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal
88
+ * @returns {Promise<FabricObject[]>}
89
+ */
90
+ export const enlivenObjects = (
91
+ objects: any[],
92
+ { signal, reviver = noop }: EnlivenObjectOptions = {}
93
+ ) =>
94
+ new Promise<FabricObject[]>((resolve, reject) => {
95
+ const instances: FabricObject[] = [];
96
+ signal && signal.addEventListener('abort', reject, { once: true });
97
+ Promise.all(
98
+ objects.map((obj) =>
99
+ classRegistry
100
+ .getClass(obj.type)
101
+ // @ts-ignore
102
+ .fromObject(obj, {
103
+ signal,
104
+ reviver,
105
+ })
106
+ .then((fabricInstance: FabricObject) => {
107
+ reviver(obj, fabricInstance);
108
+ instances.push(fabricInstance);
109
+ return fabricInstance;
110
+ })
111
+ )
112
+ )
113
+ .then(resolve)
114
+ .catch((error) => {
115
+ // cleanup
116
+ instances.forEach(function (instance) {
117
+ instance.dispose && instance.dispose();
118
+ });
119
+ reject(error);
120
+ })
121
+ .finally(() => {
122
+ signal && signal.removeEventListener('abort', reject);
123
+ });
124
+ });
125
+
126
+ /**
127
+ * Creates corresponding fabric instances residing in an object, e.g. `clipPath`
128
+ * @param {Object} object with properties to enlive ( fill, stroke, clipPath, path )
129
+ * @param {object} [options]
130
+ * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal
131
+ * @returns {Promise<Record<string, FabricObject | TFiller | null>>} the input object with enlived values
132
+ */
133
+ export const enlivenObjectEnlivables = <
134
+ R = Record<string, FabricObject | TFiller | null>
135
+ >(
136
+ serializedObject: any,
137
+ { signal }: { signal?: AbortSignal } = {}
138
+ ) =>
139
+ new Promise<R>((resolve, reject) => {
140
+ const instances: (FabricObject | TFiller)[] = [];
141
+ signal && signal.addEventListener('abort', reject, { once: true });
142
+ // enlive every possible property
143
+ const promises = Object.values(serializedObject).map((value: any) => {
144
+ if (!value) {
145
+ return value;
146
+ }
147
+ // gradient
148
+ if (value.colorStops) {
149
+ return new (classRegistry.getClass('gradient'))(value);
150
+ }
151
+ // clipPath
152
+ if (value.type) {
153
+ return enlivenObjects([value], { signal }).then(([enlived]) => {
154
+ instances.push(enlived);
155
+ return enlived;
156
+ });
157
+ }
158
+ // pattern
159
+ if (value.source) {
160
+ return classRegistry
161
+ .getClass('pattern')
162
+ .fromObject(value, { signal })
163
+ .then((pattern: Pattern) => {
164
+ instances.push(pattern);
165
+ return pattern;
166
+ });
167
+ }
168
+ return value;
169
+ });
170
+ const keys = Object.keys(serializedObject);
171
+ Promise.all(promises)
172
+ .then((enlived) => {
173
+ return enlived.reduce((acc, instance, index) => {
174
+ acc[keys[index]] = instance;
175
+ return acc;
176
+ }, {});
177
+ })
178
+ .then(resolve)
179
+ .catch((error) => {
180
+ // cleanup
181
+ instances.forEach((instance: any) => {
182
+ instance.dispose && instance.dispose();
183
+ });
184
+ reject(error);
185
+ })
186
+ .finally(() => {
187
+ signal && signal.removeEventListener('abort', reject);
188
+ });
189
+ });
@@ -0,0 +1,129 @@
1
+ import { Point } from '../../Point';
2
+ import type { FabricObject } from '../../shapes/Object/Object';
3
+ import { TMat2D } from '../../typedefs';
4
+ import { makeBoundingBoxFromPoints } from './boundingBoxFromPoints';
5
+ import type { TScaleMatrixArgs } from './matrix';
6
+ import {
7
+ calcDimensionsMatrix,
8
+ invertTransform,
9
+ multiplyTransformMatrices,
10
+ qrDecompose,
11
+ } from './matrix';
12
+
13
+ /**
14
+ * given an object and a transform, apply the inverse transform to the object,
15
+ * this is equivalent to remove from that object that transformation, so that
16
+ * added in a space with the removed transform, the object will be the same as before.
17
+ * Removing from an object a transform that scale by 2 is like scaling it by 1/2.
18
+ * Removing from an object a transform that rotate by 30deg is like rotating by 30deg
19
+ * in the opposite direction.
20
+ * This util is used to add objects inside transformed groups or nested groups.
21
+ * @param {FabricObject} object the object you want to transform
22
+ * @param {TMat2D} transform the destination transform
23
+ */
24
+ export const removeTransformFromObject = (
25
+ object: FabricObject,
26
+ transform: TMat2D
27
+ ) => {
28
+ const inverted = invertTransform(transform),
29
+ finalTransform = multiplyTransformMatrices(
30
+ inverted,
31
+ object.calcOwnMatrix()
32
+ );
33
+ applyTransformToObject(object, finalTransform);
34
+ };
35
+
36
+ /**
37
+ * given an object and a transform, apply the transform to the object.
38
+ * this is equivalent to change the space where the object is drawn.
39
+ * Adding to an object a transform that scale by 2 is like scaling it by 2.
40
+ * This is used when removing an object from an active selection for example.
41
+ * @param {FabricObject} object the object you want to transform
42
+ * @param {Array} transform the destination transform
43
+ */
44
+ export const addTransformToObject = (object: FabricObject, transform: TMat2D) =>
45
+ applyTransformToObject(
46
+ object,
47
+ multiplyTransformMatrices(transform, object.calcOwnMatrix())
48
+ );
49
+
50
+ /**
51
+ * discard an object transform state and apply the one from the matrix.
52
+ * @param {FabricObject} object the object you want to transform
53
+ * @param {Array} transform the destination transform
54
+ */
55
+ export const applyTransformToObject = (
56
+ object: FabricObject,
57
+ transform: TMat2D
58
+ ) => {
59
+ const { translateX, translateY, scaleX, scaleY, ...otherOptions } =
60
+ qrDecompose(transform),
61
+ center = new Point(translateX, translateY);
62
+ object.flipX = false;
63
+ object.flipY = false;
64
+ Object.assign(object, otherOptions);
65
+ object.set({ scaleX, scaleY });
66
+ object.setPositionByOrigin(center, 'center', 'center');
67
+ };
68
+ /**
69
+ * reset an object transform state to neutral. Top and left are not accounted for
70
+ * @param {FabricObject} target object to transform
71
+ */
72
+ export const resetObjectTransform = (target: FabricObject) => {
73
+ target.scaleX = 1;
74
+ target.scaleY = 1;
75
+ target.skewX = 0;
76
+ target.skewY = 0;
77
+ target.flipX = false;
78
+ target.flipY = false;
79
+ target.rotate(0);
80
+ };
81
+
82
+ /**
83
+ * Extract Object transform values
84
+ * @param {FabricObject} target object to read from
85
+ * @return {Object} Components of transform
86
+ */
87
+ export const saveObjectTransform = (target: FabricObject) => ({
88
+ scaleX: target.scaleX,
89
+ scaleY: target.scaleY,
90
+ skewX: target.skewX,
91
+ skewY: target.skewY,
92
+ angle: target.angle,
93
+ left: target.left,
94
+ flipX: target.flipX,
95
+ flipY: target.flipY,
96
+ top: target.top,
97
+ });
98
+
99
+ /**
100
+ * given a width and height, return the size of the bounding box
101
+ * that can contains the box with width/height with applied transform
102
+ * described in options.
103
+ * Use to calculate the boxes around objects for controls.
104
+ * @param {Number} width
105
+ * @param {Number} height
106
+ * @param {Object} options
107
+ * @param {Number} options.scaleX
108
+ * @param {Number} options.scaleY
109
+ * @param {Number} options.skewX
110
+ * @param {Number} options.skewY
111
+ * @returns {Point} size
112
+ */
113
+ export const sizeAfterTransform = (
114
+ width: number,
115
+ height: number,
116
+ options: TScaleMatrixArgs
117
+ ) => {
118
+ const dimX = width / 2,
119
+ dimY = height / 2,
120
+ transformMatrix = calcDimensionsMatrix(options),
121
+ points = [
122
+ new Point(-dimX, -dimY),
123
+ new Point(dimX, -dimY),
124
+ new Point(-dimX, dimY),
125
+ new Point(dimX, dimY),
126
+ ].map((p) => p.transform(transformMatrix)),
127
+ bbox = makeBoundingBoxFromPoints(points);
128
+ return new Point(bbox.width, bbox.height);
129
+ };
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Populates an object with properties of another object
3
+ * @param {Object} source Source object
4
+ * @param {string[]} properties Properties names to include
5
+ * @returns object populated with the picked keys
6
+ */
7
+ export const pick = <T extends Record<string, any>>(
8
+ source: T,
9
+ keys: (keyof T)[] = []
10
+ ) => {
11
+ return keys.reduce((o, key) => {
12
+ if (key in source) {
13
+ o[key] = source[key];
14
+ }
15
+ return o;
16
+ }, {} as Partial<T>);
17
+ };