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,672 @@
1
+ import { Point } from '../../Point';
2
+ import type { AssertKeys, TCornerPoint, TDegree, TMat2D } from '../../typedefs';
3
+ import { FabricObject } from './Object';
4
+ import { degreesToRadians } from '../../util/misc/radiansDegreesConversion';
5
+ import {
6
+ calcRotateMatrix,
7
+ multiplyTransformMatrices,
8
+ qrDecompose,
9
+ TQrDecomposeOut,
10
+ } from '../../util/misc/matrix';
11
+ import type { Control } from '../../controls/Control';
12
+ import { sizeAfterTransform } from '../../util/misc/objectTransforms';
13
+ import { ObjectEvents, TPointerEvent } from '../../EventTypeDefs';
14
+ import type { Canvas } from '../../canvas/Canvas';
15
+ import type { ControlRenderingStyleOverride } from '../../controls/controlRendering';
16
+ import { FabricObjectProps } from './types/FabricObjectProps';
17
+ import { TFabricObjectProps, SerializedObjectProps } from './types';
18
+ import { createObjectDefaultControls } from '../../controls/commonControls';
19
+
20
+ type TOCoord = Point & {
21
+ corner: TCornerPoint;
22
+ touchCorner: TCornerPoint;
23
+ };
24
+
25
+ type TControlSet = Record<string, Control>;
26
+
27
+ type TBorderRenderingStyleOverride = Partial<
28
+ Pick<InteractiveFabricObject, 'borderColor' | 'borderDashArray'>
29
+ >;
30
+
31
+ type TStyleOverride = ControlRenderingStyleOverride &
32
+ TBorderRenderingStyleOverride &
33
+ Partial<
34
+ Pick<InteractiveFabricObject, 'hasBorders' | 'hasControls'> & {
35
+ forActiveSelection: boolean;
36
+ }
37
+ >;
38
+
39
+ export interface DragMethods {
40
+ shouldStartDragging(): boolean;
41
+ onDragStart(e: DragEvent): boolean;
42
+ }
43
+
44
+ export type FabricObjectWithDragSupport = InteractiveFabricObject & DragMethods;
45
+
46
+ const interactiveDefaults = {};
47
+
48
+ export class InteractiveFabricObject<
49
+ Props extends TFabricObjectProps = Partial<FabricObjectProps>,
50
+ SProps extends SerializedObjectProps = SerializedObjectProps,
51
+ EventSpec extends ObjectEvents = ObjectEvents
52
+ >
53
+ extends FabricObject<Props, SProps, EventSpec>
54
+ implements FabricObjectProps
55
+ {
56
+ declare noScaleCache: boolean;
57
+ declare centeredScaling: false;
58
+
59
+ declare snapAngle?: TDegree;
60
+ declare snapThreshold?: TDegree;
61
+
62
+ declare lockMovementX: boolean;
63
+ declare lockMovementY: boolean;
64
+ declare lockRotation: boolean;
65
+ declare lockScalingX: boolean;
66
+ declare lockScalingY: boolean;
67
+ declare lockSkewingX: boolean;
68
+ declare lockSkewingY: boolean;
69
+ declare lockScalingFlip: boolean;
70
+
71
+ declare cornerSize: number;
72
+ declare touchCornerSize: number;
73
+ declare transparentCorners: boolean;
74
+ declare cornerColor: string;
75
+ declare cornerStrokeColor: string;
76
+ declare cornerStyle: 'rect' | 'circle';
77
+ declare cornerDashArray: number[] | null;
78
+ declare hasControls: boolean;
79
+
80
+ declare borderColor: string;
81
+ declare borderDashArray: number[] | null;
82
+ declare borderOpacityWhenMoving: number;
83
+ declare borderScaleFactor: number;
84
+ declare hasBorders: boolean;
85
+ declare selectionBackgroundColor: string;
86
+
87
+ declare selectable: boolean;
88
+ declare evented: boolean;
89
+ declare perPixelTargetFind: boolean;
90
+ declare activeOn: 'down' | 'up';
91
+
92
+ declare hoverCursor: CSSStyleDeclaration['cursor'] | null;
93
+ declare moveCursor: CSSStyleDeclaration['cursor'] | null;
94
+
95
+ /**
96
+ * Describe object's corner position in canvas element coordinates.
97
+ * properties are depending on control keys and padding the main controls.
98
+ * each property is an object with x, y and corner.
99
+ * The `corner` property contains in a similar manner the 4 points of the
100
+ * interactive area of the corner.
101
+ * The coordinates depends from the controls positionHandler and are used
102
+ * to draw and locate controls
103
+ */
104
+ declare oCoords: Record<string, TOCoord>;
105
+
106
+ /**
107
+ * keeps the value of the last hovered corner during mouse move.
108
+ * 0 is no corner, or 'mt', 'ml', 'mtr' etc..
109
+ * It should be private, but there is no harm in using it as
110
+ * a read-only property.
111
+ * this isn't cleaned automatically. Non selected objects may have wrong values
112
+ * @type [string]
113
+ */
114
+ declare __corner?: string;
115
+
116
+ /**
117
+ * a map of control visibility for this object.
118
+ * this was left when controls were introduced to not break the api too much
119
+ * this takes priority over the generic control visibility
120
+ */
121
+ declare _controlsVisibility: Record<string, boolean>;
122
+
123
+ /**
124
+ * holds the controls for the object.
125
+ * controls are added by default_controls.js
126
+ */
127
+ declare controls: TControlSet;
128
+
129
+ /**
130
+ * internal boolean to signal the code that the object is
131
+ * part of the move action.
132
+ */
133
+ declare isMoving?: boolean;
134
+
135
+ /**
136
+ * A boolean used from the gesture module to keep tracking of a scaling
137
+ * action when there is no scaling transform in place.
138
+ * This is an edge case and is used twice in all codebase.
139
+ * Probably added to keep track of some performance issues
140
+ * @TODO use git blame to investigate why it was added
141
+ * DON'T USE IT. WE WILL TRY TO REMOVE IT
142
+ */
143
+ declare _scaling?: boolean;
144
+
145
+ declare canvas?: Canvas;
146
+
147
+ static ownDefaults: Record<string, any> = interactiveDefaults;
148
+
149
+ static getDefaults(): Record<string, any> {
150
+ return {
151
+ ...super.getDefaults(),
152
+ controls: createObjectDefaultControls(),
153
+ ...InteractiveFabricObject.ownDefaults,
154
+ };
155
+ }
156
+
157
+ /**
158
+ * Update width and height of the canvas for cache
159
+ * returns true or false if canvas needed resize.
160
+ * @private
161
+ * @return {Boolean} true if the canvas has been resized
162
+ */
163
+ _updateCacheCanvas() {
164
+ const targetCanvas = this.canvas;
165
+ if (this.noScaleCache && targetCanvas && targetCanvas._currentTransform) {
166
+ const target = targetCanvas._currentTransform.target,
167
+ action = targetCanvas._currentTransform.action;
168
+ if (this === (target as unknown as this) && action.startsWith('scale')) {
169
+ return false;
170
+ }
171
+ }
172
+ return super._updateCacheCanvas();
173
+ }
174
+
175
+ /**
176
+ * Determines which corner is under the mouse cursor, represented by `pointer`.
177
+ * This function is return a corner only if the object is the active one.
178
+ * This is done to avoid selecting corner of non active object and activating transformations
179
+ * rather than drag action. The default behavior of fabricJS is that if you want to transform
180
+ * an object, first you select it to show the control set
181
+ * @private
182
+ * @param {Object} pointer The pointer indicating the mouse position
183
+ * @param {boolean} forTouch indicates if we are looking for interaction area with a touch action
184
+ * @return {String|Boolean} corner code (tl, tr, bl, br, etc.), or 0 if nothing is found.
185
+ */
186
+ _findTargetCorner(pointer: Point, forTouch = false): 0 | string {
187
+ if (
188
+ !this.hasControls ||
189
+ !this.canvas ||
190
+ (this.canvas._activeObject as unknown as this) !== this
191
+ ) {
192
+ return 0;
193
+ }
194
+
195
+ this.__corner = undefined;
196
+ // had to keep the reverse loop because was breaking tests
197
+ const cornerEntries = Object.entries(this.oCoords);
198
+ for (let i = cornerEntries.length - 1; i >= 0; i--) {
199
+ const [cornerKey, corner] = cornerEntries[i];
200
+ if (!this.isControlVisible(cornerKey)) {
201
+ continue;
202
+ }
203
+ const lines = this._getImageLines(
204
+ forTouch ? corner.touchCorner : corner.corner
205
+ );
206
+ const xPoints = this._findCrossPoints(pointer, lines);
207
+ if (xPoints !== 0 && xPoints % 2 === 1) {
208
+ this.__corner = cornerKey;
209
+ return cornerKey;
210
+ }
211
+ // // debugging
212
+ //
213
+ // this.canvas.contextTop.fillRect(lines.bottomline.d.x, lines.bottomline.d.y, 2, 2);
214
+ // this.canvas.contextTop.fillRect(lines.bottomline.o.x, lines.bottomline.o.y, 2, 2);
215
+ //
216
+ // this.canvas.contextTop.fillRect(lines.leftline.d.x, lines.leftline.d.y, 2, 2);
217
+ // this.canvas.contextTop.fillRect(lines.leftline.o.x, lines.leftline.o.y, 2, 2);
218
+ //
219
+ // this.canvas.contextTop.fillRect(lines.topline.d.x, lines.topline.d.y, 2, 2);
220
+ // this.canvas.contextTop.fillRect(lines.topline.o.x, lines.topline.o.y, 2, 2);
221
+ //
222
+ // this.canvas.contextTop.fillRect(lines.rightline.d.x, lines.rightline.d.y, 2, 2);
223
+ // this.canvas.contextTop.fillRect(lines.rightline.o.x, lines.rightline.o.y, 2, 2);
224
+ }
225
+ return 0;
226
+ }
227
+
228
+ /**
229
+ * Calculates the coordinates of the center of each control plus the corners of the control itself
230
+ * This basically just delegates to each control positionHandler
231
+ * WARNING: changing what is passed to positionHandler is a breaking change, since position handler
232
+ * is a public api and should be done just if extremely necessary
233
+ * @return {Record<string, TOCoord>}
234
+ */
235
+ calcOCoords(): Record<string, TOCoord> {
236
+ const vpt = this.getViewportTransform(),
237
+ center = this.getCenterPoint(),
238
+ tMatrix = [1, 0, 0, 1, center.x, center.y] as TMat2D,
239
+ rMatrix = calcRotateMatrix({
240
+ angle: this.getTotalAngle() - (!!this.group && this.flipX ? 180 : 0),
241
+ }),
242
+ positionMatrix = multiplyTransformMatrices(tMatrix, rMatrix),
243
+ startMatrix = multiplyTransformMatrices(vpt, positionMatrix),
244
+ finalMatrix = multiplyTransformMatrices(startMatrix, [
245
+ 1 / vpt[0],
246
+ 0,
247
+ 0,
248
+ 1 / vpt[3],
249
+ 0,
250
+ 0,
251
+ ]),
252
+ transformOptions = this.group
253
+ ? qrDecompose(this.calcTransformMatrix())
254
+ : undefined,
255
+ dim = this._calculateCurrentDimensions(transformOptions),
256
+ coords: Record<string, TOCoord> = {};
257
+
258
+ this.forEachControl((control, key) => {
259
+ const position = control.positionHandler(dim, finalMatrix, this, control);
260
+ // coords[key] are sometimes used as points. Those are points to which we add
261
+ // the property corner and touchCorner from `_calcCornerCoords`.
262
+ // don't remove this assign for an object spread.
263
+ coords[key] = Object.assign(
264
+ position,
265
+ this._calcCornerCoords(control, position)
266
+ );
267
+ });
268
+
269
+ // debug code
270
+ /*
271
+ const canvas = this.canvas;
272
+ setTimeout(function () {
273
+ if (!canvas) return;
274
+ canvas.contextTop.clearRect(0, 0, 700, 700);
275
+ canvas.contextTop.fillStyle = 'green';
276
+ Object.keys(coords).forEach(function(key) {
277
+ const control = coords[key];
278
+ canvas.contextTop.fillRect(control.x, control.y, 3, 3);
279
+ });
280
+ } 50);
281
+ */
282
+ return coords;
283
+ }
284
+
285
+ /**
286
+ * Sets the coordinates that determine the interaction area of each control
287
+ * note: if we would switch to ROUND corner area, all of this would disappear.
288
+ * everything would resolve to a single point and a pythagorean theorem for the distance
289
+ * @todo evaluate simplification of code switching to circle interaction area at runtime
290
+ * @private
291
+ */
292
+ private _calcCornerCoords(control: Control, position: Point) {
293
+ const corner = control.calcCornerCoords(
294
+ this.angle,
295
+ this.cornerSize,
296
+ position.x,
297
+ position.y,
298
+ false
299
+ );
300
+ const touchCorner = control.calcCornerCoords(
301
+ this.angle,
302
+ this.touchCornerSize,
303
+ position.x,
304
+ position.y,
305
+ true
306
+ );
307
+ return { corner, touchCorner };
308
+ }
309
+
310
+ /**
311
+ * Sets corner and controls position coordinates based on current angle, width and height, left and top.
312
+ * oCoords are used to find the corners
313
+ * aCoords are used to quickly find an object on the canvas
314
+ * lineCoords are used to quickly find object during pointer events.
315
+ * See {@link https://github.com/fabricjs/fabric.js/wiki/When-to-call-setCoords} and {@link http://fabricjs.com/fabric-gotchas}
316
+ * @return {void}
317
+ */
318
+ setCoords(): void {
319
+ super.setCoords();
320
+ // set coordinates of the draggable boxes in the corners used to scale/rotate the image
321
+ this.oCoords = this.calcOCoords();
322
+ }
323
+
324
+ /**
325
+ * Calls a function for each control. The function gets called,
326
+ * with the control, the control's key and the object that is calling the iterator
327
+ * @param {Function} fn function to iterate over the controls over
328
+ */
329
+ forEachControl(
330
+ fn: (
331
+ control: Control,
332
+ key: string,
333
+ fabricObject: InteractiveFabricObject
334
+ ) => any
335
+ ) {
336
+ for (const i in this.controls) {
337
+ fn(this.controls[i], i, this);
338
+ }
339
+ }
340
+
341
+ /**
342
+ * Draws a colored layer behind the object, inside its selection borders.
343
+ * Requires public options: padding, selectionBackgroundColor
344
+ * this function is called when the context is transformed
345
+ * has checks to be skipped when the object is on a staticCanvas
346
+ * @todo evaluate if make this disappear in favor of a pre-render hook for objects
347
+ * this was added by Andrea Bogazzi to make possible some feature for work reasons
348
+ * it seemed a good option, now is an edge case
349
+ * @param {CanvasRenderingContext2D} ctx Context to draw on
350
+ */
351
+ drawSelectionBackground(ctx: CanvasRenderingContext2D): void {
352
+ if (
353
+ !this.selectionBackgroundColor ||
354
+ (this.canvas && !this.canvas.interactive) ||
355
+ (this.canvas && (this.canvas._activeObject as unknown as this) !== this)
356
+ ) {
357
+ return;
358
+ }
359
+ ctx.save();
360
+ const center = this.getRelativeCenterPoint(),
361
+ wh = this._calculateCurrentDimensions(),
362
+ vpt = this.getViewportTransform();
363
+ ctx.translate(center.x, center.y);
364
+ ctx.scale(1 / vpt[0], 1 / vpt[3]);
365
+ ctx.rotate(degreesToRadians(this.angle));
366
+ ctx.fillStyle = this.selectionBackgroundColor;
367
+ ctx.fillRect(-wh.x / 2, -wh.y / 2, wh.x, wh.y);
368
+ ctx.restore();
369
+ }
370
+
371
+ /**
372
+ * @public override this function in order to customize the drawing of the control box, e.g. rounded corners, different border style.
373
+ * @param {CanvasRenderingContext2D} ctx ctx is rotated and translated so that (0,0) is at object's center
374
+ * @param {Point} size the control box size used
375
+ */
376
+ strokeBorders(ctx: CanvasRenderingContext2D, size: Point): void {
377
+ ctx.strokeRect(-size.x / 2, -size.y / 2, size.x, size.y);
378
+ }
379
+
380
+ /**
381
+ * @private
382
+ * @param {CanvasRenderingContext2D} ctx Context to draw on
383
+ * @param {Point} size
384
+ * @param {TStyleOverride} styleOverride object to override the object style
385
+ */
386
+ _drawBorders(
387
+ ctx: CanvasRenderingContext2D,
388
+ size: Point,
389
+ styleOverride: TStyleOverride = {}
390
+ ): void {
391
+ const options = {
392
+ hasControls: this.hasControls,
393
+ borderColor: this.borderColor,
394
+ borderDashArray: this.borderDashArray,
395
+ ...styleOverride,
396
+ };
397
+ ctx.save();
398
+ ctx.strokeStyle = options.borderColor;
399
+ this._setLineDash(ctx, options.borderDashArray);
400
+ this.strokeBorders(ctx, size);
401
+ options.hasControls && this.drawControlsConnectingLines(ctx, size);
402
+ ctx.restore();
403
+ }
404
+
405
+ /**
406
+ * Renders controls and borders for the object
407
+ * the context here is not transformed
408
+ * @todo move to interactivity
409
+ * @param {CanvasRenderingContext2D} ctx Context to render on
410
+ * @param {TStyleOverride} [styleOverride] properties to override the object style
411
+ */
412
+ _renderControls(
413
+ ctx: CanvasRenderingContext2D,
414
+ styleOverride: TStyleOverride = {}
415
+ ) {
416
+ const { hasBorders, hasControls } = this;
417
+ const styleOptions = {
418
+ hasBorders,
419
+ hasControls,
420
+ ...styleOverride,
421
+ };
422
+ const vpt = this.getViewportTransform(),
423
+ shouldDrawBorders = styleOptions.hasBorders,
424
+ shouldDrawControls = styleOptions.hasControls;
425
+ const matrix = multiplyTransformMatrices(vpt, this.calcTransformMatrix());
426
+ const options = qrDecompose(matrix);
427
+ ctx.save();
428
+ ctx.translate(options.translateX, options.translateY);
429
+ ctx.lineWidth = 1 * this.borderScaleFactor;
430
+ if (!this.group) {
431
+ ctx.globalAlpha = this.isMoving ? this.borderOpacityWhenMoving : 1;
432
+ }
433
+ if (this.flipX) {
434
+ options.angle -= 180;
435
+ }
436
+ ctx.rotate(degreesToRadians(this.group ? options.angle : this.angle));
437
+ shouldDrawBorders && this.drawBorders(ctx, options, styleOverride);
438
+ shouldDrawControls && this.drawControls(ctx, styleOverride);
439
+ ctx.restore();
440
+ }
441
+
442
+ /**
443
+ * Draws borders of an object's bounding box.
444
+ * Requires public properties: width, height
445
+ * Requires public options: padding, borderColor
446
+ * @param {CanvasRenderingContext2D} ctx Context to draw on
447
+ * @param {object} options object representing current object parameters
448
+ * @param {TStyleOverride} [styleOverride] object to override the object style
449
+ */
450
+ drawBorders(
451
+ ctx: CanvasRenderingContext2D,
452
+ options: TQrDecomposeOut,
453
+ styleOverride: TStyleOverride
454
+ ): void {
455
+ let size;
456
+ if ((styleOverride && styleOverride.forActiveSelection) || this.group) {
457
+ const bbox = sizeAfterTransform(this.width, this.height, options),
458
+ stroke = (
459
+ this.strokeUniform
460
+ ? new Point().scalarAdd(this.canvas ? this.canvas.getZoom() : 1)
461
+ : // this is extremely confusing. options comes from the upper function
462
+ // and is the qrDecompose of a matrix that takes in account zoom too
463
+ new Point(options.scaleX, options.scaleY)
464
+ ).scalarMultiply(this.strokeWidth);
465
+ size = bbox.add(stroke).scalarAdd(this.borderScaleFactor);
466
+ } else {
467
+ size = this._calculateCurrentDimensions().scalarAdd(
468
+ this.borderScaleFactor
469
+ );
470
+ }
471
+ this._drawBorders(ctx, size, styleOverride);
472
+ }
473
+
474
+ /**
475
+ * Draws lines from a borders of an object's bounding box to controls that have `withConnection` property set.
476
+ * Requires public properties: width, height
477
+ * Requires public options: padding, borderColor
478
+ * @param {CanvasRenderingContext2D} ctx Context to draw on
479
+ * @param {Point} size object size x = width, y = height
480
+ */
481
+ drawControlsConnectingLines(
482
+ ctx: CanvasRenderingContext2D,
483
+ size: Point
484
+ ): void {
485
+ let shouldStroke = false;
486
+
487
+ ctx.beginPath();
488
+ this.forEachControl((control, key) => {
489
+ // in this moment, the ctx is centered on the object.
490
+ // width and height of the above function are the size of the bbox.
491
+ if (control.withConnection && control.getVisibility(this, key)) {
492
+ // reset movement for each control
493
+ shouldStroke = true;
494
+ ctx.moveTo(control.x * size.x, control.y * size.y);
495
+ ctx.lineTo(
496
+ control.x * size.x + control.offsetX,
497
+ control.y * size.y + control.offsetY
498
+ );
499
+ }
500
+ });
501
+ shouldStroke && ctx.stroke();
502
+ }
503
+
504
+ /**
505
+ * Draws corners of an object's bounding box.
506
+ * Requires public properties: width, height
507
+ * Requires public options: cornerSize, padding
508
+ * @param {CanvasRenderingContext2D} ctx Context to draw on
509
+ * @param {ControlRenderingStyleOverride} styleOverride object to override the object style
510
+ */
511
+ drawControls(
512
+ ctx: CanvasRenderingContext2D,
513
+ styleOverride: ControlRenderingStyleOverride = {}
514
+ ) {
515
+ ctx.save();
516
+ const retinaScaling = this.getCanvasRetinaScaling();
517
+ const { cornerStrokeColor, cornerDashArray, cornerColor } = this;
518
+ const options = {
519
+ cornerStrokeColor,
520
+ cornerDashArray,
521
+ cornerColor,
522
+ ...styleOverride,
523
+ };
524
+ ctx.setTransform(retinaScaling, 0, 0, retinaScaling, 0, 0);
525
+ ctx.strokeStyle = ctx.fillStyle = options.cornerColor;
526
+ if (!this.transparentCorners) {
527
+ ctx.strokeStyle = options.cornerStrokeColor;
528
+ }
529
+ this._setLineDash(ctx, options.cornerDashArray);
530
+ this.setCoords();
531
+ this.forEachControl((control, key) => {
532
+ if (control.getVisibility(this, key)) {
533
+ const p = this.oCoords[key];
534
+ control.render(ctx, p.x, p.y, options, this);
535
+ }
536
+ });
537
+ ctx.restore();
538
+ }
539
+
540
+ /**
541
+ * Returns true if the specified control is visible, false otherwise.
542
+ * @param {string} controlKey The key of the control. Possible values are usually 'tl', 'tr', 'br', 'bl', 'ml', 'mt', 'mr', 'mb', 'mtr',
543
+ * but since the control api allow for any control name, can be any string.
544
+ * @returns {boolean} true if the specified control is visible, false otherwise
545
+ */
546
+ isControlVisible(controlKey: string): boolean {
547
+ return (
548
+ this.controls[controlKey] &&
549
+ this.controls[controlKey].getVisibility(this, controlKey)
550
+ );
551
+ }
552
+
553
+ /**
554
+ * Sets the visibility of the specified control.
555
+ * please do not use.
556
+ * @param {String} controlKey The key of the control. Possible values are 'tl', 'tr', 'br', 'bl', 'ml', 'mt', 'mr', 'mb', 'mtr'.
557
+ * but since the control api allow for any control name, can be any string.
558
+ * @param {Boolean} visible true to set the specified control visible, false otherwise
559
+ * @todo discuss this overlap of priority here with the team. Andrea Bogazzi for details
560
+ */
561
+ setControlVisible(controlKey: string, visible: boolean) {
562
+ if (!this._controlsVisibility) {
563
+ this._controlsVisibility = {};
564
+ }
565
+ this._controlsVisibility[controlKey] = visible;
566
+ }
567
+
568
+ /**
569
+ * Sets the visibility state of object controls, this is just a bulk option for setControlVisible;
570
+ * @param {Record<string, boolean>} [options] with an optional key per control
571
+ * example: {Boolean} [options.bl] true to enable the bottom-left control, false to disable it
572
+ */
573
+ setControlsVisibility(options: Record<string, boolean> = {}) {
574
+ Object.entries(options).forEach(([controlKey, visibility]) =>
575
+ this.setControlVisible(controlKey, visibility)
576
+ );
577
+ }
578
+
579
+ /**
580
+ * Clears the canvas.contextTop in a specific area that corresponds to the object's bounding box
581
+ * that is in the canvas.contextContainer.
582
+ * This function is used to clear pieces of contextTop where we render ephemeral effects on top of the object.
583
+ * Example: blinking cursor text selection, drag effects.
584
+ * @todo discuss swapping restoreManually with a renderCallback, but think of async issues
585
+ * @param {Boolean} [restoreManually] When true won't restore the context after clear, in order to draw something else.
586
+ * @return {CanvasRenderingContext2D|undefined} canvas.contextTop that is either still transformed
587
+ * with the object transformMatrix, or restored to neutral transform
588
+ */
589
+ clearContextTop(
590
+ restoreManually?: boolean
591
+ ): CanvasRenderingContext2D | undefined {
592
+ if (!this.canvas) {
593
+ return;
594
+ }
595
+ const ctx = this.canvas.contextTop;
596
+ if (!ctx) {
597
+ return;
598
+ }
599
+ const v = this.canvas.viewportTransform;
600
+ ctx.save();
601
+ ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);
602
+ this.transform(ctx);
603
+ // we add 4 pixel, to be sure to do not leave any pixel out
604
+ const width = this.width + 4,
605
+ height = this.height + 4;
606
+ ctx.clearRect(-width / 2, -height / 2, width, height);
607
+
608
+ restoreManually || ctx.restore();
609
+ return ctx;
610
+ }
611
+
612
+ /**
613
+ * This callback function is called every time _discardActiveObject or _setActiveObject
614
+ * try to to deselect this object. If the function returns true, the process is cancelled
615
+ * @param {Object} [options] options sent from the upper functions
616
+ * @param {TPointerEvent} [options.e] event if the process is generated by an event
617
+ * @param {FabricObject} [options.object] next object we are setting as active, and reason why
618
+ * this is being deselected
619
+
620
+ */
621
+ onDeselect(options?: { e?: TPointerEvent; object?: FabricObject }): boolean {
622
+ // implemented by sub-classes, as needed.
623
+ return false;
624
+ }
625
+
626
+ /**
627
+ * This callback function is called every time _discardActiveObject or _setActiveObject
628
+ * try to to select this object. If the function returns true, the process is cancelled
629
+ * @param {Object} [options] options sent from the upper functions
630
+ * @param {Event} [options.e] event if the process is generated by an event
631
+ */
632
+ onSelect(options?: { e?: TPointerEvent }): boolean {
633
+ // implemented by sub-classes, as needed.
634
+ return false;
635
+ }
636
+
637
+ /**
638
+ * Override to customize drag and drop behavior
639
+ * return true if the object currently dragged can be dropped on the target
640
+ * @public
641
+ * @param {DragEvent} e
642
+ * @returns {boolean}
643
+ */
644
+ canDrop(e: DragEvent): boolean {
645
+ return false;
646
+ }
647
+
648
+ /**
649
+ * Override to customize drag and drop behavior
650
+ * render a specific effect when an object is the source of a drag event
651
+ * example: render the selection status for the part of text that is being dragged from a text object
652
+ * @public
653
+ * @param {DragEvent} e
654
+ * @returns {boolean}
655
+ */
656
+ renderDragSourceEffect(this: AssertKeys<this, 'canvas'>, e: DragEvent) {
657
+ // for subclasses
658
+ }
659
+
660
+ /**
661
+ * Override to customize drag and drop behavior
662
+ * render a specific effect when an object is the target of a drag event
663
+ * used to show that the underly object can receive a drop, or to show how the
664
+ * object will change when dropping. example: show the cursor where the text is about to be dropped
665
+ * @public
666
+ * @param {DragEvent} e
667
+ * @returns {boolean}
668
+ */
669
+ renderDropTargetEffect(this: AssertKeys<this, 'canvas'>, e: DragEvent) {
670
+ // for subclasses
671
+ }
672
+ }