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,848 @@
1
+ // @ts-nocheck
2
+ import { getFabricDocument, getEnv } from '../env';
3
+ import type { BaseFilter } from '../filters/BaseFilter';
4
+ import { getFilterBackend } from '../filters/FilterBackend';
5
+ import { SHARED_ATTRIBUTES } from '../parser/attributes';
6
+ import { parseAttributes } from '../parser/parseAttributes';
7
+ import type { TClassProperties, TSize } from '../typedefs';
8
+ import type { Abortable } from '../typedefs';
9
+ import { uid } from '../util/internals/uid';
10
+ import { createCanvasElement } from '../util/misc/dom';
11
+ import { findScaleToCover, findScaleToFit } from '../util/misc/findScaleTo';
12
+ import type { LoadImageOptions } from '../util/misc/objectEnlive';
13
+ import {
14
+ enlivenObjectEnlivables,
15
+ enlivenObjects,
16
+ loadImage,
17
+ } from '../util/misc/objectEnlive';
18
+ import { parsePreserveAspectRatioAttribute } from '../util/misc/svgParsing';
19
+ import { classRegistry } from '../ClassRegistry';
20
+ import { FabricObject, cacheProperties } from './Object/FabricObject';
21
+ import type {
22
+ FabricObjectProps,
23
+ SerializedObjectProps,
24
+ TProps,
25
+ } from './Object/types';
26
+ import type { ObjectEvents } from '../EventTypeDefs';
27
+ import { WebGLFilterBackend } from '../filters/WebGLFilterBackend';
28
+ import { NONE } from '../constants';
29
+
30
+ // @todo Would be nice to have filtering code not imported directly.
31
+
32
+ export type ImageSource =
33
+ | HTMLImageElement
34
+ | HTMLVideoElement
35
+ | HTMLCanvasElement;
36
+
37
+ interface UniqueImageProps {
38
+ srcFromAttribute: boolean;
39
+ minimumScaleTrigger: number;
40
+ cropX: number;
41
+ cropY: number;
42
+ imageSmoothing: boolean;
43
+ crossOrigin: string | null;
44
+ filters: BaseFilter[];
45
+ resizeFilter?: BaseFilter;
46
+ }
47
+
48
+ export const imageDefaultValues: Partial<UniqueImageProps> &
49
+ Partial<FabricObjectProps> = {
50
+ strokeWidth: 0,
51
+ srcFromAttribute: false,
52
+ minimumScaleTrigger: 0.5,
53
+ cropX: 0,
54
+ cropY: 0,
55
+ imageSmoothing: true,
56
+ };
57
+
58
+ export interface SerializedImageProps extends SerializedObjectProps {
59
+ src: string;
60
+ crossOrigin: string | null;
61
+ filters: any[];
62
+ resizeFilter?: any;
63
+ cropX: number;
64
+ cropY: number;
65
+ }
66
+
67
+ export interface ImageProps extends FabricObjectProps, UniqueImageProps {}
68
+
69
+ const IMAGE_PROPS = ['cropX', 'cropY'] as const;
70
+
71
+ /**
72
+ * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#images}
73
+ */
74
+ export class Image<
75
+ Props extends TProps<ImageProps> = Partial<ImageProps>,
76
+ SProps extends SerializedImageProps = SerializedImageProps,
77
+ EventSpec extends ObjectEvents = ObjectEvents
78
+ >
79
+ extends FabricObject<Props, SProps, EventSpec>
80
+ implements ImageProps
81
+ {
82
+ /**
83
+ * When calling {@link Image.getSrc}, return value from element src with `element.getAttribute('src')`.
84
+ * This allows for relative urls as image src.
85
+ * @since 2.7.0
86
+ * @type Boolean
87
+ * @default false
88
+ */
89
+ declare srcFromAttribute: boolean;
90
+
91
+ /**
92
+ * private
93
+ * contains last value of scaleX to detect
94
+ * if the Image got resized after the last Render
95
+ * @type Number
96
+ */
97
+ protected _lastScaleX = 1;
98
+
99
+ /**
100
+ * private
101
+ * contains last value of scaleY to detect
102
+ * if the Image got resized after the last Render
103
+ * @type Number
104
+ */
105
+ protected _lastScaleY = 1;
106
+
107
+ /**
108
+ * private
109
+ * contains last value of scaling applied by the apply filter chain
110
+ * @type Number
111
+ */
112
+ protected _filterScalingX = 1;
113
+
114
+ /**
115
+ * private
116
+ * contains last value of scaling applied by the apply filter chain
117
+ * @type Number
118
+ */
119
+ protected _filterScalingY = 1;
120
+
121
+ /**
122
+ * minimum scale factor under which any resizeFilter is triggered to resize the image
123
+ * 0 will disable the automatic resize. 1 will trigger automatically always.
124
+ * number bigger than 1 are not implemented yet.
125
+ * @type Number
126
+ */
127
+ declare minimumScaleTrigger: number;
128
+
129
+ /**
130
+ * key used to retrieve the texture representing this image
131
+ * @since 2.0.0
132
+ * @type String
133
+ * @default
134
+ */
135
+ declare cacheKey: string;
136
+
137
+ /**
138
+ * Image crop in pixels from original image size.
139
+ * @since 2.0.0
140
+ * @type Number
141
+ * @default
142
+ */
143
+ declare cropX: number;
144
+
145
+ /**
146
+ * Image crop in pixels from original image size.
147
+ * @since 2.0.0
148
+ * @type Number
149
+ * @default
150
+ */
151
+ declare cropY: number;
152
+
153
+ /**
154
+ * Indicates whether this canvas will use image smoothing when painting this image.
155
+ * Also influence if the cacheCanvas for this image uses imageSmoothing
156
+ * @since 4.0.0-beta.11
157
+ * @type Boolean
158
+ * @default
159
+ */
160
+ declare imageSmoothing: boolean;
161
+
162
+ declare preserveAspectRatio: string;
163
+
164
+ protected declare src: string;
165
+
166
+ declare filters: BaseFilter[];
167
+ declare resizeFilter: BaseFilter;
168
+
169
+ protected declare _element: ImageSource;
170
+ protected declare _originalElement: ImageSource;
171
+ protected declare _filteredEl: ImageSource;
172
+
173
+ static type = 'Image';
174
+
175
+ static cacheProperties = [...cacheProperties, ...IMAGE_PROPS];
176
+
177
+ static ownDefaults: Record<string, any> = imageDefaultValues;
178
+
179
+ static getDefaults() {
180
+ return {
181
+ ...super.getDefaults(),
182
+ ...Image.ownDefaults,
183
+ };
184
+ }
185
+ /**
186
+ * Constructor
187
+ * Image can be initialized with any canvas drawable or a string.
188
+ * The string should be a url and will be loaded as an image.
189
+ * Canvas and Image element work out of the box, while videos require extra code to work.
190
+ * Please check video element events for seeking.
191
+ * @param {ImageSource | string} element Image element
192
+ * @param {Object} [options] Options object
193
+ */
194
+ constructor(elementId: string, options?: Props);
195
+ constructor(element: ImageSource, options?: Props);
196
+ constructor(arg0: ImageSource | string, options: Props = {} as Props) {
197
+ super({ filters: [], ...options });
198
+ this.cacheKey = `texture${uid()}`;
199
+ this.setElement(
200
+ typeof arg0 === 'string'
201
+ ? ((
202
+ (this.canvas && getElementDocument(this.canvas.getElement())) ||
203
+ getFabricDocument()
204
+ ).getElementById(arg0) as ImageSource)
205
+ : arg0,
206
+ options
207
+ );
208
+ }
209
+
210
+ /**
211
+ * Returns image element which this instance if based on
212
+ */
213
+ getElement() {
214
+ return this._element;
215
+ }
216
+
217
+ /**
218
+ * Sets image element for this instance to a specified one.
219
+ * If filters defined they are applied to new image.
220
+ * You might need to call `canvas.renderAll` and `object.setCoords` after replacing, to render new image and update controls area.
221
+ * @param {HTMLImageElement} element
222
+ * @param {Partial<TSize>} [size] Options object
223
+ */
224
+ setElement(element: ImageSource, size: Partial<TSize> = {}) {
225
+ this.removeTexture(this.cacheKey);
226
+ this.removeTexture(`${this.cacheKey}_filtered`);
227
+ this._element = element;
228
+ this._originalElement = element;
229
+ this._setWidthHeight(size);
230
+ element.classList.add(Image.CSS_CANVAS);
231
+ if (this.filters.length !== 0) {
232
+ this.applyFilters();
233
+ }
234
+ // resizeFilters work on the already filtered copy.
235
+ // we need to apply resizeFilters AFTER normal filters.
236
+ // applyResizeFilters is run more often than normal filters
237
+ // and is triggered by user interactions rather than dev code
238
+ if (this.resizeFilter) {
239
+ this.applyResizeFilters();
240
+ }
241
+ }
242
+
243
+ /**
244
+ * Delete a single texture if in webgl mode
245
+ */
246
+ removeTexture(key: string) {
247
+ const backend = getFilterBackend(false);
248
+ if (backend instanceof WebGLFilterBackend) {
249
+ backend.evictCachesForKey(key);
250
+ }
251
+ }
252
+
253
+ /**
254
+ * Delete textures, reference to elements and eventually JSDOM cleanup
255
+ */
256
+ dispose() {
257
+ super.dispose();
258
+ this.removeTexture(this.cacheKey);
259
+ this.removeTexture(`${this.cacheKey}_filtered`);
260
+ this._cacheContext = null;
261
+ (
262
+ ['_originalElement', '_element', '_filteredEl', '_cacheCanvas'] as const
263
+ ).forEach((elementKey) => {
264
+ const el = this[elementKey];
265
+ el && getEnv().dispose(el);
266
+ // @ts-expect-error disposing
267
+ this[elementKey] = undefined;
268
+ });
269
+ }
270
+
271
+ /**
272
+ * Get the crossOrigin value (of the corresponding image element)
273
+ */
274
+ getCrossOrigin(): string | null {
275
+ return (
276
+ this._originalElement &&
277
+ ((this._originalElement as any).crossOrigin || null)
278
+ );
279
+ }
280
+
281
+ /**
282
+ * Returns original size of an image
283
+ */
284
+ getOriginalSize() {
285
+ const element = this.getElement() as any;
286
+ if (!element) {
287
+ return {
288
+ width: 0,
289
+ height: 0,
290
+ };
291
+ }
292
+ return {
293
+ width: element.naturalWidth || element.width,
294
+ height: element.naturalHeight || element.height,
295
+ };
296
+ }
297
+
298
+ /**
299
+ * @private
300
+ * @param {CanvasRenderingContext2D} ctx Context to render on
301
+ */
302
+ _stroke(ctx: CanvasRenderingContext2D) {
303
+ if (!this.stroke || this.strokeWidth === 0) {
304
+ return;
305
+ }
306
+ const w = this.width / 2,
307
+ h = this.height / 2;
308
+ ctx.beginPath();
309
+ ctx.moveTo(-w, -h);
310
+ ctx.lineTo(w, -h);
311
+ ctx.lineTo(w, h);
312
+ ctx.lineTo(-w, h);
313
+ ctx.lineTo(-w, -h);
314
+ ctx.closePath();
315
+ }
316
+
317
+ /**
318
+ * Returns object representation of an instance
319
+ * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output
320
+ * @return {Object} Object representation of an instance
321
+ */
322
+ toObject<
323
+ T extends Omit<Props & TClassProperties<this>, keyof SProps>,
324
+ K extends keyof T = never
325
+ >(propertiesToInclude: K[] = []): Pick<T, K> & SProps {
326
+ const filters: Record<string, any>[] = [];
327
+ this.filters.forEach((filterObj) => {
328
+ filterObj && filters.push(filterObj.toObject());
329
+ });
330
+ return {
331
+ ...super.toObject([...IMAGE_PROPS, ...propertiesToInclude]),
332
+ src: this.getSrc(),
333
+ crossOrigin: this.getCrossOrigin(),
334
+ filters,
335
+ ...(this.resizeFilter
336
+ ? { resizeFilter: this.resizeFilter.toObject() }
337
+ : {}),
338
+ };
339
+ }
340
+
341
+ /**
342
+ * Returns true if an image has crop applied, inspecting values of cropX,cropY,width,height.
343
+ * @return {Boolean}
344
+ */
345
+ hasCrop() {
346
+ return (
347
+ !!this.cropX ||
348
+ !!this.cropY ||
349
+ this.width < this._element.width ||
350
+ this.height < this._element.height
351
+ );
352
+ }
353
+
354
+ /**
355
+ * Returns svg representation of an instance
356
+ * @return {string[]} an array of strings with the specific svg representation
357
+ * of the instance
358
+ */
359
+ _toSVG() {
360
+ const imageMarkup = [],
361
+ element = this._element,
362
+ x = -this.width / 2,
363
+ y = -this.height / 2;
364
+ let svgString = [],
365
+ strokeSvg,
366
+ clipPath = '',
367
+ imageRendering = '';
368
+ if (!element) {
369
+ return [];
370
+ }
371
+ if (this.hasCrop()) {
372
+ const clipPathId = uid();
373
+ svgString.push(
374
+ '<clipPath id="imageCrop_' + clipPathId + '">\n',
375
+ '\t<rect x="' +
376
+ x +
377
+ '" y="' +
378
+ y +
379
+ '" width="' +
380
+ this.width +
381
+ '" height="' +
382
+ this.height +
383
+ '" />\n',
384
+ '</clipPath>\n'
385
+ );
386
+ clipPath = ' clip-path="url(#imageCrop_' + clipPathId + ')" ';
387
+ }
388
+ if (!this.imageSmoothing) {
389
+ imageRendering = '" image-rendering="optimizeSpeed';
390
+ }
391
+ imageMarkup.push(
392
+ '\t<image ',
393
+ 'COMMON_PARTS',
394
+ 'xlink:href="',
395
+ this.getSvgSrc(true),
396
+ '" x="',
397
+ x - this.cropX,
398
+ '" y="',
399
+ y - this.cropY,
400
+ // we're essentially moving origin of transformation from top/left corner to the center of the shape
401
+ // by wrapping it in container <g> element with actual transformation, then offsetting object to the top/left
402
+ // so that object's center aligns with container's left/top
403
+ '" width="',
404
+ element.width || element.naturalWidth,
405
+ '" height="',
406
+ element.height || element.naturalHeight,
407
+ imageRendering,
408
+ '"',
409
+ clipPath,
410
+ '></image>\n'
411
+ );
412
+
413
+ if (this.stroke || this.strokeDashArray) {
414
+ const origFill = this.fill;
415
+ this.fill = null;
416
+ strokeSvg = [
417
+ '\t<rect ',
418
+ 'x="',
419
+ x,
420
+ '" y="',
421
+ y,
422
+ '" width="',
423
+ this.width,
424
+ '" height="',
425
+ this.height,
426
+ '" style="',
427
+ this.getSvgStyles(),
428
+ '"/>\n',
429
+ ];
430
+ this.fill = origFill;
431
+ }
432
+ if (this.paintFirst !== 'fill') {
433
+ svgString = svgString.concat(strokeSvg, imageMarkup);
434
+ } else {
435
+ svgString = svgString.concat(imageMarkup, strokeSvg);
436
+ }
437
+ return svgString;
438
+ }
439
+
440
+ /**
441
+ * Returns source of an image
442
+ * @param {Boolean} filtered indicates if the src is needed for svg
443
+ * @return {String} Source of an image
444
+ */
445
+ getSrc(filtered?: boolean): string {
446
+ const element = filtered ? this._element : this._originalElement;
447
+ if (element) {
448
+ if (element.toDataURL) {
449
+ return element.toDataURL();
450
+ }
451
+
452
+ if (this.srcFromAttribute) {
453
+ return element.getAttribute('src');
454
+ } else {
455
+ return element.src;
456
+ }
457
+ } else {
458
+ return this.src || '';
459
+ }
460
+ }
461
+
462
+ /**
463
+ * Alias for getSrc
464
+ * @param filtered
465
+ * @deprecated
466
+ */
467
+ getSvgSrc(filtered?: boolean) {
468
+ return this.getSrc(filtered);
469
+ }
470
+
471
+ /**
472
+ * Loads and sets source of an image\
473
+ * **IMPORTANT**: It is recommended to abort loading tasks before calling this method to prevent race conditions and unnecessary networking
474
+ * @param {String} src Source string (URL)
475
+ * @param {LoadImageOptions} [options] Options object
476
+ */
477
+ setSrc(src: string, { crossOrigin, signal }: LoadImageOptions = {}) {
478
+ return loadImage(src, { crossOrigin, signal }).then((img) => {
479
+ typeof crossOrigin !== 'undefined' && this.set({ crossOrigin });
480
+ this.setElement(img);
481
+ });
482
+ }
483
+
484
+ /**
485
+ * Returns string representation of an instance
486
+ * @return {String} String representation of an instance
487
+ */
488
+ toString() {
489
+ return `#<Image: { src: "${this.getSrc()}" }>`;
490
+ }
491
+
492
+ applyResizeFilters() {
493
+ const filter = this.resizeFilter,
494
+ minimumScale = this.minimumScaleTrigger,
495
+ objectScale = this.getTotalObjectScaling(),
496
+ scaleX = objectScale.x,
497
+ scaleY = objectScale.y,
498
+ elementToFilter = this._filteredEl || this._originalElement;
499
+ if (this.group) {
500
+ this.set('dirty', true);
501
+ }
502
+ if (!filter || (scaleX > minimumScale && scaleY > minimumScale)) {
503
+ this._element = elementToFilter;
504
+ this._filterScalingX = 1;
505
+ this._filterScalingY = 1;
506
+ this._lastScaleX = scaleX;
507
+ this._lastScaleY = scaleY;
508
+ return;
509
+ }
510
+ const canvasEl = createCanvasElement(),
511
+ sourceWidth = elementToFilter.width,
512
+ sourceHeight = elementToFilter.height;
513
+ canvasEl.width = sourceWidth;
514
+ canvasEl.height = sourceHeight;
515
+ this._element = canvasEl;
516
+ this._lastScaleX = filter.scaleX = scaleX;
517
+ this._lastScaleY = filter.scaleY = scaleY;
518
+ getFilterBackend().applyFilters(
519
+ [filter],
520
+ elementToFilter,
521
+ sourceWidth,
522
+ sourceHeight,
523
+ this._element
524
+ );
525
+ this._filterScalingX = canvasEl.width / this._originalElement.width;
526
+ this._filterScalingY = canvasEl.height / this._originalElement.height;
527
+ }
528
+
529
+ /**
530
+ * Applies filters assigned to this image (from "filters" array) or from filter param
531
+ * @method applyFilters
532
+ * @param {Array} filters to be applied
533
+ * @param {Boolean} forResizing specify if the filter operation is a resize operation
534
+ */
535
+ applyFilters(filters: BaseFilter[] = this.filters || []) {
536
+ filters = filters.filter((filter) => filter && !filter.isNeutralState());
537
+ this.set('dirty', true);
538
+
539
+ // needs to clear out or WEBGL will not resize correctly
540
+ this.removeTexture(`${this.cacheKey}_filtered`);
541
+
542
+ if (filters.length === 0) {
543
+ this._element = this._originalElement;
544
+ this._filteredEl = null;
545
+ this._filterScalingX = 1;
546
+ this._filterScalingY = 1;
547
+ return;
548
+ }
549
+
550
+ const imgElement = this._originalElement,
551
+ sourceWidth = imgElement.naturalWidth || imgElement.width,
552
+ sourceHeight = imgElement.naturalHeight || imgElement.height;
553
+
554
+ if (this._element === this._originalElement) {
555
+ // if the element is the same we need to create a new element
556
+ const canvasEl = createCanvasElement();
557
+ canvasEl.width = sourceWidth;
558
+ canvasEl.height = sourceHeight;
559
+ this._element = canvasEl;
560
+ this._filteredEl = canvasEl;
561
+ } else {
562
+ // clear the existing element to get new filter data
563
+ // also dereference the eventual resized _element
564
+ this._element = this._filteredEl;
565
+ this._filteredEl
566
+ .getContext('2d')
567
+ .clearRect(0, 0, sourceWidth, sourceHeight);
568
+ // we also need to resize again at next renderAll, so remove saved _lastScaleX/Y
569
+ this._lastScaleX = 1;
570
+ this._lastScaleY = 1;
571
+ }
572
+ getFilterBackend().applyFilters(
573
+ filters,
574
+ this._originalElement,
575
+ sourceWidth,
576
+ sourceHeight,
577
+ this._element
578
+ );
579
+ if (
580
+ this._originalElement.width !== this._element.width ||
581
+ this._originalElement.height !== this._element.height
582
+ ) {
583
+ this._filterScalingX = this._element.width / this._originalElement.width;
584
+ this._filterScalingY =
585
+ this._element.height / this._originalElement.height;
586
+ }
587
+ }
588
+
589
+ /**
590
+ * @private
591
+ * @param {CanvasRenderingContext2D} ctx Context to render on
592
+ */
593
+ _render(ctx: CanvasRenderingContext2D) {
594
+ ctx.imageSmoothingEnabled = this.imageSmoothing;
595
+ if (this.isMoving !== true && this.resizeFilter && this._needsResize()) {
596
+ this.applyResizeFilters();
597
+ }
598
+ this._stroke(ctx);
599
+ this._renderPaintInOrder(ctx);
600
+ }
601
+
602
+ /**
603
+ * Paint the cached copy of the object on the target context.
604
+ * it will set the imageSmoothing for the draw operation
605
+ * @param {CanvasRenderingContext2D} ctx Context to render on
606
+ */
607
+ drawCacheOnCanvas(ctx: CanvasRenderingContext2D) {
608
+ ctx.imageSmoothingEnabled = this.imageSmoothing;
609
+ super.drawCacheOnCanvas(ctx);
610
+ }
611
+
612
+ /**
613
+ * Decide if the object should cache or not. Create its own cache level
614
+ * needsItsOwnCache should be used when the object drawing method requires
615
+ * a cache step. None of the fabric classes requires it.
616
+ * Generally you do not cache objects in groups because the group outside is cached.
617
+ * This is the special image version where we would like to avoid caching where possible.
618
+ * Essentially images do not benefit from caching. They may require caching, and in that
619
+ * case we do it. Also caching an image usually ends in a loss of details.
620
+ * A full performance audit should be done.
621
+ * @return {Boolean}
622
+ */
623
+ shouldCache() {
624
+ return this.needsItsOwnCache();
625
+ }
626
+
627
+ _renderFill(ctx: CanvasRenderingContext2D) {
628
+ const elementToDraw = this._element;
629
+ if (!elementToDraw) {
630
+ return;
631
+ }
632
+ const scaleX = this._filterScalingX,
633
+ scaleY = this._filterScalingY,
634
+ w = this.width,
635
+ h = this.height,
636
+ // crop values cannot be lesser than 0.
637
+ cropX = Math.max(this.cropX, 0),
638
+ cropY = Math.max(this.cropY, 0),
639
+ elWidth = elementToDraw.naturalWidth || elementToDraw.width,
640
+ elHeight = elementToDraw.naturalHeight || elementToDraw.height,
641
+ sX = cropX * scaleX,
642
+ sY = cropY * scaleY,
643
+ // the width height cannot exceed element width/height, starting from the crop offset.
644
+ sW = Math.min(w * scaleX, elWidth - sX),
645
+ sH = Math.min(h * scaleY, elHeight - sY),
646
+ x = -w / 2,
647
+ y = -h / 2,
648
+ maxDestW = Math.min(w, elWidth / scaleX - cropX),
649
+ maxDestH = Math.min(h, elHeight / scaleY - cropY);
650
+
651
+ elementToDraw &&
652
+ ctx.drawImage(elementToDraw, sX, sY, sW, sH, x, y, maxDestW, maxDestH);
653
+ }
654
+
655
+ /**
656
+ * needed to check if image needs resize
657
+ * @private
658
+ */
659
+ _needsResize() {
660
+ const scale = this.getTotalObjectScaling();
661
+ return scale.x !== this._lastScaleX || scale.y !== this._lastScaleY;
662
+ }
663
+
664
+ /**
665
+ * @private
666
+ * @deprecated unused
667
+ */
668
+ _resetWidthHeight() {
669
+ this.set(this.getOriginalSize());
670
+ }
671
+
672
+ /**
673
+ * @private
674
+ * Set the width and the height of the image object, using the element or the
675
+ * options.
676
+ */
677
+ _setWidthHeight({ width, height }: Partial<TSize> = {}) {
678
+ const size = this.getOriginalSize();
679
+ this.width = width || size.width;
680
+ this.height = height || size.height;
681
+ }
682
+
683
+ /**
684
+ * Calculate offset for center and scale factor for the image in order to respect
685
+ * the preserveAspectRatio attribute
686
+ * @private
687
+ */
688
+ parsePreserveAspectRatioAttribute() {
689
+ const pAR = parsePreserveAspectRatioAttribute(
690
+ this.preserveAspectRatio || ''
691
+ ),
692
+ pWidth = this.width,
693
+ pHeight = this.height,
694
+ parsedAttributes = { width: pWidth, height: pHeight };
695
+ let rWidth = this._element.width,
696
+ rHeight = this._element.height,
697
+ scaleX = 1,
698
+ scaleY = 1,
699
+ offsetLeft = 0,
700
+ offsetTop = 0,
701
+ cropX = 0,
702
+ cropY = 0,
703
+ offset;
704
+
705
+ if (pAR && (pAR.alignX !== NONE || pAR.alignY !== NONE)) {
706
+ if (pAR.meetOrSlice === 'meet') {
707
+ scaleX = scaleY = findScaleToFit(this._element, parsedAttributes);
708
+ offset = (pWidth - rWidth * scaleX) / 2;
709
+ if (pAR.alignX === 'Min') {
710
+ offsetLeft = -offset;
711
+ }
712
+ if (pAR.alignX === 'Max') {
713
+ offsetLeft = offset;
714
+ }
715
+ offset = (pHeight - rHeight * scaleY) / 2;
716
+ if (pAR.alignY === 'Min') {
717
+ offsetTop = -offset;
718
+ }
719
+ if (pAR.alignY === 'Max') {
720
+ offsetTop = offset;
721
+ }
722
+ }
723
+ if (pAR.meetOrSlice === 'slice') {
724
+ scaleX = scaleY = findScaleToCover(this._element, parsedAttributes);
725
+ offset = rWidth - pWidth / scaleX;
726
+ if (pAR.alignX === 'Mid') {
727
+ cropX = offset / 2;
728
+ }
729
+ if (pAR.alignX === 'Max') {
730
+ cropX = offset;
731
+ }
732
+ offset = rHeight - pHeight / scaleY;
733
+ if (pAR.alignY === 'Mid') {
734
+ cropY = offset / 2;
735
+ }
736
+ if (pAR.alignY === 'Max') {
737
+ cropY = offset;
738
+ }
739
+ rWidth = pWidth / scaleX;
740
+ rHeight = pHeight / scaleY;
741
+ }
742
+ } else {
743
+ scaleX = pWidth / rWidth;
744
+ scaleY = pHeight / rHeight;
745
+ }
746
+ return {
747
+ width: rWidth,
748
+ height: rHeight,
749
+ scaleX,
750
+ scaleY,
751
+ offsetLeft,
752
+ offsetTop,
753
+ cropX,
754
+ cropY,
755
+ };
756
+ }
757
+
758
+ /**
759
+ * Default CSS class name for canvas
760
+ * @static
761
+ * @type String
762
+ * @default
763
+ */
764
+ static CSS_CANVAS = 'canvas-img';
765
+
766
+ /**
767
+ * List of attribute names to account for when parsing SVG element (used by {@link Image.fromElement})
768
+ * @static
769
+ * @see {@link http://www.w3.org/TR/SVG/struct.html#ImageElement}
770
+ */
771
+ static ATTRIBUTE_NAMES = [
772
+ ...SHARED_ATTRIBUTES,
773
+ 'x',
774
+ 'y',
775
+ 'width',
776
+ 'height',
777
+ 'preserveAspectRatio',
778
+ 'xlink:href',
779
+ 'crossOrigin',
780
+ 'image-rendering',
781
+ ];
782
+
783
+ /**
784
+ * Creates an instance of Image from its object representation
785
+ * @static
786
+ * @param {Object} object Object to create an instance from
787
+ * @param {object} [options] Options object
788
+ * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal
789
+ * @returns {Promise<Image>}
790
+ */
791
+ static fromObject<T extends TProps<SerializedImageProps>>(
792
+ { filters: f, resizeFilter: rf, src, crossOrigin, ...object }: T,
793
+ options: Abortable = {}
794
+ ) {
795
+ return Promise.all([
796
+ loadImage(src, { ...options, crossOrigin }),
797
+ f && enlivenObjects(f, options),
798
+ // TODO: redundant - handled by enlivenObjectEnlivables
799
+ rf && enlivenObjects([rf], options),
800
+ enlivenObjectEnlivables(object, options),
801
+ ]).then(([el, filters = [], [resizeFilter] = [], hydratedProps = {}]) => {
802
+ return new this(el, {
803
+ ...object,
804
+ src,
805
+ crossOrigin,
806
+ filters,
807
+ resizeFilter,
808
+ ...hydratedProps,
809
+ });
810
+ });
811
+ }
812
+
813
+ /**
814
+ * Creates an instance of Image from an URL string
815
+ * @static
816
+ * @param {String} url URL to create an image from
817
+ * @param {LoadImageOptions} [options] Options object
818
+ * @returns {Promise<Image>}
819
+ */
820
+ static fromURL<T extends TProps<SerializedImageProps>>(
821
+ url: string,
822
+ options: T & LoadImageOptions = {}
823
+ ): Promise<Image> {
824
+ return loadImage(url, options).then((img) => new this(img, options));
825
+ }
826
+
827
+ /**
828
+ * Returns {@link Image} instance from an SVG element
829
+ * @static
830
+ * @param {SVGElement} element Element to parse
831
+ * @param {Object} [options] Options object
832
+ * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal
833
+ * @param {Function} callback Callback to execute when Image object is created
834
+ */
835
+ static async fromElement(element: SVGElement, options: Abortable = {}) {
836
+ const parsedAttributes = parseAttributes(element, this.ATTRIBUTE_NAMES);
837
+ return this.fromURL(parsedAttributes['xlink:href'], {
838
+ ...options,
839
+ ...parsedAttributes,
840
+ }).catch((err) => {
841
+ console.log(err);
842
+ return null;
843
+ });
844
+ }
845
+ }
846
+
847
+ classRegistry.setClass(Image);
848
+ classRegistry.setSVGClass(Image);