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":"index.mjs","names":[],"sources":["../../../../src/util/path/index.ts"],"sourcesContent":["import { cache } from '../../cache';\nimport { config } from '../../config';\nimport { halfPI, PiBy180 } from '../../constants';\nimport type { TMat2D, TRadian, TRectBounds } from '../../typedefs';\nimport { cos } from '../misc/cos';\nimport { multiplyTransformMatrices, transformPoint } from '../misc/matrix';\nimport { sin } from '../misc/sin';\nimport { toFixed } from '../misc/toFixed';\nimport type {\n TCurveInfo,\n TComplexPathData,\n TParsedAbsoluteCubicCurveCommand,\n TPathSegmentInfo,\n TPointAngle,\n TSimpleParsedCommand,\n TSimplePathData,\n TPathSegmentCommandInfo,\n TComplexParsedCommand,\n TPathSegmentInfoCommon,\n TEndPathInfo,\n TParsedArcCommand,\n TComplexParsedCommandType,\n} from './typedefs';\nimport type { XY } from '../../Point';\nimport { Point } from '../../Point';\nimport { reArcCommandPoints, rePathCommand } from './regex';\nimport { reNum } from '../../parser/constants';\n\n/**\n * Commands that may be repeated\n */\nconst repeatedCommands: Record<string, 'l' | 'L'> = {\n m: 'l',\n M: 'L',\n};\n\n/**\n * Convert an arc of a rotated ellipse to a Bezier Curve\n * @param {TRadian} theta1 start of the arc\n * @param {TRadian} theta2 end of the arc\n * @param cosTh cosine of the angle of rotation\n * @param sinTh sine of the angle of rotation\n * @param rx x-axis radius (before rotation)\n * @param ry y-axis radius (before rotation)\n * @param cx1 center x of the ellipse\n * @param cy1 center y of the ellipse\n * @param mT\n * @param fromX starting point of arc x\n * @param fromY starting point of arc y\n */\nconst segmentToBezier = (\n theta1: TRadian,\n theta2: TRadian,\n cosTh: number,\n sinTh: number,\n rx: number,\n ry: number,\n cx1: number,\n cy1: number,\n mT: number,\n fromX: number,\n fromY: number,\n): TParsedAbsoluteCubicCurveCommand => {\n const costh1 = cos(theta1),\n sinth1 = sin(theta1),\n costh2 = cos(theta2),\n sinth2 = sin(theta2),\n toX = cosTh * rx * costh2 - sinTh * ry * sinth2 + cx1,\n toY = sinTh * rx * costh2 + cosTh * ry * sinth2 + cy1,\n cp1X = fromX + mT * (-cosTh * rx * sinth1 - sinTh * ry * costh1),\n cp1Y = fromY + mT * (-sinTh * rx * sinth1 + cosTh * ry * costh1),\n cp2X = toX + mT * (cosTh * rx * sinth2 + sinTh * ry * costh2),\n cp2Y = toY + mT * (sinTh * rx * sinth2 - cosTh * ry * costh2);\n\n return ['C', cp1X, cp1Y, cp2X, cp2Y, toX, toY];\n};\n\n/**\n * Adapted from {@link http://dxr.mozilla.org/mozilla-central/source/dom/svg/SVGPathDataParser.cpp}\n * by Andrea Bogazzi code is under MPL. if you don't have a copy of the license you can take it here\n * http://mozilla.org/MPL/2.0/\n * @param toX\n * @param toY\n * @param rx\n * @param ry\n * @param {number} large 0 or 1 flag\n * @param {number} sweep 0 or 1 flag\n * @param rotateX\n */\nconst arcToSegments = (\n toX: number,\n toY: number,\n rx: number,\n ry: number,\n large: number,\n sweep: number,\n rotateX: TRadian,\n): TParsedAbsoluteCubicCurveCommand[] => {\n if (rx === 0 || ry === 0) {\n return [];\n }\n let fromX = 0,\n fromY = 0,\n root = 0;\n const PI = Math.PI,\n theta = rotateX * PiBy180,\n sinTheta = sin(theta),\n cosTh = cos(theta),\n px = 0.5 * (-cosTh * toX - sinTheta * toY),\n py = 0.5 * (-cosTh * toY + sinTheta * toX),\n rx2 = rx ** 2,\n ry2 = ry ** 2,\n py2 = py ** 2,\n px2 = px ** 2,\n pl = rx2 * ry2 - rx2 * py2 - ry2 * px2;\n let _rx = Math.abs(rx);\n let _ry = Math.abs(ry);\n\n if (pl < 0) {\n const s = Math.sqrt(1 - pl / (rx2 * ry2));\n _rx *= s;\n _ry *= s;\n } else {\n root =\n (large === sweep ? -1.0 : 1.0) * Math.sqrt(pl / (rx2 * py2 + ry2 * px2));\n }\n\n const cx = (root * _rx * py) / _ry,\n cy = (-root * _ry * px) / _rx,\n cx1 = cosTh * cx - sinTheta * cy + toX * 0.5,\n cy1 = sinTheta * cx + cosTh * cy + toY * 0.5;\n let mTheta = calcVectorAngle(1, 0, (px - cx) / _rx, (py - cy) / _ry);\n let dtheta = calcVectorAngle(\n (px - cx) / _rx,\n (py - cy) / _ry,\n (-px - cx) / _rx,\n (-py - cy) / _ry,\n );\n\n if (sweep === 0 && dtheta > 0) {\n dtheta -= 2 * PI;\n } else if (sweep === 1 && dtheta < 0) {\n dtheta += 2 * PI;\n }\n\n // Convert into cubic bezier segments <= 90deg\n const segments = Math.ceil(Math.abs((dtheta / PI) * 2)),\n result = [],\n mDelta = dtheta / segments,\n mT =\n ((8 / 3) * Math.sin(mDelta / 4) * Math.sin(mDelta / 4)) /\n Math.sin(mDelta / 2);\n let th3 = mTheta + mDelta;\n\n for (let i = 0; i < segments; i++) {\n result[i] = segmentToBezier(\n mTheta,\n th3,\n cosTh,\n sinTheta,\n _rx,\n _ry,\n cx1,\n cy1,\n mT,\n fromX,\n fromY,\n );\n fromX = result[i][5];\n fromY = result[i][6];\n mTheta = th3;\n th3 += mDelta;\n }\n return result;\n};\n\n/**\n * @private\n * Calculate the angle between two vectors\n * @param ux u endpoint x\n * @param uy u endpoint y\n * @param vx v endpoint x\n * @param vy v endpoint y\n */\nconst calcVectorAngle = (\n ux: number,\n uy: number,\n vx: number,\n vy: number,\n): TRadian => {\n const ta = Math.atan2(uy, ux),\n tb = Math.atan2(vy, vx);\n if (tb >= ta) {\n return tb - ta;\n } else {\n return 2 * Math.PI - (ta - tb);\n }\n};\n\n// functions for the Cubic beizer\n// taken from: https://github.com/konvajs/konva/blob/7.0.5/src/shapes/Path.ts#L350\nconst CB1 = (t: number) => t ** 3;\nconst CB2 = (t: number) => 3 * t ** 2 * (1 - t);\nconst CB3 = (t: number) => 3 * t * (1 - t) ** 2;\nconst CB4 = (t: number) => (1 - t) ** 3;\n\n/**\n * Calculate bounding box of a cubic Bezier curve\n * Taken from http://jsbin.com/ivomiq/56/edit (no credits available)\n * TODO: can we normalize this with the starting points set at 0 and then translated the bbox?\n * @param {number} begx starting point\n * @param {number} begy\n * @param {number} cp1x first control point\n * @param {number} cp1y\n * @param {number} cp2x second control point\n * @param {number} cp2y\n * @param {number} endx end of bezier\n * @param {number} endy\n * @return {TRectBounds} the rectangular bounds\n */\nexport function getBoundsOfCurve(\n begx: number,\n begy: number,\n cp1x: number,\n cp1y: number,\n cp2x: number,\n cp2y: number,\n endx: number,\n endy: number,\n): TRectBounds {\n let argsString: string;\n if (config.cachesBoundsOfCurve) {\n // eslint-disable-next-line\n argsString = [...arguments].join();\n if (cache.boundsOfCurveCache[argsString]) {\n return cache.boundsOfCurveCache[argsString];\n }\n }\n\n const sqrt = Math.sqrt,\n abs = Math.abs,\n tvalues = [],\n bounds: [[x: number, y: number], [x: number, y: number]] = [\n [0, 0],\n [0, 0],\n ];\n\n let b = 6 * begx - 12 * cp1x + 6 * cp2x;\n let a = -3 * begx + 9 * cp1x - 9 * cp2x + 3 * endx;\n let c = 3 * cp1x - 3 * begx;\n\n for (let i = 0; i < 2; ++i) {\n if (i > 0) {\n b = 6 * begy - 12 * cp1y + 6 * cp2y;\n a = -3 * begy + 9 * cp1y - 9 * cp2y + 3 * endy;\n c = 3 * cp1y - 3 * begy;\n }\n\n if (abs(a) < 1e-12) {\n if (abs(b) < 1e-12) {\n continue;\n }\n const t = -c / b;\n if (0 < t && t < 1) {\n tvalues.push(t);\n }\n continue;\n }\n const b2ac = b * b - 4 * c * a;\n if (b2ac < 0) {\n continue;\n }\n const sqrtb2ac = sqrt(b2ac);\n const t1 = (-b + sqrtb2ac) / (2 * a);\n if (0 < t1 && t1 < 1) {\n tvalues.push(t1);\n }\n const t2 = (-b - sqrtb2ac) / (2 * a);\n if (0 < t2 && t2 < 1) {\n tvalues.push(t2);\n }\n }\n\n let j = tvalues.length;\n const jlen = j;\n const iterator = getPointOnCubicBezierIterator(\n begx,\n begy,\n cp1x,\n cp1y,\n cp2x,\n cp2y,\n endx,\n endy,\n );\n while (j--) {\n const { x, y } = iterator(tvalues[j]);\n bounds[0][j] = x;\n bounds[1][j] = y;\n }\n\n bounds[0][jlen] = begx;\n bounds[1][jlen] = begy;\n bounds[0][jlen + 1] = endx;\n bounds[1][jlen + 1] = endy;\n const result: TRectBounds = [\n new Point(Math.min(...bounds[0]), Math.min(...bounds[1])),\n new Point(Math.max(...bounds[0]), Math.max(...bounds[1])),\n ];\n if (config.cachesBoundsOfCurve) {\n cache.boundsOfCurveCache[argsString!] = result;\n }\n return result;\n}\n\n/**\n * Converts arc to a bunch of cubic Bezier curves\n * @param {number} fx starting point x\n * @param {number} fy starting point y\n * @param {TParsedArcCommand} coords Arc command\n */\nexport const fromArcToBeziers = (\n fx: number,\n fy: number,\n [_, rx, ry, rot, large, sweep, tx, ty]: TParsedArcCommand,\n): TParsedAbsoluteCubicCurveCommand[] => {\n const segsNorm = arcToSegments(tx - fx, ty - fy, rx, ry, large, sweep, rot);\n\n for (let i = 0, len = segsNorm.length; i < len; i++) {\n segsNorm[i][1] += fx;\n segsNorm[i][2] += fy;\n segsNorm[i][3] += fx;\n segsNorm[i][4] += fy;\n segsNorm[i][5] += fx;\n segsNorm[i][6] += fy;\n }\n return segsNorm;\n};\n\n/**\n * This function takes a parsed SVG path and makes it simpler for fabricJS logic.\n * Simplification consist of:\n * - All commands converted to absolute (lowercase to uppercase)\n * - S converted to C\n * - T converted to Q\n * - A converted to C\n * @param {TComplexPathData} path the array of commands of a parsed SVG path for `Path`\n * @return {TSimplePathData} the simplified array of commands of a parsed SVG path for `Path`\n * TODO: figure out how to remove the type assertions in a nice way\n */\nexport const makePathSimpler = (path: TComplexPathData): TSimplePathData => {\n // x and y represent the last point of the path, AKA the previous command point.\n // we add them to each relative command to make it an absolute comment.\n // we also swap the v V h H with L, because are easier to transform.\n let x = 0,\n y = 0;\n // x1 and y1 represent the last point of the subpath. the subpath is started with\n // m or M command. When a z or Z command is drawn, x and y need to be resetted to\n // the last x1 and y1.\n let x1 = 0,\n y1 = 0;\n // previous will host the letter of the previous command, to handle S and T.\n // controlX and controlY will host the previous reflected control point\n const destinationPath: TSimplePathData = [];\n let previous,\n // placeholders\n controlX = 0,\n controlY = 0;\n for (const parsedCommand of path) {\n const current: TComplexParsedCommand = [...parsedCommand];\n let converted: TSimpleParsedCommand | undefined;\n switch (\n current[0] // first letter\n ) {\n case 'l': // lineto, relative\n current[1] += x;\n current[2] += y;\n // falls through\n case 'L':\n x = current[1];\n y = current[2];\n converted = ['L', x, y];\n break;\n case 'h': // horizontal lineto, relative\n current[1] += x;\n // falls through\n case 'H':\n x = current[1];\n converted = ['L', x, y];\n break;\n case 'v': // vertical lineto, relative\n current[1] += y;\n // falls through\n case 'V':\n y = current[1];\n converted = ['L', x, y];\n break;\n case 'm': // moveTo, relative\n current[1] += x;\n current[2] += y;\n // falls through\n case 'M':\n x = current[1];\n y = current[2];\n x1 = current[1];\n y1 = current[2];\n converted = ['M', x, y];\n break;\n case 'c': // bezierCurveTo, relative\n current[1] += x;\n current[2] += y;\n current[3] += x;\n current[4] += y;\n current[5] += x;\n current[6] += y;\n // falls through\n case 'C':\n controlX = current[3];\n controlY = current[4];\n x = current[5];\n y = current[6];\n converted = ['C', current[1], current[2], controlX, controlY, x, y];\n break;\n case 's': // shorthand cubic bezierCurveTo, relative\n current[1] += x;\n current[2] += y;\n current[3] += x;\n current[4] += y;\n // falls through\n case 'S':\n // would be sScC but since we are swapping sSc for C, we check just that.\n if (previous === 'C') {\n // calculate reflection of previous control points\n controlX = 2 * x - controlX;\n controlY = 2 * y - controlY;\n } else {\n // If there is no previous command or if the previous command was not a C, c, S, or s,\n // the control point is coincident with the current point\n controlX = x;\n controlY = y;\n }\n x = current[3];\n y = current[4];\n converted = ['C', controlX, controlY, current[1], current[2], x, y];\n // converted[3] and converted[4] are NOW the second control point.\n // we keep it for the next reflection.\n controlX = converted[3];\n controlY = converted[4];\n break;\n case 'q': // quadraticCurveTo, relative\n current[1] += x;\n current[2] += y;\n current[3] += x;\n current[4] += y;\n // falls through\n case 'Q':\n controlX = current[1];\n controlY = current[2];\n x = current[3];\n y = current[4];\n converted = ['Q', controlX, controlY, x, y];\n break;\n case 't': // shorthand quadraticCurveTo, relative\n current[1] += x;\n current[2] += y;\n // falls through\n case 'T':\n if (previous === 'Q') {\n // calculate reflection of previous control point\n controlX = 2 * x - controlX;\n controlY = 2 * y - controlY;\n } else {\n // If there is no previous command or if the previous command was not a Q, q, T or t,\n // assume the control point is coincident with the current point\n controlX = x;\n controlY = y;\n }\n x = current[1];\n y = current[2];\n converted = ['Q', controlX, controlY, x, y];\n break;\n case 'a':\n current[6] += x;\n current[7] += y;\n // falls through\n case 'A':\n fromArcToBeziers(x, y, current).forEach((b) => destinationPath.push(b));\n x = current[6];\n y = current[7];\n break;\n case 'z':\n case 'Z':\n x = x1;\n y = y1;\n converted = ['Z'];\n break;\n default:\n }\n if (converted) {\n destinationPath.push(converted);\n previous = converted[0];\n } else {\n previous = '';\n }\n }\n return destinationPath;\n};\n\n// todo verify if we can just use the point class here\n/**\n * Calc length from point x1,y1 to x2,y2\n * @param {number} x1 starting point x\n * @param {number} y1 starting point y\n * @param {number} x2 starting point x\n * @param {number} y2 starting point y\n * @return {number} length of segment\n */\nconst calcLineLength = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n): number => Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2);\n\n/**\n * Get an iterator that takes a percentage and returns a point\n * @param {number} begx\n * @param {number} begy\n * @param {number} cp1x\n * @param {number} cp1y\n * @param {number} cp2x\n * @param {number} cp2y\n * @param {number} endx\n * @param {number} endy\n */\nconst getPointOnCubicBezierIterator =\n (\n begx: number,\n begy: number,\n cp1x: number,\n cp1y: number,\n cp2x: number,\n cp2y: number,\n endx: number,\n endy: number,\n ) =>\n (pct: number) => {\n const c1 = CB1(pct),\n c2 = CB2(pct),\n c3 = CB3(pct),\n c4 = CB4(pct);\n return new Point(\n endx * c1 + cp2x * c2 + cp1x * c3 + begx * c4,\n endy * c1 + cp2y * c2 + cp1y * c3 + begy * c4,\n );\n };\n\nconst QB1 = (t: number) => t ** 2;\nconst QB2 = (t: number) => 2 * t * (1 - t);\nconst QB3 = (t: number) => (1 - t) ** 2;\n\nconst getTangentCubicIterator =\n (\n p1x: number,\n p1y: number,\n p2x: number,\n p2y: number,\n p3x: number,\n p3y: number,\n p4x: number,\n p4y: number,\n ) =>\n (pct: number) => {\n const qb1 = QB1(pct),\n qb2 = QB2(pct),\n qb3 = QB3(pct),\n tangentX =\n 3 * (qb3 * (p2x - p1x) + qb2 * (p3x - p2x) + qb1 * (p4x - p3x)),\n tangentY =\n 3 * (qb3 * (p2y - p1y) + qb2 * (p3y - p2y) + qb1 * (p4y - p3y));\n return Math.atan2(tangentY, tangentX);\n };\n\nconst getPointOnQuadraticBezierIterator =\n (\n p1x: number,\n p1y: number,\n p2x: number,\n p2y: number,\n p3x: number,\n p3y: number,\n ) =>\n (pct: number) => {\n const c1 = QB1(pct),\n c2 = QB2(pct),\n c3 = QB3(pct);\n return new Point(\n p3x * c1 + p2x * c2 + p1x * c3,\n p3y * c1 + p2y * c2 + p1y * c3,\n );\n };\n\nconst getTangentQuadraticIterator =\n (\n p1x: number,\n p1y: number,\n p2x: number,\n p2y: number,\n p3x: number,\n p3y: number,\n ) =>\n (pct: number) => {\n const invT = 1 - pct,\n tangentX = 2 * (invT * (p2x - p1x) + pct * (p3x - p2x)),\n tangentY = 2 * (invT * (p2y - p1y) + pct * (p3y - p2y));\n return Math.atan2(tangentY, tangentX);\n };\n\n// this will run over a path segment (a cubic or quadratic segment) and approximate it\n// with 100 segments. This will good enough to calculate the length of the curve\nconst pathIterator = (\n iterator: (pct: number) => Point,\n x1: number,\n y1: number,\n) => {\n let tempP = new Point(x1, y1),\n tmpLen = 0;\n for (let perc = 1; perc <= 100; perc += 1) {\n const p = iterator(perc / 100);\n tmpLen += calcLineLength(tempP.x, tempP.y, p.x, p.y);\n tempP = p;\n }\n return tmpLen;\n};\n\n/**\n * Given a pathInfo, and a distance in pixels, find the percentage from 0 to 1\n * that correspond to that pixels run over the path.\n * The percentage will be then used to find the correct point on the canvas for the path.\n * @param {Array} segInfo fabricJS collection of information on a parsed path\n * @param {number} distance from starting point, in pixels.\n * @return {TPointAngle} info object with x and y ( the point on canvas ) and angle, the tangent on that point;\n */\nconst findPercentageForDistance = (\n segInfo: TCurveInfo<'Q' | 'C'>,\n distance: number,\n): TPointAngle => {\n let perc = 0,\n tmpLen = 0,\n tempP: XY = { x: segInfo.x, y: segInfo.y },\n p: XY = { ...tempP },\n nextLen: number,\n nextStep = 0.01,\n lastPerc = 0;\n // nextStep > 0.0001 covers 0.00015625 that 1/64th of 1/100\n // the path\n const iterator = segInfo.iterator,\n angleFinder = segInfo.angleFinder;\n while (tmpLen < distance && nextStep > 0.0001) {\n p = iterator(perc);\n lastPerc = perc;\n nextLen = calcLineLength(tempP.x, tempP.y, p.x, p.y);\n // compare tmpLen each cycle with distance, decide next perc to test.\n if (nextLen + tmpLen > distance) {\n // we discard this step and we make smaller steps.\n perc -= nextStep;\n nextStep /= 2;\n } else {\n tempP = p;\n perc += nextStep;\n tmpLen += nextLen;\n }\n }\n return { ...p, angle: angleFinder(lastPerc) };\n};\n\n/**\n * Run over a parsed and simplified path and extract some information (length of each command and starting point)\n * @param {TSimplePathData} path parsed path commands\n * @return {TPathSegmentInfo[]} path commands information\n */\nexport const getPathSegmentsInfo = (\n path: TSimplePathData,\n): TPathSegmentInfo[] => {\n let totalLength = 0,\n //x2 and y2 are the coords of segment start\n //x1 and y1 are the coords of the current point\n x1 = 0,\n y1 = 0,\n x2 = 0,\n y2 = 0,\n iterator,\n tempInfo: TPathSegmentInfo;\n const info: TPathSegmentInfo[] = [];\n for (const current of path) {\n const basicInfo: TPathSegmentInfoCommon<keyof TPathSegmentCommandInfo> = {\n x: x1,\n y: y1,\n command: current[0],\n length: 0,\n };\n switch (\n current[0] //first letter\n ) {\n case 'M':\n tempInfo = <TPathSegmentInfoCommon<'M'>>basicInfo;\n tempInfo.x = x2 = x1 = current[1];\n tempInfo.y = y2 = y1 = current[2];\n break;\n case 'L':\n tempInfo = <TPathSegmentInfoCommon<'L'>>basicInfo;\n tempInfo.length = calcLineLength(x1, y1, current[1], current[2]);\n x1 = current[1];\n y1 = current[2];\n break;\n case 'C':\n iterator = getPointOnCubicBezierIterator(\n x1,\n y1,\n current[1],\n current[2],\n current[3],\n current[4],\n current[5],\n current[6],\n );\n tempInfo = <TCurveInfo<'C'>>basicInfo;\n tempInfo.iterator = iterator;\n tempInfo.angleFinder = getTangentCubicIterator(\n x1,\n y1,\n current[1],\n current[2],\n current[3],\n current[4],\n current[5],\n current[6],\n );\n tempInfo.length = pathIterator(iterator, x1, y1);\n\n x1 = current[5];\n y1 = current[6];\n break;\n case 'Q':\n iterator = getPointOnQuadraticBezierIterator(\n x1,\n y1,\n current[1],\n current[2],\n current[3],\n current[4],\n );\n tempInfo = <TCurveInfo<'Q'>>basicInfo;\n tempInfo.iterator = iterator;\n tempInfo.angleFinder = getTangentQuadraticIterator(\n x1,\n y1,\n current[1],\n current[2],\n current[3],\n current[4],\n );\n tempInfo.length = pathIterator(iterator, x1, y1);\n x1 = current[3];\n y1 = current[4];\n break;\n case 'Z':\n // we add those in order to ease calculations later\n tempInfo = <TEndPathInfo>basicInfo;\n tempInfo.destX = x2;\n tempInfo.destY = y2;\n tempInfo.length = calcLineLength(x1, y1, x2, y2);\n x1 = x2;\n y1 = y2;\n break;\n }\n totalLength += tempInfo.length;\n info.push(tempInfo);\n }\n info.push({ length: totalLength, x: x1, y: y1 });\n return info;\n};\n\n/**\n * Get the point on the path that is distance along the path\n * @param path\n * @param distance\n * @param infos\n */\nexport const getPointOnPath = (\n path: TSimplePathData,\n distance: number,\n infos: TPathSegmentInfo[] = getPathSegmentsInfo(path),\n): TPointAngle | undefined => {\n let i = 0;\n while (distance - infos[i].length > 0 && i < infos.length - 2) {\n distance -= infos[i].length;\n i++;\n }\n const segInfo = infos[i],\n segPercent = distance / segInfo.length,\n segment = path[i];\n\n switch (segInfo.command) {\n case 'M':\n return { x: segInfo.x, y: segInfo.y, angle: 0 };\n case 'Z':\n return {\n ...new Point(segInfo.x, segInfo.y).lerp(\n new Point(segInfo.destX, segInfo.destY),\n segPercent,\n ),\n angle: Math.atan2(segInfo.destY - segInfo.y, segInfo.destX - segInfo.x),\n };\n case 'L':\n return {\n ...new Point(segInfo.x, segInfo.y).lerp(\n new Point(segment[1]!, segment[2]!),\n segPercent,\n ),\n angle: Math.atan2(segment[2]! - segInfo.y, segment[1]! - segInfo.x),\n };\n case 'C':\n return findPercentageForDistance(segInfo, distance);\n case 'Q':\n return findPercentageForDistance(segInfo, distance);\n default:\n // throw Error('Invalid command');\n }\n};\n\nconst rePathCmdAll = new RegExp(rePathCommand, 'gi');\nconst regExpArcCommandPoints = new RegExp(reArcCommandPoints, 'g');\nconst reMyNum = new RegExp(reNum, 'gi');\nconst commandLengths = {\n m: 2,\n l: 2,\n h: 1,\n v: 1,\n c: 6,\n s: 4,\n q: 4,\n t: 2,\n a: 7,\n} as const;\n/**\n *\n * @param {string} pathString\n * @return {TComplexPathData} An array of SVG path commands\n * @example <caption>Usage</caption>\n * parsePath('M 3 4 Q 3 5 2 1 4 0 Q 9 12 2 1 4 0') === [\n * ['M', 3, 4],\n * ['Q', 3, 5, 2, 1, 4, 0],\n * ['Q', 9, 12, 2, 1, 4, 0],\n * ];\n */\nexport const parsePath = (pathString: string): TComplexPathData => {\n const chain: TComplexPathData = [];\n const all = pathString.match(rePathCmdAll) ?? [];\n for (const matchStr of all) {\n // take match string and save the first letter as the command\n const commandLetter = matchStr[0] as TComplexParsedCommandType;\n // in case of Z we have very little to do\n if (commandLetter === 'z' || commandLetter === 'Z') {\n chain.push([commandLetter]);\n continue;\n }\n const commandLength =\n commandLengths[\n commandLetter.toLowerCase() as keyof typeof commandLengths\n ];\n\n let paramArr = [];\n if (commandLetter === 'a' || commandLetter === 'A') {\n // the arc command ha some peculariaties that requires a special regex other than numbers\n // it is possible to avoid using a space between the sweep and large arc flags, making them either\n // 00, 01, 10 or 11, making them identical to a plain number for the regex reMyNum\n // reset the regexp\n regExpArcCommandPoints.lastIndex = 0;\n for (let out = null; (out = regExpArcCommandPoints.exec(matchStr)); ) {\n paramArr.push(...out.slice(1));\n }\n } else {\n paramArr = matchStr.match(reMyNum) || [];\n }\n\n // inspect the length of paramArr, if is longer than commandLength\n // we are dealing with repeated commands\n for (let i = 0; i < paramArr.length; i += commandLength) {\n const newCommand = new Array(commandLength) as TComplexParsedCommand;\n const transformedCommand = repeatedCommands[commandLetter];\n newCommand[0] =\n i > 0 && transformedCommand ? transformedCommand : commandLetter;\n for (let j = 0; j < commandLength; j++) {\n newCommand[j + 1] = parseFloat(paramArr[i + j]);\n }\n chain.push(newCommand);\n }\n }\n return chain;\n};\n\n/**\n *\n * Converts points to a smooth SVG path\n * @param {XY[]} points Array of points\n * @param {number} [correction] Apply a correction to the path (usually we use `width / 1000`). If value is undefined 0 is used as the correction value.\n * @return {(string|number)[][]} An array of SVG path commands\n */\nexport const getSmoothPathFromPoints = (\n points: Point[],\n correction = 0,\n): TSimplePathData => {\n let p1 = new Point(points[0]),\n p2 = new Point(points[1]),\n multSignX = 1,\n multSignY = 0;\n const path: TSimplePathData = [],\n len = points.length,\n manyPoints = len > 2;\n\n if (manyPoints) {\n multSignX = points[2].x < p2.x ? -1 : points[2].x === p2.x ? 0 : 1;\n multSignY = points[2].y < p2.y ? -1 : points[2].y === p2.y ? 0 : 1;\n }\n path.push([\n 'M',\n p1.x - multSignX * correction,\n p1.y - multSignY * correction,\n ]);\n let i;\n for (i = 1; i < len; i++) {\n if (!p1.eq(p2)) {\n const midPoint = p1.midPointFrom(p2);\n // p1 is our bezier control point\n // midpoint is our endpoint\n // start point is p(i-1) value.\n path.push(['Q', p1.x, p1.y, midPoint.x, midPoint.y]);\n }\n p1 = points[i];\n if (i + 1 < points.length) {\n p2 = points[i + 1];\n }\n }\n if (manyPoints) {\n multSignX = p1.x > points[i - 2].x ? 1 : p1.x === points[i - 2].x ? 0 : -1;\n multSignY = p1.y > points[i - 2].y ? 1 : p1.y === points[i - 2].y ? 0 : -1;\n }\n path.push([\n 'L',\n p1.x + multSignX * correction,\n p1.y + multSignY * correction,\n ]);\n return path;\n};\n\n/**\n * Transform a path by transforming each segment.\n * it has to be a simplified path or it won't work.\n * WARNING: this depends from pathOffset for correct operation\n * @param {TSimplePathData} path fabricJS parsed and simplified path commands\n * @param {TMat2D} transform matrix that represent the transformation\n * @param {Point} [pathOffset] `Path.pathOffset`\n * @returns {TSimplePathData} the transformed path\n */\nexport const transformPath = (\n path: TSimplePathData,\n transform: TMat2D,\n pathOffset: Point,\n): TSimplePathData => {\n if (pathOffset) {\n transform = multiplyTransformMatrices(transform, [\n 1,\n 0,\n 0,\n 1,\n -pathOffset.x,\n -pathOffset.y,\n ]);\n }\n return path.map((pathSegment) => {\n const newSegment: TSimpleParsedCommand = [...pathSegment];\n for (let i = 1; i < pathSegment.length - 1; i += 2) {\n // TODO: is there a way to get around casting to any?\n const { x, y } = transformPoint(\n {\n x: pathSegment[i] as number,\n y: pathSegment[i + 1] as number,\n },\n transform,\n );\n newSegment[i] = x;\n newSegment[i + 1] = y;\n }\n return newSegment;\n });\n};\n\n/**\n * Returns an array of path commands to create a regular polygon\n * @param {number} numVertexes\n * @param {number} radius\n * @returns {TSimplePathData} An array of SVG path commands\n */\nexport const getRegularPolygonPath = (\n numVertexes: number,\n radius: number,\n): TSimplePathData => {\n const interiorAngle = (Math.PI * 2) / numVertexes;\n // rotationAdjustment rotates the path by 1/2 the interior angle so that the polygon always has a flat side on the bottom\n // This isn't strictly necessary, but it's how we tend to think of and expect polygons to be drawn\n let rotationAdjustment = -halfPI;\n if (numVertexes % 2 === 0) {\n rotationAdjustment += interiorAngle / 2;\n }\n const d = new Array(numVertexes + 1);\n for (let i = 0; i < numVertexes; i++) {\n const rad = i * interiorAngle + rotationAdjustment;\n const { x, y } = new Point(cos(rad), sin(rad)).scalarMultiply(radius);\n d[i] = [i === 0 ? 'M' : 'L', x, y];\n }\n d[numVertexes] = ['Z'];\n return d;\n};\n\n/**\n * Join path commands to go back to svg format\n * @param {TSimplePathData} pathData fabricJS parsed path commands\n * @param {number} fractionDigits number of fraction digits to \"leave\"\n * @return {String} joined path 'M 0 0 L 20 30'\n */\nexport const joinPath = (pathData: TSimplePathData, fractionDigits?: number) =>\n pathData\n .map((segment) => {\n return segment\n .map((arg, i) => {\n if (i === 0) return arg;\n return fractionDigits === undefined\n ? arg\n : toFixed(arg, fractionDigits);\n })\n .join(' ');\n })\n .join(' ');\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../../../src/util/path/index.ts"],"sourcesContent":["import { cache } from '../../cache';\nimport { config } from '../../config';\nimport { halfPI, PiBy180 } from '../../constants';\nimport type { TMat2D, TRadian, TRectBounds } from '../../typedefs';\nimport { cos } from '../misc/cos';\nimport { multiplyTransformMatrices, transformPoint } from '../misc/matrix';\nimport { sin } from '../misc/sin';\nimport { toFixed } from '../misc/toFixed';\nimport type {\n TCurveInfo,\n TComplexPathData,\n TParsedAbsoluteCubicCurveCommand,\n TPathSegmentInfo,\n TPointAngle,\n TSimpleParsedCommand,\n TSimplePathData,\n TPathSegmentCommandInfo,\n TComplexParsedCommand,\n TPathSegmentInfoCommon,\n TEndPathInfo,\n TParsedArcCommand,\n TComplexParsedCommandType,\n} from './typedefs';\nimport type { XY } from '../../Point';\nimport { Point } from '../../Point';\nimport { reArcCommandPoints, rePathCommand } from './regex';\nimport { reNum } from '../../parser/constants';\n\n/**\n * Commands that may be repeated\n */\nconst repeatedCommands: Record<string, 'l' | 'L'> = {\n m: 'l',\n M: 'L',\n};\n\n/**\n * Convert an arc of a rotated ellipse to a Bezier Curve\n * @param {TRadian} theta1 start of the arc\n * @param {TRadian} theta2 end of the arc\n * @param cosTh cosine of the angle of rotation\n * @param sinTh sine of the angle of rotation\n * @param rx x-axis radius (before rotation)\n * @param ry y-axis radius (before rotation)\n * @param cx1 center x of the ellipse\n * @param cy1 center y of the ellipse\n * @param mT\n * @param fromX starting point of arc x\n * @param fromY starting point of arc y\n */\nconst segmentToBezier = (\n theta1: TRadian,\n theta2: TRadian,\n cosTh: number,\n sinTh: number,\n rx: number,\n ry: number,\n cx1: number,\n cy1: number,\n mT: number,\n fromX: number,\n fromY: number,\n): TParsedAbsoluteCubicCurveCommand => {\n const costh1 = cos(theta1),\n sinth1 = sin(theta1),\n costh2 = cos(theta2),\n sinth2 = sin(theta2),\n toX = cosTh * rx * costh2 - sinTh * ry * sinth2 + cx1,\n toY = sinTh * rx * costh2 + cosTh * ry * sinth2 + cy1,\n cp1X = fromX + mT * (-cosTh * rx * sinth1 - sinTh * ry * costh1),\n cp1Y = fromY + mT * (-sinTh * rx * sinth1 + cosTh * ry * costh1),\n cp2X = toX + mT * (cosTh * rx * sinth2 + sinTh * ry * costh2),\n cp2Y = toY + mT * (sinTh * rx * sinth2 - cosTh * ry * costh2);\n\n return ['C', cp1X, cp1Y, cp2X, cp2Y, toX, toY];\n};\n\n/**\n * Adapted from {@link http://dxr.mozilla.org/mozilla-central/source/dom/svg/SVGPathDataParser.cpp}\n * by Andrea Bogazzi code is under MPL. if you don't have a copy of the license you can take it here\n * http://mozilla.org/MPL/2.0/\n * @param toX\n * @param toY\n * @param rx\n * @param ry\n * @param {number} large 0 or 1 flag\n * @param {number} sweep 0 or 1 flag\n * @param rotateX\n */\nconst arcToSegments = (\n toX: number,\n toY: number,\n rx: number,\n ry: number,\n large: number,\n sweep: number,\n rotateX: TRadian,\n): TParsedAbsoluteCubicCurveCommand[] => {\n if (rx === 0 || ry === 0) {\n return [];\n }\n let fromX = 0,\n fromY = 0,\n root = 0;\n const PI = Math.PI,\n theta = rotateX * PiBy180,\n sinTheta = sin(theta),\n cosTh = cos(theta),\n px = 0.5 * (-cosTh * toX - sinTheta * toY),\n py = 0.5 * (-cosTh * toY + sinTheta * toX),\n rx2 = rx ** 2,\n ry2 = ry ** 2,\n py2 = py ** 2,\n px2 = px ** 2,\n pl = rx2 * ry2 - rx2 * py2 - ry2 * px2;\n let _rx = Math.abs(rx);\n let _ry = Math.abs(ry);\n\n if (pl < 0) {\n const s = Math.sqrt(1 - pl / (rx2 * ry2));\n _rx *= s;\n _ry *= s;\n } else {\n root =\n (large === sweep ? -1.0 : 1.0) * Math.sqrt(pl / (rx2 * py2 + ry2 * px2));\n }\n\n const cx = (root * _rx * py) / _ry,\n cy = (-root * _ry * px) / _rx,\n cx1 = cosTh * cx - sinTheta * cy + toX * 0.5,\n cy1 = sinTheta * cx + cosTh * cy + toY * 0.5;\n let mTheta = calcVectorAngle(1, 0, (px - cx) / _rx, (py - cy) / _ry);\n let dtheta = calcVectorAngle(\n (px - cx) / _rx,\n (py - cy) / _ry,\n (-px - cx) / _rx,\n (-py - cy) / _ry,\n );\n\n if (sweep === 0 && dtheta > 0) {\n dtheta -= 2 * PI;\n } else if (sweep === 1 && dtheta < 0) {\n dtheta += 2 * PI;\n }\n\n // Convert into cubic bezier segments <= 90deg\n const segments = Math.ceil(Math.abs((dtheta / PI) * 2)),\n result = [],\n mDelta = dtheta / segments,\n mT =\n ((8 / 3) * Math.sin(mDelta / 4) * Math.sin(mDelta / 4)) /\n Math.sin(mDelta / 2);\n let th3 = mTheta + mDelta;\n\n for (let i = 0; i < segments; i++) {\n result[i] = segmentToBezier(\n mTheta,\n th3,\n cosTh,\n sinTheta,\n _rx,\n _ry,\n cx1,\n cy1,\n mT,\n fromX,\n fromY,\n );\n fromX = result[i][5];\n fromY = result[i][6];\n mTheta = th3;\n th3 += mDelta;\n }\n return result;\n};\n\n/**\n * @private\n * Calculate the angle between two vectors\n * @param ux u endpoint x\n * @param uy u endpoint y\n * @param vx v endpoint x\n * @param vy v endpoint y\n */\nconst calcVectorAngle = (\n ux: number,\n uy: number,\n vx: number,\n vy: number,\n): TRadian => {\n const ta = Math.atan2(uy, ux),\n tb = Math.atan2(vy, vx);\n if (tb >= ta) {\n return tb - ta;\n } else {\n return 2 * Math.PI - (ta - tb);\n }\n};\n\n// functions for the Cubic beizer\n// taken from: https://github.com/konvajs/konva/blob/7.0.5/src/shapes/Path.ts#L350\nconst CB1 = (t: number) => t ** 3;\nconst CB2 = (t: number) => 3 * t ** 2 * (1 - t);\nconst CB3 = (t: number) => 3 * t * (1 - t) ** 2;\nconst CB4 = (t: number) => (1 - t) ** 3;\n\n/**\n * Calculate bounding box of a cubic Bezier curve\n * Taken from http://jsbin.com/ivomiq/56/edit (no credits available)\n * TODO: can we normalize this with the starting points set at 0 and then translated the bbox?\n * @param {number} begx starting point\n * @param {number} begy\n * @param {number} cp1x first control point\n * @param {number} cp1y\n * @param {number} cp2x second control point\n * @param {number} cp2y\n * @param {number} endx end of bezier\n * @param {number} endy\n * @return {TRectBounds} the rectangular bounds\n */\nexport function getBoundsOfCurve(\n begx: number,\n begy: number,\n cp1x: number,\n cp1y: number,\n cp2x: number,\n cp2y: number,\n endx: number,\n endy: number,\n): TRectBounds {\n let argsString: string;\n if (config.cachesBoundsOfCurve) {\n // eslint-disable-next-line\n argsString = [...arguments].join();\n if (cache.boundsOfCurveCache[argsString]) {\n return cache.boundsOfCurveCache[argsString];\n }\n }\n\n const sqrt = Math.sqrt,\n abs = Math.abs,\n tvalues = [],\n bounds: [[x: number, y: number], [x: number, y: number]] = [\n [0, 0],\n [0, 0],\n ];\n\n let b = 6 * begx - 12 * cp1x + 6 * cp2x;\n let a = -3 * begx + 9 * cp1x - 9 * cp2x + 3 * endx;\n let c = 3 * cp1x - 3 * begx;\n\n for (let i = 0; i < 2; ++i) {\n if (i > 0) {\n b = 6 * begy - 12 * cp1y + 6 * cp2y;\n a = -3 * begy + 9 * cp1y - 9 * cp2y + 3 * endy;\n c = 3 * cp1y - 3 * begy;\n }\n\n if (abs(a) < 1e-12) {\n if (abs(b) < 1e-12) {\n continue;\n }\n const t = -c / b;\n if (0 < t && t < 1) {\n tvalues.push(t);\n }\n continue;\n }\n const b2ac = b * b - 4 * c * a;\n if (b2ac < 0) {\n continue;\n }\n const sqrtb2ac = sqrt(b2ac);\n const t1 = (-b + sqrtb2ac) / (2 * a);\n if (0 < t1 && t1 < 1) {\n tvalues.push(t1);\n }\n const t2 = (-b - sqrtb2ac) / (2 * a);\n if (0 < t2 && t2 < 1) {\n tvalues.push(t2);\n }\n }\n\n let j = tvalues.length;\n const jlen = j;\n const iterator = getPointOnCubicBezierIterator(\n begx,\n begy,\n cp1x,\n cp1y,\n cp2x,\n cp2y,\n endx,\n endy,\n );\n while (j--) {\n const { x, y } = iterator(tvalues[j]);\n bounds[0][j] = x;\n bounds[1][j] = y;\n }\n\n bounds[0][jlen] = begx;\n bounds[1][jlen] = begy;\n bounds[0][jlen + 1] = endx;\n bounds[1][jlen + 1] = endy;\n const result: TRectBounds = [\n new Point(Math.min(...bounds[0]), Math.min(...bounds[1])),\n new Point(Math.max(...bounds[0]), Math.max(...bounds[1])),\n ];\n if (config.cachesBoundsOfCurve) {\n cache.boundsOfCurveCache[argsString!] = result;\n }\n return result;\n}\n\n/**\n * Converts arc to a bunch of cubic Bezier curves\n * @param {number} fx starting point x\n * @param {number} fy starting point y\n * @param {TParsedArcCommand} coords Arc command\n */\nexport const fromArcToBeziers = (\n fx: number,\n fy: number,\n [_, rx, ry, rot, large, sweep, tx, ty]: TParsedArcCommand,\n): TParsedAbsoluteCubicCurveCommand[] => {\n const segsNorm = arcToSegments(tx - fx, ty - fy, rx, ry, large, sweep, rot);\n\n for (let i = 0, len = segsNorm.length; i < len; i++) {\n segsNorm[i][1] += fx;\n segsNorm[i][2] += fy;\n segsNorm[i][3] += fx;\n segsNorm[i][4] += fy;\n segsNorm[i][5] += fx;\n segsNorm[i][6] += fy;\n }\n return segsNorm;\n};\n\n/**\n * This function takes a parsed SVG path and makes it simpler for fabricJS logic.\n * Simplification consist of:\n * - All commands converted to absolute (lowercase to uppercase)\n * - S converted to C\n * - T converted to Q\n * - A converted to C\n * @param {TComplexPathData} path the array of commands of a parsed SVG path for `Path`\n * @return {TSimplePathData} the simplified array of commands of a parsed SVG path for `Path`\n * TODO: figure out how to remove the type assertions in a nice way\n */\nexport const makePathSimpler = (path: TComplexPathData): TSimplePathData => {\n // x and y represent the last point of the path, AKA the previous command point.\n // we add them to each relative command to make it an absolute comment.\n // we also swap the v V h H with L, because are easier to transform.\n let x = 0,\n y = 0;\n // x1 and y1 represent the last point of the subpath. the subpath is started with\n // m or M command. When a z or Z command is drawn, x and y need to be reset to\n // the last x1 and y1.\n let x1 = 0,\n y1 = 0;\n // previous will host the letter of the previous command, to handle S and T.\n // controlX and controlY will host the previous reflected control point\n const destinationPath: TSimplePathData = [];\n let previous,\n // placeholders\n controlX = 0,\n controlY = 0;\n for (const parsedCommand of path) {\n const current: TComplexParsedCommand = [...parsedCommand];\n let converted: TSimpleParsedCommand | undefined;\n switch (\n current[0] // first letter\n ) {\n case 'l': // lineto, relative\n current[1] += x;\n current[2] += y;\n // falls through\n case 'L':\n x = current[1];\n y = current[2];\n converted = ['L', x, y];\n break;\n case 'h': // horizontal lineto, relative\n current[1] += x;\n // falls through\n case 'H':\n x = current[1];\n converted = ['L', x, y];\n break;\n case 'v': // vertical lineto, relative\n current[1] += y;\n // falls through\n case 'V':\n y = current[1];\n converted = ['L', x, y];\n break;\n case 'm': // moveTo, relative\n current[1] += x;\n current[2] += y;\n // falls through\n case 'M':\n x = current[1];\n y = current[2];\n x1 = current[1];\n y1 = current[2];\n converted = ['M', x, y];\n break;\n case 'c': // bezierCurveTo, relative\n current[1] += x;\n current[2] += y;\n current[3] += x;\n current[4] += y;\n current[5] += x;\n current[6] += y;\n // falls through\n case 'C':\n controlX = current[3];\n controlY = current[4];\n x = current[5];\n y = current[6];\n converted = ['C', current[1], current[2], controlX, controlY, x, y];\n break;\n case 's': // shorthand cubic bezierCurveTo, relative\n current[1] += x;\n current[2] += y;\n current[3] += x;\n current[4] += y;\n // falls through\n case 'S':\n // would be sScC but since we are swapping sSc for C, we check just that.\n if (previous === 'C') {\n // calculate reflection of previous control points\n controlX = 2 * x - controlX;\n controlY = 2 * y - controlY;\n } else {\n // If there is no previous command or if the previous command was not a C, c, S, or s,\n // the control point is coincident with the current point\n controlX = x;\n controlY = y;\n }\n x = current[3];\n y = current[4];\n converted = ['C', controlX, controlY, current[1], current[2], x, y];\n // converted[3] and converted[4] are NOW the second control point.\n // we keep it for the next reflection.\n controlX = converted[3];\n controlY = converted[4];\n break;\n case 'q': // quadraticCurveTo, relative\n current[1] += x;\n current[2] += y;\n current[3] += x;\n current[4] += y;\n // falls through\n case 'Q':\n controlX = current[1];\n controlY = current[2];\n x = current[3];\n y = current[4];\n converted = ['Q', controlX, controlY, x, y];\n break;\n case 't': // shorthand quadraticCurveTo, relative\n current[1] += x;\n current[2] += y;\n // falls through\n case 'T':\n if (previous === 'Q') {\n // calculate reflection of previous control point\n controlX = 2 * x - controlX;\n controlY = 2 * y - controlY;\n } else {\n // If there is no previous command or if the previous command was not a Q, q, T or t,\n // assume the control point is coincident with the current point\n controlX = x;\n controlY = y;\n }\n x = current[1];\n y = current[2];\n converted = ['Q', controlX, controlY, x, y];\n break;\n case 'a':\n current[6] += x;\n current[7] += y;\n // falls through\n case 'A':\n fromArcToBeziers(x, y, current).forEach((b) => destinationPath.push(b));\n x = current[6];\n y = current[7];\n break;\n case 'z':\n case 'Z':\n x = x1;\n y = y1;\n converted = ['Z'];\n break;\n default:\n }\n if (converted) {\n destinationPath.push(converted);\n previous = converted[0];\n } else {\n previous = '';\n }\n }\n return destinationPath;\n};\n\n// todo verify if we can just use the point class here\n/**\n * Calc length from point x1,y1 to x2,y2\n * @param {number} x1 starting point x\n * @param {number} y1 starting point y\n * @param {number} x2 starting point x\n * @param {number} y2 starting point y\n * @return {number} length of segment\n */\nconst calcLineLength = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n): number => Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2);\n\n/**\n * Get an iterator that takes a percentage and returns a point\n * @param {number} begx\n * @param {number} begy\n * @param {number} cp1x\n * @param {number} cp1y\n * @param {number} cp2x\n * @param {number} cp2y\n * @param {number} endx\n * @param {number} endy\n */\nconst getPointOnCubicBezierIterator =\n (\n begx: number,\n begy: number,\n cp1x: number,\n cp1y: number,\n cp2x: number,\n cp2y: number,\n endx: number,\n endy: number,\n ) =>\n (pct: number) => {\n const c1 = CB1(pct),\n c2 = CB2(pct),\n c3 = CB3(pct),\n c4 = CB4(pct);\n return new Point(\n endx * c1 + cp2x * c2 + cp1x * c3 + begx * c4,\n endy * c1 + cp2y * c2 + cp1y * c3 + begy * c4,\n );\n };\n\nconst QB1 = (t: number) => t ** 2;\nconst QB2 = (t: number) => 2 * t * (1 - t);\nconst QB3 = (t: number) => (1 - t) ** 2;\n\nconst getTangentCubicIterator =\n (\n p1x: number,\n p1y: number,\n p2x: number,\n p2y: number,\n p3x: number,\n p3y: number,\n p4x: number,\n p4y: number,\n ) =>\n (pct: number) => {\n const qb1 = QB1(pct),\n qb2 = QB2(pct),\n qb3 = QB3(pct),\n tangentX =\n 3 * (qb3 * (p2x - p1x) + qb2 * (p3x - p2x) + qb1 * (p4x - p3x)),\n tangentY =\n 3 * (qb3 * (p2y - p1y) + qb2 * (p3y - p2y) + qb1 * (p4y - p3y));\n return Math.atan2(tangentY, tangentX);\n };\n\nconst getPointOnQuadraticBezierIterator =\n (\n p1x: number,\n p1y: number,\n p2x: number,\n p2y: number,\n p3x: number,\n p3y: number,\n ) =>\n (pct: number) => {\n const c1 = QB1(pct),\n c2 = QB2(pct),\n c3 = QB3(pct);\n return new Point(\n p3x * c1 + p2x * c2 + p1x * c3,\n p3y * c1 + p2y * c2 + p1y * c3,\n );\n };\n\nconst getTangentQuadraticIterator =\n (\n p1x: number,\n p1y: number,\n p2x: number,\n p2y: number,\n p3x: number,\n p3y: number,\n ) =>\n (pct: number) => {\n const invT = 1 - pct,\n tangentX = 2 * (invT * (p2x - p1x) + pct * (p3x - p2x)),\n tangentY = 2 * (invT * (p2y - p1y) + pct * (p3y - p2y));\n return Math.atan2(tangentY, tangentX);\n };\n\n// this will run over a path segment (a cubic or quadratic segment) and approximate it\n// with 100 segments. This will good enough to calculate the length of the curve\nconst pathIterator = (\n iterator: (pct: number) => Point,\n x1: number,\n y1: number,\n) => {\n let tempP = new Point(x1, y1),\n tmpLen = 0;\n for (let perc = 1; perc <= 100; perc += 1) {\n const p = iterator(perc / 100);\n tmpLen += calcLineLength(tempP.x, tempP.y, p.x, p.y);\n tempP = p;\n }\n return tmpLen;\n};\n\n/**\n * Given a pathInfo, and a distance in pixels, find the percentage from 0 to 1\n * that correspond to that pixels run over the path.\n * The percentage will be then used to find the correct point on the canvas for the path.\n * @param {Array} segInfo fabricJS collection of information on a parsed path\n * @param {number} distance from starting point, in pixels.\n * @return {TPointAngle} info object with x and y ( the point on canvas ) and angle, the tangent on that point;\n */\nconst findPercentageForDistance = (\n segInfo: TCurveInfo<'Q' | 'C'>,\n distance: number,\n): TPointAngle => {\n let perc = 0,\n tmpLen = 0,\n tempP: XY = { x: segInfo.x, y: segInfo.y },\n p: XY = { ...tempP },\n nextLen: number,\n nextStep = 0.01,\n lastPerc = 0;\n // nextStep > 0.0001 covers 0.00015625 that 1/64th of 1/100\n // the path\n const iterator = segInfo.iterator,\n angleFinder = segInfo.angleFinder;\n while (tmpLen < distance && nextStep > 0.0001) {\n p = iterator(perc);\n lastPerc = perc;\n nextLen = calcLineLength(tempP.x, tempP.y, p.x, p.y);\n // compare tmpLen each cycle with distance, decide next perc to test.\n if (nextLen + tmpLen > distance) {\n // we discard this step and we make smaller steps.\n perc -= nextStep;\n nextStep /= 2;\n } else {\n tempP = p;\n perc += nextStep;\n tmpLen += nextLen;\n }\n }\n return { ...p, angle: angleFinder(lastPerc) };\n};\n\n/**\n * Run over a parsed and simplified path and extract some information (length of each command and starting point)\n * @param {TSimplePathData} path parsed path commands\n * @return {TPathSegmentInfo[]} path commands information\n */\nexport const getPathSegmentsInfo = (\n path: TSimplePathData,\n): TPathSegmentInfo[] => {\n let totalLength = 0,\n //x2 and y2 are the coords of segment start\n //x1 and y1 are the coords of the current point\n x1 = 0,\n y1 = 0,\n x2 = 0,\n y2 = 0,\n iterator,\n tempInfo: TPathSegmentInfo;\n const info: TPathSegmentInfo[] = [];\n for (const current of path) {\n const basicInfo: TPathSegmentInfoCommon<keyof TPathSegmentCommandInfo> = {\n x: x1,\n y: y1,\n command: current[0],\n length: 0,\n };\n switch (\n current[0] //first letter\n ) {\n case 'M':\n tempInfo = <TPathSegmentInfoCommon<'M'>>basicInfo;\n tempInfo.x = x2 = x1 = current[1];\n tempInfo.y = y2 = y1 = current[2];\n break;\n case 'L':\n tempInfo = <TPathSegmentInfoCommon<'L'>>basicInfo;\n tempInfo.length = calcLineLength(x1, y1, current[1], current[2]);\n x1 = current[1];\n y1 = current[2];\n break;\n case 'C':\n iterator = getPointOnCubicBezierIterator(\n x1,\n y1,\n current[1],\n current[2],\n current[3],\n current[4],\n current[5],\n current[6],\n );\n tempInfo = <TCurveInfo<'C'>>basicInfo;\n tempInfo.iterator = iterator;\n tempInfo.angleFinder = getTangentCubicIterator(\n x1,\n y1,\n current[1],\n current[2],\n current[3],\n current[4],\n current[5],\n current[6],\n );\n tempInfo.length = pathIterator(iterator, x1, y1);\n\n x1 = current[5];\n y1 = current[6];\n break;\n case 'Q':\n iterator = getPointOnQuadraticBezierIterator(\n x1,\n y1,\n current[1],\n current[2],\n current[3],\n current[4],\n );\n tempInfo = <TCurveInfo<'Q'>>basicInfo;\n tempInfo.iterator = iterator;\n tempInfo.angleFinder = getTangentQuadraticIterator(\n x1,\n y1,\n current[1],\n current[2],\n current[3],\n current[4],\n );\n tempInfo.length = pathIterator(iterator, x1, y1);\n x1 = current[3];\n y1 = current[4];\n break;\n case 'Z':\n // we add those in order to ease calculations later\n tempInfo = <TEndPathInfo>basicInfo;\n tempInfo.destX = x2;\n tempInfo.destY = y2;\n tempInfo.length = calcLineLength(x1, y1, x2, y2);\n x1 = x2;\n y1 = y2;\n break;\n }\n totalLength += tempInfo.length;\n info.push(tempInfo);\n }\n info.push({ length: totalLength, x: x1, y: y1 });\n return info;\n};\n\n/**\n * Get the point on the path that is distance along the path\n * @param path\n * @param distance\n * @param infos\n */\nexport const getPointOnPath = (\n path: TSimplePathData,\n distance: number,\n infos: TPathSegmentInfo[] = getPathSegmentsInfo(path),\n): TPointAngle | undefined => {\n let i = 0;\n while (distance - infos[i].length > 0 && i < infos.length - 2) {\n distance -= infos[i].length;\n i++;\n }\n const segInfo = infos[i],\n segPercent = distance / segInfo.length,\n segment = path[i];\n\n switch (segInfo.command) {\n case 'M':\n return { x: segInfo.x, y: segInfo.y, angle: 0 };\n case 'Z':\n return {\n ...new Point(segInfo.x, segInfo.y).lerp(\n new Point(segInfo.destX, segInfo.destY),\n segPercent,\n ),\n angle: Math.atan2(segInfo.destY - segInfo.y, segInfo.destX - segInfo.x),\n };\n case 'L':\n return {\n ...new Point(segInfo.x, segInfo.y).lerp(\n new Point(segment[1]!, segment[2]!),\n segPercent,\n ),\n angle: Math.atan2(segment[2]! - segInfo.y, segment[1]! - segInfo.x),\n };\n case 'C':\n return findPercentageForDistance(segInfo, distance);\n case 'Q':\n return findPercentageForDistance(segInfo, distance);\n default:\n // throw Error('Invalid command');\n }\n};\n\nconst rePathCmdAll = new RegExp(rePathCommand, 'gi');\nconst regExpArcCommandPoints = new RegExp(reArcCommandPoints, 'g');\nconst reMyNum = new RegExp(reNum, 'gi');\nconst commandLengths = {\n m: 2,\n l: 2,\n h: 1,\n v: 1,\n c: 6,\n s: 4,\n q: 4,\n t: 2,\n a: 7,\n} as const;\n/**\n *\n * @param {string} pathString\n * @return {TComplexPathData} An array of SVG path commands\n * @example <caption>Usage</caption>\n * parsePath('M 3 4 Q 3 5 2 1 4 0 Q 9 12 2 1 4 0') === [\n * ['M', 3, 4],\n * ['Q', 3, 5, 2, 1, 4, 0],\n * ['Q', 9, 12, 2, 1, 4, 0],\n * ];\n */\nexport const parsePath = (pathString: string): TComplexPathData => {\n const chain: TComplexPathData = [];\n const all = pathString.match(rePathCmdAll) ?? [];\n for (const matchStr of all) {\n // take match string and save the first letter as the command\n const commandLetter = matchStr[0] as TComplexParsedCommandType;\n // in case of Z we have very little to do\n if (commandLetter === 'z' || commandLetter === 'Z') {\n chain.push([commandLetter]);\n continue;\n }\n const commandLength =\n commandLengths[\n commandLetter.toLowerCase() as keyof typeof commandLengths\n ];\n\n let paramArr = [];\n if (commandLetter === 'a' || commandLetter === 'A') {\n // the arc command ha some peculariaties that requires a special regex other than numbers\n // it is possible to avoid using a space between the sweep and large arc flags, making them either\n // 00, 01, 10 or 11, making them identical to a plain number for the regex reMyNum\n // reset the regexp\n regExpArcCommandPoints.lastIndex = 0;\n let out: RegExpExecArray | null;\n while ((out = regExpArcCommandPoints.exec(matchStr))) {\n paramArr.push(...out.slice(1));\n }\n } else {\n paramArr = matchStr.match(reMyNum) || [];\n }\n\n // inspect the length of paramArr, if is longer than commandLength\n // we are dealing with repeated commands\n for (let i = 0; i < paramArr.length; i += commandLength) {\n const newCommand = new Array(commandLength) as TComplexParsedCommand;\n const transformedCommand = repeatedCommands[commandLetter];\n newCommand[0] =\n i > 0 && transformedCommand ? transformedCommand : commandLetter;\n for (let j = 0; j < commandLength; j++) {\n newCommand[j + 1] = parseFloat(paramArr[i + j]);\n }\n chain.push(newCommand);\n }\n }\n return chain;\n};\n\n/**\n *\n * Converts points to a smooth SVG path\n * @param {XY[]} points Array of points\n * @param {number} [correction] Apply a correction to the path (usually we use `width / 1000`). If value is undefined 0 is used as the correction value.\n * @return {(string|number)[][]} An array of SVG path commands\n */\nexport const getSmoothPathFromPoints = (\n points: Point[],\n correction = 0,\n): TSimplePathData => {\n let p1 = new Point(points[0]),\n p2 = new Point(points[1]),\n multSignX = 1,\n multSignY = 0;\n const path: TSimplePathData = [],\n len = points.length,\n manyPoints = len > 2;\n\n if (manyPoints) {\n multSignX = points[2].x < p2.x ? -1 : points[2].x === p2.x ? 0 : 1;\n multSignY = points[2].y < p2.y ? -1 : points[2].y === p2.y ? 0 : 1;\n }\n path.push([\n 'M',\n p1.x - multSignX * correction,\n p1.y - multSignY * correction,\n ]);\n let i;\n for (i = 1; i < len; i++) {\n if (!p1.eq(p2)) {\n const midPoint = p1.midPointFrom(p2);\n // p1 is our bezier control point\n // midpoint is our endpoint\n // start point is p(i-1) value.\n path.push(['Q', p1.x, p1.y, midPoint.x, midPoint.y]);\n }\n p1 = points[i];\n if (i + 1 < points.length) {\n p2 = points[i + 1];\n }\n }\n if (manyPoints) {\n multSignX = p1.x > points[i - 2].x ? 1 : p1.x === points[i - 2].x ? 0 : -1;\n multSignY = p1.y > points[i - 2].y ? 1 : p1.y === points[i - 2].y ? 0 : -1;\n }\n path.push([\n 'L',\n p1.x + multSignX * correction,\n p1.y + multSignY * correction,\n ]);\n return path;\n};\n\n/**\n * Transform a path by transforming each segment.\n * it has to be a simplified path or it won't work.\n * WARNING: this depends from pathOffset for correct operation\n * @param {TSimplePathData} path fabricJS parsed and simplified path commands\n * @param {TMat2D} transform matrix that represent the transformation\n * @param {Point} [pathOffset] `Path.pathOffset`\n * @returns {TSimplePathData} the transformed path\n */\nexport const transformPath = (\n path: TSimplePathData,\n transform: TMat2D,\n pathOffset: Point,\n): TSimplePathData => {\n if (pathOffset) {\n transform = multiplyTransformMatrices(transform, [\n 1,\n 0,\n 0,\n 1,\n -pathOffset.x,\n -pathOffset.y,\n ]);\n }\n return path.map((pathSegment) => {\n const newSegment: TSimpleParsedCommand = [...pathSegment];\n for (let i = 1; i < pathSegment.length - 1; i += 2) {\n // TODO: is there a way to get around casting to any?\n const { x, y } = transformPoint(\n {\n x: pathSegment[i] as number,\n y: pathSegment[i + 1] as number,\n },\n transform,\n );\n newSegment[i] = x;\n newSegment[i + 1] = y;\n }\n return newSegment;\n });\n};\n\n/**\n * Returns an array of path commands to create a regular polygon\n * @param {number} numVertexes\n * @param {number} radius\n * @returns {TSimplePathData} An array of SVG path commands\n */\nexport const getRegularPolygonPath = (\n numVertexes: number,\n radius: number,\n): TSimplePathData => {\n const interiorAngle = (Math.PI * 2) / numVertexes;\n // rotationAdjustment rotates the path by 1/2 the interior angle so that the polygon always has a flat side on the bottom\n // This isn't strictly necessary, but it's how we tend to think of and expect polygons to be drawn\n let rotationAdjustment = -halfPI;\n if (numVertexes % 2 === 0) {\n rotationAdjustment += interiorAngle / 2;\n }\n const d = new Array(numVertexes + 1);\n for (let i = 0; i < numVertexes; i++) {\n const rad = i * interiorAngle + rotationAdjustment;\n const { x, y } = new Point(cos(rad), sin(rad)).scalarMultiply(radius);\n d[i] = [i === 0 ? 'M' : 'L', x, y];\n }\n d[numVertexes] = ['Z'];\n return d;\n};\n\n/**\n * Join path commands to go back to svg format\n * @param {TSimplePathData} pathData fabricJS parsed path commands\n * @param {number} fractionDigits number of fraction digits to \"leave\"\n * @return {String} joined path 'M 0 0 L 20 30'\n */\nexport const joinPath = (pathData: TSimplePathData, fractionDigits?: number) =>\n pathData\n .map((segment) => {\n return segment\n .map((arg, i) => {\n if (i === 0) return arg;\n return fractionDigits === undefined\n ? arg\n : toFixed(arg, fractionDigits);\n })\n .join(' ');\n })\n .join(' ');\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"regex.min.mjs","names":[],"sources":["../../../../src/util/path/regex.ts"],"sourcesContent":["import { reNum } from '../../parser/constants';\n\nconst commaWsp = `\\\\s*,?\\\\s*`;\n\n/**\n * p for param\n * using \"bad naming\" here because it makes the regex much easier to read\n * p is a number that is preceded by an arbitary number of spaces, maybe 0,\n * a comma or not, and then possibly more spaces or not.\n */\nconst p = `${commaWsp}(${reNum})`;\n\n// const reMoveToCommand = `(M) ?(?:${p}${p} ?)+`;\n\n// const reLineCommand = `(L) ?(?:${p}${p} ?)+`;\n\n// const reHorizontalLineCommand = `(H) ?(?:${p} ?)+`;\n\n// const reVerticalLineCommand = `(V) ?(?:${p} ?)+`;\n\n// const reClosePathCommand = String.raw`(Z)\\s*`;\n\n// const reCubicCurveCommand = `(C) ?(?:${p}${p}${p}${p}${p}${p} ?)+`;\n\n// const reCubicCurveShortcutCommand = `(S) ?(?:${p}${p}${p}${p} ?)+`;\n\n// const reQuadraticCurveCommand = `(Q) ?(?:${p}${p}${p}${p} ?)+`;\n\n// const reQuadraticCurveShortcutCommand = `(T) ?(?:${p}${p} ?)+`;\n\nexport const reArcCommandPoints = `${p}${p}${p}${commaWsp}([01])${commaWsp}([01])${p}${p}`;\n// const reArcCommand = `(A) ?(?:${reArcCommandPoints} ?)+`;\n\n// export const rePathCommandGroups =\n// `(?:(?:${reMoveToCommand})` +\n// `|(?:${reLineCommand})` +\n// `|(?:${reHorizontalLineCommand})` +\n// `|(?:${reVerticalLineCommand})` +\n// `|(?:${reClosePathCommand})` +\n// `|(?:${reCubicCurveCommand})` +\n// `|(?:${reCubicCurveShortcutCommand})` +\n// `|(?:${reQuadraticCurveCommand})` +\n// `|(?:${reQuadraticCurveShortcutCommand})` +\n// `|(?:${reArcCommand}))`;\n\nexport const rePathCommand = '[mzlhvcsqta][^mzlhvcsqta]*';\n"],"mappings":"uDAEA,MAAM,EAAW,aAQX,EAAI,GAAG,EAAA,GAAY,EAAA,GAoBZ,EAAqB,GAAG,IAAI,IAAI,IAAI,EAAA,QAAiB,EAAA,QAAiB,IAAI,IAe1E,EAAgB,6BAAA,OAAA,KAAA,mBAAA,KAAA"}
1
+ {"version":3,"file":"regex.min.mjs","names":[],"sources":["../../../../src/util/path/regex.ts"],"sourcesContent":["import { reNum } from '../../parser/constants';\n\nconst commaWsp = `\\\\s*,?\\\\s*`;\n\n/**\n * p for param\n * using \"bad naming\" here because it makes the regex much easier to read\n * p is a number that is preceded by an arbitrary number of spaces, maybe 0,\n * a comma or not, and then possibly more spaces or not.\n */\nconst p = `${commaWsp}(${reNum})`;\n\n// const reMoveToCommand = `(M) ?(?:${p}${p} ?)+`;\n\n// const reLineCommand = `(L) ?(?:${p}${p} ?)+`;\n\n// const reHorizontalLineCommand = `(H) ?(?:${p} ?)+`;\n\n// const reVerticalLineCommand = `(V) ?(?:${p} ?)+`;\n\n// const reClosePathCommand = String.raw`(Z)\\s*`;\n\n// const reCubicCurveCommand = `(C) ?(?:${p}${p}${p}${p}${p}${p} ?)+`;\n\n// const reCubicCurveShortcutCommand = `(S) ?(?:${p}${p}${p}${p} ?)+`;\n\n// const reQuadraticCurveCommand = `(Q) ?(?:${p}${p}${p}${p} ?)+`;\n\n// const reQuadraticCurveShortcutCommand = `(T) ?(?:${p}${p} ?)+`;\n\nexport const reArcCommandPoints = `${p}${p}${p}${commaWsp}([01])${commaWsp}([01])${p}${p}`;\n// const reArcCommand = `(A) ?(?:${reArcCommandPoints} ?)+`;\n\n// export const rePathCommandGroups =\n// `(?:(?:${reMoveToCommand})` +\n// `|(?:${reLineCommand})` +\n// `|(?:${reHorizontalLineCommand})` +\n// `|(?:${reVerticalLineCommand})` +\n// `|(?:${reClosePathCommand})` +\n// `|(?:${reCubicCurveCommand})` +\n// `|(?:${reCubicCurveShortcutCommand})` +\n// `|(?:${reQuadraticCurveCommand})` +\n// `|(?:${reQuadraticCurveShortcutCommand})` +\n// `|(?:${reArcCommand}))`;\n\nexport const rePathCommand = '[mzlhvcsqta][^mzlhvcsqta]*';\n"],"mappings":"uDAEA,MAAM,EAAW,aAQX,EAAI,GAAG,EAAA,GAAY,EAAA,GAoBZ,EAAqB,GAAG,IAAI,IAAI,IAAI,EAAA,QAAiB,EAAA,QAAiB,IAAI,IAe1E,EAAgB,6BAAA,OAAA,KAAA,mBAAA,KAAA"}
@@ -4,7 +4,7 @@ const commaWsp = `\\s*,?\\s*`;
4
4
  /**
5
5
  * p for param
6
6
  * using "bad naming" here because it makes the regex much easier to read
7
- * p is a number that is preceded by an arbitary number of spaces, maybe 0,
7
+ * p is a number that is preceded by an arbitrary number of spaces, maybe 0,
8
8
  * a comma or not, and then possibly more spaces or not.
9
9
  */
10
10
  const p = `${commaWsp}(${reNum})`;
@@ -1 +1 @@
1
- {"version":3,"file":"regex.mjs","names":[],"sources":["../../../../src/util/path/regex.ts"],"sourcesContent":["import { reNum } from '../../parser/constants';\n\nconst commaWsp = `\\\\s*,?\\\\s*`;\n\n/**\n * p for param\n * using \"bad naming\" here because it makes the regex much easier to read\n * p is a number that is preceded by an arbitary number of spaces, maybe 0,\n * a comma or not, and then possibly more spaces or not.\n */\nconst p = `${commaWsp}(${reNum})`;\n\n// const reMoveToCommand = `(M) ?(?:${p}${p} ?)+`;\n\n// const reLineCommand = `(L) ?(?:${p}${p} ?)+`;\n\n// const reHorizontalLineCommand = `(H) ?(?:${p} ?)+`;\n\n// const reVerticalLineCommand = `(V) ?(?:${p} ?)+`;\n\n// const reClosePathCommand = String.raw`(Z)\\s*`;\n\n// const reCubicCurveCommand = `(C) ?(?:${p}${p}${p}${p}${p}${p} ?)+`;\n\n// const reCubicCurveShortcutCommand = `(S) ?(?:${p}${p}${p}${p} ?)+`;\n\n// const reQuadraticCurveCommand = `(Q) ?(?:${p}${p}${p}${p} ?)+`;\n\n// const reQuadraticCurveShortcutCommand = `(T) ?(?:${p}${p} ?)+`;\n\nexport const reArcCommandPoints = `${p}${p}${p}${commaWsp}([01])${commaWsp}([01])${p}${p}`;\n// const reArcCommand = `(A) ?(?:${reArcCommandPoints} ?)+`;\n\n// export const rePathCommandGroups =\n// `(?:(?:${reMoveToCommand})` +\n// `|(?:${reLineCommand})` +\n// `|(?:${reHorizontalLineCommand})` +\n// `|(?:${reVerticalLineCommand})` +\n// `|(?:${reClosePathCommand})` +\n// `|(?:${reCubicCurveCommand})` +\n// `|(?:${reCubicCurveShortcutCommand})` +\n// `|(?:${reQuadraticCurveCommand})` +\n// `|(?:${reQuadraticCurveShortcutCommand})` +\n// `|(?:${reArcCommand}))`;\n\nexport const rePathCommand = '[mzlhvcsqta][^mzlhvcsqta]*';\n"],"mappings":";;AAEA,MAAM,WAAW;;;;;;;AAQjB,MAAM,IAAI,GAAG,SAAS,GAAG,MAAM;AAoB/B,MAAa,qBAAqB,GAAG,IAAI,IAAI,IAAI,SAAS,QAAQ,SAAS,QAAQ,IAAI;AAevF,MAAa,gBAAgB"}
1
+ {"version":3,"file":"regex.mjs","names":[],"sources":["../../../../src/util/path/regex.ts"],"sourcesContent":["import { reNum } from '../../parser/constants';\n\nconst commaWsp = `\\\\s*,?\\\\s*`;\n\n/**\n * p for param\n * using \"bad naming\" here because it makes the regex much easier to read\n * p is a number that is preceded by an arbitrary number of spaces, maybe 0,\n * a comma or not, and then possibly more spaces or not.\n */\nconst p = `${commaWsp}(${reNum})`;\n\n// const reMoveToCommand = `(M) ?(?:${p}${p} ?)+`;\n\n// const reLineCommand = `(L) ?(?:${p}${p} ?)+`;\n\n// const reHorizontalLineCommand = `(H) ?(?:${p} ?)+`;\n\n// const reVerticalLineCommand = `(V) ?(?:${p} ?)+`;\n\n// const reClosePathCommand = String.raw`(Z)\\s*`;\n\n// const reCubicCurveCommand = `(C) ?(?:${p}${p}${p}${p}${p}${p} ?)+`;\n\n// const reCubicCurveShortcutCommand = `(S) ?(?:${p}${p}${p}${p} ?)+`;\n\n// const reQuadraticCurveCommand = `(Q) ?(?:${p}${p}${p}${p} ?)+`;\n\n// const reQuadraticCurveShortcutCommand = `(T) ?(?:${p}${p} ?)+`;\n\nexport const reArcCommandPoints = `${p}${p}${p}${commaWsp}([01])${commaWsp}([01])${p}${p}`;\n// const reArcCommand = `(A) ?(?:${reArcCommandPoints} ?)+`;\n\n// export const rePathCommandGroups =\n// `(?:(?:${reMoveToCommand})` +\n// `|(?:${reLineCommand})` +\n// `|(?:${reHorizontalLineCommand})` +\n// `|(?:${reVerticalLineCommand})` +\n// `|(?:${reClosePathCommand})` +\n// `|(?:${reCubicCurveCommand})` +\n// `|(?:${reCubicCurveShortcutCommand})` +\n// `|(?:${reQuadraticCurveCommand})` +\n// `|(?:${reQuadraticCurveShortcutCommand})` +\n// `|(?:${reArcCommand}))`;\n\nexport const rePathCommand = '[mzlhvcsqta][^mzlhvcsqta]*';\n"],"mappings":";;AAEA,MAAM,WAAW;;;;;;;AAQjB,MAAM,IAAI,GAAG,SAAS,GAAG,MAAM;AAoB/B,MAAa,qBAAqB,GAAG,IAAI,IAAI,IAAI,SAAS,QAAQ,SAAS,QAAQ,IAAI;AAevF,MAAa,gBAAgB"}
@@ -1,5 +1,5 @@
1
1
  import { toPropertyKey } from "./toPropertyKey.mjs";
2
- //#region \0@oxc-project+runtime@0.122.0/helpers/defineProperty.js
2
+ //#region \0@oxc-project+runtime@0.126.0/helpers/defineProperty.js
3
3
  function _defineProperty(e, r, t) {
4
4
  return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {
5
5
  value: t,
@@ -1,5 +1,5 @@
1
1
  import { _typeof } from "./typeof.mjs";
2
- //#region \0@oxc-project+runtime@0.122.0/helpers/toPrimitive.js
2
+ //#region \0@oxc-project+runtime@0.126.0/helpers/toPrimitive.js
3
3
  function toPrimitive(t, r) {
4
4
  if ("object" != _typeof(t) || !t) return t;
5
5
  var e = t[Symbol.toPrimitive];
@@ -1,6 +1,6 @@
1
1
  import { _typeof } from "./typeof.mjs";
2
2
  import { toPrimitive } from "./toPrimitive.mjs";
3
- //#region \0@oxc-project+runtime@0.122.0/helpers/toPropertyKey.js
3
+ //#region \0@oxc-project+runtime@0.126.0/helpers/toPropertyKey.js
4
4
  function toPropertyKey(t) {
5
5
  var i = toPrimitive(t, "string");
6
6
  return "symbol" == _typeof(i) ? i : i + "";
@@ -1,4 +1,4 @@
1
- //#region \0@oxc-project+runtime@0.122.0/helpers/typeof.js
1
+ //#region \0@oxc-project+runtime@0.126.0/helpers/typeof.js
2
2
  function _typeof(o) {
3
3
  "@babel/helpers - typeof";
4
4
  return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(o) {
@@ -3,7 +3,7 @@ import { collectHorizontalPoint, collectVerticalPoint } from "./util/collect-poi
3
3
  import { drawHorizontalLine, drawLine, drawPointList, drawVerticalLine, drawX } from "./util/draw.mjs";
4
4
  import { collectLine } from "./util/collect-line.mjs";
5
5
  import { getObjectsByTarget } from "./util/get-objects-by-target.mjs";
6
- import { _defineProperty } from "../_virtual/_@oxc-project_runtime@0.122.0/helpers/defineProperty.mjs";
6
+ import { _defineProperty } from "../_virtual/_@oxc-project_runtime@0.126.0/helpers/defineProperty.mjs";
7
7
  import { util } from "fabric";
8
8
  //#region extensions/aligning_guidelines/index.ts
9
9
  var AligningGuidelines = class {
@@ -113,13 +113,7 @@ function ghostScalePositionHandler(dim, finalMatrix, fabricObject) {
113
113
  const matrix = fabricObject.calcTransformMatrix();
114
114
  const vpt = fabricObject.getViewportTransform();
115
115
  const _finalMatrix = util.multiplyTransformMatrices(vpt, matrix);
116
- let x = 0;
117
- let y = 0;
118
- if (this.x < 0) x = -fabricObject.width / 2 - fabricObject.cropX;
119
- else x = fabricObject.getElement().width - fabricObject.width / 2 - fabricObject.cropX;
120
- if (this.y < 0) y = -fabricObject.height / 2 - fabricObject.cropY;
121
- else y = fabricObject.getElement().height - fabricObject.height / 2 - fabricObject.cropY;
122
- return new Point(x, y).transform(_finalMatrix);
116
+ return new Point(this.x < 0 ? -fabricObject.width / 2 - fabricObject.cropX : fabricObject.getElement().width - fabricObject.width / 2 - fabricObject.cropX, this.y < 0 ? -fabricObject.height / 2 - fabricObject.cropY : fabricObject.getElement().height - fabricObject.height / 2 - fabricObject.cropY).transform(_finalMatrix);
123
117
  }
124
118
  const calcScale = (currentPoint, height, width) => Math.min(Math.abs(currentPoint.x / width), Math.abs(currentPoint.y / height));
125
119
  const flipNumericOrigin = (origin, flipped) => flipped ? 1 - origin : origin;
@@ -1 +1 @@
1
- {"version":3,"file":"croppingHandlers.mjs","names":[],"sources":["../../extensions/cropping_controls/croppingHandlers.ts"],"sourcesContent":["import type {\n TModificationEvents,\n TransformActionHandler,\n FabricImage,\n ObjectEvents,\n Control,\n TMat2D,\n} from 'fabric';\nimport { controlsUtils, Point, util } from 'fabric';\n\nconst { wrapWithFixedAnchor, wrapWithFireEvent } = controlsUtils;\n\n/**\n * Wraps a handler to swap behavior based on flip state.\n */\nexport const withFlip = (\n handler: TransformActionHandler,\n flippedHandler: TransformActionHandler,\n axis: 'flipX' | 'flipY',\n): TransformActionHandler => {\n return (eventData, transform, x, y) => {\n if (transform.target[axis]) {\n return flippedHandler(eventData, transform, x, y);\n }\n return handler(eventData, transform, x, y);\n };\n};\n\n/**\n * Wraps corner handlers to swap both X and Y behavior based on flip state.\n */\nexport const withCornerFlip = (\n xHandler: TransformActionHandler,\n xFlippedHandler: TransformActionHandler,\n yHandler: TransformActionHandler,\n yFlippedHandler: TransformActionHandler,\n): TransformActionHandler => {\n return (eventData, transform, x, y) => {\n const target = transform.target as FabricImage;\n const xResult = (target.flipX ? xFlippedHandler : xHandler)(\n eventData,\n transform,\n x,\n y,\n );\n const yResult = (target.flipY ? yFlippedHandler : yHandler)(\n eventData,\n transform,\n x,\n y,\n );\n return xResult || yResult;\n };\n};\n\n/**\n * Wrap controlsUtils.changeObjectWidth with image constrains\n */\nexport const changeImageWidth: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n const { target } = transform;\n const { width } = target;\n const image = target as FabricImage;\n const modified = controlsUtils.changeObjectWidth(eventData, transform, x, y);\n const availableWidth = image._element.width - image.cropX;\n if (modified) {\n if (image.width > availableWidth) {\n image.width = availableWidth;\n }\n if (image.width < 1) {\n image.width = 1;\n }\n }\n return width !== image.width;\n};\n\nexport const changeCropWidth = wrapWithFireEvent(\n 'CROPPING' as TModificationEvents,\n wrapWithFixedAnchor(changeImageWidth),\n);\n\n/**\n * Wrap controlsUtils.changeObjectHeight with image constrains\n */\nexport const changeImageHeight: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n const { target } = transform;\n const { height } = target;\n const image = target as FabricImage;\n const modified = controlsUtils.changeObjectHeight(eventData, transform, x, y);\n const availableHeight = image._element.height - image.cropY;\n if (modified) {\n if (image.height > availableHeight) {\n image.height = availableHeight;\n }\n if (image.height < 1) {\n image.height = 1;\n }\n }\n return height !== image.height;\n};\n\nexport const changeCropHeight = wrapWithFireEvent(\n 'CROPPING' as TModificationEvents,\n wrapWithFixedAnchor(changeImageHeight),\n);\n\nexport const changeImageCropX: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n const { target } = transform;\n const image = target as FabricImage;\n const { width, cropX } = image;\n const modified = controlsUtils.changeObjectWidth(eventData, transform, x, y);\n let newCropX = cropX + width - image.width;\n image.width = width;\n if (modified) {\n if (newCropX < 0) {\n newCropX = 0;\n }\n image.cropX = newCropX;\n // calculate new width on the base of how much crop we have now\n image.width += cropX - newCropX;\n }\n return newCropX !== cropX;\n};\n\nexport const changeImageCropY: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n const { target } = transform;\n const image = target as FabricImage;\n const { height, cropY } = image;\n const modified = controlsUtils.changeObjectHeight(eventData, transform, x, y);\n let newCropY = cropY + height - image.height;\n image.height = height;\n if (modified) {\n if (newCropY < 0) {\n newCropY = 0;\n }\n image.cropY = newCropY;\n image.height += cropY - newCropY;\n }\n return newCropY !== cropY;\n};\n\nexport const changeCropX = wrapWithFireEvent(\n 'CROPPING' as TModificationEvents,\n wrapWithFixedAnchor(changeImageCropX),\n);\n\nexport const changeCropY = wrapWithFireEvent(\n 'CROPPING' as TModificationEvents,\n wrapWithFixedAnchor(changeImageCropY),\n);\n\n/**\n * A function to counter the move action and change cropX/cropY of an image\n * Keep the image steady, but moves it inside its own cropping rectangle\n */\nexport const cropPanMoveHandler = ({ transform }: ObjectEvents['moving']) => {\n // this makes the image pan too fast.\n const { target, original } = transform;\n const fabricImage = target as FabricImage;\n const p = new Point(\n target.left - original.left,\n target.top - original.top,\n ).transform(\n util.invertTransform(\n util.createRotateMatrix({ angle: fabricImage.getTotalAngle() }),\n ),\n );\n let cropX =\n original.cropX! - (p.x / fabricImage.scaleX) * (fabricImage.flipX ? -1 : 1);\n let cropY =\n original.cropY! - (p.y / fabricImage.scaleY) * (fabricImage.flipY ? -1 : 1);\n const { width, height, _element } = fabricImage;\n if (cropX < 0) {\n cropX = 0;\n }\n if (cropY < 0) {\n cropY = 0;\n }\n if (cropX + width > _element.width) {\n cropX = _element.width - width;\n }\n if (cropY + height > _element.height) {\n cropY = _element.height - height;\n }\n fabricImage.cropX = cropX;\n fabricImage.cropY = cropY;\n fabricImage.left = original.left;\n fabricImage.top = original.top;\n};\n\n/**\n * This position handler works only for this specific use case.\n * It does not support padding nor offset, and it reduces all possible positions\n * to the main 4 corners only.\n * Any position that is < 0 is the extreme left/top, the rest are right/bottom\n */\nexport function ghostScalePositionHandler(\n this: Control,\n dim: Point, // currentDimension\n finalMatrix: TMat2D,\n fabricObject: FabricImage,\n // currentControl: Control,\n) {\n const matrix = fabricObject.calcTransformMatrix();\n const vpt = fabricObject.getViewportTransform();\n const _finalMatrix = util.multiplyTransformMatrices(vpt, matrix);\n\n let x = 0;\n let y = 0;\n if (this.x < 0) {\n x = -fabricObject.width / 2 - fabricObject.cropX;\n } else {\n x =\n fabricObject.getElement().width -\n fabricObject.width / 2 -\n fabricObject.cropX;\n }\n\n if (this.y < 0) {\n y = -fabricObject.height / 2 - fabricObject.cropY;\n } else {\n y =\n fabricObject.getElement().height -\n fabricObject.height / 2 -\n fabricObject.cropY;\n }\n return new Point(x, y).transform(_finalMatrix);\n}\n\nconst calcScale = (currentPoint: Point, height: number, width: number) =>\n Math.min(Math.abs(currentPoint.x / width), Math.abs(currentPoint.y / height));\n\nconst flipNumericOrigin = (origin: number, flipped: boolean) =>\n flipped ? 1 - origin : origin;\n\n/**\n * Reflects pointer position across object center when image is flipped.\n * This compensates for the inverted local coordinate system.\n */\n// const reflectPointerForFlip = (\n// target: FabricImage,\n// x: number,\n// y: number,\n// ): Point => {\n// if (!target.flipX && !target.flipY) {\n// return new Point(x, y);\n// }\n// const center = target.getCenterPoint();\n// return new Point(\n// target.flipX ? center.x - x : x,\n// target.flipY ? center.y - y : y,\n// );\n// };\n\n/**\n * Action handler generator that handles scaling of an image in crop mode.\n * The goal is to keep the current bounding box steady.\n * So this action handler has its own calculations for a dynamic anchor point\n */\nexport const scaleEquallyCropGenerator =\n (cx: number, cy: number): TransformActionHandler =>\n (eventData, transform, x, y) => {\n const { target } = transform as unknown as { target: FabricImage };\n const { width: fullWidth, height: fullHeight } = target.getElement();\n const remainderX = fullWidth - target.width - target.cropX;\n const remainderY = fullHeight - target.height - target.cropY;\n const anchorOriginX = flipNumericOrigin(\n cx < 0 ? 1 + remainderX / target.width : -target.cropX / target.width,\n target.flipX,\n );\n const anchorOriginY = flipNumericOrigin(\n cy < 0 ? 1 + remainderY / target.height : -target.cropY / target.height,\n target.flipY,\n );\n const constraint = target.translateToOriginPoint(\n target.getCenterPoint(),\n anchorOriginX,\n anchorOriginY,\n );\n\n const newPoint = controlsUtils.getLocalPoint(\n transform,\n anchorOriginX,\n anchorOriginY,\n x,\n y,\n );\n\n const scale = calcScale(newPoint, fullHeight, fullWidth);\n\n const scaleChangeX = scale / target.scaleX;\n const scaleChangeY = scale / target.scaleY;\n const scaledRemainderX = remainderX / scaleChangeX;\n const scaledRemainderY = remainderY / scaleChangeY;\n const newWidth = target.width / scaleChangeX;\n const newHeight = target.height / scaleChangeY;\n const newCropX =\n cx < 0\n ? fullWidth - newWidth - scaledRemainderX\n : target.cropX / scaleChangeX;\n const newCropY =\n cy < 0\n ? fullHeight - newHeight - scaledRemainderY\n : target.cropY / scaleChangeY;\n\n const boundsFailX =\n (cx < 0 ? scaledRemainderX : newCropX) + newWidth > fullWidth;\n const boundsFailY =\n (cy < 0 ? scaledRemainderY : newCropY) + newHeight > fullHeight;\n\n if (boundsFailX || boundsFailY) {\n return false;\n }\n\n target.scaleX = scale;\n target.scaleY = scale;\n target.width = newWidth;\n target.height = newHeight;\n target.cropX = newCropX;\n target.cropY = newCropY;\n const newAnchorOriginX = flipNumericOrigin(\n cx < 0 ? 1 + scaledRemainderX / newWidth : -newCropX / newWidth,\n target.flipX,\n );\n const newAnchorOriginY = flipNumericOrigin(\n cy < 0 ? 1 + scaledRemainderY / newHeight : -newCropY / newHeight,\n target.flipY,\n );\n\n target.setPositionByOrigin(constraint, newAnchorOriginX, newAnchorOriginY);\n return true;\n };\n\nexport function renderGhostImage(\n this: FabricImage,\n { ctx }: { ctx: CanvasRenderingContext2D },\n) {\n const element = this._element;\n const ghostX = -this.width / 2 - this.cropX;\n const ghostY = -this.height / 2 - this.cropY;\n\n const alpha = ctx.globalAlpha;\n ctx.globalAlpha *= 0.5;\n ctx.drawImage(element, ghostX, ghostY);\n\n ctx.strokeStyle = this.borderColor;\n // we assume this.scaleX and this.scaleY are same in an image.\n // it is not common use case to stretch images, and if it is, and is brought up,\n // this border for the image needs to be drawn differently.\n ctx.lineWidth = this.borderScaleFactor / this.scaleX;\n ctx.strokeRect(ghostX, ghostY, element.width, element.height);\n\n ctx.globalAlpha = alpha;\n}\n\nconst { capValue } = util;\n\n/**\n * Those are controls used to resize an image, similar to cropX,cropY,width,height\n * But they change the scale of an image to accomodate out of bounds resizing.\n * When resize comes back they scale the image back to what was before.\n * The memory effect for bounce back works for the same transform.\n * Once you mouseup, the bounce back is lost.\n */\nconst changeImageSizeWithAutoCoverGenerator =\n (axis: 'x' | 'y'): TransformActionHandler =>\n (_eventData, transform, x, y) => {\n const image = transform.target as FabricImage;\n const original = transform.original;\n\n const isX = axis === 'x';\n const isFlipped = isX ? image.flipX : image.flipY;\n const elementSize = isX ? image._element.width : image._element.height;\n const crossElementSize = isX ? image._element.height : image._element.width;\n const isNegativeEdge = isX\n ? transform.originX === 'right'\n : transform.originY === 'bottom';\n\n const initialSize = isX ? transform.width : transform.height;\n const initialCrossSize = isX ? transform.height : transform.width;\n const initialCrop = isX ? (original.cropX ?? 0) : (original.cropY ?? 0);\n const initialCrossCrop = isX\n ? (original.cropY ?? 0)\n : (original.cropX ?? 0);\n const initialScale = isX ? original.scaleX : original.scaleY;\n const initialCrossScale = isX ? original.scaleY : original.scaleX;\n\n const localPoint = controlsUtils.getLocalPoint(\n transform,\n transform.originX,\n transform.originY,\n x,\n y,\n );\n\n const coordinate = isX ? localPoint.x : localPoint.y;\n const rawSize = isNegativeEdge ? -coordinate : coordinate;\n const requestedSize = Math.max(10, rawSize / initialScale);\n\n const availableSize =\n isNegativeEdge !== isFlipped\n ? initialCrop + initialSize\n : elementSize - initialCrop;\n\n const setImageProps = (\n size: number,\n crossSize: number,\n scale: number,\n crop: number,\n crossCrop: number,\n ) => {\n if (isX) {\n image.width = size;\n image.height = crossSize;\n image.cropX = crop;\n image.cropY = crossCrop;\n } else {\n image.height = size;\n image.width = crossSize;\n image.cropY = crop;\n image.cropX = crossCrop;\n }\n image.scaleX = scale;\n image.scaleY = scale;\n };\n\n if (requestedSize <= availableSize) {\n const newCrop =\n isNegativeEdge !== isFlipped\n ? Math.max(0, initialCrop + initialSize - requestedSize)\n : initialCrop;\n setImageProps(\n Math.max(1, requestedSize),\n initialCrossSize,\n initialScale,\n newCrop,\n initialCrossCrop,\n );\n } else {\n const targetScaledSize = requestedSize * initialScale;\n const newScale = targetScaledSize / availableSize;\n\n const scaledCrossSize = initialCrossSize * initialCrossScale;\n const crossNaturalInView = scaledCrossSize / newScale;\n const newCrossSize = Math.min(crossNaturalInView, crossElementSize);\n const crossCenter = initialCrossCrop + initialCrossSize / 2;\n const newCrossCrop = capValue(\n crossCenter - newCrossSize / 2,\n 0,\n crossElementSize - newCrossSize,\n );\n\n setImageProps(\n availableSize,\n newCrossSize,\n newScale,\n isNegativeEdge !== isFlipped ? 0 : initialCrop,\n newCrossCrop,\n );\n }\n\n return true;\n };\n\nexport const changeImageWidthWithAutoCover =\n changeImageSizeWithAutoCoverGenerator('x');\nexport const changeImageHeightWithAutoCover =\n changeImageSizeWithAutoCoverGenerator('y');\n\nexport const changeWidthAndScaleToCover = wrapWithFireEvent(\n 'RESIZING' as TModificationEvents,\n wrapWithFixedAnchor(changeImageWidthWithAutoCover),\n);\n\nexport const changeHeightAndScaleToCover = wrapWithFireEvent(\n 'RESIZING' as TModificationEvents,\n wrapWithFixedAnchor(changeImageHeightWithAutoCover),\n);\n"],"mappings":"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"}
1
+ {"version":3,"file":"croppingHandlers.mjs","names":[],"sources":["../../extensions/cropping_controls/croppingHandlers.ts"],"sourcesContent":["import type {\n TModificationEvents,\n TransformActionHandler,\n FabricImage,\n ObjectEvents,\n Control,\n TMat2D,\n} from 'fabric';\nimport { controlsUtils, Point, util } from 'fabric';\n\nconst { wrapWithFixedAnchor, wrapWithFireEvent } = controlsUtils;\n\n/**\n * Wraps a handler to swap behavior based on flip state.\n */\nexport const withFlip = (\n handler: TransformActionHandler,\n flippedHandler: TransformActionHandler,\n axis: 'flipX' | 'flipY',\n): TransformActionHandler => {\n return (eventData, transform, x, y) => {\n if (transform.target[axis]) {\n return flippedHandler(eventData, transform, x, y);\n }\n return handler(eventData, transform, x, y);\n };\n};\n\n/**\n * Wraps corner handlers to swap both X and Y behavior based on flip state.\n */\nexport const withCornerFlip = (\n xHandler: TransformActionHandler,\n xFlippedHandler: TransformActionHandler,\n yHandler: TransformActionHandler,\n yFlippedHandler: TransformActionHandler,\n): TransformActionHandler => {\n return (eventData, transform, x, y) => {\n const target = transform.target as FabricImage;\n const xResult = (target.flipX ? xFlippedHandler : xHandler)(\n eventData,\n transform,\n x,\n y,\n );\n const yResult = (target.flipY ? yFlippedHandler : yHandler)(\n eventData,\n transform,\n x,\n y,\n );\n return xResult || yResult;\n };\n};\n\n/**\n * Wrap controlsUtils.changeObjectWidth with image constrains\n */\nexport const changeImageWidth: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n const { target } = transform;\n const { width } = target;\n const image = target as FabricImage;\n const modified = controlsUtils.changeObjectWidth(eventData, transform, x, y);\n const availableWidth = image._element.width - image.cropX;\n if (modified) {\n if (image.width > availableWidth) {\n image.width = availableWidth;\n }\n if (image.width < 1) {\n image.width = 1;\n }\n }\n return width !== image.width;\n};\n\nexport const changeCropWidth = wrapWithFireEvent(\n 'CROPPING' as TModificationEvents,\n wrapWithFixedAnchor(changeImageWidth),\n);\n\n/**\n * Wrap controlsUtils.changeObjectHeight with image constrains\n */\nexport const changeImageHeight: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n const { target } = transform;\n const { height } = target;\n const image = target as FabricImage;\n const modified = controlsUtils.changeObjectHeight(eventData, transform, x, y);\n const availableHeight = image._element.height - image.cropY;\n if (modified) {\n if (image.height > availableHeight) {\n image.height = availableHeight;\n }\n if (image.height < 1) {\n image.height = 1;\n }\n }\n return height !== image.height;\n};\n\nexport const changeCropHeight = wrapWithFireEvent(\n 'CROPPING' as TModificationEvents,\n wrapWithFixedAnchor(changeImageHeight),\n);\n\nexport const changeImageCropX: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n const { target } = transform;\n const image = target as FabricImage;\n const { width, cropX } = image;\n const modified = controlsUtils.changeObjectWidth(eventData, transform, x, y);\n let newCropX = cropX + width - image.width;\n image.width = width;\n if (modified) {\n if (newCropX < 0) {\n newCropX = 0;\n }\n image.cropX = newCropX;\n // calculate new width on the base of how much crop we have now\n image.width += cropX - newCropX;\n }\n return newCropX !== cropX;\n};\n\nexport const changeImageCropY: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n const { target } = transform;\n const image = target as FabricImage;\n const { height, cropY } = image;\n const modified = controlsUtils.changeObjectHeight(eventData, transform, x, y);\n let newCropY = cropY + height - image.height;\n image.height = height;\n if (modified) {\n if (newCropY < 0) {\n newCropY = 0;\n }\n image.cropY = newCropY;\n image.height += cropY - newCropY;\n }\n return newCropY !== cropY;\n};\n\nexport const changeCropX = wrapWithFireEvent(\n 'CROPPING' as TModificationEvents,\n wrapWithFixedAnchor(changeImageCropX),\n);\n\nexport const changeCropY = wrapWithFireEvent(\n 'CROPPING' as TModificationEvents,\n wrapWithFixedAnchor(changeImageCropY),\n);\n\n/**\n * A function to counter the move action and change cropX/cropY of an image\n * Keep the image steady, but moves it inside its own cropping rectangle\n */\nexport const cropPanMoveHandler = ({ transform }: ObjectEvents['moving']) => {\n // this makes the image pan too fast.\n const { target, original } = transform;\n const fabricImage = target as FabricImage;\n const p = new Point(\n target.left - original.left,\n target.top - original.top,\n ).transform(\n util.invertTransform(\n util.createRotateMatrix({ angle: fabricImage.getTotalAngle() }),\n ),\n );\n let cropX =\n original.cropX! - (p.x / fabricImage.scaleX) * (fabricImage.flipX ? -1 : 1);\n let cropY =\n original.cropY! - (p.y / fabricImage.scaleY) * (fabricImage.flipY ? -1 : 1);\n const { width, height, _element } = fabricImage;\n if (cropX < 0) {\n cropX = 0;\n }\n if (cropY < 0) {\n cropY = 0;\n }\n if (cropX + width > _element.width) {\n cropX = _element.width - width;\n }\n if (cropY + height > _element.height) {\n cropY = _element.height - height;\n }\n fabricImage.cropX = cropX;\n fabricImage.cropY = cropY;\n fabricImage.left = original.left;\n fabricImage.top = original.top;\n};\n\n/**\n * This position handler works only for this specific use case.\n * It does not support padding nor offset, and it reduces all possible positions\n * to the main 4 corners only.\n * Any position that is < 0 is the extreme left/top, the rest are right/bottom\n */\nexport function ghostScalePositionHandler(\n this: Control,\n dim: Point, // currentDimension\n finalMatrix: TMat2D,\n fabricObject: FabricImage,\n // currentControl: Control,\n) {\n const matrix = fabricObject.calcTransformMatrix();\n const vpt = fabricObject.getViewportTransform();\n const _finalMatrix = util.multiplyTransformMatrices(vpt, matrix);\n\n const x =\n this.x < 0\n ? -fabricObject.width / 2 - fabricObject.cropX\n : fabricObject.getElement().width -\n fabricObject.width / 2 -\n fabricObject.cropX;\n\n const y =\n this.y < 0\n ? -fabricObject.height / 2 - fabricObject.cropY\n : fabricObject.getElement().height -\n fabricObject.height / 2 -\n fabricObject.cropY;\n return new Point(x, y).transform(_finalMatrix);\n}\n\nconst calcScale = (currentPoint: Point, height: number, width: number) =>\n Math.min(Math.abs(currentPoint.x / width), Math.abs(currentPoint.y / height));\n\nconst flipNumericOrigin = (origin: number, flipped: boolean) =>\n flipped ? 1 - origin : origin;\n\n/**\n * Reflects pointer position across object center when image is flipped.\n * This compensates for the inverted local coordinate system.\n */\n// const reflectPointerForFlip = (\n// target: FabricImage,\n// x: number,\n// y: number,\n// ): Point => {\n// if (!target.flipX && !target.flipY) {\n// return new Point(x, y);\n// }\n// const center = target.getCenterPoint();\n// return new Point(\n// target.flipX ? center.x - x : x,\n// target.flipY ? center.y - y : y,\n// );\n// };\n\n/**\n * Action handler generator that handles scaling of an image in crop mode.\n * The goal is to keep the current bounding box steady.\n * So this action handler has its own calculations for a dynamic anchor point\n */\nexport const scaleEquallyCropGenerator =\n (cx: number, cy: number): TransformActionHandler =>\n (eventData, transform, x, y) => {\n const { target } = transform as unknown as { target: FabricImage };\n const { width: fullWidth, height: fullHeight } = target.getElement();\n const remainderX = fullWidth - target.width - target.cropX;\n const remainderY = fullHeight - target.height - target.cropY;\n const anchorOriginX = flipNumericOrigin(\n cx < 0 ? 1 + remainderX / target.width : -target.cropX / target.width,\n target.flipX,\n );\n const anchorOriginY = flipNumericOrigin(\n cy < 0 ? 1 + remainderY / target.height : -target.cropY / target.height,\n target.flipY,\n );\n const constraint = target.translateToOriginPoint(\n target.getCenterPoint(),\n anchorOriginX,\n anchorOriginY,\n );\n\n const newPoint = controlsUtils.getLocalPoint(\n transform,\n anchorOriginX,\n anchorOriginY,\n x,\n y,\n );\n\n const scale = calcScale(newPoint, fullHeight, fullWidth);\n\n const scaleChangeX = scale / target.scaleX;\n const scaleChangeY = scale / target.scaleY;\n const scaledRemainderX = remainderX / scaleChangeX;\n const scaledRemainderY = remainderY / scaleChangeY;\n const newWidth = target.width / scaleChangeX;\n const newHeight = target.height / scaleChangeY;\n const newCropX =\n cx < 0\n ? fullWidth - newWidth - scaledRemainderX\n : target.cropX / scaleChangeX;\n const newCropY =\n cy < 0\n ? fullHeight - newHeight - scaledRemainderY\n : target.cropY / scaleChangeY;\n\n const boundsFailX =\n (cx < 0 ? scaledRemainderX : newCropX) + newWidth > fullWidth;\n const boundsFailY =\n (cy < 0 ? scaledRemainderY : newCropY) + newHeight > fullHeight;\n\n if (boundsFailX || boundsFailY) {\n return false;\n }\n\n target.scaleX = scale;\n target.scaleY = scale;\n target.width = newWidth;\n target.height = newHeight;\n target.cropX = newCropX;\n target.cropY = newCropY;\n const newAnchorOriginX = flipNumericOrigin(\n cx < 0 ? 1 + scaledRemainderX / newWidth : -newCropX / newWidth,\n target.flipX,\n );\n const newAnchorOriginY = flipNumericOrigin(\n cy < 0 ? 1 + scaledRemainderY / newHeight : -newCropY / newHeight,\n target.flipY,\n );\n\n target.setPositionByOrigin(constraint, newAnchorOriginX, newAnchorOriginY);\n return true;\n };\n\nexport function renderGhostImage(\n this: FabricImage,\n { ctx }: { ctx: CanvasRenderingContext2D },\n) {\n const element = this._element;\n const ghostX = -this.width / 2 - this.cropX;\n const ghostY = -this.height / 2 - this.cropY;\n\n const alpha = ctx.globalAlpha;\n ctx.globalAlpha *= 0.5;\n ctx.drawImage(element, ghostX, ghostY);\n\n ctx.strokeStyle = this.borderColor;\n // we assume this.scaleX and this.scaleY are same in an image.\n // it is not common use case to stretch images, and if it is, and is brought up,\n // this border for the image needs to be drawn differently.\n ctx.lineWidth = this.borderScaleFactor / this.scaleX;\n ctx.strokeRect(ghostX, ghostY, element.width, element.height);\n\n ctx.globalAlpha = alpha;\n}\n\nconst { capValue } = util;\n\n/**\n * Those are controls used to resize an image, similar to cropX,cropY,width,height\n * But they change the scale of an image to accomodate out of bounds resizing.\n * When resize comes back they scale the image back to what was before.\n * The memory effect for bounce back works for the same transform.\n * Once you mouseup, the bounce back is lost.\n */\nconst changeImageSizeWithAutoCoverGenerator =\n (axis: 'x' | 'y'): TransformActionHandler =>\n (_eventData, transform, x, y) => {\n const image = transform.target as FabricImage;\n const original = transform.original;\n\n const isX = axis === 'x';\n const isFlipped = isX ? image.flipX : image.flipY;\n const elementSize = isX ? image._element.width : image._element.height;\n const crossElementSize = isX ? image._element.height : image._element.width;\n const isNegativeEdge = isX\n ? transform.originX === 'right'\n : transform.originY === 'bottom';\n\n const initialSize = isX ? transform.width : transform.height;\n const initialCrossSize = isX ? transform.height : transform.width;\n const initialCrop = isX ? (original.cropX ?? 0) : (original.cropY ?? 0);\n const initialCrossCrop = isX\n ? (original.cropY ?? 0)\n : (original.cropX ?? 0);\n const initialScale = isX ? original.scaleX : original.scaleY;\n const initialCrossScale = isX ? original.scaleY : original.scaleX;\n\n const localPoint = controlsUtils.getLocalPoint(\n transform,\n transform.originX,\n transform.originY,\n x,\n y,\n );\n\n const coordinate = isX ? localPoint.x : localPoint.y;\n const rawSize = isNegativeEdge ? -coordinate : coordinate;\n const requestedSize = Math.max(10, rawSize / initialScale);\n\n const availableSize =\n isNegativeEdge !== isFlipped\n ? initialCrop + initialSize\n : elementSize - initialCrop;\n\n const setImageProps = (\n size: number,\n crossSize: number,\n scale: number,\n crop: number,\n crossCrop: number,\n ) => {\n if (isX) {\n image.width = size;\n image.height = crossSize;\n image.cropX = crop;\n image.cropY = crossCrop;\n } else {\n image.height = size;\n image.width = crossSize;\n image.cropY = crop;\n image.cropX = crossCrop;\n }\n image.scaleX = scale;\n image.scaleY = scale;\n };\n\n if (requestedSize <= availableSize) {\n const newCrop =\n isNegativeEdge !== isFlipped\n ? Math.max(0, initialCrop + initialSize - requestedSize)\n : initialCrop;\n setImageProps(\n Math.max(1, requestedSize),\n initialCrossSize,\n initialScale,\n newCrop,\n initialCrossCrop,\n );\n } else {\n const targetScaledSize = requestedSize * initialScale;\n const newScale = targetScaledSize / availableSize;\n\n const scaledCrossSize = initialCrossSize * initialCrossScale;\n const crossNaturalInView = scaledCrossSize / newScale;\n const newCrossSize = Math.min(crossNaturalInView, crossElementSize);\n const crossCenter = initialCrossCrop + initialCrossSize / 2;\n const newCrossCrop = capValue(\n crossCenter - newCrossSize / 2,\n 0,\n crossElementSize - newCrossSize,\n );\n\n setImageProps(\n availableSize,\n newCrossSize,\n newScale,\n isNegativeEdge !== isFlipped ? 0 : initialCrop,\n newCrossCrop,\n );\n }\n\n return true;\n };\n\nexport const changeImageWidthWithAutoCover =\n changeImageSizeWithAutoCoverGenerator('x');\nexport const changeImageHeightWithAutoCover =\n changeImageSizeWithAutoCoverGenerator('y');\n\nexport const changeWidthAndScaleToCover = wrapWithFireEvent(\n 'RESIZING' as TModificationEvents,\n wrapWithFixedAnchor(changeImageWidthWithAutoCover),\n);\n\nexport const changeHeightAndScaleToCover = wrapWithFireEvent(\n 'RESIZING' as TModificationEvents,\n wrapWithFixedAnchor(changeImageHeightWithAutoCover),\n);\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"croppingHandlers.d.ts","sourceRoot":"","sources":["../../../extensions/cropping_controls/croppingHandlers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,sBAAsB,EACtB,WAAW,EACX,YAAY,EACZ,OAAO,EACP,MAAM,EACP,MAAM,QAAQ,CAAC;AAChB,OAAO,EAAiB,KAAK,EAAQ,MAAM,QAAQ,CAAC;AAIpD;;GAEG;AACH,eAAO,MAAM,QAAQ,GACnB,SAAS,sBAAsB,EAC/B,gBAAgB,sBAAsB,EACtC,MAAM,OAAO,GAAG,OAAO,KACtB,sBAOF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc,GACzB,UAAU,sBAAsB,EAChC,iBAAiB,sBAAsB,EACvC,UAAU,sBAAsB,EAChC,iBAAiB,sBAAsB,KACtC,sBAiBF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,sBAoB9B,CAAC;AAEF,eAAO,MAAM,eAAe,oDAG3B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,sBAoB/B,CAAC;AAEF,eAAO,MAAM,gBAAgB,oDAG5B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,sBAqB9B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,sBAoB9B,CAAC;AAEF,eAAO,MAAM,WAAW,oDAGvB,CAAC;AAEF,eAAO,MAAM,WAAW,oDAGvB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,GAAI,eAAe,YAAY,CAAC,QAAQ,CAAC,SAiCvE,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,OAAO,EACb,GAAG,EAAE,KAAK,EAAE,mBAAmB;AAC/B,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,WAAW,SA2B1B;AAQD;;;GAGG;AAgBH;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,GACnC,IAAI,MAAM,EAAE,IAAI,MAAM,KAAG,sBAuEzB,CAAC;AAEJ,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,WAAW,EACjB,EAAE,GAAG,EAAE,EAAE;IAAE,GAAG,EAAE,wBAAwB,CAAA;CAAE,QAkB3C;AA+GD,eAAO,MAAM,6BAA6B,wBACE,CAAC;AAC7C,eAAO,MAAM,8BAA8B,wBACC,CAAC;AAE7C,eAAO,MAAM,0BAA0B,oDAGtC,CAAC;AAEF,eAAO,MAAM,2BAA2B,oDAGvC,CAAC"}
1
+ {"version":3,"file":"croppingHandlers.d.ts","sourceRoot":"","sources":["../../../extensions/cropping_controls/croppingHandlers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,sBAAsB,EACtB,WAAW,EACX,YAAY,EACZ,OAAO,EACP,MAAM,EACP,MAAM,QAAQ,CAAC;AAChB,OAAO,EAAiB,KAAK,EAAQ,MAAM,QAAQ,CAAC;AAIpD;;GAEG;AACH,eAAO,MAAM,QAAQ,GACnB,SAAS,sBAAsB,EAC/B,gBAAgB,sBAAsB,EACtC,MAAM,OAAO,GAAG,OAAO,KACtB,sBAOF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc,GACzB,UAAU,sBAAsB,EAChC,iBAAiB,sBAAsB,EACvC,UAAU,sBAAsB,EAChC,iBAAiB,sBAAsB,KACtC,sBAiBF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,sBAoB9B,CAAC;AAEF,eAAO,MAAM,eAAe,oDAG3B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,sBAoB/B,CAAC;AAEF,eAAO,MAAM,gBAAgB,oDAG5B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,sBAqB9B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,sBAoB9B,CAAC;AAEF,eAAO,MAAM,WAAW,oDAGvB,CAAC;AAEF,eAAO,MAAM,WAAW,oDAGvB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,GAAI,eAAe,YAAY,CAAC,QAAQ,CAAC,SAiCvE,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,OAAO,EACb,GAAG,EAAE,KAAK,EAAE,mBAAmB;AAC/B,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,WAAW,SAqB1B;AAQD;;;GAGG;AAgBH;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,GACnC,IAAI,MAAM,EAAE,IAAI,MAAM,KAAG,sBAuEzB,CAAC;AAEJ,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,WAAW,EACjB,EAAE,GAAG,EAAE,EAAE;IAAE,GAAG,EAAE,wBAAwB,CAAA;CAAE,QAkB3C;AA+GD,eAAO,MAAM,6BAA6B,wBACE,CAAC;AAC7C,eAAO,MAAM,8BAA8B,wBACC,CAAC;AAE7C,eAAO,MAAM,0BAA0B,oDAGtC,CAAC;AAEF,eAAO,MAAM,2BAA2B,oDAGvC,CAAC"}
@@ -1,2 +1,2 @@
1
- (function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require(`fabric`),require(`westures`)):typeof define==`function`&&define.amd?define([`exports`,`fabric`,`westures`],t):t((e=typeof globalThis<`u`?globalThis:e||self).fabricExtensions={},e.fabric,e.westures)})(this,function(e,t,n){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var r,i,a,o=Object.create,s=Object.defineProperty,c=Object.getOwnPropertyDescriptor,l=Object.getOwnPropertyNames,u=Object.getPrototypeOf,d=Object.prototype.hasOwnProperty;function f(e,t){return Math.abs(e-t)}function p(e,t,n){let r=1/0,i=[];for(let a of t){let t=f(e[n],a[n]);r>t&&(i=[],r=t),r==t&&i.push(a)}return{dis:r,arr:i}}function m(e){let{target:t,isScale:n,isUniform:r,corner:i,point:a,diagonalPoint:o,list:s,isCenter:c}=e,{dis:l,arr:u}=p(a,s,`x`);if(l>this.margin/this.canvas.getZoom())return[];let d=u[u.length-1].x-a.x;d*=i.includes(`l`)?-1:1;let{width:f,height:m,scaleX:h,scaleY:g}=t,_=h*f+(t.strokeUniform?0:t.strokeWidth),v=(d+_)/_;if(v==0)return[];if(n?(t.set(`scaleX`,h*v),r&&t.set(`scaleY`,g*v)):(t.set(`width`,f*v),r&&t.set(`height`,m*v)),c)t.setRelativeXY(o,`center`,`center`);else{let e=this.contraryOriginMap;t.setRelativeXY(o,...e[i])}return t.setCoords(),u.map(e=>({origin:a,target:e}))}function h(e){let{target:t,isScale:n,isUniform:r,corner:i,point:a,diagonalPoint:o,list:s,isCenter:c}=e,{dis:l,arr:u}=p(a,s,`y`);if(l>this.margin/this.canvas.getZoom())return[];let d=u[u.length-1].y-a.y;d*=i.includes(`t`)?-1:1;let{width:f,height:m,scaleX:h,scaleY:g}=t,_=g*m+(t.strokeUniform?0:t.strokeWidth),v=(d+_)/_;if(v==0)return[];if(n?(t.set(`scaleY`,g*v),r&&t.set(`scaleX`,h*v)):(t.set(`height`,m*v),r&&t.set(`width`,f*v)),c)t.setRelativeXY(o,`center`,`center`);else{let e=this.contraryOriginMap;t.setRelativeXY(o,...e[i])}return t.setCoords(),u.map(e=>({origin:a,target:e}))}function g(e,t){let n=this.canvas.getTopContext(),r=this.canvas.viewportTransform,i=this.canvas.getZoom();n.save(),n.transform(...r),n.lineWidth=this.width/i,this.lineDash&&n.setLineDash(this.lineDash),n.strokeStyle=this.color,n.beginPath(),n.moveTo(e.x,e.y),n.lineTo(t.x,t.y),n.stroke(),this.lineDash&&n.setLineDash([]),this.drawX(e,-1),this.drawX(t,1),n.restore()}function _(e,t){let n=this.canvas.getTopContext(),r=this.canvas.getZoom(),i=this.xSize/r;n.save(),n.translate(e.x,e.y),n.beginPath(),n.moveTo(-i,-i),n.lineTo(i,i),n.moveTo(i,-i),n.lineTo(-i,i),n.stroke(),n.restore()}function v(e){let t=this.canvas.getTopContext(),n=this.canvas.viewportTransform,r=this.canvas.getZoom();t.save(),t.transform(...n),t.lineWidth=this.width/r,t.strokeStyle=this.color;for(let t of e)this.drawX(t,0);t.restore()}function y(){let e=[];if(!this.closeVLine)for(let t of this.verticalLines)e.push(JSON.parse(t));if(!this.closeHLine)for(let t of this.horizontalLines)e.push(JSON.parse(t));let t=e.map(e=>e.target);v.call(this,t)}function b(){if(!this.closeVLine)for(let e of this.verticalLines){let{origin:n,target:r}=JSON.parse(e),i=new t.Point(r.x,n.y);this.drawLine(i,r)}}function x(){if(!this.closeHLine)for(let e of this.horizontalLines){let{origin:n,target:r}=JSON.parse(e),i=new t.Point(n.x,r.y);this.drawLine(i,r)}}function S(e,t){let n=e.getCoords();n.push(e.getCenterPoint());let r={target:e,list:n,points:t,margin:this.margin/this.canvas.getZoom()};return{vLines:w({...r,type:`x`}),hLines:w({...r,type:`y`})}}a=(r=n)==null?{}:o(u(r)),n=((e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var i,a=l(t),o=0,u=a.length;o<u;o++)i=a[o],d.call(e,i)||i===n||s(e,i,{get:(e=>t[e]).bind(null,i),enumerable:!(r=c(t,i))||r.enumerable});return e})(!i&&r&&r.__esModule?a:s(a,`default`,{value:r,enumerable:!0}),r);let C=[[`left`,`top`],[`right`,`top`],[`right`,`bottom`],[`left`,`bottom`],[`center`,`center`]];function w(e){let{target:t,list:n,points:r,margin:i,type:a}=e,o=[],s=[],c=1/0;for(let e of n){let t=p(e,r,a);s.push(t),c>t.dis&&(c=t.dis)}if(c>i)return o;let l=!1;for(let e=0;e<n.length;e++){if(s[e].dis!=c)continue;for(let t of s[e].arr)o.push({origin:n[e],target:t});if(l)continue;l=!0;let r=s[e].arr[0][a]-n[e][a];n.forEach(e=>{e[a]+=r}),t.setXY(n[e],...C[e]),t.setCoords()}return o}function T(e){let n=new Set,r=e.canvas;if(!r)return n;let i=e instanceof t.ActiveSelection?e.getObjects():[e];return r.forEachObject(e=>{e.isOnScreen()&&e.visible&&(e.constructor==t.Group?D(n,e):n.add(e))}),E(n,i),n}function E(e,n){for(let r of n)r.constructor==t.Group?E(e,r.getObjects()):e.delete(r)}function D(e,n){let r=n.getObjects();for(let n of r)n.visible&&(n.constructor==t.Group?D(e,n):e.add(n))}function O(e){return O=typeof Symbol==`function`&&typeof Symbol.iterator==`symbol`?function(e){return typeof e}:function(e){return e&&typeof Symbol==`function`&&e.constructor===Symbol&&e!==Symbol.prototype?`symbol`:typeof e},O(e)}function ee(e){var t=function(e,t){if(O(e)!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(O(r)!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}(e,`string`);return O(t)==`symbol`?t:t+``}function k(e,t,n){return(t=ee(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}let A=(e,n=`left`,r=`top`)=>async function(i,...a){let{originX:o=n,originY:s=r}=i;delete i.originX,delete i.originY;let c=await e.call(this,i,...a),l=new t.Point(c.left,c.top);return c.setPositionByOrigin(l,o,s),c},j=e=>async function(n){let{colorStops:r}=n,i=r==null?void 0:r.map(({color:e,opacity:n,offset:r})=>n===void 0||n===1?{color:e,offset:r}:{color:new t.Color(e).setAlpha(n).toRgba(),offset:r});return await e.call(this,{...n,colorStops:i})},{wrapWithFixedAnchor:M,wrapWithFireEvent:N}=t.controlsUtils,P=(e,t,n)=>(r,i,a,o)=>i.target[n]?t(r,i,a,o):e(r,i,a,o),F=(e,t,n,r)=>(i,a,o,s)=>{let c=a.target,l=(c.flipX?t:e)(i,a,o,s),u=(c.flipY?r:n)(i,a,o,s);return l||u},I=N(`CROPPING`,M((e,n,r,i)=>{let{target:a}=n,{width:o}=a,s=a,c=t.controlsUtils.changeObjectWidth(e,n,r,i),l=s._element.width-s.cropX;return c&&(s.width>l&&(s.width=l),s.width<1&&(s.width=1)),o!==s.width})),L=N(`CROPPING`,M((e,n,r,i)=>{let{target:a}=n,{height:o}=a,s=a,c=t.controlsUtils.changeObjectHeight(e,n,r,i),l=s._element.height-s.cropY;return c&&(s.height>l&&(s.height=l),s.height<1&&(s.height=1)),o!==s.height})),R=N(`CROPPING`,M((e,n,r,i)=>{let{target:a}=n,o=a,{width:s,cropX:c}=o,l=t.controlsUtils.changeObjectWidth(e,n,r,i),u=c+s-o.width;return o.width=s,l&&(u<0&&(u=0),o.cropX=u,o.width+=c-u),u!==c})),z=N(`CROPPING`,M((e,n,r,i)=>{let{target:a}=n,o=a,{height:s,cropY:c}=o,l=t.controlsUtils.changeObjectHeight(e,n,r,i),u=c+s-o.height;return o.height=s,l&&(u<0&&(u=0),o.cropY=u,o.height+=c-u),u!==c})),B=({transform:e})=>{let{target:n,original:r}=e,i=n,a=new t.Point(n.left-r.left,n.top-r.top).transform(t.util.invertTransform(t.util.createRotateMatrix({angle:i.getTotalAngle()}))),o=r.cropX-a.x/i.scaleX*(i.flipX?-1:1),s=r.cropY-a.y/i.scaleY*(i.flipY?-1:1),{width:c,height:l,_element:u}=i;o<0&&(o=0),s<0&&(s=0),o+c>u.width&&(o=u.width-c),s+l>u.height&&(s=u.height-l),i.cropX=o,i.cropY=s,i.left=r.left,i.top=r.top};function V(e,n,r){let i=r.calcTransformMatrix(),a=r.getViewportTransform(),o=t.util.multiplyTransformMatrices(a,i),s=0,c=0;return s=this.x<0?-r.width/2-r.cropX:r.getElement().width-r.width/2-r.cropX,c=this.y<0?-r.height/2-r.cropY:r.getElement().height-r.height/2-r.cropY,new t.Point(s,c).transform(o)}let H=(e,t)=>t?1-e:e,U=(e,n)=>(r,i,a,o)=>{let{target:s}=i,{width:c,height:l}=s.getElement(),u=c-s.width-s.cropX,d=l-s.height-s.cropY,f=H(e<0?1+u/s.width:-s.cropX/s.width,s.flipX),p=H(n<0?1+d/s.height:-s.cropY/s.height,s.flipY),m=s.translateToOriginPoint(s.getCenterPoint(),f,p),h=(g=t.controlsUtils.getLocalPoint(i,f,p,a,o),_=l,v=c,Math.min(Math.abs(g.x/v),Math.abs(g.y/_)));var g,_,v;let y=h/s.scaleX,b=h/s.scaleY,x=u/y,S=d/b,C=s.width/y,w=s.height/b,T=e<0?c-C-x:s.cropX/y,E=n<0?l-w-S:s.cropY/b;if((e<0?x:T)+C>c||(n<0?S:E)+w>l)return!1;s.scaleX=h,s.scaleY=h,s.width=C,s.height=w,s.cropX=T,s.cropY=E;let D=H(e<0?1+x/C:-T/C,s.flipX),O=H(n<0?1+S/w:-E/w,s.flipY);return s.setPositionByOrigin(m,D,O),!0};function W({ctx:e}){let t=this._element,n=-this.width/2-this.cropX,r=-this.height/2-this.cropY,i=e.globalAlpha;e.globalAlpha*=.5,e.drawImage(t,n,r),e.strokeStyle=this.borderColor,e.lineWidth=this.borderScaleFactor/this.scaleX,e.strokeRect(n,r,t.width,t.height),e.globalAlpha=i}let{capValue:te}=t.util,ne=e=>(n,r,i,a)=>{var o,s,c,l;let u=r.target,d=r.original,f=e===`x`,p=f?u.flipX:u.flipY,m=f?u._element.width:u._element.height,h=f?u._element.height:u._element.width,g=f?r.originX===`right`:r.originY===`bottom`,_=f?r.width:r.height,v=f?r.height:r.width,y=f?(o=d.cropX)==null?0:o:(s=d.cropY)==null?0:s,b=f?(c=d.cropY)==null?0:c:(l=d.cropX)==null?0:l,x=f?d.scaleX:d.scaleY,S=f?d.scaleY:d.scaleX,C=t.controlsUtils.getLocalPoint(r,r.originX,r.originY,i,a),w=f?C.x:C.y,T=g?-w:w,E=Math.max(10,T/x),D=g===p?m-y:y+_,O=(e,t,n,r,i)=>{f?(u.width=e,u.height=t,u.cropX=r,u.cropY=i):(u.height=e,u.width=t,u.cropY=r,u.cropX=i),u.scaleX=n,u.scaleY=n};if(E<=D){let e=g===p?y:Math.max(0,y+_-E);O(Math.max(1,E),v,x,e,b)}else{let e=E*x/D,t=v*S/e,n=Math.min(t,h);O(D,n,e,g===p?y:0,te(b+v/2-n/2,0,h-n))}return!0},re=ne(`x`),ie=ne(`y`),G=N(`RESIZING`,M(re)),K=N(`RESIZING`,M(ie)),{degreesToRadians:ae}=t.util,{createRotateMatrix:oe,createTranslateMatrix:se,multiplyTransformMatrixArray:ce}=t.util;function q(e,n,r,i){var a;if(((a=n.canvas)==null?void 0:a.getActiveObject())!==n||!n.isControlVisible(e))return!1;let{tl:o,tr:s,br:c,bl:l}=i,u=new t.Point((o.x+s.x+c.x+l.x)/4,(o.y+s.y+c.y+l.y)/4),d=this.sizeX||n.cornerSize,f=(this.sizeY||n.cornerSize)/2,p=(n.angle||0)+(this.angle||0),m=ce([se(u.x,u.y),oe({angle:p})]),h=[new t.Point(-f,-f).transform(m),new t.Point(d+f,-f).transform(m),new t.Point(d+f,f).transform(m),new t.Point(-f,f).transform(m)],g=[new t.Point(-f,-f).transform(m),new t.Point(f,-f).transform(m),new t.Point(f,d+f).transform(m),new t.Point(-f,d+f).transform(m)];return t.Intersection.isPointInPolygon(r,h)||t.Intersection.isPointInPolygon(r,g)}function J(e,t,n,r,i){e.save();let{stroke:a,xSize:o,ySize:s}=this.commonRenderProps(e,t,n,i,r),c=Math.max(o,s),l=Math.min(o,s),u=c/2,d=2*i.borderScaleFactor;e.rotate(ae(this.angle)),e.lineCap=`round`,e.beginPath(),e.moveTo(-u,0),e.lineTo(u,0),a&&(e.lineWidth=l,e.stroke()),e.strokeStyle=e.fillStyle,e.lineWidth=a?l-d:l,e.stroke(),e.restore()}function Y(e,t,n,r,i){e.save();let{stroke:a,xSize:o,ySize:s}=this.commonRenderProps(e,t,n,i,r),c=o,l=s,u=2*i.borderScaleFactor;e.rotate(ae(this.angle)),e.lineCap=`round`,e.lineJoin=`round`;let d=()=>{e.beginPath(),e.moveTo(c,0),e.lineTo(0,0),e.lineTo(0,c)};a&&(e.lineWidth=l,d(),e.stroke()),e.strokeStyle=e.fillStyle,e.lineWidth=a?l-u:l,d(),e.stroke(),e.restore()}let{scaleCursorStyleHandler:X}=t.controlsUtils,Z=()=>`crop`,le=()=>({tls:new t.Control({x:-.5,y:-.5,cursorStyleHandler:X,positionHandler:V,actionHandler:U(-.5,-.5)}),brs:new t.Control({x:.5,y:.5,cursorStyleHandler:X,positionHandler:V,actionHandler:U(.5,.5)}),trs:new t.Control({x:.5,y:-.5,cursorStyleHandler:X,positionHandler:V,actionHandler:U(.5,-.5)}),bls:new t.Control({x:-.5,y:.5,cursorStyleHandler:X,positionHandler:V,actionHandler:U(-.5,.5)}),mlc:new t.Control({x:-.5,y:0,angle:90,sizeX:8,sizeY:16,render:J,cursorStyleHandler:X,actionHandler:P(R,I,`flipX`),getActionName:Z}),mrc:new t.Control({x:.5,y:0,angle:90,sizeX:8,sizeY:16,render:J,cursorStyleHandler:X,actionHandler:P(I,R,`flipX`),getActionName:Z}),mbc:new t.Control({x:0,y:.5,angle:0,sizeX:16,sizeY:8,render:J,cursorStyleHandler:X,actionHandler:P(L,z,`flipY`),getActionName:Z}),mtc:new t.Control({x:0,y:-.5,angle:0,sizeX:16,sizeY:8,render:J,cursorStyleHandler:X,actionHandler:P(z,L,`flipY`),getActionName:Z}),tlc:new t.Control({angle:0,x:-.5,y:-.5,sizeX:12,sizeY:8,render:Y,shouldActivate:q,cursorStyleHandler:X,actionHandler:F(R,I,z,L),getActionName:Z}),trc:new t.Control({angle:90,x:.5,y:-.5,sizeX:12,sizeY:8,render:Y,shouldActivate:q,cursorStyleHandler:X,actionHandler:F(I,R,z,L),getActionName:Z}),blc:new t.Control({angle:270,x:-.5,y:.5,sizeX:12,sizeY:8,render:Y,shouldActivate:q,cursorStyleHandler:X,actionHandler:F(R,I,L,z),getActionName:Z}),brc:new t.Control({angle:180,x:.5,y:.5,sizeX:12,sizeY:8,render:Y,shouldActivate:q,cursorStyleHandler:X,actionHandler:F(I,R,L,z),getActionName:Z})}),Q=()=>`resizing`,$=(e,n)=>{let{width:r,height:i}=e,{colorStops:a,coords:o,gradientUnits:s}=n,c=s===`percentage`,l=e.calcTransformMatrix(),u=e.getViewportTransform();return{width:r,height:i,colorStops:a,coords:o,isPerc:c,_finalMatrix:t.util.multiplyTransformMatrixArray([u,l])}},ue=(e,n)=>function(r,i,a){let{width:o,height:s,isPerc:c,coords:l,colorStops:u,_finalMatrix:d}=$(a,e),f=new t.Point(l.x1*(c?o:1)-o/2,l.y1*(c?s:1)-s/2),p=new t.Point(l.x2*(c?o:1)-o/2,l.y2*(c?s:1)-s/2),m=u[n].offset;return f.lerp(p,m).transform(d)},de=(e,n)=>function(r,i,a){let{width:o,height:s,isPerc:c,coords:l,_finalMatrix:u}=$(a,e);return(n===1?new t.Point(l.x1*(c?o:1)-o/2,l.y1*(c?s:1)-s/2):new t.Point(l.x2*(c?o:1)-o/2,l.y2*(c?s:1)-s/2)).transform(u)},fe=(e,n)=>(r,{target:i},a,o)=>{let{width:s,height:c,isPerc:l,coords:{x1:u,x2:d,y1:f,y2:p},colorStops:m}=$(i,e),h=t.util.sendPointToPlane(new t.Point(a,o),void 0,i.calcTransformMatrix()).add(new t.Point(s/2,c/2)),g=new t.Point(u*(l?s:1),f*(l?c:1)),_=t.util.createVector(g,new t.Point(d*(l?s:1),p*(l?c:1))),v=t.util.createVector(g,h),y=t.util.dotProduct(v,_)/t.util.dotProduct(_,_);return m[n].offset=t.util.capValue(0,y,1),i.set(`dirty`,!0),!0},pe=(e,n)=>(r,{target:i},a,o)=>{let{width:s,height:c,isPerc:l,coords:u}=$(i,e),d=t.util.sendPointToPlane(new t.Point(a,o),void 0,i.calcTransformMatrix()).add(new t.Point(s/2,c/2));return n===1&&(u.x1=d.x/(l?s:1),u.y1=d.y/(l?c:1)),n===2&&(u.x2=d.x/(l?s:1),u.y2=d.y/(l?c:1)),i.set(`dirty`,!0),!0},me=e=>function(n,r,i,a,o){var s,c;n.save();let{width:l,height:u,isPerc:d,coords:f}=$(o,e),p=t.util.sendPointToPlane(new t.Point(f.x2*(d?l:1)-l/2,f.y2*(d?u:1)-u/2),t.util.multiplyTransformMatrices((s=(c=o.canvas)==null?void 0:c.viewportTransform)==null?t.iMatrix:s,o.calcTransformMatrix()));n.lineWidth=o.borderScaleFactor,n.beginPath(),n.moveTo(r,i),n.lineTo(p.x,p.y),n.stroke(),t.controlsUtils.renderCircleControl.call(this,n,r,i,a,o),n.restore()};e.AligningGuidelines=class{constructor(e,t={}){k(this,`canvas`,void 0),k(this,`horizontalLines`,new Set),k(this,`verticalLines`,new Set),k(this,`cacheMap`,new Map),k(this,`onlyDrawPoint`,!1),k(this,`contraryOriginMap`,{tl:[`right`,`bottom`],tr:[`left`,`bottom`],br:[`left`,`top`],bl:[`right`,`top`],mt:[`center`,`bottom`],mr:[`left`,`center`],mb:[`center`,`top`],ml:[`right`,`center`]}),k(this,`xSize`,2.4),k(this,`lineDash`,void 0),k(this,`margin`,4),k(this,`width`,1),k(this,`color`,`rgba(255,0,0,0.9)`),k(this,`closeVLine`,!1),k(this,`closeHLine`,!1),this.canvas=e,Object.assign(this,t),this.mouseUp=this.mouseUp.bind(this),this.scalingOrResizing=this.scalingOrResizing.bind(this),this.moving=this.moving.bind(this),this.beforeRender=this.beforeRender.bind(this),this.afterRender=this.afterRender.bind(this),this.initBehavior()}initBehavior(){this.canvas.on(`mouse:up`,this.mouseUp),this.canvas.on(`object:resizing`,this.scalingOrResizing),this.canvas.on(`object:scaling`,this.scalingOrResizing),this.canvas.on(`object:moving`,this.moving),this.canvas.on(`before:render`,this.beforeRender),this.canvas.on(`after:render`,this.afterRender)}getObjectsByTarget(e){return T(e)}getPointMap(e){return function(e){let t=e.getCoords();return{tl:t[0],tr:t[1],br:t[2],bl:t[3],mt:t[0].add(t[1]).scalarDivide(2),mr:t[1].add(t[2]).scalarDivide(2),mb:t[2].add(t[3]).scalarDivide(2),ml:t[3].add(t[0]).scalarDivide(2)}}(e)}getContraryMap(e){return function(e){var t;let n=(t=e.aCoords)==null?e.calcACoords():t;return{tl:n.br,tr:n.bl,br:n.tl,bl:n.tr,mt:n.br.add(n.bl).scalarDivide(2),mr:n.bl.add(n.tl).scalarDivide(2),mb:n.tl.add(n.tr).scalarDivide(2),ml:n.tr.add(n.br).scalarDivide(2)}}(e)}getCaCheMapValue(e){let t=[e.calcTransformMatrix().toString(),e.width,e.height].join(),n=this.cacheMap.get(t);if(n)return n;let r=e.getCoords();return r.push(e.getCenterPoint()),this.cacheMap.set(t,r),r}drawLine(e,t){g.call(this,e,t)}drawX(e,t){_.call(this,e,t)}mouseUp(){this.verticalLines.clear(),this.horizontalLines.clear(),this.cacheMap.clear(),this.canvas.requestRenderAll()}scalingOrResizing(e){let n=e.target;n.setCoords();let r=String(e.transform.action).startsWith(`scale`);this.verticalLines.clear(),this.horizontalLines.clear();let i=this.getObjectsByTarget(n),a=e.transform.corner;n.flipX&&(a.includes(`l`)?a=a.replace(`l`,`r`):a.includes(`r`)&&(a=a.replace(`r`,`l`))),n.flipY&&(a.includes(`t`)?a=a.replace(`t`,`b`):a.includes(`b`)&&(a=a.replace(`b`,`t`)));let o=this.getPointMap(n);if(!(a in o)||(this.onlyDrawPoint=a.includes(`m`),this.onlyDrawPoint&&n.getTotalAngle()%90!=0))return;let s=this.getContraryMap(n),c=o[a],l=s[a],u=e.transform.original.originX==`center`&&e.transform.original.originY==`center`;if(u){let e=n.group?c.transform(t.util.invertTransform(n.group.calcTransformMatrix())):c;l=l.add(e).scalarDivide(2)}let d=e.e[this.canvas.uniScaleKey],f=this.canvas.uniformScaling&&!d||!this.canvas.uniformScaling&&d;this.onlyDrawPoint&&(f=!1);let p=[];for(let e of i){let t=this.getCaCheMapValue(e);p.push(...t)}let g={target:n,point:c,diagonalPoint:l,corner:a,list:p,isScale:r,isUniform:f,isCenter:u},_=this.onlyDrawPoint&&(a.includes(`t`)||a.includes(`b`)),v=this.onlyDrawPoint&&(a.includes(`l`)||a.includes(`r`)),y=_?[]:m.call(this,g),b=v?[]:h.call(this,g);y.forEach(e=>{this.verticalLines.add(JSON.stringify(e))}),b.forEach(e=>{this.horizontalLines.add(JSON.stringify(e))})}moving(e){let t=e.target;t.setCoords(),this.onlyDrawPoint=!1,this.verticalLines.clear(),this.horizontalLines.clear();let n=this.getObjectsByTarget(t),r=[];for(let e of n)r.push(...this.getCaCheMapValue(e));let{vLines:i,hLines:a}=S.call(this,t,r);i.forEach(e=>{this.verticalLines.add(JSON.stringify(e))}),a.forEach(e=>{this.horizontalLines.add(JSON.stringify(e))})}beforeRender(){this.canvas.clearContext(this.canvas.contextTop)}afterRender(){this.onlyDrawPoint?y.call(this):(b.call(this),x.call(this))}dispose(){this.canvas.off(`mouse:up`,this.mouseUp),this.canvas.off(`object:resizing`,this.scalingOrResizing),this.canvas.off(`object:scaling`,this.scalingOrResizing),this.canvas.off(`object:moving`,this.moving),this.canvas.off(`before:render`,this.beforeRender),this.canvas.off(`after:render`,this.afterRender)}},e.addGestures=e=>{let t=new n.default.Region(e.upperCanvasEl);e.addOrRemove((e,...t)=>e.removeEventListener(...t)),t.addGesture((e=>new n.default.Rotate(e.upperCanvasEl,({rotation:t,event:n})=>{e.fireEventFromPointerEvent(n,`rotate`,`rotate`,{rotation:t})}))(e)),t.addGesture((e=>new n.default.Pinch(e.upperCanvasEl,({scale:t,event:n})=>{e.fireEventFromPointerEvent(n,`pinch`,`pinch`,{scale:t})}))(e)),t.addGesture((e=>new n.default.Tap(e.upperCanvasEl,({event:t})=>{e.fireEventFromPointerEvent(t,`mouse:tripleclick`,`mousetripleclick`,void 0),t.preventDefault()},{numTaps:3,maxRetain:400}))(e)),t.addGesture((e=>new n.default.Tap(e.upperCanvasEl,({event:t})=>{e.fireEventFromPointerEvent(t,`mouse:dblclick`,`mousedblclick`,void 0),t.preventDefault()},{numTaps:2,maxRetain:300}))(e)),e.addOrRemove((e,...t)=>e.addEventListener(...t),!0)},e.changeCropHeight=L,e.changeCropWidth=I,e.changeCropX=R,e.changeCropY=z,e.changeHeightAndScaleToCover=K,e.changeWidthAndScaleToCover=G,e.createImageCroppingControls=le,e.createImageResizeControlsWithScaleToCover=()=>({mle:new t.Control({x:-.5,y:0,angle:90,sizeX:8,sizeY:16,render:J,cursorStyleHandler:X,actionHandler:G,getActionName:Q}),mre:new t.Control({x:.5,y:0,angle:90,sizeX:8,sizeY:16,render:J,cursorStyleHandler:X,actionHandler:G,getActionName:Q}),mte:new t.Control({x:0,y:-.5,angle:0,sizeX:16,sizeY:8,render:J,cursorStyleHandler:X,actionHandler:K,getActionName:Q}),mbe:new t.Control({x:0,y:.5,angle:0,sizeX:16,sizeY:8,render:J,cursorStyleHandler:X,actionHandler:K,getActionName:Q})}),e.createLinearGradientControls=function(e,n={}){let r={};return r.lgp_1=new t.Control({...n,positionHandler:de(e,1),actionHandler:pe(e,1),render:me(e)}),e.colorStops.forEach((i,a)=>{r[`lgo_${a}`]=new t.Control({...n,positionHandler:ue(e,a),actionHandler:fe(e,a)})}),r.lgp_2=new t.Control({...n,positionHandler:de(e,2),actionHandler:pe(e,2),render:t.controlsUtils.renderCircleControl}),r},e.enterCropMode=function e({target:t}){var n;let r=t,{controls:i,padding:a}=r;r.padding=0,r.controls=le(),r.on(`moving`,B),r.on(`before:render`,W),r.setCoords(),r.once(`mousedblclick`,()=>{var t;r.padding=a,r.off(`moving`,B),r.off(`before:render`,W),r.controls=i,r.setCoords(),r.once(`mousedblclick`,e),(t=r.canvas)==null||t.requestRenderAll()}),(n=r.canvas)==null||n.requestRenderAll()},e.gradientUpdaterWrapper=j,e.installGradientUpdater=()=>{t.Gradient.fromObject=j(t.Gradient.fromObject)},e.installOriginWrapperUpdater=(e,n)=>{t.BaseFabricObject._fromObject=A(t.BaseFabricObject._fromObject,e,n),t.FabricImage.fromObject=A(t.FabricImage.fromObject,e,n),t.Group.fromObject=A(t.Group.fromObject,e,n)},e.originUpdaterWrapper=A,e.pinchEventHandler=function({scale:e,target:t,scenePoint:n}){t&&this.getActiveObject()===t?(t.scaleX*=e,t.scaleY*=e):this.zoomToPoint(n,this.getZoom()*e)},e.rotateEventHandler=function({rotation:e,target:n}){n&&this.getActiveObject()===n&&n.rotate(n.angle+t.util.radiansToDegrees(e))},e.withFlip=P});
1
+ (function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require(`fabric`),require(`westures`)):typeof define==`function`&&define.amd?define([`exports`,`fabric`,`westures`],t):t((e=typeof globalThis<`u`?globalThis:e||self).fabricExtensions={},e.fabric,e.westures)})(this,function(e,t,n){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var r,i,a,o=Object.create,s=Object.defineProperty,c=Object.getOwnPropertyDescriptor,l=Object.getOwnPropertyNames,u=Object.getPrototypeOf,d=Object.prototype.hasOwnProperty;function f(e,t){return Math.abs(e-t)}function p(e,t,n){let r=1/0,i=[];for(let a of t){let t=f(e[n],a[n]);r>t&&(i=[],r=t),r==t&&i.push(a)}return{dis:r,arr:i}}function m(e){let{target:t,isScale:n,isUniform:r,corner:i,point:a,diagonalPoint:o,list:s,isCenter:c}=e,{dis:l,arr:u}=p(a,s,`x`);if(l>this.margin/this.canvas.getZoom())return[];let d=u[u.length-1].x-a.x;d*=i.includes(`l`)?-1:1;let{width:f,height:m,scaleX:h,scaleY:g}=t,_=h*f+(t.strokeUniform?0:t.strokeWidth),v=(d+_)/_;if(v==0)return[];if(n?(t.set(`scaleX`,h*v),r&&t.set(`scaleY`,g*v)):(t.set(`width`,f*v),r&&t.set(`height`,m*v)),c)t.setRelativeXY(o,`center`,`center`);else{let e=this.contraryOriginMap;t.setRelativeXY(o,...e[i])}return t.setCoords(),u.map(e=>({origin:a,target:e}))}function h(e){let{target:t,isScale:n,isUniform:r,corner:i,point:a,diagonalPoint:o,list:s,isCenter:c}=e,{dis:l,arr:u}=p(a,s,`y`);if(l>this.margin/this.canvas.getZoom())return[];let d=u[u.length-1].y-a.y;d*=i.includes(`t`)?-1:1;let{width:f,height:m,scaleX:h,scaleY:g}=t,_=g*m+(t.strokeUniform?0:t.strokeWidth),v=(d+_)/_;if(v==0)return[];if(n?(t.set(`scaleY`,g*v),r&&t.set(`scaleX`,h*v)):(t.set(`height`,m*v),r&&t.set(`width`,f*v)),c)t.setRelativeXY(o,`center`,`center`);else{let e=this.contraryOriginMap;t.setRelativeXY(o,...e[i])}return t.setCoords(),u.map(e=>({origin:a,target:e}))}function g(e,t){let n=this.canvas.getTopContext(),r=this.canvas.viewportTransform,i=this.canvas.getZoom();n.save(),n.transform(...r),n.lineWidth=this.width/i,this.lineDash&&n.setLineDash(this.lineDash),n.strokeStyle=this.color,n.beginPath(),n.moveTo(e.x,e.y),n.lineTo(t.x,t.y),n.stroke(),this.lineDash&&n.setLineDash([]),this.drawX(e,-1),this.drawX(t,1),n.restore()}function _(e,t){let n=this.canvas.getTopContext(),r=this.canvas.getZoom(),i=this.xSize/r;n.save(),n.translate(e.x,e.y),n.beginPath(),n.moveTo(-i,-i),n.lineTo(i,i),n.moveTo(i,-i),n.lineTo(-i,i),n.stroke(),n.restore()}function v(e){let t=this.canvas.getTopContext(),n=this.canvas.viewportTransform,r=this.canvas.getZoom();t.save(),t.transform(...n),t.lineWidth=this.width/r,t.strokeStyle=this.color;for(let t of e)this.drawX(t,0);t.restore()}function y(){let e=[];if(!this.closeVLine)for(let t of this.verticalLines)e.push(JSON.parse(t));if(!this.closeHLine)for(let t of this.horizontalLines)e.push(JSON.parse(t));let t=e.map(e=>e.target);v.call(this,t)}function b(){if(!this.closeVLine)for(let e of this.verticalLines){let{origin:n,target:r}=JSON.parse(e),i=new t.Point(r.x,n.y);this.drawLine(i,r)}}function x(){if(!this.closeHLine)for(let e of this.horizontalLines){let{origin:n,target:r}=JSON.parse(e),i=new t.Point(n.x,r.y);this.drawLine(i,r)}}function S(e,t){let n=e.getCoords();n.push(e.getCenterPoint());let r={target:e,list:n,points:t,margin:this.margin/this.canvas.getZoom()};return{vLines:w({...r,type:`x`}),hLines:w({...r,type:`y`})}}a=(r=n)==null?{}:o(u(r)),n=((e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var i,a=l(t),o=0,u=a.length;o<u;o++)i=a[o],d.call(e,i)||i===n||s(e,i,{get:(e=>t[e]).bind(null,i),enumerable:!(r=c(t,i))||r.enumerable});return e})(!i&&r&&r.__esModule?a:s(a,`default`,{value:r,enumerable:!0}),r);let C=[[`left`,`top`],[`right`,`top`],[`right`,`bottom`],[`left`,`bottom`],[`center`,`center`]];function w(e){let{target:t,list:n,points:r,margin:i,type:a}=e,o=[],s=[],c=1/0;for(let e of n){let t=p(e,r,a);s.push(t),c>t.dis&&(c=t.dis)}if(c>i)return o;let l=!1;for(let e=0;e<n.length;e++){if(s[e].dis!=c)continue;for(let t of s[e].arr)o.push({origin:n[e],target:t});if(l)continue;l=!0;let r=s[e].arr[0][a]-n[e][a];n.forEach(e=>{e[a]+=r}),t.setXY(n[e],...C[e]),t.setCoords()}return o}function T(e){let n=new Set,r=e.canvas;if(!r)return n;let i=e instanceof t.ActiveSelection?e.getObjects():[e];return r.forEachObject(e=>{e.isOnScreen()&&e.visible&&(e.constructor==t.Group?D(n,e):n.add(e))}),E(n,i),n}function E(e,n){for(let r of n)r.constructor==t.Group?E(e,r.getObjects()):e.delete(r)}function D(e,n){let r=n.getObjects();for(let n of r)n.visible&&(n.constructor==t.Group?D(e,n):e.add(n))}function O(e){return O=typeof Symbol==`function`&&typeof Symbol.iterator==`symbol`?function(e){return typeof e}:function(e){return e&&typeof Symbol==`function`&&e.constructor===Symbol&&e!==Symbol.prototype?`symbol`:typeof e},O(e)}function ee(e){var t=function(e,t){if(O(e)!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(O(r)!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}(e,`string`);return O(t)==`symbol`?t:t+``}function k(e,t,n){return(t=ee(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}let A=(e,n=`left`,r=`top`)=>async function(i,...a){let{originX:o=n,originY:s=r}=i;delete i.originX,delete i.originY;let c=await e.call(this,i,...a),l=new t.Point(c.left,c.top);return c.setPositionByOrigin(l,o,s),c},j=e=>async function(n){let{colorStops:r}=n,i=r==null?void 0:r.map(({color:e,opacity:n,offset:r})=>n===void 0||n===1?{color:e,offset:r}:{color:new t.Color(e).setAlpha(n).toRgba(),offset:r});return await e.call(this,{...n,colorStops:i})},{wrapWithFixedAnchor:M,wrapWithFireEvent:N}=t.controlsUtils,P=(e,t,n)=>(r,i,a,o)=>i.target[n]?t(r,i,a,o):e(r,i,a,o),F=(e,t,n,r)=>(i,a,o,s)=>{let c=a.target,l=(c.flipX?t:e)(i,a,o,s),u=(c.flipY?r:n)(i,a,o,s);return l||u},I=N(`CROPPING`,M((e,n,r,i)=>{let{target:a}=n,{width:o}=a,s=a,c=t.controlsUtils.changeObjectWidth(e,n,r,i),l=s._element.width-s.cropX;return c&&(s.width>l&&(s.width=l),s.width<1&&(s.width=1)),o!==s.width})),L=N(`CROPPING`,M((e,n,r,i)=>{let{target:a}=n,{height:o}=a,s=a,c=t.controlsUtils.changeObjectHeight(e,n,r,i),l=s._element.height-s.cropY;return c&&(s.height>l&&(s.height=l),s.height<1&&(s.height=1)),o!==s.height})),R=N(`CROPPING`,M((e,n,r,i)=>{let{target:a}=n,o=a,{width:s,cropX:c}=o,l=t.controlsUtils.changeObjectWidth(e,n,r,i),u=c+s-o.width;return o.width=s,l&&(u<0&&(u=0),o.cropX=u,o.width+=c-u),u!==c})),z=N(`CROPPING`,M((e,n,r,i)=>{let{target:a}=n,o=a,{height:s,cropY:c}=o,l=t.controlsUtils.changeObjectHeight(e,n,r,i),u=c+s-o.height;return o.height=s,l&&(u<0&&(u=0),o.cropY=u,o.height+=c-u),u!==c})),B=({transform:e})=>{let{target:n,original:r}=e,i=n,a=new t.Point(n.left-r.left,n.top-r.top).transform(t.util.invertTransform(t.util.createRotateMatrix({angle:i.getTotalAngle()}))),o=r.cropX-a.x/i.scaleX*(i.flipX?-1:1),s=r.cropY-a.y/i.scaleY*(i.flipY?-1:1),{width:c,height:l,_element:u}=i;o<0&&(o=0),s<0&&(s=0),o+c>u.width&&(o=u.width-c),s+l>u.height&&(s=u.height-l),i.cropX=o,i.cropY=s,i.left=r.left,i.top=r.top};function V(e,n,r){let i=r.calcTransformMatrix(),a=r.getViewportTransform(),o=t.util.multiplyTransformMatrices(a,i);return new t.Point(this.x<0?-r.width/2-r.cropX:r.getElement().width-r.width/2-r.cropX,this.y<0?-r.height/2-r.cropY:r.getElement().height-r.height/2-r.cropY).transform(o)}let H=(e,t)=>t?1-e:e,U=(e,n)=>(r,i,a,o)=>{let{target:s}=i,{width:c,height:l}=s.getElement(),u=c-s.width-s.cropX,d=l-s.height-s.cropY,f=H(e<0?1+u/s.width:-s.cropX/s.width,s.flipX),p=H(n<0?1+d/s.height:-s.cropY/s.height,s.flipY),m=s.translateToOriginPoint(s.getCenterPoint(),f,p),h=(g=t.controlsUtils.getLocalPoint(i,f,p,a,o),_=l,v=c,Math.min(Math.abs(g.x/v),Math.abs(g.y/_)));var g,_,v;let y=h/s.scaleX,b=h/s.scaleY,x=u/y,S=d/b,C=s.width/y,w=s.height/b,T=e<0?c-C-x:s.cropX/y,E=n<0?l-w-S:s.cropY/b;if((e<0?x:T)+C>c||(n<0?S:E)+w>l)return!1;s.scaleX=h,s.scaleY=h,s.width=C,s.height=w,s.cropX=T,s.cropY=E;let D=H(e<0?1+x/C:-T/C,s.flipX),O=H(n<0?1+S/w:-E/w,s.flipY);return s.setPositionByOrigin(m,D,O),!0};function W({ctx:e}){let t=this._element,n=-this.width/2-this.cropX,r=-this.height/2-this.cropY,i=e.globalAlpha;e.globalAlpha*=.5,e.drawImage(t,n,r),e.strokeStyle=this.borderColor,e.lineWidth=this.borderScaleFactor/this.scaleX,e.strokeRect(n,r,t.width,t.height),e.globalAlpha=i}let{capValue:te}=t.util,ne=e=>(n,r,i,a)=>{var o,s,c,l;let u=r.target,d=r.original,f=e===`x`,p=f?u.flipX:u.flipY,m=f?u._element.width:u._element.height,h=f?u._element.height:u._element.width,g=f?r.originX===`right`:r.originY===`bottom`,_=f?r.width:r.height,v=f?r.height:r.width,y=f?(o=d.cropX)==null?0:o:(s=d.cropY)==null?0:s,b=f?(c=d.cropY)==null?0:c:(l=d.cropX)==null?0:l,x=f?d.scaleX:d.scaleY,S=f?d.scaleY:d.scaleX,C=t.controlsUtils.getLocalPoint(r,r.originX,r.originY,i,a),w=f?C.x:C.y,T=g?-w:w,E=Math.max(10,T/x),D=g===p?m-y:y+_,O=(e,t,n,r,i)=>{f?(u.width=e,u.height=t,u.cropX=r,u.cropY=i):(u.height=e,u.width=t,u.cropY=r,u.cropX=i),u.scaleX=n,u.scaleY=n};if(E<=D){let e=g===p?y:Math.max(0,y+_-E);O(Math.max(1,E),v,x,e,b)}else{let e=E*x/D,t=v*S/e,n=Math.min(t,h);O(D,n,e,g===p?y:0,te(b+v/2-n/2,0,h-n))}return!0},re=ne(`x`),ie=ne(`y`),G=N(`RESIZING`,M(re)),K=N(`RESIZING`,M(ie)),{degreesToRadians:ae}=t.util,{createRotateMatrix:oe,createTranslateMatrix:se,multiplyTransformMatrixArray:ce}=t.util;function q(e,n,r,i){var a;if(((a=n.canvas)==null?void 0:a.getActiveObject())!==n||!n.isControlVisible(e))return!1;let{tl:o,tr:s,br:c,bl:l}=i,u=new t.Point((o.x+s.x+c.x+l.x)/4,(o.y+s.y+c.y+l.y)/4),d=this.sizeX||n.cornerSize,f=(this.sizeY||n.cornerSize)/2,p=(n.angle||0)+(this.angle||0),m=ce([se(u.x,u.y),oe({angle:p})]),h=[new t.Point(-f,-f).transform(m),new t.Point(d+f,-f).transform(m),new t.Point(d+f,f).transform(m),new t.Point(-f,f).transform(m)],g=[new t.Point(-f,-f).transform(m),new t.Point(f,-f).transform(m),new t.Point(f,d+f).transform(m),new t.Point(-f,d+f).transform(m)];return t.Intersection.isPointInPolygon(r,h)||t.Intersection.isPointInPolygon(r,g)}function J(e,t,n,r,i){e.save();let{stroke:a,xSize:o,ySize:s}=this.commonRenderProps(e,t,n,i,r),c=Math.max(o,s),l=Math.min(o,s),u=c/2,d=2*i.borderScaleFactor;e.rotate(ae(this.angle)),e.lineCap=`round`,e.beginPath(),e.moveTo(-u,0),e.lineTo(u,0),a&&(e.lineWidth=l,e.stroke()),e.strokeStyle=e.fillStyle,e.lineWidth=a?l-d:l,e.stroke(),e.restore()}function Y(e,t,n,r,i){e.save();let{stroke:a,xSize:o,ySize:s}=this.commonRenderProps(e,t,n,i,r),c=o,l=s,u=2*i.borderScaleFactor;e.rotate(ae(this.angle)),e.lineCap=`round`,e.lineJoin=`round`;let d=()=>{e.beginPath(),e.moveTo(c,0),e.lineTo(0,0),e.lineTo(0,c)};a&&(e.lineWidth=l,d(),e.stroke()),e.strokeStyle=e.fillStyle,e.lineWidth=a?l-u:l,d(),e.stroke(),e.restore()}let{scaleCursorStyleHandler:X}=t.controlsUtils,Z=()=>`crop`,le=()=>({tls:new t.Control({x:-.5,y:-.5,cursorStyleHandler:X,positionHandler:V,actionHandler:U(-.5,-.5)}),brs:new t.Control({x:.5,y:.5,cursorStyleHandler:X,positionHandler:V,actionHandler:U(.5,.5)}),trs:new t.Control({x:.5,y:-.5,cursorStyleHandler:X,positionHandler:V,actionHandler:U(.5,-.5)}),bls:new t.Control({x:-.5,y:.5,cursorStyleHandler:X,positionHandler:V,actionHandler:U(-.5,.5)}),mlc:new t.Control({x:-.5,y:0,angle:90,sizeX:8,sizeY:16,render:J,cursorStyleHandler:X,actionHandler:P(R,I,`flipX`),getActionName:Z}),mrc:new t.Control({x:.5,y:0,angle:90,sizeX:8,sizeY:16,render:J,cursorStyleHandler:X,actionHandler:P(I,R,`flipX`),getActionName:Z}),mbc:new t.Control({x:0,y:.5,angle:0,sizeX:16,sizeY:8,render:J,cursorStyleHandler:X,actionHandler:P(L,z,`flipY`),getActionName:Z}),mtc:new t.Control({x:0,y:-.5,angle:0,sizeX:16,sizeY:8,render:J,cursorStyleHandler:X,actionHandler:P(z,L,`flipY`),getActionName:Z}),tlc:new t.Control({angle:0,x:-.5,y:-.5,sizeX:12,sizeY:8,render:Y,shouldActivate:q,cursorStyleHandler:X,actionHandler:F(R,I,z,L),getActionName:Z}),trc:new t.Control({angle:90,x:.5,y:-.5,sizeX:12,sizeY:8,render:Y,shouldActivate:q,cursorStyleHandler:X,actionHandler:F(I,R,z,L),getActionName:Z}),blc:new t.Control({angle:270,x:-.5,y:.5,sizeX:12,sizeY:8,render:Y,shouldActivate:q,cursorStyleHandler:X,actionHandler:F(R,I,L,z),getActionName:Z}),brc:new t.Control({angle:180,x:.5,y:.5,sizeX:12,sizeY:8,render:Y,shouldActivate:q,cursorStyleHandler:X,actionHandler:F(I,R,L,z),getActionName:Z})}),Q=()=>`resizing`,$=(e,n)=>{let{width:r,height:i}=e,{colorStops:a,coords:o,gradientUnits:s}=n,c=s===`percentage`,l=e.calcTransformMatrix(),u=e.getViewportTransform();return{width:r,height:i,colorStops:a,coords:o,isPerc:c,_finalMatrix:t.util.multiplyTransformMatrixArray([u,l])}},ue=(e,n)=>function(r,i,a){let{width:o,height:s,isPerc:c,coords:l,colorStops:u,_finalMatrix:d}=$(a,e),f=new t.Point(l.x1*(c?o:1)-o/2,l.y1*(c?s:1)-s/2),p=new t.Point(l.x2*(c?o:1)-o/2,l.y2*(c?s:1)-s/2),m=u[n].offset;return f.lerp(p,m).transform(d)},de=(e,n)=>function(r,i,a){let{width:o,height:s,isPerc:c,coords:l,_finalMatrix:u}=$(a,e);return(n===1?new t.Point(l.x1*(c?o:1)-o/2,l.y1*(c?s:1)-s/2):new t.Point(l.x2*(c?o:1)-o/2,l.y2*(c?s:1)-s/2)).transform(u)},fe=(e,n)=>(r,{target:i},a,o)=>{let{width:s,height:c,isPerc:l,coords:{x1:u,x2:d,y1:f,y2:p},colorStops:m}=$(i,e),h=t.util.sendPointToPlane(new t.Point(a,o),void 0,i.calcTransformMatrix()).add(new t.Point(s/2,c/2)),g=new t.Point(u*(l?s:1),f*(l?c:1)),_=t.util.createVector(g,new t.Point(d*(l?s:1),p*(l?c:1))),v=t.util.createVector(g,h),y=t.util.dotProduct(v,_)/t.util.dotProduct(_,_);return m[n].offset=t.util.capValue(0,y,1),i.set(`dirty`,!0),!0},pe=(e,n)=>(r,{target:i},a,o)=>{let{width:s,height:c,isPerc:l,coords:u}=$(i,e),d=t.util.sendPointToPlane(new t.Point(a,o),void 0,i.calcTransformMatrix()).add(new t.Point(s/2,c/2));return n===1&&(u.x1=d.x/(l?s:1),u.y1=d.y/(l?c:1)),n===2&&(u.x2=d.x/(l?s:1),u.y2=d.y/(l?c:1)),i.set(`dirty`,!0),!0},me=e=>function(n,r,i,a,o){var s,c;n.save();let{width:l,height:u,isPerc:d,coords:f}=$(o,e),p=t.util.sendPointToPlane(new t.Point(f.x2*(d?l:1)-l/2,f.y2*(d?u:1)-u/2),t.util.multiplyTransformMatrices((s=(c=o.canvas)==null?void 0:c.viewportTransform)==null?t.iMatrix:s,o.calcTransformMatrix()));n.lineWidth=o.borderScaleFactor,n.beginPath(),n.moveTo(r,i),n.lineTo(p.x,p.y),n.stroke(),t.controlsUtils.renderCircleControl.call(this,n,r,i,a,o),n.restore()};e.AligningGuidelines=class{constructor(e,t={}){k(this,`canvas`,void 0),k(this,`horizontalLines`,new Set),k(this,`verticalLines`,new Set),k(this,`cacheMap`,new Map),k(this,`onlyDrawPoint`,!1),k(this,`contraryOriginMap`,{tl:[`right`,`bottom`],tr:[`left`,`bottom`],br:[`left`,`top`],bl:[`right`,`top`],mt:[`center`,`bottom`],mr:[`left`,`center`],mb:[`center`,`top`],ml:[`right`,`center`]}),k(this,`xSize`,2.4),k(this,`lineDash`,void 0),k(this,`margin`,4),k(this,`width`,1),k(this,`color`,`rgba(255,0,0,0.9)`),k(this,`closeVLine`,!1),k(this,`closeHLine`,!1),this.canvas=e,Object.assign(this,t),this.mouseUp=this.mouseUp.bind(this),this.scalingOrResizing=this.scalingOrResizing.bind(this),this.moving=this.moving.bind(this),this.beforeRender=this.beforeRender.bind(this),this.afterRender=this.afterRender.bind(this),this.initBehavior()}initBehavior(){this.canvas.on(`mouse:up`,this.mouseUp),this.canvas.on(`object:resizing`,this.scalingOrResizing),this.canvas.on(`object:scaling`,this.scalingOrResizing),this.canvas.on(`object:moving`,this.moving),this.canvas.on(`before:render`,this.beforeRender),this.canvas.on(`after:render`,this.afterRender)}getObjectsByTarget(e){return T(e)}getPointMap(e){return function(e){let t=e.getCoords();return{tl:t[0],tr:t[1],br:t[2],bl:t[3],mt:t[0].add(t[1]).scalarDivide(2),mr:t[1].add(t[2]).scalarDivide(2),mb:t[2].add(t[3]).scalarDivide(2),ml:t[3].add(t[0]).scalarDivide(2)}}(e)}getContraryMap(e){return function(e){var t;let n=(t=e.aCoords)==null?e.calcACoords():t;return{tl:n.br,tr:n.bl,br:n.tl,bl:n.tr,mt:n.br.add(n.bl).scalarDivide(2),mr:n.bl.add(n.tl).scalarDivide(2),mb:n.tl.add(n.tr).scalarDivide(2),ml:n.tr.add(n.br).scalarDivide(2)}}(e)}getCaCheMapValue(e){let t=[e.calcTransformMatrix().toString(),e.width,e.height].join(),n=this.cacheMap.get(t);if(n)return n;let r=e.getCoords();return r.push(e.getCenterPoint()),this.cacheMap.set(t,r),r}drawLine(e,t){g.call(this,e,t)}drawX(e,t){_.call(this,e,t)}mouseUp(){this.verticalLines.clear(),this.horizontalLines.clear(),this.cacheMap.clear(),this.canvas.requestRenderAll()}scalingOrResizing(e){let n=e.target;n.setCoords();let r=String(e.transform.action).startsWith(`scale`);this.verticalLines.clear(),this.horizontalLines.clear();let i=this.getObjectsByTarget(n),a=e.transform.corner;n.flipX&&(a.includes(`l`)?a=a.replace(`l`,`r`):a.includes(`r`)&&(a=a.replace(`r`,`l`))),n.flipY&&(a.includes(`t`)?a=a.replace(`t`,`b`):a.includes(`b`)&&(a=a.replace(`b`,`t`)));let o=this.getPointMap(n);if(!(a in o)||(this.onlyDrawPoint=a.includes(`m`),this.onlyDrawPoint&&n.getTotalAngle()%90!=0))return;let s=this.getContraryMap(n),c=o[a],l=s[a],u=e.transform.original.originX==`center`&&e.transform.original.originY==`center`;if(u){let e=n.group?c.transform(t.util.invertTransform(n.group.calcTransformMatrix())):c;l=l.add(e).scalarDivide(2)}let d=e.e[this.canvas.uniScaleKey],f=this.canvas.uniformScaling&&!d||!this.canvas.uniformScaling&&d;this.onlyDrawPoint&&(f=!1);let p=[];for(let e of i){let t=this.getCaCheMapValue(e);p.push(...t)}let g={target:n,point:c,diagonalPoint:l,corner:a,list:p,isScale:r,isUniform:f,isCenter:u},_=this.onlyDrawPoint&&(a.includes(`t`)||a.includes(`b`)),v=this.onlyDrawPoint&&(a.includes(`l`)||a.includes(`r`)),y=_?[]:m.call(this,g),b=v?[]:h.call(this,g);y.forEach(e=>{this.verticalLines.add(JSON.stringify(e))}),b.forEach(e=>{this.horizontalLines.add(JSON.stringify(e))})}moving(e){let t=e.target;t.setCoords(),this.onlyDrawPoint=!1,this.verticalLines.clear(),this.horizontalLines.clear();let n=this.getObjectsByTarget(t),r=[];for(let e of n)r.push(...this.getCaCheMapValue(e));let{vLines:i,hLines:a}=S.call(this,t,r);i.forEach(e=>{this.verticalLines.add(JSON.stringify(e))}),a.forEach(e=>{this.horizontalLines.add(JSON.stringify(e))})}beforeRender(){this.canvas.clearContext(this.canvas.contextTop)}afterRender(){this.onlyDrawPoint?y.call(this):(b.call(this),x.call(this))}dispose(){this.canvas.off(`mouse:up`,this.mouseUp),this.canvas.off(`object:resizing`,this.scalingOrResizing),this.canvas.off(`object:scaling`,this.scalingOrResizing),this.canvas.off(`object:moving`,this.moving),this.canvas.off(`before:render`,this.beforeRender),this.canvas.off(`after:render`,this.afterRender)}},e.addGestures=e=>{let t=new n.default.Region(e.upperCanvasEl);e.addOrRemove((e,...t)=>e.removeEventListener(...t)),t.addGesture((e=>new n.default.Rotate(e.upperCanvasEl,({rotation:t,event:n})=>{e.fireEventFromPointerEvent(n,`rotate`,`rotate`,{rotation:t})}))(e)),t.addGesture((e=>new n.default.Pinch(e.upperCanvasEl,({scale:t,event:n})=>{e.fireEventFromPointerEvent(n,`pinch`,`pinch`,{scale:t})}))(e)),t.addGesture((e=>new n.default.Tap(e.upperCanvasEl,({event:t})=>{e.fireEventFromPointerEvent(t,`mouse:tripleclick`,`mousetripleclick`,void 0),t.preventDefault()},{numTaps:3,maxRetain:400}))(e)),t.addGesture((e=>new n.default.Tap(e.upperCanvasEl,({event:t})=>{e.fireEventFromPointerEvent(t,`mouse:dblclick`,`mousedblclick`,void 0),t.preventDefault()},{numTaps:2,maxRetain:300}))(e)),e.addOrRemove((e,...t)=>e.addEventListener(...t),!0)},e.changeCropHeight=L,e.changeCropWidth=I,e.changeCropX=R,e.changeCropY=z,e.changeHeightAndScaleToCover=K,e.changeWidthAndScaleToCover=G,e.createImageCroppingControls=le,e.createImageResizeControlsWithScaleToCover=()=>({mle:new t.Control({x:-.5,y:0,angle:90,sizeX:8,sizeY:16,render:J,cursorStyleHandler:X,actionHandler:G,getActionName:Q}),mre:new t.Control({x:.5,y:0,angle:90,sizeX:8,sizeY:16,render:J,cursorStyleHandler:X,actionHandler:G,getActionName:Q}),mte:new t.Control({x:0,y:-.5,angle:0,sizeX:16,sizeY:8,render:J,cursorStyleHandler:X,actionHandler:K,getActionName:Q}),mbe:new t.Control({x:0,y:.5,angle:0,sizeX:16,sizeY:8,render:J,cursorStyleHandler:X,actionHandler:K,getActionName:Q})}),e.createLinearGradientControls=function(e,n={}){let r={};return r.lgp_1=new t.Control({...n,positionHandler:de(e,1),actionHandler:pe(e,1),render:me(e)}),e.colorStops.forEach((i,a)=>{r[`lgo_${a}`]=new t.Control({...n,positionHandler:ue(e,a),actionHandler:fe(e,a)})}),r.lgp_2=new t.Control({...n,positionHandler:de(e,2),actionHandler:pe(e,2),render:t.controlsUtils.renderCircleControl}),r},e.enterCropMode=function e({target:t}){var n;let r=t,{controls:i,padding:a}=r;r.padding=0,r.controls=le(),r.on(`moving`,B),r.on(`before:render`,W),r.setCoords(),r.once(`mousedblclick`,()=>{var t;r.padding=a,r.off(`moving`,B),r.off(`before:render`,W),r.controls=i,r.setCoords(),r.once(`mousedblclick`,e),(t=r.canvas)==null||t.requestRenderAll()}),(n=r.canvas)==null||n.requestRenderAll()},e.gradientUpdaterWrapper=j,e.installGradientUpdater=()=>{t.Gradient.fromObject=j(t.Gradient.fromObject)},e.installOriginWrapperUpdater=(e,n)=>{t.BaseFabricObject._fromObject=A(t.BaseFabricObject._fromObject,e,n),t.FabricImage.fromObject=A(t.FabricImage.fromObject,e,n),t.Group.fromObject=A(t.Group.fromObject,e,n)},e.originUpdaterWrapper=A,e.pinchEventHandler=function({scale:e,target:t,scenePoint:n}){t&&this.getActiveObject()===t?(t.scaleX*=e,t.scaleY*=e):this.zoomToPoint(n,this.getZoom()*e)},e.rotateEventHandler=function({rotation:e,target:n}){n&&this.getActiveObject()===n&&n.rotate(n.angle+t.util.radiansToDegrees(e))},e.withFlip=P});
2
2
  //# sourceMappingURL=fabric-extensions.min.js.map