fabric 5.3.0 → 6.0.0-beta3

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 (604) hide show
  1. package/.babelrc +11 -0
  2. package/.babelrcAlt +19 -0
  3. package/.browserslistrc +5 -0
  4. package/.eslintignore +3 -0
  5. package/.eslintrc.js +43 -0
  6. package/.eslintrc.json +38 -46
  7. package/.eslintrc_tests +12 -0
  8. package/.gitattributes +2 -0
  9. package/.gitpod.yml +17 -1
  10. package/.prettierignore +19 -0
  11. package/.prettierrc +4 -0
  12. package/CHANGELOG.md +532 -189
  13. package/CONTRIBUTING.md +224 -59
  14. package/README.md +200 -235
  15. package/bower.json +1 -3
  16. package/dist/fabric.d.ts +42 -0
  17. package/dist/index.d.ts +2 -0
  18. package/dist/index.js +27582 -0
  19. package/dist/index.js.map +1 -0
  20. package/dist/index.min.js +1 -0
  21. package/dist/index.mjs +27519 -0
  22. package/dist/index.mjs.map +1 -0
  23. package/dist/index.node.cjs +27663 -0
  24. package/dist/index.node.cjs.map +1 -0
  25. package/dist/index.node.d.ts +14 -0
  26. package/dist/index.node.mjs +27606 -0
  27. package/dist/index.node.mjs.map +1 -0
  28. package/dist/src/ClassRegistry.d.ts +13 -0
  29. package/dist/src/Collection.d.ts +136 -0
  30. package/dist/src/CommonMethods.d.ts +32 -0
  31. package/dist/src/EventTypeDefs.d.ts +227 -0
  32. package/dist/src/Intersection.d.ts +112 -0
  33. package/dist/src/Observable.d.ts +60 -0
  34. package/dist/src/Pattern.d.ts +113 -0
  35. package/dist/src/Point.d.ts +232 -0
  36. package/dist/src/Shadow.d.ts +97 -0
  37. package/dist/src/brushes/BaseBrush.d.ts +105 -0
  38. package/dist/src/brushes/CircleBrush.d.ts +49 -0
  39. package/dist/src/brushes/PatternBrush.d.ts +23 -0
  40. package/dist/src/brushes/PencilBrush.d.ts +92 -0
  41. package/dist/src/brushes/SprayBrush.d.ts +79 -0
  42. package/dist/src/cache.d.ts +47 -0
  43. package/dist/src/canvas/Canvas.d.ts +548 -0
  44. package/dist/src/canvas/SelectableCanvas.d.ts +754 -0
  45. package/dist/src/canvas/StaticCanvas.d.ts +778 -0
  46. package/dist/src/canvas/TextEditingManager.d.ts +17 -0
  47. package/dist/src/canvas/canvas_gestures.mixin.d.ts +2 -0
  48. package/dist/src/color/Color.d.ts +174 -0
  49. package/dist/src/color/color_map.d.ts +155 -0
  50. package/dist/src/color/constants.d.ts +22 -0
  51. package/dist/src/color/util.d.ts +12 -0
  52. package/dist/src/config.d.ts +115 -0
  53. package/dist/src/constants.d.ts +14 -0
  54. package/dist/src/controls/Control.d.ts +228 -0
  55. package/dist/src/controls/changeWidth.d.ts +13 -0
  56. package/dist/src/controls/commonControls.d.ts +28 -0
  57. package/dist/src/controls/controlRendering.d.ts +29 -0
  58. package/dist/src/controls/drag.d.ts +12 -0
  59. package/dist/src/controls/index.d.ts +13 -0
  60. package/dist/src/controls/polyControl.d.ts +5 -0
  61. package/dist/src/controls/rotate.d.ts +12 -0
  62. package/dist/src/controls/scale.d.ts +47 -0
  63. package/dist/src/controls/scaleSkew.d.ts +39 -0
  64. package/dist/src/controls/skew.d.ts +33 -0
  65. package/dist/src/controls/util.d.ts +41 -0
  66. package/dist/src/controls/wrapWithFireEvent.d.ts +8 -0
  67. package/dist/src/controls/wrapWithFixedAnchor.d.ts +9 -0
  68. package/dist/src/env/browser.d.ts +3 -0
  69. package/dist/src/env/index.d.ts +15 -0
  70. package/dist/src/env/node.d.ts +5 -0
  71. package/dist/src/env/types.d.ts +15 -0
  72. package/dist/src/filters/BaseFilter.d.ts +153 -0
  73. package/dist/src/filters/BlendColor.d.ts +80 -0
  74. package/dist/src/filters/BlendImage.d.ts +92 -0
  75. package/dist/src/filters/Blur.d.ts +51 -0
  76. package/dist/src/filters/Boilerplate.d.ts +48 -0
  77. package/dist/src/filters/Brightness.d.ts +47 -0
  78. package/dist/src/filters/Canvas2dFilterBackend.d.ts +27 -0
  79. package/dist/src/filters/ColorMatrix.d.ts +63 -0
  80. package/dist/src/filters/ColorMatrixFilters.d.ts +545 -0
  81. package/dist/src/filters/Composed.d.ts +45 -0
  82. package/dist/src/filters/Contrast.d.ts +45 -0
  83. package/dist/src/filters/Convolute.d.ts +82 -0
  84. package/dist/src/filters/FilterBackend.d.ts +14 -0
  85. package/dist/src/filters/GLProbes/GLProbe.d.ts +11 -0
  86. package/dist/src/filters/GLProbes/NodeGLProbe.d.ts +11 -0
  87. package/dist/src/filters/GLProbes/WebGLProbe.d.ts +20 -0
  88. package/dist/src/filters/Gamma.d.ts +54 -0
  89. package/dist/src/filters/Grayscale.d.ts +46 -0
  90. package/dist/src/filters/HueRotation.d.ts +24 -0
  91. package/dist/src/filters/Invert.d.ts +55 -0
  92. package/dist/src/filters/Noise.d.ts +54 -0
  93. package/dist/src/filters/Pixelate.d.ts +44 -0
  94. package/dist/src/filters/RemoveColor.d.ts +63 -0
  95. package/dist/src/filters/Resize.d.ts +136 -0
  96. package/dist/src/filters/Saturation.d.ts +48 -0
  97. package/dist/src/filters/Vibrance.d.ts +48 -0
  98. package/dist/src/filters/WebGLFilterBackend.d.ts +126 -0
  99. package/dist/src/filters/filters.d.ts +21 -0
  100. package/dist/src/filters/index.d.ts +5 -0
  101. package/dist/src/filters/shaders/baseFilter.d.ts +4 -0
  102. package/dist/src/filters/shaders/blendColor.d.ts +13 -0
  103. package/dist/src/filters/shaders/blendImage.d.ts +3 -0
  104. package/dist/src/filters/shaders/blur.d.ts +2 -0
  105. package/dist/src/filters/shaders/brightness.d.ts +2 -0
  106. package/dist/src/filters/shaders/colorMatrix.d.ts +2 -0
  107. package/dist/src/filters/shaders/constrast.d.ts +2 -0
  108. package/dist/src/filters/shaders/convolute.d.ts +11 -0
  109. package/dist/src/filters/shaders/gamma.d.ts +2 -0
  110. package/dist/src/filters/shaders/grayscale.d.ts +3 -0
  111. package/dist/src/filters/shaders/invert.d.ts +2 -0
  112. package/dist/src/filters/shaders/noise.d.ts +2 -0
  113. package/dist/src/filters/shaders/pixelate.d.ts +2 -0
  114. package/dist/src/filters/shaders/removeColor.d.ts +2 -0
  115. package/dist/src/filters/shaders/saturation.d.ts +2 -0
  116. package/dist/src/filters/shaders/vibrance.d.ts +2 -0
  117. package/dist/src/filters/typedefs.d.ts +49 -0
  118. package/dist/src/gradient/Gradient.d.ts +149 -0
  119. package/dist/src/gradient/constants.d.ts +15 -0
  120. package/dist/src/gradient/parser/index.d.ts +4 -0
  121. package/dist/src/gradient/parser/misc.d.ts +4 -0
  122. package/dist/src/gradient/parser/parseColorStops.d.ts +3 -0
  123. package/dist/src/gradient/parser/parseCoords.d.ts +17 -0
  124. package/dist/src/gradient/typedefs.d.ts +93 -0
  125. package/dist/src/mixins/eraser_brush.mixin.d.ts +2 -0
  126. package/dist/src/parkinglot/canvas_animation.mixin.d.ts +2 -0
  127. package/dist/src/parkinglot/straighten.d.ts +2 -0
  128. package/dist/src/parser/applyViewboxTransform.d.ts +5 -0
  129. package/dist/src/parser/attributes.d.ts +6 -0
  130. package/dist/src/parser/constants.d.ts +53 -0
  131. package/dist/src/parser/doesSomeParentMatch.d.ts +2 -0
  132. package/dist/src/parser/elementById.d.ts +6 -0
  133. package/dist/src/parser/elementMatchesRule.d.ts +5 -0
  134. package/dist/src/parser/elements_parser.d.ts +3 -0
  135. package/dist/src/parser/getCSSRules.d.ts +7 -0
  136. package/dist/src/parser/getGlobalStylesForElement.d.ts +5 -0
  137. package/dist/src/parser/getGradientDefs.d.ts +7 -0
  138. package/dist/src/parser/getMultipleNodes.d.ts +2 -0
  139. package/dist/src/parser/getSvgRegex.d.ts +2 -0
  140. package/dist/src/parser/hasAncestorWithNodeName.d.ts +2 -0
  141. package/dist/src/parser/index.d.ts +10 -0
  142. package/dist/src/parser/loadSVGFromString.d.ts +12 -0
  143. package/dist/src/parser/loadSVGFromURL.d.ts +13 -0
  144. package/dist/src/parser/normalizeAttr.d.ts +2 -0
  145. package/dist/src/parser/normalizeValue.d.ts +2 -0
  146. package/dist/src/parser/parseAttributes.d.ts +9 -0
  147. package/dist/src/parser/parseElements.d.ts +11 -0
  148. package/dist/src/parser/parseFontDeclaration.d.ts +10 -0
  149. package/dist/src/parser/parsePointsAttribute.d.ts +12 -0
  150. package/dist/src/parser/parseSVGDocument.d.ts +15 -0
  151. package/dist/src/parser/parseStyleAttribute.d.ts +9 -0
  152. package/dist/src/parser/parseStyleObject.d.ts +2 -0
  153. package/dist/src/parser/parseStyleString.d.ts +2 -0
  154. package/dist/src/parser/parseTransformAttribute.d.ts +10 -0
  155. package/dist/src/parser/parseUseDirectives.d.ts +2 -0
  156. package/dist/src/parser/percent.d.ts +9 -0
  157. package/dist/src/parser/recursivelyParseGradientsXlink.d.ts +2 -0
  158. package/dist/src/parser/rotateMatrix.d.ts +2 -0
  159. package/dist/src/parser/scaleMatrix.d.ts +2 -0
  160. package/dist/src/parser/selectorMatches.d.ts +2 -0
  161. package/dist/src/parser/setStrokeFillOpacity.d.ts +6 -0
  162. package/dist/src/parser/skewMatrix.d.ts +2 -0
  163. package/dist/src/parser/translateMatrix.d.ts +2 -0
  164. package/dist/src/shapes/ActiveSelection.d.ts +82 -0
  165. package/dist/src/shapes/Circle.d.ts +99 -0
  166. package/dist/src/shapes/Ellipse.d.ts +84 -0
  167. package/dist/src/shapes/Group.d.ts +408 -0
  168. package/dist/src/shapes/IText/DraggableTextDelegate.d.ts +78 -0
  169. package/dist/src/shapes/IText/IText.d.ts +335 -0
  170. package/dist/src/shapes/IText/ITextBehavior.d.ts +287 -0
  171. package/dist/src/shapes/IText/ITextClickBehavior.d.ts +83 -0
  172. package/dist/src/shapes/IText/ITextKeyBehavior.d.ts +195 -0
  173. package/dist/src/shapes/IText/constants.d.ts +13 -0
  174. package/dist/src/shapes/Image.d.ts +311 -0
  175. package/dist/src/shapes/Line.d.ts +126 -0
  176. package/dist/src/shapes/Object/AnimatableObject.d.ts +33 -0
  177. package/dist/src/shapes/Object/FabricObject.d.ts +11 -0
  178. package/dist/src/shapes/Object/FabricObjectSVGExportMixin.d.ts +74 -0
  179. package/dist/src/shapes/Object/InteractiveObject.d.ts +296 -0
  180. package/dist/src/shapes/Object/Object.d.ts +594 -0
  181. package/dist/src/shapes/Object/ObjectGeometry.d.ts +327 -0
  182. package/dist/src/shapes/Object/ObjectOrigin.d.ts +109 -0
  183. package/dist/src/shapes/Object/StackedObject.d.ts +72 -0
  184. package/dist/src/shapes/Object/defaultValues.d.ts +76 -0
  185. package/dist/src/shapes/Object/types/BaseProps.d.ts +84 -0
  186. package/dist/src/shapes/Object/types/BorderProps.d.ts +37 -0
  187. package/dist/src/shapes/Object/types/ControlProps.d.ts +62 -0
  188. package/dist/src/shapes/Object/types/FabricObjectProps.d.ts +96 -0
  189. package/dist/src/shapes/Object/types/FillStrokeProps.d.ts +80 -0
  190. package/dist/src/shapes/Object/types/LockInteractionProps.d.ts +51 -0
  191. package/dist/src/shapes/Object/types/ObjectProps.d.ts +42 -0
  192. package/dist/src/shapes/Object/types/SerializedObjectProps.d.ts +66 -0
  193. package/dist/src/shapes/Object/types/index.d.ts +6 -0
  194. package/dist/src/shapes/Path.d.ts +130 -0
  195. package/dist/src/shapes/Polygon.d.ts +9 -0
  196. package/dist/src/shapes/Polyline.d.ts +140 -0
  197. package/dist/src/shapes/Rect.d.ts +76 -0
  198. package/dist/src/shapes/Text/StyledText.d.ts +119 -0
  199. package/dist/src/shapes/Text/Text.d.ts +673 -0
  200. package/dist/src/shapes/Text/TextSVGExportMixin.d.ts +32 -0
  201. package/dist/src/shapes/Text/constants.d.ts +7 -0
  202. package/dist/src/shapes/Textbox.d.ts +185 -0
  203. package/dist/src/shapes/Triangle.d.ts +25 -0
  204. package/dist/src/typedefs.d.ts +90 -0
  205. package/dist/src/util/animation/AnimationBase.d.ts +54 -0
  206. package/dist/src/util/animation/AnimationFrameProvider.d.ts +3 -0
  207. package/dist/src/util/animation/AnimationRegistry.d.ts +29 -0
  208. package/dist/src/util/animation/ArrayAnimation.d.ts +10 -0
  209. package/dist/src/util/animation/ColorAnimation.d.ts +11 -0
  210. package/dist/src/util/animation/ValueAnimation.d.ts +10 -0
  211. package/dist/src/util/animation/animate.d.ts +37 -0
  212. package/dist/src/util/animation/easing.d.ts +130 -0
  213. package/dist/src/util/animation/types.d.ts +87 -0
  214. package/dist/src/util/applyMixins.d.ts +8 -0
  215. package/dist/src/util/dom_event.d.ts +5 -0
  216. package/dist/src/util/dom_misc.d.ts +39 -0
  217. package/dist/src/util/dom_request.d.ts +14 -0
  218. package/dist/src/util/dom_style.d.ts +7 -0
  219. package/dist/src/util/fireEvent.d.ts +3 -0
  220. package/dist/src/util/index.d.ts +35 -0
  221. package/dist/src/util/internals/cloneDeep.d.ts +2 -0
  222. package/dist/src/util/internals/getRandomInt.d.ts +8 -0
  223. package/dist/src/util/internals/ifNaN.d.ts +8 -0
  224. package/dist/src/util/internals/index.d.ts +4 -0
  225. package/dist/src/util/internals/removeFromArray.d.ts +9 -0
  226. package/dist/src/util/internals/uid.d.ts +2 -0
  227. package/dist/src/util/lang_string.d.ts +22 -0
  228. package/dist/src/util/misc/boundingBoxFromPoints.d.ts +9 -0
  229. package/dist/src/util/misc/capValue.d.ts +2 -0
  230. package/dist/src/util/misc/cos.d.ts +10 -0
  231. package/dist/src/util/misc/dom.d.ts +28 -0
  232. package/dist/src/util/misc/findScaleTo.d.ts +29 -0
  233. package/dist/src/util/misc/groupSVGElements.d.ts +9 -0
  234. package/dist/src/util/misc/isTransparent.d.ts +11 -0
  235. package/dist/src/util/misc/matrix.d.ts +92 -0
  236. package/dist/src/util/misc/mergeClipPaths.d.ts +23 -0
  237. package/dist/src/util/misc/objectEnlive.d.ts +56 -0
  238. package/dist/src/util/misc/objectTransforms.d.ts +68 -0
  239. package/dist/src/util/misc/pick.d.ts +9 -0
  240. package/dist/src/util/misc/planeChange.d.ts +84 -0
  241. package/dist/src/util/misc/projectStroke/StrokeLineCapProjections.d.ts +51 -0
  242. package/dist/src/util/misc/projectStroke/StrokeLineJoinProjections.d.ts +81 -0
  243. package/dist/src/util/misc/projectStroke/StrokeProjectionsBase.d.ts +25 -0
  244. package/dist/src/util/misc/projectStroke/index.d.ts +11 -0
  245. package/dist/src/util/misc/projectStroke/types.d.ts +23 -0
  246. package/dist/src/util/misc/radiansDegreesConversion.d.ts +14 -0
  247. package/dist/src/util/misc/resolveOrigin.d.ts +9 -0
  248. package/dist/src/util/misc/rotatePoint.d.ts +12 -0
  249. package/dist/src/util/misc/sin.d.ts +10 -0
  250. package/dist/src/util/misc/svgParsing.d.ts +53 -0
  251. package/dist/src/util/misc/textStyles.d.ts +32 -0
  252. package/dist/src/util/misc/toFixed.d.ts +8 -0
  253. package/dist/src/util/misc/vectors.d.ts +57 -0
  254. package/dist/src/util/path/index.d.ts +96 -0
  255. package/dist/src/util/path/regex.d.ts +3 -0
  256. package/dist/src/util/path/typechecks.d.ts +24 -0
  257. package/dist/src/util/path/typedefs.d.ts +220 -0
  258. package/dist/src/util/transform_matrix_removal.d.ts +14 -0
  259. package/dist/src/util/types.d.ts +19 -0
  260. package/fabric.ts +51 -0
  261. package/index.node.ts +37 -0
  262. package/index.ts +1 -0
  263. package/package.json +100 -40
  264. package/publish.js +0 -26
  265. package/rollup.config.mjs +91 -0
  266. package/rollup.test.config.js +24 -0
  267. package/scripts/build.mjs +50 -0
  268. package/scripts/buildLock.mjs +115 -0
  269. package/scripts/buildReporter.mjs +15 -0
  270. package/scripts/buildStats.mjs +139 -0
  271. package/scripts/dirname.mjs +14 -0
  272. package/scripts/git.mjs +36 -0
  273. package/scripts/index.mjs +564 -0
  274. package/scripts/sandbox.mjs +149 -0
  275. package/src/ClassRegistry.ts +56 -0
  276. package/src/Collection.ts +346 -0
  277. package/src/CommonMethods.ts +63 -0
  278. package/src/EventTypeDefs.ts +296 -0
  279. package/src/Intersection.ts +302 -0
  280. package/src/Observable.ts +181 -0
  281. package/src/Pattern.ts +227 -0
  282. package/src/Point.ts +388 -0
  283. package/src/Shadow.ts +214 -0
  284. package/src/brushes/{base_brush.class.js → BaseBrush.ts} +65 -42
  285. package/src/brushes/CircleBrush.ts +145 -0
  286. package/src/brushes/PatternBrush.ts +70 -0
  287. package/src/brushes/PencilBrush.ts +300 -0
  288. package/src/brushes/SprayBrush.ts +219 -0
  289. package/src/cache.ts +90 -0
  290. package/src/canvas/Canvas.ts +1607 -0
  291. package/src/canvas/SelectableCanvas.ts +1608 -0
  292. package/src/canvas/StaticCanvas.ts +1734 -0
  293. package/src/canvas/TextEditingManager.ts +48 -0
  294. package/src/canvas/canvas_gestures.mixin.ts +207 -0
  295. package/src/color/Color.ts +404 -0
  296. package/src/color/color_map.ts +154 -0
  297. package/src/color/constants.ts +26 -0
  298. package/src/color/util.ts +32 -0
  299. package/src/config.ts +159 -0
  300. package/src/constants.ts +20 -0
  301. package/src/controls/Control.ts +380 -0
  302. package/src/controls/changeWidth.ts +52 -0
  303. package/src/controls/commonControls.ts +105 -0
  304. package/src/controls/controlRendering.ts +138 -0
  305. package/src/controls/drag.ts +31 -0
  306. package/src/controls/index.ts +22 -0
  307. package/src/controls/polyControl.ts +135 -0
  308. package/src/controls/rotate.ts +87 -0
  309. package/src/controls/scale.ts +277 -0
  310. package/src/controls/scaleSkew.ts +92 -0
  311. package/src/controls/skew.ts +242 -0
  312. package/src/controls/util.ts +154 -0
  313. package/src/controls/wrapWithFireEvent.ts +25 -0
  314. package/src/controls/wrapWithFixedAnchor.ts +20 -0
  315. package/src/env/browser.ts +32 -0
  316. package/src/env/index.ts +24 -0
  317. package/src/env/node.ts +56 -0
  318. package/src/env/types.ts +15 -0
  319. package/src/filters/{base_filter.class.js → BaseFilter.ts} +192 -151
  320. package/src/filters/BlendColor.ts +217 -0
  321. package/src/filters/BlendImage.ts +228 -0
  322. package/src/filters/Blur.ts +179 -0
  323. package/src/filters/Boilerplate.ts +94 -0
  324. package/src/filters/Brightness.ts +83 -0
  325. package/src/filters/Canvas2dFilterBackend.ts +65 -0
  326. package/src/filters/ColorMatrix.ts +145 -0
  327. package/src/filters/ColorMatrixFilters.ts +77 -0
  328. package/src/filters/Composed.ts +76 -0
  329. package/src/filters/Contrast.ts +82 -0
  330. package/src/filters/Convolute.ts +184 -0
  331. package/src/filters/FilterBackend.ts +34 -0
  332. package/src/filters/GLProbes/GLProbe.ts +11 -0
  333. package/src/filters/GLProbes/NodeGLProbe.ts +15 -0
  334. package/src/filters/GLProbes/WebGLProbe.ts +46 -0
  335. package/src/filters/Gamma.ts +110 -0
  336. package/src/filters/Grayscale.ts +102 -0
  337. package/src/filters/HueRotation.ts +62 -0
  338. package/src/filters/Invert.ts +99 -0
  339. package/src/filters/Noise.ts +94 -0
  340. package/src/filters/Pixelate.ts +96 -0
  341. package/src/filters/RemoveColor.ts +135 -0
  342. package/src/filters/Resize.ts +538 -0
  343. package/src/filters/Saturation.ts +87 -0
  344. package/src/filters/Vibrance.ts +88 -0
  345. package/src/filters/WebGLFilterBackend.ts +430 -0
  346. package/src/filters/filters.ts +28 -0
  347. package/src/filters/index.ts +5 -0
  348. package/src/filters/shaders/baseFilter.ts +19 -0
  349. package/src/filters/shaders/blendColor.ts +33 -0
  350. package/src/filters/shaders/blendImage.ts +32 -0
  351. package/src/filters/shaders/blur.ts +24 -0
  352. package/src/filters/shaders/brightness.ts +11 -0
  353. package/src/filters/shaders/colorMatrix.ts +12 -0
  354. package/src/filters/shaders/constrast.ts +11 -0
  355. package/src/filters/shaders/convolute.ts +154 -0
  356. package/src/filters/shaders/gamma.ts +15 -0
  357. package/src/filters/shaders/grayscale.ts +36 -0
  358. package/src/filters/shaders/invert.ts +19 -0
  359. package/src/filters/shaders/noise.ts +16 -0
  360. package/src/filters/shaders/pixelate.ts +19 -0
  361. package/src/filters/shaders/removeColor.ts +13 -0
  362. package/src/filters/shaders/saturation.ts +15 -0
  363. package/src/filters/shaders/vibrance.ts +16 -0
  364. package/src/filters/typedefs.ts +65 -0
  365. package/src/gradient/Gradient.ts +406 -0
  366. package/src/gradient/constants.ts +12 -0
  367. package/src/gradient/parser/index.ts +3 -0
  368. package/src/gradient/parser/misc.ts +13 -0
  369. package/src/gradient/parser/parseColorStops.ts +56 -0
  370. package/src/gradient/parser/parseCoords.ts +73 -0
  371. package/src/gradient/typedefs.ts +104 -0
  372. package/src/mixins/{eraser_brush.mixin.js → eraser_brush.mixin.ts} +350 -239
  373. package/src/parkinglot/canvas_animation.mixin.ts +121 -0
  374. package/src/parkinglot/straighten.ts +58 -0
  375. package/src/parser/applyViewboxTransform.ts +157 -0
  376. package/src/parser/attributes.ts +25 -0
  377. package/src/parser/constants.ts +115 -0
  378. package/src/parser/doesSomeParentMatch.ts +19 -0
  379. package/src/parser/elementById.ts +21 -0
  380. package/src/parser/elementMatchesRule.ts +16 -0
  381. package/src/parser/elements_parser.ts +191 -0
  382. package/src/parser/getCSSRules.ts +62 -0
  383. package/src/parser/getGlobalStylesForElement.ts +19 -0
  384. package/src/parser/getGradientDefs.ts +31 -0
  385. package/src/parser/getMultipleNodes.ts +15 -0
  386. package/src/parser/getSvgRegex.ts +5 -0
  387. package/src/parser/hasAncestorWithNodeName.ts +14 -0
  388. package/src/parser/index.ts +9 -0
  389. package/src/parser/loadSVGFromString.ts +26 -0
  390. package/src/parser/loadSVGFromURL.ts +40 -0
  391. package/src/parser/normalizeAttr.ts +10 -0
  392. package/src/parser/normalizeValue.ts +63 -0
  393. package/src/parser/parseAttributes.ts +90 -0
  394. package/src/parser/parseElements.ts +28 -0
  395. package/src/parser/parseFontDeclaration.ts +44 -0
  396. package/src/parser/parsePointsAttribute.ts +34 -0
  397. package/src/parser/parseSVGDocument.ts +93 -0
  398. package/src/parser/parseStyleAttribute.ts +27 -0
  399. package/src/parser/parseStyleObject.ts +15 -0
  400. package/src/parser/parseStyleString.ts +16 -0
  401. package/src/parser/parseTransformAttribute.ts +155 -0
  402. package/src/parser/parseUseDirectives.ts +78 -0
  403. package/src/parser/percent.ts +27 -0
  404. package/src/parser/recursivelyParseGradientsXlink.ts +42 -0
  405. package/src/parser/rotateMatrix.ts +21 -0
  406. package/src/parser/scaleMatrix.ts +9 -0
  407. package/src/parser/selectorMatches.ts +25 -0
  408. package/src/parser/setStrokeFillOpacity.ts +40 -0
  409. package/src/parser/skewMatrix.ts +6 -0
  410. package/src/parser/translateMatrix.ts +8 -0
  411. package/src/shapes/ActiveSelection.ts +189 -0
  412. package/src/shapes/Circle.ts +242 -0
  413. package/src/shapes/Ellipse.ts +179 -0
  414. package/src/shapes/Group.ts +1100 -0
  415. package/src/shapes/IText/DraggableTextDelegate.ts +382 -0
  416. package/src/shapes/IText/IText.ts +693 -0
  417. package/src/shapes/IText/ITextBehavior.ts +1064 -0
  418. package/src/shapes/IText/ITextClickBehavior.ts +325 -0
  419. package/src/shapes/IText/ITextKeyBehavior.ts +685 -0
  420. package/src/shapes/IText/constants.ts +47 -0
  421. package/src/shapes/Image.ts +841 -0
  422. package/src/shapes/Line.ts +346 -0
  423. package/src/shapes/Object/AnimatableObject.ts +106 -0
  424. package/src/shapes/Object/FabricObject.ts +29 -0
  425. package/src/shapes/Object/FabricObjectSVGExportMixin.ts +277 -0
  426. package/src/shapes/Object/InteractiveObject.ts +672 -0
  427. package/src/shapes/Object/Object.ts +1561 -0
  428. package/src/shapes/Object/ObjectGeometry.ts +813 -0
  429. package/src/shapes/Object/ObjectOrigin.ts +276 -0
  430. package/src/shapes/Object/StackedObject.ts +206 -0
  431. package/src/shapes/Object/defaultValues.ts +108 -0
  432. package/src/shapes/Object/types/BaseProps.ts +96 -0
  433. package/src/shapes/Object/types/BorderProps.ts +40 -0
  434. package/src/shapes/Object/types/ControlProps.ts +69 -0
  435. package/src/shapes/Object/types/FabricObjectProps.ts +111 -0
  436. package/src/shapes/Object/types/FillStrokeProps.ts +90 -0
  437. package/src/shapes/Object/types/LockInteractionProps.ts +57 -0
  438. package/src/shapes/Object/types/ObjectProps.ts +46 -0
  439. package/src/shapes/Object/types/SerializedObjectProps.ts +73 -0
  440. package/src/shapes/Object/types/index.ts +8 -0
  441. package/src/shapes/Path.ts +416 -0
  442. package/src/shapes/Polygon.ts +20 -0
  443. package/src/shapes/Polyline.ts +359 -0
  444. package/src/shapes/Rect.ts +233 -0
  445. package/src/shapes/Text/StyledText.ts +329 -0
  446. package/src/shapes/Text/Text.ts +1884 -0
  447. package/src/shapes/Text/TextSVGExportMixin.ts +288 -0
  448. package/src/shapes/Text/constants.ts +91 -0
  449. package/src/shapes/Textbox.ts +477 -0
  450. package/src/shapes/Triangle.ts +60 -0
  451. package/src/typedefs.ts +115 -0
  452. package/src/util/animation/AnimationBase.ts +166 -0
  453. package/src/util/animation/AnimationFrameProvider.ts +9 -0
  454. package/src/util/animation/AnimationRegistry.ts +58 -0
  455. package/src/util/animation/ArrayAnimation.ts +27 -0
  456. package/src/util/animation/ColorAnimation.ts +74 -0
  457. package/src/util/animation/ValueAnimation.ts +29 -0
  458. package/src/util/animation/animate.ts +74 -0
  459. package/src/util/animation/easing.ts +327 -0
  460. package/src/util/animation/types.ts +136 -0
  461. package/src/util/applyMixins.ts +22 -0
  462. package/src/util/dom_event.ts +28 -0
  463. package/src/util/dom_misc.ts +121 -0
  464. package/src/util/dom_request.ts +64 -0
  465. package/src/util/dom_style.ts +20 -0
  466. package/src/util/fireEvent.ts +15 -0
  467. package/src/util/index.ts +102 -0
  468. package/src/util/internals/cloneDeep.ts +2 -0
  469. package/src/util/internals/getRandomInt.ts +8 -0
  470. package/src/util/internals/ifNaN.ts +9 -0
  471. package/src/util/internals/index.ts +3 -0
  472. package/src/util/internals/removeFromArray.ts +14 -0
  473. package/src/util/internals/uid.ts +3 -0
  474. package/src/util/lang_string.ts +79 -0
  475. package/src/util/misc/boundingBoxFromPoints.ts +37 -0
  476. package/src/util/misc/capValue.ts +2 -0
  477. package/src/util/misc/cos.ts +24 -0
  478. package/src/util/misc/dom.ts +50 -0
  479. package/src/util/misc/findScaleTo.ts +44 -0
  480. package/src/util/misc/groupSVGElements.ts +15 -0
  481. package/src/util/misc/isTransparent.ts +28 -0
  482. package/src/util/misc/matrix.ts +207 -0
  483. package/src/util/misc/mergeClipPaths.ts +40 -0
  484. package/src/util/misc/objectEnlive.ts +189 -0
  485. package/src/util/misc/objectTransforms.ts +129 -0
  486. package/src/util/misc/pick.ts +29 -0
  487. package/src/util/misc/planeChange.ts +136 -0
  488. package/src/util/misc/projectStroke/StrokeLineCapProjections.ts +112 -0
  489. package/src/util/misc/projectStroke/StrokeLineJoinProjections.ts +226 -0
  490. package/src/util/misc/projectStroke/StrokeProjectionsBase.ts +75 -0
  491. package/src/util/misc/projectStroke/index.ts +53 -0
  492. package/src/util/misc/projectStroke/types.ts +24 -0
  493. package/src/util/misc/radiansDegreesConversion.ts +18 -0
  494. package/src/util/misc/resolveOrigin.ts +22 -0
  495. package/src/util/misc/rotatePoint.ts +15 -0
  496. package/src/util/misc/sin.ts +26 -0
  497. package/src/util/misc/svgParsing.ts +181 -0
  498. package/src/util/misc/textStyles.ts +134 -0
  499. package/src/util/misc/toFixed.ts +8 -0
  500. package/src/util/misc/vectors.ts +82 -0
  501. package/src/util/path/index.ts +1038 -0
  502. package/src/util/path/regex.ts +41 -0
  503. package/src/util/path/typechecks.ts +145 -0
  504. package/src/util/path/typedefs.ts +305 -0
  505. package/src/util/transform_matrix_removal.ts +60 -0
  506. package/src/util/types.ts +78 -0
  507. package/tsconfig.json +106 -0
  508. package/HEADER.js +0 -203
  509. package/build.js +0 -287
  510. package/dist/fabric.js +0 -31187
  511. package/dist/fabric.min.js +0 -1
  512. package/old-travis-reference.yml +0 -97
  513. package/src/brushes/circle_brush.class.js +0 -144
  514. package/src/brushes/pattern_brush.class.js +0 -61
  515. package/src/brushes/pencil_brush.class.js +0 -310
  516. package/src/brushes/spray_brush.class.js +0 -219
  517. package/src/canvas.class.js +0 -1312
  518. package/src/color.class.js +0 -636
  519. package/src/control.class.js +0 -339
  520. package/src/controls.actions.js +0 -740
  521. package/src/controls.render.js +0 -99
  522. package/src/elements_parser.js +0 -152
  523. package/src/filters/2d_backend.class.js +0 -65
  524. package/src/filters/blendcolor_filter.class.js +0 -251
  525. package/src/filters/blendimage_filter.class.js +0 -247
  526. package/src/filters/blur_filter.class.js +0 -217
  527. package/src/filters/brightness_filter.class.js +0 -113
  528. package/src/filters/colormatrix_filter.class.js +0 -159
  529. package/src/filters/composed_filter.class.js +0 -72
  530. package/src/filters/contrast_filter.class.js +0 -113
  531. package/src/filters/convolute_filter.class.js +0 -352
  532. package/src/filters/filter_boilerplate.js +0 -111
  533. package/src/filters/filter_generator.js +0 -85
  534. package/src/filters/gamma_filter.class.js +0 -136
  535. package/src/filters/grayscale_filter.class.js +0 -154
  536. package/src/filters/hue_rotation.class.js +0 -107
  537. package/src/filters/invert_filter.class.js +0 -111
  538. package/src/filters/noise_filter.class.js +0 -134
  539. package/src/filters/pixelate_filter.class.js +0 -137
  540. package/src/filters/removecolor_filter.class.js +0 -173
  541. package/src/filters/resize_filter.class.js +0 -490
  542. package/src/filters/saturate_filter.class.js +0 -119
  543. package/src/filters/vibrance_filter.class.js +0 -122
  544. package/src/filters/webgl_backend.class.js +0 -396
  545. package/src/globalFabric.js +0 -4
  546. package/src/gradient.class.js +0 -490
  547. package/src/intersection.class.js +0 -172
  548. package/src/log.js +0 -11
  549. package/src/mixins/animation.mixin.js +0 -231
  550. package/src/mixins/canvas_dataurl_exporter.mixin.js +0 -97
  551. package/src/mixins/canvas_events.mixin.js +0 -974
  552. package/src/mixins/canvas_gestures.mixin.js +0 -149
  553. package/src/mixins/canvas_grouping.mixin.js +0 -177
  554. package/src/mixins/canvas_serialization.mixin.js +0 -228
  555. package/src/mixins/collection.mixin.js +0 -170
  556. package/src/mixins/default_controls.js +0 -114
  557. package/src/mixins/itext.svg_export.js +0 -241
  558. package/src/mixins/itext_behavior.mixin.js +0 -940
  559. package/src/mixins/itext_click_behavior.mixin.js +0 -278
  560. package/src/mixins/itext_key_behavior.mixin.js +0 -694
  561. package/src/mixins/object.svg_export.js +0 -258
  562. package/src/mixins/object_geometry.mixin.js +0 -683
  563. package/src/mixins/object_interactivity.mixin.js +0 -314
  564. package/src/mixins/object_origin.mixin.js +0 -255
  565. package/src/mixins/object_stacking.mixin.js +0 -80
  566. package/src/mixins/object_straightening.mixin.js +0 -80
  567. package/src/mixins/observable.mixin.js +0 -141
  568. package/src/mixins/shared_methods.mixin.js +0 -94
  569. package/src/mixins/stateful.mixin.js +0 -107
  570. package/src/mixins/text_style.mixin.js +0 -324
  571. package/src/parser.js +0 -1090
  572. package/src/pattern.class.js +0 -189
  573. package/src/point.class.js +0 -337
  574. package/src/shadow.class.js +0 -195
  575. package/src/shapes/active_selection.class.js +0 -155
  576. package/src/shapes/circle.class.js +0 -210
  577. package/src/shapes/ellipse.class.js +0 -181
  578. package/src/shapes/group.class.js +0 -593
  579. package/src/shapes/image.class.js +0 -764
  580. package/src/shapes/itext.class.js +0 -526
  581. package/src/shapes/line.class.js +0 -324
  582. package/src/shapes/object.class.js +0 -2008
  583. package/src/shapes/path.class.js +0 -384
  584. package/src/shapes/polygon.class.js +0 -81
  585. package/src/shapes/polyline.class.js +0 -268
  586. package/src/shapes/rect.class.js +0 -187
  587. package/src/shapes/text.class.js +0 -1696
  588. package/src/shapes/textbox.class.js +0 -461
  589. package/src/shapes/triangle.class.js +0 -93
  590. package/src/static_canvas.class.js +0 -1881
  591. package/src/util/anim_ease.js +0 -398
  592. package/src/util/animate.js +0 -254
  593. package/src/util/animate_color.js +0 -74
  594. package/src/util/dom_event.js +0 -50
  595. package/src/util/dom_misc.js +0 -300
  596. package/src/util/dom_request.js +0 -54
  597. package/src/util/dom_style.js +0 -70
  598. package/src/util/lang_array.js +0 -94
  599. package/src/util/lang_class.js +0 -115
  600. package/src/util/lang_object.js +0 -75
  601. package/src/util/lang_string.js +0 -110
  602. package/src/util/misc.js +0 -1330
  603. package/src/util/named_accessors.mixin.js +0 -428
  604. package/src/util/path.js +0 -829
@@ -0,0 +1,22 @@
1
+ export { changeWidth } from './changeWidth';
2
+ export { renderCircleControl, renderSquareControl } from './controlRendering';
3
+ export * from './commonControls';
4
+ export { dragHandler } from './drag';
5
+ export { createPolyControls } from './polyControl';
6
+ export { rotationStyleHandler, rotationWithSnapping } from './rotate';
7
+ export {
8
+ scaleCursorStyleHandler,
9
+ scalingEqually,
10
+ scalingX,
11
+ scalingY,
12
+ } from './scale';
13
+ export {
14
+ scaleOrSkewActionName,
15
+ scaleSkewCursorStyleHandler,
16
+ scalingXOrSkewingY,
17
+ scalingYOrSkewingX,
18
+ } from './scaleSkew';
19
+ export { skewCursorStyleHandler, skewHandlerX, skewHandlerY } from './skew';
20
+ export { getLocalPoint } from './util';
21
+ export { wrapWithFireEvent } from './wrapWithFireEvent';
22
+ export { wrapWithFixedAnchor } from './wrapWithFixedAnchor';
@@ -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
+ };