fabric 5.3.0 → 6.0.0-beta1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (533) hide show
  1. package/.babelrc +11 -0
  2. package/.babelrcAlt +19 -0
  3. package/.browserslistrc +5 -0
  4. package/.eslintrc.js +43 -0
  5. package/.eslintrc.json +38 -46
  6. package/.eslintrc_tests +12 -0
  7. package/.gitattributes +2 -0
  8. package/.prettierignore +16 -0
  9. package/.prettierrc +4 -0
  10. package/CHANGELOG.md +491 -189
  11. package/CONTRIBUTING.md +226 -58
  12. package/README.md +188 -239
  13. package/bower.json +1 -3
  14. package/dist/fabric.d.ts +1021 -0
  15. package/dist/index.cjs +28027 -0
  16. package/dist/index.cjs.map +1 -0
  17. package/dist/index.d.ts +2 -0
  18. package/dist/index.min.js +1 -0
  19. package/dist/index.mjs +27964 -0
  20. package/dist/index.mjs.map +1 -0
  21. package/dist/index.node.cjs +28092 -0
  22. package/dist/index.node.cjs.map +1 -0
  23. package/dist/index.node.d.ts +15 -0
  24. package/dist/index.node.mjs +28035 -0
  25. package/dist/index.node.mjs.map +1 -0
  26. package/dist/src/Collection.d.ts +126 -0
  27. package/dist/src/CommonMethods.d.ts +32 -0
  28. package/dist/src/EventTypeDefs.d.ts +226 -0
  29. package/dist/src/Intersection.d.ts +100 -0
  30. package/dist/src/Observable.d.ts +54 -0
  31. package/dist/src/Pattern.d.ts +104 -0
  32. package/dist/src/Point.d.ts +232 -0
  33. package/dist/src/Shadow.d.ts +87 -0
  34. package/dist/src/brushes/BaseBrush.d.ts +105 -0
  35. package/dist/src/brushes/CircleBrush.d.ts +49 -0
  36. package/dist/src/brushes/PatternBrush.d.ts +23 -0
  37. package/dist/src/brushes/PencilBrush.d.ts +92 -0
  38. package/dist/src/brushes/SprayBrush.d.ts +79 -0
  39. package/dist/src/cache.d.ts +46 -0
  40. package/dist/src/canvas/Canvas.d.ts +567 -0
  41. package/dist/src/canvas/SelectableCanvas.d.ts +723 -0
  42. package/dist/src/canvas/StaticCanvas.d.ts +751 -0
  43. package/dist/src/canvas/TextEditingManager.d.ts +17 -0
  44. package/dist/src/canvas/canvas_gestures.mixin.d.ts +2 -0
  45. package/dist/src/color/Color.d.ts +174 -0
  46. package/dist/src/color/color_map.d.ts +155 -0
  47. package/dist/src/color/constants.d.ts +22 -0
  48. package/dist/src/color/util.d.ts +12 -0
  49. package/dist/src/config.d.ts +115 -0
  50. package/dist/src/constants.d.ts +14 -0
  51. package/dist/src/controls/Control.d.ts +228 -0
  52. package/dist/src/controls/changeWidth.d.ts +13 -0
  53. package/dist/src/controls/controls.render.d.ts +29 -0
  54. package/dist/src/controls/default_controls.d.ts +50 -0
  55. package/dist/src/controls/drag.d.ts +12 -0
  56. package/dist/src/controls/polyControl.d.ts +5 -0
  57. package/dist/src/controls/rotate.d.ts +12 -0
  58. package/dist/src/controls/scale.d.ts +47 -0
  59. package/dist/src/controls/scaleSkew.d.ts +39 -0
  60. package/dist/src/controls/skew.d.ts +33 -0
  61. package/dist/src/controls/util.d.ts +41 -0
  62. package/dist/src/controls/wrapWithFireEvent.d.ts +8 -0
  63. package/dist/src/controls/wrapWithFixedAnchor.d.ts +9 -0
  64. package/dist/src/env/browser.d.ts +3 -0
  65. package/dist/src/env/index.d.ts +7 -0
  66. package/dist/src/env/node.d.ts +3 -0
  67. package/dist/src/env/types.d.ts +15 -0
  68. package/dist/src/filters/BaseFilter.d.ts +156 -0
  69. package/dist/src/filters/BlendColor.d.ts +80 -0
  70. package/dist/src/filters/BlendImage.d.ts +90 -0
  71. package/dist/src/filters/Blur.d.ts +50 -0
  72. package/dist/src/filters/Boilerplate.d.ts +46 -0
  73. package/dist/src/filters/Brightness.d.ts +46 -0
  74. package/dist/src/filters/Canvas2dFilterBackend.d.ts +27 -0
  75. package/dist/src/filters/ColorMatrix.d.ts +62 -0
  76. package/dist/src/filters/ColorMatrixFilters.d.ts +1169 -0
  77. package/dist/src/filters/Composed.d.ts +47 -0
  78. package/dist/src/filters/Contrast.d.ts +44 -0
  79. package/dist/src/filters/Convolute.d.ts +82 -0
  80. package/dist/src/filters/FilterBackend.d.ts +14 -0
  81. package/dist/src/filters/Gamma.d.ts +53 -0
  82. package/dist/src/filters/Grayscale.d.ts +45 -0
  83. package/dist/src/filters/HueRotation.d.ts +24 -0
  84. package/dist/src/filters/Invert.d.ts +54 -0
  85. package/dist/src/filters/Noise.d.ts +53 -0
  86. package/dist/src/filters/Pixelate.d.ts +43 -0
  87. package/dist/src/filters/RemoveColor.d.ts +62 -0
  88. package/dist/src/filters/Resize.d.ts +134 -0
  89. package/dist/src/filters/Saturation.d.ts +47 -0
  90. package/dist/src/filters/Vibrance.d.ts +47 -0
  91. package/dist/src/filters/WebGLFilterBackend.d.ts +126 -0
  92. package/dist/src/filters/WebGLProbe.d.ts +28 -0
  93. package/dist/src/filters/typedefs.d.ts +49 -0
  94. package/dist/src/gradient/Gradient.d.ts +149 -0
  95. package/dist/src/gradient/constants.d.ts +15 -0
  96. package/dist/src/gradient/parser/index.d.ts +4 -0
  97. package/dist/src/gradient/parser/misc.d.ts +4 -0
  98. package/dist/src/gradient/parser/parseColorStops.d.ts +6 -0
  99. package/dist/src/gradient/parser/parseCoords.d.ts +17 -0
  100. package/dist/src/gradient/typedefs.d.ts +93 -0
  101. package/dist/src/mixins/eraser_brush.mixin.d.ts +2 -0
  102. package/dist/src/mixins/stateful.mixin.d.ts +18 -0
  103. package/dist/src/parkinglot/canvas_animation.mixin.d.ts +2 -0
  104. package/dist/src/parkinglot/straighten.d.ts +2 -0
  105. package/dist/src/parser/applyViewboxTransform.d.ts +5 -0
  106. package/dist/src/parser/attributes.d.ts +6 -0
  107. package/dist/src/parser/constants.d.ts +54 -0
  108. package/dist/src/parser/doesSomeParentMatch.d.ts +2 -0
  109. package/dist/src/parser/elementById.d.ts +6 -0
  110. package/dist/src/parser/elementMatchesRule.d.ts +5 -0
  111. package/dist/src/parser/elements_parser.d.ts +3 -0
  112. package/dist/src/parser/getCSSRules.d.ts +7 -0
  113. package/dist/src/parser/getGlobalStylesForElement.d.ts +5 -0
  114. package/dist/src/parser/getGradientDefs.d.ts +7 -0
  115. package/dist/src/parser/getMultipleNodes.d.ts +2 -0
  116. package/dist/src/parser/getSvgRegex.d.ts +2 -0
  117. package/dist/src/parser/hasAncestorWithNodeName.d.ts +2 -0
  118. package/dist/src/parser/loadSVGFromString.d.ts +12 -0
  119. package/dist/src/parser/loadSVGFromURL.d.ts +13 -0
  120. package/dist/src/parser/normalizeAttr.d.ts +2 -0
  121. package/dist/src/parser/normalizeValue.d.ts +2 -0
  122. package/dist/src/parser/parseAttributes.d.ts +9 -0
  123. package/dist/src/parser/parseElements.d.ts +11 -0
  124. package/dist/src/parser/parseFontDeclaration.d.ts +10 -0
  125. package/dist/src/parser/parsePointsAttribute.d.ts +12 -0
  126. package/dist/src/parser/parseSVGDocument.d.ts +15 -0
  127. package/dist/src/parser/parseStyleAttribute.d.ts +9 -0
  128. package/dist/src/parser/parseStyleObject.d.ts +2 -0
  129. package/dist/src/parser/parseStyleString.d.ts +2 -0
  130. package/dist/src/parser/parseTransformAttribute.d.ts +10 -0
  131. package/dist/src/parser/parseUseDirectives.d.ts +2 -0
  132. package/dist/src/parser/percent.d.ts +9 -0
  133. package/dist/src/parser/recursivelyParseGradientsXlink.d.ts +2 -0
  134. package/dist/src/parser/rotateMatrix.d.ts +2 -0
  135. package/dist/src/parser/scaleMatrix.d.ts +2 -0
  136. package/dist/src/parser/selectorMatches.d.ts +2 -0
  137. package/dist/src/parser/setStrokeFillOpacity.d.ts +6 -0
  138. package/dist/src/parser/skewMatrix.d.ts +2 -0
  139. package/dist/src/parser/translateMatrix.d.ts +2 -0
  140. package/dist/src/shapes/ActiveSelection.d.ts +66 -0
  141. package/dist/src/shapes/Circle.d.ts +80 -0
  142. package/dist/src/shapes/Ellipse.d.ts +74 -0
  143. package/dist/src/shapes/Group.d.ts +381 -0
  144. package/dist/src/shapes/IText/DraggableTextDelegate.d.ts +78 -0
  145. package/dist/src/shapes/IText/IText.d.ts +322 -0
  146. package/dist/src/shapes/IText/ITextBehavior.d.ts +285 -0
  147. package/dist/src/shapes/IText/ITextClickBehavior.d.ts +81 -0
  148. package/dist/src/shapes/IText/ITextKeyBehavior.d.ts +193 -0
  149. package/dist/src/shapes/IText/constants.d.ts +13 -0
  150. package/dist/src/shapes/Image.d.ts +283 -0
  151. package/dist/src/shapes/Line.d.ts +117 -0
  152. package/dist/src/shapes/Object/AnimatableObject.d.ts +33 -0
  153. package/dist/src/shapes/Object/FabricObject.d.ts +9 -0
  154. package/dist/src/shapes/Object/FabricObjectSVGExportMixin.d.ts +74 -0
  155. package/dist/src/shapes/Object/InteractiveObject.d.ts +282 -0
  156. package/dist/src/shapes/Object/Object.d.ts +906 -0
  157. package/dist/src/shapes/Object/ObjectGeometry.d.ts +343 -0
  158. package/dist/src/shapes/Object/ObjectOrigin.d.ts +178 -0
  159. package/dist/src/shapes/Object/StackedObject.d.ts +62 -0
  160. package/dist/src/shapes/Object/defaultValues.d.ts +77 -0
  161. package/dist/src/shapes/Path.d.ts +123 -0
  162. package/dist/src/shapes/Polygon.d.ts +7 -0
  163. package/dist/src/shapes/Polyline.d.ts +130 -0
  164. package/dist/src/shapes/Rect.d.ts +62 -0
  165. package/dist/src/shapes/Text/StyledText.d.ts +118 -0
  166. package/dist/src/shapes/Text/Text.d.ts +656 -0
  167. package/dist/src/shapes/Text/TextSVGExportMixin.d.ts +32 -0
  168. package/dist/src/shapes/Textbox.d.ts +170 -0
  169. package/dist/src/shapes/Triangle.d.ts +17 -0
  170. package/dist/src/typedefs.d.ts +93 -0
  171. package/dist/src/util/animation/AnimationBase.d.ts +54 -0
  172. package/dist/src/util/animation/AnimationFrameProvider.d.ts +8 -0
  173. package/dist/src/util/animation/AnimationRegistry.d.ts +29 -0
  174. package/dist/src/util/animation/ArrayAnimation.d.ts +10 -0
  175. package/dist/src/util/animation/ColorAnimation.d.ts +11 -0
  176. package/dist/src/util/animation/ValueAnimation.d.ts +10 -0
  177. package/dist/src/util/animation/animate.d.ts +37 -0
  178. package/dist/src/util/animation/easing.d.ts +130 -0
  179. package/dist/src/util/animation/types.d.ts +87 -0
  180. package/dist/src/util/applyMixins.d.ts +8 -0
  181. package/dist/src/util/class_registry.d.ts +14 -0
  182. package/dist/src/util/dom_event.d.ts +5 -0
  183. package/dist/src/util/dom_misc.d.ts +40 -0
  184. package/dist/src/util/dom_request.d.ts +14 -0
  185. package/dist/src/util/dom_style.d.ts +7 -0
  186. package/dist/src/util/fireEvent.d.ts +3 -0
  187. package/dist/src/util/internals/cloneDeep.d.ts +2 -0
  188. package/dist/src/util/internals/getRandomInt.d.ts +8 -0
  189. package/dist/src/util/internals/ifNaN.d.ts +8 -0
  190. package/dist/src/util/internals/index.d.ts +4 -0
  191. package/dist/src/util/internals/removeFromArray.d.ts +9 -0
  192. package/dist/src/util/internals/uid.d.ts +2 -0
  193. package/dist/src/util/lang_class.d.ts +12 -0
  194. package/dist/src/util/lang_string.d.ts +22 -0
  195. package/dist/src/util/misc/boundingBoxFromPoints.d.ts +9 -0
  196. package/dist/src/util/misc/capValue.d.ts +2 -0
  197. package/dist/src/util/misc/cos.d.ts +10 -0
  198. package/dist/src/util/misc/dom.d.ts +28 -0
  199. package/dist/src/util/misc/findScaleTo.d.ts +29 -0
  200. package/dist/src/util/misc/groupSVGElements.d.ts +9 -0
  201. package/dist/src/util/misc/isTransparent.d.ts +11 -0
  202. package/dist/src/util/misc/matrix.d.ts +92 -0
  203. package/dist/src/util/misc/mergeClipPaths.d.ts +23 -0
  204. package/dist/src/util/misc/objectEnlive.d.ts +56 -0
  205. package/dist/src/util/misc/objectTransforms.d.ts +68 -0
  206. package/dist/src/util/misc/pick.d.ts +8 -0
  207. package/dist/src/util/misc/planeChange.d.ts +84 -0
  208. package/dist/src/util/misc/projectStroke/StrokeLineCapProjections.d.ts +51 -0
  209. package/dist/src/util/misc/projectStroke/StrokeLineJoinProjections.d.ts +81 -0
  210. package/dist/src/util/misc/projectStroke/StrokeProjectionsBase.d.ts +25 -0
  211. package/dist/src/util/misc/projectStroke/index.d.ts +11 -0
  212. package/dist/src/util/misc/projectStroke/types.d.ts +23 -0
  213. package/dist/src/util/misc/radiansDegreesConversion.d.ts +14 -0
  214. package/dist/src/util/misc/resolveOrigin.d.ts +9 -0
  215. package/dist/src/util/misc/rotatePoint.d.ts +12 -0
  216. package/dist/src/util/misc/sin.d.ts +10 -0
  217. package/dist/src/util/misc/svgParsing.d.ts +53 -0
  218. package/dist/src/util/misc/textStyles.d.ts +32 -0
  219. package/dist/src/util/misc/toFixed.d.ts +8 -0
  220. package/dist/src/util/misc/vectors.d.ts +57 -0
  221. package/dist/src/util/path.d.ts +108 -0
  222. package/dist/src/util/transform_matrix_removal.d.ts +14 -0
  223. package/dist/src/util/types.d.ts +19 -0
  224. package/fabric.ts +427 -0
  225. package/index.node.ts +43 -0
  226. package/index.ts +1 -0
  227. package/package.json +90 -39
  228. package/publish.js +0 -26
  229. package/rollup.config.mjs +79 -0
  230. package/rollup.test.config.js +24 -0
  231. package/scripts/build.mjs +50 -0
  232. package/scripts/buildLock.mjs +115 -0
  233. package/scripts/buildReporter.mjs +15 -0
  234. package/scripts/buildStats.mjs +139 -0
  235. package/scripts/dirname.mjs +14 -0
  236. package/scripts/index.mjs +679 -0
  237. package/scripts/transform_files.mjs +504 -0
  238. package/src/Collection.ts +311 -0
  239. package/src/CommonMethods.ts +63 -0
  240. package/src/EventTypeDefs.ts +294 -0
  241. package/src/Intersection.ts +273 -0
  242. package/src/Observable.ts +175 -0
  243. package/src/Pattern.ts +211 -0
  244. package/src/Point.ts +388 -0
  245. package/src/Shadow.ts +215 -0
  246. package/src/brushes/{base_brush.class.js → BaseBrush.ts} +65 -42
  247. package/src/brushes/CircleBrush.ts +145 -0
  248. package/src/brushes/PatternBrush.ts +70 -0
  249. package/src/brushes/PencilBrush.ts +300 -0
  250. package/src/brushes/SprayBrush.ts +219 -0
  251. package/src/cache.ts +89 -0
  252. package/src/canvas/Canvas.ts +1672 -0
  253. package/src/canvas/SelectableCanvas.ts +1636 -0
  254. package/src/canvas/StaticCanvas.ts +1709 -0
  255. package/src/canvas/TextEditingManager.ts +48 -0
  256. package/src/canvas/canvas_gestures.mixin.ts +207 -0
  257. package/src/color/Color.ts +404 -0
  258. package/src/color/color_map.ts +154 -0
  259. package/src/color/constants.ts +26 -0
  260. package/src/color/util.ts +32 -0
  261. package/src/config.ts +159 -0
  262. package/src/constants.ts +19 -0
  263. package/src/controls/Control.ts +377 -0
  264. package/src/controls/changeWidth.ts +52 -0
  265. package/src/controls/controls.render.ts +138 -0
  266. package/src/controls/default_controls.ts +132 -0
  267. package/src/controls/drag.ts +31 -0
  268. package/src/controls/polyControl.ts +135 -0
  269. package/src/controls/rotate.ts +87 -0
  270. package/src/controls/scale.ts +277 -0
  271. package/src/controls/scaleSkew.ts +92 -0
  272. package/src/controls/skew.ts +242 -0
  273. package/src/controls/util.ts +154 -0
  274. package/src/controls/wrapWithFireEvent.ts +25 -0
  275. package/src/controls/wrapWithFixedAnchor.ts +20 -0
  276. package/src/env/browser.ts +28 -0
  277. package/src/env/index.ts +19 -0
  278. package/src/env/node.ts +52 -0
  279. package/src/env/types.ts +15 -0
  280. package/src/filters/{base_filter.class.js → BaseFilter.ts} +201 -149
  281. package/src/filters/BlendColor.ts +258 -0
  282. package/src/filters/BlendImage.ts +254 -0
  283. package/src/filters/Blur.ts +202 -0
  284. package/src/filters/Boilerplate.ts +91 -0
  285. package/src/filters/Brightness.ts +93 -0
  286. package/src/filters/Canvas2dFilterBackend.ts +65 -0
  287. package/src/filters/ColorMatrix.ts +156 -0
  288. package/src/filters/ColorMatrixFilters.ts +106 -0
  289. package/src/filters/Composed.ts +85 -0
  290. package/src/filters/Contrast.ts +94 -0
  291. package/src/filters/Convolute.ts +341 -0
  292. package/src/filters/FilterBackend.ts +32 -0
  293. package/src/filters/Gamma.ts +127 -0
  294. package/src/filters/Grayscale.ts +137 -0
  295. package/src/filters/HueRotation.ts +66 -0
  296. package/src/filters/Invert.ts +117 -0
  297. package/src/filters/Noise.ts +109 -0
  298. package/src/filters/Pixelate.ts +114 -0
  299. package/src/filters/RemoveColor.ts +148 -0
  300. package/src/filters/Resize.ts +540 -0
  301. package/src/filters/Saturation.ts +100 -0
  302. package/src/filters/Vibrance.ts +103 -0
  303. package/src/filters/WebGLFilterBackend.ts +430 -0
  304. package/src/filters/WebGLProbe.ts +62 -0
  305. package/src/filters/typedefs.ts +65 -0
  306. package/src/gradient/Gradient.ts +401 -0
  307. package/src/gradient/constants.ts +12 -0
  308. package/src/gradient/parser/index.ts +3 -0
  309. package/src/gradient/parser/misc.ts +13 -0
  310. package/src/gradient/parser/parseColorStops.ts +55 -0
  311. package/src/gradient/parser/parseCoords.ts +73 -0
  312. package/src/gradient/typedefs.ts +104 -0
  313. package/src/mixins/{eraser_brush.mixin.js → eraser_brush.mixin.ts} +350 -239
  314. package/src/mixins/stateful.mixin.ts +104 -0
  315. package/src/parkinglot/canvas_animation.mixin.ts +121 -0
  316. package/src/parkinglot/straighten.ts +58 -0
  317. package/src/parser/applyViewboxTransform.ts +162 -0
  318. package/src/parser/attributes.ts +25 -0
  319. package/src/parser/constants.ts +118 -0
  320. package/src/parser/doesSomeParentMatch.ts +19 -0
  321. package/src/parser/elementById.ts +23 -0
  322. package/src/parser/elementMatchesRule.ts +19 -0
  323. package/src/parser/elements_parser.ts +191 -0
  324. package/src/parser/getCSSRules.ts +62 -0
  325. package/src/parser/getGlobalStylesForElement.ts +19 -0
  326. package/src/parser/getGradientDefs.ts +32 -0
  327. package/src/parser/getMultipleNodes.ts +15 -0
  328. package/src/parser/getSvgRegex.ts +5 -0
  329. package/src/parser/hasAncestorWithNodeName.ts +14 -0
  330. package/src/parser/loadSVGFromString.ts +26 -0
  331. package/src/parser/loadSVGFromURL.ts +40 -0
  332. package/src/parser/normalizeAttr.ts +10 -0
  333. package/src/parser/normalizeValue.ts +63 -0
  334. package/src/parser/parseAttributes.ts +90 -0
  335. package/src/parser/parseElements.ts +28 -0
  336. package/src/parser/parseFontDeclaration.ts +44 -0
  337. package/src/parser/parsePointsAttribute.ts +36 -0
  338. package/src/parser/parseSVGDocument.ts +106 -0
  339. package/src/parser/parseStyleAttribute.ts +27 -0
  340. package/src/parser/parseStyleObject.ts +15 -0
  341. package/src/parser/parseStyleString.ts +16 -0
  342. package/src/parser/parseTransformAttribute.ts +155 -0
  343. package/src/parser/parseUseDirectives.ts +79 -0
  344. package/src/parser/percent.ts +27 -0
  345. package/src/parser/recursivelyParseGradientsXlink.ts +42 -0
  346. package/src/parser/rotateMatrix.ts +21 -0
  347. package/src/parser/scaleMatrix.ts +9 -0
  348. package/src/parser/selectorMatches.ts +25 -0
  349. package/src/parser/setStrokeFillOpacity.ts +40 -0
  350. package/src/parser/skewMatrix.ts +6 -0
  351. package/src/parser/translateMatrix.ts +8 -0
  352. package/src/shapes/ActiveSelection.ts +157 -0
  353. package/src/shapes/Circle.ts +205 -0
  354. package/src/shapes/Ellipse.ts +154 -0
  355. package/src/shapes/Group.ts +1053 -0
  356. package/src/shapes/IText/DraggableTextDelegate.ts +394 -0
  357. package/src/shapes/IText/IText.ts +666 -0
  358. package/src/shapes/IText/ITextBehavior.ts +1055 -0
  359. package/src/shapes/IText/ITextClickBehavior.ts +321 -0
  360. package/src/shapes/IText/ITextKeyBehavior.ts +683 -0
  361. package/src/shapes/IText/constants.ts +47 -0
  362. package/src/shapes/Image.ts +789 -0
  363. package/src/shapes/Line.ts +329 -0
  364. package/src/shapes/Object/AnimatableObject.ts +106 -0
  365. package/src/shapes/Object/FabricObject.ts +19 -0
  366. package/src/shapes/Object/FabricObjectSVGExportMixin.ts +277 -0
  367. package/src/shapes/Object/InteractiveObject.ts +645 -0
  368. package/src/shapes/Object/Object.ts +1896 -0
  369. package/src/shapes/Object/ObjectGeometry.ts +830 -0
  370. package/src/shapes/Object/ObjectOrigin.ts +354 -0
  371. package/src/shapes/Object/StackedObject.ts +191 -0
  372. package/src/shapes/Object/defaultValues.ts +112 -0
  373. package/src/shapes/Path.ts +395 -0
  374. package/src/shapes/Polygon.ts +19 -0
  375. package/src/shapes/Polyline.ts +333 -0
  376. package/src/shapes/Rect.ts +199 -0
  377. package/src/shapes/Text/StyledText.ts +319 -0
  378. package/src/shapes/Text/Text.ts +1948 -0
  379. package/src/shapes/Text/TextSVGExportMixin.ts +288 -0
  380. package/src/shapes/Textbox.ts +471 -0
  381. package/src/shapes/Triangle.ts +45 -0
  382. package/src/typedefs.ts +119 -0
  383. package/src/util/animation/AnimationBase.ts +166 -0
  384. package/src/util/animation/AnimationFrameProvider.ts +28 -0
  385. package/src/util/animation/AnimationRegistry.ts +58 -0
  386. package/src/util/animation/ArrayAnimation.ts +27 -0
  387. package/src/util/animation/ColorAnimation.ts +74 -0
  388. package/src/util/animation/ValueAnimation.ts +29 -0
  389. package/src/util/animation/animate.ts +74 -0
  390. package/src/util/animation/easing.ts +327 -0
  391. package/src/util/animation/types.ts +136 -0
  392. package/src/util/applyMixins.ts +22 -0
  393. package/src/util/class_registry.ts +54 -0
  394. package/src/util/dom_event.ts +28 -0
  395. package/src/util/dom_misc.ts +138 -0
  396. package/src/util/dom_request.ts +64 -0
  397. package/src/util/dom_style.ts +20 -0
  398. package/src/util/fireEvent.ts +15 -0
  399. package/src/util/internals/cloneDeep.ts +2 -0
  400. package/src/util/internals/getRandomInt.ts +8 -0
  401. package/src/util/internals/ifNaN.ts +9 -0
  402. package/src/util/internals/index.ts +3 -0
  403. package/src/util/internals/removeFromArray.ts +14 -0
  404. package/src/util/internals/uid.ts +3 -0
  405. package/src/util/lang_class.ts +90 -0
  406. package/src/util/lang_string.ts +79 -0
  407. package/src/util/misc/boundingBoxFromPoints.ts +37 -0
  408. package/src/util/misc/capValue.ts +2 -0
  409. package/src/util/misc/cos.ts +24 -0
  410. package/src/util/misc/dom.ts +50 -0
  411. package/src/util/misc/findScaleTo.ts +44 -0
  412. package/src/util/misc/groupSVGElements.ts +15 -0
  413. package/src/util/misc/isTransparent.ts +51 -0
  414. package/src/util/misc/matrix.ts +207 -0
  415. package/src/util/misc/mergeClipPaths.ts +40 -0
  416. package/src/util/misc/objectEnlive.ts +189 -0
  417. package/src/util/misc/objectTransforms.ts +129 -0
  418. package/src/util/misc/pick.ts +17 -0
  419. package/src/util/misc/planeChange.ts +136 -0
  420. package/src/util/misc/projectStroke/StrokeLineCapProjections.ts +112 -0
  421. package/src/util/misc/projectStroke/StrokeLineJoinProjections.ts +231 -0
  422. package/src/util/misc/projectStroke/StrokeProjectionsBase.ts +75 -0
  423. package/src/util/misc/projectStroke/index.ts +53 -0
  424. package/src/util/misc/projectStroke/types.ts +24 -0
  425. package/src/util/misc/radiansDegreesConversion.ts +18 -0
  426. package/src/util/misc/resolveOrigin.ts +22 -0
  427. package/src/util/misc/rotatePoint.ts +15 -0
  428. package/src/util/misc/sin.ts +26 -0
  429. package/src/util/misc/svgParsing.ts +181 -0
  430. package/src/util/misc/textStyles.ts +133 -0
  431. package/src/util/misc/toFixed.ts +8 -0
  432. package/src/util/misc/vectors.ts +82 -0
  433. package/src/util/path.ts +941 -0
  434. package/src/util/transform_matrix_removal.ts +60 -0
  435. package/src/util/types.ts +78 -0
  436. package/tsconfig.json +106 -0
  437. package/HEADER.js +0 -203
  438. package/build.js +0 -287
  439. package/dist/fabric.js +0 -31187
  440. package/dist/fabric.min.js +0 -1
  441. package/old-travis-reference.yml +0 -97
  442. package/src/brushes/circle_brush.class.js +0 -144
  443. package/src/brushes/pattern_brush.class.js +0 -61
  444. package/src/brushes/pencil_brush.class.js +0 -310
  445. package/src/brushes/spray_brush.class.js +0 -219
  446. package/src/canvas.class.js +0 -1312
  447. package/src/color.class.js +0 -636
  448. package/src/control.class.js +0 -339
  449. package/src/controls.actions.js +0 -740
  450. package/src/controls.render.js +0 -99
  451. package/src/elements_parser.js +0 -152
  452. package/src/filters/2d_backend.class.js +0 -65
  453. package/src/filters/blendcolor_filter.class.js +0 -251
  454. package/src/filters/blendimage_filter.class.js +0 -247
  455. package/src/filters/blur_filter.class.js +0 -217
  456. package/src/filters/brightness_filter.class.js +0 -113
  457. package/src/filters/colormatrix_filter.class.js +0 -159
  458. package/src/filters/composed_filter.class.js +0 -72
  459. package/src/filters/contrast_filter.class.js +0 -113
  460. package/src/filters/convolute_filter.class.js +0 -352
  461. package/src/filters/filter_boilerplate.js +0 -111
  462. package/src/filters/filter_generator.js +0 -85
  463. package/src/filters/gamma_filter.class.js +0 -136
  464. package/src/filters/grayscale_filter.class.js +0 -154
  465. package/src/filters/hue_rotation.class.js +0 -107
  466. package/src/filters/invert_filter.class.js +0 -111
  467. package/src/filters/noise_filter.class.js +0 -134
  468. package/src/filters/pixelate_filter.class.js +0 -137
  469. package/src/filters/removecolor_filter.class.js +0 -173
  470. package/src/filters/resize_filter.class.js +0 -490
  471. package/src/filters/saturate_filter.class.js +0 -119
  472. package/src/filters/vibrance_filter.class.js +0 -122
  473. package/src/filters/webgl_backend.class.js +0 -396
  474. package/src/globalFabric.js +0 -4
  475. package/src/gradient.class.js +0 -490
  476. package/src/intersection.class.js +0 -172
  477. package/src/log.js +0 -11
  478. package/src/mixins/animation.mixin.js +0 -231
  479. package/src/mixins/canvas_dataurl_exporter.mixin.js +0 -97
  480. package/src/mixins/canvas_events.mixin.js +0 -974
  481. package/src/mixins/canvas_gestures.mixin.js +0 -149
  482. package/src/mixins/canvas_grouping.mixin.js +0 -177
  483. package/src/mixins/canvas_serialization.mixin.js +0 -228
  484. package/src/mixins/collection.mixin.js +0 -170
  485. package/src/mixins/default_controls.js +0 -114
  486. package/src/mixins/itext.svg_export.js +0 -241
  487. package/src/mixins/itext_behavior.mixin.js +0 -940
  488. package/src/mixins/itext_click_behavior.mixin.js +0 -278
  489. package/src/mixins/itext_key_behavior.mixin.js +0 -694
  490. package/src/mixins/object.svg_export.js +0 -258
  491. package/src/mixins/object_geometry.mixin.js +0 -683
  492. package/src/mixins/object_interactivity.mixin.js +0 -314
  493. package/src/mixins/object_origin.mixin.js +0 -255
  494. package/src/mixins/object_stacking.mixin.js +0 -80
  495. package/src/mixins/object_straightening.mixin.js +0 -80
  496. package/src/mixins/observable.mixin.js +0 -141
  497. package/src/mixins/shared_methods.mixin.js +0 -94
  498. package/src/mixins/stateful.mixin.js +0 -107
  499. package/src/mixins/text_style.mixin.js +0 -324
  500. package/src/parser.js +0 -1090
  501. package/src/pattern.class.js +0 -189
  502. package/src/point.class.js +0 -337
  503. package/src/shadow.class.js +0 -195
  504. package/src/shapes/active_selection.class.js +0 -155
  505. package/src/shapes/circle.class.js +0 -210
  506. package/src/shapes/ellipse.class.js +0 -181
  507. package/src/shapes/group.class.js +0 -593
  508. package/src/shapes/image.class.js +0 -764
  509. package/src/shapes/itext.class.js +0 -526
  510. package/src/shapes/line.class.js +0 -324
  511. package/src/shapes/object.class.js +0 -2008
  512. package/src/shapes/path.class.js +0 -384
  513. package/src/shapes/polygon.class.js +0 -81
  514. package/src/shapes/polyline.class.js +0 -268
  515. package/src/shapes/rect.class.js +0 -187
  516. package/src/shapes/text.class.js +0 -1696
  517. package/src/shapes/textbox.class.js +0 -461
  518. package/src/shapes/triangle.class.js +0 -93
  519. package/src/static_canvas.class.js +0 -1881
  520. package/src/util/anim_ease.js +0 -398
  521. package/src/util/animate.js +0 -254
  522. package/src/util/animate_color.js +0 -74
  523. package/src/util/dom_event.js +0 -50
  524. package/src/util/dom_misc.js +0 -300
  525. package/src/util/dom_request.js +0 -54
  526. package/src/util/dom_style.js +0 -70
  527. package/src/util/lang_array.js +0 -94
  528. package/src/util/lang_class.js +0 -115
  529. package/src/util/lang_object.js +0 -75
  530. package/src/util/lang_string.js +0 -110
  531. package/src/util/misc.js +0 -1330
  532. package/src/util/named_accessors.mixin.js +0 -428
  533. package/src/util/path.js +0 -829
@@ -0,0 +1,789 @@
1
+ //@ts-nocheck
2
+ import { 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 { TClassProperties, TSize } from '../typedefs';
8
+ import { cleanUpJsdomNode } from '../util/dom_misc';
9
+ import { uid } from '../util/internals/uid';
10
+ import { createCanvasElement } from '../util/misc/dom';
11
+ import { findScaleToCover, findScaleToFit } from '../util/misc/findScaleTo';
12
+ import {
13
+ enlivenObjectEnlivables,
14
+ enlivenObjects,
15
+ loadImage,
16
+ LoadImageOptions,
17
+ } from '../util/misc/objectEnlive';
18
+ import { parsePreserveAspectRatioAttribute } from '../util/misc/svgParsing';
19
+ import { classRegistry } from '../util/class_registry';
20
+ import { FabricObject, cacheProperties } from './Object/FabricObject';
21
+
22
+ export type ImageSource =
23
+ | HTMLImageElement
24
+ | HTMLVideoElement
25
+ | HTMLCanvasElement;
26
+
27
+ /**
28
+ * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#images}
29
+ */
30
+ export class Image extends FabricObject {
31
+ /**
32
+ * When calling {@link Image.getSrc}, return value from element src with `element.getAttribute('src')`.
33
+ * This allows for relative urls as image src.
34
+ * @since 2.7.0
35
+ * @type Boolean
36
+ * @default false
37
+ */
38
+ declare srcFromAttribute: boolean;
39
+
40
+ /**
41
+ * private
42
+ * contains last value of scaleX to detect
43
+ * if the Image got resized after the last Render
44
+ * @type Number
45
+ */
46
+ protected _lastScaleX = 1;
47
+
48
+ /**
49
+ * private
50
+ * contains last value of scaleY to detect
51
+ * if the Image got resized after the last Render
52
+ * @type Number
53
+ */
54
+ protected _lastScaleY = 1;
55
+
56
+ /**
57
+ * private
58
+ * contains last value of scaling applied by the apply filter chain
59
+ * @type Number
60
+ */
61
+ protected _filterScalingX = 1;
62
+
63
+ /**
64
+ * private
65
+ * contains last value of scaling applied by the apply filter chain
66
+ * @type Number
67
+ */
68
+ protected _filterScalingY = 1;
69
+
70
+ /**
71
+ * minimum scale factor under which any resizeFilter is triggered to resize the image
72
+ * 0 will disable the automatic resize. 1 will trigger automatically always.
73
+ * number bigger than 1 are not implemented yet.
74
+ * @type Number
75
+ */
76
+ declare minimumScaleTrigger: number;
77
+
78
+ /**
79
+ * key used to retrieve the texture representing this image
80
+ * @since 2.0.0
81
+ * @type String
82
+ * @default
83
+ */
84
+ declare cacheKey: string;
85
+
86
+ /**
87
+ * Image crop in pixels from original image size.
88
+ * @since 2.0.0
89
+ * @type Number
90
+ * @default
91
+ */
92
+ declare cropX: number;
93
+
94
+ /**
95
+ * Image crop in pixels from original image size.
96
+ * @since 2.0.0
97
+ * @type Number
98
+ * @default
99
+ */
100
+ declare cropY: number;
101
+
102
+ /**
103
+ * Indicates whether this canvas will use image smoothing when painting this image.
104
+ * Also influence if the cacheCanvas for this image uses imageSmoothing
105
+ * @since 4.0.0-beta.11
106
+ * @type Boolean
107
+ * @default
108
+ */
109
+ declare imageSmoothing: boolean;
110
+
111
+ declare preserveAspectRatio: string;
112
+
113
+ protected declare src: string;
114
+
115
+ declare filters: BaseFilter[];
116
+ declare resizeFilter: BaseFilter;
117
+
118
+ protected declare _element: ImageSource;
119
+ protected declare _originalElement: ImageSource;
120
+ protected declare _filteredEl: ImageSource;
121
+
122
+ /**
123
+ * Constructor
124
+ * Image can be initialized with any canvas drawable or a string.
125
+ * The string should be a url and will be loaded as an image.
126
+ * Canvas and Image element work out of the box, while videos require extra code to work.
127
+ * Please check video element events for seeking.
128
+ * @param {ImageSource | string} element Image element
129
+ * @param {Object} [options] Options object
130
+ */
131
+ constructor(elementId: string, options: any = {});
132
+ constructor(element: ImageSource, options: any = {});
133
+ constructor(arg0: ImageSource | string, options: any = {}) {
134
+ super({ filters: [], ...options });
135
+ this.cacheKey = `texture${uid()}`;
136
+ this.setElement(
137
+ (typeof arg0 === 'string' && getEnv().document.getElementById(arg0)) ||
138
+ arg0,
139
+ options
140
+ );
141
+ }
142
+
143
+ /**
144
+ * Returns image element which this instance if based on
145
+ */
146
+ getElement() {
147
+ return this._element;
148
+ }
149
+
150
+ /**
151
+ * Sets image element for this instance to a specified one.
152
+ * If filters defined they are applied to new image.
153
+ * You might need to call `canvas.renderAll` and `object.setCoords` after replacing, to render new image and update controls area.
154
+ * @param {HTMLImageElement} element
155
+ * @param {Partial<TSize>} [size] Options object
156
+ */
157
+ setElement(element: ImageSource, size: Partial<TSize> = {}) {
158
+ this.removeTexture(this.cacheKey);
159
+ this.removeTexture(`${this.cacheKey}_filtered`);
160
+ this._element = element;
161
+ this._originalElement = element;
162
+ this._setWidthHeight(size);
163
+ element.classList.add(Image.CSS_CANVAS);
164
+ if (this.filters.length !== 0) {
165
+ this.applyFilters();
166
+ }
167
+ // resizeFilters work on the already filtered copy.
168
+ // we need to apply resizeFilters AFTER normal filters.
169
+ // applyResizeFilters is run more often than normal filters
170
+ // and is triggered by user interactions rather than dev code
171
+ if (this.resizeFilter) {
172
+ this.applyResizeFilters();
173
+ }
174
+ }
175
+
176
+ /**
177
+ * Delete a single texture if in webgl mode
178
+ */
179
+ removeTexture(key: string) {
180
+ const backend = getFilterBackend(false);
181
+ if (backend && backend.evictCachesForKey) {
182
+ backend.evictCachesForKey(key);
183
+ }
184
+ }
185
+
186
+ /**
187
+ * Delete textures, reference to elements and eventually JSDOM cleanup
188
+ */
189
+ dispose() {
190
+ super.dispose();
191
+ this.removeTexture(this.cacheKey);
192
+ this.removeTexture(`${this.cacheKey}_filtered`);
193
+ this._cacheContext = null;
194
+ ['_originalElement', '_element', '_filteredEl', '_cacheCanvas'].forEach(
195
+ (element) => {
196
+ cleanUpJsdomNode(this[element as keyof this]);
197
+ // @ts-expect-error disposing
198
+ this[element] = undefined;
199
+ }
200
+ );
201
+ }
202
+
203
+ /**
204
+ * Get the crossOrigin value (of the corresponding image element)
205
+ */
206
+ getCrossOrigin() {
207
+ return (
208
+ this._originalElement &&
209
+ ((this._originalElement as any).crossOrigin || null)
210
+ );
211
+ }
212
+
213
+ /**
214
+ * Returns original size of an image
215
+ */
216
+ getOriginalSize() {
217
+ const element = this.getElement() as any;
218
+ if (!element) {
219
+ return {
220
+ width: 0,
221
+ height: 0,
222
+ };
223
+ }
224
+ return {
225
+ width: element.naturalWidth || element.width,
226
+ height: element.naturalHeight || element.height,
227
+ };
228
+ }
229
+
230
+ /**
231
+ * @private
232
+ * @param {CanvasRenderingContext2D} ctx Context to render on
233
+ */
234
+ _stroke(ctx: CanvasRenderingContext2D) {
235
+ if (!this.stroke || this.strokeWidth === 0) {
236
+ return;
237
+ }
238
+ const w = this.width / 2,
239
+ h = this.height / 2;
240
+ ctx.beginPath();
241
+ ctx.moveTo(-w, -h);
242
+ ctx.lineTo(w, -h);
243
+ ctx.lineTo(w, h);
244
+ ctx.lineTo(-w, h);
245
+ ctx.lineTo(-w, -h);
246
+ ctx.closePath();
247
+ }
248
+
249
+ /**
250
+ * Returns object representation of an instance
251
+ * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output
252
+ * @return {Object} Object representation of an instance
253
+ */
254
+ toObject(propertiesToInclude: (keyof this)[] = []): Record<string, any> {
255
+ const filters: Record<string, any>[] = [];
256
+ this.filters.forEach((filterObj) => {
257
+ filterObj && filters.push(filterObj.toObject());
258
+ });
259
+ return {
260
+ ...super.toObject(['cropX', 'cropY', ...propertiesToInclude]),
261
+ src: this.getSrc(),
262
+ crossOrigin: this.getCrossOrigin(),
263
+ filters,
264
+ ...(this.resizeFilter
265
+ ? { resizeFilter: this.resizeFilter.toObject() }
266
+ : {}),
267
+ };
268
+ }
269
+
270
+ /**
271
+ * Returns true if an image has crop applied, inspecting values of cropX,cropY,width,height.
272
+ * @return {Boolean}
273
+ */
274
+ hasCrop() {
275
+ return (
276
+ !!this.cropX ||
277
+ !!this.cropY ||
278
+ this.width < this._element.width ||
279
+ this.height < this._element.height
280
+ );
281
+ }
282
+
283
+ /**
284
+ * Returns svg representation of an instance
285
+ * @return {string[]} an array of strings with the specific svg representation
286
+ * of the instance
287
+ */
288
+ _toSVG() {
289
+ const imageMarkup = [],
290
+ element = this._element,
291
+ x = -this.width / 2,
292
+ y = -this.height / 2;
293
+ let svgString = [],
294
+ strokeSvg,
295
+ clipPath = '',
296
+ imageRendering = '';
297
+ if (!element) {
298
+ return [];
299
+ }
300
+ if (this.hasCrop()) {
301
+ const clipPathId = uid();
302
+ svgString.push(
303
+ '<clipPath id="imageCrop_' + clipPathId + '">\n',
304
+ '\t<rect x="' +
305
+ x +
306
+ '" y="' +
307
+ y +
308
+ '" width="' +
309
+ this.width +
310
+ '" height="' +
311
+ this.height +
312
+ '" />\n',
313
+ '</clipPath>\n'
314
+ );
315
+ clipPath = ' clip-path="url(#imageCrop_' + clipPathId + ')" ';
316
+ }
317
+ if (!this.imageSmoothing) {
318
+ imageRendering = '" image-rendering="optimizeSpeed';
319
+ }
320
+ imageMarkup.push(
321
+ '\t<image ',
322
+ 'COMMON_PARTS',
323
+ 'xlink:href="',
324
+ this.getSvgSrc(true),
325
+ '" x="',
326
+ x - this.cropX,
327
+ '" y="',
328
+ y - this.cropY,
329
+ // we're essentially moving origin of transformation from top/left corner to the center of the shape
330
+ // by wrapping it in container <g> element with actual transformation, then offsetting object to the top/left
331
+ // so that object's center aligns with container's left/top
332
+ '" width="',
333
+ element.width || element.naturalWidth,
334
+ '" height="',
335
+ element.height || element.height,
336
+ imageRendering,
337
+ '"',
338
+ clipPath,
339
+ '></image>\n'
340
+ );
341
+
342
+ if (this.stroke || this.strokeDashArray) {
343
+ const origFill = this.fill;
344
+ this.fill = null;
345
+ strokeSvg = [
346
+ '\t<rect ',
347
+ 'x="',
348
+ x,
349
+ '" y="',
350
+ y,
351
+ '" width="',
352
+ this.width,
353
+ '" height="',
354
+ this.height,
355
+ '" style="',
356
+ this.getSvgStyles(),
357
+ '"/>\n',
358
+ ];
359
+ this.fill = origFill;
360
+ }
361
+ if (this.paintFirst !== 'fill') {
362
+ svgString = svgString.concat(strokeSvg, imageMarkup);
363
+ } else {
364
+ svgString = svgString.concat(imageMarkup, strokeSvg);
365
+ }
366
+ return svgString;
367
+ }
368
+
369
+ /**
370
+ * Returns source of an image
371
+ * @param {Boolean} filtered indicates if the src is needed for svg
372
+ * @return {String} Source of an image
373
+ */
374
+ getSrc(filtered?: boolean) {
375
+ const element = filtered ? this._element : this._originalElement;
376
+ if (element) {
377
+ if (element.toDataURL) {
378
+ return element.toDataURL();
379
+ }
380
+
381
+ if (this.srcFromAttribute) {
382
+ return element.getAttribute('src');
383
+ } else {
384
+ return element.src;
385
+ }
386
+ } else {
387
+ return this.src || '';
388
+ }
389
+ }
390
+
391
+ /**
392
+ * Alias for getSrc
393
+ * @param filtered
394
+ * @deprecated
395
+ */
396
+ getSvgSrc(filtered?: boolean) {
397
+ return this.getSrc(filtered);
398
+ }
399
+
400
+ /**
401
+ * Loads and sets source of an image\
402
+ * **IMPORTANT**: It is recommended to abort loading tasks before calling this method to prevent race conditions and unnecessary networking
403
+ * @param {String} src Source string (URL)
404
+ * @param {LoadImageOptions} [options] Options object
405
+ */
406
+ setSrc(src: string, { crossOrigin, signal }: LoadImageOptions = {}) {
407
+ return loadImage(src, { crossOrigin, signal }).then((img) => {
408
+ typeof crossOrigin !== 'undefined' && this.set({ crossOrigin });
409
+ this.setElement(img);
410
+ });
411
+ }
412
+
413
+ /**
414
+ * Returns string representation of an instance
415
+ * @return {String} String representation of an instance
416
+ */
417
+ toString() {
418
+ return `#<Image: { src: "${this.getSrc()}" }>`;
419
+ }
420
+
421
+ applyResizeFilters() {
422
+ const filter = this.resizeFilter,
423
+ minimumScale = this.minimumScaleTrigger,
424
+ objectScale = this.getTotalObjectScaling(),
425
+ scaleX = objectScale.x,
426
+ scaleY = objectScale.y,
427
+ elementToFilter = this._filteredEl || this._originalElement;
428
+ if (this.group) {
429
+ this.set('dirty', true);
430
+ }
431
+ if (!filter || (scaleX > minimumScale && scaleY > minimumScale)) {
432
+ this._element = elementToFilter;
433
+ this._filterScalingX = 1;
434
+ this._filterScalingY = 1;
435
+ this._lastScaleX = scaleX;
436
+ this._lastScaleY = scaleY;
437
+ return;
438
+ }
439
+ const canvasEl = createCanvasElement(),
440
+ sourceWidth = elementToFilter.width,
441
+ sourceHeight = elementToFilter.height;
442
+ canvasEl.width = sourceWidth;
443
+ canvasEl.height = sourceHeight;
444
+ this._element = canvasEl;
445
+ this._lastScaleX = filter.scaleX = scaleX;
446
+ this._lastScaleY = filter.scaleY = scaleY;
447
+ getFilterBackend().applyFilters(
448
+ [filter],
449
+ elementToFilter,
450
+ sourceWidth,
451
+ sourceHeight,
452
+ this._element
453
+ );
454
+ this._filterScalingX = canvasEl.width / this._originalElement.width;
455
+ this._filterScalingY = canvasEl.height / this._originalElement.height;
456
+ }
457
+
458
+ /**
459
+ * Applies filters assigned to this image (from "filters" array) or from filter param
460
+ * @method applyFilters
461
+ * @param {Array} filters to be applied
462
+ * @param {Boolean} forResizing specify if the filter operation is a resize operation
463
+ */
464
+ applyFilters(filters: BaseFilter[] = this.filters || []) {
465
+ filters = filters.filter((filter) => filter && !filter.isNeutralState());
466
+ this.set('dirty', true);
467
+
468
+ // needs to clear out or WEBGL will not resize correctly
469
+ this.removeTexture(`${this.cacheKey}_filtered`);
470
+
471
+ if (filters.length === 0) {
472
+ this._element = this._originalElement;
473
+ this._filteredEl = null;
474
+ this._filterScalingX = 1;
475
+ this._filterScalingY = 1;
476
+ return;
477
+ }
478
+
479
+ const imgElement = this._originalElement,
480
+ sourceWidth = imgElement.naturalWidth || imgElement.width,
481
+ sourceHeight = imgElement.naturalHeight || imgElement.height;
482
+
483
+ if (this._element === this._originalElement) {
484
+ // if the element is the same we need to create a new element
485
+ const canvasEl = createCanvasElement();
486
+ canvasEl.width = sourceWidth;
487
+ canvasEl.height = sourceHeight;
488
+ this._element = canvasEl;
489
+ this._filteredEl = canvasEl;
490
+ } else {
491
+ // clear the existing element to get new filter data
492
+ // also dereference the eventual resized _element
493
+ this._element = this._filteredEl;
494
+ this._filteredEl
495
+ .getContext('2d')
496
+ .clearRect(0, 0, sourceWidth, sourceHeight);
497
+ // we also need to resize again at next renderAll, so remove saved _lastScaleX/Y
498
+ this._lastScaleX = 1;
499
+ this._lastScaleY = 1;
500
+ }
501
+ getFilterBackend().applyFilters(
502
+ filters,
503
+ this._originalElement,
504
+ sourceWidth,
505
+ sourceHeight,
506
+ this._element
507
+ );
508
+ if (
509
+ this._originalElement.width !== this._element.width ||
510
+ this._originalElement.height !== this._element.height
511
+ ) {
512
+ this._filterScalingX = this._element.width / this._originalElement.width;
513
+ this._filterScalingY =
514
+ this._element.height / this._originalElement.height;
515
+ }
516
+ }
517
+
518
+ /**
519
+ * @private
520
+ * @param {CanvasRenderingContext2D} ctx Context to render on
521
+ */
522
+ _render(ctx: CanvasRenderingContext2D) {
523
+ ctx.imageSmoothingEnabled = this.imageSmoothing;
524
+ if (this.isMoving !== true && this.resizeFilter && this._needsResize()) {
525
+ this.applyResizeFilters();
526
+ }
527
+ this._stroke(ctx);
528
+ this._renderPaintInOrder(ctx);
529
+ }
530
+
531
+ /**
532
+ * Paint the cached copy of the object on the target context.
533
+ * it will set the imageSmoothing for the draw operation
534
+ * @param {CanvasRenderingContext2D} ctx Context to render on
535
+ */
536
+ drawCacheOnCanvas(ctx: CanvasRenderingContext2D) {
537
+ ctx.imageSmoothingEnabled = this.imageSmoothing;
538
+ super.drawCacheOnCanvas(ctx);
539
+ }
540
+
541
+ /**
542
+ * Decide if the object should cache or not. Create its own cache level
543
+ * needsItsOwnCache should be used when the object drawing method requires
544
+ * a cache step. None of the fabric classes requires it.
545
+ * Generally you do not cache objects in groups because the group outside is cached.
546
+ * This is the special image version where we would like to avoid caching where possible.
547
+ * Essentially images do not benefit from caching. They may require caching, and in that
548
+ * case we do it. Also caching an image usually ends in a loss of details.
549
+ * A full performance audit should be done.
550
+ * @return {Boolean}
551
+ */
552
+ shouldCache() {
553
+ return this.needsItsOwnCache();
554
+ }
555
+
556
+ _renderFill(ctx: CanvasRenderingContext2D) {
557
+ const elementToDraw = this._element;
558
+ if (!elementToDraw) {
559
+ return;
560
+ }
561
+ const scaleX = this._filterScalingX,
562
+ scaleY = this._filterScalingY,
563
+ w = this.width,
564
+ h = this.height,
565
+ // crop values cannot be lesser than 0.
566
+ cropX = Math.max(this.cropX, 0),
567
+ cropY = Math.max(this.cropY, 0),
568
+ elWidth = elementToDraw.naturalWidth || elementToDraw.width,
569
+ elHeight = elementToDraw.naturalHeight || elementToDraw.height,
570
+ sX = cropX * scaleX,
571
+ sY = cropY * scaleY,
572
+ // the width height cannot exceed element width/height, starting from the crop offset.
573
+ sW = Math.min(w * scaleX, elWidth - sX),
574
+ sH = Math.min(h * scaleY, elHeight - sY),
575
+ x = -w / 2,
576
+ y = -h / 2,
577
+ maxDestW = Math.min(w, elWidth / scaleX - cropX),
578
+ maxDestH = Math.min(h, elHeight / scaleY - cropY);
579
+
580
+ elementToDraw &&
581
+ ctx.drawImage(elementToDraw, sX, sY, sW, sH, x, y, maxDestW, maxDestH);
582
+ }
583
+
584
+ /**
585
+ * needed to check if image needs resize
586
+ * @private
587
+ */
588
+ _needsResize() {
589
+ const scale = this.getTotalObjectScaling();
590
+ return scale.x !== this._lastScaleX || scale.y !== this._lastScaleY;
591
+ }
592
+
593
+ /**
594
+ * @private
595
+ * @deprecated unused
596
+ */
597
+ _resetWidthHeight() {
598
+ this.set(this.getOriginalSize());
599
+ }
600
+
601
+ /**
602
+ * @private
603
+ * Set the width and the height of the image object, using the element or the
604
+ * options.
605
+ */
606
+ _setWidthHeight({ width, height }: Partial<TSize> = {}) {
607
+ const size = this.getOriginalSize();
608
+ this.width = width || size.width;
609
+ this.height = height || size.height;
610
+ }
611
+
612
+ /**
613
+ * Calculate offset for center and scale factor for the image in order to respect
614
+ * the preserveAspectRatio attribute
615
+ * @private
616
+ */
617
+ parsePreserveAspectRatioAttribute() {
618
+ const pAR = parsePreserveAspectRatioAttribute(
619
+ this.preserveAspectRatio || ''
620
+ ),
621
+ pWidth = this.width,
622
+ pHeight = this.height,
623
+ parsedAttributes = { width: pWidth, height: pHeight };
624
+ let rWidth = this._element.width,
625
+ rHeight = this._element.height,
626
+ scaleX = 1,
627
+ scaleY = 1,
628
+ offsetLeft = 0,
629
+ offsetTop = 0,
630
+ cropX = 0,
631
+ cropY = 0,
632
+ offset;
633
+
634
+ if (pAR && (pAR.alignX !== 'none' || pAR.alignY !== 'none')) {
635
+ if (pAR.meetOrSlice === 'meet') {
636
+ scaleX = scaleY = findScaleToFit(this._element, parsedAttributes);
637
+ offset = (pWidth - rWidth * scaleX) / 2;
638
+ if (pAR.alignX === 'Min') {
639
+ offsetLeft = -offset;
640
+ }
641
+ if (pAR.alignX === 'Max') {
642
+ offsetLeft = offset;
643
+ }
644
+ offset = (pHeight - rHeight * scaleY) / 2;
645
+ if (pAR.alignY === 'Min') {
646
+ offsetTop = -offset;
647
+ }
648
+ if (pAR.alignY === 'Max') {
649
+ offsetTop = offset;
650
+ }
651
+ }
652
+ if (pAR.meetOrSlice === 'slice') {
653
+ scaleX = scaleY = findScaleToCover(this._element, parsedAttributes);
654
+ offset = rWidth - pWidth / scaleX;
655
+ if (pAR.alignX === 'Mid') {
656
+ cropX = offset / 2;
657
+ }
658
+ if (pAR.alignX === 'Max') {
659
+ cropX = offset;
660
+ }
661
+ offset = rHeight - pHeight / scaleY;
662
+ if (pAR.alignY === 'Mid') {
663
+ cropY = offset / 2;
664
+ }
665
+ if (pAR.alignY === 'Max') {
666
+ cropY = offset;
667
+ }
668
+ rWidth = pWidth / scaleX;
669
+ rHeight = pHeight / scaleY;
670
+ }
671
+ } else {
672
+ scaleX = pWidth / rWidth;
673
+ scaleY = pHeight / rHeight;
674
+ }
675
+ return {
676
+ width: rWidth,
677
+ height: rHeight,
678
+ scaleX,
679
+ scaleY,
680
+ offsetLeft,
681
+ offsetTop,
682
+ cropX,
683
+ cropY,
684
+ };
685
+ }
686
+
687
+ /**
688
+ * Default CSS class name for canvas
689
+ * @static
690
+ * @type String
691
+ * @default
692
+ */
693
+ static CSS_CANVAS = 'canvas-img';
694
+
695
+ /**
696
+ * List of attribute names to account for when parsing SVG element (used by {@link Image.fromElement})
697
+ * @static
698
+ * @see {@link http://www.w3.org/TR/SVG/struct.html#ImageElement}
699
+ */
700
+ static ATTRIBUTE_NAMES = [
701
+ ...SHARED_ATTRIBUTES,
702
+ 'x',
703
+ 'y',
704
+ 'width',
705
+ 'height',
706
+ 'preserveAspectRatio',
707
+ 'xlink:href',
708
+ 'crossOrigin',
709
+ 'image-rendering',
710
+ ];
711
+
712
+ /**
713
+ * Creates an instance of Image from its object representation
714
+ * @static
715
+ * @param {Object} object Object to create an instance from
716
+ * @param {object} [options] Options object
717
+ * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal
718
+ * @returns {Promise<Image>}
719
+ */
720
+ static fromObject(
721
+ { filters: f, resizeFilter: rf, src, crossOrigin, ...object }: any,
722
+ options: { signal: AbortSignal }
723
+ ): Promise<Image> {
724
+ return Promise.all([
725
+ loadImage(src, { ...options, crossOrigin }),
726
+ f && enlivenObjects(f, options),
727
+ rf && enlivenObjects([rf], options),
728
+ enlivenObjectEnlivables(object, options),
729
+ ]).then(([el, filters = [], [resizeFilter] = [], hydratedProps = {}]) => {
730
+ return new this(el, {
731
+ ...object,
732
+ src,
733
+ crossOrigin,
734
+ filters,
735
+ resizeFilter,
736
+ ...hydratedProps,
737
+ });
738
+ });
739
+ }
740
+
741
+ /**
742
+ * Creates an instance of Image from an URL string
743
+ * @static
744
+ * @param {String} url URL to create an image from
745
+ * @param {LoadImageOptions} [options] Options object
746
+ * @returns {Promise<Image>}
747
+ */
748
+ static fromURL(url: string, options: LoadImageOptions = {}): Promise<Image> {
749
+ return loadImage(url, options).then((img) => new this(img, options));
750
+ }
751
+
752
+ /**
753
+ * Returns {@link Image} instance from an SVG element
754
+ * @static
755
+ * @param {SVGElement} element Element to parse
756
+ * @param {Object} [options] Options object
757
+ * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal
758
+ * @param {Function} callback Callback to execute when Image object is created
759
+ */
760
+ static fromElement(
761
+ element: SVGElement,
762
+ callback: (image: Image) => any,
763
+ options: { signal?: AbortSignal } = {}
764
+ ) {
765
+ const parsedAttributes = parseAttributes(element, this.ATTRIBUTE_NAMES);
766
+ this.fromURL(parsedAttributes['xlink:href'], {
767
+ ...options,
768
+ ...parsedAttributes,
769
+ }).then(callback);
770
+ }
771
+ }
772
+
773
+ export const imageDefaultValues: Partial<TClassProperties<Image>> = {
774
+ type: 'image',
775
+ strokeWidth: 0,
776
+ srcFromAttribute: false,
777
+ minimumScaleTrigger: 0.5,
778
+ cropX: 0,
779
+ cropY: 0,
780
+ imageSmoothing: true,
781
+ };
782
+
783
+ Object.assign(Image.prototype, {
784
+ ...imageDefaultValues,
785
+ cacheProperties: [...cacheProperties, 'cropX', 'cropY'],
786
+ });
787
+
788
+ classRegistry.setClass(Image);
789
+ classRegistry.setSVGClass(Image);