fabric 7.3.1 → 7.4.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 (314) hide show
  1. package/CHANGELOG.md +40 -27
  2. package/dist/_virtual/{_@oxc-project_runtime@0.122.0 → _@oxc-project_runtime@0.126.0}/helpers/defineProperty.mjs +1 -1
  3. package/{dist-extensions/_virtual/_@oxc-project_runtime@0.122.0 → dist/_virtual/_@oxc-project_runtime@0.126.0}/helpers/toPrimitive.mjs +1 -1
  4. package/dist/_virtual/{_@oxc-project_runtime@0.122.0 → _@oxc-project_runtime@0.126.0}/helpers/toPropertyKey.mjs +1 -1
  5. package/{dist-extensions/_virtual/_@oxc-project_runtime@0.122.0 → dist/_virtual/_@oxc-project_runtime@0.126.0}/helpers/typeof.mjs +1 -1
  6. package/dist/index.js +88 -66
  7. package/dist/index.js.map +1 -1
  8. package/dist/index.min.js +35 -35
  9. package/dist/index.min.js.map +1 -1
  10. package/dist/index.min.mjs +37 -37
  11. package/dist/index.min.mjs.map +1 -1
  12. package/dist/index.mjs +88 -66
  13. package/dist/index.mjs.map +1 -1
  14. package/dist/index.node.cjs +83 -62
  15. package/dist/index.node.cjs.map +1 -1
  16. package/dist/index.node.mjs +83 -62
  17. package/dist/index.node.mjs.map +1 -1
  18. package/dist/package.min.mjs +1 -1
  19. package/dist/package.mjs +1 -1
  20. package/dist/src/Collection.min.mjs +1 -1
  21. package/dist/src/Collection.mjs +1 -1
  22. package/dist/src/LayoutManager/LayoutManager.min.mjs +1 -1
  23. package/dist/src/LayoutManager/LayoutManager.mjs +1 -1
  24. package/dist/src/LayoutManager/LayoutStrategies/ClipPathLayout.min.mjs +1 -1
  25. package/dist/src/LayoutManager/LayoutStrategies/ClipPathLayout.mjs +1 -1
  26. package/dist/src/LayoutManager/LayoutStrategies/FitContentLayout.min.mjs +1 -1
  27. package/dist/src/LayoutManager/LayoutStrategies/FitContentLayout.mjs +1 -1
  28. package/dist/src/LayoutManager/LayoutStrategies/FixedLayout.min.mjs +1 -1
  29. package/dist/src/LayoutManager/LayoutStrategies/FixedLayout.mjs +1 -1
  30. package/dist/src/LayoutManager/LayoutStrategies/LayoutStrategy.min.mjs +1 -1
  31. package/dist/src/LayoutManager/LayoutStrategies/LayoutStrategy.mjs +1 -1
  32. package/dist/src/Observable.min.mjs +1 -1
  33. package/dist/src/Observable.mjs +1 -1
  34. package/dist/src/Pattern/Pattern.min.mjs +1 -1
  35. package/dist/src/Pattern/Pattern.mjs +1 -1
  36. package/dist/src/Shadow.min.mjs +1 -1
  37. package/dist/src/Shadow.mjs +1 -1
  38. package/dist/src/brushes/BaseBrush.min.mjs +1 -1
  39. package/dist/src/brushes/BaseBrush.mjs +1 -1
  40. package/dist/src/brushes/CircleBrush.min.mjs +1 -1
  41. package/dist/src/brushes/CircleBrush.mjs +1 -1
  42. package/dist/src/brushes/PencilBrush.min.mjs +1 -1
  43. package/dist/src/brushes/PencilBrush.mjs +1 -1
  44. package/dist/src/brushes/SprayBrush.min.mjs +1 -1
  45. package/dist/src/brushes/SprayBrush.mjs +1 -1
  46. package/dist/src/cache.min.mjs +1 -1
  47. package/dist/src/cache.mjs +1 -1
  48. package/dist/src/canvas/Canvas.min.mjs +1 -1
  49. package/dist/src/canvas/Canvas.mjs +1 -1
  50. package/dist/src/canvas/DOMManagers/CanvasDOMManager.min.mjs +1 -1
  51. package/dist/src/canvas/DOMManagers/CanvasDOMManager.mjs +1 -1
  52. package/dist/src/canvas/DOMManagers/StaticCanvasDOMManager.min.mjs +1 -1
  53. package/dist/src/canvas/DOMManagers/StaticCanvasDOMManager.mjs +1 -1
  54. package/dist/src/canvas/SelectableCanvas.min.mjs +1 -1
  55. package/dist/src/canvas/SelectableCanvas.mjs +1 -1
  56. package/dist/src/canvas/StaticCanvas.d.ts +1 -1
  57. package/dist/src/canvas/StaticCanvas.d.ts.map +1 -1
  58. package/dist/src/canvas/StaticCanvas.min.mjs +5 -5
  59. package/dist/src/canvas/StaticCanvas.min.mjs.map +1 -1
  60. package/dist/src/canvas/StaticCanvas.mjs +4 -4
  61. package/dist/src/canvas/StaticCanvas.mjs.map +1 -1
  62. package/dist/src/canvas/TextEditingManager.min.mjs +1 -1
  63. package/dist/src/canvas/TextEditingManager.mjs +1 -1
  64. package/dist/src/color/Color.min.mjs +1 -1
  65. package/dist/src/color/Color.mjs +1 -1
  66. package/dist/src/config.min.mjs +1 -1
  67. package/dist/src/config.mjs +1 -1
  68. package/dist/src/controls/Control.min.mjs +1 -1
  69. package/dist/src/controls/Control.mjs +1 -1
  70. package/dist/src/filters/BaseFilter.min.mjs +1 -1
  71. package/dist/src/filters/BaseFilter.mjs +1 -1
  72. package/dist/src/filters/BlendColor.min.mjs +1 -1
  73. package/dist/src/filters/BlendColor.mjs +1 -1
  74. package/dist/src/filters/BlendImage.min.mjs +1 -1
  75. package/dist/src/filters/BlendImage.mjs +1 -1
  76. package/dist/src/filters/Blur.min.mjs +1 -1
  77. package/dist/src/filters/Blur.mjs +1 -1
  78. package/dist/src/filters/Brightness.min.mjs +1 -1
  79. package/dist/src/filters/Brightness.mjs +1 -1
  80. package/dist/src/filters/Canvas2dFilterBackend.min.mjs +1 -1
  81. package/dist/src/filters/Canvas2dFilterBackend.mjs +1 -1
  82. package/dist/src/filters/ColorMatrix.min.mjs +1 -1
  83. package/dist/src/filters/ColorMatrix.mjs +1 -1
  84. package/dist/src/filters/ColorMatrixFilters.min.mjs +1 -1
  85. package/dist/src/filters/ColorMatrixFilters.mjs +1 -1
  86. package/dist/src/filters/Composed.min.mjs +1 -1
  87. package/dist/src/filters/Composed.mjs +1 -1
  88. package/dist/src/filters/Contrast.min.mjs +1 -1
  89. package/dist/src/filters/Contrast.mjs +1 -1
  90. package/dist/src/filters/Convolute.min.mjs +1 -1
  91. package/dist/src/filters/Convolute.min.mjs.map +1 -1
  92. package/dist/src/filters/Convolute.mjs +1 -1
  93. package/dist/src/filters/Gamma.min.mjs +1 -1
  94. package/dist/src/filters/Gamma.mjs +1 -1
  95. package/dist/src/filters/Grayscale.min.mjs +1 -1
  96. package/dist/src/filters/Grayscale.mjs +1 -1
  97. package/dist/src/filters/HueRotation.min.mjs +1 -1
  98. package/dist/src/filters/HueRotation.mjs +1 -1
  99. package/dist/src/filters/Invert.min.mjs +1 -1
  100. package/dist/src/filters/Invert.mjs +1 -1
  101. package/dist/src/filters/Noise.min.mjs +1 -1
  102. package/dist/src/filters/Noise.mjs +1 -1
  103. package/dist/src/filters/Pixelate.min.mjs +1 -1
  104. package/dist/src/filters/Pixelate.mjs +1 -1
  105. package/dist/src/filters/RemoveColor.min.mjs +1 -1
  106. package/dist/src/filters/RemoveColor.mjs +1 -1
  107. package/dist/src/filters/Resize.min.mjs +2 -2
  108. package/dist/src/filters/Resize.min.mjs.map +1 -1
  109. package/dist/src/filters/Resize.mjs +2 -2
  110. package/dist/src/filters/Resize.mjs.map +1 -1
  111. package/dist/src/filters/Saturation.min.mjs +1 -1
  112. package/dist/src/filters/Saturation.mjs +1 -1
  113. package/dist/src/filters/Vibrance.min.mjs +1 -1
  114. package/dist/src/filters/Vibrance.mjs +1 -1
  115. package/dist/src/filters/WebGLFilterBackend.min.mjs +1 -1
  116. package/dist/src/filters/WebGLFilterBackend.mjs +1 -1
  117. package/dist/src/gradient/Gradient.d.ts.map +1 -1
  118. package/dist/src/gradient/Gradient.min.mjs +4 -4
  119. package/dist/src/gradient/Gradient.min.mjs.map +1 -1
  120. package/dist/src/gradient/Gradient.mjs +6 -2
  121. package/dist/src/gradient/Gradient.mjs.map +1 -1
  122. package/dist/src/gradient/typedefs.d.ts +7 -7
  123. package/dist/src/parser/applyViewboxTransform.d.ts.map +1 -1
  124. package/dist/src/parser/applyViewboxTransform.min.mjs +1 -1
  125. package/dist/src/parser/applyViewboxTransform.min.mjs.map +1 -1
  126. package/dist/src/parser/applyViewboxTransform.mjs +2 -4
  127. package/dist/src/parser/applyViewboxTransform.mjs.map +1 -1
  128. package/dist/src/shapes/ActiveSelection.min.mjs +1 -1
  129. package/dist/src/shapes/ActiveSelection.mjs +1 -1
  130. package/dist/src/shapes/Circle.min.mjs +2 -2
  131. package/dist/src/shapes/Circle.min.mjs.map +1 -1
  132. package/dist/src/shapes/Circle.mjs +1 -1
  133. package/dist/src/shapes/Ellipse.min.mjs +1 -1
  134. package/dist/src/shapes/Ellipse.mjs +1 -1
  135. package/dist/src/shapes/Group.min.mjs +1 -1
  136. package/dist/src/shapes/Group.mjs +1 -1
  137. package/dist/src/shapes/IText/DraggableTextDelegate.min.mjs +1 -1
  138. package/dist/src/shapes/IText/DraggableTextDelegate.mjs +1 -1
  139. package/dist/src/shapes/IText/IText.d.ts.map +1 -1
  140. package/dist/src/shapes/IText/IText.min.mjs +1 -1
  141. package/dist/src/shapes/IText/IText.min.mjs.map +1 -1
  142. package/dist/src/shapes/IText/IText.mjs +3 -3
  143. package/dist/src/shapes/IText/IText.mjs.map +1 -1
  144. package/dist/src/shapes/IText/ITextBehavior.min.mjs +1 -1
  145. package/dist/src/shapes/IText/ITextBehavior.mjs +1 -1
  146. package/dist/src/shapes/IText/ITextClickBehavior.min.mjs +1 -1
  147. package/dist/src/shapes/IText/ITextClickBehavior.mjs +1 -1
  148. package/dist/src/shapes/Image.min.mjs +1 -1
  149. package/dist/src/shapes/Image.mjs +1 -1
  150. package/dist/src/shapes/Line.min.mjs +1 -1
  151. package/dist/src/shapes/Line.mjs +1 -1
  152. package/dist/src/shapes/Object/FabricObjectSVGExportMixin.d.ts.map +1 -1
  153. package/dist/src/shapes/Object/FabricObjectSVGExportMixin.min.mjs +2 -2
  154. package/dist/src/shapes/Object/FabricObjectSVGExportMixin.min.mjs.map +1 -1
  155. package/dist/src/shapes/Object/FabricObjectSVGExportMixin.mjs +11 -26
  156. package/dist/src/shapes/Object/FabricObjectSVGExportMixin.mjs.map +1 -1
  157. package/dist/src/shapes/Object/InteractiveObject.d.ts.map +1 -1
  158. package/dist/src/shapes/Object/InteractiveObject.min.mjs +1 -1
  159. package/dist/src/shapes/Object/InteractiveObject.min.mjs.map +1 -1
  160. package/dist/src/shapes/Object/InteractiveObject.mjs +7 -6
  161. package/dist/src/shapes/Object/InteractiveObject.mjs.map +1 -1
  162. package/dist/src/shapes/Object/Object.min.mjs +1 -1
  163. package/dist/src/shapes/Object/Object.mjs +1 -1
  164. package/dist/src/shapes/Object/ObjectGeometry.d.ts.map +1 -1
  165. package/dist/src/shapes/Object/ObjectGeometry.min.mjs +1 -1
  166. package/dist/src/shapes/Object/ObjectGeometry.min.mjs.map +1 -1
  167. package/dist/src/shapes/Object/ObjectGeometry.mjs +6 -2
  168. package/dist/src/shapes/Object/ObjectGeometry.mjs.map +1 -1
  169. package/dist/src/shapes/Object/types/FabricObjectProps.d.ts +1 -1
  170. package/dist/src/shapes/Path.min.mjs +1 -1
  171. package/dist/src/shapes/Path.mjs +1 -1
  172. package/dist/src/shapes/Polygon.min.mjs +1 -1
  173. package/dist/src/shapes/Polygon.mjs +1 -1
  174. package/dist/src/shapes/Polyline.min.mjs +1 -1
  175. package/dist/src/shapes/Polyline.mjs +1 -1
  176. package/dist/src/shapes/Rect.min.mjs +1 -1
  177. package/dist/src/shapes/Rect.mjs +1 -1
  178. package/dist/src/shapes/Text/StyledText.min.mjs +1 -1
  179. package/dist/src/shapes/Text/StyledText.mjs +1 -1
  180. package/dist/src/shapes/Text/Text.d.ts +4 -4
  181. package/dist/src/shapes/Text/Text.min.mjs +1 -1
  182. package/dist/src/shapes/Text/Text.min.mjs.map +1 -1
  183. package/dist/src/shapes/Text/Text.mjs +3 -3
  184. package/dist/src/shapes/Text/Text.mjs.map +1 -1
  185. package/dist/src/shapes/Text/TextSVGExportMixin.d.ts.map +1 -1
  186. package/dist/src/shapes/Text/TextSVGExportMixin.min.mjs +2 -2
  187. package/dist/src/shapes/Text/TextSVGExportMixin.min.mjs.map +1 -1
  188. package/dist/src/shapes/Text/TextSVGExportMixin.mjs +14 -7
  189. package/dist/src/shapes/Text/TextSVGExportMixin.mjs.map +1 -1
  190. package/dist/src/shapes/Textbox.d.ts.map +1 -1
  191. package/dist/src/shapes/Textbox.min.mjs +2 -2
  192. package/dist/src/shapes/Textbox.min.mjs.map +1 -1
  193. package/dist/src/shapes/Textbox.mjs +2 -3
  194. package/dist/src/shapes/Textbox.mjs.map +1 -1
  195. package/dist/src/shapes/Triangle.min.mjs +1 -1
  196. package/dist/src/shapes/Triangle.mjs +1 -1
  197. package/dist/src/util/animation/AnimationBase.min.mjs +1 -1
  198. package/dist/src/util/animation/AnimationBase.mjs +1 -1
  199. package/dist/src/util/animation/easing.min.mjs +1 -1
  200. package/dist/src/util/animation/easing.min.mjs.map +1 -1
  201. package/dist/src/util/animation/easing.mjs +1 -1
  202. package/dist/src/util/animation/easing.mjs.map +1 -1
  203. package/dist/src/util/internals/applyCanvasTransform.d.ts +1 -1
  204. package/dist/src/util/internals/applyCanvasTransform.min.mjs.map +1 -1
  205. package/dist/src/util/internals/applyCanvasTransform.mjs +1 -1
  206. package/dist/src/util/internals/applyCanvasTransform.mjs.map +1 -1
  207. package/dist/src/util/internals/svgExportCheck.d.ts +4 -0
  208. package/dist/src/util/internals/svgExportCheck.d.ts.map +1 -0
  209. package/dist/src/util/internals/svgExportCheck.min.mjs +2 -0
  210. package/dist/src/util/internals/svgExportCheck.min.mjs.map +1 -0
  211. package/dist/src/util/internals/svgExportCheck.mjs +12 -0
  212. package/dist/src/util/internals/svgExportCheck.mjs.map +1 -0
  213. package/dist/src/util/misc/matrix.d.ts +14 -0
  214. package/dist/src/util/misc/matrix.d.ts.map +1 -1
  215. package/dist/src/util/misc/matrix.min.mjs +1 -1
  216. package/dist/src/util/misc/matrix.min.mjs.map +1 -1
  217. package/dist/src/util/misc/matrix.mjs +15 -1
  218. package/dist/src/util/misc/matrix.mjs.map +1 -1
  219. package/dist/src/util/misc/mergeClipPaths.d.ts +1 -1
  220. package/dist/src/util/misc/mergeClipPaths.min.mjs.map +1 -1
  221. package/dist/src/util/misc/mergeClipPaths.mjs +1 -1
  222. package/dist/src/util/misc/mergeClipPaths.mjs.map +1 -1
  223. package/dist/src/util/misc/objectEnlive.min.mjs.map +1 -1
  224. package/dist/src/util/misc/objectEnlive.mjs +1 -1
  225. package/dist/src/util/misc/objectEnlive.mjs.map +1 -1
  226. package/dist/src/util/misc/projectStroke/StrokeLineJoinProjections.min.mjs +1 -1
  227. package/dist/src/util/misc/projectStroke/StrokeLineJoinProjections.min.mjs.map +1 -1
  228. package/dist/src/util/misc/projectStroke/StrokeLineJoinProjections.mjs +1 -1
  229. package/dist/src/util/misc/svgParsing.d.ts +2 -2
  230. package/dist/src/util/misc/svgParsing.d.ts.map +1 -1
  231. package/dist/src/util/misc/svgParsing.min.mjs +1 -1
  232. package/dist/src/util/misc/svgParsing.min.mjs.map +1 -1
  233. package/dist/src/util/misc/svgParsing.mjs +8 -3
  234. package/dist/src/util/misc/svgParsing.mjs.map +1 -1
  235. package/dist/src/util/path/index.d.ts.map +1 -1
  236. package/dist/src/util/path/index.min.mjs +1 -1
  237. package/dist/src/util/path/index.min.mjs.map +1 -1
  238. package/dist/src/util/path/index.mjs +2 -1
  239. package/dist/src/util/path/index.mjs.map +1 -1
  240. package/dist/src/util/path/regex.min.mjs.map +1 -1
  241. package/dist/src/util/path/regex.mjs +1 -1
  242. package/dist/src/util/path/regex.mjs.map +1 -1
  243. package/dist-extensions/_virtual/{_@oxc-project_runtime@0.122.0 → _@oxc-project_runtime@0.126.0}/helpers/defineProperty.mjs +1 -1
  244. package/{dist/_virtual/_@oxc-project_runtime@0.122.0 → dist-extensions/_virtual/_@oxc-project_runtime@0.126.0}/helpers/toPrimitive.mjs +1 -1
  245. package/dist-extensions/_virtual/{_@oxc-project_runtime@0.122.0 → _@oxc-project_runtime@0.126.0}/helpers/toPropertyKey.mjs +1 -1
  246. package/{dist/_virtual/_@oxc-project_runtime@0.122.0 → dist-extensions/_virtual/_@oxc-project_runtime@0.126.0}/helpers/typeof.mjs +1 -1
  247. package/dist-extensions/aligning_guidelines/index.mjs +1 -1
  248. package/dist-extensions/cropping_controls/croppingHandlers.mjs +1 -7
  249. package/dist-extensions/cropping_controls/croppingHandlers.mjs.map +1 -1
  250. package/dist-extensions/extensions/cropping_controls/croppingHandlers.d.ts.map +1 -1
  251. package/dist-extensions/fabric-extensions.min.js +1 -1
  252. package/dist-extensions/fabric-extensions.min.js.map +1 -1
  253. package/dist-extensions/src/canvas/StaticCanvas.d.ts +1 -1
  254. package/dist-extensions/src/canvas/StaticCanvas.d.ts.map +1 -1
  255. package/dist-extensions/src/gradient/Gradient.d.ts.map +1 -1
  256. package/dist-extensions/src/gradient/typedefs.d.ts +7 -7
  257. package/dist-extensions/src/parser/applyViewboxTransform.d.ts.map +1 -1
  258. package/dist-extensions/src/shapes/IText/IText.d.ts.map +1 -1
  259. package/dist-extensions/src/shapes/Object/FabricObjectSVGExportMixin.d.ts.map +1 -1
  260. package/dist-extensions/src/shapes/Object/InteractiveObject.d.ts.map +1 -1
  261. package/dist-extensions/src/shapes/Object/ObjectGeometry.d.ts.map +1 -1
  262. package/dist-extensions/src/shapes/Object/types/FabricObjectProps.d.ts +1 -1
  263. package/dist-extensions/src/shapes/Text/Text.d.ts +4 -4
  264. package/dist-extensions/src/shapes/Text/TextSVGExportMixin.d.ts.map +1 -1
  265. package/dist-extensions/src/shapes/Textbox.d.ts.map +1 -1
  266. package/dist-extensions/src/util/internals/applyCanvasTransform.d.ts +1 -1
  267. package/dist-extensions/src/util/internals/svgExportCheck.d.ts +4 -0
  268. package/dist-extensions/src/util/internals/svgExportCheck.d.ts.map +1 -0
  269. package/dist-extensions/src/util/misc/matrix.d.ts +14 -0
  270. package/dist-extensions/src/util/misc/matrix.d.ts.map +1 -1
  271. package/dist-extensions/src/util/misc/mergeClipPaths.d.ts +1 -1
  272. package/dist-extensions/src/util/misc/svgParsing.d.ts +2 -2
  273. package/dist-extensions/src/util/misc/svgParsing.d.ts.map +1 -1
  274. package/dist-extensions/src/util/path/index.d.ts.map +1 -1
  275. package/extensions/cropping_controls/croppingHandlers.ts +13 -19
  276. package/package.json +10 -10
  277. package/src/LayoutManager/README.md +3 -3
  278. package/src/canvas/StaticCanvas.spec.ts +19 -0
  279. package/src/canvas/StaticCanvas.ts +7 -3
  280. package/src/filters/Resize.ts +1 -1
  281. package/src/gradient/Gradient.spec.ts +60 -1
  282. package/src/gradient/Gradient.ts +9 -2
  283. package/src/gradient/typedefs.ts +7 -7
  284. package/src/parser/applyViewboxTransform.ts +2 -4
  285. package/src/shapes/IText/IText.ts +1 -2
  286. package/src/shapes/IText/ITextBehavior.test.ts +6 -6
  287. package/src/shapes/Object/FabricObject.spec.ts +3 -2
  288. package/src/shapes/Object/FabricObjectSVGExportMixin.ts +47 -37
  289. package/src/shapes/Object/InteractiveObject.ts +13 -3
  290. package/src/shapes/Object/Object-interactivity.spec.ts +126 -7
  291. package/src/shapes/Object/ObjectGeometry.spec.ts +10 -1
  292. package/src/shapes/Object/ObjectGeometry.ts +10 -3
  293. package/src/shapes/Object/objectSvgExport.spec.ts +27 -0
  294. package/src/shapes/Object/types/FabricObjectProps.ts +1 -1
  295. package/src/shapes/Text/Text.spec.ts +25 -0
  296. package/src/shapes/Text/Text.ts +5 -5
  297. package/src/shapes/Text/TextSVGExportMixin.ts +25 -11
  298. package/src/shapes/Textbox.ts +1 -2
  299. package/src/util/animation/animations.spec.ts +1 -1
  300. package/src/util/animation/easing.ts +1 -1
  301. package/src/util/internals/applyCanvasTransform.ts +1 -1
  302. package/src/util/internals/svgExportCheck.ts +20 -0
  303. package/src/util/misc/matrix.spec.ts +52 -0
  304. package/src/util/misc/matrix.ts +16 -0
  305. package/src/util/misc/mergeClipPaths.ts +1 -1
  306. package/src/util/misc/objectEnlive.ts +1 -1
  307. package/src/util/misc/svgParsing.ts +22 -10
  308. package/src/util/path/index.ts +3 -2
  309. package/src/util/path/regex.ts +1 -1
  310. package/src/util/typeAssertions.spec.ts +1 -1
  311. /package/dist/_virtual/{_@oxc-project_runtime@0.122.0 → _@oxc-project_runtime@0.126.0}/helpers/defineProperty.min.mjs +0 -0
  312. /package/dist/_virtual/{_@oxc-project_runtime@0.122.0 → _@oxc-project_runtime@0.126.0}/helpers/toPrimitive.min.mjs +0 -0
  313. /package/dist/_virtual/{_@oxc-project_runtime@0.122.0 → _@oxc-project_runtime@0.126.0}/helpers/toPropertyKey.min.mjs +0 -0
  314. /package/dist/_virtual/{_@oxc-project_runtime@0.122.0 → _@oxc-project_runtime@0.126.0}/helpers/typeof.min.mjs +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"InteractiveObject.mjs","names":[],"sources":["../../../../src/shapes/Object/InteractiveObject.ts"],"sourcesContent":["import { Point, ZERO } from '../../Point';\nimport type { TCornerPoint, TDegree } from '../../typedefs';\nimport { FabricObject } from './Object';\nimport { degreesToRadians } from '../../util/misc/radiansDegreesConversion';\nimport type { TQrDecomposeOut } from '../../util/misc/matrix';\nimport {\n calcDimensionsMatrix,\n createRotateMatrix,\n createTranslateMatrix,\n multiplyTransformMatrices,\n qrDecompose,\n} from '../../util/misc/matrix';\nimport type { Control } from '../../controls/Control';\nimport { sizeAfterTransform } from '../../util/misc/objectTransforms';\nimport type { ObjectEvents, TPointerEvent } from '../../EventTypeDefs';\nimport type { Canvas } from '../../canvas/Canvas';\nimport type { ControlRenderingStyleOverride } from '../../controls/controlRendering';\nimport type { FabricObjectProps } from './types/FabricObjectProps';\nimport type { TFabricObjectProps, SerializedObjectProps } from './types';\nimport { createObjectDefaultControls } from '../../controls/commonControls';\nimport { interactiveObjectDefaultValues } from './defaultValues';\nimport { SCALE } from '../../constants';\n\nexport type TOCoord = Point & {\n corner: TCornerPoint;\n touchCorner: TCornerPoint;\n};\n\nexport type TControlSet = Record<string, Control>;\n\nexport type TBorderRenderingStyleOverride = Partial<\n Pick<InteractiveFabricObject, 'borderColor' | 'borderDashArray'>\n>;\n\nexport type TStyleOverride = ControlRenderingStyleOverride &\n TBorderRenderingStyleOverride &\n Partial<\n Pick<InteractiveFabricObject, 'hasBorders' | 'hasControls'> & {\n forActiveSelection: boolean;\n }\n >;\n\nexport class InteractiveFabricObject<\n Props extends TFabricObjectProps = Partial<FabricObjectProps>,\n SProps extends SerializedObjectProps = SerializedObjectProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n>\n extends FabricObject<Props, SProps, EventSpec>\n implements FabricObjectProps\n{\n declare noScaleCache: boolean;\n\n declare snapAngle?: TDegree;\n declare snapThreshold?: TDegree;\n\n declare lockMovementX: boolean;\n declare lockMovementY: boolean;\n declare lockRotation: boolean;\n declare lockScalingX: boolean;\n declare lockScalingY: boolean;\n declare lockSkewingX: boolean;\n declare lockSkewingY: boolean;\n declare lockScalingFlip: boolean;\n\n declare cornerSize: number;\n declare touchCornerSize: number;\n declare transparentCorners: boolean;\n declare cornerColor: string;\n declare cornerStrokeColor: string;\n declare cornerStyle: 'rect' | 'circle';\n declare cornerDashArray: number[] | null;\n declare hasControls: boolean;\n\n declare borderColor: string;\n declare borderDashArray: number[] | null;\n declare borderOpacityWhenMoving: number;\n declare borderScaleFactor: number;\n declare hasBorders: boolean;\n declare selectionBackgroundColor: string;\n\n declare selectable: boolean;\n declare evented: boolean;\n declare perPixelTargetFind: boolean;\n declare activeOn: 'down' | 'up';\n\n declare hoverCursor: CSSStyleDeclaration['cursor'] | null;\n declare moveCursor: CSSStyleDeclaration['cursor'] | null;\n\n /**\n * The object's controls' position in viewport coordinates\n * Calculated by {@link Control#positionHandler} and {@link Control#calcCornerCoords}, depending on {@link padding}.\n * `corner/touchCorner` describe the 4 points forming the interactive area of the corner.\n * Used to draw and locate controls.\n */\n declare oCoords: Record<string, TOCoord>;\n\n /**\n * keeps the value of the last hovered corner during mouse move.\n * 0 is no corner, or 'mt', 'ml', 'mtr' etc..\n * It should be private, but there is no harm in using it as\n * a read-only property.\n * this isn't cleaned automatically. Non selected objects may have wrong values\n * @type [string]\n */\n declare __corner?: string;\n\n /**\n * a map of control visibility for this object.\n * this was left when controls were introduced to not break the api too much\n * this takes priority over the generic control visibility\n */\n declare _controlsVisibility: Record<string, boolean>;\n\n /**\n * holds the controls for the object.\n * controls are added by default_controls.js\n */\n declare controls: TControlSet;\n\n /**\n * internal boolean to signal the code that the object is\n * part of the move action.\n */\n declare isMoving?: boolean;\n\n /**\n * A boolean used from the gesture module to keep tracking of a scaling\n * action when there is no scaling transform in place.\n * This is an edge case and is used twice in all codebase.\n * Probably added to keep track of some performance issues\n * @TODO use git blame to investigate why it was added\n * DON'T USE IT. WE WILL TRY TO REMOVE IT\n */\n declare _scaling?: boolean;\n\n declare canvas?: Canvas;\n\n static ownDefaults = interactiveObjectDefaultValues;\n\n static getDefaults(): Record<string, any> {\n return {\n ...super.getDefaults(),\n ...InteractiveFabricObject.ownDefaults,\n };\n }\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor(options?: Props) {\n super();\n Object.assign(\n this,\n (this.constructor as typeof InteractiveFabricObject).createControls(),\n InteractiveFabricObject.ownDefaults,\n );\n this.setOptions(options);\n }\n\n /**\n * Creates the default control object.\n * If you prefer to have on instance of controls shared among all objects\n * make this function return an empty object and add controls to the ownDefaults\n * @param {Object} [options] Options object\n */\n static createControls(): { controls: Record<string, Control> } {\n return { controls: createObjectDefaultControls() };\n }\n\n /**\n * Update width and height of the canvas for cache\n * returns true or false if canvas needed resize.\n * @private\n * @return {Boolean} true if the canvas has been resized\n */\n _updateCacheCanvas() {\n const targetCanvas = this.canvas;\n if (this.noScaleCache && targetCanvas && targetCanvas._currentTransform) {\n const transform = targetCanvas._currentTransform,\n target = transform.target,\n action = transform.action;\n if (\n this === (target as unknown as this) &&\n action &&\n action.startsWith(SCALE)\n ) {\n return false;\n }\n }\n return super._updateCacheCanvas();\n }\n\n getActiveControl() {\n const key = this.__corner;\n return key\n ? {\n key,\n control: this.controls[key],\n coord: this.oCoords[key],\n }\n : undefined;\n }\n\n /**\n * Determines which corner is under the mouse cursor, represented by `pointer`.\n * This function returns a corner only if the object is the active one.\n * This is done to avoid selecting corner of non active object and activating transformations\n * rather than drag action. The default behavior of fabricJS is that if you want to transform\n * an object, first you select it to show the control set\n * @private\n * @param {Object} pointer The pointer indicating the mouse position\n * @param {boolean} forTouch indicates if we are looking for interaction area with a touch action\n * @return {String|Boolean} corner code (tl, tr, bl, br, etc.), or 0 if nothing is found.\n */\n findControl(\n pointer: Point,\n forTouch = false,\n ): { key: string; control: Control; coord: TOCoord } | undefined {\n if (!this.hasControls || !this.canvas) {\n return undefined;\n }\n\n this.__corner = undefined;\n const cornerEntries = Object.entries(this.oCoords);\n for (let i = cornerEntries.length - 1; i >= 0; i--) {\n const [key, corner] = cornerEntries[i];\n const control = this.controls[key];\n\n if (\n control.shouldActivate(\n key,\n this,\n pointer,\n forTouch ? corner.touchCorner : corner.corner,\n )\n ) {\n // this.canvas.contextTop.fillRect(pointer.x - 1, pointer.y - 1, 2, 2);\n this.__corner = key;\n\n return { key, control, coord: this.oCoords[key] };\n }\n }\n\n return undefined;\n }\n\n /**\n * Calculates the coordinates of the center of each control plus the corners of the control itself\n * This basically just delegates to each control positionHandler\n * WARNING: changing what is passed to positionHandler is a breaking change, since position handler\n * is a public api and should be done just if extremely necessary\n * @return {Record<string, TOCoord>}\n */\n calcOCoords(): Record<string, TOCoord> {\n const vpt = this.getViewportTransform(),\n center = this.getCenterPoint(),\n tMatrix = createTranslateMatrix(center.x, center.y),\n rMatrix = createRotateMatrix({\n angle: this.getTotalAngle() - (!!this.group && this.flipX ? 180 : 0),\n }),\n positionMatrix = multiplyTransformMatrices(tMatrix, rMatrix),\n startMatrix = multiplyTransformMatrices(vpt, positionMatrix),\n finalMatrix = multiplyTransformMatrices(startMatrix, [\n 1 / vpt[0],\n 0,\n 0,\n 1 / vpt[3],\n 0,\n 0,\n ]),\n transformOptions = this.group\n ? qrDecompose(this.calcTransformMatrix())\n : undefined;\n // decomposing could bring negative scaling and `_calculateCurrentDimensions` can't take it\n if (transformOptions) {\n transformOptions.scaleX = Math.abs(transformOptions.scaleX);\n transformOptions.scaleY = Math.abs(transformOptions.scaleY);\n }\n const dim = this._calculateCurrentDimensions(transformOptions),\n coords: Record<string, TOCoord> = {};\n\n this.forEachControl((control, key) => {\n const position = control.positionHandler(dim, finalMatrix, this, control);\n // coords[key] are sometimes used as points. Those are points to which we add\n // the property corner and touchCorner from `_calcCornerCoords`.\n // don't remove this assign for an object spread.\n coords[key] = Object.assign(\n position,\n this._calcCornerCoords(control, position),\n );\n });\n\n // debug code\n /*\n const canvas = this.canvas;\n setTimeout(function () {\n if (!canvas) return;\n canvas.contextTop.clearRect(0, 0, 700, 700);\n canvas.contextTop.fillStyle = 'green';\n Object.keys(coords).forEach(function(key) {\n const control = coords[key];\n canvas.contextTop.fillRect(control.x, control.y, 3, 3);\n });\n } 50);\n */\n return coords;\n }\n\n /**\n * Sets the coordinates that determine the interaction area of each control\n * note: if we would switch to ROUND corner area, all of this would disappear.\n * everything would resolve to a single point and a pythagorean theorem for the distance\n * @todo evaluate simplification of code switching to circle interaction area at runtime\n * @private\n */\n private _calcCornerCoords(control: Control, position: Point) {\n const angle = this.getTotalAngle();\n const corner = control.calcCornerCoords(\n angle,\n this.cornerSize,\n position.x,\n position.y,\n false,\n this,\n );\n const touchCorner = control.calcCornerCoords(\n angle,\n this.touchCornerSize,\n position.x,\n position.y,\n true,\n this,\n );\n return { corner, touchCorner };\n }\n\n /**\n * @override set controls' coordinates as well\n * See {@link https://github.com/fabricjs/fabric.js/wiki/When-to-call-setCoords} and {@link https://fabric5.fabricjs.com/fabric-gotchas}\n * @return {void}\n */\n setCoords(): void {\n super.setCoords();\n this.canvas && (this.oCoords = this.calcOCoords());\n }\n\n /**\n * Calls a function for each control. The function gets called,\n * with the control, the control's key and the object that is calling the iterator\n * @param {Function} fn function to iterate over the controls over\n */\n forEachControl(\n fn: (\n control: Control,\n key: string,\n fabricObject: InteractiveFabricObject,\n ) => any,\n ) {\n for (const i in this.controls) {\n fn(this.controls[i], i, this);\n }\n }\n\n /**\n * Draws a colored layer behind the object, inside its selection borders.\n * Requires public options: padding, selectionBackgroundColor\n * this function is called when the context is transformed\n * has checks to be skipped when the object is on a staticCanvas\n * @todo evaluate if make this disappear in favor of a pre-render hook for objects\n * this was added by Andrea Bogazzi to make possible some feature for work reasons\n * it seemed a good option, now is an edge case\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n */\n drawSelectionBackground(ctx: CanvasRenderingContext2D): void {\n if (\n !this.selectionBackgroundColor ||\n (this.canvas && (this.canvas._activeObject as unknown as this) !== this)\n ) {\n return;\n }\n ctx.save();\n const center = this.getRelativeCenterPoint(),\n wh = this._calculateCurrentDimensions(),\n vpt = this.getViewportTransform();\n ctx.translate(center.x, center.y);\n ctx.scale(1 / vpt[0], 1 / vpt[3]);\n ctx.rotate(degreesToRadians(this.angle));\n ctx.fillStyle = this.selectionBackgroundColor;\n ctx.fillRect(-wh.x / 2, -wh.y / 2, wh.x, wh.y);\n ctx.restore();\n }\n\n /**\n * @public override this function in order to customize the drawing of the control box, e.g. rounded corners, different border style.\n * @param {CanvasRenderingContext2D} ctx ctx is rotated and translated so that (0,0) is at object's center\n * @param {Point} size the control box size used\n */\n strokeBorders(ctx: CanvasRenderingContext2D, size: Point): void {\n ctx.strokeRect(-size.x / 2, -size.y / 2, size.x, size.y);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @param {Point} size\n * @param {TStyleOverride} styleOverride object to override the object style\n */\n _drawBorders(\n ctx: CanvasRenderingContext2D,\n size: Point,\n styleOverride: TStyleOverride = {},\n ): void {\n const options = {\n hasControls: this.hasControls,\n borderColor: this.borderColor,\n borderDashArray: this.borderDashArray,\n ...styleOverride,\n };\n ctx.save();\n ctx.strokeStyle = options.borderColor;\n this._setLineDash(ctx, options.borderDashArray);\n this.strokeBorders(ctx, size);\n options.hasControls && this.drawControlsConnectingLines(ctx, size);\n ctx.restore();\n }\n\n /**\n * Renders controls and borders for the object\n * the context here is not transformed\n * @todo move to interactivity\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {TStyleOverride} [styleOverride] properties to override the object style\n */\n _renderControls(\n ctx: CanvasRenderingContext2D,\n styleOverride: TStyleOverride = {},\n ) {\n const { hasBorders, hasControls } = this;\n const styleOptions = {\n hasBorders,\n hasControls,\n ...styleOverride,\n };\n const vpt = this.getViewportTransform(),\n shouldDrawBorders = styleOptions.hasBorders,\n shouldDrawControls = styleOptions.hasControls;\n const matrix = multiplyTransformMatrices(vpt, this.calcTransformMatrix());\n const options = qrDecompose(matrix);\n ctx.save();\n ctx.translate(options.translateX, options.translateY);\n ctx.lineWidth = this.borderScaleFactor; // 1 * this.borderScaleFactor;\n // since interactive groups have been introduced, an object could be inside a group and needing controls\n // the following equality check `this.group === this.parent` covers:\n // object without a group ( undefined === undefined )\n // object inside a group\n // excludes object inside a group but multi selected since group and parent will differ in value\n if (this.group === this.parent) {\n ctx.globalAlpha = this.isMoving ? this.borderOpacityWhenMoving : 1;\n }\n if (this.flipX) {\n options.angle -= 180;\n }\n ctx.rotate(degreesToRadians(this.group ? options.angle : this.angle));\n shouldDrawBorders && this.drawBorders(ctx, options, styleOverride);\n shouldDrawControls && this.drawControls(ctx, styleOverride);\n ctx.restore();\n }\n\n /**\n * Draws borders of an object's bounding box.\n * Requires public properties: width, height\n * Requires public options: padding, borderColor\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @param {object} options object representing current object parameters\n * @param {TStyleOverride} [styleOverride] object to override the object style\n */\n drawBorders(\n ctx: CanvasRenderingContext2D,\n options: TQrDecomposeOut,\n styleOverride: TStyleOverride,\n ): void {\n let size;\n if ((styleOverride && styleOverride.forActiveSelection) || this.group) {\n const bbox = sizeAfterTransform(\n this.width,\n this.height,\n calcDimensionsMatrix(options),\n ),\n stroke = !this.isStrokeAccountedForInDimensions()\n ? (this.strokeUniform\n ? new Point().scalarAdd(this.canvas ? this.canvas.getZoom() : 1)\n : // this is extremely confusing. options comes from the upper function\n // and is the qrDecompose of a matrix that takes in account zoom too\n new Point(options.scaleX, options.scaleY)\n ).scalarMultiply(this.strokeWidth)\n : ZERO;\n size = bbox\n .add(stroke)\n .scalarAdd(this.borderScaleFactor)\n .scalarAdd(this.padding * 2);\n } else {\n size = this._calculateCurrentDimensions().scalarAdd(\n this.borderScaleFactor,\n );\n }\n this._drawBorders(ctx, size, styleOverride);\n }\n\n /**\n * Draws lines from a borders of an object's bounding box to controls that have `withConnection` property set.\n * Requires public properties: width, height\n * Requires public options: padding, borderColor\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @param {Point} size object size x = width, y = height\n */\n drawControlsConnectingLines(\n ctx: CanvasRenderingContext2D,\n size: Point,\n ): void {\n let shouldStroke = false;\n\n ctx.beginPath();\n this.forEachControl((control, key) => {\n // in this moment, the ctx is centered on the object.\n // width and height of the above function are the size of the bbox.\n if (control.withConnection && control.getVisibility(this, key)) {\n // reset movement for each control\n shouldStroke = true;\n ctx.moveTo(control.x * size.x, control.y * size.y);\n ctx.lineTo(\n control.x * size.x + control.offsetX,\n control.y * size.y + control.offsetY,\n );\n }\n });\n shouldStroke && ctx.stroke();\n }\n\n /**\n * Draws corners of an object's bounding box.\n * Requires public properties: width, height\n * Requires public options: cornerSize, padding\n * Be aware that since fabric 6.0 this function does not call setCoords anymore.\n * setCoords needs to be called manually if the object of which we are rendering controls\n * is outside the standard selection and transform process.\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @param {ControlRenderingStyleOverride} styleOverride object to override the object style\n */\n drawControls(\n ctx: CanvasRenderingContext2D,\n styleOverride: ControlRenderingStyleOverride = {},\n ) {\n ctx.save();\n const retinaScaling = this.getCanvasRetinaScaling();\n const { cornerStrokeColor, cornerDashArray, cornerColor } = this;\n const options = {\n cornerStrokeColor,\n cornerDashArray,\n cornerColor,\n ...styleOverride,\n };\n ctx.setTransform(retinaScaling, 0, 0, retinaScaling, 0, 0);\n ctx.strokeStyle = ctx.fillStyle = options.cornerColor;\n if (!this.transparentCorners) {\n ctx.strokeStyle = options.cornerStrokeColor;\n }\n this._setLineDash(ctx, options.cornerDashArray);\n this.forEachControl((control, key) => {\n if (control.getVisibility(this, key)) {\n const p = this.oCoords[key];\n control.render(ctx, p.x, p.y, options, this);\n }\n });\n ctx.restore();\n }\n\n /**\n * Returns true if the specified control is visible, false otherwise.\n * @param {string} controlKey The key of the control. Possible values are usually 'tl', 'tr', 'br', 'bl', 'ml', 'mt', 'mr', 'mb', 'mtr',\n * but since the control api allow for any control name, can be any string.\n * @returns {boolean} true if the specified control is visible, false otherwise\n */\n isControlVisible(controlKey: string): boolean {\n return (\n this.controls[controlKey] &&\n this.controls[controlKey].getVisibility(this, controlKey)\n );\n }\n\n /**\n * Sets the visibility of the specified control.\n * please do not use.\n * @param {String} controlKey The key of the control. Possible values are 'tl', 'tr', 'br', 'bl', 'ml', 'mt', 'mr', 'mb', 'mtr'.\n * but since the control api allow for any control name, can be any string.\n * @param {Boolean} visible true to set the specified control visible, false otherwise\n * @todo discuss this overlap of priority here with the team. Andrea Bogazzi for details\n */\n setControlVisible(controlKey: string, visible: boolean) {\n if (!this._controlsVisibility) {\n this._controlsVisibility = {};\n }\n this._controlsVisibility[controlKey] = visible;\n }\n\n /**\n * Sets the visibility state of object controls, this is just a bulk option for setControlVisible;\n * @param {Record<string, boolean>} [options] with an optional key per control\n * example: {Boolean} [options.bl] true to enable the bottom-left control, false to disable it\n */\n setControlsVisibility(options: Record<string, boolean> = {}) {\n Object.entries(options).forEach(([controlKey, visibility]) =>\n this.setControlVisible(controlKey, visibility),\n );\n }\n\n /**\n * Clears the canvas.contextTop in a specific area that corresponds to the object's bounding box\n * that is in the canvas.contextContainer.\n * This function is used to clear pieces of contextTop where we render ephemeral effects on top of the object.\n * Example: blinking cursor text selection, drag effects.\n * @todo discuss swapping restoreManually with a renderCallback, but think of async issues\n * @param {Boolean} [restoreManually] When true won't restore the context after clear, in order to draw something else.\n * @return {CanvasRenderingContext2D|undefined} canvas.contextTop that is either still transformed\n * with the object transformMatrix, or restored to neutral transform\n */\n clearContextTop(\n restoreManually?: boolean,\n ): CanvasRenderingContext2D | undefined {\n if (!this.canvas) {\n return;\n }\n const ctx = this.canvas.contextTop;\n if (!ctx) {\n return;\n }\n const v = this.canvas.viewportTransform;\n ctx.save();\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n this.transform(ctx);\n // we add 4 pixel, to be sure to do not leave any pixel out\n const width = this.width + 4,\n height = this.height + 4;\n ctx.clearRect(-width / 2, -height / 2, width, height);\n\n restoreManually || ctx.restore();\n return ctx;\n }\n\n /**\n * This callback function is called every time _discardActiveObject or _setActiveObject\n * try to to deselect this object. If the function returns true, the process is cancelled\n * @param {Object} [_options] options sent from the upper functions\n * @param {TPointerEvent} [options.e] event if the process is generated by an event\n * @param {FabricObject} [options.object] next object we are setting as active, and reason why\n * this is being deselected\n */\n onDeselect(_options?: {\n e?: TPointerEvent;\n object?: InteractiveFabricObject;\n }): boolean {\n // implemented by sub-classes, as needed.\n return false;\n }\n\n /**\n * This callback function is called every time _discardActiveObject or _setActiveObject\n * try to to select this object. If the function returns true, the process is cancelled\n * @param {Object} [_options] options sent from the upper functions\n * @param {Event} [_options.e] event if the process is generated by an event\n */\n onSelect(_options?: { e?: TPointerEvent }): boolean {\n // implemented by sub-classes, as needed.\n return false;\n }\n\n /**\n * Override to customize Drag behavior\n * Fired from {@link Canvas#_onMouseMove}\n * @returns true in order for the window to start a drag session\n */\n shouldStartDragging(_e: TPointerEvent) {\n return false;\n }\n\n /**\n * Override to customize Drag behavior\\\n * Fired once a drag session has started\n * @returns true to handle the drag event\n */\n onDragStart(_e: DragEvent) {\n return false;\n }\n\n /**\n * Override to customize drag and drop behavior\n * @public\n * @param {DragEvent} _e\n * @returns {boolean} true if the object currently dragged can be dropped on the target\n */\n canDrop(_e: DragEvent): boolean {\n return false;\n }\n\n /**\n * Override to customize drag and drop behavior\n * render a specific effect when an object is the source of a drag event\n * example: render the selection status for the part of text that is being dragged from a text object\n * @public\n * @param {DragEvent} _e\n */\n renderDragSourceEffect(_e: DragEvent) {\n // for subclasses\n }\n\n /**\n * Override to customize drag and drop behavior\n * render a specific effect when an object is the target of a drag event\n * used to show that the underly object can receive a drop, or to show how the\n * object will change when dropping. example: show the cursor where the text is about to be dropped\n * @public\n * @param {DragEvent} _e\n */\n renderDropTargetEffect(_e: DragEvent) {\n // for subclasses\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"InteractiveObject.mjs","names":[],"sources":["../../../../src/shapes/Object/InteractiveObject.ts"],"sourcesContent":["import { Point, ZERO } from '../../Point';\nimport type { TCornerPoint, TDegree } from '../../typedefs';\nimport { FabricObject } from './Object';\nimport { degreesToRadians } from '../../util/misc/radiansDegreesConversion';\nimport type { TQrDecomposeOut } from '../../util/misc/matrix';\nimport {\n calcDimensionsMatrix,\n calcPlaneRotation,\n calcPlaneZoom,\n calcPlaneScaleY,\n createRotateMatrix,\n createTranslateMatrix,\n multiplyTransformMatrices,\n qrDecompose,\n} from '../../util/misc/matrix';\nimport type { Control } from '../../controls/Control';\nimport { sizeAfterTransform } from '../../util/misc/objectTransforms';\nimport type { ObjectEvents, TPointerEvent } from '../../EventTypeDefs';\nimport type { Canvas } from '../../canvas/Canvas';\nimport type { ControlRenderingStyleOverride } from '../../controls/controlRendering';\nimport type { FabricObjectProps } from './types/FabricObjectProps';\nimport type { TFabricObjectProps, SerializedObjectProps } from './types';\nimport { createObjectDefaultControls } from '../../controls/commonControls';\nimport { interactiveObjectDefaultValues } from './defaultValues';\nimport { SCALE } from '../../constants';\n\nexport type TOCoord = Point & {\n corner: TCornerPoint;\n touchCorner: TCornerPoint;\n};\n\nexport type TControlSet = Record<string, Control>;\n\nexport type TBorderRenderingStyleOverride = Partial<\n Pick<InteractiveFabricObject, 'borderColor' | 'borderDashArray'>\n>;\n\nexport type TStyleOverride = ControlRenderingStyleOverride &\n TBorderRenderingStyleOverride &\n Partial<\n Pick<InteractiveFabricObject, 'hasBorders' | 'hasControls'> & {\n forActiveSelection: boolean;\n }\n >;\n\nexport class InteractiveFabricObject<\n Props extends TFabricObjectProps = Partial<FabricObjectProps>,\n SProps extends SerializedObjectProps = SerializedObjectProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n>\n extends FabricObject<Props, SProps, EventSpec>\n implements FabricObjectProps\n{\n declare noScaleCache: boolean;\n\n declare snapAngle?: TDegree;\n declare snapThreshold?: TDegree;\n\n declare lockMovementX: boolean;\n declare lockMovementY: boolean;\n declare lockRotation: boolean;\n declare lockScalingX: boolean;\n declare lockScalingY: boolean;\n declare lockSkewingX: boolean;\n declare lockSkewingY: boolean;\n declare lockScalingFlip: boolean;\n\n declare cornerSize: number;\n declare touchCornerSize: number;\n declare transparentCorners: boolean;\n declare cornerColor: string;\n declare cornerStrokeColor: string;\n declare cornerStyle: 'rect' | 'circle';\n declare cornerDashArray: number[] | null;\n declare hasControls: boolean;\n\n declare borderColor: string;\n declare borderDashArray: number[] | null;\n declare borderOpacityWhenMoving: number;\n declare borderScaleFactor: number;\n declare hasBorders: boolean;\n declare selectionBackgroundColor: string;\n\n declare selectable: boolean;\n declare evented: boolean;\n declare perPixelTargetFind: boolean;\n declare activeOn: 'down' | 'up';\n\n declare hoverCursor: CSSStyleDeclaration['cursor'] | null;\n declare moveCursor: CSSStyleDeclaration['cursor'] | null;\n\n /**\n * The object's controls' position in viewport coordinates\n * Calculated by {@link Control#positionHandler} and {@link Control#calcCornerCoords}, depending on {@link padding}.\n * `corner/touchCorner` describe the 4 points forming the interactive area of the corner.\n * Used to draw and locate controls.\n */\n declare oCoords: Record<string, TOCoord>;\n\n /**\n * keeps the value of the last hovered corner during mouse move.\n * 0 is no corner, or 'mt', 'ml', 'mtr' etc..\n * It should be private, but there is no harm in using it as\n * a read-only property.\n * this isn't cleaned automatically. Non selected objects may have wrong values\n * @type [string]\n */\n declare __corner?: string;\n\n /**\n * a map of control visibility for this object.\n * this was left when controls were introduced to not break the api too much\n * this takes priority over the generic control visibility\n */\n declare _controlsVisibility: Record<string, boolean>;\n\n /**\n * holds the controls for the object.\n * controls are added by default_controls.js\n */\n declare controls: TControlSet;\n\n /**\n * internal boolean to signal the code that the object is\n * part of the move action.\n */\n declare isMoving?: boolean;\n\n /**\n * A boolean used from the gesture module to keep tracking of a scaling\n * action when there is no scaling transform in place.\n * This is an edge case and is used twice in all codebase.\n * Probably added to keep track of some performance issues\n * @TODO use git blame to investigate why it was added\n * DON'T USE IT. WE WILL TRY TO REMOVE IT\n */\n declare _scaling?: boolean;\n\n declare canvas?: Canvas;\n\n static ownDefaults = interactiveObjectDefaultValues;\n\n static getDefaults(): Record<string, any> {\n return {\n ...super.getDefaults(),\n ...InteractiveFabricObject.ownDefaults,\n };\n }\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor(options?: Props) {\n super();\n Object.assign(\n this,\n (this.constructor as typeof InteractiveFabricObject).createControls(),\n InteractiveFabricObject.ownDefaults,\n );\n this.setOptions(options);\n }\n\n /**\n * Creates the default control object.\n * If you prefer to have on instance of controls shared among all objects\n * make this function return an empty object and add controls to the ownDefaults\n * @param {Object} [options] Options object\n */\n static createControls(): { controls: Record<string, Control> } {\n return { controls: createObjectDefaultControls() };\n }\n\n /**\n * Update width and height of the canvas for cache\n * returns true or false if canvas needed resize.\n * @private\n * @return {Boolean} true if the canvas has been resized\n */\n _updateCacheCanvas() {\n const targetCanvas = this.canvas;\n if (this.noScaleCache && targetCanvas && targetCanvas._currentTransform) {\n const transform = targetCanvas._currentTransform,\n target = transform.target,\n action = transform.action;\n if (\n this === (target as unknown as this) &&\n action &&\n action.startsWith(SCALE)\n ) {\n return false;\n }\n }\n return super._updateCacheCanvas();\n }\n\n getActiveControl() {\n const key = this.__corner;\n return key\n ? {\n key,\n control: this.controls[key],\n coord: this.oCoords[key],\n }\n : undefined;\n }\n\n /**\n * Determines which corner is under the mouse cursor, represented by `pointer`.\n * This function returns a corner only if the object is the active one.\n * This is done to avoid selecting corner of non active object and activating transformations\n * rather than drag action. The default behavior of fabricJS is that if you want to transform\n * an object, first you select it to show the control set\n * @private\n * @param {Object} pointer The pointer indicating the mouse position\n * @param {boolean} forTouch indicates if we are looking for interaction area with a touch action\n * @return {String|Boolean} corner code (tl, tr, bl, br, etc.), or 0 if nothing is found.\n */\n findControl(\n pointer: Point,\n forTouch = false,\n ): { key: string; control: Control; coord: TOCoord } | undefined {\n if (!this.hasControls || !this.canvas) {\n return undefined;\n }\n\n this.__corner = undefined;\n const cornerEntries = Object.entries(this.oCoords);\n for (let i = cornerEntries.length - 1; i >= 0; i--) {\n const [key, corner] = cornerEntries[i];\n const control = this.controls[key];\n\n if (\n control.shouldActivate(\n key,\n this,\n pointer,\n forTouch ? corner.touchCorner : corner.corner,\n )\n ) {\n // this.canvas.contextTop.fillRect(pointer.x - 1, pointer.y - 1, 2, 2);\n this.__corner = key;\n\n return { key, control, coord: this.oCoords[key] };\n }\n }\n\n return undefined;\n }\n\n /**\n * Calculates the coordinates of the center of each control plus the corners of the control itself\n * This basically just delegates to each control positionHandler\n * WARNING: changing what is passed to positionHandler is a breaking change, since position handler\n * is a public api and should be done just if extremely necessary\n * @return {Record<string, TOCoord>}\n */\n calcOCoords(): Record<string, TOCoord> {\n const vpt = this.getViewportTransform(),\n vptScaleX = calcPlaneZoom(vpt),\n vptScaleY = calcPlaneScaleY(vpt),\n center = this.getCenterPoint(),\n tMatrix = createTranslateMatrix(center.x, center.y),\n rMatrix = createRotateMatrix({\n angle: this.getTotalAngle() - (!!this.group && this.flipX ? 180 : 0),\n }),\n positionMatrix = multiplyTransformMatrices(tMatrix, rMatrix),\n startMatrix = multiplyTransformMatrices(vpt, positionMatrix),\n finalMatrix = multiplyTransformMatrices(startMatrix, [\n 1 / vptScaleX,\n 0,\n 0,\n 1 / vptScaleY,\n 0,\n 0,\n ]),\n transformOptions = this.group\n ? qrDecompose(this.calcTransformMatrix())\n : undefined;\n // decomposing could bring negative scaling and `_calculateCurrentDimensions` can't take it\n if (transformOptions) {\n transformOptions.scaleX = Math.abs(transformOptions.scaleX);\n transformOptions.scaleY = Math.abs(transformOptions.scaleY);\n }\n const dim = this._calculateCurrentDimensions(transformOptions),\n coords: Record<string, TOCoord> = {};\n\n this.forEachControl((control, key) => {\n const position = control.positionHandler(dim, finalMatrix, this, control);\n // coords[key] are sometimes used as points. Those are points to which we add\n // the property corner and touchCorner from `_calcCornerCoords`.\n // don't remove this assign for an object spread.\n coords[key] = Object.assign(\n position,\n this._calcCornerCoords(control, position),\n );\n });\n\n // debug code\n /*\n const canvas = this.canvas;\n setTimeout(function () {\n if (!canvas) return;\n canvas.contextTop.clearRect(0, 0, 700, 700);\n canvas.contextTop.fillStyle = 'green';\n Object.keys(coords).forEach(function(key) {\n const control = coords[key];\n canvas.contextTop.fillRect(control.x, control.y, 3, 3);\n });\n } 50);\n */\n return coords;\n }\n\n /**\n * Sets the coordinates that determine the interaction area of each control\n * note: if we would switch to ROUND corner area, all of this would disappear.\n * everything would resolve to a single point and a pythagorean theorem for the distance\n * @todo evaluate simplification of code switching to circle interaction area at runtime\n * @private\n */\n private _calcCornerCoords(control: Control, position: Point) {\n const angle = this.getTotalAngle();\n const corner = control.calcCornerCoords(\n angle,\n this.cornerSize,\n position.x,\n position.y,\n false,\n this,\n );\n const touchCorner = control.calcCornerCoords(\n angle,\n this.touchCornerSize,\n position.x,\n position.y,\n true,\n this,\n );\n return { corner, touchCorner };\n }\n\n /**\n * @override set controls' coordinates as well\n * See {@link https://github.com/fabricjs/fabric.js/wiki/When-to-call-setCoords} and {@link https://fabric5.fabricjs.com/fabric-gotchas}\n * @return {void}\n */\n setCoords(): void {\n super.setCoords();\n this.canvas && (this.oCoords = this.calcOCoords());\n }\n\n /**\n * Calls a function for each control. The function gets called,\n * with the control, the control's key and the object that is calling the iterator\n * @param {Function} fn function to iterate over the controls over\n */\n forEachControl(\n fn: (\n control: Control,\n key: string,\n fabricObject: InteractiveFabricObject,\n ) => any,\n ) {\n for (const i in this.controls) {\n fn(this.controls[i], i, this);\n }\n }\n\n /**\n * Draws a colored layer behind the object, inside its selection borders.\n * Requires public options: padding, selectionBackgroundColor\n * this function is called when the context is transformed\n * has checks to be skipped when the object is on a staticCanvas\n * @todo evaluate if make this disappear in favor of a pre-render hook for objects\n * this was added by Andrea Bogazzi to make possible some feature for work reasons\n * it seemed a good option, now is an edge case\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n */\n drawSelectionBackground(ctx: CanvasRenderingContext2D): void {\n if (\n !this.selectionBackgroundColor ||\n (this.canvas && (this.canvas._activeObject as unknown as this) !== this)\n ) {\n return;\n }\n ctx.save();\n const center = this.getRelativeCenterPoint(),\n wh = this._calculateCurrentDimensions(),\n vpt = this.getViewportTransform();\n ctx.translate(center.x, center.y);\n ctx.scale(1 / vpt[0], 1 / vpt[3]);\n ctx.rotate(degreesToRadians(this.angle));\n ctx.fillStyle = this.selectionBackgroundColor;\n ctx.fillRect(-wh.x / 2, -wh.y / 2, wh.x, wh.y);\n ctx.restore();\n }\n\n /**\n * @public override this function in order to customize the drawing of the control box, e.g. rounded corners, different border style.\n * @param {CanvasRenderingContext2D} ctx ctx is rotated and translated so that (0,0) is at object's center\n * @param {Point} size the control box size used\n */\n strokeBorders(ctx: CanvasRenderingContext2D, size: Point): void {\n ctx.strokeRect(-size.x / 2, -size.y / 2, size.x, size.y);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @param {Point} size\n * @param {TStyleOverride} styleOverride object to override the object style\n */\n _drawBorders(\n ctx: CanvasRenderingContext2D,\n size: Point,\n styleOverride: TStyleOverride = {},\n ): void {\n const options = {\n hasControls: this.hasControls,\n borderColor: this.borderColor,\n borderDashArray: this.borderDashArray,\n ...styleOverride,\n };\n ctx.save();\n ctx.strokeStyle = options.borderColor;\n this._setLineDash(ctx, options.borderDashArray);\n this.strokeBorders(ctx, size);\n options.hasControls && this.drawControlsConnectingLines(ctx, size);\n ctx.restore();\n }\n\n /**\n * Renders controls and borders for the object\n * the context here is not transformed\n * @todo move to interactivity\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {TStyleOverride} [styleOverride] properties to override the object style\n */\n _renderControls(\n ctx: CanvasRenderingContext2D,\n styleOverride: TStyleOverride = {},\n ) {\n const { hasBorders, hasControls } = this;\n const styleOptions = {\n hasBorders,\n hasControls,\n ...styleOverride,\n };\n const vpt = this.getViewportTransform(),\n shouldDrawBorders = styleOptions.hasBorders,\n shouldDrawControls = styleOptions.hasControls;\n const matrix = multiplyTransformMatrices(vpt, this.calcTransformMatrix());\n const options = qrDecompose(matrix);\n ctx.save();\n ctx.translate(options.translateX, options.translateY);\n ctx.lineWidth = this.borderScaleFactor; // 1 * this.borderScaleFactor;\n // since interactive groups have been introduced, an object could be inside a group and needing controls\n // the following equality check `this.group === this.parent` covers:\n // object without a group ( undefined === undefined )\n // object inside a group\n // excludes object inside a group but multi selected since group and parent will differ in value\n if (this.group === this.parent) {\n ctx.globalAlpha = this.isMoving ? this.borderOpacityWhenMoving : 1;\n }\n if (this.flipX) {\n options.angle -= 180;\n }\n const vptAngle = calcPlaneRotation(vpt);\n ctx.rotate(\n this.group\n ? degreesToRadians(options.angle)\n : degreesToRadians(this.angle) + vptAngle,\n );\n shouldDrawBorders && this.drawBorders(ctx, options, styleOverride);\n shouldDrawControls && this.drawControls(ctx, styleOverride);\n ctx.restore();\n }\n\n /**\n * Draws borders of an object's bounding box.\n * Requires public properties: width, height\n * Requires public options: padding, borderColor\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @param {object} options object representing current object parameters\n * @param {TStyleOverride} [styleOverride] object to override the object style\n */\n drawBorders(\n ctx: CanvasRenderingContext2D,\n options: TQrDecomposeOut,\n styleOverride: TStyleOverride,\n ): void {\n let size;\n if ((styleOverride && styleOverride.forActiveSelection) || this.group) {\n const bbox = sizeAfterTransform(\n this.width,\n this.height,\n calcDimensionsMatrix(options),\n ),\n stroke = !this.isStrokeAccountedForInDimensions()\n ? (this.strokeUniform\n ? new Point().scalarAdd(this.canvas ? this.canvas.getZoom() : 1)\n : // this is extremely confusing. options comes from the upper function\n // and is the qrDecompose of a matrix that takes in account zoom too\n new Point(options.scaleX, options.scaleY)\n ).scalarMultiply(this.strokeWidth)\n : ZERO;\n size = bbox\n .add(stroke)\n .scalarAdd(this.borderScaleFactor)\n .scalarAdd(this.padding * 2);\n } else {\n size = this._calculateCurrentDimensions().scalarAdd(\n this.borderScaleFactor,\n );\n }\n this._drawBorders(ctx, size, styleOverride);\n }\n\n /**\n * Draws lines from a borders of an object's bounding box to controls that have `withConnection` property set.\n * Requires public properties: width, height\n * Requires public options: padding, borderColor\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @param {Point} size object size x = width, y = height\n */\n drawControlsConnectingLines(\n ctx: CanvasRenderingContext2D,\n size: Point,\n ): void {\n let shouldStroke = false;\n\n ctx.beginPath();\n this.forEachControl((control, key) => {\n // in this moment, the ctx is centered on the object.\n // width and height of the above function are the size of the bbox.\n if (control.withConnection && control.getVisibility(this, key)) {\n // reset movement for each control\n shouldStroke = true;\n ctx.moveTo(control.x * size.x, control.y * size.y);\n ctx.lineTo(\n control.x * size.x + control.offsetX,\n control.y * size.y + control.offsetY,\n );\n }\n });\n shouldStroke && ctx.stroke();\n }\n\n /**\n * Draws corners of an object's bounding box.\n * Requires public properties: width, height\n * Requires public options: cornerSize, padding\n * Be aware that since fabric 6.0 this function does not call setCoords anymore.\n * setCoords needs to be called manually if the object of which we are rendering controls\n * is outside the standard selection and transform process.\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @param {ControlRenderingStyleOverride} styleOverride object to override the object style\n */\n drawControls(\n ctx: CanvasRenderingContext2D,\n styleOverride: ControlRenderingStyleOverride = {},\n ) {\n ctx.save();\n const retinaScaling = this.getCanvasRetinaScaling();\n const { cornerStrokeColor, cornerDashArray, cornerColor } = this;\n const options = {\n cornerStrokeColor,\n cornerDashArray,\n cornerColor,\n ...styleOverride,\n };\n ctx.setTransform(retinaScaling, 0, 0, retinaScaling, 0, 0);\n ctx.strokeStyle = ctx.fillStyle = options.cornerColor;\n if (!this.transparentCorners) {\n ctx.strokeStyle = options.cornerStrokeColor;\n }\n this._setLineDash(ctx, options.cornerDashArray);\n this.forEachControl((control, key) => {\n if (control.getVisibility(this, key)) {\n const p = this.oCoords[key];\n control.render(ctx, p.x, p.y, options, this);\n }\n });\n ctx.restore();\n }\n\n /**\n * Returns true if the specified control is visible, false otherwise.\n * @param {string} controlKey The key of the control. Possible values are usually 'tl', 'tr', 'br', 'bl', 'ml', 'mt', 'mr', 'mb', 'mtr',\n * but since the control api allow for any control name, can be any string.\n * @returns {boolean} true if the specified control is visible, false otherwise\n */\n isControlVisible(controlKey: string): boolean {\n return (\n this.controls[controlKey] &&\n this.controls[controlKey].getVisibility(this, controlKey)\n );\n }\n\n /**\n * Sets the visibility of the specified control.\n * please do not use.\n * @param {String} controlKey The key of the control. Possible values are 'tl', 'tr', 'br', 'bl', 'ml', 'mt', 'mr', 'mb', 'mtr'.\n * but since the control api allow for any control name, can be any string.\n * @param {Boolean} visible true to set the specified control visible, false otherwise\n * @todo discuss this overlap of priority here with the team. Andrea Bogazzi for details\n */\n setControlVisible(controlKey: string, visible: boolean) {\n if (!this._controlsVisibility) {\n this._controlsVisibility = {};\n }\n this._controlsVisibility[controlKey] = visible;\n }\n\n /**\n * Sets the visibility state of object controls, this is just a bulk option for setControlVisible;\n * @param {Record<string, boolean>} [options] with an optional key per control\n * example: {Boolean} [options.bl] true to enable the bottom-left control, false to disable it\n */\n setControlsVisibility(options: Record<string, boolean> = {}) {\n Object.entries(options).forEach(([controlKey, visibility]) =>\n this.setControlVisible(controlKey, visibility),\n );\n }\n\n /**\n * Clears the canvas.contextTop in a specific area that corresponds to the object's bounding box\n * that is in the canvas.contextContainer.\n * This function is used to clear pieces of contextTop where we render ephemeral effects on top of the object.\n * Example: blinking cursor text selection, drag effects.\n * @todo discuss swapping restoreManually with a renderCallback, but think of async issues\n * @param {Boolean} [restoreManually] When true won't restore the context after clear, in order to draw something else.\n * @return {CanvasRenderingContext2D|undefined} canvas.contextTop that is either still transformed\n * with the object transformMatrix, or restored to neutral transform\n */\n clearContextTop(\n restoreManually?: boolean,\n ): CanvasRenderingContext2D | undefined {\n if (!this.canvas) {\n return;\n }\n const ctx = this.canvas.contextTop;\n if (!ctx) {\n return;\n }\n const v = this.canvas.viewportTransform;\n ctx.save();\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n this.transform(ctx);\n // we add 4 pixel, to be sure to do not leave any pixel out\n const width = this.width + 4,\n height = this.height + 4;\n ctx.clearRect(-width / 2, -height / 2, width, height);\n\n restoreManually || ctx.restore();\n return ctx;\n }\n\n /**\n * This callback function is called every time _discardActiveObject or _setActiveObject\n * try to to deselect this object. If the function returns true, the process is cancelled\n * @param {Object} [_options] options sent from the upper functions\n * @param {TPointerEvent} [options.e] event if the process is generated by an event\n * @param {FabricObject} [options.object] next object we are setting as active, and reason why\n * this is being deselected\n */\n onDeselect(_options?: {\n e?: TPointerEvent;\n object?: InteractiveFabricObject;\n }): boolean {\n // implemented by sub-classes, as needed.\n return false;\n }\n\n /**\n * This callback function is called every time _discardActiveObject or _setActiveObject\n * try to to select this object. If the function returns true, the process is cancelled\n * @param {Object} [_options] options sent from the upper functions\n * @param {Event} [_options.e] event if the process is generated by an event\n */\n onSelect(_options?: { e?: TPointerEvent }): boolean {\n // implemented by sub-classes, as needed.\n return false;\n }\n\n /**\n * Override to customize Drag behavior\n * Fired from {@link Canvas#_onMouseMove}\n * @returns true in order for the window to start a drag session\n */\n shouldStartDragging(_e: TPointerEvent) {\n return false;\n }\n\n /**\n * Override to customize Drag behavior\\\n * Fired once a drag session has started\n * @returns true to handle the drag event\n */\n onDragStart(_e: DragEvent) {\n return false;\n }\n\n /**\n * Override to customize drag and drop behavior\n * @public\n * @param {DragEvent} _e\n * @returns {boolean} true if the object currently dragged can be dropped on the target\n */\n canDrop(_e: DragEvent): boolean {\n return false;\n }\n\n /**\n * Override to customize drag and drop behavior\n * render a specific effect when an object is the source of a drag event\n * example: render the selection status for the part of text that is being dragged from a text object\n * @public\n * @param {DragEvent} _e\n */\n renderDragSourceEffect(_e: DragEvent) {\n // for subclasses\n }\n\n /**\n * Override to customize drag and drop behavior\n * render a specific effect when an object is the target of a drag event\n * used to show that the underly object can receive a drop, or to show how the\n * object will change when dropping. example: show the cursor where the text is about to be dropped\n * @public\n * @param {DragEvent} _e\n */\n renderDropTargetEffect(_e: DragEvent) {\n // for subclasses\n }\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{_defineProperty as e}from"../../../_virtual/_@oxc-project_runtime@0.122.0/helpers/defineProperty.min.mjs";import{config as t}from"../../config.min.mjs";import{log as n}from"../../util/internals/console.min.mjs";import{getDevicePixelRatio as r,getEnv as i}from"../../env/index.min.mjs";import{cache as a}from"../../cache.min.mjs";import{CENTER as o,FILL as s,STROKE as c,VERSION as l,iMatrix as u}from"../../constants.min.mjs";import{classRegistry as d}from"../../ClassRegistry.min.mjs";import{runningAnimations as f}from"../../util/animation/AnimationRegistry.min.mjs";import{Point as p}from"../../Point.min.mjs";import{createCanvasElement as m,createCanvasElementFor as h,toBlob as g,toDataURL as _}from"../../util/misc/dom.min.mjs";import{invertTransform as v,qrDecompose as y}from"../../util/misc/matrix.min.mjs";import{enlivenObjectEnlivables as b}from"../../util/misc/objectEnlive.min.mjs";import{pick as x,pickBy as S}from"../../util/misc/pick.min.mjs";import{toFixed as C}from"../../util/misc/toFixed.min.mjs";import{isFiller as w,isSerializableFiller as T}from"../../util/typeAssertions.min.mjs";import{StaticCanvas as E}from"../../canvas/StaticCanvas.min.mjs";import{resetObjectTransform as D,saveObjectTransform as O}from"../../util/misc/objectTransforms.min.mjs";import{sendObjectToPlane as k}from"../../util/misc/planeChange.min.mjs";import{Shadow as A}from"../../Shadow.min.mjs";import{capValue as j}from"../../util/misc/capValue.min.mjs";import{cacheProperties as M,fabricObjectDefaultValues as N,stateProperties as P}from"./defaultValues.min.mjs";import{animate as F,animateColor as I}from"../../util/animation/animate.min.mjs";import{ObjectGeometry as L}from"./ObjectGeometry.min.mjs";var R=class s extends L{static getDefaults(){return s.ownDefaults}get type(){let e=this.constructor.type;return e===`FabricObject`?`object`:e.toLowerCase()}set type(e){n(`warn`,`Setting type has no effect`,e)}constructor(t){super(),e(this,`_cacheContext`,null),Object.assign(this,s.ownDefaults),this.setOptions(t)}_createCacheCanvas(){this._cacheCanvas=m(),this._cacheContext=this._cacheCanvas.getContext(`2d`),this._updateCacheCanvas(),this.dirty=!0}_limitCacheSize(e){let n=e.width,r=e.height,i=t.maxCacheSideLimit,o=t.minCacheSideLimit;if(n<=i&&r<=i&&n*r<=t.perfLimitSizeTotal)return n<o&&(e.width=o),r<o&&(e.height=o),e;let s=n/r,[c,l]=a.limitDimsByArea(s),u=j(o,c,i),d=j(o,l,i);return n>u&&(e.zoomX/=n/u,e.width=u,e.capped=!0),r>d&&(e.zoomY/=r/d,e.height=d,e.capped=!0),e}_getCacheCanvasDimensions(){let e=this.getTotalObjectScaling(),t=this._getTransformedDimensions({skewX:0,skewY:0}),n=t.x*e.x/this.scaleX,r=t.y*e.y/this.scaleY;return{width:Math.ceil(n+2),height:Math.ceil(r+2),zoomX:e.x,zoomY:e.y,x:n,y:r}}_updateCacheCanvas(){let e=this._cacheCanvas,t=this._cacheContext,{width:n,height:r,zoomX:i,zoomY:a,x:o,y:s}=this._limitCacheSize(this._getCacheCanvasDimensions()),c=n!==e.width||r!==e.height,l=this.zoomX!==i||this.zoomY!==a;if(!e||!t)return!1;if(c||l){n!==e.width||r!==e.height?(e.width=n,e.height=r):(t.setTransform(1,0,0,1,0,0),t.clearRect(0,0,e.width,e.height));let c=o/2,l=s/2;return this.cacheTranslationX=Math.round(e.width/2-c)+c,this.cacheTranslationY=Math.round(e.height/2-l)+l,t.translate(this.cacheTranslationX,this.cacheTranslationY),t.scale(i,a),this.zoomX=i,this.zoomY=a,!0}return!1}setOptions(e={}){this._setOptions(e)}transform(e){let t=this.group&&!this.group._transformDone||this.group&&this.canvas&&e===this.canvas.contextTop,n=this.calcTransformMatrix(!t);e.transform(n[0],n[1],n[2],n[3],n[4],n[5])}getObjectScaling(){if(!this.group)return new p(Math.abs(this.scaleX),Math.abs(this.scaleY));let e=y(this.calcTransformMatrix());return new p(Math.abs(e.scaleX),Math.abs(e.scaleY))}getTotalObjectScaling(){let e=this.getObjectScaling();if(this.canvas){let t=this.canvas.getZoom(),n=this.getCanvasRetinaScaling();return e.scalarMultiply(t*n)}return e}getObjectOpacity(){let e=this.opacity;return this.group&&(e*=this.group.getObjectOpacity()),e}_constrainScale(e){return Math.abs(e)<this.minScaleLimit?e<0?-this.minScaleLimit:this.minScaleLimit:e===0?1e-4:e}_set(e,t){e!==`scaleX`&&e!==`scaleY`||(t=this._constrainScale(t)),e===`scaleX`&&t<0?(this.flipX=!this.flipX,t*=-1):e===`scaleY`&&t<0?(this.flipY=!this.flipY,t*=-1):e!==`shadow`||!t||t instanceof A||(t=new A(t));let n=this[e]!==t;return this[e]=t,n&&this.constructor.cacheProperties.includes(e)&&(this.dirty=!0),this.parent&&(this.dirty||n&&this.constructor.stateProperties.includes(e))&&this.parent._set(`dirty`,!0),this}isNotVisible(){return this.opacity===0||!this.width&&!this.height&&this.strokeWidth===0||!this.visible}render(e){this.isNotVisible()||this.canvas&&this.canvas.skipOffscreen&&!this.group&&!this.isOnScreen()||(e.save(),this._setupCompositeOperation(e),this.drawSelectionBackground(e),this.transform(e),this._setOpacity(e),this._setShadow(e),this.shouldCache()?(this.renderCache(),this.drawCacheOnCanvas(e)):(this._removeCacheCanvas(),this.drawObject(e,!1,{}),this.dirty=!1),e.restore())}drawSelectionBackground(e){}renderCache(e){if(e=e||{},this._cacheCanvas&&this._cacheContext||this._createCacheCanvas(),this.isCacheDirty()&&this._cacheContext){let{zoomX:t,zoomY:n,cacheTranslationX:r,cacheTranslationY:i}=this,{width:a,height:o}=this._cacheCanvas;this.drawObject(this._cacheContext,e.forClipping,{zoomX:t,zoomY:n,cacheTranslationX:r,cacheTranslationY:i,width:a,height:o,parentClipPaths:[]}),this.dirty=!1}}_removeCacheCanvas(){this._cacheCanvas=void 0,this._cacheContext=null}hasStroke(){return!!this.stroke&&this.stroke!==`transparent`&&this.strokeWidth!==0}hasFill(){return!!this.fill&&this.fill!==`transparent`}needsItsOwnCache(){return!!(this.paintFirst===`stroke`&&this.hasFill()&&this.hasStroke()&&this.shadow)||!!this.clipPath}shouldCache(){return this.ownCaching=this.objectCaching&&(!this.parent||!this.parent.isOnACache())||this.needsItsOwnCache(),this.ownCaching}willDrawShadow(){return!!this.shadow&&(this.shadow.offsetX!==0||this.shadow.offsetY!==0)}drawClipPathOnCache(e,t,n){e.save(),t.inverted?e.globalCompositeOperation=`destination-out`:e.globalCompositeOperation=`destination-in`,e.setTransform(1,0,0,1,0,0),e.drawImage(n,0,0),e.restore()}drawObject(e,t,n){let r=this.fill,i=this.stroke;t?(this.fill=`black`,this.stroke=``,this._setClippingProperties(e)):this._renderBackground(e),this.fire(`before:render`,{ctx:e}),this._render(e),this._drawClipPath(e,this.clipPath,n),this.fill=r,this.stroke=i}createClipPathLayer(e,t){let n=h(t),r=n.getContext(`2d`);if(r.translate(t.cacheTranslationX,t.cacheTranslationY),r.scale(t.zoomX,t.zoomY),e._cacheCanvas=n,t.parentClipPaths.forEach(e=>{e.transform(r)}),t.parentClipPaths.push(e),e.absolutePositioned){let e=v(this.calcTransformMatrix());r.transform(e[0],e[1],e[2],e[3],e[4],e[5])}return e.transform(r),e.drawObject(r,!0,t),n}_drawClipPath(e,t,n){if(!t)return;t._transformDone=!0;let r=this.createClipPathLayer(t,n);this.drawClipPathOnCache(e,t,r)}drawCacheOnCanvas(e){e.scale(1/this.zoomX,1/this.zoomY),e.drawImage(this._cacheCanvas,-this.cacheTranslationX,-this.cacheTranslationY)}isCacheDirty(e=!1){if(this.isNotVisible())return!1;let t=this._cacheCanvas,n=this._cacheContext;return!(!t||!n||e||!this._updateCacheCanvas())||!!(this.dirty||this.clipPath&&this.clipPath.absolutePositioned)&&(t&&n&&!e&&(n.save(),n.setTransform(1,0,0,1,0,0),n.clearRect(0,0,t.width,t.height),n.restore()),!0)}_renderBackground(e){if(!this.backgroundColor)return;let t=this._getNonTransformedDimensions();e.fillStyle=this.backgroundColor,e.fillRect(-t.x/2,-t.y/2,t.x,t.y),this._removeShadow(e)}_setOpacity(e){this.group&&!this.group._transformDone?e.globalAlpha=this.getObjectOpacity():e.globalAlpha*=this.opacity}_setStrokeStyles(e,t){let n=t.stroke;n&&(e.lineWidth=t.strokeWidth,e.lineCap=t.strokeLineCap,e.lineDashOffset=t.strokeDashOffset,e.lineJoin=t.strokeLineJoin,e.miterLimit=t.strokeMiterLimit,w(n)?n.gradientUnits===`percentage`||n.gradientTransform||n.patternTransform?this._applyPatternForTransformedGradient(e,n):(e.strokeStyle=n.toLive(e),this._applyPatternGradientTransform(e,n)):e.strokeStyle=t.stroke)}_setFillStyles(e,{fill:t}){t&&(w(t)?(e.fillStyle=t.toLive(e),this._applyPatternGradientTransform(e,t)):e.fillStyle=t)}_setClippingProperties(e){e.globalAlpha=1,e.strokeStyle=`transparent`,e.fillStyle=`#000000`}_setLineDash(e,t){t&&t.length!==0&&e.setLineDash(t)}_setShadow(e){if(!this.shadow)return;let n=this.shadow,r=this.canvas,i=this.getCanvasRetinaScaling(),[a,,,o]=(r==null?void 0:r.viewportTransform)||u,s=a*i,c=o*i,l=n.nonScaling?new p(1,1):this.getObjectScaling();e.shadowColor=n.color,e.shadowBlur=n.blur*t.browserShadowBlurConstant*(s+c)*(l.x+l.y)/4,e.shadowOffsetX=n.offsetX*s*l.x,e.shadowOffsetY=n.offsetY*c*l.y}_removeShadow(e){this.shadow&&(e.shadowColor=``,e.shadowBlur=e.shadowOffsetX=e.shadowOffsetY=0)}_applyPatternGradientTransform(e,t){if(!w(t))return{offsetX:0,offsetY:0};let n=t.gradientTransform||t.patternTransform,r=-this.width/2+t.offsetX||0,i=-this.height/2+t.offsetY||0;return t.gradientUnits===`percentage`?e.transform(this.width,0,0,this.height,r,i):e.transform(1,0,0,1,r,i),n&&e.transform(n[0],n[1],n[2],n[3],n[4],n[5]),{offsetX:r,offsetY:i}}_renderPaintInOrder(e){this.paintFirst===`stroke`?(this._renderStroke(e),this._renderFill(e)):(this._renderFill(e),this._renderStroke(e))}_render(e){}_renderFill(e){this.fill&&(e.save(),this._setFillStyles(e,this),this.fillRule===`evenodd`?e.fill(`evenodd`):e.fill(),e.restore())}_renderStroke(e){if(this.stroke&&this.strokeWidth!==0){if(this.shadow&&!this.shadow.affectStroke&&this._removeShadow(e),e.save(),this.strokeUniform){let t=this.getObjectScaling();e.scale(1/t.x,1/t.y)}this._setLineDash(e,this.strokeDashArray),this._setStrokeStyles(e,this),e.stroke(),e.restore()}}_applyPatternForTransformedGradient(e,t){var n;let r=this._limitCacheSize(this._getCacheCanvasDimensions()),i=this.getCanvasRetinaScaling(),a=r.x/this.scaleX/i,o=r.y/this.scaleY/i,s=h({width:Math.ceil(a),height:Math.ceil(o)}),c=s.getContext(`2d`);c&&(c.beginPath(),c.moveTo(0,0),c.lineTo(a,0),c.lineTo(a,o),c.lineTo(0,o),c.closePath(),c.translate(a/2,o/2),c.scale(r.zoomX/this.scaleX/i,r.zoomY/this.scaleY/i),this._applyPatternGradientTransform(c,t),c.fillStyle=t.toLive(e),c.fill(),e.translate(-this.width/2-this.strokeWidth/2,-this.height/2-this.strokeWidth/2),e.scale(i*this.scaleX/r.zoomX,i*this.scaleY/r.zoomY),e.strokeStyle=(n=c.createPattern(s,`no-repeat`))==null?``:n)}_findCenterFromElement(){return new p(this.left+this.width/2,this.top+this.height/2)}clone(e){let t=this.toObject(e);return this.constructor.fromObject(t)}cloneAsImage(e){let t=this.toCanvasElement(e);return new(d.getClass(`image`))(t)}toCanvasElement(e={}){let t=O(this),n=this.group,i=this.shadow,a=Math.abs,s=e.enableRetinaScaling?r():1,c=(e.multiplier||1)*s,l=e.canvasProvider||(e=>new E(e,{enableRetinaScaling:!1,renderOnAddRemove:!1,skipOffscreen:!1}));delete this.group,e.withoutTransform&&D(this),e.withoutShadow&&(this.shadow=null),e.viewportTransform&&k(this,this.getViewportTransform()),this.setCoords();let u=m(),d=this.getBoundingRect(),f=this.shadow,h=new p;if(f){let e=f.blur,t=f.nonScaling?new p(1,1):this.getObjectScaling();h.x=2*Math.round(a(f.offsetX)+e)*a(t.x),h.y=2*Math.round(a(f.offsetY)+e)*a(t.y)}let g=d.width+h.x,_=d.height+h.y;u.width=Math.ceil(g),u.height=Math.ceil(_);let v=l(u);e.format===`jpeg`&&(v.backgroundColor=`#fff`),this.setPositionByOrigin(new p(v.width/2,v.height/2),o,o);let y=this.canvas;v._objects=[this],this.set(`canvas`,v),this.setCoords();let b=v.toCanvasElement(c||1,e);return this.set(`canvas`,y),this.shadow=i,n&&(this.group=n),this.set(t),this.setCoords(),v._objects=[],v.destroy(),b}toDataURL(e={}){return _(this.toCanvasElement(e),e.format||`png`,e.quality||1)}toBlob(e={}){return g(this.toCanvasElement(e),e.format||`png`,e.quality||1)}isType(...e){return e.includes(this.constructor.type)||e.includes(this.type)}complexity(){return 1}toJSON(){return this.toObject()}rotate(e){let{centeredRotation:t,originX:n,originY:r}=this;if(t){let{x:e,y:t}=this.getRelativeCenterPoint();this.originX=o,this.originY=o,this.left=e,this.top=t}if(this.set(`angle`,e),t){let{x:e,y:t}=this.getPositionByOrigin(n,r);this.left=e,this.top=t,this.originX=n,this.originY=r}}setOnGroup(){}_setupCompositeOperation(e){this.globalCompositeOperation&&(e.globalCompositeOperation=this.globalCompositeOperation)}dispose(){f.cancelByTarget(this),this.off(),this._set(`canvas`,void 0),this._cacheCanvas&&i().dispose(this._cacheCanvas),this._cacheCanvas=void 0,this._cacheContext=null}animate(e,t){return Object.entries(e).reduce((e,[n,r])=>(e[n]=this._animate(n,r,t),e),{})}_animate(e,t,n={}){let r=e.split(`.`),i=this.constructor.colorProperties.includes(r[r.length-1]),{abort:a,startValue:o,onChange:s,onComplete:c}=n,l={...n,target:this,startValue:o==null?r.reduce((e,t)=>e[t],this):o,endValue:t,abort:a==null?void 0:a.bind(this),onChange:(e,t,n)=>{r.reduce((t,n,i)=>(i===r.length-1&&(t[n]=e),t[n]),this),s&&s(e,t,n)},onComplete:(e,t,n)=>{this.setCoords(),c&&c(e,t,n)}};return i?I(l):F(l)}isDescendantOf(e){let{parent:t,group:n}=this;return t===e||n===e||!!t&&t.isDescendantOf(e)||!!n&&n!==t&&n.isDescendantOf(e)}getAncestors(){let e=[],t=this;do t=t.parent,t&&e.push(t);while(t);return e}findCommonAncestors(e){if(this===e)return{fork:[],otherFork:[],common:[this,...this.getAncestors()]};let t=this.getAncestors(),n=e.getAncestors();if(t.length===0&&n.length>0&&this===n[n.length-1])return{fork:[],otherFork:[e,...n.slice(0,n.length-1)],common:[this]};for(let r,i=0;i<t.length;i++){if(r=t[i],r===e)return{fork:[this,...t.slice(0,i)],otherFork:[],common:t.slice(i)};for(let a=0;a<n.length;a++){if(this===n[a])return{fork:[],otherFork:[e,...n.slice(0,a)],common:[this,...t]};if(r===n[a])return{fork:[this,...t.slice(0,i)],otherFork:[e,...n.slice(0,a)],common:t.slice(i)}}}return{fork:[this,...t],otherFork:[e,...n],common:[]}}hasCommonAncestors(e){let t=this.findCommonAncestors(e);return t&&!!t.common.length}isInFrontOf(e){if(this===e)return;let t=this.findCommonAncestors(e);if(t.fork.includes(e))return!0;if(t.otherFork.includes(this))return!1;let n=t.common[0]||this.canvas;if(!n)return;let r=t.fork.pop(),i=t.otherFork.pop(),a=n._objects.indexOf(r),o=n._objects.indexOf(i);return a>-1&&a>o}toObject(e=[]){let n=e.concat(s.customProperties,this.constructor.customProperties||[]),r,i=t.NUM_FRACTION_DIGITS,{clipPath:a,fill:o,stroke:c,shadow:u,strokeDashArray:d,left:f,top:p,originX:m,originY:h,width:g,height:_,strokeWidth:v,strokeLineCap:y,strokeDashOffset:b,strokeLineJoin:S,strokeUniform:w,strokeMiterLimit:E,scaleX:D,scaleY:O,angle:k,flipX:A,flipY:j,opacity:M,visible:N,backgroundColor:P,fillRule:F,paintFirst:I,globalCompositeOperation:L,skewX:R,skewY:z}=this;a&&!a.excludeFromExport&&(r=a.toObject(n.concat(`inverted`,`absolutePositioned`)));let B=e=>C(e,i),V={...x(this,n),type:this.constructor.type,version:l,originX:m,originY:h,left:B(f),top:B(p),width:B(g),height:B(_),fill:T(o)?o.toObject():o,stroke:T(c)?c.toObject():c,strokeWidth:B(v),strokeDashArray:d&&d.concat(),strokeLineCap:y,strokeDashOffset:b,strokeLineJoin:S,strokeUniform:w,strokeMiterLimit:B(E),scaleX:B(D),scaleY:B(O),angle:B(k),flipX:A,flipY:j,opacity:B(M),shadow:u&&u.toObject(),visible:N,backgroundColor:P,fillRule:F,paintFirst:I,globalCompositeOperation:L,skewX:B(R),skewY:B(z),...r?{clipPath:r}:null};return this.includeDefaultValues?V:this._removeDefaultValues(V)}toDatalessObject(e){return this.toObject(e)}_removeDefaultValues(e){let t=this.constructor.getDefaults(),n=Object.keys(t).length>0?t:Object.getPrototypeOf(this);return S(e,(e,t)=>{if(t===`left`||t===`top`||t===`type`)return!0;let r=n[t];return e!==r&&!(Array.isArray(e)&&Array.isArray(r)&&e.length===0&&r.length===0)})}toString(){return`#<${this.constructor.type}>`}static _fromObject({type:e,...t},{extraParam:n,...r}={}){return b(t,r).then(e=>n?(delete e[n],new this(t[n],e)):new this(e))}static fromObject(e,t){return this._fromObject(e,t)}};e(R,`stateProperties`,P),e(R,`cacheProperties`,M),e(R,`ownDefaults`,N),e(R,`type`,`FabricObject`),e(R,`colorProperties`,[s,c,`backgroundColor`]),e(R,`customProperties`,[]),d.setClass(R),d.setClass(R,`object`);export{R as FabricObject};
1
+ import{_defineProperty as e}from"../../../_virtual/_@oxc-project_runtime@0.126.0/helpers/defineProperty.min.mjs";import{config as t}from"../../config.min.mjs";import{log as n}from"../../util/internals/console.min.mjs";import{getDevicePixelRatio as r,getEnv as i}from"../../env/index.min.mjs";import{cache as a}from"../../cache.min.mjs";import{CENTER as o,FILL as s,STROKE as c,VERSION as l,iMatrix as u}from"../../constants.min.mjs";import{classRegistry as d}from"../../ClassRegistry.min.mjs";import{runningAnimations as f}from"../../util/animation/AnimationRegistry.min.mjs";import{Point as p}from"../../Point.min.mjs";import{createCanvasElement as m,createCanvasElementFor as h,toBlob as g,toDataURL as _}from"../../util/misc/dom.min.mjs";import{invertTransform as v,qrDecompose as y}from"../../util/misc/matrix.min.mjs";import{enlivenObjectEnlivables as b}from"../../util/misc/objectEnlive.min.mjs";import{pick as x,pickBy as S}from"../../util/misc/pick.min.mjs";import{toFixed as C}from"../../util/misc/toFixed.min.mjs";import{isFiller as w,isSerializableFiller as T}from"../../util/typeAssertions.min.mjs";import{StaticCanvas as E}from"../../canvas/StaticCanvas.min.mjs";import{resetObjectTransform as D,saveObjectTransform as O}from"../../util/misc/objectTransforms.min.mjs";import{sendObjectToPlane as k}from"../../util/misc/planeChange.min.mjs";import{Shadow as A}from"../../Shadow.min.mjs";import{capValue as j}from"../../util/misc/capValue.min.mjs";import{cacheProperties as M,fabricObjectDefaultValues as N,stateProperties as P}from"./defaultValues.min.mjs";import{animate as F,animateColor as I}from"../../util/animation/animate.min.mjs";import{ObjectGeometry as L}from"./ObjectGeometry.min.mjs";var R=class s extends L{static getDefaults(){return s.ownDefaults}get type(){let e=this.constructor.type;return e===`FabricObject`?`object`:e.toLowerCase()}set type(e){n(`warn`,`Setting type has no effect`,e)}constructor(t){super(),e(this,`_cacheContext`,null),Object.assign(this,s.ownDefaults),this.setOptions(t)}_createCacheCanvas(){this._cacheCanvas=m(),this._cacheContext=this._cacheCanvas.getContext(`2d`),this._updateCacheCanvas(),this.dirty=!0}_limitCacheSize(e){let n=e.width,r=e.height,i=t.maxCacheSideLimit,o=t.minCacheSideLimit;if(n<=i&&r<=i&&n*r<=t.perfLimitSizeTotal)return n<o&&(e.width=o),r<o&&(e.height=o),e;let s=n/r,[c,l]=a.limitDimsByArea(s),u=j(o,c,i),d=j(o,l,i);return n>u&&(e.zoomX/=n/u,e.width=u,e.capped=!0),r>d&&(e.zoomY/=r/d,e.height=d,e.capped=!0),e}_getCacheCanvasDimensions(){let e=this.getTotalObjectScaling(),t=this._getTransformedDimensions({skewX:0,skewY:0}),n=t.x*e.x/this.scaleX,r=t.y*e.y/this.scaleY;return{width:Math.ceil(n+2),height:Math.ceil(r+2),zoomX:e.x,zoomY:e.y,x:n,y:r}}_updateCacheCanvas(){let e=this._cacheCanvas,t=this._cacheContext,{width:n,height:r,zoomX:i,zoomY:a,x:o,y:s}=this._limitCacheSize(this._getCacheCanvasDimensions()),c=n!==e.width||r!==e.height,l=this.zoomX!==i||this.zoomY!==a;if(!e||!t)return!1;if(c||l){n!==e.width||r!==e.height?(e.width=n,e.height=r):(t.setTransform(1,0,0,1,0,0),t.clearRect(0,0,e.width,e.height));let c=o/2,l=s/2;return this.cacheTranslationX=Math.round(e.width/2-c)+c,this.cacheTranslationY=Math.round(e.height/2-l)+l,t.translate(this.cacheTranslationX,this.cacheTranslationY),t.scale(i,a),this.zoomX=i,this.zoomY=a,!0}return!1}setOptions(e={}){this._setOptions(e)}transform(e){let t=this.group&&!this.group._transformDone||this.group&&this.canvas&&e===this.canvas.contextTop,n=this.calcTransformMatrix(!t);e.transform(n[0],n[1],n[2],n[3],n[4],n[5])}getObjectScaling(){if(!this.group)return new p(Math.abs(this.scaleX),Math.abs(this.scaleY));let e=y(this.calcTransformMatrix());return new p(Math.abs(e.scaleX),Math.abs(e.scaleY))}getTotalObjectScaling(){let e=this.getObjectScaling();if(this.canvas){let t=this.canvas.getZoom(),n=this.getCanvasRetinaScaling();return e.scalarMultiply(t*n)}return e}getObjectOpacity(){let e=this.opacity;return this.group&&(e*=this.group.getObjectOpacity()),e}_constrainScale(e){return Math.abs(e)<this.minScaleLimit?e<0?-this.minScaleLimit:this.minScaleLimit:e===0?1e-4:e}_set(e,t){e!==`scaleX`&&e!==`scaleY`||(t=this._constrainScale(t)),e===`scaleX`&&t<0?(this.flipX=!this.flipX,t*=-1):e===`scaleY`&&t<0?(this.flipY=!this.flipY,t*=-1):e!==`shadow`||!t||t instanceof A||(t=new A(t));let n=this[e]!==t;return this[e]=t,n&&this.constructor.cacheProperties.includes(e)&&(this.dirty=!0),this.parent&&(this.dirty||n&&this.constructor.stateProperties.includes(e))&&this.parent._set(`dirty`,!0),this}isNotVisible(){return this.opacity===0||!this.width&&!this.height&&this.strokeWidth===0||!this.visible}render(e){this.isNotVisible()||this.canvas&&this.canvas.skipOffscreen&&!this.group&&!this.isOnScreen()||(e.save(),this._setupCompositeOperation(e),this.drawSelectionBackground(e),this.transform(e),this._setOpacity(e),this._setShadow(e),this.shouldCache()?(this.renderCache(),this.drawCacheOnCanvas(e)):(this._removeCacheCanvas(),this.drawObject(e,!1,{}),this.dirty=!1),e.restore())}drawSelectionBackground(e){}renderCache(e){if(e=e||{},this._cacheCanvas&&this._cacheContext||this._createCacheCanvas(),this.isCacheDirty()&&this._cacheContext){let{zoomX:t,zoomY:n,cacheTranslationX:r,cacheTranslationY:i}=this,{width:a,height:o}=this._cacheCanvas;this.drawObject(this._cacheContext,e.forClipping,{zoomX:t,zoomY:n,cacheTranslationX:r,cacheTranslationY:i,width:a,height:o,parentClipPaths:[]}),this.dirty=!1}}_removeCacheCanvas(){this._cacheCanvas=void 0,this._cacheContext=null}hasStroke(){return!!this.stroke&&this.stroke!==`transparent`&&this.strokeWidth!==0}hasFill(){return!!this.fill&&this.fill!==`transparent`}needsItsOwnCache(){return!!(this.paintFirst===`stroke`&&this.hasFill()&&this.hasStroke()&&this.shadow)||!!this.clipPath}shouldCache(){return this.ownCaching=this.objectCaching&&(!this.parent||!this.parent.isOnACache())||this.needsItsOwnCache(),this.ownCaching}willDrawShadow(){return!!this.shadow&&(this.shadow.offsetX!==0||this.shadow.offsetY!==0)}drawClipPathOnCache(e,t,n){e.save(),t.inverted?e.globalCompositeOperation=`destination-out`:e.globalCompositeOperation=`destination-in`,e.setTransform(1,0,0,1,0,0),e.drawImage(n,0,0),e.restore()}drawObject(e,t,n){let r=this.fill,i=this.stroke;t?(this.fill=`black`,this.stroke=``,this._setClippingProperties(e)):this._renderBackground(e),this.fire(`before:render`,{ctx:e}),this._render(e),this._drawClipPath(e,this.clipPath,n),this.fill=r,this.stroke=i}createClipPathLayer(e,t){let n=h(t),r=n.getContext(`2d`);if(r.translate(t.cacheTranslationX,t.cacheTranslationY),r.scale(t.zoomX,t.zoomY),e._cacheCanvas=n,t.parentClipPaths.forEach(e=>{e.transform(r)}),t.parentClipPaths.push(e),e.absolutePositioned){let e=v(this.calcTransformMatrix());r.transform(e[0],e[1],e[2],e[3],e[4],e[5])}return e.transform(r),e.drawObject(r,!0,t),n}_drawClipPath(e,t,n){if(!t)return;t._transformDone=!0;let r=this.createClipPathLayer(t,n);this.drawClipPathOnCache(e,t,r)}drawCacheOnCanvas(e){e.scale(1/this.zoomX,1/this.zoomY),e.drawImage(this._cacheCanvas,-this.cacheTranslationX,-this.cacheTranslationY)}isCacheDirty(e=!1){if(this.isNotVisible())return!1;let t=this._cacheCanvas,n=this._cacheContext;return!(!t||!n||e||!this._updateCacheCanvas())||!!(this.dirty||this.clipPath&&this.clipPath.absolutePositioned)&&(t&&n&&!e&&(n.save(),n.setTransform(1,0,0,1,0,0),n.clearRect(0,0,t.width,t.height),n.restore()),!0)}_renderBackground(e){if(!this.backgroundColor)return;let t=this._getNonTransformedDimensions();e.fillStyle=this.backgroundColor,e.fillRect(-t.x/2,-t.y/2,t.x,t.y),this._removeShadow(e)}_setOpacity(e){this.group&&!this.group._transformDone?e.globalAlpha=this.getObjectOpacity():e.globalAlpha*=this.opacity}_setStrokeStyles(e,t){let n=t.stroke;n&&(e.lineWidth=t.strokeWidth,e.lineCap=t.strokeLineCap,e.lineDashOffset=t.strokeDashOffset,e.lineJoin=t.strokeLineJoin,e.miterLimit=t.strokeMiterLimit,w(n)?n.gradientUnits===`percentage`||n.gradientTransform||n.patternTransform?this._applyPatternForTransformedGradient(e,n):(e.strokeStyle=n.toLive(e),this._applyPatternGradientTransform(e,n)):e.strokeStyle=t.stroke)}_setFillStyles(e,{fill:t}){t&&(w(t)?(e.fillStyle=t.toLive(e),this._applyPatternGradientTransform(e,t)):e.fillStyle=t)}_setClippingProperties(e){e.globalAlpha=1,e.strokeStyle=`transparent`,e.fillStyle=`#000000`}_setLineDash(e,t){t&&t.length!==0&&e.setLineDash(t)}_setShadow(e){if(!this.shadow)return;let n=this.shadow,r=this.canvas,i=this.getCanvasRetinaScaling(),[a,,,o]=(r==null?void 0:r.viewportTransform)||u,s=a*i,c=o*i,l=n.nonScaling?new p(1,1):this.getObjectScaling();e.shadowColor=n.color,e.shadowBlur=n.blur*t.browserShadowBlurConstant*(s+c)*(l.x+l.y)/4,e.shadowOffsetX=n.offsetX*s*l.x,e.shadowOffsetY=n.offsetY*c*l.y}_removeShadow(e){this.shadow&&(e.shadowColor=``,e.shadowBlur=e.shadowOffsetX=e.shadowOffsetY=0)}_applyPatternGradientTransform(e,t){if(!w(t))return{offsetX:0,offsetY:0};let n=t.gradientTransform||t.patternTransform,r=-this.width/2+t.offsetX||0,i=-this.height/2+t.offsetY||0;return t.gradientUnits===`percentage`?e.transform(this.width,0,0,this.height,r,i):e.transform(1,0,0,1,r,i),n&&e.transform(n[0],n[1],n[2],n[3],n[4],n[5]),{offsetX:r,offsetY:i}}_renderPaintInOrder(e){this.paintFirst===`stroke`?(this._renderStroke(e),this._renderFill(e)):(this._renderFill(e),this._renderStroke(e))}_render(e){}_renderFill(e){this.fill&&(e.save(),this._setFillStyles(e,this),this.fillRule===`evenodd`?e.fill(`evenodd`):e.fill(),e.restore())}_renderStroke(e){if(this.stroke&&this.strokeWidth!==0){if(this.shadow&&!this.shadow.affectStroke&&this._removeShadow(e),e.save(),this.strokeUniform){let t=this.getObjectScaling();e.scale(1/t.x,1/t.y)}this._setLineDash(e,this.strokeDashArray),this._setStrokeStyles(e,this),e.stroke(),e.restore()}}_applyPatternForTransformedGradient(e,t){var n;let r=this._limitCacheSize(this._getCacheCanvasDimensions()),i=this.getCanvasRetinaScaling(),a=r.x/this.scaleX/i,o=r.y/this.scaleY/i,s=h({width:Math.ceil(a),height:Math.ceil(o)}),c=s.getContext(`2d`);c&&(c.beginPath(),c.moveTo(0,0),c.lineTo(a,0),c.lineTo(a,o),c.lineTo(0,o),c.closePath(),c.translate(a/2,o/2),c.scale(r.zoomX/this.scaleX/i,r.zoomY/this.scaleY/i),this._applyPatternGradientTransform(c,t),c.fillStyle=t.toLive(e),c.fill(),e.translate(-this.width/2-this.strokeWidth/2,-this.height/2-this.strokeWidth/2),e.scale(i*this.scaleX/r.zoomX,i*this.scaleY/r.zoomY),e.strokeStyle=(n=c.createPattern(s,`no-repeat`))==null?``:n)}_findCenterFromElement(){return new p(this.left+this.width/2,this.top+this.height/2)}clone(e){let t=this.toObject(e);return this.constructor.fromObject(t)}cloneAsImage(e){let t=this.toCanvasElement(e);return new(d.getClass(`image`))(t)}toCanvasElement(e={}){let t=O(this),n=this.group,i=this.shadow,a=Math.abs,s=e.enableRetinaScaling?r():1,c=(e.multiplier||1)*s,l=e.canvasProvider||(e=>new E(e,{enableRetinaScaling:!1,renderOnAddRemove:!1,skipOffscreen:!1}));delete this.group,e.withoutTransform&&D(this),e.withoutShadow&&(this.shadow=null),e.viewportTransform&&k(this,this.getViewportTransform()),this.setCoords();let u=m(),d=this.getBoundingRect(),f=this.shadow,h=new p;if(f){let e=f.blur,t=f.nonScaling?new p(1,1):this.getObjectScaling();h.x=2*Math.round(a(f.offsetX)+e)*a(t.x),h.y=2*Math.round(a(f.offsetY)+e)*a(t.y)}let g=d.width+h.x,_=d.height+h.y;u.width=Math.ceil(g),u.height=Math.ceil(_);let v=l(u);e.format===`jpeg`&&(v.backgroundColor=`#fff`),this.setPositionByOrigin(new p(v.width/2,v.height/2),o,o);let y=this.canvas;v._objects=[this],this.set(`canvas`,v),this.setCoords();let b=v.toCanvasElement(c||1,e);return this.set(`canvas`,y),this.shadow=i,n&&(this.group=n),this.set(t),this.setCoords(),v._objects=[],v.destroy(),b}toDataURL(e={}){return _(this.toCanvasElement(e),e.format||`png`,e.quality||1)}toBlob(e={}){return g(this.toCanvasElement(e),e.format||`png`,e.quality||1)}isType(...e){return e.includes(this.constructor.type)||e.includes(this.type)}complexity(){return 1}toJSON(){return this.toObject()}rotate(e){let{centeredRotation:t,originX:n,originY:r}=this;if(t){let{x:e,y:t}=this.getRelativeCenterPoint();this.originX=o,this.originY=o,this.left=e,this.top=t}if(this.set(`angle`,e),t){let{x:e,y:t}=this.getPositionByOrigin(n,r);this.left=e,this.top=t,this.originX=n,this.originY=r}}setOnGroup(){}_setupCompositeOperation(e){this.globalCompositeOperation&&(e.globalCompositeOperation=this.globalCompositeOperation)}dispose(){f.cancelByTarget(this),this.off(),this._set(`canvas`,void 0),this._cacheCanvas&&i().dispose(this._cacheCanvas),this._cacheCanvas=void 0,this._cacheContext=null}animate(e,t){return Object.entries(e).reduce((e,[n,r])=>(e[n]=this._animate(n,r,t),e),{})}_animate(e,t,n={}){let r=e.split(`.`),i=this.constructor.colorProperties.includes(r[r.length-1]),{abort:a,startValue:o,onChange:s,onComplete:c}=n,l={...n,target:this,startValue:o==null?r.reduce((e,t)=>e[t],this):o,endValue:t,abort:a==null?void 0:a.bind(this),onChange:(e,t,n)=>{r.reduce((t,n,i)=>(i===r.length-1&&(t[n]=e),t[n]),this),s&&s(e,t,n)},onComplete:(e,t,n)=>{this.setCoords(),c&&c(e,t,n)}};return i?I(l):F(l)}isDescendantOf(e){let{parent:t,group:n}=this;return t===e||n===e||!!t&&t.isDescendantOf(e)||!!n&&n!==t&&n.isDescendantOf(e)}getAncestors(){let e=[],t=this;do t=t.parent,t&&e.push(t);while(t);return e}findCommonAncestors(e){if(this===e)return{fork:[],otherFork:[],common:[this,...this.getAncestors()]};let t=this.getAncestors(),n=e.getAncestors();if(t.length===0&&n.length>0&&this===n[n.length-1])return{fork:[],otherFork:[e,...n.slice(0,n.length-1)],common:[this]};for(let r,i=0;i<t.length;i++){if(r=t[i],r===e)return{fork:[this,...t.slice(0,i)],otherFork:[],common:t.slice(i)};for(let a=0;a<n.length;a++){if(this===n[a])return{fork:[],otherFork:[e,...n.slice(0,a)],common:[this,...t]};if(r===n[a])return{fork:[this,...t.slice(0,i)],otherFork:[e,...n.slice(0,a)],common:t.slice(i)}}}return{fork:[this,...t],otherFork:[e,...n],common:[]}}hasCommonAncestors(e){let t=this.findCommonAncestors(e);return t&&!!t.common.length}isInFrontOf(e){if(this===e)return;let t=this.findCommonAncestors(e);if(t.fork.includes(e))return!0;if(t.otherFork.includes(this))return!1;let n=t.common[0]||this.canvas;if(!n)return;let r=t.fork.pop(),i=t.otherFork.pop(),a=n._objects.indexOf(r),o=n._objects.indexOf(i);return a>-1&&a>o}toObject(e=[]){let n=e.concat(s.customProperties,this.constructor.customProperties||[]),r,i=t.NUM_FRACTION_DIGITS,{clipPath:a,fill:o,stroke:c,shadow:u,strokeDashArray:d,left:f,top:p,originX:m,originY:h,width:g,height:_,strokeWidth:v,strokeLineCap:y,strokeDashOffset:b,strokeLineJoin:S,strokeUniform:w,strokeMiterLimit:E,scaleX:D,scaleY:O,angle:k,flipX:A,flipY:j,opacity:M,visible:N,backgroundColor:P,fillRule:F,paintFirst:I,globalCompositeOperation:L,skewX:R,skewY:z}=this;a&&!a.excludeFromExport&&(r=a.toObject(n.concat(`inverted`,`absolutePositioned`)));let B=e=>C(e,i),V={...x(this,n),type:this.constructor.type,version:l,originX:m,originY:h,left:B(f),top:B(p),width:B(g),height:B(_),fill:T(o)?o.toObject():o,stroke:T(c)?c.toObject():c,strokeWidth:B(v),strokeDashArray:d&&d.concat(),strokeLineCap:y,strokeDashOffset:b,strokeLineJoin:S,strokeUniform:w,strokeMiterLimit:B(E),scaleX:B(D),scaleY:B(O),angle:B(k),flipX:A,flipY:j,opacity:B(M),shadow:u&&u.toObject(),visible:N,backgroundColor:P,fillRule:F,paintFirst:I,globalCompositeOperation:L,skewX:B(R),skewY:B(z),...r?{clipPath:r}:null};return this.includeDefaultValues?V:this._removeDefaultValues(V)}toDatalessObject(e){return this.toObject(e)}_removeDefaultValues(e){let t=this.constructor.getDefaults(),n=Object.keys(t).length>0?t:Object.getPrototypeOf(this);return S(e,(e,t)=>{if(t===`left`||t===`top`||t===`type`)return!0;let r=n[t];return e!==r&&!(Array.isArray(e)&&Array.isArray(r)&&e.length===0&&r.length===0)})}toString(){return`#<${this.constructor.type}>`}static _fromObject({type:e,...t},{extraParam:n,...r}={}){return b(t,r).then(e=>n?(delete e[n],new this(t[n],e)):new this(e))}static fromObject(e,t){return this._fromObject(e,t)}};e(R,`stateProperties`,P),e(R,`cacheProperties`,M),e(R,`ownDefaults`,N),e(R,`type`,`FabricObject`),e(R,`colorProperties`,[s,c,`backgroundColor`]),e(R,`customProperties`,[]),d.setClass(R),d.setClass(R,`object`);export{R as FabricObject};
2
2
  //# sourceMappingURL=Object.min.mjs.map
@@ -1,4 +1,4 @@
1
- import { _defineProperty } from "../../../_virtual/_@oxc-project_runtime@0.122.0/helpers/defineProperty.mjs";
1
+ import { _defineProperty } from "../../../_virtual/_@oxc-project_runtime@0.126.0/helpers/defineProperty.mjs";
2
2
  import { config } from "../../config.mjs";
3
3
  import { log } from "../../util/internals/console.mjs";
4
4
  import { getDevicePixelRatio, getEnv } from "../../env/index.mjs";
@@ -1 +1 @@
1
- {"version":3,"file":"ObjectGeometry.d.ts","sourceRoot":"","sources":["../../../../src/shapes/Object/ObjectGeometry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ObjectGeometry.d.ts","sourceRoot":"","sources":["../../../../src/shapes/Object/ObjectGeometry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,KAAK,EACL,YAAY,EACZ,OAAO,EACP,MAAM,EACN,QAAQ,EACR,QAAQ,EACT,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAcpC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAItC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAG/D,KAAK,YAAY,GAAG;IAClB,GAAG,EAAE,MAAM,EAAE,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,KAAK,QAAQ,GAAG,YAAY,CAAC;AAE7B,qBAAa,cAAc,CAAC,SAAS,SAAS,YAAY,GAAG,YAAY,CACvE,SAAQ,aAAa,CAAC,SAAS,CAC/B,YACE,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,EAC7B,SAAS,EACT,IAAI,CAAC,eAAe,EAAE,aAAa,GAAG,eAAe,CAAC;IAIhD,OAAO,EAAE,MAAM,CAAC;IAExB;;;;;;;OAOG;IACK,OAAO,EAAE,QAAQ,CAAC;IAE1B;;OAEG;IACK,cAAc,CAAC,EAAE,YAAY,CAAC;IAEtC;;OAEG;IACK,WAAW,CAAC,EAAE,YAAY,CAAC;IAEnC;;;;;OAKG;IACK,MAAM,CAAC,EAAE,YAAY,GAAG,MAAM,CAAC;IAEvC;;OAEG;IACH,IAAI,IAAI,MAAM;IAId;;OAEG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM;IAIlB;;OAEG;IACH,IAAI,IAAI,MAAM;IAId;;OAEG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM;IAIlB;;;OAGG;IACH,YAAY,IAAI,MAAM;IAItB;;;OAGG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM;IAI1B;;;OAGG;IACH,YAAY,IAAI,MAAM;IAItB;;;OAGG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM;IAI1B;;OAEG;IACH,KAAK,IAAI,KAAK;IAOd;;;;;;;;;OASG;IACH,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,QAAQ;IAU1D;;OAEG;IACH,aAAa,IAAI,KAAK;IAItB;;;;;OAKG;IACH,aAAa,CACX,KAAK,EAAE,KAAK,EACZ,OAAO,GAAE,QAAuB,EAChC,OAAO,GAAE,QAAuB;IAKlC;;OAEG;IACH,SAAS,CAAC,gCAAgC;IAI1C;;OAEG;IACH,SAAS,IAAI,KAAK,EAAE;IAWpB;;OAEG;IACH,kBAAkB,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,GAAG,OAAO;IASjD;;;;OAIG;IACH,oBAAoB,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO;IAcpD;;;;OAIG;IACH,uBAAuB,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO;IAKvD;;OAEG;IACH,qBAAqB,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,GAAG,OAAO;IAUpD,aAAa,CAAC,CAAC,SAAS,cAAc,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO;IAQ1D;;;;OAIG;IACH,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO;IAIpC;;;;OAIG;IACH,UAAU,IAAI,OAAO;IA0BrB;;;OAGG;IACH,mBAAmB,IAAI,OAAO;IAiB9B;;;;OAIG;IACH,eAAe,IAAI,KAAK;IAIxB;;;;OAIG;IACH,cAAc,IAAI,MAAM;IAIxB;;;;OAIG;IACH,eAAe,IAAI,MAAM;IAIzB;;;;OAIG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAM1B;;;;OAIG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM;IAO1B;;;;OAIG;IACH,aAAa,CAAC,KAAK,EAAE,MAAM;IAO3B,sBAAsB;IAItB;;;OAGG;IACH,aAAa,IAAI,OAAO;IAMxB;;;OAGG;IACH,oBAAoB,IAAI,MAAM;IAI9B;;;;OAIG;IACH,WAAW,IAAI,YAAY;IAiB3B;;;;OAIG;IACH,SAAS,IAAI,IAAI;IAIjB,kBAAkB,CAAC,SAAS,UAAQ,GAAG,MAAM,EAAE;IAyB/C;;;;;;OAMG;IACH,mBAAmB,CAAC,SAAS,UAAQ,GAAG,MAAM;IAuB9C;;;;OAIG;IACH,aAAa,IAAI,MAAM;IA0BvB;;;;OAIG;IACH,4BAA4B,IAAI,KAAK;IAIrC;;;;;;OAMG;IACH,2BAA2B,CAAC,OAAO,CAAC,EAAE,GAAG,GAAG,KAAK;IAazC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACtB;;SAEK;IACG,OAAO,EAAE,QAAQ,CAAC;IAC1B;;SAEK;IACG,OAAO,EAAE,QAAQ,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,OAAO,CAAC;IAE/B;;;OAGG;IACK,KAAK,CAAC,EAAE,KAAK,CAAC;IAEtB;;;;;;;;;;OAUG;IACH,yBAAyB,CAAC,OAAO,GAAE,GAAQ,GAAG,KAAK;IA4CnD;;;;;;;;OAQG;IACH,sBAAsB,CACpB,KAAK,EAAE,KAAK,EACZ,WAAW,EAAE,QAAQ,EACrB,WAAW,EAAE,QAAQ,EACrB,SAAS,EAAE,QAAQ,EACnB,SAAS,EAAE,QAAQ,GAClB,KAAK;IAeR;;;;;;OAMG;IACH,sBAAsB,CACpB,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,QAAQ,EACjB,OAAO,EAAE,QAAQ,GAChB,KAAK;IAiBR;;;;;;OAMG;IACH,sBAAsB,CACpB,MAAM,EAAE,KAAK,EACb,OAAO,EAAE,QAAQ,EACjB,OAAO,EAAE,QAAQ,GAChB,KAAK;IAcR;;;OAGG;IACH,cAAc,IAAI,KAAK;IAOvB;;;OAGG;IACH,sBAAsB,IAAI,KAAK;IAQ/B;;;OAGG;IACH,gBAAgB,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,GAAG,KAAK;IAI7D;;;;;;;;;;;OAWG;IACH,mBAAmB,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ;IAQxD;;;;;;OAMG;IACH,mBAAmB,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ;IAUpE;;OAEG;IACH,iBAAiB;IAIjB;;;;OAIG;IACH,iBAAiB,CAAC,CAAC,EAAE,KAAK;CAG3B"}
@@ -1,2 +1,2 @@
1
- import{CENTER as e,LEFT as t,SCALE_X as n,SCALE_Y as r,iMatrix as i}from"../../constants.min.mjs";import{Point as a}from"../../Point.min.mjs";import{CommonMethods as o}from"../../CommonMethods.min.mjs";import{degreesToRadians as s,radiansToDegrees as c}from"../../util/misc/radiansDegreesConversion.min.mjs";import{calcDimensionsMatrix as l,calcPlaneRotation as u,composeMatrix as d,createRotateMatrix as f,createTranslateMatrix as p,invertTransform as m,multiplyTransformMatrices as h,transformPoint as g}from"../../util/misc/matrix.min.mjs";import{makeBoundingBoxFromPoints as _}from"../../util/misc/boundingBoxFromPoints.min.mjs";import{sizeAfterTransform as v}from"../../util/misc/objectTransforms.min.mjs";import{resolveOrigin as y}from"../../util/misc/resolveOrigin.min.mjs";import{Intersection as b}from"../../Intersection.min.mjs";var x=class extends o{getX(){return this.getXY().x}setX(e){this.setXY(this.getXY().setX(e))}getY(){return this.getXY().y}setY(e){this.setXY(this.getXY().setY(e))}getRelativeX(){return this.left}setRelativeX(e){this.left=e}getRelativeY(){return this.top}setRelativeY(e){this.top=e}getXY(){let e=this.getRelativeXY();return this.group?g(e,this.group.calcTransformMatrix()):e}setXY(e,t,n){this.group&&(e=g(e,m(this.group.calcTransformMatrix()))),this.setRelativeXY(e,t,n)}getRelativeXY(){return new a(this.left,this.top)}setRelativeXY(e,t=this.originX,n=this.originY){this.setPositionByOrigin(e,t,n)}isStrokeAccountedForInDimensions(){return!1}getCoords(){let{tl:e,tr:t,br:n,bl:r}=this.aCoords||(this.aCoords=this.calcACoords()),i=[e,t,n,r];if(this.group){let e=this.group.calcTransformMatrix();return i.map(t=>g(t,e))}return i}intersectsWithRect(e,t){return b.intersectPolygonRectangle(this.getCoords(),e,t).status===`Intersection`}intersectsWithObject(e){let t=b.intersectPolygonPolygon(this.getCoords(),e.getCoords());return t.status===`Intersection`||t.status===`Coincident`||e.isContainedWithinObject(this)||this.isContainedWithinObject(e)}isContainedWithinObject(e){return this.getCoords().every(t=>e.containsPoint(t))}isContainedWithinRect(e,t){let{left:n,top:r,width:i,height:a}=this.getBoundingRect();return n>=e.x&&n+i<=t.x&&r>=e.y&&r+a<=t.y}isOverlapping(e){return this.intersectsWithObject(e)||this.isContainedWithinObject(e)||e.isContainedWithinObject(this)}containsPoint(e){return b.isPointInPolygon(e,this.getCoords())}isOnScreen(){if(!this.canvas)return!1;let{tl:e,br:t}=this.canvas.vptCoords;return!!this.getCoords().some(n=>n.x<=t.x&&n.x>=e.x&&n.y<=t.y&&n.y>=e.y)||!!this.intersectsWithRect(e,t)||this.containsPoint(e.midPointFrom(t))}isPartiallyOnScreen(){if(!this.canvas)return!1;let{tl:e,br:t}=this.canvas.vptCoords;return!!this.intersectsWithRect(e,t)||this.getCoords().every(n=>(n.x>=t.x||n.x<=e.x)&&(n.y>=t.y||n.y<=e.y))&&this.containsPoint(e.midPointFrom(t))}getBoundingRect(){return _(this.getCoords())}getScaledWidth(){return this._getTransformedDimensions().x}getScaledHeight(){return this._getTransformedDimensions().y}scale(e){this._set(n,e),this._set(r,e),this.setCoords()}scaleToWidth(e){let t=this.getBoundingRect().width/this.getScaledWidth();return this.scale(e/this.width/t)}scaleToHeight(e){let t=this.getBoundingRect().height/this.getScaledHeight();return this.scale(e/this.height/t)}getCanvasRetinaScaling(){var e;return((e=this.canvas)==null?void 0:e.getRetinaScaling())||1}getTotalAngle(){return this.group?c(u(this.calcTransformMatrix())):this.angle}getViewportTransform(){var e;return((e=this.canvas)==null?void 0:e.viewportTransform)||i.concat()}calcACoords(){let e=f({angle:this.angle}),{x:t,y:n}=this.getRelativeCenterPoint(),r=h(p(t,n),e),i=this._getTransformedDimensions(),a=i.x/2,o=i.y/2;return{tl:g({x:-a,y:-o},r),tr:g({x:a,y:-o},r),bl:g({x:-a,y:o},r),br:g({x:a,y:o},r)}}setCoords(){this.aCoords=this.calcACoords()}transformMatrixKey(e=!1){let t=[];return!e&&this.group&&(t=this.group.transformMatrixKey(e)),t.push(this.top,this.left,this.width,this.height,this.scaleX,this.scaleY,this.angle,this.strokeWidth,this.skewX,this.skewY,+this.flipX,+this.flipY,y(this.originX),y(this.originY)),t}calcTransformMatrix(e=!1){let t=this.calcOwnMatrix();if(e||!this.group)return t;let n=this.transformMatrixKey(e),r=this.matrixCache;return r&&r.key.every((e,t)=>e===n[t])?r.value:(this.group&&(t=h(this.group.calcTransformMatrix(!1),t)),this.matrixCache={key:n,value:t},t)}calcOwnMatrix(){let e=this.transformMatrixKey(!0),t=this.ownMatrixCache;if(t&&t.key.every((t,n)=>t===e[n]))return t.value;let n=this.getRelativeCenterPoint(),r=d({angle:this.angle,translateX:n.x,translateY:n.y,scaleX:this.scaleX,scaleY:this.scaleY,skewX:this.skewX,skewY:this.skewY,flipX:this.flipX,flipY:this.flipY});return this.ownMatrixCache={key:e,value:r},r}_getNonTransformedDimensions(){return new a(this.width,this.height).scalarAdd(this.strokeWidth)}_calculateCurrentDimensions(e){return this._getTransformedDimensions(e).transform(this.getViewportTransform(),!0).scalarAdd(2*this.padding)}_getTransformedDimensions(e={}){let t={scaleX:this.scaleX,scaleY:this.scaleY,skewX:this.skewX,skewY:this.skewY,width:this.width,height:this.height,strokeWidth:this.strokeWidth,...e},n=t.strokeWidth,r=n,i=0;this.strokeUniform&&(r=0,i=n);let o=t.width+r,s=t.height+r,c;return c=t.skewX===0&&t.skewY===0?new a(o*t.scaleX,s*t.scaleY):v(o,s,l(t)),c.scalarAdd(i)}translateToGivenOrigin(e,t,n,r,i){let o=e.x,s=e.y,c=y(r)-y(t),l=y(i)-y(n);if(c||l){let e=this._getTransformedDimensions();o+=c*e.x,s+=l*e.y}return new a(o,s)}translateToCenterPoint(t,n,r){if(n===`center`&&r===`center`)return t;let i=this.translateToGivenOrigin(t,n,r,e,e);return this.angle?i.rotate(s(this.angle),t):i}translateToOriginPoint(t,n,r){let i=this.translateToGivenOrigin(t,e,e,n,r);return this.angle?i.rotate(s(this.angle),t):i}getCenterPoint(){let e=this.getRelativeCenterPoint();return this.group?g(e,this.group.calcTransformMatrix()):e}getRelativeCenterPoint(){return this.translateToCenterPoint(new a(this.left,this.top),this.originX,this.originY)}getPointByOrigin(e,t){return this.getPositionByOrigin(e,t)}getPositionByOrigin(e,t){return this.translateToOriginPoint(this.getRelativeCenterPoint(),e,t)}setPositionByOrigin(e,t,n){let r=this.translateToCenterPoint(e,t,n),i=this.translateToOriginPoint(r,this.originX,this.originY);this.set({left:i.x,top:i.y})}_getLeftTopCoords(){return this.getPositionByOrigin(t,`top`)}positionByLeftTop(e){return this.setPositionByOrigin(e,t,`top`)}};export{x as ObjectGeometry};
1
+ import{CENTER as e,LEFT as t,SCALE_X as n,SCALE_Y as r,iMatrix as i}from"../../constants.min.mjs";import{Point as a}from"../../Point.min.mjs";import{CommonMethods as o}from"../../CommonMethods.min.mjs";import{degreesToRadians as s,radiansToDegrees as c}from"../../util/misc/radiansDegreesConversion.min.mjs";import{calcDimensionsMatrix as l,calcPlaneRotation as u,calcPlaneScaleY as d,calcPlaneZoom as f,composeMatrix as p,createRotateMatrix as m,createTranslateMatrix as h,invertTransform as g,multiplyTransformMatrices as _,transformPoint as v}from"../../util/misc/matrix.min.mjs";import{makeBoundingBoxFromPoints as y}from"../../util/misc/boundingBoxFromPoints.min.mjs";import{sizeAfterTransform as b}from"../../util/misc/objectTransforms.min.mjs";import{resolveOrigin as x}from"../../util/misc/resolveOrigin.min.mjs";import{Intersection as S}from"../../Intersection.min.mjs";var C=class extends o{getX(){return this.getXY().x}setX(e){this.setXY(this.getXY().setX(e))}getY(){return this.getXY().y}setY(e){this.setXY(this.getXY().setY(e))}getRelativeX(){return this.left}setRelativeX(e){this.left=e}getRelativeY(){return this.top}setRelativeY(e){this.top=e}getXY(){let e=this.getRelativeXY();return this.group?v(e,this.group.calcTransformMatrix()):e}setXY(e,t,n){this.group&&(e=v(e,g(this.group.calcTransformMatrix()))),this.setRelativeXY(e,t,n)}getRelativeXY(){return new a(this.left,this.top)}setRelativeXY(e,t=this.originX,n=this.originY){this.setPositionByOrigin(e,t,n)}isStrokeAccountedForInDimensions(){return!1}getCoords(){let{tl:e,tr:t,br:n,bl:r}=this.aCoords||(this.aCoords=this.calcACoords()),i=[e,t,n,r];if(this.group){let e=this.group.calcTransformMatrix();return i.map(t=>v(t,e))}return i}intersectsWithRect(e,t){return S.intersectPolygonRectangle(this.getCoords(),e,t).status===`Intersection`}intersectsWithObject(e){let t=S.intersectPolygonPolygon(this.getCoords(),e.getCoords());return t.status===`Intersection`||t.status===`Coincident`||e.isContainedWithinObject(this)||this.isContainedWithinObject(e)}isContainedWithinObject(e){return this.getCoords().every(t=>e.containsPoint(t))}isContainedWithinRect(e,t){let{left:n,top:r,width:i,height:a}=this.getBoundingRect();return n>=e.x&&n+i<=t.x&&r>=e.y&&r+a<=t.y}isOverlapping(e){return this.intersectsWithObject(e)||this.isContainedWithinObject(e)||e.isContainedWithinObject(this)}containsPoint(e){return S.isPointInPolygon(e,this.getCoords())}isOnScreen(){if(!this.canvas)return!1;let{tl:e,br:t}=this.canvas.vptCoords;return!!this.getCoords().some(n=>n.x<=t.x&&n.x>=e.x&&n.y<=t.y&&n.y>=e.y)||!!this.intersectsWithRect(e,t)||this.containsPoint(e.midPointFrom(t))}isPartiallyOnScreen(){if(!this.canvas)return!1;let{tl:e,br:t}=this.canvas.vptCoords;return!!this.intersectsWithRect(e,t)||this.getCoords().every(n=>(n.x>=t.x||n.x<=e.x)&&(n.y>=t.y||n.y<=e.y))&&this.containsPoint(e.midPointFrom(t))}getBoundingRect(){return y(this.getCoords())}getScaledWidth(){return this._getTransformedDimensions().x}getScaledHeight(){return this._getTransformedDimensions().y}scale(e){this._set(n,e),this._set(r,e),this.setCoords()}scaleToWidth(e){let t=this.getBoundingRect().width/this.getScaledWidth();return this.scale(e/this.width/t)}scaleToHeight(e){let t=this.getBoundingRect().height/this.getScaledHeight();return this.scale(e/this.height/t)}getCanvasRetinaScaling(){var e;return((e=this.canvas)==null?void 0:e.getRetinaScaling())||1}getTotalAngle(){return this.group?c(u(this.calcTransformMatrix())):this.angle}getViewportTransform(){var e;return((e=this.canvas)==null?void 0:e.viewportTransform)||i.concat()}calcACoords(){let e=m({angle:this.angle}),{x:t,y:n}=this.getRelativeCenterPoint(),r=_(h(t,n),e),i=this._getTransformedDimensions(),a=i.x/2,o=i.y/2;return{tl:v({x:-a,y:-o},r),tr:v({x:a,y:-o},r),bl:v({x:-a,y:o},r),br:v({x:a,y:o},r)}}setCoords(){this.aCoords=this.calcACoords()}transformMatrixKey(e=!1){let t=[];return!e&&this.group&&(t=this.group.transformMatrixKey(e)),t.push(this.top,this.left,this.width,this.height,this.scaleX,this.scaleY,this.angle,this.strokeWidth,this.skewX,this.skewY,+this.flipX,+this.flipY,x(this.originX),x(this.originY)),t}calcTransformMatrix(e=!1){let t=this.calcOwnMatrix();if(e||!this.group)return t;let n=this.transformMatrixKey(e),r=this.matrixCache;return r&&r.key.every((e,t)=>e===n[t])?r.value:(this.group&&(t=_(this.group.calcTransformMatrix(!1),t)),this.matrixCache={key:n,value:t},t)}calcOwnMatrix(){let e=this.transformMatrixKey(!0),t=this.ownMatrixCache;if(t&&t.key.every((t,n)=>t===e[n]))return t.value;let n=this.getRelativeCenterPoint(),r=p({angle:this.angle,translateX:n.x,translateY:n.y,scaleX:this.scaleX,scaleY:this.scaleY,skewX:this.skewX,skewY:this.skewY,flipX:this.flipX,flipY:this.flipY});return this.ownMatrixCache={key:e,value:r},r}_getNonTransformedDimensions(){return new a(this.width,this.height).scalarAdd(this.strokeWidth)}_calculateCurrentDimensions(e){var t;let n=(t=this.canvas)==null?void 0:t.viewportTransform,r=this._getTransformedDimensions(e);return n?r.multiply(new a(f(n),d(n))).scalarAdd(2*this.padding):r.scalarAdd(2*this.padding)}_getTransformedDimensions(e={}){let t={scaleX:this.scaleX,scaleY:this.scaleY,skewX:this.skewX,skewY:this.skewY,width:this.width,height:this.height,strokeWidth:this.strokeWidth,...e},n=t.strokeWidth,r=n,i=0;this.strokeUniform&&(r=0,i=n);let o=t.width+r,s=t.height+r,c;return c=t.skewX===0&&t.skewY===0?new a(o*t.scaleX,s*t.scaleY):b(o,s,l(t)),c.scalarAdd(i)}translateToGivenOrigin(e,t,n,r,i){let o=e.x,s=e.y,c=x(r)-x(t),l=x(i)-x(n);if(c||l){let e=this._getTransformedDimensions();o+=c*e.x,s+=l*e.y}return new a(o,s)}translateToCenterPoint(t,n,r){if(n===`center`&&r===`center`)return t;let i=this.translateToGivenOrigin(t,n,r,e,e);return this.angle?i.rotate(s(this.angle),t):i}translateToOriginPoint(t,n,r){let i=this.translateToGivenOrigin(t,e,e,n,r);return this.angle?i.rotate(s(this.angle),t):i}getCenterPoint(){let e=this.getRelativeCenterPoint();return this.group?v(e,this.group.calcTransformMatrix()):e}getRelativeCenterPoint(){return this.translateToCenterPoint(new a(this.left,this.top),this.originX,this.originY)}getPointByOrigin(e,t){return this.getPositionByOrigin(e,t)}getPositionByOrigin(e,t){return this.translateToOriginPoint(this.getRelativeCenterPoint(),e,t)}setPositionByOrigin(e,t,n){let r=this.translateToCenterPoint(e,t,n),i=this.translateToOriginPoint(r,this.originX,this.originY);this.set({left:i.x,top:i.y})}_getLeftTopCoords(){return this.getPositionByOrigin(t,`top`)}positionByLeftTop(e){return this.setPositionByOrigin(e,t,`top`)}};export{C as ObjectGeometry};
2
2
  //# sourceMappingURL=ObjectGeometry.min.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ObjectGeometry.min.mjs","names":[],"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"],"mappings":"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"}
1
+ {"version":3,"file":"ObjectGeometry.min.mjs","names":[],"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 calcPlaneZoom,\n calcPlaneScaleY,\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 const vpt = this.canvas?.viewportTransform;\n const dim = this._getTransformedDimensions(options);\n if (vpt) {\n return dim\n .multiply(new Point(calcPlaneZoom(vpt), calcPlaneScaleY(vpt)))\n .scalarAdd(2 * this.padding);\n }\n return dim.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"],"mappings":"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"}
@@ -2,7 +2,7 @@ import { CENTER, LEFT, SCALE_X, SCALE_Y, iMatrix } from "../../constants.mjs";
2
2
  import { Point } from "../../Point.mjs";
3
3
  import { CommonMethods } from "../../CommonMethods.mjs";
4
4
  import { degreesToRadians, radiansToDegrees } from "../../util/misc/radiansDegreesConversion.mjs";
5
- import { calcDimensionsMatrix, calcPlaneRotation, composeMatrix, createRotateMatrix, createTranslateMatrix, invertTransform, multiplyTransformMatrices, transformPoint } from "../../util/misc/matrix.mjs";
5
+ import { calcDimensionsMatrix, calcPlaneRotation, calcPlaneScaleY, calcPlaneZoom, composeMatrix, createRotateMatrix, createTranslateMatrix, invertTransform, multiplyTransformMatrices, transformPoint } from "../../util/misc/matrix.mjs";
6
6
  import { makeBoundingBoxFromPoints } from "../../util/misc/boundingBoxFromPoints.mjs";
7
7
  import { sizeAfterTransform } from "../../util/misc/objectTransforms.mjs";
8
8
  import { resolveOrigin } from "../../util/misc/resolveOrigin.mjs";
@@ -354,7 +354,11 @@ var ObjectGeometry = class extends CommonMethods {
354
354
  * @returns {Point} dimensions
355
355
  */
356
356
  _calculateCurrentDimensions(options) {
357
- return this._getTransformedDimensions(options).transform(this.getViewportTransform(), true).scalarAdd(2 * this.padding);
357
+ var _this$canvas3;
358
+ const vpt = (_this$canvas3 = this.canvas) === null || _this$canvas3 === void 0 ? void 0 : _this$canvas3.viewportTransform;
359
+ const dim = this._getTransformedDimensions(options);
360
+ if (vpt) return dim.multiply(new Point(calcPlaneZoom(vpt), calcPlaneScaleY(vpt))).scalarAdd(2 * this.padding);
361
+ return dim.scalarAdd(2 * this.padding);
358
362
  }
359
363
  /**
360
364
  * Calculate object bounding box dimensions from its properties scale, skew.