fabric 5.3.0 → 6.0.0-beta3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (604) hide show
  1. package/.babelrc +11 -0
  2. package/.babelrcAlt +19 -0
  3. package/.browserslistrc +5 -0
  4. package/.eslintignore +3 -0
  5. package/.eslintrc.js +43 -0
  6. package/.eslintrc.json +38 -46
  7. package/.eslintrc_tests +12 -0
  8. package/.gitattributes +2 -0
  9. package/.gitpod.yml +17 -1
  10. package/.prettierignore +19 -0
  11. package/.prettierrc +4 -0
  12. package/CHANGELOG.md +532 -189
  13. package/CONTRIBUTING.md +224 -59
  14. package/README.md +200 -235
  15. package/bower.json +1 -3
  16. package/dist/fabric.d.ts +42 -0
  17. package/dist/index.d.ts +2 -0
  18. package/dist/index.js +27582 -0
  19. package/dist/index.js.map +1 -0
  20. package/dist/index.min.js +1 -0
  21. package/dist/index.mjs +27519 -0
  22. package/dist/index.mjs.map +1 -0
  23. package/dist/index.node.cjs +27663 -0
  24. package/dist/index.node.cjs.map +1 -0
  25. package/dist/index.node.d.ts +14 -0
  26. package/dist/index.node.mjs +27606 -0
  27. package/dist/index.node.mjs.map +1 -0
  28. package/dist/src/ClassRegistry.d.ts +13 -0
  29. package/dist/src/Collection.d.ts +136 -0
  30. package/dist/src/CommonMethods.d.ts +32 -0
  31. package/dist/src/EventTypeDefs.d.ts +227 -0
  32. package/dist/src/Intersection.d.ts +112 -0
  33. package/dist/src/Observable.d.ts +60 -0
  34. package/dist/src/Pattern.d.ts +113 -0
  35. package/dist/src/Point.d.ts +232 -0
  36. package/dist/src/Shadow.d.ts +97 -0
  37. package/dist/src/brushes/BaseBrush.d.ts +105 -0
  38. package/dist/src/brushes/CircleBrush.d.ts +49 -0
  39. package/dist/src/brushes/PatternBrush.d.ts +23 -0
  40. package/dist/src/brushes/PencilBrush.d.ts +92 -0
  41. package/dist/src/brushes/SprayBrush.d.ts +79 -0
  42. package/dist/src/cache.d.ts +47 -0
  43. package/dist/src/canvas/Canvas.d.ts +548 -0
  44. package/dist/src/canvas/SelectableCanvas.d.ts +754 -0
  45. package/dist/src/canvas/StaticCanvas.d.ts +778 -0
  46. package/dist/src/canvas/TextEditingManager.d.ts +17 -0
  47. package/dist/src/canvas/canvas_gestures.mixin.d.ts +2 -0
  48. package/dist/src/color/Color.d.ts +174 -0
  49. package/dist/src/color/color_map.d.ts +155 -0
  50. package/dist/src/color/constants.d.ts +22 -0
  51. package/dist/src/color/util.d.ts +12 -0
  52. package/dist/src/config.d.ts +115 -0
  53. package/dist/src/constants.d.ts +14 -0
  54. package/dist/src/controls/Control.d.ts +228 -0
  55. package/dist/src/controls/changeWidth.d.ts +13 -0
  56. package/dist/src/controls/commonControls.d.ts +28 -0
  57. package/dist/src/controls/controlRendering.d.ts +29 -0
  58. package/dist/src/controls/drag.d.ts +12 -0
  59. package/dist/src/controls/index.d.ts +13 -0
  60. package/dist/src/controls/polyControl.d.ts +5 -0
  61. package/dist/src/controls/rotate.d.ts +12 -0
  62. package/dist/src/controls/scale.d.ts +47 -0
  63. package/dist/src/controls/scaleSkew.d.ts +39 -0
  64. package/dist/src/controls/skew.d.ts +33 -0
  65. package/dist/src/controls/util.d.ts +41 -0
  66. package/dist/src/controls/wrapWithFireEvent.d.ts +8 -0
  67. package/dist/src/controls/wrapWithFixedAnchor.d.ts +9 -0
  68. package/dist/src/env/browser.d.ts +3 -0
  69. package/dist/src/env/index.d.ts +15 -0
  70. package/dist/src/env/node.d.ts +5 -0
  71. package/dist/src/env/types.d.ts +15 -0
  72. package/dist/src/filters/BaseFilter.d.ts +153 -0
  73. package/dist/src/filters/BlendColor.d.ts +80 -0
  74. package/dist/src/filters/BlendImage.d.ts +92 -0
  75. package/dist/src/filters/Blur.d.ts +51 -0
  76. package/dist/src/filters/Boilerplate.d.ts +48 -0
  77. package/dist/src/filters/Brightness.d.ts +47 -0
  78. package/dist/src/filters/Canvas2dFilterBackend.d.ts +27 -0
  79. package/dist/src/filters/ColorMatrix.d.ts +63 -0
  80. package/dist/src/filters/ColorMatrixFilters.d.ts +545 -0
  81. package/dist/src/filters/Composed.d.ts +45 -0
  82. package/dist/src/filters/Contrast.d.ts +45 -0
  83. package/dist/src/filters/Convolute.d.ts +82 -0
  84. package/dist/src/filters/FilterBackend.d.ts +14 -0
  85. package/dist/src/filters/GLProbes/GLProbe.d.ts +11 -0
  86. package/dist/src/filters/GLProbes/NodeGLProbe.d.ts +11 -0
  87. package/dist/src/filters/GLProbes/WebGLProbe.d.ts +20 -0
  88. package/dist/src/filters/Gamma.d.ts +54 -0
  89. package/dist/src/filters/Grayscale.d.ts +46 -0
  90. package/dist/src/filters/HueRotation.d.ts +24 -0
  91. package/dist/src/filters/Invert.d.ts +55 -0
  92. package/dist/src/filters/Noise.d.ts +54 -0
  93. package/dist/src/filters/Pixelate.d.ts +44 -0
  94. package/dist/src/filters/RemoveColor.d.ts +63 -0
  95. package/dist/src/filters/Resize.d.ts +136 -0
  96. package/dist/src/filters/Saturation.d.ts +48 -0
  97. package/dist/src/filters/Vibrance.d.ts +48 -0
  98. package/dist/src/filters/WebGLFilterBackend.d.ts +126 -0
  99. package/dist/src/filters/filters.d.ts +21 -0
  100. package/dist/src/filters/index.d.ts +5 -0
  101. package/dist/src/filters/shaders/baseFilter.d.ts +4 -0
  102. package/dist/src/filters/shaders/blendColor.d.ts +13 -0
  103. package/dist/src/filters/shaders/blendImage.d.ts +3 -0
  104. package/dist/src/filters/shaders/blur.d.ts +2 -0
  105. package/dist/src/filters/shaders/brightness.d.ts +2 -0
  106. package/dist/src/filters/shaders/colorMatrix.d.ts +2 -0
  107. package/dist/src/filters/shaders/constrast.d.ts +2 -0
  108. package/dist/src/filters/shaders/convolute.d.ts +11 -0
  109. package/dist/src/filters/shaders/gamma.d.ts +2 -0
  110. package/dist/src/filters/shaders/grayscale.d.ts +3 -0
  111. package/dist/src/filters/shaders/invert.d.ts +2 -0
  112. package/dist/src/filters/shaders/noise.d.ts +2 -0
  113. package/dist/src/filters/shaders/pixelate.d.ts +2 -0
  114. package/dist/src/filters/shaders/removeColor.d.ts +2 -0
  115. package/dist/src/filters/shaders/saturation.d.ts +2 -0
  116. package/dist/src/filters/shaders/vibrance.d.ts +2 -0
  117. package/dist/src/filters/typedefs.d.ts +49 -0
  118. package/dist/src/gradient/Gradient.d.ts +149 -0
  119. package/dist/src/gradient/constants.d.ts +15 -0
  120. package/dist/src/gradient/parser/index.d.ts +4 -0
  121. package/dist/src/gradient/parser/misc.d.ts +4 -0
  122. package/dist/src/gradient/parser/parseColorStops.d.ts +3 -0
  123. package/dist/src/gradient/parser/parseCoords.d.ts +17 -0
  124. package/dist/src/gradient/typedefs.d.ts +93 -0
  125. package/dist/src/mixins/eraser_brush.mixin.d.ts +2 -0
  126. package/dist/src/parkinglot/canvas_animation.mixin.d.ts +2 -0
  127. package/dist/src/parkinglot/straighten.d.ts +2 -0
  128. package/dist/src/parser/applyViewboxTransform.d.ts +5 -0
  129. package/dist/src/parser/attributes.d.ts +6 -0
  130. package/dist/src/parser/constants.d.ts +53 -0
  131. package/dist/src/parser/doesSomeParentMatch.d.ts +2 -0
  132. package/dist/src/parser/elementById.d.ts +6 -0
  133. package/dist/src/parser/elementMatchesRule.d.ts +5 -0
  134. package/dist/src/parser/elements_parser.d.ts +3 -0
  135. package/dist/src/parser/getCSSRules.d.ts +7 -0
  136. package/dist/src/parser/getGlobalStylesForElement.d.ts +5 -0
  137. package/dist/src/parser/getGradientDefs.d.ts +7 -0
  138. package/dist/src/parser/getMultipleNodes.d.ts +2 -0
  139. package/dist/src/parser/getSvgRegex.d.ts +2 -0
  140. package/dist/src/parser/hasAncestorWithNodeName.d.ts +2 -0
  141. package/dist/src/parser/index.d.ts +10 -0
  142. package/dist/src/parser/loadSVGFromString.d.ts +12 -0
  143. package/dist/src/parser/loadSVGFromURL.d.ts +13 -0
  144. package/dist/src/parser/normalizeAttr.d.ts +2 -0
  145. package/dist/src/parser/normalizeValue.d.ts +2 -0
  146. package/dist/src/parser/parseAttributes.d.ts +9 -0
  147. package/dist/src/parser/parseElements.d.ts +11 -0
  148. package/dist/src/parser/parseFontDeclaration.d.ts +10 -0
  149. package/dist/src/parser/parsePointsAttribute.d.ts +12 -0
  150. package/dist/src/parser/parseSVGDocument.d.ts +15 -0
  151. package/dist/src/parser/parseStyleAttribute.d.ts +9 -0
  152. package/dist/src/parser/parseStyleObject.d.ts +2 -0
  153. package/dist/src/parser/parseStyleString.d.ts +2 -0
  154. package/dist/src/parser/parseTransformAttribute.d.ts +10 -0
  155. package/dist/src/parser/parseUseDirectives.d.ts +2 -0
  156. package/dist/src/parser/percent.d.ts +9 -0
  157. package/dist/src/parser/recursivelyParseGradientsXlink.d.ts +2 -0
  158. package/dist/src/parser/rotateMatrix.d.ts +2 -0
  159. package/dist/src/parser/scaleMatrix.d.ts +2 -0
  160. package/dist/src/parser/selectorMatches.d.ts +2 -0
  161. package/dist/src/parser/setStrokeFillOpacity.d.ts +6 -0
  162. package/dist/src/parser/skewMatrix.d.ts +2 -0
  163. package/dist/src/parser/translateMatrix.d.ts +2 -0
  164. package/dist/src/shapes/ActiveSelection.d.ts +82 -0
  165. package/dist/src/shapes/Circle.d.ts +99 -0
  166. package/dist/src/shapes/Ellipse.d.ts +84 -0
  167. package/dist/src/shapes/Group.d.ts +408 -0
  168. package/dist/src/shapes/IText/DraggableTextDelegate.d.ts +78 -0
  169. package/dist/src/shapes/IText/IText.d.ts +335 -0
  170. package/dist/src/shapes/IText/ITextBehavior.d.ts +287 -0
  171. package/dist/src/shapes/IText/ITextClickBehavior.d.ts +83 -0
  172. package/dist/src/shapes/IText/ITextKeyBehavior.d.ts +195 -0
  173. package/dist/src/shapes/IText/constants.d.ts +13 -0
  174. package/dist/src/shapes/Image.d.ts +311 -0
  175. package/dist/src/shapes/Line.d.ts +126 -0
  176. package/dist/src/shapes/Object/AnimatableObject.d.ts +33 -0
  177. package/dist/src/shapes/Object/FabricObject.d.ts +11 -0
  178. package/dist/src/shapes/Object/FabricObjectSVGExportMixin.d.ts +74 -0
  179. package/dist/src/shapes/Object/InteractiveObject.d.ts +296 -0
  180. package/dist/src/shapes/Object/Object.d.ts +594 -0
  181. package/dist/src/shapes/Object/ObjectGeometry.d.ts +327 -0
  182. package/dist/src/shapes/Object/ObjectOrigin.d.ts +109 -0
  183. package/dist/src/shapes/Object/StackedObject.d.ts +72 -0
  184. package/dist/src/shapes/Object/defaultValues.d.ts +76 -0
  185. package/dist/src/shapes/Object/types/BaseProps.d.ts +84 -0
  186. package/dist/src/shapes/Object/types/BorderProps.d.ts +37 -0
  187. package/dist/src/shapes/Object/types/ControlProps.d.ts +62 -0
  188. package/dist/src/shapes/Object/types/FabricObjectProps.d.ts +96 -0
  189. package/dist/src/shapes/Object/types/FillStrokeProps.d.ts +80 -0
  190. package/dist/src/shapes/Object/types/LockInteractionProps.d.ts +51 -0
  191. package/dist/src/shapes/Object/types/ObjectProps.d.ts +42 -0
  192. package/dist/src/shapes/Object/types/SerializedObjectProps.d.ts +66 -0
  193. package/dist/src/shapes/Object/types/index.d.ts +6 -0
  194. package/dist/src/shapes/Path.d.ts +130 -0
  195. package/dist/src/shapes/Polygon.d.ts +9 -0
  196. package/dist/src/shapes/Polyline.d.ts +140 -0
  197. package/dist/src/shapes/Rect.d.ts +76 -0
  198. package/dist/src/shapes/Text/StyledText.d.ts +119 -0
  199. package/dist/src/shapes/Text/Text.d.ts +673 -0
  200. package/dist/src/shapes/Text/TextSVGExportMixin.d.ts +32 -0
  201. package/dist/src/shapes/Text/constants.d.ts +7 -0
  202. package/dist/src/shapes/Textbox.d.ts +185 -0
  203. package/dist/src/shapes/Triangle.d.ts +25 -0
  204. package/dist/src/typedefs.d.ts +90 -0
  205. package/dist/src/util/animation/AnimationBase.d.ts +54 -0
  206. package/dist/src/util/animation/AnimationFrameProvider.d.ts +3 -0
  207. package/dist/src/util/animation/AnimationRegistry.d.ts +29 -0
  208. package/dist/src/util/animation/ArrayAnimation.d.ts +10 -0
  209. package/dist/src/util/animation/ColorAnimation.d.ts +11 -0
  210. package/dist/src/util/animation/ValueAnimation.d.ts +10 -0
  211. package/dist/src/util/animation/animate.d.ts +37 -0
  212. package/dist/src/util/animation/easing.d.ts +130 -0
  213. package/dist/src/util/animation/types.d.ts +87 -0
  214. package/dist/src/util/applyMixins.d.ts +8 -0
  215. package/dist/src/util/dom_event.d.ts +5 -0
  216. package/dist/src/util/dom_misc.d.ts +39 -0
  217. package/dist/src/util/dom_request.d.ts +14 -0
  218. package/dist/src/util/dom_style.d.ts +7 -0
  219. package/dist/src/util/fireEvent.d.ts +3 -0
  220. package/dist/src/util/index.d.ts +35 -0
  221. package/dist/src/util/internals/cloneDeep.d.ts +2 -0
  222. package/dist/src/util/internals/getRandomInt.d.ts +8 -0
  223. package/dist/src/util/internals/ifNaN.d.ts +8 -0
  224. package/dist/src/util/internals/index.d.ts +4 -0
  225. package/dist/src/util/internals/removeFromArray.d.ts +9 -0
  226. package/dist/src/util/internals/uid.d.ts +2 -0
  227. package/dist/src/util/lang_string.d.ts +22 -0
  228. package/dist/src/util/misc/boundingBoxFromPoints.d.ts +9 -0
  229. package/dist/src/util/misc/capValue.d.ts +2 -0
  230. package/dist/src/util/misc/cos.d.ts +10 -0
  231. package/dist/src/util/misc/dom.d.ts +28 -0
  232. package/dist/src/util/misc/findScaleTo.d.ts +29 -0
  233. package/dist/src/util/misc/groupSVGElements.d.ts +9 -0
  234. package/dist/src/util/misc/isTransparent.d.ts +11 -0
  235. package/dist/src/util/misc/matrix.d.ts +92 -0
  236. package/dist/src/util/misc/mergeClipPaths.d.ts +23 -0
  237. package/dist/src/util/misc/objectEnlive.d.ts +56 -0
  238. package/dist/src/util/misc/objectTransforms.d.ts +68 -0
  239. package/dist/src/util/misc/pick.d.ts +9 -0
  240. package/dist/src/util/misc/planeChange.d.ts +84 -0
  241. package/dist/src/util/misc/projectStroke/StrokeLineCapProjections.d.ts +51 -0
  242. package/dist/src/util/misc/projectStroke/StrokeLineJoinProjections.d.ts +81 -0
  243. package/dist/src/util/misc/projectStroke/StrokeProjectionsBase.d.ts +25 -0
  244. package/dist/src/util/misc/projectStroke/index.d.ts +11 -0
  245. package/dist/src/util/misc/projectStroke/types.d.ts +23 -0
  246. package/dist/src/util/misc/radiansDegreesConversion.d.ts +14 -0
  247. package/dist/src/util/misc/resolveOrigin.d.ts +9 -0
  248. package/dist/src/util/misc/rotatePoint.d.ts +12 -0
  249. package/dist/src/util/misc/sin.d.ts +10 -0
  250. package/dist/src/util/misc/svgParsing.d.ts +53 -0
  251. package/dist/src/util/misc/textStyles.d.ts +32 -0
  252. package/dist/src/util/misc/toFixed.d.ts +8 -0
  253. package/dist/src/util/misc/vectors.d.ts +57 -0
  254. package/dist/src/util/path/index.d.ts +96 -0
  255. package/dist/src/util/path/regex.d.ts +3 -0
  256. package/dist/src/util/path/typechecks.d.ts +24 -0
  257. package/dist/src/util/path/typedefs.d.ts +220 -0
  258. package/dist/src/util/transform_matrix_removal.d.ts +14 -0
  259. package/dist/src/util/types.d.ts +19 -0
  260. package/fabric.ts +51 -0
  261. package/index.node.ts +37 -0
  262. package/index.ts +1 -0
  263. package/package.json +100 -40
  264. package/publish.js +0 -26
  265. package/rollup.config.mjs +91 -0
  266. package/rollup.test.config.js +24 -0
  267. package/scripts/build.mjs +50 -0
  268. package/scripts/buildLock.mjs +115 -0
  269. package/scripts/buildReporter.mjs +15 -0
  270. package/scripts/buildStats.mjs +139 -0
  271. package/scripts/dirname.mjs +14 -0
  272. package/scripts/git.mjs +36 -0
  273. package/scripts/index.mjs +564 -0
  274. package/scripts/sandbox.mjs +149 -0
  275. package/src/ClassRegistry.ts +56 -0
  276. package/src/Collection.ts +346 -0
  277. package/src/CommonMethods.ts +63 -0
  278. package/src/EventTypeDefs.ts +296 -0
  279. package/src/Intersection.ts +302 -0
  280. package/src/Observable.ts +181 -0
  281. package/src/Pattern.ts +227 -0
  282. package/src/Point.ts +388 -0
  283. package/src/Shadow.ts +214 -0
  284. package/src/brushes/{base_brush.class.js → BaseBrush.ts} +65 -42
  285. package/src/brushes/CircleBrush.ts +145 -0
  286. package/src/brushes/PatternBrush.ts +70 -0
  287. package/src/brushes/PencilBrush.ts +300 -0
  288. package/src/brushes/SprayBrush.ts +219 -0
  289. package/src/cache.ts +90 -0
  290. package/src/canvas/Canvas.ts +1607 -0
  291. package/src/canvas/SelectableCanvas.ts +1608 -0
  292. package/src/canvas/StaticCanvas.ts +1734 -0
  293. package/src/canvas/TextEditingManager.ts +48 -0
  294. package/src/canvas/canvas_gestures.mixin.ts +207 -0
  295. package/src/color/Color.ts +404 -0
  296. package/src/color/color_map.ts +154 -0
  297. package/src/color/constants.ts +26 -0
  298. package/src/color/util.ts +32 -0
  299. package/src/config.ts +159 -0
  300. package/src/constants.ts +20 -0
  301. package/src/controls/Control.ts +380 -0
  302. package/src/controls/changeWidth.ts +52 -0
  303. package/src/controls/commonControls.ts +105 -0
  304. package/src/controls/controlRendering.ts +138 -0
  305. package/src/controls/drag.ts +31 -0
  306. package/src/controls/index.ts +22 -0
  307. package/src/controls/polyControl.ts +135 -0
  308. package/src/controls/rotate.ts +87 -0
  309. package/src/controls/scale.ts +277 -0
  310. package/src/controls/scaleSkew.ts +92 -0
  311. package/src/controls/skew.ts +242 -0
  312. package/src/controls/util.ts +154 -0
  313. package/src/controls/wrapWithFireEvent.ts +25 -0
  314. package/src/controls/wrapWithFixedAnchor.ts +20 -0
  315. package/src/env/browser.ts +32 -0
  316. package/src/env/index.ts +24 -0
  317. package/src/env/node.ts +56 -0
  318. package/src/env/types.ts +15 -0
  319. package/src/filters/{base_filter.class.js → BaseFilter.ts} +192 -151
  320. package/src/filters/BlendColor.ts +217 -0
  321. package/src/filters/BlendImage.ts +228 -0
  322. package/src/filters/Blur.ts +179 -0
  323. package/src/filters/Boilerplate.ts +94 -0
  324. package/src/filters/Brightness.ts +83 -0
  325. package/src/filters/Canvas2dFilterBackend.ts +65 -0
  326. package/src/filters/ColorMatrix.ts +145 -0
  327. package/src/filters/ColorMatrixFilters.ts +77 -0
  328. package/src/filters/Composed.ts +76 -0
  329. package/src/filters/Contrast.ts +82 -0
  330. package/src/filters/Convolute.ts +184 -0
  331. package/src/filters/FilterBackend.ts +34 -0
  332. package/src/filters/GLProbes/GLProbe.ts +11 -0
  333. package/src/filters/GLProbes/NodeGLProbe.ts +15 -0
  334. package/src/filters/GLProbes/WebGLProbe.ts +46 -0
  335. package/src/filters/Gamma.ts +110 -0
  336. package/src/filters/Grayscale.ts +102 -0
  337. package/src/filters/HueRotation.ts +62 -0
  338. package/src/filters/Invert.ts +99 -0
  339. package/src/filters/Noise.ts +94 -0
  340. package/src/filters/Pixelate.ts +96 -0
  341. package/src/filters/RemoveColor.ts +135 -0
  342. package/src/filters/Resize.ts +538 -0
  343. package/src/filters/Saturation.ts +87 -0
  344. package/src/filters/Vibrance.ts +88 -0
  345. package/src/filters/WebGLFilterBackend.ts +430 -0
  346. package/src/filters/filters.ts +28 -0
  347. package/src/filters/index.ts +5 -0
  348. package/src/filters/shaders/baseFilter.ts +19 -0
  349. package/src/filters/shaders/blendColor.ts +33 -0
  350. package/src/filters/shaders/blendImage.ts +32 -0
  351. package/src/filters/shaders/blur.ts +24 -0
  352. package/src/filters/shaders/brightness.ts +11 -0
  353. package/src/filters/shaders/colorMatrix.ts +12 -0
  354. package/src/filters/shaders/constrast.ts +11 -0
  355. package/src/filters/shaders/convolute.ts +154 -0
  356. package/src/filters/shaders/gamma.ts +15 -0
  357. package/src/filters/shaders/grayscale.ts +36 -0
  358. package/src/filters/shaders/invert.ts +19 -0
  359. package/src/filters/shaders/noise.ts +16 -0
  360. package/src/filters/shaders/pixelate.ts +19 -0
  361. package/src/filters/shaders/removeColor.ts +13 -0
  362. package/src/filters/shaders/saturation.ts +15 -0
  363. package/src/filters/shaders/vibrance.ts +16 -0
  364. package/src/filters/typedefs.ts +65 -0
  365. package/src/gradient/Gradient.ts +406 -0
  366. package/src/gradient/constants.ts +12 -0
  367. package/src/gradient/parser/index.ts +3 -0
  368. package/src/gradient/parser/misc.ts +13 -0
  369. package/src/gradient/parser/parseColorStops.ts +56 -0
  370. package/src/gradient/parser/parseCoords.ts +73 -0
  371. package/src/gradient/typedefs.ts +104 -0
  372. package/src/mixins/{eraser_brush.mixin.js → eraser_brush.mixin.ts} +350 -239
  373. package/src/parkinglot/canvas_animation.mixin.ts +121 -0
  374. package/src/parkinglot/straighten.ts +58 -0
  375. package/src/parser/applyViewboxTransform.ts +157 -0
  376. package/src/parser/attributes.ts +25 -0
  377. package/src/parser/constants.ts +115 -0
  378. package/src/parser/doesSomeParentMatch.ts +19 -0
  379. package/src/parser/elementById.ts +21 -0
  380. package/src/parser/elementMatchesRule.ts +16 -0
  381. package/src/parser/elements_parser.ts +191 -0
  382. package/src/parser/getCSSRules.ts +62 -0
  383. package/src/parser/getGlobalStylesForElement.ts +19 -0
  384. package/src/parser/getGradientDefs.ts +31 -0
  385. package/src/parser/getMultipleNodes.ts +15 -0
  386. package/src/parser/getSvgRegex.ts +5 -0
  387. package/src/parser/hasAncestorWithNodeName.ts +14 -0
  388. package/src/parser/index.ts +9 -0
  389. package/src/parser/loadSVGFromString.ts +26 -0
  390. package/src/parser/loadSVGFromURL.ts +40 -0
  391. package/src/parser/normalizeAttr.ts +10 -0
  392. package/src/parser/normalizeValue.ts +63 -0
  393. package/src/parser/parseAttributes.ts +90 -0
  394. package/src/parser/parseElements.ts +28 -0
  395. package/src/parser/parseFontDeclaration.ts +44 -0
  396. package/src/parser/parsePointsAttribute.ts +34 -0
  397. package/src/parser/parseSVGDocument.ts +93 -0
  398. package/src/parser/parseStyleAttribute.ts +27 -0
  399. package/src/parser/parseStyleObject.ts +15 -0
  400. package/src/parser/parseStyleString.ts +16 -0
  401. package/src/parser/parseTransformAttribute.ts +155 -0
  402. package/src/parser/parseUseDirectives.ts +78 -0
  403. package/src/parser/percent.ts +27 -0
  404. package/src/parser/recursivelyParseGradientsXlink.ts +42 -0
  405. package/src/parser/rotateMatrix.ts +21 -0
  406. package/src/parser/scaleMatrix.ts +9 -0
  407. package/src/parser/selectorMatches.ts +25 -0
  408. package/src/parser/setStrokeFillOpacity.ts +40 -0
  409. package/src/parser/skewMatrix.ts +6 -0
  410. package/src/parser/translateMatrix.ts +8 -0
  411. package/src/shapes/ActiveSelection.ts +189 -0
  412. package/src/shapes/Circle.ts +242 -0
  413. package/src/shapes/Ellipse.ts +179 -0
  414. package/src/shapes/Group.ts +1100 -0
  415. package/src/shapes/IText/DraggableTextDelegate.ts +382 -0
  416. package/src/shapes/IText/IText.ts +693 -0
  417. package/src/shapes/IText/ITextBehavior.ts +1064 -0
  418. package/src/shapes/IText/ITextClickBehavior.ts +325 -0
  419. package/src/shapes/IText/ITextKeyBehavior.ts +685 -0
  420. package/src/shapes/IText/constants.ts +47 -0
  421. package/src/shapes/Image.ts +841 -0
  422. package/src/shapes/Line.ts +346 -0
  423. package/src/shapes/Object/AnimatableObject.ts +106 -0
  424. package/src/shapes/Object/FabricObject.ts +29 -0
  425. package/src/shapes/Object/FabricObjectSVGExportMixin.ts +277 -0
  426. package/src/shapes/Object/InteractiveObject.ts +672 -0
  427. package/src/shapes/Object/Object.ts +1561 -0
  428. package/src/shapes/Object/ObjectGeometry.ts +813 -0
  429. package/src/shapes/Object/ObjectOrigin.ts +276 -0
  430. package/src/shapes/Object/StackedObject.ts +206 -0
  431. package/src/shapes/Object/defaultValues.ts +108 -0
  432. package/src/shapes/Object/types/BaseProps.ts +96 -0
  433. package/src/shapes/Object/types/BorderProps.ts +40 -0
  434. package/src/shapes/Object/types/ControlProps.ts +69 -0
  435. package/src/shapes/Object/types/FabricObjectProps.ts +111 -0
  436. package/src/shapes/Object/types/FillStrokeProps.ts +90 -0
  437. package/src/shapes/Object/types/LockInteractionProps.ts +57 -0
  438. package/src/shapes/Object/types/ObjectProps.ts +46 -0
  439. package/src/shapes/Object/types/SerializedObjectProps.ts +73 -0
  440. package/src/shapes/Object/types/index.ts +8 -0
  441. package/src/shapes/Path.ts +416 -0
  442. package/src/shapes/Polygon.ts +20 -0
  443. package/src/shapes/Polyline.ts +359 -0
  444. package/src/shapes/Rect.ts +233 -0
  445. package/src/shapes/Text/StyledText.ts +329 -0
  446. package/src/shapes/Text/Text.ts +1884 -0
  447. package/src/shapes/Text/TextSVGExportMixin.ts +288 -0
  448. package/src/shapes/Text/constants.ts +91 -0
  449. package/src/shapes/Textbox.ts +477 -0
  450. package/src/shapes/Triangle.ts +60 -0
  451. package/src/typedefs.ts +115 -0
  452. package/src/util/animation/AnimationBase.ts +166 -0
  453. package/src/util/animation/AnimationFrameProvider.ts +9 -0
  454. package/src/util/animation/AnimationRegistry.ts +58 -0
  455. package/src/util/animation/ArrayAnimation.ts +27 -0
  456. package/src/util/animation/ColorAnimation.ts +74 -0
  457. package/src/util/animation/ValueAnimation.ts +29 -0
  458. package/src/util/animation/animate.ts +74 -0
  459. package/src/util/animation/easing.ts +327 -0
  460. package/src/util/animation/types.ts +136 -0
  461. package/src/util/applyMixins.ts +22 -0
  462. package/src/util/dom_event.ts +28 -0
  463. package/src/util/dom_misc.ts +121 -0
  464. package/src/util/dom_request.ts +64 -0
  465. package/src/util/dom_style.ts +20 -0
  466. package/src/util/fireEvent.ts +15 -0
  467. package/src/util/index.ts +102 -0
  468. package/src/util/internals/cloneDeep.ts +2 -0
  469. package/src/util/internals/getRandomInt.ts +8 -0
  470. package/src/util/internals/ifNaN.ts +9 -0
  471. package/src/util/internals/index.ts +3 -0
  472. package/src/util/internals/removeFromArray.ts +14 -0
  473. package/src/util/internals/uid.ts +3 -0
  474. package/src/util/lang_string.ts +79 -0
  475. package/src/util/misc/boundingBoxFromPoints.ts +37 -0
  476. package/src/util/misc/capValue.ts +2 -0
  477. package/src/util/misc/cos.ts +24 -0
  478. package/src/util/misc/dom.ts +50 -0
  479. package/src/util/misc/findScaleTo.ts +44 -0
  480. package/src/util/misc/groupSVGElements.ts +15 -0
  481. package/src/util/misc/isTransparent.ts +28 -0
  482. package/src/util/misc/matrix.ts +207 -0
  483. package/src/util/misc/mergeClipPaths.ts +40 -0
  484. package/src/util/misc/objectEnlive.ts +189 -0
  485. package/src/util/misc/objectTransforms.ts +129 -0
  486. package/src/util/misc/pick.ts +29 -0
  487. package/src/util/misc/planeChange.ts +136 -0
  488. package/src/util/misc/projectStroke/StrokeLineCapProjections.ts +112 -0
  489. package/src/util/misc/projectStroke/StrokeLineJoinProjections.ts +226 -0
  490. package/src/util/misc/projectStroke/StrokeProjectionsBase.ts +75 -0
  491. package/src/util/misc/projectStroke/index.ts +53 -0
  492. package/src/util/misc/projectStroke/types.ts +24 -0
  493. package/src/util/misc/radiansDegreesConversion.ts +18 -0
  494. package/src/util/misc/resolveOrigin.ts +22 -0
  495. package/src/util/misc/rotatePoint.ts +15 -0
  496. package/src/util/misc/sin.ts +26 -0
  497. package/src/util/misc/svgParsing.ts +181 -0
  498. package/src/util/misc/textStyles.ts +134 -0
  499. package/src/util/misc/toFixed.ts +8 -0
  500. package/src/util/misc/vectors.ts +82 -0
  501. package/src/util/path/index.ts +1038 -0
  502. package/src/util/path/regex.ts +41 -0
  503. package/src/util/path/typechecks.ts +145 -0
  504. package/src/util/path/typedefs.ts +305 -0
  505. package/src/util/transform_matrix_removal.ts +60 -0
  506. package/src/util/types.ts +78 -0
  507. package/tsconfig.json +106 -0
  508. package/HEADER.js +0 -203
  509. package/build.js +0 -287
  510. package/dist/fabric.js +0 -31187
  511. package/dist/fabric.min.js +0 -1
  512. package/old-travis-reference.yml +0 -97
  513. package/src/brushes/circle_brush.class.js +0 -144
  514. package/src/brushes/pattern_brush.class.js +0 -61
  515. package/src/brushes/pencil_brush.class.js +0 -310
  516. package/src/brushes/spray_brush.class.js +0 -219
  517. package/src/canvas.class.js +0 -1312
  518. package/src/color.class.js +0 -636
  519. package/src/control.class.js +0 -339
  520. package/src/controls.actions.js +0 -740
  521. package/src/controls.render.js +0 -99
  522. package/src/elements_parser.js +0 -152
  523. package/src/filters/2d_backend.class.js +0 -65
  524. package/src/filters/blendcolor_filter.class.js +0 -251
  525. package/src/filters/blendimage_filter.class.js +0 -247
  526. package/src/filters/blur_filter.class.js +0 -217
  527. package/src/filters/brightness_filter.class.js +0 -113
  528. package/src/filters/colormatrix_filter.class.js +0 -159
  529. package/src/filters/composed_filter.class.js +0 -72
  530. package/src/filters/contrast_filter.class.js +0 -113
  531. package/src/filters/convolute_filter.class.js +0 -352
  532. package/src/filters/filter_boilerplate.js +0 -111
  533. package/src/filters/filter_generator.js +0 -85
  534. package/src/filters/gamma_filter.class.js +0 -136
  535. package/src/filters/grayscale_filter.class.js +0 -154
  536. package/src/filters/hue_rotation.class.js +0 -107
  537. package/src/filters/invert_filter.class.js +0 -111
  538. package/src/filters/noise_filter.class.js +0 -134
  539. package/src/filters/pixelate_filter.class.js +0 -137
  540. package/src/filters/removecolor_filter.class.js +0 -173
  541. package/src/filters/resize_filter.class.js +0 -490
  542. package/src/filters/saturate_filter.class.js +0 -119
  543. package/src/filters/vibrance_filter.class.js +0 -122
  544. package/src/filters/webgl_backend.class.js +0 -396
  545. package/src/globalFabric.js +0 -4
  546. package/src/gradient.class.js +0 -490
  547. package/src/intersection.class.js +0 -172
  548. package/src/log.js +0 -11
  549. package/src/mixins/animation.mixin.js +0 -231
  550. package/src/mixins/canvas_dataurl_exporter.mixin.js +0 -97
  551. package/src/mixins/canvas_events.mixin.js +0 -974
  552. package/src/mixins/canvas_gestures.mixin.js +0 -149
  553. package/src/mixins/canvas_grouping.mixin.js +0 -177
  554. package/src/mixins/canvas_serialization.mixin.js +0 -228
  555. package/src/mixins/collection.mixin.js +0 -170
  556. package/src/mixins/default_controls.js +0 -114
  557. package/src/mixins/itext.svg_export.js +0 -241
  558. package/src/mixins/itext_behavior.mixin.js +0 -940
  559. package/src/mixins/itext_click_behavior.mixin.js +0 -278
  560. package/src/mixins/itext_key_behavior.mixin.js +0 -694
  561. package/src/mixins/object.svg_export.js +0 -258
  562. package/src/mixins/object_geometry.mixin.js +0 -683
  563. package/src/mixins/object_interactivity.mixin.js +0 -314
  564. package/src/mixins/object_origin.mixin.js +0 -255
  565. package/src/mixins/object_stacking.mixin.js +0 -80
  566. package/src/mixins/object_straightening.mixin.js +0 -80
  567. package/src/mixins/observable.mixin.js +0 -141
  568. package/src/mixins/shared_methods.mixin.js +0 -94
  569. package/src/mixins/stateful.mixin.js +0 -107
  570. package/src/mixins/text_style.mixin.js +0 -324
  571. package/src/parser.js +0 -1090
  572. package/src/pattern.class.js +0 -189
  573. package/src/point.class.js +0 -337
  574. package/src/shadow.class.js +0 -195
  575. package/src/shapes/active_selection.class.js +0 -155
  576. package/src/shapes/circle.class.js +0 -210
  577. package/src/shapes/ellipse.class.js +0 -181
  578. package/src/shapes/group.class.js +0 -593
  579. package/src/shapes/image.class.js +0 -764
  580. package/src/shapes/itext.class.js +0 -526
  581. package/src/shapes/line.class.js +0 -324
  582. package/src/shapes/object.class.js +0 -2008
  583. package/src/shapes/path.class.js +0 -384
  584. package/src/shapes/polygon.class.js +0 -81
  585. package/src/shapes/polyline.class.js +0 -268
  586. package/src/shapes/rect.class.js +0 -187
  587. package/src/shapes/text.class.js +0 -1696
  588. package/src/shapes/textbox.class.js +0 -461
  589. package/src/shapes/triangle.class.js +0 -93
  590. package/src/static_canvas.class.js +0 -1881
  591. package/src/util/anim_ease.js +0 -398
  592. package/src/util/animate.js +0 -254
  593. package/src/util/animate_color.js +0 -74
  594. package/src/util/dom_event.js +0 -50
  595. package/src/util/dom_misc.js +0 -300
  596. package/src/util/dom_request.js +0 -54
  597. package/src/util/dom_style.js +0 -70
  598. package/src/util/lang_array.js +0 -94
  599. package/src/util/lang_class.js +0 -115
  600. package/src/util/lang_object.js +0 -75
  601. package/src/util/lang_string.js +0 -110
  602. package/src/util/misc.js +0 -1330
  603. package/src/util/named_accessors.mixin.js +0 -428
  604. package/src/util/path.js +0 -829
@@ -0,0 +1,813 @@
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
+ calcRotateMatrix,
16
+ composeMatrix,
17
+ invertTransform,
18
+ multiplyTransformMatrices,
19
+ qrDecompose,
20
+ transformPoint,
21
+ } from '../../util/misc/matrix';
22
+ import { degreesToRadians } from '../../util/misc/radiansDegreesConversion';
23
+ import { sin } from '../../util/misc/sin';
24
+ import type { Canvas } from '../../canvas/Canvas';
25
+ import type { StaticCanvas } from '../../canvas/StaticCanvas';
26
+ import { ObjectOrigin } from './ObjectOrigin';
27
+ import { ObjectEvents } from '../../EventTypeDefs';
28
+ import { ControlProps } from './types/ControlProps';
29
+
30
+ type TLineDescriptor = {
31
+ o: Point;
32
+ d: Point;
33
+ };
34
+
35
+ type TBBoxLines = {
36
+ topline: TLineDescriptor;
37
+ leftline: TLineDescriptor;
38
+ bottomline: TLineDescriptor;
39
+ rightline: TLineDescriptor;
40
+ };
41
+
42
+ type TMatrixCache = {
43
+ key: string;
44
+ value: TMat2D;
45
+ };
46
+
47
+ type TACoords = TCornerPoint;
48
+
49
+ export class ObjectGeometry<EventSpec extends ObjectEvents = ObjectEvents>
50
+ extends ObjectOrigin<EventSpec>
51
+ implements Pick<ControlProps, 'padding'>
52
+ {
53
+ declare padding: number;
54
+
55
+ /**
56
+ * Describe object's corner position in canvas object absolute coordinates
57
+ * properties are tl,tr,bl,br and describe the four main corner.
58
+ * each property is an object with x, y, instance of Fabric.Point.
59
+ * The coordinates depends from this properties: width, height, scaleX, scaleY
60
+ * skewX, skewY, angle, strokeWidth, top, left.
61
+ * Those coordinates are useful to understand where an object is. They get updated
62
+ * with lineCoords or oCoords in interactive cases but they do not need to be updated when zoom or panning change.
63
+ * The coordinates get updated with @method setCoords.
64
+ * You can calculate them without updating with @method calcACoords();
65
+ */
66
+ declare aCoords: TACoords;
67
+
68
+ /**
69
+ * Describe object's corner position in canvas element coordinates.
70
+ * includes padding. Used of object detection.
71
+ * set and refreshed with setCoords.
72
+ * Those could go away
73
+ * @todo investigate how to get rid of those
74
+ */
75
+ declare lineCoords: TCornerPoint;
76
+
77
+ /**
78
+ * storage cache for object transform matrix
79
+ */
80
+ declare ownMatrixCache?: TMatrixCache;
81
+
82
+ /**
83
+ * storage cache for object full transform matrix
84
+ */
85
+ declare matrixCache?: TMatrixCache;
86
+
87
+ /**
88
+ * A Reference of the Canvas where the object is actually added
89
+ * @type StaticCanvas | Canvas;
90
+ * @default undefined
91
+ * @private
92
+ */
93
+ declare canvas?: StaticCanvas | Canvas;
94
+
95
+ /**
96
+ * @returns {number} x position according to object's {@link originX} property in canvas coordinate plane
97
+ */
98
+ getX(): number {
99
+ return this.getXY().x;
100
+ }
101
+
102
+ /**
103
+ * @param {number} value x position according to object's {@link originX} property in canvas coordinate plane
104
+ */
105
+ setX(value: number) {
106
+ this.setXY(this.getXY().setX(value));
107
+ }
108
+
109
+ /**
110
+ * @returns {number} y position according to object's {@link originY} property in canvas coordinate plane
111
+ */
112
+ getY(): number {
113
+ return this.getXY().y;
114
+ }
115
+
116
+ /**
117
+ * @param {number} value y position according to object's {@link originY} property in canvas coordinate plane
118
+ */
119
+ setY(value: number) {
120
+ this.setXY(this.getXY().setY(value));
121
+ }
122
+
123
+ /**
124
+ * @returns {number} x position according to object's {@link originX} property in parent's coordinate plane\
125
+ * if parent is canvas then this property is identical to {@link getX}
126
+ */
127
+ getRelativeX(): number {
128
+ return this.left;
129
+ }
130
+
131
+ /**
132
+ * @param {number} value x position according to object's {@link originX} property in parent's coordinate plane\
133
+ * if parent is canvas then this method is identical to {@link setX}
134
+ */
135
+ setRelativeX(value: number) {
136
+ this.left = value;
137
+ }
138
+
139
+ /**
140
+ * @returns {number} y position according to object's {@link originY} property in parent's coordinate plane\
141
+ * if parent is canvas then this property is identical to {@link getY}
142
+ */
143
+ getRelativeY(): number {
144
+ return this.top;
145
+ }
146
+
147
+ /**
148
+ * @param {number} value y position according to object's {@link originY} property in parent's coordinate plane\
149
+ * if parent is canvas then this property is identical to {@link setY}
150
+ */
151
+ setRelativeY(value: number) {
152
+ this.top = value;
153
+ }
154
+
155
+ /**
156
+ * @returns {Point} x position according to object's {@link originX} {@link originY} properties in canvas coordinate plane
157
+ */
158
+ getXY(): Point {
159
+ const relativePosition = this.getRelativeXY();
160
+ return this.group
161
+ ? transformPoint(relativePosition, this.group.calcTransformMatrix())
162
+ : relativePosition;
163
+ }
164
+
165
+ /**
166
+ * Set an object position to a particular point, the point is intended in absolute ( canvas ) coordinate.
167
+ * You can specify {@link originX} and {@link originY} values,
168
+ * that otherwise are the object's current values.
169
+ * @example <caption>Set object's bottom left corner to point (5,5) on canvas</caption>
170
+ * object.setXY(new Point(5, 5), 'left', 'bottom').
171
+ * @param {Point} point position in canvas coordinate plane
172
+ * @param {TOriginX} [originX] Horizontal origin: 'left', 'center' or 'right'
173
+ * @param {TOriginY} [originY] Vertical origin: 'top', 'center' or 'bottom'
174
+ */
175
+ setXY(point: Point, originX?: TOriginX, originY?: TOriginY) {
176
+ if (this.group) {
177
+ point = transformPoint(
178
+ point,
179
+ invertTransform(this.group.calcTransformMatrix())
180
+ );
181
+ }
182
+ this.setRelativeXY(point, originX, originY);
183
+ }
184
+
185
+ /**
186
+ * @returns {Point} x,y position according to object's {@link originX} {@link originY} properties in parent's coordinate plane
187
+ */
188
+ getRelativeXY(): Point {
189
+ return new Point(this.left, this.top);
190
+ }
191
+
192
+ /**
193
+ * As {@link setXY}, but in current parent's coordinate plane (the current group if any or the canvas)
194
+ * @param {Point} point position according to object's {@link originX} {@link originY} properties in parent's coordinate plane
195
+ * @param {TOriginX} [originX] Horizontal origin: 'left', 'center' or 'right'
196
+ * @param {TOriginY} [originY] Vertical origin: 'top', 'center' or 'bottom'
197
+ */
198
+ setRelativeXY(point: Point, originX?: TOriginX, originY?: TOriginY) {
199
+ this.setPositionByOrigin(
200
+ point,
201
+ originX || this.originX,
202
+ originY || this.originY
203
+ );
204
+ }
205
+
206
+ /**
207
+ * return correct set of coordinates for intersection
208
+ * this will return either aCoords or lineCoords.
209
+ * @param {boolean} absolute will return aCoords if true or lineCoords
210
+ * @param {boolean} calculate will calculate the coords or use the one
211
+ * that are attached to the object instance
212
+ * @return {Object} {tl, tr, br, bl} points
213
+ */
214
+ _getCoords(absolute = false, calculate = false): TCornerPoint {
215
+ if (calculate) {
216
+ return absolute ? this.calcACoords() : this.calcLineCoords();
217
+ }
218
+ // swapped this double if in place of setCoords();
219
+ if (!this.aCoords) {
220
+ this.aCoords = this.calcACoords();
221
+ }
222
+ if (!this.lineCoords) {
223
+ this.lineCoords = this.calcLineCoords();
224
+ }
225
+ return absolute ? this.aCoords : this.lineCoords;
226
+ }
227
+
228
+ /**
229
+ * return correct set of coordinates for intersection
230
+ * this will return either aCoords or lineCoords.
231
+ * The coords are returned in an array.
232
+ * @param {boolean} absolute will return aCoords if true or lineCoords
233
+ * @param {boolean} calculate will return aCoords if true or lineCoords
234
+ * @return {Array} [tl, tr, br, bl] of points
235
+ */
236
+ getCoords(absolute = false, calculate = false): Point[] {
237
+ const { tl, tr, br, bl } = this._getCoords(absolute, calculate);
238
+ const coords = [tl, tr, br, bl];
239
+ if (this.group) {
240
+ const t = this.group.calcTransformMatrix();
241
+ return coords.map((p) => transformPoint(p, t));
242
+ }
243
+ return coords;
244
+ }
245
+
246
+ /**
247
+ * Checks if object intersects with an area formed by 2 points
248
+ * @param {Object} pointTL top-left point of area
249
+ * @param {Object} pointBR bottom-right point of area
250
+ * @param {Boolean} [absolute] use coordinates without viewportTransform
251
+ * @param {Boolean} [calculate] use coordinates of current position instead of stored one
252
+ * @return {Boolean} true if object intersects with an area formed by 2 points
253
+ */
254
+ intersectsWithRect(
255
+ pointTL: Point,
256
+ pointBR: Point,
257
+ absolute?: boolean,
258
+ calculate?: boolean
259
+ ): boolean {
260
+ const coords = this.getCoords(absolute, calculate),
261
+ intersection = Intersection.intersectPolygonRectangle(
262
+ coords,
263
+ pointTL,
264
+ pointBR
265
+ );
266
+ return intersection.status === 'Intersection';
267
+ }
268
+
269
+ /**
270
+ * Checks if object intersects with another object
271
+ * @param {Object} other Object to test
272
+ * @param {Boolean} [absolute] use coordinates without viewportTransform
273
+ * @param {Boolean} [calculate] use coordinates of current position instead of calculating them
274
+ * @return {Boolean} true if object intersects with another object
275
+ */
276
+ intersectsWithObject(
277
+ other: ObjectGeometry,
278
+ absolute = false,
279
+ calculate = false
280
+ ): boolean {
281
+ const intersection = Intersection.intersectPolygonPolygon(
282
+ this.getCoords(absolute, calculate),
283
+ other.getCoords(absolute, calculate)
284
+ );
285
+
286
+ return (
287
+ intersection.status === 'Intersection' ||
288
+ intersection.status === 'Coincident' ||
289
+ other.isContainedWithinObject(this, absolute, calculate) ||
290
+ this.isContainedWithinObject(other, absolute, calculate)
291
+ );
292
+ }
293
+
294
+ /**
295
+ * Checks if object is fully contained within area of another object
296
+ * @param {Object} other Object to test
297
+ * @param {Boolean} [absolute] use coordinates without viewportTransform
298
+ * @param {Boolean} [calculate] use coordinates of current position instead of store ones
299
+ * @return {Boolean} true if object is fully contained within area of another object
300
+ */
301
+ isContainedWithinObject(
302
+ other: ObjectGeometry,
303
+ absolute = false,
304
+ calculate = false
305
+ ): boolean {
306
+ const points = this.getCoords(absolute, calculate),
307
+ otherCoords = absolute ? other.aCoords : other.lineCoords,
308
+ lines = other._getImageLines(otherCoords);
309
+ for (let i = 0; i < 4; i++) {
310
+ if (!other.containsPoint(points[i], lines)) {
311
+ return false;
312
+ }
313
+ }
314
+ return true;
315
+ }
316
+
317
+ /**
318
+ * Checks if object is fully contained within area formed by 2 points
319
+ * @param {Object} pointTL top-left point of area
320
+ * @param {Object} pointBR bottom-right point of area
321
+ * @param {Boolean} [absolute] use coordinates without viewportTransform
322
+ * @param {Boolean} [calculate] use coordinates of current position instead of stored one
323
+ * @return {Boolean} true if object is fully contained within area formed by 2 points
324
+ */
325
+ isContainedWithinRect(
326
+ pointTL: Point,
327
+ pointBR: Point,
328
+ absolute?: boolean,
329
+ calculate?: boolean
330
+ ): boolean {
331
+ const boundingRect = this.getBoundingRect(absolute, calculate);
332
+ return (
333
+ boundingRect.left >= pointTL.x &&
334
+ boundingRect.left + boundingRect.width <= pointBR.x &&
335
+ boundingRect.top >= pointTL.y &&
336
+ boundingRect.top + boundingRect.height <= pointBR.y
337
+ );
338
+ }
339
+
340
+ isOverlapping<T extends ObjectGeometry>(other: T): boolean {
341
+ return (
342
+ this.intersectsWithObject(other) ||
343
+ this.isContainedWithinObject(other) ||
344
+ other.isContainedWithinObject(this)
345
+ );
346
+ }
347
+
348
+ /**
349
+ * Checks if point is inside the object
350
+ * @param {Point} point Point to check against
351
+ * @param {Object} [lines] object returned from @method _getImageLines
352
+ * @param {Boolean} [absolute] use coordinates without viewportTransform
353
+ * @param {Boolean} [calculate] use coordinates of current position instead of stored ones
354
+ * @return {Boolean} true if point is inside the object
355
+ */
356
+ containsPoint(
357
+ point: Point,
358
+ lines?: TBBoxLines,
359
+ absolute = false,
360
+ calculate = false
361
+ ): boolean {
362
+ const coords = this._getCoords(absolute, calculate),
363
+ imageLines = lines || this._getImageLines(coords),
364
+ xPoints = this._findCrossPoints(point, imageLines);
365
+ // if xPoints is odd then point is inside the object
366
+ return xPoints !== 0 && xPoints % 2 === 1;
367
+ }
368
+
369
+ /**
370
+ * Checks if object is contained within the canvas with current viewportTransform
371
+ * the check is done stopping at first point that appears on screen
372
+ * @param {Boolean} [calculate] use coordinates of current position instead of .aCoords
373
+ * @return {Boolean} true if object is fully or partially contained within canvas
374
+ */
375
+ isOnScreen(calculate = false): boolean {
376
+ if (!this.canvas) {
377
+ return false;
378
+ }
379
+ const { tl, br } = this.canvas.vptCoords;
380
+ const points = this.getCoords(true, calculate);
381
+ // if some point is on screen, the object is on screen.
382
+ if (
383
+ points.some(
384
+ (point) =>
385
+ point.x <= br.x &&
386
+ point.x >= tl.x &&
387
+ point.y <= br.y &&
388
+ point.y >= tl.y
389
+ )
390
+ ) {
391
+ return true;
392
+ }
393
+ // no points on screen, check intersection with absolute coordinates
394
+ if (this.intersectsWithRect(tl, br, true, calculate)) {
395
+ return true;
396
+ }
397
+ return this._containsCenterOfCanvas(tl, br, calculate);
398
+ }
399
+
400
+ /**
401
+ * Checks if the object contains the midpoint between canvas extremities
402
+ * Does not make sense outside the context of isOnScreen and isPartiallyOnScreen
403
+ * @private
404
+ * @param {Point} pointTL Top Left point
405
+ * @param {Point} pointBR Top Right point
406
+ * @param {Boolean} calculate use coordinates of current position instead of stored ones
407
+ * @return {Boolean} true if the object contains the point
408
+ */
409
+ private _containsCenterOfCanvas(
410
+ pointTL: Point,
411
+ pointBR: Point,
412
+ calculate?: boolean
413
+ ): boolean {
414
+ // worst case scenario the object is so big that contains the screen
415
+ const centerPoint = pointTL.midPointFrom(pointBR);
416
+ return this.containsPoint(centerPoint, undefined, true, calculate);
417
+ }
418
+
419
+ /**
420
+ * Checks if object is partially contained within the canvas with current viewportTransform
421
+ * @param {Boolean} [calculate] use coordinates of current position instead of stored ones
422
+ * @return {Boolean} true if object is partially contained within canvas
423
+ */
424
+ isPartiallyOnScreen(calculate?: boolean): boolean {
425
+ if (!this.canvas) {
426
+ return false;
427
+ }
428
+ const { tl, br } = this.canvas.vptCoords;
429
+ if (this.intersectsWithRect(tl, br, true, calculate)) {
430
+ return true;
431
+ }
432
+ const allPointsAreOutside = this.getCoords(true, calculate).every(
433
+ (point) =>
434
+ (point.x >= br.x || point.x <= tl.x) &&
435
+ (point.y >= br.y || point.y <= tl.y)
436
+ );
437
+ return (
438
+ allPointsAreOutside && this._containsCenterOfCanvas(tl, br, calculate)
439
+ );
440
+ }
441
+
442
+ /**
443
+ * Method that returns an object with the object edges in it, given the coordinates of the corners
444
+ * @private
445
+ * @param {Object} lineCoords or aCoords Coordinates of the object corners
446
+ */
447
+ _getImageLines({ tl, tr, bl, br }: TCornerPoint): TBBoxLines {
448
+ const lines = {
449
+ topline: {
450
+ o: tl,
451
+ d: tr,
452
+ },
453
+ rightline: {
454
+ o: tr,
455
+ d: br,
456
+ },
457
+ bottomline: {
458
+ o: br,
459
+ d: bl,
460
+ },
461
+ leftline: {
462
+ o: bl,
463
+ d: tl,
464
+ },
465
+ };
466
+
467
+ // // debugging
468
+ // if (this.canvas.contextTop) {
469
+ // this.canvas.contextTop.fillRect(lines.bottomline.d.x, lines.bottomline.d.y, 2, 2);
470
+ // this.canvas.contextTop.fillRect(lines.bottomline.o.x, lines.bottomline.o.y, 2, 2);
471
+ //
472
+ // this.canvas.contextTop.fillRect(lines.leftline.d.x, lines.leftline.d.y, 2, 2);
473
+ // this.canvas.contextTop.fillRect(lines.leftline.o.x, lines.leftline.o.y, 2, 2);
474
+ //
475
+ // this.canvas.contextTop.fillRect(lines.topline.d.x, lines.topline.d.y, 2, 2);
476
+ // this.canvas.contextTop.fillRect(lines.topline.o.x, lines.topline.o.y, 2, 2);
477
+ //
478
+ // this.canvas.contextTop.fillRect(lines.rightline.d.x, lines.rightline.d.y, 2, 2);
479
+ // this.canvas.contextTop.fillRect(lines.rightline.o.x, lines.rightline.o.y, 2, 2);
480
+ // }
481
+
482
+ return lines;
483
+ }
484
+
485
+ /**
486
+ * Helper method to determine how many cross points are between the 4 object edges
487
+ * and the horizontal line determined by a point on canvas
488
+ * @private
489
+ * @param {Point} point Point to check
490
+ * @param {Object} lines Coordinates of the object being evaluated
491
+ * @return {number} number of crossPoint
492
+ */
493
+ _findCrossPoints(point: Point, lines: TBBoxLines): number {
494
+ let xcount = 0;
495
+
496
+ for (const lineKey in lines) {
497
+ let xi;
498
+ const iLine = lines[lineKey as keyof TBBoxLines];
499
+ // optimization 1: line below point. no cross
500
+ if (iLine.o.y < point.y && iLine.d.y < point.y) {
501
+ continue;
502
+ }
503
+ // optimization 2: line above point. no cross
504
+ if (iLine.o.y >= point.y && iLine.d.y >= point.y) {
505
+ continue;
506
+ }
507
+ // optimization 3: vertical line case
508
+ if (iLine.o.x === iLine.d.x && iLine.o.x >= point.x) {
509
+ xi = iLine.o.x;
510
+ }
511
+ // calculate the intersection point
512
+ else {
513
+ const b1 = 0;
514
+ const b2 = (iLine.d.y - iLine.o.y) / (iLine.d.x - iLine.o.x);
515
+ const a1 = point.y - b1 * point.x;
516
+ const a2 = iLine.o.y - b2 * iLine.o.x;
517
+
518
+ xi = -(a1 - a2) / (b1 - b2);
519
+ }
520
+ // don't count xi < point.x cases
521
+ if (xi >= point.x) {
522
+ xcount += 1;
523
+ }
524
+ // optimization 4: specific for square images
525
+ if (xcount === 2) {
526
+ break;
527
+ }
528
+ }
529
+ return xcount;
530
+ }
531
+
532
+ /**
533
+ * Returns coordinates of object's bounding rectangle (left, top, width, height)
534
+ * the box is intended as aligned to axis of canvas.
535
+ * @param {Boolean} [absolute] use coordinates without viewportTransform
536
+ * @param {Boolean} [calculate] use coordinates of current position instead of .lineCoords / .aCoords
537
+ * @return {Object} Object with left, top, width, height properties
538
+ */
539
+ getBoundingRect(absolute?: boolean, calculate?: boolean): TBBox {
540
+ return makeBoundingBoxFromPoints(this.getCoords(absolute, calculate));
541
+ }
542
+
543
+ /**
544
+ * Returns width of an object's bounding box counting transformations
545
+ * @todo shouldn't this account for group transform and return the actual size in canvas coordinate plane?
546
+ * @return {Number} width value
547
+ */
548
+ getScaledWidth(): number {
549
+ return this._getTransformedDimensions().x;
550
+ }
551
+
552
+ /**
553
+ * Returns height of an object bounding box counting transformations
554
+ * @todo shouldn't this account for group transform and return the actual size in canvas coordinate plane?
555
+ * @return {Number} height value
556
+ */
557
+ getScaledHeight(): number {
558
+ return this._getTransformedDimensions().y;
559
+ }
560
+
561
+ /**
562
+ * Scales an object (equally by x and y)
563
+ * @param {Number} value Scale factor
564
+ * @return {void}
565
+ */
566
+ scale(value: number): void {
567
+ this._set('scaleX', value);
568
+ this._set('scaleY', value);
569
+ this.setCoords();
570
+ }
571
+
572
+ /**
573
+ * Scales an object to a given width, with respect to bounding box (scaling by x/y equally)
574
+ * @param {Number} value New width value
575
+ * @param {Boolean} absolute ignore viewport
576
+ * @return {void}
577
+ */
578
+ scaleToWidth(value: number, absolute?: boolean) {
579
+ // adjust to bounding rect factor so that rotated shapes would fit as well
580
+ const boundingRectFactor =
581
+ this.getBoundingRect(absolute).width / this.getScaledWidth();
582
+ return this.scale(value / this.width / boundingRectFactor);
583
+ }
584
+
585
+ /**
586
+ * Scales an object to a given height, with respect to bounding box (scaling by x/y equally)
587
+ * @param {Number} value New height value
588
+ * @param {Boolean} absolute ignore viewport
589
+ * @return {void}
590
+ */
591
+ scaleToHeight(value: number, absolute = false) {
592
+ // adjust to bounding rect factor so that rotated shapes would fit as well
593
+ const boundingRectFactor =
594
+ this.getBoundingRect(absolute).height / this.getScaledHeight();
595
+ return this.scale(value / this.height / boundingRectFactor);
596
+ }
597
+
598
+ getCanvasRetinaScaling() {
599
+ return this.canvas?.getRetinaScaling() || 1;
600
+ }
601
+
602
+ /**
603
+ * Returns the object angle relative to canvas counting also the group property
604
+ * @returns {TDegree}
605
+ */
606
+ getTotalAngle(): TDegree {
607
+ return this.group
608
+ ? qrDecompose(this.calcTransformMatrix()).angle
609
+ : this.angle;
610
+ }
611
+
612
+ /**
613
+ * return the coordinate of the 4 corners of the bounding box in HTMLCanvasElement coordinates
614
+ * used for bounding box interactivity with the mouse
615
+ * @returns {TCornerPoint}
616
+ */
617
+ calcLineCoords(): TCornerPoint {
618
+ const vpt = this.getViewportTransform(),
619
+ padding = this.padding,
620
+ angle = degreesToRadians(this.getTotalAngle()),
621
+ cosP = cos(angle) * padding,
622
+ sinP = sin(angle) * padding,
623
+ cosPSinP = cosP + sinP,
624
+ cosPMinusSinP = cosP - sinP,
625
+ { tl, tr, bl, br } = this.calcACoords();
626
+
627
+ const lineCoords: TCornerPoint = {
628
+ tl: transformPoint(tl, vpt),
629
+ tr: transformPoint(tr, vpt),
630
+ bl: transformPoint(bl, vpt),
631
+ br: transformPoint(br, vpt),
632
+ };
633
+
634
+ if (padding) {
635
+ lineCoords.tl.x -= cosPMinusSinP;
636
+ lineCoords.tl.y -= cosPSinP;
637
+ lineCoords.tr.x += cosPSinP;
638
+ lineCoords.tr.y -= cosPMinusSinP;
639
+ lineCoords.bl.x -= cosPSinP;
640
+ lineCoords.bl.y += cosPMinusSinP;
641
+ lineCoords.br.x += cosPMinusSinP;
642
+ lineCoords.br.y += cosPSinP;
643
+ }
644
+
645
+ return lineCoords;
646
+ }
647
+
648
+ /**
649
+ * Retrieves viewportTransform from Object's canvas if possible
650
+ * @method getViewportTransform
651
+ * @memberOf FabricObject.prototype
652
+ * @return {TMat2D}
653
+ */
654
+ getViewportTransform(): TMat2D {
655
+ return this.canvas?.viewportTransform || (iMatrix.concat() as TMat2D);
656
+ }
657
+
658
+ /**
659
+ * Calculates the coordinates of the 4 corner of the bbox, in absolute coordinates.
660
+ * those never change with zoom or viewport changes.
661
+ * @return {TCornerPoint}
662
+ */
663
+ calcACoords(): TCornerPoint {
664
+ const rotateMatrix = calcRotateMatrix({ angle: this.angle }),
665
+ center = this.getRelativeCenterPoint(),
666
+ translateMatrix = [1, 0, 0, 1, center.x, center.y] as TMat2D,
667
+ finalMatrix = multiplyTransformMatrices(translateMatrix, rotateMatrix),
668
+ dim = this._getTransformedDimensions(),
669
+ w = dim.x / 2,
670
+ h = dim.y / 2;
671
+ return {
672
+ // corners
673
+ tl: transformPoint({ x: -w, y: -h }, finalMatrix),
674
+ tr: transformPoint({ x: w, y: -h }, finalMatrix),
675
+ bl: transformPoint({ x: -w, y: h }, finalMatrix),
676
+ br: transformPoint({ x: w, y: h }, finalMatrix),
677
+ };
678
+ }
679
+
680
+ /**
681
+ * Sets corner and controls position coordinates based on current angle, width and height, left and top.
682
+ * aCoords are used to quickly find an object on the canvas
683
+ * lineCoords are used to quickly find object during pointer events.
684
+ * See {@link https://github.com/fabricjs/fabric.js/wiki/When-to-call-setCoords} and {@link http://fabricjs.com/fabric-gotchas}
685
+ * @param {Boolean} [skipCorners] skip calculation of aCoord, lineCoords.
686
+ * @return {void}
687
+ */
688
+ setCoords(): void {
689
+ this.aCoords = this.calcACoords();
690
+ // in case we are in a group, for how the inner group target check works,
691
+ // lineCoords are exactly aCoords. Since the vpt gets absorbed by the normalized pointer.
692
+ this.lineCoords = this.group ? this.aCoords : this.calcLineCoords();
693
+ }
694
+
695
+ transformMatrixKey(skipGroup = false): string {
696
+ const sep = '_';
697
+ let prefix = '';
698
+ if (!skipGroup && this.group) {
699
+ prefix = this.group.transformMatrixKey(skipGroup) + sep;
700
+ }
701
+ return (
702
+ prefix +
703
+ this.top +
704
+ sep +
705
+ this.left +
706
+ sep +
707
+ this.scaleX +
708
+ sep +
709
+ this.scaleY +
710
+ sep +
711
+ this.skewX +
712
+ sep +
713
+ this.skewY +
714
+ sep +
715
+ this.angle +
716
+ sep +
717
+ this.originX +
718
+ sep +
719
+ this.originY +
720
+ sep +
721
+ this.width +
722
+ sep +
723
+ this.height +
724
+ sep +
725
+ this.strokeWidth +
726
+ this.flipX +
727
+ this.flipY
728
+ );
729
+ }
730
+
731
+ /**
732
+ * calculate transform matrix that represents the current transformations from the
733
+ * object's properties.
734
+ * @param {Boolean} [skipGroup] return transform matrix for object not counting parent transformations
735
+ * There are some situation in which this is useful to avoid the fake rotation.
736
+ * @return {TMat2D} transform matrix for the object
737
+ */
738
+ calcTransformMatrix(skipGroup = false): TMat2D {
739
+ let matrix = this.calcOwnMatrix();
740
+ if (skipGroup || !this.group) {
741
+ return matrix;
742
+ }
743
+ const key = this.transformMatrixKey(skipGroup),
744
+ cache = this.matrixCache;
745
+ if (cache && cache.key === key) {
746
+ return cache.value;
747
+ }
748
+ if (this.group) {
749
+ matrix = multiplyTransformMatrices(
750
+ this.group.calcTransformMatrix(false),
751
+ matrix
752
+ );
753
+ }
754
+ this.matrixCache = {
755
+ key,
756
+ value: matrix,
757
+ };
758
+ return matrix;
759
+ }
760
+
761
+ /**
762
+ * calculate transform matrix that represents the current transformations from the
763
+ * object's properties, this matrix does not include the group transformation
764
+ * @return {TMat2D} transform matrix for the object
765
+ */
766
+ calcOwnMatrix(): TMat2D {
767
+ const key = this.transformMatrixKey(true),
768
+ cache = this.ownMatrixCache;
769
+ if (cache && cache.key === key) {
770
+ return cache.value;
771
+ }
772
+ const center = this.getRelativeCenterPoint(),
773
+ options = {
774
+ angle: this.angle,
775
+ translateX: center.x,
776
+ translateY: center.y,
777
+ scaleX: this.scaleX,
778
+ scaleY: this.scaleY,
779
+ skewX: this.skewX,
780
+ skewY: this.skewY,
781
+ flipX: this.flipX,
782
+ flipY: this.flipY,
783
+ },
784
+ value = composeMatrix(options);
785
+ this.ownMatrixCache = {
786
+ key,
787
+ value,
788
+ };
789
+ return value;
790
+ }
791
+
792
+ /**
793
+ * Calculate object dimensions from its properties
794
+ * @private
795
+ * @returns {Point} dimensions
796
+ */
797
+ _getNonTransformedDimensions(): Point {
798
+ return new Point(this.width, this.height).scalarAdd(this.strokeWidth);
799
+ }
800
+
801
+ /**
802
+ * Calculate object dimensions for controls box, including padding and canvas zoom.
803
+ * and active selection
804
+ * @private
805
+ * @param {object} [options] transform options
806
+ * @returns {Point} dimensions
807
+ */
808
+ _calculateCurrentDimensions(options?: any): Point {
809
+ return this._getTransformedDimensions(options)
810
+ .transform(this.getViewportTransform(), true)
811
+ .scalarAdd(2 * this.padding);
812
+ }
813
+ }