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,377 @@
1
+ /* eslint-disable @typescript-eslint/no-unused-vars */
2
+ import { halfPI } from '../constants';
3
+ import {
4
+ ControlActionHandler,
5
+ TPointerEvent,
6
+ TransformActionHandler,
7
+ } from '../EventTypeDefs';
8
+ import { Point } from '../Point';
9
+ import type { FabricObject } from '../shapes/Object/Object';
10
+ import { TDegree, TMat2D } from '../typedefs';
11
+ import { cos } from '../util/misc/cos';
12
+ import { degreesToRadians } from '../util/misc/radiansDegreesConversion';
13
+ import { sin } from '../util/misc/sin';
14
+ import {
15
+ ControlRenderingStyleOverride,
16
+ renderCircleControl,
17
+ renderSquareControl,
18
+ } from './controls.render';
19
+
20
+ export class Control {
21
+ /**
22
+ * keep track of control visibility.
23
+ * mainly for backward compatibility.
24
+ * if you do not want to see a control, you can remove it
25
+ * from the control set.
26
+ * @type {Boolean}
27
+ * @default true
28
+ */
29
+ visible = true;
30
+
31
+ /**
32
+ * Name of the action that the control will likely execute.
33
+ * This is optional. FabricJS uses to identify what the user is doing for some
34
+ * extra optimizations. If you are writing a custom control and you want to know
35
+ * somewhere else in the code what is going on, you can use this string here.
36
+ * you can also provide a custom getActionName if your control run multiple actions
37
+ * depending on some external state.
38
+ * default to scale since is the most common, used on 4 corners by default
39
+ * @type {String}
40
+ * @default 'scale'
41
+ */
42
+ actionName = 'scale';
43
+
44
+ /**
45
+ * Drawing angle of the control.
46
+ * NOT used for now, but name marked as needed for internal logic
47
+ * example: to reuse the same drawing function for different rotated controls
48
+ * @type {Number}
49
+ * @default 0
50
+ */
51
+ angle = 0;
52
+
53
+ /**
54
+ * Relative position of the control. X
55
+ * 0,0 is the center of the Object, while -0.5 (left) or 0.5 (right) are the extremities
56
+ * of the bounding box.
57
+ * @type {Number}
58
+ * @default 0
59
+ */
60
+ x = 0;
61
+
62
+ /**
63
+ * Relative position of the control. Y
64
+ * 0,0 is the center of the Object, while -0.5 (top) or 0.5 (bottom) are the extremities
65
+ * of the bounding box.
66
+ * @type {Number}
67
+ * @default 0
68
+ */
69
+ y = 0;
70
+
71
+ /**
72
+ * Horizontal offset of the control from the defined position. In pixels
73
+ * Positive offset moves the control to the right, negative to the left.
74
+ * It used when you want to have position of control that does not scale with
75
+ * the bounding box. Example: rotation control is placed at x:0, y: 0.5 on
76
+ * the boundind box, with an offset of 30 pixels vertically. Those 30 pixels will
77
+ * stay 30 pixels no matter how the object is big. Another example is having 2
78
+ * controls in the corner, that stay in the same position when the object scale.
79
+ * of the bounding box.
80
+ * @type {Number}
81
+ * @default 0
82
+ */
83
+ offsetX = 0;
84
+
85
+ /**
86
+ * Vertical offset of the control from the defined position. In pixels
87
+ * Positive offset moves the control to the bottom, negative to the top.
88
+ * @type {Number}
89
+ * @default 0
90
+ */
91
+ offsetY = 0;
92
+
93
+ /**
94
+ * Sets the length of the control. If null, defaults to object's cornerSize.
95
+ * Expects both sizeX and sizeY to be set when set.
96
+ * @type {?Number}
97
+ * @default null
98
+ */
99
+ sizeX: number | null = null;
100
+
101
+ /**
102
+ * Sets the height of the control. If null, defaults to object's cornerSize.
103
+ * Expects both sizeX and sizeY to be set when set.
104
+ * @type {?Number}
105
+ * @default null
106
+ */
107
+ sizeY: number | null = null;
108
+
109
+ /**
110
+ * Sets the length of the touch area of the control. If null, defaults to object's touchCornerSize.
111
+ * Expects both touchSizeX and touchSizeY to be set when set.
112
+ * @type {?Number}
113
+ * @default null
114
+ */
115
+ touchSizeX: number | null = null;
116
+
117
+ /**
118
+ * Sets the height of the touch area of the control. If null, defaults to object's touchCornerSize.
119
+ * Expects both touchSizeX and touchSizeY to be set when set.
120
+ * @type {?Number}
121
+ * @default null
122
+ */
123
+ touchSizeY: number | null = null;
124
+
125
+ /**
126
+ * Css cursor style to display when the control is hovered.
127
+ * if the method `cursorStyleHandler` is provided, this property is ignored.
128
+ * @type {String}
129
+ * @default 'crosshair'
130
+ */
131
+ cursorStyle = 'crosshair';
132
+
133
+ /**
134
+ * If controls has an offsetY or offsetX, draw a line that connects
135
+ * the control to the bounding box
136
+ * @type {Boolean}
137
+ * @default false
138
+ */
139
+ withConnection = false;
140
+
141
+ constructor(options: Partial<Control>) {
142
+ Object.assign(this, options);
143
+ }
144
+
145
+ /**
146
+ * The control actionHandler, provide one to handle action ( control being moved )
147
+ * @param {Event} eventData the native mouse event
148
+ * @param {Transform} transformData properties of the current transform
149
+ * @param {Number} x x position of the cursor
150
+ * @param {Number} y y position of the cursor
151
+ * @return {Boolean} true if the action/event modified the object
152
+ */
153
+ declare actionHandler: TransformActionHandler;
154
+
155
+ /**
156
+ * The control handler for mouse down, provide one to handle mouse down on control
157
+ * @param {Event} eventData the native mouse event
158
+ * @param {Transform} transformData properties of the current transform
159
+ * @param {Number} x x position of the cursor
160
+ * @param {Number} y y position of the cursor
161
+ * @return {Boolean} true if the action/event modified the object
162
+ */
163
+ declare mouseDownHandler?: ControlActionHandler;
164
+
165
+ /**
166
+ * The control mouseUpHandler, provide one to handle an effect on mouse up.
167
+ * @param {Event} eventData the native mouse event
168
+ * @param {Transform} transformData properties of the current transform
169
+ * @param {Number} x x position of the cursor
170
+ * @param {Number} y y position of the cursor
171
+ * @return {Boolean} true if the action/event modified the object
172
+ */
173
+ declare mouseUpHandler?: ControlActionHandler;
174
+
175
+ /**
176
+ * Returns control actionHandler
177
+ * @param {Event} eventData the native mouse event
178
+ * @param {FabricObject} fabricObject on which the control is displayed
179
+ * @param {Control} control control for which the action handler is being asked
180
+ * @return {Function} the action handler
181
+ */
182
+ getActionHandler(
183
+ eventData: TPointerEvent,
184
+ fabricObject: FabricObject,
185
+ control: Control
186
+ ): TransformActionHandler | undefined {
187
+ return this.actionHandler;
188
+ }
189
+
190
+ /**
191
+ * Returns control mouseDown handler
192
+ * @param {Event} eventData the native mouse event
193
+ * @param {FabricObject} fabricObject on which the control is displayed
194
+ * @param {Control} control control for which the action handler is being asked
195
+ * @return {Function} the action handler
196
+ */
197
+ getMouseDownHandler(
198
+ eventData: TPointerEvent,
199
+ fabricObject: FabricObject,
200
+ control: Control
201
+ ): ControlActionHandler | undefined {
202
+ return this.mouseDownHandler;
203
+ }
204
+
205
+ /**
206
+ * Returns control mouseUp handler.
207
+ * During actions the fabricObject or the control can be of different obj
208
+ * @param {Event} eventData the native mouse event
209
+ * @param {FabricObject} fabricObject on which the control is displayed
210
+ * @param {Control} control control for which the action handler is being asked
211
+ * @return {Function} the action handler
212
+ */
213
+ getMouseUpHandler(
214
+ eventData: TPointerEvent,
215
+ fabricObject: FabricObject,
216
+ control: Control
217
+ ): ControlActionHandler | undefined {
218
+ return this.mouseUpHandler;
219
+ }
220
+
221
+ /**
222
+ * Returns control cursorStyle for css using cursorStyle. If you need a more elaborate
223
+ * function you can pass one in the constructor
224
+ * the cursorStyle property
225
+ * @param {Event} eventData the native mouse event
226
+ * @param {Control} control the current control ( likely this)
227
+ * @param {FabricObject} object on which the control is displayed
228
+ * @return {String}
229
+ */
230
+ cursorStyleHandler(
231
+ eventData: TPointerEvent,
232
+ control: Control,
233
+ fabricObject: FabricObject
234
+ ) {
235
+ return control.cursorStyle;
236
+ }
237
+
238
+ /**
239
+ * Returns the action name. The basic implementation just return the actionName property.
240
+ * @param {Event} eventData the native mouse event
241
+ * @param {Control} control the current control ( likely this)
242
+ * @param {FabricObject} object on which the control is displayed
243
+ * @return {String}
244
+ */
245
+ getActionName(
246
+ eventData: TPointerEvent,
247
+ control: Control,
248
+ fabricObject: FabricObject
249
+ ) {
250
+ return control.actionName;
251
+ }
252
+
253
+ /**
254
+ * Returns controls visibility
255
+ * @param {FabricObject} object on which the control is displayed
256
+ * @param {String} controlKey key where the control is memorized on the
257
+ * @return {Boolean}
258
+ */
259
+ getVisibility(fabricObject: FabricObject, controlKey: string) {
260
+ // @ts-expect-error TODO remove directive once fixed
261
+ return fabricObject._controlsVisibility?.[controlKey] ?? this.visible;
262
+ }
263
+
264
+ /**
265
+ * Sets controls visibility
266
+ * @param {Boolean} visibility for the object
267
+ * @return {Void}
268
+ */
269
+ setVisibility(visibility: boolean, name: string, fabricObject: FabricObject) {
270
+ this.visible = visibility;
271
+ }
272
+
273
+ positionHandler(
274
+ dim: Point,
275
+ finalMatrix: TMat2D,
276
+ fabricObject: FabricObject,
277
+ currentControl: Control
278
+ ) {
279
+ return new Point(
280
+ this.x * dim.x + this.offsetX,
281
+ this.y * dim.y + this.offsetY
282
+ ).transform(finalMatrix);
283
+ }
284
+
285
+ /**
286
+ * Returns the coords for this control based on object values.
287
+ * @param {Number} objectAngle angle from the fabric object holding the control
288
+ * @param {Number} objectCornerSize cornerSize from the fabric object holding the control (or touchCornerSize if
289
+ * isTouch is true)
290
+ * @param {Number} centerX x coordinate where the control center should be
291
+ * @param {Number} centerY y coordinate where the control center should be
292
+ * @param {boolean} isTouch true if touch corner, false if normal corner
293
+ */
294
+ calcCornerCoords(
295
+ objectAngle: TDegree,
296
+ objectCornerSize: number,
297
+ centerX: number,
298
+ centerY: number,
299
+ isTouch: boolean
300
+ ) {
301
+ let cosHalfOffset, sinHalfOffset, cosHalfOffsetComp, sinHalfOffsetComp;
302
+ const xSize = isTouch ? this.touchSizeX : this.sizeX,
303
+ ySize = isTouch ? this.touchSizeY : this.sizeY;
304
+ if (xSize && ySize && xSize !== ySize) {
305
+ // handle rectangular corners
306
+ const controlTriangleAngle = Math.atan2(ySize, xSize);
307
+ const cornerHypotenuse = Math.sqrt(xSize * xSize + ySize * ySize) / 2;
308
+ const newTheta = controlTriangleAngle - degreesToRadians(objectAngle);
309
+ const newThetaComp =
310
+ halfPI - controlTriangleAngle - degreesToRadians(objectAngle);
311
+ cosHalfOffset = cornerHypotenuse * cos(newTheta);
312
+ sinHalfOffset = cornerHypotenuse * sin(newTheta);
313
+ // use complementary angle for two corners
314
+ cosHalfOffsetComp = cornerHypotenuse * cos(newThetaComp);
315
+ sinHalfOffsetComp = cornerHypotenuse * sin(newThetaComp);
316
+ } else {
317
+ // handle square corners
318
+ // use default object corner size unless size is defined
319
+ const cornerSize = xSize && ySize ? xSize : objectCornerSize;
320
+ const cornerHypotenuse = cornerSize * Math.SQRT1_2;
321
+ // complementary angles are equal since they're both 45 degrees
322
+ const newTheta = degreesToRadians(45 - objectAngle);
323
+ cosHalfOffset = cosHalfOffsetComp = cornerHypotenuse * cos(newTheta);
324
+ sinHalfOffset = sinHalfOffsetComp = cornerHypotenuse * sin(newTheta);
325
+ }
326
+
327
+ return {
328
+ tl: new Point(centerX - sinHalfOffsetComp, centerY - cosHalfOffsetComp),
329
+ tr: new Point(centerX + cosHalfOffset, centerY - sinHalfOffset),
330
+ bl: new Point(centerX - cosHalfOffset, centerY + sinHalfOffset),
331
+ br: new Point(centerX + sinHalfOffsetComp, centerY + cosHalfOffsetComp),
332
+ };
333
+ }
334
+
335
+ /**
336
+ * Render function for the control.
337
+ * When this function runs the context is unscaled. unrotate. Just retina scaled.
338
+ * all the functions will have to translate to the point left,top before starting Drawing
339
+ * if they want to draw a control where the position is detected.
340
+ * left and top are the result of the positionHandler function
341
+ * @param {RenderingContext2D} ctx the context where the control will be drawn
342
+ * @param {Number} left position of the canvas where we are about to render the control.
343
+ * @param {Number} top position of the canvas where we are about to render the control.
344
+ * @param {Object} styleOverride
345
+ * @param {FabricObject} fabricObject the object where the control is about to be rendered
346
+ */
347
+ render(
348
+ ctx: CanvasRenderingContext2D,
349
+ left: number,
350
+ top: number,
351
+ styleOverride: ControlRenderingStyleOverride | undefined,
352
+ fabricObject: FabricObject
353
+ ) {
354
+ styleOverride = styleOverride || {};
355
+ switch (styleOverride.cornerStyle || fabricObject.cornerStyle) {
356
+ case 'circle':
357
+ renderCircleControl.call(
358
+ this,
359
+ ctx,
360
+ left,
361
+ top,
362
+ styleOverride,
363
+ fabricObject
364
+ );
365
+ break;
366
+ default:
367
+ renderSquareControl.call(
368
+ this,
369
+ ctx,
370
+ left,
371
+ top,
372
+ styleOverride,
373
+ fabricObject
374
+ );
375
+ }
376
+ }
377
+ }
@@ -0,0 +1,52 @@
1
+ import { TransformActionHandler } from '../EventTypeDefs';
2
+ import { getLocalPoint, isTransformCentered } from './util';
3
+ import { wrapWithFireEvent } from './wrapWithFireEvent';
4
+ import { wrapWithFixedAnchor } from './wrapWithFixedAnchor';
5
+
6
+ /**
7
+ * Action handler to change object's width
8
+ * Needs to be wrapped with `wrapWithFixedAnchor` to be effective
9
+ * @param {Event} eventData javascript event that is doing the transform
10
+ * @param {Object} transform javascript object containing a series of information around the current transform
11
+ * @param {number} x current mouse x position, canvas normalized
12
+ * @param {number} y current mouse y position, canvas normalized
13
+ * @return {Boolean} true if some change happened
14
+ */
15
+ export const changeObjectWidth: TransformActionHandler = (
16
+ eventData,
17
+ transform,
18
+ x,
19
+ y
20
+ ) => {
21
+ const localPoint = getLocalPoint(
22
+ transform,
23
+ transform.originX,
24
+ transform.originY,
25
+ x,
26
+ y
27
+ );
28
+ // make sure the control changes width ONLY from it's side of target
29
+ if (
30
+ transform.originX === 'center' ||
31
+ (transform.originX === 'right' && localPoint.x < 0) ||
32
+ (transform.originX === 'left' && localPoint.x > 0)
33
+ ) {
34
+ const { target } = transform,
35
+ strokePadding =
36
+ target.strokeWidth / (target.strokeUniform ? target.scaleX : 1),
37
+ multiplier = isTransformCentered(transform) ? 2 : 1,
38
+ oldWidth = target.width,
39
+ newWidth = Math.ceil(
40
+ Math.abs((localPoint.x * multiplier) / target.scaleX) - strokePadding
41
+ );
42
+ target.set('width', Math.max(newWidth, 0));
43
+ // check against actual target width in case `newWidth` was rejected
44
+ return oldWidth !== target.width;
45
+ }
46
+ return false;
47
+ };
48
+
49
+ export const changeWidth = wrapWithFireEvent(
50
+ 'resizing',
51
+ wrapWithFixedAnchor(changeObjectWidth)
52
+ );
@@ -0,0 +1,138 @@
1
+ import { twoMathPi } from '../constants';
2
+ import type { FabricObject } from '../shapes/Object/Object';
3
+ import { degreesToRadians } from '../util/misc/radiansDegreesConversion';
4
+ import type { Control } from './Control';
5
+
6
+ export type ControlRenderingStyleOverride = Partial<
7
+ Pick<
8
+ FabricObject,
9
+ | 'cornerStyle'
10
+ | 'cornerSize'
11
+ | 'cornerColor'
12
+ | 'cornerStrokeColor'
13
+ | 'cornerDashArray'
14
+ | 'transparentCorners'
15
+ >
16
+ >;
17
+
18
+ export type ControlRenderer = (
19
+ ctx: CanvasRenderingContext2D,
20
+ left: number,
21
+ top: number,
22
+ styleOverride: ControlRenderingStyleOverride,
23
+ fabricObject: FabricObject
24
+ ) => void;
25
+
26
+ /**
27
+ * Render a round control, as per fabric features.
28
+ * This function is written to respect object properties like transparentCorners, cornerSize
29
+ * cornerColor, cornerStrokeColor
30
+ * plus the addition of offsetY and offsetX.
31
+ * @param {CanvasRenderingContext2D} ctx context to render on
32
+ * @param {Number} left x coordinate where the control center should be
33
+ * @param {Number} top y coordinate where the control center should be
34
+ * @param {Object} styleOverride override for FabricObject controls style
35
+ * @param {FabricObject} fabricObject the fabric object for which we are rendering controls
36
+ */
37
+ export function renderCircleControl(
38
+ this: Control,
39
+ ctx: CanvasRenderingContext2D,
40
+ left: number,
41
+ top: number,
42
+ styleOverride: ControlRenderingStyleOverride,
43
+ fabricObject: FabricObject
44
+ ) {
45
+ styleOverride = styleOverride || {};
46
+ const xSize =
47
+ this.sizeX || styleOverride.cornerSize || fabricObject.cornerSize,
48
+ ySize = this.sizeY || styleOverride.cornerSize || fabricObject.cornerSize,
49
+ transparentCorners =
50
+ typeof styleOverride.transparentCorners !== 'undefined'
51
+ ? styleOverride.transparentCorners
52
+ : fabricObject.transparentCorners,
53
+ methodName = transparentCorners ? 'stroke' : 'fill',
54
+ stroke =
55
+ !transparentCorners &&
56
+ (styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor);
57
+ let myLeft = left,
58
+ myTop = top,
59
+ size;
60
+ ctx.save();
61
+ ctx.fillStyle = styleOverride.cornerColor || fabricObject.cornerColor || '';
62
+ ctx.strokeStyle =
63
+ styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor || '';
64
+ // TODO: use proper ellipse code.
65
+ if (xSize > ySize) {
66
+ size = xSize;
67
+ ctx.scale(1.0, ySize / xSize);
68
+ myTop = (top * xSize) / ySize;
69
+ } else if (ySize > xSize) {
70
+ size = ySize;
71
+ ctx.scale(xSize / ySize, 1.0);
72
+ myLeft = (left * ySize) / xSize;
73
+ } else {
74
+ size = xSize;
75
+ }
76
+ // this is still wrong
77
+ ctx.lineWidth = 1;
78
+ ctx.beginPath();
79
+ ctx.arc(myLeft, myTop, size / 2, 0, twoMathPi, false);
80
+ ctx[methodName]();
81
+ if (stroke) {
82
+ ctx.stroke();
83
+ }
84
+ ctx.restore();
85
+ }
86
+
87
+ /**
88
+ * Render a square control, as per fabric features.
89
+ * This function is written to respect object properties like transparentCorners, cornerSize
90
+ * cornerColor, cornerStrokeColor
91
+ * plus the addition of offsetY and offsetX.
92
+ * @param {CanvasRenderingContext2D} ctx context to render on
93
+ * @param {Number} left x coordinate where the control center should be
94
+ * @param {Number} top y coordinate where the control center should be
95
+ * @param {Object} styleOverride override for FabricObject controls style
96
+ * @param {FabricObject} fabricObject the fabric object for which we are rendering controls
97
+ */
98
+ export function renderSquareControl(
99
+ this: Control,
100
+ ctx: CanvasRenderingContext2D,
101
+ left: number,
102
+ top: number,
103
+ styleOverride: ControlRenderingStyleOverride,
104
+ fabricObject: FabricObject
105
+ ) {
106
+ styleOverride = styleOverride || {};
107
+ const xSize =
108
+ this.sizeX || styleOverride.cornerSize || fabricObject.cornerSize,
109
+ ySize = this.sizeY || styleOverride.cornerSize || fabricObject.cornerSize,
110
+ transparentCorners =
111
+ typeof styleOverride.transparentCorners !== 'undefined'
112
+ ? styleOverride.transparentCorners
113
+ : fabricObject.transparentCorners,
114
+ methodName = transparentCorners ? 'stroke' : 'fill',
115
+ stroke =
116
+ !transparentCorners &&
117
+ (styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor),
118
+ xSizeBy2 = xSize / 2,
119
+ ySizeBy2 = ySize / 2;
120
+ ctx.save();
121
+ ctx.fillStyle = styleOverride.cornerColor || fabricObject.cornerColor || '';
122
+ ctx.strokeStyle =
123
+ styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor || '';
124
+ // this is still wrong
125
+ ctx.lineWidth = 1;
126
+ ctx.translate(left, top);
127
+ // angle is relative to canvas plane
128
+ const angle = fabricObject.getTotalAngle();
129
+ ctx.rotate(degreesToRadians(angle));
130
+ // this does not work, and fixed with ( && ) does not make sense.
131
+ // to have real transparent corners we need the controls on upperCanvas
132
+ // transparentCorners || ctx.clearRect(-xSizeBy2, -ySizeBy2, xSize, ySize);
133
+ ctx[`${methodName}Rect`](-xSizeBy2, -ySizeBy2, xSize, ySize);
134
+ if (stroke) {
135
+ ctx.strokeRect(-xSizeBy2, -ySizeBy2, xSize, ySize);
136
+ }
137
+ ctx.restore();
138
+ }
@@ -0,0 +1,132 @@
1
+ import { FabricObject } from '../shapes/Object/FabricObject';
2
+ import { Textbox } from '../shapes/Textbox';
3
+ import { scaleCursorStyleHandler, scalingEqually } from './scale';
4
+ import { changeWidth } from './changeWidth';
5
+ import { rotationStyleHandler, rotationWithSnapping } from './rotate';
6
+ import {
7
+ scaleOrSkewActionName,
8
+ scaleSkewCursorStyleHandler,
9
+ scalingXOrSkewingY,
10
+ scalingYOrSkewingX,
11
+ } from './scaleSkew';
12
+ import { Control } from './Control';
13
+
14
+ // use this function if you want to generate new controls for every instance
15
+ export const createObjectDefaultControls = () => ({
16
+ ml: new Control({
17
+ x: -0.5,
18
+ y: 0,
19
+ cursorStyleHandler: scaleSkewCursorStyleHandler,
20
+ actionHandler: scalingXOrSkewingY,
21
+ getActionName: scaleOrSkewActionName,
22
+ }),
23
+
24
+ mr: new Control({
25
+ x: 0.5,
26
+ y: 0,
27
+ cursorStyleHandler: scaleSkewCursorStyleHandler,
28
+ actionHandler: scalingXOrSkewingY,
29
+ getActionName: scaleOrSkewActionName,
30
+ }),
31
+
32
+ mb: new Control({
33
+ x: 0,
34
+ y: 0.5,
35
+ cursorStyleHandler: scaleSkewCursorStyleHandler,
36
+ actionHandler: scalingYOrSkewingX,
37
+ getActionName: scaleOrSkewActionName,
38
+ }),
39
+
40
+ mt: new Control({
41
+ x: 0,
42
+ y: -0.5,
43
+ cursorStyleHandler: scaleSkewCursorStyleHandler,
44
+ actionHandler: scalingYOrSkewingX,
45
+ getActionName: scaleOrSkewActionName,
46
+ }),
47
+
48
+ tl: new Control({
49
+ x: -0.5,
50
+ y: -0.5,
51
+ cursorStyleHandler: scaleCursorStyleHandler,
52
+ actionHandler: scalingEqually,
53
+ }),
54
+
55
+ tr: new Control({
56
+ x: 0.5,
57
+ y: -0.5,
58
+ cursorStyleHandler: scaleCursorStyleHandler,
59
+ actionHandler: scalingEqually,
60
+ }),
61
+
62
+ bl: new Control({
63
+ x: -0.5,
64
+ y: 0.5,
65
+ cursorStyleHandler: scaleCursorStyleHandler,
66
+ actionHandler: scalingEqually,
67
+ }),
68
+
69
+ br: new Control({
70
+ x: 0.5,
71
+ y: 0.5,
72
+ cursorStyleHandler: scaleCursorStyleHandler,
73
+ actionHandler: scalingEqually,
74
+ }),
75
+
76
+ mtr: new Control({
77
+ x: 0,
78
+ y: -0.5,
79
+ actionHandler: rotationWithSnapping,
80
+ cursorStyleHandler: rotationStyleHandler,
81
+ offsetY: -40,
82
+ withConnection: true,
83
+ actionName: 'rotate',
84
+ }),
85
+ });
86
+
87
+ export const createResizeControls = () => ({
88
+ mr: new Control({
89
+ x: 0.5,
90
+ y: 0,
91
+ actionHandler: changeWidth,
92
+ cursorStyleHandler: scaleSkewCursorStyleHandler,
93
+ actionName: 'resizing',
94
+ }),
95
+ ml: new Control({
96
+ x: -0.5,
97
+ y: 0,
98
+ actionHandler: changeWidth,
99
+ cursorStyleHandler: scaleSkewCursorStyleHandler,
100
+ actionName: 'resizing',
101
+ }),
102
+ });
103
+
104
+ export const createTextboxDefaultControls = () => ({
105
+ ...createObjectDefaultControls(),
106
+ ...createResizeControls(),
107
+ });
108
+
109
+ export const defaultControls = createObjectDefaultControls();
110
+
111
+ // shared with the default object on purpose
112
+ export const textboxDefaultControls = {
113
+ ...defaultControls,
114
+ ...createResizeControls(),
115
+ };
116
+
117
+ FabricObject.prototype.controls = {
118
+ ...(FabricObject.prototype.controls || {}),
119
+ ...defaultControls,
120
+ };
121
+
122
+ if (Textbox) {
123
+ // this is breaking the prototype inheritance, no time / ideas to fix it.
124
+ // is important to document that if you want to have all objects to have a
125
+ // specific custom control, you have to add it to Object prototype and to Textbox
126
+ // prototype. The controls are shared as references. So changes to control `tr`
127
+ // can still apply to all objects if needed.
128
+ Textbox.prototype.controls = {
129
+ ...(Textbox.prototype.controls || {}),
130
+ ...textboxDefaultControls,
131
+ };
132
+ }