@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":"TextSVGExportMixin.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","_getSVGLeftTopOffsets","textAndBg","_getSVGTextAndBg","textTop","textLeft","_wrapSVGTextAndBg","toSVG","reviver","_createBaseSVGMarkup","noStyle","withShadow","lineTop","getHeightOfLine","_ref","textBgRects","textSpans","noShadow","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","charsToRender","charBox","style","boxWidth","timeToRender","_fontSizeFraction","charSpacing","__charBounds","kernedWidth","_reSpaceAndTab","test","getCompleteStyleDeclaration","hasStyleChanged","_getStyleDeclaration","leftOffset","heightOfLine","boxStart","currentColor","lastColor","getValueOfPropertyAt","j","_getSVGLineTopOffset","lineTopOffset","lastHeight","offset","_fontSizeMult","skipShadow","useWhiteSpace","strokeWidth","stroke","fill","colorPropToSVG","filter","decoration"],"mappings":";;;;;;;;AAWA,MAAMA,mBAAmB,GAAG,MAAM,CAAA;AAClC,MAAMC,aAAa,GAAG,IAAI,CAAA;AAE1B,SAASC,mBAAmBA,CAC1BC,KAAa,EACbC,IAAY,EACZC,GAAW,EACXC,KAAa,EACbC,MAAc,EACd;AACA,EAAA,OAAA,MAAA,CAAAC,MAAA,CAAcC,aAAa,CAACN,KAAK,EAAE;IAAEC,IAAI;IAAEC,GAAG;IAAEC,KAAK;AAAEC,IAAAA,MAAAA;AAAO,GAAC,CAAC,EAAA,IAAA,CAAA,CAAA;AAClE,CAAA;AAEO,MAAMG,kBAAkB,SAASC,0BAA0B,CAAC;AACjEC,EAAAA,MAAMA,GAAkD;AACtD,IAAA,MAAMC,OAAO,GAAG,IAAI,CAACC,qBAAqB,EAAE;AAC1CC,MAAAA,SAAS,GAAG,IAAI,CAACC,gBAAgB,CAACH,OAAO,CAACI,OAAO,EAAEJ,OAAO,CAACK,QAAQ,CAAC,CAAA;AACtE,IAAA,OAAO,IAAI,CAACC,iBAAiB,CAACJ,SAAS,CAAC,CAAA;AAC1C,GAAA;EAEAK,KAAKA,CAAwCC,OAAoB,EAAU;IACzE,OAAO,IAAI,CAACC,oBAAoB,CAAC,IAAI,CAACV,MAAM,EAAE,EAAE;MAC9CS,OAAO;AACPE,MAAAA,OAAO,EAAE,IAAI;AACbC,MAAAA,UAAU,EAAE,IAAA;AACd,KAAC,CAAC,CAAA;AACJ,GAAA;AAEQV,EAAAA,qBAAqBA,GAAwC;IACnE,OAAO;AACLI,MAAAA,QAAQ,EAAE,CAAC,IAAI,CAACZ,KAAK,GAAG,CAAC;AACzBW,MAAAA,OAAO,EAAE,CAAC,IAAI,CAACV,MAAM,GAAG,CAAC;AACzBkB,MAAAA,OAAO,EAAE,IAAI,CAACC,eAAe,CAAC,CAAC,CAAA;KAChC,CAAA;AACH,GAAA;EAEQP,iBAAiBA,CAAAQ,IAAA,EASvB;IAAA,IAPA;MACEC,WAAW;AACXC,MAAAA,SAAAA;AAIF,KAAC,GAAAF,IAAA,CAAA;IAED,MAAMG,QAAQ,GAAG,IAAI;AACnBC,MAAAA,cAAc,GAAG,IAAI,CAACC,oBAAoB,CAAC,IAAI,CAAC,CAAA;IAClD,OAAO,CACLJ,WAAW,CAACK,IAAI,CAAC,EAAE,CAAC,EACpB,iCAAiC,EACjC,IAAI,CAACC,UAAU,GAAA1B,gBAAAA,CAAAA,MAAA,CACK,IAAI,CAAC0B,UAAU,CAACC,OAAO,CAAClC,aAAa,EAAE,GAAG,CAAC,EAAA,KAAA,CAAA,GAC3D,EAAE,EACN,IAAI,CAACmC,QAAQ,GAAA5B,cAAAA,CAAAA,MAAA,CAAiB,IAAI,CAAC4B,QAAQ,EAAO,KAAA,CAAA,GAAA,EAAE,EACpD,IAAI,CAACC,SAAS,GAAA,eAAA,CAAA7B,MAAA,CAAkB,IAAI,CAAC6B,SAAS,EAAA,KAAA,CAAA,GAAO,EAAE,EACvD,IAAI,CAACC,UAAU,GAAA,gBAAA,CAAA9B,MAAA,CAAmB,IAAI,CAAC8B,UAAU,EAAO,KAAA,CAAA,GAAA,EAAE,EAC1DP,cAAc,GAAA,oBAAA,CAAAvB,MAAA,CAAuBuB,cAAc,EAAA,KAAA,CAAA,GAAO,EAAE,EAC5D,IAAI,CAACQ,SAAS,KAAK,KAAK,GAAA/B,cAAAA,CAAAA,MAAA,CAAiB,IAAI,CAAC+B,SAAS,EAAO,KAAA,CAAA,GAAA,EAAE,EAChE,SAAS,EACT,IAAI,CAACC,YAAY,CAACV,QAAQ,CAAC,EAC3B,GAAG,EACH,IAAI,CAACW,aAAa,EAAE,EACpB,IAAI,EACJZ,SAAS,CAACI,IAAI,CAAC,EAAE,CAAC,EAClB,WAAW,CACZ,CAAA;AACH,GAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACUjB,EAAAA,gBAAgBA,CAEtB0B,aAAqB,EACrBC,cAAsB,EACtB;IACA,MAAMd,SAAmB,GAAG,EAAE;AAC5BD,MAAAA,WAAqB,GAAG,EAAE,CAAA;IAC5B,IAAIrB,MAAM,GAAGmC,aAAa;MACxBE,UAAU,CAAA;;AAEZ;AACA,IAAA,IAAI,CAACC,eAAe,IAClBjB,WAAW,CAACkB,IAAI,CACd,GAAG5C,mBAAmB,CACpB,IAAI,CAAC2C,eAAe,EACpB,CAAC,IAAI,CAACvC,KAAK,GAAG,CAAC,EACf,CAAC,IAAI,CAACC,MAAM,GAAG,CAAC,EAChB,IAAI,CAACD,KAAK,EACV,IAAI,CAACC,MACP,CACF,CAAC,CAAA;;AAEH;AACA,IAAA,KAAK,IAAIwC,CAAC,GAAG,CAAC,EAAEC,GAAG,GAAG,IAAI,CAACC,UAAU,CAACC,MAAM,EAAEH,CAAC,GAAGC,GAAG,EAAED,CAAC,EAAE,EAAE;AAC1DH,MAAAA,UAAU,GAAG,IAAI,CAACO,kBAAkB,CAACJ,CAAC,CAAC,CAAA;AACvC,MAAA,IAAI,IAAI,CAACR,SAAS,KAAK,KAAK,EAAE;QAC5BK,UAAU,IAAI,IAAI,CAACtC,KAAK,CAAA;AAC1B,OAAA;AACA,MAAA,IAAI,IAAI,CAAC8C,mBAAmB,IAAI,IAAI,CAACC,QAAQ,CAAC,qBAAqB,EAAEN,CAAC,CAAC,EAAE;AACvE,QAAA,IAAI,CAACO,iBAAiB,CACpB1B,WAAW,EACXmB,CAAC,EACDJ,cAAc,GAAGC,UAAU,EAC3BrC,MACF,CAAC,CAAA;AACH,OAAA;AACA,MAAA,IAAI,CAACgD,mBAAmB,CACtB1B,SAAS,EACTkB,CAAC,EACDJ,cAAc,GAAGC,UAAU,EAC3BrC,MACF,CAAC,CAAA;AACDA,MAAAA,MAAM,IAAI,IAAI,CAACmB,eAAe,CAACqB,CAAC,CAAC,CAAA;AACnC,KAAA;IAEA,OAAO;MACLlB,SAAS;AACTD,MAAAA,WAAAA;KACD,CAAA;AACH,GAAA;EAEQ4B,mBAAmBA,CAEzBC,IAAY,EACZC,SAA+B,EAC/BtD,IAAY,EACZC,GAAW,EACX;IACA,MAAMsD,UAAU,GAAG,IAAI,CAACC,gBAAgB,CACpCF,SAAS,EACTD,IAAI,KAAKA,IAAI,CAACI,IAAI,EAAE,IAAI,CAAC,CAACJ,IAAI,CAACK,KAAK,CAAC9D,mBAAmB,CAC1D,CAAC;AACD+D,MAAAA,UAAU,GAAGJ,UAAU,GAAA,UAAA,CAAAnD,MAAA,CAAamD,UAAU,UAAM,EAAE;MACtDK,EAAE,GAAGN,SAAS,CAACO,MAAM;AACrBC,MAAAA,MAAM,GAAGF,EAAE,GAAAxD,QAAAA,CAAAA,MAAA,CAAW2D,OAAO,CAACH,EAAE,EAAEI,MAAM,CAACC,mBAAmB,CAAC,WAAO,EAAE,CAAA;AAExE,IAAA,OAAA,aAAA,CAAA7D,MAAA,CAAoB2D,OAAO,CACzB/D,IAAI,EACJgE,MAAM,CAACC,mBACT,CAAC,EAAA7D,SAAAA,CAAAA,CAAAA,MAAA,CAAQ2D,OAAO,CACd9D,GAAG,EACH+D,MAAM,CAACC,mBACT,CAAC,EAAA,KAAA,CAAA,CAAA7D,MAAA,CAAK0D,MAAM,CAAA1D,CAAAA,MAAA,CAAGuD,UAAU,OAAAvD,MAAA,CAAI8D,SAAS,CAACb,IAAI,CAAC,EAAA,UAAA,CAAA,CAAA;AAC9C,GAAA;EAEQF,mBAAmBA,CAEzB1B,SAAmB,EACnB0C,SAAiB,EACjB5B,cAAsB,EACtBD,aAAqB,EACrB;AACA,IAAA,MAAM8B,UAAU,GAAG,IAAI,CAAC9C,eAAe,CAAC6C,SAAS,CAAC;MAChDE,SAAS,GAAG,IAAI,CAACC,SAAS,CAACC,QAAQ,CAACC,OAAO,CAAC;AAC5CC,MAAAA,IAAI,GAAG,IAAI,CAAC5B,UAAU,CAACsB,SAAS,CAAC,CAAA;AACnC,IAAA,IAAIO,WAAW;MACbC,SAAS;AACTC,MAAAA,aAAa,GAAG,EAAE;MAClBC,OAAO;MACPC,KAAK;AACLC,MAAAA,QAAQ,GAAG,CAAC;MACZC,YAAY,CAAA;AAEd1C,IAAAA,aAAa,IACV8B,UAAU,IAAI,CAAC,GAAG,IAAI,CAACa,iBAAiB,CAAC,GAAI,IAAI,CAACb,UAAU,CAAA;AAC/D,IAAA,KAAK,IAAIzB,CAAC,GAAG,CAAC,EAAEC,GAAG,GAAG6B,IAAI,CAAC3B,MAAM,GAAG,CAAC,EAAEH,CAAC,IAAIC,GAAG,EAAED,CAAC,EAAE,EAAE;AACpDqC,MAAAA,YAAY,GAAGrC,CAAC,KAAKC,GAAG,IAAI,IAAI,CAACsC,WAAW,CAAA;AAC5CN,MAAAA,aAAa,IAAIH,IAAI,CAAC9B,CAAC,CAAC,CAAA;MACxBkC,OAAO,GAAG,IAAI,CAACM,YAAY,CAAChB,SAAS,CAAC,CAACxB,CAAC,CAAC,CAAA;MACzC,IAAIoC,QAAQ,KAAK,CAAC,EAAE;AAClBxC,QAAAA,cAAc,IAAIsC,OAAO,CAACO,WAAW,GAAGP,OAAO,CAAC3E,KAAK,CAAA;QACrD6E,QAAQ,IAAIF,OAAO,CAAC3E,KAAK,CAAA;AAC3B,OAAC,MAAM;QACL6E,QAAQ,IAAIF,OAAO,CAACO,WAAW,CAAA;AACjC,OAAA;AACA,MAAA,IAAIf,SAAS,IAAI,CAACW,YAAY,EAAE;QAC9B,IAAI,IAAI,CAACK,cAAc,CAACC,IAAI,CAACb,IAAI,CAAC9B,CAAC,CAAC,CAAC,EAAE;AACrCqC,UAAAA,YAAY,GAAG,IAAI,CAAA;AACrB,SAAA;AACF,OAAA;MACA,IAAI,CAACA,YAAY,EAAE;AACjB;QACAN,WAAW,GACTA,WAAW,IAAI,IAAI,CAACa,2BAA2B,CAACpB,SAAS,EAAExB,CAAC,CAAC,CAAA;QAC/DgC,SAAS,GAAG,IAAI,CAACY,2BAA2B,CAACpB,SAAS,EAAExB,CAAC,GAAG,CAAC,CAAC,CAAA;QAC9DqC,YAAY,GAAGQ,eAAe,CAACd,WAAW,EAAEC,SAAS,EAAE,IAAI,CAAC,CAAA;AAC9D,OAAA;AACA,MAAA,IAAIK,YAAY,EAAE;QAChBF,KAAK,GAAG,IAAI,CAACW,oBAAoB,CAACtB,SAAS,EAAExB,CAAC,CAAC,CAAA;AAC/ClB,QAAAA,SAAS,CAACiB,IAAI,CACZ,IAAI,CAACU,mBAAmB,CACtBwB,aAAa,EACbE,KAAK,EACLvC,cAAc,EACdD,aACF,CACF,CAAC,CAAA;AACDsC,QAAAA,aAAa,GAAG,EAAE,CAAA;AAClBF,QAAAA,WAAW,GAAGC,SAAS,CAAA;AACvB,QAAA,IAAI,IAAI,CAACxC,SAAS,KAAK,KAAK,EAAE;AAC5BI,UAAAA,cAAc,IAAIwC,QAAQ,CAAA;AAC5B,SAAC,MAAM;AACLxC,UAAAA,cAAc,IAAIwC,QAAQ,CAAA;AAC5B,SAAA;AACAA,QAAAA,QAAQ,GAAG,CAAC,CAAA;AACd,OAAA;AACF,KAAA;AACF,GAAA;EAEQ7B,iBAAiBA,CAEvB1B,WAAgC,EAChCmB,CAAS,EACT+C,UAAkB,EAClBpD,aAAqB,EACrB;AACA,IAAA,MAAMmC,IAAI,GAAG,IAAI,CAAC5B,UAAU,CAACF,CAAC,CAAC;MAC7BgD,YAAY,GAAG,IAAI,CAACrE,eAAe,CAACqB,CAAC,CAAC,GAAG,IAAI,CAACyB,UAAU,CAAA;IAC1D,IAAIW,QAAQ,GAAG,CAAC;AACda,MAAAA,QAAQ,GAAG,CAAC;MACZC,YAAY;MACZC,SAAS,GAAG,IAAI,CAACC,oBAAoB,CAACpD,CAAC,EAAE,CAAC,EAAE,qBAAqB,CAAC,CAAA;AACpE,IAAA,KAAK,IAAIqD,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGvB,IAAI,CAAC3B,MAAM,EAAEkD,CAAC,EAAE,EAAE;MACpC,MAAM;QAAEhG,IAAI;QAAEE,KAAK;AAAEkF,QAAAA,WAAAA;OAAa,GAAG,IAAI,CAACD,YAAY,CAACxC,CAAC,CAAC,CAACqD,CAAC,CAAC,CAAA;MAC5DH,YAAY,GAAG,IAAI,CAACE,oBAAoB,CAACpD,CAAC,EAAEqD,CAAC,EAAE,qBAAqB,CAAC,CAAA;MACrE,IAAIH,YAAY,KAAKC,SAAS,EAAE;QAC9BA,SAAS,IACPtE,WAAW,CAACkB,IAAI,CACd,GAAG5C,mBAAmB,CACpBgG,SAAS,EACTJ,UAAU,GAAGE,QAAQ,EACrBtD,aAAa,EACbyC,QAAQ,EACRY,YACF,CACF,CAAC,CAAA;AACHC,QAAAA,QAAQ,GAAG5F,IAAI,CAAA;AACf+E,QAAAA,QAAQ,GAAG7E,KAAK,CAAA;AAChB4F,QAAAA,SAAS,GAAGD,YAAY,CAAA;AAC1B,OAAC,MAAM;AACLd,QAAAA,QAAQ,IAAIK,WAAW,CAAA;AACzB,OAAA;AACF,KAAA;IACAS,YAAY,IACVrE,WAAW,CAACkB,IAAI,CACd,GAAG5C,mBAAmB,CACpBgG,SAAS,EACTJ,UAAU,GAAGE,QAAQ,EACrBtD,aAAa,EACbyC,QAAQ,EACRY,YACF,CACF,CAAC,CAAA;AACL,GAAA;;AAEA;AACF;AACA;EACEM,oBAAoBA,CAElB9B,SAAiB,EACjB;IACA,IAAI+B,aAAa,GAAG,CAAC;MACnBF,CAAC,CAAA;IACH,KAAKA,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG7B,SAAS,EAAE6B,CAAC,EAAE,EAAE;AAC9BE,MAAAA,aAAa,IAAI,IAAI,CAAC5E,eAAe,CAAC0E,CAAC,CAAC,CAAA;AAC1C,KAAA;AACA,IAAA,MAAMG,UAAU,GAAG,IAAI,CAAC7E,eAAe,CAAC0E,CAAC,CAAC,CAAA;IAC1C,OAAO;AACL3E,MAAAA,OAAO,EAAE6E,aAAa;AACtBE,MAAAA,MAAM,EACH,CAAC,IAAI,CAACC,aAAa,GAAG,IAAI,CAACpB,iBAAiB,IAAIkB,UAAU,IAC1D,IAAI,CAAC/B,UAAU,GAAG,IAAI,CAACiC,aAAa,CAAA;KACxC,CAAA;AACH,GAAA;;AAEA;AACF;AACA;AACA;AACA;EACEjE,YAAYA,CAAwCkE,UAAoB,EAAE;AACxE;AACA;AACA,IAAA,OAAA,EAAA,CAAAlG,MAAA,CAAU,KAAK,CAACgC,YAAY,CAACkE,UAAU,CAAC,EAAA,oBAAA,CAAA,CAAA;AAC1C,GAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACE9C,EAAAA,gBAAgBA,CAEdsB,KAA2B,EAC3ByB,aAAuB,EACvB;IACA,MAAM;MACJzE,UAAU;MACV0E,WAAW;MACXC,MAAM;MACNC,IAAI;MACJ1E,QAAQ;MACRC,SAAS;MACTC,UAAU;AACV2B,MAAAA,MAAAA;AACF,KAAC,GAAGiB,KAAK,CAAA;AAET,IAAA,MAAMnD,cAAc,GAAG,IAAI,CAACC,oBAAoB,CAACkD,KAAK,CAAC,CAAA;IAEvD,OAAO,CACL2B,MAAM,GAAGE,cAAc,CAAC,QAAQ,EAAEF,MAAM,CAAC,GAAG,EAAE,EAC9CD,WAAW,GAAApG,gBAAAA,CAAAA,MAAA,CAAoBoG,WAAW,EAAO,IAAA,CAAA,GAAA,EAAE,EACnD1E,UAAU,GAAA,eAAA,CAAA1B,MAAA,CAEJ,CAAC0B,UAAU,CAACyC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAACzC,UAAU,CAACyC,QAAQ,CAAC,GAAG,CAAC,GAAA,GAAA,CAAAnE,MAAA,CAC9C0B,UAAU,EACdA,GAAAA,CAAAA,GAAAA,UAAU,EAEhB,IAAA,CAAA,GAAA,EAAE,EACNE,QAAQ,GAAA5B,aAAAA,CAAAA,MAAA,CAAiB4B,QAAQ,EAAS,MAAA,CAAA,GAAA,EAAE,EAC5CC,SAAS,GAAA,cAAA,CAAA7B,MAAA,CAAkB6B,SAAS,EAAA,IAAA,CAAA,GAAO,EAAE,EAC7CC,UAAU,GAAA9B,eAAAA,CAAAA,MAAA,CAAmB8B,UAAU,UAAO,EAAE,EAChDP,cAAc,GAAA,mBAAA,CAAAvB,MAAA,CAAuBuB,cAAc,EAAOA,IAAAA,CAAAA,GAAAA,cAAc,EACxE+E,IAAI,GAAGC,cAAc,CAAC,MAAM,EAAED,IAAI,CAAC,GAAG,EAAE,EACxC7C,MAAM,GAAA,kBAAA,CAAAzD,MAAA,CAAsB,CAACyD,MAAM,UAAO,EAAE,EAC5C0C,aAAa,GAAG,oBAAoB,GAAG,EAAE,CAC1C,CAAC1E,IAAI,CAAC,EAAE,CAAC,CAAA;AACZ,GAAA;;AAEA;AACF;AACA;AACA;AACA;EACED,oBAAoBA,CAElBkD,KAA2B,EAC3B;AACA,IAAA,OAAQ,CAAC,UAAU,EAAE,WAAW,EAAE,cAAc,CAAC,CAC9C8B,MAAM,CACJC,UAAU,IACT/B,KAAK,CACH+B,UAAU,CAAC9E,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAKjC,CAAC,CACAF,IAAI,CAAC,GAAG,CAAC,CAAA;AACd,GAAA;AACF;;;;"}
|
|
1
|
+
{"version":3,"file":"TextSVGExportMixin.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","_getSVGLeftTopOffsets","textAndBg","_getSVGTextAndBg","textTop","textLeft","_wrapSVGTextAndBg","toSVG","reviver","_createBaseSVGMarkup","noStyle","withShadow","lineTop","getHeightOfLine","_ref","textBgRects","textSpans","noShadow","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","charsToRender","charBox","style","boxWidth","timeToRender","_fontSizeFraction","charSpacing","__charBounds","kernedWidth","_reSpaceAndTab","test","getCompleteStyleDeclaration","hasStyleChanged","_getStyleDeclaration","leftOffset","heightOfLine","boxStart","currentColor","lastColor","getValueOfPropertyAt","j","_getSVGLineTopOffset","lineTopOffset","lastHeight","offset","_fontSizeMult","skipShadow","useWhiteSpace","strokeWidth","stroke","fill","colorPropToSVG","filter","decoration"],"mappings":"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"}
|
|
@@ -21,7 +21,7 @@ export type EnlivenObjectOptions = Abortable & {
|
|
|
21
21
|
* Method for further parsing of object elements,
|
|
22
22
|
* called after each fabric object created.
|
|
23
23
|
*/
|
|
24
|
-
reviver?: <T extends BaseFabricObject | FabricObject | BaseFilter | Shadow | TFiller>(serializedObj: Record<string, any>, instance: T) => void;
|
|
24
|
+
reviver?: <T extends BaseFabricObject | FabricObject | BaseFilter<string> | Shadow | TFiller>(serializedObj: Record<string, any>, instance: T) => void;
|
|
25
25
|
};
|
|
26
26
|
/**
|
|
27
27
|
* Creates corresponding fabric instances from their object representations
|
|
@@ -32,7 +32,7 @@ export type EnlivenObjectOptions = Abortable & {
|
|
|
32
32
|
* @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal
|
|
33
33
|
* @returns {Promise<FabricObject[]>}
|
|
34
34
|
*/
|
|
35
|
-
export declare const enlivenObjects: <T extends Shadow | FabricObject<Partial<import("../../..").FabricObjectProps>, import("../../..").SerializedObjectProps, import("../../EventTypeDefs").ObjectEvents> | BaseFilter | BaseFabricObject<Partial<import("../../shapes/Object/types/ObjectProps").ObjectProps>, import("../../..").SerializedObjectProps, import("../../EventTypeDefs").ObjectEvents> | TFiller>(objects: any[], { signal, reviver }?: EnlivenObjectOptions) => Promise<T[]>;
|
|
35
|
+
export declare const enlivenObjects: <T extends Shadow | FabricObject<Partial<import("../../..").FabricObjectProps>, import("../../..").SerializedObjectProps, import("../../EventTypeDefs").ObjectEvents> | BaseFilter<string, object> | BaseFabricObject<Partial<import("../../shapes/Object/types/ObjectProps").ObjectProps>, import("../../..").SerializedObjectProps, import("../../EventTypeDefs").ObjectEvents> | TFiller>(objects: any[], { signal, reviver }?: EnlivenObjectOptions) => Promise<T[]>;
|
|
36
36
|
/**
|
|
37
37
|
* Creates corresponding fabric instances residing in an object, e.g. `clipPath`
|
|
38
38
|
* @param {Object} object with properties to enlive ( fill, stroke, clipPath, path )
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"objectEnlive.d.ts","sourceRoot":"","sources":["../../../../src/util/misc/objectEnlive.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,KAAK,EACV,SAAS,EAET,YAAY,EACZ,OAAO,EACR,MAAM,gBAAgB,CAAC;AAGxB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,IAAI,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAEnF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG;IACzC;;OAEG;IACH,WAAW,CAAC,EAAE,YAAY,CAAC;CAC5B,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,SAAS,QACf,MAAM,4BACqB,gBAAgB,8BA+B9C,CAAC;AAEL,MAAM,MAAM,oBAAoB,GAAG,SAAS,GAAG;IAC7C;;;OAGG;IACH,OAAO,CAAC,EAAE,CACR,CAAC,
|
|
1
|
+
{"version":3,"file":"objectEnlive.d.ts","sourceRoot":"","sources":["../../../../src/util/misc/objectEnlive.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,KAAK,EACV,SAAS,EAET,YAAY,EACZ,OAAO,EACR,MAAM,gBAAgB,CAAC;AAGxB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,IAAI,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAEnF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG;IACzC;;OAEG;IACH,WAAW,CAAC,EAAE,YAAY,CAAC;CAC5B,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,SAAS,QACf,MAAM,4BACqB,gBAAgB,8BA+B9C,CAAC;AAEL,MAAM,MAAM,oBAAoB,GAAG,SAAS,GAAG;IAC7C;;;OAGG;IACH,OAAO,CAAC,EAAE,CACR,CAAC,SACG,gBAAgB,GAChB,YAAY,GACZ,UAAU,CAAC,MAAM,CAAC,GAClB,MAAM,GACN,OAAO,EAEX,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAClC,QAAQ,EAAE,CAAC,KACR,IAAI,CAAC;CACX,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,cAAc,wYAQhB,GAAG,EAAE,wBACc,oBAAoB,iBAiC9C,CAAC;AAEL;;;;;;GAMG;AACH,eAAO,MAAM,uBAAuB,6MAGhB,GAAG,eACT,SAAS,eAkDnB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"objectEnlive.min.mjs","sources":["../../../../src/util/misc/objectEnlive.ts"],"sourcesContent":["import { noop } from '../../constants';\nimport type { Pattern } from '../../Pattern';\nimport type { FabricObject } from '../../shapes/Object/FabricObject';\nimport type {\n Abortable,\n Constructor,\n TCrossOrigin,\n TFiller,\n} from '../../typedefs';\nimport { createImage } from './dom';\nimport { classRegistry } from '../../ClassRegistry';\nimport type { BaseFilter } from '../../filters/BaseFilter';\nimport type { FabricObject as BaseFabricObject } from '../../shapes/Object/Object';\nimport { FabricError, SignalAbortedError } from '../internals/console';\nimport type { Shadow } from '../../Shadow';\n\nexport type LoadImageOptions = Abortable & {\n /**\n * cors value for the image loading, default to anonymous\n */\n crossOrigin?: TCrossOrigin;\n};\n\n/**\n * Loads image element from given url and resolve it, or catch.\n * @param {String} url URL representing an image\n * @param {LoadImageOptions} [options] image loading options\n * @returns {Promise<HTMLImageElement>} the loaded image.\n */\nexport const loadImage = (\n url: string,\n { signal, crossOrigin = null }: LoadImageOptions = {}\n) =>\n new Promise<HTMLImageElement>(function (resolve, reject) {\n if (signal && signal.aborted) {\n return reject(new SignalAbortedError('loadImage'));\n }\n const img = createImage();\n let abort: EventListenerOrEventListenerObject;\n if (signal) {\n abort = function (err: Event) {\n img.src = '';\n reject(err);\n };\n signal.addEventListener('abort', abort, { once: true });\n }\n const done = function () {\n img.onload = img.onerror = null;\n abort && signal?.removeEventListener('abort', abort);\n resolve(img);\n };\n if (!url) {\n done();\n return;\n }\n img.onload = done;\n img.onerror = function () {\n abort && signal?.removeEventListener('abort', abort);\n reject(new FabricError(`Error loading ${img.src}`));\n };\n crossOrigin && (img.crossOrigin = crossOrigin);\n img.src = url;\n });\n\nexport type EnlivenObjectOptions = Abortable & {\n /**\n * Method for further parsing of object elements,\n * called after each fabric object created.\n */\n reviver?: <\n T extends BaseFabricObject
|
|
1
|
+
{"version":3,"file":"objectEnlive.min.mjs","sources":["../../../../src/util/misc/objectEnlive.ts"],"sourcesContent":["import { noop } from '../../constants';\nimport type { Pattern } from '../../Pattern';\nimport type { FabricObject } from '../../shapes/Object/FabricObject';\nimport type {\n Abortable,\n Constructor,\n TCrossOrigin,\n TFiller,\n} from '../../typedefs';\nimport { createImage } from './dom';\nimport { classRegistry } from '../../ClassRegistry';\nimport type { BaseFilter } from '../../filters/BaseFilter';\nimport type { FabricObject as BaseFabricObject } from '../../shapes/Object/Object';\nimport { FabricError, SignalAbortedError } from '../internals/console';\nimport type { Shadow } from '../../Shadow';\n\nexport type LoadImageOptions = Abortable & {\n /**\n * cors value for the image loading, default to anonymous\n */\n crossOrigin?: TCrossOrigin;\n};\n\n/**\n * Loads image element from given url and resolve it, or catch.\n * @param {String} url URL representing an image\n * @param {LoadImageOptions} [options] image loading options\n * @returns {Promise<HTMLImageElement>} the loaded image.\n */\nexport const loadImage = (\n url: string,\n { signal, crossOrigin = null }: LoadImageOptions = {}\n) =>\n new Promise<HTMLImageElement>(function (resolve, reject) {\n if (signal && signal.aborted) {\n return reject(new SignalAbortedError('loadImage'));\n }\n const img = createImage();\n let abort: EventListenerOrEventListenerObject;\n if (signal) {\n abort = function (err: Event) {\n img.src = '';\n reject(err);\n };\n signal.addEventListener('abort', abort, { once: true });\n }\n const done = function () {\n img.onload = img.onerror = null;\n abort && signal?.removeEventListener('abort', abort);\n resolve(img);\n };\n if (!url) {\n done();\n return;\n }\n img.onload = done;\n img.onerror = function () {\n abort && signal?.removeEventListener('abort', abort);\n reject(new FabricError(`Error loading ${img.src}`));\n };\n crossOrigin && (img.crossOrigin = crossOrigin);\n img.src = url;\n });\n\nexport type EnlivenObjectOptions = Abortable & {\n /**\n * Method for further parsing of object elements,\n * called after each fabric object created.\n */\n reviver?: <\n T extends\n | BaseFabricObject\n | FabricObject\n | BaseFilter<string>\n | Shadow\n | TFiller\n >(\n serializedObj: Record<string, any>,\n instance: T\n ) => void;\n};\n\n/**\n * Creates corresponding fabric instances from their object representations\n * @param {Object[]} objects Objects to enliven\n * @param {EnlivenObjectOptions} [options]\n * @param {(serializedObj: object, instance: FabricObject) => any} [options.reviver] Method for further parsing of object elements,\n * called after each fabric object created.\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise<FabricObject[]>}\n */\nexport const enlivenObjects = <\n T extends\n | BaseFabricObject\n | FabricObject\n | BaseFilter<string>\n | Shadow\n | TFiller\n>(\n objects: any[],\n { signal, reviver = noop }: EnlivenObjectOptions = {}\n) =>\n new Promise<T[]>((resolve, reject) => {\n const instances: T[] = [];\n signal && signal.addEventListener('abort', reject, { once: true });\n Promise.all(\n objects.map((obj) =>\n classRegistry\n .getClass<\n Constructor<T> & {\n fromObject(options: any, context: Abortable): Promise<T>;\n }\n >(obj.type)\n .fromObject(obj, { signal })\n .then((fabricInstance) => {\n reviver(obj, fabricInstance);\n instances.push(fabricInstance);\n return fabricInstance;\n })\n )\n )\n .then(resolve)\n .catch((error) => {\n // cleanup\n instances.forEach((instance) => {\n (instance as FabricObject).dispose &&\n (instance as FabricObject).dispose();\n });\n reject(error);\n })\n .finally(() => {\n signal && signal.removeEventListener('abort', reject);\n });\n });\n\n/**\n * Creates corresponding fabric instances residing in an object, e.g. `clipPath`\n * @param {Object} object with properties to enlive ( fill, stroke, clipPath, path )\n * @param {object} [options]\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise<Record<string, FabricObject | TFiller | null>>} the input object with enlived values\n */\nexport const enlivenObjectEnlivables = <\n R = Record<string, FabricObject | TFiller | null>\n>(\n serializedObject: any,\n { signal }: Abortable = {}\n) =>\n new Promise<R>((resolve, reject) => {\n const instances: (FabricObject | TFiller | Shadow)[] = [];\n signal && signal.addEventListener('abort', reject, { once: true });\n // enlive every possible property\n const promises = Object.values(serializedObject).map((value: any) => {\n if (!value) {\n return value;\n }\n // clipPath or shadow or gradient\n if (value.type) {\n return enlivenObjects<FabricObject | Shadow | TFiller>([value], {\n signal,\n }).then(([enlived]) => {\n instances.push(enlived);\n return enlived;\n });\n }\n // pattern\n if (value.source) {\n return classRegistry\n .getClass<typeof Pattern>('pattern')\n .fromObject(value, { signal })\n .then((pattern: Pattern) => {\n instances.push(pattern);\n return pattern;\n });\n }\n return value;\n });\n const keys = Object.keys(serializedObject);\n Promise.all(promises)\n .then((enlived) => {\n return enlived.reduce((acc, instance, index) => {\n acc[keys[index]] = instance;\n return acc;\n }, {});\n })\n .then(resolve)\n .catch((error) => {\n // cleanup\n instances.forEach((instance: any) => {\n instance.dispose && instance.dispose();\n });\n reject(error);\n })\n .finally(() => {\n signal && signal.removeEventListener('abort', reject);\n });\n });\n"],"names":["loadImage","url","signal","crossOrigin","arguments","length","undefined","Promise","resolve","reject","aborted","SignalAbortedError","img","createImage","abort","err","src","addEventListener","once","done","onload","onerror","removeEventListener","FabricError","concat","enlivenObjects","objects","reviver","noop","instances","all","map","obj","classRegistry","getClass","type","fromObject","then","fabricInstance","push","catch","error","forEach","instance","dispose","finally","enlivenObjectEnlivables","serializedObject","promises","Object","values","value","_ref","enlived","source","pattern","keys","reduce","acc","index"],"mappings":"0OA6BaA,MAAAA,EAAY,SACvBC,GAAW,IACXC,OAAEA,EAAMC,YAAEA,EAAc,MAAwBC,UAAAC,OAAAD,QAAAE,IAAAF,UAAAE,GAAAF,UAAG,GAAA,GAAE,OAErD,IAAIG,SAA0B,SAAUC,EAASC,GAC/C,GAAIP,GAAUA,EAAOQ,QACnB,OAAOD,EAAO,IAAIE,EAAmB,cAEvC,MAAMC,EAAMC,IACZ,IAAIC,EACAZ,IACFY,EAAQ,SAAUC,GAChBH,EAAII,IAAM,GACVP,EAAOM,IAETb,EAAOe,iBAAiB,QAASH,EAAO,CAAEI,MAAM,KAElD,MAAMC,EAAO,WACXP,EAAIQ,OAASR,EAAIS,QAAU,KAC3BP,IAASZ,SAAAA,EAAQoB,oBAAoB,QAASR,IAC9CN,EAAQI,IAELX,GAILW,EAAIQ,OAASD,EACbP,EAAIS,QAAU,WACZP,IAASZ,SAAAA,EAAQoB,oBAAoB,QAASR,IAC9CL,EAAO,IAAIc,EAAWC,iBAAAA,OAAkBZ,EAAII,QAE9Cb,IAAgBS,EAAIT,YAAcA,GAClCS,EAAII,IAAMf,GATRkB,GAUJ,GAAE,EA6BSM,EAAiB,SAQ5BC,GAAc,IACdxB,OAAEA,EAAMyB,QAAEA,EAAUC,GAA4BxB,UAAAC,OAAAD,QAAAE,IAAAF,UAAAE,GAAAF,UAAG,GAAA,GAAE,OAErD,IAAIG,SAAa,CAACC,EAASC,KACzB,MAAMoB,EAAiB,GACvB3B,GAAUA,EAAOe,iBAAiB,QAASR,EAAQ,CAAES,MAAM,IAC3DX,QAAQuB,IACNJ,EAAQK,KAAKC,GACXC,EACGC,SAICF,EAAIG,MACLC,WAAWJ,EAAK,CAAE9B,WAClBmC,MAAMC,IACLX,EAAQK,EAAKM,GACbT,EAAUU,KAAKD,GACRA,QAIZD,KAAK7B,GACLgC,OAAOC,IAENZ,EAAUa,SAASC,IAChBA,EAA0BC,SACxBD,EAA0BC,SAAS,IAExCnC,EAAOgC,EAAM,IAEdI,SAAQ,KACP3C,GAAUA,EAAOoB,oBAAoB,QAASb,EAAO,GACrD,GACJ,EASSqC,EAA0B,SAGrCC,GAAqB,IACrB7C,OAAEA,GAAmBE,UAAAC,OAAAD,QAAAE,IAAAF,UAAAE,GAAAF,UAAG,GAAA,GAAE,OAE1B,IAAIG,SAAW,CAACC,EAASC,KACvB,MAAMoB,EAAiD,GACvD3B,GAAUA,EAAOe,iBAAiB,QAASR,EAAQ,CAAES,MAAM,IAE3D,MAAM8B,EAAWC,OAAOC,OAAOH,GAAkBhB,KAAKoB,GAC/CA,EAIDA,EAAMhB,KACDV,EAAgD,CAAC0B,GAAQ,CAC9DjD,WACCmC,MAAKe,IAAe,IAAbC,GAAQD,EAEhB,OADAvB,EAAUU,KAAKc,GACRA,CAAO,IAIdF,EAAMG,OACDrB,EACJC,SAAyB,WACzBE,WAAWe,EAAO,CAAEjD,WACpBmC,MAAMkB,IACL1B,EAAUU,KAAKgB,GACRA,KAGNJ,EArBEA,IAuBLK,EAAOP,OAAOO,KAAKT,GACzBxC,QAAQuB,IAAIkB,GACTX,MAAMgB,GACEA,EAAQI,QAAO,CAACC,EAAKf,EAAUgB,KACpCD,EAAIF,EAAKG,IAAUhB,EACZe,IACN,CAAE,KAENrB,KAAK7B,GACLgC,OAAOC,IAENZ,EAAUa,SAASC,IACjBA,EAASC,SAAWD,EAASC,SAAS,IAExCnC,EAAOgC,EAAM,IAEdI,SAAQ,KACP3C,GAAUA,EAAOoB,oBAAoB,QAASb,EAAO,GACrD,GACJ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"objectEnlive.mjs","sources":["../../../../src/util/misc/objectEnlive.ts"],"sourcesContent":["import { noop } from '../../constants';\nimport type { Pattern } from '../../Pattern';\nimport type { FabricObject } from '../../shapes/Object/FabricObject';\nimport type {\n Abortable,\n Constructor,\n TCrossOrigin,\n TFiller,\n} from '../../typedefs';\nimport { createImage } from './dom';\nimport { classRegistry } from '../../ClassRegistry';\nimport type { BaseFilter } from '../../filters/BaseFilter';\nimport type { FabricObject as BaseFabricObject } from '../../shapes/Object/Object';\nimport { FabricError, SignalAbortedError } from '../internals/console';\nimport type { Shadow } from '../../Shadow';\n\nexport type LoadImageOptions = Abortable & {\n /**\n * cors value for the image loading, default to anonymous\n */\n crossOrigin?: TCrossOrigin;\n};\n\n/**\n * Loads image element from given url and resolve it, or catch.\n * @param {String} url URL representing an image\n * @param {LoadImageOptions} [options] image loading options\n * @returns {Promise<HTMLImageElement>} the loaded image.\n */\nexport const loadImage = (\n url: string,\n { signal, crossOrigin = null }: LoadImageOptions = {}\n) =>\n new Promise<HTMLImageElement>(function (resolve, reject) {\n if (signal && signal.aborted) {\n return reject(new SignalAbortedError('loadImage'));\n }\n const img = createImage();\n let abort: EventListenerOrEventListenerObject;\n if (signal) {\n abort = function (err: Event) {\n img.src = '';\n reject(err);\n };\n signal.addEventListener('abort', abort, { once: true });\n }\n const done = function () {\n img.onload = img.onerror = null;\n abort && signal?.removeEventListener('abort', abort);\n resolve(img);\n };\n if (!url) {\n done();\n return;\n }\n img.onload = done;\n img.onerror = function () {\n abort && signal?.removeEventListener('abort', abort);\n reject(new FabricError(`Error loading ${img.src}`));\n };\n crossOrigin && (img.crossOrigin = crossOrigin);\n img.src = url;\n });\n\nexport type EnlivenObjectOptions = Abortable & {\n /**\n * Method for further parsing of object elements,\n * called after each fabric object created.\n */\n reviver?: <\n T extends BaseFabricObject | FabricObject | BaseFilter | Shadow | TFiller\n >(\n serializedObj: Record<string, any>,\n instance: T\n ) => void;\n};\n\n/**\n * Creates corresponding fabric instances from their object representations\n * @param {Object[]} objects Objects to enliven\n * @param {EnlivenObjectOptions} [options]\n * @param {(serializedObj: object, instance: FabricObject) => any} [options.reviver] Method for further parsing of object elements,\n * called after each fabric object created.\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise<FabricObject[]>}\n */\nexport const enlivenObjects = <\n T extends BaseFabricObject | FabricObject | BaseFilter | Shadow | TFiller\n>(\n objects: any[],\n { signal, reviver = noop }: EnlivenObjectOptions = {}\n) =>\n new Promise<T[]>((resolve, reject) => {\n const instances: T[] = [];\n signal && signal.addEventListener('abort', reject, { once: true });\n Promise.all(\n objects.map((obj) =>\n classRegistry\n .getClass<\n Constructor<T> & {\n fromObject(options: any, context: Abortable): Promise<T>;\n }\n >(obj.type)\n .fromObject(obj, { signal })\n .then((fabricInstance) => {\n reviver(obj, fabricInstance);\n instances.push(fabricInstance);\n return fabricInstance;\n })\n )\n )\n .then(resolve)\n .catch((error) => {\n // cleanup\n instances.forEach((instance) => {\n (instance as FabricObject).dispose &&\n (instance as FabricObject).dispose();\n });\n reject(error);\n })\n .finally(() => {\n signal && signal.removeEventListener('abort', reject);\n });\n });\n\n/**\n * Creates corresponding fabric instances residing in an object, e.g. `clipPath`\n * @param {Object} object with properties to enlive ( fill, stroke, clipPath, path )\n * @param {object} [options]\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise<Record<string, FabricObject | TFiller | null>>} the input object with enlived values\n */\nexport const enlivenObjectEnlivables = <\n R = Record<string, FabricObject | TFiller | null>\n>(\n serializedObject: any,\n { signal }: Abortable = {}\n) =>\n new Promise<R>((resolve, reject) => {\n const instances: (FabricObject | TFiller | Shadow)[] = [];\n signal && signal.addEventListener('abort', reject, { once: true });\n // enlive every possible property\n const promises = Object.values(serializedObject).map((value: any) => {\n if (!value) {\n return value;\n }\n // clipPath or shadow or gradient\n if (value.type) {\n return enlivenObjects<FabricObject | Shadow | TFiller>([value], {\n signal,\n }).then(([enlived]) => {\n instances.push(enlived);\n return enlived;\n });\n }\n // pattern\n if (value.source) {\n return classRegistry\n .getClass<typeof Pattern>('pattern')\n .fromObject(value, { signal })\n .then((pattern: Pattern) => {\n instances.push(pattern);\n return pattern;\n });\n }\n return value;\n });\n const keys = Object.keys(serializedObject);\n Promise.all(promises)\n .then((enlived) => {\n return enlived.reduce((acc, instance, index) => {\n acc[keys[index]] = instance;\n return acc;\n }, {});\n })\n .then(resolve)\n .catch((error) => {\n // cleanup\n instances.forEach((instance: any) => {\n instance.dispose && instance.dispose();\n });\n reject(error);\n })\n .finally(() => {\n signal && signal.removeEventListener('abort', reject);\n });\n });\n"],"names":["loadImage","url","signal","crossOrigin","arguments","length","undefined","Promise","resolve","reject","aborted","SignalAbortedError","img","createImage","abort","err","src","addEventListener","once","done","onload","onerror","removeEventListener","FabricError","concat","enlivenObjects","objects","reviver","noop","instances","all","map","obj","classRegistry","getClass","type","fromObject","then","fabricInstance","push","catch","error","forEach","instance","dispose","finally","enlivenObjectEnlivables","serializedObject","promises","Object","values","value","_ref","enlived","source","pattern","keys","reduce","acc","index"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"objectEnlive.mjs","sources":["../../../../src/util/misc/objectEnlive.ts"],"sourcesContent":["import { noop } from '../../constants';\nimport type { Pattern } from '../../Pattern';\nimport type { FabricObject } from '../../shapes/Object/FabricObject';\nimport type {\n Abortable,\n Constructor,\n TCrossOrigin,\n TFiller,\n} from '../../typedefs';\nimport { createImage } from './dom';\nimport { classRegistry } from '../../ClassRegistry';\nimport type { BaseFilter } from '../../filters/BaseFilter';\nimport type { FabricObject as BaseFabricObject } from '../../shapes/Object/Object';\nimport { FabricError, SignalAbortedError } from '../internals/console';\nimport type { Shadow } from '../../Shadow';\n\nexport type LoadImageOptions = Abortable & {\n /**\n * cors value for the image loading, default to anonymous\n */\n crossOrigin?: TCrossOrigin;\n};\n\n/**\n * Loads image element from given url and resolve it, or catch.\n * @param {String} url URL representing an image\n * @param {LoadImageOptions} [options] image loading options\n * @returns {Promise<HTMLImageElement>} the loaded image.\n */\nexport const loadImage = (\n url: string,\n { signal, crossOrigin = null }: LoadImageOptions = {}\n) =>\n new Promise<HTMLImageElement>(function (resolve, reject) {\n if (signal && signal.aborted) {\n return reject(new SignalAbortedError('loadImage'));\n }\n const img = createImage();\n let abort: EventListenerOrEventListenerObject;\n if (signal) {\n abort = function (err: Event) {\n img.src = '';\n reject(err);\n };\n signal.addEventListener('abort', abort, { once: true });\n }\n const done = function () {\n img.onload = img.onerror = null;\n abort && signal?.removeEventListener('abort', abort);\n resolve(img);\n };\n if (!url) {\n done();\n return;\n }\n img.onload = done;\n img.onerror = function () {\n abort && signal?.removeEventListener('abort', abort);\n reject(new FabricError(`Error loading ${img.src}`));\n };\n crossOrigin && (img.crossOrigin = crossOrigin);\n img.src = url;\n });\n\nexport type EnlivenObjectOptions = Abortable & {\n /**\n * Method for further parsing of object elements,\n * called after each fabric object created.\n */\n reviver?: <\n T extends\n | BaseFabricObject\n | FabricObject\n | BaseFilter<string>\n | Shadow\n | TFiller\n >(\n serializedObj: Record<string, any>,\n instance: T\n ) => void;\n};\n\n/**\n * Creates corresponding fabric instances from their object representations\n * @param {Object[]} objects Objects to enliven\n * @param {EnlivenObjectOptions} [options]\n * @param {(serializedObj: object, instance: FabricObject) => any} [options.reviver] Method for further parsing of object elements,\n * called after each fabric object created.\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise<FabricObject[]>}\n */\nexport const enlivenObjects = <\n T extends\n | BaseFabricObject\n | FabricObject\n | BaseFilter<string>\n | Shadow\n | TFiller\n>(\n objects: any[],\n { signal, reviver = noop }: EnlivenObjectOptions = {}\n) =>\n new Promise<T[]>((resolve, reject) => {\n const instances: T[] = [];\n signal && signal.addEventListener('abort', reject, { once: true });\n Promise.all(\n objects.map((obj) =>\n classRegistry\n .getClass<\n Constructor<T> & {\n fromObject(options: any, context: Abortable): Promise<T>;\n }\n >(obj.type)\n .fromObject(obj, { signal })\n .then((fabricInstance) => {\n reviver(obj, fabricInstance);\n instances.push(fabricInstance);\n return fabricInstance;\n })\n )\n )\n .then(resolve)\n .catch((error) => {\n // cleanup\n instances.forEach((instance) => {\n (instance as FabricObject).dispose &&\n (instance as FabricObject).dispose();\n });\n reject(error);\n })\n .finally(() => {\n signal && signal.removeEventListener('abort', reject);\n });\n });\n\n/**\n * Creates corresponding fabric instances residing in an object, e.g. `clipPath`\n * @param {Object} object with properties to enlive ( fill, stroke, clipPath, path )\n * @param {object} [options]\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise<Record<string, FabricObject | TFiller | null>>} the input object with enlived values\n */\nexport const enlivenObjectEnlivables = <\n R = Record<string, FabricObject | TFiller | null>\n>(\n serializedObject: any,\n { signal }: Abortable = {}\n) =>\n new Promise<R>((resolve, reject) => {\n const instances: (FabricObject | TFiller | Shadow)[] = [];\n signal && signal.addEventListener('abort', reject, { once: true });\n // enlive every possible property\n const promises = Object.values(serializedObject).map((value: any) => {\n if (!value) {\n return value;\n }\n // clipPath or shadow or gradient\n if (value.type) {\n return enlivenObjects<FabricObject | Shadow | TFiller>([value], {\n signal,\n }).then(([enlived]) => {\n instances.push(enlived);\n return enlived;\n });\n }\n // pattern\n if (value.source) {\n return classRegistry\n .getClass<typeof Pattern>('pattern')\n .fromObject(value, { signal })\n .then((pattern: Pattern) => {\n instances.push(pattern);\n return pattern;\n });\n }\n return value;\n });\n const keys = Object.keys(serializedObject);\n Promise.all(promises)\n .then((enlived) => {\n return enlived.reduce((acc, instance, index) => {\n acc[keys[index]] = instance;\n return acc;\n }, {});\n })\n .then(resolve)\n .catch((error) => {\n // cleanup\n instances.forEach((instance: any) => {\n instance.dispose && instance.dispose();\n });\n reject(error);\n })\n .finally(() => {\n signal && signal.removeEventListener('abort', reject);\n });\n });\n"],"names":["loadImage","url","signal","crossOrigin","arguments","length","undefined","Promise","resolve","reject","aborted","SignalAbortedError","img","createImage","abort","err","src","addEventListener","once","done","onload","onerror","removeEventListener","FabricError","concat","enlivenObjects","objects","reviver","noop","instances","all","map","obj","classRegistry","getClass","type","fromObject","then","fabricInstance","push","catch","error","forEach","instance","dispose","finally","enlivenObjectEnlivables","serializedObject","promises","Object","values","value","_ref","enlived","source","pattern","keys","reduce","acc","index"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@postermywall/fabricjs-2",
|
|
3
3
|
"description": "Object model for HTML5 canvas, and SVG-to-canvas parser. Backed by jsdom and node-canvas.",
|
|
4
4
|
"homepage": "http://fabricjs.com/",
|
|
5
|
-
"version": "6.0.0
|
|
5
|
+
"version": "6.0.0",
|
|
6
6
|
"author": "Juriy Zaytsev <kangax@gmail.com>",
|
|
7
7
|
"contributors": [
|
|
8
8
|
{
|
|
@@ -96,7 +96,7 @@
|
|
|
96
96
|
"auto-changelog": "^2.3.0",
|
|
97
97
|
"axios": "^0.27.2",
|
|
98
98
|
"babel-plugin-import-json-value": "^0.1.2",
|
|
99
|
-
"babel-plugin-transform-imports": "git+https://git@github.com/
|
|
99
|
+
"babel-plugin-transform-imports": "git+https://git@github.com/fabricjs/babel-plugin-transform-imports.git",
|
|
100
100
|
"busboy": "^1.6.0",
|
|
101
101
|
"chalk": "^2.4.1",
|
|
102
102
|
"commander": "^9.1.0",
|
package/src/canvas/Canvas.ts
CHANGED
|
@@ -1304,16 +1304,13 @@ export class Canvas extends SelectableCanvas implements CanvasOptions {
|
|
|
1304
1304
|
transform: Transform,
|
|
1305
1305
|
pointer: Point
|
|
1306
1306
|
) {
|
|
1307
|
-
const
|
|
1308
|
-
y = pointer.y,
|
|
1309
|
-
action = transform.action,
|
|
1310
|
-
actionHandler = transform.actionHandler;
|
|
1311
|
-
let actionPerformed = false;
|
|
1312
|
-
// this object could be created from the function in the control handlers
|
|
1307
|
+
const { action, actionHandler, target } = transform;
|
|
1313
1308
|
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1309
|
+
const actionPerformed =
|
|
1310
|
+
!!actionHandler && actionHandler(e, transform, pointer.x, pointer.y);
|
|
1311
|
+
actionPerformed && target.setCoords();
|
|
1312
|
+
|
|
1313
|
+
// this object could be created from the function in the control handlers
|
|
1317
1314
|
if (action === 'drag' && actionPerformed) {
|
|
1318
1315
|
transform.target.isMoving = true;
|
|
1319
1316
|
this.setCursor(transform.target.moveCursor || this.moveCursor);
|
|
@@ -1148,8 +1148,8 @@ export class SelectableCanvas<EventSpec extends CanvasEvents = CanvasEvents>
|
|
|
1148
1148
|
|
|
1149
1149
|
if (isActiveSelection(object) && prevActiveObject !== object) {
|
|
1150
1150
|
object.set('canvas', this);
|
|
1151
|
-
object.setCoords();
|
|
1152
1151
|
}
|
|
1152
|
+
object.setCoords();
|
|
1153
1153
|
|
|
1154
1154
|
return true;
|
|
1155
1155
|
}
|
|
@@ -1360,7 +1360,7 @@ export class SelectableCanvas<EventSpec extends CanvasEvents = CanvasEvents>
|
|
|
1360
1360
|
_setSVGObject(
|
|
1361
1361
|
markup: string[],
|
|
1362
1362
|
instance: FabricObject,
|
|
1363
|
-
reviver
|
|
1363
|
+
reviver?: TSVGReviver
|
|
1364
1364
|
) {
|
|
1365
1365
|
// If the object is in a selection group, simulate what would happen to that
|
|
1366
1366
|
// object when the group is deselected
|
|
@@ -389,21 +389,7 @@ export class StaticCanvas<
|
|
|
389
389
|
* @param {Array} vpt a Canvas 2D API transform matrix
|
|
390
390
|
*/
|
|
391
391
|
setViewportTransform(vpt: TMat2D) {
|
|
392
|
-
const backgroundObject = this.backgroundImage,
|
|
393
|
-
overlayObject = this.overlayImage,
|
|
394
|
-
len = this._objects.length;
|
|
395
|
-
|
|
396
392
|
this.viewportTransform = vpt;
|
|
397
|
-
for (let i = 0; i < len; i++) {
|
|
398
|
-
const object = this._objects[i];
|
|
399
|
-
object.group || object.setCoords();
|
|
400
|
-
}
|
|
401
|
-
if (backgroundObject) {
|
|
402
|
-
backgroundObject.setCoords();
|
|
403
|
-
}
|
|
404
|
-
if (overlayObject) {
|
|
405
|
-
overlayObject.setCoords();
|
|
406
|
-
}
|
|
407
393
|
this.calcViewportBoundaries();
|
|
408
394
|
this.renderOnAddRemove && this.requestRenderAll();
|
|
409
395
|
}
|
|
@@ -1002,7 +988,7 @@ export class StaticCanvas<
|
|
|
1002
988
|
* return svg.replace('stroke-dasharray: ; stroke-linecap: butt; stroke-linejoin: miter; stroke-miterlimit: 10; ', '');
|
|
1003
989
|
* });
|
|
1004
990
|
*/
|
|
1005
|
-
toSVG(options: TSVGExportOptions = {}, reviver
|
|
991
|
+
toSVG(options: TSVGExportOptions = {}, reviver?: TSVGReviver) {
|
|
1006
992
|
options.reviver = reviver;
|
|
1007
993
|
const markup: string[] = [];
|
|
1008
994
|
|
|
@@ -1181,7 +1167,7 @@ export class StaticCanvas<
|
|
|
1181
1167
|
/**
|
|
1182
1168
|
* @private
|
|
1183
1169
|
*/
|
|
1184
|
-
_setSVGObjects(markup: string[], reviver
|
|
1170
|
+
_setSVGObjects(markup: string[], reviver?: TSVGReviver) {
|
|
1185
1171
|
this.forEachObject((fabricObject) => {
|
|
1186
1172
|
if (fabricObject.excludeFromExport) {
|
|
1187
1173
|
return;
|
|
@@ -1197,7 +1183,7 @@ export class StaticCanvas<
|
|
|
1197
1183
|
_setSVGObject(
|
|
1198
1184
|
markup: string[],
|
|
1199
1185
|
instance: FabricObject,
|
|
1200
|
-
reviver
|
|
1186
|
+
reviver?: TSVGReviver
|
|
1201
1187
|
) {
|
|
1202
1188
|
markup.push(instance.toSVG(reviver));
|
|
1203
1189
|
}
|
|
@@ -1208,7 +1194,7 @@ export class StaticCanvas<
|
|
|
1208
1194
|
_setSVGBgOverlayImage(
|
|
1209
1195
|
markup: string[],
|
|
1210
1196
|
property: 'overlayImage' | 'backgroundImage',
|
|
1211
|
-
reviver
|
|
1197
|
+
reviver?: TSVGReviver
|
|
1212
1198
|
) {
|
|
1213
1199
|
const bgOrOverlay = this[property];
|
|
1214
1200
|
if (bgOrOverlay && !bgOrOverlay.excludeFromExport && bgOrOverlay.toSVG) {
|
package/src/color/Color.ts
CHANGED
|
@@ -16,6 +16,7 @@ import {
|
|
|
16
16
|
*/
|
|
17
17
|
export class Color {
|
|
18
18
|
private declare _source: TRGBAColorSource;
|
|
19
|
+
isUnrecognised = false;
|
|
19
20
|
|
|
20
21
|
/**
|
|
21
22
|
*
|
|
@@ -51,7 +52,7 @@ export class Color {
|
|
|
51
52
|
Color.sourceFromHsl(color) ||
|
|
52
53
|
// color is not recognized
|
|
53
54
|
// we default to black as canvas does
|
|
54
|
-
([0, 0, 0, 1] as TRGBAColorSource);
|
|
55
|
+
((this.isUnrecognised = true) && ([0, 0, 0, 1] as TRGBAColorSource));
|
|
55
56
|
}
|
|
56
57
|
|
|
57
58
|
/**
|
package/src/color/color.test.ts
CHANGED
|
@@ -49,4 +49,10 @@ describe('Color regex and conversion tests', () => {
|
|
|
49
49
|
[120.1, 60.2, 30.3, 1].toString()
|
|
50
50
|
);
|
|
51
51
|
});
|
|
52
|
+
|
|
53
|
+
it('Create an unrecognised color', () => {
|
|
54
|
+
const color1 = new Color('not a color');
|
|
55
|
+
expect(color1.isUnrecognised).toBe(true);
|
|
56
|
+
expect(color1.getSource().toString()).toBe([0, 0, 0, 1].toString());
|
|
57
|
+
});
|
|
52
58
|
});
|
|
@@ -18,14 +18,17 @@ import { FabricError } from '../util/internals/console';
|
|
|
18
18
|
|
|
19
19
|
const regex = new RegExp(highPsourceCode, 'g');
|
|
20
20
|
|
|
21
|
-
export class BaseFilter
|
|
21
|
+
export class BaseFilter<
|
|
22
|
+
Name extends string,
|
|
23
|
+
OwnProps extends Record<string, any> = object
|
|
24
|
+
> {
|
|
22
25
|
/**
|
|
23
26
|
* Filter type
|
|
24
27
|
* @param {String} type
|
|
25
28
|
* @default
|
|
26
29
|
*/
|
|
27
|
-
get type():
|
|
28
|
-
return (this.constructor as typeof BaseFilter).type;
|
|
30
|
+
get type(): Name {
|
|
31
|
+
return (this.constructor as typeof BaseFilter).type as Name;
|
|
29
32
|
}
|
|
30
33
|
|
|
31
34
|
/**
|
|
@@ -37,27 +40,23 @@ export class BaseFilter {
|
|
|
37
40
|
*/
|
|
38
41
|
static type = 'BaseFilter';
|
|
39
42
|
|
|
40
|
-
declare static defaults: Record<string, any>;
|
|
41
|
-
|
|
42
43
|
/**
|
|
43
|
-
*
|
|
44
|
-
*
|
|
44
|
+
* Contains the uniform locations for the fragment shader.
|
|
45
|
+
* uStepW and uStepH are handled by the BaseFilter, each filter class
|
|
46
|
+
* needs to specify all the one that are needed
|
|
45
47
|
*/
|
|
46
|
-
|
|
48
|
+
static uniformLocations: string[] = [];
|
|
47
49
|
|
|
48
|
-
|
|
49
|
-
* Name of the parameter that can be changed in the filter.
|
|
50
|
-
* Some filters have more than one parameter and there is no
|
|
51
|
-
* mainParameter
|
|
52
|
-
* @private
|
|
53
|
-
*/
|
|
54
|
-
declare mainParameter?: keyof this | undefined;
|
|
50
|
+
declare static defaults: Record<string, unknown>;
|
|
55
51
|
|
|
56
52
|
/**
|
|
57
53
|
* Constructor
|
|
58
54
|
* @param {Object} [options] Options object
|
|
59
55
|
*/
|
|
60
|
-
constructor({
|
|
56
|
+
constructor({
|
|
57
|
+
type,
|
|
58
|
+
...options
|
|
59
|
+
}: { type?: never } & Partial<OwnProps> & Record<string, any> = {}) {
|
|
61
60
|
Object.assign(
|
|
62
61
|
this,
|
|
63
62
|
(this.constructor as typeof BaseFilter).defaults,
|
|
@@ -69,6 +68,10 @@ export class BaseFilter {
|
|
|
69
68
|
return identityFragmentShader;
|
|
70
69
|
}
|
|
71
70
|
|
|
71
|
+
getVertexSource(): string {
|
|
72
|
+
return vertexSource;
|
|
73
|
+
}
|
|
74
|
+
|
|
72
75
|
/**
|
|
73
76
|
* Compile this filter's shader program.
|
|
74
77
|
*
|
|
@@ -79,7 +82,7 @@ export class BaseFilter {
|
|
|
79
82
|
createProgram(
|
|
80
83
|
gl: WebGLRenderingContext,
|
|
81
84
|
fragmentSource: string = this.getFragmentSource(),
|
|
82
|
-
vertexSource: string = this.
|
|
85
|
+
vertexSource: string = this.getVertexSource()
|
|
83
86
|
) {
|
|
84
87
|
const {
|
|
85
88
|
WebGLProbe: { GLPrecision = 'highp' },
|
|
@@ -131,6 +134,7 @@ export class BaseFilter {
|
|
|
131
134
|
const uniformLocations = this.getUniformLocations(gl, program) || {};
|
|
132
135
|
uniformLocations.uStepW = gl.getUniformLocation(program, 'uStepW');
|
|
133
136
|
uniformLocations.uStepH = gl.getUniformLocation(program, 'uStepH');
|
|
137
|
+
|
|
134
138
|
return {
|
|
135
139
|
program,
|
|
136
140
|
attributeLocations: this.getAttributeLocations(gl, program),
|
|
@@ -157,8 +161,6 @@ export class BaseFilter {
|
|
|
157
161
|
/**
|
|
158
162
|
* Return a map of uniform names to WebGLUniformLocation objects.
|
|
159
163
|
*
|
|
160
|
-
* Intended to be overridden by subclasses.
|
|
161
|
-
*
|
|
162
164
|
* @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.
|
|
163
165
|
* @param {WebGLShaderProgram} program The shader program from which to take uniform locations.
|
|
164
166
|
* @returns {Object} A map of uniform names to uniform locations.
|
|
@@ -167,7 +169,17 @@ export class BaseFilter {
|
|
|
167
169
|
gl: WebGLRenderingContext,
|
|
168
170
|
program: WebGLProgram
|
|
169
171
|
): TWebGLUniformLocationMap {
|
|
170
|
-
|
|
172
|
+
const locations = (this.constructor as unknown as typeof BaseFilter<string>)
|
|
173
|
+
.uniformLocations;
|
|
174
|
+
|
|
175
|
+
const uniformLocations: Record<string, WebGLUniformLocation | null> = {};
|
|
176
|
+
for (let i = 0; i < locations.length; i++) {
|
|
177
|
+
uniformLocations[locations[i]] = gl.getUniformLocation(
|
|
178
|
+
program,
|
|
179
|
+
locations[i]
|
|
180
|
+
);
|
|
181
|
+
}
|
|
182
|
+
return uniformLocations;
|
|
171
183
|
}
|
|
172
184
|
|
|
173
185
|
/**
|
|
@@ -233,22 +245,7 @@ export class BaseFilter {
|
|
|
233
245
|
**/
|
|
234
246
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
235
247
|
isNeutralState(options?: any): boolean {
|
|
236
|
-
|
|
237
|
-
defaultValue = (this.constructor as typeof BaseFilter).defaults[
|
|
238
|
-
main as string
|
|
239
|
-
];
|
|
240
|
-
if (main) {
|
|
241
|
-
const thisValue = this[main];
|
|
242
|
-
if (Array.isArray(defaultValue) && Array.isArray(thisValue)) {
|
|
243
|
-
return defaultValue.every(
|
|
244
|
-
(value: any, i: number) => value === thisValue[i]
|
|
245
|
-
);
|
|
246
|
-
} else {
|
|
247
|
-
return defaultValue === thisValue;
|
|
248
|
-
}
|
|
249
|
-
} else {
|
|
250
|
-
return false;
|
|
251
|
-
}
|
|
248
|
+
return false;
|
|
252
249
|
}
|
|
253
250
|
|
|
254
251
|
/**
|
|
@@ -283,7 +280,7 @@ export class BaseFilter {
|
|
|
283
280
|
* Used to force recompilation when parameters change or to retrieve the shader from cache
|
|
284
281
|
* @type string
|
|
285
282
|
**/
|
|
286
|
-
getCacheKey() {
|
|
283
|
+
getCacheKey(): string {
|
|
287
284
|
return this.type;
|
|
288
285
|
}
|
|
289
286
|
|
|
@@ -350,16 +347,6 @@ export class BaseFilter {
|
|
|
350
347
|
gl.activeTexture(gl.TEXTURE0);
|
|
351
348
|
}
|
|
352
349
|
|
|
353
|
-
getMainParameter() {
|
|
354
|
-
return this.mainParameter ? this[this.mainParameter] : undefined;
|
|
355
|
-
}
|
|
356
|
-
|
|
357
|
-
setMainParameter(value: any) {
|
|
358
|
-
if (this.mainParameter) {
|
|
359
|
-
this[this.mainParameter] = value;
|
|
360
|
-
}
|
|
361
|
-
}
|
|
362
|
-
|
|
363
350
|
/**
|
|
364
351
|
* Send uniform data from this filter to its shader program on the GPU.
|
|
365
352
|
*
|
|
@@ -392,11 +379,18 @@ export class BaseFilter {
|
|
|
392
379
|
* Returns object representation of an instance
|
|
393
380
|
* @return {Object} Object representation of an instance
|
|
394
381
|
*/
|
|
395
|
-
toObject() {
|
|
396
|
-
const
|
|
382
|
+
toObject(): { type: Name } & OwnProps {
|
|
383
|
+
const defaultKeys = Object.keys(
|
|
384
|
+
(this.constructor as typeof BaseFilter).defaults
|
|
385
|
+
) as (keyof OwnProps)[];
|
|
386
|
+
|
|
397
387
|
return {
|
|
398
388
|
type: this.type,
|
|
399
|
-
...(
|
|
389
|
+
...defaultKeys.reduce<OwnProps>((acc, key) => {
|
|
390
|
+
//@ts-expect-error TS doesn't get i want an object that looks like this
|
|
391
|
+
acc[key] = this[key as keyof this];
|
|
392
|
+
return acc;
|
|
393
|
+
}, {} as OwnProps),
|
|
400
394
|
};
|
|
401
395
|
}
|
|
402
396
|
|
|
@@ -412,7 +406,7 @@ export class BaseFilter {
|
|
|
412
406
|
static async fromObject(
|
|
413
407
|
{ type, ...filterOptions }: Record<string, any>,
|
|
414
408
|
options: Abortable
|
|
415
|
-
) {
|
|
409
|
+
): Promise<BaseFilter<string, object>> {
|
|
416
410
|
return new this(filterOptions);
|
|
417
411
|
}
|
|
418
412
|
}
|