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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectableCanvas.mjs","sources":["../../../src/canvas/SelectableCanvas.ts"],"sourcesContent":["import { dragHandler } from '../controls/drag';\nimport { getActionFromCorner } from '../controls/util';\nimport { Point } from '../Point';\nimport { FabricObject } from '../shapes/Object/FabricObject';\nimport type {\n CanvasEvents,\n ModifierKey,\n TOptionalModifierKey,\n TPointerEvent,\n Transform,\n} from '../EventTypeDefs';\nimport {\n addTransformToObject,\n saveObjectTransform,\n} from '../util/misc/objectTransforms';\nimport type { TCanvasSizeOptions } from './StaticCanvas';\nimport { StaticCanvas } from './StaticCanvas';\nimport { isCollection } from '../Collection';\nimport { isTransparent } from '../util/misc/isTransparent';\nimport type {\n TMat2D,\n TOriginX,\n TOriginY,\n TSize,\n TSVGReviver,\n} from '../typedefs';\nimport { degreesToRadians } from '../util/misc/radiansDegreesConversion';\nimport { getPointer, isTouchEvent } from '../util/dom_event';\nimport type { IText } from '../shapes/IText/IText';\nimport type { BaseBrush } from '../brushes/BaseBrush';\nimport { pick } from '../util/misc/pick';\nimport { sendPointToPlane } from '../util/misc/planeChange';\nimport { cos, createCanvasElement, sin } from '../util';\nimport { CanvasDOMManager } from './DOMManagers/CanvasDOMManager';\nimport {\n BOTTOM,\n CENTER,\n LEFT,\n MODIFIED,\n RESIZING,\n RIGHT,\n ROTATE,\n SCALE,\n SCALE_X,\n SCALE_Y,\n SKEW_X,\n SKEW_Y,\n TOP,\n} from '../constants';\nimport type { CanvasOptions } from './CanvasOptions';\nimport { canvasDefaults } from './CanvasOptions';\nimport { Intersection } from '../Intersection';\nimport { isActiveSelection } from '../util/typeAssertions';\n\nexport type TargetsInfo = {\n target?: FabricObject;\n subTargets: FabricObject[];\n};\n\nexport type TargetsInfoWithContainer = {\n // the target we think is the most continuing the selection action.\n // could be hoveredTarget or the currently selected object\n target?: FabricObject;\n // the nested targets under the pointer for container\n subTargets: FabricObject[];\n // the container for target, or target itself if there are no selectable nested targets\n container?: FabricObject;\n};\n\nexport type FullTargetsInfoWithContainer = TargetsInfoWithContainer & {\n // hoveredTarget\n currentTarget?: FabricObject;\n // the container for hoveredTarget, or container itself\n currentContainer?: FabricObject;\n // nested targets of current container\n currentSubTargets: FabricObject[];\n};\n\n/**\n * Canvas class\n * @class Canvas\n * @extends StaticCanvas\n * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-1#canvas}\n *\n * @fires object:modified at the end of a transform\n * @fires object:rotating while an object is being rotated from the control\n * @fires object:scaling while an object is being scaled by controls\n * @fires object:moving while an object is being dragged\n * @fires object:skewing while an object is being skewed from the controls\n *\n * @fires before:transform before a transform is is started\n * @fires before:selection:cleared\n * @fires selection:cleared\n * @fires selection:updated\n * @fires selection:created\n *\n * @fires path:created after a drawing operation ends and the path is added\n * @fires mouse:down\n * @fires mouse:move\n * @fires mouse:up\n * @fires mouse:down:before on mouse down, before the inner fabric logic runs\n * @fires mouse:move:before on mouse move, before the inner fabric logic runs\n * @fires mouse:up:before on mouse up, before the inner fabric logic runs\n * @fires mouse:over\n * @fires mouse:out\n * @fires mouse:dblclick whenever a native dbl click event fires on the canvas.\n *\n * @fires dragover\n * @fires dragenter\n * @fires dragleave\n * @fires drag:enter object drag enter\n * @fires drag:leave object drag leave\n * @fires drop:before before drop event. Prepare for the drop event (same native event).\n * @fires drop\n * @fires drop:after after drop event. Run logic on canvas after event has been accepted/declined (same native event).\n * @example\n * let a: fabric.Object, b: fabric.Object;\n * let flag = false;\n * canvas.add(a, b);\n * a.on('drop:before', opt => {\n * // we want a to accept the drop even though it's below b in the stack\n * flag = this.canDrop(opt.e);\n * });\n * b.canDrop = function(e) {\n * !flag && this.draggableTextDelegate.canDrop(e);\n * }\n * b.on('dragover', opt => b.set('fill', opt.dropTarget === b ? 'pink' : 'black'));\n * a.on('drop', opt => {\n * opt.e.defaultPrevented // drop occurred\n * opt.didDrop // drop occurred on canvas\n * opt.target // drop target\n * opt.target !== a && a.set('text', 'I lost');\n * });\n * canvas.on('drop:after', opt => {\n * // inform user who won\n * if(!opt.e.defaultPrevented) {\n * // no winners\n * }\n * else if(!opt.didDrop) {\n * // my objects didn't win, some other lucky object\n * }\n * else {\n * // we have a winner it's opt.target!!\n * }\n * })\n *\n * @fires after:render at the end of the render process, receives the context in the callback\n * @fires before:render at start the render process, receives the context in the callback\n *\n * @fires contextmenu:before\n * @fires contextmenu\n * @example\n * let handler;\n * targets.forEach(target => {\n * target.on('contextmenu:before', opt => {\n * // decide which target should handle the event before canvas hijacks it\n * if (someCaseHappens && opt.targets.includes(target)) {\n * handler = target;\n * }\n * });\n * target.on('contextmenu', opt => {\n * // do something fantastic\n * });\n * });\n * canvas.on('contextmenu', opt => {\n * if (!handler) {\n * // no one takes responsibility, it's always left to me\n * // let's show them how it's done!\n * }\n * });\n *\n */\nexport class SelectableCanvas<EventSpec extends CanvasEvents = CanvasEvents>\n extends StaticCanvas<EventSpec>\n implements Omit<CanvasOptions, 'enablePointerEvents'>\n{\n declare _objects: FabricObject[];\n\n // transform config\n declare uniformScaling: boolean;\n declare uniScaleKey: TOptionalModifierKey;\n declare centeredScaling: boolean;\n declare centeredRotation: boolean;\n declare centeredKey: TOptionalModifierKey;\n declare altActionKey: TOptionalModifierKey;\n\n // selection config\n declare selection: boolean;\n declare selectionKey: TOptionalModifierKey | ModifierKey[];\n declare altSelectionKey: TOptionalModifierKey;\n declare selectionColor: string;\n declare selectionDashArray: number[];\n declare selectionBorderColor: string;\n declare selectionLineWidth: number;\n declare selectionFullyContained: boolean;\n\n // cursors\n declare hoverCursor: CSSStyleDeclaration['cursor'];\n declare moveCursor: CSSStyleDeclaration['cursor'];\n declare defaultCursor: CSSStyleDeclaration['cursor'];\n declare freeDrawingCursor: CSSStyleDeclaration['cursor'];\n declare notAllowedCursor: CSSStyleDeclaration['cursor'];\n\n declare containerClass: string;\n\n // target find config\n declare perPixelTargetFind: boolean;\n declare targetFindTolerance: number;\n declare skipTargetFind: boolean;\n\n /**\n * When true, mouse events on canvas (mousedown/mousemove/mouseup) result in free drawing.\n * After mousedown, mousemove creates a shape,\n * and then mouseup finalizes it and adds an instance of `fabric.Path` onto canvas.\n * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-4#free_drawing}\n * @type Boolean\n */\n declare isDrawingMode: boolean;\n\n declare preserveObjectStacking: boolean;\n\n // event config\n declare stopContextMenu: boolean;\n declare fireRightClick: boolean;\n declare fireMiddleClick: boolean;\n\n /**\n * Keep track of the hovered target in the previous event\n * @type FabricObject | null\n * @private\n */\n declare _hoveredTarget?: FabricObject;\n\n /**\n * hold the list of nested targets hovered in the previous events\n * @type FabricObject[]\n * @private\n */\n _hoveredTargets: FabricObject[] = [];\n\n /**\n * hold the list of objects to render\n * @type FabricObject[]\n * @private\n */\n declare _objectsToRender?: FabricObject[];\n\n /**\n * hold a reference to a data structure that contains information\n * on the current on going transform\n * @type\n * @private\n */\n _currentTransform: Transform | null = null;\n\n /**\n * hold a reference to a data structure used to track the selection\n * box on canvas drag\n * on the current on going transform\n * x, y, deltaX and deltaY are in scene plane\n * @type\n * @private\n */\n protected _groupSelector: {\n x: number;\n y: number;\n deltaX: number;\n deltaY: number;\n } | null = null;\n\n /**\n * internal flag used to understand if the context top requires a cleanup\n * in case this is true, the contextTop will be cleared at the next render\n * @type boolean\n * @private\n */\n contextTopDirty = false;\n\n /**\n * During a mouse event we may need the pointer multiple times in multiple functions.\n * _scenePoint holds a reference to the pointer in fabricCanvas/design coordinates that is valid for the event\n * lifespan. Every fabricJS mouse event create and delete the cache every time\n * We do this because there are some HTML DOM inspection functions to get the actual pointer coordinates\n * @type {Point}\n */\n declare protected _scenePoint?: Point;\n\n /**\n * During a mouse event we may need the pointer multiple times in multiple functions.\n * _viewportPoint holds a reference to the pointer in html coordinates that is valid for the event\n * lifespan. Every fabricJS mouse event create and delete the cache every time\n * We do this because there are some HTML DOM inspection functions to get the actual pointer coordinates\n * @type {Point}\n */\n declare protected _viewportPoint?: Point;\n\n /**\n * Holds the informations we cache during an event lifespan\n * This data is needed many times during an event and we want to avoid to recalculate it\n * multuple times.\n */\n declare protected _targetInfo: FullTargetsInfoWithContainer | undefined;\n\n static ownDefaults = canvasDefaults;\n\n static getDefaults(): Record<string, any> {\n return { ...super.getDefaults(), ...SelectableCanvas.ownDefaults };\n }\n\n declare elements: CanvasDOMManager;\n get upperCanvasEl() {\n return this.elements.upper?.el;\n }\n get contextTop() {\n return this.elements.upper?.ctx;\n }\n get wrapperEl() {\n return this.elements.container;\n }\n declare private pixelFindCanvasEl: HTMLCanvasElement;\n declare private pixelFindContext: CanvasRenderingContext2D;\n\n declare protected _isCurrentlyDrawing: boolean;\n declare freeDrawingBrush?: BaseBrush;\n declare _activeObject?: FabricObject;\n\n protected initElements(el?: string | HTMLCanvasElement) {\n this.elements = new CanvasDOMManager(el, {\n allowTouchScrolling: this.allowTouchScrolling,\n containerClass: this.containerClass,\n });\n this._createCacheCanvas();\n }\n\n /**\n * @private\n * @param {FabricObject} obj Object that was added\n */\n _onObjectAdded(obj: FabricObject) {\n this._objectsToRender = undefined;\n super._onObjectAdded(obj);\n }\n\n /**\n * @private\n * @param {FabricObject} obj Object that was removed\n */\n _onObjectRemoved(obj: FabricObject) {\n this._objectsToRender = undefined;\n // removing active object should fire \"selection:cleared\" events\n if (obj === this._activeObject) {\n this.fire('before:selection:cleared', { deselected: [obj] });\n this._discardActiveObject();\n this.fire('selection:cleared', { deselected: [obj] });\n obj.fire('deselected', {\n target: obj,\n });\n }\n if (obj === this._hoveredTarget) {\n this._hoveredTarget = undefined;\n this._hoveredTargets = [];\n }\n super._onObjectRemoved(obj);\n }\n\n _onStackOrderChanged() {\n this._objectsToRender = undefined;\n super._onStackOrderChanged();\n }\n\n /**\n * Divides objects in two groups, one to render immediately\n * and one to render as activeGroup.\n * @return {Array} objects to render immediately and pushes the other in the activeGroup.\n */\n _chooseObjectsToRender(): FabricObject[] {\n const activeObject = this._activeObject;\n return !this.preserveObjectStacking && activeObject\n ? this._objects\n .filter((object) => !object.group && object !== activeObject)\n .concat(activeObject)\n : this._objects;\n }\n\n /**\n * Renders both the top canvas and the secondary container canvas.\n */\n renderAll() {\n this.cancelRequestedRender();\n if (this.destroyed) {\n return;\n }\n if (this.contextTopDirty && !this._groupSelector && !this.isDrawingMode) {\n this.clearContext(this.contextTop);\n this.contextTopDirty = false;\n }\n if (this.hasLostContext) {\n this.renderTopLayer(this.contextTop);\n this.hasLostContext = false;\n }\n !this._objectsToRender &&\n (this._objectsToRender = this._chooseObjectsToRender());\n this.renderCanvas(this.getContext(), this._objectsToRender);\n }\n\n /**\n * text selection is rendered by the active text instance during the rendering cycle\n */\n renderTopLayer(ctx: CanvasRenderingContext2D): void {\n ctx.save();\n if (this.isDrawingMode && this._isCurrentlyDrawing) {\n this.freeDrawingBrush && this.freeDrawingBrush._render();\n this.contextTopDirty = true;\n }\n // we render the top context - last object\n if (this.selection && this._groupSelector) {\n this._drawSelection(ctx);\n this.contextTopDirty = true;\n }\n ctx.restore();\n }\n\n /**\n * Method to render only the top canvas.\n * Also used to render the group selection box.\n * Does not render text selection.\n */\n renderTop() {\n const ctx = this.contextTop;\n this.clearContext(ctx);\n this.renderTopLayer(ctx);\n // todo: how do i know if the after:render is for the top or normal contex?\n this.fire('after:render', { ctx });\n }\n\n /**\n * Set the canvas tolerance value for pixel taret find.\n * Use only integer numbers.\n * @private\n */\n setTargetFindTolerance(value: number) {\n value = Math.round(value);\n this.targetFindTolerance = value;\n const retina = this.getRetinaScaling();\n const size = Math.ceil((value * 2 + 1) * retina);\n this.pixelFindCanvasEl.width = this.pixelFindCanvasEl.height = size;\n this.pixelFindContext.scale(retina, retina);\n }\n\n /**\n * Returns true if object is transparent at a certain location\n * Clarification: this is `is target transparent at location X or are controls there`\n * @TODO this seems dumb that we treat controls with transparency. we can find controls\n * programmatically without painting them, the cache canvas optimization is always valid\n * @param {FabricObject} target Object to check\n * @param {Number} x Left coordinate in viewport space\n * @param {Number} y Top coordinate in viewport space\n * @return {Boolean}\n */\n isTargetTransparent(target: FabricObject, x: number, y: number): boolean {\n const tolerance = this.targetFindTolerance;\n const ctx = this.pixelFindContext;\n this.clearContext(ctx);\n ctx.save();\n ctx.translate(-x + tolerance, -y + tolerance);\n ctx.transform(...this.viewportTransform);\n const selectionBgc = target.selectionBackgroundColor;\n target.selectionBackgroundColor = '';\n target.render(ctx);\n target.selectionBackgroundColor = selectionBgc;\n ctx.restore();\n // our canvas is square, and made around tolerance.\n // so tolerance in this case also represent the center of the canvas.\n const enhancedTolerance = Math.round(tolerance * this.getRetinaScaling());\n return isTransparent(\n ctx,\n enhancedTolerance,\n enhancedTolerance,\n enhancedTolerance,\n );\n }\n\n /**\n * takes an event and determines if selection key has been pressed\n * @private\n * @param {TPointerEvent} e Event object\n */\n _isSelectionKeyPressed(e: TPointerEvent): boolean {\n const sKey = this.selectionKey;\n if (!sKey) {\n return false;\n }\n if (Array.isArray(sKey)) {\n return !!sKey.find((key) => !!key && e[key] === true);\n } else {\n return e[sKey];\n }\n }\n\n /**\n * @private\n * @param {TPointerEvent} e Event object\n * @param {FabricObject} target\n */\n _shouldClearSelection(\n e: TPointerEvent,\n target?: FabricObject,\n ): target is undefined {\n const activeObjects = this.getActiveObjects(),\n activeObject = this._activeObject;\n\n return !!(\n !target ||\n (target &&\n activeObject &&\n activeObjects.length > 1 &&\n activeObjects.indexOf(target) === -1 &&\n activeObject !== target &&\n !this._isSelectionKeyPressed(e)) ||\n (target && !target.evented) ||\n (target && !target.selectable && activeObject && activeObject !== target)\n );\n }\n\n /**\n * This method will take in consideration a modifier key pressed and the control we are\n * about to drag, and try to guess the anchor point ( origin ) of the transormation.\n * This should be really in the realm of controls, and we should remove specific code for legacy\n * embedded actions.\n * @TODO this probably deserve discussion/rediscovery and change/refactor\n * @private\n * @deprecated\n * @param {FabricObject} target\n * @param {string} action\n * @param {boolean} altKey\n * @returns {boolean} true if the transformation should be centered\n */\n private _shouldCenterTransform(\n target: FabricObject,\n action: string,\n modifierKeyPressed: boolean,\n ) {\n if (!target) {\n return;\n }\n\n let centerTransform;\n\n if (\n action === SCALE ||\n action === SCALE_X ||\n action === SCALE_Y ||\n action === RESIZING\n ) {\n centerTransform = this.centeredScaling || target.centeredScaling;\n } else if (action === ROTATE) {\n centerTransform = this.centeredRotation || target.centeredRotation;\n }\n\n return centerTransform ? !modifierKeyPressed : modifierKeyPressed;\n }\n\n /**\n * Given the control clicked, determine the origin of the transform.\n * This is bad because controls can totally have custom names\n * should disappear before release 4.0\n * @private\n * @deprecated\n */\n _getOriginFromCorner(\n target: FabricObject,\n controlName: string,\n ): { x: TOriginX; y: TOriginY } {\n const origin = {\n x: target.originX,\n y: target.originY,\n };\n\n if (!controlName) {\n return origin;\n }\n\n // is a left control ?\n if (['ml', 'tl', 'bl'].includes(controlName)) {\n origin.x = RIGHT;\n // is a right control ?\n } else if (['mr', 'tr', 'br'].includes(controlName)) {\n origin.x = LEFT;\n }\n // is a top control ?\n if (['tl', 'mt', 'tr'].includes(controlName)) {\n origin.y = BOTTOM;\n // is a bottom control ?\n } else if (['bl', 'mb', 'br'].includes(controlName)) {\n origin.y = TOP;\n }\n return origin;\n }\n\n /**\n * @private\n * @param {Event} e Event object\n * @param {FabricObject} target\n * @param {boolean} [alreadySelected] pass true to setup the active control\n */\n _setupCurrentTransform(\n e: TPointerEvent,\n target: FabricObject,\n alreadySelected: boolean,\n ): void {\n const pointer = target.group\n ? // transform pointer to target's containing coordinate plane\n sendPointToPlane(\n this.getScenePoint(e),\n undefined,\n target.group.calcTransformMatrix(),\n )\n : this.getScenePoint(e);\n const { key: corner = '', control } = target.getActiveControl() || {},\n actionHandler =\n alreadySelected && control\n ? control.getActionHandler(e, target, control)?.bind(control)\n : dragHandler,\n action = getActionFromCorner(alreadySelected, corner, e, target),\n altKey = e[this.centeredKey as ModifierKey],\n origin = this._shouldCenterTransform(target, action, altKey)\n ? ({ x: CENTER, y: CENTER } as const)\n : this._getOriginFromCorner(target, corner),\n /**\n * relative to target's containing coordinate plane\n * both agree on every point\n **/\n transform: Transform = {\n target: target,\n action,\n actionHandler,\n actionPerformed: false,\n corner,\n scaleX: target.scaleX,\n scaleY: target.scaleY,\n skewX: target.skewX,\n skewY: target.skewY,\n offsetX: pointer.x - target.left,\n offsetY: pointer.y - target.top,\n originX: origin.x,\n originY: origin.y,\n ex: pointer.x,\n ey: pointer.y,\n lastX: pointer.x,\n lastY: pointer.y,\n theta: degreesToRadians(target.angle),\n width: target.width,\n height: target.height,\n shiftKey: e.shiftKey,\n altKey,\n original: {\n ...saveObjectTransform(target),\n originX: origin.x,\n originY: origin.y,\n },\n };\n\n this._currentTransform = transform;\n\n this.fire('before:transform', {\n e,\n transform,\n });\n }\n\n /**\n * Set the cursor type of the canvas element\n * @param {String} value Cursor type of the canvas element.\n * @see http://www.w3.org/TR/css3-ui/#cursor\n */\n setCursor(value: CSSStyleDeclaration['cursor']): void {\n this.upperCanvasEl.style.cursor = value;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx to draw the selection on\n */\n _drawSelection(ctx: CanvasRenderingContext2D): void {\n const { x, y, deltaX, deltaY } = this._groupSelector!,\n start = new Point(x, y).transform(this.viewportTransform),\n extent = new Point(x + deltaX, y + deltaY).transform(\n this.viewportTransform,\n ),\n strokeOffset = this.selectionLineWidth / 2;\n let minX = Math.min(start.x, extent.x),\n minY = Math.min(start.y, extent.y),\n maxX = Math.max(start.x, extent.x),\n maxY = Math.max(start.y, extent.y);\n\n if (this.selectionColor) {\n ctx.fillStyle = this.selectionColor;\n ctx.fillRect(minX, minY, maxX - minX, maxY - minY);\n }\n\n if (!this.selectionLineWidth || !this.selectionBorderColor) {\n return;\n }\n ctx.lineWidth = this.selectionLineWidth;\n ctx.strokeStyle = this.selectionBorderColor;\n\n minX += strokeOffset;\n minY += strokeOffset;\n maxX -= strokeOffset;\n maxY -= strokeOffset;\n // selection border\n // @TODO: is _setLineDash still necessary on modern canvas?\n FabricObject.prototype._setLineDash.call(\n this,\n ctx,\n this.selectionDashArray,\n );\n ctx.strokeRect(minX, minY, maxX - minX, maxY - minY);\n }\n\n /**\n * This function is in charge of deciding which is the object that is the current target of an interaction event.\n * For interaction event we mean a pointer related action on the canvas.\n * Which is the\n * 11/09/2018 TODO: would be cool if findTarget could discern between being a full target\n * or the outside part of the corner.\n * @param {Event} e mouse event\n * @return {TargetsInfoWithContainer} the target found\n */\n findTarget(e: TPointerEvent): FullTargetsInfoWithContainer {\n // this._targetInfo is cached by _cacheTransformEventData\n // and destroyed by _resetTransformEventData\n if (this._targetInfo) {\n return this._targetInfo;\n }\n\n if (this.skipTargetFind) {\n return {\n subTargets: [],\n currentSubTargets: [],\n };\n }\n\n const pointer = this.getScenePoint(e),\n activeObject = this._activeObject,\n aObjects = this.getActiveObjects(),\n targetInfo = this.searchPossibleTargets(this._objects, pointer);\n\n const {\n subTargets: currentSubTargets,\n container: currentContainer,\n target: currentTarget,\n } = targetInfo;\n\n const fullTargetInfo: FullTargetsInfoWithContainer = {\n ...targetInfo,\n currentSubTargets,\n currentContainer,\n currentTarget,\n };\n\n // simplest case no active object, return a new target\n if (!activeObject) {\n return fullTargetInfo;\n }\n\n // check pointer is over active selection and possibly perform `subTargetCheck`\n const activeObjectTargetInfo: FullTargetsInfoWithContainer = {\n ...this.searchPossibleTargets([activeObject], pointer),\n currentSubTargets,\n currentContainer,\n currentTarget,\n };\n\n const activeObjectControl = activeObject.findControl(\n this.getViewportPoint(e),\n isTouchEvent(e),\n );\n\n // we are clicking exactly the control of an active object, shortcut to that object.\n if (activeObjectControl) {\n return {\n ...activeObjectTargetInfo,\n target: activeObject, // we override target in case we are in the outside part of the corner.\n };\n }\n\n // in case we are over the active object\n if (activeObjectTargetInfo.target) {\n if (aObjects.length > 1) {\n // in case of active selection and target hit over the activeSelection, just exit\n // TODO Verify if we need to override target with container\n return activeObjectTargetInfo;\n }\n // from here onward not an active selection, just an activeOject that maybe is a group\n\n // preserveObjectStacking is false, so activeObject is drawn on top, just return activeObject\n if (!this.preserveObjectStacking) {\n // TODO Verify if we need to override target with container\n return activeObjectTargetInfo;\n }\n\n // In case we are in preserveObjectStacking ( selection in stack )\n // there is the possibility to force with `altSelectionKey` to return the activeObject\n // from any point in the stack, even if we have another object completely on top of it.\n if (\n this.preserveObjectStacking &&\n e[this.altSelectionKey as ModifierKey]\n ) {\n // TODO Verify if we need to override target with container\n return activeObjectTargetInfo;\n }\n }\n\n // we have an active object, but we ruled out it being our target in any way.\n return fullTargetInfo;\n }\n\n /**\n * Checks if the point is inside the object selection area including padding\n * @param {FabricObject} obj Object to test against\n * @param {Object} [pointer] point in scene coordinates\n * @return {Boolean} true if point is contained within an area of given object\n * @private\n */\n private _pointIsInObjectSelectionArea(obj: FabricObject, point: Point) {\n // getCoords will already take care of group de-nesting\n let coords = obj.getCoords();\n const viewportZoom = this.getZoom();\n const padding = obj.padding / viewportZoom;\n if (padding) {\n const [tl, tr, br, bl] = coords;\n // what is the angle of the object?\n // we could use getTotalAngle, but is way easier to look at it\n // from how coords are oriented, since if something went wrong\n // at least we are consistent.\n const angleRadians = Math.atan2(tr.y - tl.y, tr.x - tl.x),\n cosP = cos(angleRadians) * padding,\n sinP = sin(angleRadians) * padding,\n cosPSinP = cosP + sinP,\n cosPMinusSinP = cosP - sinP;\n\n coords = [\n new Point(tl.x - cosPMinusSinP, tl.y - cosPSinP),\n new Point(tr.x + cosPSinP, tr.y - cosPMinusSinP),\n new Point(br.x + cosPMinusSinP, br.y + cosPSinP),\n new Point(bl.x - cosPSinP, bl.y + cosPMinusSinP),\n ];\n // in case of padding we calculate the new coords on the fly.\n // otherwise we have to maintain 2 sets of coordinates for everything.\n // we can reiterate on storing them.\n // if this is slow, for now the semplification is large and doesn't impact\n // rendering.\n // the idea behind this is that outside target check we don't need ot know\n // where those coords are\n }\n return Intersection.isPointInPolygon(point, coords);\n }\n\n /**\n * Checks point is inside the object selection condition. Either area with padding\n * or over pixels if perPixelTargetFind is enabled\n * @param {FabricObject} obj Object to test against\n * @param {Point} pointer point from scene.\n * @return {Boolean} true if point is contained within an area of given object\n * @private\n */\n _checkTarget(obj: FabricObject, pointer: Point): boolean {\n if (\n obj &&\n obj.visible &&\n obj.evented &&\n this._pointIsInObjectSelectionArea(obj, pointer)\n ) {\n if (\n (this.perPixelTargetFind || obj.perPixelTargetFind) &&\n !(obj as unknown as IText).isEditing\n ) {\n const viewportPoint = pointer.transform(this.viewportTransform);\n if (!this.isTargetTransparent(obj, viewportPoint.x, viewportPoint.y)) {\n return true;\n }\n } else {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Given an array of objects search possible targets under the pointer position\n * Returns an\n * @param {Array} objects objects array to look into\n * @param {Object} pointer x,y object of point of scene coordinates we want to check.\n * @param {Object} subTargets If passed, subtargets will be collected inside the array\n * @return {TargetsInfo} **top most object from given `objects`** that contains pointer\n * @private\n */\n _searchPossibleTargets(\n objects: FabricObject[],\n pointer: Point,\n subTargets: FabricObject[],\n ): TargetsInfo {\n let i = objects.length;\n // Do not check for currently grouped objects, since we check the parent group itself.\n // until we call this function specifically to search inside the activeGroup\n while (i--) {\n const target = objects[i];\n if (this._checkTarget(target, pointer)) {\n if (isCollection(target) && target.subTargetCheck) {\n const { target: subTarget } = this._searchPossibleTargets(\n target._objects,\n pointer,\n subTargets,\n );\n subTarget && subTargets.push(subTarget);\n }\n return {\n target,\n subTargets,\n };\n }\n }\n return {\n subTargets: [],\n };\n }\n\n /**\n * Search inside an objects array the fiurst object that contains pointer\n * Collect subTargets of that object inside the subTargets array passed as parameter\n * @param {FabricObject[]} objects objects array to look into\n * @param {Point} pointer coordinates from viewport to check.\n * @return {FabricObject} **top most object on screen** that contains pointer\n */\n searchPossibleTargets(\n objects: FabricObject[],\n pointer: Point,\n ): TargetsInfoWithContainer {\n const targetInfo: TargetsInfoWithContainer = this._searchPossibleTargets(\n objects,\n pointer,\n [],\n );\n\n // outermost target is the container.\n targetInfo.container = targetInfo.target;\n const { container, subTargets } = targetInfo;\n\n if (\n container &&\n isCollection(container) &&\n container.interactive &&\n subTargets[0]\n ) {\n /** subTargets[0] is the innermost nested target, but it could be inside non interactive groups\n * and so not a possible selection target.\n * We loop the array from the end that is outermost innertarget.\n */\n for (let i = subTargets.length - 1; i > 0; i--) {\n const t = subTargets[i];\n if (!(isCollection(t) && t.interactive)) {\n // one of the subtargets was not interactive. that is the last subtarget we can return.\n // we can't dig more deep;\n targetInfo.target = t;\n return targetInfo;\n }\n }\n targetInfo.target = subTargets[0];\n return targetInfo;\n }\n\n return targetInfo;\n }\n\n /**\n * @returns point existing in the same plane as the {@link HTMLCanvasElement},\n * `(0, 0)` being the top left corner of the {@link HTMLCanvasElement}.\n * This means that changes to the {@link viewportTransform} do not change the values of the point\n * and it remains unchanged from the viewer's perspective.\n *\n * @example\n * const scenePoint = sendPointToPlane(\n * this.getViewportPoint(e),\n * undefined,\n * canvas.viewportTransform\n * );\n *\n */\n getViewportPoint(e: TPointerEvent) {\n if (this._viewportPoint) {\n return this._viewportPoint;\n }\n return this._getPointerImpl(e, true);\n }\n\n /**\n * @returns point existing in the scene (the same plane as the plane {@link FabricObject#getCenterPoint} exists in).\n * This means that changes to the {@link viewportTransform} do not change the values of the point,\n * however, from the viewer's perspective, the point is changed.\n *\n * @example\n * const viewportPoint = sendPointToPlane(\n * this.getScenePoint(e),\n * canvas.viewportTransform\n * );\n *\n */\n getScenePoint(e: TPointerEvent) {\n if (this._scenePoint) {\n return this._scenePoint;\n }\n return this._getPointerImpl(e);\n }\n\n /**\n * Returns pointer relative to canvas.\n *\n * Use {@link getViewportPoint} or {@link getScenePoint} instead.\n *\n * @param {Event} e\n * @param {Boolean} [fromViewport] whether to return the point from the viewport or in the scene\n * @return {Point}\n */\n protected _getPointerImpl(e: TPointerEvent, fromViewport = false): Point {\n const upperCanvasEl = this.upperCanvasEl,\n bounds = upperCanvasEl.getBoundingClientRect();\n let pointer = getPointer(e),\n boundsWidth = bounds.width || 0,\n boundsHeight = bounds.height || 0;\n\n if (!boundsWidth || !boundsHeight) {\n if (TOP in bounds && BOTTOM in bounds) {\n boundsHeight = Math.abs(bounds.top - bounds.bottom);\n }\n if (RIGHT in bounds && LEFT in bounds) {\n boundsWidth = Math.abs(bounds.right - bounds.left);\n }\n }\n\n this.calcOffset();\n pointer.x = pointer.x - this._offset.left;\n pointer.y = pointer.y - this._offset.top;\n if (!fromViewport) {\n pointer = sendPointToPlane(pointer, undefined, this.viewportTransform);\n }\n\n const retinaScaling = this.getRetinaScaling();\n if (retinaScaling !== 1) {\n pointer.x /= retinaScaling;\n pointer.y /= retinaScaling;\n }\n\n // If bounds are not available (i.e. not visible), do not apply scale.\n const cssScale =\n boundsWidth === 0 || boundsHeight === 0\n ? new Point(1, 1)\n : new Point(\n upperCanvasEl.width / boundsWidth,\n upperCanvasEl.height / boundsHeight,\n );\n\n return pointer.multiply(cssScale);\n }\n\n /**\n * Internal use only\n * @protected\n */\n protected _setDimensionsImpl(\n dimensions: TSize,\n options?: TCanvasSizeOptions,\n ) {\n // @ts-expect-error this method exists in the subclass - should be moved or declared as abstract\n this._resetTransformEventData();\n super._setDimensionsImpl(dimensions, options);\n if (this._isCurrentlyDrawing) {\n this.freeDrawingBrush &&\n this.freeDrawingBrush._setBrushStyles(this.contextTop);\n }\n }\n\n protected _createCacheCanvas() {\n this.pixelFindCanvasEl = createCanvasElement();\n this.pixelFindContext = this.pixelFindCanvasEl.getContext('2d', {\n willReadFrequently: true,\n })!;\n this.setTargetFindTolerance(this.targetFindTolerance);\n }\n\n /**\n * Returns context of top canvas where interactions are drawn\n * @returns {CanvasRenderingContext2D}\n */\n getTopContext(): CanvasRenderingContext2D {\n return this.elements.upper.ctx;\n }\n\n /**\n * Returns context of canvas where object selection is drawn\n * @alias\n * @return {CanvasRenderingContext2D}\n */\n getSelectionContext(): CanvasRenderingContext2D {\n return this.elements.upper.ctx;\n }\n\n /**\n * Returns <canvas> element on which object selection is drawn\n * @return {HTMLCanvasElement}\n */\n getSelectionElement(): HTMLCanvasElement {\n return this.elements.upper.el;\n }\n\n /**\n * Returns currently active object\n * @return {FabricObject | null} active object\n */\n getActiveObject(): FabricObject | undefined {\n return this._activeObject;\n }\n\n /**\n * Returns an array with the current selected objects\n * @return {FabricObject[]} active objects array\n */\n getActiveObjects(): FabricObject[] {\n const active = this._activeObject;\n return isActiveSelection(active)\n ? active.getObjects()\n : active\n ? [active]\n : [];\n }\n\n /**\n * @private\n * Compares the old activeObject with the current one and fires correct events\n * @param {FabricObject[]} oldObjects old activeObject\n * @param {TPointerEvent} e mouse event triggering the selection events\n */\n _fireSelectionEvents(oldObjects: FabricObject[], e?: TPointerEvent) {\n let somethingChanged = false,\n invalidate = false;\n const objects = this.getActiveObjects(),\n added: FabricObject[] = [],\n removed: FabricObject[] = [];\n\n oldObjects.forEach((target) => {\n if (!objects.includes(target)) {\n somethingChanged = true;\n target.fire('deselected', {\n e,\n target,\n });\n removed.push(target);\n }\n });\n\n objects.forEach((target) => {\n if (!oldObjects.includes(target)) {\n somethingChanged = true;\n target.fire('selected', {\n e,\n target,\n });\n added.push(target);\n }\n });\n\n if (oldObjects.length > 0 && objects.length > 0) {\n invalidate = true;\n somethingChanged &&\n this.fire('selection:updated', {\n e,\n selected: added,\n deselected: removed,\n });\n } else if (objects.length > 0) {\n invalidate = true;\n this.fire('selection:created', {\n e,\n selected: added,\n });\n } else if (oldObjects.length > 0) {\n invalidate = true;\n this.fire('selection:cleared', {\n e,\n deselected: removed,\n });\n }\n invalidate && (this._objectsToRender = undefined);\n }\n\n /**\n * Sets given object as the only active object on canvas\n * @param {FabricObject} object Object to set as an active one\n * @param {TPointerEvent} [e] Event (passed along when firing \"object:selected\")\n * @return {Boolean} true if the object has been selected\n */\n setActiveObject(object: FabricObject, e?: TPointerEvent) {\n // we can't inline this, since _setActiveObject will change what getActiveObjects returns\n const currentActives = this.getActiveObjects();\n const selected = this._setActiveObject(object, e);\n this._fireSelectionEvents(currentActives, e);\n return selected;\n }\n\n /**\n * This is supposed to be equivalent to setActiveObject but without firing\n * any event. There is commitment to have this stay this way.\n * This is the functional part of setActiveObject.\n * @param {Object} object to set as active\n * @param {Event} [e] Event (passed along when firing \"object:selected\")\n * @return {Boolean} true if the object has been selected\n */\n _setActiveObject(object: FabricObject, e?: TPointerEvent) {\n const prevActiveObject = this._activeObject;\n if (prevActiveObject === object) {\n return false;\n }\n // after calling this._discardActiveObject, this,_activeObject could be undefined\n if (!this._discardActiveObject(e, object) && this._activeObject) {\n // refused to deselect\n return false;\n }\n if (object.onSelect({ e })) {\n return false;\n }\n\n this._activeObject = object;\n\n if (isActiveSelection(object) && prevActiveObject !== object) {\n object.set('canvas', this);\n }\n object.setCoords();\n\n return true;\n }\n\n /**\n * This is supposed to be equivalent to discardActiveObject but without firing\n * any selection events ( can still fire object transformation events ). There is commitment to have this stay this way.\n * This is the functional part of discardActiveObject.\n * @param {Event} [e] Event (passed along when firing \"object:deselected\")\n * @param {Object} object the next object to set as active, reason why we are discarding this\n * @return {Boolean} true if the active object has been discarded\n */\n _discardActiveObject(\n e?: TPointerEvent,\n object?: FabricObject,\n ): this is { _activeObject: undefined } {\n const obj = this._activeObject;\n if (obj) {\n // onDeselect return TRUE to cancel selection;\n if (obj.onDeselect({ e, object })) {\n return false;\n }\n if (this._currentTransform && this._currentTransform.target === obj) {\n this.endCurrentTransform(e);\n }\n if (isActiveSelection(obj) && obj === this._hoveredTarget) {\n this._hoveredTarget = undefined;\n }\n this._activeObject = undefined;\n return true;\n }\n return false;\n }\n\n /**\n * Discards currently active object and fire events. If the function is called by fabric\n * as a consequence of a mouse event, the event is passed as a parameter and\n * sent to the fire function for the custom events. When used as a method the\n * e param does not have any application.\n * @param {event} e\n * @return {Boolean} true if the active object has been discarded\n */\n discardActiveObject(e?: TPointerEvent): this is { _activeObject: undefined } {\n const currentActives = this.getActiveObjects(),\n activeObject = this.getActiveObject();\n if (currentActives.length) {\n this.fire('before:selection:cleared', {\n e,\n deselected: [activeObject!],\n });\n }\n const discarded = this._discardActiveObject(e);\n this._fireSelectionEvents(currentActives, e);\n return discarded;\n }\n\n /**\n * End the current transform.\n * You don't usually need to call this method unless you are interrupting a user initiated transform\n * because of some other event ( a press of key combination, or something that block the user UX )\n * @param {Event} [e] send the mouse event that generate the finalize down, so it can be used in the event\n */\n endCurrentTransform(e?: TPointerEvent) {\n const transform = this._currentTransform;\n this._finalizeCurrentTransform(e);\n if (transform && transform.target) {\n // this could probably go inside _finalizeCurrentTransform\n transform.target.isMoving = false;\n }\n this._currentTransform = null;\n }\n\n /**\n * @private\n * @param {Event} e send the mouse event that generate the finalize down, so it can be used in the event\n */\n _finalizeCurrentTransform(e?: TPointerEvent) {\n const transform = this._currentTransform!,\n target = transform.target,\n options = {\n e,\n target,\n transform,\n action: transform.action,\n };\n\n if (target._scaling) {\n target._scaling = false;\n }\n\n target.setCoords();\n\n if (transform.actionPerformed) {\n this.fire('object:modified', options);\n target.fire(MODIFIED, options);\n }\n }\n\n /**\n * Sets viewport transformation of this canvas instance\n * @param {Array} vpt a Canvas 2D API transform matrix\n */\n setViewportTransform(vpt: TMat2D) {\n super.setViewportTransform(vpt);\n const activeObject = this._activeObject;\n if (activeObject) {\n activeObject.setCoords();\n }\n }\n\n /**\n * @override clears active selection ref and interactive canvas elements and contexts\n */\n destroy() {\n // dispose of active selection\n const activeObject = this._activeObject;\n if (isActiveSelection(activeObject)) {\n activeObject.removeAll();\n activeObject.dispose();\n }\n\n delete this._activeObject;\n\n super.destroy();\n\n // free resources\n\n // pixel find canvas\n // @ts-expect-error disposing\n this.pixelFindContext = null;\n // @ts-expect-error disposing\n this.pixelFindCanvasEl = undefined;\n }\n\n /**\n * Clears all contexts (background, main, top) of an instance\n */\n clear() {\n // discard active object and fire events\n this.discardActiveObject();\n // make sure we clear the active object in case it refused to be discarded\n this._activeObject = undefined;\n this.clearContext(this.contextTop);\n super.clear();\n }\n\n /**\n * Draws objects' controls (borders/controls)\n * @param {CanvasRenderingContext2D} ctx Context to render controls on\n */\n drawControls(ctx: CanvasRenderingContext2D) {\n const activeObject = this._activeObject;\n\n if (activeObject) {\n activeObject._renderControls(ctx);\n }\n }\n\n /**\n * @private\n */\n protected _toObject(\n instance: FabricObject,\n methodName: 'toObject' | 'toDatalessObject',\n propertiesToInclude: string[],\n ): Record<string, any> {\n // If the object is part of the current selection group, it should\n // be transformed appropriately\n // i.e. it should be serialised as it would appear if the selection group\n // were to be destroyed.\n const originalProperties = this._realizeGroupTransformOnObject(instance),\n object = super._toObject(instance, methodName, propertiesToInclude);\n //Undo the damage we did by changing all of its properties\n instance.set(originalProperties);\n return object;\n }\n\n /**\n * Realizes an object's group transformation on it\n * @private\n * @param {FabricObject} [instance] the object to transform (gets mutated)\n * @returns the original values of instance which were changed\n */\n private _realizeGroupTransformOnObject(\n instance: FabricObject,\n ): Partial<typeof instance> {\n const { group } = instance;\n if (group && isActiveSelection(group) && this._activeObject === group) {\n const layoutProps = [\n 'angle',\n 'flipX',\n 'flipY',\n LEFT,\n SCALE_X,\n SCALE_Y,\n SKEW_X,\n SKEW_Y,\n TOP,\n ] as (keyof typeof instance)[];\n const originalValues = pick<typeof instance>(instance, layoutProps);\n addTransformToObject(instance, group.calcOwnMatrix());\n return originalValues;\n } else {\n return {};\n }\n }\n\n /**\n * @private\n */\n _setSVGObject(\n markup: string[],\n instance: FabricObject,\n reviver?: TSVGReviver,\n ) {\n // If the object is in a selection group, simulate what would happen to that\n // object when the group is deselected\n const originalProperties = this._realizeGroupTransformOnObject(instance);\n super._setSVGObject(markup, instance, reviver);\n instance.set(originalProperties);\n }\n}\n"],"names":["SelectableCanvas","StaticCanvas","constructor","arguments","_defineProperty","getDefaults","ownDefaults","upperCanvasEl","_this$elements$upper","elements","upper","el","contextTop","_this$elements$upper2","ctx","wrapperEl","container","initElements","CanvasDOMManager","allowTouchScrolling","containerClass","_createCacheCanvas","_onObjectAdded","obj","_objectsToRender","undefined","_onObjectRemoved","_activeObject","fire","deselected","_discardActiveObject","target","_hoveredTarget","_hoveredTargets","_onStackOrderChanged","_chooseObjectsToRender","activeObject","preserveObjectStacking","_objects","filter","object","group","concat","renderAll","cancelRequestedRender","destroyed","contextTopDirty","_groupSelector","isDrawingMode","clearContext","hasLostContext","renderTopLayer","renderCanvas","getContext","save","_isCurrentlyDrawing","freeDrawingBrush","_render","selection","_drawSelection","restore","renderTop","setTargetFindTolerance","value","Math","round","targetFindTolerance","retina","getRetinaScaling","size","ceil","pixelFindCanvasEl","width","height","pixelFindContext","scale","isTargetTransparent","x","y","tolerance","translate","transform","viewportTransform","selectionBgc","selectionBackgroundColor","render","enhancedTolerance","isTransparent","_isSelectionKeyPressed","e","sKey","selectionKey","Array","isArray","find","key","_shouldClearSelection","activeObjects","getActiveObjects","length","indexOf","evented","selectable","_shouldCenterTransform","action","modifierKeyPressed","centerTransform","SCALE","SCALE_X","SCALE_Y","RESIZING","centeredScaling","ROTATE","centeredRotation","_getOriginFromCorner","controlName","origin","originX","originY","includes","RIGHT","LEFT","BOTTOM","TOP","_setupCurrentTransform","alreadySelected","_control$getActionHan","pointer","sendPointToPlane","getScenePoint","calcTransformMatrix","corner","control","getActiveControl","actionHandler","getActionHandler","bind","dragHandler","getActionFromCorner","altKey","centeredKey","CENTER","actionPerformed","scaleX","scaleY","skewX","skewY","offsetX","left","offsetY","top","ex","ey","lastX","lastY","theta","degreesToRadians","angle","shiftKey","original","saveObjectTransform","_currentTransform","setCursor","style","cursor","deltaX","deltaY","start","Point","extent","strokeOffset","selectionLineWidth","minX","min","minY","maxX","max","maxY","selectionColor","fillStyle","fillRect","selectionBorderColor","lineWidth","strokeStyle","FabricObject","prototype","_setLineDash","call","selectionDashArray","strokeRect","findTarget","_targetInfo","skipTargetFind","subTargets","currentSubTargets","aObjects","targetInfo","searchPossibleTargets","currentContainer","currentTarget","fullTargetInfo","activeObjectTargetInfo","activeObjectControl","findControl","getViewportPoint","isTouchEvent","altSelectionKey","_pointIsInObjectSelectionArea","point","coords","getCoords","viewportZoom","getZoom","padding","tl","tr","br","bl","angleRadians","atan2","cosP","cos","sinP","sin","cosPSinP","cosPMinusSinP","Intersection","isPointInPolygon","_checkTarget","visible","perPixelTargetFind","isEditing","viewportPoint","_searchPossibleTargets","objects","i","isCollection","subTargetCheck","subTarget","push","interactive","t","_viewportPoint","_getPointerImpl","_scenePoint","fromViewport","bounds","getBoundingClientRect","getPointer","boundsWidth","boundsHeight","abs","bottom","right","calcOffset","_offset","retinaScaling","cssScale","multiply","_setDimensionsImpl","dimensions","options","_resetTransformEventData","_setBrushStyles","createCanvasElement","willReadFrequently","getTopContext","getSelectionContext","getSelectionElement","getActiveObject","active","isActiveSelection","getObjects","_fireSelectionEvents","oldObjects","somethingChanged","invalidate","added","removed","forEach","selected","setActiveObject","currentActives","_setActiveObject","prevActiveObject","onSelect","set","setCoords","onDeselect","endCurrentTransform","discardActiveObject","discarded","_finalizeCurrentTransform","isMoving","_scaling","MODIFIED","setViewportTransform","vpt","destroy","removeAll","dispose","clear","drawControls","_renderControls","_toObject","instance","methodName","propertiesToInclude","originalProperties","_realizeGroupTransformOnObject","layoutProps","SKEW_X","SKEW_Y","originalValues","pick","addTransformToObject","calcOwnMatrix","_setSVGObject","markup","reviver","canvasDefaults"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMA,gBAAgB,SACnBC,YAAY,CAEtB;EAAAC,WAAAA,GAAA;AAAA,IAAA,KAAA,CAAA,GAAAC,SAAA,CAAA;AAGE;AAQA;AAUA;AASA;AAKA;AACF;AACA;AACA;AACA;AACA;AACA;AAKE;AAKA;AACF;AACA;AACA;AACA;AAGE;AACF;AACA;AACA;AACA;AAJEC,IAAAA,eAAA,0BAKkC,EAAE,CAAA;AASpC;AACF;AACA;AACA;AACA;AACA;AALEA,IAAAA,eAAA,4BAMsC,IAAI,CAAA;AAE1C;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AAPEA,IAAAA,eAAA,yBAaW,IAAI,CAAA;AAEf;AACF;AACA;AACA;AACA;AACA;AALEA,IAAAA,eAAA,0BAMkB,KAAK,CAAA;AAAA,EAAA;EA6BvB,OAAOC,WAAWA,GAAwB;IACxC,OAAO;AAAE,MAAA,GAAG,KAAK,CAACA,WAAW,EAAE;AAAE,MAAA,GAAGL,gBAAgB,CAACM;KAAa;AACpE,EAAA;EAGA,IAAIC,aAAaA,GAAG;AAAA,IAAA,IAAAC,oBAAA;AAClB,IAAA,OAAA,CAAAA,oBAAA,GAAO,IAAI,CAACC,QAAQ,CAACC,KAAK,MAAA,IAAA,IAAAF,oBAAA,KAAA,MAAA,G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"}
|
|
1
|
+
{"version":3,"file":"SelectableCanvas.mjs","sources":["../../../src/canvas/SelectableCanvas.ts"],"sourcesContent":["import { getActionFromCorner } from '../controls/util';\nimport { Point } from '../Point';\nimport { FabricObject } from '../shapes/Object/FabricObject';\nimport type {\n CanvasEvents,\n ModifierKey,\n TOptionalModifierKey,\n TPointerEvent,\n Transform,\n} from '../EventTypeDefs';\nimport {\n addTransformToObject,\n saveObjectTransform,\n} from '../util/misc/objectTransforms';\nimport type { TCanvasSizeOptions } from './StaticCanvas';\nimport { StaticCanvas } from './StaticCanvas';\nimport { isCollection } from '../Collection';\nimport { isTransparent } from '../util/misc/isTransparent';\nimport type {\n TMat2D,\n TOriginX,\n TOriginY,\n TSize,\n TSVGReviver,\n} from '../typedefs';\nimport { degreesToRadians } from '../util/misc/radiansDegreesConversion';\nimport { getPointer, isTouchEvent } from '../util/dom_event';\nimport type { IText } from '../shapes/IText/IText';\nimport type { BaseBrush } from '../brushes/BaseBrush';\nimport { pick } from '../util/misc/pick';\nimport { sendPointToPlane } from '../util/misc/planeChange';\nimport { cos, createCanvasElement, sin } from '../util';\nimport { CanvasDOMManager } from './DOMManagers/CanvasDOMManager';\nimport {\n BOTTOM,\n CENTER,\n LEFT,\n MODIFIED,\n RESIZING,\n RIGHT,\n ROTATE,\n SCALE,\n SCALE_X,\n SCALE_Y,\n SKEW_X,\n SKEW_Y,\n TOP,\n} from '../constants';\nimport type { CanvasOptions } from './CanvasOptions';\nimport { canvasDefaults } from './CanvasOptions';\nimport { Intersection } from '../Intersection';\nimport { isActiveSelection } from '../util/typeAssertions';\nimport { dragHandler } from '../controls';\nimport { type FabricImage } from '../shapes/Image';\n\nexport type TargetsInfo = {\n target?: FabricObject;\n subTargets: FabricObject[];\n};\n\nexport type TargetsInfoWithContainer = {\n // the target we think is the most continuing the selection action.\n // could be hoveredTarget or the currently selected object\n target?: FabricObject;\n // the nested targets under the pointer for container\n subTargets: FabricObject[];\n // the container for target, or target itself if there are no selectable nested targets\n container?: FabricObject;\n};\n\nexport type FullTargetsInfoWithContainer = TargetsInfoWithContainer & {\n // hoveredTarget\n currentTarget?: FabricObject;\n // the container for hoveredTarget, or container itself\n currentContainer?: FabricObject;\n // nested targets of current container\n currentSubTargets: FabricObject[];\n};\n\n/**\n * Canvas class\n * @class Canvas\n * @extends StaticCanvas\n * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-1#canvas}\n *\n * @fires object:modified at the end of a transform\n * @fires object:rotating while an object is being rotated from the control\n * @fires object:scaling while an object is being scaled by controls\n * @fires object:moving while an object is being dragged\n * @fires object:skewing while an object is being skewed from the controls\n *\n * @fires before:transform before a transform is is started\n * @fires before:selection:cleared\n * @fires selection:cleared\n * @fires selection:updated\n * @fires selection:created\n *\n * @fires path:created after a drawing operation ends and the path is added\n * @fires mouse:down\n * @fires mouse:move\n * @fires mouse:up\n * @fires mouse:down:before on mouse down, before the inner fabric logic runs\n * @fires mouse:move:before on mouse move, before the inner fabric logic runs\n * @fires mouse:up:before on mouse up, before the inner fabric logic runs\n * @fires mouse:over\n * @fires mouse:out\n * @fires mouse:dblclick whenever a native dbl click event fires on the canvas.\n *\n * @fires dragover\n * @fires dragenter\n * @fires dragleave\n * @fires drag:enter object drag enter\n * @fires drag:leave object drag leave\n * @fires drop:before before drop event. Prepare for the drop event (same native event).\n * @fires drop\n * @fires drop:after after drop event. Run logic on canvas after event has been accepted/declined (same native event).\n * @example\n * let a: fabric.Object, b: fabric.Object;\n * let flag = false;\n * canvas.add(a, b);\n * a.on('drop:before', opt => {\n * // we want a to accept the drop even though it's below b in the stack\n * flag = this.canDrop(opt.e);\n * });\n * b.canDrop = function(e) {\n * !flag && this.draggableTextDelegate.canDrop(e);\n * }\n * b.on('dragover', opt => b.set('fill', opt.dropTarget === b ? 'pink' : 'black'));\n * a.on('drop', opt => {\n * opt.e.defaultPrevented // drop occurred\n * opt.didDrop // drop occurred on canvas\n * opt.target // drop target\n * opt.target !== a && a.set('text', 'I lost');\n * });\n * canvas.on('drop:after', opt => {\n * // inform user who won\n * if(!opt.e.defaultPrevented) {\n * // no winners\n * }\n * else if(!opt.didDrop) {\n * // my objects didn't win, some other lucky object\n * }\n * else {\n * // we have a winner it's opt.target!!\n * }\n * })\n *\n * @fires after:render at the end of the render process, receives the context in the callback\n * @fires before:render at start the render process, receives the context in the callback\n *\n * @fires contextmenu:before\n * @fires contextmenu\n * @example\n * let handler;\n * targets.forEach(target => {\n * target.on('contextmenu:before', opt => {\n * // decide which target should handle the event before canvas hijacks it\n * if (someCaseHappens && opt.targets.includes(target)) {\n * handler = target;\n * }\n * });\n * target.on('contextmenu', opt => {\n * // do something fantastic\n * });\n * });\n * canvas.on('contextmenu', opt => {\n * if (!handler) {\n * // no one takes responsibility, it's always left to me\n * // let's show them how it's done!\n * }\n * });\n *\n */\nexport class SelectableCanvas<EventSpec extends CanvasEvents = CanvasEvents>\n extends StaticCanvas<EventSpec>\n implements Omit<CanvasOptions, 'enablePointerEvents'>\n{\n declare _objects: FabricObject[];\n\n // transform config\n declare uniformScaling: boolean;\n declare uniScaleKey: TOptionalModifierKey;\n declare centeredScaling: boolean;\n declare centeredRotation: boolean;\n declare centeredKey: TOptionalModifierKey;\n declare altActionKey: TOptionalModifierKey;\n\n // selection config\n declare selection: boolean;\n declare selectionKey: TOptionalModifierKey | ModifierKey[];\n declare altSelectionKey: TOptionalModifierKey;\n declare selectionColor: string;\n declare selectionDashArray: number[];\n declare selectionBorderColor: string;\n declare selectionLineWidth: number;\n declare selectionFullyContained: boolean;\n\n // cursors\n declare hoverCursor: CSSStyleDeclaration['cursor'];\n declare moveCursor: CSSStyleDeclaration['cursor'];\n declare defaultCursor: CSSStyleDeclaration['cursor'];\n declare freeDrawingCursor: CSSStyleDeclaration['cursor'];\n declare notAllowedCursor: CSSStyleDeclaration['cursor'];\n\n declare containerClass: string;\n\n // target find config\n declare perPixelTargetFind: boolean;\n declare targetFindTolerance: number;\n declare skipTargetFind: boolean;\n\n /**\n * When true, mouse events on canvas (mousedown/mousemove/mouseup) result in free drawing.\n * After mousedown, mousemove creates a shape,\n * and then mouseup finalizes it and adds an instance of `fabric.Path` onto canvas.\n * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-4#free_drawing}\n * @type Boolean\n */\n declare isDrawingMode: boolean;\n\n declare preserveObjectStacking: boolean;\n\n // event config\n declare stopContextMenu: boolean;\n declare fireRightClick: boolean;\n declare fireMiddleClick: boolean;\n\n /**\n * Keep track of the hovered target in the previous event\n * @type FabricObject | null\n * @private\n */\n declare _hoveredTarget?: FabricObject;\n\n /**\n * hold the list of nested targets hovered in the previous events\n * @type FabricObject[]\n * @private\n */\n _hoveredTargets: FabricObject[] = [];\n\n /**\n * hold the list of objects to render\n * @type FabricObject[]\n * @private\n */\n declare _objectsToRender?: FabricObject[];\n\n /**\n * hold a reference to a data structure that contains information\n * on the current on going transform\n * @type\n * @private\n */\n _currentTransform: Transform | null = null;\n\n /**\n * hold a reference to a data structure used to track the selection\n * box on canvas drag\n * on the current on going transform\n * x, y, deltaX and deltaY are in scene plane\n * @type\n * @private\n */\n protected _groupSelector: {\n x: number;\n y: number;\n deltaX: number;\n deltaY: number;\n } | null = null;\n\n /**\n * internal flag used to understand if the context top requires a cleanup\n * in case this is true, the contextTop will be cleared at the next render\n * @type boolean\n * @private\n */\n contextTopDirty = false;\n\n /**\n * During a mouse event we may need the pointer multiple times in multiple functions.\n * _scenePoint holds a reference to the pointer in fabricCanvas/design coordinates that is valid for the event\n * lifespan. Every fabricJS mouse event create and delete the cache every time\n * We do this because there are some HTML DOM inspection functions to get the actual pointer coordinates\n * @type {Point}\n */\n declare protected _scenePoint?: Point;\n\n /**\n * During a mouse event we may need the pointer multiple times in multiple functions.\n * _viewportPoint holds a reference to the pointer in html coordinates that is valid for the event\n * lifespan. Every fabricJS mouse event create and delete the cache every time\n * We do this because there are some HTML DOM inspection functions to get the actual pointer coordinates\n * @type {Point}\n */\n declare protected _viewportPoint?: Point;\n\n /**\n * Holds the informations we cache during an event lifespan\n * This data is needed many times during an event and we want to avoid to recalculate it\n * multuple times.\n */\n declare protected _targetInfo: FullTargetsInfoWithContainer | undefined;\n\n static ownDefaults = canvasDefaults;\n\n static getDefaults(): Record<string, any> {\n return { ...super.getDefaults(), ...SelectableCanvas.ownDefaults };\n }\n\n declare elements: CanvasDOMManager;\n get upperCanvasEl() {\n return this.elements.upper?.el;\n }\n get contextTop() {\n return this.elements.upper?.ctx;\n }\n get wrapperEl() {\n return this.elements.container;\n }\n declare private pixelFindCanvasEl: HTMLCanvasElement;\n declare private pixelFindContext: CanvasRenderingContext2D;\n\n declare protected _isCurrentlyDrawing: boolean;\n declare freeDrawingBrush?: BaseBrush;\n declare _activeObject?: FabricObject;\n\n protected initElements(el?: string | HTMLCanvasElement) {\n this.elements = new CanvasDOMManager(el, {\n allowTouchScrolling: this.allowTouchScrolling,\n containerClass: this.containerClass,\n });\n this._createCacheCanvas();\n }\n\n /**\n * @private\n * @param {FabricObject} obj Object that was added\n */\n _onObjectAdded(obj: FabricObject) {\n this._objectsToRender = undefined;\n super._onObjectAdded(obj);\n }\n\n /**\n * @private\n * @param {FabricObject} obj Object that was removed\n */\n _onObjectRemoved(obj: FabricObject) {\n this._objectsToRender = undefined;\n // removing active object should fire \"selection:cleared\" events\n if (obj === this._activeObject) {\n this.fire('before:selection:cleared', { deselected: [obj] });\n this._discardActiveObject();\n this.fire('selection:cleared', { deselected: [obj] });\n obj.fire('deselected', {\n target: obj,\n });\n }\n if (obj === this._hoveredTarget) {\n this._hoveredTarget = undefined;\n this._hoveredTargets = [];\n }\n super._onObjectRemoved(obj);\n }\n\n _onStackOrderChanged() {\n this._objectsToRender = undefined;\n super._onStackOrderChanged();\n }\n\n /**\n * Divides objects in two groups, one to render immediately\n * and one to render as activeGroup.\n * @return {Array} objects to render immediately and pushes the other in the activeGroup.\n */\n _chooseObjectsToRender(): FabricObject[] {\n const activeObject = this._activeObject;\n return !this.preserveObjectStacking && activeObject\n ? this._objects\n .filter((object) => !object.group && object !== activeObject)\n .concat(activeObject)\n : this._objects;\n }\n\n /**\n * Renders both the top canvas and the secondary container canvas.\n */\n renderAll() {\n this.cancelRequestedRender();\n if (this.destroyed) {\n return;\n }\n if (this.contextTopDirty && !this._groupSelector && !this.isDrawingMode) {\n this.clearContext(this.contextTop);\n this.contextTopDirty = false;\n }\n if (this.hasLostContext) {\n this.renderTopLayer(this.contextTop);\n this.hasLostContext = false;\n }\n !this._objectsToRender &&\n (this._objectsToRender = this._chooseObjectsToRender());\n this.renderCanvas(this.getContext(), this._objectsToRender);\n }\n\n /**\n * text selection is rendered by the active text instance during the rendering cycle\n */\n renderTopLayer(ctx: CanvasRenderingContext2D): void {\n ctx.save();\n if (this.isDrawingMode && this._isCurrentlyDrawing) {\n this.freeDrawingBrush && this.freeDrawingBrush._render();\n this.contextTopDirty = true;\n }\n // we render the top context - last object\n if (this.selection && this._groupSelector) {\n this._drawSelection(ctx);\n this.contextTopDirty = true;\n }\n ctx.restore();\n }\n\n /**\n * Method to render only the top canvas.\n * Also used to render the group selection box.\n * Does not render text selection.\n */\n renderTop() {\n const ctx = this.contextTop;\n this.clearContext(ctx);\n this.renderTopLayer(ctx);\n // todo: how do i know if the after:render is for the top or normal contex?\n this.fire('after:render', { ctx });\n }\n\n /**\n * Set the canvas tolerance value for pixel taret find.\n * Use only integer numbers.\n * @private\n */\n setTargetFindTolerance(value: number) {\n value = Math.round(value);\n this.targetFindTolerance = value;\n const retina = this.getRetinaScaling();\n const size = Math.ceil((value * 2 + 1) * retina);\n this.pixelFindCanvasEl.width = this.pixelFindCanvasEl.height = size;\n this.pixelFindContext.scale(retina, retina);\n }\n\n /**\n * Returns true if object is transparent at a certain location\n * Clarification: this is `is target transparent at location X or are controls there`\n * @TODO this seems dumb that we treat controls with transparency. we can find controls\n * programmatically without painting them, the cache canvas optimization is always valid\n * @param {FabricObject} target Object to check\n * @param {Number} x Left coordinate in viewport space\n * @param {Number} y Top coordinate in viewport space\n * @return {Boolean}\n */\n isTargetTransparent(target: FabricObject, x: number, y: number): boolean {\n const tolerance = this.targetFindTolerance;\n const ctx = this.pixelFindContext;\n this.clearContext(ctx);\n ctx.save();\n ctx.translate(-x + tolerance, -y + tolerance);\n ctx.transform(...this.viewportTransform);\n const selectionBgc = target.selectionBackgroundColor;\n target.selectionBackgroundColor = '';\n target.render(ctx);\n target.selectionBackgroundColor = selectionBgc;\n ctx.restore();\n // our canvas is square, and made around tolerance.\n // so tolerance in this case also represent the center of the canvas.\n const enhancedTolerance = Math.round(tolerance * this.getRetinaScaling());\n return isTransparent(\n ctx,\n enhancedTolerance,\n enhancedTolerance,\n enhancedTolerance,\n );\n }\n\n /**\n * takes an event and determines if selection key has been pressed\n * @private\n * @param {TPointerEvent} e Event object\n */\n _isSelectionKeyPressed(e: TPointerEvent): boolean {\n const sKey = this.selectionKey;\n if (!sKey) {\n return false;\n }\n if (Array.isArray(sKey)) {\n return !!sKey.find((key) => !!key && e[key] === true);\n } else {\n return e[sKey];\n }\n }\n\n /**\n * @private\n * @param {TPointerEvent} e Event object\n * @param {FabricObject} target\n */\n _shouldClearSelection(\n e: TPointerEvent,\n target?: FabricObject,\n ): target is undefined {\n const activeObjects = this.getActiveObjects(),\n activeObject = this._activeObject;\n\n return !!(\n !target ||\n (target &&\n activeObject &&\n activeObjects.length > 1 &&\n activeObjects.indexOf(target) === -1 &&\n activeObject !== target &&\n !this._isSelectionKeyPressed(e)) ||\n (target && !target.evented) ||\n (target && !target.selectable && activeObject && activeObject !== target)\n );\n }\n\n /**\n * This method will take in consideration a modifier key pressed and the control we are\n * about to drag, and try to guess the anchor point ( origin ) of the transormation.\n * This should be really in the realm of controls, and we should remove specific code for legacy\n * embedded actions.\n * @TODO this probably deserve discussion/rediscovery and change/refactor\n * @private\n * @deprecated\n * @param {FabricObject} target\n * @param {string} action\n * @param {boolean} altKey\n * @returns {boolean} true if the transformation should be centered\n */\n private _shouldCenterTransform(\n target: FabricObject,\n action: string,\n modifierKeyPressed: boolean,\n ) {\n if (!target) {\n return;\n }\n\n let centerTransform;\n\n if (\n action === SCALE ||\n action === SCALE_X ||\n action === SCALE_Y ||\n action === RESIZING\n ) {\n centerTransform = this.centeredScaling || target.centeredScaling;\n } else if (action === ROTATE) {\n centerTransform = this.centeredRotation || target.centeredRotation;\n }\n\n return centerTransform ? !modifierKeyPressed : modifierKeyPressed;\n }\n\n /**\n * Given the control clicked, determine the origin of the transform.\n * This is bad because controls can totally have custom names\n * should disappear before release 4.0\n * Fabric 7.1, jan 2026 we are still using this.\n * Needs to go.\n * @private\n * @deprecated\n */\n _getOriginFromCorner(\n target: FabricObject,\n controlName: string,\n ): { x: TOriginX; y: TOriginY } {\n const origin = controlName\n ? target.controls[controlName].getTransformAnchorPoint()\n : {\n x: target.originX,\n y: target.originY,\n };\n\n if (!controlName) {\n return origin;\n }\n\n // this part down here is deprecated.\n // It is left to do not change the standard behavior in the middle of a major version\n // but when possible `getTransformAnchorPoint` will be the only source of truth\n // is a left control ?\n if (['ml', 'tl', 'bl'].includes(controlName)) {\n origin.x = RIGHT;\n // is a right control ?\n } else if (['mr', 'tr', 'br'].includes(controlName)) {\n origin.x = LEFT;\n }\n // is a top control ?\n if (['tl', 'mt', 'tr'].includes(controlName)) {\n origin.y = BOTTOM;\n // is a bottom control ?\n } else if (['bl', 'mb', 'br'].includes(controlName)) {\n origin.y = TOP;\n }\n return origin;\n }\n\n /**\n * @private\n * @param {Event} e Event object\n * @param {FabricObject} target\n * @param {boolean} [alreadySelected] pass true to setup the active control\n */\n _setupCurrentTransform(\n e: TPointerEvent,\n target: FabricObject,\n alreadySelected: boolean,\n ): void {\n const pointer = target.group\n ? // transform pointer to target's containing coordinate plane\n sendPointToPlane(\n this.getScenePoint(e),\n undefined,\n target.group.calcTransformMatrix(),\n )\n : this.getScenePoint(e);\n const { key: corner = '', control } = target.getActiveControl() || {},\n actionHandler =\n alreadySelected && control\n ? control.getActionHandler(e, target, control)?.bind(control)\n : dragHandler,\n action = getActionFromCorner(alreadySelected, corner, e, target),\n altKey = e[this.centeredKey as ModifierKey],\n origin = this._shouldCenterTransform(target, action, altKey)\n ? ({ x: CENTER, y: CENTER } as const)\n : this._getOriginFromCorner(target, corner),\n {\n scaleX,\n scaleY,\n skewX,\n skewY,\n left,\n top,\n angle,\n width,\n height,\n cropX,\n cropY,\n } = target as FabricImage,\n /**\n * relative to target's containing coordinate plane\n * both agree on every point\n **/\n transform: Transform = {\n target,\n action,\n actionHandler,\n actionPerformed: false,\n corner,\n scaleX,\n scaleY,\n skewX,\n skewY,\n offsetX: pointer.x - left,\n offsetY: pointer.y - top,\n originX: origin.x,\n originY: origin.y,\n ex: pointer.x,\n ey: pointer.y,\n lastX: pointer.x,\n lastY: pointer.y,\n theta: degreesToRadians(angle),\n width,\n height,\n shiftKey: e.shiftKey,\n altKey,\n original: {\n ...saveObjectTransform(target),\n originX: origin.x,\n originY: origin.y,\n cropX,\n cropY,\n },\n };\n\n this._currentTransform = transform;\n\n this.fire('before:transform', {\n e,\n transform,\n });\n }\n\n /**\n * Set the cursor type of the canvas element\n * @param {String} value Cursor type of the canvas element.\n * @see http://www.w3.org/TR/css3-ui/#cursor\n */\n setCursor(value: CSSStyleDeclaration['cursor']): void {\n this.upperCanvasEl.style.cursor = value;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx to draw the selection on\n */\n _drawSelection(ctx: CanvasRenderingContext2D): void {\n const { x, y, deltaX, deltaY } = this._groupSelector!,\n start = new Point(x, y).transform(this.viewportTransform),\n extent = new Point(x + deltaX, y + deltaY).transform(\n this.viewportTransform,\n ),\n strokeOffset = this.selectionLineWidth / 2;\n let minX = Math.min(start.x, extent.x),\n minY = Math.min(start.y, extent.y),\n maxX = Math.max(start.x, extent.x),\n maxY = Math.max(start.y, extent.y);\n\n if (this.selectionColor) {\n ctx.fillStyle = this.selectionColor;\n ctx.fillRect(minX, minY, maxX - minX, maxY - minY);\n }\n\n if (!this.selectionLineWidth || !this.selectionBorderColor) {\n return;\n }\n ctx.lineWidth = this.selectionLineWidth;\n ctx.strokeStyle = this.selectionBorderColor;\n\n minX += strokeOffset;\n minY += strokeOffset;\n maxX -= strokeOffset;\n maxY -= strokeOffset;\n // selection border\n // @TODO: is _setLineDash still necessary on modern canvas?\n FabricObject.prototype._setLineDash.call(\n this,\n ctx,\n this.selectionDashArray,\n );\n ctx.strokeRect(minX, minY, maxX - minX, maxY - minY);\n }\n\n /**\n * This function is in charge of deciding which is the object that is the current target of an interaction event.\n * For interaction event we mean a pointer related action on the canvas.\n * Which is the\n * 11/09/2018 TODO: would be cool if findTarget could discern between being a full target\n * or the outside part of the corner.\n * @param {Event} e mouse event\n * @return {TargetsInfoWithContainer} the target found\n */\n findTarget(e: TPointerEvent): FullTargetsInfoWithContainer {\n // this._targetInfo is cached by _cacheTransformEventData\n // and destroyed by _resetTransformEventData\n if (this._targetInfo) {\n return this._targetInfo;\n }\n\n if (this.skipTargetFind) {\n return {\n subTargets: [],\n currentSubTargets: [],\n };\n }\n\n const pointer = this.getScenePoint(e),\n activeObject = this._activeObject,\n aObjects = this.getActiveObjects(),\n targetInfo = this.searchPossibleTargets(this._objects, pointer);\n\n const {\n subTargets: currentSubTargets,\n container: currentContainer,\n target: currentTarget,\n } = targetInfo;\n\n const fullTargetInfo: FullTargetsInfoWithContainer = {\n ...targetInfo,\n currentSubTargets,\n currentContainer,\n currentTarget,\n };\n\n // simplest case no active object, return a new target\n if (!activeObject) {\n return fullTargetInfo;\n }\n\n // check pointer is over active selection and possibly perform `subTargetCheck`\n const activeObjectTargetInfo: FullTargetsInfoWithContainer = {\n ...this.searchPossibleTargets([activeObject], pointer),\n currentSubTargets,\n currentContainer,\n currentTarget,\n };\n\n const activeObjectControl = activeObject.findControl(\n this.getViewportPoint(e),\n isTouchEvent(e),\n );\n\n // we are clicking exactly the control of an active object, shortcut to that object.\n if (activeObjectControl) {\n return {\n ...activeObjectTargetInfo,\n target: activeObject, // we override target in case we are in the outside part of the corner.\n };\n }\n\n // in case we are over the active object\n if (activeObjectTargetInfo.target) {\n if (aObjects.length > 1) {\n // in case of active selection and target hit over the activeSelection, just exit\n // TODO Verify if we need to override target with container\n return activeObjectTargetInfo;\n }\n // from here onward not an active selection, just an activeOject that maybe is a group\n\n // preserveObjectStacking is false, so activeObject is drawn on top, just return activeObject\n if (!this.preserveObjectStacking) {\n // TODO Verify if we need to override target with container\n return activeObjectTargetInfo;\n }\n\n // In case we are in preserveObjectStacking ( selection in stack )\n // there is the possibility to force with `altSelectionKey` to return the activeObject\n // from any point in the stack, even if we have another object completely on top of it.\n if (\n this.preserveObjectStacking &&\n e[this.altSelectionKey as ModifierKey]\n ) {\n // TODO Verify if we need to override target with container\n return activeObjectTargetInfo;\n }\n }\n\n // we have an active object, but we ruled out it being our target in any way.\n return fullTargetInfo;\n }\n\n /**\n * Checks if the point is inside the object selection area including padding\n * @param {FabricObject} obj Object to test against\n * @param {Object} [pointer] point in scene coordinates\n * @return {Boolean} true if point is contained within an area of given object\n * @private\n */\n private _pointIsInObjectSelectionArea(obj: FabricObject, point: Point) {\n // getCoords will already take care of group de-nesting\n let coords = obj.getCoords();\n const viewportZoom = this.getZoom();\n const padding = obj.padding / viewportZoom;\n if (padding) {\n const [tl, tr, br, bl] = coords;\n // what is the angle of the object?\n // we could use getTotalAngle, but is way easier to look at it\n // from how coords are oriented, since if something went wrong\n // at least we are consistent.\n const angleRadians = Math.atan2(tr.y - tl.y, tr.x - tl.x),\n cosP = cos(angleRadians) * padding,\n sinP = sin(angleRadians) * padding,\n cosPSinP = cosP + sinP,\n cosPMinusSinP = cosP - sinP;\n\n coords = [\n new Point(tl.x - cosPMinusSinP, tl.y - cosPSinP),\n new Point(tr.x + cosPSinP, tr.y - cosPMinusSinP),\n new Point(br.x + cosPMinusSinP, br.y + cosPSinP),\n new Point(bl.x - cosPSinP, bl.y + cosPMinusSinP),\n ];\n // in case of padding we calculate the new coords on the fly.\n // otherwise we have to maintain 2 sets of coordinates for everything.\n // we can reiterate on storing them.\n // if this is slow, for now the semplification is large and doesn't impact\n // rendering.\n // the idea behind this is that outside target check we don't need ot know\n // where those coords are\n }\n return Intersection.isPointInPolygon(point, coords);\n }\n\n /**\n * Checks point is inside the object selection condition. Either area with padding\n * or over pixels if perPixelTargetFind is enabled\n * @param {FabricObject} obj Object to test against\n * @param {Point} pointer point from scene.\n * @return {Boolean} true if point is contained within an area of given object\n * @private\n */\n _checkTarget(obj: FabricObject, pointer: Point): boolean {\n if (\n obj &&\n obj.visible &&\n obj.evented &&\n this._pointIsInObjectSelectionArea(obj, pointer)\n ) {\n if (\n (this.perPixelTargetFind || obj.perPixelTargetFind) &&\n !(obj as unknown as IText).isEditing\n ) {\n const viewportPoint = pointer.transform(this.viewportTransform);\n if (!this.isTargetTransparent(obj, viewportPoint.x, viewportPoint.y)) {\n return true;\n }\n } else {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Given an array of objects search possible targets under the pointer position\n * Returns an\n * @param {Array} objects objects array to look into\n * @param {Object} pointer x,y object of point of scene coordinates we want to check.\n * @param {Object} subTargets If passed, subtargets will be collected inside the array\n * @return {TargetsInfo} **top most object from given `objects`** that contains pointer\n * @private\n */\n _searchPossibleTargets(\n objects: FabricObject[],\n pointer: Point,\n subTargets: FabricObject[],\n ): TargetsInfo {\n let i = objects.length;\n // Do not check for currently grouped objects, since we check the parent group itself.\n // until we call this function specifically to search inside the activeGroup\n while (i--) {\n const target = objects[i];\n if (this._checkTarget(target, pointer)) {\n if (isCollection(target) && target.subTargetCheck) {\n const { target: subTarget } = this._searchPossibleTargets(\n target._objects,\n pointer,\n subTargets,\n );\n subTarget && subTargets.push(subTarget);\n }\n return {\n target,\n subTargets,\n };\n }\n }\n return {\n subTargets: [],\n };\n }\n\n /**\n * Search inside an objects array the fiurst object that contains pointer\n * Collect subTargets of that object inside the subTargets array passed as parameter\n * @param {FabricObject[]} objects objects array to look into\n * @param {Point} pointer coordinates from viewport to check.\n * @return {FabricObject} **top most object on screen** that contains pointer\n */\n searchPossibleTargets(\n objects: FabricObject[],\n pointer: Point,\n ): TargetsInfoWithContainer {\n const targetInfo: TargetsInfoWithContainer = this._searchPossibleTargets(\n objects,\n pointer,\n [],\n );\n\n // outermost target is the container.\n targetInfo.container = targetInfo.target;\n const { container, subTargets } = targetInfo;\n\n if (\n container &&\n isCollection(container) &&\n container.interactive &&\n subTargets[0]\n ) {\n /** subTargets[0] is the innermost nested target, but it could be inside non interactive groups\n * and so not a possible selection target.\n * We loop the array from the end that is outermost innertarget.\n */\n for (let i = subTargets.length - 1; i > 0; i--) {\n const t = subTargets[i];\n if (!(isCollection(t) && t.interactive)) {\n // one of the subtargets was not interactive. that is the last subtarget we can return.\n // we can't dig more deep;\n targetInfo.target = t;\n return targetInfo;\n }\n }\n targetInfo.target = subTargets[0];\n return targetInfo;\n }\n\n return targetInfo;\n }\n\n /**\n * @returns point existing in the same plane as the {@link HTMLCanvasElement},\n * `(0, 0)` being the top left corner of the {@link HTMLCanvasElement}.\n * This means that changes to the {@link viewportTransform} do not change the values of the point\n * and it remains unchanged from the viewer's perspective.\n *\n * @example\n * const scenePoint = sendPointToPlane(\n * this.getViewportPoint(e),\n * undefined,\n * canvas.viewportTransform\n * );\n *\n */\n getViewportPoint(e: TPointerEvent) {\n if (this._viewportPoint) {\n return this._viewportPoint;\n }\n return this._getPointerImpl(e, true);\n }\n\n /**\n * @returns point existing in the scene (the same plane as the plane {@link FabricObject#getCenterPoint} exists in).\n * This means that changes to the {@link viewportTransform} do not change the values of the point,\n * however, from the viewer's perspective, the point is changed.\n *\n * @example\n * const viewportPoint = sendPointToPlane(\n * this.getScenePoint(e),\n * canvas.viewportTransform\n * );\n *\n */\n getScenePoint(e: TPointerEvent) {\n if (this._scenePoint) {\n return this._scenePoint;\n }\n return this._getPointerImpl(e);\n }\n\n /**\n * Returns pointer relative to canvas.\n *\n * Use {@link getViewportPoint} or {@link getScenePoint} instead.\n *\n * @param {Event} e\n * @param {Boolean} [fromViewport] whether to return the point from the viewport or in the scene\n * @return {Point}\n */\n protected _getPointerImpl(e: TPointerEvent, fromViewport = false): Point {\n const upperCanvasEl = this.upperCanvasEl,\n bounds = upperCanvasEl.getBoundingClientRect();\n let pointer = getPointer(e),\n boundsWidth = bounds.width || 0,\n boundsHeight = bounds.height || 0;\n\n if (!boundsWidth || !boundsHeight) {\n if (TOP in bounds && BOTTOM in bounds) {\n boundsHeight = Math.abs(bounds.top - bounds.bottom);\n }\n if (RIGHT in bounds && LEFT in bounds) {\n boundsWidth = Math.abs(bounds.right - bounds.left);\n }\n }\n\n this.calcOffset();\n pointer.x = pointer.x - this._offset.left;\n pointer.y = pointer.y - this._offset.top;\n if (!fromViewport) {\n pointer = sendPointToPlane(pointer, undefined, this.viewportTransform);\n }\n\n const retinaScaling = this.getRetinaScaling();\n if (retinaScaling !== 1) {\n pointer.x /= retinaScaling;\n pointer.y /= retinaScaling;\n }\n\n // If bounds are not available (i.e. not visible), do not apply scale.\n const cssScale =\n boundsWidth === 0 || boundsHeight === 0\n ? new Point(1, 1)\n : new Point(\n upperCanvasEl.width / boundsWidth,\n upperCanvasEl.height / boundsHeight,\n );\n\n return pointer.multiply(cssScale);\n }\n\n /**\n * Internal use only\n * @protected\n */\n protected _setDimensionsImpl(\n dimensions: TSize,\n options?: TCanvasSizeOptions,\n ) {\n // @ts-expect-error this method exists in the subclass - should be moved or declared as abstract\n this._resetTransformEventData();\n super._setDimensionsImpl(dimensions, options);\n if (this._isCurrentlyDrawing) {\n this.freeDrawingBrush &&\n this.freeDrawingBrush._setBrushStyles(this.contextTop);\n }\n }\n\n protected _createCacheCanvas() {\n this.pixelFindCanvasEl = createCanvasElement();\n this.pixelFindContext = this.pixelFindCanvasEl.getContext('2d', {\n willReadFrequently: true,\n })!;\n this.setTargetFindTolerance(this.targetFindTolerance);\n }\n\n /**\n * Returns context of top canvas where interactions are drawn\n * @returns {CanvasRenderingContext2D}\n */\n getTopContext(): CanvasRenderingContext2D {\n return this.elements.upper.ctx;\n }\n\n /**\n * Returns context of canvas where object selection is drawn\n * @alias\n * @return {CanvasRenderingContext2D}\n */\n getSelectionContext(): CanvasRenderingContext2D {\n return this.elements.upper.ctx;\n }\n\n /**\n * Returns <canvas> element on which object selection is drawn\n * @return {HTMLCanvasElement}\n */\n getSelectionElement(): HTMLCanvasElement {\n return this.elements.upper.el;\n }\n\n /**\n * Returns currently active object\n * @return {FabricObject | null} active object\n */\n getActiveObject(): FabricObject | undefined {\n return this._activeObject;\n }\n\n /**\n * Returns an array with the current selected objects\n * @return {FabricObject[]} active objects array\n */\n getActiveObjects(): FabricObject[] {\n const active = this._activeObject;\n return isActiveSelection(active)\n ? active.getObjects()\n : active\n ? [active]\n : [];\n }\n\n /**\n * @private\n * Compares the old activeObject with the current one and fires correct events\n * @param {FabricObject[]} oldObjects old activeObject\n * @param {TPointerEvent} e mouse event triggering the selection events\n */\n _fireSelectionEvents(oldObjects: FabricObject[], e?: TPointerEvent) {\n let somethingChanged = false,\n invalidate = false;\n const objects = this.getActiveObjects(),\n added: FabricObject[] = [],\n removed: FabricObject[] = [];\n\n oldObjects.forEach((target) => {\n if (!objects.includes(target)) {\n somethingChanged = true;\n target.fire('deselected', {\n e,\n target,\n });\n removed.push(target);\n }\n });\n\n objects.forEach((target) => {\n if (!oldObjects.includes(target)) {\n somethingChanged = true;\n target.fire('selected', {\n e,\n target,\n });\n added.push(target);\n }\n });\n\n if (oldObjects.length > 0 && objects.length > 0) {\n invalidate = true;\n somethingChanged &&\n this.fire('selection:updated', {\n e,\n selected: added,\n deselected: removed,\n });\n } else if (objects.length > 0) {\n invalidate = true;\n this.fire('selection:created', {\n e,\n selected: added,\n });\n } else if (oldObjects.length > 0) {\n invalidate = true;\n this.fire('selection:cleared', {\n e,\n deselected: removed,\n });\n }\n invalidate && (this._objectsToRender = undefined);\n }\n\n /**\n * Sets given object as the only active object on canvas\n * @param {FabricObject} object Object to set as an active one\n * @param {TPointerEvent} [e] Event (passed along when firing \"object:selected\")\n * @return {Boolean} true if the object has been selected\n */\n setActiveObject(object: FabricObject, e?: TPointerEvent) {\n // we can't inline this, since _setActiveObject will change what getActiveObjects returns\n const currentActives = this.getActiveObjects();\n const selected = this._setActiveObject(object, e);\n this._fireSelectionEvents(currentActives, e);\n return selected;\n }\n\n /**\n * This is supposed to be equivalent to setActiveObject but without firing\n * any event. There is commitment to have this stay this way.\n * This is the functional part of setActiveObject.\n * @param {Object} object to set as active\n * @param {Event} [e] Event (passed along when firing \"object:selected\")\n * @return {Boolean} true if the object has been selected\n */\n _setActiveObject(object: FabricObject, e?: TPointerEvent) {\n const prevActiveObject = this._activeObject;\n if (prevActiveObject === object) {\n return false;\n }\n // after calling this._discardActiveObject, this,_activeObject could be undefined\n if (!this._discardActiveObject(e, object) && this._activeObject) {\n // refused to deselect\n return false;\n }\n if (object.onSelect({ e })) {\n return false;\n }\n\n this._activeObject = object;\n\n if (isActiveSelection(object) && prevActiveObject !== object) {\n object.set('canvas', this);\n }\n object.setCoords();\n\n return true;\n }\n\n /**\n * This is supposed to be equivalent to discardActiveObject but without firing\n * any selection events ( can still fire object transformation events ). There is commitment to have this stay this way.\n * This is the functional part of discardActiveObject.\n * @param {Event} [e] Event (passed along when firing \"object:deselected\")\n * @param {Object} object the next object to set as active, reason why we are discarding this\n * @return {Boolean} true if the active object has been discarded\n */\n _discardActiveObject(\n e?: TPointerEvent,\n object?: FabricObject,\n ): this is { _activeObject: undefined } {\n const obj = this._activeObject;\n if (obj) {\n // onDeselect return TRUE to cancel selection;\n if (obj.onDeselect({ e, object })) {\n return false;\n }\n if (this._currentTransform && this._currentTransform.target === obj) {\n this.endCurrentTransform(e);\n }\n if (isActiveSelection(obj) && obj === this._hoveredTarget) {\n this._hoveredTarget = undefined;\n }\n this._activeObject = undefined;\n return true;\n }\n return false;\n }\n\n /**\n * Discards currently active object and fire events. If the function is called by fabric\n * as a consequence of a mouse event, the event is passed as a parameter and\n * sent to the fire function for the custom events. When used as a method the\n * e param does not have any application.\n * @param {event} e\n * @return {Boolean} true if the active object has been discarded\n */\n discardActiveObject(e?: TPointerEvent): this is { _activeObject: undefined } {\n const currentActives = this.getActiveObjects(),\n activeObject = this.getActiveObject();\n if (currentActives.length) {\n this.fire('before:selection:cleared', {\n e,\n deselected: [activeObject!],\n });\n }\n const discarded = this._discardActiveObject(e);\n this._fireSelectionEvents(currentActives, e);\n return discarded;\n }\n\n /**\n * End the current transform.\n * You don't usually need to call this method unless you are interrupting a user initiated transform\n * because of some other event ( a press of key combination, or something that block the user UX )\n * @param {Event} [e] send the mouse event that generate the finalize down, so it can be used in the event\n */\n endCurrentTransform(e?: TPointerEvent) {\n const transform = this._currentTransform;\n this._finalizeCurrentTransform(e);\n if (transform && transform.target) {\n // this could probably go inside _finalizeCurrentTransform\n transform.target.isMoving = false;\n }\n this._currentTransform = null;\n }\n\n /**\n * @private\n * @param {Event} e send the mouse event that generate the finalize down, so it can be used in the event\n */\n _finalizeCurrentTransform(e?: TPointerEvent) {\n const transform = this._currentTransform!,\n target = transform.target,\n options = {\n e,\n target,\n transform,\n action: transform.action,\n };\n\n if (target._scaling) {\n target._scaling = false;\n }\n\n target.setCoords();\n\n if (transform.actionPerformed) {\n this.fire('object:modified', options);\n target.fire(MODIFIED, options);\n }\n }\n\n /**\n * Sets viewport transformation of this canvas instance\n * @param {Array} vpt a Canvas 2D API transform matrix\n */\n setViewportTransform(vpt: TMat2D) {\n super.setViewportTransform(vpt);\n const activeObject = this._activeObject;\n if (activeObject) {\n activeObject.setCoords();\n }\n }\n\n /**\n * @override clears active selection ref and interactive canvas elements and contexts\n */\n destroy() {\n // dispose of active selection\n const activeObject = this._activeObject;\n if (isActiveSelection(activeObject)) {\n activeObject.removeAll();\n activeObject.dispose();\n }\n\n delete this._activeObject;\n\n super.destroy();\n\n // free resources\n\n // pixel find canvas\n // @ts-expect-error disposing\n this.pixelFindContext = null;\n // @ts-expect-error disposing\n this.pixelFindCanvasEl = undefined;\n }\n\n /**\n * Clears all contexts (background, main, top) of an instance\n */\n clear() {\n // discard active object and fire events\n this.discardActiveObject();\n // make sure we clear the active object in case it refused to be discarded\n this._activeObject = undefined;\n this.clearContext(this.contextTop);\n super.clear();\n }\n\n /**\n * Draws objects' controls (borders/controls)\n * @param {CanvasRenderingContext2D} ctx Context to render controls on\n */\n drawControls(ctx: CanvasRenderingContext2D) {\n const activeObject = this._activeObject;\n\n if (activeObject) {\n activeObject._renderControls(ctx);\n }\n }\n\n /**\n * @private\n */\n protected _toObject(\n instance: FabricObject,\n methodName: 'toObject' | 'toDatalessObject',\n propertiesToInclude: string[],\n ): Record<string, any> {\n // If the object is part of the current selection group, it should\n // be transformed appropriately\n // i.e. it should be serialised as it would appear if the selection group\n // were to be destroyed.\n const originalProperties = this._realizeGroupTransformOnObject(instance),\n object = super._toObject(instance, methodName, propertiesToInclude);\n //Undo the damage we did by changing all of its properties\n instance.set(originalProperties);\n return object;\n }\n\n /**\n * Realizes an object's group transformation on it\n * @private\n * @param {FabricObject} [instance] the object to transform (gets mutated)\n * @returns the original values of instance which were changed\n */\n private _realizeGroupTransformOnObject(\n instance: FabricObject,\n ): Partial<typeof instance> {\n const { group } = instance;\n if (group && isActiveSelection(group) && this._activeObject === group) {\n const layoutProps = [\n 'angle',\n 'flipX',\n 'flipY',\n LEFT,\n SCALE_X,\n SCALE_Y,\n SKEW_X,\n SKEW_Y,\n TOP,\n ] as (keyof typeof instance)[];\n const originalValues = pick<typeof instance>(instance, layoutProps);\n addTransformToObject(instance, group.calcOwnMatrix());\n return originalValues;\n } else {\n return {};\n }\n }\n\n /**\n * @private\n */\n _setSVGObject(\n markup: string[],\n instance: FabricObject,\n reviver?: TSVGReviver,\n ) {\n // If the object is in a selection group, simulate what would happen to that\n // object when the group is deselected\n const originalProperties = this._realizeGroupTransformOnObject(instance);\n super._setSVGObject(markup, instance, reviver);\n instance.set(originalProperties);\n }\n}\n"],"names":["SelectableCanvas","StaticCanvas","constructor","arguments","_defineProperty","getDefaults","ownDefaults","upperCanvasEl","_this$elements$upper","elements","upper","el","contextTop","_this$elements$upper2","ctx","wrapperEl","container","initElements","CanvasDOMManager","allowTouchScrolling","containerClass","_createCacheCanvas","_onObjectAdded","obj","_objectsToRender","undefined","_onObjectRemoved","_activeObject","fire","deselected","_discardActiveObject","target","_hoveredTarget","_hoveredTargets","_onStackOrderChanged","_chooseObjectsToRender","activeObject","preserveObjectStacking","_objects","filter","object","group","concat","renderAll","cancelRequestedRender","destroyed","contextTopDirty","_groupSelector","isDrawingMode","clearContext","hasLostContext","renderTopLayer","renderCanvas","getContext","save","_isCurrentlyDrawing","freeDrawingBrush","_render","selection","_drawSelection","restore","renderTop","setTargetFindTolerance","value","Math","round","targetFindTolerance","retina","getRetinaScaling","size","ceil","pixelFindCanvasEl","width","height","pixelFindContext","scale","isTargetTransparent","x","y","tolerance","translate","transform","viewportTransform","selectionBgc","selectionBackgroundColor","render","enhancedTolerance","isTransparent","_isSelectionKeyPressed","e","sKey","selectionKey","Array","isArray","find","key","_shouldClearSelection","activeObjects","getActiveObjects","length","indexOf","evented","selectable","_shouldCenterTransform","action","modifierKeyPressed","centerTransform","SCALE","SCALE_X","SCALE_Y","RESIZING","centeredScaling","ROTATE","centeredRotation","_getOriginFromCorner","controlName","origin","controls","getTransformAnchorPoint","originX","originY","includes","RIGHT","LEFT","BOTTOM","TOP","_setupCurrentTransform","alreadySelected","_control$getActionHan","pointer","sendPointToPlane","getScenePoint","calcTransformMatrix","corner","control","getActiveControl","actionHandler","getActionHandler","bind","dragHandler","getActionFromCorner","altKey","centeredKey","CENTER","scaleX","scaleY","skewX","skewY","left","top","angle","cropX","cropY","actionPerformed","offsetX","offsetY","ex","ey","lastX","lastY","theta","degreesToRadians","shiftKey","original","saveObjectTransform","_currentTransform","setCursor","style","cursor","deltaX","deltaY","start","Point","extent","strokeOffset","selectionLineWidth","minX","min","minY","maxX","max","maxY","selectionColor","fillStyle","fillRect","selectionBorderColor","lineWidth","strokeStyle","FabricObject","prototype","_setLineDash","call","selectionDashArray","strokeRect","findTarget","_targetInfo","skipTargetFind","subTargets","currentSubTargets","aObjects","targetInfo","searchPossibleTargets","currentContainer","currentTarget","fullTargetInfo","activeObjectTargetInfo","activeObjectControl","findControl","getViewportPoint","isTouchEvent","altSelectionKey","_pointIsInObjectSelectionArea","point","coords","getCoords","viewportZoom","getZoom","padding","tl","tr","br","bl","angleRadians","atan2","cosP","cos","sinP","sin","cosPSinP","cosPMinusSinP","Intersection","isPointInPolygon","_checkTarget","visible","perPixelTargetFind","isEditing","viewportPoint","_searchPossibleTargets","objects","i","isCollection","subTargetCheck","subTarget","push","interactive","t","_viewportPoint","_getPointerImpl","_scenePoint","fromViewport","bounds","getBoundingClientRect","getPointer","boundsWidth","boundsHeight","abs","bottom","right","calcOffset","_offset","retinaScaling","cssScale","multiply","_setDimensionsImpl","dimensions","options","_resetTransformEventData","_setBrushStyles","createCanvasElement","willReadFrequently","getTopContext","getSelectionContext","getSelectionElement","getActiveObject","active","isActiveSelection","getObjects","_fireSelectionEvents","oldObjects","somethingChanged","invalidate","added","removed","forEach","selected","setActiveObject","currentActives","_setActiveObject","prevActiveObject","onSelect","set","setCoords","onDeselect","endCurrentTransform","discardActiveObject","discarded","_finalizeCurrentTransform","isMoving","_scaling","MODIFIED","setViewportTransform","vpt","destroy","removeAll","dispose","clear","drawControls","_renderControls","_toObject","instance","methodName","propertiesToInclude","originalProperties","_realizeGroupTransformOnObject","layoutProps","SKEW_X","SKEW_Y","originalValues","pick","addTransformToObject","calcOwnMatrix","_setSVGObject","markup","reviver","canvasDefaults"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMA,gBAAgB,SACnBC,YAAY,CAEtB;EAAAC,WAAAA,GAAA;AAAA,IAAA,KAAA,CAAA,GAAAC,SAAA,CAAA;AAGE;AAQA;AAUA;AASA;AAKA;AACF;AACA;AACA;AACA;AACA;AACA;AAKE;AAKA;AACF;AACA;AACA;AACA;AAGE;AACF;AACA;AACA;AACA;AAJEC,IAAAA,eAAA,0BAKkC,EAAE,CAAA;AASpC;AACF;AACA;AACA;AACA;AACA;AALEA,IAAAA,eAAA,4BAMsC,IAAI,CAAA;AAE1C;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AAPEA,IAAAA,eAAA,yBAaW,IAAI,CAAA;AAEf;AACF;AACA;AACA;AACA;AACA;AALEA,IAAAA,eAAA,0BAMkB,KAAK,CAAA;AAAA,EAAA;EA6BvB,OAAOC,WAAWA,GAAwB;IACxC,OAAO;AAAE,MAAA,GAAG,KAAK,CAACA,WAAW,EAAE;AAAE,MAAA,GAAGL,gBAAgB,CAACM;KAAa;AACpE,EAAA;EAGA,IAAIC,aAAaA,GAAG;AAAA,IAAA,IAAAC,oBAAA;AAClB,IAAA,OAAA,CAAAA,oBAAA,GAAO,IAAI,CAACC,QAAQ,CAACC,KAAK,MAAA,IAAA,IAAAF,oBAAA,KAAA,MAAA,G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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StaticCanvas.d.ts","sourceRoot":"","sources":["../../../src/canvas/StaticCanvas.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAGzE,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACjC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,EACV,SAAS,EAET,YAAY,EACZ,eAAe,EACf,OAAO,EACP,MAAM,EACN,KAAK,EACL,WAAW,EACX,uBAAuB,EACvB,oBAAoB,EACpB,QAAQ,EACT,MAAM,aAAa,CAAC;AASrB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAStE,OAAO,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AAC9E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"StaticCanvas.d.ts","sourceRoot":"","sources":["../../../src/canvas/StaticCanvas.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{defineProperty as t}from"../../_virtual/_rollupPluginBabelHelpers.min.mjs";import{config as e}from"../config.min.mjs";import{CENTER as i,VERSION as s}from"../constants.min.mjs";import{createCollectionMixin as r,isCollection as n}from"../Collection.min.mjs";import{CommonMethods as o}from"../CommonMethods.min.mjs";import{Point as a}from"../Point.min.mjs";import{requestAnimFrame as h,cancelAnimFrame as l}from"../util/animation/AnimationFrameProvider.min.mjs";import{runningAnimations as c}from"../util/animation/AnimationRegistry.min.mjs";import{uid as d}from"../util/internals/uid.min.mjs";import{createCanvasElementFor as m,toDataURL as g,toBlob as u}from"../util/misc/dom.min.mjs";import{transformPoint as p,invertTransform as v}from"../util/misc/matrix.min.mjs";import{enlivenObjects as f,enlivenObjectEnlivables as w}from"../util/misc/objectEnlive.min.mjs";import{pick as b}from"../util/misc/pick.min.mjs";import{matrixToSVG as O}from"../util/misc/svgExport.min.mjs";import{toFixed as j}from"../util/misc/toFixed.min.mjs";import{isFiller as C,isTextObject as y,isPattern as _}from"../util/typeAssertions.min.mjs";import{StaticCanvasDOMManager as x}from"./DOMManagers/StaticCanvasDOMManager.min.mjs";import{staticCanvasDefaults as S}from"./StaticCanvasOptions.min.mjs";import{log as V,FabricError as k}from"../util/internals/console.min.mjs";import{getDevicePixelRatio as R}from"../env/index.min.mjs";class P extends(r(o)){get lowerCanvasEl(){var t;return null===(t=this.elements.lower)||void 0===t?void 0:t.el}get contextContainer(){var t;return null===(t=this.elements.lower)||void 0===t?void 0:t.ctx}static getDefaults(){return P.ownDefaults}constructor(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};super(),Object.assign(this,this.constructor.getDefaults()),this.set(e),this.initElements(t),this._setDimensionsImpl({width:this.width||this.elements.lower.el.width||0,height:this.height||this.elements.lower.el.height||0}),this.skipControlsDrawing=!1,this.viewportTransform=[...this.viewportTransform],this.calcViewportBoundaries()}initElements(t){this.elements=new x(t)}add(){const t=super.add(...arguments);return arguments.length>0&&this.renderOnAddRemove&&this.requestRenderAll(),t}insertAt(t){for(var e=arguments.length,i=new Array(e>1?e-1:0),s=1;s<e;s++)i[s-1]=arguments[s];const r=super.insertAt(t,...i);return i.length>0&&this.renderOnAddRemove&&this.requestRenderAll(),r}remove(){const t=super.remove(...arguments);return t.length>0&&this.renderOnAddRemove&&this.requestRenderAll(),t}_onObjectAdded(t){t.canvas&&t.canvas!==this&&(V("warn","Canvas is trying to add an object that belongs to a different canvas.\nResulting to default behavior: removing object from previous canvas and adding to new canvas"),t.canvas.remove(t)),t._set("canvas",this),t.setCoords(),this.fire("object:added",{target:t}),t.fire("added",{target:this})}_onObjectRemoved(t){t._set("canvas",void 0),this.fire("object:removed",{target:t}),t.fire("removed",{target:this})}_onStackOrderChanged(){this.renderOnAddRemove&&this.requestRenderAll()}getRetinaScaling(){return this.enableRetinaScaling?R():1}calcOffset(){return this._offset=this.elements.calcOffset()}getWidth(){return this.width}getHeight(){return this.height}_setDimensionsImpl(t){let{cssOnly:e=!1,backstoreOnly:i=!1}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!e){const e={width:this.width,height:this.height,...t};this.elements.setDimensions(e,this.getRetinaScaling()),this.hasLostContext=!0,this.width=e.width,this.height=e.height}i||this.elements.setCSSDimensions(t),this.calcOffset()}setDimensions(t,e){this._setDimensionsImpl(t,e),e&&e.cssOnly||this.requestRenderAll()}getZoom(){return this.viewportTransform[0]}setViewportTransform(t){this.viewportTransform=t,this.calcViewportBoundaries(),this.renderOnAddRemove&&this.requestRenderAll()}zoomToPoint(t,e){const i=t,s=[...this.viewportTransform],r=p(t,v(s));s[0]=e,s[3]=e;const n=p(r,s);s[4]+=i.x-n.x,s[5]+=i.y-n.y,this.setViewportTransform(s)}setZoom(t){this.zoomToPoint(new a(0,0),t)}absolutePan(t){const e=[...this.viewportTransform];return e[4]=-t.x,e[5]=-t.y,this.setViewportTransform(e)}relativePan(t){return this.absolutePan(new a(-t.x-this.viewportTransform[4],-t.y-this.viewportTransform[5]))}getElement(){return this.elements.lower.el}clearContext(t){t.clearRect(0,0,this.width,this.height)}getContext(){return this.elements.lower.ctx}clear(){this.remove(...this.getObjects()),this.backgroundImage=void 0,this.overlayImage=void 0,this.backgroundColor="",this.overlayColor="",this.clearContext(this.getContext()),this.fire("canvas:cleared"),this.renderOnAddRemove&&this.requestRenderAll()}renderAll(){this.cancelRequestedRender(),this.destroyed||this.renderCanvas(this.getContext(),this._objects)}renderAndReset(){this.nextRenderHandle=0,this.renderAll()}requestRenderAll(){this.nextRenderHandle||this.disposed||this.destroyed||(this.nextRenderHandle=h(()=>this.renderAndReset()))}calcViewportBoundaries(){const t=this.width,e=this.height,i=v(this.viewportTransform),s=p({x:0,y:0},i),r=p({x:t,y:e},i),n=s.min(r),o=s.max(r);return this.vptCoords={tl:n,tr:new a(o.x,n.y),bl:new a(n.x,o.y),br:o}}cancelRequestedRender(){this.nextRenderHandle&&(l(this.nextRenderHandle),this.nextRenderHandle=0)}drawControls(t){}renderCanvas(t,e){if(this.destroyed)return;const i=this.viewportTransform,s=this.clipPath;this.calcViewportBoundaries(),this.clearContext(t),t.imageSmoothingEnabled=this.imageSmoothingEnabled,t.patternQuality=this.patternQuality,this.fire("before:render",{ctx:t}),this._renderBackground(t),t.save(),t.transform(i[0],i[1],i[2],i[3],i[4],i[5]),this._renderObjects(t,e),t.restore(),this.controlsAboveOverlay||this.skipControlsDrawing||this.drawControls(t),s&&(s._set("canvas",this),s.shouldCache(),s._transformDone=!0,s.renderCache({forClipping:!0}),this.drawClipPathOnCanvas(t,s)),this._renderOverlay(t),this.controlsAboveOverlay&&!this.skipControlsDrawing&&this.drawControls(t),this.fire("after:render",{ctx:t}),this.__cleanupTask&&(this.__cleanupTask(),this.__cleanupTask=void 0)}drawClipPathOnCanvas(t,e){const i=this.viewportTransform;t.save(),t.transform(...i),t.globalCompositeOperation="destination-in",e.transform(t),t.scale(1/e.zoomX,1/e.zoomY),t.drawImage(e._cacheCanvas,-e.cacheTranslationX,-e.cacheTranslationY),t.restore()}_renderObjects(t,e){for(let i=0,s=e.length;i<s;++i)e[i]&&e[i].render(t)}_renderBackgroundOrOverlay(t,e){const i=this[`${e}Color`],s=this[`${e}Image`],r=this.viewportTransform,n=this[`${e}Vpt`];if(!i&&!s)return;const o=C(i);if(i){if(t.save(),t.beginPath(),t.moveTo(0,0),t.lineTo(this.width,0),t.lineTo(this.width,this.height),t.lineTo(0,this.height),t.closePath(),t.fillStyle=o?i.toLive(t):i,n&&t.transform(...r),o){t.transform(1,0,0,1,i.offsetX||0,i.offsetY||0);const e=i.gradientTransform||i.patternTransform;e&&t.transform(...e)}t.fill(),t.restore()}if(s){t.save();const{skipOffscreen:e}=this;this.skipOffscreen=n,n&&t.transform(...r),s.render(t),this.skipOffscreen=e,t.restore()}}_renderBackground(t){this._renderBackgroundOrOverlay(t,"background")}_renderOverlay(t){this._renderBackgroundOrOverlay(t,"overlay")}getCenterPoint(){return new a(this.width/2,this.height/2)}centerObjectH(t){return this._centerObject(t,new a(this.getCenterPoint().x,t.getCenterPoint().y))}centerObjectV(t){return this._centerObject(t,new a(t.getCenterPoint().x,this.getCenterPoint().y))}centerObject(t){return this._centerObject(t,this.getCenterPoint())}viewportCenterObject(t){return this._centerObject(t,this.getVpCenter())}viewportCenterObjectH(t){return this._centerObject(t,new a(this.getVpCenter().x,t.getCenterPoint().y))}viewportCenterObjectV(t){return this._centerObject(t,new a(t.getCenterPoint().x,this.getVpCenter().y))}getVpCenter(){return p(this.getCenterPoint(),v(this.viewportTransform))}_centerObject(t,e){t.setXY(e,i,i),t.setCoords(),this.renderOnAddRemove&&this.requestRenderAll()}toDatalessJSON(t){return this.toDatalessObject(t)}toObject(t){return this._toObjectMethod("toObject",t)}toJSON(){return this.toObject()}toDatalessObject(t){return this._toObjectMethod("toDatalessObject",t)}_toObjectMethod(t,e){const i=this.clipPath,r=i&&!i.excludeFromExport?this._toObject(i,t,e):null;return{version:s,...b(this,e),objects:this._objects.filter(t=>!t.excludeFromExport).map(i=>this._toObject(i,t,e)),...this.__serializeBgOverlay(t,e),...r?{clipPath:r}:null}}_toObject(t,e,i){let s;this.includeDefaultValues||(s=t.includeDefaultValues,t.includeDefaultValues=!1);const r=t[e](i);return this.includeDefaultValues||(t.includeDefaultValues=!!s),r}__serializeBgOverlay(t,e){const i={},s=this.backgroundImage,r=this.overlayImage,n=this.backgroundColor,o=this.overlayColor;return C(n)?n.excludeFromExport||(i.background=n.toObject(e)):n&&(i.background=n),C(o)?o.excludeFromExport||(i.overlay=o.toObject(e)):o&&(i.overlay=o),s&&!s.excludeFromExport&&(i.backgroundImage=this._toObject(s,t,e)),r&&!r.excludeFromExport&&(i.overlayImage=this._toObject(r,t,e)),i}toSVG(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=arguments.length>1?arguments[1]:void 0;t.reviver=e;const i=[];return this._setSVGPreamble(i,t),this._setSVGHeader(i,t),this.clipPath&&i.push(`<g clip-path="url(#${this.clipPath.clipPathId})" >\n`),this._setSVGBgOverlayColor(i,"background"),this._setSVGBgOverlayImage(i,"backgroundImage",e),this._setSVGObjects(i,e),this.clipPath&&i.push("</g>\n"),this._setSVGBgOverlayColor(i,"overlay"),this._setSVGBgOverlayImage(i,"overlayImage",e),i.push("</svg>"),i.join("")}_setSVGPreamble(t,e){e.suppressPreamble||t.push('<?xml version="1.0" encoding="',e.encoding||"UTF-8",'" standalone="no" ?>\n','<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" ','"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">\n')}_setSVGHeader(t,i){const r=i.width||`${this.width}`,n=i.height||`${this.height}`,o=e.NUM_FRACTION_DIGITS,a=i.viewBox;let h;if(a)h=`viewBox="${a.x} ${a.y} ${a.width} ${a.height}" `;else if(this.svgViewportTransformation){const t=this.viewportTransform;h=`viewBox="${j(-t[4]/t[0],o)} ${j(-t[5]/t[3],o)} ${j(this.width/t[0],o)} ${j(this.height/t[3],o)}" `}else h=`viewBox="0 0 ${this.width} ${this.height}" `;t.push("<svg ",'xmlns="http://www.w3.org/2000/svg" ','xmlns:xlink="http://www.w3.org/1999/xlink" ','version="1.1" ','width="',r,'" ','height="',n,'" ',h,'xml:space="preserve">\n',"<desc>Created with Fabric.js ",s,"</desc>\n","<defs>\n",this.createSVGFontFacesMarkup(),this.createSVGRefElementsMarkup(),this.createSVGClipPathMarkup(i),"</defs>\n")}createSVGClipPathMarkup(t){const e=this.clipPath;return e?(e.clipPathId=`CLIPPATH_${d()}`,`<clipPath id="${e.clipPathId}" >\n${e.toClipPathSVG(t.reviver)}</clipPath>\n`):""}createSVGRefElementsMarkup(){return["background","overlay"].map(t=>{const e=this[`${t}Color`];if(C(e)){const i=this[`${t}Vpt`],s=this.viewportTransform,r={isType:()=>!1,width:this.width/(i?s[0]:1),height:this.height/(i?s[3]:1)};return e.toSVG(r,{additionalTransform:i?O(s):""})}}).join("")}createSVGFontFacesMarkup(){const t=[],i={},s=e.fontPaths;this._objects.forEach(function e(i){t.push(i),n(i)&&i._objects.forEach(e)}),t.forEach(t=>{if(!y(t))return;const{styles:e,fontFamily:r}=t;!i[r]&&s[r]&&(i[r]=!0,e&&Object.values(e).forEach(t=>{Object.values(t).forEach(t=>{let{fontFamily:e=""}=t;!i[e]&&s[e]&&(i[e]=!0)})}))});const r=Object.keys(i).map(t=>`\t\t@font-face {\n\t\t\tfont-family: '${t}';\n\t\t\tsrc: url('${s[t]}');\n\t\t}\n`).join("");return r?`\t<style type="text/css"><![CDATA[\n${r}]]></style>\n`:""}_setSVGObjects(t,e){this.forEachObject(i=>{i.excludeFromExport||this._setSVGObject(t,i,e)})}_setSVGObject(t,e,i){t.push(e.toSVG(i))}_setSVGBgOverlayImage(t,e,i){const s=this[e];s&&!s.excludeFromExport&&s.toSVG&&t.push(s.toSVG(i))}_setSVGBgOverlayColor(t,e){const i=this[`${e}Color`];if(i)if(C(i)){const s=i.repeat||"",r=this.width,n=this.height,o=this[`${e}Vpt`]?O(v(this.viewportTransform)):"";t.push(`<rect transform="${o} translate(${r/2},${n/2})" x="${i.offsetX-r/2}" y="${i.offsetY-n/2}" width="${"repeat-y"!==s&&"no-repeat"!==s||!_(i)?r:i.source.width}" height="${"repeat-x"!==s&&"no-repeat"!==s||!_(i)?n:i.source.height}" fill="url(#SVGID_${i.id})"></rect>\n`)}else t.push('<rect x="0" y="0" width="100%" height="100%" ','fill="',i,'"',"></rect>\n")}loadFromJSON(t,e){let{signal:i}=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(!t)return Promise.reject(new k("`json` is undefined"));const{objects:s=[],...r}="string"==typeof t?JSON.parse(t):t,{backgroundImage:n,background:o,overlayImage:a,overlay:h,clipPath:l}=r,c=this.renderOnAddRemove;return this.renderOnAddRemove=!1,Promise.all([f(s,{reviver:e,signal:i}),w({backgroundImage:n,backgroundColor:o,overlayImage:a,overlayColor:h,clipPath:l},{signal:i})]).then(t=>{let[e,i]=t;return this.clear(),this.add(...e),this.set(r),this.set(i),this.renderOnAddRemove=c,this})}clone(t){const e=this.toObject(t);return this.cloneWithoutData().loadFromJSON(e)}cloneWithoutData(){const t=m(this);return new this.constructor(t)}toDataURL(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const{format:e="png",quality:i=1,multiplier:s=1,enableRetinaScaling:r=!1}=t,n=s*(r?this.getRetinaScaling():1);return g(this.toCanvasElement(n,t),e,i)}toBlob(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const{format:e="png",quality:i=1,multiplier:s=1,enableRetinaScaling:r=!1}=t,n=s*(r?this.getRetinaScaling():1);return u(this.toCanvasElement(n,t),e,i)}toCanvasElement(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,{width:e,height:i,left:s,top:r,filter:n}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const o=(e||this.width)*t,a=(i||this.height)*t,h=this.getZoom(),l=this.width,c=this.height,d=this.skipControlsDrawing,g=h*t,u=this.viewportTransform,p=[g,0,0,g,(u[4]-(s||0))*t,(u[5]-(r||0))*t],v=this.enableRetinaScaling,f=m({width:o,height:a}),w=n?this._objects.filter(t=>n(t)):this._objects;return this.enableRetinaScaling=!1,this.viewportTransform=p,this.width=o,this.height=a,this.skipControlsDrawing=!0,this.calcViewportBoundaries(),this.renderCanvas(f.getContext("2d"),w),this.viewportTransform=u,this.width=l,this.height=c,this.calcViewportBoundaries(),this.enableRetinaScaling=v,this.skipControlsDrawing=d,f}dispose(){return!this.disposed&&this.elements.cleanupDOM({width:this.width,height:this.height}),c.cancelByCanvas(this),this.disposed=!0,new Promise((t,e)=>{const i=()=>{this.destroy(),t(!0)};i.kill=e,this.__cleanupTask&&this.__cleanupTask.kill("aborted"),this.destroyed?t(!1):this.nextRenderHandle?this.__cleanupTask=i:i()})}destroy(){this.destroyed=!0,this.cancelRequestedRender(),this.forEachObject(t=>t.dispose()),this._objects=[],this.backgroundImage&&this.backgroundImage.dispose(),this.backgroundImage=void 0,this.overlayImage&&this.overlayImage.dispose(),this.overlayImage=void 0,this.elements.dispose()}toString(){return`#<Canvas (${this.complexity()}): { objects: ${this._objects.length} }>`}}t(P,"ownDefaults",S);export{P as StaticCanvas};
|
|
1
|
+
import{defineProperty as t}from"../../_virtual/_rollupPluginBabelHelpers.min.mjs";import{config as e}from"../config.min.mjs";import{CENTER as i,VERSION as s}from"../constants.min.mjs";import{createCollectionMixin as r,isCollection as n}from"../Collection.min.mjs";import{CommonMethods as o}from"../CommonMethods.min.mjs";import{Point as a}from"../Point.min.mjs";import{requestAnimFrame as h,cancelAnimFrame as l}from"../util/animation/AnimationFrameProvider.min.mjs";import{runningAnimations as c}from"../util/animation/AnimationRegistry.min.mjs";import{uid as d}from"../util/internals/uid.min.mjs";import{createCanvasElementFor as m,toDataURL as g,toBlob as u}from"../util/misc/dom.min.mjs";import{transformPoint as p,invertTransform as v}from"../util/misc/matrix.min.mjs";import{enlivenObjects as f,enlivenObjectEnlivables as w}from"../util/misc/objectEnlive.min.mjs";import{pick as b}from"../util/misc/pick.min.mjs";import{matrixToSVG as O}from"../util/misc/svgExport.min.mjs";import{toFixed as j}from"../util/misc/toFixed.min.mjs";import{isFiller as C,isTextObject as y,isPattern as _}from"../util/typeAssertions.min.mjs";import{StaticCanvasDOMManager as x}from"./DOMManagers/StaticCanvasDOMManager.min.mjs";import{staticCanvasDefaults as S}from"./StaticCanvasOptions.min.mjs";import{log as V,FabricError as k}from"../util/internals/console.min.mjs";import{getDevicePixelRatio as R}from"../env/index.min.mjs";import{escapeXml as P}from"../util/lang_string.min.mjs";class T extends(r(o)){get lowerCanvasEl(){var t;return null===(t=this.elements.lower)||void 0===t?void 0:t.el}get contextContainer(){var t;return null===(t=this.elements.lower)||void 0===t?void 0:t.ctx}static getDefaults(){return T.ownDefaults}constructor(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};super(),Object.assign(this,this.constructor.getDefaults()),this.set(e),this.initElements(t),this._setDimensionsImpl({width:this.width||this.elements.lower.el.width||0,height:this.height||this.elements.lower.el.height||0}),this.skipControlsDrawing=!1,this.viewportTransform=[...this.viewportTransform],this.calcViewportBoundaries()}initElements(t){this.elements=new x(t)}add(){const t=super.add(...arguments);return arguments.length>0&&this.renderOnAddRemove&&this.requestRenderAll(),t}insertAt(t){for(var e=arguments.length,i=new Array(e>1?e-1:0),s=1;s<e;s++)i[s-1]=arguments[s];const r=super.insertAt(t,...i);return i.length>0&&this.renderOnAddRemove&&this.requestRenderAll(),r}remove(){const t=super.remove(...arguments);return t.length>0&&this.renderOnAddRemove&&this.requestRenderAll(),t}_onObjectAdded(t){t.canvas&&t.canvas!==this&&(V("warn","Canvas is trying to add an object that belongs to a different canvas.\nResulting to default behavior: removing object from previous canvas and adding to new canvas"),t.canvas.remove(t)),t._set("canvas",this),t.setCoords(),this.fire("object:added",{target:t}),t.fire("added",{target:this})}_onObjectRemoved(t){t._set("canvas",void 0),this.fire("object:removed",{target:t}),t.fire("removed",{target:this})}_onStackOrderChanged(){this.renderOnAddRemove&&this.requestRenderAll()}getRetinaScaling(){return this.enableRetinaScaling?R():1}calcOffset(){return this._offset=this.elements.calcOffset()}getWidth(){return this.width}getHeight(){return this.height}_setDimensionsImpl(t){let{cssOnly:e=!1,backstoreOnly:i=!1}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!e){const e={width:this.width,height:this.height,...t};this.elements.setDimensions(e,this.getRetinaScaling()),this.hasLostContext=!0,this.width=e.width,this.height=e.height}i||this.elements.setCSSDimensions(t),this.calcOffset()}setDimensions(t,e){this._setDimensionsImpl(t,e),e&&e.cssOnly||this.requestRenderAll()}getZoom(){return this.viewportTransform[0]}setViewportTransform(t){this.viewportTransform=t,this.calcViewportBoundaries(),this.renderOnAddRemove&&this.requestRenderAll()}zoomToPoint(t,e){const i=t,s=[...this.viewportTransform],r=p(t,v(s));s[0]=e,s[3]=e;const n=p(r,s);s[4]+=i.x-n.x,s[5]+=i.y-n.y,this.setViewportTransform(s)}setZoom(t){this.zoomToPoint(new a(0,0),t)}absolutePan(t){const e=[...this.viewportTransform];return e[4]=-t.x,e[5]=-t.y,this.setViewportTransform(e)}relativePan(t){return this.absolutePan(new a(-t.x-this.viewportTransform[4],-t.y-this.viewportTransform[5]))}getElement(){return this.elements.lower.el}clearContext(t){t.clearRect(0,0,this.width,this.height)}getContext(){return this.elements.lower.ctx}clear(){this.remove(...this.getObjects()),this.backgroundImage=void 0,this.overlayImage=void 0,this.backgroundColor="",this.overlayColor="",this.clearContext(this.getContext()),this.fire("canvas:cleared"),this.renderOnAddRemove&&this.requestRenderAll()}renderAll(){this.cancelRequestedRender(),this.destroyed||this.renderCanvas(this.getContext(),this._objects)}renderAndReset(){this.nextRenderHandle=0,this.renderAll()}requestRenderAll(){this.nextRenderHandle||this.disposed||this.destroyed||(this.nextRenderHandle=h(()=>this.renderAndReset()))}calcViewportBoundaries(){const t=this.width,e=this.height,i=v(this.viewportTransform),s=p({x:0,y:0},i),r=p({x:t,y:e},i),n=s.min(r),o=s.max(r);return this.vptCoords={tl:n,tr:new a(o.x,n.y),bl:new a(n.x,o.y),br:o}}cancelRequestedRender(){this.nextRenderHandle&&(l(this.nextRenderHandle),this.nextRenderHandle=0)}drawControls(t){}renderCanvas(t,e){if(this.destroyed)return;const i=this.viewportTransform,s=this.clipPath;this.calcViewportBoundaries(),this.clearContext(t),t.imageSmoothingEnabled=this.imageSmoothingEnabled,t.patternQuality=this.patternQuality,this.fire("before:render",{ctx:t}),this._renderBackground(t),t.save(),t.transform(i[0],i[1],i[2],i[3],i[4],i[5]),this._renderObjects(t,e),t.restore(),this.controlsAboveOverlay||this.skipControlsDrawing||this.drawControls(t),s&&(s._set("canvas",this),s.shouldCache(),s._transformDone=!0,s.renderCache({forClipping:!0}),this.drawClipPathOnCanvas(t,s)),this._renderOverlay(t),this.controlsAboveOverlay&&!this.skipControlsDrawing&&this.drawControls(t),this.fire("after:render",{ctx:t}),this.__cleanupTask&&(this.__cleanupTask(),this.__cleanupTask=void 0)}drawClipPathOnCanvas(t,e){const i=this.viewportTransform;t.save(),t.transform(...i),t.globalCompositeOperation="destination-in",e.transform(t),t.scale(1/e.zoomX,1/e.zoomY),t.drawImage(e._cacheCanvas,-e.cacheTranslationX,-e.cacheTranslationY),t.restore()}_renderObjects(t,e){for(let i=0,s=e.length;i<s;++i)e[i]&&e[i].render(t)}_renderBackgroundOrOverlay(t,e){const i=this[`${e}Color`],s=this[`${e}Image`],r=this.viewportTransform,n=this[`${e}Vpt`];if(!i&&!s)return;const o=C(i);if(i){if(t.save(),t.beginPath(),t.moveTo(0,0),t.lineTo(this.width,0),t.lineTo(this.width,this.height),t.lineTo(0,this.height),t.closePath(),t.fillStyle=o?i.toLive(t):i,n&&t.transform(...r),o){t.transform(1,0,0,1,i.offsetX||0,i.offsetY||0);const e=i.gradientTransform||i.patternTransform;e&&t.transform(...e)}t.fill(),t.restore()}if(s){t.save();const{skipOffscreen:e}=this;this.skipOffscreen=n,n&&t.transform(...r),s.render(t),this.skipOffscreen=e,t.restore()}}_renderBackground(t){this._renderBackgroundOrOverlay(t,"background")}_renderOverlay(t){this._renderBackgroundOrOverlay(t,"overlay")}getCenterPoint(){return new a(this.width/2,this.height/2)}centerObjectH(t){return this._centerObject(t,new a(this.getCenterPoint().x,t.getCenterPoint().y))}centerObjectV(t){return this._centerObject(t,new a(t.getCenterPoint().x,this.getCenterPoint().y))}centerObject(t){return this._centerObject(t,this.getCenterPoint())}viewportCenterObject(t){return this._centerObject(t,this.getVpCenter())}viewportCenterObjectH(t){return this._centerObject(t,new a(this.getVpCenter().x,t.getCenterPoint().y))}viewportCenterObjectV(t){return this._centerObject(t,new a(t.getCenterPoint().x,this.getVpCenter().y))}getVpCenter(){return p(this.getCenterPoint(),v(this.viewportTransform))}_centerObject(t,e){t.setXY(e,i,i),t.setCoords(),this.renderOnAddRemove&&this.requestRenderAll()}toDatalessJSON(t){return this.toDatalessObject(t)}toObject(t){return this._toObjectMethod("toObject",t)}toJSON(){return this.toObject()}toDatalessObject(t){return this._toObjectMethod("toDatalessObject",t)}_toObjectMethod(t,e){const i=this.clipPath,r=i&&!i.excludeFromExport?this._toObject(i,t,e):null;return{version:s,...b(this,e),objects:this._objects.filter(t=>!t.excludeFromExport).map(i=>this._toObject(i,t,e)),...this.__serializeBgOverlay(t,e),...r?{clipPath:r}:null}}_toObject(t,e,i){let s;this.includeDefaultValues||(s=t.includeDefaultValues,t.includeDefaultValues=!1);const r=t[e](i);return this.includeDefaultValues||(t.includeDefaultValues=!!s),r}__serializeBgOverlay(t,e){const i={},s=this.backgroundImage,r=this.overlayImage,n=this.backgroundColor,o=this.overlayColor;return C(n)?n.excludeFromExport||(i.background=n.toObject(e)):n&&(i.background=n),C(o)?o.excludeFromExport||(i.overlay=o.toObject(e)):o&&(i.overlay=o),s&&!s.excludeFromExport&&(i.backgroundImage=this._toObject(s,t,e)),r&&!r.excludeFromExport&&(i.overlayImage=this._toObject(r,t,e)),i}toSVG(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=arguments.length>1?arguments[1]:void 0;t.reviver=e;const i=[];var s;(this._setSVGPreamble(i,t),this._setSVGHeader(i,t),this.clipPath)&&i.push(`<g clip-path="url(#${P(null!==(s=this.clipPath.clipPathId)&&void 0!==s?s:"")})" >\n`);return this._setSVGBgOverlayColor(i,"background"),this._setSVGBgOverlayImage(i,"backgroundImage",e),this._setSVGObjects(i,e),this.clipPath&&i.push("</g>\n"),this._setSVGBgOverlayColor(i,"overlay"),this._setSVGBgOverlayImage(i,"overlayImage",e),i.push("</svg>"),i.join("")}_setSVGPreamble(t,e){e.suppressPreamble||t.push('<?xml version="1.0" encoding="',e.encoding||"UTF-8",'" standalone="no" ?>\n','<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" ','"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">\n')}_setSVGHeader(t,i){const r=i.width||`${this.width}`,n=i.height||`${this.height}`,o=e.NUM_FRACTION_DIGITS,a=i.viewBox;let h;if(a)h=`viewBox="${a.x} ${a.y} ${a.width} ${a.height}" `;else if(this.svgViewportTransformation){const t=this.viewportTransform;h=`viewBox="${j(-t[4]/t[0],o)} ${j(-t[5]/t[3],o)} ${j(this.width/t[0],o)} ${j(this.height/t[3],o)}" `}else h=`viewBox="0 0 ${this.width} ${this.height}" `;t.push("<svg ",'xmlns="http://www.w3.org/2000/svg" ','xmlns:xlink="http://www.w3.org/1999/xlink" ','version="1.1" ','width="',r,'" ','height="',n,'" ',h,'xml:space="preserve">\n',"<desc>Created with Fabric.js ",s,"</desc>\n","<defs>\n",this.createSVGFontFacesMarkup(),this.createSVGRefElementsMarkup(),this.createSVGClipPathMarkup(i),"</defs>\n")}createSVGClipPathMarkup(t){const e=this.clipPath;return e?(e.clipPathId=`CLIPPATH_${d()}`,`<clipPath id="${e.clipPathId}" >\n${e.toClipPathSVG(t.reviver)}</clipPath>\n`):""}createSVGRefElementsMarkup(){return["background","overlay"].map(t=>{const e=this[`${t}Color`];if(C(e)){const i=this[`${t}Vpt`],s=this.viewportTransform,r={isType:()=>!1,width:this.width/(i?s[0]:1),height:this.height/(i?s[3]:1)};return e.toSVG(r,{additionalTransform:i?O(s):""})}}).join("")}createSVGFontFacesMarkup(){const t=[],i={},s=e.fontPaths;this._objects.forEach(function e(i){t.push(i),n(i)&&i._objects.forEach(e)}),t.forEach(t=>{if(!y(t))return;const{styles:e,fontFamily:r}=t;!i[r]&&s[r]&&(i[r]=!0,e&&Object.values(e).forEach(t=>{Object.values(t).forEach(t=>{let{fontFamily:e=""}=t;!i[e]&&s[e]&&(i[e]=!0)})}))});const r=Object.keys(i).map(t=>`\t\t@font-face {\n\t\t\tfont-family: '${t}';\n\t\t\tsrc: url('${s[t]}');\n\t\t}\n`).join("");return r?`\t<style type="text/css"><![CDATA[\n${r}]]></style>\n`:""}_setSVGObjects(t,e){this.forEachObject(i=>{i.excludeFromExport||this._setSVGObject(t,i,e)})}_setSVGObject(t,e,i){t.push(e.toSVG(i))}_setSVGBgOverlayImage(t,e,i){const s=this[e];s&&!s.excludeFromExport&&s.toSVG&&t.push(s.toSVG(i))}_setSVGBgOverlayColor(t,e){const i=this[`${e}Color`];if(i)if(C(i)){const s=i.repeat||"",r=this.width,n=this.height,o=this[`${e}Vpt`]?O(v(this.viewportTransform)):"";t.push(`<rect transform="${o} translate(${r/2},${n/2})" x="${i.offsetX-r/2}" y="${i.offsetY-n/2}" width="${"repeat-y"!==s&&"no-repeat"!==s||!_(i)?r:i.source.width}" height="${"repeat-x"!==s&&"no-repeat"!==s||!_(i)?n:i.source.height}" fill="url(#SVGID_${i.id})"></rect>\n`)}else t.push('<rect x="0" y="0" width="100%" height="100%" ','fill="',i,'"',"></rect>\n")}loadFromJSON(t,e){let{signal:i}=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(!t)return Promise.reject(new k("`json` is undefined"));const{objects:s=[],...r}="string"==typeof t?JSON.parse(t):t,{backgroundImage:n,background:o,overlayImage:a,overlay:h,clipPath:l}=r,c=this.renderOnAddRemove;return this.renderOnAddRemove=!1,Promise.all([f(s,{reviver:e,signal:i}),w({backgroundImage:n,backgroundColor:o,overlayImage:a,overlayColor:h,clipPath:l},{signal:i})]).then(t=>{let[e,i]=t;return this.clear(),this.add(...e),this.set(r),this.set(i),this.renderOnAddRemove=c,this})}clone(t){const e=this.toObject(t);return this.cloneWithoutData().loadFromJSON(e)}cloneWithoutData(){const t=m(this);return new this.constructor(t)}toDataURL(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const{format:e="png",quality:i=1,multiplier:s=1,enableRetinaScaling:r=!1}=t,n=s*(r?this.getRetinaScaling():1);return g(this.toCanvasElement(n,t),e,i)}toBlob(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const{format:e="png",quality:i=1,multiplier:s=1,enableRetinaScaling:r=!1}=t,n=s*(r?this.getRetinaScaling():1);return u(this.toCanvasElement(n,t),e,i)}toCanvasElement(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,{width:e,height:i,left:s,top:r,filter:n}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const o=(e||this.width)*t,a=(i||this.height)*t,h=this.getZoom(),l=this.width,c=this.height,d=this.skipControlsDrawing,g=h*t,u=this.viewportTransform,p=[g,0,0,g,(u[4]-(s||0))*t,(u[5]-(r||0))*t],v=this.enableRetinaScaling,f=m({width:o,height:a}),w=n?this._objects.filter(t=>n(t)):this._objects;return this.enableRetinaScaling=!1,this.viewportTransform=p,this.width=o,this.height=a,this.skipControlsDrawing=!0,this.calcViewportBoundaries(),this.renderCanvas(f.getContext("2d"),w),this.viewportTransform=u,this.width=l,this.height=c,this.calcViewportBoundaries(),this.enableRetinaScaling=v,this.skipControlsDrawing=d,f}dispose(){return!this.disposed&&this.elements.cleanupDOM({width:this.width,height:this.height}),c.cancelByCanvas(this),this.disposed=!0,new Promise((t,e)=>{const i=()=>{this.destroy(),t(!0)};i.kill=e,this.__cleanupTask&&this.__cleanupTask.kill("aborted"),this.destroyed?t(!1):this.nextRenderHandle?this.__cleanupTask=i:i()})}destroy(){this.destroyed=!0,this.cancelRequestedRender(),this.forEachObject(t=>t.dispose()),this._objects=[],this.backgroundImage&&this.backgroundImage.dispose(),this.backgroundImage=void 0,this.overlayImage&&this.overlayImage.dispose(),this.overlayImage=void 0,this.elements.dispose()}toString(){return`#<Canvas (${this.complexity()}): { objects: ${this._objects.length} }>`}}t(T,"ownDefaults",S);export{T as StaticCanvas};
|
|
2
2
|
//# sourceMappingURL=StaticCanvas.min.mjs.map
|