fabric 5.3.0 → 6.0.0-beta1

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