fabric 5.3.0 → 6.0.0-beta3

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