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,814 @@
1
+ import type {
2
+ TBBox,
3
+ TCornerPoint,
4
+ TDegree,
5
+ TMat2D,
6
+ TOriginX,
7
+ TOriginY,
8
+ } from '../../typedefs';
9
+ import { iMatrix } from '../../constants';
10
+ import { Intersection } from '../../Intersection';
11
+ import { Point } from '../../Point';
12
+ import { makeBoundingBoxFromPoints } from '../../util/misc/boundingBoxFromPoints';
13
+ import { cos } from '../../util/misc/cos';
14
+ import {
15
+ createRotateMatrix,
16
+ createTranslateMatrix,
17
+ composeMatrix,
18
+ invertTransform,
19
+ multiplyTransformMatrices,
20
+ qrDecompose,
21
+ transformPoint,
22
+ } from '../../util/misc/matrix';
23
+ import { degreesToRadians } from '../../util/misc/radiansDegreesConversion';
24
+ import { sin } from '../../util/misc/sin';
25
+ import type { Canvas } from '../../canvas/Canvas';
26
+ import type { StaticCanvas } from '../../canvas/StaticCanvas';
27
+ import { ObjectOrigin } from './ObjectOrigin';
28
+ import type { ObjectEvents } from '../../EventTypeDefs';
29
+ import type { ControlProps } from './types/ControlProps';
30
+
31
+ type TLineDescriptor = {
32
+ o: Point;
33
+ d: Point;
34
+ };
35
+
36
+ type TBBoxLines = {
37
+ topline: TLineDescriptor;
38
+ leftline: TLineDescriptor;
39
+ bottomline: TLineDescriptor;
40
+ rightline: TLineDescriptor;
41
+ };
42
+
43
+ type TMatrixCache = {
44
+ key: string;
45
+ value: TMat2D;
46
+ };
47
+
48
+ type TACoords = TCornerPoint;
49
+
50
+ export class ObjectGeometry<EventSpec extends ObjectEvents = ObjectEvents>
51
+ extends ObjectOrigin<EventSpec>
52
+ implements Pick<ControlProps, 'padding'>
53
+ {
54
+ declare padding: number;
55
+
56
+ /**
57
+ * Describe object's corner position in canvas object absolute coordinates
58
+ * properties are tl,tr,bl,br and describe the four main corner.
59
+ * each property is an object with x, y, instance of Fabric.Point.
60
+ * The coordinates depends from this properties: width, height, scaleX, scaleY
61
+ * skewX, skewY, angle, strokeWidth, top, left.
62
+ * Those coordinates are useful to understand where an object is. They get updated
63
+ * with lineCoords or oCoords in interactive cases but they do not need to be updated when zoom or panning change.
64
+ * The coordinates get updated with @method setCoords.
65
+ * You can calculate them without updating with @method calcACoords();
66
+ */
67
+ declare aCoords: TACoords;
68
+
69
+ /**
70
+ * Describe object's corner position in canvas element coordinates.
71
+ * includes padding. Used of object detection.
72
+ * set and refreshed with setCoords.
73
+ * Those could go away
74
+ * @todo investigate how to get rid of those
75
+ */
76
+ declare lineCoords: TCornerPoint;
77
+
78
+ /**
79
+ * storage cache for object transform matrix
80
+ */
81
+ declare ownMatrixCache?: TMatrixCache;
82
+
83
+ /**
84
+ * storage cache for object full transform matrix
85
+ */
86
+ declare matrixCache?: TMatrixCache;
87
+
88
+ /**
89
+ * A Reference of the Canvas where the object is actually added
90
+ * @type StaticCanvas | Canvas;
91
+ * @default undefined
92
+ * @private
93
+ */
94
+ declare canvas?: StaticCanvas | Canvas;
95
+
96
+ /**
97
+ * @returns {number} x position according to object's {@link originX} property in canvas coordinate plane
98
+ */
99
+ getX(): number {
100
+ return this.getXY().x;
101
+ }
102
+
103
+ /**
104
+ * @param {number} value x position according to object's {@link originX} property in canvas coordinate plane
105
+ */
106
+ setX(value: number) {
107
+ this.setXY(this.getXY().setX(value));
108
+ }
109
+
110
+ /**
111
+ * @returns {number} y position according to object's {@link originY} property in canvas coordinate plane
112
+ */
113
+ getY(): number {
114
+ return this.getXY().y;
115
+ }
116
+
117
+ /**
118
+ * @param {number} value y position according to object's {@link originY} property in canvas coordinate plane
119
+ */
120
+ setY(value: number) {
121
+ this.setXY(this.getXY().setY(value));
122
+ }
123
+
124
+ /**
125
+ * @returns {number} x position according to object's {@link originX} property in parent's coordinate plane\
126
+ * if parent is canvas then this property is identical to {@link getX}
127
+ */
128
+ getRelativeX(): number {
129
+ return this.left;
130
+ }
131
+
132
+ /**
133
+ * @param {number} value x position according to object's {@link originX} property in parent's coordinate plane\
134
+ * if parent is canvas then this method is identical to {@link setX}
135
+ */
136
+ setRelativeX(value: number) {
137
+ this.left = value;
138
+ }
139
+
140
+ /**
141
+ * @returns {number} y position according to object's {@link originY} property in parent's coordinate plane\
142
+ * if parent is canvas then this property is identical to {@link getY}
143
+ */
144
+ getRelativeY(): number {
145
+ return this.top;
146
+ }
147
+
148
+ /**
149
+ * @param {number} value y position according to object's {@link originY} property in parent's coordinate plane\
150
+ * if parent is canvas then this property is identical to {@link setY}
151
+ */
152
+ setRelativeY(value: number) {
153
+ this.top = value;
154
+ }
155
+
156
+ /**
157
+ * @returns {Point} x position according to object's {@link originX} {@link originY} properties in canvas coordinate plane
158
+ */
159
+ getXY(): Point {
160
+ const relativePosition = this.getRelativeXY();
161
+ return this.group
162
+ ? transformPoint(relativePosition, this.group.calcTransformMatrix())
163
+ : relativePosition;
164
+ }
165
+
166
+ /**
167
+ * Set an object position to a particular point, the point is intended in absolute ( canvas ) coordinate.
168
+ * You can specify {@link originX} and {@link originY} values,
169
+ * that otherwise are the object's current values.
170
+ * @example <caption>Set object's bottom left corner to point (5,5) on canvas</caption>
171
+ * object.setXY(new Point(5, 5), 'left', 'bottom').
172
+ * @param {Point} point position in canvas coordinate plane
173
+ * @param {TOriginX} [originX] Horizontal origin: 'left', 'center' or 'right'
174
+ * @param {TOriginY} [originY] Vertical origin: 'top', 'center' or 'bottom'
175
+ */
176
+ setXY(point: Point, originX?: TOriginX, originY?: TOriginY) {
177
+ if (this.group) {
178
+ point = transformPoint(
179
+ point,
180
+ invertTransform(this.group.calcTransformMatrix())
181
+ );
182
+ }
183
+ this.setRelativeXY(point, originX, originY);
184
+ }
185
+
186
+ /**
187
+ * @returns {Point} x,y position according to object's {@link originX} {@link originY} properties in parent's coordinate plane
188
+ */
189
+ getRelativeXY(): Point {
190
+ return new Point(this.left, this.top);
191
+ }
192
+
193
+ /**
194
+ * As {@link setXY}, but in current parent's coordinate plane (the current group if any or the canvas)
195
+ * @param {Point} point position according to object's {@link originX} {@link originY} properties in parent's coordinate plane
196
+ * @param {TOriginX} [originX] Horizontal origin: 'left', 'center' or 'right'
197
+ * @param {TOriginY} [originY] Vertical origin: 'top', 'center' or 'bottom'
198
+ */
199
+ setRelativeXY(point: Point, originX?: TOriginX, originY?: TOriginY) {
200
+ this.setPositionByOrigin(
201
+ point,
202
+ originX || this.originX,
203
+ originY || this.originY
204
+ );
205
+ }
206
+
207
+ /**
208
+ * return correct set of coordinates for intersection
209
+ * this will return either aCoords or lineCoords.
210
+ * @param {boolean} absolute will return aCoords if true or lineCoords
211
+ * @param {boolean} calculate will calculate the coords or use the one
212
+ * that are attached to the object instance
213
+ * @return {Object} {tl, tr, br, bl} points
214
+ */
215
+ _getCoords(absolute = false, calculate = false): TCornerPoint {
216
+ if (calculate) {
217
+ return absolute ? this.calcACoords() : this.calcLineCoords();
218
+ }
219
+ // swapped this double if in place of setCoords();
220
+ if (!this.aCoords) {
221
+ this.aCoords = this.calcACoords();
222
+ }
223
+ if (!this.lineCoords) {
224
+ this.lineCoords = this.calcLineCoords();
225
+ }
226
+ return absolute ? this.aCoords : this.lineCoords;
227
+ }
228
+
229
+ /**
230
+ * return correct set of coordinates for intersection
231
+ * this will return either aCoords or lineCoords.
232
+ * The coords are returned in an array.
233
+ * @param {boolean} absolute will return aCoords if true or lineCoords
234
+ * @param {boolean} calculate will return aCoords if true or lineCoords
235
+ * @return {Array} [tl, tr, br, bl] of points
236
+ */
237
+ getCoords(absolute = false, calculate = false): Point[] {
238
+ const { tl, tr, br, bl } = this._getCoords(absolute, calculate);
239
+ const coords = [tl, tr, br, bl];
240
+ if (this.group) {
241
+ const t = this.group.calcTransformMatrix();
242
+ return coords.map((p) => transformPoint(p, t));
243
+ }
244
+ return coords;
245
+ }
246
+
247
+ /**
248
+ * Checks if object intersects with an area formed by 2 points
249
+ * @param {Object} pointTL top-left point of area
250
+ * @param {Object} pointBR bottom-right point of area
251
+ * @param {Boolean} [absolute] use coordinates without viewportTransform
252
+ * @param {Boolean} [calculate] use coordinates of current position instead of stored one
253
+ * @return {Boolean} true if object intersects with an area formed by 2 points
254
+ */
255
+ intersectsWithRect(
256
+ pointTL: Point,
257
+ pointBR: Point,
258
+ absolute?: boolean,
259
+ calculate?: boolean
260
+ ): boolean {
261
+ const coords = this.getCoords(absolute, calculate),
262
+ intersection = Intersection.intersectPolygonRectangle(
263
+ coords,
264
+ pointTL,
265
+ pointBR
266
+ );
267
+ return intersection.status === 'Intersection';
268
+ }
269
+
270
+ /**
271
+ * Checks if object intersects with another object
272
+ * @param {Object} other Object to test
273
+ * @param {Boolean} [absolute] use coordinates without viewportTransform
274
+ * @param {Boolean} [calculate] use coordinates of current position instead of calculating them
275
+ * @return {Boolean} true if object intersects with another object
276
+ */
277
+ intersectsWithObject(
278
+ other: ObjectGeometry,
279
+ absolute = false,
280
+ calculate = false
281
+ ): boolean {
282
+ const intersection = Intersection.intersectPolygonPolygon(
283
+ this.getCoords(absolute, calculate),
284
+ other.getCoords(absolute, calculate)
285
+ );
286
+
287
+ return (
288
+ intersection.status === 'Intersection' ||
289
+ intersection.status === 'Coincident' ||
290
+ other.isContainedWithinObject(this, absolute, calculate) ||
291
+ this.isContainedWithinObject(other, absolute, calculate)
292
+ );
293
+ }
294
+
295
+ /**
296
+ * Checks if object is fully contained within area of another object
297
+ * @param {Object} other Object to test
298
+ * @param {Boolean} [absolute] use coordinates without viewportTransform
299
+ * @param {Boolean} [calculate] use coordinates of current position instead of store ones
300
+ * @return {Boolean} true if object is fully contained within area of another object
301
+ */
302
+ isContainedWithinObject(
303
+ other: ObjectGeometry,
304
+ absolute = false,
305
+ calculate = false
306
+ ): boolean {
307
+ const points = this.getCoords(absolute, calculate),
308
+ otherCoords = absolute ? other.aCoords : other.lineCoords,
309
+ lines = other._getImageLines(otherCoords);
310
+ for (let i = 0; i < 4; i++) {
311
+ if (!other.containsPoint(points[i], lines)) {
312
+ return false;
313
+ }
314
+ }
315
+ return true;
316
+ }
317
+
318
+ /**
319
+ * Checks if object is fully contained within area formed by 2 points
320
+ * @param {Object} pointTL top-left point of area
321
+ * @param {Object} pointBR bottom-right point of area
322
+ * @param {Boolean} [absolute] use coordinates without viewportTransform
323
+ * @param {Boolean} [calculate] use coordinates of current position instead of stored one
324
+ * @return {Boolean} true if object is fully contained within area formed by 2 points
325
+ */
326
+ isContainedWithinRect(
327
+ pointTL: Point,
328
+ pointBR: Point,
329
+ absolute?: boolean,
330
+ calculate?: boolean
331
+ ): boolean {
332
+ const boundingRect = this.getBoundingRect(absolute, calculate);
333
+ return (
334
+ boundingRect.left >= pointTL.x &&
335
+ boundingRect.left + boundingRect.width <= pointBR.x &&
336
+ boundingRect.top >= pointTL.y &&
337
+ boundingRect.top + boundingRect.height <= pointBR.y
338
+ );
339
+ }
340
+
341
+ isOverlapping<T extends ObjectGeometry>(other: T): boolean {
342
+ return (
343
+ this.intersectsWithObject(other) ||
344
+ this.isContainedWithinObject(other) ||
345
+ other.isContainedWithinObject(this)
346
+ );
347
+ }
348
+
349
+ /**
350
+ * Checks if point is inside the object
351
+ * @param {Point} point Point to check against
352
+ * @param {Object} [lines] object returned from @method _getImageLines
353
+ * @param {Boolean} [absolute] use coordinates without viewportTransform
354
+ * @param {Boolean} [calculate] use coordinates of current position instead of stored ones
355
+ * @return {Boolean} true if point is inside the object
356
+ */
357
+ containsPoint(
358
+ point: Point,
359
+ lines?: TBBoxLines,
360
+ absolute = false,
361
+ calculate = false
362
+ ): boolean {
363
+ const coords = this._getCoords(absolute, calculate),
364
+ imageLines = lines || this._getImageLines(coords),
365
+ xPoints = this._findCrossPoints(point, imageLines);
366
+ // if xPoints is odd then point is inside the object
367
+ return xPoints !== 0 && xPoints % 2 === 1;
368
+ }
369
+
370
+ /**
371
+ * Checks if object is contained within the canvas with current viewportTransform
372
+ * the check is done stopping at first point that appears on screen
373
+ * @param {Boolean} [calculate] use coordinates of current position instead of .aCoords
374
+ * @return {Boolean} true if object is fully or partially contained within canvas
375
+ */
376
+ isOnScreen(calculate = false): boolean {
377
+ if (!this.canvas) {
378
+ return false;
379
+ }
380
+ const { tl, br } = this.canvas.vptCoords;
381
+ const points = this.getCoords(true, calculate);
382
+ // if some point is on screen, the object is on screen.
383
+ if (
384
+ points.some(
385
+ (point) =>
386
+ point.x <= br.x &&
387
+ point.x >= tl.x &&
388
+ point.y <= br.y &&
389
+ point.y >= tl.y
390
+ )
391
+ ) {
392
+ return true;
393
+ }
394
+ // no points on screen, check intersection with absolute coordinates
395
+ if (this.intersectsWithRect(tl, br, true, calculate)) {
396
+ return true;
397
+ }
398
+ return this._containsCenterOfCanvas(tl, br, calculate);
399
+ }
400
+
401
+ /**
402
+ * Checks if the object contains the midpoint between canvas extremities
403
+ * Does not make sense outside the context of isOnScreen and isPartiallyOnScreen
404
+ * @private
405
+ * @param {Point} pointTL Top Left point
406
+ * @param {Point} pointBR Top Right point
407
+ * @param {Boolean} calculate use coordinates of current position instead of stored ones
408
+ * @return {Boolean} true if the object contains the point
409
+ */
410
+ private _containsCenterOfCanvas(
411
+ pointTL: Point,
412
+ pointBR: Point,
413
+ calculate?: boolean
414
+ ): boolean {
415
+ // worst case scenario the object is so big that contains the screen
416
+ const centerPoint = pointTL.midPointFrom(pointBR);
417
+ return this.containsPoint(centerPoint, undefined, true, calculate);
418
+ }
419
+
420
+ /**
421
+ * Checks if object is partially contained within the canvas with current viewportTransform
422
+ * @param {Boolean} [calculate] use coordinates of current position instead of stored ones
423
+ * @return {Boolean} true if object is partially contained within canvas
424
+ */
425
+ isPartiallyOnScreen(calculate?: boolean): boolean {
426
+ if (!this.canvas) {
427
+ return false;
428
+ }
429
+ const { tl, br } = this.canvas.vptCoords;
430
+ if (this.intersectsWithRect(tl, br, true, calculate)) {
431
+ return true;
432
+ }
433
+ const allPointsAreOutside = this.getCoords(true, calculate).every(
434
+ (point) =>
435
+ (point.x >= br.x || point.x <= tl.x) &&
436
+ (point.y >= br.y || point.y <= tl.y)
437
+ );
438
+ return (
439
+ allPointsAreOutside && this._containsCenterOfCanvas(tl, br, calculate)
440
+ );
441
+ }
442
+
443
+ /**
444
+ * Method that returns an object with the object edges in it, given the coordinates of the corners
445
+ * @private
446
+ * @param {Object} lineCoords or aCoords Coordinates of the object corners
447
+ */
448
+ _getImageLines({ tl, tr, bl, br }: TCornerPoint): TBBoxLines {
449
+ const lines = {
450
+ topline: {
451
+ o: tl,
452
+ d: tr,
453
+ },
454
+ rightline: {
455
+ o: tr,
456
+ d: br,
457
+ },
458
+ bottomline: {
459
+ o: br,
460
+ d: bl,
461
+ },
462
+ leftline: {
463
+ o: bl,
464
+ d: tl,
465
+ },
466
+ };
467
+
468
+ // // debugging
469
+ // if (this.canvas.contextTop) {
470
+ // this.canvas.contextTop.fillRect(lines.bottomline.d.x, lines.bottomline.d.y, 2, 2);
471
+ // this.canvas.contextTop.fillRect(lines.bottomline.o.x, lines.bottomline.o.y, 2, 2);
472
+ //
473
+ // this.canvas.contextTop.fillRect(lines.leftline.d.x, lines.leftline.d.y, 2, 2);
474
+ // this.canvas.contextTop.fillRect(lines.leftline.o.x, lines.leftline.o.y, 2, 2);
475
+ //
476
+ // this.canvas.contextTop.fillRect(lines.topline.d.x, lines.topline.d.y, 2, 2);
477
+ // this.canvas.contextTop.fillRect(lines.topline.o.x, lines.topline.o.y, 2, 2);
478
+ //
479
+ // this.canvas.contextTop.fillRect(lines.rightline.d.x, lines.rightline.d.y, 2, 2);
480
+ // this.canvas.contextTop.fillRect(lines.rightline.o.x, lines.rightline.o.y, 2, 2);
481
+ // }
482
+
483
+ return lines;
484
+ }
485
+
486
+ /**
487
+ * Helper method to determine how many cross points are between the 4 object edges
488
+ * and the horizontal line determined by a point on canvas
489
+ * @private
490
+ * @param {Point} point Point to check
491
+ * @param {Object} lines Coordinates of the object being evaluated
492
+ * @return {number} number of crossPoint
493
+ */
494
+ _findCrossPoints(point: Point, lines: TBBoxLines): number {
495
+ let xcount = 0;
496
+
497
+ for (const lineKey in lines) {
498
+ let xi;
499
+ const iLine = lines[lineKey as keyof TBBoxLines];
500
+ // optimization 1: line below point. no cross
501
+ if (iLine.o.y < point.y && iLine.d.y < point.y) {
502
+ continue;
503
+ }
504
+ // optimization 2: line above point. no cross
505
+ if (iLine.o.y >= point.y && iLine.d.y >= point.y) {
506
+ continue;
507
+ }
508
+ // optimization 3: vertical line case
509
+ if (iLine.o.x === iLine.d.x && iLine.o.x >= point.x) {
510
+ xi = iLine.o.x;
511
+ }
512
+ // calculate the intersection point
513
+ else {
514
+ const b1 = 0;
515
+ const b2 = (iLine.d.y - iLine.o.y) / (iLine.d.x - iLine.o.x);
516
+ const a1 = point.y - b1 * point.x;
517
+ const a2 = iLine.o.y - b2 * iLine.o.x;
518
+
519
+ xi = -(a1 - a2) / (b1 - b2);
520
+ }
521
+ // don't count xi < point.x cases
522
+ if (xi >= point.x) {
523
+ xcount += 1;
524
+ }
525
+ // optimization 4: specific for square images
526
+ if (xcount === 2) {
527
+ break;
528
+ }
529
+ }
530
+ return xcount;
531
+ }
532
+
533
+ /**
534
+ * Returns coordinates of object's bounding rectangle (left, top, width, height)
535
+ * the box is intended as aligned to axis of canvas.
536
+ * @param {Boolean} [absolute] use coordinates without viewportTransform
537
+ * @param {Boolean} [calculate] use coordinates of current position instead of .lineCoords / .aCoords
538
+ * @return {Object} Object with left, top, width, height properties
539
+ */
540
+ getBoundingRect(absolute?: boolean, calculate?: boolean): TBBox {
541
+ return makeBoundingBoxFromPoints(this.getCoords(absolute, calculate));
542
+ }
543
+
544
+ /**
545
+ * Returns width of an object's bounding box counting transformations
546
+ * @todo shouldn't this account for group transform and return the actual size in canvas coordinate plane?
547
+ * @return {Number} width value
548
+ */
549
+ getScaledWidth(): number {
550
+ return this._getTransformedDimensions().x;
551
+ }
552
+
553
+ /**
554
+ * Returns height of an object bounding box counting transformations
555
+ * @todo shouldn't this account for group transform and return the actual size in canvas coordinate plane?
556
+ * @return {Number} height value
557
+ */
558
+ getScaledHeight(): number {
559
+ return this._getTransformedDimensions().y;
560
+ }
561
+
562
+ /**
563
+ * Scales an object (equally by x and y)
564
+ * @param {Number} value Scale factor
565
+ * @return {void}
566
+ */
567
+ scale(value: number): void {
568
+ this._set('scaleX', value);
569
+ this._set('scaleY', value);
570
+ this.setCoords();
571
+ }
572
+
573
+ /**
574
+ * Scales an object to a given width, with respect to bounding box (scaling by x/y equally)
575
+ * @param {Number} value New width value
576
+ * @param {Boolean} absolute ignore viewport
577
+ * @return {void}
578
+ */
579
+ scaleToWidth(value: number, absolute?: boolean) {
580
+ // adjust to bounding rect factor so that rotated shapes would fit as well
581
+ const boundingRectFactor =
582
+ this.getBoundingRect(absolute).width / this.getScaledWidth();
583
+ return this.scale(value / this.width / boundingRectFactor);
584
+ }
585
+
586
+ /**
587
+ * Scales an object to a given height, with respect to bounding box (scaling by x/y equally)
588
+ * @param {Number} value New height value
589
+ * @param {Boolean} absolute ignore viewport
590
+ * @return {void}
591
+ */
592
+ scaleToHeight(value: number, absolute = false) {
593
+ // adjust to bounding rect factor so that rotated shapes would fit as well
594
+ const boundingRectFactor =
595
+ this.getBoundingRect(absolute).height / this.getScaledHeight();
596
+ return this.scale(value / this.height / boundingRectFactor);
597
+ }
598
+
599
+ getCanvasRetinaScaling() {
600
+ return this.canvas?.getRetinaScaling() || 1;
601
+ }
602
+
603
+ /**
604
+ * Returns the object angle relative to canvas counting also the group property
605
+ * @returns {TDegree}
606
+ */
607
+ getTotalAngle(): TDegree {
608
+ return this.group
609
+ ? qrDecompose(this.calcTransformMatrix()).angle
610
+ : this.angle;
611
+ }
612
+
613
+ /**
614
+ * return the coordinate of the 4 corners of the bounding box in HTMLCanvasElement coordinates
615
+ * used for bounding box interactivity with the mouse
616
+ * @returns {TCornerPoint}
617
+ */
618
+ calcLineCoords(): TCornerPoint {
619
+ const vpt = this.getViewportTransform(),
620
+ padding = this.padding,
621
+ angle = degreesToRadians(this.getTotalAngle()),
622
+ cosP = cos(angle) * padding,
623
+ sinP = sin(angle) * padding,
624
+ cosPSinP = cosP + sinP,
625
+ cosPMinusSinP = cosP - sinP,
626
+ { tl, tr, bl, br } = this.calcACoords();
627
+
628
+ const lineCoords: TCornerPoint = {
629
+ tl: transformPoint(tl, vpt),
630
+ tr: transformPoint(tr, vpt),
631
+ bl: transformPoint(bl, vpt),
632
+ br: transformPoint(br, vpt),
633
+ };
634
+
635
+ if (padding) {
636
+ lineCoords.tl.x -= cosPMinusSinP;
637
+ lineCoords.tl.y -= cosPSinP;
638
+ lineCoords.tr.x += cosPSinP;
639
+ lineCoords.tr.y -= cosPMinusSinP;
640
+ lineCoords.bl.x -= cosPSinP;
641
+ lineCoords.bl.y += cosPMinusSinP;
642
+ lineCoords.br.x += cosPMinusSinP;
643
+ lineCoords.br.y += cosPSinP;
644
+ }
645
+
646
+ return lineCoords;
647
+ }
648
+
649
+ /**
650
+ * Retrieves viewportTransform from Object's canvas if possible
651
+ * @method getViewportTransform
652
+ * @memberOf FabricObject.prototype
653
+ * @return {TMat2D}
654
+ */
655
+ getViewportTransform(): TMat2D {
656
+ return this.canvas?.viewportTransform || (iMatrix.concat() as TMat2D);
657
+ }
658
+
659
+ /**
660
+ * Calculates the coordinates of the 4 corner of the bbox, in absolute coordinates.
661
+ * those never change with zoom or viewport changes.
662
+ * @return {TCornerPoint}
663
+ */
664
+ calcACoords(): TCornerPoint {
665
+ const rotateMatrix = createRotateMatrix({ angle: this.angle }),
666
+ { x, y } = this.getRelativeCenterPoint(),
667
+ tMatrix = createTranslateMatrix(x, y),
668
+ finalMatrix = multiplyTransformMatrices(tMatrix, rotateMatrix),
669
+ dim = this._getTransformedDimensions(),
670
+ w = dim.x / 2,
671
+ h = dim.y / 2;
672
+ return {
673
+ // corners
674
+ tl: transformPoint({ x: -w, y: -h }, finalMatrix),
675
+ tr: transformPoint({ x: w, y: -h }, finalMatrix),
676
+ bl: transformPoint({ x: -w, y: h }, finalMatrix),
677
+ br: transformPoint({ x: w, y: h }, finalMatrix),
678
+ };
679
+ }
680
+
681
+ /**
682
+ * Sets corner and controls position coordinates based on current angle, width and height, left and top.
683
+ * aCoords are used to quickly find an object on the canvas
684
+ * lineCoords are used to quickly find object during pointer events.
685
+ * See {@link https://github.com/fabricjs/fabric.js/wiki/When-to-call-setCoords} and {@link http://fabricjs.com/fabric-gotchas}
686
+ * @param {Boolean} [skipCorners] skip calculation of aCoord, lineCoords.
687
+ * @return {void}
688
+ */
689
+ setCoords(): void {
690
+ this.aCoords = this.calcACoords();
691
+ // in case we are in a group, for how the inner group target check works,
692
+ // lineCoords are exactly aCoords. Since the vpt gets absorbed by the normalized pointer.
693
+ this.lineCoords = this.group ? this.aCoords : this.calcLineCoords();
694
+ }
695
+
696
+ transformMatrixKey(skipGroup = false): string {
697
+ const sep = '_';
698
+ let prefix = '';
699
+ if (!skipGroup && this.group) {
700
+ prefix = this.group.transformMatrixKey(skipGroup) + sep;
701
+ }
702
+ return (
703
+ prefix +
704
+ this.top +
705
+ sep +
706
+ this.left +
707
+ sep +
708
+ this.scaleX +
709
+ sep +
710
+ this.scaleY +
711
+ sep +
712
+ this.skewX +
713
+ sep +
714
+ this.skewY +
715
+ sep +
716
+ this.angle +
717
+ sep +
718
+ this.originX +
719
+ sep +
720
+ this.originY +
721
+ sep +
722
+ this.width +
723
+ sep +
724
+ this.height +
725
+ sep +
726
+ this.strokeWidth +
727
+ this.flipX +
728
+ this.flipY
729
+ );
730
+ }
731
+
732
+ /**
733
+ * calculate transform matrix that represents the current transformations from the
734
+ * object's properties.
735
+ * @param {Boolean} [skipGroup] return transform matrix for object not counting parent transformations
736
+ * There are some situation in which this is useful to avoid the fake rotation.
737
+ * @return {TMat2D} transform matrix for the object
738
+ */
739
+ calcTransformMatrix(skipGroup = false): TMat2D {
740
+ let matrix = this.calcOwnMatrix();
741
+ if (skipGroup || !this.group) {
742
+ return matrix;
743
+ }
744
+ const key = this.transformMatrixKey(skipGroup),
745
+ cache = this.matrixCache;
746
+ if (cache && cache.key === key) {
747
+ return cache.value;
748
+ }
749
+ if (this.group) {
750
+ matrix = multiplyTransformMatrices(
751
+ this.group.calcTransformMatrix(false),
752
+ matrix
753
+ );
754
+ }
755
+ this.matrixCache = {
756
+ key,
757
+ value: matrix,
758
+ };
759
+ return matrix;
760
+ }
761
+
762
+ /**
763
+ * calculate transform matrix that represents the current transformations from the
764
+ * object's properties, this matrix does not include the group transformation
765
+ * @return {TMat2D} transform matrix for the object
766
+ */
767
+ calcOwnMatrix(): TMat2D {
768
+ const key = this.transformMatrixKey(true),
769
+ cache = this.ownMatrixCache;
770
+ if (cache && cache.key === key) {
771
+ return cache.value;
772
+ }
773
+ const center = this.getRelativeCenterPoint(),
774
+ options = {
775
+ angle: this.angle,
776
+ translateX: center.x,
777
+ translateY: center.y,
778
+ scaleX: this.scaleX,
779
+ scaleY: this.scaleY,
780
+ skewX: this.skewX,
781
+ skewY: this.skewY,
782
+ flipX: this.flipX,
783
+ flipY: this.flipY,
784
+ },
785
+ value = composeMatrix(options);
786
+ this.ownMatrixCache = {
787
+ key,
788
+ value,
789
+ };
790
+ return value;
791
+ }
792
+
793
+ /**
794
+ * Calculate object dimensions from its properties
795
+ * @private
796
+ * @returns {Point} dimensions
797
+ */
798
+ _getNonTransformedDimensions(): Point {
799
+ return new Point(this.width, this.height).scalarAdd(this.strokeWidth);
800
+ }
801
+
802
+ /**
803
+ * Calculate object dimensions for controls box, including padding and canvas zoom.
804
+ * and active selection
805
+ * @private
806
+ * @param {object} [options] transform options
807
+ * @returns {Point} dimensions
808
+ */
809
+ _calculateCurrentDimensions(options?: any): Point {
810
+ return this._getTransformedDimensions(options)
811
+ .transform(this.getViewportTransform(), true)
812
+ .scalarAdd(2 * this.padding);
813
+ }
814
+ }