fabric 5.3.0 → 6.0.0-beta10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (634) hide show
  1. package/.babelrc +11 -0
  2. package/.babelrcAlt +19 -0
  3. package/.browserslistrc +5 -0
  4. package/.eslintignore +3 -0
  5. package/.eslintrc.js +51 -0
  6. package/.eslintrc.json +38 -46
  7. package/.eslintrc_tests +12 -0
  8. package/.gitattributes +2 -0
  9. package/.gitpod.yml +17 -1
  10. package/.prettierignore +19 -0
  11. package/.prettierrc +4 -0
  12. package/CHANGELOG.md +615 -189
  13. package/CONTRIBUTING.md +233 -59
  14. package/README.md +200 -235
  15. package/babel-jest.config.js +6 -0
  16. package/bower.json +1 -3
  17. package/dist/fabric.d.ts +54 -0
  18. package/dist/index.d.ts +2 -0
  19. package/dist/index.js +28452 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/index.min.js +1 -0
  22. package/dist/index.mjs +28385 -0
  23. package/dist/index.mjs.map +1 -0
  24. package/dist/index.node.cjs +28538 -0
  25. package/dist/index.node.cjs.map +1 -0
  26. package/dist/index.node.d.ts +20 -0
  27. package/dist/index.node.mjs +28477 -0
  28. package/dist/index.node.mjs.map +1 -0
  29. package/dist/src/ClassRegistry.d.ts +13 -0
  30. package/dist/src/Collection.d.ts +136 -0
  31. package/dist/src/CommonMethods.d.ts +32 -0
  32. package/dist/src/EventTypeDefs.d.ts +227 -0
  33. package/dist/src/Intersection.d.ts +112 -0
  34. package/dist/src/Observable.d.ts +60 -0
  35. package/dist/src/Pattern/Pattern.d.ts +99 -0
  36. package/dist/src/Pattern/index.d.ts +3 -0
  37. package/dist/src/Pattern/types.d.ts +9 -0
  38. package/dist/src/Point.d.ts +232 -0
  39. package/dist/src/Shadow.d.ts +96 -0
  40. package/dist/src/brushes/BaseBrush.d.ts +101 -0
  41. package/dist/src/brushes/CircleBrush.d.ts +44 -0
  42. package/dist/src/brushes/CircleBrush.test.d.ts +2 -0
  43. package/dist/src/brushes/PatternBrush.d.ts +23 -0
  44. package/dist/src/brushes/PencilBrush.d.ts +92 -0
  45. package/dist/src/brushes/SprayBrush.d.ts +74 -0
  46. package/dist/src/brushes/typedefs.d.ts +18 -0
  47. package/dist/src/cache.d.ts +47 -0
  48. package/dist/src/canvas/Canvas.d.ts +364 -0
  49. package/dist/src/canvas/DOMManagers/CanvasDOMManager.d.ts +29 -0
  50. package/dist/src/canvas/DOMManagers/StaticCanvasDOMManager.d.ts +29 -0
  51. package/dist/src/canvas/DOMManagers/util.d.ts +24 -0
  52. package/dist/src/canvas/DOMManagers/util.spec.d.ts +2 -0
  53. package/dist/src/canvas/SelectableCanvas.d.ts +723 -0
  54. package/dist/src/canvas/StaticCanvas.d.ts +747 -0
  55. package/dist/src/canvas/TextEditingManager.d.ts +21 -0
  56. package/dist/src/canvas/canvas_gestures.mixin.d.ts +2 -0
  57. package/dist/src/color/Color.d.ts +152 -0
  58. package/dist/src/color/color_map.d.ts +155 -0
  59. package/dist/src/color/constants.d.ts +104 -0
  60. package/dist/src/color/typedefs.d.ts +16 -0
  61. package/dist/src/color/util.d.ts +27 -0
  62. package/dist/src/config.d.ts +115 -0
  63. package/dist/src/constants.d.ts +21 -0
  64. package/dist/src/controls/Control.d.ts +229 -0
  65. package/dist/src/controls/changeWidth.d.ts +13 -0
  66. package/dist/src/controls/commonControls.d.ts +28 -0
  67. package/dist/src/controls/controlRendering.d.ts +29 -0
  68. package/dist/src/controls/drag.d.ts +12 -0
  69. package/dist/src/controls/fireEvent.d.ts +3 -0
  70. package/dist/src/controls/index.d.ts +13 -0
  71. package/dist/src/controls/polyControl.d.ts +5 -0
  72. package/dist/src/controls/rotate.d.ts +12 -0
  73. package/dist/src/controls/scale.d.ts +47 -0
  74. package/dist/src/controls/scaleSkew.d.ts +39 -0
  75. package/dist/src/controls/skew.d.ts +33 -0
  76. package/dist/src/controls/util.d.ts +41 -0
  77. package/dist/src/controls/wrapWithFireEvent.d.ts +8 -0
  78. package/dist/src/controls/wrapWithFixedAnchor.d.ts +9 -0
  79. package/dist/src/env/browser.d.ts +3 -0
  80. package/dist/src/env/index.d.ts +28 -0
  81. package/dist/src/env/node.d.ts +6 -0
  82. package/dist/src/env/types.d.ts +15 -0
  83. package/dist/src/filters/BaseFilter.d.ts +160 -0
  84. package/dist/src/filters/BlendColor.d.ts +81 -0
  85. package/dist/src/filters/BlendImage.d.ts +93 -0
  86. package/dist/src/filters/Blur.d.ts +52 -0
  87. package/dist/src/filters/Boilerplate.d.ts +48 -0
  88. package/dist/src/filters/Brightness.d.ts +48 -0
  89. package/dist/src/filters/Canvas2dFilterBackend.d.ts +27 -0
  90. package/dist/src/filters/ColorMatrix.d.ts +64 -0
  91. package/dist/src/filters/ColorMatrixFilters.d.ts +537 -0
  92. package/dist/src/filters/Composed.d.ts +46 -0
  93. package/dist/src/filters/Contrast.d.ts +46 -0
  94. package/dist/src/filters/Convolute.d.ts +83 -0
  95. package/dist/src/filters/FilterBackend.d.ts +15 -0
  96. package/dist/src/filters/GLProbes/GLProbe.d.ts +7 -0
  97. package/dist/src/filters/GLProbes/NodeGLProbe.d.ts +11 -0
  98. package/dist/src/filters/GLProbes/WebGLProbe.d.ts +20 -0
  99. package/dist/src/filters/Gamma.d.ts +55 -0
  100. package/dist/src/filters/Grayscale.d.ts +47 -0
  101. package/dist/src/filters/HueRotation.d.ts +25 -0
  102. package/dist/src/filters/Invert.d.ts +56 -0
  103. package/dist/src/filters/Noise.d.ts +55 -0
  104. package/dist/src/filters/Pixelate.d.ts +45 -0
  105. package/dist/src/filters/RemoveColor.d.ts +64 -0
  106. package/dist/src/filters/Resize.d.ts +137 -0
  107. package/dist/src/filters/Saturation.d.ts +49 -0
  108. package/dist/src/filters/Vibrance.d.ts +49 -0
  109. package/dist/src/filters/WebGLFilterBackend.d.ts +128 -0
  110. package/dist/src/filters/filters.d.ts +21 -0
  111. package/dist/src/filters/index.d.ts +7 -0
  112. package/dist/src/filters/shaders/baseFilter.d.ts +4 -0
  113. package/dist/src/filters/shaders/blendColor.d.ts +13 -0
  114. package/dist/src/filters/shaders/blendImage.d.ts +3 -0
  115. package/dist/src/filters/shaders/blur.d.ts +2 -0
  116. package/dist/src/filters/shaders/brightness.d.ts +2 -0
  117. package/dist/src/filters/shaders/colorMatrix.d.ts +2 -0
  118. package/dist/src/filters/shaders/constrast.d.ts +2 -0
  119. package/dist/src/filters/shaders/convolute.d.ts +11 -0
  120. package/dist/src/filters/shaders/gamma.d.ts +2 -0
  121. package/dist/src/filters/shaders/grayscale.d.ts +3 -0
  122. package/dist/src/filters/shaders/invert.d.ts +2 -0
  123. package/dist/src/filters/shaders/noise.d.ts +2 -0
  124. package/dist/src/filters/shaders/pixelate.d.ts +2 -0
  125. package/dist/src/filters/shaders/removeColor.d.ts +2 -0
  126. package/dist/src/filters/shaders/saturation.d.ts +2 -0
  127. package/dist/src/filters/shaders/vibrance.d.ts +2 -0
  128. package/dist/src/filters/typedefs.d.ts +48 -0
  129. package/dist/src/filters/utils.d.ts +3 -0
  130. package/dist/src/gradient/Gradient.d.ts +150 -0
  131. package/dist/src/gradient/constants.d.ts +15 -0
  132. package/dist/src/gradient/index.d.ts +3 -0
  133. package/dist/src/gradient/parser/index.d.ts +4 -0
  134. package/dist/src/gradient/parser/misc.d.ts +4 -0
  135. package/dist/src/gradient/parser/parseColorStops.d.ts +3 -0
  136. package/dist/src/gradient/parser/parseCoords.d.ts +17 -0
  137. package/dist/src/gradient/typedefs.d.ts +93 -0
  138. package/dist/src/mixins/eraser_brush.mixin.d.ts +2 -0
  139. package/dist/src/parkinglot/canvas_animation.mixin.d.ts +2 -0
  140. package/dist/src/parkinglot/straighten.d.ts +2 -0
  141. package/dist/src/parser/applyViewboxTransform.d.ts +5 -0
  142. package/dist/src/parser/attributes.d.ts +6 -0
  143. package/dist/src/parser/constants.d.ts +53 -0
  144. package/dist/src/parser/doesSomeParentMatch.d.ts +2 -0
  145. package/dist/src/parser/elementById.d.ts +6 -0
  146. package/dist/src/parser/elementMatchesRule.d.ts +5 -0
  147. package/dist/src/parser/elements_parser.d.ts +3 -0
  148. package/dist/src/parser/getCSSRules.d.ts +7 -0
  149. package/dist/src/parser/getGlobalStylesForElement.d.ts +5 -0
  150. package/dist/src/parser/getGradientDefs.d.ts +7 -0
  151. package/dist/src/parser/getMultipleNodes.d.ts +2 -0
  152. package/dist/src/parser/getSvgRegex.d.ts +2 -0
  153. package/dist/src/parser/hasAncestorWithNodeName.d.ts +2 -0
  154. package/dist/src/parser/index.d.ts +9 -0
  155. package/dist/src/parser/loadSVGFromString.d.ts +18 -0
  156. package/dist/src/parser/loadSVGFromURL.d.ts +19 -0
  157. package/dist/src/parser/normalizeAttr.d.ts +2 -0
  158. package/dist/src/parser/normalizeValue.d.ts +2 -0
  159. package/dist/src/parser/parseAttributes.d.ts +9 -0
  160. package/dist/src/parser/parseFontDeclaration.d.ts +10 -0
  161. package/dist/src/parser/parsePointsAttribute.d.ts +12 -0
  162. package/dist/src/parser/parseSVGDocument.d.ts +23 -0
  163. package/dist/src/parser/parseStyleAttribute.d.ts +9 -0
  164. package/dist/src/parser/parseStyleObject.d.ts +2 -0
  165. package/dist/src/parser/parseStyleString.d.ts +2 -0
  166. package/dist/src/parser/parseTransformAttribute.d.ts +11 -0
  167. package/dist/src/parser/parseUseDirectives.d.ts +2 -0
  168. package/dist/src/parser/percent.d.ts +9 -0
  169. package/dist/src/parser/recursivelyParseGradientsXlink.d.ts +2 -0
  170. package/dist/src/parser/selectorMatches.d.ts +2 -0
  171. package/dist/src/parser/setStrokeFillOpacity.d.ts +6 -0
  172. package/dist/src/parser/typedefs.d.ts +9 -0
  173. package/dist/src/shapes/ActiveSelection.d.ts +83 -0
  174. package/dist/src/shapes/Circle.d.ts +99 -0
  175. package/dist/src/shapes/Ellipse.d.ts +84 -0
  176. package/dist/src/shapes/Group.d.ts +407 -0
  177. package/dist/src/shapes/IText/DraggableTextDelegate.d.ts +78 -0
  178. package/dist/src/shapes/IText/IText.d.ts +336 -0
  179. package/dist/src/shapes/IText/ITextBehavior.d.ts +287 -0
  180. package/dist/src/shapes/IText/ITextClickBehavior.d.ts +73 -0
  181. package/dist/src/shapes/IText/ITextKeyBehavior.d.ts +195 -0
  182. package/dist/src/shapes/IText/constants.d.ts +13 -0
  183. package/dist/src/shapes/Image.d.ts +309 -0
  184. package/dist/src/shapes/Line.d.ts +121 -0
  185. package/dist/src/shapes/Object/AnimatableObject.d.ts +33 -0
  186. package/dist/src/shapes/Object/FabricObject.d.ts +11 -0
  187. package/dist/src/shapes/Object/FabricObjectSVGExportMixin.d.ts +74 -0
  188. package/dist/src/shapes/Object/InteractiveObject.d.ts +296 -0
  189. package/dist/src/shapes/Object/Object.d.ts +599 -0
  190. package/dist/src/shapes/Object/ObjectGeometry.d.ts +327 -0
  191. package/dist/src/shapes/Object/ObjectOrigin.d.ts +109 -0
  192. package/dist/src/shapes/Object/StackedObject.d.ts +72 -0
  193. package/dist/src/shapes/Object/defaultValues.d.ts +76 -0
  194. package/dist/src/shapes/Object/types/BaseProps.d.ts +84 -0
  195. package/dist/src/shapes/Object/types/BorderProps.d.ts +37 -0
  196. package/dist/src/shapes/Object/types/ControlProps.d.ts +62 -0
  197. package/dist/src/shapes/Object/types/FabricObjectProps.d.ts +96 -0
  198. package/dist/src/shapes/Object/types/FillStrokeProps.d.ts +80 -0
  199. package/dist/src/shapes/Object/types/LockInteractionProps.d.ts +51 -0
  200. package/dist/src/shapes/Object/types/ObjectProps.d.ts +42 -0
  201. package/dist/src/shapes/Object/types/SerializedObjectProps.d.ts +66 -0
  202. package/dist/src/shapes/Object/types/index.d.ts +6 -0
  203. package/dist/src/shapes/Path.d.ts +214 -0
  204. package/dist/src/shapes/Polygon.d.ts +10 -0
  205. package/dist/src/shapes/Polyline.d.ts +147 -0
  206. package/dist/src/shapes/Rect.d.ts +82 -0
  207. package/dist/src/shapes/Text/StyledText.d.ts +123 -0
  208. package/dist/src/shapes/Text/Text.d.ts +688 -0
  209. package/dist/src/shapes/Text/TextSVGExportMixin.d.ts +32 -0
  210. package/dist/src/shapes/Text/constants.d.ts +13 -0
  211. package/dist/src/shapes/Textbox.d.ts +204 -0
  212. package/dist/src/shapes/Triangle.d.ts +26 -0
  213. package/dist/src/typedefs.d.ts +96 -0
  214. package/dist/src/util/animation/AnimationBase.d.ts +54 -0
  215. package/dist/src/util/animation/AnimationFrameProvider.d.ts +3 -0
  216. package/dist/src/util/animation/AnimationRegistry.d.ts +29 -0
  217. package/dist/src/util/animation/ArrayAnimation.d.ts +10 -0
  218. package/dist/src/util/animation/ColorAnimation.d.ts +11 -0
  219. package/dist/src/util/animation/ValueAnimation.d.ts +10 -0
  220. package/dist/src/util/animation/animate.d.ts +37 -0
  221. package/dist/src/util/animation/easing.d.ts +130 -0
  222. package/dist/src/util/animation/index.d.ts +3 -0
  223. package/dist/src/util/animation/types.d.ts +87 -0
  224. package/dist/src/util/applyMixins.d.ts +8 -0
  225. package/dist/src/util/dom_event.d.ts +5 -0
  226. package/dist/src/util/dom_misc.d.ts +12 -0
  227. package/dist/src/util/dom_request.d.ts +14 -0
  228. package/dist/src/util/dom_style.d.ts +7 -0
  229. package/dist/src/util/index.d.ts +36 -0
  230. package/dist/src/util/internals/cleanupSvgAttribute.d.ts +2 -0
  231. package/dist/src/util/internals/cleanupSvgAttribute.test.d.ts +2 -0
  232. package/dist/src/util/internals/cloneDeep.d.ts +2 -0
  233. package/dist/src/util/internals/cloneDeep.test.d.ts +2 -0
  234. package/dist/src/util/internals/getRandomInt.d.ts +8 -0
  235. package/dist/src/util/internals/getRandomInt.test.d.ts +2 -0
  236. package/dist/src/util/internals/ifNaN.d.ts +8 -0
  237. package/dist/src/util/internals/index.d.ts +4 -0
  238. package/dist/src/util/internals/removeFromArray.d.ts +9 -0
  239. package/dist/src/util/internals/uid.d.ts +2 -0
  240. package/dist/src/util/lang_string.d.ts +22 -0
  241. package/dist/src/util/misc/boundingBoxFromPoints.d.ts +9 -0
  242. package/dist/src/util/misc/capValue.d.ts +2 -0
  243. package/dist/src/util/misc/cos.d.ts +10 -0
  244. package/dist/src/util/misc/dom.d.ts +28 -0
  245. package/dist/src/util/misc/findScaleTo.d.ts +20 -0
  246. package/dist/src/util/misc/groupSVGElements.d.ts +9 -0
  247. package/dist/src/util/misc/isTransparent.d.ts +11 -0
  248. package/dist/src/util/misc/matrix.d.ts +168 -0
  249. package/dist/src/util/misc/mergeClipPaths.d.ts +23 -0
  250. package/dist/src/util/misc/objectEnlive.d.ts +41 -0
  251. package/dist/src/util/misc/objectTransforms.d.ts +68 -0
  252. package/dist/src/util/misc/pick.d.ts +9 -0
  253. package/dist/src/util/misc/planeChange.d.ts +81 -0
  254. package/dist/src/util/misc/projectStroke/StrokeLineCapProjections.d.ts +52 -0
  255. package/dist/src/util/misc/projectStroke/StrokeLineJoinProjections.d.ts +82 -0
  256. package/dist/src/util/misc/projectStroke/StrokeProjectionsBase.d.ts +26 -0
  257. package/dist/src/util/misc/projectStroke/index.d.ts +12 -0
  258. package/dist/src/util/misc/projectStroke/types.d.ts +23 -0
  259. package/dist/src/util/misc/radiansDegreesConversion.d.ts +14 -0
  260. package/dist/src/util/misc/resolveOrigin.d.ts +9 -0
  261. package/dist/src/util/misc/rotatePoint.d.ts +12 -0
  262. package/dist/src/util/misc/sin.d.ts +10 -0
  263. package/dist/src/util/misc/svgParsing.d.ts +45 -0
  264. package/dist/src/util/misc/textStyles.d.ts +32 -0
  265. package/dist/src/util/misc/toFixed.d.ts +8 -0
  266. package/dist/src/util/misc/vectors.d.ts +58 -0
  267. package/dist/src/util/path/index.d.ts +96 -0
  268. package/dist/src/util/path/regex.d.ts +2 -0
  269. package/dist/src/util/path/typechecks.d.ts +24 -0
  270. package/dist/src/util/path/typedefs.d.ts +220 -0
  271. package/dist/src/util/transform_matrix_removal.d.ts +14 -0
  272. package/dist/src/util/typeAssertions.d.ts +19 -0
  273. package/e2e/site/index.html +25 -0
  274. package/e2e/utils/objects.ts +36 -0
  275. package/fabric.ts +72 -0
  276. package/index.node.ts +43 -0
  277. package/index.ts +1 -0
  278. package/jest.config.js +194 -0
  279. package/lib/aligning_guidelines.js +2 -2
  280. package/package.json +110 -40
  281. package/playwright.config.ts +64 -0
  282. package/publish.js +0 -26
  283. package/rollup.config.mjs +99 -0
  284. package/rollup.test.config.js +24 -0
  285. package/scripts/build.mjs +50 -0
  286. package/scripts/buildLock.mjs +115 -0
  287. package/scripts/buildReporter.mjs +15 -0
  288. package/scripts/buildStats.mjs +139 -0
  289. package/scripts/dirname.mjs +14 -0
  290. package/scripts/git.mjs +36 -0
  291. package/scripts/index.mjs +564 -0
  292. package/scripts/sandbox.mjs +149 -0
  293. package/src/ClassRegistry.ts +56 -0
  294. package/src/Collection.ts +346 -0
  295. package/src/CommonMethods.ts +63 -0
  296. package/src/EventTypeDefs.ts +298 -0
  297. package/src/Intersection.ts +302 -0
  298. package/src/Observable.ts +181 -0
  299. package/src/Pattern/Pattern.ts +207 -0
  300. package/src/Pattern/index.ts +2 -0
  301. package/src/Pattern/types.ts +17 -0
  302. package/src/Point.ts +388 -0
  303. package/src/Shadow.ts +214 -0
  304. package/src/brushes/{base_brush.class.js → BaseBrush.ts} +63 -42
  305. package/src/brushes/CircleBrush.test.ts +11 -0
  306. package/src/brushes/CircleBrush.ts +140 -0
  307. package/src/brushes/PatternBrush.ts +70 -0
  308. package/src/brushes/PencilBrush.ts +300 -0
  309. package/src/brushes/SprayBrush.ts +214 -0
  310. package/src/brushes/typedefs.ts +18 -0
  311. package/src/cache.ts +90 -0
  312. package/src/canvas/Canvas.ts +1598 -0
  313. package/src/canvas/DOMManagers/CanvasDOMManager.ts +124 -0
  314. package/src/canvas/DOMManagers/StaticCanvasDOMManager.ts +80 -0
  315. package/src/canvas/DOMManagers/util.spec.ts +26 -0
  316. package/src/canvas/DOMManagers/util.ts +98 -0
  317. package/src/canvas/SelectableCanvas.ts +1506 -0
  318. package/src/canvas/StaticCanvas.ts +1634 -0
  319. package/src/canvas/TextEditingManager.ts +70 -0
  320. package/src/canvas/canvas_gestures.mixin.ts +207 -0
  321. package/src/color/Color.ts +320 -0
  322. package/src/color/color_map.ts +154 -0
  323. package/src/color/constants.ts +107 -0
  324. package/src/color/typedefs.ts +18 -0
  325. package/src/color/util.ts +93 -0
  326. package/src/config.ts +159 -0
  327. package/src/constants.ts +29 -0
  328. package/src/controls/Control.ts +385 -0
  329. package/src/controls/changeWidth.ts +53 -0
  330. package/src/controls/commonControls.ts +105 -0
  331. package/src/controls/controlRendering.ts +138 -0
  332. package/src/controls/drag.ts +32 -0
  333. package/src/controls/fireEvent.ts +18 -0
  334. package/src/controls/index.ts +22 -0
  335. package/src/controls/polyControl.ts +135 -0
  336. package/src/controls/rotate.ts +87 -0
  337. package/src/controls/scale.ts +277 -0
  338. package/src/controls/scaleSkew.ts +92 -0
  339. package/src/controls/skew.ts +243 -0
  340. package/src/controls/util.ts +155 -0
  341. package/src/controls/wrapWithFireEvent.ts +25 -0
  342. package/src/controls/wrapWithFixedAnchor.ts +20 -0
  343. package/src/env/browser.ts +32 -0
  344. package/src/env/index.ts +38 -0
  345. package/src/env/node.ts +58 -0
  346. package/src/env/types.ts +15 -0
  347. package/src/filters/{base_filter.class.js → BaseFilter.ts} +203 -151
  348. package/src/filters/BlendColor.ts +219 -0
  349. package/src/filters/BlendImage.ts +230 -0
  350. package/src/filters/Blur.ts +181 -0
  351. package/src/filters/Boilerplate.ts +94 -0
  352. package/src/filters/Brightness.ts +85 -0
  353. package/src/filters/Canvas2dFilterBackend.ts +65 -0
  354. package/src/filters/ColorMatrix.ts +147 -0
  355. package/src/filters/ColorMatrixFilters.ts +79 -0
  356. package/src/filters/Composed.ts +78 -0
  357. package/src/filters/Contrast.ts +84 -0
  358. package/src/filters/Convolute.ts +186 -0
  359. package/src/filters/FilterBackend.ts +38 -0
  360. package/src/filters/GLProbes/GLProbe.ts +7 -0
  361. package/src/filters/GLProbes/NodeGLProbe.ts +15 -0
  362. package/src/filters/GLProbes/WebGLProbe.ts +47 -0
  363. package/src/filters/Gamma.ts +112 -0
  364. package/src/filters/Grayscale.ts +104 -0
  365. package/src/filters/HueRotation.ts +64 -0
  366. package/src/filters/Invert.ts +101 -0
  367. package/src/filters/Noise.ts +96 -0
  368. package/src/filters/Pixelate.ts +98 -0
  369. package/src/filters/RemoveColor.ts +137 -0
  370. package/src/filters/Resize.ts +540 -0
  371. package/src/filters/Saturation.ts +89 -0
  372. package/src/filters/Vibrance.ts +90 -0
  373. package/src/filters/WebGLFilterBackend.ts +456 -0
  374. package/src/filters/filters.ts +28 -0
  375. package/src/filters/index.ts +12 -0
  376. package/src/filters/shaders/baseFilter.ts +17 -0
  377. package/src/filters/shaders/blendColor.ts +33 -0
  378. package/src/filters/shaders/blendImage.ts +32 -0
  379. package/src/filters/shaders/blur.ts +24 -0
  380. package/src/filters/shaders/brightness.ts +11 -0
  381. package/src/filters/shaders/colorMatrix.ts +12 -0
  382. package/src/filters/shaders/constrast.ts +11 -0
  383. package/src/filters/shaders/convolute.ts +154 -0
  384. package/src/filters/shaders/gamma.ts +15 -0
  385. package/src/filters/shaders/grayscale.ts +36 -0
  386. package/src/filters/shaders/invert.ts +19 -0
  387. package/src/filters/shaders/noise.ts +16 -0
  388. package/src/filters/shaders/pixelate.ts +19 -0
  389. package/src/filters/shaders/removeColor.ts +13 -0
  390. package/src/filters/shaders/saturation.ts +15 -0
  391. package/src/filters/shaders/vibrance.ts +16 -0
  392. package/src/filters/typedefs.ts +59 -0
  393. package/src/filters/utils.ts +7 -0
  394. package/src/gradient/Gradient.ts +409 -0
  395. package/src/gradient/constants.ts +12 -0
  396. package/src/gradient/index.ts +2 -0
  397. package/src/gradient/parser/index.ts +3 -0
  398. package/src/gradient/parser/misc.ts +13 -0
  399. package/src/gradient/parser/parseColorStops.ts +56 -0
  400. package/src/gradient/parser/parseCoords.ts +73 -0
  401. package/src/gradient/typedefs.ts +104 -0
  402. package/src/mixins/{eraser_brush.mixin.js → eraser_brush.mixin.ts} +350 -239
  403. package/src/parkinglot/canvas_animation.mixin.ts +121 -0
  404. package/src/parkinglot/straighten.ts +58 -0
  405. package/src/parser/applyViewboxTransform.ts +158 -0
  406. package/src/parser/attributes.ts +25 -0
  407. package/src/parser/constants.ts +116 -0
  408. package/src/parser/doesSomeParentMatch.ts +18 -0
  409. package/src/parser/elementById.ts +21 -0
  410. package/src/parser/elementMatchesRule.ts +16 -0
  411. package/src/parser/elements_parser.ts +158 -0
  412. package/src/parser/getCSSRules.ts +61 -0
  413. package/src/parser/getGlobalStylesForElement.ts +19 -0
  414. package/src/parser/getGradientDefs.ts +31 -0
  415. package/src/parser/getMultipleNodes.ts +15 -0
  416. package/src/parser/getSvgRegex.ts +3 -0
  417. package/src/parser/hasAncestorWithNodeName.ts +14 -0
  418. package/src/parser/index.ts +8 -0
  419. package/src/parser/loadSVGFromString.ts +29 -0
  420. package/src/parser/loadSVGFromURL.ts +47 -0
  421. package/src/parser/normalizeAttr.ts +10 -0
  422. package/src/parser/normalizeValue.ts +64 -0
  423. package/src/parser/parseAttributes.ts +90 -0
  424. package/src/parser/parseFontDeclaration.ts +44 -0
  425. package/src/parser/parsePointsAttribute.ts +34 -0
  426. package/src/parser/parseSVGDocument.ts +118 -0
  427. package/src/parser/parseStyleAttribute.ts +27 -0
  428. package/src/parser/parseStyleObject.ts +15 -0
  429. package/src/parser/parseStyleString.ts +16 -0
  430. package/src/parser/parseTransformAttribute.ts +94 -0
  431. package/src/parser/parseUseDirectives.ts +78 -0
  432. package/src/parser/percent.ts +27 -0
  433. package/src/parser/recursivelyParseGradientsXlink.ts +42 -0
  434. package/src/parser/selectorMatches.ts +25 -0
  435. package/src/parser/setStrokeFillOpacity.ts +40 -0
  436. package/src/parser/typedefs.ts +13 -0
  437. package/src/shapes/ActiveSelection.ts +192 -0
  438. package/src/shapes/Circle.ts +236 -0
  439. package/src/shapes/Ellipse.ts +177 -0
  440. package/src/shapes/Group.ts +1103 -0
  441. package/src/shapes/IText/DraggableTextDelegate.ts +385 -0
  442. package/src/shapes/IText/IText.ts +696 -0
  443. package/src/shapes/IText/ITextBehavior.ts +1073 -0
  444. package/src/shapes/IText/ITextClickBehavior.ts +292 -0
  445. package/src/shapes/IText/ITextKeyBehavior.ts +675 -0
  446. package/src/shapes/IText/constants.ts +53 -0
  447. package/src/shapes/Image.ts +848 -0
  448. package/src/shapes/Line.ts +285 -0
  449. package/src/shapes/Object/AnimatableObject.ts +103 -0
  450. package/src/shapes/Object/FabricObject.ts +29 -0
  451. package/src/shapes/Object/FabricObjectSVGExportMixin.ts +278 -0
  452. package/src/shapes/Object/InteractiveObject.ts +669 -0
  453. package/src/shapes/Object/Object.ts +1589 -0
  454. package/src/shapes/Object/ObjectGeometry.ts +814 -0
  455. package/src/shapes/Object/ObjectOrigin.ts +277 -0
  456. package/src/shapes/Object/StackedObject.ts +206 -0
  457. package/src/shapes/Object/defaultValues.ts +110 -0
  458. package/src/shapes/Object/types/BaseProps.ts +96 -0
  459. package/src/shapes/Object/types/BorderProps.ts +40 -0
  460. package/src/shapes/Object/types/ControlProps.ts +69 -0
  461. package/src/shapes/Object/types/FabricObjectProps.ts +111 -0
  462. package/src/shapes/Object/types/FillStrokeProps.ts +90 -0
  463. package/src/shapes/Object/types/LockInteractionProps.ts +57 -0
  464. package/src/shapes/Object/types/ObjectProps.ts +49 -0
  465. package/src/shapes/Object/types/SerializedObjectProps.ts +73 -0
  466. package/src/shapes/Object/types/index.ts +8 -0
  467. package/src/shapes/Path.ts +434 -0
  468. package/src/shapes/Polygon.ts +22 -0
  469. package/src/shapes/Polyline.ts +364 -0
  470. package/src/shapes/Rect.ts +230 -0
  471. package/src/shapes/Text/StyledText.ts +323 -0
  472. package/src/shapes/Text/Text.ts +1891 -0
  473. package/src/shapes/Text/TextSVGExportMixin.ts +289 -0
  474. package/src/shapes/Text/constants.ts +111 -0
  475. package/src/shapes/Textbox.ts +526 -0
  476. package/src/shapes/Triangle.ts +62 -0
  477. package/src/typedefs.ts +121 -0
  478. package/src/util/animation/AnimationBase.ts +166 -0
  479. package/src/util/animation/AnimationFrameProvider.ts +9 -0
  480. package/src/util/animation/AnimationRegistry.ts +58 -0
  481. package/src/util/animation/ArrayAnimation.ts +27 -0
  482. package/src/util/animation/ColorAnimation.ts +74 -0
  483. package/src/util/animation/ValueAnimation.ts +29 -0
  484. package/src/util/animation/animate.ts +74 -0
  485. package/src/util/animation/easing.ts +327 -0
  486. package/src/util/animation/index.ts +2 -0
  487. package/src/util/animation/types.ts +136 -0
  488. package/src/util/applyMixins.ts +22 -0
  489. package/src/util/dom_event.ts +28 -0
  490. package/src/util/dom_misc.ts +44 -0
  491. package/src/util/dom_request.ts +64 -0
  492. package/src/util/dom_style.ts +20 -0
  493. package/src/util/index.ts +106 -0
  494. package/src/util/internals/cleanupSvgAttribute.test.ts +16 -0
  495. package/src/util/internals/cleanupSvgAttribute.ts +8 -0
  496. package/src/util/internals/cloneDeep.test.ts +16 -0
  497. package/src/util/internals/cloneDeep.ts +2 -0
  498. package/src/util/internals/getRandomInt.test.ts +33 -0
  499. package/src/util/internals/getRandomInt.ts +8 -0
  500. package/src/util/internals/ifNaN.ts +9 -0
  501. package/src/util/internals/index.ts +3 -0
  502. package/src/util/internals/removeFromArray.ts +14 -0
  503. package/src/util/internals/uid.ts +3 -0
  504. package/src/util/lang_string.ts +79 -0
  505. package/src/util/misc/boundingBoxFromPoints.ts +38 -0
  506. package/src/util/misc/capValue.ts +2 -0
  507. package/src/util/misc/cos.ts +24 -0
  508. package/src/util/misc/dom.ts +55 -0
  509. package/src/util/misc/findScaleTo.ts +29 -0
  510. package/src/util/misc/groupSVGElements.ts +15 -0
  511. package/src/util/misc/isTransparent.ts +28 -0
  512. package/src/util/misc/matrix.ts +313 -0
  513. package/src/util/misc/mergeClipPaths.ts +40 -0
  514. package/src/util/misc/objectEnlive.ts +174 -0
  515. package/src/util/misc/objectTransforms.ts +130 -0
  516. package/src/util/misc/pick.ts +29 -0
  517. package/src/util/misc/planeChange.ts +127 -0
  518. package/src/util/misc/projectStroke/StrokeLineCapProjections.ts +113 -0
  519. package/src/util/misc/projectStroke/StrokeLineJoinProjections.ts +227 -0
  520. package/src/util/misc/projectStroke/StrokeProjectionsBase.ts +76 -0
  521. package/src/util/misc/projectStroke/index.ts +55 -0
  522. package/src/util/misc/projectStroke/types.ts +24 -0
  523. package/src/util/misc/radiansDegreesConversion.ts +18 -0
  524. package/src/util/misc/resolveOrigin.ts +22 -0
  525. package/src/util/misc/rotatePoint.ts +15 -0
  526. package/src/util/misc/sin.ts +26 -0
  527. package/src/util/misc/svgParsing.ts +171 -0
  528. package/src/util/misc/textStyles.ts +132 -0
  529. package/src/util/misc/toFixed.ts +8 -0
  530. package/src/util/misc/vectors.ts +83 -0
  531. package/src/util/path/index.ts +1039 -0
  532. package/src/util/path/regex.ts +39 -0
  533. package/src/util/path/typechecks.ts +145 -0
  534. package/src/util/path/typedefs.ts +305 -0
  535. package/src/util/transform_matrix_removal.ts +61 -0
  536. package/src/util/typeAssertions.ts +78 -0
  537. package/tsconfig.json +106 -0
  538. package/HEADER.js +0 -203
  539. package/build.js +0 -287
  540. package/dist/fabric.js +0 -31187
  541. package/dist/fabric.min.js +0 -1
  542. package/old-travis-reference.yml +0 -97
  543. package/src/brushes/circle_brush.class.js +0 -144
  544. package/src/brushes/pattern_brush.class.js +0 -61
  545. package/src/brushes/pencil_brush.class.js +0 -310
  546. package/src/brushes/spray_brush.class.js +0 -219
  547. package/src/canvas.class.js +0 -1312
  548. package/src/color.class.js +0 -636
  549. package/src/control.class.js +0 -339
  550. package/src/controls.actions.js +0 -740
  551. package/src/controls.render.js +0 -99
  552. package/src/elements_parser.js +0 -152
  553. package/src/filters/2d_backend.class.js +0 -65
  554. package/src/filters/blendcolor_filter.class.js +0 -251
  555. package/src/filters/blendimage_filter.class.js +0 -247
  556. package/src/filters/blur_filter.class.js +0 -217
  557. package/src/filters/brightness_filter.class.js +0 -113
  558. package/src/filters/colormatrix_filter.class.js +0 -159
  559. package/src/filters/composed_filter.class.js +0 -72
  560. package/src/filters/contrast_filter.class.js +0 -113
  561. package/src/filters/convolute_filter.class.js +0 -352
  562. package/src/filters/filter_boilerplate.js +0 -111
  563. package/src/filters/filter_generator.js +0 -85
  564. package/src/filters/gamma_filter.class.js +0 -136
  565. package/src/filters/grayscale_filter.class.js +0 -154
  566. package/src/filters/hue_rotation.class.js +0 -107
  567. package/src/filters/invert_filter.class.js +0 -111
  568. package/src/filters/noise_filter.class.js +0 -134
  569. package/src/filters/pixelate_filter.class.js +0 -137
  570. package/src/filters/removecolor_filter.class.js +0 -173
  571. package/src/filters/resize_filter.class.js +0 -490
  572. package/src/filters/saturate_filter.class.js +0 -119
  573. package/src/filters/vibrance_filter.class.js +0 -122
  574. package/src/filters/webgl_backend.class.js +0 -396
  575. package/src/globalFabric.js +0 -4
  576. package/src/gradient.class.js +0 -490
  577. package/src/intersection.class.js +0 -172
  578. package/src/log.js +0 -11
  579. package/src/mixins/animation.mixin.js +0 -231
  580. package/src/mixins/canvas_dataurl_exporter.mixin.js +0 -97
  581. package/src/mixins/canvas_events.mixin.js +0 -974
  582. package/src/mixins/canvas_gestures.mixin.js +0 -149
  583. package/src/mixins/canvas_grouping.mixin.js +0 -177
  584. package/src/mixins/canvas_serialization.mixin.js +0 -228
  585. package/src/mixins/collection.mixin.js +0 -170
  586. package/src/mixins/default_controls.js +0 -114
  587. package/src/mixins/itext.svg_export.js +0 -241
  588. package/src/mixins/itext_behavior.mixin.js +0 -940
  589. package/src/mixins/itext_click_behavior.mixin.js +0 -278
  590. package/src/mixins/itext_key_behavior.mixin.js +0 -694
  591. package/src/mixins/object.svg_export.js +0 -258
  592. package/src/mixins/object_geometry.mixin.js +0 -683
  593. package/src/mixins/object_interactivity.mixin.js +0 -314
  594. package/src/mixins/object_origin.mixin.js +0 -255
  595. package/src/mixins/object_stacking.mixin.js +0 -80
  596. package/src/mixins/object_straightening.mixin.js +0 -80
  597. package/src/mixins/observable.mixin.js +0 -141
  598. package/src/mixins/shared_methods.mixin.js +0 -94
  599. package/src/mixins/stateful.mixin.js +0 -107
  600. package/src/mixins/text_style.mixin.js +0 -324
  601. package/src/parser.js +0 -1090
  602. package/src/pattern.class.js +0 -189
  603. package/src/point.class.js +0 -337
  604. package/src/shadow.class.js +0 -195
  605. package/src/shapes/active_selection.class.js +0 -155
  606. package/src/shapes/circle.class.js +0 -210
  607. package/src/shapes/ellipse.class.js +0 -181
  608. package/src/shapes/group.class.js +0 -593
  609. package/src/shapes/image.class.js +0 -764
  610. package/src/shapes/itext.class.js +0 -526
  611. package/src/shapes/line.class.js +0 -324
  612. package/src/shapes/object.class.js +0 -2008
  613. package/src/shapes/path.class.js +0 -384
  614. package/src/shapes/polygon.class.js +0 -81
  615. package/src/shapes/polyline.class.js +0 -268
  616. package/src/shapes/rect.class.js +0 -187
  617. package/src/shapes/text.class.js +0 -1696
  618. package/src/shapes/textbox.class.js +0 -461
  619. package/src/shapes/triangle.class.js +0 -93
  620. package/src/static_canvas.class.js +0 -1881
  621. package/src/util/anim_ease.js +0 -398
  622. package/src/util/animate.js +0 -254
  623. package/src/util/animate_color.js +0 -74
  624. package/src/util/dom_event.js +0 -50
  625. package/src/util/dom_misc.js +0 -300
  626. package/src/util/dom_request.js +0 -54
  627. package/src/util/dom_style.js +0 -70
  628. package/src/util/lang_array.js +0 -94
  629. package/src/util/lang_class.js +0 -115
  630. package/src/util/lang_object.js +0 -75
  631. package/src/util/lang_string.js +0 -110
  632. package/src/util/misc.js +0 -1330
  633. package/src/util/named_accessors.mixin.js +0 -428
  634. package/src/util/path.js +0 -829
@@ -0,0 +1,313 @@
1
+ import { iMatrix } from '../../constants';
2
+ import type { XY } from '../../Point';
3
+ import { Point } from '../../Point';
4
+ import type { TDegree, TRadian, TMat2D } from '../../typedefs';
5
+ import { cos } from './cos';
6
+ import { degreesToRadians, radiansToDegrees } from './radiansDegreesConversion';
7
+ import { sin } from './sin';
8
+
9
+ type TRotateMatrixArgs = {
10
+ angle?: TDegree;
11
+ };
12
+
13
+ type TTranslateMatrixArgs = {
14
+ translateX?: number;
15
+ translateY?: number;
16
+ };
17
+
18
+ export type TScaleMatrixArgs = {
19
+ scaleX?: number;
20
+ scaleY?: number;
21
+ flipX?: boolean;
22
+ flipY?: boolean;
23
+ skewX?: TDegree;
24
+ skewY?: TDegree;
25
+ };
26
+
27
+ export type TComposeMatrixArgs = TTranslateMatrixArgs &
28
+ TRotateMatrixArgs &
29
+ TScaleMatrixArgs;
30
+
31
+ export type TQrDecomposeOut = Required<
32
+ Omit<TComposeMatrixArgs, 'flipX' | 'flipY'>
33
+ >;
34
+
35
+ export const isIdentityMatrix = (mat: TMat2D) =>
36
+ mat.every((value, index) => value === iMatrix[index]);
37
+
38
+ /**
39
+ * Apply transform t to point p
40
+ * @param {Point | XY} p The point to transform
41
+ * @param {Array} t The transform
42
+ * @param {Boolean} [ignoreOffset] Indicates that the offset should not be applied
43
+ * @return {Point} The transformed point
44
+ */
45
+ export const transformPoint = (
46
+ p: XY,
47
+ t: TMat2D,
48
+ ignoreOffset?: boolean
49
+ ): Point => new Point(p).transform(t, ignoreOffset);
50
+
51
+ /**
52
+ * Invert transformation t
53
+ * @param {Array} t The transform
54
+ * @return {Array} The inverted transform
55
+ */
56
+ export const invertTransform = (t: TMat2D): TMat2D => {
57
+ const a = 1 / (t[0] * t[3] - t[1] * t[2]),
58
+ r = [a * t[3], -a * t[1], -a * t[2], a * t[0], 0, 0] as TMat2D,
59
+ { x, y } = new Point(t[4], t[5]).transform(r, true);
60
+ r[4] = -x;
61
+ r[5] = -y;
62
+ return r;
63
+ };
64
+
65
+ /**
66
+ * Multiply matrix A by matrix B to nest transformations
67
+ * @param {TMat2D} a First transformMatrix
68
+ * @param {TMat2D} b Second transformMatrix
69
+ * @param {Boolean} is2x2 flag to multiply matrices as 2x2 matrices
70
+ * @return {TMat2D} The product of the two transform matrices
71
+ */
72
+ export const multiplyTransformMatrices = (
73
+ a: TMat2D,
74
+ b: TMat2D,
75
+ is2x2?: boolean
76
+ ): TMat2D =>
77
+ [
78
+ a[0] * b[0] + a[2] * b[1],
79
+ a[1] * b[0] + a[3] * b[1],
80
+ a[0] * b[2] + a[2] * b[3],
81
+ a[1] * b[2] + a[3] * b[3],
82
+ is2x2 ? 0 : a[0] * b[4] + a[2] * b[5] + a[4],
83
+ is2x2 ? 0 : a[1] * b[4] + a[3] * b[5] + a[5],
84
+ ] as TMat2D;
85
+
86
+ /**
87
+ * Multiplies {@link matrices} such that a matrix defines the plane for the rest of the matrices **after** it
88
+ *
89
+ * `multiplyTransformMatrixArray([A, B, C, D])` is equivalent to `A(B(C(D)))`
90
+ *
91
+ * @param matrices an array of matrices
92
+ * @param [is2x2] flag to multiply matrices as 2x2 matrices
93
+ * @returns the multiplication product
94
+ */
95
+ export const multiplyTransformMatrixArray = (
96
+ matrices: (TMat2D | undefined | null | false)[],
97
+ is2x2?: boolean
98
+ ) =>
99
+ matrices.reduceRight(
100
+ (product: TMat2D, curr) =>
101
+ curr ? multiplyTransformMatrices(curr, product, is2x2) : product,
102
+ iMatrix
103
+ );
104
+
105
+ /**
106
+ * Decomposes standard 2x3 matrix into transform components
107
+ * @param {TMat2D} a transformMatrix
108
+ * @return {Object} Components of transform
109
+ */
110
+ export const qrDecompose = (a: TMat2D): TQrDecomposeOut => {
111
+ const angle = Math.atan2(a[1], a[0]),
112
+ denom = Math.pow(a[0], 2) + Math.pow(a[1], 2),
113
+ scaleX = Math.sqrt(denom),
114
+ scaleY = (a[0] * a[3] - a[2] * a[1]) / scaleX,
115
+ skewX = Math.atan2(a[0] * a[2] + a[1] * a[3], denom);
116
+ return {
117
+ angle: radiansToDegrees(angle),
118
+ scaleX,
119
+ scaleY,
120
+ skewX: radiansToDegrees(skewX),
121
+ skewY: 0 as TDegree,
122
+ translateX: a[4] || 0,
123
+ translateY: a[5] || 0,
124
+ };
125
+ };
126
+
127
+ /**
128
+ * Generate a translation matrix
129
+ *
130
+ * A translation matrix in the form of
131
+ * [ 1 0 x ]
132
+ * [ 0 1 y ]
133
+ * [ 0 0 1 ]
134
+ *
135
+ * See @link https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#translate for more details
136
+ *
137
+ * @param {number} x translation on X axis
138
+ * @param {number} [y] translation on Y axis
139
+ * @returns {TMat2D} matrix
140
+ */
141
+ export const createTranslateMatrix = (x: number, y = 0): TMat2D => [
142
+ 1,
143
+ 0,
144
+ 0,
145
+ 1,
146
+ x,
147
+ y,
148
+ ];
149
+
150
+ /**
151
+ * Generate a rotation matrix around around a point (x,y), defaulting to (0,0)
152
+ *
153
+ * A matrix in the form of
154
+ * [cos(a) -sin(a) -x*cos(a)+y*sin(a)+x]
155
+ * [sin(a) cos(a) -x*sin(a)-y*cos(a)+y]
156
+ * [0 0 1 ]
157
+ *
158
+ *
159
+ * @param {TDegree} angle rotation in degrees
160
+ * @param {XY} [pivotPoint] pivot point to rotate around
161
+ * @returns {TMat2D} matrix
162
+ */
163
+ export function createRotateMatrix(
164
+ { angle = 0 }: TRotateMatrixArgs = {},
165
+ { x = 0, y = 0 }: Partial<XY> = {}
166
+ ): TMat2D {
167
+ const angleRadiant = degreesToRadians(angle),
168
+ cosValue = cos(angleRadiant),
169
+ sinValue = sin(angleRadiant);
170
+ return [
171
+ cosValue,
172
+ sinValue,
173
+ -sinValue,
174
+ cosValue,
175
+ x ? x - (cosValue * x - sinValue * y) : 0,
176
+ y ? y - (sinValue * x + cosValue * y) : 0,
177
+ ];
178
+ }
179
+
180
+ /**
181
+ * Generate a scale matrix around the point (0,0)
182
+ *
183
+ * A matrix in the form of
184
+ * [x 0 0]
185
+ * [0 y 0]
186
+ * [0 0 1]
187
+ *
188
+ * @link https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#scale
189
+ *
190
+ * @param {number} x scale on X axis
191
+ * @param {number} [y] scale on Y axis
192
+ * @returns {TMat2D} matrix
193
+ */
194
+ export const createScaleMatrix = (x: number, y: number = x): TMat2D => [
195
+ x,
196
+ 0,
197
+ 0,
198
+ y,
199
+ 0,
200
+ 0,
201
+ ];
202
+
203
+ export const angleToSkew = (angle: TDegree) =>
204
+ Math.tan(degreesToRadians(angle));
205
+
206
+ export const skewToAngle = (value: TRadian) =>
207
+ radiansToDegrees(Math.atan(value));
208
+
209
+ /**
210
+ * Generate a skew matrix for the X axis
211
+ *
212
+ * A matrix in the form of
213
+ * [1 x 0]
214
+ * [0 1 0]
215
+ * [0 0 1]
216
+ *
217
+ * @link https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#skewx
218
+ *
219
+ * @param {TDegree} skewValue translation on X axis
220
+ * @returns {TMat2D} matrix
221
+ */
222
+ export const createSkewXMatrix = (skewValue: TDegree): TMat2D => [
223
+ 1,
224
+ 0,
225
+ angleToSkew(skewValue),
226
+ 1,
227
+ 0,
228
+ 0,
229
+ ];
230
+
231
+ /**
232
+ * Generate a skew matrix for the Y axis
233
+ *
234
+ * A matrix in the form of
235
+ * [1 0 0]
236
+ * [y 1 0]
237
+ * [0 0 1]
238
+ *
239
+ * @link https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#skewy
240
+ *
241
+ * @param {TDegree} skewValue translation on Y axis
242
+ * @returns {TMat2D} matrix
243
+ */
244
+ export const createSkewYMatrix = (skewValue: TDegree): TMat2D => [
245
+ 1,
246
+ angleToSkew(skewValue),
247
+ 0,
248
+ 1,
249
+ 0,
250
+ 0,
251
+ ];
252
+
253
+ /**
254
+ * Returns a transform matrix starting from an object of the same kind of
255
+ * the one returned from qrDecompose, useful also if you want to calculate some
256
+ * transformations from an object that is not enlived yet.
257
+ * is called DimensionsTransformMatrix because those properties are the one that influence
258
+ * the size of the resulting box of the object.
259
+ * @param {Object} options
260
+ * @param {Number} [options.scaleX]
261
+ * @param {Number} [options.scaleY]
262
+ * @param {Boolean} [options.flipX]
263
+ * @param {Boolean} [options.flipY]
264
+ * @param {Number} [options.skewX]
265
+ * @param {Number} [options.skewY]
266
+ * @return {Number[]} transform matrix
267
+ */
268
+ export const calcDimensionsMatrix = ({
269
+ scaleX = 1,
270
+ scaleY = 1,
271
+ flipX = false,
272
+ flipY = false,
273
+ skewX = 0 as TDegree,
274
+ skewY = 0 as TDegree,
275
+ }: TScaleMatrixArgs) => {
276
+ return multiplyTransformMatrixArray(
277
+ [
278
+ createScaleMatrix(flipX ? -scaleX : scaleX, flipY ? -scaleY : scaleY),
279
+ skewX && createSkewXMatrix(skewX),
280
+ skewY && createSkewYMatrix(skewY),
281
+ ],
282
+ true
283
+ );
284
+ };
285
+
286
+ /**
287
+ * Returns a transform matrix starting from an object of the same kind of
288
+ * the one returned from qrDecompose, useful also if you want to calculate some
289
+ * transformations from an object that is not enlived yet
290
+ * @param {Object} options
291
+ * @param {Number} [options.angle]
292
+ * @param {Number} [options.scaleX]
293
+ * @param {Number} [options.scaleY]
294
+ * @param {Boolean} [options.flipX]
295
+ * @param {Boolean} [options.flipY]
296
+ * @param {Number} [options.skewX]
297
+ * @param {Number} [options.skewY]
298
+ * @param {Number} [options.translateX]
299
+ * @param {Number} [options.translateY]
300
+ * @return {Number[]} transform matrix
301
+ */
302
+ export const composeMatrix = ({
303
+ translateX = 0,
304
+ translateY = 0,
305
+ angle = 0 as TDegree,
306
+ ...otherOptions
307
+ }: TComposeMatrixArgs): TMat2D => {
308
+ return multiplyTransformMatrixArray([
309
+ createTranslateMatrix(translateX, translateY),
310
+ angle && createRotateMatrix({ angle }),
311
+ calcDimensionsMatrix(otherOptions),
312
+ ]);
313
+ };
@@ -0,0 +1,40 @@
1
+ import type { FabricObject } from '../../shapes/Object/FabricObject';
2
+ import { sendObjectToPlane } from './planeChange';
3
+ import { Group } from '../../shapes/Group';
4
+ /**
5
+ * Merges 2 clip paths into one visually equal clip path
6
+ *
7
+ * **IMPORTANT**:\
8
+ * Does **NOT** clone the arguments, clone them proir if necessary.
9
+ *
10
+ * Creates a wrapper (group) that contains one clip path and is clipped by the other so content is kept where both overlap.
11
+ * Use this method if both the clip paths may have nested clip paths of their own, so assigning one to the other's clip path property is not possible.
12
+ *
13
+ * In order to handle the `inverted` property we follow logic described in the following cases:\
14
+ * **(1)** both clip paths are inverted - the clip paths pass the inverted prop to the wrapper and loose it themselves.\
15
+ * **(2)** one is inverted and the other isn't - the wrapper shouldn't become inverted and the inverted clip path must clip the non inverted one to produce an identical visual effect.\
16
+ * **(3)** both clip paths are not inverted - wrapper and clip paths remain unchanged.
17
+ *
18
+ * @memberOf fabric.util
19
+ * @param {fabric.Object} c1
20
+ * @param {fabric.Object} c2
21
+ * @returns {fabric.Object} merged clip path
22
+ */
23
+ export const mergeClipPaths = (c1: FabricObject, c2: FabricObject) => {
24
+ let a = c1,
25
+ b = c2;
26
+ if (a.inverted && !b.inverted) {
27
+ // case (2)
28
+ a = c2;
29
+ b = c1;
30
+ }
31
+ // `b` becomes `a`'s clip path so we transform `b` to `a` coordinate plane
32
+ sendObjectToPlane(b, b.group?.calcTransformMatrix(), a.calcTransformMatrix());
33
+ // assign the `inverted` prop to the wrapping group
34
+ const inverted = a.inverted && b.inverted;
35
+ if (inverted) {
36
+ // case (1)
37
+ a.inverted = b.inverted = false;
38
+ }
39
+ return new Group([a], { clipPath: b, inverted });
40
+ };
@@ -0,0 +1,174 @@
1
+ import { noop } from '../../constants';
2
+ import type { Pattern } from '../../Pattern';
3
+ import type { FabricObject } from '../../shapes/Object/FabricObject';
4
+ import type { Abortable, TCrossOrigin, TFiller } from '../../typedefs';
5
+ import { createImage } from './dom';
6
+ import { classRegistry } from '../../ClassRegistry';
7
+
8
+ export type LoadImageOptions = Abortable & {
9
+ /**
10
+ * cors value for the image loading, default to anonymous
11
+ */
12
+ crossOrigin?: TCrossOrigin;
13
+ };
14
+
15
+ /**
16
+ * Loads image element from given url and resolve it, or catch.
17
+ * @param {String} url URL representing an image
18
+ * @param {LoadImageOptions} [options] image loading options
19
+ * @returns {Promise<HTMLImageElement>} the loaded image.
20
+ */
21
+ export const loadImage = (
22
+ url: string,
23
+ { signal, crossOrigin = null }: LoadImageOptions = {}
24
+ ) =>
25
+ new Promise<HTMLImageElement>(function (resolve, reject) {
26
+ if (signal && signal.aborted) {
27
+ return reject(new Error('`options.signal` is in `aborted` state'));
28
+ }
29
+ const img = createImage();
30
+ let abort: EventListenerOrEventListenerObject;
31
+ if (signal) {
32
+ abort = function (err: Event) {
33
+ img.src = '';
34
+ reject(err);
35
+ };
36
+ signal.addEventListener('abort', abort, { once: true });
37
+ }
38
+ const done = function () {
39
+ img.onload = img.onerror = null;
40
+ abort && signal?.removeEventListener('abort', abort);
41
+ resolve(img);
42
+ };
43
+ if (!url) {
44
+ done();
45
+ return;
46
+ }
47
+ img.onload = done;
48
+ img.onerror = function () {
49
+ abort && signal?.removeEventListener('abort', abort);
50
+ reject(new Error('Error loading ' + img.src));
51
+ };
52
+ crossOrigin && (img.crossOrigin = crossOrigin);
53
+ img.src = url;
54
+ });
55
+
56
+ export type EnlivenObjectOptions = Abortable & {
57
+ /**
58
+ * Method for further parsing of object elements,
59
+ * called after each fabric object created.
60
+ */
61
+ reviver?: (
62
+ serializedObj: Record<string, any>,
63
+ instance: FabricObject
64
+ ) => void;
65
+ };
66
+
67
+ /**
68
+ * Creates corresponding fabric instances from their object representations
69
+ * @param {Object[]} objects Objects to enliven
70
+ * @param {EnlivenObjectOptions} [options]
71
+ * @param {(serializedObj: object, instance: FabricObject) => any} [options.reviver] Method for further parsing of object elements,
72
+ * called after each fabric object created.
73
+ * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal
74
+ * @returns {Promise<FabricObject[]>}
75
+ */
76
+ export const enlivenObjects = (
77
+ objects: any[],
78
+ { signal, reviver = noop }: EnlivenObjectOptions = {}
79
+ ) =>
80
+ new Promise<FabricObject[]>((resolve, reject) => {
81
+ const instances: FabricObject[] = [];
82
+ signal && signal.addEventListener('abort', reject, { once: true });
83
+ Promise.all(
84
+ objects.map((obj) =>
85
+ classRegistry
86
+ .getClass(obj.type)
87
+ .fromObject(obj, {
88
+ signal,
89
+ reviver,
90
+ })
91
+ .then((fabricInstance: FabricObject) => {
92
+ reviver(obj, fabricInstance);
93
+ instances.push(fabricInstance);
94
+ return fabricInstance;
95
+ })
96
+ )
97
+ )
98
+ .then(resolve)
99
+ .catch((error) => {
100
+ // cleanup
101
+ instances.forEach(function (instance) {
102
+ instance.dispose && instance.dispose();
103
+ });
104
+ reject(error);
105
+ })
106
+ .finally(() => {
107
+ signal && signal.removeEventListener('abort', reject);
108
+ });
109
+ });
110
+
111
+ /**
112
+ * Creates corresponding fabric instances residing in an object, e.g. `clipPath`
113
+ * @param {Object} object with properties to enlive ( fill, stroke, clipPath, path )
114
+ * @param {object} [options]
115
+ * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal
116
+ * @returns {Promise<Record<string, FabricObject | TFiller | null>>} the input object with enlived values
117
+ */
118
+ export const enlivenObjectEnlivables = <
119
+ R = Record<string, FabricObject | TFiller | null>
120
+ >(
121
+ serializedObject: any,
122
+ { signal }: Abortable = {}
123
+ ) =>
124
+ new Promise<R>((resolve, reject) => {
125
+ const instances: (FabricObject | TFiller)[] = [];
126
+ signal && signal.addEventListener('abort', reject, { once: true });
127
+ // enlive every possible property
128
+ const promises = Object.values(serializedObject).map((value: any) => {
129
+ if (!value) {
130
+ return value;
131
+ }
132
+ // gradient
133
+ if (value.colorStops) {
134
+ return new (classRegistry.getClass('gradient'))(value);
135
+ }
136
+ // clipPath
137
+ if (value.type) {
138
+ return enlivenObjects([value], { signal }).then(([enlived]) => {
139
+ instances.push(enlived);
140
+ return enlived;
141
+ });
142
+ }
143
+ // pattern
144
+ if (value.source) {
145
+ return classRegistry
146
+ .getClass('pattern')
147
+ .fromObject(value, { signal })
148
+ .then((pattern: Pattern) => {
149
+ instances.push(pattern);
150
+ return pattern;
151
+ });
152
+ }
153
+ return value;
154
+ });
155
+ const keys = Object.keys(serializedObject);
156
+ Promise.all(promises)
157
+ .then((enlived) => {
158
+ return enlived.reduce((acc, instance, index) => {
159
+ acc[keys[index]] = instance;
160
+ return acc;
161
+ }, {});
162
+ })
163
+ .then(resolve)
164
+ .catch((error) => {
165
+ // cleanup
166
+ instances.forEach((instance: any) => {
167
+ instance.dispose && instance.dispose();
168
+ });
169
+ reject(error);
170
+ })
171
+ .finally(() => {
172
+ signal && signal.removeEventListener('abort', reject);
173
+ });
174
+ });
@@ -0,0 +1,130 @@
1
+ import { Point } from '../../Point';
2
+ import { CENTER } from '../../constants';
3
+ import type { FabricObject } from '../../shapes/Object/Object';
4
+ import type { TMat2D } from '../../typedefs';
5
+ import { makeBoundingBoxFromPoints } from './boundingBoxFromPoints';
6
+ import type { TScaleMatrixArgs } from './matrix';
7
+ import {
8
+ calcDimensionsMatrix,
9
+ invertTransform,
10
+ multiplyTransformMatrices,
11
+ qrDecompose,
12
+ } from './matrix';
13
+
14
+ /**
15
+ * given an object and a transform, apply the inverse transform to the object,
16
+ * this is equivalent to remove from that object that transformation, so that
17
+ * added in a space with the removed transform, the object will be the same as before.
18
+ * Removing from an object a transform that scale by 2 is like scaling it by 1/2.
19
+ * Removing from an object a transform that rotate by 30deg is like rotating by 30deg
20
+ * in the opposite direction.
21
+ * This util is used to add objects inside transformed groups or nested groups.
22
+ * @param {FabricObject} object the object you want to transform
23
+ * @param {TMat2D} transform the destination transform
24
+ */
25
+ export const removeTransformFromObject = (
26
+ object: FabricObject,
27
+ transform: TMat2D
28
+ ) => {
29
+ const inverted = invertTransform(transform),
30
+ finalTransform = multiplyTransformMatrices(
31
+ inverted,
32
+ object.calcOwnMatrix()
33
+ );
34
+ applyTransformToObject(object, finalTransform);
35
+ };
36
+
37
+ /**
38
+ * given an object and a transform, apply the transform to the object.
39
+ * this is equivalent to change the space where the object is drawn.
40
+ * Adding to an object a transform that scale by 2 is like scaling it by 2.
41
+ * This is used when removing an object from an active selection for example.
42
+ * @param {FabricObject} object the object you want to transform
43
+ * @param {Array} transform the destination transform
44
+ */
45
+ export const addTransformToObject = (object: FabricObject, transform: TMat2D) =>
46
+ applyTransformToObject(
47
+ object,
48
+ multiplyTransformMatrices(transform, object.calcOwnMatrix())
49
+ );
50
+
51
+ /**
52
+ * discard an object transform state and apply the one from the matrix.
53
+ * @param {FabricObject} object the object you want to transform
54
+ * @param {Array} transform the destination transform
55
+ */
56
+ export const applyTransformToObject = (
57
+ object: FabricObject,
58
+ transform: TMat2D
59
+ ) => {
60
+ const { translateX, translateY, scaleX, scaleY, ...otherOptions } =
61
+ qrDecompose(transform),
62
+ center = new Point(translateX, translateY);
63
+ object.flipX = false;
64
+ object.flipY = false;
65
+ Object.assign(object, otherOptions);
66
+ object.set({ scaleX, scaleY });
67
+ object.setPositionByOrigin(center, CENTER, CENTER);
68
+ };
69
+ /**
70
+ * reset an object transform state to neutral. Top and left are not accounted for
71
+ * @param {FabricObject} target object to transform
72
+ */
73
+ export const resetObjectTransform = (target: FabricObject) => {
74
+ target.scaleX = 1;
75
+ target.scaleY = 1;
76
+ target.skewX = 0;
77
+ target.skewY = 0;
78
+ target.flipX = false;
79
+ target.flipY = false;
80
+ target.rotate(0);
81
+ };
82
+
83
+ /**
84
+ * Extract Object transform values
85
+ * @param {FabricObject} target object to read from
86
+ * @return {Object} Components of transform
87
+ */
88
+ export const saveObjectTransform = (target: FabricObject) => ({
89
+ scaleX: target.scaleX,
90
+ scaleY: target.scaleY,
91
+ skewX: target.skewX,
92
+ skewY: target.skewY,
93
+ angle: target.angle,
94
+ left: target.left,
95
+ flipX: target.flipX,
96
+ flipY: target.flipY,
97
+ top: target.top,
98
+ });
99
+
100
+ /**
101
+ * given a width and height, return the size of the bounding box
102
+ * that can contains the box with width/height with applied transform
103
+ * described in options.
104
+ * Use to calculate the boxes around objects for controls.
105
+ * @param {Number} width
106
+ * @param {Number} height
107
+ * @param {Object} options
108
+ * @param {Number} options.scaleX
109
+ * @param {Number} options.scaleY
110
+ * @param {Number} options.skewX
111
+ * @param {Number} options.skewY
112
+ * @returns {Point} size
113
+ */
114
+ export const sizeAfterTransform = (
115
+ width: number,
116
+ height: number,
117
+ options: TScaleMatrixArgs
118
+ ) => {
119
+ const dimX = width / 2,
120
+ dimY = height / 2,
121
+ transformMatrix = calcDimensionsMatrix(options),
122
+ points = [
123
+ new Point(-dimX, -dimY),
124
+ new Point(dimX, -dimY),
125
+ new Point(-dimX, dimY),
126
+ new Point(dimX, dimY),
127
+ ].map((p) => p.transform(transformMatrix)),
128
+ bbox = makeBoundingBoxFromPoints(points);
129
+ return new Point(bbox.width, bbox.height);
130
+ };
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Populates an object with properties of another object
3
+ * @param {Object} source Source object
4
+ * @param {string[]} properties Properties names to include
5
+ * @returns object populated with the picked keys
6
+ */
7
+ export const pick = <T extends Record<string, any>>(
8
+ source: T,
9
+ keys: (keyof T)[] = []
10
+ ) => {
11
+ return keys.reduce((o, key) => {
12
+ if (key in source) {
13
+ o[key] = source[key];
14
+ }
15
+ return o;
16
+ }, {} as Partial<T>);
17
+ };
18
+
19
+ export const pickBy = <T extends Record<string, any>>(
20
+ source: T,
21
+ predicate: <K extends keyof T>(value: T[K], key: K, collection: T) => boolean
22
+ ) => {
23
+ return (Object.keys(source) as (keyof T)[]).reduce((o, key) => {
24
+ if (predicate(source[key], key, source)) {
25
+ o[key] = source[key];
26
+ }
27
+ return o;
28
+ }, {} as Partial<T>);
29
+ };