fabric
Version:
Object model for HTML5 canvas, and SVG-to-canvas parser. Backed by jsdom and node-canvas.
1 lines • 48.9 kB
Source Map (JSON)
{"version":3,"file":"Image.mjs","sources":["../../../src/shapes/Image.ts"],"sourcesContent":["import { getFabricDocument, getEnv } from '../env';\nimport type { BaseFilter } from '../filters/BaseFilter';\nimport { getFilterBackend } from '../filters/FilterBackend';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type {\n TClassProperties,\n TCrossOrigin,\n TSize,\n Abortable,\n TOptions,\n} from '../typedefs';\nimport { uid } from '../util/internals/uid';\nimport { createCanvasElementFor } from '../util/misc/dom';\nimport { findScaleToCover, findScaleToFit } from '../util/misc/findScaleTo';\nimport type { LoadImageOptions } from '../util/misc/objectEnlive';\nimport {\n enlivenObjectEnlivables,\n enlivenObjects,\n loadImage,\n} from '../util/misc/objectEnlive';\nimport { parsePreserveAspectRatioAttribute } from '../util/misc/svgParsing';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport { WebGLFilterBackend } from '../filters/WebGLFilterBackend';\nimport { FILL, NONE } from '../constants';\nimport { getDocumentFromElement } from '../util/dom_misc';\nimport type { CSSRules } from '../parser/typedefs';\nimport type { Resize } from '../filters/Resize';\nimport type { TCachedFabricObject } from './Object/Object';\nimport { log } from '../util/internals/console';\n\n// @todo Would be nice to have filtering code not imported directly.\n\nexport type ImageSource =\n | HTMLImageElement\n | HTMLVideoElement\n | HTMLCanvasElement;\n\ninterface UniqueImageProps {\n srcFromAttribute: boolean;\n minimumScaleTrigger: number;\n cropX: number;\n cropY: number;\n imageSmoothing: boolean;\n filters: BaseFilter<string, Record<string, any>>[];\n resizeFilter?: Resize;\n}\n\nexport const imageDefaultValues: Partial<TClassProperties<FabricImage>> = {\n strokeWidth: 0,\n srcFromAttribute: false,\n minimumScaleTrigger: 0.5,\n cropX: 0,\n cropY: 0,\n imageSmoothing: true,\n};\n\nexport interface SerializedImageProps extends SerializedObjectProps {\n src: string;\n crossOrigin: TCrossOrigin;\n filters: any[];\n resizeFilter?: any;\n cropX: number;\n cropY: number;\n}\n\nexport interface ImageProps extends FabricObjectProps, UniqueImageProps {}\n\nconst IMAGE_PROPS = ['cropX', 'cropY'] as const;\n\n/**\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#images}\n */\nexport class FabricImage<\n Props extends TOptions<ImageProps> = Partial<ImageProps>,\n SProps extends SerializedImageProps = SerializedImageProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject<Props, SProps, EventSpec>\n implements ImageProps\n{\n /**\n * When calling {@link FabricImage.getSrc}, return value from element src with `element.getAttribute('src')`.\n * This allows for relative urls as image src.\n * @since 2.7.0\n * @type Boolean\n * @default false\n */\n declare srcFromAttribute: boolean;\n\n /**\n * private\n * contains last value of scaleX to detect\n * if the Image got resized after the last Render\n * @type Number\n */\n protected _lastScaleX = 1;\n\n /**\n * private\n * contains last value of scaleY to detect\n * if the Image got resized after the last Render\n * @type Number\n */\n protected _lastScaleY = 1;\n\n /**\n * private\n * contains last value of scaling applied by the apply filter chain\n * @type Number\n */\n protected _filterScalingX = 1;\n\n /**\n * private\n * contains last value of scaling applied by the apply filter chain\n * @type Number\n */\n protected _filterScalingY = 1;\n\n /**\n * minimum scale factor under which any resizeFilter is triggered to resize the image\n * 0 will disable the automatic resize. 1 will trigger automatically always.\n * number bigger than 1 are not implemented yet.\n * @type Number\n */\n declare minimumScaleTrigger: number;\n\n /**\n * key used to retrieve the texture representing this image\n * @since 2.0.0\n * @type String\n * @default\n */\n declare cacheKey: string;\n\n /**\n * Image crop in pixels from original image size.\n * @since 2.0.0\n * @type Number\n * @default\n */\n declare cropX: number;\n\n /**\n * Image crop in pixels from original image size.\n * @since 2.0.0\n * @type Number\n * @default\n */\n declare cropY: number;\n\n /**\n * Indicates whether this canvas will use image smoothing when painting this image.\n * Also influence if the cacheCanvas for this image uses imageSmoothing\n * @since 4.0.0-beta.11\n * @type Boolean\n * @default\n */\n declare imageSmoothing: boolean;\n\n declare preserveAspectRatio: string;\n\n protected declare src: string;\n\n declare filters: BaseFilter<string, Record<string, any>>[];\n declare resizeFilter: Resize;\n\n declare _element: ImageSource;\n declare _filteredEl?: HTMLCanvasElement;\n declare _originalElement: ImageSource;\n\n static type = 'Image';\n\n static cacheProperties = [...cacheProperties, ...IMAGE_PROPS];\n\n static ownDefaults = imageDefaultValues;\n\n static getDefaults(): Record<string, any> {\n return {\n ...super.getDefaults(),\n ...FabricImage.ownDefaults,\n };\n }\n /**\n * Constructor\n * Image can be initialized with any canvas drawable or a string.\n * The string should be a url and will be loaded as an image.\n * Canvas and Image element work out of the box, while videos require extra code to work.\n * Please check video element events for seeking.\n * @param {ImageSource | string} element Image element\n * @param {Object} [options] Options object\n */\n constructor(elementId: string, options?: Props);\n constructor(element: ImageSource, options?: Props);\n constructor(arg0: ImageSource | string, options?: Props) {\n super();\n this.filters = [];\n Object.assign(this, FabricImage.ownDefaults);\n this.setOptions(options);\n this.cacheKey = `texture${uid()}`;\n this.setElement(\n typeof arg0 === 'string'\n ? ((\n (this.canvas && getDocumentFromElement(this.canvas.getElement())) ||\n getFabricDocument()\n ).getElementById(arg0) as ImageSource)\n : arg0,\n options,\n );\n }\n\n /**\n * Returns image element which this instance if based on\n */\n getElement() {\n return this._element;\n }\n\n /**\n * Sets image element for this instance to a specified one.\n * If filters defined they are applied to new image.\n * You might need to call `canvas.renderAll` and `object.setCoords` after replacing, to render new image and update controls area.\n * @param {HTMLImageElement} element\n * @param {Partial<TSize>} [size] Options object\n */\n setElement(element: ImageSource, size: Partial<TSize> = {}) {\n this.removeTexture(this.cacheKey);\n this.removeTexture(`${this.cacheKey}_filtered`);\n this._element = element;\n this._originalElement = element;\n this._setWidthHeight(size);\n element.classList?.add(FabricImage.CSS_CANVAS);\n if (this.filters.length !== 0) {\n this.applyFilters();\n }\n // resizeFilters work on the already filtered copy.\n // we need to apply resizeFilters AFTER normal filters.\n // applyResizeFilters is run more often than normal filters\n // and is triggered by user interactions rather than dev code\n if (this.resizeFilter) {\n this.applyResizeFilters();\n }\n }\n\n /**\n * Delete a single texture if in webgl mode\n */\n removeTexture(key: string) {\n const backend = getFilterBackend(false);\n if (backend instanceof WebGLFilterBackend) {\n backend.evictCachesForKey(key);\n }\n }\n\n /**\n * Delete textures, reference to elements and eventually JSDOM cleanup\n */\n dispose() {\n super.dispose();\n this.removeTexture(this.cacheKey);\n this.removeTexture(`${this.cacheKey}_filtered`);\n this._cacheContext = null;\n (\n ['_originalElement', '_element', '_filteredEl', '_cacheCanvas'] as const\n ).forEach((elementKey) => {\n const el = this[elementKey];\n el && getEnv().dispose(el);\n // @ts-expect-error disposing\n this[elementKey] = undefined;\n });\n }\n\n /**\n * Get the crossOrigin value (of the corresponding image element)\n */\n getCrossOrigin(): string | null {\n return (\n this._originalElement &&\n ((this._originalElement as any).crossOrigin || null)\n );\n }\n\n /**\n * Returns original size of an image\n */\n getOriginalSize() {\n const element = this.getElement() as any;\n if (!element) {\n return {\n width: 0,\n height: 0,\n };\n }\n return {\n width: element.naturalWidth || element.width,\n height: element.naturalHeight || element.height,\n };\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _stroke(ctx: CanvasRenderingContext2D) {\n if (!this.stroke || this.strokeWidth === 0) {\n return;\n }\n const w = this.width / 2,\n h = this.height / 2;\n ctx.beginPath();\n ctx.moveTo(-w, -h);\n ctx.lineTo(w, -h);\n ctx.lineTo(w, h);\n ctx.lineTo(-w, h);\n ctx.lineTo(-w, -h);\n ctx.closePath();\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject<\n T extends Omit<Props & TClassProperties<this>, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick<T, K> & SProps {\n const filters: Record<string, any>[] = [];\n this.filters.forEach((filterObj) => {\n filterObj && filters.push(filterObj.toObject());\n });\n return {\n ...super.toObject([...IMAGE_PROPS, ...propertiesToInclude]),\n src: this.getSrc(),\n crossOrigin: this.getCrossOrigin(),\n filters,\n ...(this.resizeFilter\n ? { resizeFilter: this.resizeFilter.toObject() }\n : {}),\n };\n }\n\n /**\n * Returns true if an image has crop applied, inspecting values of cropX,cropY,width,height.\n * @return {Boolean}\n */\n hasCrop() {\n return (\n !!this.cropX ||\n !!this.cropY ||\n this.width < this._element.width ||\n this.height < this._element.height\n );\n }\n\n /**\n * Returns svg representation of an instance\n * @return {string[]} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const imageMarkup: string[] = [],\n element = this._element,\n x = -this.width / 2,\n y = -this.height / 2;\n let svgString: string[] = [],\n strokeSvg: string[] = [],\n clipPath = '',\n imageRendering = '';\n if (!element) {\n return [];\n }\n if (this.hasCrop()) {\n const clipPathId = uid();\n svgString.push(\n '<clipPath id=\"imageCrop_' + clipPathId + '\">\\n',\n '\\t<rect x=\"' +\n x +\n '\" y=\"' +\n y +\n '\" width=\"' +\n this.width +\n '\" height=\"' +\n this.height +\n '\" />\\n',\n '</clipPath>\\n',\n );\n clipPath = ' clip-path=\"url(#imageCrop_' + clipPathId + ')\" ';\n }\n if (!this.imageSmoothing) {\n imageRendering = ' image-rendering=\"optimizeSpeed\"';\n }\n imageMarkup.push(\n '\\t<image ',\n 'COMMON_PARTS',\n `xlink:href=\"${this.getSvgSrc(true)}\" x=\"${x - this.cropX}\" y=\"${\n y - this.cropY\n // we're essentially moving origin of transformation from top/left corner to the center of the shape\n // by wrapping it in container <g> element with actual transformation, then offsetting object to the top/left\n // so that object's center aligns with container's left/top\n }\" width=\"${\n element.width || (element as HTMLImageElement).naturalWidth\n }\" height=\"${\n element.height || (element as HTMLImageElement).naturalHeight\n }\"${imageRendering}${clipPath}></image>\\n`,\n );\n\n if (this.stroke || this.strokeDashArray) {\n const origFill = this.fill;\n this.fill = null;\n strokeSvg = [\n `\\t<rect x=\"${x}\" y=\"${y}\" width=\"${this.width}\" height=\"${\n this.height\n }\" style=\"${this.getSvgStyles()}\" />\\n`,\n ];\n this.fill = origFill;\n }\n if (this.paintFirst !== FILL) {\n svgString = svgString.concat(strokeSvg, imageMarkup);\n } else {\n svgString = svgString.concat(imageMarkup, strokeSvg);\n }\n return svgString;\n }\n\n /**\n * Returns source of an image\n * @param {Boolean} filtered indicates if the src is needed for svg\n * @return {String} Source of an image\n */\n getSrc(filtered?: boolean): string {\n const element = filtered ? this._element : this._originalElement;\n if (element) {\n if ((element as HTMLCanvasElement).toDataURL) {\n return (element as HTMLCanvasElement).toDataURL();\n }\n\n if (this.srcFromAttribute) {\n return element.getAttribute('src') || '';\n } else {\n return (element as HTMLImageElement).src;\n }\n } else {\n return this.src || '';\n }\n }\n\n /**\n * Alias for getSrc\n * @param filtered\n * @deprecated\n */\n getSvgSrc(filtered?: boolean) {\n return this.getSrc(filtered);\n }\n\n /**\n * Loads and sets source of an image\\\n * **IMPORTANT**: It is recommended to abort loading tasks before calling this method to prevent race conditions and unnecessary networking\n * @param {String} src Source string (URL)\n * @param {LoadImageOptions} [options] Options object\n */\n setSrc(src: string, { crossOrigin, signal }: LoadImageOptions = {}) {\n return loadImage(src, { crossOrigin, signal }).then((img) => {\n typeof crossOrigin !== 'undefined' && this.set({ crossOrigin });\n this.setElement(img);\n });\n }\n\n /**\n * Returns string representation of an instance\n * @return {String} String representation of an instance\n */\n toString() {\n return `#<Image: { src: \"${this.getSrc()}\" }>`;\n }\n\n applyResizeFilters() {\n const filter = this.resizeFilter,\n minimumScale = this.minimumScaleTrigger,\n objectScale = this.getTotalObjectScaling(),\n scaleX = objectScale.x,\n scaleY = objectScale.y,\n elementToFilter = this._filteredEl || this._originalElement;\n if (this.group) {\n this.set('dirty', true);\n }\n if (!filter || (scaleX > minimumScale && scaleY > minimumScale)) {\n this._element = elementToFilter;\n this._filterScalingX = 1;\n this._filterScalingY = 1;\n this._lastScaleX = scaleX;\n this._lastScaleY = scaleY;\n return;\n }\n const canvasEl = createCanvasElementFor(elementToFilter),\n { width, height } = elementToFilter;\n this._element = canvasEl;\n this._lastScaleX = filter.scaleX = scaleX;\n this._lastScaleY = filter.scaleY = scaleY;\n getFilterBackend().applyFilters(\n [filter],\n elementToFilter,\n width,\n height,\n this._element,\n );\n this._filterScalingX = canvasEl.width / this._originalElement.width;\n this._filterScalingY = canvasEl.height / this._originalElement.height;\n }\n\n /**\n * Applies filters assigned to this image (from \"filters\" array) or from filter param\n * @method applyFilters\n * @param {Array} filters to be applied\n * @param {Boolean} forResizing specify if the filter operation is a resize operation\n */\n applyFilters(\n filters: BaseFilter<string, Record<string, any>>[] = this.filters || [],\n ) {\n filters = filters.filter((filter) => filter && !filter.isNeutralState());\n this.set('dirty', true);\n\n // needs to clear out or WEBGL will not resize correctly\n this.removeTexture(`${this.cacheKey}_filtered`);\n\n if (filters.length === 0) {\n this._element = this._originalElement;\n // this is unsafe and needs to be rethinkend\n this._filteredEl = undefined;\n this._filterScalingX = 1;\n this._filterScalingY = 1;\n return;\n }\n\n const imgElement = this._originalElement,\n sourceWidth =\n (imgElement as HTMLImageElement).naturalWidth || imgElement.width,\n sourceHeight =\n (imgElement as HTMLImageElement).naturalHeight || imgElement.height;\n\n if (this._element === this._originalElement) {\n // if the _element a reference to _originalElement\n // we need to create a new element to host the filtered pixels\n const canvasEl = createCanvasElementFor({\n width: sourceWidth,\n height: sourceHeight,\n });\n this._element = canvasEl;\n this._filteredEl = canvasEl;\n } else if (this._filteredEl) {\n // if the _element is it own element,\n // and we also have a _filteredEl, then we clean up _filteredEl\n // and we assign it to _element.\n // in this way we invalidate the eventual old resize filtered element\n this._element = this._filteredEl;\n this._filteredEl\n .getContext('2d')!\n .clearRect(0, 0, sourceWidth, sourceHeight);\n // we also need to resize again at next renderAll, so remove saved _lastScaleX/Y\n this._lastScaleX = 1;\n this._lastScaleY = 1;\n }\n getFilterBackend().applyFilters(\n filters,\n this._originalElement,\n sourceWidth,\n sourceHeight,\n this._element as HTMLCanvasElement,\n this.cacheKey,\n );\n if (\n this._originalElement.width !== this._element.width ||\n this._originalElement.height !== this._element.height\n ) {\n this._filterScalingX = this._element.width / this._originalElement.width;\n this._filterScalingY =\n this._element.height / this._originalElement.height;\n }\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n ctx.imageSmoothingEnabled = this.imageSmoothing;\n if (this.isMoving !== true && this.resizeFilter && this._needsResize()) {\n this.applyResizeFilters();\n }\n this._stroke(ctx);\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Paint the cached copy of the object on the target context.\n * it will set the imageSmoothing for the draw operation\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawCacheOnCanvas(\n this: TCachedFabricObject<FabricImage>,\n ctx: CanvasRenderingContext2D,\n ) {\n ctx.imageSmoothingEnabled = this.imageSmoothing;\n super.drawCacheOnCanvas(ctx);\n }\n\n /**\n * Decide if the FabricImage should cache or not. Create its own cache level\n * needsItsOwnCache should be used when the object drawing method requires\n * a cache step.\n * Generally you do not cache objects in groups because the group outside is cached.\n * This is the special Image version where we would like to avoid caching where possible.\n * Essentially images do not benefit from caching. They may require caching, and in that\n * case we do it. Also caching an image usually ends in a loss of details.\n * A full performance audit should be done.\n * @return {Boolean}\n */\n shouldCache() {\n return this.needsItsOwnCache();\n }\n\n _renderFill(ctx: CanvasRenderingContext2D) {\n const elementToDraw = this._element;\n if (!elementToDraw) {\n return;\n }\n const scaleX = this._filterScalingX,\n scaleY = this._filterScalingY,\n w = this.width,\n h = this.height,\n // crop values cannot be lesser than 0.\n cropX = Math.max(this.cropX, 0),\n cropY = Math.max(this.cropY, 0),\n elWidth =\n (elementToDraw as HTMLImageElement).naturalWidth || elementToDraw.width,\n elHeight =\n (elementToDraw as HTMLImageElement).naturalHeight ||\n elementToDraw.height,\n sX = cropX * scaleX,\n sY = cropY * scaleY,\n // the width height cannot exceed element width/height, starting from the crop offset.\n sW = Math.min(w * scaleX, elWidth - sX),\n sH = Math.min(h * scaleY, elHeight - sY),\n x = -w / 2,\n y = -h / 2,\n maxDestW = Math.min(w, elWidth / scaleX - cropX),\n maxDestH = Math.min(h, elHeight / scaleY - cropY);\n\n elementToDraw &&\n ctx.drawImage(elementToDraw, sX, sY, sW, sH, x, y, maxDestW, maxDestH);\n }\n\n /**\n * needed to check if image needs resize\n * @private\n */\n _needsResize() {\n const scale = this.getTotalObjectScaling();\n return scale.x !== this._lastScaleX || scale.y !== this._lastScaleY;\n }\n\n /**\n * @private\n * @deprecated unused\n */\n _resetWidthHeight() {\n this.set(this.getOriginalSize());\n }\n\n /**\n * @private\n * Set the width and the height of the image object, using the element or the\n * options.\n */\n _setWidthHeight({ width, height }: Partial<TSize> = {}) {\n const size = this.getOriginalSize();\n this.width = width || size.width;\n this.height = height || size.height;\n }\n\n /**\n * Calculate offset for center and scale factor for the image in order to respect\n * the preserveAspectRatio attribute\n * @private\n */\n parsePreserveAspectRatioAttribute() {\n const pAR = parsePreserveAspectRatioAttribute(\n this.preserveAspectRatio || '',\n ),\n pWidth = this.width,\n pHeight = this.height,\n parsedAttributes = { width: pWidth, height: pHeight };\n let rWidth = this._element.width,\n rHeight = this._element.height,\n scaleX = 1,\n scaleY = 1,\n offsetLeft = 0,\n offsetTop = 0,\n cropX = 0,\n cropY = 0,\n offset;\n\n if (pAR && (pAR.alignX !== NONE || pAR.alignY !== NONE)) {\n if (pAR.meetOrSlice === 'meet') {\n scaleX = scaleY = findScaleToFit(this._element, parsedAttributes);\n offset = (pWidth - rWidth * scaleX) / 2;\n if (pAR.alignX === 'Min') {\n offsetLeft = -offset;\n }\n if (pAR.alignX === 'Max') {\n offsetLeft = offset;\n }\n offset = (pHeight - rHeight * scaleY) / 2;\n if (pAR.alignY === 'Min') {\n offsetTop = -offset;\n }\n if (pAR.alignY === 'Max') {\n offsetTop = offset;\n }\n }\n if (pAR.meetOrSlice === 'slice') {\n scaleX = scaleY = findScaleToCover(this._element, parsedAttributes);\n offset = rWidth - pWidth / scaleX;\n if (pAR.alignX === 'Mid') {\n cropX = offset / 2;\n }\n if (pAR.alignX === 'Max') {\n cropX = offset;\n }\n offset = rHeight - pHeight / scaleY;\n if (pAR.alignY === 'Mid') {\n cropY = offset / 2;\n }\n if (pAR.alignY === 'Max') {\n cropY = offset;\n }\n rWidth = pWidth / scaleX;\n rHeight = pHeight / scaleY;\n }\n } else {\n scaleX = pWidth / rWidth;\n scaleY = pHeight / rHeight;\n }\n return {\n width: rWidth,\n height: rHeight,\n scaleX,\n scaleY,\n offsetLeft,\n offsetTop,\n cropX,\n cropY,\n };\n }\n\n /**\n * Default CSS class name for canvas\n * Will be removed from fabric 7\n * @static\n * @deprecated\n * @type String\n * @default\n */\n static CSS_CANVAS = 'canvas-img';\n\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link FabricImage.fromElement})\n * @static\n * @see {@link http://www.w3.org/TR/SVG/struct.html#ImageElement}\n */\n static ATTRIBUTE_NAMES = [\n ...SHARED_ATTRIBUTES,\n 'x',\n 'y',\n 'width',\n 'height',\n 'preserveAspectRatio',\n 'xlink:href',\n 'href',\n 'crossOrigin',\n 'image-rendering',\n ];\n\n /**\n * Creates an instance of FabricImage from its object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {object} [options] Options object\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise<FabricImage>}\n */\n static fromObject<T extends TOptions<SerializedImageProps>>(\n { filters: f, resizeFilter: rf, src, crossOrigin, type, ...object }: T,\n options?: Abortable,\n ) {\n return Promise.all([\n loadImage(src!, { ...options, crossOrigin }),\n f && enlivenObjects<BaseFilter<string>>(f, options),\n // TODO: redundant - handled by enlivenObjectEnlivables\n rf && enlivenObjects<BaseFilter<'Resize'>>([rf], options),\n enlivenObjectEnlivables(object, options),\n ]).then(([el, filters = [], [resizeFilter] = [], hydratedProps = {}]) => {\n return new this(el, {\n ...object,\n // TODO: this creates a difference between image creation and restoring from JSON\n src,\n filters,\n resizeFilter,\n ...hydratedProps,\n });\n });\n }\n\n /**\n * Creates an instance of Image from an URL string\n * @static\n * @param {String} url URL to create an image from\n * @param {LoadImageOptions} [options] Options object\n * @returns {Promise<FabricImage>}\n */\n static fromURL<T extends TOptions<ImageProps>>(\n url: string,\n { crossOrigin = null, signal }: LoadImageOptions = {},\n imageOptions?: T,\n ): Promise<FabricImage> {\n return loadImage(url, { crossOrigin, signal }).then(\n (img) => new this(img, imageOptions),\n );\n }\n\n /**\n * Returns {@link FabricImage} instance from an SVG element\n * @static\n * @param {HTMLElement} element Element to parse\n * @param {Object} [options] Options object\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @param {Function} callback Callback to execute when Image object is created\n */\n static async fromElement(\n element: HTMLElement,\n options: Abortable = {},\n cssRules?: CSSRules,\n ) {\n const parsedAttributes = parseAttributes(\n element,\n this.ATTRIBUTE_NAMES,\n cssRules,\n );\n return this.fromURL(\n parsedAttributes['xlink:href'] || parsedAttributes['href'],\n options,\n parsedAttributes,\n ).catch((err) => {\n log('log', 'Unable to parse Image', err);\n return null;\n });\n }\n}\n\nclassRegistry.setClass(FabricImage);\nclassRegistry.setSVGClass(FabricImage);\n"],"names":["imageDefaultValues","strokeWidth","srcFromAttribute","minimumScaleTrigger","cropX","cropY","imageSmoothing","IMAGE_PROPS","FabricImage","FabricObject","getDefaults","_objectSpread","ownDefaults","constructor","arg0","options","_defineProperty","filters","Object","assign","setOptions","cacheKey","concat","uid","setElement","canvas","getDocumentFromElement","getElement","getFabricDocument","getElementById","_element","element","_element$classList","size","arguments","length","undefined","removeTexture","_originalElement","_setWidthHeight","classList","add","CSS_CANVAS","applyFilters","resizeFilter","applyResizeFilters","key","backend","getFilterBackend","WebGLFilterBackend","evictCachesForKey","dispose","_cacheContext","forEach","elementKey","el","getEnv","getCrossOrigin","crossOrigin","getOriginalSize","width","height","naturalWidth","naturalHeight","_stroke","ctx","stroke","w","h","beginPath","moveTo","lineTo","closePath","toObject","propertiesToInclude","filterObj","push","src","getSrc","hasCrop","_toSVG","imageMarkup","x","y","svgString","strokeSvg","clipPath","imageRendering","clipPathId","getSvgSrc","strokeDashArray","origFill","fill","getSvgStyles","paintFirst","FILL","filtered","toDataURL","getAttribute","setSrc","signal","loadImage","then","img","set","toString","filter","minimumScale","objectScale","getTotalObjectScaling","scaleX","scaleY","elementToFilter","_filteredEl","group","_filterScalingX","_filterScalingY","_lastScaleX","_lastScaleY","canvasEl","createCanvasElementFor","isNeutralState","imgElement","sourceWidth","sourceHeight","getContext","clearRect","_render","imageSmoothingEnabled","isMoving","_needsResize","_renderPaintInOrder","drawCacheOnCanvas","shouldCache","needsItsOwnCache","_renderFill","elementToDraw","Math","max","elWidth","elHeight","sX","sY","sW","min","sH","maxDestW","maxDestH","drawImage","scale","_resetWidthHeight","parsePreserveAspectRatioAttribute","pAR","preserveAspectRatio","pWidth","pHeight","parsedAttributes","rWidth","rHeight","offsetLeft","offsetTop","offset","alignX","NONE","alignY","meetOrSlice","findScaleToFit","findScaleToCover","fromObject","_ref","f","rf","type","object","_objectWithoutProperties","_excluded","Promise","all","enlivenObjects","enlivenObjectEnlivables","_ref2","hydratedProps","fromURL","url","imageOptions","fromElement","cssRules","parseAttributes","ATTRIBUTE_NAMES","catch","err","log","cacheProperties","SHARED_ATTRIBUTES","classRegistry","setClass","setSVGClass"],"mappings":"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"}