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":"Image.mjs","sources":["../../../src/shapes/Image.ts"],"sourcesContent":["import { getFabricDocument, getEnv } from '../env';\nimport type { BaseFilter } from '../filters/BaseFilter';\nimport { getFilterBackend } from '../filters/FilterBackend';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type {\n TClassProperties,\n TCrossOrigin,\n TSize,\n Abortable,\n TOptions,\n} from '../typedefs';\nimport { uid } from '../util/internals/uid';\nimport { createCanvasElementFor } from '../util/misc/dom';\nimport { findScaleToCover, findScaleToFit } from '../util/misc/findScaleTo';\nimport type { LoadImageOptions } from '../util/misc/objectEnlive';\nimport {\n enlivenObjectEnlivables,\n enlivenObjects,\n loadImage,\n} from '../util/misc/objectEnlive';\nimport { parsePreserveAspectRatioAttribute } from '../util/misc/svgParsing';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport { WebGLFilterBackend } from '../filters/WebGLFilterBackend';\nimport { FILL, NONE } from '../constants';\nimport { getDocumentFromElement } from '../util/dom_misc';\nimport type { CSSRules } from '../parser/typedefs';\nimport type { Resize, ResizeSerializedProps } from '../filters/Resize';\nimport type { TCachedFabricObject } from './Object/Object';\nimport { log } from '../util/internals/console';\n\n// @todo Would be nice to have filtering code not imported directly.\n\nexport type ImageSource =\n | HTMLImageElement\n | HTMLVideoElement\n | HTMLCanvasElement;\n\nexport type ParsedPAROffsets = {\n width: number;\n height: number;\n scaleX: number;\n scaleY: number;\n offsetLeft: number;\n offsetTop: number;\n cropX: number;\n cropY: number;\n};\n\ninterface UniqueImageProps {\n srcFromAttribute: boolean;\n minimumScaleTrigger: number;\n cropX: number;\n cropY: number;\n imageSmoothing: boolean;\n filters: BaseFilter<string, Record<string, any>>[];\n resizeFilter?: Resize;\n}\n\nexport const imageDefaultValues: Partial<TClassProperties<FabricImage>> = {\n strokeWidth: 0,\n srcFromAttribute: false,\n minimumScaleTrigger: 0.5,\n cropX: 0,\n cropY: 0,\n imageSmoothing: true,\n};\n\nexport interface SerializedImageProps extends SerializedObjectProps {\n src: string;\n crossOrigin: TCrossOrigin;\n filters: any[];\n resizeFilter?: ResizeSerializedProps;\n cropX: number;\n cropY: number;\n}\n\nexport interface ImageProps extends FabricObjectProps, UniqueImageProps {}\n\nconst IMAGE_PROPS = ['cropX', 'cropY'] as const;\n\n/**\n * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-1#images}\n */\nexport class FabricImage<\n Props extends TOptions<ImageProps> = Partial<ImageProps>,\n SProps extends SerializedImageProps = SerializedImageProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject<Props, SProps, EventSpec>\n implements ImageProps\n{\n /**\n * When calling {@link FabricImage.getSrc}, return value from element src with `element.getAttribute('src')`.\n * This allows for relative urls as image src.\n * @since 2.7.0\n * @type Boolean\n * @default false\n */\n declare srcFromAttribute: boolean;\n\n /**\n * private\n * contains last value of scaleX to detect\n * if the Image got resized after the last Render\n * @type Number\n */\n protected _lastScaleX = 1;\n\n /**\n * private\n * contains last value of scaleY to detect\n * if the Image got resized after the last Render\n * @type Number\n */\n protected _lastScaleY = 1;\n\n /**\n * private\n * contains last value of scaling applied by the apply filter chain\n * @type Number\n */\n protected _filterScalingX = 1;\n\n /**\n * private\n * contains last value of scaling applied by the apply filter chain\n * @type Number\n */\n protected _filterScalingY = 1;\n\n /**\n * minimum scale factor under which any resizeFilter is triggered to resize the image\n * 0 will disable the automatic resize. 1 will trigger automatically always.\n * number bigger than 1 are not implemented yet.\n * @type Number\n */\n declare minimumScaleTrigger: number;\n\n /**\n * key used to retrieve the texture representing this image\n * @since 2.0.0\n * @type String\n */\n declare cacheKey: string;\n\n /**\n * Image crop in pixels from original image size.\n * @since 2.0.0\n * @type Number\n */\n declare cropX: number;\n\n /**\n * Image crop in pixels from original image size.\n * @since 2.0.0\n * @type Number\n */\n declare cropY: number;\n\n /**\n * Indicates whether this canvas will use image smoothing when painting this image.\n * Also influence if the cacheCanvas for this image uses imageSmoothing\n * @since 4.0.0-beta.11\n * @type Boolean\n */\n declare imageSmoothing: boolean;\n\n declare preserveAspectRatio: string;\n\n declare protected src: string;\n\n declare filters: BaseFilter<string, Record<string, any>>[];\n declare resizeFilter: Resize;\n\n declare _element: ImageSource;\n declare _filteredEl?: HTMLCanvasElement;\n declare _originalElement: ImageSource;\n\n static type = 'Image';\n\n static cacheProperties = [...cacheProperties, ...IMAGE_PROPS];\n\n static ownDefaults = imageDefaultValues;\n\n static getDefaults(): Record<string, any> {\n return {\n ...super.getDefaults(),\n ...FabricImage.ownDefaults,\n };\n }\n /**\n * Constructor\n * Image can be initialized with any canvas drawable or a string.\n * The string should be a url and will be loaded as an image.\n * Canvas and Image element work out of the box, while videos require extra code to work.\n * Please check video element events for seeking.\n * @param {ImageSource | string} element Image element\n * @param {Object} [options] Options object\n */\n constructor(elementId: string, options?: Props);\n constructor(element: ImageSource, options?: Props);\n constructor(arg0: ImageSource | string, options?: Props) {\n super();\n this.filters = [];\n Object.assign(this, FabricImage.ownDefaults);\n this.setOptions(options);\n this.cacheKey = `texture${uid()}`;\n this.setElement(\n typeof arg0 === 'string'\n ? ((\n (this.canvas && getDocumentFromElement(this.canvas.getElement())) ||\n getFabricDocument()\n ).getElementById(arg0) as ImageSource)\n : arg0,\n options,\n );\n }\n\n /**\n * Returns image element which this instance if based on\n */\n getElement() {\n return this._element;\n }\n\n /**\n * Sets image element for this instance to a specified one.\n * If filters defined they are applied to new image.\n * You might need to call `canvas.renderAll` and `object.setCoords` after replacing, to render new image and update controls area.\n * @param {HTMLImageElement} element\n * @param {Partial<TSize>} [size] Options object\n */\n setElement(element: ImageSource, size: Partial<TSize> = {}) {\n this.removeTexture(this.cacheKey);\n this.removeTexture(`${this.cacheKey}_filtered`);\n this._element = element;\n this._originalElement = element;\n this._setWidthHeight(size);\n if (this.filters.length !== 0) {\n this.applyFilters();\n }\n // resizeFilters work on the already filtered copy.\n // we need to apply resizeFilters AFTER normal filters.\n // applyResizeFilters is run more often than normal filters\n // and is triggered by user interactions rather than dev code\n if (this.resizeFilter) {\n this.applyResizeFilters();\n }\n }\n\n /**\n * Delete a single texture if in webgl mode\n */\n removeTexture(key: string) {\n const backend = getFilterBackend(false);\n if (backend instanceof WebGLFilterBackend) {\n backend.evictCachesForKey(key);\n }\n }\n\n /**\n * Delete textures, reference to elements and eventually JSDOM cleanup\n */\n dispose() {\n super.dispose();\n this.removeTexture(this.cacheKey);\n this.removeTexture(`${this.cacheKey}_filtered`);\n this._cacheContext = null;\n (\n ['_originalElement', '_element', '_filteredEl', '_cacheCanvas'] as const\n ).forEach((elementKey) => {\n const el = this[elementKey];\n el && getEnv().dispose(el);\n // @ts-expect-error disposing\n this[elementKey] = undefined;\n });\n }\n\n /**\n * Get the crossOrigin value (of the corresponding image element)\n */\n getCrossOrigin(): string | null {\n return (\n this._originalElement &&\n ((this._originalElement as any).crossOrigin || null)\n );\n }\n\n /**\n * Returns original size of an image\n */\n getOriginalSize() {\n const element = this.getElement() as any;\n if (!element) {\n return {\n width: 0,\n height: 0,\n };\n }\n return {\n width: element.naturalWidth || element.width,\n height: element.naturalHeight || element.height,\n };\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _stroke(ctx: CanvasRenderingContext2D) {\n if (!this.stroke || this.strokeWidth === 0) {\n return;\n }\n const w = this.width / 2,\n h = this.height / 2;\n ctx.beginPath();\n ctx.moveTo(-w, -h);\n ctx.lineTo(w, -h);\n ctx.lineTo(w, h);\n ctx.lineTo(-w, h);\n ctx.lineTo(-w, -h);\n ctx.closePath();\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject<\n T extends Omit<Props & TClassProperties<this>, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick<T, K> & SProps {\n const filters: Record<string, any>[] = [];\n this.filters.forEach((filterObj) => {\n filterObj && filters.push(filterObj.toObject());\n });\n return {\n ...super.toObject([...IMAGE_PROPS, ...propertiesToInclude]),\n src: this.getSrc(),\n crossOrigin: this.getCrossOrigin(),\n filters,\n ...(this.resizeFilter\n ? { resizeFilter: this.resizeFilter.toObject() }\n : {}),\n };\n }\n\n /**\n * Returns true if an image has crop applied, inspecting values of cropX,cropY,width,height.\n * @return {Boolean}\n */\n hasCrop() {\n return (\n !!this.cropX ||\n !!this.cropY ||\n this.width < this._element.width ||\n this.height < this._element.height\n );\n }\n\n /**\n * Returns svg representation of an instance\n * @return {string[]} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const imageMarkup: string[] = [],\n element = this._element,\n x = -this.width / 2,\n y = -this.height / 2;\n let svgString: string[] = [],\n strokeSvg: string[] = [],\n clipPath = '',\n imageRendering = '';\n if (!element) {\n return [];\n }\n if (this.hasCrop()) {\n const clipPathId = uid();\n svgString.push(\n '<clipPath id=\"imageCrop_' + clipPathId + '\">\\n',\n '\\t<rect x=\"' +\n x +\n '\" y=\"' +\n y +\n '\" width=\"' +\n this.width +\n '\" height=\"' +\n this.height +\n '\" />\\n',\n '</clipPath>\\n',\n );\n clipPath = ' clip-path=\"url(#imageCrop_' + clipPathId + ')\" ';\n }\n if (!this.imageSmoothing) {\n imageRendering = ' image-rendering=\"optimizeSpeed\"';\n }\n imageMarkup.push(\n '\\t<image ',\n 'COMMON_PARTS',\n `xlink:href=\"${this.getSvgSrc(true)}\" x=\"${x - this.cropX}\" y=\"${\n y - this.cropY\n // we're essentially moving origin of transformation from top/left corner to the center of the shape\n // by wrapping it in container <g> element with actual transformation, then offsetting object to the top/left\n // so that object's center aligns with container's left/top\n }\" width=\"${\n element.width || (element as HTMLImageElement).naturalWidth\n }\" height=\"${\n element.height || (element as HTMLImageElement).naturalHeight\n }\"${imageRendering}${clipPath}></image>\\n`,\n );\n\n if (this.stroke || this.strokeDashArray) {\n const origFill = this.fill;\n this.fill = null;\n strokeSvg = [\n `\\t<rect x=\"${x}\" y=\"${y}\" width=\"${this.width}\" height=\"${\n this.height\n }\" style=\"${this.getSvgStyles()}\" />\\n`,\n ];\n this.fill = origFill;\n }\n if (this.paintFirst !== FILL) {\n svgString = svgString.concat(strokeSvg, imageMarkup);\n } else {\n svgString = svgString.concat(imageMarkup, strokeSvg);\n }\n return svgString;\n }\n\n /**\n * Returns source of an image\n * @param {Boolean} filtered indicates if the src is needed for svg\n * @return {String} Source of an image\n */\n getSrc(filtered?: boolean): string {\n const element = filtered ? this._element : this._originalElement;\n if (element) {\n if ((element as HTMLCanvasElement).toDataURL) {\n return (element as HTMLCanvasElement).toDataURL();\n }\n\n if (this.srcFromAttribute) {\n return element.getAttribute('src') || '';\n } else {\n return (element as HTMLImageElement).src;\n }\n } else {\n return this.src || '';\n }\n }\n\n /**\n * Alias for getSrc\n * @param filtered\n * @deprecated\n */\n getSvgSrc(filtered?: boolean) {\n return this.getSrc(filtered);\n }\n\n /**\n * Loads and sets source of an image\\\n * **IMPORTANT**: It is recommended to abort loading tasks before calling this method to prevent race conditions and unnecessary networking\n * @param {String} src Source string (URL)\n * @param {LoadImageOptions} [options] Options object\n */\n setSrc(src: string, { crossOrigin, signal }: LoadImageOptions = {}) {\n return loadImage(src, { crossOrigin, signal }).then((img) => {\n typeof crossOrigin !== 'undefined' && this.set({ crossOrigin });\n this.setElement(img);\n });\n }\n\n /**\n * Returns string representation of an instance\n * @return {String} String representation of an instance\n */\n toString() {\n return `#<Image: { src: \"${this.getSrc()}\" }>`;\n }\n\n applyResizeFilters() {\n const filter = this.resizeFilter,\n minimumScale = this.minimumScaleTrigger,\n objectScale = this.getTotalObjectScaling(),\n scaleX = objectScale.x,\n scaleY = objectScale.y,\n elementToFilter = this._filteredEl || this._originalElement;\n if (this.group) {\n this.set('dirty', true);\n }\n if (!filter || (scaleX > minimumScale && scaleY > minimumScale)) {\n this._element = elementToFilter;\n this._filterScalingX = 1;\n this._filterScalingY = 1;\n this._lastScaleX = scaleX;\n this._lastScaleY = scaleY;\n return;\n }\n const canvasEl = createCanvasElementFor(elementToFilter),\n { width, height } = elementToFilter;\n this._element = canvasEl;\n this._lastScaleX = filter.scaleX = scaleX;\n this._lastScaleY = filter.scaleY = scaleY;\n getFilterBackend().applyFilters(\n [filter],\n elementToFilter,\n width,\n height,\n this._element,\n );\n this._filterScalingX = canvasEl.width / this._originalElement.width;\n this._filterScalingY = canvasEl.height / this._originalElement.height;\n }\n\n /**\n * Applies filters assigned to this image (from \"filters\" array) or from filter param\n * @param {Array} filters to be applied\n * @param {Boolean} forResizing specify if the filter operation is a resize operation\n */\n applyFilters(\n filters: BaseFilter<string, Record<string, any>>[] = this.filters || [],\n ) {\n filters = filters.filter((filter) => filter && !filter.isNeutralState());\n this.set('dirty', true);\n\n // needs to clear out or WEBGL will not resize correctly\n this.removeTexture(`${this.cacheKey}_filtered`);\n\n if (filters.length === 0) {\n this._element = this._originalElement;\n // this is unsafe and needs to be rethinkend\n this._filteredEl = undefined;\n this._filterScalingX = 1;\n this._filterScalingY = 1;\n return;\n }\n\n const imgElement = this._originalElement,\n sourceWidth =\n (imgElement as HTMLImageElement).naturalWidth || imgElement.width,\n sourceHeight =\n (imgElement as HTMLImageElement).naturalHeight || imgElement.height;\n\n if (this._element === this._originalElement) {\n // if the _element a reference to _originalElement\n // we need to create a new element to host the filtered pixels\n const canvasEl = createCanvasElementFor({\n width: sourceWidth,\n height: sourceHeight,\n });\n this._element = canvasEl;\n this._filteredEl = canvasEl;\n } else if (this._filteredEl) {\n // if the _element is it own element,\n // and we also have a _filteredEl, then we clean up _filteredEl\n // and we assign it to _element.\n // in this way we invalidate the eventual old resize filtered element\n this._element = this._filteredEl;\n this._filteredEl\n .getContext('2d')!\n .clearRect(0, 0, sourceWidth, sourceHeight);\n // we also need to resize again at next renderAll, so remove saved _lastScaleX/Y\n this._lastScaleX = 1;\n this._lastScaleY = 1;\n }\n getFilterBackend().applyFilters(\n filters,\n this._originalElement,\n sourceWidth,\n sourceHeight,\n this._element as HTMLCanvasElement,\n this.cacheKey,\n );\n if (\n this._originalElement.width !== this._element.width ||\n this._originalElement.height !== this._element.height\n ) {\n this._filterScalingX = this._element.width / this._originalElement.width;\n this._filterScalingY =\n this._element.height / this._originalElement.height;\n }\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n ctx.imageSmoothingEnabled = this.imageSmoothing;\n if (this.isMoving !== true && this.resizeFilter && this._needsResize()) {\n this.applyResizeFilters();\n }\n this._stroke(ctx);\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Paint the cached copy of the object on the target context.\n * it will set the imageSmoothing for the draw operation\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawCacheOnCanvas(\n this: TCachedFabricObject<FabricImage>,\n ctx: CanvasRenderingContext2D,\n ) {\n ctx.imageSmoothingEnabled = this.imageSmoothing;\n super.drawCacheOnCanvas(ctx);\n }\n\n /**\n * Decide if the FabricImage should cache or not. Create its own cache level\n * needsItsOwnCache should be used when the object drawing method requires\n * a cache step.\n * Generally you do not cache objects in groups because the group outside is cached.\n * This is the special Image version where we would like to avoid caching where possible.\n * Essentially images do not benefit from caching. They may require caching, and in that\n * case we do it. Also caching an image usually ends in a loss of details.\n * A full performance audit should be done.\n * @return {Boolean}\n */\n shouldCache() {\n return this.needsItsOwnCache();\n }\n\n _renderFill(ctx: CanvasRenderingContext2D) {\n const elementToDraw = this._element;\n if (!elementToDraw) {\n return;\n }\n const scaleX = this._filterScalingX,\n scaleY = this._filterScalingY,\n w = this.width,\n h = this.height,\n // crop values cannot be lesser than 0.\n cropX = Math.max(this.cropX, 0),\n cropY = Math.max(this.cropY, 0),\n elWidth =\n (elementToDraw as HTMLImageElement).naturalWidth || elementToDraw.width,\n elHeight =\n (elementToDraw as HTMLImageElement).naturalHeight ||\n elementToDraw.height,\n sX = cropX * scaleX,\n sY = cropY * scaleY,\n // the width height cannot exceed element width/height, starting from the crop offset.\n sW = Math.min(w * scaleX, elWidth - sX),\n sH = Math.min(h * scaleY, elHeight - sY),\n x = -w / 2,\n y = -h / 2,\n maxDestW = Math.min(w, elWidth / scaleX - cropX),\n maxDestH = Math.min(h, elHeight / scaleY - cropY);\n\n elementToDraw &&\n ctx.drawImage(elementToDraw, sX, sY, sW, sH, x, y, maxDestW, maxDestH);\n }\n\n /**\n * needed to check if image needs resize\n * @private\n */\n _needsResize() {\n const scale = this.getTotalObjectScaling();\n return scale.x !== this._lastScaleX || scale.y !== this._lastScaleY;\n }\n\n /**\n * @private\n * @deprecated unused\n */\n _resetWidthHeight() {\n this.set(this.getOriginalSize());\n }\n\n /**\n * @private\n * Set the width and the height of the image object, using the element or the\n * options.\n */\n _setWidthHeight({ width, height }: Partial<TSize> = {}) {\n const size = this.getOriginalSize();\n this.width = width || size.width;\n this.height = height || size.height;\n }\n\n /**\n * Calculate offset for center and scale factor for the image in order to respect\n * the preserveAspectRatio attribute\n * @private\n */\n parsePreserveAspectRatioAttribute(): ParsedPAROffsets {\n const pAR = parsePreserveAspectRatioAttribute(\n this.preserveAspectRatio || '',\n ),\n pWidth = this.width,\n pHeight = this.height,\n parsedAttributes = { width: pWidth, height: pHeight };\n let rWidth = this._element.width,\n rHeight = this._element.height,\n scaleX = 1,\n scaleY = 1,\n offsetLeft = 0,\n offsetTop = 0,\n cropX = 0,\n cropY = 0,\n offset;\n\n if (pAR && (pAR.alignX !== NONE || pAR.alignY !== NONE)) {\n if (pAR.meetOrSlice === 'meet') {\n scaleX = scaleY = findScaleToFit(this._element, parsedAttributes);\n offset = (pWidth - rWidth * scaleX) / 2;\n if (pAR.alignX === 'Min') {\n offsetLeft = -offset;\n }\n if (pAR.alignX === 'Max') {\n offsetLeft = offset;\n }\n offset = (pHeight - rHeight * scaleY) / 2;\n if (pAR.alignY === 'Min') {\n offsetTop = -offset;\n }\n if (pAR.alignY === 'Max') {\n offsetTop = offset;\n }\n }\n if (pAR.meetOrSlice === 'slice') {\n scaleX = scaleY = findScaleToCover(this._element, parsedAttributes);\n offset = rWidth - pWidth / scaleX;\n if (pAR.alignX === 'Mid') {\n cropX = offset / 2;\n }\n if (pAR.alignX === 'Max') {\n cropX = offset;\n }\n offset = rHeight - pHeight / scaleY;\n if (pAR.alignY === 'Mid') {\n cropY = offset / 2;\n }\n if (pAR.alignY === 'Max') {\n cropY = offset;\n }\n rWidth = pWidth / scaleX;\n rHeight = pHeight / scaleY;\n }\n } else {\n scaleX = pWidth / rWidth;\n scaleY = pHeight / rHeight;\n }\n return {\n width: rWidth,\n height: rHeight,\n scaleX,\n scaleY,\n offsetLeft,\n offsetTop,\n cropX,\n cropY,\n };\n }\n\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link FabricImage.fromElement})\n * @see {@link http://www.w3.org/TR/SVG/struct.html#ImageElement}\n */\n static ATTRIBUTE_NAMES = [\n ...SHARED_ATTRIBUTES,\n 'x',\n 'y',\n 'width',\n 'height',\n 'preserveAspectRatio',\n 'xlink:href',\n 'href',\n 'crossOrigin',\n 'image-rendering',\n ];\n\n /**\n * Creates an instance of FabricImage from its object representation\n * @param {Object} object Object to create an instance from\n * @param {object} [options] Options object\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise<FabricImage>}\n */\n static fromObject<T extends TOptions<SerializedImageProps>>(\n { filters: f, resizeFilter: rf, src, crossOrigin, type, ...object }: T,\n options?: Abortable,\n ) {\n return Promise.all([\n loadImage(src!, { ...options, crossOrigin }),\n f && enlivenObjects<BaseFilter<string>>(f, options),\n // redundant - handled by enlivenObjectEnlivables, but nicely explicit\n rf ? enlivenObjects<Resize>([rf], options) : [],\n enlivenObjectEnlivables(object, options),\n ]).then(([el, filters = [], [resizeFilter], hydratedProps = {}]) => {\n return new this(el, {\n ...object,\n // TODO: passing src creates a difference between image creation and restoring from JSON\n src,\n filters,\n resizeFilter,\n ...hydratedProps,\n });\n });\n }\n\n /**\n * Creates an instance of Image from an URL string\n * @param {String} url URL to create an image from\n * @param {LoadImageOptions} [options] Options object\n * @returns {Promise<FabricImage>}\n */\n static fromURL<T extends TOptions<ImageProps>>(\n url: string,\n { crossOrigin = null, signal }: LoadImageOptions = {},\n imageOptions?: T,\n ): Promise<FabricImage> {\n return loadImage(url, { crossOrigin, signal }).then(\n (img) => new this(img, imageOptions),\n );\n }\n\n /**\n * Returns {@link FabricImage} instance from an SVG element\n * @param {HTMLElement} element Element to parse\n * @param {Object} [options] Options object\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @param {Function} callback Callback to execute when Image object is created\n */\n static async fromElement(\n element: HTMLElement,\n options: Abortable = {},\n cssRules?: CSSRules,\n ) {\n const parsedAttributes = parseAttributes(\n element,\n this.ATTRIBUTE_NAMES,\n cssRules,\n );\n return this.fromURL(\n parsedAttributes['xlink:href'] || parsedAttributes['href'],\n options,\n parsedAttributes,\n ).catch((err) => {\n log('log', 'Unable to parse Image', err);\n return null;\n });\n }\n}\n\nclassRegistry.setClass(FabricImage);\nclassRegistry.setSVGClass(FabricImage);\n"],"names":["imageDefaultValues","strokeWidth","srcFromAttribute","minimumScaleTrigger","cropX","cropY","imageSmoothing","IMAGE_PROPS","FabricImage","FabricObject","getDefaults","ownDefaults","constructor","arg0","options","_defineProperty","filters","Object","assign","setOptions","cacheKey","uid","setElement","canvas","getDocumentFromElement","getElement","getFabricDocument","getElementById","_element","element","size","arguments","length","undefined","removeTexture","_originalElement","_setWidthHeight","applyFilters","resizeFilter","applyResizeFilters","key","backend","getFilterBackend","WebGLFilterBackend","evictCachesForKey","dispose","_cacheContext","forEach","elementKey","el","getEnv","getCrossOrigin","crossOrigin","getOriginalSize","width","height","naturalWidth","naturalHeight","_stroke","ctx","stroke","w","h","beginPath","moveTo","lineTo","closePath","toObject","propertiesToInclude","filterObj","push","src","getSrc","hasCrop","_toSVG","imageMarkup","x","y","svgString","strokeSvg","clipPath","imageRendering","clipPathId","getSvgSrc","strokeDashArray","origFill","fill","getSvgStyles","paintFirst","FILL","concat","filtered","toDataURL","getAttribute","setSrc","signal","loadImage","then","img","set","toString","filter","minimumScale","objectScale","getTotalObjectScaling","scaleX","scaleY","elementToFilter","_filteredEl","group","_filterScalingX","_filterScalingY","_lastScaleX","_lastScaleY","canvasEl","createCanvasElementFor","isNeutralState","imgElement","sourceWidth","sourceHeight","getContext","clearRect","_render","imageSmoothingEnabled","isMoving","_needsResize","_renderPaintInOrder","drawCacheOnCanvas","shouldCache","needsItsOwnCache","_renderFill","elementToDraw","Math","max","elWidth","elHeight","sX","sY","sW","min","sH","maxDestW","maxDestH","drawImage","scale","_resetWidthHeight","parsePreserveAspectRatioAttribute","pAR","preserveAspectRatio","pWidth","pHeight","parsedAttributes","rWidth","rHeight","offsetLeft","offsetTop","offset","alignX","NONE","alignY","meetOrSlice","findScaleToFit","findScaleToCover","fromObject","_ref","f","rf","type","object","Promise","all","enlivenObjects","enlivenObjectEnlivables","_ref2","hydratedProps","fromURL","url","imageOptions","fromElement","cssRules","parseAttributes","ATTRIBUTE_NAMES","catch","err","log","cacheProperties","SHARED_ATTRIBUTES","classRegistry","setClass","setSVGClass"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Image.mjs","sources":["../../../src/shapes/Image.ts"],"sourcesContent":["import { getFabricDocument, getEnv } from '../env';\nimport type { BaseFilter } from '../filters/BaseFilter';\nimport { getFilterBackend } from '../filters/FilterBackend';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type {\n TClassProperties,\n TCrossOrigin,\n TSize,\n Abortable,\n TOptions,\n} from '../typedefs';\nimport { uid } from '../util/internals/uid';\nimport { createCanvasElementFor } from '../util/misc/dom';\nimport { findScaleToCover, findScaleToFit } from '../util/misc/findScaleTo';\nimport type { LoadImageOptions } from '../util/misc/objectEnlive';\nimport {\n enlivenObjectEnlivables,\n enlivenObjects,\n loadImage,\n} from '../util/misc/objectEnlive';\nimport { parsePreserveAspectRatioAttribute } from '../util/misc/svgParsing';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport { WebGLFilterBackend } from '../filters/WebGLFilterBackend';\nimport { FILL, NONE } from '../constants';\nimport { getDocumentFromElement } from '../util/dom_misc';\nimport type { CSSRules } from '../parser/typedefs';\nimport type { Resize, ResizeSerializedProps } from '../filters/Resize';\nimport type { TCachedFabricObject } from './Object/Object';\nimport { log } from '../util/internals/console';\nimport { escapeXml } from '../util/lang_string';\n\n// @todo Would be nice to have filtering code not imported directly.\n\nexport type ImageSource =\n | HTMLImageElement\n | HTMLVideoElement\n | HTMLCanvasElement;\n\nexport type ParsedPAROffsets = {\n width: number;\n height: number;\n scaleX: number;\n scaleY: number;\n offsetLeft: number;\n offsetTop: number;\n cropX: number;\n cropY: number;\n};\n\ninterface UniqueImageProps {\n srcFromAttribute: boolean;\n minimumScaleTrigger: number;\n cropX: number;\n cropY: number;\n imageSmoothing: boolean;\n filters: BaseFilter<string, Record<string, any>>[];\n resizeFilter?: Resize;\n}\n\nexport const imageDefaultValues: Partial<TClassProperties<FabricImage>> = {\n strokeWidth: 0,\n srcFromAttribute: false,\n minimumScaleTrigger: 0.5,\n cropX: 0,\n cropY: 0,\n imageSmoothing: true,\n};\n\nexport interface SerializedImageProps extends SerializedObjectProps {\n src: string;\n crossOrigin: TCrossOrigin;\n filters: any[];\n resizeFilter?: ResizeSerializedProps;\n cropX: number;\n cropY: number;\n}\n\nexport interface ImageProps extends FabricObjectProps, UniqueImageProps {}\n\nconst IMAGE_PROPS = ['cropX', 'cropY'] as const;\n\n/**\n * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-1#images}\n */\nexport class FabricImage<\n Props extends TOptions<ImageProps> = Partial<ImageProps>,\n SProps extends SerializedImageProps = SerializedImageProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n>\n extends FabricObject<Props, SProps, EventSpec>\n implements ImageProps\n{\n /**\n * When calling {@link FabricImage.getSrc}, return value from element src with `element.getAttribute('src')`.\n * This allows for relative urls as image src.\n * @since 2.7.0\n * @type Boolean\n * @default false\n */\n declare srcFromAttribute: boolean;\n\n /**\n * private\n * contains last value of scaleX to detect\n * if the Image got resized after the last Render\n * @type Number\n */\n protected _lastScaleX = 1;\n\n /**\n * private\n * contains last value of scaleY to detect\n * if the Image got resized after the last Render\n * @type Number\n */\n protected _lastScaleY = 1;\n\n /**\n * private\n * contains last value of scaling applied by the apply filter chain\n * @type Number\n */\n protected _filterScalingX = 1;\n\n /**\n * private\n * contains last value of scaling applied by the apply filter chain\n * @type Number\n */\n protected _filterScalingY = 1;\n\n /**\n * minimum scale factor under which any resizeFilter is triggered to resize the image\n * 0 will disable the automatic resize. 1 will trigger automatically always.\n * number bigger than 1 are not implemented yet.\n * @type Number\n */\n declare minimumScaleTrigger: number;\n\n /**\n * key used to retrieve the texture representing this image\n * @since 2.0.0\n * @type String\n */\n declare cacheKey: string;\n\n /**\n * Image crop in pixels from original image size.\n * @since 2.0.0\n * @type Number\n */\n declare cropX: number;\n\n /**\n * Image crop in pixels from original image size.\n * @since 2.0.0\n * @type Number\n */\n declare cropY: number;\n\n /**\n * Indicates whether this canvas will use image smoothing when painting this image.\n * Also influence if the cacheCanvas for this image uses imageSmoothing\n * @since 4.0.0-beta.11\n * @type Boolean\n */\n declare imageSmoothing: boolean;\n\n declare preserveAspectRatio: string;\n\n declare protected src: string;\n\n declare filters: BaseFilter<string, Record<string, any>>[];\n declare resizeFilter: Resize;\n\n declare _element: ImageSource;\n declare _filteredEl?: HTMLCanvasElement;\n declare _originalElement: ImageSource;\n\n static type = 'Image';\n\n static cacheProperties = [...cacheProperties, ...IMAGE_PROPS];\n\n static ownDefaults = imageDefaultValues;\n\n static getDefaults(): Record<string, any> {\n return {\n ...super.getDefaults(),\n ...FabricImage.ownDefaults,\n };\n }\n /**\n * Constructor\n * Image can be initialized with any canvas drawable or a string.\n * The string should be a url and will be loaded as an image.\n * Canvas and Image element work out of the box, while videos require extra code to work.\n * Please check video element events for seeking.\n * @param {ImageSource | string} element Image element\n * @param {Object} [options] Options object\n */\n constructor(elementId: string, options?: Props);\n constructor(element: ImageSource, options?: Props);\n constructor(arg0: ImageSource | string, options?: Props) {\n super();\n this.filters = [];\n Object.assign(this, FabricImage.ownDefaults);\n this.setOptions(options);\n this.cacheKey = `texture${uid()}`;\n this.setElement(\n typeof arg0 === 'string'\n ? ((\n (this.canvas && getDocumentFromElement(this.canvas.getElement())) ||\n getFabricDocument()\n ).getElementById(arg0) as ImageSource)\n : arg0,\n options,\n );\n }\n\n /**\n * Returns image element which this instance if based on\n */\n getElement() {\n return this._element;\n }\n\n /**\n * Sets image element for this instance to a specified one.\n * If filters defined they are applied to new image.\n * You might need to call `canvas.renderAll` and `object.setCoords` after replacing, to render new image and update controls area.\n * @param {HTMLImageElement} element\n * @param {Partial<TSize>} [size] Options object\n */\n setElement(element: ImageSource, size: Partial<TSize> = {}) {\n this.removeTexture(this.cacheKey);\n this.removeTexture(`${this.cacheKey}_filtered`);\n this._element = element;\n this._originalElement = element;\n this._setWidthHeight(size);\n if (this.filters.length !== 0) {\n this.applyFilters();\n }\n // resizeFilters work on the already filtered copy.\n // we need to apply resizeFilters AFTER normal filters.\n // applyResizeFilters is run more often than normal filters\n // and is triggered by user interactions rather than dev code\n if (this.resizeFilter) {\n this.applyResizeFilters();\n }\n }\n\n /**\n * Delete a single texture if in webgl mode\n */\n removeTexture(key: string) {\n const backend = getFilterBackend(false);\n if (backend instanceof WebGLFilterBackend) {\n backend.evictCachesForKey(key);\n }\n }\n\n /**\n * Delete textures, reference to elements and eventually JSDOM cleanup\n */\n dispose() {\n super.dispose();\n this.removeTexture(this.cacheKey);\n this.removeTexture(`${this.cacheKey}_filtered`);\n this._cacheContext = null;\n (\n ['_originalElement', '_element', '_filteredEl', '_cacheCanvas'] as const\n ).forEach((elementKey) => {\n const el = this[elementKey];\n el && getEnv().dispose(el);\n // @ts-expect-error disposing\n this[elementKey] = undefined;\n });\n }\n\n /**\n * Get the crossOrigin value (of the corresponding image element)\n */\n getCrossOrigin(): string | null {\n return (\n this._originalElement &&\n ((this._originalElement as any).crossOrigin || null)\n );\n }\n\n /**\n * Returns original size of an image\n */\n getOriginalSize() {\n const element = this.getElement() as any;\n if (!element) {\n return {\n width: 0,\n height: 0,\n };\n }\n return {\n width: element.naturalWidth || element.width,\n height: element.naturalHeight || element.height,\n };\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _stroke(ctx: CanvasRenderingContext2D) {\n if (!this.stroke || this.strokeWidth === 0) {\n return;\n }\n const w = this.width / 2,\n h = this.height / 2;\n ctx.beginPath();\n ctx.moveTo(-w, -h);\n ctx.lineTo(w, -h);\n ctx.lineTo(w, h);\n ctx.lineTo(-w, h);\n ctx.lineTo(-w, -h);\n ctx.closePath();\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject<\n T extends Omit<Props & TClassProperties<this>, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick<T, K> & SProps {\n const filters: Record<string, any>[] = [];\n this.filters.forEach((filterObj) => {\n filterObj && filters.push(filterObj.toObject());\n });\n return {\n ...super.toObject([...IMAGE_PROPS, ...propertiesToInclude]),\n src: this.getSrc(),\n crossOrigin: this.getCrossOrigin(),\n filters,\n ...(this.resizeFilter\n ? { resizeFilter: this.resizeFilter.toObject() }\n : {}),\n };\n }\n\n /**\n * Returns true if an image has crop applied, inspecting values of cropX,cropY,width,height.\n * @return {Boolean}\n */\n hasCrop() {\n return (\n !!this.cropX ||\n !!this.cropY ||\n this.width < this._element.width ||\n this.height < this._element.height\n );\n }\n\n /**\n * Returns svg representation of an instance\n * @return {string[]} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const imageMarkup: string[] = [],\n element = this._element,\n x = -this.width / 2,\n y = -this.height / 2;\n let svgString: string[] = [],\n strokeSvg: string[] = [],\n clipPath = '',\n imageRendering = '';\n if (!element) {\n return [];\n }\n if (this.hasCrop()) {\n const clipPathId = uid();\n svgString.push(\n '<clipPath id=\"imageCrop_' + clipPathId + '\">\\n',\n '\\t<rect x=\"' +\n x +\n '\" y=\"' +\n y +\n '\" width=\"' +\n escapeXml(this.width) +\n '\" height=\"' +\n escapeXml(this.height) +\n '\" />\\n',\n '</clipPath>\\n',\n );\n clipPath = ' clip-path=\"url(#imageCrop_' + clipPathId + ')\" ';\n }\n if (!this.imageSmoothing) {\n imageRendering = ' image-rendering=\"optimizeSpeed\"';\n }\n imageMarkup.push(\n '\\t<image ',\n 'COMMON_PARTS',\n `xlink:href=\"${escapeXml(this.getSrc(true))}\" x=\"${x - this.cropX}\" y=\"${\n y - this.cropY\n // we're essentially moving origin of transformation from top/left corner to the center of the shape\n // by wrapping it in container <g> element with actual transformation, then offsetting object to the top/left\n // so that object's center aligns with container's left/top\n }\" width=\"${\n element.width || (element as HTMLImageElement).naturalWidth\n }\" height=\"${\n element.height || (element as HTMLImageElement).naturalHeight\n }\"${imageRendering}${clipPath}></image>\\n`,\n );\n\n if (this.stroke || this.strokeDashArray) {\n const origFill = this.fill;\n this.fill = null;\n strokeSvg = [\n `\\t<rect x=\"${x}\" y=\"${y}\" width=\"${escapeXml(this.width)}\" height=\"${escapeXml(\n this.height,\n )}\" style=\"${this.getSvgStyles()}\" />\\n`,\n ];\n this.fill = origFill;\n }\n if (this.paintFirst !== FILL) {\n svgString = svgString.concat(strokeSvg, imageMarkup);\n } else {\n svgString = svgString.concat(imageMarkup, strokeSvg);\n }\n return svgString;\n }\n\n /**\n * Returns source of an image\n * @param {Boolean} filtered indicates if the src is needed for svg\n * @return {String} Source of an image\n */\n getSrc(filtered?: boolean): string {\n const element = filtered ? this._element : this._originalElement;\n if (element) {\n if ((element as HTMLCanvasElement).toDataURL) {\n return (element as HTMLCanvasElement).toDataURL();\n }\n\n if (this.srcFromAttribute) {\n return element.getAttribute('src') || '';\n } else {\n return (element as HTMLImageElement).src;\n }\n } else {\n return this.src || '';\n }\n }\n\n /**\n * Alias for getSrc\n * @param filtered\n * @deprecated\n */\n getSvgSrc(filtered?: boolean) {\n return this.getSrc(filtered);\n }\n\n /**\n * Loads and sets source of an image\\\n * **IMPORTANT**: It is recommended to abort loading tasks before calling this method to prevent race conditions and unnecessary networking\n * @param {String} src Source string (URL)\n * @param {LoadImageOptions} [options] Options object\n */\n setSrc(\n src: string,\n { crossOrigin, signal }: LoadImageOptions = {},\n ): Promise<void> {\n return loadImage(src, { crossOrigin, signal }).then((img) => {\n typeof crossOrigin !== 'undefined' && this.set({ crossOrigin });\n this.setElement(img);\n });\n }\n\n /**\n * Returns string representation of an instance\n * @return {String} String representation of an instance\n */\n toString() {\n return `#<Image: { src: \"${this.getSrc()}\" }>`;\n }\n\n applyResizeFilters() {\n const filter = this.resizeFilter,\n minimumScale = this.minimumScaleTrigger,\n objectScale = this.getTotalObjectScaling(),\n scaleX = objectScale.x,\n scaleY = objectScale.y,\n elementToFilter = this._filteredEl || this._originalElement;\n if (this.group) {\n this.set('dirty', true);\n }\n if (!filter || (scaleX > minimumScale && scaleY > minimumScale)) {\n this._element = elementToFilter;\n this._filterScalingX = 1;\n this._filterScalingY = 1;\n this._lastScaleX = scaleX;\n this._lastScaleY = scaleY;\n return;\n }\n const canvasEl = createCanvasElementFor(elementToFilter),\n { width, height } = elementToFilter;\n this._element = canvasEl;\n this._lastScaleX = filter.scaleX = scaleX;\n this._lastScaleY = filter.scaleY = scaleY;\n getFilterBackend().applyFilters(\n [filter],\n elementToFilter,\n width,\n height,\n this._element,\n );\n this._filterScalingX = canvasEl.width / this._originalElement.width;\n this._filterScalingY = canvasEl.height / this._originalElement.height;\n }\n\n /**\n * Applies filters assigned to this image (from \"filters\" array) or from filter param\n * @param {Array} filters to be applied\n * @param {Boolean} forResizing specify if the filter operation is a resize operation\n */\n applyFilters(\n filters: BaseFilter<string, Record<string, any>>[] = this.filters || [],\n ) {\n filters = filters.filter((filter) => filter && !filter.isNeutralState());\n this.set('dirty', true);\n\n // needs to clear out or WEBGL will not resize correctly\n this.removeTexture(`${this.cacheKey}_filtered`);\n\n if (filters.length === 0) {\n this._element = this._originalElement;\n // this is unsafe and needs to be rethinkend\n this._filteredEl = undefined;\n this._filterScalingX = 1;\n this._filterScalingY = 1;\n return;\n }\n\n const imgElement = this._originalElement,\n sourceWidth =\n (imgElement as HTMLImageElement).naturalWidth || imgElement.width,\n sourceHeight =\n (imgElement as HTMLImageElement).naturalHeight || imgElement.height;\n\n if (this._element === this._originalElement) {\n // if the _element a reference to _originalElement\n // we need to create a new element to host the filtered pixels\n const canvasEl = createCanvasElementFor({\n width: sourceWidth,\n height: sourceHeight,\n });\n this._element = canvasEl;\n this._filteredEl = canvasEl;\n } else if (this._filteredEl) {\n // if the _element is it own element,\n // and we also have a _filteredEl, then we clean up _filteredEl\n // and we assign it to _element.\n // in this way we invalidate the eventual old resize filtered element\n this._element = this._filteredEl;\n this._filteredEl\n .getContext('2d')!\n .clearRect(0, 0, sourceWidth, sourceHeight);\n // we also need to resize again at next renderAll, so remove saved _lastScaleX/Y\n this._lastScaleX = 1;\n this._lastScaleY = 1;\n }\n getFilterBackend().applyFilters(\n filters,\n this._originalElement,\n sourceWidth,\n sourceHeight,\n this._element as HTMLCanvasElement,\n this.cacheKey,\n );\n if (\n this._originalElement.width !== this._element.width ||\n this._originalElement.height !== this._element.height\n ) {\n this._filterScalingX = this._element.width / this._originalElement.width;\n this._filterScalingY =\n this._element.height / this._originalElement.height;\n }\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n ctx.imageSmoothingEnabled = this.imageSmoothing;\n if (this.isMoving !== true && this.resizeFilter && this._needsResize()) {\n this.applyResizeFilters();\n }\n this._stroke(ctx);\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Paint the cached copy of the object on the target context.\n * it will set the imageSmoothing for the draw operation\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawCacheOnCanvas(\n this: TCachedFabricObject<FabricImage>,\n ctx: CanvasRenderingContext2D,\n ) {\n ctx.imageSmoothingEnabled = this.imageSmoothing;\n super.drawCacheOnCanvas(ctx);\n }\n\n /**\n * Decide if the FabricImage should cache or not. Create its own cache level\n * needsItsOwnCache should be used when the object drawing method requires\n * a cache step.\n * Generally you do not cache objects in groups because the group outside is cached.\n * This is the special Image version where we would like to avoid caching where possible.\n * Essentially images do not benefit from caching. They may require caching, and in that\n * case we do it. Also caching an image usually ends in a loss of details.\n * A full performance audit should be done.\n * @return {Boolean}\n */\n shouldCache() {\n return this.needsItsOwnCache();\n }\n\n _renderFill(ctx: CanvasRenderingContext2D) {\n const elementToDraw = this._element;\n if (!elementToDraw) {\n return;\n }\n const scaleX = this._filterScalingX,\n scaleY = this._filterScalingY,\n w = this.width,\n h = this.height,\n // crop values cannot be lesser than 0.\n cropX = Math.max(this.cropX, 0),\n cropY = Math.max(this.cropY, 0),\n elWidth =\n (elementToDraw as HTMLImageElement).naturalWidth || elementToDraw.width,\n elHeight =\n (elementToDraw as HTMLImageElement).naturalHeight ||\n elementToDraw.height,\n sX = cropX * scaleX,\n sY = cropY * scaleY,\n // the width height cannot exceed element width/height, starting from the crop offset.\n sW = Math.min(w * scaleX, elWidth - sX),\n sH = Math.min(h * scaleY, elHeight - sY),\n x = -w / 2,\n y = -h / 2,\n maxDestW = Math.min(w, elWidth / scaleX - cropX),\n maxDestH = Math.min(h, elHeight / scaleY - cropY);\n\n elementToDraw &&\n ctx.drawImage(elementToDraw, sX, sY, sW, sH, x, y, maxDestW, maxDestH);\n }\n\n /**\n * needed to check if image needs resize\n * @private\n */\n _needsResize() {\n const scale = this.getTotalObjectScaling();\n return scale.x !== this._lastScaleX || scale.y !== this._lastScaleY;\n }\n\n /**\n * @private\n * @deprecated unused\n */\n _resetWidthHeight() {\n this.set(this.getOriginalSize());\n }\n\n /**\n * @private\n * Set the width and the height of the image object, using the element or the\n * options.\n */\n _setWidthHeight({ width, height }: Partial<TSize> = {}) {\n const size = this.getOriginalSize();\n this.width = width || size.width;\n this.height = height || size.height;\n }\n\n /**\n * Calculate offset for center and scale factor for the image in order to respect\n * the preserveAspectRatio attribute\n * @private\n */\n parsePreserveAspectRatioAttribute(): ParsedPAROffsets {\n const pAR = parsePreserveAspectRatioAttribute(\n this.preserveAspectRatio || '',\n ),\n pWidth = this.width,\n pHeight = this.height,\n parsedAttributes = { width: pWidth, height: pHeight };\n let rWidth = this._element.width,\n rHeight = this._element.height,\n scaleX = 1,\n scaleY = 1,\n offsetLeft = 0,\n offsetTop = 0,\n cropX = 0,\n cropY = 0,\n offset;\n\n if (pAR && (pAR.alignX !== NONE || pAR.alignY !== NONE)) {\n if (pAR.meetOrSlice === 'meet') {\n scaleX = scaleY = findScaleToFit(this._element, parsedAttributes);\n offset = (pWidth - rWidth * scaleX) / 2;\n if (pAR.alignX === 'Min') {\n offsetLeft = -offset;\n }\n if (pAR.alignX === 'Max') {\n offsetLeft = offset;\n }\n offset = (pHeight - rHeight * scaleY) / 2;\n if (pAR.alignY === 'Min') {\n offsetTop = -offset;\n }\n if (pAR.alignY === 'Max') {\n offsetTop = offset;\n }\n }\n if (pAR.meetOrSlice === 'slice') {\n scaleX = scaleY = findScaleToCover(this._element, parsedAttributes);\n offset = rWidth - pWidth / scaleX;\n if (pAR.alignX === 'Mid') {\n cropX = offset / 2;\n }\n if (pAR.alignX === 'Max') {\n cropX = offset;\n }\n offset = rHeight - pHeight / scaleY;\n if (pAR.alignY === 'Mid') {\n cropY = offset / 2;\n }\n if (pAR.alignY === 'Max') {\n cropY = offset;\n }\n rWidth = pWidth / scaleX;\n rHeight = pHeight / scaleY;\n }\n } else {\n scaleX = pWidth / rWidth;\n scaleY = pHeight / rHeight;\n }\n return {\n width: rWidth,\n height: rHeight,\n scaleX,\n scaleY,\n offsetLeft,\n offsetTop,\n cropX,\n cropY,\n };\n }\n\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link FabricImage.fromElement})\n * @see {@link http://www.w3.org/TR/SVG/struct.html#ImageElement}\n */\n static ATTRIBUTE_NAMES = [\n ...SHARED_ATTRIBUTES,\n 'x',\n 'y',\n 'width',\n 'height',\n 'preserveAspectRatio',\n 'xlink:href',\n 'href',\n 'crossOrigin',\n 'image-rendering',\n ];\n\n /**\n * Creates an instance of FabricImage from its object representation\n * @param {Object} object Object to create an instance from\n * @param {object} [options] Options object\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise<FabricImage>}\n */\n static fromObject<T extends TOptions<SerializedImageProps>>(\n { filters: f, resizeFilter: rf, src, crossOrigin, type, ...object }: T,\n options?: Abortable,\n ) {\n return Promise.all([\n loadImage(src!, { ...options, crossOrigin }),\n f && enlivenObjects<BaseFilter<string>>(f, options),\n // redundant - handled by enlivenObjectEnlivables, but nicely explicit\n rf ? enlivenObjects<Resize>([rf], options) : [],\n enlivenObjectEnlivables(object, options),\n ]).then(([el, filters = [], [resizeFilter], hydratedProps = {}]) => {\n return new this(el, {\n ...object,\n // TODO: passing src creates a difference between image creation and restoring from JSON\n src,\n filters,\n resizeFilter,\n ...hydratedProps,\n });\n });\n }\n\n /**\n * Creates an instance of Image from an URL string\n * @param {String} url URL to create an image from\n * @param {LoadImageOptions} [options] Options object\n * @returns {Promise<FabricImage>}\n */\n static fromURL<T extends TOptions<ImageProps>>(\n url: string,\n { crossOrigin = null, signal }: LoadImageOptions = {},\n imageOptions?: T,\n ): Promise<FabricImage> {\n return loadImage(url, { crossOrigin, signal }).then(\n (img) => new this(img, imageOptions),\n );\n }\n\n /**\n * Returns {@link FabricImage} instance from an SVG element\n * @param {HTMLElement} element Element to parse\n * @param {Object} [options] Options object\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @param {Function} callback Callback to execute when Image object is created\n */\n static async fromElement(\n element: HTMLElement,\n options: Abortable = {},\n cssRules?: CSSRules,\n ) {\n const parsedAttributes = parseAttributes(\n element,\n this.ATTRIBUTE_NAMES,\n cssRules,\n );\n return this.fromURL(\n parsedAttributes['xlink:href'] || parsedAttributes['href'],\n options,\n parsedAttributes,\n ).catch((err) => {\n log('log', 'Unable to parse Image', err);\n return null;\n });\n }\n}\n\nclassRegistry.setClass(FabricImage);\nclassRegistry.setSVGClass(FabricImage);\n"],"names":["imageDefaultValues","strokeWidth","srcFromAttribute","minimumScaleTrigger","cropX","cropY","imageSmoothing","IMAGE_PROPS","FabricImage","FabricObject","getDefaults","ownDefaults","constructor","arg0","options","_defineProperty","filters","Object","assign","setOptions","cacheKey","uid","setElement","canvas","getDocumentFromElement","getElement","getFabricDocument","getElementById","_element","element","size","arguments","length","undefined","removeTexture","_originalElement","_setWidthHeight","applyFilters","resizeFilter","applyResizeFilters","key","backend","getFilterBackend","WebGLFilterBackend","evictCachesForKey","dispose","_cacheContext","forEach","elementKey","el","getEnv","getCrossOrigin","crossOrigin","getOriginalSize","width","height","naturalWidth","naturalHeight","_stroke","ctx","stroke","w","h","beginPath","moveTo","lineTo","closePath","toObject","propertiesToInclude","filterObj","push","src","getSrc","hasCrop","_toSVG","imageMarkup","x","y","svgString","strokeSvg","clipPath","imageRendering","clipPathId","escapeXml","strokeDashArray","origFill","fill","getSvgStyles","paintFirst","FILL","concat","filtered","toDataURL","getAttribute","getSvgSrc","setSrc","signal","loadImage","then","img","set","toString","filter","minimumScale","objectScale","getTotalObjectScaling","scaleX","scaleY","elementToFilter","_filteredEl","group","_filterScalingX","_filterScalingY","_lastScaleX","_lastScaleY","canvasEl","createCanvasElementFor","isNeutralState","imgElement","sourceWidth","sourceHeight","getContext","clearRect","_render","imageSmoothingEnabled","isMoving","_needsResize","_renderPaintInOrder","drawCacheOnCanvas","shouldCache","needsItsOwnCache","_renderFill","elementToDraw","Math","max","elWidth","elHeight","sX","sY","sW","min","sH","maxDestW","maxDestH","drawImage","scale","_resetWidthHeight","parsePreserveAspectRatioAttribute","pAR","preserveAspectRatio","pWidth","pHeight","parsedAttributes","rWidth","rHeight","offsetLeft","offsetTop","offset","alignX","NONE","alignY","meetOrSlice","findScaleToFit","findScaleToCover","fromObject","_ref","f","rf","type","object","Promise","all","enlivenObjects","enlivenObjectEnlivables","_ref2","hydratedProps","fromURL","url","imageOptions","fromElement","cssRules","parseAttributes","ATTRIBUTE_NAMES","catch","err","log","cacheProperties","SHARED_ATTRIBUTES","classRegistry","setClass","setSVGClass"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Line.d.ts","sourceRoot":"","sources":["../../../src/shapes/Line.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEzE,OAAO,EAAE,YAAY,EAAmB,MAAM,uBAAuB,CAAC;AACtE,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEjC,OAAO,KAAK,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAC/E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGrD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAMnD,UAAU,eAAe;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,mBACf,SAAQ,qBAAqB,
|
|
1
|
+
{"version":3,"file":"Line.d.ts","sourceRoot":"","sources":["../../../src/shapes/Line.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEzE,OAAO,EAAE,YAAY,EAAmB,MAAM,uBAAuB,CAAC;AACtE,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEjC,OAAO,KAAK,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAC/E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGrD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAMnD,UAAU,eAAe;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,mBACf,SAAQ,qBAAqB,EAAE,eAAe;CAAG;AAEnD;;;;;;GAMG;AACH,qBAAa,IAAI,CACf,KAAK,SAAS,QAAQ,CAAC,iBAAiB,CAAC,GAAG,OAAO,CAAC,iBAAiB,CAAC,EACtE,MAAM,SAAS,mBAAmB,GAAG,mBAAmB,EACxD,SAAS,SAAS,YAAY,GAAG,YAAY,CAE7C,SAAQ,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAC7C,YAAW,eAAe;IAE1B;;;OAGG;IACK,EAAE,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACK,EAAE,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACK,EAAE,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACK,EAAE,EAAE,MAAM,CAAC;IAEnB,MAAM,CAAC,IAAI,SAAU;IAErB,MAAM,CAAC,eAAe,WAAuC;IAC7D;;;;;OAKG;gBACS,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,mCAAe,EAAE,OAAO,GAAE,OAAO,CAAC,KAAK,CAAM;IAczE;;;OAGG;IACH,eAAe;IAYf;;;;OAIG;IACH,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG;IAc5B;;;OAGG;IACH,OAAO,CAAC,GAAG,EAAE,wBAAwB;IAsBrC;;;;;OAKG;IACH,sBAAsB,IAAI,KAAK;IAI/B;;;;OAIG;IACH,QAAQ,CACN,CAAC,SAAS,IAAI,CAAC,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,EAAE,MAAM,MAAM,CAAC,EAC5D,CAAC,SAAS,MAAM,CAAC,GAAG,KAAK,EACzB,mBAAmB,GAAE,CAAC,EAAO,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM;IAWrD,4BAA4B,IAAI,KAAK;IAarC;;;;;;OAMG;IACH,cAAc,IAAI,eAAe;IAejC;;;;OAIG;IACH,MAAM;IASN;;;OAGG;IACH,MAAM,CAAC,eAAe,WAAwC;IAE9D;;;;;OAKG;WACU,WAAW,CACtB,OAAO,EAAE,WAAW,EACpB,OAAO,CAAC,EAAE,SAAS,EACnB,QAAQ,CAAC,EAAE,QAAQ;;;IAcrB;;;;OAIG;IACH,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,QAAQ,CAAC,mBAAmB,CAAC,EAAE,EACzD,EAAE,EACF,EAAE,EACF,EAAE,EACF,EAAE,EACF,GAAG,MAAM,EACV,EAAE,CAAC;CAWL"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{defineProperty as t}from"../../_virtual/_rollupPluginBabelHelpers.min.mjs";import{SHARED_ATTRIBUTES as i}from"../parser/attributes.min.mjs";import{parseAttributes as s}from"../parser/parseAttributes.min.mjs";import{classRegistry as e}from"../ClassRegistry.min.mjs";import{FabricObject as o}from"./Object/FabricObject.min.mjs";import{Point as r}from"../Point.min.mjs";import{isFiller as n}from"../util/typeAssertions.min.mjs";import{LEFT as m,TOP as h,CENTER as c}from"../constants.min.mjs";import"../util/misc/vectors.min.mjs";import"../util/misc/projectStroke/StrokeLineJoinProjections.min.mjs";import"../config.min.mjs";import"./Group.min.mjs";import{makeBoundingBoxFromPoints as l}from"../util/misc/boundingBoxFromPoints.min.mjs";import"../cache.min.mjs";import"../parser/constants.min.mjs";import"../util/animation/AnimationRegistry.min.mjs";import{cacheProperties as a}from"./Object/defaultValues.min.mjs";const p=["x1","x2","y1","y2"];class y extends o{constructor(){let[t,i,s,e]=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[0,0,0,0],o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};super(),Object.assign(this,y.ownDefaults),this.setOptions(o),this.x1=t,this.x2=s,this.y1=i,this.y2=e,this._setWidthHeight();const{left:r,top:n}=o;"number"==typeof r&&this.set(m,r),"number"==typeof n&&this.set(h,n)}_setWidthHeight(){const{x1:t,y1:i,x2:s,y2:e}=this;this.width=Math.abs(s-t),this.height=Math.abs(e-i);const{left:o,top:n,width:m,height:h}=l([{x:t,y:i},{x:s,y:e}]),a=new r(o+m/2,n+h/2);this.setPositionByOrigin(a,c,c)}_set(t,i){return super._set(t,i),p.includes(t)&&this._setWidthHeight(),this}_render(t){t.beginPath();const i=this.calcLinePoints();t.moveTo(i.x1,i.y1),t.lineTo(i.x2,i.y2),t.lineWidth=this.strokeWidth;const s=t.strokeStyle;var e;n(this.stroke)?t.strokeStyle=this.stroke.toLive(t):t.strokeStyle=null!==(e=this.stroke)&&void 0!==e?e:t.fillStyle;this.stroke&&this._renderStroke(t),t.strokeStyle=s}_findCenterFromElement(){return new r((this.x1+this.x2)/2,(this.y1+this.y2)/2)}toObject(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return{...super.toObject(t),...this.calcLinePoints()}}_getNonTransformedDimensions(){const t=super._getNonTransformedDimensions();return"butt"===this.strokeLineCap&&(0===this.width&&(t.y-=this.strokeWidth),0===this.height&&(t.x-=this.strokeWidth)),t}calcLinePoints(){const{x1:t,x2:i,y1:s,y2:e,width:o,height:r}=this,n=t<=i
|
|
1
|
+
import{defineProperty as t}from"../../_virtual/_rollupPluginBabelHelpers.min.mjs";import{SHARED_ATTRIBUTES as i}from"../parser/attributes.min.mjs";import{parseAttributes as s}from"../parser/parseAttributes.min.mjs";import{classRegistry as e}from"../ClassRegistry.min.mjs";import{FabricObject as o}from"./Object/FabricObject.min.mjs";import{Point as r}from"../Point.min.mjs";import{isFiller as n}from"../util/typeAssertions.min.mjs";import{LEFT as m,TOP as h,CENTER as c}from"../constants.min.mjs";import"../util/misc/vectors.min.mjs";import"../util/misc/projectStroke/StrokeLineJoinProjections.min.mjs";import"../config.min.mjs";import"./Group.min.mjs";import{makeBoundingBoxFromPoints as l}from"../util/misc/boundingBoxFromPoints.min.mjs";import"../cache.min.mjs";import"../parser/constants.min.mjs";import"../util/animation/AnimationRegistry.min.mjs";import{cacheProperties as a}from"./Object/defaultValues.min.mjs";const p=["x1","x2","y1","y2"];class y extends o{constructor(){let[t,i,s,e]=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[0,0,0,0],o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};super(),Object.assign(this,y.ownDefaults),this.setOptions(o),this.x1=t,this.x2=s,this.y1=i,this.y2=e,this._setWidthHeight();const{left:r,top:n}=o;"number"==typeof r&&this.set(m,r),"number"==typeof n&&this.set(h,n)}_setWidthHeight(){const{x1:t,y1:i,x2:s,y2:e}=this;this.width=Math.abs(s-t),this.height=Math.abs(e-i);const{left:o,top:n,width:m,height:h}=l([{x:t,y:i},{x:s,y:e}]),a=new r(o+m/2,n+h/2);this.setPositionByOrigin(a,c,c)}_set(t,i){return super._set(t,i),p.includes(t)&&this._setWidthHeight(),this}_render(t){t.beginPath();const i=this.calcLinePoints();t.moveTo(i.x1,i.y1),t.lineTo(i.x2,i.y2),t.lineWidth=this.strokeWidth;const s=t.strokeStyle;var e;n(this.stroke)?t.strokeStyle=this.stroke.toLive(t):t.strokeStyle=null!==(e=this.stroke)&&void 0!==e?e:t.fillStyle;this.stroke&&this._renderStroke(t),t.strokeStyle=s}_findCenterFromElement(){return new r((this.x1+this.x2)/2,(this.y1+this.y2)/2)}toObject(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return{...super.toObject(t),...this.calcLinePoints()}}_getNonTransformedDimensions(){const t=super._getNonTransformedDimensions();return"butt"===this.strokeLineCap&&(0===this.width&&(t.y-=this.strokeWidth),0===this.height&&(t.x-=this.strokeWidth)),t}calcLinePoints(){const{x1:t,x2:i,y1:s,y2:e,width:o,height:r}=this,n=t<=i?-.5:.5,m=s<=e?-.5:.5;return{x1:n*o,x2:n*-o,y1:m*r,y2:m*-r}}_toSVG(){const{x1:t,x2:i,y1:s,y2:e}=this.calcLinePoints();return["<line ","COMMON_PARTS",`x1="${t}" y1="${s}" x2="${i}" y2="${e}" />\n`]}static async fromElement(t,i,e){const{x1:o=0,y1:r=0,x2:n=0,y2:m=0,...h}=s(t,this.ATTRIBUTE_NAMES,e);return new this([o,r,n,m],h)}static fromObject(t){let{x1:i,y1:s,x2:e,y2:o,...r}=t;return this._fromObject({...r,points:[i,s,e,o]},{extraParam:"points"})}}t(y,"type","Line"),t(y,"cacheProperties",[...a,...p]),t(y,"ATTRIBUTE_NAMES",i.concat(p)),e.setClass(y),e.setSVGClass(y);export{y as Line};
|
|
2
2
|
//# sourceMappingURL=Line.min.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Line.min.mjs","sources":["../../../src/shapes/Line.ts"],"sourcesContent":["import { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport { Point } from '../Point';\nimport { isFiller } from '../util/typeAssertions';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport { makeBoundingBoxFromPoints } from '../util';\nimport { CENTER, LEFT, TOP } from '../constants';\nimport type { CSSRules } from '../parser/typedefs';\n\n// @TODO this code is terrible and Line should be a special case of polyline.\n\nconst coordProps = ['x1', 'x2', 'y1', 'y2'] as const;\n\ninterface UniqueLineProps {\n x1: number;\n x2: number;\n y1: number;\n y2: number;\n}\n\nexport interface SerializedLineProps\n extends SerializedObjectProps,\n UniqueLineProps {}\n\n/**\n * A Class to draw a line\n * A bunch of methods will be added to Polyline to handle the line case\n * The line class is very strange to work with, is all special, it hardly aligns\n * to what a developer want everytime there is an angle\n * @deprecated\n */\nexport class Line<\n Props extends TOptions<FabricObjectProps> = Partial<FabricObjectProps>,\n SProps extends SerializedLineProps = SerializedLineProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject<Props, SProps, EventSpec>\n implements UniqueLineProps\n{\n /**\n * x value or first line edge\n * @type number\n */\n declare x1: number;\n\n /**\n * y value or first line edge\n * @type number\n */\n declare y1: number;\n\n /**\n * x value or second line edge\n * @type number\n */\n declare x2: number;\n\n /**\n * y value or second line edge\n * @type number\n */\n declare y2: number;\n\n static type = 'Line';\n\n static cacheProperties = [...cacheProperties, ...coordProps];\n /**\n * Constructor\n * @param {Array} [points] Array of points\n * @param {Object} [options] Options object\n * @return {Line} thisArg\n */\n constructor([x1, y1, x2, y2] = [0, 0, 0, 0], options: Partial<Props> = {}) {\n super();\n Object.assign(this, Line.ownDefaults);\n this.setOptions(options);\n this.x1 = x1;\n this.x2 = x2;\n this.y1 = y1;\n this.y2 = y2;\n this._setWidthHeight();\n const { left, top } = options;\n typeof left === 'number' && this.set(LEFT, left);\n typeof top === 'number' && this.set(TOP, top);\n }\n\n /**\n * @private\n * @param {Object} [options] Options\n */\n _setWidthHeight() {\n const { x1, y1, x2, y2 } = this;\n this.width = Math.abs(x2 - x1);\n this.height = Math.abs(y2 - y1);\n const { left, top, width, height } = makeBoundingBoxFromPoints([\n { x: x1, y: y1 },\n { x: x2, y: y2 },\n ]);\n const position = new Point(left + width / 2, top + height / 2);\n this.setPositionByOrigin(position, CENTER, CENTER);\n }\n\n /**\n * @private\n * @param {String} key\n * @param {*} value\n */\n _set(key: string, value: any) {\n super._set(key, value);\n if (coordProps.includes(key as keyof UniqueLineProps)) {\n // this doesn't make sense very much, since setting x1 when top or left\n // are already set, is just going to show a strange result since the\n // line will move way more than the developer expect.\n // in fabric5 it worked only when the line didn't have extra transformations,\n // in fabric6 too. With extra transform they behave bad in different ways.\n // This needs probably a good rework or a tutorial if you have to create a dynamic line\n this._setWidthHeight();\n }\n return this;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n ctx.beginPath();\n\n const p = this.calcLinePoints();\n ctx.moveTo(p.x1, p.y1);\n ctx.lineTo(p.x2, p.y2);\n\n ctx.lineWidth = this.strokeWidth;\n\n // TODO: test this\n // make sure setting \"fill\" changes color of a line\n // (by copying fillStyle to strokeStyle, since line is stroked, not filled)\n const origStrokeStyle = ctx.strokeStyle;\n if (isFiller(this.stroke)) {\n ctx.strokeStyle = this.stroke.toLive(ctx)!;\n } else {\n ctx.strokeStyle = this.stroke ?? ctx.fillStyle;\n }\n this.stroke && this._renderStroke(ctx);\n ctx.strokeStyle = origStrokeStyle;\n }\n\n /**\n * This function is an helper for svg import. it returns the center of the object in the svg\n * untransformed coordinates\n * @private\n * @return {Point} center point from element coordinates\n */\n _findCenterFromElement(): Point {\n return new Point((this.x1 + this.x2) / 2, (this.y1 + this.y2) / 2);\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit<Props & TClassProperties<this>, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick<T, K> & SProps {\n return {\n ...super.toObject(propertiesToInclude),\n ...this.calcLinePoints(),\n };\n }\n\n /*\n * Calculate object dimensions from its properties\n * @private\n */\n _getNonTransformedDimensions(): Point {\n const dim = super._getNonTransformedDimensions();\n if (this.strokeLineCap === 'butt') {\n if (this.width === 0) {\n dim.y -= this.strokeWidth;\n }\n if (this.height === 0) {\n dim.x -= this.strokeWidth;\n }\n }\n return dim;\n }\n\n /**\n * Recalculates line points given width and height\n * Those points are simply placed around the center,\n * This is not useful outside internal render functions and svg output\n * Is not meant to be for the developer.\n * @private\n */\n calcLinePoints(): UniqueLineProps {\n const { x1: _x1, x2: _x2, y1: _y1, y2: _y2, width, height } = this;\n const xMult = _x1 <= _x2 ? -1 : 1,\n yMult = _y1 <= _y2 ? -1 : 1,\n x1 = (xMult * width) / 2,\n y1 = (yMult * height) / 2,\n x2 = (xMult * -width) / 2,\n y2 = (yMult * -height) / 2;\n\n return {\n x1,\n x2,\n y1,\n y2,\n };\n }\n\n /* _FROM_SVG_START_ */\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const { x1, x2, y1, y2 } = this.calcLinePoints();\n return [\n '<line ',\n 'COMMON_PARTS',\n `x1=\"${x1}\" y1=\"${y1}\" x2=\"${x2}\" y2=\"${y2}\" />\\n`,\n ];\n }\n\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link Line.fromElement})\n * @see http://www.w3.org/TR/SVG/shapes.html#LineElement\n */\n static ATTRIBUTE_NAMES = SHARED_ATTRIBUTES.concat(coordProps);\n\n /**\n * Returns Line instance from an SVG element\n * @param {HTMLElement} element Element to parse\n * @param {Object} [options] Options object\n * @param {Function} [callback] callback function invoked after parsing\n */\n static async fromElement(\n element: HTMLElement,\n options?: Abortable,\n cssRules?: CSSRules,\n ) {\n const {\n x1 = 0,\n y1 = 0,\n x2 = 0,\n y2 = 0,\n ...parsedAttributes\n } = parseAttributes(element, this.ATTRIBUTE_NAMES, cssRules);\n return new this([x1, y1, x2, y2], parsedAttributes);\n }\n\n /* _FROM_SVG_END_ */\n\n /**\n * Returns Line instance from an object representation\n * @param {Object} object Object to create an instance from\n * @returns {Promise<Line>}\n */\n static fromObject<T extends TOptions<SerializedLineProps>>({\n x1,\n y1,\n x2,\n y2,\n ...object\n }: T) {\n return this._fromObject<Line>(\n {\n ...object,\n points: [x1, y1, x2, y2],\n },\n {\n extraParam: 'points',\n },\n );\n }\n}\n\nclassRegistry.setClass(Line);\nclassRegistry.setSVGClass(Line);\n"],"names":["coordProps","Line","FabricObject","constructor","x1","y1","x2","y2","arguments","length","undefined","options","super","Object","assign","this","ownDefaults","setOptions","_setWidthHeight","left","top","set","LEFT","TOP","width","Math","abs","height","makeBoundingBoxFromPoints","x","y","position","Point","setPositionByOrigin","CENTER","_set","key","value","includes","_render","ctx","beginPath","p","calcLinePoints","moveTo","lineTo","lineWidth","strokeWidth","origStrokeStyle","strokeStyle","_this$stroke","isFiller","stroke","toLive","fillStyle","_renderStroke","_findCenterFromElement","toObject","propertiesToInclude","_getNonTransformedDimensions","dim","strokeLineCap","_x1","_x2","_y1","_y2","xMult","yMult","_toSVG","fromElement","element","cssRules","parsedAttributes","parseAttributes","ATTRIBUTE_NAMES","fromObject","_ref","object","_fromObject","points","extraParam","_defineProperty","cacheProperties","SHARED_ATTRIBUTES","concat","classRegistry","setClass","setSVGClass"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Line.min.mjs","sources":["../../../src/shapes/Line.ts"],"sourcesContent":["import { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport { Point } from '../Point';\nimport { isFiller } from '../util/typeAssertions';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport { makeBoundingBoxFromPoints } from '../util';\nimport { CENTER, LEFT, TOP } from '../constants';\nimport type { CSSRules } from '../parser/typedefs';\n\n// @TODO this code is terrible and Line should be a special case of polyline.\n\nconst coordProps = ['x1', 'x2', 'y1', 'y2'] as const;\n\ninterface UniqueLineProps {\n x1: number;\n x2: number;\n y1: number;\n y2: number;\n}\n\nexport interface SerializedLineProps\n extends SerializedObjectProps, UniqueLineProps {}\n\n/**\n * A Class to draw a line\n * A bunch of methods will be added to Polyline to handle the line case\n * The line class is very strange to work with, is all special, it hardly aligns\n * to what a developer want everytime there is an angle\n * @deprecated\n */\nexport class Line<\n Props extends TOptions<FabricObjectProps> = Partial<FabricObjectProps>,\n SProps extends SerializedLineProps = SerializedLineProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n>\n extends FabricObject<Props, SProps, EventSpec>\n implements UniqueLineProps\n{\n /**\n * x value or first line edge\n * @type number\n */\n declare x1: number;\n\n /**\n * y value or first line edge\n * @type number\n */\n declare y1: number;\n\n /**\n * x value or second line edge\n * @type number\n */\n declare x2: number;\n\n /**\n * y value or second line edge\n * @type number\n */\n declare y2: number;\n\n static type = 'Line';\n\n static cacheProperties = [...cacheProperties, ...coordProps];\n /**\n * Constructor\n * @param {Array} [points] Array of points\n * @param {Object} [options] Options object\n * @return {Line} thisArg\n */\n constructor([x1, y1, x2, y2] = [0, 0, 0, 0], options: Partial<Props> = {}) {\n super();\n Object.assign(this, Line.ownDefaults);\n this.setOptions(options);\n this.x1 = x1;\n this.x2 = x2;\n this.y1 = y1;\n this.y2 = y2;\n this._setWidthHeight();\n const { left, top } = options;\n typeof left === 'number' && this.set(LEFT, left);\n typeof top === 'number' && this.set(TOP, top);\n }\n\n /**\n * @private\n * @param {Object} [options] Options\n */\n _setWidthHeight() {\n const { x1, y1, x2, y2 } = this;\n this.width = Math.abs(x2 - x1);\n this.height = Math.abs(y2 - y1);\n const { left, top, width, height } = makeBoundingBoxFromPoints([\n { x: x1, y: y1 },\n { x: x2, y: y2 },\n ]);\n const position = new Point(left + width / 2, top + height / 2);\n this.setPositionByOrigin(position, CENTER, CENTER);\n }\n\n /**\n * @private\n * @param {String} key\n * @param {*} value\n */\n _set(key: string, value: any) {\n super._set(key, value);\n if (coordProps.includes(key as keyof UniqueLineProps)) {\n // this doesn't make sense very much, since setting x1 when top or left\n // are already set, is just going to show a strange result since the\n // line will move way more than the developer expect.\n // in fabric5 it worked only when the line didn't have extra transformations,\n // in fabric6 too. With extra transform they behave bad in different ways.\n // This needs probably a good rework or a tutorial if you have to create a dynamic line\n this._setWidthHeight();\n }\n return this;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n ctx.beginPath();\n\n const p = this.calcLinePoints();\n ctx.moveTo(p.x1, p.y1);\n ctx.lineTo(p.x2, p.y2);\n\n ctx.lineWidth = this.strokeWidth;\n\n // TODO: test this\n // make sure setting \"fill\" changes color of a line\n // (by copying fillStyle to strokeStyle, since line is stroked, not filled)\n const origStrokeStyle = ctx.strokeStyle;\n if (isFiller(this.stroke)) {\n ctx.strokeStyle = this.stroke.toLive(ctx)!;\n } else {\n ctx.strokeStyle = this.stroke ?? ctx.fillStyle;\n }\n this.stroke && this._renderStroke(ctx);\n ctx.strokeStyle = origStrokeStyle;\n }\n\n /**\n * This function is an helper for svg import. it returns the center of the object in the svg\n * untransformed coordinates\n * @private\n * @return {Point} center point from element coordinates\n */\n _findCenterFromElement(): Point {\n return new Point((this.x1 + this.x2) / 2, (this.y1 + this.y2) / 2);\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit<Props & TClassProperties<this>, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick<T, K> & SProps {\n return {\n ...super.toObject(propertiesToInclude),\n ...this.calcLinePoints(),\n };\n }\n\n /*\n * Calculate object dimensions from its properties\n * @private\n */\n _getNonTransformedDimensions(): Point {\n const dim = super._getNonTransformedDimensions();\n if (this.strokeLineCap === 'butt') {\n if (this.width === 0) {\n dim.y -= this.strokeWidth;\n }\n if (this.height === 0) {\n dim.x -= this.strokeWidth;\n }\n }\n return dim;\n }\n\n /**\n * Recalculates line points given width and height\n * Those points are simply placed around the center,\n * This is not useful outside internal render functions and svg output\n * Is not meant to be for the developer.\n * @private\n */\n calcLinePoints(): UniqueLineProps {\n const { x1: _x1, x2: _x2, y1: _y1, y2: _y2, width, height } = this;\n const xMult = _x1 <= _x2 ? -0.5 : 0.5,\n yMult = _y1 <= _y2 ? -0.5 : 0.5;\n\n return {\n x1: xMult * width,\n x2: xMult * -width,\n y1: yMult * height,\n y2: yMult * -height,\n };\n }\n\n /* _FROM_SVG_START_ */\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const { x1, x2, y1, y2 } = this.calcLinePoints();\n return [\n '<line ',\n 'COMMON_PARTS',\n `x1=\"${x1}\" y1=\"${y1}\" x2=\"${x2}\" y2=\"${y2}\" />\\n`,\n ];\n }\n\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link Line.fromElement})\n * @see http://www.w3.org/TR/SVG/shapes.html#LineElement\n */\n static ATTRIBUTE_NAMES = SHARED_ATTRIBUTES.concat(coordProps);\n\n /**\n * Returns Line instance from an SVG element\n * @param {HTMLElement} element Element to parse\n * @param {Object} [options] Options object\n * @param {Function} [callback] callback function invoked after parsing\n */\n static async fromElement(\n element: HTMLElement,\n options?: Abortable,\n cssRules?: CSSRules,\n ) {\n const {\n x1 = 0,\n y1 = 0,\n x2 = 0,\n y2 = 0,\n ...parsedAttributes\n } = parseAttributes(element, this.ATTRIBUTE_NAMES, cssRules);\n return new this([x1, y1, x2, y2], parsedAttributes);\n }\n\n /* _FROM_SVG_END_ */\n\n /**\n * Returns Line instance from an object representation\n * @param {Object} object Object to create an instance from\n * @returns {Promise<Line>}\n */\n static fromObject<T extends TOptions<SerializedLineProps>>({\n x1,\n y1,\n x2,\n y2,\n ...object\n }: T) {\n return this._fromObject<Line>(\n {\n ...object,\n points: [x1, y1, x2, y2],\n },\n {\n extraParam: 'points',\n },\n );\n }\n}\n\nclassRegistry.setClass(Line);\nclassRegistry.setSVGClass(Line);\n"],"names":["coordProps","Line","FabricObject","constructor","x1","y1","x2","y2","arguments","length","undefined","options","super","Object","assign","this","ownDefaults","setOptions","_setWidthHeight","left","top","set","LEFT","TOP","width","Math","abs","height","makeBoundingBoxFromPoints","x","y","position","Point","setPositionByOrigin","CENTER","_set","key","value","includes","_render","ctx","beginPath","p","calcLinePoints","moveTo","lineTo","lineWidth","strokeWidth","origStrokeStyle","strokeStyle","_this$stroke","isFiller","stroke","toLive","fillStyle","_renderStroke","_findCenterFromElement","toObject","propertiesToInclude","_getNonTransformedDimensions","dim","strokeLineCap","_x1","_x2","_y1","_y2","xMult","yMult","_toSVG","fromElement","element","cssRules","parsedAttributes","parseAttributes","ATTRIBUTE_NAMES","fromObject","_ref","object","_fromObject","points","extraParam","_defineProperty","cacheProperties","SHARED_ATTRIBUTES","concat","classRegistry","setClass","setSVGClass"],"mappings":"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"}
|
package/dist/src/shapes/Line.mjs
CHANGED
|
@@ -181,17 +181,13 @@ class Line extends FabricObject {
|
|
|
181
181
|
width,
|
|
182
182
|
height
|
|
183
183
|
} = this;
|
|
184
|
-
const xMult = _x1 <= _x2 ? -
|
|
185
|
-
yMult = _y1 <= _y2 ? -
|
|
186
|
-
x1 = xMult * width / 2,
|
|
187
|
-
y1 = yMult * height / 2,
|
|
188
|
-
x2 = xMult * -width / 2,
|
|
189
|
-
y2 = yMult * -height / 2;
|
|
184
|
+
const xMult = _x1 <= _x2 ? -0.5 : 0.5,
|
|
185
|
+
yMult = _y1 <= _y2 ? -0.5 : 0.5;
|
|
190
186
|
return {
|
|
191
|
-
x1,
|
|
192
|
-
x2,
|
|
193
|
-
y1,
|
|
194
|
-
y2
|
|
187
|
+
x1: xMult * width,
|
|
188
|
+
x2: xMult * -width,
|
|
189
|
+
y1: yMult * height,
|
|
190
|
+
y2: yMult * -height
|
|
195
191
|
};
|
|
196
192
|
}
|
|
197
193
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Line.mjs","sources":["../../../src/shapes/Line.ts"],"sourcesContent":["import { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport { Point } from '../Point';\nimport { isFiller } from '../util/typeAssertions';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport { makeBoundingBoxFromPoints } from '../util';\nimport { CENTER, LEFT, TOP } from '../constants';\nimport type { CSSRules } from '../parser/typedefs';\n\n// @TODO this code is terrible and Line should be a special case of polyline.\n\nconst coordProps = ['x1', 'x2', 'y1', 'y2'] as const;\n\ninterface UniqueLineProps {\n x1: number;\n x2: number;\n y1: number;\n y2: number;\n}\n\nexport interface SerializedLineProps\n extends SerializedObjectProps,\n UniqueLineProps {}\n\n/**\n * A Class to draw a line\n * A bunch of methods will be added to Polyline to handle the line case\n * The line class is very strange to work with, is all special, it hardly aligns\n * to what a developer want everytime there is an angle\n * @deprecated\n */\nexport class Line<\n Props extends TOptions<FabricObjectProps> = Partial<FabricObjectProps>,\n SProps extends SerializedLineProps = SerializedLineProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject<Props, SProps, EventSpec>\n implements UniqueLineProps\n{\n /**\n * x value or first line edge\n * @type number\n */\n declare x1: number;\n\n /**\n * y value or first line edge\n * @type number\n */\n declare y1: number;\n\n /**\n * x value or second line edge\n * @type number\n */\n declare x2: number;\n\n /**\n * y value or second line edge\n * @type number\n */\n declare y2: number;\n\n static type = 'Line';\n\n static cacheProperties = [...cacheProperties, ...coordProps];\n /**\n * Constructor\n * @param {Array} [points] Array of points\n * @param {Object} [options] Options object\n * @return {Line} thisArg\n */\n constructor([x1, y1, x2, y2] = [0, 0, 0, 0], options: Partial<Props> = {}) {\n super();\n Object.assign(this, Line.ownDefaults);\n this.setOptions(options);\n this.x1 = x1;\n this.x2 = x2;\n this.y1 = y1;\n this.y2 = y2;\n this._setWidthHeight();\n const { left, top } = options;\n typeof left === 'number' && this.set(LEFT, left);\n typeof top === 'number' && this.set(TOP, top);\n }\n\n /**\n * @private\n * @param {Object} [options] Options\n */\n _setWidthHeight() {\n const { x1, y1, x2, y2 } = this;\n this.width = Math.abs(x2 - x1);\n this.height = Math.abs(y2 - y1);\n const { left, top, width, height } = makeBoundingBoxFromPoints([\n { x: x1, y: y1 },\n { x: x2, y: y2 },\n ]);\n const position = new Point(left + width / 2, top + height / 2);\n this.setPositionByOrigin(position, CENTER, CENTER);\n }\n\n /**\n * @private\n * @param {String} key\n * @param {*} value\n */\n _set(key: string, value: any) {\n super._set(key, value);\n if (coordProps.includes(key as keyof UniqueLineProps)) {\n // this doesn't make sense very much, since setting x1 when top or left\n // are already set, is just going to show a strange result since the\n // line will move way more than the developer expect.\n // in fabric5 it worked only when the line didn't have extra transformations,\n // in fabric6 too. With extra transform they behave bad in different ways.\n // This needs probably a good rework or a tutorial if you have to create a dynamic line\n this._setWidthHeight();\n }\n return this;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n ctx.beginPath();\n\n const p = this.calcLinePoints();\n ctx.moveTo(p.x1, p.y1);\n ctx.lineTo(p.x2, p.y2);\n\n ctx.lineWidth = this.strokeWidth;\n\n // TODO: test this\n // make sure setting \"fill\" changes color of a line\n // (by copying fillStyle to strokeStyle, since line is stroked, not filled)\n const origStrokeStyle = ctx.strokeStyle;\n if (isFiller(this.stroke)) {\n ctx.strokeStyle = this.stroke.toLive(ctx)!;\n } else {\n ctx.strokeStyle = this.stroke ?? ctx.fillStyle;\n }\n this.stroke && this._renderStroke(ctx);\n ctx.strokeStyle = origStrokeStyle;\n }\n\n /**\n * This function is an helper for svg import. it returns the center of the object in the svg\n * untransformed coordinates\n * @private\n * @return {Point} center point from element coordinates\n */\n _findCenterFromElement(): Point {\n return new Point((this.x1 + this.x2) / 2, (this.y1 + this.y2) / 2);\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit<Props & TClassProperties<this>, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick<T, K> & SProps {\n return {\n ...super.toObject(propertiesToInclude),\n ...this.calcLinePoints(),\n };\n }\n\n /*\n * Calculate object dimensions from its properties\n * @private\n */\n _getNonTransformedDimensions(): Point {\n const dim = super._getNonTransformedDimensions();\n if (this.strokeLineCap === 'butt') {\n if (this.width === 0) {\n dim.y -= this.strokeWidth;\n }\n if (this.height === 0) {\n dim.x -= this.strokeWidth;\n }\n }\n return dim;\n }\n\n /**\n * Recalculates line points given width and height\n * Those points are simply placed around the center,\n * This is not useful outside internal render functions and svg output\n * Is not meant to be for the developer.\n * @private\n */\n calcLinePoints(): UniqueLineProps {\n const { x1: _x1, x2: _x2, y1: _y1, y2: _y2, width, height } = this;\n const xMult = _x1 <= _x2 ? -1 : 1,\n yMult = _y1 <= _y2 ? -1 : 1,\n x1 = (xMult * width) / 2,\n y1 = (yMult * height) / 2,\n x2 = (xMult * -width) / 2,\n y2 = (yMult * -height) / 2;\n\n return {\n x1,\n x2,\n y1,\n y2,\n };\n }\n\n /* _FROM_SVG_START_ */\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const { x1, x2, y1, y2 } = this.calcLinePoints();\n return [\n '<line ',\n 'COMMON_PARTS',\n `x1=\"${x1}\" y1=\"${y1}\" x2=\"${x2}\" y2=\"${y2}\" />\\n`,\n ];\n }\n\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link Line.fromElement})\n * @see http://www.w3.org/TR/SVG/shapes.html#LineElement\n */\n static ATTRIBUTE_NAMES = SHARED_ATTRIBUTES.concat(coordProps);\n\n /**\n * Returns Line instance from an SVG element\n * @param {HTMLElement} element Element to parse\n * @param {Object} [options] Options object\n * @param {Function} [callback] callback function invoked after parsing\n */\n static async fromElement(\n element: HTMLElement,\n options?: Abortable,\n cssRules?: CSSRules,\n ) {\n const {\n x1 = 0,\n y1 = 0,\n x2 = 0,\n y2 = 0,\n ...parsedAttributes\n } = parseAttributes(element, this.ATTRIBUTE_NAMES, cssRules);\n return new this([x1, y1, x2, y2], parsedAttributes);\n }\n\n /* _FROM_SVG_END_ */\n\n /**\n * Returns Line instance from an object representation\n * @param {Object} object Object to create an instance from\n * @returns {Promise<Line>}\n */\n static fromObject<T extends TOptions<SerializedLineProps>>({\n x1,\n y1,\n x2,\n y2,\n ...object\n }: T) {\n return this._fromObject<Line>(\n {\n ...object,\n points: [x1, y1, x2, y2],\n },\n {\n extraParam: 'points',\n },\n );\n }\n}\n\nclassRegistry.setClass(Line);\nclassRegistry.setSVGClass(Line);\n"],"names":["coordProps","Line","FabricObject","constructor","x1","y1","x2","y2","arguments","length","undefined","options","Object","assign","ownDefaults","setOptions","_setWidthHeight","left","top","set","LEFT","TOP","width","Math","abs","height","makeBoundingBoxFromPoints","x","y","position","Point","setPositionByOrigin","CENTER","_set","key","value","includes","_render","ctx","beginPath","p","calcLinePoints","moveTo","lineTo","lineWidth","strokeWidth","origStrokeStyle","strokeStyle","isFiller","stroke","toLive","_this$stroke","fillStyle","_renderStroke","_findCenterFromElement","toObject","propertiesToInclude","_getNonTransformedDimensions","dim","strokeLineCap","_x1","_x2","_y1","_y2","xMult","yMult","_toSVG","fromElement","element","cssRules","parsedAttributes","parseAttributes","ATTRIBUTE_NAMES","fromObject","_ref","object","_fromObject","points","extraParam","_defineProperty","cacheProperties","SHARED_ATTRIBUTES","concat","classRegistry","setClass","setSVGClass"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Line.mjs","sources":["../../../src/shapes/Line.ts"],"sourcesContent":["import { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport { Point } from '../Point';\nimport { isFiller } from '../util/typeAssertions';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport { makeBoundingBoxFromPoints } from '../util';\nimport { CENTER, LEFT, TOP } from '../constants';\nimport type { CSSRules } from '../parser/typedefs';\n\n// @TODO this code is terrible and Line should be a special case of polyline.\n\nconst coordProps = ['x1', 'x2', 'y1', 'y2'] as const;\n\ninterface UniqueLineProps {\n x1: number;\n x2: number;\n y1: number;\n y2: number;\n}\n\nexport interface SerializedLineProps\n extends SerializedObjectProps, UniqueLineProps {}\n\n/**\n * A Class to draw a line\n * A bunch of methods will be added to Polyline to handle the line case\n * The line class is very strange to work with, is all special, it hardly aligns\n * to what a developer want everytime there is an angle\n * @deprecated\n */\nexport class Line<\n Props extends TOptions<FabricObjectProps> = Partial<FabricObjectProps>,\n SProps extends SerializedLineProps = SerializedLineProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n>\n extends FabricObject<Props, SProps, EventSpec>\n implements UniqueLineProps\n{\n /**\n * x value or first line edge\n * @type number\n */\n declare x1: number;\n\n /**\n * y value or first line edge\n * @type number\n */\n declare y1: number;\n\n /**\n * x value or second line edge\n * @type number\n */\n declare x2: number;\n\n /**\n * y value or second line edge\n * @type number\n */\n declare y2: number;\n\n static type = 'Line';\n\n static cacheProperties = [...cacheProperties, ...coordProps];\n /**\n * Constructor\n * @param {Array} [points] Array of points\n * @param {Object} [options] Options object\n * @return {Line} thisArg\n */\n constructor([x1, y1, x2, y2] = [0, 0, 0, 0], options: Partial<Props> = {}) {\n super();\n Object.assign(this, Line.ownDefaults);\n this.setOptions(options);\n this.x1 = x1;\n this.x2 = x2;\n this.y1 = y1;\n this.y2 = y2;\n this._setWidthHeight();\n const { left, top } = options;\n typeof left === 'number' && this.set(LEFT, left);\n typeof top === 'number' && this.set(TOP, top);\n }\n\n /**\n * @private\n * @param {Object} [options] Options\n */\n _setWidthHeight() {\n const { x1, y1, x2, y2 } = this;\n this.width = Math.abs(x2 - x1);\n this.height = Math.abs(y2 - y1);\n const { left, top, width, height } = makeBoundingBoxFromPoints([\n { x: x1, y: y1 },\n { x: x2, y: y2 },\n ]);\n const position = new Point(left + width / 2, top + height / 2);\n this.setPositionByOrigin(position, CENTER, CENTER);\n }\n\n /**\n * @private\n * @param {String} key\n * @param {*} value\n */\n _set(key: string, value: any) {\n super._set(key, value);\n if (coordProps.includes(key as keyof UniqueLineProps)) {\n // this doesn't make sense very much, since setting x1 when top or left\n // are already set, is just going to show a strange result since the\n // line will move way more than the developer expect.\n // in fabric5 it worked only when the line didn't have extra transformations,\n // in fabric6 too. With extra transform they behave bad in different ways.\n // This needs probably a good rework or a tutorial if you have to create a dynamic line\n this._setWidthHeight();\n }\n return this;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n ctx.beginPath();\n\n const p = this.calcLinePoints();\n ctx.moveTo(p.x1, p.y1);\n ctx.lineTo(p.x2, p.y2);\n\n ctx.lineWidth = this.strokeWidth;\n\n // TODO: test this\n // make sure setting \"fill\" changes color of a line\n // (by copying fillStyle to strokeStyle, since line is stroked, not filled)\n const origStrokeStyle = ctx.strokeStyle;\n if (isFiller(this.stroke)) {\n ctx.strokeStyle = this.stroke.toLive(ctx)!;\n } else {\n ctx.strokeStyle = this.stroke ?? ctx.fillStyle;\n }\n this.stroke && this._renderStroke(ctx);\n ctx.strokeStyle = origStrokeStyle;\n }\n\n /**\n * This function is an helper for svg import. it returns the center of the object in the svg\n * untransformed coordinates\n * @private\n * @return {Point} center point from element coordinates\n */\n _findCenterFromElement(): Point {\n return new Point((this.x1 + this.x2) / 2, (this.y1 + this.y2) / 2);\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit<Props & TClassProperties<this>, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick<T, K> & SProps {\n return {\n ...super.toObject(propertiesToInclude),\n ...this.calcLinePoints(),\n };\n }\n\n /*\n * Calculate object dimensions from its properties\n * @private\n */\n _getNonTransformedDimensions(): Point {\n const dim = super._getNonTransformedDimensions();\n if (this.strokeLineCap === 'butt') {\n if (this.width === 0) {\n dim.y -= this.strokeWidth;\n }\n if (this.height === 0) {\n dim.x -= this.strokeWidth;\n }\n }\n return dim;\n }\n\n /**\n * Recalculates line points given width and height\n * Those points are simply placed around the center,\n * This is not useful outside internal render functions and svg output\n * Is not meant to be for the developer.\n * @private\n */\n calcLinePoints(): UniqueLineProps {\n const { x1: _x1, x2: _x2, y1: _y1, y2: _y2, width, height } = this;\n const xMult = _x1 <= _x2 ? -0.5 : 0.5,\n yMult = _y1 <= _y2 ? -0.5 : 0.5;\n\n return {\n x1: xMult * width,\n x2: xMult * -width,\n y1: yMult * height,\n y2: yMult * -height,\n };\n }\n\n /* _FROM_SVG_START_ */\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const { x1, x2, y1, y2 } = this.calcLinePoints();\n return [\n '<line ',\n 'COMMON_PARTS',\n `x1=\"${x1}\" y1=\"${y1}\" x2=\"${x2}\" y2=\"${y2}\" />\\n`,\n ];\n }\n\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link Line.fromElement})\n * @see http://www.w3.org/TR/SVG/shapes.html#LineElement\n */\n static ATTRIBUTE_NAMES = SHARED_ATTRIBUTES.concat(coordProps);\n\n /**\n * Returns Line instance from an SVG element\n * @param {HTMLElement} element Element to parse\n * @param {Object} [options] Options object\n * @param {Function} [callback] callback function invoked after parsing\n */\n static async fromElement(\n element: HTMLElement,\n options?: Abortable,\n cssRules?: CSSRules,\n ) {\n const {\n x1 = 0,\n y1 = 0,\n x2 = 0,\n y2 = 0,\n ...parsedAttributes\n } = parseAttributes(element, this.ATTRIBUTE_NAMES, cssRules);\n return new this([x1, y1, x2, y2], parsedAttributes);\n }\n\n /* _FROM_SVG_END_ */\n\n /**\n * Returns Line instance from an object representation\n * @param {Object} object Object to create an instance from\n * @returns {Promise<Line>}\n */\n static fromObject<T extends TOptions<SerializedLineProps>>({\n x1,\n y1,\n x2,\n y2,\n ...object\n }: T) {\n return this._fromObject<Line>(\n {\n ...object,\n points: [x1, y1, x2, y2],\n },\n {\n extraParam: 'points',\n },\n );\n }\n}\n\nclassRegistry.setClass(Line);\nclassRegistry.setSVGClass(Line);\n"],"names":["coordProps","Line","FabricObject","constructor","x1","y1","x2","y2","arguments","length","undefined","options","Object","assign","ownDefaults","setOptions","_setWidthHeight","left","top","set","LEFT","TOP","width","Math","abs","height","makeBoundingBoxFromPoints","x","y","position","Point","setPositionByOrigin","CENTER","_set","key","value","includes","_render","ctx","beginPath","p","calcLinePoints","moveTo","lineTo","lineWidth","strokeWidth","origStrokeStyle","strokeStyle","isFiller","stroke","toLive","_this$stroke","fillStyle","_renderStroke","_findCenterFromElement","toObject","propertiesToInclude","_getNonTransformedDimensions","dim","strokeLineCap","_x1","_x2","_y1","_y2","xMult","yMult","_toSVG","fromElement","element","cssRules","parsedAttributes","parseAttributes","ATTRIBUTE_NAMES","fromObject","_ref","object","_fromObject","points","extraParam","_defineProperty","cacheProperties","SHARED_ATTRIBUTES","concat","classRegistry","setClass","setSVGClass"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FabricObjectSVGExportMixin.d.ts","sourceRoot":"","sources":["../../../../src/shapes/Object/FabricObjectSVGExportMixin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAIlD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"FabricObjectSVGExportMixin.d.ts","sourceRoot":"","sources":["../../../../src/shapes/Object/FabricObjectSVGExportMixin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAIlD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAKnD,qBAAa,0BAA0B;IACrC;;;;OAIG;IACK,UAAU,CAAC,EAAE,MAAM,CAAC;IAE5B;;;;OAIG;IACH,YAAY,CACV,IAAI,EAAE,0BAA0B,GAAG,YAAY,EAC/C,UAAU,CAAC,EAAE,OAAO;IAmDtB;;;OAGG;IACH,YAAY,CAAC,IAAI,EAAE,0BAA0B,GAAG,YAAY;IAM5D;;;OAGG;IACH,aAAa,CACX,IAAI,EAAE,0BAA0B,GAAG,YAAY,GAAG;QAAE,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE;IAanE;;;;OAIG;IACH,eAAe,CACb,IAAI,EAAE,0BAA0B,GAAG,YAAY,EAC/C,IAAI,CAAC,EAAE,OAAO,EACd,mBAAmB,SAAK;IAO1B;;;;;;OAMG;IACH,MAAM,CAAC,QAAQ,CAAC,EAAE,WAAW,GAAG,MAAM,EAAE;IAIxC;;;;OAIG;IACH,KAAK,CACH,IAAI,EAAE,0BAA0B,GAAG,YAAY,EAC/C,OAAO,CAAC,EAAE,WAAW;IAOvB;;;;OAIG;IACH,aAAa,CACX,IAAI,EAAE,0BAA0B,GAAG,YAAY,EAC/C,OAAO,CAAC,EAAE,WAAW;IAUvB;;OAEG;IACH,4BAA4B,CAC1B,IAAI,EAAE,0BAA0B,GAAG,YAAY,EAC/C,YAAY,EAAE,MAAM,EAAE,EACtB,EACE,OAAO,EACP,mBAAwB,GACzB,GAAE;QAAE,OAAO,CAAC,EAAE,WAAW,CAAC;QAAC,mBAAmB,CAAC,EAAE,MAAM,CAAA;KAAO;IAYjE;;OAEG;IACH,oBAAoB,CAClB,IAAI,EAAE,0BAA0B,GAAG,YAAY,EAC/C,YAAY,EAAE,MAAM,EAAE,EACtB,EACE,OAAO,EACP,OAAO,EACP,UAAU,EACV,mBAAmB,GACpB,GAAE;QACD,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,OAAO,CAAC,EAAE,WAAW,CAAC;QACtB,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,mBAAmB,CAAC,EAAE,MAAM,CAAC;KACzB,GACL,MAAM;IAwDT,aAAa,CAAC,IAAI,EAAE,0BAA0B,GAAG,YAAY;CAK9D"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{uid as t}from"../../util/internals/uid.min.mjs";import{colorPropToSVG as i}from"../../util/misc/svgParsing.min.mjs";import{NONE as s,FILL as r,STROKE as e}from"../../constants.min.mjs";import{isFiller as o}from"../../util/typeAssertions.min.mjs";import{matrixToSVG as h}from"../../util/misc/svgExport.min.mjs";class
|
|
1
|
+
import{uid as t}from"../../util/internals/uid.min.mjs";import{colorPropToSVG as i}from"../../util/misc/svgParsing.min.mjs";import{NONE as s,FILL as r,STROKE as e}from"../../constants.min.mjs";import{isFiller as o}from"../../util/typeAssertions.min.mjs";import{matrixToSVG as h}from"../../util/misc/svgExport.min.mjs";import{escapeXml as n}from"../../util/lang_string.min.mjs";class a{getSvgStyles(t){const o=this.fillRule?this.fillRule:"nonzero",h=this.strokeWidth?this.strokeWidth:"0",a=this.strokeDashArray?this.strokeDashArray.join(" "):s,l=this.strokeDashOffset?this.strokeDashOffset:"0",m=this.strokeLineCap?this.strokeLineCap:"butt",p=this.strokeLineJoin?this.strokeLineJoin:"miter",d=this.strokeMiterLimit?this.strokeMiterLimit:"4",g=void 0!==this.opacity?this.opacity:"1",u=this.visible?"":" visibility: hidden;",c=t?"":this.getSvgFilter(),S=i(r,this.fill);return[i(e,this.stroke),"stroke-width: ",h,"; ","stroke-dasharray: ",a,"; ","stroke-linecap: ",m,"; ","stroke-dashoffset: ",l,"; ","stroke-linejoin: ",p,"; ","stroke-miterlimit: ",d,"; ",S,"fill-rule: ",o,"; ","opacity: ",g,";",c,u].map(t=>n(t)).join("")}getSvgFilter(){return this.shadow?`filter: url(#SVGID_${n(this.shadow.id)});`:""}getSvgCommons(){return[this.id?`id="${n(String(this.id))}" `:"",this.clipPath?`clip-path="url(#${this.clipPath.clipPathId})" `:""].join("")}getSvgTransform(t){let i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";const s=t?this.calcTransformMatrix():this.calcOwnMatrix();return`${`transform="${h(s)}`}${i}" `}_toSVG(t){return[""]}toSVG(t){return this._createBaseSVGMarkup(this._toSVG(t),{reviver:t})}toClipPathSVG(t){return"\t"+this._createBaseClipPathSVGMarkup(this._toSVG(t),{reviver:t})}_createBaseClipPathSVGMarkup(t){let{reviver:i,additionalTransform:s=""}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const r=[this.getSvgTransform(!0,s),this.getSvgCommons()].join(""),e=t.indexOf("COMMON_PARTS");return t[e]=r,i?i(t.join("")):t.join("")}_createBaseSVGMarkup(i){let{noStyle:s,reviver:r,withShadow:e,additionalTransform:h}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const n=s?"":`style="${this.getSvgStyles()}" `,a=e?`style="${this.getSvgFilter()}" `:"",l=this.clipPath,m=this.strokeUniform?'vector-effect="non-scaling-stroke" ':"",p=l&&l.absolutePositioned,d=this.stroke,g=this.fill,u=this.shadow,c=[],S=i.indexOf("COMMON_PARTS");let f;l&&(l.clipPathId=`CLIPPATH_${t()}`,f=`<clipPath id="${l.clipPathId}" >\n${l.toClipPathSVG(r)}</clipPath>\n`),p&&c.push("<g ",a,this.getSvgCommons()," >\n"),c.push("<g ",this.getSvgTransform(!1),p?"":a+this.getSvgCommons()," >\n");const v=[n,m,s?"":this.addPaintOrder()," ",h?`transform="${h}" `:""].join("");return i[S]=v,o(g)&&c.push(g.toSVG(this)),o(d)&&c.push(d.toSVG(this)),u&&c.push(u.toSVG(this)),l&&c.push(f),c.push(i.join("")),c.push("</g>\n"),p&&c.push("</g>\n"),r?r(c.join("")):c.join("")}addPaintOrder(){return this.paintFirst!==r?` paint-order="${n(this.paintFirst)}" `:""}}export{a as FabricObjectSVGExportMixin};
|
|
2
2
|
//# sourceMappingURL=FabricObjectSVGExportMixin.min.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FabricObjectSVGExportMixin.min.mjs","sources":["../../../../src/shapes/Object/FabricObjectSVGExportMixin.ts"],"sourcesContent":["import type { TSVGReviver } from '../../typedefs';\nimport { uid } from '../../util/internals/uid';\nimport { colorPropToSVG } from '../../util/misc/svgParsing';\nimport { FILL, NONE, STROKE } from '../../constants';\nimport type { FabricObject } from './FabricObject';\nimport { isFiller } from '../../util/typeAssertions';\nimport { matrixToSVG } from '../../util/misc/svgExport';\n\nexport class FabricObjectSVGExportMixin {\n /**\n * When an object is being exported as SVG as a clippath, a reference inside the SVG is needed.\n * This reference is a UID in the fabric namespace and is temporary stored here.\n * @type {String}\n */\n declare clipPathId?: string;\n\n /**\n * Returns styles-string for svg-export\n * @param {Boolean} skipShadow a boolean to skip shadow filter output\n * @return {String}\n */\n getSvgStyles(\n this: FabricObjectSVGExportMixin & FabricObject,\n skipShadow?: boolean,\n ) {\n const fillRule = this.fillRule ? this.fillRule : 'nonzero',\n strokeWidth = this.strokeWidth ? this.strokeWidth : '0',\n strokeDashArray = this.strokeDashArray\n ? this.strokeDashArray.join(' ')\n : NONE,\n strokeDashOffset = this.strokeDashOffset ? this.strokeDashOffset : '0',\n strokeLineCap = this.strokeLineCap ? this.strokeLineCap : 'butt',\n strokeLineJoin = this.strokeLineJoin ? this.strokeLineJoin : 'miter',\n strokeMiterLimit = this.strokeMiterLimit ? this.strokeMiterLimit : '4',\n opacity = typeof this.opacity !== 'undefined' ? this.opacity : '1',\n visibility = this.visible ? '' : ' visibility: hidden;',\n filter = skipShadow ? '' : this.getSvgFilter(),\n fill = colorPropToSVG(FILL, this.fill),\n stroke = colorPropToSVG(STROKE, this.stroke);\n\n return [\n stroke,\n 'stroke-width: ',\n strokeWidth,\n '; ',\n 'stroke-dasharray: ',\n strokeDashArray,\n '; ',\n 'stroke-linecap: ',\n strokeLineCap,\n '; ',\n 'stroke-dashoffset: ',\n strokeDashOffset,\n '; ',\n 'stroke-linejoin: ',\n strokeLineJoin,\n '; ',\n 'stroke-miterlimit: ',\n strokeMiterLimit,\n '; ',\n fill,\n 'fill-rule: ',\n fillRule,\n '; ',\n 'opacity: ',\n opacity,\n ';',\n filter,\n visibility,\n ].join('');\n }\n\n /**\n * Returns filter for svg shadow\n * @return {String}\n */\n getSvgFilter(this: FabricObjectSVGExportMixin & FabricObject) {\n return this.shadow ? `filter: url(#SVGID_${this.shadow.id});` : '';\n }\n\n /**\n * Returns id attribute for svg output\n * @return {String}\n */\n getSvgCommons(\n this: FabricObjectSVGExportMixin & FabricObject & { id?: string },\n ) {\n return [\n this.id ? `id=\"${this.id}\" ` : '',\n this.clipPath\n ? `clip-path=\"url(#${\n (this.clipPath as FabricObjectSVGExportMixin & FabricObject)\n .clipPathId\n })\" `\n : '',\n ].join('');\n }\n\n /**\n * Returns transform-string for svg-export\n * @param {Boolean} use the full transform or the single object one.\n * @return {String}\n */\n getSvgTransform(\n this: FabricObjectSVGExportMixin & FabricObject,\n full?: boolean,\n additionalTransform = '',\n ) {\n const transform = full ? this.calcTransformMatrix() : this.calcOwnMatrix(),\n svgTransform = `transform=\"${matrixToSVG(transform)}`;\n return `${svgTransform}${additionalTransform}\" `;\n }\n\n /**\n * Returns svg representation of an instance\n * This function is implemented in each subclass\n * This is just because typescript otherwise cryies all the time\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG(_reviver?: TSVGReviver): string[] {\n return [''];\n }\n\n /**\n * Returns svg representation of an instance\n * @param {TSVGReviver} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toSVG(\n this: FabricObjectSVGExportMixin & FabricObject,\n reviver?: TSVGReviver,\n ) {\n return this._createBaseSVGMarkup(this._toSVG(reviver), {\n reviver,\n });\n }\n\n /**\n * Returns svg clipPath representation of an instance\n * @param {TSVGReviver} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toClipPathSVG(\n this: FabricObjectSVGExportMixin & FabricObject,\n reviver?: TSVGReviver,\n ) {\n return (\n '\\t' +\n this._createBaseClipPathSVGMarkup(this._toSVG(reviver), {\n reviver,\n })\n );\n }\n\n /**\n * @private\n */\n _createBaseClipPathSVGMarkup(\n this: FabricObjectSVGExportMixin & FabricObject,\n objectMarkup: string[],\n {\n reviver,\n additionalTransform = '',\n }: { reviver?: TSVGReviver; additionalTransform?: string } = {},\n ) {\n const commonPieces = [\n this.getSvgTransform(true, additionalTransform),\n this.getSvgCommons(),\n ].join(''),\n // insert commons in the markup, style and svgCommons\n index = objectMarkup.indexOf('COMMON_PARTS');\n objectMarkup[index] = commonPieces;\n return reviver ? reviver(objectMarkup.join('')) : objectMarkup.join('');\n }\n\n /**\n * @private\n */\n _createBaseSVGMarkup(\n this: FabricObjectSVGExportMixin & FabricObject,\n objectMarkup: string[],\n {\n noStyle,\n reviver,\n withShadow,\n additionalTransform,\n }: {\n noStyle?: boolean;\n reviver?: TSVGReviver;\n withShadow?: boolean;\n additionalTransform?: string;\n } = {},\n ): string {\n const styleInfo = noStyle ? '' : `style=\"${this.getSvgStyles()}\" `,\n shadowInfo = withShadow ? `style=\"${this.getSvgFilter()}\" ` : '',\n clipPath = this.clipPath as FabricObjectSVGExportMixin & FabricObject,\n vectorEffect = this.strokeUniform\n ? 'vector-effect=\"non-scaling-stroke\" '\n : '',\n absoluteClipPath = clipPath && clipPath.absolutePositioned,\n stroke = this.stroke,\n fill = this.fill,\n shadow = this.shadow,\n markup = [],\n // insert commons in the markup, style and svgCommons\n index = objectMarkup.indexOf('COMMON_PARTS');\n let clipPathMarkup;\n if (clipPath) {\n clipPath.clipPathId = `CLIPPATH_${uid()}`;\n clipPathMarkup = `<clipPath id=\"${\n clipPath.clipPathId\n }\" >\\n${clipPath.toClipPathSVG(reviver)}</clipPath>\\n`;\n }\n if (absoluteClipPath) {\n markup.push('<g ', shadowInfo, this.getSvgCommons(), ' >\\n');\n }\n markup.push(\n '<g ',\n this.getSvgTransform(false),\n !absoluteClipPath ? shadowInfo + this.getSvgCommons() : '',\n ' >\\n',\n );\n const commonPieces = [\n styleInfo,\n vectorEffect,\n noStyle ? '' : this.addPaintOrder(),\n ' ',\n additionalTransform ? `transform=\"${additionalTransform}\" ` : '',\n ].join('');\n objectMarkup[index] = commonPieces;\n if (isFiller(fill)) {\n markup.push(fill.toSVG(this));\n }\n if (isFiller(stroke)) {\n markup.push(stroke.toSVG(this));\n }\n if (shadow) {\n markup.push(shadow.toSVG(this));\n }\n if (clipPath) {\n markup.push(clipPathMarkup);\n }\n markup.push(objectMarkup.join(''));\n markup.push('</g>\\n');\n absoluteClipPath && markup.push('</g>\\n');\n return reviver ? reviver(markup.join('')) : markup.join('');\n }\n\n addPaintOrder(this: FabricObjectSVGExportMixin & FabricObject) {\n return this.paintFirst !== FILL ? ` paint-order=\"${this.paintFirst}\" ` : '';\n }\n}\n"],"names":["FabricObjectSVGExportMixin","getSvgStyles","skipShadow","fillRule","this","strokeWidth","strokeDashArray","join","NONE","strokeDashOffset","strokeLineCap","strokeLineJoin","strokeMiterLimit","opacity","visibility","visible","filter","getSvgFilter","fill","colorPropToSVG","FILL","STROKE","stroke","shadow","id","getSvgCommons","clipPath","clipPathId","getSvgTransform","full","additionalTransform","arguments","length","undefined","transform","calcTransformMatrix","calcOwnMatrix","matrixToSVG","_toSVG","_reviver","toSVG","reviver","_createBaseSVGMarkup","toClipPathSVG","_createBaseClipPathSVGMarkup","objectMarkup","commonPieces","index","indexOf","noStyle","withShadow","styleInfo","shadowInfo","vectorEffect","strokeUniform","absoluteClipPath","absolutePositioned","markup","clipPathMarkup","uid","push","addPaintOrder","isFiller","paintFirst"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FabricObjectSVGExportMixin.min.mjs","sources":["../../../../src/shapes/Object/FabricObjectSVGExportMixin.ts"],"sourcesContent":["import type { TSVGReviver } from '../../typedefs';\nimport { uid } from '../../util/internals/uid';\nimport { colorPropToSVG } from '../../util/misc/svgParsing';\nimport { FILL, NONE, STROKE } from '../../constants';\nimport type { FabricObject } from './FabricObject';\nimport { isFiller } from '../../util/typeAssertions';\nimport { matrixToSVG } from '../../util/misc/svgExport';\nimport { escapeXml } from '../../util/lang_string';\n\nexport class FabricObjectSVGExportMixin {\n /**\n * When an object is being exported as SVG as a clippath, a reference inside the SVG is needed.\n * This reference is a UID in the fabric namespace and is temporary stored here.\n * @type {String}\n */\n declare clipPathId?: string;\n\n /**\n * Returns styles-string for svg-export\n * @param {Boolean} skipShadow a boolean to skip shadow filter output\n * @return {String}\n */\n getSvgStyles(\n this: FabricObjectSVGExportMixin & FabricObject,\n skipShadow?: boolean,\n ) {\n const fillRule = this.fillRule ? this.fillRule : 'nonzero',\n strokeWidth = this.strokeWidth ? this.strokeWidth : '0',\n strokeDashArray = this.strokeDashArray\n ? this.strokeDashArray.join(' ')\n : NONE,\n strokeDashOffset = this.strokeDashOffset ? this.strokeDashOffset : '0',\n strokeLineCap = this.strokeLineCap ? this.strokeLineCap : 'butt',\n strokeLineJoin = this.strokeLineJoin ? this.strokeLineJoin : 'miter',\n strokeMiterLimit = this.strokeMiterLimit ? this.strokeMiterLimit : '4',\n opacity = typeof this.opacity !== 'undefined' ? this.opacity : '1',\n visibility = this.visible ? '' : ' visibility: hidden;',\n filter = skipShadow ? '' : this.getSvgFilter(),\n fill = colorPropToSVG(FILL, this.fill),\n stroke = colorPropToSVG(STROKE, this.stroke);\n\n return [\n stroke,\n 'stroke-width: ',\n strokeWidth,\n '; ',\n 'stroke-dasharray: ',\n strokeDashArray,\n '; ',\n 'stroke-linecap: ',\n strokeLineCap,\n '; ',\n 'stroke-dashoffset: ',\n strokeDashOffset,\n '; ',\n 'stroke-linejoin: ',\n strokeLineJoin,\n '; ',\n 'stroke-miterlimit: ',\n strokeMiterLimit,\n '; ',\n fill,\n 'fill-rule: ',\n fillRule,\n '; ',\n 'opacity: ',\n opacity,\n ';',\n filter,\n visibility,\n ]\n .map((v) => escapeXml(v))\n .join('');\n }\n\n /**\n * Returns filter for svg shadow\n * @return {String}\n */\n getSvgFilter(this: FabricObjectSVGExportMixin & FabricObject) {\n return this.shadow\n ? `filter: url(#SVGID_${escapeXml(this.shadow.id)});`\n : '';\n }\n\n /**\n * Returns id attribute for svg output\n * @return {String}\n */\n getSvgCommons(\n this: FabricObjectSVGExportMixin & FabricObject & { id?: string },\n ) {\n return [\n this.id ? `id=\"${escapeXml(String(this.id))}\" ` : '',\n this.clipPath\n ? `clip-path=\"url(#${\n (this.clipPath as FabricObjectSVGExportMixin & FabricObject)\n .clipPathId\n })\" `\n : '',\n ].join('');\n }\n\n /**\n * Returns transform-string for svg-export\n * @param {Boolean} use the full transform or the single object one.\n * @return {String}\n */\n getSvgTransform(\n this: FabricObjectSVGExportMixin & FabricObject,\n full?: boolean,\n additionalTransform = '',\n ) {\n const transform = full ? this.calcTransformMatrix() : this.calcOwnMatrix(),\n svgTransform = `transform=\"${matrixToSVG(transform)}`;\n return `${svgTransform}${additionalTransform}\" `;\n }\n\n /**\n * Returns svg representation of an instance\n * This function is implemented in each subclass\n * This is just because typescript otherwise cryies all the time\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG(_reviver?: TSVGReviver): string[] {\n return [''];\n }\n\n /**\n * Returns svg representation of an instance\n * @param {TSVGReviver} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toSVG(\n this: FabricObjectSVGExportMixin & FabricObject,\n reviver?: TSVGReviver,\n ) {\n return this._createBaseSVGMarkup(this._toSVG(reviver), {\n reviver,\n });\n }\n\n /**\n * Returns svg clipPath representation of an instance\n * @param {TSVGReviver} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toClipPathSVG(\n this: FabricObjectSVGExportMixin & FabricObject,\n reviver?: TSVGReviver,\n ) {\n return (\n '\\t' +\n this._createBaseClipPathSVGMarkup(this._toSVG(reviver), {\n reviver,\n })\n );\n }\n\n /**\n * @private\n */\n _createBaseClipPathSVGMarkup(\n this: FabricObjectSVGExportMixin & FabricObject,\n objectMarkup: string[],\n {\n reviver,\n additionalTransform = '',\n }: { reviver?: TSVGReviver; additionalTransform?: string } = {},\n ) {\n const commonPieces = [\n this.getSvgTransform(true, additionalTransform),\n this.getSvgCommons(),\n ].join(''),\n // insert commons in the markup, style and svgCommons\n index = objectMarkup.indexOf('COMMON_PARTS');\n objectMarkup[index] = commonPieces;\n return reviver ? reviver(objectMarkup.join('')) : objectMarkup.join('');\n }\n\n /**\n * @private\n */\n _createBaseSVGMarkup(\n this: FabricObjectSVGExportMixin & FabricObject,\n objectMarkup: string[],\n {\n noStyle,\n reviver,\n withShadow,\n additionalTransform,\n }: {\n noStyle?: boolean;\n reviver?: TSVGReviver;\n withShadow?: boolean;\n additionalTransform?: string;\n } = {},\n ): string {\n const styleInfo = noStyle ? '' : `style=\"${this.getSvgStyles()}\" `,\n shadowInfo = withShadow ? `style=\"${this.getSvgFilter()}\" ` : '',\n clipPath = this.clipPath as FabricObjectSVGExportMixin & FabricObject,\n vectorEffect = this.strokeUniform\n ? 'vector-effect=\"non-scaling-stroke\" '\n : '',\n absoluteClipPath = clipPath && clipPath.absolutePositioned,\n stroke = this.stroke,\n fill = this.fill,\n shadow = this.shadow,\n markup = [],\n // insert commons in the markup, style and svgCommons\n index = objectMarkup.indexOf('COMMON_PARTS');\n let clipPathMarkup;\n if (clipPath) {\n clipPath.clipPathId = `CLIPPATH_${uid()}`;\n clipPathMarkup = `<clipPath id=\"${\n clipPath.clipPathId\n }\" >\\n${clipPath.toClipPathSVG(reviver)}</clipPath>\\n`;\n }\n if (absoluteClipPath) {\n markup.push('<g ', shadowInfo, this.getSvgCommons(), ' >\\n');\n }\n markup.push(\n '<g ',\n this.getSvgTransform(false),\n !absoluteClipPath ? shadowInfo + this.getSvgCommons() : '',\n ' >\\n',\n );\n const commonPieces = [\n styleInfo,\n vectorEffect,\n noStyle ? '' : this.addPaintOrder(),\n ' ',\n additionalTransform ? `transform=\"${additionalTransform}\" ` : '',\n ].join('');\n objectMarkup[index] = commonPieces;\n if (isFiller(fill)) {\n markup.push(fill.toSVG(this));\n }\n if (isFiller(stroke)) {\n markup.push(stroke.toSVG(this));\n }\n if (shadow) {\n markup.push(shadow.toSVG(this));\n }\n if (clipPath) {\n markup.push(clipPathMarkup);\n }\n markup.push(objectMarkup.join(''));\n markup.push('</g>\\n');\n absoluteClipPath && markup.push('</g>\\n');\n return reviver ? reviver(markup.join('')) : markup.join('');\n }\n\n addPaintOrder(this: FabricObjectSVGExportMixin & FabricObject) {\n return this.paintFirst !== FILL\n ? ` paint-order=\"${escapeXml(this.paintFirst)}\" `\n : '';\n }\n}\n"],"names":["FabricObjectSVGExportMixin","getSvgStyles","skipShadow","fillRule","this","strokeWidth","strokeDashArray","join","NONE","strokeDashOffset","strokeLineCap","strokeLineJoin","strokeMiterLimit","opacity","visibility","visible","filter","getSvgFilter","fill","colorPropToSVG","FILL","STROKE","stroke","map","v","escapeXml","shadow","id","getSvgCommons","String","clipPath","clipPathId","getSvgTransform","full","additionalTransform","arguments","length","undefined","transform","calcTransformMatrix","calcOwnMatrix","matrixToSVG","_toSVG","_reviver","toSVG","reviver","_createBaseSVGMarkup","toClipPathSVG","_createBaseClipPathSVGMarkup","objectMarkup","commonPieces","index","indexOf","noStyle","withShadow","styleInfo","shadowInfo","vectorEffect","strokeUniform","absoluteClipPath","absolutePositioned","markup","clipPathMarkup","uid","push","addPaintOrder","isFiller","paintFirst"],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@ import { colorPropToSVG } from '../../util/misc/svgParsing.mjs';
|
|
|
3
3
|
import { NONE, FILL, STROKE } from '../../constants.mjs';
|
|
4
4
|
import { isFiller } from '../../util/typeAssertions.mjs';
|
|
5
5
|
import { matrixToSVG } from '../../util/misc/svgExport.mjs';
|
|
6
|
+
import { escapeXml } from '../../util/lang_string.mjs';
|
|
6
7
|
|
|
7
8
|
class FabricObjectSVGExportMixin {
|
|
8
9
|
/**
|
|
@@ -29,7 +30,7 @@ class FabricObjectSVGExportMixin {
|
|
|
29
30
|
filter = skipShadow ? '' : this.getSvgFilter(),
|
|
30
31
|
fill = colorPropToSVG(FILL, this.fill),
|
|
31
32
|
stroke = colorPropToSVG(STROKE, this.stroke);
|
|
32
|
-
return [stroke, 'stroke-width: ', strokeWidth, '; ', 'stroke-dasharray: ', strokeDashArray, '; ', 'stroke-linecap: ', strokeLineCap, '; ', 'stroke-dashoffset: ', strokeDashOffset, '; ', 'stroke-linejoin: ', strokeLineJoin, '; ', 'stroke-miterlimit: ', strokeMiterLimit, '; ', fill, 'fill-rule: ', fillRule, '; ', 'opacity: ', opacity, ';', filter, visibility].join('');
|
|
33
|
+
return [stroke, 'stroke-width: ', strokeWidth, '; ', 'stroke-dasharray: ', strokeDashArray, '; ', 'stroke-linecap: ', strokeLineCap, '; ', 'stroke-dashoffset: ', strokeDashOffset, '; ', 'stroke-linejoin: ', strokeLineJoin, '; ', 'stroke-miterlimit: ', strokeMiterLimit, '; ', fill, 'fill-rule: ', fillRule, '; ', 'opacity: ', opacity, ';', filter, visibility].map(v => escapeXml(v)).join('');
|
|
33
34
|
}
|
|
34
35
|
|
|
35
36
|
/**
|
|
@@ -37,7 +38,7 @@ class FabricObjectSVGExportMixin {
|
|
|
37
38
|
* @return {String}
|
|
38
39
|
*/
|
|
39
40
|
getSvgFilter() {
|
|
40
|
-
return this.shadow ? `filter: url(#SVGID_${this.shadow.id});` : '';
|
|
41
|
+
return this.shadow ? `filter: url(#SVGID_${escapeXml(this.shadow.id)});` : '';
|
|
41
42
|
}
|
|
42
43
|
|
|
43
44
|
/**
|
|
@@ -45,7 +46,7 @@ class FabricObjectSVGExportMixin {
|
|
|
45
46
|
* @return {String}
|
|
46
47
|
*/
|
|
47
48
|
getSvgCommons() {
|
|
48
|
-
return [this.id ? `id="${this.id}" ` : '', this.clipPath ? `clip-path="url(#${this.clipPath.clipPathId})" ` : ''].join('');
|
|
49
|
+
return [this.id ? `id="${escapeXml(String(this.id))}" ` : '', this.clipPath ? `clip-path="url(#${this.clipPath.clipPathId})" ` : ''].join('');
|
|
49
50
|
}
|
|
50
51
|
|
|
51
52
|
/**
|
|
@@ -158,7 +159,7 @@ class FabricObjectSVGExportMixin {
|
|
|
158
159
|
return reviver ? reviver(markup.join('')) : markup.join('');
|
|
159
160
|
}
|
|
160
161
|
addPaintOrder() {
|
|
161
|
-
return this.paintFirst !== FILL ? ` paint-order="${this.paintFirst}" ` : '';
|
|
162
|
+
return this.paintFirst !== FILL ? ` paint-order="${escapeXml(this.paintFirst)}" ` : '';
|
|
162
163
|
}
|
|
163
164
|
}
|
|
164
165
|
|