@postermywall/fabricjs-2 6.0.0-rc2.0 → 6.0.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/CHANGELOG.md +18 -1
- package/dist/index.js +229 -491
- 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 +229 -491
- package/dist/index.mjs.map +1 -1
- package/dist/index.node.cjs +229 -491
- package/dist/index.node.cjs.map +1 -1
- package/dist/index.node.mjs +229 -491
- 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/canvas/Canvas.d.ts.map +1 -1
- package/dist/src/canvas/Canvas.min.mjs +1 -1
- package/dist/src/canvas/Canvas.min.mjs.map +1 -1
- package/dist/src/canvas/Canvas.mjs +8 -9
- package/dist/src/canvas/Canvas.mjs.map +1 -1
- package/dist/src/canvas/SelectableCanvas.d.ts +1 -1
- 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 +1 -1
- package/dist/src/canvas/SelectableCanvas.mjs.map +1 -1
- package/dist/src/canvas/StaticCanvas.d.ts +4 -4
- 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 +0 -13
- package/dist/src/canvas/StaticCanvas.mjs.map +1 -1
- package/dist/src/color/Color.d.ts +1 -0
- package/dist/src/color/Color.d.ts.map +1 -1
- package/dist/src/color/Color.min.mjs +1 -1
- package/dist/src/color/Color.min.mjs.map +1 -1
- package/dist/src/color/Color.mjs +3 -1
- package/dist/src/color/Color.mjs.map +1 -1
- package/dist/src/filters/BaseFilter.d.ts +16 -23
- package/dist/src/filters/BaseFilter.d.ts.map +1 -1
- package/dist/src/filters/BaseFilter.min.mjs +1 -1
- package/dist/src/filters/BaseFilter.min.mjs.map +1 -1
- package/dist/src/filters/BaseFilter.mjs +24 -41
- package/dist/src/filters/BaseFilter.mjs.map +1 -1
- package/dist/src/filters/BlendColor.d.ts +13 -24
- package/dist/src/filters/BlendColor.d.ts.map +1 -1
- package/dist/src/filters/BlendColor.min.mjs +1 -1
- package/dist/src/filters/BlendColor.min.mjs.map +1 -1
- package/dist/src/filters/BlendColor.mjs +1 -25
- package/dist/src/filters/BlendColor.mjs.map +1 -1
- package/dist/src/filters/BlendImage.d.ts +18 -19
- package/dist/src/filters/BlendImage.d.ts.map +1 -1
- package/dist/src/filters/BlendImage.min.mjs +1 -1
- package/dist/src/filters/BlendImage.min.mjs.map +1 -1
- package/dist/src/filters/BlendImage.mjs +13 -24
- package/dist/src/filters/BlendImage.mjs.map +1 -1
- package/dist/src/filters/Blur.d.ts +10 -12
- package/dist/src/filters/Blur.d.ts.map +1 -1
- package/dist/src/filters/Blur.min.mjs +1 -1
- package/dist/src/filters/Blur.min.mjs.map +1 -1
- package/dist/src/filters/Blur.mjs +5 -14
- package/dist/src/filters/Blur.mjs.map +1 -1
- package/dist/src/filters/Boilerplate.d.ts +11 -13
- package/dist/src/filters/Boilerplate.d.ts.map +1 -1
- package/dist/src/filters/Brightness.d.ts +10 -12
- package/dist/src/filters/Brightness.d.ts.map +1 -1
- package/dist/src/filters/Brightness.min.mjs +1 -1
- package/dist/src/filters/Brightness.min.mjs.map +1 -1
- package/dist/src/filters/Brightness.mjs +4 -16
- package/dist/src/filters/Brightness.mjs.map +1 -1
- package/dist/src/filters/Canvas2dFilterBackend.d.ts +1 -1
- package/dist/src/filters/Canvas2dFilterBackend.d.ts.map +1 -1
- package/dist/src/filters/Canvas2dFilterBackend.min.mjs.map +1 -1
- package/dist/src/filters/Canvas2dFilterBackend.mjs.map +1 -1
- package/dist/src/filters/ColorMatrix.d.ts +17 -15
- package/dist/src/filters/ColorMatrix.d.ts.map +1 -1
- package/dist/src/filters/ColorMatrix.min.mjs +1 -1
- package/dist/src/filters/ColorMatrix.min.mjs.map +1 -1
- package/dist/src/filters/ColorMatrix.mjs +7 -27
- package/dist/src/filters/ColorMatrix.mjs.map +1 -1
- package/dist/src/filters/ColorMatrixFilters.d.ts +63 -497
- package/dist/src/filters/ColorMatrixFilters.d.ts.map +1 -1
- package/dist/src/filters/ColorMatrixFilters.min.mjs +1 -1
- package/dist/src/filters/ColorMatrixFilters.min.mjs.map +1 -1
- package/dist/src/filters/ColorMatrixFilters.mjs +13 -8
- package/dist/src/filters/ColorMatrixFilters.mjs.map +1 -1
- package/dist/src/filters/Composed.d.ts +11 -10
- package/dist/src/filters/Composed.d.ts.map +1 -1
- package/dist/src/filters/Composed.min.mjs +1 -1
- package/dist/src/filters/Composed.min.mjs.map +1 -1
- package/dist/src/filters/Composed.mjs +7 -12
- package/dist/src/filters/Composed.mjs.map +1 -1
- package/dist/src/filters/Contrast.d.ts +10 -12
- package/dist/src/filters/Contrast.d.ts.map +1 -1
- package/dist/src/filters/Contrast.min.mjs +1 -1
- package/dist/src/filters/Contrast.min.mjs.map +1 -1
- package/dist/src/filters/Contrast.mjs +6 -17
- package/dist/src/filters/Contrast.mjs.map +1 -1
- package/dist/src/filters/Convolute.d.ts +11 -14
- package/dist/src/filters/Convolute.d.ts.map +1 -1
- package/dist/src/filters/Convolute.min.mjs +1 -1
- package/dist/src/filters/Convolute.min.mjs.map +1 -1
- package/dist/src/filters/Convolute.mjs +1 -15
- package/dist/src/filters/Convolute.mjs.map +1 -1
- package/dist/src/filters/Gamma.d.ts +17 -14
- package/dist/src/filters/Gamma.d.ts.map +1 -1
- package/dist/src/filters/Gamma.min.mjs +1 -1
- package/dist/src/filters/Gamma.min.mjs.map +1 -1
- package/dist/src/filters/Gamma.mjs +20 -24
- package/dist/src/filters/Gamma.mjs.map +1 -1
- package/dist/src/filters/Grayscale.d.ts +8 -11
- package/dist/src/filters/Grayscale.d.ts.map +1 -1
- package/dist/src/filters/Grayscale.min.mjs +1 -1
- package/dist/src/filters/Grayscale.min.mjs.map +1 -1
- package/dist/src/filters/Grayscale.mjs +2 -14
- package/dist/src/filters/Grayscale.mjs.map +1 -1
- package/dist/src/filters/HueRotation.d.ts +11 -5
- package/dist/src/filters/HueRotation.d.ts.map +1 -1
- package/dist/src/filters/HueRotation.min.mjs +1 -1
- package/dist/src/filters/HueRotation.min.mjs.map +1 -1
- package/dist/src/filters/HueRotation.mjs +10 -5
- package/dist/src/filters/HueRotation.mjs.map +1 -1
- package/dist/src/filters/Invert.d.ts +10 -13
- package/dist/src/filters/Invert.d.ts.map +1 -1
- package/dist/src/filters/Invert.min.mjs +1 -1
- package/dist/src/filters/Invert.min.mjs.map +1 -1
- package/dist/src/filters/Invert.mjs +2 -15
- package/dist/src/filters/Invert.mjs.map +1 -1
- package/dist/src/filters/Noise.d.ts +9 -20
- package/dist/src/filters/Noise.d.ts.map +1 -1
- package/dist/src/filters/Noise.min.mjs +1 -1
- package/dist/src/filters/Noise.min.mjs.map +1 -1
- package/dist/src/filters/Noise.mjs +4 -27
- package/dist/src/filters/Noise.mjs.map +1 -1
- package/dist/src/filters/Pixelate.d.ts +8 -12
- package/dist/src/filters/Pixelate.d.ts.map +1 -1
- package/dist/src/filters/Pixelate.min.mjs +1 -1
- package/dist/src/filters/Pixelate.min.mjs.map +1 -1
- package/dist/src/filters/Pixelate.mjs +2 -16
- package/dist/src/filters/Pixelate.mjs.map +1 -1
- package/dist/src/filters/RemoveColor.d.ts +12 -23
- package/dist/src/filters/RemoveColor.d.ts.map +1 -1
- package/dist/src/filters/RemoveColor.min.mjs +1 -1
- package/dist/src/filters/RemoveColor.min.mjs.map +1 -1
- package/dist/src/filters/RemoveColor.mjs +2 -25
- package/dist/src/filters/RemoveColor.mjs.map +1 -1
- package/dist/src/filters/Resize.d.ts +14 -30
- package/dist/src/filters/Resize.d.ts.map +1 -1
- package/dist/src/filters/Resize.min.mjs +1 -1
- package/dist/src/filters/Resize.min.mjs.map +1 -1
- package/dist/src/filters/Resize.mjs +3 -30
- package/dist/src/filters/Resize.mjs.map +1 -1
- package/dist/src/filters/Saturation.d.ts +9 -12
- package/dist/src/filters/Saturation.d.ts.map +1 -1
- package/dist/src/filters/Saturation.min.mjs +1 -1
- package/dist/src/filters/Saturation.min.mjs.map +1 -1
- package/dist/src/filters/Saturation.mjs +8 -20
- package/dist/src/filters/Saturation.mjs.map +1 -1
- package/dist/src/filters/Vibrance.d.ts +10 -13
- package/dist/src/filters/Vibrance.d.ts.map +1 -1
- package/dist/src/filters/Vibrance.min.mjs +1 -1
- package/dist/src/filters/Vibrance.min.mjs.map +1 -1
- package/dist/src/filters/Vibrance.mjs +6 -18
- package/dist/src/filters/Vibrance.mjs.map +1 -1
- package/dist/src/filters/WebGLFilterBackend.d.ts +1 -1
- package/dist/src/filters/WebGLFilterBackend.d.ts.map +1 -1
- package/dist/src/filters/WebGLFilterBackend.min.mjs.map +1 -1
- package/dist/src/filters/WebGLFilterBackend.mjs.map +1 -1
- package/dist/src/filters/shaders/blendImage.d.ts +1 -0
- package/dist/src/filters/shaders/blendImage.d.ts.map +1 -1
- package/dist/src/filters/shaders/blendImage.min.mjs +1 -1
- package/dist/src/filters/shaders/blendImage.min.mjs.map +1 -1
- package/dist/src/filters/shaders/blendImage.mjs +2 -1
- package/dist/src/filters/shaders/blendImage.mjs.map +1 -1
- package/dist/src/filters/typedefs.d.ts +22 -0
- package/dist/src/filters/typedefs.d.ts.map +1 -1
- package/dist/src/parser/elements_parser.d.ts +1 -1
- package/dist/src/parser/elements_parser.d.ts.map +1 -1
- package/dist/src/parser/elements_parser.min.mjs.map +1 -1
- package/dist/src/parser/elements_parser.mjs.map +1 -1
- package/dist/src/shapes/ActiveSelection.d.ts +1 -1
- package/dist/src/shapes/ActiveSelection.d.ts.map +1 -1
- package/dist/src/shapes/ActiveSelection.min.mjs +1 -1
- package/dist/src/shapes/ActiveSelection.min.mjs.map +1 -1
- package/dist/src/shapes/ActiveSelection.mjs +13 -10
- package/dist/src/shapes/ActiveSelection.mjs.map +1 -1
- package/dist/src/shapes/Group.d.ts +9 -0
- 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 +10 -1
- package/dist/src/shapes/Group.mjs.map +1 -1
- package/dist/src/shapes/Image.d.ts +4 -4
- package/dist/src/shapes/Image.d.ts.map +1 -1
- package/dist/src/shapes/Image.min.mjs.map +1 -1
- package/dist/src/shapes/Image.mjs.map +1 -1
- package/dist/src/shapes/Object/InteractiveObject.d.ts +3 -0
- package/dist/src/shapes/Object/InteractiveObject.d.ts.map +1 -1
- package/dist/src/shapes/Object/InteractiveObject.min.mjs +1 -1
- package/dist/src/shapes/Object/InteractiveObject.min.mjs.map +1 -1
- package/dist/src/shapes/Object/InteractiveObject.mjs +3 -1
- package/dist/src/shapes/Object/InteractiveObject.mjs.map +1 -1
- package/dist/src/shapes/Object/Object.d.ts +1 -16
- 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 +9 -10
- package/dist/src/shapes/Object/Object.mjs.map +1 -1
- package/dist/src/shapes/Object/StackedObject.d.ts +8 -15
- package/dist/src/shapes/Object/StackedObject.d.ts.map +1 -1
- package/dist/src/shapes/Object/StackedObject.min.mjs +1 -1
- package/dist/src/shapes/Object/StackedObject.min.mjs.map +1 -1
- package/dist/src/shapes/Object/StackedObject.mjs +11 -21
- package/dist/src/shapes/Object/StackedObject.mjs.map +1 -1
- package/dist/src/shapes/Path.d.ts +2 -2
- 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 +2 -2
- package/dist/src/shapes/Path.mjs.map +1 -1
- package/dist/src/shapes/Text/TextSVGExportMixin.d.ts +1 -1
- package/dist/src/shapes/Text/TextSVGExportMixin.d.ts.map +1 -1
- package/dist/src/shapes/Text/TextSVGExportMixin.min.mjs.map +1 -1
- package/dist/src/shapes/Text/TextSVGExportMixin.mjs.map +1 -1
- package/dist/src/util/misc/objectEnlive.d.ts +2 -2
- package/dist/src/util/misc/objectEnlive.d.ts.map +1 -1
- package/dist/src/util/misc/objectEnlive.min.mjs.map +1 -1
- package/dist/src/util/misc/objectEnlive.mjs.map +1 -1
- package/package.json +2 -2
- package/src/canvas/Canvas.ts +6 -9
- package/src/canvas/SelectableCanvas.ts +2 -2
- package/src/canvas/StaticCanvas.ts +4 -18
- package/src/color/Color.ts +2 -1
- package/src/color/color.test.ts +6 -0
- package/src/filters/BaseFilter.ts +45 -51
- package/src/filters/BlendColor.ts +13 -35
- package/src/filters/BlendImage.ts +26 -40
- package/src/filters/Blur.ts +13 -20
- package/src/filters/Boilerplate.ts +13 -22
- package/src/filters/Brightness.ts +12 -21
- package/src/filters/Canvas2dFilterBackend.ts +1 -1
- package/src/filters/ColorMatrix.ts +29 -34
- package/src/filters/ColorMatrixFilters.ts +15 -9
- package/src/filters/Composed.ts +26 -16
- package/src/filters/Contrast.ts +15 -23
- package/src/filters/Convolute.ts +11 -23
- package/src/filters/Gamma.ts +32 -24
- package/src/filters/Grayscale.ts +8 -19
- package/src/filters/HueRotation.ts +21 -11
- package/src/filters/Invert.ts +11 -22
- package/src/filters/Noise.ts +11 -30
- package/src/filters/Pixelate.ts +9 -22
- package/src/filters/RemoveColor.ts +21 -35
- package/src/filters/Resize.ts +20 -44
- package/src/filters/Saturation.ts +16 -27
- package/src/filters/Vibrance.ts +14 -24
- package/src/filters/WebGLFilterBackend.ts +1 -1
- package/src/filters/shaders/blendImage.ts +12 -0
- package/src/filters/typedefs.ts +23 -0
- package/src/parser/elements_parser.ts +1 -1
- package/src/shapes/ActiveSelection.ts +8 -4
- package/src/shapes/Group.ts +16 -1
- package/src/shapes/Image.ts +8 -6
- package/src/shapes/Object/InteractiveObject.ts +3 -1
- package/src/shapes/Object/Object.ts +10 -35
- package/src/shapes/Object/StackedObject.ts +28 -44
- package/src/shapes/Path.ts +4 -4
- package/src/shapes/Text/TextSVGExportMixin.ts +1 -1
- package/src/util/misc/objectEnlive.ts +12 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StackedObject.min.mjs","sources":["../../../../src/shapes/Object/StackedObject.ts"],"sourcesContent":["import type { ObjectEvents } from '../../EventTypeDefs';\nimport type { Group } from '../Group';\nimport type { Canvas } from '../../canvas/Canvas';\nimport type { StaticCanvas } from '../../canvas/StaticCanvas';\nimport { ObjectGeometry } from './ObjectGeometry';\n\ntype TAncestor = StackedObject | Canvas | StaticCanvas;\ntype TCollection = Group | Canvas | StaticCanvas;\n\
|
|
1
|
+
{"version":3,"file":"StackedObject.min.mjs","sources":["../../../../src/shapes/Object/StackedObject.ts"],"sourcesContent":["import type { ObjectEvents } from '../../EventTypeDefs';\nimport type { Group } from '../Group';\nimport type { Canvas } from '../../canvas/Canvas';\nimport type { StaticCanvas } from '../../canvas/StaticCanvas';\nimport { ObjectGeometry } from './ObjectGeometry';\nimport type { FabricObject } from './FabricObject';\n\ntype TAncestor = StackedObject | Canvas | StaticCanvas;\ntype TCollection = Group | Canvas | StaticCanvas;\n\nexport type Ancestors =\n | [StackedObject | Group]\n | [StackedObject | Group, ...Group[]]\n | Group[];\n\nexport type AncestryComparison = {\n /**\n * common ancestors of `this` and`other`(may include`this` | `other`)\n */\n common: Ancestors;\n /**\n * ancestors that are of `this` only\n */\n fork: Ancestors;\n /**\n * ancestors that are of `other` only\n */\n otherFork: Ancestors;\n};\n\nexport class StackedObject<\n EventSpec extends ObjectEvents = ObjectEvents\n> extends ObjectGeometry<EventSpec> {\n /**\n * A reference to the parent of the object\n * Used to keep the original parent ref when the object has been added to an ActiveSelection, hence loosing the `group` ref\n */\n declare parent?: Group;\n\n /**\n * Checks if object is descendant of target\n * Should be used instead of {@link Group.contains} or {@link StaticCanvas.contains} for performance reasons\n * @param {TAncestor} target\n * @returns {boolean}\n */\n isDescendantOf(target: TAncestor): boolean {\n const { parent, group } = this;\n return (\n parent === target ||\n group === target ||\n this.canvas === target ||\n // walk up\n (!!parent && parent.isDescendantOf(target)) ||\n (!!group && group !== parent && group.isDescendantOf(target))\n );\n }\n\n /**\n * @returns {Ancestors} ancestors (excluding `ActiveSelection`) from bottom to top\n */\n getAncestors(): Ancestors {\n const ancestors: TAncestor[] = [];\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let parent: TAncestor | undefined = this;\n do {\n parent = parent instanceof StackedObject ? parent.parent : undefined;\n parent && ancestors.push(parent);\n } while (parent);\n return ancestors as Ancestors;\n }\n\n /**\n * Compare ancestors\n *\n * @param {StackedObject} other\n * @returns {AncestryComparison} an object that represent the ancestry situation.\n */\n findCommonAncestors<T extends this>(other: T): AncestryComparison {\n if (this === other) {\n return {\n fork: [],\n otherFork: [],\n common: [this, ...this.getAncestors()],\n } as AncestryComparison;\n }\n const ancestors = this.getAncestors();\n const otherAncestors = other.getAncestors();\n // if `this` has no ancestors and `this` is top ancestor of `other` we must handle the following case\n if (\n ancestors.length === 0 &&\n otherAncestors.length > 0 &&\n this === otherAncestors[otherAncestors.length - 1]\n ) {\n return {\n fork: [],\n otherFork: [\n other,\n ...otherAncestors.slice(0, otherAncestors.length - 1),\n ],\n common: [this],\n } as AncestryComparison;\n }\n // compare ancestors\n for (let i = 0, ancestor; i < ancestors.length; i++) {\n ancestor = ancestors[i];\n if (ancestor === other) {\n return {\n fork: [this, ...ancestors.slice(0, i)],\n otherFork: [],\n common: ancestors.slice(i),\n } as AncestryComparison;\n }\n for (let j = 0; j < otherAncestors.length; j++) {\n if (this === otherAncestors[j]) {\n return {\n fork: [],\n otherFork: [other, ...otherAncestors.slice(0, j)],\n common: [this, ...ancestors],\n } as AncestryComparison;\n }\n if (ancestor === otherAncestors[j]) {\n return {\n fork: [this, ...ancestors.slice(0, i)],\n otherFork: [other, ...otherAncestors.slice(0, j)],\n common: ancestors.slice(i),\n } as AncestryComparison;\n }\n }\n }\n // nothing shared\n return {\n fork: [this, ...ancestors],\n otherFork: [other, ...otherAncestors],\n common: [],\n } as AncestryComparison;\n }\n\n /**\n *\n * @param {StackedObject} other\n * @returns {boolean}\n */\n hasCommonAncestors<T extends this>(other: T): boolean {\n const commonAncestors = this.findCommonAncestors(other);\n return commonAncestors && !!commonAncestors.common.length;\n }\n\n /**\n *\n * @param {FabricObject} other object to compare against\n * @returns {boolean | undefined} if objects do not share a common ancestor or they are strictly equal it is impossible to determine which is in front of the other; in such cases the function returns `undefined`\n */\n isInFrontOf<T extends this>(other: T): boolean | undefined {\n if (this === other) {\n return undefined;\n }\n const ancestorData = this.findCommonAncestors(other);\n\n if (ancestorData.fork.includes(other as any)) {\n return true;\n }\n if (ancestorData.otherFork.includes(this as any)) {\n return false;\n }\n // if there isn't a common ancestor, we take the canvas.\n // if there is no canvas, there is nothing to compare\n const firstCommonAncestor = ancestorData.common[0] || this.canvas;\n if (!firstCommonAncestor) {\n return undefined;\n }\n const headOfFork = ancestorData.fork.pop(),\n headOfOtherFork = ancestorData.otherFork.pop(),\n thisIndex = (firstCommonAncestor as TCollection)._objects.indexOf(\n headOfFork as any\n ),\n otherIndex = (firstCommonAncestor as TCollection)._objects.indexOf(\n headOfOtherFork as any\n );\n return thisIndex > -1 && thisIndex > otherIndex;\n }\n}\n"],"names":["StackedObject","ObjectGeometry","isDescendantOf","target","parent","group","this","canvas","getAncestors","ancestors","undefined","push","findCommonAncestors","other","fork","otherFork","common","otherAncestors","length","slice","ancestor","i","j","hasCommonAncestors","commonAncestors","isInFrontOf","ancestorData","includes","firstCommonAncestor","headOfFork","pop","headOfOtherFork","thisIndex","_objects","indexOf","otherIndex"],"mappings":"0DA8BO,MAAMA,UAEHC,EAaRC,cAAAA,CAAeC,GACb,MAAMC,OAAEA,EAAMC,MAAEA,GAAUC,KAC1B,OACEF,IAAWD,GACXE,IAAUF,GACVG,KAAKC,SAAWJ,KAEbC,GAAUA,EAAOF,eAAeC,MAChCE,GAASA,IAAUD,GAAUC,EAAMH,eAAeC,EAEzD,CAKAK,YAAAA,GACE,MAAMC,EAAyB,GAE/B,IAAIL,EAAgCE,KACpC,GACEF,EAASA,aAAkBJ,EAAgBI,EAAOA,YAASM,EAC3DN,GAAUK,EAAUE,KAAKP,SAClBA,GACT,OAAOK,CACT,CAQAG,mBAAAA,CAAoCC,GAClC,GAAIP,OAASO,EACX,MAAO,CACLC,KAAM,GACNC,UAAW,GACXC,OAAQ,CAACV,QAASA,KAAKE,iBAG3B,MAAMC,EAAYH,KAAKE,eACjBS,EAAiBJ,EAAML,eAE7B,GACuB,IAArBC,EAAUS,QACVD,EAAeC,OAAS,GACxBZ,OAASW,EAAeA,EAAeC,OAAS,GAEhD,MAAO,CACLJ,KAAM,GACNC,UAAW,CACTF,KACGI,EAAeE,MAAM,EAAGF,EAAeC,OAAS,IAErDF,OAAQ,CAACV,OAIb,IAAK,IAAWc,EAAPC,EAAI,EAAaA,EAAIZ,EAAUS,OAAQG,IAAK,CAEnD,GADAD,EAAWX,EAAUY,GACjBD,IAAaP,EACf,MAAO,CACLC,KAAM,CAACR,QAASG,EAAUU,MAAM,EAAGE,IACnCN,UAAW,GACXC,OAAQP,EAAUU,MAAME,IAG5B,IAAK,IAAIC,EAAI,EAAGA,EAAIL,EAAeC,OAAQI,IAAK,CAC9C,GAAIhB,OAASW,EAAeK,GAC1B,MAAO,CACLR,KAAM,GACNC,UAAW,CAACF,KAAUI,EAAeE,MAAM,EAAGG,IAC9CN,OAAQ,CAACV,QAASG,IAGtB,GAAIW,IAAaH,EAAeK,GAC9B,MAAO,CACLR,KAAM,CAACR,QAASG,EAAUU,MAAM,EAAGE,IACnCN,UAAW,CAACF,KAAUI,EAAeE,MAAM,EAAGG,IAC9CN,OAAQP,EAAUU,MAAME,GAG9B,CACF,CAEA,MAAO,CACLP,KAAM,CAACR,QAASG,GAChBM,UAAW,CAACF,KAAUI,GACtBD,OAAQ,GAEZ,CAOAO,kBAAAA,CAAmCV,GACjC,MAAMW,EAAkBlB,KAAKM,oBAAoBC,GACjD,OAAOW,KAAqBA,EAAgBR,OAAOE,MACrD,CAOAO,WAAAA,CAA4BZ,GAC1B,GAAIP,OAASO,EACX,OAEF,MAAMa,EAAepB,KAAKM,oBAAoBC,GAE9C,GAAIa,EAAaZ,KAAKa,SAASd,GAC7B,OAAO,EAET,GAAIa,EAAaX,UAAUY,SAASrB,MAClC,OAAO,EAIT,MAAMsB,EAAsBF,EAAaV,OAAO,IAAMV,KAAKC,OAC3D,IAAKqB,EACH,OAEF,MAAMC,EAAaH,EAAaZ,KAAKgB,MACnCC,EAAkBL,EAAaX,UAAUe,MACzCE,EAAaJ,EAAoCK,SAASC,QACxDL,GAEFM,EAAcP,EAAoCK,SAASC,QACzDH,GAEJ,OAAOC,GAAa,GAAKA,EAAYG,CACvC"}
|
|
@@ -1,9 +1,5 @@
|
|
|
1
1
|
import { ObjectGeometry } from './ObjectGeometry.mjs';
|
|
2
2
|
|
|
3
|
-
/**
|
|
4
|
-
* Strict: only ancestors that are objects (without canvas)
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
3
|
class StackedObject extends ObjectGeometry {
|
|
8
4
|
/**
|
|
9
5
|
* A reference to the parent of the object
|
|
@@ -27,17 +23,14 @@ class StackedObject extends ObjectGeometry {
|
|
|
27
23
|
}
|
|
28
24
|
|
|
29
25
|
/**
|
|
30
|
-
*
|
|
31
|
-
* @param {boolean} [strict] returns only ancestors that are objects (without canvas)
|
|
32
26
|
* @returns {Ancestors} ancestors (excluding `ActiveSelection`) from bottom to top
|
|
33
27
|
*/
|
|
34
|
-
getAncestors(
|
|
28
|
+
getAncestors() {
|
|
35
29
|
const ancestors = [];
|
|
36
30
|
// eslint-disable-next-line @typescript-eslint/no-this-alias
|
|
37
31
|
let parent = this;
|
|
38
32
|
do {
|
|
39
|
-
|
|
40
|
-
parent = parent instanceof StackedObject ? (_parent$parent = parent.parent) !== null && _parent$parent !== void 0 ? _parent$parent : !strict ? parent.canvas : undefined : undefined;
|
|
33
|
+
parent = parent instanceof StackedObject ? parent.parent : undefined;
|
|
41
34
|
parent && ancestors.push(parent);
|
|
42
35
|
} while (parent);
|
|
43
36
|
return ancestors;
|
|
@@ -47,19 +40,18 @@ class StackedObject extends ObjectGeometry {
|
|
|
47
40
|
* Compare ancestors
|
|
48
41
|
*
|
|
49
42
|
* @param {StackedObject} other
|
|
50
|
-
* @param {boolean} [strict] finds only ancestors that are objects (without canvas)
|
|
51
43
|
* @returns {AncestryComparison} an object that represent the ancestry situation.
|
|
52
44
|
*/
|
|
53
|
-
findCommonAncestors(other
|
|
45
|
+
findCommonAncestors(other) {
|
|
54
46
|
if (this === other) {
|
|
55
47
|
return {
|
|
56
48
|
fork: [],
|
|
57
49
|
otherFork: [],
|
|
58
|
-
common: [this, ...this.getAncestors(
|
|
50
|
+
common: [this, ...this.getAncestors()]
|
|
59
51
|
};
|
|
60
52
|
}
|
|
61
|
-
const ancestors = this.getAncestors(
|
|
62
|
-
const otherAncestors = other.getAncestors(
|
|
53
|
+
const ancestors = this.getAncestors();
|
|
54
|
+
const otherAncestors = other.getAncestors();
|
|
63
55
|
// if `this` has no ancestors and `this` is top ancestor of `other` we must handle the following case
|
|
64
56
|
if (ancestors.length === 0 && otherAncestors.length > 0 && this === otherAncestors[otherAncestors.length - 1]) {
|
|
65
57
|
return {
|
|
@@ -106,11 +98,10 @@ class StackedObject extends ObjectGeometry {
|
|
|
106
98
|
/**
|
|
107
99
|
*
|
|
108
100
|
* @param {StackedObject} other
|
|
109
|
-
* @param {boolean} [strict] checks only ancestors that are objects (without canvas)
|
|
110
101
|
* @returns {boolean}
|
|
111
102
|
*/
|
|
112
|
-
hasCommonAncestors(other
|
|
113
|
-
const commonAncestors = this.findCommonAncestors(other
|
|
103
|
+
hasCommonAncestors(other) {
|
|
104
|
+
const commonAncestors = this.findCommonAncestors(other);
|
|
114
105
|
return commonAncestors && !!commonAncestors.common.length;
|
|
115
106
|
}
|
|
116
107
|
|
|
@@ -124,16 +115,15 @@ class StackedObject extends ObjectGeometry {
|
|
|
124
115
|
return undefined;
|
|
125
116
|
}
|
|
126
117
|
const ancestorData = this.findCommonAncestors(other);
|
|
127
|
-
if (!ancestorData) {
|
|
128
|
-
return undefined;
|
|
129
|
-
}
|
|
130
118
|
if (ancestorData.fork.includes(other)) {
|
|
131
119
|
return true;
|
|
132
120
|
}
|
|
133
121
|
if (ancestorData.otherFork.includes(this)) {
|
|
134
122
|
return false;
|
|
135
123
|
}
|
|
136
|
-
|
|
124
|
+
// if there isn't a common ancestor, we take the canvas.
|
|
125
|
+
// if there is no canvas, there is nothing to compare
|
|
126
|
+
const firstCommonAncestor = ancestorData.common[0] || this.canvas;
|
|
137
127
|
if (!firstCommonAncestor) {
|
|
138
128
|
return undefined;
|
|
139
129
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StackedObject.mjs","sources":["../../../../src/shapes/Object/StackedObject.ts"],"sourcesContent":["import type { ObjectEvents } from '../../EventTypeDefs';\nimport type { Group } from '../Group';\nimport type { Canvas } from '../../canvas/Canvas';\nimport type { StaticCanvas } from '../../canvas/StaticCanvas';\nimport { ObjectGeometry } from './ObjectGeometry';\n\ntype TAncestor = StackedObject | Canvas | StaticCanvas;\ntype TCollection = Group | Canvas | StaticCanvas;\n\n/**\n * Strict: only ancestors that are objects (without canvas)\n */\nexport type Ancestors<Strict> = Strict extends true\n ? [StackedObject | Group] | [StackedObject | Group, ...Group[]] | Group[]\n :\n | [StackedObject | Group | Canvas | StaticCanvas]\n | [StackedObject | Group, Canvas | StaticCanvas]\n | [StackedObject, ...Group[]]\n | Group[]\n | [StackedObject | Group, ...Group[], Canvas | StaticCanvas];\n\nexport type AncestryComparison<Strict> = {\n /**\n * common ancestors of `this` and`other`(may include`this` | `other`)\n */\n common: Ancestors<Strict>;\n /**\n * ancestors that are of `this` only\n */\n fork: Ancestors<Strict>;\n /**\n * ancestors that are of `other` only\n */\n otherFork: Ancestors<Strict>;\n};\n\nexport class StackedObject<\n EventSpec extends ObjectEvents = ObjectEvents\n> extends ObjectGeometry<EventSpec> {\n /**\n * A reference to the parent of the object\n * Used to keep the original parent ref when the object has been added to an ActiveSelection, hence loosing the `group` ref\n */\n declare parent?: Group;\n\n /**\n * Checks if object is descendant of target\n * Should be used instead of {@link Group.contains} or {@link StaticCanvas.contains} for performance reasons\n * @param {TAncestor} target\n * @returns {boolean}\n */\n isDescendantOf(target: TAncestor): boolean {\n const { parent, group } = this;\n return (\n parent === target ||\n group === target ||\n this.canvas === target ||\n // walk up\n (!!parent && parent.isDescendantOf(target)) ||\n (!!group && group !== parent && group.isDescendantOf(target))\n );\n }\n\n /**\n *\n * @param {boolean} [strict] returns only ancestors that are objects (without canvas)\n * @returns {Ancestors} ancestors (excluding `ActiveSelection`) from bottom to top\n */\n getAncestors<T extends boolean>(strict?: T): Ancestors<T> {\n const ancestors: TAncestor[] = [];\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let parent: TAncestor | undefined = this;\n do {\n parent =\n parent instanceof StackedObject\n ? parent.parent ?? (!strict ? parent.canvas : undefined)\n : undefined;\n parent && ancestors.push(parent);\n } while (parent);\n return ancestors as Ancestors<T>;\n }\n\n /**\n * Compare ancestors\n *\n * @param {StackedObject} other\n * @param {boolean} [strict] finds only ancestors that are objects (without canvas)\n * @returns {AncestryComparison} an object that represent the ancestry situation.\n */\n findCommonAncestors<T extends this, S extends boolean>(\n other: T,\n strict?: S\n ): AncestryComparison<S> {\n if (this === other) {\n return {\n fork: [],\n otherFork: [],\n common: [this, ...this.getAncestors(strict)],\n } as AncestryComparison<S>;\n }\n const ancestors = this.getAncestors(strict);\n const otherAncestors = other.getAncestors(strict);\n // if `this` has no ancestors and `this` is top ancestor of `other` we must handle the following case\n if (\n ancestors.length === 0 &&\n otherAncestors.length > 0 &&\n this === otherAncestors[otherAncestors.length - 1]\n ) {\n return {\n fork: [],\n otherFork: [\n other,\n ...otherAncestors.slice(0, otherAncestors.length - 1),\n ],\n common: [this],\n } as AncestryComparison<S>;\n }\n // compare ancestors\n for (let i = 0, ancestor; i < ancestors.length; i++) {\n ancestor = ancestors[i];\n if (ancestor === other) {\n return {\n fork: [this, ...ancestors.slice(0, i)],\n otherFork: [],\n common: ancestors.slice(i),\n } as AncestryComparison<S>;\n }\n for (let j = 0; j < otherAncestors.length; j++) {\n if (this === otherAncestors[j]) {\n return {\n fork: [],\n otherFork: [other, ...otherAncestors.slice(0, j)],\n common: [this, ...ancestors],\n } as AncestryComparison<S>;\n }\n if (ancestor === otherAncestors[j]) {\n return {\n fork: [this, ...ancestors.slice(0, i)],\n otherFork: [other, ...otherAncestors.slice(0, j)],\n common: ancestors.slice(i),\n } as AncestryComparison<S>;\n }\n }\n }\n // nothing shared\n return {\n fork: [this, ...ancestors],\n otherFork: [other, ...otherAncestors],\n common: [],\n } as AncestryComparison<S>;\n }\n\n /**\n *\n * @param {StackedObject} other\n * @param {boolean} [strict] checks only ancestors that are objects (without canvas)\n * @returns {boolean}\n */\n hasCommonAncestors<T extends this>(other: T, strict?: boolean): boolean {\n const commonAncestors = this.findCommonAncestors(other, strict);\n return commonAncestors && !!commonAncestors.common.length;\n }\n\n /**\n *\n * @param {FabricObject} other object to compare against\n * @returns {boolean | undefined} if objects do not share a common ancestor or they are strictly equal it is impossible to determine which is in front of the other; in such cases the function returns `undefined`\n */\n isInFrontOf<T extends this>(other: T): boolean | undefined {\n if (this === other) {\n return undefined;\n }\n const ancestorData = this.findCommonAncestors(other);\n if (!ancestorData) {\n return undefined;\n }\n if (ancestorData.fork.includes(other as any)) {\n return true;\n }\n if (ancestorData.otherFork.includes(this as any)) {\n return false;\n }\n const firstCommonAncestor = ancestorData.common[0];\n if (!firstCommonAncestor) {\n return undefined;\n }\n const headOfFork = ancestorData.fork.pop(),\n headOfOtherFork = ancestorData.otherFork.pop(),\n thisIndex = (firstCommonAncestor as TCollection)._objects.indexOf(\n headOfFork as any\n ),\n otherIndex = (firstCommonAncestor as TCollection)._objects.indexOf(\n headOfOtherFork as any\n );\n return thisIndex > -1 && thisIndex > otherIndex;\n }\n}\n"],"names":["StackedObject","ObjectGeometry","isDescendantOf","target","parent","group","canvas","getAncestors","strict","ancestors","_parent$parent","undefined","push","findCommonAncestors","other","fork","otherFork","common","otherAncestors","length","slice","i","ancestor","j","hasCommonAncestors","commonAncestors","isInFrontOf","ancestorData","includes","firstCommonAncestor","headOfFork","pop","headOfOtherFork","thisIndex","_objects","indexOf","otherIndex"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"StackedObject.mjs","sources":["../../../../src/shapes/Object/StackedObject.ts"],"sourcesContent":["import type { ObjectEvents } from '../../EventTypeDefs';\nimport type { Group } from '../Group';\nimport type { Canvas } from '../../canvas/Canvas';\nimport type { StaticCanvas } from '../../canvas/StaticCanvas';\nimport { ObjectGeometry } from './ObjectGeometry';\nimport type { FabricObject } from './FabricObject';\n\ntype TAncestor = StackedObject | Canvas | StaticCanvas;\ntype TCollection = Group | Canvas | StaticCanvas;\n\nexport type Ancestors =\n | [StackedObject | Group]\n | [StackedObject | Group, ...Group[]]\n | Group[];\n\nexport type AncestryComparison = {\n /**\n * common ancestors of `this` and`other`(may include`this` | `other`)\n */\n common: Ancestors;\n /**\n * ancestors that are of `this` only\n */\n fork: Ancestors;\n /**\n * ancestors that are of `other` only\n */\n otherFork: Ancestors;\n};\n\nexport class StackedObject<\n EventSpec extends ObjectEvents = ObjectEvents\n> extends ObjectGeometry<EventSpec> {\n /**\n * A reference to the parent of the object\n * Used to keep the original parent ref when the object has been added to an ActiveSelection, hence loosing the `group` ref\n */\n declare parent?: Group;\n\n /**\n * Checks if object is descendant of target\n * Should be used instead of {@link Group.contains} or {@link StaticCanvas.contains} for performance reasons\n * @param {TAncestor} target\n * @returns {boolean}\n */\n isDescendantOf(target: TAncestor): boolean {\n const { parent, group } = this;\n return (\n parent === target ||\n group === target ||\n this.canvas === target ||\n // walk up\n (!!parent && parent.isDescendantOf(target)) ||\n (!!group && group !== parent && group.isDescendantOf(target))\n );\n }\n\n /**\n * @returns {Ancestors} ancestors (excluding `ActiveSelection`) from bottom to top\n */\n getAncestors(): Ancestors {\n const ancestors: TAncestor[] = [];\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let parent: TAncestor | undefined = this;\n do {\n parent = parent instanceof StackedObject ? parent.parent : undefined;\n parent && ancestors.push(parent);\n } while (parent);\n return ancestors as Ancestors;\n }\n\n /**\n * Compare ancestors\n *\n * @param {StackedObject} other\n * @returns {AncestryComparison} an object that represent the ancestry situation.\n */\n findCommonAncestors<T extends this>(other: T): AncestryComparison {\n if (this === other) {\n return {\n fork: [],\n otherFork: [],\n common: [this, ...this.getAncestors()],\n } as AncestryComparison;\n }\n const ancestors = this.getAncestors();\n const otherAncestors = other.getAncestors();\n // if `this` has no ancestors and `this` is top ancestor of `other` we must handle the following case\n if (\n ancestors.length === 0 &&\n otherAncestors.length > 0 &&\n this === otherAncestors[otherAncestors.length - 1]\n ) {\n return {\n fork: [],\n otherFork: [\n other,\n ...otherAncestors.slice(0, otherAncestors.length - 1),\n ],\n common: [this],\n } as AncestryComparison;\n }\n // compare ancestors\n for (let i = 0, ancestor; i < ancestors.length; i++) {\n ancestor = ancestors[i];\n if (ancestor === other) {\n return {\n fork: [this, ...ancestors.slice(0, i)],\n otherFork: [],\n common: ancestors.slice(i),\n } as AncestryComparison;\n }\n for (let j = 0; j < otherAncestors.length; j++) {\n if (this === otherAncestors[j]) {\n return {\n fork: [],\n otherFork: [other, ...otherAncestors.slice(0, j)],\n common: [this, ...ancestors],\n } as AncestryComparison;\n }\n if (ancestor === otherAncestors[j]) {\n return {\n fork: [this, ...ancestors.slice(0, i)],\n otherFork: [other, ...otherAncestors.slice(0, j)],\n common: ancestors.slice(i),\n } as AncestryComparison;\n }\n }\n }\n // nothing shared\n return {\n fork: [this, ...ancestors],\n otherFork: [other, ...otherAncestors],\n common: [],\n } as AncestryComparison;\n }\n\n /**\n *\n * @param {StackedObject} other\n * @returns {boolean}\n */\n hasCommonAncestors<T extends this>(other: T): boolean {\n const commonAncestors = this.findCommonAncestors(other);\n return commonAncestors && !!commonAncestors.common.length;\n }\n\n /**\n *\n * @param {FabricObject} other object to compare against\n * @returns {boolean | undefined} if objects do not share a common ancestor or they are strictly equal it is impossible to determine which is in front of the other; in such cases the function returns `undefined`\n */\n isInFrontOf<T extends this>(other: T): boolean | undefined {\n if (this === other) {\n return undefined;\n }\n const ancestorData = this.findCommonAncestors(other);\n\n if (ancestorData.fork.includes(other as any)) {\n return true;\n }\n if (ancestorData.otherFork.includes(this as any)) {\n return false;\n }\n // if there isn't a common ancestor, we take the canvas.\n // if there is no canvas, there is nothing to compare\n const firstCommonAncestor = ancestorData.common[0] || this.canvas;\n if (!firstCommonAncestor) {\n return undefined;\n }\n const headOfFork = ancestorData.fork.pop(),\n headOfOtherFork = ancestorData.otherFork.pop(),\n thisIndex = (firstCommonAncestor as TCollection)._objects.indexOf(\n headOfFork as any\n ),\n otherIndex = (firstCommonAncestor as TCollection)._objects.indexOf(\n headOfOtherFork as any\n );\n return thisIndex > -1 && thisIndex > otherIndex;\n }\n}\n"],"names":["StackedObject","ObjectGeometry","isDescendantOf","target","parent","group","canvas","getAncestors","ancestors","undefined","push","findCommonAncestors","other","fork","otherFork","common","otherAncestors","length","slice","i","ancestor","j","hasCommonAncestors","commonAncestors","isInFrontOf","ancestorData","includes","firstCommonAncestor","headOfFork","pop","headOfOtherFork","thisIndex","_objects","indexOf","otherIndex"],"mappings":"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"}
|
|
@@ -94,13 +94,13 @@ export declare class Path<Props extends TOptions<PathProps> = Partial<PathProps>
|
|
|
94
94
|
* @param {Function} [reviver] Method for further parsing of svg representation.
|
|
95
95
|
* @return {string} svg representation of an instance
|
|
96
96
|
*/
|
|
97
|
-
toClipPathSVG(reviver
|
|
97
|
+
toClipPathSVG(reviver?: TSVGReviver): string;
|
|
98
98
|
/**
|
|
99
99
|
* Returns svg representation of an instance
|
|
100
100
|
* @param {Function} [reviver] Method for further parsing of svg representation.
|
|
101
101
|
* @return {string} svg representation of an instance
|
|
102
102
|
*/
|
|
103
|
-
toSVG(reviver
|
|
103
|
+
toSVG(reviver?: TSVGReviver): string;
|
|
104
104
|
/**
|
|
105
105
|
* Returns number representation of an instance complexity
|
|
106
106
|
* @return {number} complexity of this instance
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Path.d.ts","sourceRoot":"","sources":["../../../src/shapes/Path.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAUjC,OAAO,EAAE,YAAY,EAAmB,MAAM,uBAAuB,CAAC;AACtE,OAAO,KAAK,EACV,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EAChB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAC/E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EACV,KAAK,EACL,gBAAgB,EAChB,WAAW,EACX,QAAQ,EACT,MAAM,aAAa,CAAC;AAErB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAEnD,UAAU,eAAe;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,eAAe,CAAC;CACxB;AAED,MAAM,WAAW,mBACf,SAAQ,qBAAqB,EAC3B,eAAe;CAAG;AAEtB,MAAM,WAAW,SAAU,SAAQ,iBAAiB,EAAE,eAAe;CAAG;AAExE,MAAM,WAAW,SAAU,SAAQ,KAAK;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,KAAK,CAAC;CACnB;AAED,qBAAa,IAAI,CACf,KAAK,SAAS,QAAQ,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,EACtD,MAAM,SAAS,mBAAmB,GAAG,mBAAmB,EACxD,SAAS,SAAS,YAAY,GAAG,YAAY,CAC7C,SAAQ,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC;IAC9C;;;;OAIG;IACK,IAAI,EAAE,eAAe,CAAC;IAEtB,UAAU,EAAE,KAAK,CAAC;IAElB,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,YAAY,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAE1C,MAAM,CAAC,IAAI,SAAU;IAErB,MAAM,CAAC,eAAe,WAA4C;IAElE;;;;;OAKG;gBAED,IAAI,EAAE,gBAAgB,GAAG,MAAM,EAE/B,EAAE,IAAO,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,EAAE,GAAE,OAAO,CAAC,KAAK,CAAM;IAUzD;;;;;OAKG;IACH,QAAQ,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,EAAE,cAAc,CAAC,EAAE,OAAO;IAKlE;;;;;OAKG;IACH,sBAAsB,IAAI,KAAK;IAK/B;;;OAGG;IACH,mBAAmB,CAAC,GAAG,EAAE,wBAAwB;IA6CjD;;;OAGG;IACH,OAAO,CAAC,GAAG,EAAE,wBAAwB;IAKrC;;;OAGG;IACH,QAAQ;IAMR;;;;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;IAOrD;;;;OAIG;IACH,gBAAgB,CACd,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;IASrD;;;;OAIG;IACH,MAAM;IASN;;;OAGG;IACH,mBAAmB;IAQnB;;;;OAIG;IACH,aAAa,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM;
|
|
1
|
+
{"version":3,"file":"Path.d.ts","sourceRoot":"","sources":["../../../src/shapes/Path.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Path.min.mjs","sources":["../../../src/shapes/Path.ts"],"sourcesContent":["import { config } from '../config';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type { XY } from '../Point';\nimport { Point } from '../Point';\nimport { makeBoundingBoxFromPoints } from '../util/misc/boundingBoxFromPoints';\nimport { toFixed } from '../util/misc/toFixed';\nimport {\n getBoundsOfCurve,\n joinPath,\n makePathSimpler,\n parsePath,\n} from '../util/path';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type {\n TComplexPathData,\n TPathSegmentInfo,\n TSimplePathData,\n} from '../util/path/typedefs';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport type {\n TBBox,\n TClassProperties,\n TSVGReviver,\n TOptions,\n} from '../typedefs';\nimport { CENTER, LEFT, TOP } from '../constants';\nimport type { CSSRules } from '../parser/typedefs';\n\ninterface UniquePathProps {\n sourcePath?: string;\n path?: TSimplePathData;\n}\n\nexport interface SerializedPathProps\n extends SerializedObjectProps,\n UniquePathProps {}\n\nexport interface PathProps extends FabricObjectProps, UniquePathProps {}\n\nexport interface IPathBBox extends TBBox {\n left: number;\n top: number;\n pathOffset: Point;\n}\n\nexport class Path<\n Props extends TOptions<PathProps> = Partial<PathProps>,\n SProps extends SerializedPathProps = SerializedPathProps,\n EventSpec extends ObjectEvents = ObjectEvents\n> extends FabricObject<Props, SProps, EventSpec> {\n /**\n * Array of path points\n * @type Array\n * @default\n */\n declare path: TSimplePathData;\n\n declare pathOffset: Point;\n\n declare sourcePath?: string;\n\n declare segmentsInfo?: TPathSegmentInfo[];\n\n static type = 'Path';\n\n static cacheProperties = [...cacheProperties, 'path', 'fillRule'];\n\n /**\n * Constructor\n * @param {TComplexPathData} path Path data (sequence of coordinates and corresponding \"command\" tokens)\n * @param {Partial<PathProps>} [options] Options object\n * @return {Path} thisArg\n */\n constructor(\n path: TComplexPathData | string,\n // todo: evaluate this spread here\n { path: _, left, top, ...options }: Partial<Props> = {}\n ) {\n super();\n Object.assign(this, Path.ownDefaults);\n this.setOptions(options);\n this._setPath(path || [], true);\n typeof left === 'number' && this.set(LEFT, left);\n typeof top === 'number' && this.set(TOP, top);\n }\n\n /**\n * @private\n * @param {TComplexPathData | string} path Path data (sequence of coordinates and corresponding \"command\" tokens)\n * @param {boolean} [adjustPosition] pass true to reposition the object according to the bounding box\n * @returns {Point} top left position of the bounding box, useful for complementary positioning\n */\n _setPath(path: TComplexPathData | string, adjustPosition?: boolean) {\n this.path = makePathSimpler(Array.isArray(path) ? path : parsePath(path));\n this.setBoundingBox(adjustPosition);\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, by look at the polyline/polygon points.\n * @private\n * @return {Point} center point from element coordinates\n */\n _findCenterFromElement(): Point {\n const bbox = this._calcBoundsFromPath();\n return new Point(bbox.left + bbox.width / 2, bbox.top + bbox.height / 2);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render path on\n */\n _renderPathCommands(ctx: CanvasRenderingContext2D) {\n const l = -this.pathOffset.x,\n t = -this.pathOffset.y;\n\n ctx.beginPath();\n\n for (const command of this.path) {\n switch (\n command[0] // first letter\n ) {\n case 'L': // lineto, absolute\n ctx.lineTo(command[1] + l, command[2] + t);\n break;\n\n case 'M': // moveTo, absolute\n ctx.moveTo(command[1] + l, command[2] + t);\n break;\n\n case 'C': // bezierCurveTo, absolute\n ctx.bezierCurveTo(\n command[1] + l,\n command[2] + t,\n command[3] + l,\n command[4] + t,\n command[5] + l,\n command[6] + t\n );\n break;\n\n case 'Q': // quadraticCurveTo, absolute\n ctx.quadraticCurveTo(\n command[1] + l,\n command[2] + t,\n command[3] + l,\n command[4] + t\n );\n break;\n\n case 'Z':\n ctx.closePath();\n break;\n }\n }\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render path on\n */\n _render(ctx: CanvasRenderingContext2D) {\n this._renderPathCommands(ctx);\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Returns string representation of an instance\n * @return {string} string representation of an instance\n */\n toString() {\n return `#<Path (${this.complexity()}): { \"top\": ${this.top}, \"left\": ${\n this.left\n } }>`;\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 path: this.path.map((pathCmd) => pathCmd.slice()),\n };\n }\n\n /**\n * Returns dataless 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 toDatalessObject<\n T extends Omit<Props & TClassProperties<this>, keyof SProps>,\n K extends keyof T = never\n >(propertiesToInclude: K[] = []): Pick<T, K> & SProps {\n const o = this.toObject<T, K>(propertiesToInclude);\n if (this.sourcePath) {\n delete o.path;\n o.sourcePath = this.sourcePath;\n }\n return o;\n }\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const path = joinPath(this.path, config.NUM_FRACTION_DIGITS);\n return [\n '<path ',\n 'COMMON_PARTS',\n `d=\"${path}\" stroke-linecap=\"round\" />\\n`,\n ];\n }\n\n /**\n * @private\n * @return the path command's translate transform attribute\n */\n _getOffsetTransform() {\n const digits = config.NUM_FRACTION_DIGITS;\n return ` translate(${toFixed(-this.pathOffset.x, digits)}, ${toFixed(\n -this.pathOffset.y,\n digits\n )})`;\n }\n\n /**\n * Returns svg clipPath representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {string} svg representation of an instance\n */\n toClipPathSVG(reviver: TSVGReviver): string {\n const additionalTransform = this._getOffsetTransform();\n return (\n '\\t' +\n this._createBaseClipPathSVGMarkup(this._toSVG(), {\n reviver: reviver,\n additionalTransform: additionalTransform,\n })\n );\n }\n\n /**\n * Returns svg representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {string} svg representation of an instance\n */\n toSVG(reviver: TSVGReviver): string {\n const additionalTransform = this._getOffsetTransform();\n return this._createBaseSVGMarkup(this._toSVG(), {\n reviver: reviver,\n additionalTransform: additionalTransform,\n });\n }\n\n /**\n * Returns number representation of an instance complexity\n * @return {number} complexity of this instance\n */\n complexity() {\n return this.path.length;\n }\n\n setDimensions() {\n this.setBoundingBox();\n }\n\n setBoundingBox(adjustPosition?: boolean) {\n const { width, height, pathOffset } = this._calcDimensions();\n this.set({ width, height, pathOffset });\n // using pathOffset because it match the use case.\n // if pathOffset change here we need to use left + width/2 , top + height/2\n adjustPosition && this.setPositionByOrigin(pathOffset, CENTER, CENTER);\n }\n\n _calcBoundsFromPath(): TBBox {\n const bounds: XY[] = [];\n let subpathStartX = 0,\n subpathStartY = 0,\n x = 0, // current x\n y = 0; // current y\n\n for (const command of this.path) {\n // current instruction\n switch (\n command[0] // first letter\n ) {\n case 'L': // lineto, absolute\n x = command[1];\n y = command[2];\n bounds.push(new Point(subpathStartX, subpathStartY), new Point(x, y));\n break;\n\n case 'M': // moveTo, absolute\n x = command[1];\n y = command[2];\n subpathStartX = x;\n subpathStartY = y;\n break;\n\n case 'C': // bezierCurveTo, absolute\n bounds.push(\n ...getBoundsOfCurve(\n x,\n y,\n command[1],\n command[2],\n command[3],\n command[4],\n command[5],\n command[6]\n )\n );\n x = command[5];\n y = command[6];\n break;\n\n case 'Q': // quadraticCurveTo, absolute\n bounds.push(\n ...getBoundsOfCurve(\n x,\n y,\n command[1],\n command[2],\n command[1],\n command[2],\n command[3],\n command[4]\n )\n );\n x = command[3];\n y = command[4];\n break;\n\n case 'Z':\n x = subpathStartX;\n y = subpathStartY;\n break;\n }\n }\n return makeBoundingBoxFromPoints(bounds);\n }\n\n /**\n * @private\n */\n _calcDimensions(): IPathBBox {\n const bbox = this._calcBoundsFromPath();\n\n return {\n ...bbox,\n pathOffset: new Point(\n bbox.left + bbox.width / 2,\n bbox.top + bbox.height / 2\n ),\n };\n }\n\n /**\n * List of attribute names to account for when parsing SVG element (used by `Path.fromElement`)\n * @static\n * @memberOf Path\n * @see http://www.w3.org/TR/SVG/paths.html#PathElement\n */\n static ATTRIBUTE_NAMES = [...SHARED_ATTRIBUTES, 'd'];\n\n /**\n * Creates an instance of Path from an object\n * @static\n * @memberOf Path\n * @param {Object} object\n * @returns {Promise<Path>}\n */\n static fromObject<T extends TOptions<SerializedPathProps>>(object: T) {\n return this._fromObject<Path>(object, {\n extraParam: 'path',\n });\n }\n\n /**\n * Creates an instance of Path from an SVG <path> element\n * @static\n * @memberOf Path\n * @param {HTMLElement} element to parse\n * @param {Partial<PathProps>} [options] Options object\n */\n static async fromElement(\n element: HTMLElement,\n options: Partial<PathProps>,\n cssRules?: CSSRules\n ) {\n const { d, ...parsedAttributes } = parseAttributes(\n element,\n this.ATTRIBUTE_NAMES,\n cssRules\n );\n return new this(d, {\n ...parsedAttributes,\n ...options,\n // we pass undefined to instruct the constructor to position the object using the bbox\n left: undefined,\n top: undefined,\n });\n }\n}\n\nclassRegistry.setClass(Path);\nclassRegistry.setSVGClass(Path);\n\n/* _FROM_SVG_START_ */\n"],"names":["Path","FabricObject","constructor","path","_ref","arguments","length","undefined","_","left","top","options","_objectWithoutProperties","_excluded","super","Object","assign","this","ownDefaults","setOptions","_setPath","set","LEFT","TOP","adjustPosition","makePathSimpler","Array","isArray","parsePath","setBoundingBox","_findCenterFromElement","bbox","_calcBoundsFromPath","Point","width","height","_renderPathCommands","ctx","l","pathOffset","x","t","y","beginPath","command","lineTo","moveTo","bezierCurveTo","quadraticCurveTo","closePath","_render","_renderPaintInOrder","toString","concat","complexity","toObject","propertiesToInclude","_objectSpread","map","pathCmd","slice","toDatalessObject","o","sourcePath","_toSVG","joinPath","config","NUM_FRACTION_DIGITS","_getOffsetTransform","digits","toFixed","toClipPathSVG","reviver","additionalTransform","_createBaseClipPathSVGMarkup","toSVG","_createBaseSVGMarkup","setDimensions","_calcDimensions","setPositionByOrigin","CENTER","bounds","subpathStartX","subpathStartY","push","getBoundsOfCurve","makeBoundingBoxFromPoints","fromObject","object","_fromObject","extraParam","fromElement","element","cssRules","_parseAttributes","parseAttributes","ATTRIBUTE_NAMES","d","parsedAttributes","_excluded2","_defineProperty","cacheProperties","SHARED_ATTRIBUTES","classRegistry","setClass","setSVGClass"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Path.min.mjs","sources":["../../../src/shapes/Path.ts"],"sourcesContent":["import { config } from '../config';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type { XY } from '../Point';\nimport { Point } from '../Point';\nimport { makeBoundingBoxFromPoints } from '../util/misc/boundingBoxFromPoints';\nimport { toFixed } from '../util/misc/toFixed';\nimport {\n getBoundsOfCurve,\n joinPath,\n makePathSimpler,\n parsePath,\n} from '../util/path';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type {\n TComplexPathData,\n TPathSegmentInfo,\n TSimplePathData,\n} from '../util/path/typedefs';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport type {\n TBBox,\n TClassProperties,\n TSVGReviver,\n TOptions,\n} from '../typedefs';\nimport { CENTER, LEFT, TOP } from '../constants';\nimport type { CSSRules } from '../parser/typedefs';\n\ninterface UniquePathProps {\n sourcePath?: string;\n path?: TSimplePathData;\n}\n\nexport interface SerializedPathProps\n extends SerializedObjectProps,\n UniquePathProps {}\n\nexport interface PathProps extends FabricObjectProps, UniquePathProps {}\n\nexport interface IPathBBox extends TBBox {\n left: number;\n top: number;\n pathOffset: Point;\n}\n\nexport class Path<\n Props extends TOptions<PathProps> = Partial<PathProps>,\n SProps extends SerializedPathProps = SerializedPathProps,\n EventSpec extends ObjectEvents = ObjectEvents\n> extends FabricObject<Props, SProps, EventSpec> {\n /**\n * Array of path points\n * @type Array\n * @default\n */\n declare path: TSimplePathData;\n\n declare pathOffset: Point;\n\n declare sourcePath?: string;\n\n declare segmentsInfo?: TPathSegmentInfo[];\n\n static type = 'Path';\n\n static cacheProperties = [...cacheProperties, 'path', 'fillRule'];\n\n /**\n * Constructor\n * @param {TComplexPathData} path Path data (sequence of coordinates and corresponding \"command\" tokens)\n * @param {Partial<PathProps>} [options] Options object\n * @return {Path} thisArg\n */\n constructor(\n path: TComplexPathData | string,\n // todo: evaluate this spread here\n { path: _, left, top, ...options }: Partial<Props> = {}\n ) {\n super();\n Object.assign(this, Path.ownDefaults);\n this.setOptions(options);\n this._setPath(path || [], true);\n typeof left === 'number' && this.set(LEFT, left);\n typeof top === 'number' && this.set(TOP, top);\n }\n\n /**\n * @private\n * @param {TComplexPathData | string} path Path data (sequence of coordinates and corresponding \"command\" tokens)\n * @param {boolean} [adjustPosition] pass true to reposition the object according to the bounding box\n * @returns {Point} top left position of the bounding box, useful for complementary positioning\n */\n _setPath(path: TComplexPathData | string, adjustPosition?: boolean) {\n this.path = makePathSimpler(Array.isArray(path) ? path : parsePath(path));\n this.setBoundingBox(adjustPosition);\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, by look at the polyline/polygon points.\n * @private\n * @return {Point} center point from element coordinates\n */\n _findCenterFromElement(): Point {\n const bbox = this._calcBoundsFromPath();\n return new Point(bbox.left + bbox.width / 2, bbox.top + bbox.height / 2);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render path on\n */\n _renderPathCommands(ctx: CanvasRenderingContext2D) {\n const l = -this.pathOffset.x,\n t = -this.pathOffset.y;\n\n ctx.beginPath();\n\n for (const command of this.path) {\n switch (\n command[0] // first letter\n ) {\n case 'L': // lineto, absolute\n ctx.lineTo(command[1] + l, command[2] + t);\n break;\n\n case 'M': // moveTo, absolute\n ctx.moveTo(command[1] + l, command[2] + t);\n break;\n\n case 'C': // bezierCurveTo, absolute\n ctx.bezierCurveTo(\n command[1] + l,\n command[2] + t,\n command[3] + l,\n command[4] + t,\n command[5] + l,\n command[6] + t\n );\n break;\n\n case 'Q': // quadraticCurveTo, absolute\n ctx.quadraticCurveTo(\n command[1] + l,\n command[2] + t,\n command[3] + l,\n command[4] + t\n );\n break;\n\n case 'Z':\n ctx.closePath();\n break;\n }\n }\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render path on\n */\n _render(ctx: CanvasRenderingContext2D) {\n this._renderPathCommands(ctx);\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Returns string representation of an instance\n * @return {string} string representation of an instance\n */\n toString() {\n return `#<Path (${this.complexity()}): { \"top\": ${this.top}, \"left\": ${\n this.left\n } }>`;\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 path: this.path.map((pathCmd) => pathCmd.slice()),\n };\n }\n\n /**\n * Returns dataless 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 toDatalessObject<\n T extends Omit<Props & TClassProperties<this>, keyof SProps>,\n K extends keyof T = never\n >(propertiesToInclude: K[] = []): Pick<T, K> & SProps {\n const o = this.toObject<T, K>(propertiesToInclude);\n if (this.sourcePath) {\n delete o.path;\n o.sourcePath = this.sourcePath;\n }\n return o;\n }\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const path = joinPath(this.path, config.NUM_FRACTION_DIGITS);\n return [\n '<path ',\n 'COMMON_PARTS',\n `d=\"${path}\" stroke-linecap=\"round\" />\\n`,\n ];\n }\n\n /**\n * @private\n * @return the path command's translate transform attribute\n */\n _getOffsetTransform() {\n const digits = config.NUM_FRACTION_DIGITS;\n return ` translate(${toFixed(-this.pathOffset.x, digits)}, ${toFixed(\n -this.pathOffset.y,\n digits\n )})`;\n }\n\n /**\n * Returns svg clipPath representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {string} svg representation of an instance\n */\n toClipPathSVG(reviver?: TSVGReviver): string {\n const additionalTransform = this._getOffsetTransform();\n return (\n '\\t' +\n this._createBaseClipPathSVGMarkup(this._toSVG(), {\n reviver,\n additionalTransform: additionalTransform,\n })\n );\n }\n\n /**\n * Returns svg representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {string} svg representation of an instance\n */\n toSVG(reviver?: TSVGReviver): string {\n const additionalTransform = this._getOffsetTransform();\n return this._createBaseSVGMarkup(this._toSVG(), {\n reviver,\n additionalTransform: additionalTransform,\n });\n }\n\n /**\n * Returns number representation of an instance complexity\n * @return {number} complexity of this instance\n */\n complexity() {\n return this.path.length;\n }\n\n setDimensions() {\n this.setBoundingBox();\n }\n\n setBoundingBox(adjustPosition?: boolean) {\n const { width, height, pathOffset } = this._calcDimensions();\n this.set({ width, height, pathOffset });\n // using pathOffset because it match the use case.\n // if pathOffset change here we need to use left + width/2 , top + height/2\n adjustPosition && this.setPositionByOrigin(pathOffset, CENTER, CENTER);\n }\n\n _calcBoundsFromPath(): TBBox {\n const bounds: XY[] = [];\n let subpathStartX = 0,\n subpathStartY = 0,\n x = 0, // current x\n y = 0; // current y\n\n for (const command of this.path) {\n // current instruction\n switch (\n command[0] // first letter\n ) {\n case 'L': // lineto, absolute\n x = command[1];\n y = command[2];\n bounds.push(new Point(subpathStartX, subpathStartY), new Point(x, y));\n break;\n\n case 'M': // moveTo, absolute\n x = command[1];\n y = command[2];\n subpathStartX = x;\n subpathStartY = y;\n break;\n\n case 'C': // bezierCurveTo, absolute\n bounds.push(\n ...getBoundsOfCurve(\n x,\n y,\n command[1],\n command[2],\n command[3],\n command[4],\n command[5],\n command[6]\n )\n );\n x = command[5];\n y = command[6];\n break;\n\n case 'Q': // quadraticCurveTo, absolute\n bounds.push(\n ...getBoundsOfCurve(\n x,\n y,\n command[1],\n command[2],\n command[1],\n command[2],\n command[3],\n command[4]\n )\n );\n x = command[3];\n y = command[4];\n break;\n\n case 'Z':\n x = subpathStartX;\n y = subpathStartY;\n break;\n }\n }\n return makeBoundingBoxFromPoints(bounds);\n }\n\n /**\n * @private\n */\n _calcDimensions(): IPathBBox {\n const bbox = this._calcBoundsFromPath();\n\n return {\n ...bbox,\n pathOffset: new Point(\n bbox.left + bbox.width / 2,\n bbox.top + bbox.height / 2\n ),\n };\n }\n\n /**\n * List of attribute names to account for when parsing SVG element (used by `Path.fromElement`)\n * @static\n * @memberOf Path\n * @see http://www.w3.org/TR/SVG/paths.html#PathElement\n */\n static ATTRIBUTE_NAMES = [...SHARED_ATTRIBUTES, 'd'];\n\n /**\n * Creates an instance of Path from an object\n * @static\n * @memberOf Path\n * @param {Object} object\n * @returns {Promise<Path>}\n */\n static fromObject<T extends TOptions<SerializedPathProps>>(object: T) {\n return this._fromObject<Path>(object, {\n extraParam: 'path',\n });\n }\n\n /**\n * Creates an instance of Path from an SVG <path> element\n * @static\n * @memberOf Path\n * @param {HTMLElement} element to parse\n * @param {Partial<PathProps>} [options] Options object\n */\n static async fromElement(\n element: HTMLElement,\n options: Partial<PathProps>,\n cssRules?: CSSRules\n ) {\n const { d, ...parsedAttributes } = parseAttributes(\n element,\n this.ATTRIBUTE_NAMES,\n cssRules\n );\n return new this(d, {\n ...parsedAttributes,\n ...options,\n // we pass undefined to instruct the constructor to position the object using the bbox\n left: undefined,\n top: undefined,\n });\n }\n}\n\nclassRegistry.setClass(Path);\nclassRegistry.setSVGClass(Path);\n\n/* _FROM_SVG_START_ */\n"],"names":["Path","FabricObject","constructor","path","_ref","arguments","length","undefined","_","left","top","options","_objectWithoutProperties","_excluded","super","Object","assign","this","ownDefaults","setOptions","_setPath","set","LEFT","TOP","adjustPosition","makePathSimpler","Array","isArray","parsePath","setBoundingBox","_findCenterFromElement","bbox","_calcBoundsFromPath","Point","width","height","_renderPathCommands","ctx","l","pathOffset","x","t","y","beginPath","command","lineTo","moveTo","bezierCurveTo","quadraticCurveTo","closePath","_render","_renderPaintInOrder","toString","concat","complexity","toObject","propertiesToInclude","_objectSpread","map","pathCmd","slice","toDatalessObject","o","sourcePath","_toSVG","joinPath","config","NUM_FRACTION_DIGITS","_getOffsetTransform","digits","toFixed","toClipPathSVG","reviver","additionalTransform","_createBaseClipPathSVGMarkup","toSVG","_createBaseSVGMarkup","setDimensions","_calcDimensions","setPositionByOrigin","CENTER","bounds","subpathStartX","subpathStartY","push","getBoundsOfCurve","makeBoundingBoxFromPoints","fromObject","object","_fromObject","extraParam","fromElement","element","cssRules","_parseAttributes","parseAttributes","ATTRIBUTE_NAMES","d","parsedAttributes","_excluded2","_defineProperty","cacheProperties","SHARED_ATTRIBUTES","classRegistry","setClass","setSVGClass"],"mappings":"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"}
|
package/dist/src/shapes/Path.mjs
CHANGED
|
@@ -163,7 +163,7 @@ class Path extends FabricObject {
|
|
|
163
163
|
toClipPathSVG(reviver) {
|
|
164
164
|
const additionalTransform = this._getOffsetTransform();
|
|
165
165
|
return '\t' + this._createBaseClipPathSVGMarkup(this._toSVG(), {
|
|
166
|
-
reviver
|
|
166
|
+
reviver,
|
|
167
167
|
additionalTransform: additionalTransform
|
|
168
168
|
});
|
|
169
169
|
}
|
|
@@ -176,7 +176,7 @@ class Path extends FabricObject {
|
|
|
176
176
|
toSVG(reviver) {
|
|
177
177
|
const additionalTransform = this._getOffsetTransform();
|
|
178
178
|
return this._createBaseSVGMarkup(this._toSVG(), {
|
|
179
|
-
reviver
|
|
179
|
+
reviver,
|
|
180
180
|
additionalTransform: additionalTransform
|
|
181
181
|
});
|
|
182
182
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Path.mjs","sources":["../../../src/shapes/Path.ts"],"sourcesContent":["import { config } from '../config';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type { XY } from '../Point';\nimport { Point } from '../Point';\nimport { makeBoundingBoxFromPoints } from '../util/misc/boundingBoxFromPoints';\nimport { toFixed } from '../util/misc/toFixed';\nimport {\n getBoundsOfCurve,\n joinPath,\n makePathSimpler,\n parsePath,\n} from '../util/path';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type {\n TComplexPathData,\n TPathSegmentInfo,\n TSimplePathData,\n} from '../util/path/typedefs';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport type {\n TBBox,\n TClassProperties,\n TSVGReviver,\n TOptions,\n} from '../typedefs';\nimport { CENTER, LEFT, TOP } from '../constants';\nimport type { CSSRules } from '../parser/typedefs';\n\ninterface UniquePathProps {\n sourcePath?: string;\n path?: TSimplePathData;\n}\n\nexport interface SerializedPathProps\n extends SerializedObjectProps,\n UniquePathProps {}\n\nexport interface PathProps extends FabricObjectProps, UniquePathProps {}\n\nexport interface IPathBBox extends TBBox {\n left: number;\n top: number;\n pathOffset: Point;\n}\n\nexport class Path<\n Props extends TOptions<PathProps> = Partial<PathProps>,\n SProps extends SerializedPathProps = SerializedPathProps,\n EventSpec extends ObjectEvents = ObjectEvents\n> extends FabricObject<Props, SProps, EventSpec> {\n /**\n * Array of path points\n * @type Array\n * @default\n */\n declare path: TSimplePathData;\n\n declare pathOffset: Point;\n\n declare sourcePath?: string;\n\n declare segmentsInfo?: TPathSegmentInfo[];\n\n static type = 'Path';\n\n static cacheProperties = [...cacheProperties, 'path', 'fillRule'];\n\n /**\n * Constructor\n * @param {TComplexPathData} path Path data (sequence of coordinates and corresponding \"command\" tokens)\n * @param {Partial<PathProps>} [options] Options object\n * @return {Path} thisArg\n */\n constructor(\n path: TComplexPathData | string,\n // todo: evaluate this spread here\n { path: _, left, top, ...options }: Partial<Props> = {}\n ) {\n super();\n Object.assign(this, Path.ownDefaults);\n this.setOptions(options);\n this._setPath(path || [], true);\n typeof left === 'number' && this.set(LEFT, left);\n typeof top === 'number' && this.set(TOP, top);\n }\n\n /**\n * @private\n * @param {TComplexPathData | string} path Path data (sequence of coordinates and corresponding \"command\" tokens)\n * @param {boolean} [adjustPosition] pass true to reposition the object according to the bounding box\n * @returns {Point} top left position of the bounding box, useful for complementary positioning\n */\n _setPath(path: TComplexPathData | string, adjustPosition?: boolean) {\n this.path = makePathSimpler(Array.isArray(path) ? path : parsePath(path));\n this.setBoundingBox(adjustPosition);\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, by look at the polyline/polygon points.\n * @private\n * @return {Point} center point from element coordinates\n */\n _findCenterFromElement(): Point {\n const bbox = this._calcBoundsFromPath();\n return new Point(bbox.left + bbox.width / 2, bbox.top + bbox.height / 2);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render path on\n */\n _renderPathCommands(ctx: CanvasRenderingContext2D) {\n const l = -this.pathOffset.x,\n t = -this.pathOffset.y;\n\n ctx.beginPath();\n\n for (const command of this.path) {\n switch (\n command[0] // first letter\n ) {\n case 'L': // lineto, absolute\n ctx.lineTo(command[1] + l, command[2] + t);\n break;\n\n case 'M': // moveTo, absolute\n ctx.moveTo(command[1] + l, command[2] + t);\n break;\n\n case 'C': // bezierCurveTo, absolute\n ctx.bezierCurveTo(\n command[1] + l,\n command[2] + t,\n command[3] + l,\n command[4] + t,\n command[5] + l,\n command[6] + t\n );\n break;\n\n case 'Q': // quadraticCurveTo, absolute\n ctx.quadraticCurveTo(\n command[1] + l,\n command[2] + t,\n command[3] + l,\n command[4] + t\n );\n break;\n\n case 'Z':\n ctx.closePath();\n break;\n }\n }\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render path on\n */\n _render(ctx: CanvasRenderingContext2D) {\n this._renderPathCommands(ctx);\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Returns string representation of an instance\n * @return {string} string representation of an instance\n */\n toString() {\n return `#<Path (${this.complexity()}): { \"top\": ${this.top}, \"left\": ${\n this.left\n } }>`;\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 path: this.path.map((pathCmd) => pathCmd.slice()),\n };\n }\n\n /**\n * Returns dataless 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 toDatalessObject<\n T extends Omit<Props & TClassProperties<this>, keyof SProps>,\n K extends keyof T = never\n >(propertiesToInclude: K[] = []): Pick<T, K> & SProps {\n const o = this.toObject<T, K>(propertiesToInclude);\n if (this.sourcePath) {\n delete o.path;\n o.sourcePath = this.sourcePath;\n }\n return o;\n }\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const path = joinPath(this.path, config.NUM_FRACTION_DIGITS);\n return [\n '<path ',\n 'COMMON_PARTS',\n `d=\"${path}\" stroke-linecap=\"round\" />\\n`,\n ];\n }\n\n /**\n * @private\n * @return the path command's translate transform attribute\n */\n _getOffsetTransform() {\n const digits = config.NUM_FRACTION_DIGITS;\n return ` translate(${toFixed(-this.pathOffset.x, digits)}, ${toFixed(\n -this.pathOffset.y,\n digits\n )})`;\n }\n\n /**\n * Returns svg clipPath representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {string} svg representation of an instance\n */\n toClipPathSVG(reviver: TSVGReviver): string {\n const additionalTransform = this._getOffsetTransform();\n return (\n '\\t' +\n this._createBaseClipPathSVGMarkup(this._toSVG(), {\n reviver: reviver,\n additionalTransform: additionalTransform,\n })\n );\n }\n\n /**\n * Returns svg representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {string} svg representation of an instance\n */\n toSVG(reviver: TSVGReviver): string {\n const additionalTransform = this._getOffsetTransform();\n return this._createBaseSVGMarkup(this._toSVG(), {\n reviver: reviver,\n additionalTransform: additionalTransform,\n });\n }\n\n /**\n * Returns number representation of an instance complexity\n * @return {number} complexity of this instance\n */\n complexity() {\n return this.path.length;\n }\n\n setDimensions() {\n this.setBoundingBox();\n }\n\n setBoundingBox(adjustPosition?: boolean) {\n const { width, height, pathOffset } = this._calcDimensions();\n this.set({ width, height, pathOffset });\n // using pathOffset because it match the use case.\n // if pathOffset change here we need to use left + width/2 , top + height/2\n adjustPosition && this.setPositionByOrigin(pathOffset, CENTER, CENTER);\n }\n\n _calcBoundsFromPath(): TBBox {\n const bounds: XY[] = [];\n let subpathStartX = 0,\n subpathStartY = 0,\n x = 0, // current x\n y = 0; // current y\n\n for (const command of this.path) {\n // current instruction\n switch (\n command[0] // first letter\n ) {\n case 'L': // lineto, absolute\n x = command[1];\n y = command[2];\n bounds.push(new Point(subpathStartX, subpathStartY), new Point(x, y));\n break;\n\n case 'M': // moveTo, absolute\n x = command[1];\n y = command[2];\n subpathStartX = x;\n subpathStartY = y;\n break;\n\n case 'C': // bezierCurveTo, absolute\n bounds.push(\n ...getBoundsOfCurve(\n x,\n y,\n command[1],\n command[2],\n command[3],\n command[4],\n command[5],\n command[6]\n )\n );\n x = command[5];\n y = command[6];\n break;\n\n case 'Q': // quadraticCurveTo, absolute\n bounds.push(\n ...getBoundsOfCurve(\n x,\n y,\n command[1],\n command[2],\n command[1],\n command[2],\n command[3],\n command[4]\n )\n );\n x = command[3];\n y = command[4];\n break;\n\n case 'Z':\n x = subpathStartX;\n y = subpathStartY;\n break;\n }\n }\n return makeBoundingBoxFromPoints(bounds);\n }\n\n /**\n * @private\n */\n _calcDimensions(): IPathBBox {\n const bbox = this._calcBoundsFromPath();\n\n return {\n ...bbox,\n pathOffset: new Point(\n bbox.left + bbox.width / 2,\n bbox.top + bbox.height / 2\n ),\n };\n }\n\n /**\n * List of attribute names to account for when parsing SVG element (used by `Path.fromElement`)\n * @static\n * @memberOf Path\n * @see http://www.w3.org/TR/SVG/paths.html#PathElement\n */\n static ATTRIBUTE_NAMES = [...SHARED_ATTRIBUTES, 'd'];\n\n /**\n * Creates an instance of Path from an object\n * @static\n * @memberOf Path\n * @param {Object} object\n * @returns {Promise<Path>}\n */\n static fromObject<T extends TOptions<SerializedPathProps>>(object: T) {\n return this._fromObject<Path>(object, {\n extraParam: 'path',\n });\n }\n\n /**\n * Creates an instance of Path from an SVG <path> element\n * @static\n * @memberOf Path\n * @param {HTMLElement} element to parse\n * @param {Partial<PathProps>} [options] Options object\n */\n static async fromElement(\n element: HTMLElement,\n options: Partial<PathProps>,\n cssRules?: CSSRules\n ) {\n const { d, ...parsedAttributes } = parseAttributes(\n element,\n this.ATTRIBUTE_NAMES,\n cssRules\n );\n return new this(d, {\n ...parsedAttributes,\n ...options,\n // we pass undefined to instruct the constructor to position the object using the bbox\n left: undefined,\n top: undefined,\n });\n }\n}\n\nclassRegistry.setClass(Path);\nclassRegistry.setSVGClass(Path);\n\n/* _FROM_SVG_START_ */\n"],"names":["Path","FabricObject","constructor","path","_ref","arguments","length","undefined","_","left","top","options","_objectWithoutProperties","_excluded","Object","assign","ownDefaults","setOptions","_setPath","set","LEFT","TOP","adjustPosition","makePathSimpler","Array","isArray","parsePath","setBoundingBox","_findCenterFromElement","bbox","_calcBoundsFromPath","Point","width","height","_renderPathCommands","ctx","l","pathOffset","x","t","y","beginPath","command","lineTo","moveTo","bezierCurveTo","quadraticCurveTo","closePath","_render","_renderPaintInOrder","toString","concat","complexity","toObject","propertiesToInclude","_objectSpread","map","pathCmd","slice","toDatalessObject","o","sourcePath","_toSVG","joinPath","config","NUM_FRACTION_DIGITS","_getOffsetTransform","digits","toFixed","toClipPathSVG","reviver","additionalTransform","_createBaseClipPathSVGMarkup","toSVG","_createBaseSVGMarkup","setDimensions","_calcDimensions","setPositionByOrigin","CENTER","bounds","subpathStartX","subpathStartY","push","getBoundsOfCurve","makeBoundingBoxFromPoints","fromObject","object","_fromObject","extraParam","fromElement","element","cssRules","_parseAttributes","parseAttributes","ATTRIBUTE_NAMES","d","parsedAttributes","_excluded2","_defineProperty","cacheProperties","SHARED_ATTRIBUTES","classRegistry","setClass","setSVGClass"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Path.mjs","sources":["../../../src/shapes/Path.ts"],"sourcesContent":["import { config } from '../config';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type { XY } from '../Point';\nimport { Point } from '../Point';\nimport { makeBoundingBoxFromPoints } from '../util/misc/boundingBoxFromPoints';\nimport { toFixed } from '../util/misc/toFixed';\nimport {\n getBoundsOfCurve,\n joinPath,\n makePathSimpler,\n parsePath,\n} from '../util/path';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type {\n TComplexPathData,\n TPathSegmentInfo,\n TSimplePathData,\n} from '../util/path/typedefs';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport type {\n TBBox,\n TClassProperties,\n TSVGReviver,\n TOptions,\n} from '../typedefs';\nimport { CENTER, LEFT, TOP } from '../constants';\nimport type { CSSRules } from '../parser/typedefs';\n\ninterface UniquePathProps {\n sourcePath?: string;\n path?: TSimplePathData;\n}\n\nexport interface SerializedPathProps\n extends SerializedObjectProps,\n UniquePathProps {}\n\nexport interface PathProps extends FabricObjectProps, UniquePathProps {}\n\nexport interface IPathBBox extends TBBox {\n left: number;\n top: number;\n pathOffset: Point;\n}\n\nexport class Path<\n Props extends TOptions<PathProps> = Partial<PathProps>,\n SProps extends SerializedPathProps = SerializedPathProps,\n EventSpec extends ObjectEvents = ObjectEvents\n> extends FabricObject<Props, SProps, EventSpec> {\n /**\n * Array of path points\n * @type Array\n * @default\n */\n declare path: TSimplePathData;\n\n declare pathOffset: Point;\n\n declare sourcePath?: string;\n\n declare segmentsInfo?: TPathSegmentInfo[];\n\n static type = 'Path';\n\n static cacheProperties = [...cacheProperties, 'path', 'fillRule'];\n\n /**\n * Constructor\n * @param {TComplexPathData} path Path data (sequence of coordinates and corresponding \"command\" tokens)\n * @param {Partial<PathProps>} [options] Options object\n * @return {Path} thisArg\n */\n constructor(\n path: TComplexPathData | string,\n // todo: evaluate this spread here\n { path: _, left, top, ...options }: Partial<Props> = {}\n ) {\n super();\n Object.assign(this, Path.ownDefaults);\n this.setOptions(options);\n this._setPath(path || [], true);\n typeof left === 'number' && this.set(LEFT, left);\n typeof top === 'number' && this.set(TOP, top);\n }\n\n /**\n * @private\n * @param {TComplexPathData | string} path Path data (sequence of coordinates and corresponding \"command\" tokens)\n * @param {boolean} [adjustPosition] pass true to reposition the object according to the bounding box\n * @returns {Point} top left position of the bounding box, useful for complementary positioning\n */\n _setPath(path: TComplexPathData | string, adjustPosition?: boolean) {\n this.path = makePathSimpler(Array.isArray(path) ? path : parsePath(path));\n this.setBoundingBox(adjustPosition);\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, by look at the polyline/polygon points.\n * @private\n * @return {Point} center point from element coordinates\n */\n _findCenterFromElement(): Point {\n const bbox = this._calcBoundsFromPath();\n return new Point(bbox.left + bbox.width / 2, bbox.top + bbox.height / 2);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render path on\n */\n _renderPathCommands(ctx: CanvasRenderingContext2D) {\n const l = -this.pathOffset.x,\n t = -this.pathOffset.y;\n\n ctx.beginPath();\n\n for (const command of this.path) {\n switch (\n command[0] // first letter\n ) {\n case 'L': // lineto, absolute\n ctx.lineTo(command[1] + l, command[2] + t);\n break;\n\n case 'M': // moveTo, absolute\n ctx.moveTo(command[1] + l, command[2] + t);\n break;\n\n case 'C': // bezierCurveTo, absolute\n ctx.bezierCurveTo(\n command[1] + l,\n command[2] + t,\n command[3] + l,\n command[4] + t,\n command[5] + l,\n command[6] + t\n );\n break;\n\n case 'Q': // quadraticCurveTo, absolute\n ctx.quadraticCurveTo(\n command[1] + l,\n command[2] + t,\n command[3] + l,\n command[4] + t\n );\n break;\n\n case 'Z':\n ctx.closePath();\n break;\n }\n }\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render path on\n */\n _render(ctx: CanvasRenderingContext2D) {\n this._renderPathCommands(ctx);\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Returns string representation of an instance\n * @return {string} string representation of an instance\n */\n toString() {\n return `#<Path (${this.complexity()}): { \"top\": ${this.top}, \"left\": ${\n this.left\n } }>`;\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 path: this.path.map((pathCmd) => pathCmd.slice()),\n };\n }\n\n /**\n * Returns dataless 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 toDatalessObject<\n T extends Omit<Props & TClassProperties<this>, keyof SProps>,\n K extends keyof T = never\n >(propertiesToInclude: K[] = []): Pick<T, K> & SProps {\n const o = this.toObject<T, K>(propertiesToInclude);\n if (this.sourcePath) {\n delete o.path;\n o.sourcePath = this.sourcePath;\n }\n return o;\n }\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const path = joinPath(this.path, config.NUM_FRACTION_DIGITS);\n return [\n '<path ',\n 'COMMON_PARTS',\n `d=\"${path}\" stroke-linecap=\"round\" />\\n`,\n ];\n }\n\n /**\n * @private\n * @return the path command's translate transform attribute\n */\n _getOffsetTransform() {\n const digits = config.NUM_FRACTION_DIGITS;\n return ` translate(${toFixed(-this.pathOffset.x, digits)}, ${toFixed(\n -this.pathOffset.y,\n digits\n )})`;\n }\n\n /**\n * Returns svg clipPath representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {string} svg representation of an instance\n */\n toClipPathSVG(reviver?: TSVGReviver): string {\n const additionalTransform = this._getOffsetTransform();\n return (\n '\\t' +\n this._createBaseClipPathSVGMarkup(this._toSVG(), {\n reviver,\n additionalTransform: additionalTransform,\n })\n );\n }\n\n /**\n * Returns svg representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {string} svg representation of an instance\n */\n toSVG(reviver?: TSVGReviver): string {\n const additionalTransform = this._getOffsetTransform();\n return this._createBaseSVGMarkup(this._toSVG(), {\n reviver,\n additionalTransform: additionalTransform,\n });\n }\n\n /**\n * Returns number representation of an instance complexity\n * @return {number} complexity of this instance\n */\n complexity() {\n return this.path.length;\n }\n\n setDimensions() {\n this.setBoundingBox();\n }\n\n setBoundingBox(adjustPosition?: boolean) {\n const { width, height, pathOffset } = this._calcDimensions();\n this.set({ width, height, pathOffset });\n // using pathOffset because it match the use case.\n // if pathOffset change here we need to use left + width/2 , top + height/2\n adjustPosition && this.setPositionByOrigin(pathOffset, CENTER, CENTER);\n }\n\n _calcBoundsFromPath(): TBBox {\n const bounds: XY[] = [];\n let subpathStartX = 0,\n subpathStartY = 0,\n x = 0, // current x\n y = 0; // current y\n\n for (const command of this.path) {\n // current instruction\n switch (\n command[0] // first letter\n ) {\n case 'L': // lineto, absolute\n x = command[1];\n y = command[2];\n bounds.push(new Point(subpathStartX, subpathStartY), new Point(x, y));\n break;\n\n case 'M': // moveTo, absolute\n x = command[1];\n y = command[2];\n subpathStartX = x;\n subpathStartY = y;\n break;\n\n case 'C': // bezierCurveTo, absolute\n bounds.push(\n ...getBoundsOfCurve(\n x,\n y,\n command[1],\n command[2],\n command[3],\n command[4],\n command[5],\n command[6]\n )\n );\n x = command[5];\n y = command[6];\n break;\n\n case 'Q': // quadraticCurveTo, absolute\n bounds.push(\n ...getBoundsOfCurve(\n x,\n y,\n command[1],\n command[2],\n command[1],\n command[2],\n command[3],\n command[4]\n )\n );\n x = command[3];\n y = command[4];\n break;\n\n case 'Z':\n x = subpathStartX;\n y = subpathStartY;\n break;\n }\n }\n return makeBoundingBoxFromPoints(bounds);\n }\n\n /**\n * @private\n */\n _calcDimensions(): IPathBBox {\n const bbox = this._calcBoundsFromPath();\n\n return {\n ...bbox,\n pathOffset: new Point(\n bbox.left + bbox.width / 2,\n bbox.top + bbox.height / 2\n ),\n };\n }\n\n /**\n * List of attribute names to account for when parsing SVG element (used by `Path.fromElement`)\n * @static\n * @memberOf Path\n * @see http://www.w3.org/TR/SVG/paths.html#PathElement\n */\n static ATTRIBUTE_NAMES = [...SHARED_ATTRIBUTES, 'd'];\n\n /**\n * Creates an instance of Path from an object\n * @static\n * @memberOf Path\n * @param {Object} object\n * @returns {Promise<Path>}\n */\n static fromObject<T extends TOptions<SerializedPathProps>>(object: T) {\n return this._fromObject<Path>(object, {\n extraParam: 'path',\n });\n }\n\n /**\n * Creates an instance of Path from an SVG <path> element\n * @static\n * @memberOf Path\n * @param {HTMLElement} element to parse\n * @param {Partial<PathProps>} [options] Options object\n */\n static async fromElement(\n element: HTMLElement,\n options: Partial<PathProps>,\n cssRules?: CSSRules\n ) {\n const { d, ...parsedAttributes } = parseAttributes(\n element,\n this.ATTRIBUTE_NAMES,\n cssRules\n );\n return new this(d, {\n ...parsedAttributes,\n ...options,\n // we pass undefined to instruct the constructor to position the object using the bbox\n left: undefined,\n top: undefined,\n });\n }\n}\n\nclassRegistry.setClass(Path);\nclassRegistry.setSVGClass(Path);\n\n/* _FROM_SVG_START_ */\n"],"names":["Path","FabricObject","constructor","path","_ref","arguments","length","undefined","_","left","top","options","_objectWithoutProperties","_excluded","Object","assign","ownDefaults","setOptions","_setPath","set","LEFT","TOP","adjustPosition","makePathSimpler","Array","isArray","parsePath","setBoundingBox","_findCenterFromElement","bbox","_calcBoundsFromPath","Point","width","height","_renderPathCommands","ctx","l","pathOffset","x","t","y","beginPath","command","lineTo","moveTo","bezierCurveTo","quadraticCurveTo","closePath","_render","_renderPaintInOrder","toString","concat","complexity","toObject","propertiesToInclude","_objectSpread","map","pathCmd","slice","toDatalessObject","o","sourcePath","_toSVG","joinPath","config","NUM_FRACTION_DIGITS","_getOffsetTransform","digits","toFixed","toClipPathSVG","reviver","additionalTransform","_createBaseClipPathSVGMarkup","toSVG","_createBaseSVGMarkup","setDimensions","_calcDimensions","setPositionByOrigin","CENTER","bounds","subpathStartX","subpathStartY","push","getBoundsOfCurve","makeBoundingBoxFromPoints","fromObject","object","_fromObject","extraParam","fromElement","element","cssRules","_parseAttributes","parseAttributes","ATTRIBUTE_NAMES","d","parsedAttributes","_excluded2","_defineProperty","cacheProperties","SHARED_ATTRIBUTES","classRegistry","setClass","setSVGClass"],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@ import { type TextStyleDeclaration } from './StyledText';
|
|
|
4
4
|
import type { FabricText } from './Text';
|
|
5
5
|
export declare class TextSVGExportMixin extends FabricObjectSVGExportMixin {
|
|
6
6
|
_toSVG(this: TextSVGExportMixin & FabricText): string[];
|
|
7
|
-
toSVG(this: TextSVGExportMixin & FabricText, reviver
|
|
7
|
+
toSVG(this: TextSVGExportMixin & FabricText, reviver?: TSVGReviver): string;
|
|
8
8
|
private _getSVGLeftTopOffsets;
|
|
9
9
|
private _wrapSVGTextAndBg;
|
|
10
10
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TextSVGExportMixin.d.ts","sourceRoot":"","sources":["../../../../src/shapes/Text/TextSVGExportMixin.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAKlD,OAAO,EAAE,0BAA0B,EAAE,MAAM,sCAAsC,CAAC;AAClF,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAezC,qBAAa,kBAAmB,SAAQ,0BAA0B;IAChE,MAAM,CAAC,IAAI,EAAE,kBAAkB,GAAG,UAAU,GAAG,MAAM,EAAE;IAMvD,KAAK,CAAC,IAAI,EAAE,kBAAkB,GAAG,UAAU,EAAE,OAAO,EAAE,WAAW,GAAG,MAAM;
|
|
1
|
+
{"version":3,"file":"TextSVGExportMixin.d.ts","sourceRoot":"","sources":["../../../../src/shapes/Text/TextSVGExportMixin.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAKlD,OAAO,EAAE,0BAA0B,EAAE,MAAM,sCAAsC,CAAC;AAClF,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAezC,qBAAa,kBAAmB,SAAQ,0BAA0B;IAChE,MAAM,CAAC,IAAI,EAAE,kBAAkB,GAAG,UAAU,GAAG,MAAM,EAAE;IAMvD,KAAK,CAAC,IAAI,EAAE,kBAAkB,GAAG,UAAU,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,MAAM;IAQ3E,OAAO,CAAC,qBAAqB;IAQ7B,OAAO,CAAC,iBAAiB;IAiCzB;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB;IAmDxB,OAAO,CAAC,mBAAmB;IAwB3B,OAAO,CAAC,mBAAmB;IAgE3B,OAAO,CAAC,iBAAiB;IA8CzB;;OAEG;IACH,oBAAoB,CAClB,IAAI,EAAE,kBAAkB,GAAG,UAAU,EACrC,SAAS,EAAE,MAAM;;;;IAgBnB;;;;OAIG;IACH,YAAY,CAAC,IAAI,EAAE,kBAAkB,GAAG,UAAU,EAAE,UAAU,CAAC,EAAE,OAAO;IAMxE;;;;;OAKG;IACH,gBAAgB,CACd,IAAI,EAAE,kBAAkB,GAAG,UAAU,EACrC,KAAK,EAAE,oBAAoB,EAC3B,aAAa,CAAC,EAAE,OAAO;IAmCzB;;;;OAIG;IACH,oBAAoB,CAClB,IAAI,EAAE,kBAAkB,GAAG,UAAU,EACrC,KAAK,EAAE,oBAAoB;CAc9B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TextSVGExportMixin.min.mjs","sources":["../../../../src/shapes/Text/TextSVGExportMixin.ts"],"sourcesContent":["import { config } from '../../config';\nimport type { TSVGReviver } from '../../typedefs';\nimport { escapeXml } from '../../util/lang_string';\nimport { colorPropToSVG, createSVGRect } from '../../util/misc/svgParsing';\nimport { hasStyleChanged } from '../../util/misc/textStyles';\nimport { toFixed } from '../../util/misc/toFixed';\nimport { FabricObjectSVGExportMixin } from '../Object/FabricObjectSVGExportMixin';\nimport { type TextStyleDeclaration } from './StyledText';\nimport { JUSTIFY } from '../Text/constants';\nimport type { FabricText } from './Text';\n\nconst multipleSpacesRegex = / +/g;\nconst dblQuoteRegex = /\"/g;\n\nfunction createSVGInlineRect(\n color: string,\n left: number,\n top: number,\n width: number,\n height: number\n) {\n return `\\t\\t${createSVGRect(color, { left, top, width, height })}\\n`;\n}\n\nexport class TextSVGExportMixin extends FabricObjectSVGExportMixin {\n _toSVG(this: TextSVGExportMixin & FabricText): string[] {\n const offsets = this._getSVGLeftTopOffsets(),\n textAndBg = this._getSVGTextAndBg(offsets.textTop, offsets.textLeft);\n return this._wrapSVGTextAndBg(textAndBg);\n }\n\n toSVG(this: TextSVGExportMixin & FabricText, reviver: TSVGReviver): string {\n return this._createBaseSVGMarkup(this._toSVG(), {\n reviver,\n noStyle: true,\n withShadow: true,\n });\n }\n\n private _getSVGLeftTopOffsets(this: TextSVGExportMixin & FabricText) {\n return {\n textLeft: -this.width / 2,\n textTop: -this.height / 2,\n lineTop: this.getHeightOfLine(0),\n };\n }\n\n private _wrapSVGTextAndBg(\n this: TextSVGExportMixin & FabricText,\n {\n textBgRects,\n textSpans,\n }: {\n textSpans: string[];\n textBgRects: string[];\n }\n ) {\n const noShadow = true,\n textDecoration = this.getSvgTextDecoration(this);\n return [\n textBgRects.join(''),\n '\\t\\t<text xml:space=\"preserve\" ',\n this.fontFamily\n ? `font-family=\"${this.fontFamily.replace(dblQuoteRegex, \"'\")}\" `\n : '',\n this.fontSize ? `font-size=\"${this.fontSize}\" ` : '',\n this.fontStyle ? `font-style=\"${this.fontStyle}\" ` : '',\n this.fontWeight ? `font-weight=\"${this.fontWeight}\" ` : '',\n textDecoration ? `text-decoration=\"${textDecoration}\" ` : '',\n this.direction === 'rtl' ? `direction=\"${this.direction}\" ` : '',\n 'style=\"',\n this.getSvgStyles(noShadow),\n '\"',\n this.addPaintOrder(),\n ' >',\n textSpans.join(''),\n '</text>\\n',\n ];\n }\n\n /**\n * @private\n * @param {Number} textTopOffset Text top offset\n * @param {Number} textLeftOffset Text left offset\n * @return {Object}\n */\n private _getSVGTextAndBg(\n this: TextSVGExportMixin & FabricText,\n textTopOffset: number,\n textLeftOffset: number\n ) {\n const textSpans: string[] = [],\n textBgRects: string[] = [];\n let height = textTopOffset,\n lineOffset;\n\n // bounding-box background\n this.backgroundColor &&\n textBgRects.push(\n ...createSVGInlineRect(\n this.backgroundColor,\n -this.width / 2,\n -this.height / 2,\n this.width,\n this.height\n )\n );\n\n // text and text-background\n for (let i = 0, len = this._textLines.length; i < len; i++) {\n lineOffset = this._getLineLeftOffset(i);\n if (this.direction === 'rtl') {\n lineOffset += this.width;\n }\n if (this.textBackgroundColor || this.styleHas('textBackgroundColor', i)) {\n this._setSVGTextLineBg(\n textBgRects,\n i,\n textLeftOffset + lineOffset,\n height\n );\n }\n this._setSVGTextLineText(\n textSpans,\n i,\n textLeftOffset + lineOffset,\n height\n );\n height += this.getHeightOfLine(i);\n }\n\n return {\n textSpans,\n textBgRects,\n };\n }\n\n private _createTextCharSpan(\n this: TextSVGExportMixin & FabricText,\n char: string,\n styleDecl: TextStyleDeclaration,\n left: number,\n top: number\n ) {\n const styleProps = this.getSvgSpanStyles(\n styleDecl,\n char !== char.trim() || !!char.match(multipleSpacesRegex)\n ),\n fillStyles = styleProps ? `style=\"${styleProps}\"` : '',\n dy = styleDecl.deltaY,\n dySpan = dy ? ` dy=\"${toFixed(dy, config.NUM_FRACTION_DIGITS)}\" ` : '';\n\n return `<tspan x=\"${toFixed(\n left,\n config.NUM_FRACTION_DIGITS\n )}\" y=\"${toFixed(\n top,\n config.NUM_FRACTION_DIGITS\n )}\" ${dySpan}${fillStyles}>${escapeXml(char)}</tspan>`;\n }\n\n private _setSVGTextLineText(\n this: TextSVGExportMixin & FabricText,\n textSpans: string[],\n lineIndex: number,\n textLeftOffset: number,\n textTopOffset: number\n ) {\n const lineHeight = this.getHeightOfLine(lineIndex),\n isJustify = this.textAlign.includes(JUSTIFY),\n line = this._textLines[lineIndex];\n let actualStyle,\n nextStyle,\n charsToRender = '',\n charBox,\n style,\n boxWidth = 0,\n timeToRender;\n\n textTopOffset +=\n (lineHeight * (1 - this._fontSizeFraction)) / this.lineHeight;\n for (let i = 0, len = line.length - 1; i <= len; i++) {\n timeToRender = i === len || this.charSpacing;\n charsToRender += line[i];\n charBox = this.__charBounds[lineIndex][i];\n if (boxWidth === 0) {\n textLeftOffset += charBox.kernedWidth - charBox.width;\n boxWidth += charBox.width;\n } else {\n boxWidth += charBox.kernedWidth;\n }\n if (isJustify && !timeToRender) {\n if (this._reSpaceAndTab.test(line[i])) {\n timeToRender = true;\n }\n }\n if (!timeToRender) {\n // if we have charSpacing, we render char by char\n actualStyle =\n actualStyle || this.getCompleteStyleDeclaration(lineIndex, i);\n nextStyle = this.getCompleteStyleDeclaration(lineIndex, i + 1);\n timeToRender = hasStyleChanged(actualStyle, nextStyle, true);\n }\n if (timeToRender) {\n style = this._getStyleDeclaration(lineIndex, i);\n textSpans.push(\n this._createTextCharSpan(\n charsToRender,\n style,\n textLeftOffset,\n textTopOffset\n )\n );\n charsToRender = '';\n actualStyle = nextStyle;\n if (this.direction === 'rtl') {\n textLeftOffset -= boxWidth;\n } else {\n textLeftOffset += boxWidth;\n }\n boxWidth = 0;\n }\n }\n }\n\n private _setSVGTextLineBg(\n this: TextSVGExportMixin & FabricText,\n textBgRects: (string | number)[],\n i: number,\n leftOffset: number,\n textTopOffset: number\n ) {\n const line = this._textLines[i],\n heightOfLine = this.getHeightOfLine(i) / this.lineHeight;\n let boxWidth = 0,\n boxStart = 0,\n currentColor,\n lastColor = this.getValueOfPropertyAt(i, 0, 'textBackgroundColor');\n for (let j = 0; j < line.length; j++) {\n const { left, width, kernedWidth } = this.__charBounds[i][j];\n currentColor = this.getValueOfPropertyAt(i, j, 'textBackgroundColor');\n if (currentColor !== lastColor) {\n lastColor &&\n textBgRects.push(\n ...createSVGInlineRect(\n lastColor,\n leftOffset + boxStart,\n textTopOffset,\n boxWidth,\n heightOfLine\n )\n );\n boxStart = left;\n boxWidth = width;\n lastColor = currentColor;\n } else {\n boxWidth += kernedWidth;\n }\n }\n currentColor &&\n textBgRects.push(\n ...createSVGInlineRect(\n lastColor,\n leftOffset + boxStart,\n textTopOffset,\n boxWidth,\n heightOfLine\n )\n );\n }\n\n /**\n * @deprecated unused\n */\n _getSVGLineTopOffset(\n this: TextSVGExportMixin & FabricText,\n lineIndex: number\n ) {\n let lineTopOffset = 0,\n j;\n for (j = 0; j < lineIndex; j++) {\n lineTopOffset += this.getHeightOfLine(j);\n }\n const lastHeight = this.getHeightOfLine(j);\n return {\n lineTop: lineTopOffset,\n offset:\n ((this._fontSizeMult - this._fontSizeFraction) * lastHeight) /\n (this.lineHeight * this._fontSizeMult),\n };\n }\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(this: TextSVGExportMixin & FabricText, skipShadow?: boolean) {\n // cant use ts-expect-error because of ts 5.3 cross check\n // @ts-ignore TS doesn't respect this type casting\n return `${super.getSvgStyles(skipShadow)} white-space: pre;`;\n }\n\n /**\n * Returns styles-string for svg-export\n * @param {Object} style the object from which to retrieve style properties\n * @param {Boolean} useWhiteSpace a boolean to include an additional attribute in the style.\n * @return {String}\n */\n getSvgSpanStyles(\n this: TextSVGExportMixin & FabricText,\n style: TextStyleDeclaration,\n useWhiteSpace?: boolean\n ) {\n const {\n fontFamily,\n strokeWidth,\n stroke,\n fill,\n fontSize,\n fontStyle,\n fontWeight,\n deltaY,\n } = style;\n\n const textDecoration = this.getSvgTextDecoration(style);\n\n return [\n stroke ? colorPropToSVG('stroke', stroke) : '',\n strokeWidth ? `stroke-width: ${strokeWidth}; ` : '',\n fontFamily\n ? `font-family: ${\n !fontFamily.includes(\"'\") && !fontFamily.includes('\"')\n ? `'${fontFamily}'`\n : fontFamily\n }; `\n : '',\n fontSize ? `font-size: ${fontSize}px; ` : '',\n fontStyle ? `font-style: ${fontStyle}; ` : '',\n fontWeight ? `font-weight: ${fontWeight}; ` : '',\n textDecoration ? `text-decoration: ${textDecoration}; ` : textDecoration,\n fill ? colorPropToSVG('fill', fill) : '',\n deltaY ? `baseline-shift: ${-deltaY}; ` : '',\n useWhiteSpace ? 'white-space: pre; ' : '',\n ].join('');\n }\n\n /**\n * Returns text-decoration property for svg-export\n * @param {Object} style the object from which to retrieve style properties\n * @return {String}\n */\n getSvgTextDecoration(\n this: TextSVGExportMixin & FabricText,\n style: TextStyleDeclaration\n ) {\n return (['overline', 'underline', 'line-through'] as const)\n .filter(\n (decoration) =>\n style[\n decoration.replace('-', '') as\n | 'overline'\n | 'underline'\n | 'linethrough'\n ]\n )\n .join(' ');\n }\n}\n"],"names":["multipleSpacesRegex","dblQuoteRegex","createSVGInlineRect","color","left","top","width","height","concat","createSVGRect","TextSVGExportMixin","FabricObjectSVGExportMixin","_toSVG","offsets","this","_getSVGLeftTopOffsets","textAndBg","_getSVGTextAndBg","textTop","textLeft","_wrapSVGTextAndBg","toSVG","reviver","_createBaseSVGMarkup","noStyle","withShadow","lineTop","getHeightOfLine","_ref","textBgRects","textSpans","textDecoration","getSvgTextDecoration","join","fontFamily","replace","fontSize","fontStyle","fontWeight","direction","getSvgStyles","addPaintOrder","textTopOffset","textLeftOffset","lineOffset","backgroundColor","push","i","len","_textLines","length","_getLineLeftOffset","textBackgroundColor","styleHas","_setSVGTextLineBg","_setSVGTextLineText","_createTextCharSpan","char","styleDecl","styleProps","getSvgSpanStyles","trim","match","fillStyles","dy","deltaY","dySpan","toFixed","config","NUM_FRACTION_DIGITS","escapeXml","lineIndex","lineHeight","isJustify","textAlign","includes","JUSTIFY","line","actualStyle","nextStyle","charBox","style","timeToRender","charsToRender","boxWidth","_fontSizeFraction","charSpacing","__charBounds","kernedWidth","_reSpaceAndTab","test","getCompleteStyleDeclaration","hasStyleChanged","_getStyleDeclaration","leftOffset","heightOfLine","currentColor","boxStart","lastColor","getValueOfPropertyAt","j","_getSVGLineTopOffset","lineTopOffset","lastHeight","offset","_fontSizeMult","skipShadow","super","useWhiteSpace","strokeWidth","stroke","fill","colorPropToSVG","filter","decoration"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TextSVGExportMixin.min.mjs","sources":["../../../../src/shapes/Text/TextSVGExportMixin.ts"],"sourcesContent":["import { config } from '../../config';\nimport type { TSVGReviver } from '../../typedefs';\nimport { escapeXml } from '../../util/lang_string';\nimport { colorPropToSVG, createSVGRect } from '../../util/misc/svgParsing';\nimport { hasStyleChanged } from '../../util/misc/textStyles';\nimport { toFixed } from '../../util/misc/toFixed';\nimport { FabricObjectSVGExportMixin } from '../Object/FabricObjectSVGExportMixin';\nimport { type TextStyleDeclaration } from './StyledText';\nimport { JUSTIFY } from '../Text/constants';\nimport type { FabricText } from './Text';\n\nconst multipleSpacesRegex = / +/g;\nconst dblQuoteRegex = /\"/g;\n\nfunction createSVGInlineRect(\n color: string,\n left: number,\n top: number,\n width: number,\n height: number\n) {\n return `\\t\\t${createSVGRect(color, { left, top, width, height })}\\n`;\n}\n\nexport class TextSVGExportMixin extends FabricObjectSVGExportMixin {\n _toSVG(this: TextSVGExportMixin & FabricText): string[] {\n const offsets = this._getSVGLeftTopOffsets(),\n textAndBg = this._getSVGTextAndBg(offsets.textTop, offsets.textLeft);\n return this._wrapSVGTextAndBg(textAndBg);\n }\n\n toSVG(this: TextSVGExportMixin & FabricText, reviver?: TSVGReviver): string {\n return this._createBaseSVGMarkup(this._toSVG(), {\n reviver,\n noStyle: true,\n withShadow: true,\n });\n }\n\n private _getSVGLeftTopOffsets(this: TextSVGExportMixin & FabricText) {\n return {\n textLeft: -this.width / 2,\n textTop: -this.height / 2,\n lineTop: this.getHeightOfLine(0),\n };\n }\n\n private _wrapSVGTextAndBg(\n this: TextSVGExportMixin & FabricText,\n {\n textBgRects,\n textSpans,\n }: {\n textSpans: string[];\n textBgRects: string[];\n }\n ) {\n const noShadow = true,\n textDecoration = this.getSvgTextDecoration(this);\n return [\n textBgRects.join(''),\n '\\t\\t<text xml:space=\"preserve\" ',\n this.fontFamily\n ? `font-family=\"${this.fontFamily.replace(dblQuoteRegex, \"'\")}\" `\n : '',\n this.fontSize ? `font-size=\"${this.fontSize}\" ` : '',\n this.fontStyle ? `font-style=\"${this.fontStyle}\" ` : '',\n this.fontWeight ? `font-weight=\"${this.fontWeight}\" ` : '',\n textDecoration ? `text-decoration=\"${textDecoration}\" ` : '',\n this.direction === 'rtl' ? `direction=\"${this.direction}\" ` : '',\n 'style=\"',\n this.getSvgStyles(noShadow),\n '\"',\n this.addPaintOrder(),\n ' >',\n textSpans.join(''),\n '</text>\\n',\n ];\n }\n\n /**\n * @private\n * @param {Number} textTopOffset Text top offset\n * @param {Number} textLeftOffset Text left offset\n * @return {Object}\n */\n private _getSVGTextAndBg(\n this: TextSVGExportMixin & FabricText,\n textTopOffset: number,\n textLeftOffset: number\n ) {\n const textSpans: string[] = [],\n textBgRects: string[] = [];\n let height = textTopOffset,\n lineOffset;\n\n // bounding-box background\n this.backgroundColor &&\n textBgRects.push(\n ...createSVGInlineRect(\n this.backgroundColor,\n -this.width / 2,\n -this.height / 2,\n this.width,\n this.height\n )\n );\n\n // text and text-background\n for (let i = 0, len = this._textLines.length; i < len; i++) {\n lineOffset = this._getLineLeftOffset(i);\n if (this.direction === 'rtl') {\n lineOffset += this.width;\n }\n if (this.textBackgroundColor || this.styleHas('textBackgroundColor', i)) {\n this._setSVGTextLineBg(\n textBgRects,\n i,\n textLeftOffset + lineOffset,\n height\n );\n }\n this._setSVGTextLineText(\n textSpans,\n i,\n textLeftOffset + lineOffset,\n height\n );\n height += this.getHeightOfLine(i);\n }\n\n return {\n textSpans,\n textBgRects,\n };\n }\n\n private _createTextCharSpan(\n this: TextSVGExportMixin & FabricText,\n char: string,\n styleDecl: TextStyleDeclaration,\n left: number,\n top: number\n ) {\n const styleProps = this.getSvgSpanStyles(\n styleDecl,\n char !== char.trim() || !!char.match(multipleSpacesRegex)\n ),\n fillStyles = styleProps ? `style=\"${styleProps}\"` : '',\n dy = styleDecl.deltaY,\n dySpan = dy ? ` dy=\"${toFixed(dy, config.NUM_FRACTION_DIGITS)}\" ` : '';\n\n return `<tspan x=\"${toFixed(\n left,\n config.NUM_FRACTION_DIGITS\n )}\" y=\"${toFixed(\n top,\n config.NUM_FRACTION_DIGITS\n )}\" ${dySpan}${fillStyles}>${escapeXml(char)}</tspan>`;\n }\n\n private _setSVGTextLineText(\n this: TextSVGExportMixin & FabricText,\n textSpans: string[],\n lineIndex: number,\n textLeftOffset: number,\n textTopOffset: number\n ) {\n const lineHeight = this.getHeightOfLine(lineIndex),\n isJustify = this.textAlign.includes(JUSTIFY),\n line = this._textLines[lineIndex];\n let actualStyle,\n nextStyle,\n charsToRender = '',\n charBox,\n style,\n boxWidth = 0,\n timeToRender;\n\n textTopOffset +=\n (lineHeight * (1 - this._fontSizeFraction)) / this.lineHeight;\n for (let i = 0, len = line.length - 1; i <= len; i++) {\n timeToRender = i === len || this.charSpacing;\n charsToRender += line[i];\n charBox = this.__charBounds[lineIndex][i];\n if (boxWidth === 0) {\n textLeftOffset += charBox.kernedWidth - charBox.width;\n boxWidth += charBox.width;\n } else {\n boxWidth += charBox.kernedWidth;\n }\n if (isJustify && !timeToRender) {\n if (this._reSpaceAndTab.test(line[i])) {\n timeToRender = true;\n }\n }\n if (!timeToRender) {\n // if we have charSpacing, we render char by char\n actualStyle =\n actualStyle || this.getCompleteStyleDeclaration(lineIndex, i);\n nextStyle = this.getCompleteStyleDeclaration(lineIndex, i + 1);\n timeToRender = hasStyleChanged(actualStyle, nextStyle, true);\n }\n if (timeToRender) {\n style = this._getStyleDeclaration(lineIndex, i);\n textSpans.push(\n this._createTextCharSpan(\n charsToRender,\n style,\n textLeftOffset,\n textTopOffset\n )\n );\n charsToRender = '';\n actualStyle = nextStyle;\n if (this.direction === 'rtl') {\n textLeftOffset -= boxWidth;\n } else {\n textLeftOffset += boxWidth;\n }\n boxWidth = 0;\n }\n }\n }\n\n private _setSVGTextLineBg(\n this: TextSVGExportMixin & FabricText,\n textBgRects: (string | number)[],\n i: number,\n leftOffset: number,\n textTopOffset: number\n ) {\n const line = this._textLines[i],\n heightOfLine = this.getHeightOfLine(i) / this.lineHeight;\n let boxWidth = 0,\n boxStart = 0,\n currentColor,\n lastColor = this.getValueOfPropertyAt(i, 0, 'textBackgroundColor');\n for (let j = 0; j < line.length; j++) {\n const { left, width, kernedWidth } = this.__charBounds[i][j];\n currentColor = this.getValueOfPropertyAt(i, j, 'textBackgroundColor');\n if (currentColor !== lastColor) {\n lastColor &&\n textBgRects.push(\n ...createSVGInlineRect(\n lastColor,\n leftOffset + boxStart,\n textTopOffset,\n boxWidth,\n heightOfLine\n )\n );\n boxStart = left;\n boxWidth = width;\n lastColor = currentColor;\n } else {\n boxWidth += kernedWidth;\n }\n }\n currentColor &&\n textBgRects.push(\n ...createSVGInlineRect(\n lastColor,\n leftOffset + boxStart,\n textTopOffset,\n boxWidth,\n heightOfLine\n )\n );\n }\n\n /**\n * @deprecated unused\n */\n _getSVGLineTopOffset(\n this: TextSVGExportMixin & FabricText,\n lineIndex: number\n ) {\n let lineTopOffset = 0,\n j;\n for (j = 0; j < lineIndex; j++) {\n lineTopOffset += this.getHeightOfLine(j);\n }\n const lastHeight = this.getHeightOfLine(j);\n return {\n lineTop: lineTopOffset,\n offset:\n ((this._fontSizeMult - this._fontSizeFraction) * lastHeight) /\n (this.lineHeight * this._fontSizeMult),\n };\n }\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(this: TextSVGExportMixin & FabricText, skipShadow?: boolean) {\n // cant use ts-expect-error because of ts 5.3 cross check\n // @ts-ignore TS doesn't respect this type casting\n return `${super.getSvgStyles(skipShadow)} white-space: pre;`;\n }\n\n /**\n * Returns styles-string for svg-export\n * @param {Object} style the object from which to retrieve style properties\n * @param {Boolean} useWhiteSpace a boolean to include an additional attribute in the style.\n * @return {String}\n */\n getSvgSpanStyles(\n this: TextSVGExportMixin & FabricText,\n style: TextStyleDeclaration,\n useWhiteSpace?: boolean\n ) {\n const {\n fontFamily,\n strokeWidth,\n stroke,\n fill,\n fontSize,\n fontStyle,\n fontWeight,\n deltaY,\n } = style;\n\n const textDecoration = this.getSvgTextDecoration(style);\n\n return [\n stroke ? colorPropToSVG('stroke', stroke) : '',\n strokeWidth ? `stroke-width: ${strokeWidth}; ` : '',\n fontFamily\n ? `font-family: ${\n !fontFamily.includes(\"'\") && !fontFamily.includes('\"')\n ? `'${fontFamily}'`\n : fontFamily\n }; `\n : '',\n fontSize ? `font-size: ${fontSize}px; ` : '',\n fontStyle ? `font-style: ${fontStyle}; ` : '',\n fontWeight ? `font-weight: ${fontWeight}; ` : '',\n textDecoration ? `text-decoration: ${textDecoration}; ` : textDecoration,\n fill ? colorPropToSVG('fill', fill) : '',\n deltaY ? `baseline-shift: ${-deltaY}; ` : '',\n useWhiteSpace ? 'white-space: pre; ' : '',\n ].join('');\n }\n\n /**\n * Returns text-decoration property for svg-export\n * @param {Object} style the object from which to retrieve style properties\n * @return {String}\n */\n getSvgTextDecoration(\n this: TextSVGExportMixin & FabricText,\n style: TextStyleDeclaration\n ) {\n return (['overline', 'underline', 'line-through'] as const)\n .filter(\n (decoration) =>\n style[\n decoration.replace('-', '') as\n | 'overline'\n | 'underline'\n | 'linethrough'\n ]\n )\n .join(' ');\n }\n}\n"],"names":["multipleSpacesRegex","dblQuoteRegex","createSVGInlineRect","color","left","top","width","height","concat","createSVGRect","TextSVGExportMixin","FabricObjectSVGExportMixin","_toSVG","offsets","this","_getSVGLeftTopOffsets","textAndBg","_getSVGTextAndBg","textTop","textLeft","_wrapSVGTextAndBg","toSVG","reviver","_createBaseSVGMarkup","noStyle","withShadow","lineTop","getHeightOfLine","_ref","textBgRects","textSpans","textDecoration","getSvgTextDecoration","join","fontFamily","replace","fontSize","fontStyle","fontWeight","direction","getSvgStyles","addPaintOrder","textTopOffset","textLeftOffset","lineOffset","backgroundColor","push","i","len","_textLines","length","_getLineLeftOffset","textBackgroundColor","styleHas","_setSVGTextLineBg","_setSVGTextLineText","_createTextCharSpan","char","styleDecl","styleProps","getSvgSpanStyles","trim","match","fillStyles","dy","deltaY","dySpan","toFixed","config","NUM_FRACTION_DIGITS","escapeXml","lineIndex","lineHeight","isJustify","textAlign","includes","JUSTIFY","line","actualStyle","nextStyle","charBox","style","timeToRender","charsToRender","boxWidth","_fontSizeFraction","charSpacing","__charBounds","kernedWidth","_reSpaceAndTab","test","getCompleteStyleDeclaration","hasStyleChanged","_getStyleDeclaration","leftOffset","heightOfLine","currentColor","boxStart","lastColor","getValueOfPropertyAt","j","_getSVGLineTopOffset","lineTopOffset","lastHeight","offset","_fontSizeMult","skipShadow","super","useWhiteSpace","strokeWidth","stroke","fill","colorPropToSVG","filter","decoration"],"mappings":"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"}
|