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,1589 @@
1
+ import { cache } from '../../cache';
2
+ import { config } from '../../config';
3
+ import {
4
+ ALIASING_LIMIT,
5
+ CENTER,
6
+ iMatrix,
7
+ LEFT,
8
+ TOP,
9
+ VERSION,
10
+ } from '../../constants';
11
+ import type { ObjectEvents } from '../../EventTypeDefs';
12
+ import { AnimatableObject } from './AnimatableObject';
13
+ import { Point } from '../../Point';
14
+ import { Shadow } from '../../Shadow';
15
+ import type {
16
+ TDegree,
17
+ TFiller,
18
+ TSize,
19
+ TCacheCanvasDimensions,
20
+ Abortable,
21
+ } from '../../typedefs';
22
+ import { classRegistry } from '../../ClassRegistry';
23
+ import { runningAnimations } from '../../util/animation/AnimationRegistry';
24
+ import { cloneDeep } from '../../util/internals/cloneDeep';
25
+ import { capValue } from '../../util/misc/capValue';
26
+ import { createCanvasElement, toDataURL } from '../../util/misc/dom';
27
+ import { invertTransform, qrDecompose } from '../../util/misc/matrix';
28
+ import { enlivenObjectEnlivables } from '../../util/misc/objectEnlive';
29
+ import {
30
+ resetObjectTransform,
31
+ saveObjectTransform,
32
+ } from '../../util/misc/objectTransforms';
33
+ import { sendObjectToPlane } from '../../util/misc/planeChange';
34
+ import { pick, pickBy } from '../../util/misc/pick';
35
+ import { toFixed } from '../../util/misc/toFixed';
36
+ import type { Group } from '../Group';
37
+ import { StaticCanvas } from '../../canvas/StaticCanvas';
38
+ import {
39
+ isFiller,
40
+ isSerializableFiller,
41
+ isTextObject,
42
+ } from '../../util/typeAssertions';
43
+ import type { Image } from '../Image';
44
+ import {
45
+ cacheProperties,
46
+ fabricObjectDefaultValues,
47
+ stateProperties,
48
+ } from './defaultValues';
49
+ import type { Gradient } from '../../gradient/Gradient';
50
+ import type { Pattern } from '../../Pattern';
51
+ import type { Canvas } from '../../canvas/Canvas';
52
+ import type { SerializedObjectProps } from './types/SerializedObjectProps';
53
+ import type { ObjectProps } from './types/ObjectProps';
54
+ import type { TProps } from './types';
55
+ import { getEnv } from '../../env';
56
+
57
+ export type TCachedFabricObject = FabricObject &
58
+ Required<
59
+ Pick<
60
+ FabricObject,
61
+ | 'zoomX'
62
+ | 'zoomY'
63
+ | '_cacheCanvas'
64
+ | '_cacheContext'
65
+ | 'cacheTranslationX'
66
+ | 'cacheTranslationY'
67
+ >
68
+ > & {
69
+ _cacheContext: CanvasRenderingContext2D;
70
+ };
71
+
72
+ /**
73
+ * Root object class from which all 2d shape classes inherit from
74
+ * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#objects}
75
+ *
76
+ * @fires added
77
+ * @fires removed
78
+ *
79
+ * @fires selected
80
+ * @fires deselected
81
+ *
82
+ * @fires rotating
83
+ * @fires scaling
84
+ * @fires moving
85
+ * @fires skewing
86
+ * @fires modified
87
+ *
88
+ * @fires mousedown
89
+ * @fires mouseup
90
+ * @fires mouseover
91
+ * @fires mouseout
92
+ * @fires mousewheel
93
+ * @fires mousedblclick
94
+ *
95
+ * @fires dragover
96
+ * @fires dragenter
97
+ * @fires dragleave
98
+ * @fires drop
99
+ */
100
+ export class FabricObject<
101
+ Props extends TProps<ObjectProps> = Partial<ObjectProps>,
102
+ SProps extends SerializedObjectProps = SerializedObjectProps,
103
+ EventSpec extends ObjectEvents = ObjectEvents
104
+ >
105
+ extends AnimatableObject<EventSpec>
106
+ implements ObjectProps
107
+ {
108
+ declare minScaleLimit: number;
109
+
110
+ declare opacity: number;
111
+
112
+ declare paintFirst: 'fill' | 'stroke';
113
+ declare fill: string | TFiller | null;
114
+ declare fillRule: CanvasFillRule;
115
+ declare stroke: string | TFiller | null;
116
+ declare strokeDashArray: number[] | null;
117
+ declare strokeDashOffset: number;
118
+ declare strokeLineCap: CanvasLineCap;
119
+ declare strokeLineJoin: CanvasLineJoin;
120
+ declare strokeMiterLimit: number;
121
+
122
+ declare globalCompositeOperation: GlobalCompositeOperation;
123
+ declare backgroundColor: string;
124
+
125
+ declare shadow: Shadow | null;
126
+
127
+ declare visible: boolean;
128
+
129
+ declare includeDefaultValues: boolean;
130
+ declare excludeFromExport: boolean;
131
+
132
+ declare objectCaching: boolean;
133
+
134
+ declare clipPath?: FabricObject;
135
+ declare inverted: boolean;
136
+ declare absolutePositioned: boolean;
137
+ declare centeredRotation: boolean;
138
+
139
+ /**
140
+ * This list of properties is used to check if the state of an object is changed.
141
+ * This state change now is only used for children of groups to understand if a group
142
+ * needs its cache regenerated during a .set call
143
+ * @type Array
144
+ */
145
+ static stateProperties: string[] = stateProperties;
146
+
147
+ /**
148
+ * List of properties to consider when checking if cache needs refresh
149
+ * Those properties are checked by
150
+ * calls to Object.set(key, value). If the key is in this list, the object is marked as dirty
151
+ * and refreshed at the next render
152
+ * @type Array
153
+ */
154
+ static cacheProperties: string[] = cacheProperties;
155
+
156
+ /**
157
+ * When set to `true`, object's cache will be rerendered next render call.
158
+ * since 1.7.0
159
+ * @type Boolean
160
+ * @default true
161
+ */
162
+ declare dirty: boolean;
163
+
164
+ /**
165
+ * Quick access for the _cacheCanvas rendering context
166
+ * This is part of the objectCaching feature
167
+ * since 1.7.0
168
+ * @type boolean
169
+ * @default undefined
170
+ * @private
171
+ */
172
+ _cacheContext: CanvasRenderingContext2D | null = null;
173
+
174
+ /**
175
+ * A reference to the HTMLCanvasElement that is used to contain the cache of the object
176
+ * this canvas element is resized and cleared as needed
177
+ * Is marked private, you can read it, don't use it since it is handled by fabric
178
+ * since 1.7.0
179
+ * @type HTMLCanvasElement
180
+ * @default undefined
181
+ * @private
182
+ */
183
+ declare _cacheCanvas?: HTMLCanvasElement;
184
+
185
+ /**
186
+ * Size of the cache canvas, width
187
+ * since 1.7.0
188
+ * @type number
189
+ * @default undefined
190
+ * @private
191
+ */
192
+ declare cacheWidth?: number;
193
+
194
+ /**
195
+ * Size of the cache canvas, height
196
+ * since 1.7.0
197
+ * @type number
198
+ * @default undefined
199
+ * @private
200
+ */
201
+ declare cacheHeight?: number;
202
+
203
+ /**
204
+ * zoom level used on the cacheCanvas to draw the cache, X axe
205
+ * since 1.7.0
206
+ * @type number
207
+ * @default undefined
208
+ * @private
209
+ */
210
+ declare zoomX?: number;
211
+
212
+ /**
213
+ * zoom level used on the cacheCanvas to draw the cache, Y axe
214
+ * since 1.7.0
215
+ * @type number
216
+ * @default undefined
217
+ * @private
218
+ */
219
+ declare zoomY?: number;
220
+
221
+ /**
222
+ * zoom level used on the cacheCanvas to draw the cache, Y axe
223
+ * since 1.7.0
224
+ * @type number
225
+ * @default undefined
226
+ * @private
227
+ */
228
+ declare cacheTranslationX?: number;
229
+
230
+ /**
231
+ * translation of the cacheCanvas away from the center, for subpixel accuracy and crispness
232
+ * since 1.7.0
233
+ * @type number
234
+ * @default undefined
235
+ * @private
236
+ */
237
+ declare cacheTranslationY?: number;
238
+
239
+ /**
240
+ * A reference to the parent of the object, usually a Group
241
+ * @type number
242
+ * @default undefined
243
+ * @private
244
+ */
245
+ declare group?: Group;
246
+
247
+ /**
248
+ * Indicate if the object is sitting on a cache dedicated to it
249
+ * or is part of a larger cache for many object ( a group for example)
250
+ * @type number
251
+ * @default undefined
252
+ * @private
253
+ */
254
+ declare ownCaching?: boolean;
255
+
256
+ /**
257
+ * Private. indicates if the object inside a group is on a transformed context or not
258
+ * or is part of a larger cache for many object ( a group for example)
259
+ * @type boolean
260
+ * @default undefined
261
+ * @private
262
+ */
263
+ declare _transformDone?: boolean;
264
+
265
+ static ownDefaults: Record<string, any> = fabricObjectDefaultValues;
266
+
267
+ static getDefaults(): Record<string, any> {
268
+ return { ...FabricObject.ownDefaults };
269
+ }
270
+
271
+ /**
272
+ * The class type. Used to identify which class this is.
273
+ * This is used for serialization purposes and internally it can be used
274
+ * to identify classes. As a developer you could use `instance of Class`
275
+ * but to avoid importing all the code and blocking tree shaking we try
276
+ * to avoid doing that.
277
+ */
278
+ static type = 'FabricObject';
279
+
280
+ /**
281
+ * Legacy identifier of the class. Prefer using utils like isType or instanceOf
282
+ * Will be removed in fabric 7 or 8.
283
+ * The setter exists because is very hard to catch all the ways in which a type value
284
+ * could be set in the instance
285
+ * @TODO add sustainable warning message
286
+ * @type string
287
+ * @deprecated
288
+ */
289
+ get type() {
290
+ const name = (this.constructor as typeof FabricObject).type;
291
+ if (name === 'FabricObject') {
292
+ return 'object';
293
+ }
294
+ return name.toLowerCase();
295
+ }
296
+
297
+ set type(value) {
298
+ console.warn('Setting type has no effect', value);
299
+ }
300
+
301
+ /**
302
+ * Constructor
303
+ * @param {Object} [options] Options object
304
+ */
305
+ constructor(options: Props = {} as Props) {
306
+ super();
307
+ Object.assign(
308
+ this,
309
+ (this.constructor as typeof FabricObject).getDefaults()
310
+ );
311
+ this.setOptions(options);
312
+ }
313
+
314
+ /**
315
+ * Create a the canvas used to keep the cached copy of the object
316
+ * @private
317
+ */
318
+ _createCacheCanvas() {
319
+ this._cacheCanvas = createCanvasElement();
320
+ this._cacheContext = this._cacheCanvas.getContext('2d');
321
+ this._updateCacheCanvas();
322
+ // if canvas gets created, is empty, so dirty.
323
+ this.dirty = true;
324
+ }
325
+
326
+ /**
327
+ * Limit the cache dimensions so that X * Y do not cross config.perfLimitSizeTotal
328
+ * and each side do not cross fabric.cacheSideLimit
329
+ * those numbers are configurable so that you can get as much detail as you want
330
+ * making bargain with performances.
331
+ * @param {Object} dims
332
+ * @param {Object} dims.width width of canvas
333
+ * @param {Object} dims.height height of canvas
334
+ * @param {Object} dims.zoomX zoomX zoom value to unscale the canvas before drawing cache
335
+ * @param {Object} dims.zoomY zoomY zoom value to unscale the canvas before drawing cache
336
+ * @return {Object}.width width of canvas
337
+ * @return {Object}.height height of canvas
338
+ * @return {Object}.zoomX zoomX zoom value to unscale the canvas before drawing cache
339
+ * @return {Object}.zoomY zoomY zoom value to unscale the canvas before drawing cache
340
+ */
341
+ _limitCacheSize(
342
+ dims: TSize & { zoomX: number; zoomY: number; capped: boolean } & any
343
+ ) {
344
+ const width = dims.width,
345
+ height = dims.height,
346
+ max = config.maxCacheSideLimit,
347
+ min = config.minCacheSideLimit;
348
+ if (
349
+ width <= max &&
350
+ height <= max &&
351
+ width * height <= config.perfLimitSizeTotal
352
+ ) {
353
+ if (width < min) {
354
+ dims.width = min;
355
+ }
356
+ if (height < min) {
357
+ dims.height = min;
358
+ }
359
+ return dims;
360
+ }
361
+ const ar = width / height,
362
+ [limX, limY] = cache.limitDimsByArea(ar),
363
+ x = capValue(min, limX, max),
364
+ y = capValue(min, limY, max);
365
+ if (width > x) {
366
+ dims.zoomX /= width / x;
367
+ dims.width = x;
368
+ dims.capped = true;
369
+ }
370
+ if (height > y) {
371
+ dims.zoomY /= height / y;
372
+ dims.height = y;
373
+ dims.capped = true;
374
+ }
375
+ return dims;
376
+ }
377
+
378
+ /**
379
+ * Return the dimension and the zoom level needed to create a cache canvas
380
+ * big enough to host the object to be cached.
381
+ * @private
382
+ * @return {Object}.x width of object to be cached
383
+ * @return {Object}.y height of object to be cached
384
+ * @return {Object}.width width of canvas
385
+ * @return {Object}.height height of canvas
386
+ * @return {Object}.zoomX zoomX zoom value to unscale the canvas before drawing cache
387
+ * @return {Object}.zoomY zoomY zoom value to unscale the canvas before drawing cache
388
+ */
389
+ _getCacheCanvasDimensions(): TCacheCanvasDimensions {
390
+ const objectScale = this.getTotalObjectScaling(),
391
+ // calculate dimensions without skewing
392
+ dim = this._getTransformedDimensions({ skewX: 0, skewY: 0 }),
393
+ neededX = (dim.x * objectScale.x) / this.scaleX,
394
+ neededY = (dim.y * objectScale.y) / this.scaleY;
395
+ return {
396
+ // for sure this ALIASING_LIMIT is slightly creating problem
397
+ // in situation in which the cache canvas gets an upper limit
398
+ // also objectScale contains already scaleX and scaleY
399
+ width: neededX + ALIASING_LIMIT,
400
+ height: neededY + ALIASING_LIMIT,
401
+ zoomX: objectScale.x,
402
+ zoomY: objectScale.y,
403
+ x: neededX,
404
+ y: neededY,
405
+ };
406
+ }
407
+
408
+ /**
409
+ * Update width and height of the canvas for cache
410
+ * returns true or false if canvas needed resize.
411
+ * @private
412
+ * @return {Boolean} true if the canvas has been resized
413
+ */
414
+ _updateCacheCanvas() {
415
+ const canvas = this._cacheCanvas,
416
+ context = this._cacheContext,
417
+ dims = this._limitCacheSize(this._getCacheCanvasDimensions()),
418
+ minCacheSize = config.minCacheSideLimit,
419
+ width = dims.width,
420
+ height = dims.height,
421
+ zoomX = dims.zoomX,
422
+ zoomY = dims.zoomY,
423
+ dimensionsChanged =
424
+ width !== this.cacheWidth || height !== this.cacheHeight,
425
+ zoomChanged = this.zoomX !== zoomX || this.zoomY !== zoomY;
426
+
427
+ if (!canvas || !context) {
428
+ return false;
429
+ }
430
+
431
+ let drawingWidth,
432
+ drawingHeight,
433
+ shouldRedraw = dimensionsChanged || zoomChanged,
434
+ additionalWidth = 0,
435
+ additionalHeight = 0,
436
+ shouldResizeCanvas = false;
437
+
438
+ if (dimensionsChanged) {
439
+ const canvasWidth = (this._cacheCanvas as HTMLCanvasElement).width,
440
+ canvasHeight = (this._cacheCanvas as HTMLCanvasElement).height,
441
+ sizeGrowing = width > canvasWidth || height > canvasHeight,
442
+ sizeShrinking =
443
+ (width < canvasWidth * 0.9 || height < canvasHeight * 0.9) &&
444
+ canvasWidth > minCacheSize &&
445
+ canvasHeight > minCacheSize;
446
+ shouldResizeCanvas = sizeGrowing || sizeShrinking;
447
+ if (
448
+ sizeGrowing &&
449
+ !dims.capped &&
450
+ (width > minCacheSize || height > minCacheSize)
451
+ ) {
452
+ additionalWidth = width * 0.1;
453
+ additionalHeight = height * 0.1;
454
+ }
455
+ }
456
+ if (isTextObject(this) && this.path) {
457
+ shouldRedraw = true;
458
+ shouldResizeCanvas = true;
459
+ // IMHO in those lines we are using zoomX and zoomY not the this version.
460
+ additionalWidth += this.getHeightOfLine(0) * this.zoomX!;
461
+ additionalHeight += this.getHeightOfLine(0) * this.zoomY!;
462
+ }
463
+ if (shouldRedraw) {
464
+ if (shouldResizeCanvas) {
465
+ canvas.width = Math.ceil(width + additionalWidth);
466
+ canvas.height = Math.ceil(height + additionalHeight);
467
+ } else {
468
+ context.setTransform(1, 0, 0, 1, 0, 0);
469
+ context.clearRect(0, 0, canvas.width, canvas.height);
470
+ }
471
+ drawingWidth = dims.x / 2;
472
+ drawingHeight = dims.y / 2;
473
+ this.cacheTranslationX =
474
+ Math.round(canvas.width / 2 - drawingWidth) + drawingWidth;
475
+ this.cacheTranslationY =
476
+ Math.round(canvas.height / 2 - drawingHeight) + drawingHeight;
477
+ this.cacheWidth = width;
478
+ this.cacheHeight = height;
479
+ context.translate(this.cacheTranslationX, this.cacheTranslationY);
480
+ context.scale(zoomX, zoomY);
481
+ this.zoomX = zoomX;
482
+ this.zoomY = zoomY;
483
+ return true;
484
+ }
485
+ return false;
486
+ }
487
+
488
+ /**
489
+ * Sets object's properties from options, for class constructor only.
490
+ * Needs to be overridden for different defaults.
491
+ * @protected
492
+ * @param {Object} [options] Options object
493
+ */
494
+ protected setOptions(options: Record<string, any> = {}) {
495
+ this._setOptions(options);
496
+ }
497
+
498
+ /**
499
+ * Transforms context when rendering an object
500
+ * @param {CanvasRenderingContext2D} ctx Context
501
+ */
502
+ transform(ctx: CanvasRenderingContext2D) {
503
+ const needFullTransform =
504
+ (this.group && !this.group._transformDone) ||
505
+ (this.group && this.canvas && ctx === (this.canvas as Canvas).contextTop);
506
+ const m = this.calcTransformMatrix(!needFullTransform);
507
+ ctx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);
508
+ }
509
+
510
+ /**
511
+ * Returns an object representation of an instance
512
+ * @param {string[]} [propertiesToInclude] Any properties that you might want to additionally include in the output
513
+ * @return {Object} Object representation of an instance
514
+ */
515
+ protected toObject(propertiesToInclude: any[] = []): any {
516
+ const NUM_FRACTION_DIGITS = config.NUM_FRACTION_DIGITS,
517
+ clipPathData =
518
+ this.clipPath && !this.clipPath.excludeFromExport
519
+ ? {
520
+ ...this.clipPath.toObject(propertiesToInclude),
521
+ inverted: this.clipPath.inverted,
522
+ absolutePositioned: this.clipPath.absolutePositioned,
523
+ }
524
+ : null,
525
+ object = {
526
+ ...pick(this, propertiesToInclude as (keyof this)[]),
527
+ type: (this.constructor as typeof FabricObject).type,
528
+ version: VERSION,
529
+ originX: this.originX,
530
+ originY: this.originY,
531
+ left: toFixed(this.left, NUM_FRACTION_DIGITS),
532
+ top: toFixed(this.top, NUM_FRACTION_DIGITS),
533
+ width: toFixed(this.width, NUM_FRACTION_DIGITS),
534
+ height: toFixed(this.height, NUM_FRACTION_DIGITS),
535
+ fill: isSerializableFiller(this.fill)
536
+ ? this.fill.toObject()
537
+ : this.fill,
538
+ stroke: isSerializableFiller(this.stroke)
539
+ ? this.stroke.toObject()
540
+ : this.stroke,
541
+ strokeWidth: toFixed(this.strokeWidth, NUM_FRACTION_DIGITS),
542
+ strokeDashArray: this.strokeDashArray
543
+ ? this.strokeDashArray.concat()
544
+ : this.strokeDashArray,
545
+ strokeLineCap: this.strokeLineCap,
546
+ strokeDashOffset: this.strokeDashOffset,
547
+ strokeLineJoin: this.strokeLineJoin,
548
+ strokeUniform: this.strokeUniform,
549
+ strokeMiterLimit: toFixed(this.strokeMiterLimit, NUM_FRACTION_DIGITS),
550
+ scaleX: toFixed(this.scaleX, NUM_FRACTION_DIGITS),
551
+ scaleY: toFixed(this.scaleY, NUM_FRACTION_DIGITS),
552
+ angle: toFixed(this.angle, NUM_FRACTION_DIGITS),
553
+ flipX: this.flipX,
554
+ flipY: this.flipY,
555
+ opacity: toFixed(this.opacity, NUM_FRACTION_DIGITS),
556
+ shadow:
557
+ this.shadow && this.shadow.toObject
558
+ ? this.shadow.toObject()
559
+ : this.shadow,
560
+ visible: this.visible,
561
+ backgroundColor: this.backgroundColor,
562
+ fillRule: this.fillRule,
563
+ paintFirst: this.paintFirst,
564
+ globalCompositeOperation: this.globalCompositeOperation,
565
+ skewX: toFixed(this.skewX, NUM_FRACTION_DIGITS),
566
+ skewY: toFixed(this.skewY, NUM_FRACTION_DIGITS),
567
+ ...(clipPathData ? { clipPath: clipPathData } : null),
568
+ };
569
+
570
+ return !this.includeDefaultValues
571
+ ? this._removeDefaultValues(object)
572
+ : object;
573
+ }
574
+
575
+ /**
576
+ * Returns (dataless) object representation of an instance
577
+ * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output
578
+ * @return {Object} Object representation of an instance
579
+ */
580
+ toDatalessObject(propertiesToInclude?: any[]): any {
581
+ // will be overwritten by subclasses
582
+ return this.toObject(propertiesToInclude);
583
+ }
584
+
585
+ /**
586
+ * @private
587
+ * @param {Object} object
588
+ */
589
+ _removeDefaultValues<T extends object>(object: T): Partial<T> {
590
+ // getDefaults() ( get from static ownDefaults ) should win over prototype since anyway they get assigned to instance
591
+ // ownDefault vs prototype is swappable only if you change all the fabric objects consistently.
592
+ const defaults = (this.constructor as typeof FabricObject).getDefaults();
593
+ const hasStaticDefaultValues = Object.keys(defaults).length > 0;
594
+ const baseValues = hasStaticDefaultValues
595
+ ? defaults
596
+ : Object.getPrototypeOf(this);
597
+
598
+ return pickBy(object, (value, key) => {
599
+ if (key === LEFT || key === TOP || key === 'type') {
600
+ return true;
601
+ }
602
+ const baseValue = baseValues[key];
603
+ return (
604
+ value !== baseValue &&
605
+ // basically a check for [] === []
606
+ !(
607
+ Array.isArray(value) &&
608
+ Array.isArray(baseValue) &&
609
+ value.length === 0 &&
610
+ baseValue.length === 0
611
+ )
612
+ );
613
+ });
614
+ }
615
+
616
+ /**
617
+ * Returns a string representation of an instance
618
+ * @return {String}
619
+ */
620
+ toString() {
621
+ return `#<${(this.constructor as typeof FabricObject).type}>`;
622
+ }
623
+
624
+ /**
625
+ * Return the object scale factor counting also the group scaling
626
+ * @return {Point}
627
+ */
628
+ getObjectScaling() {
629
+ // if the object is a top level one, on the canvas, we go for simple aritmetic
630
+ // otherwise the complex method with angles will return approximations and decimals
631
+ // and will likely kill the cache when not needed
632
+ // https://github.com/fabricjs/fabric.js/issues/7157
633
+ if (!this.group) {
634
+ return new Point(Math.abs(this.scaleX), Math.abs(this.scaleY));
635
+ }
636
+ // if we are inside a group total zoom calculation is complex, we defer to generic matrices
637
+ const options = qrDecompose(this.calcTransformMatrix());
638
+ return new Point(Math.abs(options.scaleX), Math.abs(options.scaleY));
639
+ }
640
+
641
+ /**
642
+ * Return the object scale factor counting also the group scaling, zoom and retina
643
+ * @return {Object} object with scaleX and scaleY properties
644
+ */
645
+ getTotalObjectScaling() {
646
+ const scale = this.getObjectScaling();
647
+ if (this.canvas) {
648
+ const zoom = this.canvas.getZoom();
649
+ const retina = this.getCanvasRetinaScaling();
650
+ return scale.scalarMultiply(zoom * retina);
651
+ }
652
+ return scale;
653
+ }
654
+
655
+ /**
656
+ * Return the object opacity counting also the group property
657
+ * @return {Number}
658
+ */
659
+ getObjectOpacity() {
660
+ let opacity = this.opacity;
661
+ if (this.group) {
662
+ opacity *= this.group.getObjectOpacity();
663
+ }
664
+ return opacity;
665
+ }
666
+
667
+ /**
668
+ * Makes sure the scale is valid and modifies it if necessary
669
+ * @todo: this is a control action issue, not a geometry one
670
+ * @private
671
+ * @param {Number} value, unconstrained
672
+ * @return {Number} constrained value;
673
+ */
674
+ _constrainScale(value: number): number {
675
+ if (Math.abs(value) < this.minScaleLimit) {
676
+ if (value < 0) {
677
+ return -this.minScaleLimit;
678
+ } else {
679
+ return this.minScaleLimit;
680
+ }
681
+ } else if (value === 0) {
682
+ return 0.0001;
683
+ }
684
+ return value;
685
+ }
686
+
687
+ /**
688
+ * Handles setting values on the instance and handling internal side effects
689
+ * @protected
690
+ * @param {String} key
691
+ * @param {*} value
692
+ */
693
+ _set(key: string, value: any) {
694
+ const isChanged = this[key as keyof this] !== value;
695
+
696
+ if (key === 'scaleX' || key === 'scaleY') {
697
+ value = this._constrainScale(value);
698
+ }
699
+ if (key === 'scaleX' && value < 0) {
700
+ this.flipX = !this.flipX;
701
+ value *= -1;
702
+ } else if (key === 'scaleY' && value < 0) {
703
+ this.flipY = !this.flipY;
704
+ value *= -1;
705
+ // i don't like this automatic initialization here
706
+ } else if (key === 'shadow' && value && !(value instanceof Shadow)) {
707
+ value = new Shadow(value);
708
+ } else if (key === 'dirty' && this.group) {
709
+ this.group.set('dirty', value);
710
+ }
711
+
712
+ this[key as keyof this] = value;
713
+
714
+ if (isChanged) {
715
+ const groupNeedsUpdate = this.group && this.group.isOnACache();
716
+ if (
717
+ (this.constructor as typeof FabricObject).cacheProperties.includes(key)
718
+ ) {
719
+ this.dirty = true;
720
+ groupNeedsUpdate && this.group!.set('dirty', true);
721
+ } else if (
722
+ groupNeedsUpdate &&
723
+ (this.constructor as typeof FabricObject).stateProperties.includes(key)
724
+ ) {
725
+ this.group!.set('dirty', true);
726
+ }
727
+ }
728
+ return this;
729
+ }
730
+
731
+ /*
732
+ * @private
733
+ * return if the object would be visible in rendering
734
+ * @memberOf FabricObject.prototype
735
+ * @return {Boolean}
736
+ */
737
+ isNotVisible() {
738
+ return (
739
+ this.opacity === 0 ||
740
+ (!this.width && !this.height && this.strokeWidth === 0) ||
741
+ !this.visible
742
+ );
743
+ }
744
+
745
+ /**
746
+ * Renders an object on a specified context
747
+ * @param {CanvasRenderingContext2D} ctx Context to render on
748
+ */
749
+ render(ctx: CanvasRenderingContext2D) {
750
+ // do not render if width/height are zeros or object is not visible
751
+ if (this.isNotVisible()) {
752
+ return;
753
+ }
754
+ if (
755
+ this.canvas &&
756
+ this.canvas.skipOffscreen &&
757
+ !this.group &&
758
+ !this.isOnScreen()
759
+ ) {
760
+ return;
761
+ }
762
+ ctx.save();
763
+ this._setupCompositeOperation(ctx);
764
+ this.drawSelectionBackground(ctx);
765
+ this.transform(ctx);
766
+ this._setOpacity(ctx);
767
+ this._setShadow(ctx);
768
+ if (this.shouldCache()) {
769
+ this.renderCache();
770
+ (this as TCachedFabricObject).drawCacheOnCanvas(ctx);
771
+ } else {
772
+ this._removeCacheCanvas();
773
+ this.drawObject(ctx);
774
+ this.dirty = false;
775
+ }
776
+ ctx.restore();
777
+ }
778
+
779
+ drawSelectionBackground(ctx: CanvasRenderingContext2D) {
780
+ /* no op */
781
+ }
782
+
783
+ renderCache(options?: any) {
784
+ options = options || {};
785
+ if (!this._cacheCanvas || !this._cacheContext) {
786
+ this._createCacheCanvas();
787
+ }
788
+ if (this.isCacheDirty() && this._cacheContext) {
789
+ this.drawObject(this._cacheContext, options.forClipping);
790
+ this.dirty = false;
791
+ }
792
+ }
793
+
794
+ /**
795
+ * Remove cacheCanvas and its dimensions from the objects
796
+ */
797
+ _removeCacheCanvas() {
798
+ this._cacheCanvas = undefined;
799
+ this._cacheContext = null;
800
+ this.cacheWidth = 0;
801
+ this.cacheHeight = 0;
802
+ }
803
+
804
+ /**
805
+ * return true if the object will draw a stroke
806
+ * Does not consider text styles. This is just a shortcut used at rendering time
807
+ * We want it to be an approximation and be fast.
808
+ * wrote to avoid extra caching, it has to return true when stroke happens,
809
+ * can guess when it will not happen at 100% chance, does not matter if it misses
810
+ * some use case where the stroke is invisible.
811
+ * @since 3.0.0
812
+ * @returns Boolean
813
+ */
814
+ hasStroke() {
815
+ return (
816
+ this.stroke && this.stroke !== 'transparent' && this.strokeWidth !== 0
817
+ );
818
+ }
819
+
820
+ /**
821
+ * return true if the object will draw a fill
822
+ * Does not consider text styles. This is just a shortcut used at rendering time
823
+ * We want it to be an approximation and be fast.
824
+ * wrote to avoid extra caching, it has to return true when fill happens,
825
+ * can guess when it will not happen at 100% chance, does not matter if it misses
826
+ * some use case where the fill is invisible.
827
+ * @since 3.0.0
828
+ * @returns Boolean
829
+ */
830
+ hasFill() {
831
+ return this.fill && this.fill !== 'transparent';
832
+ }
833
+
834
+ /**
835
+ * When set to `true`, force the object to have its own cache, even if it is inside a group
836
+ * it may be needed when your object behave in a particular way on the cache and always needs
837
+ * its own isolated canvas to render correctly.
838
+ * Created to be overridden
839
+ * since 1.7.12
840
+ * @returns Boolean
841
+ */
842
+ needsItsOwnCache() {
843
+ if (
844
+ this.paintFirst === 'stroke' &&
845
+ this.hasFill() &&
846
+ this.hasStroke() &&
847
+ typeof this.shadow === 'object'
848
+ ) {
849
+ return true;
850
+ }
851
+ if (this.clipPath) {
852
+ return true;
853
+ }
854
+ return false;
855
+ }
856
+
857
+ /**
858
+ * Decide if the object should cache or not. Create its own cache level
859
+ * objectCaching is a global flag, wins over everything
860
+ * needsItsOwnCache should be used when the object drawing method requires
861
+ * a cache step. None of the fabric classes requires it.
862
+ * Generally you do not cache objects in groups because the group outside is cached.
863
+ * Read as: cache if is needed, or if the feature is enabled but we are not already caching.
864
+ * @return {Boolean}
865
+ */
866
+ shouldCache() {
867
+ this.ownCaching =
868
+ this.needsItsOwnCache() ||
869
+ (this.objectCaching && (!this.group || !this.group.isOnACache()));
870
+ return this.ownCaching;
871
+ }
872
+
873
+ /**
874
+ * Check if this object or a child object will cast a shadow
875
+ * used by Group.shouldCache to know if child has a shadow recursively
876
+ * @return {Boolean}
877
+ * @deprecated
878
+ */
879
+ willDrawShadow() {
880
+ return (
881
+ !!this.shadow && (this.shadow.offsetX !== 0 || this.shadow.offsetY !== 0)
882
+ );
883
+ }
884
+
885
+ /**
886
+ * Execute the drawing operation for an object clipPath
887
+ * @param {CanvasRenderingContext2D} ctx Context to render on
888
+ * @param {FabricObject} clipPath
889
+ */
890
+ drawClipPathOnCache(
891
+ ctx: CanvasRenderingContext2D,
892
+ clipPath: TCachedFabricObject
893
+ ) {
894
+ ctx.save();
895
+ // DEBUG: uncomment this line, comment the following
896
+ // ctx.globalAlpha = 0.4
897
+ if (clipPath.inverted) {
898
+ ctx.globalCompositeOperation = 'destination-out';
899
+ } else {
900
+ ctx.globalCompositeOperation = 'destination-in';
901
+ }
902
+ //ctx.scale(1 / 2, 1 / 2);
903
+ if (clipPath.absolutePositioned) {
904
+ const m = invertTransform(this.calcTransformMatrix());
905
+ ctx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);
906
+ }
907
+ clipPath.transform(ctx);
908
+ ctx.scale(1 / clipPath.zoomX, 1 / clipPath.zoomY);
909
+ ctx.drawImage(
910
+ clipPath._cacheCanvas,
911
+ -clipPath.cacheTranslationX,
912
+ -clipPath.cacheTranslationY
913
+ );
914
+ ctx.restore();
915
+ }
916
+
917
+ /**
918
+ * Execute the drawing operation for an object on a specified context
919
+ * @param {CanvasRenderingContext2D} ctx Context to render on
920
+ * @param {boolean} forClipping apply clipping styles
921
+ */
922
+ drawObject(ctx: CanvasRenderingContext2D, forClipping?: boolean) {
923
+ const originalFill = this.fill,
924
+ originalStroke = this.stroke;
925
+ if (forClipping) {
926
+ this.fill = 'black';
927
+ this.stroke = '';
928
+ this._setClippingProperties(ctx);
929
+ } else {
930
+ this._renderBackground(ctx);
931
+ }
932
+ this._render(ctx);
933
+ this._drawClipPath(ctx, this.clipPath);
934
+ this.fill = originalFill;
935
+ this.stroke = originalStroke;
936
+ }
937
+
938
+ /**
939
+ * Prepare clipPath state and cache and draw it on instance's cache
940
+ * @param {CanvasRenderingContext2D} ctx
941
+ * @param {FabricObject} clipPath
942
+ */
943
+ _drawClipPath(ctx: CanvasRenderingContext2D, clipPath?: FabricObject) {
944
+ if (!clipPath) {
945
+ return;
946
+ }
947
+ // needed to setup a couple of variables
948
+ // path canvas gets overridden with this one.
949
+ // TODO find a better solution?
950
+ clipPath._set('canvas', this.canvas);
951
+ clipPath.shouldCache();
952
+ clipPath._transformDone = true;
953
+ clipPath.renderCache({ forClipping: true });
954
+ this.drawClipPathOnCache(ctx, clipPath as TCachedFabricObject);
955
+ }
956
+
957
+ /**
958
+ * Paint the cached copy of the object on the target context.
959
+ * @param {CanvasRenderingContext2D} ctx Context to render on
960
+ */
961
+ drawCacheOnCanvas(this: TCachedFabricObject, ctx: CanvasRenderingContext2D) {
962
+ ctx.scale(1 / this.zoomX, 1 / this.zoomY);
963
+ ctx.drawImage(
964
+ this._cacheCanvas,
965
+ -this.cacheTranslationX,
966
+ -this.cacheTranslationY
967
+ );
968
+ }
969
+
970
+ /**
971
+ * Check if cache is dirty
972
+ * @param {Boolean} skipCanvas skip canvas checks because this object is painted
973
+ * on parent canvas.
974
+ */
975
+ isCacheDirty(skipCanvas = false) {
976
+ if (this.isNotVisible()) {
977
+ return false;
978
+ }
979
+ if (
980
+ this._cacheCanvas &&
981
+ this._cacheContext &&
982
+ !skipCanvas &&
983
+ this._updateCacheCanvas()
984
+ ) {
985
+ // in this case the context is already cleared.
986
+ return true;
987
+ } else {
988
+ if (this.dirty || (this.clipPath && this.clipPath.absolutePositioned)) {
989
+ if (this._cacheCanvas && this._cacheContext && !skipCanvas) {
990
+ const width = this.cacheWidth! / this.zoomX!;
991
+ const height = this.cacheHeight! / this.zoomY!;
992
+ this._cacheContext.clearRect(-width / 2, -height / 2, width, height);
993
+ }
994
+ return true;
995
+ }
996
+ }
997
+ return false;
998
+ }
999
+
1000
+ /**
1001
+ * Draws a background for the object big as its untransformed dimensions
1002
+ * @private
1003
+ * @param {CanvasRenderingContext2D} ctx Context to render on
1004
+ */
1005
+ _renderBackground(ctx: CanvasRenderingContext2D) {
1006
+ if (!this.backgroundColor) {
1007
+ return;
1008
+ }
1009
+ const dim = this._getNonTransformedDimensions();
1010
+ ctx.fillStyle = this.backgroundColor;
1011
+
1012
+ ctx.fillRect(-dim.x / 2, -dim.y / 2, dim.x, dim.y);
1013
+ // if there is background color no other shadows
1014
+ // should be casted
1015
+ this._removeShadow(ctx);
1016
+ }
1017
+
1018
+ /**
1019
+ * @private
1020
+ * @param {CanvasRenderingContext2D} ctx Context to render on
1021
+ */
1022
+ _setOpacity(ctx: CanvasRenderingContext2D) {
1023
+ if (this.group && !this.group._transformDone) {
1024
+ ctx.globalAlpha = this.getObjectOpacity();
1025
+ } else {
1026
+ ctx.globalAlpha *= this.opacity;
1027
+ }
1028
+ }
1029
+
1030
+ _setStrokeStyles(
1031
+ ctx: CanvasRenderingContext2D,
1032
+ decl: Pick<
1033
+ this,
1034
+ | 'stroke'
1035
+ | 'strokeWidth'
1036
+ | 'strokeLineCap'
1037
+ | 'strokeDashOffset'
1038
+ | 'strokeLineJoin'
1039
+ | 'strokeMiterLimit'
1040
+ >
1041
+ ) {
1042
+ const stroke = decl.stroke;
1043
+ if (stroke) {
1044
+ ctx.lineWidth = decl.strokeWidth;
1045
+ ctx.lineCap = decl.strokeLineCap;
1046
+ ctx.lineDashOffset = decl.strokeDashOffset;
1047
+ ctx.lineJoin = decl.strokeLineJoin;
1048
+ ctx.miterLimit = decl.strokeMiterLimit;
1049
+ if (isFiller(stroke)) {
1050
+ if (
1051
+ (stroke as Gradient<'linear'>).gradientUnits === 'percentage' ||
1052
+ (stroke as Gradient<'linear'>).gradientTransform ||
1053
+ (stroke as Pattern).patternTransform
1054
+ ) {
1055
+ // need to transform gradient in a pattern.
1056
+ // this is a slow process. If you are hitting this codepath, and the object
1057
+ // is not using caching, you should consider switching it on.
1058
+ // we need a canvas as big as the current object caching canvas.
1059
+ this._applyPatternForTransformedGradient(ctx, stroke);
1060
+ } else {
1061
+ // is a simple gradient or pattern
1062
+ ctx.strokeStyle = stroke.toLive(ctx)!;
1063
+ this._applyPatternGradientTransform(ctx, stroke);
1064
+ }
1065
+ } else {
1066
+ // is a color
1067
+ ctx.strokeStyle = decl.stroke as string;
1068
+ }
1069
+ }
1070
+ }
1071
+
1072
+ _setFillStyles(ctx: CanvasRenderingContext2D, { fill }: Pick<this, 'fill'>) {
1073
+ if (fill) {
1074
+ if (isFiller(fill)) {
1075
+ ctx.fillStyle = fill.toLive(ctx)!;
1076
+ this._applyPatternGradientTransform(ctx, fill);
1077
+ } else {
1078
+ ctx.fillStyle = fill;
1079
+ }
1080
+ }
1081
+ }
1082
+
1083
+ _setClippingProperties(ctx: CanvasRenderingContext2D) {
1084
+ ctx.globalAlpha = 1;
1085
+ ctx.strokeStyle = 'transparent';
1086
+ ctx.fillStyle = '#000000';
1087
+ }
1088
+
1089
+ /**
1090
+ * @private
1091
+ * Sets line dash
1092
+ * @param {CanvasRenderingContext2D} ctx Context to set the dash line on
1093
+ * @param {Array} dashArray array representing dashes
1094
+ */
1095
+ _setLineDash(ctx: CanvasRenderingContext2D, dashArray?: number[] | null) {
1096
+ if (!dashArray || dashArray.length === 0) {
1097
+ return;
1098
+ }
1099
+ // Spec requires the concatenation of two copies of the dash array when the number of elements is odd
1100
+ if (1 & dashArray.length) {
1101
+ dashArray.push(...dashArray);
1102
+ }
1103
+ ctx.setLineDash(dashArray);
1104
+ }
1105
+
1106
+ /**
1107
+ * @private
1108
+ * @param {CanvasRenderingContext2D} ctx Context to render on
1109
+ */
1110
+ _setShadow(ctx: CanvasRenderingContext2D) {
1111
+ if (!this.shadow) {
1112
+ return;
1113
+ }
1114
+
1115
+ const shadow = this.shadow,
1116
+ canvas = this.canvas,
1117
+ retinaScaling = this.getCanvasRetinaScaling(),
1118
+ [sx, , , sy] = canvas?.viewportTransform || iMatrix,
1119
+ multX = sx * retinaScaling,
1120
+ multY = sy * retinaScaling,
1121
+ scaling = shadow.nonScaling ? new Point(1, 1) : this.getObjectScaling();
1122
+ ctx.shadowColor = shadow.color;
1123
+ ctx.shadowBlur =
1124
+ (shadow.blur *
1125
+ config.browserShadowBlurConstant *
1126
+ (multX + multY) *
1127
+ (scaling.x + scaling.y)) /
1128
+ 4;
1129
+ ctx.shadowOffsetX = shadow.offsetX * multX * scaling.x;
1130
+ ctx.shadowOffsetY = shadow.offsetY * multY * scaling.y;
1131
+ }
1132
+
1133
+ /**
1134
+ * @private
1135
+ * @param {CanvasRenderingContext2D} ctx Context to render on
1136
+ */
1137
+ _removeShadow(ctx: CanvasRenderingContext2D) {
1138
+ if (!this.shadow) {
1139
+ return;
1140
+ }
1141
+
1142
+ ctx.shadowColor = '';
1143
+ ctx.shadowBlur = ctx.shadowOffsetX = ctx.shadowOffsetY = 0;
1144
+ }
1145
+
1146
+ /**
1147
+ * @private
1148
+ * @param {CanvasRenderingContext2D} ctx Context to render on
1149
+ * @param {TFiller} filler {@link Pattern} or {@link Gradient}
1150
+ */
1151
+ _applyPatternGradientTransform(
1152
+ ctx: CanvasRenderingContext2D,
1153
+ filler: TFiller
1154
+ ) {
1155
+ if (!isFiller(filler)) {
1156
+ return { offsetX: 0, offsetY: 0 };
1157
+ }
1158
+ const t =
1159
+ (filler as Gradient<'linear'>).gradientTransform ||
1160
+ (filler as Pattern).patternTransform;
1161
+ const offsetX = -this.width / 2 + filler.offsetX || 0,
1162
+ offsetY = -this.height / 2 + filler.offsetY || 0;
1163
+
1164
+ if ((filler as Gradient<'linear'>).gradientUnits === 'percentage') {
1165
+ ctx.transform(this.width, 0, 0, this.height, offsetX, offsetY);
1166
+ } else {
1167
+ ctx.transform(1, 0, 0, 1, offsetX, offsetY);
1168
+ }
1169
+ if (t) {
1170
+ ctx.transform(t[0], t[1], t[2], t[3], t[4], t[5]);
1171
+ }
1172
+ return { offsetX: offsetX, offsetY: offsetY };
1173
+ }
1174
+
1175
+ /**
1176
+ * @private
1177
+ * @param {CanvasRenderingContext2D} ctx Context to render on
1178
+ */
1179
+ _renderPaintInOrder(ctx: CanvasRenderingContext2D) {
1180
+ if (this.paintFirst === 'stroke') {
1181
+ this._renderStroke(ctx);
1182
+ this._renderFill(ctx);
1183
+ } else {
1184
+ this._renderFill(ctx);
1185
+ this._renderStroke(ctx);
1186
+ }
1187
+ }
1188
+
1189
+ /**
1190
+ * @private
1191
+ * function that actually render something on the context.
1192
+ * empty here to allow Obects to work on tests to benchmark fabric functionalites
1193
+ * not related to rendering
1194
+ * @param {CanvasRenderingContext2D} ctx Context to render on
1195
+ */
1196
+ _render(ctx: CanvasRenderingContext2D) {
1197
+ // placeholder to be overridden
1198
+ }
1199
+
1200
+ /**
1201
+ * @private
1202
+ * @param {CanvasRenderingContext2D} ctx Context to render on
1203
+ */
1204
+ _renderFill(ctx: CanvasRenderingContext2D) {
1205
+ if (!this.fill) {
1206
+ return;
1207
+ }
1208
+
1209
+ ctx.save();
1210
+ this._setFillStyles(ctx, this);
1211
+ if (this.fillRule === 'evenodd') {
1212
+ ctx.fill('evenodd');
1213
+ } else {
1214
+ ctx.fill();
1215
+ }
1216
+ ctx.restore();
1217
+ }
1218
+
1219
+ /**
1220
+ * @private
1221
+ * @param {CanvasRenderingContext2D} ctx Context to render on
1222
+ */
1223
+ _renderStroke(ctx: CanvasRenderingContext2D) {
1224
+ if (!this.stroke || this.strokeWidth === 0) {
1225
+ return;
1226
+ }
1227
+
1228
+ if (this.shadow && !this.shadow.affectStroke) {
1229
+ this._removeShadow(ctx);
1230
+ }
1231
+
1232
+ ctx.save();
1233
+ if (this.strokeUniform) {
1234
+ const scaling = this.getObjectScaling();
1235
+ ctx.scale(1 / scaling.x, 1 / scaling.y);
1236
+ }
1237
+ this._setLineDash(ctx, this.strokeDashArray);
1238
+ this._setStrokeStyles(ctx, this);
1239
+ ctx.stroke();
1240
+ ctx.restore();
1241
+ }
1242
+
1243
+ /**
1244
+ * This function try to patch the missing gradientTransform on canvas gradients.
1245
+ * transforming a context to transform the gradient, is going to transform the stroke too.
1246
+ * we want to transform the gradient but not the stroke operation, so we create
1247
+ * a transformed gradient on a pattern and then we use the pattern instead of the gradient.
1248
+ * this method has drawbacks: is slow, is in low resolution, needs a patch for when the size
1249
+ * is limited.
1250
+ * @private
1251
+ * @param {CanvasRenderingContext2D} ctx Context to render on
1252
+ * @param {Gradient} filler
1253
+ */
1254
+ _applyPatternForTransformedGradient(
1255
+ ctx: CanvasRenderingContext2D,
1256
+ filler: TFiller
1257
+ ) {
1258
+ const dims = this._limitCacheSize(this._getCacheCanvasDimensions()),
1259
+ pCanvas = createCanvasElement(),
1260
+ retinaScaling = this.getCanvasRetinaScaling(),
1261
+ width = dims.x / this.scaleX / retinaScaling,
1262
+ height = dims.y / this.scaleY / retinaScaling;
1263
+ // in case width and height are less than 1px, we have to round up.
1264
+ // since the pattern is no-repeat, this is fine
1265
+ pCanvas.width = Math.ceil(width);
1266
+ pCanvas.height = Math.ceil(height);
1267
+ const pCtx = pCanvas.getContext('2d');
1268
+ if (!pCtx) {
1269
+ return;
1270
+ }
1271
+ pCtx.beginPath();
1272
+ pCtx.moveTo(0, 0);
1273
+ pCtx.lineTo(width, 0);
1274
+ pCtx.lineTo(width, height);
1275
+ pCtx.lineTo(0, height);
1276
+ pCtx.closePath();
1277
+ pCtx.translate(width / 2, height / 2);
1278
+ pCtx.scale(
1279
+ dims.zoomX / this.scaleX / retinaScaling,
1280
+ dims.zoomY / this.scaleY / retinaScaling
1281
+ );
1282
+ this._applyPatternGradientTransform(pCtx, filler);
1283
+ pCtx.fillStyle = filler.toLive(ctx)!;
1284
+ pCtx.fill();
1285
+ ctx.translate(
1286
+ -this.width / 2 - this.strokeWidth / 2,
1287
+ -this.height / 2 - this.strokeWidth / 2
1288
+ );
1289
+ ctx.scale(
1290
+ (retinaScaling * this.scaleX) / dims.zoomX,
1291
+ (retinaScaling * this.scaleY) / dims.zoomY
1292
+ );
1293
+ ctx.strokeStyle = pCtx.createPattern(pCanvas, 'no-repeat') ?? '';
1294
+ }
1295
+
1296
+ /**
1297
+ * This function is an helper for svg import. it returns the center of the object in the svg
1298
+ * untransformed coordinates
1299
+ * @private
1300
+ * @return {Point} center point from element coordinates
1301
+ */
1302
+ _findCenterFromElement() {
1303
+ return new Point(this.left + this.width / 2, this.top + this.height / 2);
1304
+ }
1305
+
1306
+ /**
1307
+ * Clones an instance.
1308
+ * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output
1309
+ * @returns {Promise<FabricObject>}
1310
+ */
1311
+ clone(propertiesToInclude?: string[]): Promise<this> {
1312
+ const objectForm = this.toObject(propertiesToInclude);
1313
+ return (this.constructor as typeof FabricObject).fromObject(
1314
+ objectForm
1315
+ ) as unknown as Promise<this>;
1316
+ }
1317
+
1318
+ /**
1319
+ * Creates an instance of Image out of an object
1320
+ * makes use of toCanvasElement.
1321
+ * Once this method was based on toDataUrl and loadImage, so it also had a quality
1322
+ * and format option. toCanvasElement is faster and produce no loss of quality.
1323
+ * If you need to get a real Jpeg or Png from an object, using toDataURL is the right way to do it.
1324
+ * toCanvasElement and then toBlob from the obtained canvas is also a good option.
1325
+ * @todo fix the export type, it could not be Image but the type that getClass return for 'image'.
1326
+ * @param {Object} [options] for clone as image, passed to toDataURL
1327
+ * @param {Number} [options.multiplier=1] Multiplier to scale by
1328
+ * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14
1329
+ * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14
1330
+ * @param {Number} [options.width] Cropping width. Introduced in v1.2.14
1331
+ * @param {Number} [options.height] Cropping height. Introduced in v1.2.14
1332
+ * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4
1333
+ * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4
1334
+ * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2
1335
+ * @return {Image} Object cloned as image.
1336
+ */
1337
+ cloneAsImage(options: any): Image {
1338
+ const canvasEl = this.toCanvasElement(options);
1339
+ // TODO: how to import Image w/o an import cycle?
1340
+ const ImageClass = classRegistry.getClass('image');
1341
+ return new ImageClass(canvasEl);
1342
+ }
1343
+
1344
+ /**
1345
+ * Converts an object into a HTMLCanvas element
1346
+ * @param {Object} options Options object
1347
+ * @param {Number} [options.multiplier=1] Multiplier to scale by
1348
+ * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14
1349
+ * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14
1350
+ * @param {Number} [options.width] Cropping width. Introduced in v1.2.14
1351
+ * @param {Number} [options.height] Cropping height. Introduced in v1.2.14
1352
+ * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4
1353
+ * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4
1354
+ * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2
1355
+ * @param {Boolean} [options.viewportTransform] Account for canvas viewport transform
1356
+ * @return {HTMLCanvasElement} Returns DOM element <canvas> with the FabricObject
1357
+ */
1358
+ toCanvasElement(options: any = {}) {
1359
+ const origParams = saveObjectTransform(this),
1360
+ originalGroup = this.group,
1361
+ originalShadow = this.shadow,
1362
+ abs = Math.abs,
1363
+ retinaScaling = options.enableRetinaScaling
1364
+ ? Math.max(config.devicePixelRatio, 1)
1365
+ : 1,
1366
+ multiplier = (options.multiplier || 1) * retinaScaling;
1367
+ delete this.group;
1368
+ if (options.withoutTransform) {
1369
+ resetObjectTransform(this);
1370
+ }
1371
+ if (options.withoutShadow) {
1372
+ this.shadow = null;
1373
+ }
1374
+ if (options.viewportTransform) {
1375
+ sendObjectToPlane(this, this.getViewportTransform());
1376
+ }
1377
+
1378
+ const el = createCanvasElement(),
1379
+ // skip canvas zoom and calculate with setCoords now.
1380
+ boundingRect = this.getBoundingRect(true, true),
1381
+ shadow = this.shadow,
1382
+ shadowOffset = new Point();
1383
+
1384
+ if (shadow) {
1385
+ const shadowBlur = shadow.blur;
1386
+ const scaling = shadow.nonScaling
1387
+ ? new Point(1, 1)
1388
+ : this.getObjectScaling();
1389
+ // consider non scaling shadow.
1390
+ shadowOffset.x =
1391
+ 2 * Math.round(abs(shadow.offsetX) + shadowBlur) * abs(scaling.x);
1392
+ shadowOffset.y =
1393
+ 2 * Math.round(abs(shadow.offsetY) + shadowBlur) * abs(scaling.y);
1394
+ }
1395
+ const width = boundingRect.width + shadowOffset.x,
1396
+ height = boundingRect.height + shadowOffset.y;
1397
+ // if the current width/height is not an integer
1398
+ // we need to make it so.
1399
+ el.width = Math.ceil(width);
1400
+ el.height = Math.ceil(height);
1401
+ const canvas = new StaticCanvas(el, {
1402
+ enableRetinaScaling: false,
1403
+ renderOnAddRemove: false,
1404
+ skipOffscreen: false,
1405
+ });
1406
+ if (options.format === 'jpeg') {
1407
+ canvas.backgroundColor = '#fff';
1408
+ }
1409
+ this.setPositionByOrigin(
1410
+ new Point(canvas.width / 2, canvas.height / 2),
1411
+ CENTER,
1412
+ CENTER
1413
+ );
1414
+ const originalCanvas = this.canvas;
1415
+ // static canvas and canvas have both an array of InteractiveObjects
1416
+ // @ts-ignore this needs to be fixed somehow, or ignored globally
1417
+ canvas._objects = [this];
1418
+ this.set('canvas', canvas);
1419
+ this.setCoords();
1420
+ const canvasEl = canvas.toCanvasElement(multiplier || 1, options);
1421
+ this.set('canvas', originalCanvas);
1422
+ this.shadow = originalShadow;
1423
+ if (originalGroup) {
1424
+ this.group = originalGroup;
1425
+ }
1426
+ this.set(origParams);
1427
+ this.setCoords();
1428
+ // canvas.dispose will call image.dispose that will nullify the elements
1429
+ // since this canvas is a simple element for the process, we remove references
1430
+ // to objects in this way in order to avoid object trashing.
1431
+ canvas._objects = [];
1432
+ // since render has settled it is safe to destroy canvas
1433
+ canvas.destroy();
1434
+ return canvasEl;
1435
+ }
1436
+
1437
+ /**
1438
+ * Converts an object into a data-url-like string
1439
+ * @param {Object} options Options object
1440
+ * @param {String} [options.format=png] The format of the output image. Either "jpeg" or "png"
1441
+ * @param {Number} [options.quality=1] Quality level (0..1). Only used for jpeg.
1442
+ * @param {Number} [options.multiplier=1] Multiplier to scale by
1443
+ * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14
1444
+ * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14
1445
+ * @param {Number} [options.width] Cropping width. Introduced in v1.2.14
1446
+ * @param {Number} [options.height] Cropping height. Introduced in v1.2.14
1447
+ * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4
1448
+ * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4
1449
+ * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2
1450
+ * @return {String} Returns a data: URL containing a representation of the object in the format specified by options.format
1451
+ */
1452
+ toDataURL(options: any = {}) {
1453
+ return toDataURL(
1454
+ this.toCanvasElement(options),
1455
+ options.format || 'png',
1456
+ options.quality || 1
1457
+ );
1458
+ }
1459
+
1460
+ /**
1461
+ * Returns true if any of the specified types is identical to the type of an instance
1462
+ * @param {String} type Type to check against
1463
+ * @return {Boolean}
1464
+ */
1465
+ isType(...types: string[]) {
1466
+ return (
1467
+ types.includes((this.constructor as typeof FabricObject).type) ||
1468
+ types.includes(this.type)
1469
+ );
1470
+ }
1471
+
1472
+ /**
1473
+ * Returns complexity of an instance
1474
+ * @return {Number} complexity of this instance (is 1 unless subclassed)
1475
+ */
1476
+ complexity() {
1477
+ return 1;
1478
+ }
1479
+
1480
+ /**
1481
+ * Returns a JSON representation of an instance
1482
+ * @return {Object} JSON
1483
+ */
1484
+ toJSON() {
1485
+ // delegate, not alias
1486
+ return this.toObject();
1487
+ }
1488
+
1489
+ /**
1490
+ * Sets "angle" of an instance with centered rotation
1491
+ * @param {TDegree} angle Angle value (in degrees)
1492
+ */
1493
+ rotate(angle: TDegree) {
1494
+ const shouldCenterOrigin =
1495
+ (this.originX !== CENTER || this.originY !== CENTER) &&
1496
+ this.centeredRotation;
1497
+
1498
+ if (shouldCenterOrigin) {
1499
+ this._setOriginToCenter();
1500
+ }
1501
+
1502
+ this.set('angle', angle);
1503
+
1504
+ if (shouldCenterOrigin) {
1505
+ this._resetOrigin();
1506
+ }
1507
+ }
1508
+
1509
+ /**
1510
+ * This callback function is called by the parent group of an object every
1511
+ * time a non-delegated property changes on the group. It is passed the key
1512
+ * and value as parameters. Not adding in this function's signature to avoid
1513
+ * Travis build error about unused variables.
1514
+ */
1515
+ setOnGroup() {
1516
+ // implemented by sub-classes, as needed.
1517
+ }
1518
+
1519
+ /**
1520
+ * Sets canvas globalCompositeOperation for specific object
1521
+ * custom composition operation for the particular object can be specified using globalCompositeOperation property
1522
+ * @param {CanvasRenderingContext2D} ctx Rendering canvas context
1523
+ */
1524
+ _setupCompositeOperation(ctx: CanvasRenderingContext2D) {
1525
+ if (this.globalCompositeOperation) {
1526
+ ctx.globalCompositeOperation = this.globalCompositeOperation;
1527
+ }
1528
+ }
1529
+
1530
+ /**
1531
+ * cancel instance's running animations
1532
+ * override if necessary to dispose artifacts such as `clipPath`
1533
+ */
1534
+ dispose() {
1535
+ runningAnimations.cancelByTarget(this);
1536
+ this.off();
1537
+ this._set('canvas', undefined);
1538
+ // clear caches
1539
+ this._cacheCanvas && getEnv().dispose(this._cacheCanvas);
1540
+ this._cacheCanvas = undefined;
1541
+ this._cacheContext = null;
1542
+ }
1543
+
1544
+ /**
1545
+ *
1546
+ * @param {Function} klass
1547
+ * @param {object} object
1548
+ * @param {object} [options]
1549
+ * @param {string} [options.extraParam] property to pass as first argument to the constructor
1550
+ * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal
1551
+ * @returns {Promise<FabricObject>}
1552
+ */
1553
+ static _fromObject<S extends FabricObject>(
1554
+ object: Record<string, unknown>,
1555
+ { extraParam, ...options }: Abortable & { extraParam?: string } = {}
1556
+ ): Promise<S> {
1557
+ return enlivenObjectEnlivables<any>(cloneDeep(object), options).then(
1558
+ (enlivedMap) => {
1559
+ const allOptions = { ...options, ...enlivedMap };
1560
+ // from the resulting enlived options, extract options.extraParam to arg0
1561
+ // to avoid accidental overrides later
1562
+ if (extraParam) {
1563
+ const { [extraParam]: arg0, type, ...rest } = allOptions;
1564
+ // @ts-expect-error different signature
1565
+ return new this(arg0, rest);
1566
+ } else {
1567
+ return new this(allOptions);
1568
+ }
1569
+ }
1570
+ ) as Promise<S>;
1571
+ }
1572
+
1573
+ /**
1574
+ *
1575
+ * @param {object} object
1576
+ * @param {object} [options]
1577
+ * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal
1578
+ * @returns {Promise<FabricObject>}
1579
+ */
1580
+ static fromObject<T extends TProps<SerializedObjectProps>>(
1581
+ object: T,
1582
+ options?: Abortable
1583
+ ) {
1584
+ return this._fromObject(object, options);
1585
+ }
1586
+ }
1587
+
1588
+ classRegistry.setClass(FabricObject);
1589
+ classRegistry.setClass(FabricObject, 'object');