fabric 7.0.0 → 7.2.0

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 (323) hide show
  1. package/.husky/pre-commit +1 -0
  2. package/CHANGELOG.md +21 -0
  3. package/dist/extensions/cropping_controls/croppingControls.d.ts +16 -0
  4. package/dist/extensions/cropping_controls/croppingControls.d.ts.map +1 -0
  5. package/dist/extensions/cropping_controls/croppingHandlers.d.ts +39 -0
  6. package/dist/extensions/cropping_controls/croppingHandlers.d.ts.map +1 -0
  7. package/dist/extensions/cropping_controls/enterCropMode.d.ts +7 -0
  8. package/dist/extensions/cropping_controls/enterCropMode.d.ts.map +1 -0
  9. package/dist/extensions/cropping_controls/renderCornerControl.d.ts +14 -0
  10. package/dist/extensions/cropping_controls/renderCornerControl.d.ts.map +1 -0
  11. package/dist/extensions/index.d.ts +3 -0
  12. package/dist/extensions/index.d.ts.map +1 -1
  13. package/dist/fabric.d.ts +1 -0
  14. package/dist/fabric.d.ts.map +1 -1
  15. package/dist/index.js +628 -537
  16. package/dist/index.js.map +1 -1
  17. package/dist/index.min.js +1 -1
  18. package/dist/index.min.js.map +1 -1
  19. package/dist/index.min.mjs +1 -1
  20. package/dist/index.min.mjs.map +1 -1
  21. package/dist/index.mjs +628 -537
  22. package/dist/index.mjs.map +1 -1
  23. package/dist/index.node.cjs +628 -537
  24. package/dist/index.node.cjs.map +1 -1
  25. package/dist/index.node.mjs +628 -537
  26. package/dist/index.node.mjs.map +1 -1
  27. package/dist/package.json.min.mjs +1 -1
  28. package/dist/package.json.mjs +1 -1
  29. package/dist/src/EventTypeDefs.d.ts +5 -0
  30. package/dist/src/EventTypeDefs.d.ts.map +1 -1
  31. package/dist/src/Pattern/Pattern.d.ts.map +1 -1
  32. package/dist/src/Pattern/Pattern.min.mjs +1 -1
  33. package/dist/src/Pattern/Pattern.min.mjs.map +1 -1
  34. package/dist/src/Pattern/Pattern.mjs +2 -1
  35. package/dist/src/Pattern/Pattern.mjs.map +1 -1
  36. package/dist/src/Shadow.d.ts +1 -1
  37. package/dist/src/Shadow.d.ts.map +1 -1
  38. package/dist/src/Shadow.min.mjs +1 -1
  39. package/dist/src/Shadow.min.mjs.map +1 -1
  40. package/dist/src/Shadow.mjs +5 -4
  41. package/dist/src/Shadow.mjs.map +1 -1
  42. package/dist/src/canvas/CanvasOptions.d.ts.map +1 -1
  43. package/dist/src/canvas/CanvasOptions.min.mjs.map +1 -1
  44. package/dist/src/canvas/CanvasOptions.mjs.map +1 -1
  45. package/dist/src/canvas/SelectableCanvas.d.ts +2 -0
  46. package/dist/src/canvas/SelectableCanvas.d.ts.map +1 -1
  47. package/dist/src/canvas/SelectableCanvas.min.mjs +1 -1
  48. package/dist/src/canvas/SelectableCanvas.min.mjs.map +1 -1
  49. package/dist/src/canvas/SelectableCanvas.mjs +33 -13
  50. package/dist/src/canvas/SelectableCanvas.mjs.map +1 -1
  51. package/dist/src/canvas/StaticCanvas.d.ts.map +1 -1
  52. package/dist/src/canvas/StaticCanvas.min.mjs +1 -1
  53. package/dist/src/canvas/StaticCanvas.min.mjs.map +1 -1
  54. package/dist/src/canvas/StaticCanvas.mjs +3 -1
  55. package/dist/src/canvas/StaticCanvas.mjs.map +1 -1
  56. package/dist/src/canvas/StaticCanvasOptions.d.ts.map +1 -1
  57. package/dist/src/canvas/StaticCanvasOptions.min.mjs.map +1 -1
  58. package/dist/src/canvas/StaticCanvasOptions.mjs.map +1 -1
  59. package/dist/src/constants.d.ts +1 -0
  60. package/dist/src/constants.d.ts.map +1 -1
  61. package/dist/src/constants.min.mjs.map +1 -1
  62. package/dist/src/constants.mjs.map +1 -1
  63. package/dist/src/controls/Control.d.ts +22 -1
  64. package/dist/src/controls/Control.d.ts.map +1 -1
  65. package/dist/src/controls/Control.min.mjs +1 -1
  66. package/dist/src/controls/Control.min.mjs.map +1 -1
  67. package/dist/src/controls/Control.mjs +45 -1
  68. package/dist/src/controls/Control.mjs.map +1 -1
  69. package/dist/src/controls/changeWidth.d.ts +22 -0
  70. package/dist/src/controls/changeWidth.d.ts.map +1 -1
  71. package/dist/src/controls/changeWidth.min.mjs +1 -1
  72. package/dist/src/controls/changeWidth.min.mjs.map +1 -1
  73. package/dist/src/controls/changeWidth.mjs +46 -18
  74. package/dist/src/controls/changeWidth.mjs.map +1 -1
  75. package/dist/src/controls/controlRendering.d.ts.map +1 -1
  76. package/dist/src/controls/controlRendering.min.mjs +1 -1
  77. package/dist/src/controls/controlRendering.min.mjs.map +1 -1
  78. package/dist/src/controls/controlRendering.mjs +18 -34
  79. package/dist/src/controls/controlRendering.mjs.map +1 -1
  80. package/dist/src/controls/index.d.ts +2 -1
  81. package/dist/src/controls/index.d.ts.map +1 -1
  82. package/dist/src/controls/index.min.mjs +1 -1
  83. package/dist/src/controls/index.mjs +1 -1
  84. package/dist/src/gradient/Gradient.d.ts.map +1 -1
  85. package/dist/src/gradient/Gradient.min.mjs +1 -1
  86. package/dist/src/gradient/Gradient.min.mjs.map +1 -1
  87. package/dist/src/gradient/Gradient.mjs +19 -6
  88. package/dist/src/gradient/Gradient.mjs.map +1 -1
  89. package/dist/src/shapes/Circle.d.ts.map +1 -1
  90. package/dist/src/shapes/Circle.min.mjs +1 -1
  91. package/dist/src/shapes/Circle.min.mjs.map +1 -1
  92. package/dist/src/shapes/Circle.mjs +10 -7
  93. package/dist/src/shapes/Circle.mjs.map +1 -1
  94. package/dist/src/shapes/Ellipse.d.ts.map +1 -1
  95. package/dist/src/shapes/Ellipse.min.mjs +1 -1
  96. package/dist/src/shapes/Ellipse.min.mjs.map +1 -1
  97. package/dist/src/shapes/Ellipse.mjs +2 -1
  98. package/dist/src/shapes/Ellipse.mjs.map +1 -1
  99. package/dist/src/shapes/Group.d.ts.map +1 -1
  100. package/dist/src/shapes/Group.min.mjs +1 -1
  101. package/dist/src/shapes/Group.min.mjs.map +1 -1
  102. package/dist/src/shapes/Group.mjs +2 -1
  103. package/dist/src/shapes/Group.mjs.map +1 -1
  104. package/dist/src/shapes/IText/IText.d.ts.map +1 -1
  105. package/dist/src/shapes/IText/IText.min.mjs.map +1 -1
  106. package/dist/src/shapes/IText/IText.mjs.map +1 -1
  107. package/dist/src/shapes/Image.d.ts +1 -1
  108. package/dist/src/shapes/Image.d.ts.map +1 -1
  109. package/dist/src/shapes/Image.min.mjs +1 -1
  110. package/dist/src/shapes/Image.min.mjs.map +1 -1
  111. package/dist/src/shapes/Image.mjs +4 -3
  112. package/dist/src/shapes/Image.mjs.map +1 -1
  113. package/dist/src/shapes/Line.d.ts.map +1 -1
  114. package/dist/src/shapes/Line.min.mjs +1 -1
  115. package/dist/src/shapes/Line.min.mjs.map +1 -1
  116. package/dist/src/shapes/Line.mjs +6 -10
  117. package/dist/src/shapes/Line.mjs.map +1 -1
  118. package/dist/src/shapes/Object/FabricObjectSVGExportMixin.d.ts.map +1 -1
  119. package/dist/src/shapes/Object/FabricObjectSVGExportMixin.min.mjs +1 -1
  120. package/dist/src/shapes/Object/FabricObjectSVGExportMixin.min.mjs.map +1 -1
  121. package/dist/src/shapes/Object/FabricObjectSVGExportMixin.mjs +5 -4
  122. package/dist/src/shapes/Object/FabricObjectSVGExportMixin.mjs.map +1 -1
  123. package/dist/src/shapes/Object/InteractiveObject.d.ts.map +1 -1
  124. package/dist/src/shapes/Object/InteractiveObject.min.mjs.map +1 -1
  125. package/dist/src/shapes/Object/InteractiveObject.mjs.map +1 -1
  126. package/dist/src/shapes/Object/Object.d.ts.map +1 -1
  127. package/dist/src/shapes/Object/Object.min.mjs +1 -1
  128. package/dist/src/shapes/Object/Object.min.mjs.map +1 -1
  129. package/dist/src/shapes/Object/Object.mjs +3 -0
  130. package/dist/src/shapes/Object/Object.mjs.map +1 -1
  131. package/dist/src/shapes/Object/ObjectGeometry.min.mjs +1 -1
  132. package/dist/src/shapes/Object/ObjectGeometry.min.mjs.map +1 -1
  133. package/dist/src/shapes/Object/ObjectGeometry.mjs +1 -1
  134. package/dist/src/shapes/Object/ObjectGeometry.mjs.map +1 -1
  135. package/dist/src/shapes/Object/types/FabricObjectProps.d.ts.map +1 -1
  136. package/dist/src/shapes/Object/types/ObjectProps.d.ts.map +1 -1
  137. package/dist/src/shapes/Path.d.ts.map +1 -1
  138. package/dist/src/shapes/Path.min.mjs.map +1 -1
  139. package/dist/src/shapes/Path.mjs +1 -2
  140. package/dist/src/shapes/Path.mjs.map +1 -1
  141. package/dist/src/shapes/Polyline.d.ts.map +1 -1
  142. package/dist/src/shapes/Polyline.min.mjs +1 -1
  143. package/dist/src/shapes/Polyline.min.mjs.map +1 -1
  144. package/dist/src/shapes/Polyline.mjs +10 -6
  145. package/dist/src/shapes/Polyline.mjs.map +1 -1
  146. package/dist/src/shapes/Rect.d.ts.map +1 -1
  147. package/dist/src/shapes/Rect.min.mjs +1 -1
  148. package/dist/src/shapes/Rect.min.mjs.map +1 -1
  149. package/dist/src/shapes/Rect.mjs +2 -1
  150. package/dist/src/shapes/Rect.mjs.map +1 -1
  151. package/dist/src/shapes/Text/StyledText.d.ts.map +1 -1
  152. package/dist/src/shapes/Text/StyledText.min.mjs.map +1 -1
  153. package/dist/src/shapes/Text/StyledText.mjs +0 -3
  154. package/dist/src/shapes/Text/StyledText.mjs.map +1 -1
  155. package/dist/src/shapes/Text/Text.d.ts.map +1 -1
  156. package/dist/src/shapes/Text/Text.min.mjs.map +1 -1
  157. package/dist/src/shapes/Text/Text.mjs.map +1 -1
  158. package/dist/src/shapes/Text/TextSVGExportMixin.d.ts.map +1 -1
  159. package/dist/src/shapes/Text/TextSVGExportMixin.min.mjs +1 -1
  160. package/dist/src/shapes/Text/TextSVGExportMixin.min.mjs.map +1 -1
  161. package/dist/src/shapes/Text/TextSVGExportMixin.mjs +5 -6
  162. package/dist/src/shapes/Text/TextSVGExportMixin.mjs.map +1 -1
  163. package/dist/src/shapes/Textbox.d.ts.map +1 -1
  164. package/dist/src/shapes/Textbox.min.mjs.map +1 -1
  165. package/dist/src/shapes/Textbox.mjs.map +1 -1
  166. package/dist/src/shapes/Triangle.d.ts.map +1 -1
  167. package/dist/src/shapes/Triangle.min.mjs.map +1 -1
  168. package/dist/src/shapes/Triangle.mjs.map +1 -1
  169. package/dist/src/util/lang_string.d.ts +1 -1
  170. package/dist/src/util/lang_string.d.ts.map +1 -1
  171. package/dist/src/util/lang_string.min.mjs +1 -1
  172. package/dist/src/util/lang_string.min.mjs.map +1 -1
  173. package/dist/src/util/lang_string.mjs +1 -1
  174. package/dist/src/util/lang_string.mjs.map +1 -1
  175. package/dist/src/util/misc/svgParsing.d.ts.map +1 -1
  176. package/dist/src/util/misc/svgParsing.min.mjs +1 -1
  177. package/dist/src/util/misc/svgParsing.min.mjs.map +1 -1
  178. package/dist/src/util/misc/svgParsing.mjs +2 -1
  179. package/dist/src/util/misc/svgParsing.mjs.map +1 -1
  180. package/dist-extensions/cropping_controls/croppingControls.mjs +140 -0
  181. package/dist-extensions/cropping_controls/croppingControls.mjs.map +1 -0
  182. package/dist-extensions/cropping_controls/croppingHandlers.mjs +228 -0
  183. package/dist-extensions/cropping_controls/croppingHandlers.mjs.map +1 -0
  184. package/dist-extensions/cropping_controls/enterCropMode.mjs +38 -0
  185. package/dist-extensions/cropping_controls/enterCropMode.mjs.map +1 -0
  186. package/dist-extensions/cropping_controls/renderCornerControl.mjs +45 -0
  187. package/dist-extensions/cropping_controls/renderCornerControl.mjs.map +1 -0
  188. package/dist-extensions/extensions/cropping_controls/croppingControls.d.ts +16 -0
  189. package/dist-extensions/extensions/cropping_controls/croppingControls.d.ts.map +1 -0
  190. package/dist-extensions/extensions/cropping_controls/croppingHandlers.d.ts +39 -0
  191. package/dist-extensions/extensions/cropping_controls/croppingHandlers.d.ts.map +1 -0
  192. package/dist-extensions/extensions/cropping_controls/enterCropMode.d.ts +7 -0
  193. package/dist-extensions/extensions/cropping_controls/enterCropMode.d.ts.map +1 -0
  194. package/dist-extensions/extensions/cropping_controls/renderCornerControl.d.ts +14 -0
  195. package/dist-extensions/extensions/cropping_controls/renderCornerControl.d.ts.map +1 -0
  196. package/dist-extensions/extensions/index.d.ts +3 -0
  197. package/dist-extensions/extensions/index.d.ts.map +1 -1
  198. package/dist-extensions/fabric-extensions.min.js +1 -1
  199. package/dist-extensions/fabric-extensions.min.js.map +1 -1
  200. package/dist-extensions/fabric.d.ts +1 -0
  201. package/dist-extensions/fabric.d.ts.map +1 -1
  202. package/dist-extensions/index.mjs +3 -0
  203. package/dist-extensions/index.mjs.map +1 -1
  204. package/dist-extensions/src/EventTypeDefs.d.ts +5 -0
  205. package/dist-extensions/src/EventTypeDefs.d.ts.map +1 -1
  206. package/dist-extensions/src/Pattern/Pattern.d.ts.map +1 -1
  207. package/dist-extensions/src/Shadow.d.ts +1 -1
  208. package/dist-extensions/src/Shadow.d.ts.map +1 -1
  209. package/dist-extensions/src/canvas/CanvasOptions.d.ts.map +1 -1
  210. package/dist-extensions/src/canvas/SelectableCanvas.d.ts +2 -0
  211. package/dist-extensions/src/canvas/SelectableCanvas.d.ts.map +1 -1
  212. package/dist-extensions/src/canvas/StaticCanvas.d.ts.map +1 -1
  213. package/dist-extensions/src/canvas/StaticCanvasOptions.d.ts.map +1 -1
  214. package/dist-extensions/src/constants.d.ts +1 -0
  215. package/dist-extensions/src/constants.d.ts.map +1 -1
  216. package/dist-extensions/src/controls/Control.d.ts +22 -1
  217. package/dist-extensions/src/controls/Control.d.ts.map +1 -1
  218. package/dist-extensions/src/controls/changeWidth.d.ts +22 -0
  219. package/dist-extensions/src/controls/changeWidth.d.ts.map +1 -1
  220. package/dist-extensions/src/controls/controlRendering.d.ts.map +1 -1
  221. package/dist-extensions/src/controls/index.d.ts +2 -1
  222. package/dist-extensions/src/controls/index.d.ts.map +1 -1
  223. package/dist-extensions/src/gradient/Gradient.d.ts.map +1 -1
  224. package/dist-extensions/src/shapes/Circle.d.ts.map +1 -1
  225. package/dist-extensions/src/shapes/Ellipse.d.ts.map +1 -1
  226. package/dist-extensions/src/shapes/Group.d.ts.map +1 -1
  227. package/dist-extensions/src/shapes/IText/IText.d.ts.map +1 -1
  228. package/dist-extensions/src/shapes/Image.d.ts.map +1 -1
  229. package/dist-extensions/src/shapes/Line.d.ts.map +1 -1
  230. package/dist-extensions/src/shapes/Object/FabricObjectSVGExportMixin.d.ts.map +1 -1
  231. package/dist-extensions/src/shapes/Object/InteractiveObject.d.ts.map +1 -1
  232. package/dist-extensions/src/shapes/Object/Object.d.ts.map +1 -1
  233. package/dist-extensions/src/shapes/Object/types/FabricObjectProps.d.ts.map +1 -1
  234. package/dist-extensions/src/shapes/Object/types/ObjectProps.d.ts.map +1 -1
  235. package/dist-extensions/src/shapes/Path.d.ts +1 -1
  236. package/dist-extensions/src/shapes/Path.d.ts.map +1 -1
  237. package/dist-extensions/src/shapes/Polyline.d.ts.map +1 -1
  238. package/dist-extensions/src/shapes/Rect.d.ts.map +1 -1
  239. package/dist-extensions/src/shapes/Text/StyledText.d.ts.map +1 -1
  240. package/dist-extensions/src/shapes/Text/Text.d.ts.map +1 -1
  241. package/dist-extensions/src/shapes/Text/TextSVGExportMixin.d.ts.map +1 -1
  242. package/dist-extensions/src/shapes/Textbox.d.ts.map +1 -1
  243. package/dist-extensions/src/shapes/Triangle.d.ts.map +1 -1
  244. package/dist-extensions/src/util/lang_string.d.ts +1 -1
  245. package/dist-extensions/src/util/lang_string.d.ts.map +1 -1
  246. package/dist-extensions/src/util/misc/svgParsing.d.ts.map +1 -1
  247. package/eslint.config.mjs +2 -0
  248. package/extensions/cropping_controls/croppingControls.spec.ts +115 -0
  249. package/extensions/cropping_controls/croppingControls.ts +150 -0
  250. package/extensions/cropping_controls/croppingHandlers.spec.ts +579 -0
  251. package/extensions/cropping_controls/croppingHandlers.ts +285 -0
  252. package/extensions/cropping_controls/enterCropMode.ts +30 -0
  253. package/extensions/cropping_controls/renderCornerControl.ts +53 -0
  254. package/extensions/index.ts +9 -0
  255. package/fabric.ts +1 -0
  256. package/package.json +17 -8
  257. package/src/ClassRegistry.spec.ts +18 -19
  258. package/src/EventTypeDefs.ts +15 -11
  259. package/src/Pattern/Pattern.spec.ts +12 -0
  260. package/src/Pattern/Pattern.ts +3 -2
  261. package/src/Shadow.ts +9 -8
  262. package/src/brushes/PencilBrush.spec.ts +11 -11
  263. package/src/canvas/Canvas-dispose.spec.ts +8 -7
  264. package/src/canvas/Canvas.spec.ts +27 -29
  265. package/src/canvas/CanvasOptions.ts +2 -1
  266. package/src/canvas/SelectableCanvas.ts +38 -15
  267. package/src/canvas/StaticCanvas.spec.ts +20 -0
  268. package/src/canvas/StaticCanvas.ts +7 -4
  269. package/src/canvas/StaticCanvasOptions.ts +1 -3
  270. package/src/constants.ts +1 -0
  271. package/src/controls/Control.spec.ts +102 -0
  272. package/src/controls/Control.ts +71 -2
  273. package/src/controls/changeHeight.spec.ts +147 -0
  274. package/src/controls/changeWidth.ts +68 -35
  275. package/src/controls/controlRendering.ts +20 -48
  276. package/src/controls/index.ts +7 -1
  277. package/src/gradient/Gradient.spec.ts +101 -46
  278. package/src/gradient/Gradient.ts +27 -14
  279. package/src/shapes/Circle.spec.ts +10 -39
  280. package/src/shapes/Circle.ts +11 -11
  281. package/src/shapes/Ellipse.spec.ts +8 -37
  282. package/src/shapes/Ellipse.ts +7 -7
  283. package/src/shapes/Group.ts +3 -3
  284. package/src/shapes/IText/IText-click-behavior.spec.ts +36 -49
  285. package/src/shapes/IText/IText.ts +5 -6
  286. package/src/shapes/IText/ITextKeyBehavior.test.ts +0 -1
  287. package/src/shapes/IText/__snapshots__/ITextBehavior.test.ts.snap +6 -6
  288. package/src/shapes/Image.spec.ts +17 -33
  289. package/src/shapes/Image.ts +15 -11
  290. package/src/shapes/Line.spec.ts +4 -30
  291. package/src/shapes/Line.ts +11 -16
  292. package/src/shapes/Object/FabricObjectSVGExportMixin.ts +11 -4
  293. package/src/shapes/Object/InteractiveObject.ts +4 -4
  294. package/src/shapes/Object/Object.ts +6 -5
  295. package/src/shapes/Object/ObjectGeometry.spec.ts +15 -0
  296. package/src/shapes/Object/ObjectGeometry.ts +1 -1
  297. package/src/shapes/Object/objectSvgExport.spec.ts +112 -0
  298. package/src/shapes/Object/types/FabricObjectProps.ts +1 -4
  299. package/src/shapes/Object/types/ObjectProps.ts +1 -3
  300. package/src/shapes/Path.spec.ts +4 -27
  301. package/src/shapes/Path.ts +2 -4
  302. package/src/shapes/Polygon.spec.ts +4 -31
  303. package/src/shapes/Polyline.spec.ts +4 -31
  304. package/src/shapes/Polyline.ts +11 -12
  305. package/src/shapes/Rect.spec.ts +25 -33
  306. package/src/shapes/Rect.ts +7 -7
  307. package/src/shapes/Text/StyledText.ts +0 -3
  308. package/src/shapes/Text/Text.spec.ts +3 -32
  309. package/src/shapes/Text/Text.ts +5 -6
  310. package/src/shapes/Text/TextSVGExportMixin.spec.ts +9 -0
  311. package/src/shapes/Text/TextSVGExportMixin.ts +14 -16
  312. package/src/shapes/Text/__snapshots__/Text.spec.ts.snap +1 -1
  313. package/src/shapes/Text/__snapshots__/TextSVGExportMixin.spec.ts.snap +1 -1
  314. package/src/shapes/Textbox.spec.ts +5 -5
  315. package/src/shapes/Textbox.ts +6 -5
  316. package/src/shapes/Triangle.ts +4 -4
  317. package/src/shapes/__snapshots__/Image.spec.ts.snap +4 -4
  318. package/src/shapes/__snapshots__/Textbox.spec.ts.snap +5 -5
  319. package/src/util/lang_string.ts +3 -2
  320. package/src/util/misc/svgParsing.ts +2 -1
  321. package/tsconfig.spec.json +1 -0
  322. package/vitest.config.ts +12 -2
  323. package/vitest.extend.ts +6 -2
@@ -1 +1 @@
1
- {"version":3,"file":"ObjectGeometry.min.mjs","sources":["../../../../src/shapes/Object/ObjectGeometry.ts"],"sourcesContent":["import type {\n TBBox,\n TCornerPoint,\n TDegree,\n TMat2D,\n TOriginX,\n TOriginY,\n} from '../../typedefs';\nimport { SCALE_X, SCALE_Y, iMatrix } from '../../constants';\nimport { Intersection } from '../../Intersection';\nimport { Point } from '../../Point';\nimport { makeBoundingBoxFromPoints } from '../../util/misc/boundingBoxFromPoints';\nimport {\n createRotateMatrix,\n createTranslateMatrix,\n composeMatrix,\n invertTransform,\n multiplyTransformMatrices,\n transformPoint,\n calcPlaneRotation,\n} from '../../util/misc/matrix';\nimport { radiansToDegrees } from '../../util/misc/radiansDegreesConversion';\nimport type { Canvas } from '../../canvas/Canvas';\nimport type { StaticCanvas } from '../../canvas/StaticCanvas';\nimport type { ObjectEvents } from '../../EventTypeDefs';\nimport type { ControlProps } from './types/ControlProps';\nimport { resolveOrigin } from '../../util/misc/resolveOrigin';\nimport type { Group } from '../Group';\nimport { calcDimensionsMatrix } from '../../util/misc/matrix';\nimport { sizeAfterTransform } from '../../util/misc/objectTransforms';\nimport { degreesToRadians } from '../../util/misc/radiansDegreesConversion';\nimport { CommonMethods } from '../../CommonMethods';\nimport type { BaseProps } from './types/BaseProps';\nimport type { FillStrokeProps } from './types/FillStrokeProps';\nimport { CENTER, LEFT, TOP } from '../../constants';\n\ntype TMatrixCache = {\n key: number[];\n value: TMat2D;\n};\n\ntype TACoords = TCornerPoint;\n\nexport class ObjectGeometry<EventSpec extends ObjectEvents = ObjectEvents>\n extends CommonMethods<EventSpec>\n implements\n Pick<ControlProps, 'padding'>,\n BaseProps,\n Pick<FillStrokeProps, 'strokeWidth' | 'strokeUniform'>\n{\n // #region Geometry\n\n declare padding: number;\n\n /**\n * Describe object's corner position in scene coordinates.\n * The coordinates are derived from the following:\n * left, top, width, height, scaleX, scaleY, skewX, skewY, angle, strokeWidth.\n * The coordinates do not depend on viewport changes.\n * The coordinates get updated with {@link setCoords}.\n * You can calculate them without updating with {@link calcACoords()}\n */\n declare aCoords: TACoords;\n\n /**\n * storage cache for object transform matrix\n */\n declare ownMatrixCache?: TMatrixCache;\n\n /**\n * storage cache for object full transform matrix\n */\n declare matrixCache?: TMatrixCache;\n\n /**\n * A Reference of the Canvas where the object is actually added\n * @type StaticCanvas | Canvas;\n * @default undefined\n * @private\n */\n declare canvas?: StaticCanvas | Canvas;\n\n /**\n * @returns {number} x position according to object's originX property in canvas coordinate plane\n */\n getX(): number {\n return this.getXY().x;\n }\n\n /**\n * @param {number} value x position according to object's originX property in canvas coordinate plane\n */\n setX(value: number) {\n this.setXY(this.getXY().setX(value));\n }\n\n /**\n * @returns {number} y position according to object's originY property in canvas coordinate plane\n */\n getY(): number {\n return this.getXY().y;\n }\n\n /**\n * @param {number} value y position according to object's originY property in canvas coordinate plane\n */\n setY(value: number) {\n this.setXY(this.getXY().setY(value));\n }\n\n /**\n * @returns {number} x position according to object's originX property in parent's coordinate plane\\\n * if parent is canvas then this property is identical to {@link getX}\n */\n getRelativeX(): number {\n return this.left;\n }\n\n /**\n * @param {number} value x position according to object's originX property in parent's coordinate plane\\\n * if parent is canvas then this method is identical to {@link setX}\n */\n setRelativeX(value: number) {\n this.left = value;\n }\n\n /**\n * @returns {number} y position according to object's originY property in parent's coordinate plane\\\n * if parent is canvas then this property is identical to {@link getY}\n */\n getRelativeY(): number {\n return this.top;\n }\n\n /**\n * @param {number} value y position according to object's originY property in parent's coordinate plane\\\n * if parent is canvas then this property is identical to {@link setY}\n */\n setRelativeY(value: number) {\n this.top = value;\n }\n\n /**\n * @returns {Point} x position according to object's originX originY properties in canvas coordinate plane\n */\n getXY(): Point {\n const relativePosition = this.getRelativeXY();\n return this.group\n ? transformPoint(relativePosition, this.group.calcTransformMatrix())\n : relativePosition;\n }\n\n /**\n * Set an object position to a particular point, the point is intended in absolute ( canvas ) coordinate.\n * You can specify originX and originY values,\n * that otherwise are the object's current values.\n * @example <caption>Set object's bottom left corner to point (5,5) on canvas</caption>\n * object.setXY(new Point(5, 5), 'left', 'bottom').\n * @param {Point} point position in scene coordinate plane\n * @param {TOriginX} [originX] Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} [originY] Vertical origin: 'top', 'center' or 'bottom'\n */\n setXY(point: Point, originX?: TOriginX, originY?: TOriginY) {\n if (this.group) {\n point = transformPoint(\n point,\n invertTransform(this.group.calcTransformMatrix()),\n );\n }\n this.setRelativeXY(point, originX, originY);\n }\n\n /**\n * @returns {Point} x,y position according to object's originX originY properties in parent's coordinate plane\n */\n getRelativeXY(): Point {\n return new Point(this.left, this.top);\n }\n\n /**\n * As {@link setXY}, but in current parent's coordinate plane (the current group if any or the canvas)\n * @param {Point} point position according to object's originX originY properties in parent's coordinate plane\n * @param {TOriginX} [originX] Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} [originY] Vertical origin: 'top', 'center' or 'bottom'\n */\n setRelativeXY(\n point: Point,\n originX: TOriginX = this.originX,\n originY: TOriginY = this.originY,\n ) {\n this.setPositionByOrigin(point, originX, originY);\n }\n\n /**\n * @deprecated intermidiate method to be removed, do not use\n */\n protected isStrokeAccountedForInDimensions() {\n return false;\n }\n\n /**\n * @return {Point[]} [tl, tr, br, bl] in the scene plane\n */\n getCoords(): Point[] {\n const { tl, tr, br, bl } =\n this.aCoords || (this.aCoords = this.calcACoords());\n const coords = [tl, tr, br, bl];\n if (this.group) {\n const t = this.group.calcTransformMatrix();\n return coords.map((p) => transformPoint(p, t));\n }\n return coords;\n }\n\n /**\n * Checks if object intersects with the scene rect formed by tl and br\n */\n intersectsWithRect(tl: Point, br: Point): boolean {\n const intersection = Intersection.intersectPolygonRectangle(\n this.getCoords(),\n tl,\n br,\n );\n return intersection.status === 'Intersection';\n }\n\n /**\n * Checks if object intersects with another object\n * @param {Object} other Object to test\n * @return {Boolean} true if object intersects with another object\n */\n intersectsWithObject(other: ObjectGeometry): boolean {\n const intersection = Intersection.intersectPolygonPolygon(\n this.getCoords(),\n other.getCoords(),\n );\n\n return (\n intersection.status === 'Intersection' ||\n intersection.status === 'Coincident' ||\n other.isContainedWithinObject(this) ||\n this.isContainedWithinObject(other)\n );\n }\n\n /**\n * Checks if object is fully contained within area of another object\n * @param {Object} other Object to test\n * @return {Boolean} true if object is fully contained within area of another object\n */\n isContainedWithinObject(other: ObjectGeometry): boolean {\n const points = this.getCoords();\n return points.every((point) => other.containsPoint(point));\n }\n\n /**\n * Checks if object is fully contained within the scene rect formed by tl and br\n */\n isContainedWithinRect(tl: Point, br: Point): boolean {\n const { left, top, width, height } = this.getBoundingRect();\n return (\n left >= tl.x &&\n left + width <= br.x &&\n top >= tl.y &&\n top + height <= br.y\n );\n }\n\n isOverlapping<T extends ObjectGeometry>(other: T): boolean {\n return (\n this.intersectsWithObject(other) ||\n this.isContainedWithinObject(other) ||\n other.isContainedWithinObject(this)\n );\n }\n\n /**\n * Checks if point is inside the object\n * @param {Point} point Point to check against\n * @return {Boolean} true if point is inside the object\n */\n containsPoint(point: Point): boolean {\n return Intersection.isPointInPolygon(point, this.getCoords());\n }\n\n /**\n * Checks if object is contained within the canvas with current viewportTransform\n * the check is done stopping at first point that appears on screen\n * @return {Boolean} true if object is fully or partially contained within canvas\n */\n isOnScreen(): boolean {\n if (!this.canvas) {\n return false;\n }\n const { tl, br } = this.canvas.vptCoords;\n const points = this.getCoords();\n // if some point is on screen, the object is on screen.\n if (\n points.some(\n (point) =>\n point.x <= br.x &&\n point.x >= tl.x &&\n point.y <= br.y &&\n point.y >= tl.y,\n )\n ) {\n return true;\n }\n // no points on screen, check intersection with absolute coordinates\n if (this.intersectsWithRect(tl, br)) {\n return true;\n }\n // check if the object is so big that it contains the entire viewport\n return this.containsPoint(tl.midPointFrom(br));\n }\n\n /**\n * Checks if object is partially contained within the canvas with current viewportTransform\n * @return {Boolean} true if object is partially contained within canvas\n */\n isPartiallyOnScreen(): boolean {\n if (!this.canvas) {\n return false;\n }\n const { tl, br } = this.canvas.vptCoords;\n if (this.intersectsWithRect(tl, br)) {\n return true;\n }\n const allPointsAreOutside = this.getCoords().every(\n (point) =>\n (point.x >= br.x || point.x <= tl.x) &&\n (point.y >= br.y || point.y <= tl.y),\n );\n // check if the object is so big that it contains the entire viewport\n return allPointsAreOutside && this.containsPoint(tl.midPointFrom(br));\n }\n\n /**\n * Returns coordinates of object's bounding rectangle (left, top, width, height)\n * the box is intended as aligned to axis of canvas.\n * @return {Object} Object with left, top, width, height properties\n */\n getBoundingRect(): TBBox {\n return makeBoundingBoxFromPoints(this.getCoords());\n }\n\n /**\n * Returns width of an object's bounding box counting transformations\n * @todo shouldn't this account for group transform and return the actual size in canvas coordinate plane?\n * @return {Number} width value\n */\n getScaledWidth(): number {\n return this._getTransformedDimensions().x;\n }\n\n /**\n * Returns height of an object bounding box counting transformations\n * @todo shouldn't this account for group transform and return the actual size in canvas coordinate plane?\n * @return {Number} height value\n */\n getScaledHeight(): number {\n return this._getTransformedDimensions().y;\n }\n\n /**\n * Scales an object (equally by x and y)\n * @param {Number} value Scale factor\n * @return {void}\n */\n scale(value: number): void {\n this._set(SCALE_X, value);\n this._set(SCALE_Y, value);\n this.setCoords();\n }\n\n /**\n * Scales an object to a given width, with respect to bounding box (scaling by x/y equally)\n * @param {Number} value New width value\n * @return {void}\n */\n scaleToWidth(value: number) {\n // adjust to bounding rect factor so that rotated shapes would fit as well\n const boundingRectFactor =\n this.getBoundingRect().width / this.getScaledWidth();\n return this.scale(value / this.width / boundingRectFactor);\n }\n\n /**\n * Scales an object to a given height, with respect to bounding box (scaling by x/y equally)\n * @param {Number} value New height value\n * @return {void}\n */\n scaleToHeight(value: number) {\n // adjust to bounding rect factor so that rotated shapes would fit as well\n const boundingRectFactor =\n this.getBoundingRect().height / this.getScaledHeight();\n return this.scale(value / this.height / boundingRectFactor);\n }\n\n getCanvasRetinaScaling() {\n return this.canvas?.getRetinaScaling() || 1;\n }\n\n /**\n * Returns the object angle relative to canvas counting also the group property\n * @returns {TDegree}\n */\n getTotalAngle(): TDegree {\n return this.group\n ? radiansToDegrees(calcPlaneRotation(this.calcTransformMatrix()))\n : this.angle;\n }\n\n /**\n * Retrieves viewportTransform from Object's canvas if available\n * @return {TMat2D}\n */\n getViewportTransform(): TMat2D {\n return this.canvas?.viewportTransform || (iMatrix.concat() as TMat2D);\n }\n\n /**\n * Calculates the coordinates of the 4 corner of the bbox, in absolute coordinates.\n * those never change with zoom or viewport changes.\n * @return {TCornerPoint}\n */\n calcACoords(): TCornerPoint {\n const rotateMatrix = createRotateMatrix({ angle: this.angle }),\n { x, y } = this.getRelativeCenterPoint(),\n tMatrix = createTranslateMatrix(x, y),\n finalMatrix = multiplyTransformMatrices(tMatrix, rotateMatrix),\n dim = this._getTransformedDimensions(),\n w = dim.x / 2,\n h = dim.y / 2;\n return {\n // corners\n tl: transformPoint({ x: -w, y: -h }, finalMatrix),\n tr: transformPoint({ x: w, y: -h }, finalMatrix),\n bl: transformPoint({ x: -w, y: h }, finalMatrix),\n br: transformPoint({ x: w, y: h }, finalMatrix),\n };\n }\n\n /**\n * Sets corner and controls position coordinates based on current angle, width and height, left and top.\n * aCoords are used to quickly find an object on the canvas.\n * See {@link https://github.com/fabricjs/fabric.js/wiki/When-to-call-setCoords} and {@link http://fabric5.fabricjs.com/fabric-gotchas}\n */\n setCoords(): void {\n this.aCoords = this.calcACoords();\n }\n\n transformMatrixKey(skipGroup = false): number[] {\n let prefix: number[] = [];\n if (!skipGroup && this.group) {\n prefix = this.group.transformMatrixKey(skipGroup);\n }\n prefix.push(\n this.top,\n this.left,\n this.width,\n this.height,\n this.scaleX,\n this.scaleY,\n this.angle,\n this.strokeWidth,\n this.skewX,\n this.skewY,\n +this.flipX,\n +this.flipY,\n resolveOrigin(this.originX),\n resolveOrigin(this.originY),\n );\n\n return prefix;\n }\n\n /**\n * calculate transform matrix that represents the current transformations from the\n * object's properties.\n * @param {Boolean} [skipGroup] return transform matrix for object not counting parent transformations\n * There are some situation in which this is useful to avoid the fake rotation.\n * @return {TMat2D} transform matrix for the object\n */\n calcTransformMatrix(skipGroup = false): TMat2D {\n let matrix = this.calcOwnMatrix();\n if (skipGroup || !this.group) {\n return matrix;\n }\n const key = this.transformMatrixKey(skipGroup),\n cache = this.matrixCache;\n if (cache && cache.key.every((x, i) => x === key[i])) {\n return cache.value;\n }\n if (this.group) {\n matrix = multiplyTransformMatrices(\n this.group.calcTransformMatrix(false),\n matrix,\n );\n }\n this.matrixCache = {\n key,\n value: matrix,\n };\n return matrix;\n }\n\n /**\n * calculate transform matrix that represents the current transformations from the\n * object's properties, this matrix does not include the group transformation\n * @return {TMat2D} transform matrix for the object\n */\n calcOwnMatrix(): TMat2D {\n const key = this.transformMatrixKey(true),\n cache = this.ownMatrixCache;\n if (cache && cache.key === key) {\n return cache.value;\n }\n const center = this.getRelativeCenterPoint(),\n options = {\n angle: this.angle,\n translateX: center.x,\n translateY: center.y,\n scaleX: this.scaleX,\n scaleY: this.scaleY,\n skewX: this.skewX,\n skewY: this.skewY,\n flipX: this.flipX,\n flipY: this.flipY,\n },\n value = composeMatrix(options);\n this.ownMatrixCache = {\n key,\n value,\n };\n return value;\n }\n\n /**\n * Calculate object dimensions from its properties\n * @private\n * @returns {Point} dimensions\n */\n _getNonTransformedDimensions(): Point {\n return new Point(this.width, this.height).scalarAdd(this.strokeWidth);\n }\n\n /**\n * Calculate object dimensions for controls box, including padding and canvas zoom.\n * and active selection\n * @private\n * @param {object} [options] transform options\n * @returns {Point} dimensions\n */\n _calculateCurrentDimensions(options?: any): Point {\n return this._getTransformedDimensions(options)\n .transform(this.getViewportTransform(), true)\n .scalarAdd(2 * this.padding);\n }\n\n // #region Origin\n\n declare top: number;\n declare left: number;\n declare width: number;\n declare height: number;\n declare flipX: boolean;\n declare flipY: boolean;\n declare scaleX: number;\n declare scaleY: number;\n declare skewX: number;\n declare skewY: number;\n /**\n * @deprecated please use 'center' as value in new projects\n * */\n declare originX: TOriginX;\n /**\n * @deprecated please use 'center' as value in new projects\n * */\n declare originY: TOriginY;\n declare angle: TDegree;\n declare strokeWidth: number;\n declare strokeUniform: boolean;\n\n /**\n * Object containing this object.\n * can influence its size and position\n */\n declare group?: Group;\n\n /**\n * Calculate object bounding box dimensions from its properties scale, skew.\n * This bounding box is aligned with object angle and not with canvas axis or screen.\n * @param {Object} [options]\n * @param {Number} [options.scaleX]\n * @param {Number} [options.scaleY]\n * @param {Number} [options.skewX]\n * @param {Number} [options.skewY]\n * @private\n * @returns {Point} dimensions\n */\n _getTransformedDimensions(options: any = {}): Point {\n const dimOptions = {\n // if scaleX or scaleY are negative numbers,\n // this will return dimensions that are negative.\n // and this will break assumptions around the codebase\n scaleX: this.scaleX,\n scaleY: this.scaleY,\n skewX: this.skewX,\n skewY: this.skewY,\n width: this.width,\n height: this.height,\n strokeWidth: this.strokeWidth,\n // TODO remove this spread. is visible in the performance inspection\n ...options,\n };\n // stroke is applied before/after transformations are applied according to `strokeUniform`\n const strokeWidth = dimOptions.strokeWidth;\n let preScalingStrokeValue = strokeWidth,\n postScalingStrokeValue = 0;\n\n if (this.strokeUniform) {\n preScalingStrokeValue = 0;\n postScalingStrokeValue = strokeWidth;\n }\n const dimX = dimOptions.width + preScalingStrokeValue,\n dimY = dimOptions.height + preScalingStrokeValue,\n noSkew = dimOptions.skewX === 0 && dimOptions.skewY === 0;\n let finalDimensions;\n if (noSkew) {\n finalDimensions = new Point(\n dimX * dimOptions.scaleX,\n dimY * dimOptions.scaleY,\n );\n } else {\n finalDimensions = sizeAfterTransform(\n dimX,\n dimY,\n calcDimensionsMatrix(dimOptions),\n );\n }\n\n return finalDimensions.scalarAdd(postScalingStrokeValue);\n }\n\n /**\n * Translates the coordinates from a set of origin to another (based on the object's dimensions)\n * @param {Point} point The point which corresponds to the originX and originY params\n * @param {TOriginX} fromOriginX Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} fromOriginY Vertical origin: 'top', 'center' or 'bottom'\n * @param {TOriginX} toOriginX Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} toOriginY Vertical origin: 'top', 'center' or 'bottom'\n * @return {Point}\n */\n translateToGivenOrigin(\n point: Point,\n fromOriginX: TOriginX,\n fromOriginY: TOriginY,\n toOriginX: TOriginX,\n toOriginY: TOriginY,\n ): Point {\n let x = point.x,\n y = point.y;\n const offsetX = resolveOrigin(toOriginX) - resolveOrigin(fromOriginX),\n offsetY = resolveOrigin(toOriginY) - resolveOrigin(fromOriginY);\n\n if (offsetX || offsetY) {\n const dim = this._getTransformedDimensions();\n x += offsetX * dim.x;\n y += offsetY * dim.y;\n }\n\n return new Point(x, y);\n }\n\n /**\n * Translates the coordinates from origin to center coordinates (based on the object's dimensions)\n * @param {Point} point The point which corresponds to the originX and originY params\n * @param {TOriginX} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {Point}\n */\n translateToCenterPoint(\n point: Point,\n originX: TOriginX,\n originY: TOriginY,\n ): Point {\n if (originX === CENTER && originY === CENTER) {\n return point;\n }\n const p = this.translateToGivenOrigin(\n point,\n originX,\n originY,\n CENTER,\n CENTER,\n );\n if (this.angle) {\n return p.rotate(degreesToRadians(this.angle), point);\n }\n return p;\n }\n\n /**\n * Translates the coordinates from center to origin coordinates (based on the object's dimensions)\n * @param {Point} center The point which corresponds to center of the object\n * @param {OriginX} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {OriginY} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {Point}\n */\n translateToOriginPoint(\n center: Point,\n originX: TOriginX,\n originY: TOriginY,\n ): Point {\n const p = this.translateToGivenOrigin(\n center,\n CENTER,\n CENTER,\n originX,\n originY,\n );\n if (this.angle) {\n return p.rotate(degreesToRadians(this.angle), center);\n }\n return p;\n }\n\n /**\n * Returns the center coordinates of the object relative to canvas\n * @return {Point}\n */\n getCenterPoint(): Point {\n const relCenter = this.getRelativeCenterPoint();\n return this.group\n ? transformPoint(relCenter, this.group.calcTransformMatrix())\n : relCenter;\n }\n\n /**\n * Returns the center coordinates of the object relative to it's parent\n * @return {Point}\n */\n getRelativeCenterPoint(): Point {\n return this.translateToCenterPoint(\n new Point(this.left, this.top),\n this.originX,\n this.originY,\n );\n }\n\n /**\n * Alias of {@link getPositionByOrigin}\n * @deprecated use {@link getPositionByOrigin} instead\n */\n getPointByOrigin(originX: TOriginX, originY: TOriginY): Point {\n return this.getPositionByOrigin(originX, originY);\n }\n\n /**\n * This function is the mirror of {@link setPositionByOrigin}\n * Returns the position of the object based on specified origin.\n * Take an object that has left, top set to 100, 100 with origin 'left', 'top'.\n * Return the values of left top ( wrapped in a point ) that you would need to keep\n * the same position if origin where different ( ex: center, bottom )\n * Alternatively you can use this to also find which point in the parent plane is a specific origin\n * ( where is the bottom right corner of my object? )\n * @param {TOriginX} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {Point}\n */\n getPositionByOrigin(originX: TOriginX, originY: TOriginY) {\n return this.translateToOriginPoint(\n this.getRelativeCenterPoint(),\n originX,\n originY,\n );\n }\n\n /**\n * Sets the position of the object taking into consideration the object's origin\n * @param {Point} pos The new position of the object\n * @param {TOriginX} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {void}\n */\n setPositionByOrigin(pos: Point, originX: TOriginX, originY: TOriginY) {\n const center = this.translateToCenterPoint(pos, originX, originY),\n position = this.translateToOriginPoint(\n center,\n this.originX,\n this.originY,\n );\n this.set({ left: position.x, top: position.y });\n }\n\n /**\n * @private\n */\n _getLeftTopCoords() {\n return this.getPositionByOrigin(LEFT, TOP);\n }\n\n /**\n * An utility method to position the object by its left top corner.\n * Useful to reposition objects since now the default origin is center/center\n * Places the left/top corner of the object bounding box in p.\n */\n positionByLeftTop(p: Point) {\n return this.setPositionByOrigin(p, LEFT, TOP);\n }\n}\n"],"names":["ObjectGeometry","CommonMethods","getX","this","getXY","x","setX","value","setXY","getY","y","setY","getRelativeX","left","setRelativeX","getRelativeY","top","setRelativeY","relativePosition","getRelativeXY","group","transformPoint","calcTransformMatrix","point","originX","originY","invertTransform","setRelativeXY","Point","arguments","length","undefined","setPositionByOrigin","isStrokeAccountedForInDimensions","getCoords","tl","tr","br","bl","aCoords","calcACoords","coords","t","map","p","intersectsWithRect","Intersection","intersectPolygonRectangle","status","intersectsWithObject","other","intersection","intersectPolygonPolygon","isContainedWithinObject","every","containsPoint","isContainedWithinRect","width","height","getBoundingRect","isOverlapping","isPointInPolygon","isOnScreen","canvas","vptCoords","some","midPointFrom","isPartiallyOnScreen","makeBoundingBoxFromPoints","getScaledWidth","_getTransformedDimensions","getScaledHeight","scale","_set","SCALE_X","SCALE_Y","setCoords","scaleToWidth","boundingRectFactor","scaleToHeight","getCanvasRetinaScaling","_this$canvas","getRetinaScaling","getTotalAngle","radiansToDegrees","calcPlaneRotation","angle","getViewportTransform","_this$canvas2","viewportTransform","iMatrix","concat","rotateMatrix","createRotateMatrix","getRelativeCenterPoint","tMatrix","createTranslateMatrix","finalMatrix","multiplyTransformMatrices","dim","w","h","transformMatrixKey","skipGroup","prefix","push","scaleX","scaleY","strokeWidth","skewX","skewY","flipX","flipY","resolveOrigin","matrix","calcOwnMatrix","key","cache","matrixCache","i","ownMatrixCache","center","options","translateX","translateY","composeMatrix","_getNonTransformedDimensions","scalarAdd","_calculateCurrentDimensions","transform","padding","dimOptions","preScalingStrokeValue","postScalingStrokeValue","strokeUniform","dimX","dimY","finalDimensions","sizeAfterTransform","calcDimensionsMatrix","translateToGivenOrigin","fromOriginX","fromOriginY","toOriginX","toOriginY","offsetX","offsetY","translateToCenterPoint","CENTER","rotate","degreesToRadians","translateToOriginPoint","getCenterPoint","relCenter","getPointByOrigin","getPositionByOrigin","pos","position","set","_getLeftTopCoords","LEFT","TOP","positionByLeftTop"],"mappings":"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"}
1
+ {"version":3,"file":"ObjectGeometry.min.mjs","sources":["../../../../src/shapes/Object/ObjectGeometry.ts"],"sourcesContent":["import type {\n TBBox,\n TCornerPoint,\n TDegree,\n TMat2D,\n TOriginX,\n TOriginY,\n} from '../../typedefs';\nimport { SCALE_X, SCALE_Y, iMatrix } from '../../constants';\nimport { Intersection } from '../../Intersection';\nimport { Point } from '../../Point';\nimport { makeBoundingBoxFromPoints } from '../../util/misc/boundingBoxFromPoints';\nimport {\n createRotateMatrix,\n createTranslateMatrix,\n composeMatrix,\n invertTransform,\n multiplyTransformMatrices,\n transformPoint,\n calcPlaneRotation,\n} from '../../util/misc/matrix';\nimport { radiansToDegrees } from '../../util/misc/radiansDegreesConversion';\nimport type { Canvas } from '../../canvas/Canvas';\nimport type { StaticCanvas } from '../../canvas/StaticCanvas';\nimport type { ObjectEvents } from '../../EventTypeDefs';\nimport type { ControlProps } from './types/ControlProps';\nimport { resolveOrigin } from '../../util/misc/resolveOrigin';\nimport type { Group } from '../Group';\nimport { calcDimensionsMatrix } from '../../util/misc/matrix';\nimport { sizeAfterTransform } from '../../util/misc/objectTransforms';\nimport { degreesToRadians } from '../../util/misc/radiansDegreesConversion';\nimport { CommonMethods } from '../../CommonMethods';\nimport type { BaseProps } from './types/BaseProps';\nimport type { FillStrokeProps } from './types/FillStrokeProps';\nimport { CENTER, LEFT, TOP } from '../../constants';\n\ntype TMatrixCache = {\n key: number[];\n value: TMat2D;\n};\n\ntype TACoords = TCornerPoint;\n\nexport class ObjectGeometry<EventSpec extends ObjectEvents = ObjectEvents>\n extends CommonMethods<EventSpec>\n implements\n Pick<ControlProps, 'padding'>,\n BaseProps,\n Pick<FillStrokeProps, 'strokeWidth' | 'strokeUniform'>\n{\n // #region Geometry\n\n declare padding: number;\n\n /**\n * Describe object's corner position in scene coordinates.\n * The coordinates are derived from the following:\n * left, top, width, height, scaleX, scaleY, skewX, skewY, angle, strokeWidth.\n * The coordinates do not depend on viewport changes.\n * The coordinates get updated with {@link setCoords}.\n * You can calculate them without updating with {@link calcACoords()}\n */\n declare aCoords: TACoords;\n\n /**\n * storage cache for object transform matrix\n */\n declare ownMatrixCache?: TMatrixCache;\n\n /**\n * storage cache for object full transform matrix\n */\n declare matrixCache?: TMatrixCache;\n\n /**\n * A Reference of the Canvas where the object is actually added\n * @type StaticCanvas | Canvas;\n * @default undefined\n * @private\n */\n declare canvas?: StaticCanvas | Canvas;\n\n /**\n * @returns {number} x position according to object's originX property in canvas coordinate plane\n */\n getX(): number {\n return this.getXY().x;\n }\n\n /**\n * @param {number} value x position according to object's originX property in canvas coordinate plane\n */\n setX(value: number) {\n this.setXY(this.getXY().setX(value));\n }\n\n /**\n * @returns {number} y position according to object's originY property in canvas coordinate plane\n */\n getY(): number {\n return this.getXY().y;\n }\n\n /**\n * @param {number} value y position according to object's originY property in canvas coordinate plane\n */\n setY(value: number) {\n this.setXY(this.getXY().setY(value));\n }\n\n /**\n * @returns {number} x position according to object's originX property in parent's coordinate plane\\\n * if parent is canvas then this property is identical to {@link getX}\n */\n getRelativeX(): number {\n return this.left;\n }\n\n /**\n * @param {number} value x position according to object's originX property in parent's coordinate plane\\\n * if parent is canvas then this method is identical to {@link setX}\n */\n setRelativeX(value: number) {\n this.left = value;\n }\n\n /**\n * @returns {number} y position according to object's originY property in parent's coordinate plane\\\n * if parent is canvas then this property is identical to {@link getY}\n */\n getRelativeY(): number {\n return this.top;\n }\n\n /**\n * @param {number} value y position according to object's originY property in parent's coordinate plane\\\n * if parent is canvas then this property is identical to {@link setY}\n */\n setRelativeY(value: number) {\n this.top = value;\n }\n\n /**\n * @returns {Point} x position according to object's originX originY properties in canvas coordinate plane\n */\n getXY(): Point {\n const relativePosition = this.getRelativeXY();\n return this.group\n ? transformPoint(relativePosition, this.group.calcTransformMatrix())\n : relativePosition;\n }\n\n /**\n * Set an object position to a particular point, the point is intended in absolute ( canvas ) coordinate.\n * You can specify originX and originY values,\n * that otherwise are the object's current values.\n * @example <caption>Set object's bottom left corner to point (5,5) on canvas</caption>\n * object.setXY(new Point(5, 5), 'left', 'bottom').\n * @param {Point} point position in scene coordinate plane\n * @param {TOriginX} [originX] Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} [originY] Vertical origin: 'top', 'center' or 'bottom'\n */\n setXY(point: Point, originX?: TOriginX, originY?: TOriginY) {\n if (this.group) {\n point = transformPoint(\n point,\n invertTransform(this.group.calcTransformMatrix()),\n );\n }\n this.setRelativeXY(point, originX, originY);\n }\n\n /**\n * @returns {Point} x,y position according to object's originX originY properties in parent's coordinate plane\n */\n getRelativeXY(): Point {\n return new Point(this.left, this.top);\n }\n\n /**\n * As {@link setXY}, but in current parent's coordinate plane (the current group if any or the canvas)\n * @param {Point} point position according to object's originX originY properties in parent's coordinate plane\n * @param {TOriginX} [originX] Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} [originY] Vertical origin: 'top', 'center' or 'bottom'\n */\n setRelativeXY(\n point: Point,\n originX: TOriginX = this.originX,\n originY: TOriginY = this.originY,\n ) {\n this.setPositionByOrigin(point, originX, originY);\n }\n\n /**\n * @deprecated intermidiate method to be removed, do not use\n */\n protected isStrokeAccountedForInDimensions() {\n return false;\n }\n\n /**\n * @return {Point[]} [tl, tr, br, bl] in the scene plane\n */\n getCoords(): Point[] {\n const { tl, tr, br, bl } =\n this.aCoords || (this.aCoords = this.calcACoords());\n const coords = [tl, tr, br, bl];\n if (this.group) {\n const t = this.group.calcTransformMatrix();\n return coords.map((p) => transformPoint(p, t));\n }\n return coords;\n }\n\n /**\n * Checks if object intersects with the scene rect formed by tl and br\n */\n intersectsWithRect(tl: Point, br: Point): boolean {\n const intersection = Intersection.intersectPolygonRectangle(\n this.getCoords(),\n tl,\n br,\n );\n return intersection.status === 'Intersection';\n }\n\n /**\n * Checks if object intersects with another object\n * @param {Object} other Object to test\n * @return {Boolean} true if object intersects with another object\n */\n intersectsWithObject(other: ObjectGeometry): boolean {\n const intersection = Intersection.intersectPolygonPolygon(\n this.getCoords(),\n other.getCoords(),\n );\n\n return (\n intersection.status === 'Intersection' ||\n intersection.status === 'Coincident' ||\n other.isContainedWithinObject(this) ||\n this.isContainedWithinObject(other)\n );\n }\n\n /**\n * Checks if object is fully contained within area of another object\n * @param {Object} other Object to test\n * @return {Boolean} true if object is fully contained within area of another object\n */\n isContainedWithinObject(other: ObjectGeometry): boolean {\n const points = this.getCoords();\n return points.every((point) => other.containsPoint(point));\n }\n\n /**\n * Checks if object is fully contained within the scene rect formed by tl and br\n */\n isContainedWithinRect(tl: Point, br: Point): boolean {\n const { left, top, width, height } = this.getBoundingRect();\n return (\n left >= tl.x &&\n left + width <= br.x &&\n top >= tl.y &&\n top + height <= br.y\n );\n }\n\n isOverlapping<T extends ObjectGeometry>(other: T): boolean {\n return (\n this.intersectsWithObject(other) ||\n this.isContainedWithinObject(other) ||\n other.isContainedWithinObject(this)\n );\n }\n\n /**\n * Checks if point is inside the object\n * @param {Point} point Point to check against\n * @return {Boolean} true if point is inside the object\n */\n containsPoint(point: Point): boolean {\n return Intersection.isPointInPolygon(point, this.getCoords());\n }\n\n /**\n * Checks if object is contained within the canvas with current viewportTransform\n * the check is done stopping at first point that appears on screen\n * @return {Boolean} true if object is fully or partially contained within canvas\n */\n isOnScreen(): boolean {\n if (!this.canvas) {\n return false;\n }\n const { tl, br } = this.canvas.vptCoords;\n const points = this.getCoords();\n // if some point is on screen, the object is on screen.\n if (\n points.some(\n (point) =>\n point.x <= br.x &&\n point.x >= tl.x &&\n point.y <= br.y &&\n point.y >= tl.y,\n )\n ) {\n return true;\n }\n // no points on screen, check intersection with absolute coordinates\n if (this.intersectsWithRect(tl, br)) {\n return true;\n }\n // check if the object is so big that it contains the entire viewport\n return this.containsPoint(tl.midPointFrom(br));\n }\n\n /**\n * Checks if object is partially contained within the canvas with current viewportTransform\n * @return {Boolean} true if object is partially contained within canvas\n */\n isPartiallyOnScreen(): boolean {\n if (!this.canvas) {\n return false;\n }\n const { tl, br } = this.canvas.vptCoords;\n if (this.intersectsWithRect(tl, br)) {\n return true;\n }\n const allPointsAreOutside = this.getCoords().every(\n (point) =>\n (point.x >= br.x || point.x <= tl.x) &&\n (point.y >= br.y || point.y <= tl.y),\n );\n // check if the object is so big that it contains the entire viewport\n return allPointsAreOutside && this.containsPoint(tl.midPointFrom(br));\n }\n\n /**\n * Returns coordinates of object's bounding rectangle (left, top, width, height)\n * the box is intended as aligned to axis of canvas.\n * @return {Object} Object with left, top, width, height properties\n */\n getBoundingRect(): TBBox {\n return makeBoundingBoxFromPoints(this.getCoords());\n }\n\n /**\n * Returns width of an object's bounding box counting transformations\n * @todo shouldn't this account for group transform and return the actual size in canvas coordinate plane?\n * @return {Number} width value\n */\n getScaledWidth(): number {\n return this._getTransformedDimensions().x;\n }\n\n /**\n * Returns height of an object bounding box counting transformations\n * @todo shouldn't this account for group transform and return the actual size in canvas coordinate plane?\n * @return {Number} height value\n */\n getScaledHeight(): number {\n return this._getTransformedDimensions().y;\n }\n\n /**\n * Scales an object (equally by x and y)\n * @param {Number} value Scale factor\n * @return {void}\n */\n scale(value: number): void {\n this._set(SCALE_X, value);\n this._set(SCALE_Y, value);\n this.setCoords();\n }\n\n /**\n * Scales an object to a given width, with respect to bounding box (scaling by x/y equally)\n * @param {Number} value New width value\n * @return {void}\n */\n scaleToWidth(value: number) {\n // adjust to bounding rect factor so that rotated shapes would fit as well\n const boundingRectFactor =\n this.getBoundingRect().width / this.getScaledWidth();\n return this.scale(value / this.width / boundingRectFactor);\n }\n\n /**\n * Scales an object to a given height, with respect to bounding box (scaling by x/y equally)\n * @param {Number} value New height value\n * @return {void}\n */\n scaleToHeight(value: number) {\n // adjust to bounding rect factor so that rotated shapes would fit as well\n const boundingRectFactor =\n this.getBoundingRect().height / this.getScaledHeight();\n return this.scale(value / this.height / boundingRectFactor);\n }\n\n getCanvasRetinaScaling() {\n return this.canvas?.getRetinaScaling() || 1;\n }\n\n /**\n * Returns the object angle relative to canvas counting also the group property\n * @returns {TDegree}\n */\n getTotalAngle(): TDegree {\n return this.group\n ? radiansToDegrees(calcPlaneRotation(this.calcTransformMatrix()))\n : this.angle;\n }\n\n /**\n * Retrieves viewportTransform from Object's canvas if available\n * @return {TMat2D}\n */\n getViewportTransform(): TMat2D {\n return this.canvas?.viewportTransform || (iMatrix.concat() as TMat2D);\n }\n\n /**\n * Calculates the coordinates of the 4 corner of the bbox, in absolute coordinates.\n * those never change with zoom or viewport changes.\n * @return {TCornerPoint}\n */\n calcACoords(): TCornerPoint {\n const rotateMatrix = createRotateMatrix({ angle: this.angle }),\n { x, y } = this.getRelativeCenterPoint(),\n tMatrix = createTranslateMatrix(x, y),\n finalMatrix = multiplyTransformMatrices(tMatrix, rotateMatrix),\n dim = this._getTransformedDimensions(),\n w = dim.x / 2,\n h = dim.y / 2;\n return {\n // corners\n tl: transformPoint({ x: -w, y: -h }, finalMatrix),\n tr: transformPoint({ x: w, y: -h }, finalMatrix),\n bl: transformPoint({ x: -w, y: h }, finalMatrix),\n br: transformPoint({ x: w, y: h }, finalMatrix),\n };\n }\n\n /**\n * Sets corner and controls position coordinates based on current angle, width and height, left and top.\n * aCoords are used to quickly find an object on the canvas.\n * See {@link https://github.com/fabricjs/fabric.js/wiki/When-to-call-setCoords} and {@link http://fabric5.fabricjs.com/fabric-gotchas}\n */\n setCoords(): void {\n this.aCoords = this.calcACoords();\n }\n\n transformMatrixKey(skipGroup = false): number[] {\n let prefix: number[] = [];\n if (!skipGroup && this.group) {\n prefix = this.group.transformMatrixKey(skipGroup);\n }\n prefix.push(\n this.top,\n this.left,\n this.width,\n this.height,\n this.scaleX,\n this.scaleY,\n this.angle,\n this.strokeWidth,\n this.skewX,\n this.skewY,\n +this.flipX,\n +this.flipY,\n resolveOrigin(this.originX),\n resolveOrigin(this.originY),\n );\n\n return prefix;\n }\n\n /**\n * calculate transform matrix that represents the current transformations from the\n * object's properties.\n * @param {Boolean} [skipGroup] return transform matrix for object not counting parent transformations\n * There are some situation in which this is useful to avoid the fake rotation.\n * @return {TMat2D} transform matrix for the object\n */\n calcTransformMatrix(skipGroup = false): TMat2D {\n let matrix = this.calcOwnMatrix();\n if (skipGroup || !this.group) {\n return matrix;\n }\n const key = this.transformMatrixKey(skipGroup),\n cache = this.matrixCache;\n if (cache && cache.key.every((x, i) => x === key[i])) {\n return cache.value;\n }\n if (this.group) {\n matrix = multiplyTransformMatrices(\n this.group.calcTransformMatrix(false),\n matrix,\n );\n }\n this.matrixCache = {\n key,\n value: matrix,\n };\n return matrix;\n }\n\n /**\n * calculate transform matrix that represents the current transformations from the\n * object's properties, this matrix does not include the group transformation\n * @return {TMat2D} transform matrix for the object\n */\n calcOwnMatrix(): TMat2D {\n const key = this.transformMatrixKey(true),\n cache = this.ownMatrixCache;\n if (cache && cache.key.every((x, i) => x === key[i])) {\n return cache.value;\n }\n const center = this.getRelativeCenterPoint(),\n options = {\n angle: this.angle,\n translateX: center.x,\n translateY: center.y,\n scaleX: this.scaleX,\n scaleY: this.scaleY,\n skewX: this.skewX,\n skewY: this.skewY,\n flipX: this.flipX,\n flipY: this.flipY,\n },\n value = composeMatrix(options);\n this.ownMatrixCache = {\n key,\n value,\n };\n return value;\n }\n\n /**\n * Calculate object dimensions from its properties\n * @private\n * @returns {Point} dimensions\n */\n _getNonTransformedDimensions(): Point {\n return new Point(this.width, this.height).scalarAdd(this.strokeWidth);\n }\n\n /**\n * Calculate object dimensions for controls box, including padding and canvas zoom.\n * and active selection\n * @private\n * @param {object} [options] transform options\n * @returns {Point} dimensions\n */\n _calculateCurrentDimensions(options?: any): Point {\n return this._getTransformedDimensions(options)\n .transform(this.getViewportTransform(), true)\n .scalarAdd(2 * this.padding);\n }\n\n // #region Origin\n\n declare top: number;\n declare left: number;\n declare width: number;\n declare height: number;\n declare flipX: boolean;\n declare flipY: boolean;\n declare scaleX: number;\n declare scaleY: number;\n declare skewX: number;\n declare skewY: number;\n /**\n * @deprecated please use 'center' as value in new projects\n * */\n declare originX: TOriginX;\n /**\n * @deprecated please use 'center' as value in new projects\n * */\n declare originY: TOriginY;\n declare angle: TDegree;\n declare strokeWidth: number;\n declare strokeUniform: boolean;\n\n /**\n * Object containing this object.\n * can influence its size and position\n */\n declare group?: Group;\n\n /**\n * Calculate object bounding box dimensions from its properties scale, skew.\n * This bounding box is aligned with object angle and not with canvas axis or screen.\n * @param {Object} [options]\n * @param {Number} [options.scaleX]\n * @param {Number} [options.scaleY]\n * @param {Number} [options.skewX]\n * @param {Number} [options.skewY]\n * @private\n * @returns {Point} dimensions\n */\n _getTransformedDimensions(options: any = {}): Point {\n const dimOptions = {\n // if scaleX or scaleY are negative numbers,\n // this will return dimensions that are negative.\n // and this will break assumptions around the codebase\n scaleX: this.scaleX,\n scaleY: this.scaleY,\n skewX: this.skewX,\n skewY: this.skewY,\n width: this.width,\n height: this.height,\n strokeWidth: this.strokeWidth,\n // TODO remove this spread. is visible in the performance inspection\n ...options,\n };\n // stroke is applied before/after transformations are applied according to `strokeUniform`\n const strokeWidth = dimOptions.strokeWidth;\n let preScalingStrokeValue = strokeWidth,\n postScalingStrokeValue = 0;\n\n if (this.strokeUniform) {\n preScalingStrokeValue = 0;\n postScalingStrokeValue = strokeWidth;\n }\n const dimX = dimOptions.width + preScalingStrokeValue,\n dimY = dimOptions.height + preScalingStrokeValue,\n noSkew = dimOptions.skewX === 0 && dimOptions.skewY === 0;\n let finalDimensions;\n if (noSkew) {\n finalDimensions = new Point(\n dimX * dimOptions.scaleX,\n dimY * dimOptions.scaleY,\n );\n } else {\n finalDimensions = sizeAfterTransform(\n dimX,\n dimY,\n calcDimensionsMatrix(dimOptions),\n );\n }\n\n return finalDimensions.scalarAdd(postScalingStrokeValue);\n }\n\n /**\n * Translates the coordinates from a set of origin to another (based on the object's dimensions)\n * @param {Point} point The point which corresponds to the originX and originY params\n * @param {TOriginX} fromOriginX Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} fromOriginY Vertical origin: 'top', 'center' or 'bottom'\n * @param {TOriginX} toOriginX Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} toOriginY Vertical origin: 'top', 'center' or 'bottom'\n * @return {Point}\n */\n translateToGivenOrigin(\n point: Point,\n fromOriginX: TOriginX,\n fromOriginY: TOriginY,\n toOriginX: TOriginX,\n toOriginY: TOriginY,\n ): Point {\n let x = point.x,\n y = point.y;\n const offsetX = resolveOrigin(toOriginX) - resolveOrigin(fromOriginX),\n offsetY = resolveOrigin(toOriginY) - resolveOrigin(fromOriginY);\n\n if (offsetX || offsetY) {\n const dim = this._getTransformedDimensions();\n x += offsetX * dim.x;\n y += offsetY * dim.y;\n }\n\n return new Point(x, y);\n }\n\n /**\n * Translates the coordinates from origin to center coordinates (based on the object's dimensions)\n * @param {Point} point The point which corresponds to the originX and originY params\n * @param {TOriginX} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {Point}\n */\n translateToCenterPoint(\n point: Point,\n originX: TOriginX,\n originY: TOriginY,\n ): Point {\n if (originX === CENTER && originY === CENTER) {\n return point;\n }\n const p = this.translateToGivenOrigin(\n point,\n originX,\n originY,\n CENTER,\n CENTER,\n );\n if (this.angle) {\n return p.rotate(degreesToRadians(this.angle), point);\n }\n return p;\n }\n\n /**\n * Translates the coordinates from center to origin coordinates (based on the object's dimensions)\n * @param {Point} center The point which corresponds to center of the object\n * @param {OriginX} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {OriginY} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {Point}\n */\n translateToOriginPoint(\n center: Point,\n originX: TOriginX,\n originY: TOriginY,\n ): Point {\n const p = this.translateToGivenOrigin(\n center,\n CENTER,\n CENTER,\n originX,\n originY,\n );\n if (this.angle) {\n return p.rotate(degreesToRadians(this.angle), center);\n }\n return p;\n }\n\n /**\n * Returns the center coordinates of the object relative to canvas\n * @return {Point}\n */\n getCenterPoint(): Point {\n const relCenter = this.getRelativeCenterPoint();\n return this.group\n ? transformPoint(relCenter, this.group.calcTransformMatrix())\n : relCenter;\n }\n\n /**\n * Returns the center coordinates of the object relative to it's parent\n * @return {Point}\n */\n getRelativeCenterPoint(): Point {\n return this.translateToCenterPoint(\n new Point(this.left, this.top),\n this.originX,\n this.originY,\n );\n }\n\n /**\n * Alias of {@link getPositionByOrigin}\n * @deprecated use {@link getPositionByOrigin} instead\n */\n getPointByOrigin(originX: TOriginX, originY: TOriginY): Point {\n return this.getPositionByOrigin(originX, originY);\n }\n\n /**\n * This function is the mirror of {@link setPositionByOrigin}\n * Returns the position of the object based on specified origin.\n * Take an object that has left, top set to 100, 100 with origin 'left', 'top'.\n * Return the values of left top ( wrapped in a point ) that you would need to keep\n * the same position if origin where different ( ex: center, bottom )\n * Alternatively you can use this to also find which point in the parent plane is a specific origin\n * ( where is the bottom right corner of my object? )\n * @param {TOriginX} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {Point}\n */\n getPositionByOrigin(originX: TOriginX, originY: TOriginY) {\n return this.translateToOriginPoint(\n this.getRelativeCenterPoint(),\n originX,\n originY,\n );\n }\n\n /**\n * Sets the position of the object taking into consideration the object's origin\n * @param {Point} pos The new position of the object\n * @param {TOriginX} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {void}\n */\n setPositionByOrigin(pos: Point, originX: TOriginX, originY: TOriginY) {\n const center = this.translateToCenterPoint(pos, originX, originY),\n position = this.translateToOriginPoint(\n center,\n this.originX,\n this.originY,\n );\n this.set({ left: position.x, top: position.y });\n }\n\n /**\n * @private\n */\n _getLeftTopCoords() {\n return this.getPositionByOrigin(LEFT, TOP);\n }\n\n /**\n * An utility method to position the object by its left top corner.\n * Useful to reposition objects since now the default origin is center/center\n * Places the left/top corner of the object bounding box in p.\n */\n positionByLeftTop(p: Point) {\n return this.setPositionByOrigin(p, LEFT, TOP);\n }\n}\n"],"names":["ObjectGeometry","CommonMethods","getX","this","getXY","x","setX","value","setXY","getY","y","setY","getRelativeX","left","setRelativeX","getRelativeY","top","setRelativeY","relativePosition","getRelativeXY","group","transformPoint","calcTransformMatrix","point","originX","originY","invertTransform","setRelativeXY","Point","arguments","length","undefined","setPositionByOrigin","isStrokeAccountedForInDimensions","getCoords","tl","tr","br","bl","aCoords","calcACoords","coords","t","map","p","intersectsWithRect","Intersection","intersectPolygonRectangle","status","intersectsWithObject","other","intersection","intersectPolygonPolygon","isContainedWithinObject","every","containsPoint","isContainedWithinRect","width","height","getBoundingRect","isOverlapping","isPointInPolygon","isOnScreen","canvas","vptCoords","some","midPointFrom","isPartiallyOnScreen","makeBoundingBoxFromPoints","getScaledWidth","_getTransformedDimensions","getScaledHeight","scale","_set","SCALE_X","SCALE_Y","setCoords","scaleToWidth","boundingRectFactor","scaleToHeight","getCanvasRetinaScaling","_this$canvas","getRetinaScaling","getTotalAngle","radiansToDegrees","calcPlaneRotation","angle","getViewportTransform","_this$canvas2","viewportTransform","iMatrix","concat","rotateMatrix","createRotateMatrix","getRelativeCenterPoint","tMatrix","createTranslateMatrix","finalMatrix","multiplyTransformMatrices","dim","w","h","transformMatrixKey","skipGroup","prefix","push","scaleX","scaleY","strokeWidth","skewX","skewY","flipX","flipY","resolveOrigin","matrix","calcOwnMatrix","key","cache","matrixCache","i","ownMatrixCache","center","options","translateX","translateY","composeMatrix","_getNonTransformedDimensions","scalarAdd","_calculateCurrentDimensions","transform","padding","dimOptions","preScalingStrokeValue","postScalingStrokeValue","strokeUniform","dimX","dimY","finalDimensions","sizeAfterTransform","calcDimensionsMatrix","translateToGivenOrigin","fromOriginX","fromOriginY","toOriginX","toOriginY","offsetX","offsetY","translateToCenterPoint","CENTER","rotate","degreesToRadians","translateToOriginPoint","getCenterPoint","relCenter","getPointByOrigin","getPositionByOrigin","pos","position","set","_getLeftTopCoords","LEFT","TOP","positionByLeftTop"],"mappings":"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"}
@@ -437,7 +437,7 @@ class ObjectGeometry extends CommonMethods {
437
437
  calcOwnMatrix() {
438
438
  const key = this.transformMatrixKey(true),
439
439
  cache = this.ownMatrixCache;
440
- if (cache && cache.key === key) {
440
+ if (cache && cache.key.every((x, i) => x === key[i])) {
441
441
  return cache.value;
442
442
  }
443
443
  const center = this.getRelativeCenterPoint(),
@@ -1 +1 @@
1
- {"version":3,"file":"ObjectGeometry.mjs","sources":["../../../../src/shapes/Object/ObjectGeometry.ts"],"sourcesContent":["import type {\n TBBox,\n TCornerPoint,\n TDegree,\n TMat2D,\n TOriginX,\n TOriginY,\n} from '../../typedefs';\nimport { SCALE_X, SCALE_Y, iMatrix } from '../../constants';\nimport { Intersection } from '../../Intersection';\nimport { Point } from '../../Point';\nimport { makeBoundingBoxFromPoints } from '../../util/misc/boundingBoxFromPoints';\nimport {\n createRotateMatrix,\n createTranslateMatrix,\n composeMatrix,\n invertTransform,\n multiplyTransformMatrices,\n transformPoint,\n calcPlaneRotation,\n} from '../../util/misc/matrix';\nimport { radiansToDegrees } from '../../util/misc/radiansDegreesConversion';\nimport type { Canvas } from '../../canvas/Canvas';\nimport type { StaticCanvas } from '../../canvas/StaticCanvas';\nimport type { ObjectEvents } from '../../EventTypeDefs';\nimport type { ControlProps } from './types/ControlProps';\nimport { resolveOrigin } from '../../util/misc/resolveOrigin';\nimport type { Group } from '../Group';\nimport { calcDimensionsMatrix } from '../../util/misc/matrix';\nimport { sizeAfterTransform } from '../../util/misc/objectTransforms';\nimport { degreesToRadians } from '../../util/misc/radiansDegreesConversion';\nimport { CommonMethods } from '../../CommonMethods';\nimport type { BaseProps } from './types/BaseProps';\nimport type { FillStrokeProps } from './types/FillStrokeProps';\nimport { CENTER, LEFT, TOP } from '../../constants';\n\ntype TMatrixCache = {\n key: number[];\n value: TMat2D;\n};\n\ntype TACoords = TCornerPoint;\n\nexport class ObjectGeometry<EventSpec extends ObjectEvents = ObjectEvents>\n extends CommonMethods<EventSpec>\n implements\n Pick<ControlProps, 'padding'>,\n BaseProps,\n Pick<FillStrokeProps, 'strokeWidth' | 'strokeUniform'>\n{\n // #region Geometry\n\n declare padding: number;\n\n /**\n * Describe object's corner position in scene coordinates.\n * The coordinates are derived from the following:\n * left, top, width, height, scaleX, scaleY, skewX, skewY, angle, strokeWidth.\n * The coordinates do not depend on viewport changes.\n * The coordinates get updated with {@link setCoords}.\n * You can calculate them without updating with {@link calcACoords()}\n */\n declare aCoords: TACoords;\n\n /**\n * storage cache for object transform matrix\n */\n declare ownMatrixCache?: TMatrixCache;\n\n /**\n * storage cache for object full transform matrix\n */\n declare matrixCache?: TMatrixCache;\n\n /**\n * A Reference of the Canvas where the object is actually added\n * @type StaticCanvas | Canvas;\n * @default undefined\n * @private\n */\n declare canvas?: StaticCanvas | Canvas;\n\n /**\n * @returns {number} x position according to object's originX property in canvas coordinate plane\n */\n getX(): number {\n return this.getXY().x;\n }\n\n /**\n * @param {number} value x position according to object's originX property in canvas coordinate plane\n */\n setX(value: number) {\n this.setXY(this.getXY().setX(value));\n }\n\n /**\n * @returns {number} y position according to object's originY property in canvas coordinate plane\n */\n getY(): number {\n return this.getXY().y;\n }\n\n /**\n * @param {number} value y position according to object's originY property in canvas coordinate plane\n */\n setY(value: number) {\n this.setXY(this.getXY().setY(value));\n }\n\n /**\n * @returns {number} x position according to object's originX property in parent's coordinate plane\\\n * if parent is canvas then this property is identical to {@link getX}\n */\n getRelativeX(): number {\n return this.left;\n }\n\n /**\n * @param {number} value x position according to object's originX property in parent's coordinate plane\\\n * if parent is canvas then this method is identical to {@link setX}\n */\n setRelativeX(value: number) {\n this.left = value;\n }\n\n /**\n * @returns {number} y position according to object's originY property in parent's coordinate plane\\\n * if parent is canvas then this property is identical to {@link getY}\n */\n getRelativeY(): number {\n return this.top;\n }\n\n /**\n * @param {number} value y position according to object's originY property in parent's coordinate plane\\\n * if parent is canvas then this property is identical to {@link setY}\n */\n setRelativeY(value: number) {\n this.top = value;\n }\n\n /**\n * @returns {Point} x position according to object's originX originY properties in canvas coordinate plane\n */\n getXY(): Point {\n const relativePosition = this.getRelativeXY();\n return this.group\n ? transformPoint(relativePosition, this.group.calcTransformMatrix())\n : relativePosition;\n }\n\n /**\n * Set an object position to a particular point, the point is intended in absolute ( canvas ) coordinate.\n * You can specify originX and originY values,\n * that otherwise are the object's current values.\n * @example <caption>Set object's bottom left corner to point (5,5) on canvas</caption>\n * object.setXY(new Point(5, 5), 'left', 'bottom').\n * @param {Point} point position in scene coordinate plane\n * @param {TOriginX} [originX] Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} [originY] Vertical origin: 'top', 'center' or 'bottom'\n */\n setXY(point: Point, originX?: TOriginX, originY?: TOriginY) {\n if (this.group) {\n point = transformPoint(\n point,\n invertTransform(this.group.calcTransformMatrix()),\n );\n }\n this.setRelativeXY(point, originX, originY);\n }\n\n /**\n * @returns {Point} x,y position according to object's originX originY properties in parent's coordinate plane\n */\n getRelativeXY(): Point {\n return new Point(this.left, this.top);\n }\n\n /**\n * As {@link setXY}, but in current parent's coordinate plane (the current group if any or the canvas)\n * @param {Point} point position according to object's originX originY properties in parent's coordinate plane\n * @param {TOriginX} [originX] Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} [originY] Vertical origin: 'top', 'center' or 'bottom'\n */\n setRelativeXY(\n point: Point,\n originX: TOriginX = this.originX,\n originY: TOriginY = this.originY,\n ) {\n this.setPositionByOrigin(point, originX, originY);\n }\n\n /**\n * @deprecated intermidiate method to be removed, do not use\n */\n protected isStrokeAccountedForInDimensions() {\n return false;\n }\n\n /**\n * @return {Point[]} [tl, tr, br, bl] in the scene plane\n */\n getCoords(): Point[] {\n const { tl, tr, br, bl } =\n this.aCoords || (this.aCoords = this.calcACoords());\n const coords = [tl, tr, br, bl];\n if (this.group) {\n const t = this.group.calcTransformMatrix();\n return coords.map((p) => transformPoint(p, t));\n }\n return coords;\n }\n\n /**\n * Checks if object intersects with the scene rect formed by tl and br\n */\n intersectsWithRect(tl: Point, br: Point): boolean {\n const intersection = Intersection.intersectPolygonRectangle(\n this.getCoords(),\n tl,\n br,\n );\n return intersection.status === 'Intersection';\n }\n\n /**\n * Checks if object intersects with another object\n * @param {Object} other Object to test\n * @return {Boolean} true if object intersects with another object\n */\n intersectsWithObject(other: ObjectGeometry): boolean {\n const intersection = Intersection.intersectPolygonPolygon(\n this.getCoords(),\n other.getCoords(),\n );\n\n return (\n intersection.status === 'Intersection' ||\n intersection.status === 'Coincident' ||\n other.isContainedWithinObject(this) ||\n this.isContainedWithinObject(other)\n );\n }\n\n /**\n * Checks if object is fully contained within area of another object\n * @param {Object} other Object to test\n * @return {Boolean} true if object is fully contained within area of another object\n */\n isContainedWithinObject(other: ObjectGeometry): boolean {\n const points = this.getCoords();\n return points.every((point) => other.containsPoint(point));\n }\n\n /**\n * Checks if object is fully contained within the scene rect formed by tl and br\n */\n isContainedWithinRect(tl: Point, br: Point): boolean {\n const { left, top, width, height } = this.getBoundingRect();\n return (\n left >= tl.x &&\n left + width <= br.x &&\n top >= tl.y &&\n top + height <= br.y\n );\n }\n\n isOverlapping<T extends ObjectGeometry>(other: T): boolean {\n return (\n this.intersectsWithObject(other) ||\n this.isContainedWithinObject(other) ||\n other.isContainedWithinObject(this)\n );\n }\n\n /**\n * Checks if point is inside the object\n * @param {Point} point Point to check against\n * @return {Boolean} true if point is inside the object\n */\n containsPoint(point: Point): boolean {\n return Intersection.isPointInPolygon(point, this.getCoords());\n }\n\n /**\n * Checks if object is contained within the canvas with current viewportTransform\n * the check is done stopping at first point that appears on screen\n * @return {Boolean} true if object is fully or partially contained within canvas\n */\n isOnScreen(): boolean {\n if (!this.canvas) {\n return false;\n }\n const { tl, br } = this.canvas.vptCoords;\n const points = this.getCoords();\n // if some point is on screen, the object is on screen.\n if (\n points.some(\n (point) =>\n point.x <= br.x &&\n point.x >= tl.x &&\n point.y <= br.y &&\n point.y >= tl.y,\n )\n ) {\n return true;\n }\n // no points on screen, check intersection with absolute coordinates\n if (this.intersectsWithRect(tl, br)) {\n return true;\n }\n // check if the object is so big that it contains the entire viewport\n return this.containsPoint(tl.midPointFrom(br));\n }\n\n /**\n * Checks if object is partially contained within the canvas with current viewportTransform\n * @return {Boolean} true if object is partially contained within canvas\n */\n isPartiallyOnScreen(): boolean {\n if (!this.canvas) {\n return false;\n }\n const { tl, br } = this.canvas.vptCoords;\n if (this.intersectsWithRect(tl, br)) {\n return true;\n }\n const allPointsAreOutside = this.getCoords().every(\n (point) =>\n (point.x >= br.x || point.x <= tl.x) &&\n (point.y >= br.y || point.y <= tl.y),\n );\n // check if the object is so big that it contains the entire viewport\n return allPointsAreOutside && this.containsPoint(tl.midPointFrom(br));\n }\n\n /**\n * Returns coordinates of object's bounding rectangle (left, top, width, height)\n * the box is intended as aligned to axis of canvas.\n * @return {Object} Object with left, top, width, height properties\n */\n getBoundingRect(): TBBox {\n return makeBoundingBoxFromPoints(this.getCoords());\n }\n\n /**\n * Returns width of an object's bounding box counting transformations\n * @todo shouldn't this account for group transform and return the actual size in canvas coordinate plane?\n * @return {Number} width value\n */\n getScaledWidth(): number {\n return this._getTransformedDimensions().x;\n }\n\n /**\n * Returns height of an object bounding box counting transformations\n * @todo shouldn't this account for group transform and return the actual size in canvas coordinate plane?\n * @return {Number} height value\n */\n getScaledHeight(): number {\n return this._getTransformedDimensions().y;\n }\n\n /**\n * Scales an object (equally by x and y)\n * @param {Number} value Scale factor\n * @return {void}\n */\n scale(value: number): void {\n this._set(SCALE_X, value);\n this._set(SCALE_Y, value);\n this.setCoords();\n }\n\n /**\n * Scales an object to a given width, with respect to bounding box (scaling by x/y equally)\n * @param {Number} value New width value\n * @return {void}\n */\n scaleToWidth(value: number) {\n // adjust to bounding rect factor so that rotated shapes would fit as well\n const boundingRectFactor =\n this.getBoundingRect().width / this.getScaledWidth();\n return this.scale(value / this.width / boundingRectFactor);\n }\n\n /**\n * Scales an object to a given height, with respect to bounding box (scaling by x/y equally)\n * @param {Number} value New height value\n * @return {void}\n */\n scaleToHeight(value: number) {\n // adjust to bounding rect factor so that rotated shapes would fit as well\n const boundingRectFactor =\n this.getBoundingRect().height / this.getScaledHeight();\n return this.scale(value / this.height / boundingRectFactor);\n }\n\n getCanvasRetinaScaling() {\n return this.canvas?.getRetinaScaling() || 1;\n }\n\n /**\n * Returns the object angle relative to canvas counting also the group property\n * @returns {TDegree}\n */\n getTotalAngle(): TDegree {\n return this.group\n ? radiansToDegrees(calcPlaneRotation(this.calcTransformMatrix()))\n : this.angle;\n }\n\n /**\n * Retrieves viewportTransform from Object's canvas if available\n * @return {TMat2D}\n */\n getViewportTransform(): TMat2D {\n return this.canvas?.viewportTransform || (iMatrix.concat() as TMat2D);\n }\n\n /**\n * Calculates the coordinates of the 4 corner of the bbox, in absolute coordinates.\n * those never change with zoom or viewport changes.\n * @return {TCornerPoint}\n */\n calcACoords(): TCornerPoint {\n const rotateMatrix = createRotateMatrix({ angle: this.angle }),\n { x, y } = this.getRelativeCenterPoint(),\n tMatrix = createTranslateMatrix(x, y),\n finalMatrix = multiplyTransformMatrices(tMatrix, rotateMatrix),\n dim = this._getTransformedDimensions(),\n w = dim.x / 2,\n h = dim.y / 2;\n return {\n // corners\n tl: transformPoint({ x: -w, y: -h }, finalMatrix),\n tr: transformPoint({ x: w, y: -h }, finalMatrix),\n bl: transformPoint({ x: -w, y: h }, finalMatrix),\n br: transformPoint({ x: w, y: h }, finalMatrix),\n };\n }\n\n /**\n * Sets corner and controls position coordinates based on current angle, width and height, left and top.\n * aCoords are used to quickly find an object on the canvas.\n * See {@link https://github.com/fabricjs/fabric.js/wiki/When-to-call-setCoords} and {@link http://fabric5.fabricjs.com/fabric-gotchas}\n */\n setCoords(): void {\n this.aCoords = this.calcACoords();\n }\n\n transformMatrixKey(skipGroup = false): number[] {\n let prefix: number[] = [];\n if (!skipGroup && this.group) {\n prefix = this.group.transformMatrixKey(skipGroup);\n }\n prefix.push(\n this.top,\n this.left,\n this.width,\n this.height,\n this.scaleX,\n this.scaleY,\n this.angle,\n this.strokeWidth,\n this.skewX,\n this.skewY,\n +this.flipX,\n +this.flipY,\n resolveOrigin(this.originX),\n resolveOrigin(this.originY),\n );\n\n return prefix;\n }\n\n /**\n * calculate transform matrix that represents the current transformations from the\n * object's properties.\n * @param {Boolean} [skipGroup] return transform matrix for object not counting parent transformations\n * There are some situation in which this is useful to avoid the fake rotation.\n * @return {TMat2D} transform matrix for the object\n */\n calcTransformMatrix(skipGroup = false): TMat2D {\n let matrix = this.calcOwnMatrix();\n if (skipGroup || !this.group) {\n return matrix;\n }\n const key = this.transformMatrixKey(skipGroup),\n cache = this.matrixCache;\n if (cache && cache.key.every((x, i) => x === key[i])) {\n return cache.value;\n }\n if (this.group) {\n matrix = multiplyTransformMatrices(\n this.group.calcTransformMatrix(false),\n matrix,\n );\n }\n this.matrixCache = {\n key,\n value: matrix,\n };\n return matrix;\n }\n\n /**\n * calculate transform matrix that represents the current transformations from the\n * object's properties, this matrix does not include the group transformation\n * @return {TMat2D} transform matrix for the object\n */\n calcOwnMatrix(): TMat2D {\n const key = this.transformMatrixKey(true),\n cache = this.ownMatrixCache;\n if (cache && cache.key === key) {\n return cache.value;\n }\n const center = this.getRelativeCenterPoint(),\n options = {\n angle: this.angle,\n translateX: center.x,\n translateY: center.y,\n scaleX: this.scaleX,\n scaleY: this.scaleY,\n skewX: this.skewX,\n skewY: this.skewY,\n flipX: this.flipX,\n flipY: this.flipY,\n },\n value = composeMatrix(options);\n this.ownMatrixCache = {\n key,\n value,\n };\n return value;\n }\n\n /**\n * Calculate object dimensions from its properties\n * @private\n * @returns {Point} dimensions\n */\n _getNonTransformedDimensions(): Point {\n return new Point(this.width, this.height).scalarAdd(this.strokeWidth);\n }\n\n /**\n * Calculate object dimensions for controls box, including padding and canvas zoom.\n * and active selection\n * @private\n * @param {object} [options] transform options\n * @returns {Point} dimensions\n */\n _calculateCurrentDimensions(options?: any): Point {\n return this._getTransformedDimensions(options)\n .transform(this.getViewportTransform(), true)\n .scalarAdd(2 * this.padding);\n }\n\n // #region Origin\n\n declare top: number;\n declare left: number;\n declare width: number;\n declare height: number;\n declare flipX: boolean;\n declare flipY: boolean;\n declare scaleX: number;\n declare scaleY: number;\n declare skewX: number;\n declare skewY: number;\n /**\n * @deprecated please use 'center' as value in new projects\n * */\n declare originX: TOriginX;\n /**\n * @deprecated please use 'center' as value in new projects\n * */\n declare originY: TOriginY;\n declare angle: TDegree;\n declare strokeWidth: number;\n declare strokeUniform: boolean;\n\n /**\n * Object containing this object.\n * can influence its size and position\n */\n declare group?: Group;\n\n /**\n * Calculate object bounding box dimensions from its properties scale, skew.\n * This bounding box is aligned with object angle and not with canvas axis or screen.\n * @param {Object} [options]\n * @param {Number} [options.scaleX]\n * @param {Number} [options.scaleY]\n * @param {Number} [options.skewX]\n * @param {Number} [options.skewY]\n * @private\n * @returns {Point} dimensions\n */\n _getTransformedDimensions(options: any = {}): Point {\n const dimOptions = {\n // if scaleX or scaleY are negative numbers,\n // this will return dimensions that are negative.\n // and this will break assumptions around the codebase\n scaleX: this.scaleX,\n scaleY: this.scaleY,\n skewX: this.skewX,\n skewY: this.skewY,\n width: this.width,\n height: this.height,\n strokeWidth: this.strokeWidth,\n // TODO remove this spread. is visible in the performance inspection\n ...options,\n };\n // stroke is applied before/after transformations are applied according to `strokeUniform`\n const strokeWidth = dimOptions.strokeWidth;\n let preScalingStrokeValue = strokeWidth,\n postScalingStrokeValue = 0;\n\n if (this.strokeUniform) {\n preScalingStrokeValue = 0;\n postScalingStrokeValue = strokeWidth;\n }\n const dimX = dimOptions.width + preScalingStrokeValue,\n dimY = dimOptions.height + preScalingStrokeValue,\n noSkew = dimOptions.skewX === 0 && dimOptions.skewY === 0;\n let finalDimensions;\n if (noSkew) {\n finalDimensions = new Point(\n dimX * dimOptions.scaleX,\n dimY * dimOptions.scaleY,\n );\n } else {\n finalDimensions = sizeAfterTransform(\n dimX,\n dimY,\n calcDimensionsMatrix(dimOptions),\n );\n }\n\n return finalDimensions.scalarAdd(postScalingStrokeValue);\n }\n\n /**\n * Translates the coordinates from a set of origin to another (based on the object's dimensions)\n * @param {Point} point The point which corresponds to the originX and originY params\n * @param {TOriginX} fromOriginX Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} fromOriginY Vertical origin: 'top', 'center' or 'bottom'\n * @param {TOriginX} toOriginX Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} toOriginY Vertical origin: 'top', 'center' or 'bottom'\n * @return {Point}\n */\n translateToGivenOrigin(\n point: Point,\n fromOriginX: TOriginX,\n fromOriginY: TOriginY,\n toOriginX: TOriginX,\n toOriginY: TOriginY,\n ): Point {\n let x = point.x,\n y = point.y;\n const offsetX = resolveOrigin(toOriginX) - resolveOrigin(fromOriginX),\n offsetY = resolveOrigin(toOriginY) - resolveOrigin(fromOriginY);\n\n if (offsetX || offsetY) {\n const dim = this._getTransformedDimensions();\n x += offsetX * dim.x;\n y += offsetY * dim.y;\n }\n\n return new Point(x, y);\n }\n\n /**\n * Translates the coordinates from origin to center coordinates (based on the object's dimensions)\n * @param {Point} point The point which corresponds to the originX and originY params\n * @param {TOriginX} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {Point}\n */\n translateToCenterPoint(\n point: Point,\n originX: TOriginX,\n originY: TOriginY,\n ): Point {\n if (originX === CENTER && originY === CENTER) {\n return point;\n }\n const p = this.translateToGivenOrigin(\n point,\n originX,\n originY,\n CENTER,\n CENTER,\n );\n if (this.angle) {\n return p.rotate(degreesToRadians(this.angle), point);\n }\n return p;\n }\n\n /**\n * Translates the coordinates from center to origin coordinates (based on the object's dimensions)\n * @param {Point} center The point which corresponds to center of the object\n * @param {OriginX} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {OriginY} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {Point}\n */\n translateToOriginPoint(\n center: Point,\n originX: TOriginX,\n originY: TOriginY,\n ): Point {\n const p = this.translateToGivenOrigin(\n center,\n CENTER,\n CENTER,\n originX,\n originY,\n );\n if (this.angle) {\n return p.rotate(degreesToRadians(this.angle), center);\n }\n return p;\n }\n\n /**\n * Returns the center coordinates of the object relative to canvas\n * @return {Point}\n */\n getCenterPoint(): Point {\n const relCenter = this.getRelativeCenterPoint();\n return this.group\n ? transformPoint(relCenter, this.group.calcTransformMatrix())\n : relCenter;\n }\n\n /**\n * Returns the center coordinates of the object relative to it's parent\n * @return {Point}\n */\n getRelativeCenterPoint(): Point {\n return this.translateToCenterPoint(\n new Point(this.left, this.top),\n this.originX,\n this.originY,\n );\n }\n\n /**\n * Alias of {@link getPositionByOrigin}\n * @deprecated use {@link getPositionByOrigin} instead\n */\n getPointByOrigin(originX: TOriginX, originY: TOriginY): Point {\n return this.getPositionByOrigin(originX, originY);\n }\n\n /**\n * This function is the mirror of {@link setPositionByOrigin}\n * Returns the position of the object based on specified origin.\n * Take an object that has left, top set to 100, 100 with origin 'left', 'top'.\n * Return the values of left top ( wrapped in a point ) that you would need to keep\n * the same position if origin where different ( ex: center, bottom )\n * Alternatively you can use this to also find which point in the parent plane is a specific origin\n * ( where is the bottom right corner of my object? )\n * @param {TOriginX} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {Point}\n */\n getPositionByOrigin(originX: TOriginX, originY: TOriginY) {\n return this.translateToOriginPoint(\n this.getRelativeCenterPoint(),\n originX,\n originY,\n );\n }\n\n /**\n * Sets the position of the object taking into consideration the object's origin\n * @param {Point} pos The new position of the object\n * @param {TOriginX} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {void}\n */\n setPositionByOrigin(pos: Point, originX: TOriginX, originY: TOriginY) {\n const center = this.translateToCenterPoint(pos, originX, originY),\n position = this.translateToOriginPoint(\n center,\n this.originX,\n this.originY,\n );\n this.set({ left: position.x, top: position.y });\n }\n\n /**\n * @private\n */\n _getLeftTopCoords() {\n return this.getPositionByOrigin(LEFT, TOP);\n }\n\n /**\n * An utility method to position the object by its left top corner.\n * Useful to reposition objects since now the default origin is center/center\n * Places the left/top corner of the object bounding box in p.\n */\n positionByLeftTop(p: Point) {\n return this.setPositionByOrigin(p, LEFT, TOP);\n }\n}\n"],"names":["ObjectGeometry","CommonMethods","getX","getXY","x","setX","value","setXY","getY","y","setY","getRelativeX","left","setRelativeX","getRelativeY","top","setRelativeY","relativePosition","getRelativeXY","group","transformPoint","calcTransformMatrix","point","originX","originY","invertTransform","setRelativeXY","Point","arguments","length","undefined","setPositionByOrigin","isStrokeAccountedForInDimensions","getCoords","tl","tr","br","bl","aCoords","calcACoords","coords","t","map","p","intersectsWithRect","intersection","Intersection","intersectPolygonRectangle","status","intersectsWithObject","other","intersectPolygonPolygon","isContainedWithinObject","points","every","containsPoint","isContainedWithinRect","width","height","getBoundingRect","isOverlapping","isPointInPolygon","isOnScreen","canvas","vptCoords","some","midPointFrom","isPartiallyOnScreen","allPointsAreOutside","makeBoundingBoxFromPoints","getScaledWidth","_getTransformedDimensions","getScaledHeight","scale","_set","SCALE_X","SCALE_Y","setCoords","scaleToWidth","boundingRectFactor","scaleToHeight","getCanvasRetinaScaling","_this$canvas","getRetinaScaling","getTotalAngle","radiansToDegrees","calcPlaneRotation","angle","getViewportTransform","_this$canvas2","viewportTransform","iMatrix","concat","rotateMatrix","createRotateMatrix","getRelativeCenterPoint","tMatrix","createTranslateMatrix","finalMatrix","multiplyTransformMatrices","dim","w","h","transformMatrixKey","skipGroup","prefix","push","scaleX","scaleY","strokeWidth","skewX","skewY","flipX","flipY","resolveOrigin","matrix","calcOwnMatrix","key","cache","matrixCache","i","ownMatrixCache","center","options","translateX","translateY","composeMatrix","_getNonTransformedDimensions","scalarAdd","_calculateCurrentDimensions","transform","padding","dimOptions","preScalingStrokeValue","postScalingStrokeValue","strokeUniform","dimX","dimY","noSkew","finalDimensions","sizeAfterTransform","calcDimensionsMatrix","translateToGivenOrigin","fromOriginX","fromOriginY","toOriginX","toOriginY","offsetX","offsetY","translateToCenterPoint","CENTER","rotate","degreesToRadians","translateToOriginPoint","getCenterPoint","relCenter","getPointByOrigin","getPositionByOrigin","pos","position","set","_getLeftTopCoords","LEFT","TOP","positionByLeftTop"],"mappings":"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"}
1
+ {"version":3,"file":"ObjectGeometry.mjs","sources":["../../../../src/shapes/Object/ObjectGeometry.ts"],"sourcesContent":["import type {\n TBBox,\n TCornerPoint,\n TDegree,\n TMat2D,\n TOriginX,\n TOriginY,\n} from '../../typedefs';\nimport { SCALE_X, SCALE_Y, iMatrix } from '../../constants';\nimport { Intersection } from '../../Intersection';\nimport { Point } from '../../Point';\nimport { makeBoundingBoxFromPoints } from '../../util/misc/boundingBoxFromPoints';\nimport {\n createRotateMatrix,\n createTranslateMatrix,\n composeMatrix,\n invertTransform,\n multiplyTransformMatrices,\n transformPoint,\n calcPlaneRotation,\n} from '../../util/misc/matrix';\nimport { radiansToDegrees } from '../../util/misc/radiansDegreesConversion';\nimport type { Canvas } from '../../canvas/Canvas';\nimport type { StaticCanvas } from '../../canvas/StaticCanvas';\nimport type { ObjectEvents } from '../../EventTypeDefs';\nimport type { ControlProps } from './types/ControlProps';\nimport { resolveOrigin } from '../../util/misc/resolveOrigin';\nimport type { Group } from '../Group';\nimport { calcDimensionsMatrix } from '../../util/misc/matrix';\nimport { sizeAfterTransform } from '../../util/misc/objectTransforms';\nimport { degreesToRadians } from '../../util/misc/radiansDegreesConversion';\nimport { CommonMethods } from '../../CommonMethods';\nimport type { BaseProps } from './types/BaseProps';\nimport type { FillStrokeProps } from './types/FillStrokeProps';\nimport { CENTER, LEFT, TOP } from '../../constants';\n\ntype TMatrixCache = {\n key: number[];\n value: TMat2D;\n};\n\ntype TACoords = TCornerPoint;\n\nexport class ObjectGeometry<EventSpec extends ObjectEvents = ObjectEvents>\n extends CommonMethods<EventSpec>\n implements\n Pick<ControlProps, 'padding'>,\n BaseProps,\n Pick<FillStrokeProps, 'strokeWidth' | 'strokeUniform'>\n{\n // #region Geometry\n\n declare padding: number;\n\n /**\n * Describe object's corner position in scene coordinates.\n * The coordinates are derived from the following:\n * left, top, width, height, scaleX, scaleY, skewX, skewY, angle, strokeWidth.\n * The coordinates do not depend on viewport changes.\n * The coordinates get updated with {@link setCoords}.\n * You can calculate them without updating with {@link calcACoords()}\n */\n declare aCoords: TACoords;\n\n /**\n * storage cache for object transform matrix\n */\n declare ownMatrixCache?: TMatrixCache;\n\n /**\n * storage cache for object full transform matrix\n */\n declare matrixCache?: TMatrixCache;\n\n /**\n * A Reference of the Canvas where the object is actually added\n * @type StaticCanvas | Canvas;\n * @default undefined\n * @private\n */\n declare canvas?: StaticCanvas | Canvas;\n\n /**\n * @returns {number} x position according to object's originX property in canvas coordinate plane\n */\n getX(): number {\n return this.getXY().x;\n }\n\n /**\n * @param {number} value x position according to object's originX property in canvas coordinate plane\n */\n setX(value: number) {\n this.setXY(this.getXY().setX(value));\n }\n\n /**\n * @returns {number} y position according to object's originY property in canvas coordinate plane\n */\n getY(): number {\n return this.getXY().y;\n }\n\n /**\n * @param {number} value y position according to object's originY property in canvas coordinate plane\n */\n setY(value: number) {\n this.setXY(this.getXY().setY(value));\n }\n\n /**\n * @returns {number} x position according to object's originX property in parent's coordinate plane\\\n * if parent is canvas then this property is identical to {@link getX}\n */\n getRelativeX(): number {\n return this.left;\n }\n\n /**\n * @param {number} value x position according to object's originX property in parent's coordinate plane\\\n * if parent is canvas then this method is identical to {@link setX}\n */\n setRelativeX(value: number) {\n this.left = value;\n }\n\n /**\n * @returns {number} y position according to object's originY property in parent's coordinate plane\\\n * if parent is canvas then this property is identical to {@link getY}\n */\n getRelativeY(): number {\n return this.top;\n }\n\n /**\n * @param {number} value y position according to object's originY property in parent's coordinate plane\\\n * if parent is canvas then this property is identical to {@link setY}\n */\n setRelativeY(value: number) {\n this.top = value;\n }\n\n /**\n * @returns {Point} x position according to object's originX originY properties in canvas coordinate plane\n */\n getXY(): Point {\n const relativePosition = this.getRelativeXY();\n return this.group\n ? transformPoint(relativePosition, this.group.calcTransformMatrix())\n : relativePosition;\n }\n\n /**\n * Set an object position to a particular point, the point is intended in absolute ( canvas ) coordinate.\n * You can specify originX and originY values,\n * that otherwise are the object's current values.\n * @example <caption>Set object's bottom left corner to point (5,5) on canvas</caption>\n * object.setXY(new Point(5, 5), 'left', 'bottom').\n * @param {Point} point position in scene coordinate plane\n * @param {TOriginX} [originX] Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} [originY] Vertical origin: 'top', 'center' or 'bottom'\n */\n setXY(point: Point, originX?: TOriginX, originY?: TOriginY) {\n if (this.group) {\n point = transformPoint(\n point,\n invertTransform(this.group.calcTransformMatrix()),\n );\n }\n this.setRelativeXY(point, originX, originY);\n }\n\n /**\n * @returns {Point} x,y position according to object's originX originY properties in parent's coordinate plane\n */\n getRelativeXY(): Point {\n return new Point(this.left, this.top);\n }\n\n /**\n * As {@link setXY}, but in current parent's coordinate plane (the current group if any or the canvas)\n * @param {Point} point position according to object's originX originY properties in parent's coordinate plane\n * @param {TOriginX} [originX] Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} [originY] Vertical origin: 'top', 'center' or 'bottom'\n */\n setRelativeXY(\n point: Point,\n originX: TOriginX = this.originX,\n originY: TOriginY = this.originY,\n ) {\n this.setPositionByOrigin(point, originX, originY);\n }\n\n /**\n * @deprecated intermidiate method to be removed, do not use\n */\n protected isStrokeAccountedForInDimensions() {\n return false;\n }\n\n /**\n * @return {Point[]} [tl, tr, br, bl] in the scene plane\n */\n getCoords(): Point[] {\n const { tl, tr, br, bl } =\n this.aCoords || (this.aCoords = this.calcACoords());\n const coords = [tl, tr, br, bl];\n if (this.group) {\n const t = this.group.calcTransformMatrix();\n return coords.map((p) => transformPoint(p, t));\n }\n return coords;\n }\n\n /**\n * Checks if object intersects with the scene rect formed by tl and br\n */\n intersectsWithRect(tl: Point, br: Point): boolean {\n const intersection = Intersection.intersectPolygonRectangle(\n this.getCoords(),\n tl,\n br,\n );\n return intersection.status === 'Intersection';\n }\n\n /**\n * Checks if object intersects with another object\n * @param {Object} other Object to test\n * @return {Boolean} true if object intersects with another object\n */\n intersectsWithObject(other: ObjectGeometry): boolean {\n const intersection = Intersection.intersectPolygonPolygon(\n this.getCoords(),\n other.getCoords(),\n );\n\n return (\n intersection.status === 'Intersection' ||\n intersection.status === 'Coincident' ||\n other.isContainedWithinObject(this) ||\n this.isContainedWithinObject(other)\n );\n }\n\n /**\n * Checks if object is fully contained within area of another object\n * @param {Object} other Object to test\n * @return {Boolean} true if object is fully contained within area of another object\n */\n isContainedWithinObject(other: ObjectGeometry): boolean {\n const points = this.getCoords();\n return points.every((point) => other.containsPoint(point));\n }\n\n /**\n * Checks if object is fully contained within the scene rect formed by tl and br\n */\n isContainedWithinRect(tl: Point, br: Point): boolean {\n const { left, top, width, height } = this.getBoundingRect();\n return (\n left >= tl.x &&\n left + width <= br.x &&\n top >= tl.y &&\n top + height <= br.y\n );\n }\n\n isOverlapping<T extends ObjectGeometry>(other: T): boolean {\n return (\n this.intersectsWithObject(other) ||\n this.isContainedWithinObject(other) ||\n other.isContainedWithinObject(this)\n );\n }\n\n /**\n * Checks if point is inside the object\n * @param {Point} point Point to check against\n * @return {Boolean} true if point is inside the object\n */\n containsPoint(point: Point): boolean {\n return Intersection.isPointInPolygon(point, this.getCoords());\n }\n\n /**\n * Checks if object is contained within the canvas with current viewportTransform\n * the check is done stopping at first point that appears on screen\n * @return {Boolean} true if object is fully or partially contained within canvas\n */\n isOnScreen(): boolean {\n if (!this.canvas) {\n return false;\n }\n const { tl, br } = this.canvas.vptCoords;\n const points = this.getCoords();\n // if some point is on screen, the object is on screen.\n if (\n points.some(\n (point) =>\n point.x <= br.x &&\n point.x >= tl.x &&\n point.y <= br.y &&\n point.y >= tl.y,\n )\n ) {\n return true;\n }\n // no points on screen, check intersection with absolute coordinates\n if (this.intersectsWithRect(tl, br)) {\n return true;\n }\n // check if the object is so big that it contains the entire viewport\n return this.containsPoint(tl.midPointFrom(br));\n }\n\n /**\n * Checks if object is partially contained within the canvas with current viewportTransform\n * @return {Boolean} true if object is partially contained within canvas\n */\n isPartiallyOnScreen(): boolean {\n if (!this.canvas) {\n return false;\n }\n const { tl, br } = this.canvas.vptCoords;\n if (this.intersectsWithRect(tl, br)) {\n return true;\n }\n const allPointsAreOutside = this.getCoords().every(\n (point) =>\n (point.x >= br.x || point.x <= tl.x) &&\n (point.y >= br.y || point.y <= tl.y),\n );\n // check if the object is so big that it contains the entire viewport\n return allPointsAreOutside && this.containsPoint(tl.midPointFrom(br));\n }\n\n /**\n * Returns coordinates of object's bounding rectangle (left, top, width, height)\n * the box is intended as aligned to axis of canvas.\n * @return {Object} Object with left, top, width, height properties\n */\n getBoundingRect(): TBBox {\n return makeBoundingBoxFromPoints(this.getCoords());\n }\n\n /**\n * Returns width of an object's bounding box counting transformations\n * @todo shouldn't this account for group transform and return the actual size in canvas coordinate plane?\n * @return {Number} width value\n */\n getScaledWidth(): number {\n return this._getTransformedDimensions().x;\n }\n\n /**\n * Returns height of an object bounding box counting transformations\n * @todo shouldn't this account for group transform and return the actual size in canvas coordinate plane?\n * @return {Number} height value\n */\n getScaledHeight(): number {\n return this._getTransformedDimensions().y;\n }\n\n /**\n * Scales an object (equally by x and y)\n * @param {Number} value Scale factor\n * @return {void}\n */\n scale(value: number): void {\n this._set(SCALE_X, value);\n this._set(SCALE_Y, value);\n this.setCoords();\n }\n\n /**\n * Scales an object to a given width, with respect to bounding box (scaling by x/y equally)\n * @param {Number} value New width value\n * @return {void}\n */\n scaleToWidth(value: number) {\n // adjust to bounding rect factor so that rotated shapes would fit as well\n const boundingRectFactor =\n this.getBoundingRect().width / this.getScaledWidth();\n return this.scale(value / this.width / boundingRectFactor);\n }\n\n /**\n * Scales an object to a given height, with respect to bounding box (scaling by x/y equally)\n * @param {Number} value New height value\n * @return {void}\n */\n scaleToHeight(value: number) {\n // adjust to bounding rect factor so that rotated shapes would fit as well\n const boundingRectFactor =\n this.getBoundingRect().height / this.getScaledHeight();\n return this.scale(value / this.height / boundingRectFactor);\n }\n\n getCanvasRetinaScaling() {\n return this.canvas?.getRetinaScaling() || 1;\n }\n\n /**\n * Returns the object angle relative to canvas counting also the group property\n * @returns {TDegree}\n */\n getTotalAngle(): TDegree {\n return this.group\n ? radiansToDegrees(calcPlaneRotation(this.calcTransformMatrix()))\n : this.angle;\n }\n\n /**\n * Retrieves viewportTransform from Object's canvas if available\n * @return {TMat2D}\n */\n getViewportTransform(): TMat2D {\n return this.canvas?.viewportTransform || (iMatrix.concat() as TMat2D);\n }\n\n /**\n * Calculates the coordinates of the 4 corner of the bbox, in absolute coordinates.\n * those never change with zoom or viewport changes.\n * @return {TCornerPoint}\n */\n calcACoords(): TCornerPoint {\n const rotateMatrix = createRotateMatrix({ angle: this.angle }),\n { x, y } = this.getRelativeCenterPoint(),\n tMatrix = createTranslateMatrix(x, y),\n finalMatrix = multiplyTransformMatrices(tMatrix, rotateMatrix),\n dim = this._getTransformedDimensions(),\n w = dim.x / 2,\n h = dim.y / 2;\n return {\n // corners\n tl: transformPoint({ x: -w, y: -h }, finalMatrix),\n tr: transformPoint({ x: w, y: -h }, finalMatrix),\n bl: transformPoint({ x: -w, y: h }, finalMatrix),\n br: transformPoint({ x: w, y: h }, finalMatrix),\n };\n }\n\n /**\n * Sets corner and controls position coordinates based on current angle, width and height, left and top.\n * aCoords are used to quickly find an object on the canvas.\n * See {@link https://github.com/fabricjs/fabric.js/wiki/When-to-call-setCoords} and {@link http://fabric5.fabricjs.com/fabric-gotchas}\n */\n setCoords(): void {\n this.aCoords = this.calcACoords();\n }\n\n transformMatrixKey(skipGroup = false): number[] {\n let prefix: number[] = [];\n if (!skipGroup && this.group) {\n prefix = this.group.transformMatrixKey(skipGroup);\n }\n prefix.push(\n this.top,\n this.left,\n this.width,\n this.height,\n this.scaleX,\n this.scaleY,\n this.angle,\n this.strokeWidth,\n this.skewX,\n this.skewY,\n +this.flipX,\n +this.flipY,\n resolveOrigin(this.originX),\n resolveOrigin(this.originY),\n );\n\n return prefix;\n }\n\n /**\n * calculate transform matrix that represents the current transformations from the\n * object's properties.\n * @param {Boolean} [skipGroup] return transform matrix for object not counting parent transformations\n * There are some situation in which this is useful to avoid the fake rotation.\n * @return {TMat2D} transform matrix for the object\n */\n calcTransformMatrix(skipGroup = false): TMat2D {\n let matrix = this.calcOwnMatrix();\n if (skipGroup || !this.group) {\n return matrix;\n }\n const key = this.transformMatrixKey(skipGroup),\n cache = this.matrixCache;\n if (cache && cache.key.every((x, i) => x === key[i])) {\n return cache.value;\n }\n if (this.group) {\n matrix = multiplyTransformMatrices(\n this.group.calcTransformMatrix(false),\n matrix,\n );\n }\n this.matrixCache = {\n key,\n value: matrix,\n };\n return matrix;\n }\n\n /**\n * calculate transform matrix that represents the current transformations from the\n * object's properties, this matrix does not include the group transformation\n * @return {TMat2D} transform matrix for the object\n */\n calcOwnMatrix(): TMat2D {\n const key = this.transformMatrixKey(true),\n cache = this.ownMatrixCache;\n if (cache && cache.key.every((x, i) => x === key[i])) {\n return cache.value;\n }\n const center = this.getRelativeCenterPoint(),\n options = {\n angle: this.angle,\n translateX: center.x,\n translateY: center.y,\n scaleX: this.scaleX,\n scaleY: this.scaleY,\n skewX: this.skewX,\n skewY: this.skewY,\n flipX: this.flipX,\n flipY: this.flipY,\n },\n value = composeMatrix(options);\n this.ownMatrixCache = {\n key,\n value,\n };\n return value;\n }\n\n /**\n * Calculate object dimensions from its properties\n * @private\n * @returns {Point} dimensions\n */\n _getNonTransformedDimensions(): Point {\n return new Point(this.width, this.height).scalarAdd(this.strokeWidth);\n }\n\n /**\n * Calculate object dimensions for controls box, including padding and canvas zoom.\n * and active selection\n * @private\n * @param {object} [options] transform options\n * @returns {Point} dimensions\n */\n _calculateCurrentDimensions(options?: any): Point {\n return this._getTransformedDimensions(options)\n .transform(this.getViewportTransform(), true)\n .scalarAdd(2 * this.padding);\n }\n\n // #region Origin\n\n declare top: number;\n declare left: number;\n declare width: number;\n declare height: number;\n declare flipX: boolean;\n declare flipY: boolean;\n declare scaleX: number;\n declare scaleY: number;\n declare skewX: number;\n declare skewY: number;\n /**\n * @deprecated please use 'center' as value in new projects\n * */\n declare originX: TOriginX;\n /**\n * @deprecated please use 'center' as value in new projects\n * */\n declare originY: TOriginY;\n declare angle: TDegree;\n declare strokeWidth: number;\n declare strokeUniform: boolean;\n\n /**\n * Object containing this object.\n * can influence its size and position\n */\n declare group?: Group;\n\n /**\n * Calculate object bounding box dimensions from its properties scale, skew.\n * This bounding box is aligned with object angle and not with canvas axis or screen.\n * @param {Object} [options]\n * @param {Number} [options.scaleX]\n * @param {Number} [options.scaleY]\n * @param {Number} [options.skewX]\n * @param {Number} [options.skewY]\n * @private\n * @returns {Point} dimensions\n */\n _getTransformedDimensions(options: any = {}): Point {\n const dimOptions = {\n // if scaleX or scaleY are negative numbers,\n // this will return dimensions that are negative.\n // and this will break assumptions around the codebase\n scaleX: this.scaleX,\n scaleY: this.scaleY,\n skewX: this.skewX,\n skewY: this.skewY,\n width: this.width,\n height: this.height,\n strokeWidth: this.strokeWidth,\n // TODO remove this spread. is visible in the performance inspection\n ...options,\n };\n // stroke is applied before/after transformations are applied according to `strokeUniform`\n const strokeWidth = dimOptions.strokeWidth;\n let preScalingStrokeValue = strokeWidth,\n postScalingStrokeValue = 0;\n\n if (this.strokeUniform) {\n preScalingStrokeValue = 0;\n postScalingStrokeValue = strokeWidth;\n }\n const dimX = dimOptions.width + preScalingStrokeValue,\n dimY = dimOptions.height + preScalingStrokeValue,\n noSkew = dimOptions.skewX === 0 && dimOptions.skewY === 0;\n let finalDimensions;\n if (noSkew) {\n finalDimensions = new Point(\n dimX * dimOptions.scaleX,\n dimY * dimOptions.scaleY,\n );\n } else {\n finalDimensions = sizeAfterTransform(\n dimX,\n dimY,\n calcDimensionsMatrix(dimOptions),\n );\n }\n\n return finalDimensions.scalarAdd(postScalingStrokeValue);\n }\n\n /**\n * Translates the coordinates from a set of origin to another (based on the object's dimensions)\n * @param {Point} point The point which corresponds to the originX and originY params\n * @param {TOriginX} fromOriginX Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} fromOriginY Vertical origin: 'top', 'center' or 'bottom'\n * @param {TOriginX} toOriginX Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} toOriginY Vertical origin: 'top', 'center' or 'bottom'\n * @return {Point}\n */\n translateToGivenOrigin(\n point: Point,\n fromOriginX: TOriginX,\n fromOriginY: TOriginY,\n toOriginX: TOriginX,\n toOriginY: TOriginY,\n ): Point {\n let x = point.x,\n y = point.y;\n const offsetX = resolveOrigin(toOriginX) - resolveOrigin(fromOriginX),\n offsetY = resolveOrigin(toOriginY) - resolveOrigin(fromOriginY);\n\n if (offsetX || offsetY) {\n const dim = this._getTransformedDimensions();\n x += offsetX * dim.x;\n y += offsetY * dim.y;\n }\n\n return new Point(x, y);\n }\n\n /**\n * Translates the coordinates from origin to center coordinates (based on the object's dimensions)\n * @param {Point} point The point which corresponds to the originX and originY params\n * @param {TOriginX} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {Point}\n */\n translateToCenterPoint(\n point: Point,\n originX: TOriginX,\n originY: TOriginY,\n ): Point {\n if (originX === CENTER && originY === CENTER) {\n return point;\n }\n const p = this.translateToGivenOrigin(\n point,\n originX,\n originY,\n CENTER,\n CENTER,\n );\n if (this.angle) {\n return p.rotate(degreesToRadians(this.angle), point);\n }\n return p;\n }\n\n /**\n * Translates the coordinates from center to origin coordinates (based on the object's dimensions)\n * @param {Point} center The point which corresponds to center of the object\n * @param {OriginX} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {OriginY} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {Point}\n */\n translateToOriginPoint(\n center: Point,\n originX: TOriginX,\n originY: TOriginY,\n ): Point {\n const p = this.translateToGivenOrigin(\n center,\n CENTER,\n CENTER,\n originX,\n originY,\n );\n if (this.angle) {\n return p.rotate(degreesToRadians(this.angle), center);\n }\n return p;\n }\n\n /**\n * Returns the center coordinates of the object relative to canvas\n * @return {Point}\n */\n getCenterPoint(): Point {\n const relCenter = this.getRelativeCenterPoint();\n return this.group\n ? transformPoint(relCenter, this.group.calcTransformMatrix())\n : relCenter;\n }\n\n /**\n * Returns the center coordinates of the object relative to it's parent\n * @return {Point}\n */\n getRelativeCenterPoint(): Point {\n return this.translateToCenterPoint(\n new Point(this.left, this.top),\n this.originX,\n this.originY,\n );\n }\n\n /**\n * Alias of {@link getPositionByOrigin}\n * @deprecated use {@link getPositionByOrigin} instead\n */\n getPointByOrigin(originX: TOriginX, originY: TOriginY): Point {\n return this.getPositionByOrigin(originX, originY);\n }\n\n /**\n * This function is the mirror of {@link setPositionByOrigin}\n * Returns the position of the object based on specified origin.\n * Take an object that has left, top set to 100, 100 with origin 'left', 'top'.\n * Return the values of left top ( wrapped in a point ) that you would need to keep\n * the same position if origin where different ( ex: center, bottom )\n * Alternatively you can use this to also find which point in the parent plane is a specific origin\n * ( where is the bottom right corner of my object? )\n * @param {TOriginX} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {Point}\n */\n getPositionByOrigin(originX: TOriginX, originY: TOriginY) {\n return this.translateToOriginPoint(\n this.getRelativeCenterPoint(),\n originX,\n originY,\n );\n }\n\n /**\n * Sets the position of the object taking into consideration the object's origin\n * @param {Point} pos The new position of the object\n * @param {TOriginX} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {void}\n */\n setPositionByOrigin(pos: Point, originX: TOriginX, originY: TOriginY) {\n const center = this.translateToCenterPoint(pos, originX, originY),\n position = this.translateToOriginPoint(\n center,\n this.originX,\n this.originY,\n );\n this.set({ left: position.x, top: position.y });\n }\n\n /**\n * @private\n */\n _getLeftTopCoords() {\n return this.getPositionByOrigin(LEFT, TOP);\n }\n\n /**\n * An utility method to position the object by its left top corner.\n * Useful to reposition objects since now the default origin is center/center\n * Places the left/top corner of the object bounding box in p.\n */\n positionByLeftTop(p: Point) {\n return this.setPositionByOrigin(p, LEFT, TOP);\n }\n}\n"],"names":["ObjectGeometry","CommonMethods","getX","getXY","x","setX","value","setXY","getY","y","setY","getRelativeX","left","setRelativeX","getRelativeY","top","setRelativeY","relativePosition","getRelativeXY","group","transformPoint","calcTransformMatrix","point","originX","originY","invertTransform","setRelativeXY","Point","arguments","length","undefined","setPositionByOrigin","isStrokeAccountedForInDimensions","getCoords","tl","tr","br","bl","aCoords","calcACoords","coords","t","map","p","intersectsWithRect","intersection","Intersection","intersectPolygonRectangle","status","intersectsWithObject","other","intersectPolygonPolygon","isContainedWithinObject","points","every","containsPoint","isContainedWithinRect","width","height","getBoundingRect","isOverlapping","isPointInPolygon","isOnScreen","canvas","vptCoords","some","midPointFrom","isPartiallyOnScreen","allPointsAreOutside","makeBoundingBoxFromPoints","getScaledWidth","_getTransformedDimensions","getScaledHeight","scale","_set","SCALE_X","SCALE_Y","setCoords","scaleToWidth","boundingRectFactor","scaleToHeight","getCanvasRetinaScaling","_this$canvas","getRetinaScaling","getTotalAngle","radiansToDegrees","calcPlaneRotation","angle","getViewportTransform","_this$canvas2","viewportTransform","iMatrix","concat","rotateMatrix","createRotateMatrix","getRelativeCenterPoint","tMatrix","createTranslateMatrix","finalMatrix","multiplyTransformMatrices","dim","w","h","transformMatrixKey","skipGroup","prefix","push","scaleX","scaleY","strokeWidth","skewX","skewY","flipX","flipY","resolveOrigin","matrix","calcOwnMatrix","key","cache","matrixCache","i","ownMatrixCache","center","options","translateX","translateY","composeMatrix","_getNonTransformedDimensions","scalarAdd","_calculateCurrentDimensions","transform","padding","dimOptions","preScalingStrokeValue","postScalingStrokeValue","strokeUniform","dimX","dimY","noSkew","finalDimensions","sizeAfterTransform","calcDimensionsMatrix","translateToGivenOrigin","fromOriginX","fromOriginY","toOriginX","toOriginY","offsetX","offsetY","translateToCenterPoint","CENTER","rotate","degreesToRadians","translateToOriginPoint","getCenterPoint","relCenter","getPointByOrigin","getPositionByOrigin","pos","position","set","_getLeftTopCoords","LEFT","TOP","positionByLeftTop"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"FabricObjectProps.d.ts","sourceRoot":"","sources":["../../../../../src/shapes/Object/types/FabricObjectProps.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD,MAAM,WAAW,iBACf,SAAQ,WAAW,EACjB,YAAY,EACZ,WAAW,EACX,oBAAoB;IACtB;;;;;;;;OAQG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB;;;;OAIG;IACH,WAAW,EAAE,mBAAmB,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;IAElD;;;;OAIG;IACH,UAAU,EAAE,mBAAmB,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;IAEjD;;;;;OAKG;IACH,wBAAwB,EAAE,MAAM,CAAC;IAEjC;;;OAGG;IACH,kBAAkB,EAAE,OAAO,CAAC;IAE5B;;;;OAIG;IACH,UAAU,EAAE,OAAO,CAAC;IAEpB;;;OAGG;IACH,OAAO,EAAE,OAAO,CAAC;IAEjB;;;;;;;;OAQG;IACH,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB"}
1
+ {"version":3,"file":"FabricObjectProps.d.ts","sourceRoot":"","sources":["../../../../../src/shapes/Object/types/FabricObjectProps.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD,MAAM,WAAW,iBACf,SAAQ,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,oBAAoB;IACpE;;;;;;;;OAQG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB;;;;OAIG;IACH,WAAW,EAAE,mBAAmB,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;IAElD;;;;OAIG;IACH,UAAU,EAAE,mBAAmB,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;IAEjD;;;;;OAKG;IACH,wBAAwB,EAAE,MAAM,CAAC;IAEjC;;;OAGG;IACH,kBAAkB,EAAE,OAAO,CAAC;IAE5B;;;;OAIG;IACH,UAAU,EAAE,OAAO,CAAC;IAEpB;;;OAGG;IACH,OAAO,EAAE,OAAO,CAAC;IAEjB;;;;;;;;OAQG;IACH,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB"}
@@ -1 +1 @@
1
- {"version":3,"file":"ObjectProps.d.ts","sourceRoot":"","sources":["../../../../../src/shapes/Object/types/ObjectProps.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,KAAK,EACV,aAAa,EACb,qBAAqB,EACtB,MAAM,yBAAyB,CAAC;AAEjC,MAAM,WAAW,WACf,SAAQ,qBAAqB,EAC3B,aAAa,EACb,0BAA0B;IAC5B,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAAC;IAC9B,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAAC;IAChC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,CAAC,EAAE,YAAY,GAAG,MAAM,CAAC;IAE/B;;;;OAIG;IACH,aAAa,EAAE,MAAM,CAAC;IAEtB;;;;;;;OAOG;IACH,aAAa,EAAE,OAAO,CAAC;IAEvB;;;OAGG;IACH,oBAAoB,EAAE,OAAO,CAAC;IAE9B;;;;OAIG;IACH,iBAAiB,EAAE,OAAO,CAAC;CAC5B"}
1
+ {"version":3,"file":"ObjectProps.d.ts","sourceRoot":"","sources":["../../../../../src/shapes/Object/types/ObjectProps.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,KAAK,EACV,aAAa,EACb,qBAAqB,EACtB,MAAM,yBAAyB,CAAC;AAEjC,MAAM,WAAW,WACf,SAAQ,qBAAqB,EAAE,aAAa,EAAE,0BAA0B;IACxE,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAAC;IAC9B,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAAC;IAChC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,CAAC,EAAE,YAAY,GAAG,MAAM,CAAC;IAE/B;;;;OAIG;IACH,aAAa,EAAE,MAAM,CAAC;IAEtB;;;;;;;OAOG;IACH,aAAa,EAAE,OAAO,CAAC;IAEvB;;;OAGG;IACH,oBAAoB,EAAE,OAAO,CAAC;IAE9B;;;;OAIG;IACH,iBAAiB,EAAE,OAAO,CAAC;CAC5B"}
@@ -1 +1 @@
1
- {"version":3,"file":"Path.d.ts","sourceRoot":"","sources":["../../../src/shapes/Path.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Path.d.ts","sourceRoot":"","sources":["../../../src/shapes/Path.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Path.min.mjs","sources":["../../../src/shapes/Path.ts"],"sourcesContent":["import { config } from '../config';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type { XY } from '../Point';\nimport { Point } from '../Point';\nimport { makeBoundingBoxFromPoints } from '../util/misc/boundingBoxFromPoints';\nimport { toFixed } from '../util/misc/toFixed';\nimport {\n getBoundsOfCurve,\n joinPath,\n makePathSimpler,\n parsePath,\n} from '../util/path';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type {\n TComplexPathData,\n TPathSegmentInfo,\n TSimplePathData,\n} from '../util/path/typedefs';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport type {\n TBBox,\n TClassProperties,\n TSVGReviver,\n TOptions,\n} from '../typedefs';\nimport { CENTER, LEFT, TOP } from '../constants';\nimport type { CSSRules } from '../parser/typedefs';\n\ninterface UniquePathProps {\n sourcePath?: string;\n path?: TSimplePathData;\n}\n\nexport interface SerializedPathProps\n extends SerializedObjectProps,\n UniquePathProps {}\n\nexport interface PathProps extends FabricObjectProps, UniquePathProps {}\n\nexport interface IPathBBox extends TBBox {\n left: number;\n top: number;\n pathOffset: Point;\n}\n\nexport class Path<\n Props extends TOptions<PathProps> = Partial<PathProps>,\n SProps extends SerializedPathProps = SerializedPathProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n> extends FabricObject<Props, SProps, EventSpec> {\n /**\n * Array of path points\n * @type Array\n */\n declare path: TSimplePathData;\n\n declare pathOffset: Point;\n\n declare sourcePath?: string;\n\n declare segmentsInfo?: TPathSegmentInfo[];\n\n static type = 'Path';\n\n static cacheProperties = [...cacheProperties, 'path', 'fillRule'];\n\n /**\n * Constructor\n * @param {TComplexPathData} path Path data (sequence of coordinates and corresponding \"command\" tokens)\n * @param {Partial<PathProps>} [options] Options object\n * @return {Path} thisArg\n */\n constructor(\n path: TComplexPathData | string,\n // todo: evaluate this spread here\n { path: _, left, top, ...options }: Partial<Props> = {},\n ) {\n super();\n Object.assign(this, Path.ownDefaults);\n this.setOptions(options);\n this._setPath(path || [], true);\n typeof left === 'number' && this.set(LEFT, left);\n typeof top === 'number' && this.set(TOP, top);\n }\n\n /**\n * @private\n * @param {TComplexPathData | string} path Path data (sequence of coordinates and corresponding \"command\" tokens)\n * @param {boolean} [adjustPosition] pass true to reposition the object according to the bounding box\n * @returns {Point} top left position of the bounding box, useful for complementary positioning\n */\n _setPath(path: TComplexPathData | string, adjustPosition?: boolean) {\n this.path = makePathSimpler(Array.isArray(path) ? path : parsePath(path));\n this.setBoundingBox(adjustPosition);\n }\n\n /**\n * This function is an helper for svg import. it returns the center of the object in the svg\n * untransformed coordinates, by look at the polyline/polygon points.\n * @private\n * @return {Point} center point from element coordinates\n */\n _findCenterFromElement(): Point {\n const bbox = this._calcBoundsFromPath();\n return new Point(bbox.left + bbox.width / 2, bbox.top + bbox.height / 2);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render path on\n */\n _renderPathCommands(ctx: CanvasRenderingContext2D) {\n const l = -this.pathOffset.x,\n t = -this.pathOffset.y;\n\n ctx.beginPath();\n\n for (const command of this.path) {\n switch (\n command[0] // first letter\n ) {\n case 'L': // lineto, absolute\n ctx.lineTo(command[1] + l, command[2] + t);\n break;\n\n case 'M': // moveTo, absolute\n ctx.moveTo(command[1] + l, command[2] + t);\n break;\n\n case 'C': // bezierCurveTo, absolute\n ctx.bezierCurveTo(\n command[1] + l,\n command[2] + t,\n command[3] + l,\n command[4] + t,\n command[5] + l,\n command[6] + t,\n );\n break;\n\n case 'Q': // quadraticCurveTo, absolute\n ctx.quadraticCurveTo(\n command[1] + l,\n command[2] + t,\n command[3] + l,\n command[4] + t,\n );\n break;\n\n case 'Z':\n ctx.closePath();\n break;\n }\n }\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render path on\n */\n _render(ctx: CanvasRenderingContext2D) {\n this._renderPathCommands(ctx);\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Returns string representation of an instance\n * @return {string} string representation of an instance\n */\n toString() {\n return `#<Path (${this.complexity()}): { \"top\": ${this.top}, \"left\": ${\n this.left\n } }>`;\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit<Props & TClassProperties<this>, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick<T, K> & SProps {\n return {\n ...super.toObject(propertiesToInclude),\n path: this.path.map((pathCmd) => pathCmd.slice()),\n };\n }\n\n /**\n * Returns dataless object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toDatalessObject<\n T extends Omit<Props & TClassProperties<this>, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick<T, K> & SProps {\n const o = this.toObject<T, K>(propertiesToInclude);\n if (this.sourcePath) {\n delete o.path;\n o.sourcePath = this.sourcePath;\n }\n return o;\n }\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const path = joinPath(this.path, config.NUM_FRACTION_DIGITS);\n return [\n '<path ',\n 'COMMON_PARTS',\n `d=\"${path}\" stroke-linecap=\"round\" />\\n`,\n ];\n }\n\n /**\n * @private\n * @return the path command's translate transform attribute\n */\n _getOffsetTransform() {\n const digits = config.NUM_FRACTION_DIGITS;\n return ` translate(${toFixed(-this.pathOffset.x, digits)}, ${toFixed(\n -this.pathOffset.y,\n digits,\n )})`;\n }\n\n /**\n * Returns svg clipPath representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {string} svg representation of an instance\n */\n toClipPathSVG(reviver?: TSVGReviver): string {\n const additionalTransform = this._getOffsetTransform();\n return (\n '\\t' +\n this._createBaseClipPathSVGMarkup(this._toSVG(), {\n reviver,\n additionalTransform: additionalTransform,\n })\n );\n }\n\n /**\n * Returns svg representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {string} svg representation of an instance\n */\n toSVG(reviver?: TSVGReviver): string {\n const additionalTransform = this._getOffsetTransform();\n return this._createBaseSVGMarkup(this._toSVG(), {\n reviver,\n additionalTransform: additionalTransform,\n });\n }\n\n /**\n * Returns number representation of an instance complexity\n * @return {number} complexity of this instance\n */\n complexity() {\n return this.path.length;\n }\n\n setDimensions() {\n this.setBoundingBox();\n }\n\n setBoundingBox(adjustPosition?: boolean) {\n const { width, height, pathOffset } = this._calcDimensions();\n this.set({ width, height, pathOffset });\n // using pathOffset because it match the use case.\n // if pathOffset change here we need to use left + width/2 , top + height/2\n adjustPosition && this.setPositionByOrigin(pathOffset, CENTER, CENTER);\n }\n\n _calcBoundsFromPath(): TBBox {\n const bounds: XY[] = [];\n let subpathStartX = 0,\n subpathStartY = 0,\n x = 0, // current x\n y = 0; // current y\n\n for (const command of this.path) {\n // current instruction\n switch (\n command[0] // first letter\n ) {\n case 'L': // lineto, absolute\n x = command[1];\n y = command[2];\n bounds.push({ x: subpathStartX, y: subpathStartY }, { x, y });\n break;\n\n case 'M': // moveTo, absolute\n x = command[1];\n y = command[2];\n subpathStartX = x;\n subpathStartY = y;\n break;\n\n case 'C': // bezierCurveTo, absolute\n bounds.push(\n ...getBoundsOfCurve(\n x,\n y,\n command[1],\n command[2],\n command[3],\n command[4],\n command[5],\n command[6],\n ),\n );\n x = command[5];\n y = command[6];\n break;\n\n case 'Q': // quadraticCurveTo, absolute\n bounds.push(\n ...getBoundsOfCurve(\n x,\n y,\n command[1],\n command[2],\n command[1],\n command[2],\n command[3],\n command[4],\n ),\n );\n x = command[3];\n y = command[4];\n break;\n\n case 'Z':\n x = subpathStartX;\n y = subpathStartY;\n break;\n }\n }\n return makeBoundingBoxFromPoints(bounds);\n }\n\n /**\n * @private\n */\n _calcDimensions(): IPathBBox {\n const bbox = this._calcBoundsFromPath();\n\n return {\n ...bbox,\n pathOffset: new Point(\n bbox.left + bbox.width / 2,\n bbox.top + bbox.height / 2,\n ),\n };\n }\n\n /**\n * List of attribute names to account for when parsing SVG element (used by `Path.fromElement`)\n * @see http://www.w3.org/TR/SVG/paths.html#PathElement\n */\n static ATTRIBUTE_NAMES = [...SHARED_ATTRIBUTES, 'd'];\n\n /**\n * Creates an instance of Path from an object\n * @param {Object} object\n * @returns {Promise<Path>}\n */\n static fromObject<T extends TOptions<SerializedPathProps>>(object: T) {\n return this._fromObject<Path>(object, {\n extraParam: 'path',\n });\n }\n\n /**\n * Creates an instance of Path from an SVG <path> element\n * @param {HTMLElement} element to parse\n * @param {Partial<PathProps>} [options] Options object\n */\n static async fromElement(\n element: HTMLElement | SVGElement,\n options?: Partial<PathProps>,\n cssRules?: CSSRules,\n ) {\n const { d, ...parsedAttributes } = parseAttributes(\n element,\n this.ATTRIBUTE_NAMES,\n cssRules,\n );\n return new this(d, {\n ...parsedAttributes,\n ...options,\n // we pass undefined to instruct the constructor to position the object using the bbox\n left: undefined,\n top: undefined,\n });\n }\n}\n\nclassRegistry.setClass(Path);\nclassRegistry.setSVGClass(Path);\n\n/* _FROM_SVG_START_ */\n"],"names":["Path","FabricObject","constructor","path","_","left","top","options","arguments","length","undefined","super","Object","assign","this","ownDefaults","setOptions","_setPath","set","LEFT","TOP","adjustPosition","makePathSimpler","Array","isArray","parsePath","setBoundingBox","_findCenterFromElement","bbox","_calcBoundsFromPath","Point","width","height","_renderPathCommands","ctx","l","pathOffset","x","t","y","beginPath","command","lineTo","moveTo","bezierCurveTo","quadraticCurveTo","closePath","_render","_renderPaintInOrder","toString","complexity","toObject","propertiesToInclude","map","pathCmd","slice","toDatalessObject","o","sourcePath","_toSVG","joinPath","config","NUM_FRACTION_DIGITS","_getOffsetTransform","digits","toFixed","toClipPathSVG","reviver","additionalTransform","_createBaseClipPathSVGMarkup","toSVG","_createBaseSVGMarkup","setDimensions","_calcDimensions","setPositionByOrigin","CENTER","bounds","subpathStartX","subpathStartY","push","getBoundsOfCurve","makeBoundingBoxFromPoints","fromObject","object","_fromObject","extraParam","fromElement","element","cssRules","d","parsedAttributes","parseAttributes","ATTRIBUTE_NAMES","_defineProperty","cacheProperties","SHARED_ATTRIBUTES","classRegistry","setClass","setSVGClass"],"mappings":"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"}
1
+ {"version":3,"file":"Path.min.mjs","sources":["../../../src/shapes/Path.ts"],"sourcesContent":["import { config } from '../config';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type { XY } from '../Point';\nimport { Point } from '../Point';\nimport { makeBoundingBoxFromPoints } from '../util/misc/boundingBoxFromPoints';\nimport { toFixed } from '../util/misc/toFixed';\nimport {\n getBoundsOfCurve,\n joinPath,\n makePathSimpler,\n parsePath,\n} from '../util/path';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type {\n TComplexPathData,\n TPathSegmentInfo,\n TSimplePathData,\n} from '../util/path/typedefs';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport type {\n TBBox,\n TClassProperties,\n TSVGReviver,\n TOptions,\n} from '../typedefs';\nimport { CENTER, LEFT, TOP } from '../constants';\nimport type { CSSRules } from '../parser/typedefs';\n\ninterface UniquePathProps {\n sourcePath?: string;\n path?: TSimplePathData;\n}\n\nexport interface SerializedPathProps\n extends SerializedObjectProps, UniquePathProps {}\n\nexport interface PathProps extends FabricObjectProps, UniquePathProps {}\n\nexport interface IPathBBox extends TBBox {\n left: number;\n top: number;\n pathOffset: Point;\n}\n\nexport class Path<\n Props extends TOptions<PathProps> = Partial<PathProps>,\n SProps extends SerializedPathProps = SerializedPathProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n> extends FabricObject<Props, SProps, EventSpec> {\n /**\n * Array of path points\n * @type Array\n */\n declare path: TSimplePathData;\n\n declare pathOffset: Point;\n\n declare sourcePath?: string;\n\n declare segmentsInfo?: TPathSegmentInfo[];\n\n static type = 'Path';\n\n static cacheProperties = [...cacheProperties, 'path', 'fillRule'];\n\n /**\n * Constructor\n * @param {TComplexPathData} path Path data (sequence of coordinates and corresponding \"command\" tokens)\n * @param {Partial<PathProps>} [options] Options object\n * @return {Path} thisArg\n */\n constructor(\n path: TComplexPathData | string,\n // todo: evaluate this spread here\n { path: _, left, top, ...options }: Partial<Props> = {},\n ) {\n super();\n Object.assign(this, Path.ownDefaults);\n this.setOptions(options);\n this._setPath(path || [], true);\n typeof left === 'number' && this.set(LEFT, left);\n typeof top === 'number' && this.set(TOP, top);\n }\n\n /**\n * @private\n * @param {TComplexPathData | string} path Path data (sequence of coordinates and corresponding \"command\" tokens)\n * @param {boolean} [adjustPosition] pass true to reposition the object according to the bounding box\n * @returns {Point} top left position of the bounding box, useful for complementary positioning\n */\n _setPath(path: TComplexPathData | string, adjustPosition?: boolean) {\n this.path = makePathSimpler(Array.isArray(path) ? path : parsePath(path));\n this.setBoundingBox(adjustPosition);\n }\n\n /**\n * This function is an helper for svg import. it returns the center of the object in the svg\n * untransformed coordinates, by look at the polyline/polygon points.\n * @private\n * @return {Point} center point from element coordinates\n */\n _findCenterFromElement(): Point {\n const bbox = this._calcBoundsFromPath();\n return new Point(bbox.left + bbox.width / 2, bbox.top + bbox.height / 2);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render path on\n */\n _renderPathCommands(ctx: CanvasRenderingContext2D) {\n const l = -this.pathOffset.x,\n t = -this.pathOffset.y;\n\n ctx.beginPath();\n\n for (const command of this.path) {\n switch (\n command[0] // first letter\n ) {\n case 'L': // lineto, absolute\n ctx.lineTo(command[1] + l, command[2] + t);\n break;\n\n case 'M': // moveTo, absolute\n ctx.moveTo(command[1] + l, command[2] + t);\n break;\n\n case 'C': // bezierCurveTo, absolute\n ctx.bezierCurveTo(\n command[1] + l,\n command[2] + t,\n command[3] + l,\n command[4] + t,\n command[5] + l,\n command[6] + t,\n );\n break;\n\n case 'Q': // quadraticCurveTo, absolute\n ctx.quadraticCurveTo(\n command[1] + l,\n command[2] + t,\n command[3] + l,\n command[4] + t,\n );\n break;\n\n case 'Z':\n ctx.closePath();\n break;\n }\n }\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render path on\n */\n _render(ctx: CanvasRenderingContext2D) {\n this._renderPathCommands(ctx);\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Returns string representation of an instance\n * @return {string} string representation of an instance\n */\n toString() {\n return `#<Path (${this.complexity()}): { \"top\": ${this.top}, \"left\": ${\n this.left\n } }>`;\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit<Props & TClassProperties<this>, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick<T, K> & SProps {\n return {\n ...super.toObject(propertiesToInclude),\n path: this.path.map((pathCmd) => pathCmd.slice()),\n };\n }\n\n /**\n * Returns dataless object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toDatalessObject<\n T extends Omit<Props & TClassProperties<this>, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick<T, K> & SProps {\n const o = this.toObject<T, K>(propertiesToInclude);\n if (this.sourcePath) {\n delete o.path;\n o.sourcePath = this.sourcePath;\n }\n return o;\n }\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n return [\n '<path ',\n 'COMMON_PARTS',\n `d=\"${joinPath(this.path, config.NUM_FRACTION_DIGITS)}\" stroke-linecap=\"round\" />\\n`,\n ];\n }\n\n /**\n * @private\n * @return the path command's translate transform attribute\n */\n _getOffsetTransform() {\n const digits = config.NUM_FRACTION_DIGITS;\n return ` translate(${toFixed(-this.pathOffset.x, digits)}, ${toFixed(\n -this.pathOffset.y,\n digits,\n )})`;\n }\n\n /**\n * Returns svg clipPath representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {string} svg representation of an instance\n */\n toClipPathSVG(reviver?: TSVGReviver): string {\n const additionalTransform = this._getOffsetTransform();\n return (\n '\\t' +\n this._createBaseClipPathSVGMarkup(this._toSVG(), {\n reviver,\n additionalTransform: additionalTransform,\n })\n );\n }\n\n /**\n * Returns svg representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {string} svg representation of an instance\n */\n toSVG(reviver?: TSVGReviver): string {\n const additionalTransform = this._getOffsetTransform();\n return this._createBaseSVGMarkup(this._toSVG(), {\n reviver,\n additionalTransform: additionalTransform,\n });\n }\n\n /**\n * Returns number representation of an instance complexity\n * @return {number} complexity of this instance\n */\n complexity() {\n return this.path.length;\n }\n\n setDimensions() {\n this.setBoundingBox();\n }\n\n setBoundingBox(adjustPosition?: boolean) {\n const { width, height, pathOffset } = this._calcDimensions();\n this.set({ width, height, pathOffset });\n // using pathOffset because it match the use case.\n // if pathOffset change here we need to use left + width/2 , top + height/2\n adjustPosition && this.setPositionByOrigin(pathOffset, CENTER, CENTER);\n }\n\n _calcBoundsFromPath(): TBBox {\n const bounds: XY[] = [];\n let subpathStartX = 0,\n subpathStartY = 0,\n x = 0, // current x\n y = 0; // current y\n\n for (const command of this.path) {\n // current instruction\n switch (\n command[0] // first letter\n ) {\n case 'L': // lineto, absolute\n x = command[1];\n y = command[2];\n bounds.push({ x: subpathStartX, y: subpathStartY }, { x, y });\n break;\n\n case 'M': // moveTo, absolute\n x = command[1];\n y = command[2];\n subpathStartX = x;\n subpathStartY = y;\n break;\n\n case 'C': // bezierCurveTo, absolute\n bounds.push(\n ...getBoundsOfCurve(\n x,\n y,\n command[1],\n command[2],\n command[3],\n command[4],\n command[5],\n command[6],\n ),\n );\n x = command[5];\n y = command[6];\n break;\n\n case 'Q': // quadraticCurveTo, absolute\n bounds.push(\n ...getBoundsOfCurve(\n x,\n y,\n command[1],\n command[2],\n command[1],\n command[2],\n command[3],\n command[4],\n ),\n );\n x = command[3];\n y = command[4];\n break;\n\n case 'Z':\n x = subpathStartX;\n y = subpathStartY;\n break;\n }\n }\n return makeBoundingBoxFromPoints(bounds);\n }\n\n /**\n * @private\n */\n _calcDimensions(): IPathBBox {\n const bbox = this._calcBoundsFromPath();\n\n return {\n ...bbox,\n pathOffset: new Point(\n bbox.left + bbox.width / 2,\n bbox.top + bbox.height / 2,\n ),\n };\n }\n\n /**\n * List of attribute names to account for when parsing SVG element (used by `Path.fromElement`)\n * @see http://www.w3.org/TR/SVG/paths.html#PathElement\n */\n static ATTRIBUTE_NAMES = [...SHARED_ATTRIBUTES, 'd'];\n\n /**\n * Creates an instance of Path from an object\n * @param {Object} object\n * @returns {Promise<Path>}\n */\n static fromObject<T extends TOptions<SerializedPathProps>>(object: T) {\n return this._fromObject<Path>(object, {\n extraParam: 'path',\n });\n }\n\n /**\n * Creates an instance of Path from an SVG <path> element\n * @param {HTMLElement} element to parse\n * @param {Partial<PathProps>} [options] Options object\n */\n static async fromElement(\n element: HTMLElement | SVGElement,\n options?: Partial<PathProps>,\n cssRules?: CSSRules,\n ) {\n const { d, ...parsedAttributes } = parseAttributes(\n element,\n this.ATTRIBUTE_NAMES,\n cssRules,\n );\n return new this(d, {\n ...parsedAttributes,\n ...options,\n // we pass undefined to instruct the constructor to position the object using the bbox\n left: undefined,\n top: undefined,\n });\n }\n}\n\nclassRegistry.setClass(Path);\nclassRegistry.setSVGClass(Path);\n\n/* _FROM_SVG_START_ */\n"],"names":["Path","FabricObject","constructor","path","_","left","top","options","arguments","length","undefined","super","Object","assign","this","ownDefaults","setOptions","_setPath","set","LEFT","TOP","adjustPosition","makePathSimpler","Array","isArray","parsePath","setBoundingBox","_findCenterFromElement","bbox","_calcBoundsFromPath","Point","width","height","_renderPathCommands","ctx","l","pathOffset","x","t","y","beginPath","command","lineTo","moveTo","bezierCurveTo","quadraticCurveTo","closePath","_render","_renderPaintInOrder","toString","complexity","toObject","propertiesToInclude","map","pathCmd","slice","toDatalessObject","o","sourcePath","_toSVG","joinPath","config","NUM_FRACTION_DIGITS","_getOffsetTransform","digits","toFixed","toClipPathSVG","reviver","additionalTransform","_createBaseClipPathSVGMarkup","toSVG","_createBaseSVGMarkup","setDimensions","_calcDimensions","setPositionByOrigin","CENTER","bounds","subpathStartX","subpathStartY","push","getBoundsOfCurve","makeBoundingBoxFromPoints","fromObject","object","_fromObject","extraParam","fromElement","element","cssRules","d","parsedAttributes","parseAttributes","ATTRIBUTE_NAMES","_defineProperty","cacheProperties","SHARED_ATTRIBUTES","classRegistry","setClass","setSVGClass"],"mappings":"iyBA+CO,MAAMA,UAIHC,EAuBRC,WAAAA,CACEC,GAGA,IADEA,KAAMC,EAACC,KAAEA,EAAIC,IAAEA,KAAQC,GAAyBC,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,EAErDG,QACAC,OAAOC,OAAOC,KAAMd,EAAKe,aACzBD,KAAKE,WAAWT,GAChBO,KAAKG,SAASd,GAAQ,IAAI,GACV,iBAATE,GAAqBS,KAAKI,IAAIC,EAAMd,GAC5B,iBAARC,GAAoBQ,KAAKI,IAAIE,EAAKd,EAC3C,CAQAW,QAAAA,CAASd,EAAiCkB,GACxCP,KAAKX,KAAOmB,EAAgBC,MAAMC,QAAQrB,GAAQA,EAAOsB,EAAUtB,IACnEW,KAAKY,eAAeL,EACtB,CAQAM,sBAAAA,GACE,MAAMC,EAAOd,KAAKe,sBAClB,OAAO,IAAIC,EAAMF,EAAKvB,KAAOuB,EAAKG,MAAQ,EAAGH,EAAKtB,IAAMsB,EAAKI,OAAS,EACxE,CAMAC,mBAAAA,CAAoBC,GAClB,MAAMC,GAAKrB,KAAKsB,WAAWC,EACzBC,GAAKxB,KAAKsB,WAAWG,EAEvBL,EAAIM,YAEJ,IAAK,MAAMC,KAAW3B,KAAKX,KACzB,OACEsC,EAAQ,IAER,IAAK,IACHP,EAAIQ,OAAOD,EAAQ,GAAKN,EAAGM,EAAQ,GAAKH,GACxC,MAEF,IAAK,IACHJ,EAAIS,OAAOF,EAAQ,GAAKN,EAAGM,EAAQ,GAAKH,GACxC,MAEF,IAAK,IACHJ,EAAIU,cACFH,EAAQ,GAAKN,EACbM,EAAQ,GAAKH,EACbG,EAAQ,GAAKN,EACbM,EAAQ,GAAKH,EACbG,EAAQ,GAAKN,EACbM,EAAQ,GAAKH,GAEf,MAEF,IAAK,IACHJ,EAAIW,iBACFJ,EAAQ,GAAKN,EACbM,EAAQ,GAAKH,EACbG,EAAQ,GAAKN,EACbM,EAAQ,GAAKH,GAEf,MAEF,IAAK,IACHJ,EAAIY,YAIZ,CAMAC,OAAAA,CAAQb,GACNpB,KAAKmB,oBAAoBC,GACzBpB,KAAKkC,oBAAoBd,EAC3B,CAMAe,QAAAA,GACE,MAAO,WAAWnC,KAAKoC,2BAA2BpC,KAAKR,gBACrDQ,KAAKT,SAET,CAOA8C,QAAAA,GAGsD,IAApDC,EAAwB5C,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,GAC3B,MAAO,IACFG,MAAMwC,SAASC,GAClBjD,KAAMW,KAAKX,KAAKkD,IAAKC,GAAYA,EAAQC,SAE7C,CAOAC,gBAAAA,GAGsD,IAApDJ,EAAwB5C,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,GAC3B,MAAMiD,EAAI3C,KAAKqC,SAAeC,GAK9B,OAJItC,KAAK4C,oBACAD,EAAEtD,KACTsD,EAAEC,WAAa5C,KAAK4C,YAEfD,CACT,CAOAE,MAAAA,GACE,MAAO,CACL,SACA,eACA,MAAMC,EAAS9C,KAAKX,KAAM0D,EAAOC,oDAErC,CAMAC,mBAAAA,GACE,MAAMC,EAASH,EAAOC,oBACtB,MAAO,cAAcG,GAASnD,KAAKsB,WAAWC,EAAG2B,OAAYC,GAC1DnD,KAAKsB,WAAWG,EACjByB,KAEJ,CAOAE,aAAAA,CAAcC,GACZ,MAAMC,EAAsBtD,KAAKiD,sBACjC,MACE,KACAjD,KAAKuD,6BAA6BvD,KAAK6C,SAAU,CAC/CQ,UACAC,oBAAqBA,GAG3B,CAOAE,KAAAA,CAAMH,GACJ,MAAMC,EAAsBtD,KAAKiD,sBACjC,OAAOjD,KAAKyD,qBAAqBzD,KAAK6C,SAAU,CAC9CQ,UACAC,oBAAqBA,GAEzB,CAMAlB,UAAAA,GACE,OAAOpC,KAAKX,KAAKM,MACnB,CAEA+D,aAAAA,GACE1D,KAAKY,gBACP,CAEAA,cAAAA,CAAeL,GACb,MAAMU,MAAEA,EAAKC,OAAEA,EAAMI,WAAEA,GAAetB,KAAK2D,kBAC3C3D,KAAKI,IAAI,CAAEa,QAAOC,SAAQI,eAG1Bf,GAAkBP,KAAK4D,oBAAoBtC,EAAYuC,EAAQA,EACjE,CAEA9C,mBAAAA,GACE,MAAM+C,EAAe,GACrB,IAAIC,EAAgB,EAClBC,EAAgB,EAChBzC,EAAI,EACJE,EAAI,EAEN,IAAK,MAAME,KAAW3B,KAAKX,KAEzB,OACEsC,EAAQ,IAER,IAAK,IACHJ,EAAII,EAAQ,GACZF,EAAIE,EAAQ,GACZmC,EAAOG,KAAK,CAAE1C,EAAGwC,EAAetC,EAAGuC,GAAiB,CAAEzC,IAAGE,MACzD,MAEF,IAAK,IACHF,EAAII,EAAQ,GACZF,EAAIE,EAAQ,GACZoC,EAAgBxC,EAChByC,EAAgBvC,EAChB,MAEF,IAAK,IACHqC,EAAOG,QACFC,EACD3C,EACAE,EACAE,EAAQ,GACRA,EAAQ,GACRA,EAAQ,GACRA,EAAQ,GACRA,EAAQ,GACRA,EAAQ,KAGZJ,EAAII,EAAQ,GACZF,EAAIE,EAAQ,GACZ,MAEF,IAAK,IACHmC,EAAOG,QACFC,EACD3C,EACAE,EACAE,EAAQ,GACRA,EAAQ,GACRA,EAAQ,GACRA,EAAQ,GACRA,EAAQ,GACRA,EAAQ,KAGZJ,EAAII,EAAQ,GACZF,EAAIE,EAAQ,GACZ,MAEF,IAAK,IACHJ,EAAIwC,EACJtC,EAAIuC,EAIV,OAAOG,EAA0BL,EACnC,CAKAH,eAAAA,GACE,MAAM7C,EAAOd,KAAKe,sBAElB,MAAO,IACFD,EACHQ,WAAY,IAAIN,EACdF,EAAKvB,KAAOuB,EAAKG,MAAQ,EACzBH,EAAKtB,IAAMsB,EAAKI,OAAS,GAG/B,CAaA,iBAAOkD,CAAoDC,GACzD,OAAOrE,KAAKsE,YAAkBD,EAAQ,CACpCE,WAAY,QAEhB,CAOA,wBAAaC,CACXC,EACAhF,EACAiF,GAEA,MAAMC,EAAEA,KAAMC,GAAqBC,EACjCJ,EACAzE,KAAK8E,gBACLJ,GAEF,OAAO,IAAI1E,KAAK2E,EAAG,IACdC,KACAnF,EAEHF,UAAMK,EACNJ,SAAKI,GAET,EAjWAmF,EALW7F,EAAI,OAiBD,QAAM6F,EAjBT7F,EAAI,kBAmBU,IAAI8F,EAAiB,OAAQ,aAAWD,EAnBtD7F,EAAI,kBAmUU,IAAI+F,EAAmB,MAsClDC,EAAcC,SAASjG,GACvBgG,EAAcE,YAAYlG"}
@@ -140,8 +140,7 @@ class Path extends FabricObject {
140
140
  * of the instance
141
141
  */
142
142
  _toSVG() {
143
- const path = joinPath(this.path, config.NUM_FRACTION_DIGITS);
144
- return ['<path ', 'COMMON_PARTS', `d="${path}" stroke-linecap="round" />\n`];
143
+ return ['<path ', 'COMMON_PARTS', `d="${joinPath(this.path, config.NUM_FRACTION_DIGITS)}" stroke-linecap="round" />\n`];
145
144
  }
146
145
 
147
146
  /**