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,31 @@
1
+ import { TransformActionHandler } from '../EventTypeDefs';
2
+ import { fireEvent } from '../util/fireEvent';
3
+ import { commonEventInfo, isLocked } from './util';
4
+
5
+ /**
6
+ * Action handler
7
+ * @private
8
+ * @param {Event} eventData javascript event that is doing the transform
9
+ * @param {Object} transform javascript object containing a series of information around the current transform
10
+ * @param {number} x current mouse x position, canvas normalized
11
+ * @param {number} y current mouse y position, canvas normalized
12
+ * @return {Boolean} true if the translation occurred
13
+ */
14
+ export const dragHandler: TransformActionHandler = (
15
+ eventData,
16
+ transform,
17
+ x,
18
+ y
19
+ ) => {
20
+ const { target, offsetX, offsetY } = transform,
21
+ newLeft = x - offsetX,
22
+ newTop = y - offsetY,
23
+ moveX = !isLocked(target, 'lockMovementX') && target.left !== newLeft,
24
+ moveY = !isLocked(target, 'lockMovementY') && target.top !== newTop;
25
+ moveX && target.set('left', newLeft);
26
+ moveY && target.set('top', newTop);
27
+ if (moveX || moveY) {
28
+ fireEvent('moving', commonEventInfo(eventData, transform, x, y));
29
+ }
30
+ return moveX || moveY;
31
+ };
@@ -0,0 +1,135 @@
1
+ import { Point } from '../Point';
2
+ import { Control } from './Control';
3
+ import { TMat2D } from '../typedefs';
4
+ import { iMatrix } from '../constants';
5
+ import type { Polyline } from '../shapes/Polyline';
6
+ import { multiplyTransformMatrices } from '../util/misc/matrix';
7
+ import {
8
+ TPointerEvent,
9
+ Transform,
10
+ TransformActionHandler,
11
+ } from '../EventTypeDefs';
12
+ import { getLocalPoint } from './util';
13
+
14
+ type TTransformAnchor = Transform & { pointIndex: number };
15
+
16
+ const getSize = (poly: Polyline) => {
17
+ return new Point(poly.width, poly.height);
18
+ };
19
+
20
+ /**
21
+ * This function locates the controls.
22
+ * It'll be used both for drawing and for interaction.
23
+ */
24
+ const factoryPolyPositionHandler = (pointIndex: number) => {
25
+ return function (dim: Point, finalMatrix: TMat2D, polyObject: Polyline) {
26
+ const x = polyObject.points[pointIndex].x - polyObject.pathOffset.x,
27
+ y = polyObject.points[pointIndex].y - polyObject.pathOffset.y;
28
+ return new Point(x, y).transform(
29
+ multiplyTransformMatrices(
30
+ polyObject.canvas?.viewportTransform ?? iMatrix,
31
+ polyObject.calcTransformMatrix()
32
+ )
33
+ );
34
+ };
35
+ };
36
+
37
+ /**
38
+ * This function defines what the control does.
39
+ * It'll be called on every mouse move after a control has been clicked and is being dragged.
40
+ * The function receives as argument the mouse event, the current transform object
41
+ * and the current position in canvas coordinate `transform.target` is a reference to the
42
+ * current object being transformed.
43
+ */
44
+ const polyActionHandler = (
45
+ eventData: TPointerEvent,
46
+ transform: TTransformAnchor,
47
+ x: number,
48
+ y: number
49
+ ) => {
50
+ const poly = transform.target as Polyline,
51
+ pointIndex = transform.pointIndex,
52
+ mouseLocalPosition = getLocalPoint(transform, 'center', 'center', x, y),
53
+ polygonBaseSize = getSize(poly),
54
+ size = poly._getTransformedDimensions(),
55
+ sizeFactor = polygonBaseSize.divide(size),
56
+ adjustFlip = new Point(poly.flipX ? -1 : 1, poly.flipY ? -1 : 1);
57
+
58
+ const finalPointPosition = mouseLocalPosition
59
+ .multiply(adjustFlip)
60
+ .multiply(sizeFactor)
61
+ .add(poly.pathOffset);
62
+
63
+ poly.points[pointIndex] = finalPointPosition;
64
+ poly.setDimensions();
65
+
66
+ return true;
67
+ };
68
+
69
+ /**
70
+ * Keep the polygon in the same position when we change its `width`/`height`/`top`/`left`.
71
+ */
72
+ const anchorWrapper = (
73
+ pointIndex: number,
74
+ fn: TransformActionHandler<TTransformAnchor>
75
+ ) => {
76
+ return function (
77
+ eventData: TPointerEvent,
78
+ transform: Transform,
79
+ x: number,
80
+ y: number
81
+ ) {
82
+ const poly = transform.target as Polyline,
83
+ anchorIndex = (pointIndex > 0 ? pointIndex : poly.points.length) - 1,
84
+ pointInParentPlane = new Point(
85
+ poly.points[anchorIndex].x - poly.pathOffset.x,
86
+ poly.points[anchorIndex].y - poly.pathOffset.y
87
+ ).transform(poly.calcOwnMatrix()),
88
+ actionPerformed = fn(eventData, { ...transform, pointIndex }, x, y),
89
+ polygonBaseSize = getSize(poly),
90
+ adjustFlip = new Point(poly.flipX ? -1 : 1, poly.flipY ? -1 : 1);
91
+
92
+ const newPosition = new Point(
93
+ poly.points[anchorIndex].x,
94
+ poly.points[anchorIndex].y
95
+ )
96
+ .subtract(poly.pathOffset)
97
+ .divide(polygonBaseSize)
98
+ .multiply(adjustFlip);
99
+
100
+ poly.setPositionByOrigin(
101
+ pointInParentPlane,
102
+ newPosition.x + 0.5,
103
+ newPosition.y + 0.5
104
+ );
105
+ return actionPerformed;
106
+ };
107
+ };
108
+
109
+ export function createPolyControls(
110
+ poly: Polyline,
111
+ options?: Partial<Control>
112
+ ): Record<string, Control>;
113
+ export function createPolyControls(
114
+ numOfControls: number,
115
+ options?: Partial<Control>
116
+ ): Record<string, Control>;
117
+ export function createPolyControls(
118
+ arg0: number | Polyline,
119
+ options: Partial<Control> = {}
120
+ ) {
121
+ const controls = {} as Record<string, Control>;
122
+ for (
123
+ let idx = 0;
124
+ idx < (typeof arg0 === 'number' ? arg0 : arg0.points.length);
125
+ idx++
126
+ ) {
127
+ controls[`p${idx}`] = new Control({
128
+ actionName: 'modifyPoly',
129
+ positionHandler: factoryPolyPositionHandler(idx),
130
+ actionHandler: anchorWrapper(idx, polyActionHandler),
131
+ ...options,
132
+ });
133
+ }
134
+ return controls;
135
+ }
@@ -0,0 +1,87 @@
1
+ import {
2
+ ControlCursorCallback,
3
+ TransformActionHandler,
4
+ } from '../EventTypeDefs';
5
+ import { radiansToDegrees } from '../util/misc/radiansDegreesConversion';
6
+ import { isLocked, NOT_ALLOWED_CURSOR } from './util';
7
+ import { wrapWithFireEvent } from './wrapWithFireEvent';
8
+ import { wrapWithFixedAnchor } from './wrapWithFixedAnchor';
9
+
10
+ /**
11
+ * Find the correct style for the control that is used for rotation.
12
+ * this function is very simple and it just take care of not-allowed or standard cursor
13
+ * @param {Event} eventData the javascript event that is causing the scale
14
+ * @param {Control} control the control that is interested in the action
15
+ * @param {FabricObject} fabricObject the fabric object that is interested in the action
16
+ * @return {String} a valid css string for the cursor
17
+ */
18
+ export const rotationStyleHandler: ControlCursorCallback = (
19
+ eventData,
20
+ control,
21
+ fabricObject
22
+ ) => {
23
+ if (fabricObject.lockRotation) {
24
+ return NOT_ALLOWED_CURSOR;
25
+ }
26
+ return control.cursorStyle;
27
+ };
28
+
29
+ /**
30
+ * Action handler for rotation and snapping, without anchor point.
31
+ * Needs to be wrapped with `wrapWithFixedAnchor` to be effective
32
+ * @param {Event} eventData javascript event that is doing the transform
33
+ * @param {Object} transform javascript object containing a series of information around the current transform
34
+ * @param {number} x current mouse x position, canvas normalized
35
+ * @param {number} y current mouse y position, canvas normalized
36
+ * @return {Boolean} true if some change happened
37
+ * @private
38
+ */
39
+ const rotateObjectWithSnapping: TransformActionHandler = (
40
+ eventData,
41
+ { target, ex, ey, theta, originX, originY },
42
+ x,
43
+ y
44
+ ) => {
45
+ const pivotPoint = target.translateToOriginPoint(
46
+ target.getRelativeCenterPoint(),
47
+ originX,
48
+ originY
49
+ );
50
+
51
+ if (isLocked(target, 'lockRotation')) {
52
+ return false;
53
+ }
54
+
55
+ const lastAngle = Math.atan2(ey - pivotPoint.y, ex - pivotPoint.x),
56
+ curAngle = Math.atan2(y - pivotPoint.y, x - pivotPoint.x);
57
+ let angle = radiansToDegrees(curAngle - lastAngle + theta);
58
+
59
+ if (target.snapAngle && target.snapAngle > 0) {
60
+ const snapAngle = target.snapAngle,
61
+ snapThreshold = target.snapThreshold || snapAngle,
62
+ rightAngleLocked = Math.ceil(angle / snapAngle) * snapAngle,
63
+ leftAngleLocked = Math.floor(angle / snapAngle) * snapAngle;
64
+
65
+ if (Math.abs(angle - leftAngleLocked) < snapThreshold) {
66
+ angle = leftAngleLocked;
67
+ } else if (Math.abs(angle - rightAngleLocked) < snapThreshold) {
68
+ angle = rightAngleLocked;
69
+ }
70
+ }
71
+
72
+ // normalize angle to positive value
73
+ if (angle < 0) {
74
+ angle = 360 + angle;
75
+ }
76
+ angle %= 360;
77
+
78
+ const hasRotated = target.angle !== angle;
79
+ // TODO: why aren't we using set?
80
+ target.angle = angle;
81
+ return hasRotated;
82
+ };
83
+
84
+ export const rotationWithSnapping = wrapWithFireEvent(
85
+ 'rotating',
86
+ wrapWithFixedAnchor(rotateObjectWithSnapping)
87
+ );
@@ -0,0 +1,277 @@
1
+ import {
2
+ ControlCursorCallback,
3
+ TPointerEvent,
4
+ Transform,
5
+ TransformActionHandler,
6
+ } from '../EventTypeDefs';
7
+ import type { FabricObject } from '../shapes/Object/FabricObject';
8
+ import { TAxis } from '../typedefs';
9
+ import type { Canvas } from '../canvas/Canvas';
10
+ import {
11
+ findCornerQuadrant,
12
+ getLocalPoint,
13
+ invertOrigin,
14
+ isLocked,
15
+ isTransformCentered,
16
+ NOT_ALLOWED_CURSOR,
17
+ } from './util';
18
+ import { wrapWithFireEvent } from './wrapWithFireEvent';
19
+ import { wrapWithFixedAnchor } from './wrapWithFixedAnchor';
20
+
21
+ type ScaleTransform = Transform & {
22
+ gestureScale?: number;
23
+ signX?: number;
24
+ signY?: number;
25
+ };
26
+
27
+ type ScaleBy = TAxis | 'equally' | '' | undefined;
28
+
29
+ /**
30
+ * Inspect event and fabricObject properties to understand if the scaling action
31
+ * @param {Event} eventData from the user action
32
+ * @param {FabricObject} fabricObject the fabric object about to scale
33
+ * @return {Boolean} true if scale is proportional
34
+ */
35
+ export function scaleIsProportional(
36
+ eventData: TPointerEvent,
37
+ fabricObject: FabricObject
38
+ ): boolean {
39
+ const canvas = fabricObject.canvas as Canvas,
40
+ uniformIsToggled = eventData[canvas.uniScaleKey!];
41
+ return (
42
+ (canvas.uniformScaling && !uniformIsToggled) ||
43
+ (!canvas.uniformScaling && uniformIsToggled)
44
+ );
45
+ }
46
+
47
+ /**
48
+ * Inspect fabricObject to understand if the current scaling action is allowed
49
+ * @param {FabricObject} fabricObject the fabric object about to scale
50
+ * @param {String} by 'x' or 'y' or ''
51
+ * @param {Boolean} scaleProportionally true if we are trying to scale proportionally
52
+ * @return {Boolean} true if scaling is not allowed at current conditions
53
+ */
54
+ export function scalingIsForbidden(
55
+ fabricObject: FabricObject,
56
+ by: ScaleBy,
57
+ scaleProportionally: boolean
58
+ ) {
59
+ const lockX = isLocked(fabricObject, 'lockScalingX'),
60
+ lockY = isLocked(fabricObject, 'lockScalingY');
61
+ if (lockX && lockY) {
62
+ return true;
63
+ }
64
+ if (!by && (lockX || lockY) && scaleProportionally) {
65
+ return true;
66
+ }
67
+ if (lockX && by === 'x') {
68
+ return true;
69
+ }
70
+ if (lockY && by === 'y') {
71
+ return true;
72
+ }
73
+ return false;
74
+ }
75
+
76
+ const scaleMap = ['e', 'se', 's', 'sw', 'w', 'nw', 'n', 'ne', 'e'];
77
+
78
+ /**
79
+ * return the correct cursor style for the scale action
80
+ * @param {Event} eventData the javascript event that is causing the scale
81
+ * @param {Control} control the control that is interested in the action
82
+ * @param {FabricObject} fabricObject the fabric object that is interested in the action
83
+ * @return {String} a valid css string for the cursor
84
+ */
85
+ export const scaleCursorStyleHandler: ControlCursorCallback = (
86
+ eventData,
87
+ control,
88
+ fabricObject
89
+ ) => {
90
+ const scaleProportionally = scaleIsProportional(eventData, fabricObject),
91
+ by =
92
+ control.x !== 0 && control.y === 0
93
+ ? 'x'
94
+ : control.x === 0 && control.y !== 0
95
+ ? 'y'
96
+ : '';
97
+ if (scalingIsForbidden(fabricObject, by, scaleProportionally)) {
98
+ return NOT_ALLOWED_CURSOR;
99
+ }
100
+ const n = findCornerQuadrant(fabricObject, control);
101
+ return `${scaleMap[n]}-resize`;
102
+ };
103
+
104
+ /**
105
+ * Basic scaling logic, reused with different constrain for scaling X,Y, freely or equally.
106
+ * Needs to be wrapped with `wrapWithFixedAnchor` to be effective
107
+ * @param {Event} eventData javascript event that is doing the transform
108
+ * @param {Object} transform javascript object containing a series of information around the current transform
109
+ * @param {number} x current mouse x position, canvas normalized
110
+ * @param {number} y current mouse y position, canvas normalized
111
+ * @param {Object} options additional information for scaling
112
+ * @param {String} options.by 'x', 'y', 'equally' or '' to indicate type of scaling
113
+ * @return {Boolean} true if some change happened
114
+ * @private
115
+ */
116
+ function scaleObject(
117
+ eventData: TPointerEvent,
118
+ transform: ScaleTransform,
119
+ x: number,
120
+ y: number,
121
+ options: { by?: ScaleBy } = {}
122
+ ) {
123
+ const target = transform.target,
124
+ by = options.by,
125
+ scaleProportionally = scaleIsProportional(eventData, target),
126
+ forbidScaling = scalingIsForbidden(target, by, scaleProportionally);
127
+ let newPoint, scaleX, scaleY, dim, signX, signY;
128
+
129
+ if (forbidScaling) {
130
+ return false;
131
+ }
132
+ if (transform.gestureScale) {
133
+ scaleX = transform.scaleX * transform.gestureScale;
134
+ scaleY = transform.scaleY * transform.gestureScale;
135
+ } else {
136
+ newPoint = getLocalPoint(
137
+ transform,
138
+ transform.originX,
139
+ transform.originY,
140
+ x,
141
+ y
142
+ );
143
+ // use of sign: We use sign to detect change of direction of an action. sign usually change when
144
+ // we cross the origin point with the mouse. So a scale flip for example. There is an issue when scaling
145
+ // by center and scaling using one middle control ( default: mr, mt, ml, mb), the mouse movement can easily
146
+ // cross many time the origin point and flip the object. so we need a way to filter out the noise.
147
+ // This ternary here should be ok to filter out X scaling when we want Y only and vice versa.
148
+ signX = by !== 'y' ? Math.sign(newPoint.x || transform.signX || 1) : 1;
149
+ signY = by !== 'x' ? Math.sign(newPoint.y || transform.signY || 1) : 1;
150
+ if (!transform.signX) {
151
+ transform.signX = signX;
152
+ }
153
+ if (!transform.signY) {
154
+ transform.signY = signY;
155
+ }
156
+
157
+ if (
158
+ isLocked(target, 'lockScalingFlip') &&
159
+ (transform.signX !== signX || transform.signY !== signY)
160
+ ) {
161
+ return false;
162
+ }
163
+
164
+ dim = target._getTransformedDimensions();
165
+ // missing detection of flip and logic to switch the origin
166
+ if (scaleProportionally && !by) {
167
+ // uniform scaling
168
+ const distance = Math.abs(newPoint.x) + Math.abs(newPoint.y),
169
+ { original } = transform,
170
+ originalDistance =
171
+ Math.abs((dim.x * original.scaleX) / target.scaleX) +
172
+ Math.abs((dim.y * original.scaleY) / target.scaleY),
173
+ scale = distance / originalDistance;
174
+ scaleX = original.scaleX * scale;
175
+ scaleY = original.scaleY * scale;
176
+ } else {
177
+ scaleX = Math.abs((newPoint.x * target.scaleX) / dim.x);
178
+ scaleY = Math.abs((newPoint.y * target.scaleY) / dim.y);
179
+ }
180
+ // if we are scaling by center, we need to double the scale
181
+ if (isTransformCentered(transform)) {
182
+ scaleX *= 2;
183
+ scaleY *= 2;
184
+ }
185
+ if (transform.signX !== signX && by !== 'y') {
186
+ transform.originX = invertOrigin(transform.originX);
187
+ scaleX *= -1;
188
+ transform.signX = signX;
189
+ }
190
+ if (transform.signY !== signY && by !== 'x') {
191
+ transform.originY = invertOrigin(transform.originY);
192
+ scaleY *= -1;
193
+ transform.signY = signY;
194
+ }
195
+ }
196
+ // minScale is taken are in the setter.
197
+ const oldScaleX = target.scaleX,
198
+ oldScaleY = target.scaleY;
199
+ if (!by) {
200
+ !isLocked(target, 'lockScalingX') && target.set('scaleX', scaleX);
201
+ !isLocked(target, 'lockScalingY') && target.set('scaleY', scaleY);
202
+ } else {
203
+ // forbidden cases already handled on top here.
204
+ by === 'x' && target.set('scaleX', scaleX);
205
+ by === 'y' && target.set('scaleY', scaleY);
206
+ }
207
+ return oldScaleX !== target.scaleX || oldScaleY !== target.scaleY;
208
+ }
209
+
210
+ /**
211
+ * Generic scaling logic, to scale from corners either equally or freely.
212
+ * Needs to be wrapped with `wrapWithFixedAnchor` to be effective
213
+ * @param {Event} eventData javascript event that is doing the transform
214
+ * @param {Object} transform javascript object containing a series of information around the current transform
215
+ * @param {number} x current mouse x position, canvas normalized
216
+ * @param {number} y current mouse y position, canvas normalized
217
+ * @return {Boolean} true if some change happened
218
+ */
219
+ export const scaleObjectFromCorner: TransformActionHandler<ScaleTransform> = (
220
+ eventData,
221
+ transform,
222
+ x,
223
+ y
224
+ ) => {
225
+ return scaleObject(eventData, transform, x, y);
226
+ };
227
+
228
+ /**
229
+ * Scaling logic for the X axis.
230
+ * Needs to be wrapped with `wrapWithFixedAnchor` to be effective
231
+ * @param {Event} eventData javascript event that is doing the transform
232
+ * @param {Object} transform javascript object containing a series of information around the current transform
233
+ * @param {number} x current mouse x position, canvas normalized
234
+ * @param {number} y current mouse y position, canvas normalized
235
+ * @return {Boolean} true if some change happened
236
+ */
237
+ const scaleObjectX: TransformActionHandler<ScaleTransform> = (
238
+ eventData,
239
+ transform,
240
+ x,
241
+ y
242
+ ) => {
243
+ return scaleObject(eventData, transform, x, y, { by: 'x' });
244
+ };
245
+
246
+ /**
247
+ * Scaling logic for the Y axis.
248
+ * Needs to be wrapped with `wrapWithFixedAnchor` to be effective
249
+ * @param {Event} eventData javascript event that is doing the transform
250
+ * @param {Object} transform javascript object containing a series of information around the current transform
251
+ * @param {number} x current mouse x position, canvas normalized
252
+ * @param {number} y current mouse y position, canvas normalized
253
+ * @return {Boolean} true if some change happened
254
+ */
255
+ const scaleObjectY: TransformActionHandler<ScaleTransform> = (
256
+ eventData,
257
+ transform,
258
+ x,
259
+ y
260
+ ) => {
261
+ return scaleObject(eventData, transform, x, y, { by: 'y' });
262
+ };
263
+
264
+ export const scalingEqually = wrapWithFireEvent(
265
+ 'scaling',
266
+ wrapWithFixedAnchor(scaleObjectFromCorner)
267
+ );
268
+
269
+ export const scalingX = wrapWithFireEvent(
270
+ 'scaling',
271
+ wrapWithFixedAnchor(scaleObjectX)
272
+ );
273
+
274
+ export const scalingY = wrapWithFireEvent(
275
+ 'scaling',
276
+ wrapWithFixedAnchor(scaleObjectY)
277
+ );
@@ -0,0 +1,92 @@
1
+ import {
2
+ ControlCallback,
3
+ ControlCursorCallback,
4
+ TPointerEvent,
5
+ TransformActionHandler,
6
+ } from '../EventTypeDefs';
7
+ import type { FabricObject } from '../shapes/Object/FabricObject';
8
+ import { TAxisKey } from '../typedefs';
9
+ import { scaleCursorStyleHandler, scalingX, scalingY } from './scale';
10
+ import { skewCursorStyleHandler, skewHandlerX, skewHandlerY } from './skew';
11
+
12
+ function isAltAction(eventData: TPointerEvent, target: FabricObject) {
13
+ return eventData[target.canvas!.altActionKey!];
14
+ }
15
+
16
+ /**
17
+ * Inspect event, control and fabricObject to return the correct action name
18
+ * @param {Event} eventData the javascript event that is causing the scale
19
+ * @param {Control} control the control that is interested in the action
20
+ * @param {FabricObject} fabricObject the fabric object that is interested in the action
21
+ * @return {String} an action name
22
+ */
23
+ export const scaleOrSkewActionName: ControlCallback<
24
+ TAxisKey<'skew' | 'scale'> | ''
25
+ > = (eventData, control, fabricObject) => {
26
+ const isAlternative = isAltAction(eventData, fabricObject);
27
+ if (control.x === 0) {
28
+ // then is scaleY or skewX
29
+ return isAlternative ? 'skewX' : 'scaleY';
30
+ }
31
+ if (control.y === 0) {
32
+ // then is scaleY or skewX
33
+ return isAlternative ? 'skewY' : 'scaleX';
34
+ }
35
+ return '';
36
+ };
37
+
38
+ /**
39
+ * Combine skew and scale style handlers to cover fabric standard use case
40
+ * @param {Event} eventData the javascript event that is causing the scale
41
+ * @param {Control} control the control that is interested in the action
42
+ * @param {FabricObject} fabricObject the fabric object that is interested in the action
43
+ * @return {String} a valid css string for the cursor
44
+ */
45
+ export const scaleSkewCursorStyleHandler: ControlCursorCallback = (
46
+ eventData,
47
+ control,
48
+ fabricObject
49
+ ) => {
50
+ return isAltAction(eventData, fabricObject)
51
+ ? skewCursorStyleHandler(eventData, control, fabricObject)
52
+ : scaleCursorStyleHandler(eventData, control, fabricObject);
53
+ };
54
+ /**
55
+ * Composed action handler to either scale X or skew Y
56
+ * Needs to be wrapped with `wrapWithFixedAnchor` to be effective
57
+ * @param {Event} eventData javascript event that is doing the transform
58
+ * @param {Object} transform javascript object containing a series of information around the current transform
59
+ * @param {number} x current mouse x position, canvas normalized
60
+ * @param {number} y current mouse y position, canvas normalized
61
+ * @return {Boolean} true if some change happened
62
+ */
63
+ export const scalingXOrSkewingY: TransformActionHandler = (
64
+ eventData,
65
+ transform,
66
+ x,
67
+ y
68
+ ) => {
69
+ return isAltAction(eventData, transform.target)
70
+ ? skewHandlerY(eventData, transform, x, y)
71
+ : scalingX(eventData, transform, x, y);
72
+ };
73
+
74
+ /**
75
+ * Composed action handler to either scale Y or skew X
76
+ * Needs to be wrapped with `wrapWithFixedAnchor` to be effective
77
+ * @param {Event} eventData javascript event that is doing the transform
78
+ * @param {Object} transform javascript object containing a series of information around the current transform
79
+ * @param {number} x current mouse x position, canvas normalized
80
+ * @param {number} y current mouse y position, canvas normalized
81
+ * @return {Boolean} true if some change happened
82
+ */
83
+ export const scalingYOrSkewingX: TransformActionHandler = (
84
+ eventData,
85
+ transform,
86
+ x,
87
+ y
88
+ ) => {
89
+ return isAltAction(eventData, transform.target)
90
+ ? skewHandlerX(eventData, transform, x, y)
91
+ : scalingY(eventData, transform, x, y);
92
+ };