fabric 7.0.0 → 7.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.husky/pre-commit +1 -0
- package/CHANGELOG.md +21 -0
- package/dist/extensions/cropping_controls/croppingControls.d.ts +16 -0
- package/dist/extensions/cropping_controls/croppingControls.d.ts.map +1 -0
- package/dist/extensions/cropping_controls/croppingHandlers.d.ts +39 -0
- package/dist/extensions/cropping_controls/croppingHandlers.d.ts.map +1 -0
- package/dist/extensions/cropping_controls/enterCropMode.d.ts +7 -0
- package/dist/extensions/cropping_controls/enterCropMode.d.ts.map +1 -0
- package/dist/extensions/cropping_controls/renderCornerControl.d.ts +14 -0
- package/dist/extensions/cropping_controls/renderCornerControl.d.ts.map +1 -0
- package/dist/extensions/index.d.ts +3 -0
- package/dist/extensions/index.d.ts.map +1 -1
- package/dist/fabric.d.ts +1 -0
- package/dist/fabric.d.ts.map +1 -1
- package/dist/index.js +628 -537
- package/dist/index.js.map +1 -1
- package/dist/index.min.js +1 -1
- package/dist/index.min.js.map +1 -1
- package/dist/index.min.mjs +1 -1
- package/dist/index.min.mjs.map +1 -1
- package/dist/index.mjs +628 -537
- package/dist/index.mjs.map +1 -1
- package/dist/index.node.cjs +628 -537
- package/dist/index.node.cjs.map +1 -1
- package/dist/index.node.mjs +628 -537
- package/dist/index.node.mjs.map +1 -1
- package/dist/package.json.min.mjs +1 -1
- package/dist/package.json.mjs +1 -1
- package/dist/src/EventTypeDefs.d.ts +5 -0
- package/dist/src/EventTypeDefs.d.ts.map +1 -1
- package/dist/src/Pattern/Pattern.d.ts.map +1 -1
- package/dist/src/Pattern/Pattern.min.mjs +1 -1
- package/dist/src/Pattern/Pattern.min.mjs.map +1 -1
- package/dist/src/Pattern/Pattern.mjs +2 -1
- package/dist/src/Pattern/Pattern.mjs.map +1 -1
- package/dist/src/Shadow.d.ts +1 -1
- package/dist/src/Shadow.d.ts.map +1 -1
- package/dist/src/Shadow.min.mjs +1 -1
- package/dist/src/Shadow.min.mjs.map +1 -1
- package/dist/src/Shadow.mjs +5 -4
- package/dist/src/Shadow.mjs.map +1 -1
- package/dist/src/canvas/CanvasOptions.d.ts.map +1 -1
- package/dist/src/canvas/CanvasOptions.min.mjs.map +1 -1
- package/dist/src/canvas/CanvasOptions.mjs.map +1 -1
- package/dist/src/canvas/SelectableCanvas.d.ts +2 -0
- package/dist/src/canvas/SelectableCanvas.d.ts.map +1 -1
- package/dist/src/canvas/SelectableCanvas.min.mjs +1 -1
- package/dist/src/canvas/SelectableCanvas.min.mjs.map +1 -1
- package/dist/src/canvas/SelectableCanvas.mjs +33 -13
- package/dist/src/canvas/SelectableCanvas.mjs.map +1 -1
- package/dist/src/canvas/StaticCanvas.d.ts.map +1 -1
- package/dist/src/canvas/StaticCanvas.min.mjs +1 -1
- package/dist/src/canvas/StaticCanvas.min.mjs.map +1 -1
- package/dist/src/canvas/StaticCanvas.mjs +3 -1
- package/dist/src/canvas/StaticCanvas.mjs.map +1 -1
- package/dist/src/canvas/StaticCanvasOptions.d.ts.map +1 -1
- package/dist/src/canvas/StaticCanvasOptions.min.mjs.map +1 -1
- package/dist/src/canvas/StaticCanvasOptions.mjs.map +1 -1
- package/dist/src/constants.d.ts +1 -0
- package/dist/src/constants.d.ts.map +1 -1
- package/dist/src/constants.min.mjs.map +1 -1
- package/dist/src/constants.mjs.map +1 -1
- package/dist/src/controls/Control.d.ts +22 -1
- package/dist/src/controls/Control.d.ts.map +1 -1
- package/dist/src/controls/Control.min.mjs +1 -1
- package/dist/src/controls/Control.min.mjs.map +1 -1
- package/dist/src/controls/Control.mjs +45 -1
- package/dist/src/controls/Control.mjs.map +1 -1
- package/dist/src/controls/changeWidth.d.ts +22 -0
- package/dist/src/controls/changeWidth.d.ts.map +1 -1
- package/dist/src/controls/changeWidth.min.mjs +1 -1
- package/dist/src/controls/changeWidth.min.mjs.map +1 -1
- package/dist/src/controls/changeWidth.mjs +46 -18
- package/dist/src/controls/changeWidth.mjs.map +1 -1
- package/dist/src/controls/controlRendering.d.ts.map +1 -1
- package/dist/src/controls/controlRendering.min.mjs +1 -1
- package/dist/src/controls/controlRendering.min.mjs.map +1 -1
- package/dist/src/controls/controlRendering.mjs +18 -34
- package/dist/src/controls/controlRendering.mjs.map +1 -1
- package/dist/src/controls/index.d.ts +2 -1
- package/dist/src/controls/index.d.ts.map +1 -1
- package/dist/src/controls/index.min.mjs +1 -1
- package/dist/src/controls/index.mjs +1 -1
- package/dist/src/gradient/Gradient.d.ts.map +1 -1
- package/dist/src/gradient/Gradient.min.mjs +1 -1
- package/dist/src/gradient/Gradient.min.mjs.map +1 -1
- package/dist/src/gradient/Gradient.mjs +19 -6
- package/dist/src/gradient/Gradient.mjs.map +1 -1
- package/dist/src/shapes/Circle.d.ts.map +1 -1
- package/dist/src/shapes/Circle.min.mjs +1 -1
- package/dist/src/shapes/Circle.min.mjs.map +1 -1
- package/dist/src/shapes/Circle.mjs +10 -7
- package/dist/src/shapes/Circle.mjs.map +1 -1
- package/dist/src/shapes/Ellipse.d.ts.map +1 -1
- package/dist/src/shapes/Ellipse.min.mjs +1 -1
- package/dist/src/shapes/Ellipse.min.mjs.map +1 -1
- package/dist/src/shapes/Ellipse.mjs +2 -1
- package/dist/src/shapes/Ellipse.mjs.map +1 -1
- package/dist/src/shapes/Group.d.ts.map +1 -1
- package/dist/src/shapes/Group.min.mjs +1 -1
- package/dist/src/shapes/Group.min.mjs.map +1 -1
- package/dist/src/shapes/Group.mjs +2 -1
- package/dist/src/shapes/Group.mjs.map +1 -1
- package/dist/src/shapes/IText/IText.d.ts.map +1 -1
- package/dist/src/shapes/IText/IText.min.mjs.map +1 -1
- package/dist/src/shapes/IText/IText.mjs.map +1 -1
- package/dist/src/shapes/Image.d.ts +1 -1
- package/dist/src/shapes/Image.d.ts.map +1 -1
- package/dist/src/shapes/Image.min.mjs +1 -1
- package/dist/src/shapes/Image.min.mjs.map +1 -1
- package/dist/src/shapes/Image.mjs +4 -3
- package/dist/src/shapes/Image.mjs.map +1 -1
- package/dist/src/shapes/Line.d.ts.map +1 -1
- package/dist/src/shapes/Line.min.mjs +1 -1
- package/dist/src/shapes/Line.min.mjs.map +1 -1
- package/dist/src/shapes/Line.mjs +6 -10
- package/dist/src/shapes/Line.mjs.map +1 -1
- package/dist/src/shapes/Object/FabricObjectSVGExportMixin.d.ts.map +1 -1
- package/dist/src/shapes/Object/FabricObjectSVGExportMixin.min.mjs +1 -1
- package/dist/src/shapes/Object/FabricObjectSVGExportMixin.min.mjs.map +1 -1
- package/dist/src/shapes/Object/FabricObjectSVGExportMixin.mjs +5 -4
- package/dist/src/shapes/Object/FabricObjectSVGExportMixin.mjs.map +1 -1
- package/dist/src/shapes/Object/InteractiveObject.d.ts.map +1 -1
- package/dist/src/shapes/Object/InteractiveObject.min.mjs.map +1 -1
- package/dist/src/shapes/Object/InteractiveObject.mjs.map +1 -1
- package/dist/src/shapes/Object/Object.d.ts.map +1 -1
- package/dist/src/shapes/Object/Object.min.mjs +1 -1
- package/dist/src/shapes/Object/Object.min.mjs.map +1 -1
- package/dist/src/shapes/Object/Object.mjs +3 -0
- package/dist/src/shapes/Object/Object.mjs.map +1 -1
- package/dist/src/shapes/Object/ObjectGeometry.min.mjs +1 -1
- package/dist/src/shapes/Object/ObjectGeometry.min.mjs.map +1 -1
- package/dist/src/shapes/Object/ObjectGeometry.mjs +1 -1
- package/dist/src/shapes/Object/ObjectGeometry.mjs.map +1 -1
- package/dist/src/shapes/Object/types/FabricObjectProps.d.ts.map +1 -1
- package/dist/src/shapes/Object/types/ObjectProps.d.ts.map +1 -1
- package/dist/src/shapes/Path.d.ts.map +1 -1
- package/dist/src/shapes/Path.min.mjs.map +1 -1
- package/dist/src/shapes/Path.mjs +1 -2
- package/dist/src/shapes/Path.mjs.map +1 -1
- package/dist/src/shapes/Polyline.d.ts.map +1 -1
- package/dist/src/shapes/Polyline.min.mjs +1 -1
- package/dist/src/shapes/Polyline.min.mjs.map +1 -1
- package/dist/src/shapes/Polyline.mjs +10 -6
- package/dist/src/shapes/Polyline.mjs.map +1 -1
- package/dist/src/shapes/Rect.d.ts.map +1 -1
- package/dist/src/shapes/Rect.min.mjs +1 -1
- package/dist/src/shapes/Rect.min.mjs.map +1 -1
- package/dist/src/shapes/Rect.mjs +2 -1
- package/dist/src/shapes/Rect.mjs.map +1 -1
- package/dist/src/shapes/Text/StyledText.d.ts.map +1 -1
- package/dist/src/shapes/Text/StyledText.min.mjs.map +1 -1
- package/dist/src/shapes/Text/StyledText.mjs +0 -3
- package/dist/src/shapes/Text/StyledText.mjs.map +1 -1
- package/dist/src/shapes/Text/Text.d.ts.map +1 -1
- package/dist/src/shapes/Text/Text.min.mjs.map +1 -1
- package/dist/src/shapes/Text/Text.mjs.map +1 -1
- package/dist/src/shapes/Text/TextSVGExportMixin.d.ts.map +1 -1
- package/dist/src/shapes/Text/TextSVGExportMixin.min.mjs +1 -1
- package/dist/src/shapes/Text/TextSVGExportMixin.min.mjs.map +1 -1
- package/dist/src/shapes/Text/TextSVGExportMixin.mjs +5 -6
- package/dist/src/shapes/Text/TextSVGExportMixin.mjs.map +1 -1
- package/dist/src/shapes/Textbox.d.ts.map +1 -1
- package/dist/src/shapes/Textbox.min.mjs.map +1 -1
- package/dist/src/shapes/Textbox.mjs.map +1 -1
- package/dist/src/shapes/Triangle.d.ts.map +1 -1
- package/dist/src/shapes/Triangle.min.mjs.map +1 -1
- package/dist/src/shapes/Triangle.mjs.map +1 -1
- package/dist/src/util/lang_string.d.ts +1 -1
- package/dist/src/util/lang_string.d.ts.map +1 -1
- package/dist/src/util/lang_string.min.mjs +1 -1
- package/dist/src/util/lang_string.min.mjs.map +1 -1
- package/dist/src/util/lang_string.mjs +1 -1
- package/dist/src/util/lang_string.mjs.map +1 -1
- package/dist/src/util/misc/svgParsing.d.ts.map +1 -1
- package/dist/src/util/misc/svgParsing.min.mjs +1 -1
- package/dist/src/util/misc/svgParsing.min.mjs.map +1 -1
- package/dist/src/util/misc/svgParsing.mjs +2 -1
- package/dist/src/util/misc/svgParsing.mjs.map +1 -1
- package/dist-extensions/cropping_controls/croppingControls.mjs +140 -0
- package/dist-extensions/cropping_controls/croppingControls.mjs.map +1 -0
- package/dist-extensions/cropping_controls/croppingHandlers.mjs +228 -0
- package/dist-extensions/cropping_controls/croppingHandlers.mjs.map +1 -0
- package/dist-extensions/cropping_controls/enterCropMode.mjs +38 -0
- package/dist-extensions/cropping_controls/enterCropMode.mjs.map +1 -0
- package/dist-extensions/cropping_controls/renderCornerControl.mjs +45 -0
- package/dist-extensions/cropping_controls/renderCornerControl.mjs.map +1 -0
- package/dist-extensions/extensions/cropping_controls/croppingControls.d.ts +16 -0
- package/dist-extensions/extensions/cropping_controls/croppingControls.d.ts.map +1 -0
- package/dist-extensions/extensions/cropping_controls/croppingHandlers.d.ts +39 -0
- package/dist-extensions/extensions/cropping_controls/croppingHandlers.d.ts.map +1 -0
- package/dist-extensions/extensions/cropping_controls/enterCropMode.d.ts +7 -0
- package/dist-extensions/extensions/cropping_controls/enterCropMode.d.ts.map +1 -0
- package/dist-extensions/extensions/cropping_controls/renderCornerControl.d.ts +14 -0
- package/dist-extensions/extensions/cropping_controls/renderCornerControl.d.ts.map +1 -0
- package/dist-extensions/extensions/index.d.ts +3 -0
- package/dist-extensions/extensions/index.d.ts.map +1 -1
- package/dist-extensions/fabric-extensions.min.js +1 -1
- package/dist-extensions/fabric-extensions.min.js.map +1 -1
- package/dist-extensions/fabric.d.ts +1 -0
- package/dist-extensions/fabric.d.ts.map +1 -1
- package/dist-extensions/index.mjs +3 -0
- package/dist-extensions/index.mjs.map +1 -1
- package/dist-extensions/src/EventTypeDefs.d.ts +5 -0
- package/dist-extensions/src/EventTypeDefs.d.ts.map +1 -1
- package/dist-extensions/src/Pattern/Pattern.d.ts.map +1 -1
- package/dist-extensions/src/Shadow.d.ts +1 -1
- package/dist-extensions/src/Shadow.d.ts.map +1 -1
- package/dist-extensions/src/canvas/CanvasOptions.d.ts.map +1 -1
- package/dist-extensions/src/canvas/SelectableCanvas.d.ts +2 -0
- package/dist-extensions/src/canvas/SelectableCanvas.d.ts.map +1 -1
- package/dist-extensions/src/canvas/StaticCanvas.d.ts.map +1 -1
- package/dist-extensions/src/canvas/StaticCanvasOptions.d.ts.map +1 -1
- package/dist-extensions/src/constants.d.ts +1 -0
- package/dist-extensions/src/constants.d.ts.map +1 -1
- package/dist-extensions/src/controls/Control.d.ts +22 -1
- package/dist-extensions/src/controls/Control.d.ts.map +1 -1
- package/dist-extensions/src/controls/changeWidth.d.ts +22 -0
- package/dist-extensions/src/controls/changeWidth.d.ts.map +1 -1
- package/dist-extensions/src/controls/controlRendering.d.ts.map +1 -1
- package/dist-extensions/src/controls/index.d.ts +2 -1
- package/dist-extensions/src/controls/index.d.ts.map +1 -1
- package/dist-extensions/src/gradient/Gradient.d.ts.map +1 -1
- package/dist-extensions/src/shapes/Circle.d.ts.map +1 -1
- package/dist-extensions/src/shapes/Ellipse.d.ts.map +1 -1
- package/dist-extensions/src/shapes/Group.d.ts.map +1 -1
- package/dist-extensions/src/shapes/IText/IText.d.ts.map +1 -1
- package/dist-extensions/src/shapes/Image.d.ts.map +1 -1
- package/dist-extensions/src/shapes/Line.d.ts.map +1 -1
- package/dist-extensions/src/shapes/Object/FabricObjectSVGExportMixin.d.ts.map +1 -1
- package/dist-extensions/src/shapes/Object/InteractiveObject.d.ts.map +1 -1
- package/dist-extensions/src/shapes/Object/Object.d.ts.map +1 -1
- package/dist-extensions/src/shapes/Object/types/FabricObjectProps.d.ts.map +1 -1
- package/dist-extensions/src/shapes/Object/types/ObjectProps.d.ts.map +1 -1
- package/dist-extensions/src/shapes/Path.d.ts +1 -1
- package/dist-extensions/src/shapes/Path.d.ts.map +1 -1
- package/dist-extensions/src/shapes/Polyline.d.ts.map +1 -1
- package/dist-extensions/src/shapes/Rect.d.ts.map +1 -1
- package/dist-extensions/src/shapes/Text/StyledText.d.ts.map +1 -1
- package/dist-extensions/src/shapes/Text/Text.d.ts.map +1 -1
- package/dist-extensions/src/shapes/Text/TextSVGExportMixin.d.ts.map +1 -1
- package/dist-extensions/src/shapes/Textbox.d.ts.map +1 -1
- package/dist-extensions/src/shapes/Triangle.d.ts.map +1 -1
- package/dist-extensions/src/util/lang_string.d.ts +1 -1
- package/dist-extensions/src/util/lang_string.d.ts.map +1 -1
- package/dist-extensions/src/util/misc/svgParsing.d.ts.map +1 -1
- package/eslint.config.mjs +2 -0
- package/extensions/cropping_controls/croppingControls.spec.ts +115 -0
- package/extensions/cropping_controls/croppingControls.ts +150 -0
- package/extensions/cropping_controls/croppingHandlers.spec.ts +579 -0
- package/extensions/cropping_controls/croppingHandlers.ts +285 -0
- package/extensions/cropping_controls/enterCropMode.ts +30 -0
- package/extensions/cropping_controls/renderCornerControl.ts +53 -0
- package/extensions/index.ts +9 -0
- package/fabric.ts +1 -0
- package/package.json +17 -8
- package/src/ClassRegistry.spec.ts +18 -19
- package/src/EventTypeDefs.ts +15 -11
- package/src/Pattern/Pattern.spec.ts +12 -0
- package/src/Pattern/Pattern.ts +3 -2
- package/src/Shadow.ts +9 -8
- package/src/brushes/PencilBrush.spec.ts +11 -11
- package/src/canvas/Canvas-dispose.spec.ts +8 -7
- package/src/canvas/Canvas.spec.ts +27 -29
- package/src/canvas/CanvasOptions.ts +2 -1
- package/src/canvas/SelectableCanvas.ts +38 -15
- package/src/canvas/StaticCanvas.spec.ts +20 -0
- package/src/canvas/StaticCanvas.ts +7 -4
- package/src/canvas/StaticCanvasOptions.ts +1 -3
- package/src/constants.ts +1 -0
- package/src/controls/Control.spec.ts +102 -0
- package/src/controls/Control.ts +71 -2
- package/src/controls/changeHeight.spec.ts +147 -0
- package/src/controls/changeWidth.ts +68 -35
- package/src/controls/controlRendering.ts +20 -48
- package/src/controls/index.ts +7 -1
- package/src/gradient/Gradient.spec.ts +101 -46
- package/src/gradient/Gradient.ts +27 -14
- package/src/shapes/Circle.spec.ts +10 -39
- package/src/shapes/Circle.ts +11 -11
- package/src/shapes/Ellipse.spec.ts +8 -37
- package/src/shapes/Ellipse.ts +7 -7
- package/src/shapes/Group.ts +3 -3
- package/src/shapes/IText/IText-click-behavior.spec.ts +36 -49
- package/src/shapes/IText/IText.ts +5 -6
- package/src/shapes/IText/ITextKeyBehavior.test.ts +0 -1
- package/src/shapes/IText/__snapshots__/ITextBehavior.test.ts.snap +6 -6
- package/src/shapes/Image.spec.ts +17 -33
- package/src/shapes/Image.ts +15 -11
- package/src/shapes/Line.spec.ts +4 -30
- package/src/shapes/Line.ts +11 -16
- package/src/shapes/Object/FabricObjectSVGExportMixin.ts +11 -4
- package/src/shapes/Object/InteractiveObject.ts +4 -4
- package/src/shapes/Object/Object.ts +6 -5
- package/src/shapes/Object/ObjectGeometry.spec.ts +15 -0
- package/src/shapes/Object/ObjectGeometry.ts +1 -1
- package/src/shapes/Object/objectSvgExport.spec.ts +112 -0
- package/src/shapes/Object/types/FabricObjectProps.ts +1 -4
- package/src/shapes/Object/types/ObjectProps.ts +1 -3
- package/src/shapes/Path.spec.ts +4 -27
- package/src/shapes/Path.ts +2 -4
- package/src/shapes/Polygon.spec.ts +4 -31
- package/src/shapes/Polyline.spec.ts +4 -31
- package/src/shapes/Polyline.ts +11 -12
- package/src/shapes/Rect.spec.ts +25 -33
- package/src/shapes/Rect.ts +7 -7
- package/src/shapes/Text/StyledText.ts +0 -3
- package/src/shapes/Text/Text.spec.ts +3 -32
- package/src/shapes/Text/Text.ts +5 -6
- package/src/shapes/Text/TextSVGExportMixin.spec.ts +9 -0
- package/src/shapes/Text/TextSVGExportMixin.ts +14 -16
- package/src/shapes/Text/__snapshots__/Text.spec.ts.snap +1 -1
- package/src/shapes/Text/__snapshots__/TextSVGExportMixin.spec.ts.snap +1 -1
- package/src/shapes/Textbox.spec.ts +5 -5
- package/src/shapes/Textbox.ts +6 -5
- package/src/shapes/Triangle.ts +4 -4
- package/src/shapes/__snapshots__/Image.spec.ts.snap +4 -4
- package/src/shapes/__snapshots__/Textbox.spec.ts.snap +5 -5
- package/src/util/lang_string.ts +3 -2
- package/src/util/misc/svgParsing.ts +2 -1
- package/tsconfig.spec.json +1 -0
- package/vitest.config.ts +12 -2
- package/vitest.extend.ts +6 -2
|
@@ -7,6 +7,7 @@ import { sin } from '../util/misc/sin.mjs';
|
|
|
7
7
|
import { classRegistry } from '../ClassRegistry.mjs';
|
|
8
8
|
import { FabricObject } from './Object/FabricObject.mjs';
|
|
9
9
|
import { SCALE_X, SCALE_Y } from '../constants.mjs';
|
|
10
|
+
import { escapeXml } from '../util/lang_string.mjs';
|
|
10
11
|
import { cacheProperties } from './Object/defaultValues.mjs';
|
|
11
12
|
|
|
12
13
|
const CIRCLE_PROPS = ['radius', 'startAngle', 'endAngle', 'counterClockwise'];
|
|
@@ -102,15 +103,17 @@ class Circle extends FabricObject {
|
|
|
102
103
|
* of the instance
|
|
103
104
|
*/
|
|
104
105
|
_toSVG() {
|
|
105
|
-
const
|
|
106
|
+
const {
|
|
107
|
+
radius,
|
|
108
|
+
startAngle,
|
|
109
|
+
endAngle
|
|
110
|
+
} = this;
|
|
111
|
+
const angle = (endAngle - startAngle) % 360;
|
|
106
112
|
if (angle === 0) {
|
|
107
|
-
return ['<circle ', 'COMMON_PARTS', 'cx="0" cy="0" ', 'r="', `${
|
|
113
|
+
return ['<circle ', 'COMMON_PARTS', 'cx="0" cy="0" ', 'r="', `${escapeXml(radius)}`, '" />\n'];
|
|
108
114
|
} else {
|
|
109
|
-
const
|
|
110
|
-
|
|
111
|
-
} = this;
|
|
112
|
-
const start = degreesToRadians(this.startAngle),
|
|
113
|
-
end = degreesToRadians(this.endAngle),
|
|
115
|
+
const start = degreesToRadians(startAngle),
|
|
116
|
+
end = degreesToRadians(endAngle),
|
|
114
117
|
startX = cos(start) * radius,
|
|
115
118
|
startY = sin(start) * radius,
|
|
116
119
|
endX = cos(end) * radius,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Circle.mjs","sources":["../../../src/shapes/Circle.ts"],"sourcesContent":["import type { ObjectEvents } from '../EventTypeDefs';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport { cos } from '../util/misc/cos';\nimport { degreesToRadians } from '../util/misc/radiansDegreesConversion';\nimport { sin } from '../util/misc/sin';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { CSSRules } from '../parser/typedefs';\nimport { SCALE_X, SCALE_Y } from '../constants';\n\ninterface UniqueCircleProps {\n /**\n * Radius of this circle\n * @type Number\n * @default 0\n */\n radius: number;\n\n /**\n * Angle for the start of the circle, in degrees.\n * @type TDegree 0 - 359\n * @default 0\n */\n startAngle: number;\n\n /**\n * Angle for the end of the circle, in degrees\n * @type TDegree 1 - 360\n * @default 360\n */\n endAngle: number;\n\n /**\n * Orientation for the direction of the circle.\n * Setting to true will switch the arc of the circle to traverse from startAngle to endAngle in a counter-clockwise direction.\n * Note: this will only change how the circle is drawn, and does not affect rotational transformation.\n * @default false\n */\n counterClockwise: boolean;\n}\n\nexport interface SerializedCircleProps\n extends SerializedObjectProps,\n UniqueCircleProps {}\n\nexport interface CircleProps extends FabricObjectProps, UniqueCircleProps {}\n\nconst CIRCLE_PROPS = [\n 'radius',\n 'startAngle',\n 'endAngle',\n 'counterClockwise',\n] as const;\n\nexport const circleDefaultValues: Partial<TClassProperties<Circle>> = {\n radius: 0,\n startAngle: 0,\n endAngle: 360,\n counterClockwise: false,\n};\n\nexport class Circle<\n Props extends TOptions<CircleProps> = Partial<CircleProps>,\n SProps extends SerializedCircleProps = SerializedCircleProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject<Props, SProps, EventSpec>\n implements UniqueCircleProps\n{\n declare radius: number;\n declare startAngle: number;\n declare endAngle: number;\n declare counterClockwise: boolean;\n\n static type = 'Circle';\n\n static cacheProperties = [...cacheProperties, ...CIRCLE_PROPS];\n\n static ownDefaults = circleDefaultValues;\n\n static getDefaults(): Record<string, any> {\n return {\n ...super.getDefaults(),\n ...Circle.ownDefaults,\n };\n }\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor(options?: Props) {\n super();\n Object.assign(this, Circle.ownDefaults);\n this.setOptions(options);\n }\n\n /**\n * @private\n * @param {String} key\n * @param {*} value\n */\n _set(key: string, value: any) {\n super._set(key, value);\n\n if (key === 'radius') {\n this.setRadius(value);\n }\n\n return this;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n ctx.beginPath();\n ctx.arc(\n 0,\n 0,\n this.radius,\n degreesToRadians(this.startAngle),\n degreesToRadians(this.endAngle),\n this.counterClockwise,\n );\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Returns horizontal radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRadiusX(): number {\n return this.get('radius') * this.get(SCALE_X);\n }\n\n /**\n * Returns vertical radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRadiusY(): number {\n return this.get('radius') * this.get(SCALE_Y);\n }\n\n /**\n * Sets radius of an object (and updates width accordingly)\n */\n setRadius(value: number) {\n this.radius = value;\n this.set({ width: value * 2, height: value * 2 });\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit<Props & TClassProperties<this>, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick<T, K> & SProps {\n return super.toObject([...CIRCLE_PROPS, ...propertiesToInclude]);\n }\n\n /* _TO_SVG_START_ */\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG(): string[] {\n const angle = (this.endAngle - this.startAngle) % 360;\n\n if (angle === 0) {\n return [\n '<circle ',\n 'COMMON_PARTS',\n 'cx=\"0\" cy=\"0\" ',\n 'r=\"',\n `${this.radius}`,\n '\" />\\n',\n ];\n } else {\n const { radius } = this;\n const start = degreesToRadians(this.startAngle),\n end = degreesToRadians(this.endAngle),\n startX = cos(start) * radius,\n startY = sin(start) * radius,\n endX = cos(end) * radius,\n endY = sin(end) * radius,\n largeFlag = angle > 180 ? 1 : 0,\n sweepFlag = this.counterClockwise ? 0 : 1;\n return [\n `<path d=\"M ${startX} ${startY} A ${radius} ${radius} 0 ${largeFlag} ${sweepFlag} ${endX} ${endY}\" `,\n 'COMMON_PARTS',\n ' />\\n',\n ];\n }\n }\n /* _TO_SVG_END_ */\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link Circle.fromElement})\n * @see: http://www.w3.org/TR/SVG/shapes.html#CircleElement\n */\n static ATTRIBUTE_NAMES = ['cx', 'cy', 'r', ...SHARED_ATTRIBUTES];\n\n /**\n * Returns {@link Circle} instance from an SVG element\n * @param {HTMLElement} element Element to parse\n * @param {Object} [options] Partial Circle object to default missing properties on the element.\n * @throws {Error} If value of `r` attribute is missing or invalid\n */\n static async fromElement(\n element: HTMLElement,\n options: Abortable,\n cssRules?: CSSRules,\n ): Promise<Circle> {\n const {\n left = 0,\n top = 0,\n radius = 0,\n ...otherParsedAttributes\n } = parseAttributes(\n element,\n this.ATTRIBUTE_NAMES,\n cssRules,\n ) as Partial<CircleProps>;\n\n // this probably requires to be fixed for default origins not being top/left.\n\n return new this({\n ...otherParsedAttributes,\n radius,\n left: left - radius,\n top: top - radius,\n });\n }\n\n /* _FROM_SVG_END_ */\n\n /**\n * @todo how do we declare this??\n */\n static fromObject<T extends TOptions<SerializedCircleProps>>(object: T) {\n return super._fromObject<Circle>(object);\n }\n}\n\nclassRegistry.setClass(Circle);\nclassRegistry.setSVGClass(Circle);\n"],"names":["CIRCLE_PROPS","circleDefaultValues","radius","startAngle","endAngle","counterClockwise","Circle","FabricObject","getDefaults","ownDefaults","constructor","options","Object","assign","setOptions","_set","key","value","setRadius","_render","ctx","beginPath","arc","degreesToRadians","_renderPaintInOrder","getRadiusX","get","SCALE_X","getRadiusY","SCALE_Y","set","width","height","toObject","propertiesToInclude","arguments","length","undefined","_toSVG","angle","start","end","startX","cos","startY","sin","endX","endY","largeFlag","sweepFlag","fromElement","element","cssRules","left","top","otherParsedAttributes","parseAttributes","ATTRIBUTE_NAMES","fromObject","object","_fromObject","_defineProperty","cacheProperties","SHARED_ATTRIBUTES","classRegistry","setClass","setSVGClass"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Circle.mjs","sources":["../../../src/shapes/Circle.ts"],"sourcesContent":["import type { ObjectEvents } from '../EventTypeDefs';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport { cos } from '../util/misc/cos';\nimport { degreesToRadians } from '../util/misc/radiansDegreesConversion';\nimport { sin } from '../util/misc/sin';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { CSSRules } from '../parser/typedefs';\nimport { SCALE_X, SCALE_Y } from '../constants';\nimport { escapeXml } from '../util/lang_string';\n\ninterface UniqueCircleProps {\n /**\n * Radius of this circle\n * @type Number\n * @default 0\n */\n radius: number;\n\n /**\n * Angle for the start of the circle, in degrees.\n * @type TDegree 0 - 359\n * @default 0\n */\n startAngle: number;\n\n /**\n * Angle for the end of the circle, in degrees\n * @type TDegree 1 - 360\n * @default 360\n */\n endAngle: number;\n\n /**\n * Orientation for the direction of the circle.\n * Setting to true will switch the arc of the circle to traverse from startAngle to endAngle in a counter-clockwise direction.\n * Note: this will only change how the circle is drawn, and does not affect rotational transformation.\n * @default false\n */\n counterClockwise: boolean;\n}\n\nexport interface SerializedCircleProps\n extends SerializedObjectProps, UniqueCircleProps {}\n\nexport interface CircleProps extends FabricObjectProps, UniqueCircleProps {}\n\nconst CIRCLE_PROPS = [\n 'radius',\n 'startAngle',\n 'endAngle',\n 'counterClockwise',\n] as const;\n\nexport const circleDefaultValues: Partial<TClassProperties<Circle>> = {\n radius: 0,\n startAngle: 0,\n endAngle: 360,\n counterClockwise: false,\n};\n\nexport class Circle<\n Props extends TOptions<CircleProps> = Partial<CircleProps>,\n SProps extends SerializedCircleProps = SerializedCircleProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n>\n extends FabricObject<Props, SProps, EventSpec>\n implements UniqueCircleProps\n{\n declare radius: number;\n declare startAngle: number;\n declare endAngle: number;\n declare counterClockwise: boolean;\n\n static type = 'Circle';\n\n static cacheProperties = [...cacheProperties, ...CIRCLE_PROPS];\n\n static ownDefaults = circleDefaultValues;\n\n static getDefaults(): Record<string, any> {\n return {\n ...super.getDefaults(),\n ...Circle.ownDefaults,\n };\n }\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor(options?: Props) {\n super();\n Object.assign(this, Circle.ownDefaults);\n this.setOptions(options);\n }\n\n /**\n * @private\n * @param {String} key\n * @param {*} value\n */\n _set(key: string, value: any) {\n super._set(key, value);\n\n if (key === 'radius') {\n this.setRadius(value);\n }\n\n return this;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n ctx.beginPath();\n ctx.arc(\n 0,\n 0,\n this.radius,\n degreesToRadians(this.startAngle),\n degreesToRadians(this.endAngle),\n this.counterClockwise,\n );\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Returns horizontal radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRadiusX(): number {\n return this.get('radius') * this.get(SCALE_X);\n }\n\n /**\n * Returns vertical radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRadiusY(): number {\n return this.get('radius') * this.get(SCALE_Y);\n }\n\n /**\n * Sets radius of an object (and updates width accordingly)\n */\n setRadius(value: number) {\n this.radius = value;\n this.set({ width: value * 2, height: value * 2 });\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit<Props & TClassProperties<this>, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick<T, K> & SProps {\n return super.toObject([...CIRCLE_PROPS, ...propertiesToInclude]);\n }\n\n /* _TO_SVG_START_ */\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG(): string[] {\n const { radius, startAngle, endAngle } = this;\n const angle = (endAngle - startAngle) % 360;\n\n if (angle === 0) {\n return [\n '<circle ',\n 'COMMON_PARTS',\n 'cx=\"0\" cy=\"0\" ',\n 'r=\"',\n `${escapeXml(radius)}`,\n '\" />\\n',\n ];\n } else {\n const start = degreesToRadians(startAngle),\n end = degreesToRadians(endAngle),\n startX = cos(start) * radius,\n startY = sin(start) * radius,\n endX = cos(end) * radius,\n endY = sin(end) * radius,\n largeFlag = angle > 180 ? 1 : 0,\n sweepFlag = this.counterClockwise ? 0 : 1;\n return [\n `<path d=\"M ${startX} ${startY} A ${radius} ${radius} 0 ${largeFlag} ${sweepFlag} ${endX} ${endY}\" `,\n 'COMMON_PARTS',\n ' />\\n',\n ];\n }\n }\n /* _TO_SVG_END_ */\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link Circle.fromElement})\n * @see: http://www.w3.org/TR/SVG/shapes.html#CircleElement\n */\n static ATTRIBUTE_NAMES = ['cx', 'cy', 'r', ...SHARED_ATTRIBUTES];\n\n /**\n * Returns {@link Circle} instance from an SVG element\n * @param {HTMLElement} element Element to parse\n * @param {Object} [options] Partial Circle object to default missing properties on the element.\n * @throws {Error} If value of `r` attribute is missing or invalid\n */\n static async fromElement(\n element: HTMLElement,\n options: Abortable,\n cssRules?: CSSRules,\n ): Promise<Circle> {\n const {\n left = 0,\n top = 0,\n radius = 0,\n ...otherParsedAttributes\n } = parseAttributes(\n element,\n this.ATTRIBUTE_NAMES,\n cssRules,\n ) as Partial<CircleProps>;\n\n // this probably requires to be fixed for default origins not being top/left.\n\n return new this({\n ...otherParsedAttributes,\n radius,\n left: left - radius,\n top: top - radius,\n });\n }\n\n /* _FROM_SVG_END_ */\n\n /**\n * @todo how do we declare this??\n */\n static fromObject<T extends TOptions<SerializedCircleProps>>(object: T) {\n return super._fromObject<Circle>(object);\n }\n}\n\nclassRegistry.setClass(Circle);\nclassRegistry.setSVGClass(Circle);\n"],"names":["CIRCLE_PROPS","circleDefaultValues","radius","startAngle","endAngle","counterClockwise","Circle","FabricObject","getDefaults","ownDefaults","constructor","options","Object","assign","setOptions","_set","key","value","setRadius","_render","ctx","beginPath","arc","degreesToRadians","_renderPaintInOrder","getRadiusX","get","SCALE_X","getRadiusY","SCALE_Y","set","width","height","toObject","propertiesToInclude","arguments","length","undefined","_toSVG","angle","escapeXml","start","end","startX","cos","startY","sin","endX","endY","largeFlag","sweepFlag","fromElement","element","cssRules","left","top","otherParsedAttributes","parseAttributes","ATTRIBUTE_NAMES","fromObject","object","_fromObject","_defineProperty","cacheProperties","SHARED_ATTRIBUTES","classRegistry","setClass","setSVGClass"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Ellipse.d.ts","sourceRoot":"","sources":["../../../src/shapes/Ellipse.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEzE,OAAO,EAAE,YAAY,EAAmB,MAAM,uBAAuB,CAAC;AACtE,OAAO,KAAK,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAC/E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"Ellipse.d.ts","sourceRoot":"","sources":["../../../src/shapes/Ellipse.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEzE,OAAO,EAAE,YAAY,EAAmB,MAAM,uBAAuB,CAAC;AACtE,OAAO,KAAK,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAC/E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAGnD,eAAO,MAAM,oBAAoB,EAAE,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAGnE,CAAC;AAEF,UAAU,kBAAkB;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,sBACf,SAAQ,qBAAqB,EAAE,kBAAkB;CAAG;AAEtD,MAAM,WAAW,YAAa,SAAQ,iBAAiB,EAAE,kBAAkB;CAAG;AAI9E,qBAAa,OAAO,CAClB,KAAK,SAAS,QAAQ,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC,EAC5D,MAAM,SAAS,sBAAsB,GAAG,sBAAsB,EAC9D,SAAS,SAAS,YAAY,GAAG,YAAY,CAE7C,SAAQ,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAC7C,YAAW,YAAY;IAEvB;;;OAGG;IACK,EAAE,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACK,EAAE,EAAE,MAAM,CAAC;IAEnB,MAAM,CAAC,IAAI,SAAa;IAExB,MAAM,CAAC,eAAe,WAA0C;IAEhE,MAAM,CAAC,WAAW,kGAAwB;IAE1C,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAOzC;;;OAGG;gBACS,OAAO,CAAC,EAAE,KAAK;IAM3B;;;;;OAKG;IACH,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG;IAgB5B;;;OAGG;IACH,KAAK;IAIL;;;OAGG;IACH,KAAK;IAIL;;;;OAIG;IACH,QAAQ,CACN,CAAC,SAAS,IAAI,CAAC,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,EAAE,MAAM,MAAM,CAAC,EAC5D,CAAC,SAAS,MAAM,CAAC,GAAG,KAAK,EACzB,mBAAmB,GAAE,CAAC,EAAO,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM;IAIrD;;;;OAIG;IACH,MAAM,IAAI,MAAM,EAAE;IAQlB;;;OAGG;IACH,OAAO,CAAC,GAAG,EAAE,wBAAwB;IAWrC;;;OAGG;IACH,MAAM,CAAC,eAAe,WAAkD;IAExE;;;;OAIG;WACU,WAAW,CACtB,OAAO,EAAE,WAAW,EACpB,OAAO,CAAC,EAAE,SAAS,EACnB,QAAQ,CAAC,EAAE,QAAQ;CActB"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{defineProperty as t}from"../../_virtual/_rollupPluginBabelHelpers.min.mjs";import{SCALE_X as r,SCALE_Y as
|
|
1
|
+
import{defineProperty as t}from"../../_virtual/_rollupPluginBabelHelpers.min.mjs";import{SCALE_X as r,SCALE_Y as s,twoMathPi as e}from"../constants.min.mjs";import{SHARED_ATTRIBUTES as i}from"../parser/attributes.min.mjs";import{parseAttributes as n}from"../parser/parseAttributes.min.mjs";import{classRegistry as o}from"../ClassRegistry.min.mjs";import{FabricObject as m}from"./Object/FabricObject.min.mjs";import{escapeXml as a}from"../util/lang_string.min.mjs";import{cacheProperties as l}from"./Object/defaultValues.min.mjs";const c={rx:0,ry:0},h=["rx","ry"];class p extends m{static getDefaults(){return{...super.getDefaults(),...p.ownDefaults}}constructor(t){super(),Object.assign(this,p.ownDefaults),this.setOptions(t)}_set(t,r){switch(super._set(t,r),t){case"rx":this.rx=r,this.set("width",2*r);break;case"ry":this.ry=r,this.set("height",2*r)}return this}getRx(){return this.get("rx")*this.get(r)}getRy(){return this.get("ry")*this.get(s)}toObject(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return super.toObject([...h,...t])}_toSVG(){return["<ellipse ","COMMON_PARTS",`cx="0" cy="0" rx="${a(this.rx)}" ry="${a(this.ry)}" />\n`]}_render(t){t.beginPath(),t.save(),t.transform(1,0,0,this.ry/this.rx,0,0),t.arc(0,0,this.rx,0,e,!1),t.restore(),this._renderPaintInOrder(t)}static async fromElement(t,r,s){const e=n(t,this.ATTRIBUTE_NAMES,s);return e.left=(e.left||0)-e.rx,e.top=(e.top||0)-e.ry,new this(e)}}t(p,"type","Ellipse"),t(p,"cacheProperties",[...l,...h]),t(p,"ownDefaults",c),t(p,"ATTRIBUTE_NAMES",[...i,"cx","cy","rx","ry"]),o.setClass(p),o.setSVGClass(p);export{p as Ellipse,c as ellipseDefaultValues};
|
|
2
2
|
//# sourceMappingURL=Ellipse.min.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Ellipse.min.mjs","sources":["../../../src/shapes/Ellipse.ts"],"sourcesContent":["import { SCALE_X, SCALE_Y, twoMathPi } from '../constants';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport type { CSSRules } from '../parser/typedefs';\n\nexport const ellipseDefaultValues: Partial<TClassProperties<Ellipse>> = {\n rx: 0,\n ry: 0,\n};\n\ninterface UniqueEllipseProps {\n rx: number;\n ry: number;\n}\n\nexport interface SerializedEllipseProps\n extends SerializedObjectProps
|
|
1
|
+
{"version":3,"file":"Ellipse.min.mjs","sources":["../../../src/shapes/Ellipse.ts"],"sourcesContent":["import { SCALE_X, SCALE_Y, twoMathPi } from '../constants';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport type { CSSRules } from '../parser/typedefs';\nimport { escapeXml } from '../util/lang_string';\n\nexport const ellipseDefaultValues: Partial<TClassProperties<Ellipse>> = {\n rx: 0,\n ry: 0,\n};\n\ninterface UniqueEllipseProps {\n rx: number;\n ry: number;\n}\n\nexport interface SerializedEllipseProps\n extends SerializedObjectProps, UniqueEllipseProps {}\n\nexport interface EllipseProps extends FabricObjectProps, UniqueEllipseProps {}\n\nconst ELLIPSE_PROPS = ['rx', 'ry'] as const;\n\nexport class Ellipse<\n Props extends TOptions<EllipseProps> = Partial<EllipseProps>,\n SProps extends SerializedEllipseProps = SerializedEllipseProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n>\n extends FabricObject<Props, SProps, EventSpec>\n implements EllipseProps\n{\n /**\n * Horizontal radius\n * @type Number\n */\n declare rx: number;\n\n /**\n * Vertical radius\n * @type Number\n */\n declare ry: number;\n\n static type = 'Ellipse';\n\n static cacheProperties = [...cacheProperties, ...ELLIPSE_PROPS];\n\n static ownDefaults = ellipseDefaultValues;\n\n static getDefaults(): Record<string, any> {\n return {\n ...super.getDefaults(),\n ...Ellipse.ownDefaults,\n };\n }\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor(options?: Props) {\n super();\n Object.assign(this, Ellipse.ownDefaults);\n this.setOptions(options);\n }\n\n /**\n * @private\n * @param {String} key\n * @param {*} value\n * @return {Ellipse} thisArg\n */\n _set(key: string, value: any) {\n super._set(key, value);\n switch (key) {\n case 'rx':\n this.rx = value;\n this.set('width', value * 2);\n break;\n\n case 'ry':\n this.ry = value;\n this.set('height', value * 2);\n break;\n }\n return this;\n }\n\n /**\n * Returns horizontal radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRx() {\n return this.get('rx') * this.get(SCALE_X);\n }\n\n /**\n * Returns Vertical radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRy() {\n return this.get('ry') * this.get(SCALE_Y);\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit<Props & TClassProperties<this>, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick<T, K> & SProps {\n return super.toObject([...ELLIPSE_PROPS, ...propertiesToInclude]);\n }\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG(): string[] {\n return [\n '<ellipse ',\n 'COMMON_PARTS',\n `cx=\"0\" cy=\"0\" rx=\"${escapeXml(this.rx)}\" ry=\"${escapeXml(this.ry)}\" />\\n`,\n ];\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n ctx.beginPath();\n ctx.save();\n ctx.transform(1, 0, 0, this.ry / this.rx, 0, 0);\n ctx.arc(0, 0, this.rx, 0, twoMathPi, false);\n ctx.restore();\n this._renderPaintInOrder(ctx);\n }\n\n /* _FROM_SVG_START_ */\n\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link Ellipse.fromElement})\n * @see http://www.w3.org/TR/SVG/shapes.html#EllipseElement\n */\n static ATTRIBUTE_NAMES = [...SHARED_ATTRIBUTES, 'cx', 'cy', 'rx', 'ry'];\n\n /**\n * Returns {@link Ellipse} instance from an SVG element\n * @param {HTMLElement} element Element to parse\n * @return {Ellipse}\n */\n static async fromElement(\n element: HTMLElement,\n options?: Abortable,\n cssRules?: CSSRules,\n ) {\n const parsedAttributes = parseAttributes(\n element,\n this.ATTRIBUTE_NAMES,\n cssRules,\n );\n\n parsedAttributes.left = (parsedAttributes.left || 0) - parsedAttributes.rx;\n parsedAttributes.top = (parsedAttributes.top || 0) - parsedAttributes.ry;\n return new this(parsedAttributes);\n }\n\n /* _FROM_SVG_END_ */\n}\n\nclassRegistry.setClass(Ellipse);\nclassRegistry.setSVGClass(Ellipse);\n"],"names":["ellipseDefaultValues","rx","ry","ELLIPSE_PROPS","Ellipse","FabricObject","getDefaults","super","ownDefaults","constructor","options","Object","assign","this","setOptions","_set","key","value","set","getRx","get","SCALE_X","getRy","SCALE_Y","toObject","propertiesToInclude","arguments","length","undefined","_toSVG","escapeXml","_render","ctx","beginPath","save","transform","arc","twoMathPi","restore","_renderPaintInOrder","fromElement","element","cssRules","parsedAttributes","parseAttributes","ATTRIBUTE_NAMES","left","top","_defineProperty","cacheProperties","SHARED_ATTRIBUTES","classRegistry","setClass","setSVGClass"],"mappings":"ihBAWO,MAAMA,EAA2D,CACtEC,GAAI,EACJC,GAAI,GAaAC,EAAgB,CAAC,KAAM,MAEtB,MAAMC,UAKHC,EAqBR,kBAAOC,GACL,MAAO,IACFC,MAAMD,iBACNF,EAAQI,YAEf,CAMAC,WAAAA,CAAYC,GACVH,QACAI,OAAOC,OAAOC,KAAMT,EAAQI,aAC5BK,KAAKC,WAAWJ,EAClB,CAQAK,IAAAA,CAAKC,EAAaC,GAEhB,OADAV,MAAMQ,KAAKC,EAAKC,GACRD,GACN,IAAK,KACHH,KAAKZ,GAAKgB,EACVJ,KAAKK,IAAI,QAAiB,EAARD,GAClB,MAEF,IAAK,KACHJ,KAAKX,GAAKe,EACVJ,KAAKK,IAAI,SAAkB,EAARD,GAGvB,OAAOJ,IACT,CAMAM,KAAAA,GACE,OAAON,KAAKO,IAAI,MAAQP,KAAKO,IAAIC,EACnC,CAMAC,KAAAA,GACE,OAAOT,KAAKO,IAAI,MAAQP,KAAKO,IAAIG,EACnC,CAOAC,QAAAA,GAGsD,IAApDC,EAAwBC,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,GAC3B,OAAOnB,MAAMiB,SAAS,IAAIrB,KAAkBsB,GAC9C,CAOAI,MAAAA,GACE,MAAO,CACL,YACA,eACA,qBAAqBC,EAAUjB,KAAKZ,YAAY6B,EAAUjB,KAAKX,YAEnE,CAMA6B,OAAAA,CAAQC,GACNA,EAAIC,YACJD,EAAIE,OACJF,EAAIG,UAAU,EAAG,EAAG,EAAGtB,KAAKX,GAAKW,KAAKZ,GAAI,EAAG,GAC7C+B,EAAII,IAAI,EAAG,EAAGvB,KAAKZ,GAAI,EAAGoC,GAAW,GACrCL,EAAIM,UACJzB,KAAK0B,oBAAoBP,EAC3B,CAeA,wBAAaQ,CACXC,EACA/B,EACAgC,GAEA,MAAMC,EAAmBC,EACvBH,EACA5B,KAAKgC,gBACLH,GAKF,OAFAC,EAAiBG,MAAQH,EAAiBG,MAAQ,GAAKH,EAAiB1C,GACxE0C,EAAiBI,KAAOJ,EAAiBI,KAAO,GAAKJ,EAAiBzC,GAC/D,IAAIW,KAAK8B,EAClB,EApIAK,EAdW5C,EAAO,OAoBJ,WAAS4C,EApBZ5C,EAAO,kBAsBO,IAAI6C,KAAoB9C,IAAc6C,EAtBpD5C,EAAO,cAwBGJ,GAAoBgD,EAxB9B5C,EAAO,kBA6HO,IAAI8C,EAAmB,KAAM,KAAM,KAAM,OA0BpEC,EAAcC,SAAShD,GACvB+C,EAAcE,YAAYjD"}
|
|
@@ -4,6 +4,7 @@ import { SHARED_ATTRIBUTES } from '../parser/attributes.mjs';
|
|
|
4
4
|
import { parseAttributes } from '../parser/parseAttributes.mjs';
|
|
5
5
|
import { classRegistry } from '../ClassRegistry.mjs';
|
|
6
6
|
import { FabricObject } from './Object/FabricObject.mjs';
|
|
7
|
+
import { escapeXml } from '../util/lang_string.mjs';
|
|
7
8
|
import { cacheProperties } from './Object/defaultValues.mjs';
|
|
8
9
|
|
|
9
10
|
const ellipseDefaultValues = {
|
|
@@ -82,7 +83,7 @@ class Ellipse extends FabricObject {
|
|
|
82
83
|
* of the instance
|
|
83
84
|
*/
|
|
84
85
|
_toSVG() {
|
|
85
|
-
return ['<ellipse ', 'COMMON_PARTS', `cx="0" cy="0" rx="${this.rx}" ry="${this.ry}" />\n`];
|
|
86
|
+
return ['<ellipse ', 'COMMON_PARTS', `cx="0" cy="0" rx="${escapeXml(this.rx)}" ry="${escapeXml(this.ry)}" />\n`];
|
|
86
87
|
}
|
|
87
88
|
|
|
88
89
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Ellipse.mjs","sources":["../../../src/shapes/Ellipse.ts"],"sourcesContent":["import { SCALE_X, SCALE_Y, twoMathPi } from '../constants';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport type { CSSRules } from '../parser/typedefs';\n\nexport const ellipseDefaultValues: Partial<TClassProperties<Ellipse>> = {\n rx: 0,\n ry: 0,\n};\n\ninterface UniqueEllipseProps {\n rx: number;\n ry: number;\n}\n\nexport interface SerializedEllipseProps\n extends SerializedObjectProps
|
|
1
|
+
{"version":3,"file":"Ellipse.mjs","sources":["../../../src/shapes/Ellipse.ts"],"sourcesContent":["import { SCALE_X, SCALE_Y, twoMathPi } from '../constants';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport type { CSSRules } from '../parser/typedefs';\nimport { escapeXml } from '../util/lang_string';\n\nexport const ellipseDefaultValues: Partial<TClassProperties<Ellipse>> = {\n rx: 0,\n ry: 0,\n};\n\ninterface UniqueEllipseProps {\n rx: number;\n ry: number;\n}\n\nexport interface SerializedEllipseProps\n extends SerializedObjectProps, UniqueEllipseProps {}\n\nexport interface EllipseProps extends FabricObjectProps, UniqueEllipseProps {}\n\nconst ELLIPSE_PROPS = ['rx', 'ry'] as const;\n\nexport class Ellipse<\n Props extends TOptions<EllipseProps> = Partial<EllipseProps>,\n SProps extends SerializedEllipseProps = SerializedEllipseProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n>\n extends FabricObject<Props, SProps, EventSpec>\n implements EllipseProps\n{\n /**\n * Horizontal radius\n * @type Number\n */\n declare rx: number;\n\n /**\n * Vertical radius\n * @type Number\n */\n declare ry: number;\n\n static type = 'Ellipse';\n\n static cacheProperties = [...cacheProperties, ...ELLIPSE_PROPS];\n\n static ownDefaults = ellipseDefaultValues;\n\n static getDefaults(): Record<string, any> {\n return {\n ...super.getDefaults(),\n ...Ellipse.ownDefaults,\n };\n }\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor(options?: Props) {\n super();\n Object.assign(this, Ellipse.ownDefaults);\n this.setOptions(options);\n }\n\n /**\n * @private\n * @param {String} key\n * @param {*} value\n * @return {Ellipse} thisArg\n */\n _set(key: string, value: any) {\n super._set(key, value);\n switch (key) {\n case 'rx':\n this.rx = value;\n this.set('width', value * 2);\n break;\n\n case 'ry':\n this.ry = value;\n this.set('height', value * 2);\n break;\n }\n return this;\n }\n\n /**\n * Returns horizontal radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRx() {\n return this.get('rx') * this.get(SCALE_X);\n }\n\n /**\n * Returns Vertical radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRy() {\n return this.get('ry') * this.get(SCALE_Y);\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit<Props & TClassProperties<this>, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick<T, K> & SProps {\n return super.toObject([...ELLIPSE_PROPS, ...propertiesToInclude]);\n }\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG(): string[] {\n return [\n '<ellipse ',\n 'COMMON_PARTS',\n `cx=\"0\" cy=\"0\" rx=\"${escapeXml(this.rx)}\" ry=\"${escapeXml(this.ry)}\" />\\n`,\n ];\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n ctx.beginPath();\n ctx.save();\n ctx.transform(1, 0, 0, this.ry / this.rx, 0, 0);\n ctx.arc(0, 0, this.rx, 0, twoMathPi, false);\n ctx.restore();\n this._renderPaintInOrder(ctx);\n }\n\n /* _FROM_SVG_START_ */\n\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link Ellipse.fromElement})\n * @see http://www.w3.org/TR/SVG/shapes.html#EllipseElement\n */\n static ATTRIBUTE_NAMES = [...SHARED_ATTRIBUTES, 'cx', 'cy', 'rx', 'ry'];\n\n /**\n * Returns {@link Ellipse} instance from an SVG element\n * @param {HTMLElement} element Element to parse\n * @return {Ellipse}\n */\n static async fromElement(\n element: HTMLElement,\n options?: Abortable,\n cssRules?: CSSRules,\n ) {\n const parsedAttributes = parseAttributes(\n element,\n this.ATTRIBUTE_NAMES,\n cssRules,\n );\n\n parsedAttributes.left = (parsedAttributes.left || 0) - parsedAttributes.rx;\n parsedAttributes.top = (parsedAttributes.top || 0) - parsedAttributes.ry;\n return new this(parsedAttributes);\n }\n\n /* _FROM_SVG_END_ */\n}\n\nclassRegistry.setClass(Ellipse);\nclassRegistry.setSVGClass(Ellipse);\n"],"names":["ellipseDefaultValues","rx","ry","ELLIPSE_PROPS","Ellipse","FabricObject","getDefaults","ownDefaults","constructor","options","Object","assign","setOptions","_set","key","value","set","getRx","get","SCALE_X","getRy","SCALE_Y","toObject","propertiesToInclude","arguments","length","undefined","_toSVG","escapeXml","_render","ctx","beginPath","save","transform","arc","twoMathPi","restore","_renderPaintInOrder","fromElement","element","cssRules","parsedAttributes","parseAttributes","ATTRIBUTE_NAMES","left","top","_defineProperty","cacheProperties","SHARED_ATTRIBUTES","classRegistry","setClass","setSVGClass"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Group.d.ts","sourceRoot":"","sources":["../../../src/shapes/Group.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEvE,OAAO,KAAK,EACV,gBAAgB,EAChB,WAAW,EACX,QAAQ,EACR,SAAS,EACV,MAAM,aAAa,CAAC;AAUrB,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAGrD,OAAO,KAAK,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAE/E,OAAO,KAAK,EACV,uBAAuB,EACvB,iBAAiB,EACjB,gBAAgB,EACjB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAO/D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAE9E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"Group.d.ts","sourceRoot":"","sources":["../../../src/shapes/Group.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEvE,OAAO,KAAK,EACV,gBAAgB,EAChB,WAAW,EACX,QAAQ,EACR,SAAS,EACV,MAAM,aAAa,CAAC;AAUrB,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAGrD,OAAO,KAAK,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAE/E,OAAO,KAAK,EACV,uBAAuB,EACvB,iBAAiB,EACjB,gBAAgB,EACjB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAO/D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAE9E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAanD,MAAM,WAAW,WAAY,SAAQ,YAAY,EAAE,gBAAgB;IACjE,eAAe,EAAE,iBAAiB,CAAC;IACnC,cAAc,EAAE,gBAAgB,CAAC;CAClC;AAED,MAAM,WAAW,aAAa;IAC5B,cAAc,EAAE,OAAO,CAAC;IACxB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,oBACf,SAAQ,qBAAqB,EAAE,aAAa;IAC5C,OAAO,EAAE,qBAAqB,EAAE,CAAC;IACjC,aAAa,EAAE,uBAAuB,CAAC;CACxC;AAED,MAAM,WAAW,UAAW,SAAQ,iBAAiB,EAAE,aAAa;IAClE,aAAa,EAAE,aAAa,CAAC;CAC9B;AAED,eAAO,MAAM,kBAAkB,EAAE,OAAO,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAI/D,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAooBg+rC,CAAC;;;;AAloBn+rC;;;;;GAKG;AACH,qBAAa,KACX,SAAQ,UAGR,YAAW,UAAU;IAErB;;;;OAIG;IACK,cAAc,EAAE,OAAO,CAAC;IAEhC;;;;;;;;;;OAUG;IACK,WAAW,EAAE,OAAO,CAAC;IAErB,aAAa,EAAE,aAAa,CAAC;IAErC;;;;;OAKG;IACH,SAAS,CAAC,cAAc,EAAE,YAAY,EAAE,CAAM;IAE9C,MAAM,CAAC,IAAI,SAAW;IAEtB,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAsB;IAC7D,OAAO,CAAC,wBAAwB,CAAyC;IACzE,OAAO,CAAC,yBAAyB,CAA2C;IAE5E,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAOzC;;;;;OAKG;gBACS,OAAO,GAAE,YAAY,EAAO,EAAE,OAAO,GAAE,OAAO,CAAC,UAAU,CAAM;IAO3E;;;OAGG;IACH,SAAS,CAAC,SAAS,CACjB,OAAO,EAAE,YAAY,EAAE,EACvB,OAAO,EAAE;QACP,aAAa,CAAC,EAAE,aAAa,CAAC;QAC9B,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;KACf;IA+BH;;;;;OAKG;IACH,aAAa,CAAC,MAAM,EAAE,YAAY;IAmBlC;;;;OAIG;IACH,SAAS,CAAC,iCAAiC,CAAC,OAAO,EAAE,YAAY,EAAE;IAOnE;;;OAGG;IACH,GAAG,CAAC,GAAG,OAAO,EAAE,YAAY,EAAE;IAO9B;;;;OAIG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,EAAE,YAAY,EAAE;IAOlD;;;;OAIG;IACH,MAAM,CAAC,GAAG,OAAO,EAAE,YAAY,EAAE;IAMjC,cAAc,CAAC,MAAM,EAAE,YAAY;IAMnC;;;;OAIG;IACH,gBAAgB,CAAC,MAAM,EAAE,YAAY,EAAE,qBAAqB,CAAC,EAAE,OAAO;IAMtE;;;;OAIG;IACH,qBAAqB,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE;IAQxE,oBAAoB;IAIpB;;;;OAIG;IACH,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG;IAW5B;;OAEG;IACH,sBAAsB;IAItB;;;OAGG;IACH,SAAS;IAKT;;;OAGG;IACH,wBAAwB,CAAC,CAAC,SAAS,OAAO,EACxC,QAAQ,EAAE,CAAC,EACX,EACE,MAAM,EAAE,MAAM,GACf,EAAE,YAAY,CAAC,CAAC,SAAS,IAAI,GAAG,UAAU,GAAG,YAAY,CAAC;IAe7D;;;;OAIG;IACH,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY;IAYjD;;;;OAIG;IACH,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,qBAAqB,CAAC,EAAE,OAAO;IAMhE;;;;OAIG;IACH,WAAW,CAAC,MAAM,EAAE,YAAY,EAAE,qBAAqB,CAAC,EAAE,OAAO;IA4BjE;;;;OAIG;IACH,SAAS,CAAC,MAAM,EAAE,YAAY,EAAE,qBAAqB,CAAC,EAAE,OAAO;IAM/D;;;;;;;;OAQG;IACH,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,qBAAqB,CAAC,EAAE,OAAO;IAoBhE;;;;;;OAMG;IACH,WAAW;IAaX;;;OAGG;IACH,cAAc;IAYd;;;OAGG;IACH,UAAU,IAAI,OAAO;IAIrB;;;OAGG;IACH,UAAU,CACR,GAAG,EAAE,wBAAwB,EAC7B,WAAW,EAAE,OAAO,GAAG,SAAS,EAChC,OAAO,EAAE,WAAW;IAkBtB;;;OAGG;IACH,SAAS;IAMT,aAAa,CAAC,OAAO,GAAE,uBAA4B;IAQnD;;;OAGG;IACH,MAAM,CAAC,GAAG,EAAE,wBAAwB;IAMpC;;;;;;OAMG;IACH,kBAAkB,CAChB,MAAM,EAAE,UAAU,GAAG,kBAAkB,EACvC,mBAAmB,CAAC,EAAE,MAAM,EAAE;IAiBhC;;;;OAIG;IACH,QAAQ,CACN,CAAC,SAAS,IAAI,CACZ,UAAU,GAAG,gBAAgB,CAAC,IAAI,CAAC,EACnC,MAAM,oBAAoB,CAC3B,EACD,CAAC,SAAS,MAAM,CAAC,GAAG,KAAK,EACzB,mBAAmB,GAAE,CAAC,EAAO,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,oBAAoB;IAmBnE,QAAQ;IAIR,OAAO;IAaP;;OAEG;IACH,gBAAgB,CAAC,OAAO,CAAC,EAAE,WAAW;IAWtC;;;;OAIG;IACH,MAAM,CAAC,OAAO,CAAC,EAAE,WAAW;IAW5B;;;OAGG;IACH,YAAY,IAAI,MAAM;IAStB;;;;OAIG;IACH,aAAa,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,MAAM;IAY5C;;;;;OAKG;IACH,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,QAAQ,CAAC,oBAAoB,CAAC,EACxD,EAAE,IAAI,EAAE,OAAY,EAAE,aAAa,EAAE,GAAG,OAAO,EAAE,EAAE,CAAC,EACpD,SAAS,CAAC,EAAE,SAAS;CA+BxB"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{defineProperty as t}from"../../_virtual/_rollupPluginBabelHelpers.min.mjs";import{createCollectionMixin as e}from"../Collection.min.mjs";import{multiplyTransformMatrices as s,invertTransform as r}from"../util/misc/matrix.min.mjs";import{enlivenObjects as i,enlivenObjectEnlivables as o}from"../util/misc/objectEnlive.min.mjs";import{applyTransformToObject as n}from"../util/misc/objectTransforms.min.mjs";import{FabricObject as a}from"./Object/FabricObject.min.mjs";import{Rect as c}from"./Rect.min.mjs";import{classRegistry as h}from"../ClassRegistry.min.mjs";import{log as l}from"../util/internals/console.min.mjs";import{LayoutManager as u}from"../LayoutManager/LayoutManager.min.mjs";import{LAYOUT_TYPE_INITIALIZATION as p,LAYOUT_TYPE_ADDED as
|
|
1
|
+
import{defineProperty as t}from"../../_virtual/_rollupPluginBabelHelpers.min.mjs";import{createCollectionMixin as e}from"../Collection.min.mjs";import{multiplyTransformMatrices as s,invertTransform as r}from"../util/misc/matrix.min.mjs";import{enlivenObjects as i,enlivenObjectEnlivables as o}from"../util/misc/objectEnlive.min.mjs";import{applyTransformToObject as n}from"../util/misc/objectTransforms.min.mjs";import{FabricObject as a}from"./Object/FabricObject.min.mjs";import{Rect as c}from"./Rect.min.mjs";import{classRegistry as h}from"../ClassRegistry.min.mjs";import{log as l}from"../util/internals/console.min.mjs";import{LayoutManager as u}from"../LayoutManager/LayoutManager.min.mjs";import{LAYOUT_TYPE_INITIALIZATION as p,LAYOUT_TYPE_ADDED as g,LAYOUT_TYPE_REMOVED as _,LAYOUT_TYPE_IMPERATIVE as d}from"../LayoutManager/constants.min.mjs";import{escapeXml as f}from"../util/lang_string.min.mjs";class b extends u{performLayout(){}}const j={strokeWidth:0,subTargetCheck:!1,interactive:!1};class m extends(e(a)){static getDefaults(){return{...super.getDefaults(),...m.ownDefaults}}constructor(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};super(),t(this,"_activeObjects",[]),t(this,"__objectSelectionTracker",void 0),t(this,"__objectSelectionDisposer",void 0),Object.assign(this,m.ownDefaults),this.setOptions(s),this.groupInit(e,s)}groupInit(t,e){var s;this._objects=[...t],this.__objectSelectionTracker=this.__objectSelectionMonitor.bind(this,!0),this.__objectSelectionDisposer=this.__objectSelectionMonitor.bind(this,!1),this.forEachObject(t=>{this.enterGroup(t,!1)}),this.layoutManager=null!==(s=e.layoutManager)&&void 0!==s?s:new u,this.layoutManager.performLayout({type:p,target:this,targets:[...t],x:e.left,y:e.top})}canEnterGroup(t){return t===this||this.isDescendantOf(t)?(l("error","Group: circular object trees are not supported, this call has no effect"),!1):-1===this._objects.indexOf(t)||(l("error","Group: duplicate objects are not supported inside group, this call has no effect"),!1)}_filterObjectsBeforeEnteringGroup(t){return t.filter((t,e,s)=>this.canEnterGroup(t)&&s.indexOf(t)===e)}add(){for(var t=arguments.length,e=new Array(t),s=0;s<t;s++)e[s]=arguments[s];const r=this._filterObjectsBeforeEnteringGroup(e),i=super.add(...r);return this._onAfterObjectsChange(g,r),i}insertAt(t){for(var e=arguments.length,s=new Array(e>1?e-1:0),r=1;r<e;r++)s[r-1]=arguments[r];const i=this._filterObjectsBeforeEnteringGroup(s),o=super.insertAt(t,...i);return this._onAfterObjectsChange(g,i),o}remove(){const t=super.remove(...arguments);return this._onAfterObjectsChange(_,t),t}_onObjectAdded(t){this.enterGroup(t,!0),this.fire("object:added",{target:t}),t.fire("added",{target:this})}_onObjectRemoved(t,e){this.exitGroup(t,e),this.fire("object:removed",{target:t}),t.fire("removed",{target:this})}_onAfterObjectsChange(t,e){this.layoutManager.performLayout({type:t,targets:e,target:this})}_onStackOrderChanged(){this._set("dirty",!0)}_set(t,e){const s=this[t];return super._set(t,e),"canvas"===t&&s!==e&&(this._objects||[]).forEach(s=>{s._set(t,e)}),this}_shouldSetNestedCoords(){return this.subTargetCheck}removeAll(){return this._activeObjects=[],this.remove(...this._objects)}__objectSelectionMonitor(t,e){let{target:s}=e;const r=this._activeObjects;if(t)r.push(s),this._set("dirty",!0);else if(r.length>0){const t=r.indexOf(s);t>-1&&(r.splice(t,1),this._set("dirty",!0))}}_watchObject(t,e){t&&this._watchObject(!1,e),t?(e.on("selected",this.__objectSelectionTracker),e.on("deselected",this.__objectSelectionDisposer)):(e.off("selected",this.__objectSelectionTracker),e.off("deselected",this.__objectSelectionDisposer))}enterGroup(t,e){t.group&&t.group.remove(t),t._set("parent",this),this._enterGroup(t,e)}_enterGroup(t,e){e&&n(t,s(r(this.calcTransformMatrix()),t.calcTransformMatrix())),this._shouldSetNestedCoords()&&t.setCoords(),t._set("group",this),t._set("canvas",this.canvas),this._watchObject(!0,t);const i=this.canvas&&this.canvas.getActiveObject&&this.canvas.getActiveObject();i&&(i===t||t.isDescendantOf(i))&&this._activeObjects.push(t)}exitGroup(t,e){this._exitGroup(t,e),t._set("parent",void 0),t._set("canvas",void 0)}_exitGroup(t,e){t._set("group",void 0),e||(n(t,s(this.calcTransformMatrix(),t.calcTransformMatrix())),t.setCoords()),this._watchObject(!1,t);const r=this._activeObjects.length>0?this._activeObjects.indexOf(t):-1;r>-1&&this._activeObjects.splice(r,1)}shouldCache(){const t=a.prototype.shouldCache.call(this);if(t)for(let t=0;t<this._objects.length;t++)if(this._objects[t].willDrawShadow())return this.ownCaching=!1,!1;return t}willDrawShadow(){if(super.willDrawShadow())return!0;for(let t=0;t<this._objects.length;t++)if(this._objects[t].willDrawShadow())return!0;return!1}isOnACache(){return this.ownCaching||!!this.parent&&this.parent.isOnACache()}drawObject(t,e,s){this._renderBackground(t);for(let e=0;e<this._objects.length;e++){var i;const s=this._objects[e];null!==(i=this.canvas)&&void 0!==i&&i.preserveObjectStacking&&s.group!==this?(t.save(),t.transform(...r(this.calcTransformMatrix())),s.render(t),t.restore()):s.group===this&&s.render(t)}this._drawClipPath(t,this.clipPath,s)}setCoords(){super.setCoords(),this._shouldSetNestedCoords()&&this.forEachObject(t=>t.setCoords())}triggerLayout(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.layoutManager.performLayout({target:this,type:d,...t})}render(t){this._transformDone=!0,super.render(t),this._transformDone=!1}__serializeObjects(t,e){const s=this.includeDefaultValues;return this._objects.filter(function(t){return!t.excludeFromExport}).map(function(r){const i=r.includeDefaultValues;r.includeDefaultValues=s;const o=r[t||"toObject"](e);return r.includeDefaultValues=i,o})}toObject(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];const e=this.layoutManager.toObject();return{...super.toObject(["subTargetCheck","interactive",...t]),..."fit-content"!==e.strategy||this.includeDefaultValues?{layoutManager:e}:{},objects:this.__serializeObjects("toObject",t)}}toString(){return`#<Group: (${this.complexity()})>`}dispose(){this.layoutManager.unsubscribeTargets({targets:this.getObjects(),target:this}),this._activeObjects=[],this.forEachObject(t=>{this._watchObject(!1,t),t.dispose()}),super.dispose()}_createSVGBgRect(t){if(!this.backgroundColor)return"";const e=c.prototype._toSVG.call(this),s=e.indexOf("COMMON_PARTS");e[s]='for="group" ';const r=e.join("");return t?t(r):r}_toSVG(t){const e=["<g ","COMMON_PARTS"," >\n"],s=this._createSVGBgRect(t);s&&e.push("\t\t",s);for(let s=0;s<this._objects.length;s++)e.push("\t\t",this._objects[s].toSVG(t));return e.push("</g>\n"),e}getSvgStyles(){const t=void 0!==this.opacity&&1!==this.opacity?`opacity: ${f(this.opacity)};`:"",e=this.visible?"":" visibility: hidden;";return[t,this.getSvgFilter(),e].join("")}toClipPathSVG(t){const e=[],s=this._createSVGBgRect(t);s&&e.push("\t",s);for(let s=0;s<this._objects.length;s++)e.push("\t",this._objects[s].toClipPathSVG(t));return this._createBaseClipPathSVGMarkup(e,{reviver:t})}static fromObject(t,e){let{type:s,objects:r=[],layoutManager:n,...a}=t;return Promise.all([i(r,e),o(a,e)]).then(t=>{let[e,s]=t;const r=new this(e,{...a,...s,layoutManager:new b});if(n){const t=h.getClass(n.type),e=h.getClass(n.strategy);r.layoutManager=new t(new e)}else r.layoutManager=new u;return r.layoutManager.subscribeTargets({type:p,target:r,targets:r.getObjects()}),r.setCoords(),r})}}t(m,"type","Group"),t(m,"ownDefaults",j),h.setClass(m);export{m as Group,j as groupDefaultValues};
|
|
2
2
|
//# sourceMappingURL=Group.min.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Group.min.mjs","sources":["../../../src/shapes/Group.ts"],"sourcesContent":["import type { CollectionEvents, ObjectEvents } from '../EventTypeDefs';\nimport { createCollectionMixin } from '../Collection';\nimport type {\n TClassProperties,\n TSVGReviver,\n TOptions,\n Abortable,\n} from '../typedefs';\nimport {\n invertTransform,\n multiplyTransformMatrices,\n} from '../util/misc/matrix';\nimport {\n enlivenObjectEnlivables,\n enlivenObjects,\n} from '../util/misc/objectEnlive';\nimport { applyTransformToObject } from '../util/misc/objectTransforms';\nimport { FabricObject } from './Object/FabricObject';\nimport { Rect } from './Rect';\nimport { classRegistry } from '../ClassRegistry';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport { log } from '../util/internals/console';\nimport type {\n ImperativeLayoutOptions,\n LayoutBeforeEvent,\n LayoutAfterEvent,\n} from '../LayoutManager/types';\nimport { LayoutManager } from '../LayoutManager/LayoutManager';\nimport {\n LAYOUT_TYPE_ADDED,\n LAYOUT_TYPE_IMPERATIVE,\n LAYOUT_TYPE_INITIALIZATION,\n LAYOUT_TYPE_REMOVED,\n} from '../LayoutManager/constants';\nimport type { SerializedLayoutManager } from '../LayoutManager/LayoutManager';\nimport type { FitContentLayout } from '../LayoutManager';\nimport type { DrawContext } from './Object/Object';\n\n/**\n * This class handles the specific case of creating a group using {@link Group#fromObject} and is not meant to be used in any other case.\n * We could have used a boolean in the constructor, as we did previously, but we think the boolean\n * would stay in the group's constructor interface and create confusion, therefore it was removed.\n * This layout manager doesn't do anything and therefore keeps the exact layout the group had when {@link Group#toObject} was called.\n */\nclass NoopLayoutManager extends LayoutManager {\n performLayout() {}\n}\n\nexport interface GroupEvents extends ObjectEvents, CollectionEvents {\n 'layout:before': LayoutBeforeEvent;\n 'layout:after': LayoutAfterEvent;\n}\n\nexport interface GroupOwnProps {\n subTargetCheck: boolean;\n interactive: boolean;\n}\n\nexport interface SerializedGroupProps\n extends SerializedObjectProps,\n GroupOwnProps {\n objects: SerializedObjectProps[];\n layoutManager: SerializedLayoutManager;\n}\n\nexport interface GroupProps extends FabricObjectProps, GroupOwnProps {\n layoutManager: LayoutManager;\n}\n\nexport const groupDefaultValues: Partial<TClassProperties<Group>> = {\n strokeWidth: 0,\n subTargetCheck: false,\n interactive: false,\n};\n\n/**\n * @fires object:added\n * @fires object:removed\n * @fires layout:before\n * @fires layout:after\n */\nexport class Group\n extends createCollectionMixin(\n FabricObject<GroupProps, SerializedGroupProps, GroupEvents>,\n )\n implements GroupProps\n{\n /**\n * Used to optimize performance\n * set to `false` if you don't need contained objects to be targets of events\n * @type boolean\n */\n declare subTargetCheck: boolean;\n\n /**\n * Used to allow targeting of object inside groups.\n * set to true if you want to select an object inside a group.\\\n * **REQUIRES** `subTargetCheck` set to true\n * This will be not removed but slowly replaced with a method setInteractive\n * that will take care of enabling subTargetCheck and necessary object events.\n * There is too much attached to group interactivity to just be evaluated by a\n * boolean in the code\n * @deprecated\n * @type boolean\n */\n declare interactive: boolean;\n\n declare layoutManager: LayoutManager;\n\n /**\n * Used internally to optimize performance\n * Once an object is selected, instance is rendered without the selected object.\n * This way instance is cached only once for the entire interaction with the selected object.\n * @private\n */\n protected _activeObjects: FabricObject[] = [];\n\n static type = 'Group';\n\n static ownDefaults: Record<string, any> = groupDefaultValues;\n private __objectSelectionTracker: (ev: ObjectEvents['selected']) => void;\n private __objectSelectionDisposer: (ev: ObjectEvents['deselected']) => void;\n\n static getDefaults(): Record<string, any> {\n return {\n ...super.getDefaults(),\n ...Group.ownDefaults,\n };\n }\n\n /**\n * Constructor\n *\n * @param {FabricObject[]} [objects] instance objects\n * @param {Object} [options] Options object\n */\n constructor(objects: FabricObject[] = [], options: Partial<GroupProps> = {}) {\n super();\n Object.assign(this, Group.ownDefaults);\n this.setOptions(options);\n this.groupInit(objects, options);\n }\n\n /**\n * Shared code between group and active selection\n * Meant to be used by the constructor.\n */\n protected groupInit(\n objects: FabricObject[],\n options: {\n layoutManager?: LayoutManager;\n top?: number;\n left?: number;\n },\n ) {\n this._objects = [...objects]; // Avoid unwanted mutations of Collection to affect the caller\n\n this.__objectSelectionTracker = this.__objectSelectionMonitor.bind(\n this,\n true,\n );\n this.__objectSelectionDisposer = this.__objectSelectionMonitor.bind(\n this,\n false,\n );\n\n this.forEachObject((object) => {\n this.enterGroup(object, false);\n });\n\n // perform initial layout\n this.layoutManager = options.layoutManager ?? new LayoutManager();\n this.layoutManager.performLayout({\n type: LAYOUT_TYPE_INITIALIZATION,\n target: this,\n targets: [...objects],\n // @TODO remove this concept from the layout manager.\n // Layout manager will calculate the correct position,\n // group options can override it later.\n x: options.left,\n y: options.top,\n });\n }\n\n /**\n * Checks if object can enter group and logs relevant warnings\n * @private\n * @param {FabricObject} object\n * @returns\n */\n canEnterGroup(object: FabricObject) {\n if (object === this || this.isDescendantOf(object)) {\n // prevent circular object tree\n log(\n 'error',\n 'Group: circular object trees are not supported, this call has no effect',\n );\n return false;\n } else if (this._objects.indexOf(object) !== -1) {\n // is already in the objects array\n log(\n 'error',\n 'Group: duplicate objects are not supported inside group, this call has no effect',\n );\n return false;\n }\n return true;\n }\n\n /**\n * Override this method to enhance performance (for groups with a lot of objects).\n * If Overriding, be sure not pass illegal objects to group - it will break your app.\n * @private\n */\n protected _filterObjectsBeforeEnteringGroup(objects: FabricObject[]) {\n return objects.filter((object, index, array) => {\n // can enter AND is the first occurrence of the object in the passed args (to prevent adding duplicates)\n return this.canEnterGroup(object) && array.indexOf(object) === index;\n });\n }\n\n /**\n * Add objects\n * @param {...FabricObject[]} objects\n */\n add(...objects: FabricObject[]) {\n const allowedObjects = this._filterObjectsBeforeEnteringGroup(objects);\n const size = super.add(...allowedObjects);\n this._onAfterObjectsChange(LAYOUT_TYPE_ADDED, allowedObjects);\n return size;\n }\n\n /**\n * Inserts an object into collection at specified index\n * @param {FabricObject[]} objects Object to insert\n * @param {Number} index Index to insert object at\n */\n insertAt(index: number, ...objects: FabricObject[]) {\n const allowedObjects = this._filterObjectsBeforeEnteringGroup(objects);\n const size = super.insertAt(index, ...allowedObjects);\n this._onAfterObjectsChange(LAYOUT_TYPE_ADDED, allowedObjects);\n return size;\n }\n\n /**\n * Remove objects\n * @param {...FabricObject[]} objects\n * @returns {FabricObject[]} removed objects\n */\n remove(...objects: FabricObject[]) {\n const removed = super.remove(...objects);\n this._onAfterObjectsChange(LAYOUT_TYPE_REMOVED, removed);\n return removed;\n }\n\n _onObjectAdded(object: FabricObject) {\n this.enterGroup(object, true);\n this.fire('object:added', { target: object });\n object.fire('added', { target: this });\n }\n\n /**\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it\n */\n _onObjectRemoved(object: FabricObject, removeParentTransform?: boolean) {\n this.exitGroup(object, removeParentTransform);\n this.fire('object:removed', { target: object });\n object.fire('removed', { target: this });\n }\n\n /**\n * @private\n * @param {'added'|'removed'} type\n * @param {FabricObject[]} targets\n */\n _onAfterObjectsChange(type: 'added' | 'removed', targets: FabricObject[]) {\n this.layoutManager.performLayout({\n type,\n targets,\n target: this,\n });\n }\n\n _onStackOrderChanged() {\n this._set('dirty', true);\n }\n\n /**\n * @private\n * @param {string} key\n * @param {*} value\n */\n _set(key: string, value: any) {\n const prev = this[key as keyof this];\n super._set(key, value);\n if (key === 'canvas' && prev !== value) {\n (this._objects || []).forEach((object) => {\n object._set(key, value);\n });\n }\n return this;\n }\n\n /**\n * @private\n */\n _shouldSetNestedCoords() {\n return this.subTargetCheck;\n }\n\n /**\n * Remove all objects\n * @returns {FabricObject[]} removed objects\n */\n removeAll() {\n this._activeObjects = [];\n return this.remove(...this._objects);\n }\n\n /**\n * keeps track of the selected objects\n * @private\n */\n __objectSelectionMonitor<T extends boolean>(\n selected: T,\n {\n target: object,\n }: ObjectEvents[T extends true ? 'selected' : 'deselected'],\n ) {\n const activeObjects = this._activeObjects;\n if (selected) {\n activeObjects.push(object);\n this._set('dirty', true);\n } else if (activeObjects.length > 0) {\n const index = activeObjects.indexOf(object);\n if (index > -1) {\n activeObjects.splice(index, 1);\n this._set('dirty', true);\n }\n }\n }\n\n /**\n * @private\n * @param {boolean} watch\n * @param {FabricObject} object\n */\n _watchObject(watch: boolean, object: FabricObject) {\n // make sure we listen only once\n watch && this._watchObject(false, object);\n if (watch) {\n object.on('selected', this.__objectSelectionTracker);\n object.on('deselected', this.__objectSelectionDisposer);\n } else {\n object.off('selected', this.__objectSelectionTracker);\n object.off('deselected', this.__objectSelectionDisposer);\n }\n }\n\n /**\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object is in canvas coordinate plane\n */\n enterGroup(object: FabricObject, removeParentTransform?: boolean) {\n object.group && object.group.remove(object);\n object._set('parent', this);\n this._enterGroup(object, removeParentTransform);\n }\n\n /**\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object is in canvas coordinate plane\n */\n _enterGroup(object: FabricObject, removeParentTransform?: boolean) {\n if (removeParentTransform) {\n // can this be converted to utils (sendObjectToPlane)?\n applyTransformToObject(\n object,\n multiplyTransformMatrices(\n invertTransform(this.calcTransformMatrix()),\n object.calcTransformMatrix(),\n ),\n );\n }\n this._shouldSetNestedCoords() && object.setCoords();\n object._set('group', this);\n object._set('canvas', this.canvas);\n this._watchObject(true, object);\n const activeObject =\n this.canvas &&\n this.canvas.getActiveObject &&\n this.canvas.getActiveObject();\n // if we are adding the activeObject in a group\n if (\n activeObject &&\n (activeObject === object || object.isDescendantOf(activeObject))\n ) {\n this._activeObjects.push(object);\n }\n }\n\n /**\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it\n */\n exitGroup(object: FabricObject, removeParentTransform?: boolean) {\n this._exitGroup(object, removeParentTransform);\n object._set('parent', undefined);\n object._set('canvas', undefined);\n }\n\n /**\n * Executes the inner fabric logic of exiting a group.\n * - Stop watching the object\n * - Remove the object from the optimization map this._activeObjects\n * - unset the group property of the object\n * @protected\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it\n */\n _exitGroup(object: FabricObject, removeParentTransform?: boolean) {\n object._set('group', undefined);\n if (!removeParentTransform) {\n applyTransformToObject(\n object,\n multiplyTransformMatrices(\n this.calcTransformMatrix(),\n object.calcTransformMatrix(),\n ),\n );\n object.setCoords();\n }\n this._watchObject(false, object);\n const index =\n this._activeObjects.length > 0 ? this._activeObjects.indexOf(object) : -1;\n if (index > -1) {\n this._activeObjects.splice(index, 1);\n }\n }\n\n /**\n * Decide if the group should cache or not. Create its own cache level\n * needsItsOwnCache should be used when the object drawing method requires\n * a cache step.\n * Generally you do not cache objects in groups because the group is already cached.\n * @return {Boolean}\n */\n shouldCache() {\n const ownCache = FabricObject.prototype.shouldCache.call(this);\n if (ownCache) {\n for (let i = 0; i < this._objects.length; i++) {\n if (this._objects[i].willDrawShadow()) {\n this.ownCaching = false;\n return false;\n }\n }\n }\n return ownCache;\n }\n\n /**\n * Check if this object or a child object will cast a shadow\n * @return {Boolean}\n */\n willDrawShadow() {\n if (super.willDrawShadow()) {\n return true;\n }\n for (let i = 0; i < this._objects.length; i++) {\n if (this._objects[i].willDrawShadow()) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Check if instance or its group are caching, recursively up\n * @return {Boolean}\n */\n isOnACache(): boolean {\n return this.ownCaching || (!!this.parent && this.parent.isOnACache());\n }\n\n /**\n * Execute the drawing operation for an object on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawObject(\n ctx: CanvasRenderingContext2D,\n forClipping: boolean | undefined,\n context: DrawContext,\n ) {\n this._renderBackground(ctx);\n for (let i = 0; i < this._objects.length; i++) {\n const obj = this._objects[i];\n // TODO: handle rendering edge case somehow\n if (this.canvas?.preserveObjectStacking && obj.group !== this) {\n ctx.save();\n ctx.transform(...invertTransform(this.calcTransformMatrix()));\n obj.render(ctx);\n ctx.restore();\n } else if (obj.group === this) {\n obj.render(ctx);\n }\n }\n this._drawClipPath(ctx, this.clipPath, context);\n }\n\n /**\n * @override\n * @return {Boolean}\n */\n setCoords() {\n super.setCoords();\n this._shouldSetNestedCoords() &&\n this.forEachObject((object) => object.setCoords());\n }\n\n triggerLayout(options: ImperativeLayoutOptions = {}) {\n this.layoutManager.performLayout({\n target: this,\n type: LAYOUT_TYPE_IMPERATIVE,\n ...options,\n });\n }\n\n /**\n * Renders instance on a given context\n * @param {CanvasRenderingContext2D} ctx context to render instance on\n */\n render(ctx: CanvasRenderingContext2D) {\n this._transformDone = true;\n super.render(ctx);\n this._transformDone = false;\n }\n\n /**\n *\n * @private\n * @param {'toObject'|'toDatalessObject'} [method]\n * @param {string[]} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @returns {FabricObject[]} serialized objects\n */\n __serializeObjects(\n method: 'toObject' | 'toDatalessObject',\n propertiesToInclude?: string[],\n ) {\n const _includeDefaultValues = this.includeDefaultValues;\n return this._objects\n .filter(function (obj) {\n return !obj.excludeFromExport;\n })\n .map(function (obj) {\n const originalDefaults = obj.includeDefaultValues;\n obj.includeDefaultValues = _includeDefaultValues;\n const data = obj[method || 'toObject'](propertiesToInclude);\n obj.includeDefaultValues = originalDefaults;\n // delete data.version;\n return data;\n });\n }\n\n /**\n * Returns object representation of an instance\n * @param {string[]} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit<\n GroupProps & TClassProperties<this>,\n keyof SerializedGroupProps\n >,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick<T, K> & SerializedGroupProps {\n const layoutManager = this.layoutManager.toObject();\n\n return {\n ...super.toObject([\n 'subTargetCheck',\n 'interactive',\n ...propertiesToInclude,\n ]),\n ...(layoutManager.strategy !== 'fit-content' || this.includeDefaultValues\n ? { layoutManager }\n : {}),\n objects: this.__serializeObjects(\n 'toObject',\n propertiesToInclude as string[],\n ),\n };\n }\n\n toString() {\n return `#<Group: (${this.complexity()})>`;\n }\n\n dispose() {\n this.layoutManager.unsubscribeTargets({\n targets: this.getObjects(),\n target: this,\n });\n this._activeObjects = [];\n this.forEachObject((object) => {\n this._watchObject(false, object);\n object.dispose();\n });\n super.dispose();\n }\n\n /**\n * @private\n */\n _createSVGBgRect(reviver?: TSVGReviver) {\n if (!this.backgroundColor) {\n return '';\n }\n const fillStroke = Rect.prototype._toSVG.call(this);\n const commons = fillStroke.indexOf('COMMON_PARTS');\n fillStroke[commons] = 'for=\"group\" ';\n const markup = fillStroke.join('');\n return reviver ? reviver(markup) : markup;\n }\n\n /**\n * Returns svg representation of an instance\n * @param {TSVGReviver} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n _toSVG(reviver?: TSVGReviver) {\n const svgString = ['<g ', 'COMMON_PARTS', ' >\\n'];\n const bg = this._createSVGBgRect(reviver);\n bg && svgString.push('\\t\\t', bg);\n for (let i = 0; i < this._objects.length; i++) {\n svgString.push('\\t\\t', this._objects[i].toSVG(reviver));\n }\n svgString.push('</g>\\n');\n return svgString;\n }\n\n /**\n * Returns styles-string for svg-export, specific version for group\n * @return {String}\n */\n getSvgStyles(): string {\n const opacity =\n typeof this.opacity !== 'undefined' && this.opacity !== 1\n ? `opacity: ${this.opacity};`\n : '',\n visibility = this.visible ? '' : ' visibility: hidden;';\n return [opacity, this.getSvgFilter(), visibility].join('');\n }\n\n /**\n * Returns svg clipPath representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toClipPathSVG(reviver?: TSVGReviver): string {\n const svgString = [];\n const bg = this._createSVGBgRect(reviver);\n bg && svgString.push('\\t', bg);\n for (let i = 0; i < this._objects.length; i++) {\n svgString.push('\\t', this._objects[i].toClipPathSVG(reviver));\n }\n return this._createBaseClipPathSVGMarkup(svgString, {\n reviver,\n });\n }\n\n /**\n * @todo support loading from svg\n * @private\n * @param {Object} object Object to create a group from\n * @returns {Promise<Group>}\n */\n static fromObject<T extends TOptions<SerializedGroupProps>>(\n { type, objects = [], layoutManager, ...options }: T,\n abortable?: Abortable,\n ) {\n return Promise.all([\n enlivenObjects<FabricObject>(objects, abortable),\n enlivenObjectEnlivables(options, abortable),\n ]).then(([objects, hydratedOptions]) => {\n const group = new this(objects, {\n ...options,\n ...hydratedOptions,\n layoutManager: new NoopLayoutManager(),\n });\n if (layoutManager) {\n const layoutClass = classRegistry.getClass<typeof LayoutManager>(\n layoutManager.type,\n );\n const strategyClass = classRegistry.getClass<typeof FitContentLayout>(\n layoutManager.strategy,\n );\n group.layoutManager = new layoutClass(new strategyClass());\n } else {\n group.layoutManager = new LayoutManager();\n }\n group.layoutManager.subscribeTargets({\n type: LAYOUT_TYPE_INITIALIZATION,\n target: group,\n targets: group.getObjects(),\n });\n group.setCoords();\n return group;\n });\n }\n}\n\nclassRegistry.setClass(Group);\n"],"names":["NoopLayoutManager","LayoutManager","performLayout","groupDefaultValues","strokeWidth","subTargetCheck","interactive","Group","createCollectionMixin","FabricObject","getDefaults","super","ownDefaults","constructor","objects","arguments","length","undefined","options","_defineProperty","this","Object","assign","setOptions","groupInit","_options$layoutManage","_objects","__objectSelectionTracker","__objectSelectionMonitor","bind","__objectSelectionDisposer","forEachObject","object","enterGroup","layoutManager","type","LAYOUT_TYPE_INITIALIZATION","target","targets","x","left","y","top","canEnterGroup","isDescendantOf","log","indexOf","_filterObjectsBeforeEnteringGroup","filter","index","array","add","_len","Array","_key","allowedObjects","size","_onAfterObjectsChange","LAYOUT_TYPE_ADDED","insertAt","_len2","_key2","remove","removed","LAYOUT_TYPE_REMOVED","_onObjectAdded","fire","_onObjectRemoved","removeParentTransform","exitGroup","_onStackOrderChanged","_set","key","value","prev","forEach","_shouldSetNestedCoords","removeAll","_activeObjects","selected","_ref","activeObjects","push","splice","_watchObject","watch","on","off","group","_enterGroup","applyTransformToObject","multiplyTransformMatrices","invertTransform","calcTransformMatrix","setCoords","canvas","activeObject","getActiveObject","_exitGroup","shouldCache","ownCache","prototype","call","i","willDrawShadow","ownCaching","isOnACache","parent","drawObject","ctx","forClipping","context","_renderBackground","_this$canvas","obj","preserveObjectStacking","save","transform","render","restore","_drawClipPath","clipPath","triggerLayout","LAYOUT_TYPE_IMPERATIVE","_transformDone","__serializeObjects","method","propertiesToInclude","_includeDefaultValues","includeDefaultValues","excludeFromExport","map","originalDefaults","data","toObject","strategy","toString","complexity","dispose","unsubscribeTargets","getObjects","_createSVGBgRect","reviver","backgroundColor","fillStroke","Rect","_toSVG","commons","markup","join","svgString","bg","toSVG","getSvgStyles","opacity","visibility","visible","getSvgFilter","toClipPathSVG","_createBaseClipPathSVGMarkup","fromObject","_ref2","abortable","Promise","all","enlivenObjects","enlivenObjectEnlivables","then","_ref3","hydratedOptions","layoutClass","classRegistry","getClass","strategyClass","subscribeTargets","setClass"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Group.min.mjs","sources":["../../../src/shapes/Group.ts"],"sourcesContent":["import type { CollectionEvents, ObjectEvents } from '../EventTypeDefs';\nimport { createCollectionMixin } from '../Collection';\nimport type {\n TClassProperties,\n TSVGReviver,\n TOptions,\n Abortable,\n} from '../typedefs';\nimport {\n invertTransform,\n multiplyTransformMatrices,\n} from '../util/misc/matrix';\nimport {\n enlivenObjectEnlivables,\n enlivenObjects,\n} from '../util/misc/objectEnlive';\nimport { applyTransformToObject } from '../util/misc/objectTransforms';\nimport { FabricObject } from './Object/FabricObject';\nimport { Rect } from './Rect';\nimport { classRegistry } from '../ClassRegistry';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport { log } from '../util/internals/console';\nimport type {\n ImperativeLayoutOptions,\n LayoutBeforeEvent,\n LayoutAfterEvent,\n} from '../LayoutManager/types';\nimport { LayoutManager } from '../LayoutManager/LayoutManager';\nimport {\n LAYOUT_TYPE_ADDED,\n LAYOUT_TYPE_IMPERATIVE,\n LAYOUT_TYPE_INITIALIZATION,\n LAYOUT_TYPE_REMOVED,\n} from '../LayoutManager/constants';\nimport type { SerializedLayoutManager } from '../LayoutManager/LayoutManager';\nimport type { FitContentLayout } from '../LayoutManager';\nimport type { DrawContext } from './Object/Object';\nimport { escapeXml } from '../util/lang_string';\n\n/**\n * This class handles the specific case of creating a group using {@link Group#fromObject} and is not meant to be used in any other case.\n * We could have used a boolean in the constructor, as we did previously, but we think the boolean\n * would stay in the group's constructor interface and create confusion, therefore it was removed.\n * This layout manager doesn't do anything and therefore keeps the exact layout the group had when {@link Group#toObject} was called.\n */\nclass NoopLayoutManager extends LayoutManager {\n performLayout() {}\n}\n\nexport interface GroupEvents extends ObjectEvents, CollectionEvents {\n 'layout:before': LayoutBeforeEvent;\n 'layout:after': LayoutAfterEvent;\n}\n\nexport interface GroupOwnProps {\n subTargetCheck: boolean;\n interactive: boolean;\n}\n\nexport interface SerializedGroupProps\n extends SerializedObjectProps, GroupOwnProps {\n objects: SerializedObjectProps[];\n layoutManager: SerializedLayoutManager;\n}\n\nexport interface GroupProps extends FabricObjectProps, GroupOwnProps {\n layoutManager: LayoutManager;\n}\n\nexport const groupDefaultValues: Partial<TClassProperties<Group>> = {\n strokeWidth: 0,\n subTargetCheck: false,\n interactive: false,\n};\n\n/**\n * @fires object:added\n * @fires object:removed\n * @fires layout:before\n * @fires layout:after\n */\nexport class Group\n extends createCollectionMixin(\n FabricObject<GroupProps, SerializedGroupProps, GroupEvents>,\n )\n implements GroupProps\n{\n /**\n * Used to optimize performance\n * set to `false` if you don't need contained objects to be targets of events\n * @type boolean\n */\n declare subTargetCheck: boolean;\n\n /**\n * Used to allow targeting of object inside groups.\n * set to true if you want to select an object inside a group.\\\n * **REQUIRES** `subTargetCheck` set to true\n * This will be not removed but slowly replaced with a method setInteractive\n * that will take care of enabling subTargetCheck and necessary object events.\n * There is too much attached to group interactivity to just be evaluated by a\n * boolean in the code\n * @deprecated\n * @type boolean\n */\n declare interactive: boolean;\n\n declare layoutManager: LayoutManager;\n\n /**\n * Used internally to optimize performance\n * Once an object is selected, instance is rendered without the selected object.\n * This way instance is cached only once for the entire interaction with the selected object.\n * @private\n */\n protected _activeObjects: FabricObject[] = [];\n\n static type = 'Group';\n\n static ownDefaults: Record<string, any> = groupDefaultValues;\n private __objectSelectionTracker: (ev: ObjectEvents['selected']) => void;\n private __objectSelectionDisposer: (ev: ObjectEvents['deselected']) => void;\n\n static getDefaults(): Record<string, any> {\n return {\n ...super.getDefaults(),\n ...Group.ownDefaults,\n };\n }\n\n /**\n * Constructor\n *\n * @param {FabricObject[]} [objects] instance objects\n * @param {Object} [options] Options object\n */\n constructor(objects: FabricObject[] = [], options: Partial<GroupProps> = {}) {\n super();\n Object.assign(this, Group.ownDefaults);\n this.setOptions(options);\n this.groupInit(objects, options);\n }\n\n /**\n * Shared code between group and active selection\n * Meant to be used by the constructor.\n */\n protected groupInit(\n objects: FabricObject[],\n options: {\n layoutManager?: LayoutManager;\n top?: number;\n left?: number;\n },\n ) {\n this._objects = [...objects]; // Avoid unwanted mutations of Collection to affect the caller\n\n this.__objectSelectionTracker = this.__objectSelectionMonitor.bind(\n this,\n true,\n );\n this.__objectSelectionDisposer = this.__objectSelectionMonitor.bind(\n this,\n false,\n );\n\n this.forEachObject((object) => {\n this.enterGroup(object, false);\n });\n\n // perform initial layout\n this.layoutManager = options.layoutManager ?? new LayoutManager();\n this.layoutManager.performLayout({\n type: LAYOUT_TYPE_INITIALIZATION,\n target: this,\n targets: [...objects],\n // @TODO remove this concept from the layout manager.\n // Layout manager will calculate the correct position,\n // group options can override it later.\n x: options.left,\n y: options.top,\n });\n }\n\n /**\n * Checks if object can enter group and logs relevant warnings\n * @private\n * @param {FabricObject} object\n * @returns\n */\n canEnterGroup(object: FabricObject) {\n if (object === this || this.isDescendantOf(object)) {\n // prevent circular object tree\n log(\n 'error',\n 'Group: circular object trees are not supported, this call has no effect',\n );\n return false;\n } else if (this._objects.indexOf(object) !== -1) {\n // is already in the objects array\n log(\n 'error',\n 'Group: duplicate objects are not supported inside group, this call has no effect',\n );\n return false;\n }\n return true;\n }\n\n /**\n * Override this method to enhance performance (for groups with a lot of objects).\n * If Overriding, be sure not pass illegal objects to group - it will break your app.\n * @private\n */\n protected _filterObjectsBeforeEnteringGroup(objects: FabricObject[]) {\n return objects.filter((object, index, array) => {\n // can enter AND is the first occurrence of the object in the passed args (to prevent adding duplicates)\n return this.canEnterGroup(object) && array.indexOf(object) === index;\n });\n }\n\n /**\n * Add objects\n * @param {...FabricObject[]} objects\n */\n add(...objects: FabricObject[]) {\n const allowedObjects = this._filterObjectsBeforeEnteringGroup(objects);\n const size = super.add(...allowedObjects);\n this._onAfterObjectsChange(LAYOUT_TYPE_ADDED, allowedObjects);\n return size;\n }\n\n /**\n * Inserts an object into collection at specified index\n * @param {FabricObject[]} objects Object to insert\n * @param {Number} index Index to insert object at\n */\n insertAt(index: number, ...objects: FabricObject[]) {\n const allowedObjects = this._filterObjectsBeforeEnteringGroup(objects);\n const size = super.insertAt(index, ...allowedObjects);\n this._onAfterObjectsChange(LAYOUT_TYPE_ADDED, allowedObjects);\n return size;\n }\n\n /**\n * Remove objects\n * @param {...FabricObject[]} objects\n * @returns {FabricObject[]} removed objects\n */\n remove(...objects: FabricObject[]) {\n const removed = super.remove(...objects);\n this._onAfterObjectsChange(LAYOUT_TYPE_REMOVED, removed);\n return removed;\n }\n\n _onObjectAdded(object: FabricObject) {\n this.enterGroup(object, true);\n this.fire('object:added', { target: object });\n object.fire('added', { target: this });\n }\n\n /**\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it\n */\n _onObjectRemoved(object: FabricObject, removeParentTransform?: boolean) {\n this.exitGroup(object, removeParentTransform);\n this.fire('object:removed', { target: object });\n object.fire('removed', { target: this });\n }\n\n /**\n * @private\n * @param {'added'|'removed'} type\n * @param {FabricObject[]} targets\n */\n _onAfterObjectsChange(type: 'added' | 'removed', targets: FabricObject[]) {\n this.layoutManager.performLayout({\n type,\n targets,\n target: this,\n });\n }\n\n _onStackOrderChanged() {\n this._set('dirty', true);\n }\n\n /**\n * @private\n * @param {string} key\n * @param {*} value\n */\n _set(key: string, value: any) {\n const prev = this[key as keyof this];\n super._set(key, value);\n if (key === 'canvas' && prev !== value) {\n (this._objects || []).forEach((object) => {\n object._set(key, value);\n });\n }\n return this;\n }\n\n /**\n * @private\n */\n _shouldSetNestedCoords() {\n return this.subTargetCheck;\n }\n\n /**\n * Remove all objects\n * @returns {FabricObject[]} removed objects\n */\n removeAll() {\n this._activeObjects = [];\n return this.remove(...this._objects);\n }\n\n /**\n * keeps track of the selected objects\n * @private\n */\n __objectSelectionMonitor<T extends boolean>(\n selected: T,\n {\n target: object,\n }: ObjectEvents[T extends true ? 'selected' : 'deselected'],\n ) {\n const activeObjects = this._activeObjects;\n if (selected) {\n activeObjects.push(object);\n this._set('dirty', true);\n } else if (activeObjects.length > 0) {\n const index = activeObjects.indexOf(object);\n if (index > -1) {\n activeObjects.splice(index, 1);\n this._set('dirty', true);\n }\n }\n }\n\n /**\n * @private\n * @param {boolean} watch\n * @param {FabricObject} object\n */\n _watchObject(watch: boolean, object: FabricObject) {\n // make sure we listen only once\n watch && this._watchObject(false, object);\n if (watch) {\n object.on('selected', this.__objectSelectionTracker);\n object.on('deselected', this.__objectSelectionDisposer);\n } else {\n object.off('selected', this.__objectSelectionTracker);\n object.off('deselected', this.__objectSelectionDisposer);\n }\n }\n\n /**\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object is in canvas coordinate plane\n */\n enterGroup(object: FabricObject, removeParentTransform?: boolean) {\n object.group && object.group.remove(object);\n object._set('parent', this);\n this._enterGroup(object, removeParentTransform);\n }\n\n /**\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object is in canvas coordinate plane\n */\n _enterGroup(object: FabricObject, removeParentTransform?: boolean) {\n if (removeParentTransform) {\n // can this be converted to utils (sendObjectToPlane)?\n applyTransformToObject(\n object,\n multiplyTransformMatrices(\n invertTransform(this.calcTransformMatrix()),\n object.calcTransformMatrix(),\n ),\n );\n }\n this._shouldSetNestedCoords() && object.setCoords();\n object._set('group', this);\n object._set('canvas', this.canvas);\n this._watchObject(true, object);\n const activeObject =\n this.canvas &&\n this.canvas.getActiveObject &&\n this.canvas.getActiveObject();\n // if we are adding the activeObject in a group\n if (\n activeObject &&\n (activeObject === object || object.isDescendantOf(activeObject))\n ) {\n this._activeObjects.push(object);\n }\n }\n\n /**\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it\n */\n exitGroup(object: FabricObject, removeParentTransform?: boolean) {\n this._exitGroup(object, removeParentTransform);\n object._set('parent', undefined);\n object._set('canvas', undefined);\n }\n\n /**\n * Executes the inner fabric logic of exiting a group.\n * - Stop watching the object\n * - Remove the object from the optimization map this._activeObjects\n * - unset the group property of the object\n * @protected\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it\n */\n _exitGroup(object: FabricObject, removeParentTransform?: boolean) {\n object._set('group', undefined);\n if (!removeParentTransform) {\n applyTransformToObject(\n object,\n multiplyTransformMatrices(\n this.calcTransformMatrix(),\n object.calcTransformMatrix(),\n ),\n );\n object.setCoords();\n }\n this._watchObject(false, object);\n const index =\n this._activeObjects.length > 0 ? this._activeObjects.indexOf(object) : -1;\n if (index > -1) {\n this._activeObjects.splice(index, 1);\n }\n }\n\n /**\n * Decide if the group should cache or not. Create its own cache level\n * needsItsOwnCache should be used when the object drawing method requires\n * a cache step.\n * Generally you do not cache objects in groups because the group is already cached.\n * @return {Boolean}\n */\n shouldCache() {\n const ownCache = FabricObject.prototype.shouldCache.call(this);\n if (ownCache) {\n for (let i = 0; i < this._objects.length; i++) {\n if (this._objects[i].willDrawShadow()) {\n this.ownCaching = false;\n return false;\n }\n }\n }\n return ownCache;\n }\n\n /**\n * Check if this object or a child object will cast a shadow\n * @return {Boolean}\n */\n willDrawShadow() {\n if (super.willDrawShadow()) {\n return true;\n }\n for (let i = 0; i < this._objects.length; i++) {\n if (this._objects[i].willDrawShadow()) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Check if instance or its group are caching, recursively up\n * @return {Boolean}\n */\n isOnACache(): boolean {\n return this.ownCaching || (!!this.parent && this.parent.isOnACache());\n }\n\n /**\n * Execute the drawing operation for an object on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawObject(\n ctx: CanvasRenderingContext2D,\n forClipping: boolean | undefined,\n context: DrawContext,\n ) {\n this._renderBackground(ctx);\n for (let i = 0; i < this._objects.length; i++) {\n const obj = this._objects[i];\n // TODO: handle rendering edge case somehow\n if (this.canvas?.preserveObjectStacking && obj.group !== this) {\n ctx.save();\n ctx.transform(...invertTransform(this.calcTransformMatrix()));\n obj.render(ctx);\n ctx.restore();\n } else if (obj.group === this) {\n obj.render(ctx);\n }\n }\n this._drawClipPath(ctx, this.clipPath, context);\n }\n\n /**\n * @override\n * @return {Boolean}\n */\n setCoords() {\n super.setCoords();\n this._shouldSetNestedCoords() &&\n this.forEachObject((object) => object.setCoords());\n }\n\n triggerLayout(options: ImperativeLayoutOptions = {}) {\n this.layoutManager.performLayout({\n target: this,\n type: LAYOUT_TYPE_IMPERATIVE,\n ...options,\n });\n }\n\n /**\n * Renders instance on a given context\n * @param {CanvasRenderingContext2D} ctx context to render instance on\n */\n render(ctx: CanvasRenderingContext2D) {\n this._transformDone = true;\n super.render(ctx);\n this._transformDone = false;\n }\n\n /**\n *\n * @private\n * @param {'toObject'|'toDatalessObject'} [method]\n * @param {string[]} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @returns {FabricObject[]} serialized objects\n */\n __serializeObjects(\n method: 'toObject' | 'toDatalessObject',\n propertiesToInclude?: string[],\n ) {\n const _includeDefaultValues = this.includeDefaultValues;\n return this._objects\n .filter(function (obj) {\n return !obj.excludeFromExport;\n })\n .map(function (obj) {\n const originalDefaults = obj.includeDefaultValues;\n obj.includeDefaultValues = _includeDefaultValues;\n const data = obj[method || 'toObject'](propertiesToInclude);\n obj.includeDefaultValues = originalDefaults;\n // delete data.version;\n return data;\n });\n }\n\n /**\n * Returns object representation of an instance\n * @param {string[]} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit<\n GroupProps & TClassProperties<this>,\n keyof SerializedGroupProps\n >,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick<T, K> & SerializedGroupProps {\n const layoutManager = this.layoutManager.toObject();\n\n return {\n ...super.toObject([\n 'subTargetCheck',\n 'interactive',\n ...propertiesToInclude,\n ]),\n ...(layoutManager.strategy !== 'fit-content' || this.includeDefaultValues\n ? { layoutManager }\n : {}),\n objects: this.__serializeObjects(\n 'toObject',\n propertiesToInclude as string[],\n ),\n };\n }\n\n toString() {\n return `#<Group: (${this.complexity()})>`;\n }\n\n dispose() {\n this.layoutManager.unsubscribeTargets({\n targets: this.getObjects(),\n target: this,\n });\n this._activeObjects = [];\n this.forEachObject((object) => {\n this._watchObject(false, object);\n object.dispose();\n });\n super.dispose();\n }\n\n /**\n * @private\n */\n _createSVGBgRect(reviver?: TSVGReviver) {\n if (!this.backgroundColor) {\n return '';\n }\n const fillStroke = Rect.prototype._toSVG.call(this);\n const commons = fillStroke.indexOf('COMMON_PARTS');\n fillStroke[commons] = 'for=\"group\" ';\n const markup = fillStroke.join('');\n return reviver ? reviver(markup) : markup;\n }\n\n /**\n * Returns svg representation of an instance\n * @param {TSVGReviver} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n _toSVG(reviver?: TSVGReviver) {\n const svgString = ['<g ', 'COMMON_PARTS', ' >\\n'];\n const bg = this._createSVGBgRect(reviver);\n bg && svgString.push('\\t\\t', bg);\n for (let i = 0; i < this._objects.length; i++) {\n svgString.push('\\t\\t', this._objects[i].toSVG(reviver));\n }\n svgString.push('</g>\\n');\n return svgString;\n }\n\n /**\n * Returns styles-string for svg-export, specific version for group\n * @return {String}\n */\n getSvgStyles(): string {\n const opacity =\n typeof this.opacity !== 'undefined' && this.opacity !== 1\n ? `opacity: ${escapeXml(this.opacity)};`\n : '',\n visibility = this.visible ? '' : ' visibility: hidden;';\n return [opacity, this.getSvgFilter(), visibility].join('');\n }\n\n /**\n * Returns svg clipPath representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toClipPathSVG(reviver?: TSVGReviver): string {\n const svgString = [];\n const bg = this._createSVGBgRect(reviver);\n bg && svgString.push('\\t', bg);\n for (let i = 0; i < this._objects.length; i++) {\n svgString.push('\\t', this._objects[i].toClipPathSVG(reviver));\n }\n return this._createBaseClipPathSVGMarkup(svgString, {\n reviver,\n });\n }\n\n /**\n * @todo support loading from svg\n * @private\n * @param {Object} object Object to create a group from\n * @returns {Promise<Group>}\n */\n static fromObject<T extends TOptions<SerializedGroupProps>>(\n { type, objects = [], layoutManager, ...options }: T,\n abortable?: Abortable,\n ) {\n return Promise.all([\n enlivenObjects<FabricObject>(objects, abortable),\n enlivenObjectEnlivables(options, abortable),\n ]).then(([objects, hydratedOptions]) => {\n const group = new this(objects, {\n ...options,\n ...hydratedOptions,\n layoutManager: new NoopLayoutManager(),\n });\n if (layoutManager) {\n const layoutClass = classRegistry.getClass<typeof LayoutManager>(\n layoutManager.type,\n );\n const strategyClass = classRegistry.getClass<typeof FitContentLayout>(\n layoutManager.strategy,\n );\n group.layoutManager = new layoutClass(new strategyClass());\n } else {\n group.layoutManager = new LayoutManager();\n }\n group.layoutManager.subscribeTargets({\n type: LAYOUT_TYPE_INITIALIZATION,\n target: group,\n targets: group.getObjects(),\n });\n group.setCoords();\n return group;\n });\n }\n}\n\nclassRegistry.setClass(Group);\n"],"names":["NoopLayoutManager","LayoutManager","performLayout","groupDefaultValues","strokeWidth","subTargetCheck","interactive","Group","createCollectionMixin","FabricObject","getDefaults","super","ownDefaults","constructor","objects","arguments","length","undefined","options","_defineProperty","this","Object","assign","setOptions","groupInit","_options$layoutManage","_objects","__objectSelectionTracker","__objectSelectionMonitor","bind","__objectSelectionDisposer","forEachObject","object","enterGroup","layoutManager","type","LAYOUT_TYPE_INITIALIZATION","target","targets","x","left","y","top","canEnterGroup","isDescendantOf","log","indexOf","_filterObjectsBeforeEnteringGroup","filter","index","array","add","_len","Array","_key","allowedObjects","size","_onAfterObjectsChange","LAYOUT_TYPE_ADDED","insertAt","_len2","_key2","remove","removed","LAYOUT_TYPE_REMOVED","_onObjectAdded","fire","_onObjectRemoved","removeParentTransform","exitGroup","_onStackOrderChanged","_set","key","value","prev","forEach","_shouldSetNestedCoords","removeAll","_activeObjects","selected","_ref","activeObjects","push","splice","_watchObject","watch","on","off","group","_enterGroup","applyTransformToObject","multiplyTransformMatrices","invertTransform","calcTransformMatrix","setCoords","canvas","activeObject","getActiveObject","_exitGroup","shouldCache","ownCache","prototype","call","i","willDrawShadow","ownCaching","isOnACache","parent","drawObject","ctx","forClipping","context","_renderBackground","_this$canvas","obj","preserveObjectStacking","save","transform","render","restore","_drawClipPath","clipPath","triggerLayout","LAYOUT_TYPE_IMPERATIVE","_transformDone","__serializeObjects","method","propertiesToInclude","_includeDefaultValues","includeDefaultValues","excludeFromExport","map","originalDefaults","data","toObject","strategy","toString","complexity","dispose","unsubscribeTargets","getObjects","_createSVGBgRect","reviver","backgroundColor","fillStroke","Rect","_toSVG","commons","markup","join","svgString","bg","toSVG","getSvgStyles","opacity","escapeXml","visibility","visible","getSvgFilter","toClipPathSVG","_createBaseClipPathSVGMarkup","fromObject","_ref2","abortable","Promise","all","enlivenObjects","enlivenObjectEnlivables","then","_ref3","hydratedOptions","layoutClass","classRegistry","getClass","strategyClass","subscribeTargets","setClass"],"mappings":"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"}
|
|
@@ -9,6 +9,7 @@ import { classRegistry } from '../ClassRegistry.mjs';
|
|
|
9
9
|
import { log } from '../util/internals/console.mjs';
|
|
10
10
|
import { LayoutManager } from '../LayoutManager/LayoutManager.mjs';
|
|
11
11
|
import { LAYOUT_TYPE_INITIALIZATION, LAYOUT_TYPE_ADDED, LAYOUT_TYPE_REMOVED, LAYOUT_TYPE_IMPERATIVE } from '../LayoutManager/constants.mjs';
|
|
12
|
+
import { escapeXml } from '../util/lang_string.mjs';
|
|
12
13
|
|
|
13
14
|
/**
|
|
14
15
|
* This class handles the specific case of creating a group using {@link Group#fromObject} and is not meant to be used in any other case.
|
|
@@ -534,7 +535,7 @@ class Group extends createCollectionMixin(FabricObject) {
|
|
|
534
535
|
* @return {String}
|
|
535
536
|
*/
|
|
536
537
|
getSvgStyles() {
|
|
537
|
-
const opacity = typeof this.opacity !== 'undefined' && this.opacity !== 1 ? `opacity: ${this.opacity};` : '',
|
|
538
|
+
const opacity = typeof this.opacity !== 'undefined' && this.opacity !== 1 ? `opacity: ${escapeXml(this.opacity)};` : '',
|
|
538
539
|
visibility = this.visible ? '' : ' visibility: hidden;';
|
|
539
540
|
return [opacity, this.getSvgFilter(), visibility].join('');
|
|
540
541
|
}
|