fabric 5.3.0 → 6.0.0-beta10

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 (634) 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 +51 -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 +615 -189
  13. package/CONTRIBUTING.md +233 -59
  14. package/README.md +200 -235
  15. package/babel-jest.config.js +6 -0
  16. package/bower.json +1 -3
  17. package/dist/fabric.d.ts +54 -0
  18. package/dist/index.d.ts +2 -0
  19. package/dist/index.js +28452 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/index.min.js +1 -0
  22. package/dist/index.mjs +28385 -0
  23. package/dist/index.mjs.map +1 -0
  24. package/dist/index.node.cjs +28538 -0
  25. package/dist/index.node.cjs.map +1 -0
  26. package/dist/index.node.d.ts +20 -0
  27. package/dist/index.node.mjs +28477 -0
  28. package/dist/index.node.mjs.map +1 -0
  29. package/dist/src/ClassRegistry.d.ts +13 -0
  30. package/dist/src/Collection.d.ts +136 -0
  31. package/dist/src/CommonMethods.d.ts +32 -0
  32. package/dist/src/EventTypeDefs.d.ts +227 -0
  33. package/dist/src/Intersection.d.ts +112 -0
  34. package/dist/src/Observable.d.ts +60 -0
  35. package/dist/src/Pattern/Pattern.d.ts +99 -0
  36. package/dist/src/Pattern/index.d.ts +3 -0
  37. package/dist/src/Pattern/types.d.ts +9 -0
  38. package/dist/src/Point.d.ts +232 -0
  39. package/dist/src/Shadow.d.ts +96 -0
  40. package/dist/src/brushes/BaseBrush.d.ts +101 -0
  41. package/dist/src/brushes/CircleBrush.d.ts +44 -0
  42. package/dist/src/brushes/CircleBrush.test.d.ts +2 -0
  43. package/dist/src/brushes/PatternBrush.d.ts +23 -0
  44. package/dist/src/brushes/PencilBrush.d.ts +92 -0
  45. package/dist/src/brushes/SprayBrush.d.ts +74 -0
  46. package/dist/src/brushes/typedefs.d.ts +18 -0
  47. package/dist/src/cache.d.ts +47 -0
  48. package/dist/src/canvas/Canvas.d.ts +364 -0
  49. package/dist/src/canvas/DOMManagers/CanvasDOMManager.d.ts +29 -0
  50. package/dist/src/canvas/DOMManagers/StaticCanvasDOMManager.d.ts +29 -0
  51. package/dist/src/canvas/DOMManagers/util.d.ts +24 -0
  52. package/dist/src/canvas/DOMManagers/util.spec.d.ts +2 -0
  53. package/dist/src/canvas/SelectableCanvas.d.ts +723 -0
  54. package/dist/src/canvas/StaticCanvas.d.ts +747 -0
  55. package/dist/src/canvas/TextEditingManager.d.ts +21 -0
  56. package/dist/src/canvas/canvas_gestures.mixin.d.ts +2 -0
  57. package/dist/src/color/Color.d.ts +152 -0
  58. package/dist/src/color/color_map.d.ts +155 -0
  59. package/dist/src/color/constants.d.ts +104 -0
  60. package/dist/src/color/typedefs.d.ts +16 -0
  61. package/dist/src/color/util.d.ts +27 -0
  62. package/dist/src/config.d.ts +115 -0
  63. package/dist/src/constants.d.ts +21 -0
  64. package/dist/src/controls/Control.d.ts +229 -0
  65. package/dist/src/controls/changeWidth.d.ts +13 -0
  66. package/dist/src/controls/commonControls.d.ts +28 -0
  67. package/dist/src/controls/controlRendering.d.ts +29 -0
  68. package/dist/src/controls/drag.d.ts +12 -0
  69. package/dist/src/controls/fireEvent.d.ts +3 -0
  70. package/dist/src/controls/index.d.ts +13 -0
  71. package/dist/src/controls/polyControl.d.ts +5 -0
  72. package/dist/src/controls/rotate.d.ts +12 -0
  73. package/dist/src/controls/scale.d.ts +47 -0
  74. package/dist/src/controls/scaleSkew.d.ts +39 -0
  75. package/dist/src/controls/skew.d.ts +33 -0
  76. package/dist/src/controls/util.d.ts +41 -0
  77. package/dist/src/controls/wrapWithFireEvent.d.ts +8 -0
  78. package/dist/src/controls/wrapWithFixedAnchor.d.ts +9 -0
  79. package/dist/src/env/browser.d.ts +3 -0
  80. package/dist/src/env/index.d.ts +28 -0
  81. package/dist/src/env/node.d.ts +6 -0
  82. package/dist/src/env/types.d.ts +15 -0
  83. package/dist/src/filters/BaseFilter.d.ts +160 -0
  84. package/dist/src/filters/BlendColor.d.ts +81 -0
  85. package/dist/src/filters/BlendImage.d.ts +93 -0
  86. package/dist/src/filters/Blur.d.ts +52 -0
  87. package/dist/src/filters/Boilerplate.d.ts +48 -0
  88. package/dist/src/filters/Brightness.d.ts +48 -0
  89. package/dist/src/filters/Canvas2dFilterBackend.d.ts +27 -0
  90. package/dist/src/filters/ColorMatrix.d.ts +64 -0
  91. package/dist/src/filters/ColorMatrixFilters.d.ts +537 -0
  92. package/dist/src/filters/Composed.d.ts +46 -0
  93. package/dist/src/filters/Contrast.d.ts +46 -0
  94. package/dist/src/filters/Convolute.d.ts +83 -0
  95. package/dist/src/filters/FilterBackend.d.ts +15 -0
  96. package/dist/src/filters/GLProbes/GLProbe.d.ts +7 -0
  97. package/dist/src/filters/GLProbes/NodeGLProbe.d.ts +11 -0
  98. package/dist/src/filters/GLProbes/WebGLProbe.d.ts +20 -0
  99. package/dist/src/filters/Gamma.d.ts +55 -0
  100. package/dist/src/filters/Grayscale.d.ts +47 -0
  101. package/dist/src/filters/HueRotation.d.ts +25 -0
  102. package/dist/src/filters/Invert.d.ts +56 -0
  103. package/dist/src/filters/Noise.d.ts +55 -0
  104. package/dist/src/filters/Pixelate.d.ts +45 -0
  105. package/dist/src/filters/RemoveColor.d.ts +64 -0
  106. package/dist/src/filters/Resize.d.ts +137 -0
  107. package/dist/src/filters/Saturation.d.ts +49 -0
  108. package/dist/src/filters/Vibrance.d.ts +49 -0
  109. package/dist/src/filters/WebGLFilterBackend.d.ts +128 -0
  110. package/dist/src/filters/filters.d.ts +21 -0
  111. package/dist/src/filters/index.d.ts +7 -0
  112. package/dist/src/filters/shaders/baseFilter.d.ts +4 -0
  113. package/dist/src/filters/shaders/blendColor.d.ts +13 -0
  114. package/dist/src/filters/shaders/blendImage.d.ts +3 -0
  115. package/dist/src/filters/shaders/blur.d.ts +2 -0
  116. package/dist/src/filters/shaders/brightness.d.ts +2 -0
  117. package/dist/src/filters/shaders/colorMatrix.d.ts +2 -0
  118. package/dist/src/filters/shaders/constrast.d.ts +2 -0
  119. package/dist/src/filters/shaders/convolute.d.ts +11 -0
  120. package/dist/src/filters/shaders/gamma.d.ts +2 -0
  121. package/dist/src/filters/shaders/grayscale.d.ts +3 -0
  122. package/dist/src/filters/shaders/invert.d.ts +2 -0
  123. package/dist/src/filters/shaders/noise.d.ts +2 -0
  124. package/dist/src/filters/shaders/pixelate.d.ts +2 -0
  125. package/dist/src/filters/shaders/removeColor.d.ts +2 -0
  126. package/dist/src/filters/shaders/saturation.d.ts +2 -0
  127. package/dist/src/filters/shaders/vibrance.d.ts +2 -0
  128. package/dist/src/filters/typedefs.d.ts +48 -0
  129. package/dist/src/filters/utils.d.ts +3 -0
  130. package/dist/src/gradient/Gradient.d.ts +150 -0
  131. package/dist/src/gradient/constants.d.ts +15 -0
  132. package/dist/src/gradient/index.d.ts +3 -0
  133. package/dist/src/gradient/parser/index.d.ts +4 -0
  134. package/dist/src/gradient/parser/misc.d.ts +4 -0
  135. package/dist/src/gradient/parser/parseColorStops.d.ts +3 -0
  136. package/dist/src/gradient/parser/parseCoords.d.ts +17 -0
  137. package/dist/src/gradient/typedefs.d.ts +93 -0
  138. package/dist/src/mixins/eraser_brush.mixin.d.ts +2 -0
  139. package/dist/src/parkinglot/canvas_animation.mixin.d.ts +2 -0
  140. package/dist/src/parkinglot/straighten.d.ts +2 -0
  141. package/dist/src/parser/applyViewboxTransform.d.ts +5 -0
  142. package/dist/src/parser/attributes.d.ts +6 -0
  143. package/dist/src/parser/constants.d.ts +53 -0
  144. package/dist/src/parser/doesSomeParentMatch.d.ts +2 -0
  145. package/dist/src/parser/elementById.d.ts +6 -0
  146. package/dist/src/parser/elementMatchesRule.d.ts +5 -0
  147. package/dist/src/parser/elements_parser.d.ts +3 -0
  148. package/dist/src/parser/getCSSRules.d.ts +7 -0
  149. package/dist/src/parser/getGlobalStylesForElement.d.ts +5 -0
  150. package/dist/src/parser/getGradientDefs.d.ts +7 -0
  151. package/dist/src/parser/getMultipleNodes.d.ts +2 -0
  152. package/dist/src/parser/getSvgRegex.d.ts +2 -0
  153. package/dist/src/parser/hasAncestorWithNodeName.d.ts +2 -0
  154. package/dist/src/parser/index.d.ts +9 -0
  155. package/dist/src/parser/loadSVGFromString.d.ts +18 -0
  156. package/dist/src/parser/loadSVGFromURL.d.ts +19 -0
  157. package/dist/src/parser/normalizeAttr.d.ts +2 -0
  158. package/dist/src/parser/normalizeValue.d.ts +2 -0
  159. package/dist/src/parser/parseAttributes.d.ts +9 -0
  160. package/dist/src/parser/parseFontDeclaration.d.ts +10 -0
  161. package/dist/src/parser/parsePointsAttribute.d.ts +12 -0
  162. package/dist/src/parser/parseSVGDocument.d.ts +23 -0
  163. package/dist/src/parser/parseStyleAttribute.d.ts +9 -0
  164. package/dist/src/parser/parseStyleObject.d.ts +2 -0
  165. package/dist/src/parser/parseStyleString.d.ts +2 -0
  166. package/dist/src/parser/parseTransformAttribute.d.ts +11 -0
  167. package/dist/src/parser/parseUseDirectives.d.ts +2 -0
  168. package/dist/src/parser/percent.d.ts +9 -0
  169. package/dist/src/parser/recursivelyParseGradientsXlink.d.ts +2 -0
  170. package/dist/src/parser/selectorMatches.d.ts +2 -0
  171. package/dist/src/parser/setStrokeFillOpacity.d.ts +6 -0
  172. package/dist/src/parser/typedefs.d.ts +9 -0
  173. package/dist/src/shapes/ActiveSelection.d.ts +83 -0
  174. package/dist/src/shapes/Circle.d.ts +99 -0
  175. package/dist/src/shapes/Ellipse.d.ts +84 -0
  176. package/dist/src/shapes/Group.d.ts +407 -0
  177. package/dist/src/shapes/IText/DraggableTextDelegate.d.ts +78 -0
  178. package/dist/src/shapes/IText/IText.d.ts +336 -0
  179. package/dist/src/shapes/IText/ITextBehavior.d.ts +287 -0
  180. package/dist/src/shapes/IText/ITextClickBehavior.d.ts +73 -0
  181. package/dist/src/shapes/IText/ITextKeyBehavior.d.ts +195 -0
  182. package/dist/src/shapes/IText/constants.d.ts +13 -0
  183. package/dist/src/shapes/Image.d.ts +309 -0
  184. package/dist/src/shapes/Line.d.ts +121 -0
  185. package/dist/src/shapes/Object/AnimatableObject.d.ts +33 -0
  186. package/dist/src/shapes/Object/FabricObject.d.ts +11 -0
  187. package/dist/src/shapes/Object/FabricObjectSVGExportMixin.d.ts +74 -0
  188. package/dist/src/shapes/Object/InteractiveObject.d.ts +296 -0
  189. package/dist/src/shapes/Object/Object.d.ts +599 -0
  190. package/dist/src/shapes/Object/ObjectGeometry.d.ts +327 -0
  191. package/dist/src/shapes/Object/ObjectOrigin.d.ts +109 -0
  192. package/dist/src/shapes/Object/StackedObject.d.ts +72 -0
  193. package/dist/src/shapes/Object/defaultValues.d.ts +76 -0
  194. package/dist/src/shapes/Object/types/BaseProps.d.ts +84 -0
  195. package/dist/src/shapes/Object/types/BorderProps.d.ts +37 -0
  196. package/dist/src/shapes/Object/types/ControlProps.d.ts +62 -0
  197. package/dist/src/shapes/Object/types/FabricObjectProps.d.ts +96 -0
  198. package/dist/src/shapes/Object/types/FillStrokeProps.d.ts +80 -0
  199. package/dist/src/shapes/Object/types/LockInteractionProps.d.ts +51 -0
  200. package/dist/src/shapes/Object/types/ObjectProps.d.ts +42 -0
  201. package/dist/src/shapes/Object/types/SerializedObjectProps.d.ts +66 -0
  202. package/dist/src/shapes/Object/types/index.d.ts +6 -0
  203. package/dist/src/shapes/Path.d.ts +214 -0
  204. package/dist/src/shapes/Polygon.d.ts +10 -0
  205. package/dist/src/shapes/Polyline.d.ts +147 -0
  206. package/dist/src/shapes/Rect.d.ts +82 -0
  207. package/dist/src/shapes/Text/StyledText.d.ts +123 -0
  208. package/dist/src/shapes/Text/Text.d.ts +688 -0
  209. package/dist/src/shapes/Text/TextSVGExportMixin.d.ts +32 -0
  210. package/dist/src/shapes/Text/constants.d.ts +13 -0
  211. package/dist/src/shapes/Textbox.d.ts +204 -0
  212. package/dist/src/shapes/Triangle.d.ts +26 -0
  213. package/dist/src/typedefs.d.ts +96 -0
  214. package/dist/src/util/animation/AnimationBase.d.ts +54 -0
  215. package/dist/src/util/animation/AnimationFrameProvider.d.ts +3 -0
  216. package/dist/src/util/animation/AnimationRegistry.d.ts +29 -0
  217. package/dist/src/util/animation/ArrayAnimation.d.ts +10 -0
  218. package/dist/src/util/animation/ColorAnimation.d.ts +11 -0
  219. package/dist/src/util/animation/ValueAnimation.d.ts +10 -0
  220. package/dist/src/util/animation/animate.d.ts +37 -0
  221. package/dist/src/util/animation/easing.d.ts +130 -0
  222. package/dist/src/util/animation/index.d.ts +3 -0
  223. package/dist/src/util/animation/types.d.ts +87 -0
  224. package/dist/src/util/applyMixins.d.ts +8 -0
  225. package/dist/src/util/dom_event.d.ts +5 -0
  226. package/dist/src/util/dom_misc.d.ts +12 -0
  227. package/dist/src/util/dom_request.d.ts +14 -0
  228. package/dist/src/util/dom_style.d.ts +7 -0
  229. package/dist/src/util/index.d.ts +36 -0
  230. package/dist/src/util/internals/cleanupSvgAttribute.d.ts +2 -0
  231. package/dist/src/util/internals/cleanupSvgAttribute.test.d.ts +2 -0
  232. package/dist/src/util/internals/cloneDeep.d.ts +2 -0
  233. package/dist/src/util/internals/cloneDeep.test.d.ts +2 -0
  234. package/dist/src/util/internals/getRandomInt.d.ts +8 -0
  235. package/dist/src/util/internals/getRandomInt.test.d.ts +2 -0
  236. package/dist/src/util/internals/ifNaN.d.ts +8 -0
  237. package/dist/src/util/internals/index.d.ts +4 -0
  238. package/dist/src/util/internals/removeFromArray.d.ts +9 -0
  239. package/dist/src/util/internals/uid.d.ts +2 -0
  240. package/dist/src/util/lang_string.d.ts +22 -0
  241. package/dist/src/util/misc/boundingBoxFromPoints.d.ts +9 -0
  242. package/dist/src/util/misc/capValue.d.ts +2 -0
  243. package/dist/src/util/misc/cos.d.ts +10 -0
  244. package/dist/src/util/misc/dom.d.ts +28 -0
  245. package/dist/src/util/misc/findScaleTo.d.ts +20 -0
  246. package/dist/src/util/misc/groupSVGElements.d.ts +9 -0
  247. package/dist/src/util/misc/isTransparent.d.ts +11 -0
  248. package/dist/src/util/misc/matrix.d.ts +168 -0
  249. package/dist/src/util/misc/mergeClipPaths.d.ts +23 -0
  250. package/dist/src/util/misc/objectEnlive.d.ts +41 -0
  251. package/dist/src/util/misc/objectTransforms.d.ts +68 -0
  252. package/dist/src/util/misc/pick.d.ts +9 -0
  253. package/dist/src/util/misc/planeChange.d.ts +81 -0
  254. package/dist/src/util/misc/projectStroke/StrokeLineCapProjections.d.ts +52 -0
  255. package/dist/src/util/misc/projectStroke/StrokeLineJoinProjections.d.ts +82 -0
  256. package/dist/src/util/misc/projectStroke/StrokeProjectionsBase.d.ts +26 -0
  257. package/dist/src/util/misc/projectStroke/index.d.ts +12 -0
  258. package/dist/src/util/misc/projectStroke/types.d.ts +23 -0
  259. package/dist/src/util/misc/radiansDegreesConversion.d.ts +14 -0
  260. package/dist/src/util/misc/resolveOrigin.d.ts +9 -0
  261. package/dist/src/util/misc/rotatePoint.d.ts +12 -0
  262. package/dist/src/util/misc/sin.d.ts +10 -0
  263. package/dist/src/util/misc/svgParsing.d.ts +45 -0
  264. package/dist/src/util/misc/textStyles.d.ts +32 -0
  265. package/dist/src/util/misc/toFixed.d.ts +8 -0
  266. package/dist/src/util/misc/vectors.d.ts +58 -0
  267. package/dist/src/util/path/index.d.ts +96 -0
  268. package/dist/src/util/path/regex.d.ts +2 -0
  269. package/dist/src/util/path/typechecks.d.ts +24 -0
  270. package/dist/src/util/path/typedefs.d.ts +220 -0
  271. package/dist/src/util/transform_matrix_removal.d.ts +14 -0
  272. package/dist/src/util/typeAssertions.d.ts +19 -0
  273. package/e2e/site/index.html +25 -0
  274. package/e2e/utils/objects.ts +36 -0
  275. package/fabric.ts +72 -0
  276. package/index.node.ts +43 -0
  277. package/index.ts +1 -0
  278. package/jest.config.js +194 -0
  279. package/lib/aligning_guidelines.js +2 -2
  280. package/package.json +110 -40
  281. package/playwright.config.ts +64 -0
  282. package/publish.js +0 -26
  283. package/rollup.config.mjs +99 -0
  284. package/rollup.test.config.js +24 -0
  285. package/scripts/build.mjs +50 -0
  286. package/scripts/buildLock.mjs +115 -0
  287. package/scripts/buildReporter.mjs +15 -0
  288. package/scripts/buildStats.mjs +139 -0
  289. package/scripts/dirname.mjs +14 -0
  290. package/scripts/git.mjs +36 -0
  291. package/scripts/index.mjs +564 -0
  292. package/scripts/sandbox.mjs +149 -0
  293. package/src/ClassRegistry.ts +56 -0
  294. package/src/Collection.ts +346 -0
  295. package/src/CommonMethods.ts +63 -0
  296. package/src/EventTypeDefs.ts +298 -0
  297. package/src/Intersection.ts +302 -0
  298. package/src/Observable.ts +181 -0
  299. package/src/Pattern/Pattern.ts +207 -0
  300. package/src/Pattern/index.ts +2 -0
  301. package/src/Pattern/types.ts +17 -0
  302. package/src/Point.ts +388 -0
  303. package/src/Shadow.ts +214 -0
  304. package/src/brushes/{base_brush.class.js → BaseBrush.ts} +63 -42
  305. package/src/brushes/CircleBrush.test.ts +11 -0
  306. package/src/brushes/CircleBrush.ts +140 -0
  307. package/src/brushes/PatternBrush.ts +70 -0
  308. package/src/brushes/PencilBrush.ts +300 -0
  309. package/src/brushes/SprayBrush.ts +214 -0
  310. package/src/brushes/typedefs.ts +18 -0
  311. package/src/cache.ts +90 -0
  312. package/src/canvas/Canvas.ts +1598 -0
  313. package/src/canvas/DOMManagers/CanvasDOMManager.ts +124 -0
  314. package/src/canvas/DOMManagers/StaticCanvasDOMManager.ts +80 -0
  315. package/src/canvas/DOMManagers/util.spec.ts +26 -0
  316. package/src/canvas/DOMManagers/util.ts +98 -0
  317. package/src/canvas/SelectableCanvas.ts +1506 -0
  318. package/src/canvas/StaticCanvas.ts +1634 -0
  319. package/src/canvas/TextEditingManager.ts +70 -0
  320. package/src/canvas/canvas_gestures.mixin.ts +207 -0
  321. package/src/color/Color.ts +320 -0
  322. package/src/color/color_map.ts +154 -0
  323. package/src/color/constants.ts +107 -0
  324. package/src/color/typedefs.ts +18 -0
  325. package/src/color/util.ts +93 -0
  326. package/src/config.ts +159 -0
  327. package/src/constants.ts +29 -0
  328. package/src/controls/Control.ts +385 -0
  329. package/src/controls/changeWidth.ts +53 -0
  330. package/src/controls/commonControls.ts +105 -0
  331. package/src/controls/controlRendering.ts +138 -0
  332. package/src/controls/drag.ts +32 -0
  333. package/src/controls/fireEvent.ts +18 -0
  334. package/src/controls/index.ts +22 -0
  335. package/src/controls/polyControl.ts +135 -0
  336. package/src/controls/rotate.ts +87 -0
  337. package/src/controls/scale.ts +277 -0
  338. package/src/controls/scaleSkew.ts +92 -0
  339. package/src/controls/skew.ts +243 -0
  340. package/src/controls/util.ts +155 -0
  341. package/src/controls/wrapWithFireEvent.ts +25 -0
  342. package/src/controls/wrapWithFixedAnchor.ts +20 -0
  343. package/src/env/browser.ts +32 -0
  344. package/src/env/index.ts +38 -0
  345. package/src/env/node.ts +58 -0
  346. package/src/env/types.ts +15 -0
  347. package/src/filters/{base_filter.class.js → BaseFilter.ts} +203 -151
  348. package/src/filters/BlendColor.ts +219 -0
  349. package/src/filters/BlendImage.ts +230 -0
  350. package/src/filters/Blur.ts +181 -0
  351. package/src/filters/Boilerplate.ts +94 -0
  352. package/src/filters/Brightness.ts +85 -0
  353. package/src/filters/Canvas2dFilterBackend.ts +65 -0
  354. package/src/filters/ColorMatrix.ts +147 -0
  355. package/src/filters/ColorMatrixFilters.ts +79 -0
  356. package/src/filters/Composed.ts +78 -0
  357. package/src/filters/Contrast.ts +84 -0
  358. package/src/filters/Convolute.ts +186 -0
  359. package/src/filters/FilterBackend.ts +38 -0
  360. package/src/filters/GLProbes/GLProbe.ts +7 -0
  361. package/src/filters/GLProbes/NodeGLProbe.ts +15 -0
  362. package/src/filters/GLProbes/WebGLProbe.ts +47 -0
  363. package/src/filters/Gamma.ts +112 -0
  364. package/src/filters/Grayscale.ts +104 -0
  365. package/src/filters/HueRotation.ts +64 -0
  366. package/src/filters/Invert.ts +101 -0
  367. package/src/filters/Noise.ts +96 -0
  368. package/src/filters/Pixelate.ts +98 -0
  369. package/src/filters/RemoveColor.ts +137 -0
  370. package/src/filters/Resize.ts +540 -0
  371. package/src/filters/Saturation.ts +89 -0
  372. package/src/filters/Vibrance.ts +90 -0
  373. package/src/filters/WebGLFilterBackend.ts +456 -0
  374. package/src/filters/filters.ts +28 -0
  375. package/src/filters/index.ts +12 -0
  376. package/src/filters/shaders/baseFilter.ts +17 -0
  377. package/src/filters/shaders/blendColor.ts +33 -0
  378. package/src/filters/shaders/blendImage.ts +32 -0
  379. package/src/filters/shaders/blur.ts +24 -0
  380. package/src/filters/shaders/brightness.ts +11 -0
  381. package/src/filters/shaders/colorMatrix.ts +12 -0
  382. package/src/filters/shaders/constrast.ts +11 -0
  383. package/src/filters/shaders/convolute.ts +154 -0
  384. package/src/filters/shaders/gamma.ts +15 -0
  385. package/src/filters/shaders/grayscale.ts +36 -0
  386. package/src/filters/shaders/invert.ts +19 -0
  387. package/src/filters/shaders/noise.ts +16 -0
  388. package/src/filters/shaders/pixelate.ts +19 -0
  389. package/src/filters/shaders/removeColor.ts +13 -0
  390. package/src/filters/shaders/saturation.ts +15 -0
  391. package/src/filters/shaders/vibrance.ts +16 -0
  392. package/src/filters/typedefs.ts +59 -0
  393. package/src/filters/utils.ts +7 -0
  394. package/src/gradient/Gradient.ts +409 -0
  395. package/src/gradient/constants.ts +12 -0
  396. package/src/gradient/index.ts +2 -0
  397. package/src/gradient/parser/index.ts +3 -0
  398. package/src/gradient/parser/misc.ts +13 -0
  399. package/src/gradient/parser/parseColorStops.ts +56 -0
  400. package/src/gradient/parser/parseCoords.ts +73 -0
  401. package/src/gradient/typedefs.ts +104 -0
  402. package/src/mixins/{eraser_brush.mixin.js → eraser_brush.mixin.ts} +350 -239
  403. package/src/parkinglot/canvas_animation.mixin.ts +121 -0
  404. package/src/parkinglot/straighten.ts +58 -0
  405. package/src/parser/applyViewboxTransform.ts +158 -0
  406. package/src/parser/attributes.ts +25 -0
  407. package/src/parser/constants.ts +116 -0
  408. package/src/parser/doesSomeParentMatch.ts +18 -0
  409. package/src/parser/elementById.ts +21 -0
  410. package/src/parser/elementMatchesRule.ts +16 -0
  411. package/src/parser/elements_parser.ts +158 -0
  412. package/src/parser/getCSSRules.ts +61 -0
  413. package/src/parser/getGlobalStylesForElement.ts +19 -0
  414. package/src/parser/getGradientDefs.ts +31 -0
  415. package/src/parser/getMultipleNodes.ts +15 -0
  416. package/src/parser/getSvgRegex.ts +3 -0
  417. package/src/parser/hasAncestorWithNodeName.ts +14 -0
  418. package/src/parser/index.ts +8 -0
  419. package/src/parser/loadSVGFromString.ts +29 -0
  420. package/src/parser/loadSVGFromURL.ts +47 -0
  421. package/src/parser/normalizeAttr.ts +10 -0
  422. package/src/parser/normalizeValue.ts +64 -0
  423. package/src/parser/parseAttributes.ts +90 -0
  424. package/src/parser/parseFontDeclaration.ts +44 -0
  425. package/src/parser/parsePointsAttribute.ts +34 -0
  426. package/src/parser/parseSVGDocument.ts +118 -0
  427. package/src/parser/parseStyleAttribute.ts +27 -0
  428. package/src/parser/parseStyleObject.ts +15 -0
  429. package/src/parser/parseStyleString.ts +16 -0
  430. package/src/parser/parseTransformAttribute.ts +94 -0
  431. package/src/parser/parseUseDirectives.ts +78 -0
  432. package/src/parser/percent.ts +27 -0
  433. package/src/parser/recursivelyParseGradientsXlink.ts +42 -0
  434. package/src/parser/selectorMatches.ts +25 -0
  435. package/src/parser/setStrokeFillOpacity.ts +40 -0
  436. package/src/parser/typedefs.ts +13 -0
  437. package/src/shapes/ActiveSelection.ts +192 -0
  438. package/src/shapes/Circle.ts +236 -0
  439. package/src/shapes/Ellipse.ts +177 -0
  440. package/src/shapes/Group.ts +1103 -0
  441. package/src/shapes/IText/DraggableTextDelegate.ts +385 -0
  442. package/src/shapes/IText/IText.ts +696 -0
  443. package/src/shapes/IText/ITextBehavior.ts +1073 -0
  444. package/src/shapes/IText/ITextClickBehavior.ts +292 -0
  445. package/src/shapes/IText/ITextKeyBehavior.ts +675 -0
  446. package/src/shapes/IText/constants.ts +53 -0
  447. package/src/shapes/Image.ts +848 -0
  448. package/src/shapes/Line.ts +285 -0
  449. package/src/shapes/Object/AnimatableObject.ts +103 -0
  450. package/src/shapes/Object/FabricObject.ts +29 -0
  451. package/src/shapes/Object/FabricObjectSVGExportMixin.ts +278 -0
  452. package/src/shapes/Object/InteractiveObject.ts +669 -0
  453. package/src/shapes/Object/Object.ts +1589 -0
  454. package/src/shapes/Object/ObjectGeometry.ts +814 -0
  455. package/src/shapes/Object/ObjectOrigin.ts +277 -0
  456. package/src/shapes/Object/StackedObject.ts +206 -0
  457. package/src/shapes/Object/defaultValues.ts +110 -0
  458. package/src/shapes/Object/types/BaseProps.ts +96 -0
  459. package/src/shapes/Object/types/BorderProps.ts +40 -0
  460. package/src/shapes/Object/types/ControlProps.ts +69 -0
  461. package/src/shapes/Object/types/FabricObjectProps.ts +111 -0
  462. package/src/shapes/Object/types/FillStrokeProps.ts +90 -0
  463. package/src/shapes/Object/types/LockInteractionProps.ts +57 -0
  464. package/src/shapes/Object/types/ObjectProps.ts +49 -0
  465. package/src/shapes/Object/types/SerializedObjectProps.ts +73 -0
  466. package/src/shapes/Object/types/index.ts +8 -0
  467. package/src/shapes/Path.ts +434 -0
  468. package/src/shapes/Polygon.ts +22 -0
  469. package/src/shapes/Polyline.ts +364 -0
  470. package/src/shapes/Rect.ts +230 -0
  471. package/src/shapes/Text/StyledText.ts +323 -0
  472. package/src/shapes/Text/Text.ts +1891 -0
  473. package/src/shapes/Text/TextSVGExportMixin.ts +289 -0
  474. package/src/shapes/Text/constants.ts +111 -0
  475. package/src/shapes/Textbox.ts +526 -0
  476. package/src/shapes/Triangle.ts +62 -0
  477. package/src/typedefs.ts +121 -0
  478. package/src/util/animation/AnimationBase.ts +166 -0
  479. package/src/util/animation/AnimationFrameProvider.ts +9 -0
  480. package/src/util/animation/AnimationRegistry.ts +58 -0
  481. package/src/util/animation/ArrayAnimation.ts +27 -0
  482. package/src/util/animation/ColorAnimation.ts +74 -0
  483. package/src/util/animation/ValueAnimation.ts +29 -0
  484. package/src/util/animation/animate.ts +74 -0
  485. package/src/util/animation/easing.ts +327 -0
  486. package/src/util/animation/index.ts +2 -0
  487. package/src/util/animation/types.ts +136 -0
  488. package/src/util/applyMixins.ts +22 -0
  489. package/src/util/dom_event.ts +28 -0
  490. package/src/util/dom_misc.ts +44 -0
  491. package/src/util/dom_request.ts +64 -0
  492. package/src/util/dom_style.ts +20 -0
  493. package/src/util/index.ts +106 -0
  494. package/src/util/internals/cleanupSvgAttribute.test.ts +16 -0
  495. package/src/util/internals/cleanupSvgAttribute.ts +8 -0
  496. package/src/util/internals/cloneDeep.test.ts +16 -0
  497. package/src/util/internals/cloneDeep.ts +2 -0
  498. package/src/util/internals/getRandomInt.test.ts +33 -0
  499. package/src/util/internals/getRandomInt.ts +8 -0
  500. package/src/util/internals/ifNaN.ts +9 -0
  501. package/src/util/internals/index.ts +3 -0
  502. package/src/util/internals/removeFromArray.ts +14 -0
  503. package/src/util/internals/uid.ts +3 -0
  504. package/src/util/lang_string.ts +79 -0
  505. package/src/util/misc/boundingBoxFromPoints.ts +38 -0
  506. package/src/util/misc/capValue.ts +2 -0
  507. package/src/util/misc/cos.ts +24 -0
  508. package/src/util/misc/dom.ts +55 -0
  509. package/src/util/misc/findScaleTo.ts +29 -0
  510. package/src/util/misc/groupSVGElements.ts +15 -0
  511. package/src/util/misc/isTransparent.ts +28 -0
  512. package/src/util/misc/matrix.ts +313 -0
  513. package/src/util/misc/mergeClipPaths.ts +40 -0
  514. package/src/util/misc/objectEnlive.ts +174 -0
  515. package/src/util/misc/objectTransforms.ts +130 -0
  516. package/src/util/misc/pick.ts +29 -0
  517. package/src/util/misc/planeChange.ts +127 -0
  518. package/src/util/misc/projectStroke/StrokeLineCapProjections.ts +113 -0
  519. package/src/util/misc/projectStroke/StrokeLineJoinProjections.ts +227 -0
  520. package/src/util/misc/projectStroke/StrokeProjectionsBase.ts +76 -0
  521. package/src/util/misc/projectStroke/index.ts +55 -0
  522. package/src/util/misc/projectStroke/types.ts +24 -0
  523. package/src/util/misc/radiansDegreesConversion.ts +18 -0
  524. package/src/util/misc/resolveOrigin.ts +22 -0
  525. package/src/util/misc/rotatePoint.ts +15 -0
  526. package/src/util/misc/sin.ts +26 -0
  527. package/src/util/misc/svgParsing.ts +171 -0
  528. package/src/util/misc/textStyles.ts +132 -0
  529. package/src/util/misc/toFixed.ts +8 -0
  530. package/src/util/misc/vectors.ts +83 -0
  531. package/src/util/path/index.ts +1039 -0
  532. package/src/util/path/regex.ts +39 -0
  533. package/src/util/path/typechecks.ts +145 -0
  534. package/src/util/path/typedefs.ts +305 -0
  535. package/src/util/transform_matrix_removal.ts +61 -0
  536. package/src/util/typeAssertions.ts +78 -0
  537. package/tsconfig.json +106 -0
  538. package/HEADER.js +0 -203
  539. package/build.js +0 -287
  540. package/dist/fabric.js +0 -31187
  541. package/dist/fabric.min.js +0 -1
  542. package/old-travis-reference.yml +0 -97
  543. package/src/brushes/circle_brush.class.js +0 -144
  544. package/src/brushes/pattern_brush.class.js +0 -61
  545. package/src/brushes/pencil_brush.class.js +0 -310
  546. package/src/brushes/spray_brush.class.js +0 -219
  547. package/src/canvas.class.js +0 -1312
  548. package/src/color.class.js +0 -636
  549. package/src/control.class.js +0 -339
  550. package/src/controls.actions.js +0 -740
  551. package/src/controls.render.js +0 -99
  552. package/src/elements_parser.js +0 -152
  553. package/src/filters/2d_backend.class.js +0 -65
  554. package/src/filters/blendcolor_filter.class.js +0 -251
  555. package/src/filters/blendimage_filter.class.js +0 -247
  556. package/src/filters/blur_filter.class.js +0 -217
  557. package/src/filters/brightness_filter.class.js +0 -113
  558. package/src/filters/colormatrix_filter.class.js +0 -159
  559. package/src/filters/composed_filter.class.js +0 -72
  560. package/src/filters/contrast_filter.class.js +0 -113
  561. package/src/filters/convolute_filter.class.js +0 -352
  562. package/src/filters/filter_boilerplate.js +0 -111
  563. package/src/filters/filter_generator.js +0 -85
  564. package/src/filters/gamma_filter.class.js +0 -136
  565. package/src/filters/grayscale_filter.class.js +0 -154
  566. package/src/filters/hue_rotation.class.js +0 -107
  567. package/src/filters/invert_filter.class.js +0 -111
  568. package/src/filters/noise_filter.class.js +0 -134
  569. package/src/filters/pixelate_filter.class.js +0 -137
  570. package/src/filters/removecolor_filter.class.js +0 -173
  571. package/src/filters/resize_filter.class.js +0 -490
  572. package/src/filters/saturate_filter.class.js +0 -119
  573. package/src/filters/vibrance_filter.class.js +0 -122
  574. package/src/filters/webgl_backend.class.js +0 -396
  575. package/src/globalFabric.js +0 -4
  576. package/src/gradient.class.js +0 -490
  577. package/src/intersection.class.js +0 -172
  578. package/src/log.js +0 -11
  579. package/src/mixins/animation.mixin.js +0 -231
  580. package/src/mixins/canvas_dataurl_exporter.mixin.js +0 -97
  581. package/src/mixins/canvas_events.mixin.js +0 -974
  582. package/src/mixins/canvas_gestures.mixin.js +0 -149
  583. package/src/mixins/canvas_grouping.mixin.js +0 -177
  584. package/src/mixins/canvas_serialization.mixin.js +0 -228
  585. package/src/mixins/collection.mixin.js +0 -170
  586. package/src/mixins/default_controls.js +0 -114
  587. package/src/mixins/itext.svg_export.js +0 -241
  588. package/src/mixins/itext_behavior.mixin.js +0 -940
  589. package/src/mixins/itext_click_behavior.mixin.js +0 -278
  590. package/src/mixins/itext_key_behavior.mixin.js +0 -694
  591. package/src/mixins/object.svg_export.js +0 -258
  592. package/src/mixins/object_geometry.mixin.js +0 -683
  593. package/src/mixins/object_interactivity.mixin.js +0 -314
  594. package/src/mixins/object_origin.mixin.js +0 -255
  595. package/src/mixins/object_stacking.mixin.js +0 -80
  596. package/src/mixins/object_straightening.mixin.js +0 -80
  597. package/src/mixins/observable.mixin.js +0 -141
  598. package/src/mixins/shared_methods.mixin.js +0 -94
  599. package/src/mixins/stateful.mixin.js +0 -107
  600. package/src/mixins/text_style.mixin.js +0 -324
  601. package/src/parser.js +0 -1090
  602. package/src/pattern.class.js +0 -189
  603. package/src/point.class.js +0 -337
  604. package/src/shadow.class.js +0 -195
  605. package/src/shapes/active_selection.class.js +0 -155
  606. package/src/shapes/circle.class.js +0 -210
  607. package/src/shapes/ellipse.class.js +0 -181
  608. package/src/shapes/group.class.js +0 -593
  609. package/src/shapes/image.class.js +0 -764
  610. package/src/shapes/itext.class.js +0 -526
  611. package/src/shapes/line.class.js +0 -324
  612. package/src/shapes/object.class.js +0 -2008
  613. package/src/shapes/path.class.js +0 -384
  614. package/src/shapes/polygon.class.js +0 -81
  615. package/src/shapes/polyline.class.js +0 -268
  616. package/src/shapes/rect.class.js +0 -187
  617. package/src/shapes/text.class.js +0 -1696
  618. package/src/shapes/textbox.class.js +0 -461
  619. package/src/shapes/triangle.class.js +0 -93
  620. package/src/static_canvas.class.js +0 -1881
  621. package/src/util/anim_ease.js +0 -398
  622. package/src/util/animate.js +0 -254
  623. package/src/util/animate_color.js +0 -74
  624. package/src/util/dom_event.js +0 -50
  625. package/src/util/dom_misc.js +0 -300
  626. package/src/util/dom_request.js +0 -54
  627. package/src/util/dom_style.js +0 -70
  628. package/src/util/lang_array.js +0 -94
  629. package/src/util/lang_class.js +0 -115
  630. package/src/util/lang_object.js +0 -75
  631. package/src/util/lang_string.js +0 -110
  632. package/src/util/misc.js +0 -1330
  633. package/src/util/named_accessors.mixin.js +0 -428
  634. package/src/util/path.js +0 -829
@@ -0,0 +1,1103 @@
1
+ // @ts-nocheck
2
+ import type { CollectionEvents, ObjectEvents } from '../EventTypeDefs';
3
+ import { createCollectionMixin } from '../Collection';
4
+ import { resolveOrigin } from '../util/misc/resolveOrigin';
5
+ import { Point } from '../Point';
6
+ import { cos } from '../util/misc/cos';
7
+ import type { TClassProperties, TSVGReviver } from '../typedefs';
8
+ import { makeBoundingBoxFromPoints } from '../util/misc/boundingBoxFromPoints';
9
+ import {
10
+ invertTransform,
11
+ multiplyTransformMatrices,
12
+ transformPoint,
13
+ } from '../util/misc/matrix';
14
+ import {
15
+ enlivenObjectEnlivables,
16
+ enlivenObjects,
17
+ } from '../util/misc/objectEnlive';
18
+ import { applyTransformToObject } from '../util/misc/objectTransforms';
19
+ import { degreesToRadians } from '../util/misc/radiansDegreesConversion';
20
+ import { sin } from '../util/misc/sin';
21
+ import { FabricObject } from './Object/FabricObject';
22
+ import { Rect } from './Rect';
23
+ import { classRegistry } from '../ClassRegistry';
24
+ import type {
25
+ FabricObjectProps,
26
+ SerializedObjectProps,
27
+ TProps,
28
+ } from './Object/types';
29
+ import { CENTER } from '../constants';
30
+
31
+ export type LayoutContextType =
32
+ | 'initialization'
33
+ | 'object_modified'
34
+ | 'added'
35
+ | 'removed'
36
+ | 'layout_change'
37
+ | 'imperative';
38
+
39
+ export type LayoutContext = {
40
+ type: LayoutContextType;
41
+ /**
42
+ * array of objects starting from the object that triggered the call to the current one
43
+ */
44
+ path?: Group[];
45
+ [key: string]: any;
46
+ };
47
+
48
+ export type GroupEvents = ObjectEvents &
49
+ CollectionEvents & {
50
+ layout: {
51
+ context: LayoutContext;
52
+ result: LayoutResult;
53
+ diff: Point;
54
+ };
55
+ };
56
+
57
+ export type LayoutStrategy =
58
+ | 'fit-content'
59
+ | 'fit-content-lazy'
60
+ | 'fixed'
61
+ | 'clip-path';
62
+
63
+ /**
64
+ * positioning and layout data **relative** to instance's parent
65
+ */
66
+ export type LayoutResult = {
67
+ /**
68
+ * new centerX as measured by the containing plane (same as `left` with `originX` set to `center`)
69
+ */
70
+ centerX: number;
71
+ /**
72
+ * new centerY as measured by the containing plane (same as `top` with `originY` set to `center`)
73
+ */
74
+ centerY: number;
75
+ /**
76
+ * correctionX to translate objects by, measured as `centerX`
77
+ */
78
+ correctionX?: number;
79
+ /**
80
+ * correctionY to translate objects by, measured as `centerY`
81
+ */
82
+ correctionY?: number;
83
+ width: number;
84
+ height: number;
85
+ };
86
+
87
+ export interface GroupOwnProps {
88
+ layout: LayoutStrategy;
89
+ subTargetCheck: boolean;
90
+ interactive: boolean;
91
+ }
92
+
93
+ export interface SerializedGroupProps
94
+ extends SerializedObjectProps,
95
+ GroupOwnProps {
96
+ objects: SerializedObjectProps[];
97
+ }
98
+
99
+ export interface GroupProps extends FabricObjectProps, GroupOwnProps {}
100
+
101
+ export const groupDefaultValues = {
102
+ layout: 'fit-content',
103
+ strokeWidth: 0,
104
+ subTargetCheck: false,
105
+ interactive: false,
106
+ };
107
+
108
+ /**
109
+ * @fires object:added
110
+ * @fires object:removed
111
+ * @fires layout once layout completes
112
+ */
113
+ export class Group extends createCollectionMixin(
114
+ FabricObject<GroupProps, SerializedGroupProps, GroupEvents>
115
+ ) {
116
+ /**
117
+ * Specifies the **layout strategy** for instance
118
+ * Used by `getLayoutStrategyResult` to calculate layout
119
+ * `fit-content`, `fit-content-lazy`, `fixed`, `clip-path` are supported out of the box
120
+ * @default
121
+ */
122
+ declare layout: LayoutStrategy;
123
+
124
+ /**
125
+ * Used to optimize performance
126
+ * set to `false` if you don't need contained objects to be targets of events
127
+ * @default
128
+ * @type boolean
129
+ */
130
+ declare subTargetCheck: boolean;
131
+
132
+ /**
133
+ * Used to allow targeting of object inside groups.
134
+ * set to true if you want to select an object inside a group.\
135
+ * **REQUIRES** `subTargetCheck` set to true
136
+ * @default
137
+ * @type boolean
138
+ */
139
+ declare interactive: boolean;
140
+
141
+ /**
142
+ * Used internally to optimize performance
143
+ * Once an object is selected, instance is rendered without the selected object.
144
+ * This way instance is cached only once for the entire interaction with the selected object.
145
+ * @private
146
+ */
147
+ protected _activeObjects: FabricObject[] = [];
148
+
149
+ static stateProperties: string[] = [
150
+ ...FabricObject.stateProperties,
151
+ 'layout',
152
+ ];
153
+
154
+ static type = 'Group';
155
+
156
+ static ownDefaults: Record<string, any> = groupDefaultValues;
157
+ private __objectSelectionTracker: (ev: ObjectEvents['selected']) => void;
158
+ private __objectSelectionDisposer: (ev: ObjectEvents['deselected']) => void;
159
+ private _firstLayoutDone = false;
160
+
161
+ static getDefaults(): Record<string, any> {
162
+ return {
163
+ ...super.getDefaults(),
164
+ ...Group.ownDefaults,
165
+ };
166
+ }
167
+
168
+ /**
169
+ * Constructor
170
+ *
171
+ * @param {FabricObject[]} [objects] instance objects
172
+ * @param {Object} [options] Options object
173
+ * @param {boolean} [objectsRelativeToGroup] true if objects exist in group coordinate plane
174
+ */
175
+ constructor(
176
+ objects: FabricObject[] = [],
177
+ options: Partial<GroupProps> = {},
178
+ objectsRelativeToGroup?: boolean
179
+ ) {
180
+ super();
181
+ this._objects = objects;
182
+ this.__objectMonitor = this.__objectMonitor.bind(this);
183
+ this.__objectSelectionTracker = this.__objectSelectionMonitor.bind(
184
+ this,
185
+ true
186
+ );
187
+ this.__objectSelectionDisposer = this.__objectSelectionMonitor.bind(
188
+ this,
189
+ false
190
+ );
191
+ // setting angle, skewX, skewY must occur after initial layout
192
+ this.set({ ...options, angle: 0, skewX: 0, skewY: 0 });
193
+ this.forEachObject((object) => {
194
+ this.enterGroup(object, false);
195
+ });
196
+ this._applyLayoutStrategy({
197
+ type: 'initialization',
198
+ options,
199
+ objectsRelativeToGroup,
200
+ });
201
+ }
202
+
203
+ /**
204
+ * Checks if object can enter group and logs relevant warnings
205
+ * @private
206
+ * @param {FabricObject} object
207
+ * @returns
208
+ */
209
+ canEnterGroup(object: FabricObject) {
210
+ if (object === this || this.isDescendantOf(object)) {
211
+ // prevent circular object tree
212
+ /* _DEV_MODE_START_ */
213
+ console.error(
214
+ 'fabric.Group: circular object trees are not supported, this call has no effect'
215
+ );
216
+ /* _DEV_MODE_END_ */
217
+ return false;
218
+ } else if (this._objects.indexOf(object) !== -1) {
219
+ // is already in the objects array
220
+ /* _DEV_MODE_START_ */
221
+ console.error(
222
+ 'fabric.Group: duplicate objects are not supported inside group, this call has no effect'
223
+ );
224
+ /* _DEV_MODE_END_ */
225
+ return false;
226
+ }
227
+ return true;
228
+ }
229
+
230
+ /**
231
+ * Override this method to enhance performance (for groups with a lot of objects).
232
+ * If Overriding, be sure not pass illegal objects to group - it will break your app.
233
+ * @private
234
+ */
235
+ protected _filterObjectsBeforeEnteringGroup(objects: FabricObject[]) {
236
+ return objects.filter((object, index, array) => {
237
+ // can enter AND is the first occurrence of the object in the passed args (to prevent adding duplicates)
238
+ return this.canEnterGroup(object) && array.indexOf(object) === index;
239
+ });
240
+ }
241
+
242
+ /**
243
+ * Add objects
244
+ * @param {...FabricObject[]} objects
245
+ */
246
+ add(...objects: FabricObject[]) {
247
+ const allowedObjects = this._filterObjectsBeforeEnteringGroup(objects);
248
+ const size = super.add(...allowedObjects);
249
+ this._onAfterObjectsChange('added', allowedObjects);
250
+ return size;
251
+ }
252
+
253
+ /**
254
+ * Inserts an object into collection at specified index
255
+ * @param {FabricObject[]} objects Object to insert
256
+ * @param {Number} index Index to insert object at
257
+ */
258
+ insertAt(index: number, ...objects: FabricObject[]) {
259
+ const allowedObjects = this._filterObjectsBeforeEnteringGroup(objects);
260
+ const size = super.insertAt(index, ...allowedObjects);
261
+ this._onAfterObjectsChange('added', allowedObjects);
262
+ return size;
263
+ }
264
+
265
+ /**
266
+ * Remove objects
267
+ * @param {...FabricObject[]} objects
268
+ * @returns {FabricObject[]} removed objects
269
+ */
270
+ remove(...objects: FabricObject[]) {
271
+ const removed = super.remove(...objects);
272
+ this._onAfterObjectsChange('removed', removed);
273
+ return removed;
274
+ }
275
+
276
+ _onObjectAdded(object: FabricObject) {
277
+ this.enterGroup(object, true);
278
+ this.fire('object:added', { target: object });
279
+ object.fire('added', { target: this });
280
+ }
281
+
282
+ _onRelativeObjectAdded(object: FabricObject) {
283
+ this.enterGroup(object, false);
284
+ this.fire('object:added', { target: object });
285
+ object.fire('added', { target: this });
286
+ }
287
+
288
+ /**
289
+ * @private
290
+ * @param {FabricObject} object
291
+ * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it
292
+ */
293
+ _onObjectRemoved(object: FabricObject, removeParentTransform?: boolean) {
294
+ this.exitGroup(object, removeParentTransform);
295
+ this.fire('object:removed', { target: object });
296
+ object.fire('removed', { target: this });
297
+ }
298
+
299
+ /**
300
+ * @private
301
+ * @param {'added'|'removed'} type
302
+ * @param {FabricObject[]} targets
303
+ */
304
+ _onAfterObjectsChange(type: 'added' | 'removed', targets: FabricObject[]) {
305
+ this._applyLayoutStrategy({
306
+ type: type,
307
+ targets: targets,
308
+ });
309
+ this._set('dirty', true);
310
+ }
311
+
312
+ _onStackOrderChanged() {
313
+ this._set('dirty', true);
314
+ }
315
+
316
+ /**
317
+ * @private
318
+ * @param {string} key
319
+ * @param {*} value
320
+ */
321
+ _set(key: string, value: any) {
322
+ const prev = this[key];
323
+ super._set(key, value);
324
+ if (key === 'canvas' && prev !== value) {
325
+ this.forEachObject((object) => {
326
+ object._set(key, value);
327
+ });
328
+ }
329
+ if (key === 'layout' && prev !== value) {
330
+ this._applyLayoutStrategy({
331
+ type: 'layout_change',
332
+ layout: value,
333
+ prevLayout: prev,
334
+ });
335
+ }
336
+ if (key === 'interactive') {
337
+ this.forEachObject((object) => this._watchObject(value, object));
338
+ }
339
+ return this;
340
+ }
341
+
342
+ /**
343
+ * @private
344
+ */
345
+ _shouldSetNestedCoords() {
346
+ return this.subTargetCheck;
347
+ }
348
+
349
+ /**
350
+ * Remove all objects
351
+ * @returns {FabricObject[]} removed objects
352
+ */
353
+ removeAll() {
354
+ this._activeObjects = [];
355
+ return this.remove(...this._objects);
356
+ }
357
+
358
+ /**
359
+ * invalidates layout on object modified
360
+ * @private
361
+ */
362
+ __objectMonitor(ev: ObjectEvents['modified']) {
363
+ this._applyLayoutStrategy({ ...ev, type: 'object_modified' });
364
+ this._set('dirty', true);
365
+ }
366
+
367
+ /**
368
+ * keeps track of the selected objects
369
+ * @private
370
+ */
371
+ __objectSelectionMonitor<T extends boolean>(
372
+ selected: T,
373
+ { target: object }: ObjectEvents[T extends true ? 'selected' : 'deselected']
374
+ ) {
375
+ if (selected) {
376
+ this._activeObjects.push(object);
377
+ this._set('dirty', true);
378
+ } else if (this._activeObjects.length > 0) {
379
+ const index = this._activeObjects.indexOf(object);
380
+ if (index > -1) {
381
+ this._activeObjects.splice(index, 1);
382
+ this._set('dirty', true);
383
+ }
384
+ }
385
+ }
386
+
387
+ /**
388
+ * @private
389
+ * @param {boolean} watch
390
+ * @param {FabricObject} object
391
+ */
392
+ _watchObject(watch: boolean, object: FabricObject) {
393
+ const directive = watch ? 'on' : 'off';
394
+ // make sure we listen only once
395
+ watch && this._watchObject(false, object);
396
+ object[directive]('changed', this.__objectMonitor);
397
+ object[directive]('modified', this.__objectMonitor);
398
+ object[directive]('selected', this.__objectSelectionTracker);
399
+ object[directive]('deselected', this.__objectSelectionDisposer);
400
+ }
401
+
402
+ /**
403
+ * @private
404
+ * @param {FabricObject} object
405
+ * @param {boolean} [removeParentTransform] true if object is in canvas coordinate plane
406
+ * @returns {boolean} true if object entered group
407
+ */
408
+ enterGroup(object: FabricObject, removeParentTransform?: boolean) {
409
+ if (object.group) {
410
+ object.group.remove(object);
411
+ }
412
+ this._enterGroup(object, removeParentTransform);
413
+ return true;
414
+ }
415
+
416
+ /**
417
+ * @private
418
+ * @param {FabricObject} object
419
+ * @param {boolean} [removeParentTransform] true if object is in canvas coordinate plane
420
+ */
421
+ _enterGroup(object: FabricObject, removeParentTransform?: boolean) {
422
+ if (removeParentTransform) {
423
+ // can this be converted to utils (sendObjectToPlane)?
424
+ applyTransformToObject(
425
+ object,
426
+ multiplyTransformMatrices(
427
+ invertTransform(this.calcTransformMatrix()),
428
+ object.calcTransformMatrix()
429
+ )
430
+ );
431
+ }
432
+ this._shouldSetNestedCoords() && object.setCoords();
433
+ object._set('group', this);
434
+ object._set('canvas', this.canvas);
435
+ this.interactive && this._watchObject(true, object);
436
+ const activeObject =
437
+ this.canvas &&
438
+ this.canvas.getActiveObject &&
439
+ this.canvas.getActiveObject();
440
+ // if we are adding the activeObject in a group
441
+ if (
442
+ activeObject &&
443
+ (activeObject === object || object.isDescendantOf(activeObject))
444
+ ) {
445
+ this._activeObjects.push(object);
446
+ }
447
+ }
448
+
449
+ /**
450
+ * @private
451
+ * @param {FabricObject} object
452
+ * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it
453
+ */
454
+ exitGroup(object: FabricObject, removeParentTransform?: boolean) {
455
+ this._exitGroup(object, removeParentTransform);
456
+ object._set('canvas', undefined);
457
+ }
458
+
459
+ /**
460
+ * @private
461
+ * @param {FabricObject} object
462
+ * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it
463
+ */
464
+ _exitGroup(object: FabricObject, removeParentTransform?: boolean) {
465
+ object._set('group', undefined);
466
+ if (!removeParentTransform) {
467
+ applyTransformToObject(
468
+ object,
469
+ multiplyTransformMatrices(
470
+ this.calcTransformMatrix(),
471
+ object.calcTransformMatrix()
472
+ )
473
+ );
474
+ object.setCoords();
475
+ }
476
+ this._watchObject(false, object);
477
+ const index =
478
+ this._activeObjects.length > 0 ? this._activeObjects.indexOf(object) : -1;
479
+ if (index > -1) {
480
+ this._activeObjects.splice(index, 1);
481
+ }
482
+ }
483
+
484
+ /**
485
+ * Decide if the object should cache or not. Create its own cache level
486
+ * needsItsOwnCache should be used when the object drawing method requires
487
+ * a cache step. None of the fabric classes requires it.
488
+ * Generally you do not cache objects in groups because the group is already cached.
489
+ * @return {Boolean}
490
+ */
491
+ shouldCache() {
492
+ const ownCache = FabricObject.prototype.shouldCache.call(this);
493
+ if (ownCache) {
494
+ for (let i = 0; i < this._objects.length; i++) {
495
+ if (this._objects[i].willDrawShadow()) {
496
+ this.ownCaching = false;
497
+ return false;
498
+ }
499
+ }
500
+ }
501
+ return ownCache;
502
+ }
503
+
504
+ /**
505
+ * Check if this object or a child object will cast a shadow
506
+ * @return {Boolean}
507
+ */
508
+ willDrawShadow() {
509
+ if (FabricObject.prototype.willDrawShadow.call(this)) {
510
+ return true;
511
+ }
512
+ for (let i = 0; i < this._objects.length; i++) {
513
+ if (this._objects[i].willDrawShadow()) {
514
+ return true;
515
+ }
516
+ }
517
+ return false;
518
+ }
519
+
520
+ /**
521
+ * Check if instance or its group are caching, recursively up
522
+ * @return {Boolean}
523
+ */
524
+ isOnACache(): boolean {
525
+ return this.ownCaching || (!!this.group && this.group.isOnACache());
526
+ }
527
+
528
+ /**
529
+ * Execute the drawing operation for an object on a specified context
530
+ * @param {CanvasRenderingContext2D} ctx Context to render on
531
+ */
532
+ drawObject(ctx: CanvasRenderingContext2D) {
533
+ this._renderBackground(ctx);
534
+ for (let i = 0; i < this._objects.length; i++) {
535
+ // TODO: handle rendering edge case somehow
536
+ if (
537
+ this.canvas?.preserveObjectStacking &&
538
+ this._objects[i].group !== this
539
+ ) {
540
+ ctx.save();
541
+ ctx.transform(...invertTransform(this.calcTransformMatrix()));
542
+ this._objects[i].render(ctx);
543
+ ctx.restore();
544
+ } else if (this._objects[i].group === this) {
545
+ this._objects[i].render(ctx);
546
+ }
547
+ }
548
+ this._drawClipPath(ctx, this.clipPath);
549
+ }
550
+
551
+ /**
552
+ * @override
553
+ * @return {Boolean}
554
+ */
555
+ setCoords() {
556
+ super.setCoords();
557
+ this._shouldSetNestedCoords() &&
558
+ this.forEachObject((object) => object.setCoords());
559
+ }
560
+
561
+ /**
562
+ * Renders instance on a given context
563
+ * @param {CanvasRenderingContext2D} ctx context to render instance on
564
+ */
565
+ render(ctx: CanvasRenderingContext2D) {
566
+ this._transformDone = true;
567
+ super.render(ctx);
568
+ this._transformDone = false;
569
+ }
570
+
571
+ /**
572
+ * @public
573
+ * @param {Partial<LayoutResult> & { layout?: string }} [context] pass values to use for layout calculations
574
+ */
575
+ triggerLayout<T extends this['layout']>(
576
+ context?: Partial<LayoutResult> & { layout?: T }
577
+ ) {
578
+ if (context && context.layout) {
579
+ context.prevLayout = this.layout;
580
+ this.layout = context.layout;
581
+ }
582
+ this._applyLayoutStrategy({ type: 'imperative', context });
583
+ }
584
+
585
+ /**
586
+ * @private
587
+ * @param {FabricObject} object
588
+ * @param {Point} diff
589
+ */
590
+ _adjustObjectPosition(object: FabricObject, diff: Point) {
591
+ object.set({
592
+ left: object.left + diff.x,
593
+ top: object.top + diff.y,
594
+ });
595
+ }
596
+
597
+ /**
598
+ * initial layout logic:
599
+ * calculate bbox of objects (if necessary) and translate it according to options received from the constructor (left, top, width, height)
600
+ * so it is placed in the center of the bbox received from the constructor
601
+ *
602
+ * @private
603
+ * @param {LayoutContext} context
604
+ */
605
+ _applyLayoutStrategy(context: LayoutContext) {
606
+ const isFirstLayout = context.type === 'initialization';
607
+ if (!isFirstLayout && !this._firstLayoutDone) {
608
+ // reject layout requests before initialization layout
609
+ return;
610
+ }
611
+ const options = isFirstLayout && context.options;
612
+ const initialTransform = options && {
613
+ angle: options.angle || 0,
614
+ skewX: options.skewX || 0,
615
+ skewY: options.skewY || 0,
616
+ };
617
+ const center = this.getRelativeCenterPoint();
618
+ let result = this.getLayoutStrategyResult(
619
+ this.layout,
620
+ [...this._objects],
621
+ context
622
+ );
623
+ let diff: Point;
624
+ if (result) {
625
+ // handle positioning
626
+ const newCenter = new Point(result.centerX, result.centerY);
627
+ const vector = center
628
+ .subtract(newCenter)
629
+ .add(new Point(result.correctionX || 0, result.correctionY || 0));
630
+ diff = vector.transform(invertTransform(this.calcOwnMatrix()), true);
631
+ // set dimensions
632
+ this.set({ width: result.width, height: result.height });
633
+ // adjust objects to account for new center
634
+ !context.objectsRelativeToGroup &&
635
+ this.forEachObject((object) => {
636
+ object.group === this && this._adjustObjectPosition(object, diff);
637
+ });
638
+ // clip path as well
639
+ !isFirstLayout &&
640
+ this.layout !== 'clip-path' &&
641
+ this.clipPath &&
642
+ !this.clipPath.absolutePositioned &&
643
+ this._adjustObjectPosition(this.clipPath, diff);
644
+ if (!newCenter.eq(center) || initialTransform) {
645
+ // set position
646
+ this.setPositionByOrigin(newCenter, CENTER, CENTER);
647
+ initialTransform && this.set(initialTransform);
648
+ this.setCoords();
649
+ }
650
+ } else if (isFirstLayout) {
651
+ // fill `result` with initial values for the layout hook
652
+ result = {
653
+ centerX: center.x,
654
+ centerY: center.y,
655
+ width: this.width,
656
+ height: this.height,
657
+ };
658
+ initialTransform && this.set(initialTransform);
659
+ diff = new Point();
660
+ } else {
661
+ // no `result` so we return
662
+ return;
663
+ }
664
+ // flag for next layouts
665
+ this._firstLayoutDone = true;
666
+ // fire layout hook and event (event will fire only for layouts after initialization layout)
667
+ this.onLayout(context, result);
668
+ this.fire('layout', {
669
+ context,
670
+ result,
671
+ diff,
672
+ });
673
+ // recursive up
674
+ if (this.group && this.group._applyLayoutStrategy) {
675
+ // append the path recursion to context
676
+ if (!context.path) {
677
+ context.path = [];
678
+ }
679
+ context.path.push(this);
680
+ // all parents should invalidate their layout
681
+ this.group._applyLayoutStrategy(context);
682
+ }
683
+ }
684
+
685
+ /**
686
+ * Override this method to customize layout.
687
+ * If you need to run logic once layout completes use `onLayout`
688
+ * @public
689
+ * @param {string} layoutDirective
690
+ * @param {FabricObject[]} objects
691
+ * @param {LayoutContext} context
692
+ * @returns {LayoutResult | undefined}
693
+ */
694
+ getLayoutStrategyResult<T extends this['layout']>(
695
+ layoutDirective: T,
696
+ objects: FabricObject[],
697
+ context: LayoutContext
698
+ ) {
699
+ if (
700
+ layoutDirective === 'fit-content-lazy' &&
701
+ context.type === 'added' &&
702
+ objects.length > context.targets.length
703
+ ) {
704
+ // calculate added objects' bbox with existing bbox
705
+ const addedObjects = context.targets.concat(this);
706
+ return this.prepareBoundingBox(layoutDirective, addedObjects, context);
707
+ } else if (
708
+ layoutDirective === 'fit-content' ||
709
+ layoutDirective === 'fit-content-lazy' ||
710
+ (layoutDirective === 'fixed' &&
711
+ (context.type === 'initialization' || context.type === 'imperative'))
712
+ ) {
713
+ return this.prepareBoundingBox(layoutDirective, objects, context);
714
+ } else if (layoutDirective === 'clip-path' && this.clipPath) {
715
+ const clipPath = this.clipPath;
716
+ const clipPathSizeAfter = clipPath._getTransformedDimensions();
717
+ if (
718
+ clipPath.absolutePositioned &&
719
+ (context.type === 'initialization' || context.type === 'layout_change')
720
+ ) {
721
+ // we want the center point to exist in group's containing plane
722
+ let clipPathCenter = clipPath.getCenterPoint();
723
+ if (this.group) {
724
+ // send point from canvas plane to group's containing plane
725
+ const inv = invertTransform(this.group.calcTransformMatrix());
726
+ clipPathCenter = transformPoint(clipPathCenter, inv);
727
+ }
728
+ return {
729
+ centerX: clipPathCenter.x,
730
+ centerY: clipPathCenter.y,
731
+ width: clipPathSizeAfter.x,
732
+ height: clipPathSizeAfter.y,
733
+ };
734
+ } else if (!clipPath.absolutePositioned) {
735
+ let center;
736
+ const clipPathRelativeCenter = clipPath.getRelativeCenterPoint(),
737
+ // we want the center point to exist in group's containing plane, so we send it upwards
738
+ clipPathCenter = transformPoint(
739
+ clipPathRelativeCenter,
740
+ this.calcOwnMatrix(),
741
+ true
742
+ );
743
+ if (
744
+ context.type === 'initialization' ||
745
+ context.type === 'layout_change'
746
+ ) {
747
+ const bbox =
748
+ this.prepareBoundingBox(layoutDirective, objects, context) || {};
749
+ center = new Point(bbox.centerX || 0, bbox.centerY || 0);
750
+ return {
751
+ centerX: center.x + clipPathCenter.x,
752
+ centerY: center.y + clipPathCenter.y,
753
+ correctionX: bbox.correctionX - clipPathCenter.x,
754
+ correctionY: bbox.correctionY - clipPathCenter.y,
755
+ width: clipPath.width,
756
+ height: clipPath.height,
757
+ };
758
+ } else {
759
+ center = this.getRelativeCenterPoint();
760
+ return {
761
+ centerX: center.x + clipPathCenter.x,
762
+ centerY: center.y + clipPathCenter.y,
763
+ width: clipPathSizeAfter.x,
764
+ height: clipPathSizeAfter.y,
765
+ };
766
+ }
767
+ }
768
+ }
769
+ }
770
+
771
+ /**
772
+ * Override this method to customize layout.
773
+ * A wrapper around {@link Group#getObjectsBoundingBox}
774
+ * @public
775
+ * @param {string} layoutDirective
776
+ * @param {FabricObject[]} objects
777
+ * @param {LayoutContext} context
778
+ * @returns {LayoutResult | undefined}
779
+ */
780
+ prepareBoundingBox<T extends this['layout']>(
781
+ layoutDirective: T,
782
+ objects: FabricObject[],
783
+ context: LayoutContext
784
+ ) {
785
+ if (context.type === 'initialization') {
786
+ return this.prepareInitialBoundingBox(layoutDirective, objects, context);
787
+ } else if (context.type === 'imperative' && context.context) {
788
+ return {
789
+ ...(this.getObjectsBoundingBox(objects) || {}),
790
+ ...context.context,
791
+ };
792
+ } else {
793
+ return this.getObjectsBoundingBox(objects);
794
+ }
795
+ }
796
+
797
+ /**
798
+ * Calculates center taking into account originX, originY while not being sure that width/height are initialized
799
+ * @public
800
+ * @param {string} layoutDirective
801
+ * @param {FabricObject[]} objects
802
+ * @param {LayoutContext} context
803
+ * @returns {LayoutResult | undefined}
804
+ */
805
+ prepareInitialBoundingBox<T extends this['layout']>(
806
+ layoutDirective: T,
807
+ objects: FabricObject[],
808
+ context: LayoutContext
809
+ ) {
810
+ const options = context.options || {},
811
+ hasX = typeof options.left === 'number',
812
+ hasY = typeof options.top === 'number',
813
+ hasWidth = typeof options.width === 'number',
814
+ hasHeight = typeof options.height === 'number';
815
+
816
+ // performance enhancement
817
+ // skip layout calculation if bbox is defined
818
+ if (
819
+ (hasX &&
820
+ hasY &&
821
+ hasWidth &&
822
+ hasHeight &&
823
+ context.objectsRelativeToGroup) ||
824
+ objects.length === 0
825
+ ) {
826
+ // return nothing to skip layout
827
+ return;
828
+ }
829
+
830
+ const bbox = this.getObjectsBoundingBox(objects) || ({} as LayoutResult);
831
+ const { centerX = 0, centerY = 0, width: w = 0, height: h = 0 } = bbox;
832
+ const width = hasWidth ? this.width : w,
833
+ height = hasHeight ? this.height : h,
834
+ calculatedCenter = new Point(centerX, centerY),
835
+ origin = new Point(
836
+ resolveOrigin(this.originX),
837
+ resolveOrigin(this.originY)
838
+ ),
839
+ size = new Point(width, height),
840
+ strokeWidthVector = this._getTransformedDimensions({
841
+ width: 0,
842
+ height: 0,
843
+ }),
844
+ sizeAfter = this._getTransformedDimensions({
845
+ width: width,
846
+ height: height,
847
+ strokeWidth: 0,
848
+ }),
849
+ bboxSizeAfter = this._getTransformedDimensions({
850
+ width: bbox.width,
851
+ height: bbox.height,
852
+ strokeWidth: 0,
853
+ }),
854
+ rotationCorrection = new Point(0, 0);
855
+
856
+ // calculate center and correction
857
+ const originT = origin.scalarAdd(0.5);
858
+ const originCorrection = sizeAfter.multiply(originT);
859
+ const centerCorrection = new Point(
860
+ hasWidth ? bboxSizeAfter.x / 2 : originCorrection.x,
861
+ hasHeight ? bboxSizeAfter.y / 2 : originCorrection.y
862
+ );
863
+ const center = new Point(
864
+ hasX
865
+ ? this.left - (sizeAfter.x + strokeWidthVector.x) * origin.x
866
+ : calculatedCenter.x - centerCorrection.x,
867
+ hasY
868
+ ? this.top - (sizeAfter.y + strokeWidthVector.y) * origin.y
869
+ : calculatedCenter.y - centerCorrection.y
870
+ );
871
+ const offsetCorrection = new Point(
872
+ hasX
873
+ ? center.x - calculatedCenter.x + bboxSizeAfter.x * (hasWidth ? 0.5 : 0)
874
+ : -(hasWidth
875
+ ? (sizeAfter.x - strokeWidthVector.x) * 0.5
876
+ : sizeAfter.x * originT.x),
877
+ hasY
878
+ ? center.y -
879
+ calculatedCenter.y +
880
+ bboxSizeAfter.y * (hasHeight ? 0.5 : 0)
881
+ : -(hasHeight
882
+ ? (sizeAfter.y - strokeWidthVector.y) * 0.5
883
+ : sizeAfter.y * originT.y)
884
+ ).add(rotationCorrection);
885
+ const correction = new Point(
886
+ hasWidth ? -sizeAfter.x / 2 : 0,
887
+ hasHeight ? -sizeAfter.y / 2 : 0
888
+ ).add(offsetCorrection);
889
+
890
+ return {
891
+ centerX: center.x,
892
+ centerY: center.y,
893
+ correctionX: correction.x,
894
+ correctionY: correction.y,
895
+ width: size.x,
896
+ height: size.y,
897
+ };
898
+ }
899
+
900
+ /**
901
+ * Calculate the bbox of objects relative to instance's containing plane
902
+ * @public
903
+ * @param {FabricObject[]} objects
904
+ * @returns {LayoutResult | null} bounding box
905
+ */
906
+ getObjectsBoundingBox(
907
+ objects: FabricObject[],
908
+ ignoreOffset?: boolean
909
+ ): LayoutResult | null {
910
+ if (objects.length === 0) {
911
+ return null;
912
+ }
913
+ const objectBounds: Point[] = [];
914
+ objects.forEach((object) => {
915
+ const objCenter = object.getRelativeCenterPoint();
916
+ let sizeVector = object._getTransformedDimensions().scalarDivide(2);
917
+ if (object.angle) {
918
+ const rad = degreesToRadians(object.angle),
919
+ sine = Math.abs(sin(rad)),
920
+ cosine = Math.abs(cos(rad)),
921
+ rx = sizeVector.x * cosine + sizeVector.y * sine,
922
+ ry = sizeVector.x * sine + sizeVector.y * cosine;
923
+ sizeVector = new Point(rx, ry);
924
+ }
925
+ objectBounds.push(
926
+ objCenter.subtract(sizeVector),
927
+ objCenter.add(sizeVector)
928
+ );
929
+ });
930
+ const { left, top, width, height } =
931
+ makeBoundingBoxFromPoints(objectBounds);
932
+
933
+ const size = new Point(width, height),
934
+ relativeCenter = (!ignoreOffset ? new Point(left, top) : new Point()).add(
935
+ size.scalarDivide(2)
936
+ ),
937
+ // we send `relativeCenter` up to group's containing plane
938
+ center = relativeCenter.transform(this.calcOwnMatrix());
939
+
940
+ return {
941
+ centerX: center.x,
942
+ centerY: center.y,
943
+ width: size.x,
944
+ height: size.y,
945
+ };
946
+ }
947
+
948
+ /**
949
+ * Hook that is called once layout has completed.
950
+ * Provided for layout customization, override if necessary.
951
+ * Complements `getLayoutStrategyResult`, which is called at the beginning of layout.
952
+ * @public
953
+ * @param {LayoutContext} context layout context
954
+ * @param {LayoutResult} result layout result
955
+ */
956
+ // eslint-disable-next-line @typescript-eslint/no-empty-function, @typescript-eslint/no-unused-vars
957
+ onLayout(context: LayoutContext, result: LayoutResult) {}
958
+
959
+ /**
960
+ *
961
+ * @private
962
+ * @param {'toObject'|'toDatalessObject'} [method]
963
+ * @param {string[]} [propertiesToInclude] Any properties that you might want to additionally include in the output
964
+ * @returns {FabricObject[]} serialized objects
965
+ */
966
+ __serializeObjects(
967
+ method: 'toObject' | 'toDatalessObject',
968
+ propertiesToInclude?: string[]
969
+ ) {
970
+ const _includeDefaultValues = this.includeDefaultValues;
971
+ return this._objects
972
+ .filter(function (obj) {
973
+ return !obj.excludeFromExport;
974
+ })
975
+ .map(function (obj) {
976
+ const originalDefaults = obj.includeDefaultValues;
977
+ obj.includeDefaultValues = _includeDefaultValues;
978
+ const data = obj[method || 'toObject'](propertiesToInclude);
979
+ obj.includeDefaultValues = originalDefaults;
980
+ //delete data.version;
981
+ return data;
982
+ });
983
+ }
984
+
985
+ /**
986
+ * Returns object representation of an instance
987
+ * @param {string[]} [propertiesToInclude] Any properties that you might want to additionally include in the output
988
+ * @return {Object} object representation of an instance
989
+ */
990
+ toObject<
991
+ T extends Omit<
992
+ GroupProps & TClassProperties<this>,
993
+ keyof SerializedGroupProps
994
+ >,
995
+ K extends keyof T = never
996
+ >(propertiesToInclude: K[] = []): Pick<T, K> & SerializedGroupProps {
997
+ return {
998
+ ...super.toObject([
999
+ 'layout',
1000
+ 'subTargetCheck',
1001
+ 'interactive',
1002
+ ...propertiesToInclude,
1003
+ ]),
1004
+ objects: this.__serializeObjects('toObject', propertiesToInclude),
1005
+ };
1006
+ }
1007
+
1008
+ toString() {
1009
+ return `#<Group: (${this.complexity()})>`;
1010
+ }
1011
+
1012
+ dispose() {
1013
+ this._activeObjects = [];
1014
+ this.forEachObject((object) => {
1015
+ this._watchObject(false, object);
1016
+ object.dispose();
1017
+ });
1018
+ super.dispose();
1019
+ }
1020
+
1021
+ /**
1022
+ * @private
1023
+ */
1024
+ _createSVGBgRect(reviver?: TSVGReviver) {
1025
+ if (!this.backgroundColor) {
1026
+ return '';
1027
+ }
1028
+ const fillStroke = Rect.prototype._toSVG.call(this);
1029
+ const commons = fillStroke.indexOf('COMMON_PARTS');
1030
+ fillStroke[commons] = 'for="group" ';
1031
+ const markup = fillStroke.join('');
1032
+ return reviver ? reviver(markup) : markup;
1033
+ }
1034
+
1035
+ /**
1036
+ * Returns svg representation of an instance
1037
+ * @param {TSVGReviver} [reviver] Method for further parsing of svg representation.
1038
+ * @return {String} svg representation of an instance
1039
+ */
1040
+ _toSVG(reviver?: TSVGReviver) {
1041
+ const svgString = ['<g ', 'COMMON_PARTS', ' >\n'];
1042
+ const bg = this._createSVGBgRect(reviver);
1043
+ bg && svgString.push('\t\t', bg);
1044
+ for (let i = 0; i < this._objects.length; i++) {
1045
+ svgString.push('\t\t', this._objects[i].toSVG(reviver));
1046
+ }
1047
+ svgString.push('</g>\n');
1048
+ return svgString;
1049
+ }
1050
+
1051
+ /**
1052
+ * Returns styles-string for svg-export, specific version for group
1053
+ * @return {String}
1054
+ */
1055
+ getSvgStyles() {
1056
+ const opacity =
1057
+ typeof this.opacity !== 'undefined' && this.opacity !== 1
1058
+ ? `opacity: ${this.opacity};`
1059
+ : '',
1060
+ visibility = this.visible ? '' : ' visibility: hidden;';
1061
+ return [opacity, this.getSvgFilter(), visibility].join('');
1062
+ }
1063
+
1064
+ /**
1065
+ * Returns svg clipPath representation of an instance
1066
+ * @param {Function} [reviver] Method for further parsing of svg representation.
1067
+ * @return {String} svg representation of an instance
1068
+ */
1069
+ toClipPathSVG(reviver?: TSVGReviver) {
1070
+ const svgString = [];
1071
+ const bg = this._createSVGBgRect(reviver);
1072
+ bg && svgString.push('\t', bg);
1073
+ for (let i = 0; i < this._objects.length; i++) {
1074
+ svgString.push('\t', this._objects[i].toClipPathSVG(reviver));
1075
+ }
1076
+ return this._createBaseClipPathSVGMarkup(svgString, {
1077
+ reviver,
1078
+ });
1079
+ }
1080
+
1081
+ /**
1082
+ * @todo support loading from svg
1083
+ * @private
1084
+ * @static
1085
+ * @memberOf Group
1086
+ * @param {Object} object Object to create a group from
1087
+ * @returns {Promise<Group>}
1088
+ */
1089
+ static fromObject<T extends TProps<SerializedGroupProps>>({
1090
+ objects = [],
1091
+ ...options
1092
+ }: T) {
1093
+ return Promise.all([
1094
+ enlivenObjects(objects),
1095
+ enlivenObjectEnlivables(options),
1096
+ ]).then(
1097
+ ([objects, hydratedOptions]) =>
1098
+ new this(objects, { ...options, ...hydratedOptions }, true)
1099
+ );
1100
+ }
1101
+ }
1102
+
1103
+ classRegistry.setClass(Group);