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,645 @@
1
+ import { Point } from '../../Point';
2
+ import type { AssertKeys, TCornerPoint, TDegree, TMat2D } from '../../typedefs';
3
+ import { FabricObject } from './Object';
4
+ import { degreesToRadians } from '../../util/misc/radiansDegreesConversion';
5
+ import {
6
+ calcRotateMatrix,
7
+ multiplyTransformMatrices,
8
+ qrDecompose,
9
+ TQrDecomposeOut,
10
+ } from '../../util/misc/matrix';
11
+ import type { Control } from '../../controls/Control';
12
+ import { sizeAfterTransform } from '../../util/misc/objectTransforms';
13
+ import { ObjectEvents, TPointerEvent } from '../../EventTypeDefs';
14
+ import type { Canvas } from '../../canvas/Canvas';
15
+ import type { ControlRenderingStyleOverride } from '../../controls/controls.render';
16
+
17
+ type TOCoord = Point & {
18
+ corner: TCornerPoint;
19
+ touchCorner: TCornerPoint;
20
+ };
21
+
22
+ type TControlSet = Record<string, Control>;
23
+
24
+ type TBorderRenderingStyleOverride = Partial<
25
+ Pick<FabricObject, 'borderColor' | 'borderDashArray'>
26
+ >;
27
+
28
+ type TStyleOverride = ControlRenderingStyleOverride &
29
+ TBorderRenderingStyleOverride &
30
+ Partial<
31
+ Pick<FabricObject, 'hasBorders' | 'hasControls'> & {
32
+ forActiveSelection: boolean;
33
+ }
34
+ >;
35
+
36
+ export interface DragMethods {
37
+ shouldStartDragging(): boolean;
38
+ onDragStart(e: DragEvent): boolean;
39
+ }
40
+
41
+ export type FabricObjectWithDragSupport = InteractiveFabricObject & DragMethods;
42
+
43
+ export class InteractiveFabricObject<
44
+ EventSpec extends ObjectEvents = ObjectEvents
45
+ > extends FabricObject<EventSpec> {
46
+ /**
47
+ * Describe object's corner position in canvas element coordinates.
48
+ * properties are depending on control keys and padding the main controls.
49
+ * each property is an object with x, y and corner.
50
+ * The `corner` property contains in a similar manner the 4 points of the
51
+ * interactive area of the corner.
52
+ * The coordinates depends from the controls positionHandler and are used
53
+ * to draw and locate controls
54
+ */
55
+ declare oCoords: Record<string, TOCoord>;
56
+
57
+ /**
58
+ * When `true`, cache does not get updated during scaling. The picture will get blocky if scaled
59
+ * too much and will be redrawn with correct details at the end of scaling.
60
+ * this setting is performance and application dependant.
61
+ * default to true
62
+ * since 1.7.0
63
+ * @type Boolean
64
+ * @default true
65
+ */
66
+ declare noScaleCache: boolean;
67
+
68
+ /**
69
+ * keeps the value of the last hovered corner during mouse move.
70
+ * 0 is no corner, or 'mt', 'ml', 'mtr' etc..
71
+ * It should be private, but there is no harm in using it as
72
+ * a read-only property.
73
+ * this isn't cleaned automatically. Non selected objects may have wrong values
74
+ * @type [string]
75
+ */
76
+ declare __corner?: string;
77
+
78
+ /**
79
+ * a map of control visibility for this object.
80
+ * this was left when controls were introduced to not break the api too much
81
+ * this takes priority over the generic control visibility
82
+ */
83
+ declare _controlsVisibility: Record<string, boolean>;
84
+
85
+ /**
86
+ * The angle that an object will lock to while rotating.
87
+ * @type [TDegree]
88
+ */
89
+ declare snapAngle?: TDegree;
90
+
91
+ /**
92
+ * The angle difference from the current snapped angle in which snapping should occur.
93
+ * When undefined, the snapThreshold will default to the snapAngle.
94
+ * @type [TDegree]
95
+ */
96
+ declare snapThreshold?: TDegree;
97
+
98
+ /**
99
+ * holds the controls for the object.
100
+ * controls are added by default_controls.js
101
+ */
102
+ declare controls: TControlSet;
103
+
104
+ /**
105
+ * internal boolean to signal the code that the object is
106
+ * part of the move action.
107
+ */
108
+ declare isMoving?: boolean;
109
+
110
+ /**
111
+ * A boolean used from the gesture module to keep tracking of a scaling
112
+ * action when there is no scaling transform in place.
113
+ * This is an edge case and is used twice in all codebase.
114
+ * Probably added to keep track of some performance issues
115
+ * @TODO use git blame to investigate why it was added
116
+ * DON'T USE IT. WE WILL TRY TO REMOVE IT
117
+ */
118
+ declare _scaling?: boolean;
119
+
120
+ declare canvas?: Canvas;
121
+
122
+ /**
123
+ * Constructor
124
+ * @param {Object} [options] Options object
125
+ */
126
+ constructor(options?: Record<string, unknown>) {
127
+ super(options);
128
+ }
129
+
130
+ /**
131
+ * Update width and height of the canvas for cache
132
+ * returns true or false if canvas needed resize.
133
+ * @private
134
+ * @return {Boolean} true if the canvas has been resized
135
+ */
136
+ _updateCacheCanvas() {
137
+ const targetCanvas = this.canvas;
138
+ if (this.noScaleCache && targetCanvas && targetCanvas._currentTransform) {
139
+ const target = targetCanvas._currentTransform.target,
140
+ action = targetCanvas._currentTransform.action;
141
+ if (
142
+ this === (target as InteractiveFabricObject) &&
143
+ action.startsWith('scale')
144
+ ) {
145
+ return false;
146
+ }
147
+ }
148
+ return super._updateCacheCanvas();
149
+ }
150
+
151
+ /**
152
+ * Determines which corner has been clicked
153
+ * @private
154
+ * @param {Object} pointer The pointer indicating the mouse position
155
+ * @param {boolean} forTouch indicates if we are looking for interaction area with a touch action
156
+ * @return {String|Boolean} corner code (tl, tr, bl, br, etc.), or false if nothing is found
157
+ */
158
+ _findTargetCorner(pointer: Point, forTouch = false): 0 | string {
159
+ if (
160
+ !this.hasControls ||
161
+ !this.canvas ||
162
+ (this.canvas._activeObject as InteractiveFabricObject) !== this
163
+ ) {
164
+ return 0;
165
+ }
166
+
167
+ this.__corner = undefined;
168
+ // had to keep the reverse loop because was breaking tests
169
+ const cornerEntries = Object.entries(this.oCoords);
170
+ for (let i = cornerEntries.length - 1; i >= 0; i--) {
171
+ const [cornerKey, corner] = cornerEntries[i];
172
+ if (!this.isControlVisible(cornerKey)) {
173
+ continue;
174
+ }
175
+ const lines = this._getImageLines(
176
+ forTouch ? corner.touchCorner : corner.corner
177
+ );
178
+ const xPoints = this._findCrossPoints(pointer, lines);
179
+ if (xPoints !== 0 && xPoints % 2 === 1) {
180
+ this.__corner = cornerKey;
181
+ return cornerKey;
182
+ }
183
+ // // debugging
184
+ //
185
+ // this.canvas.contextTop.fillRect(lines.bottomline.d.x, lines.bottomline.d.y, 2, 2);
186
+ // this.canvas.contextTop.fillRect(lines.bottomline.o.x, lines.bottomline.o.y, 2, 2);
187
+ //
188
+ // this.canvas.contextTop.fillRect(lines.leftline.d.x, lines.leftline.d.y, 2, 2);
189
+ // this.canvas.contextTop.fillRect(lines.leftline.o.x, lines.leftline.o.y, 2, 2);
190
+ //
191
+ // this.canvas.contextTop.fillRect(lines.topline.d.x, lines.topline.d.y, 2, 2);
192
+ // this.canvas.contextTop.fillRect(lines.topline.o.x, lines.topline.o.y, 2, 2);
193
+ //
194
+ // this.canvas.contextTop.fillRect(lines.rightline.d.x, lines.rightline.d.y, 2, 2);
195
+ // this.canvas.contextTop.fillRect(lines.rightline.o.x, lines.rightline.o.y, 2, 2);
196
+ }
197
+ return 0;
198
+ }
199
+
200
+ /**
201
+ * Calculates the coordinates of the center of each control plus the corners of the control itself
202
+ * This basically just delegates to each control positionHandler
203
+ * WARNING: changing what is passed to positionHandler is a breaking change, since position handler
204
+ * is a public api and should be done just if extremely necessary
205
+ * @return {Record<string, TOCoord>}
206
+ */
207
+ calcOCoords(): Record<string, TOCoord> {
208
+ const vpt = this.getViewportTransform(),
209
+ center = this.getCenterPoint(),
210
+ tMatrix = [1, 0, 0, 1, center.x, center.y] as TMat2D,
211
+ rMatrix = calcRotateMatrix({
212
+ angle: this.getTotalAngle() - (!!this.group && this.flipX ? 180 : 0),
213
+ }),
214
+ positionMatrix = multiplyTransformMatrices(tMatrix, rMatrix),
215
+ startMatrix = multiplyTransformMatrices(vpt, positionMatrix),
216
+ finalMatrix = multiplyTransformMatrices(startMatrix, [
217
+ 1 / vpt[0],
218
+ 0,
219
+ 0,
220
+ 1 / vpt[3],
221
+ 0,
222
+ 0,
223
+ ]),
224
+ transformOptions = this.group
225
+ ? qrDecompose(this.calcTransformMatrix())
226
+ : undefined,
227
+ dim = this._calculateCurrentDimensions(transformOptions),
228
+ coords: Record<string, TOCoord> = {};
229
+
230
+ this.forEachControl((control, key) => {
231
+ const position = control.positionHandler(dim, finalMatrix, this, control);
232
+ // coords[key] are sometimes used as points. Those are points to which we add
233
+ // the property corner and touchCorner from `_calcCornerCoords`.
234
+ // don't remove this assign for an object spread.
235
+ coords[key] = Object.assign(
236
+ position,
237
+ this._calcCornerCoords(control, position)
238
+ );
239
+ });
240
+
241
+ // debug code
242
+ /*
243
+ const canvas = this.canvas;
244
+ setTimeout(function () {
245
+ if (!canvas) return;
246
+ canvas.contextTop.clearRect(0, 0, 700, 700);
247
+ canvas.contextTop.fillStyle = 'green';
248
+ Object.keys(coords).forEach(function(key) {
249
+ const control = coords[key];
250
+ canvas.contextTop.fillRect(control.x, control.y, 3, 3);
251
+ });
252
+ } 50);
253
+ */
254
+ return coords;
255
+ }
256
+
257
+ /**
258
+ * Sets the coordinates that determine the interaction area of each control
259
+ * note: if we would switch to ROUND corner area, all of this would disappear.
260
+ * everything would resolve to a single point and a pythagorean theorem for the distance
261
+ * @todo evaluate simplification of code switching to circle interaction area at runtime
262
+ * @private
263
+ */
264
+ private _calcCornerCoords(control: Control, position: Point) {
265
+ const corner = control.calcCornerCoords(
266
+ this.angle,
267
+ this.cornerSize,
268
+ position.x,
269
+ position.y,
270
+ false
271
+ );
272
+ const touchCorner = control.calcCornerCoords(
273
+ this.angle,
274
+ this.touchCornerSize,
275
+ position.x,
276
+ position.y,
277
+ true
278
+ );
279
+ return { corner, touchCorner };
280
+ }
281
+
282
+ /**
283
+ * Sets corner and controls position coordinates based on current angle, width and height, left and top.
284
+ * oCoords are used to find the corners
285
+ * aCoords are used to quickly find an object on the canvas
286
+ * lineCoords are used to quickly find object during pointer events.
287
+ * See {@link https://github.com/fabricjs/fabric.js/wiki/When-to-call-setCoords} and {@link http://fabricjs.com/fabric-gotchas}
288
+ * @return {void}
289
+ */
290
+ setCoords(): void {
291
+ super.setCoords();
292
+ // set coordinates of the draggable boxes in the corners used to scale/rotate the image
293
+ this.oCoords = this.calcOCoords();
294
+ }
295
+
296
+ /**
297
+ * Calls a function for each control. The function gets called,
298
+ * with the control, the control's key and the object that is calling the iterator
299
+ * @param {Function} fn function to iterate over the controls over
300
+ */
301
+ forEachControl(
302
+ fn: (
303
+ control: Control,
304
+ key: string,
305
+ fabricObject: InteractiveFabricObject
306
+ ) => any
307
+ ) {
308
+ for (const i in this.controls) {
309
+ fn(this.controls[i], i, this);
310
+ }
311
+ }
312
+
313
+ /**
314
+ * Draws a colored layer behind the object, inside its selection borders.
315
+ * Requires public options: padding, selectionBackgroundColor
316
+ * this function is called when the context is transformed
317
+ * has checks to be skipped when the object is on a staticCanvas
318
+ * @todo evaluate if make this disappear in favor of a pre-render hook for objects
319
+ * this was added by Andrea Bogazzi to make possible some feature for work reasons
320
+ * it seemed a good option, now is an edge case
321
+ * @param {CanvasRenderingContext2D} ctx Context to draw on
322
+ */
323
+ drawSelectionBackground(ctx: CanvasRenderingContext2D): void {
324
+ if (
325
+ !this.selectionBackgroundColor ||
326
+ (this.canvas && !this.canvas.interactive) ||
327
+ (this.canvas &&
328
+ (this.canvas._activeObject as InteractiveFabricObject) !== this)
329
+ ) {
330
+ return;
331
+ }
332
+ ctx.save();
333
+ const center = this.getRelativeCenterPoint(),
334
+ wh = this._calculateCurrentDimensions(),
335
+ vpt = this.getViewportTransform();
336
+ ctx.translate(center.x, center.y);
337
+ ctx.scale(1 / vpt[0], 1 / vpt[3]);
338
+ ctx.rotate(degreesToRadians(this.angle));
339
+ ctx.fillStyle = this.selectionBackgroundColor;
340
+ ctx.fillRect(-wh.x / 2, -wh.y / 2, wh.x, wh.y);
341
+ ctx.restore();
342
+ }
343
+
344
+ /**
345
+ * @public override this function in order to customize the drawing of the control box, e.g. rounded corners, different border style.
346
+ * @param {CanvasRenderingContext2D} ctx ctx is rotated and translated so that (0,0) is at object's center
347
+ * @param {Point} size the control box size used
348
+ */
349
+ strokeBorders(ctx: CanvasRenderingContext2D, size: Point): void {
350
+ ctx.strokeRect(-size.x / 2, -size.y / 2, size.x, size.y);
351
+ }
352
+
353
+ /**
354
+ * @private
355
+ * @param {CanvasRenderingContext2D} ctx Context to draw on
356
+ * @param {Point} size
357
+ * @param {TStyleOverride} styleOverride object to override the object style
358
+ */
359
+ _drawBorders(
360
+ ctx: CanvasRenderingContext2D,
361
+ size: Point,
362
+ styleOverride: TStyleOverride = {}
363
+ ): void {
364
+ const options = {
365
+ hasControls: this.hasControls,
366
+ borderColor: this.borderColor,
367
+ borderDashArray: this.borderDashArray,
368
+ ...styleOverride,
369
+ };
370
+ ctx.save();
371
+ ctx.strokeStyle = options.borderColor;
372
+ this._setLineDash(ctx, options.borderDashArray);
373
+ this.strokeBorders(ctx, size);
374
+ options.hasControls && this.drawControlsConnectingLines(ctx, size);
375
+ ctx.restore();
376
+ }
377
+
378
+ /**
379
+ * Renders controls and borders for the object
380
+ * the context here is not transformed
381
+ * @todo move to interactivity
382
+ * @param {CanvasRenderingContext2D} ctx Context to render on
383
+ * @param {TStyleOverride} [styleOverride] properties to override the object style
384
+ */
385
+ _renderControls(
386
+ ctx: CanvasRenderingContext2D,
387
+ styleOverride: TStyleOverride = {}
388
+ ) {
389
+ const { hasBorders, hasControls } = this;
390
+ const styleOptions = {
391
+ hasBorders,
392
+ hasControls,
393
+ ...styleOverride,
394
+ };
395
+ const vpt = this.getViewportTransform(),
396
+ shouldDrawBorders = styleOptions.hasBorders,
397
+ shouldDrawControls = styleOptions.hasControls;
398
+ const matrix = multiplyTransformMatrices(vpt, this.calcTransformMatrix());
399
+ const options = qrDecompose(matrix);
400
+ ctx.save();
401
+ ctx.translate(options.translateX, options.translateY);
402
+ ctx.lineWidth = 1 * this.borderScaleFactor;
403
+ if (!this.group) {
404
+ ctx.globalAlpha = this.isMoving ? this.borderOpacityWhenMoving : 1;
405
+ }
406
+ if (this.flipX) {
407
+ options.angle -= 180;
408
+ }
409
+ ctx.rotate(degreesToRadians(this.group ? options.angle : this.angle));
410
+ shouldDrawBorders && this.drawBorders(ctx, options, styleOverride);
411
+ shouldDrawControls && this.drawControls(ctx, styleOverride);
412
+ ctx.restore();
413
+ }
414
+
415
+ /**
416
+ * Draws borders of an object's bounding box.
417
+ * Requires public properties: width, height
418
+ * Requires public options: padding, borderColor
419
+ * @param {CanvasRenderingContext2D} ctx Context to draw on
420
+ * @param {object} options object representing current object parameters
421
+ * @param {TStyleOverride} [styleOverride] object to override the object style
422
+ */
423
+ drawBorders(
424
+ ctx: CanvasRenderingContext2D,
425
+ options: TQrDecomposeOut,
426
+ styleOverride: TStyleOverride
427
+ ): void {
428
+ let size;
429
+ if ((styleOverride && styleOverride.forActiveSelection) || this.group) {
430
+ const bbox = sizeAfterTransform(this.width, this.height, options),
431
+ stroke = (
432
+ this.strokeUniform
433
+ ? new Point().scalarAdd(this.canvas ? this.canvas.getZoom() : 1)
434
+ : // this is extremely confusing. options comes from the upper function
435
+ // and is the qrDecompose of a matrix that takes in account zoom too
436
+ new Point(options.scaleX, options.scaleY)
437
+ ).scalarMultiply(this.strokeWidth);
438
+ size = bbox.add(stroke).scalarAdd(this.borderScaleFactor);
439
+ } else {
440
+ size = this._calculateCurrentDimensions().scalarAdd(
441
+ this.borderScaleFactor
442
+ );
443
+ }
444
+ this._drawBorders(ctx, size, styleOverride);
445
+ }
446
+
447
+ /**
448
+ * Draws lines from a borders of an object's bounding box to controls that have `withConnection` property set.
449
+ * Requires public properties: width, height
450
+ * Requires public options: padding, borderColor
451
+ * @param {CanvasRenderingContext2D} ctx Context to draw on
452
+ * @param {Point} size object size x = width, y = height
453
+ */
454
+ drawControlsConnectingLines(
455
+ ctx: CanvasRenderingContext2D,
456
+ size: Point
457
+ ): void {
458
+ let shouldStroke = false;
459
+
460
+ ctx.beginPath();
461
+ this.forEachControl((control, key) => {
462
+ // in this moment, the ctx is centered on the object.
463
+ // width and height of the above function are the size of the bbox.
464
+ if (control.withConnection && control.getVisibility(this, key)) {
465
+ // reset movement for each control
466
+ shouldStroke = true;
467
+ ctx.moveTo(control.x * size.x, control.y * size.y);
468
+ ctx.lineTo(
469
+ control.x * size.x + control.offsetX,
470
+ control.y * size.y + control.offsetY
471
+ );
472
+ }
473
+ });
474
+ shouldStroke && ctx.stroke();
475
+ }
476
+
477
+ /**
478
+ * Draws corners of an object's bounding box.
479
+ * Requires public properties: width, height
480
+ * Requires public options: cornerSize, padding
481
+ * @param {CanvasRenderingContext2D} ctx Context to draw on
482
+ * @param {ControlRenderingStyleOverride} styleOverride object to override the object style
483
+ */
484
+ drawControls(
485
+ ctx: CanvasRenderingContext2D,
486
+ styleOverride: ControlRenderingStyleOverride = {}
487
+ ) {
488
+ ctx.save();
489
+ const retinaScaling = this.getCanvasRetinaScaling();
490
+ const { cornerStrokeColor, cornerDashArray, cornerColor } = this;
491
+ const options = {
492
+ cornerStrokeColor,
493
+ cornerDashArray,
494
+ cornerColor,
495
+ ...styleOverride,
496
+ };
497
+ ctx.setTransform(retinaScaling, 0, 0, retinaScaling, 0, 0);
498
+ ctx.strokeStyle = ctx.fillStyle = options.cornerColor;
499
+ if (!this.transparentCorners) {
500
+ ctx.strokeStyle = options.cornerStrokeColor;
501
+ }
502
+ this._setLineDash(ctx, options.cornerDashArray);
503
+ this.setCoords();
504
+ this.forEachControl((control, key) => {
505
+ if (control.getVisibility(this, key)) {
506
+ const p = this.oCoords[key];
507
+ control.render(ctx, p.x, p.y, options, this);
508
+ }
509
+ });
510
+ ctx.restore();
511
+ }
512
+
513
+ /**
514
+ * Returns true if the specified control is visible, false otherwise.
515
+ * @param {string} controlKey The key of the control. Possible values are usually 'tl', 'tr', 'br', 'bl', 'ml', 'mt', 'mr', 'mb', 'mtr',
516
+ * but since the control api allow for any control name, can be any string.
517
+ * @returns {boolean} true if the specified control is visible, false otherwise
518
+ */
519
+ isControlVisible(controlKey: string): boolean {
520
+ return (
521
+ this.controls[controlKey] &&
522
+ this.controls[controlKey].getVisibility(this, controlKey)
523
+ );
524
+ }
525
+
526
+ /**
527
+ * Sets the visibility of the specified control.
528
+ * please do not use.
529
+ * @param {String} controlKey The key of the control. Possible values are 'tl', 'tr', 'br', 'bl', 'ml', 'mt', 'mr', 'mb', 'mtr'.
530
+ * but since the control api allow for any control name, can be any string.
531
+ * @param {Boolean} visible true to set the specified control visible, false otherwise
532
+ * @todo discuss this overlap of priority here with the team. Andrea Bogazzi for details
533
+ */
534
+ setControlVisible(controlKey: string, visible: boolean) {
535
+ if (!this._controlsVisibility) {
536
+ this._controlsVisibility = {};
537
+ }
538
+ this._controlsVisibility[controlKey] = visible;
539
+ }
540
+
541
+ /**
542
+ * Sets the visibility state of object controls, this is just a bulk option for setControlVisible;
543
+ * @param {Record<string, boolean>} [options] with an optional key per control
544
+ * example: {Boolean} [options.bl] true to enable the bottom-left control, false to disable it
545
+ */
546
+ setControlsVisibility(options: Record<string, boolean> = {}) {
547
+ Object.entries(options).forEach(([controlKey, visibility]) =>
548
+ this.setControlVisible(controlKey, visibility)
549
+ );
550
+ }
551
+
552
+ /**
553
+ * Clears the canvas.contextTop in a specific area that corresponds to the object's bounding box
554
+ * that is in the canvas.contextContainer.
555
+ * This function is used to clear pieces of contextTop where we render ephemeral effects on top of the object.
556
+ * Example: blinking cursor text selection, drag effects.
557
+ * @todo discuss swapping restoreManually with a renderCallback, but think of async issues
558
+ * @param {Boolean} [restoreManually] When true won't restore the context after clear, in order to draw something else.
559
+ * @return {CanvasRenderingContext2D|undefined} canvas.contextTop that is either still transformed
560
+ * with the object transformMatrix, or restored to neutral transform
561
+ */
562
+ clearContextTop(
563
+ restoreManually?: boolean
564
+ ): CanvasRenderingContext2D | undefined {
565
+ if (!this.canvas) {
566
+ return;
567
+ }
568
+ const ctx = this.canvas.contextTop;
569
+ if (!ctx) {
570
+ return;
571
+ }
572
+ const v = this.canvas.viewportTransform;
573
+ ctx.save();
574
+ ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);
575
+ this.transform(ctx);
576
+ // we add 4 pixel, to be sure to do not leave any pixel out
577
+ const width = this.width + 4,
578
+ height = this.height + 4;
579
+ ctx.clearRect(-width / 2, -height / 2, width, height);
580
+
581
+ restoreManually || ctx.restore();
582
+ return ctx;
583
+ }
584
+
585
+ /**
586
+ * This callback function is called every time _discardActiveObject or _setActiveObject
587
+ * try to to deselect this object. If the function returns true, the process is cancelled
588
+ * @param {Object} [options] options sent from the upper functions
589
+ * @param {TPointerEvent} [options.e] event if the process is generated by an event
590
+ * @param {FabricObject} [options.object] next object we are setting as active, and reason why
591
+ * this is being deselected
592
+
593
+ */
594
+ onDeselect(options?: { e?: TPointerEvent; object?: FabricObject }): boolean {
595
+ // implemented by sub-classes, as needed.
596
+ return false;
597
+ }
598
+
599
+ /**
600
+ * This callback function is called every time _discardActiveObject or _setActiveObject
601
+ * try to to select this object. If the function returns true, the process is cancelled
602
+ * @param {Object} [options] options sent from the upper functions
603
+ * @param {Event} [options.e] event if the process is generated by an event
604
+ */
605
+ onSelect(options?: { e?: TPointerEvent }): boolean {
606
+ // implemented by sub-classes, as needed.
607
+ return false;
608
+ }
609
+
610
+ /**
611
+ * Override to customize drag and drop behavior
612
+ * return true if the object currently dragged can be dropped on the target
613
+ * @public
614
+ * @param {DragEvent} e
615
+ * @returns {boolean}
616
+ */
617
+ canDrop(e: DragEvent): boolean {
618
+ return false;
619
+ }
620
+
621
+ /**
622
+ * Override to customize drag and drop behavior
623
+ * render a specific effect when an object is the source of a drag event
624
+ * example: render the selection status for the part of text that is being dragged from a text object
625
+ * @public
626
+ * @param {DragEvent} e
627
+ * @returns {boolean}
628
+ */
629
+ renderDragSourceEffect(this: AssertKeys<this, 'canvas'>, e: DragEvent) {
630
+ // for subclasses
631
+ }
632
+
633
+ /**
634
+ * Override to customize drag and drop behavior
635
+ * render a specific effect when an object is the target of a drag event
636
+ * used to show that the underly object can receive a drop, or to show how the
637
+ * object will change when dropping. example: show the cursor where the text is about to be dropped
638
+ * @public
639
+ * @param {DragEvent} e
640
+ * @returns {boolean}
641
+ */
642
+ renderDropTargetEffect(this: AssertKeys<this, 'canvas'>, e: DragEvent) {
643
+ // for subclasses
644
+ }
645
+ }