{"version":3,"file":"Image.mjs","sources":["../../../src/shapes/Image.ts"],"sourcesContent":["import { getFabricDocument, getEnv } from '../env';\nimport type { BaseFilter } from '../filters/BaseFilter';\nimport { getFilterBackend } from '../filters/FilterBackend';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type {\n  TClassProperties,\n  TCrossOrigin,\n  TSize,\n  Abortable,\n  TOptions,\n} from '../typedefs';\nimport { uid } from '../util/internals/uid';\nimport { createCanvasElementFor } from '../util/misc/dom';\nimport { findScaleToCover, findScaleToFit } from '../util/misc/findScaleTo';\nimport type { LoadImageOptions } from '../util/misc/objectEnlive';\nimport {\n  enlivenObjectEnlivables,\n  enlivenObjects,\n  loadImage,\n} from '../util/misc/objectEnlive';\nimport { parsePreserveAspectRatioAttribute } from '../util/misc/svgParsing';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport { WebGLFilterBackend } from '../filters/WebGLFilterBackend';\nimport { FILL, NONE } from '../constants';\nimport { getDocumentFromElement } from '../util/dom_misc';\nimport type { CSSRules } from '../parser/typedefs';\nimport type { Resize, ResizeSerializedProps } from '../filters/Resize';\nimport type { TCachedFabricObject } from './Object/Object';\nimport { log } from '../util/internals/console';\n\n// @todo Would be nice to have filtering code not imported directly.\n\nexport type ImageSource =\n  | HTMLImageElement\n  | HTMLVideoElement\n  | HTMLCanvasElement;\n\ninterface UniqueImageProps {\n  srcFromAttribute: boolean;\n  minimumScaleTrigger: number;\n  cropX: number;\n  cropY: number;\n  imageSmoothing: boolean;\n  filters: BaseFilter<string, Record<string, any>>[];\n  resizeFilter?: Resize;\n}\n\nexport const imageDefaultValues: Partial<TClassProperties<FabricImage>> = {\n  strokeWidth: 0,\n  srcFromAttribute: false,\n  minimumScaleTrigger: 0.5,\n  cropX: 0,\n  cropY: 0,\n  imageSmoothing: true,\n};\n\nexport interface SerializedImageProps extends SerializedObjectProps {\n  src: string;\n  crossOrigin: TCrossOrigin;\n  filters: any[];\n  resizeFilter?: ResizeSerializedProps;\n  cropX: number;\n  cropY: number;\n}\n\nexport interface ImageProps extends FabricObjectProps, UniqueImageProps {}\n\nconst IMAGE_PROPS = ['cropX', 'cropY'] as const;\n\n/**\n * @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  declare protected src: string;\n\n  declare filters: BaseFilter<string, Record<string, any>>[];\n  declare resizeFilter: Resize;\n\n  declare _element: ImageSource;\n  declare _filteredEl?: HTMLCanvasElement;\n  declare _originalElement: ImageSource;\n\n  static type = 'Image';\n\n  static cacheProperties = [...cacheProperties, ...IMAGE_PROPS];\n\n  static ownDefaults = imageDefaultValues;\n\n  static getDefaults(): Record<string, any> {\n    return {\n      ...super.getDefaults(),\n      ...FabricImage.ownDefaults,\n    };\n  }\n  /**\n   * Constructor\n   * Image can be initialized with any canvas drawable or a string.\n   * The string should be a url and will be loaded as an image.\n   * Canvas and Image element work out of the box, while videos require extra code to work.\n   * Please check video element events for seeking.\n   * @param {ImageSource | string} element Image element\n   * @param {Object} [options] Options object\n   */\n  constructor(elementId: string, options?: Props);\n  constructor(element: ImageSource, options?: Props);\n  constructor(arg0: ImageSource | string, options?: Props) {\n    super();\n    this.filters = [];\n    Object.assign(this, FabricImage.ownDefaults);\n    this.setOptions(options);\n    this.cacheKey = `texture${uid()}`;\n    this.setElement(\n      typeof arg0 === 'string'\n        ? ((\n          (this.canvas && getDocumentFromElement(this.canvas.getElement())) ||\n          getFabricDocument()\n        ).getElementById(arg0) as ImageSource)\n        : arg0,\n      options,\n    );\n  }\n\n  /**\n   * Returns image element which this instance if based on\n   */\n  getElement() {\n    return this._element;\n  }\n\n  /**\n   * Sets image element for this instance to a specified one.\n   * If filters defined they are applied to new image.\n   * You might need to call `canvas.renderAll` and `object.setCoords` after replacing, to render new image and update controls area.\n   * @param {HTMLImageElement} element\n   * @param {Partial<TSize>} [size] Options object\n   */\n  setElement(element: ImageSource, size: Partial<TSize> = {}) {\n    this.removeTexture(this.cacheKey);\n    this.removeTexture(`${this.cacheKey}_filtered`);\n    this._element = element;\n    this._originalElement = element;\n    this._setWidthHeight(size);\n    if (this.filters.length !== 0) {\n      this.applyFilters();\n    }\n    // resizeFilters work on the already filtered copy.\n    // we need to apply resizeFilters AFTER normal filters.\n    // applyResizeFilters is run more often than normal filters\n    // and is triggered by user interactions rather than dev code\n    if (this.resizeFilter) {\n      this.applyResizeFilters();\n    }\n  }\n\n  /**\n   * Delete a single texture if in webgl mode\n   */\n  removeTexture(key: string) {\n    const backend = getFilterBackend(false);\n    if (backend instanceof WebGLFilterBackend) {\n      backend.evictCachesForKey(key);\n    }\n  }\n\n  /**\n   * Delete textures, reference to elements and eventually JSDOM cleanup\n   */\n  dispose() {\n    super.dispose();\n    this.removeTexture(this.cacheKey);\n    this.removeTexture(`${this.cacheKey}_filtered`);\n    this._cacheContext = null;\n    (\n      ['_originalElement', '_element', '_filteredEl', '_cacheCanvas'] as const\n    ).forEach((elementKey) => {\n      const el = this[elementKey];\n      el && getEnv().dispose(el);\n      // @ts-expect-error disposing\n      this[elementKey] = undefined;\n    });\n  }\n\n  /**\n   * Get the crossOrigin value (of the corresponding image element)\n   */\n  getCrossOrigin(): string | null {\n    return (\n      this._originalElement &&\n      ((this._originalElement as any).crossOrigin || null)\n    );\n  }\n\n  /**\n   * Returns original size of an image\n   */\n  getOriginalSize() {\n    const element = this.getElement() as any;\n    if (!element) {\n      return {\n        width: 0,\n        height: 0,\n      };\n    }\n    return {\n      width: element.naturalWidth || element.width,\n      height: element.naturalHeight || element.height,\n    };\n  }\n\n  /**\n   * @private\n   * @param {CanvasRenderingContext2D} ctx Context to render on\n   */\n  _stroke(ctx: CanvasRenderingContext2D) {\n    if (!this.stroke || this.strokeWidth === 0) {\n      return;\n    }\n    const w = this.width / 2,\n      h = this.height / 2;\n    ctx.beginPath();\n    ctx.moveTo(-w, -h);\n    ctx.lineTo(w, -h);\n    ctx.lineTo(w, h);\n    ctx.lineTo(-w, h);\n    ctx.lineTo(-w, -h);\n    ctx.closePath();\n  }\n\n  /**\n   * Returns object representation of an instance\n   * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n   * @return {Object} Object representation of an instance\n   */\n  toObject<\n    T extends Omit<Props & TClassProperties<this>, keyof SProps>,\n    K extends keyof T = never,\n  >(propertiesToInclude: K[] = []): Pick<T, K> & SProps {\n    const filters: Record<string, any>[] = [];\n    this.filters.forEach((filterObj) => {\n      filterObj && filters.push(filterObj.toObject());\n    });\n    return {\n      ...super.toObject([...IMAGE_PROPS, ...propertiesToInclude]),\n      src: this.getSrc(),\n      crossOrigin: this.getCrossOrigin(),\n      filters,\n      ...(this.resizeFilter\n        ? { resizeFilter: this.resizeFilter.toObject() }\n        : {}),\n    };\n  }\n\n  /**\n   * Returns true if an image has crop applied, inspecting values of cropX,cropY,width,height.\n   * @return {Boolean}\n   */\n  hasCrop() {\n    return (\n      !!this.cropX ||\n      !!this.cropY ||\n      this.width < this._element.width ||\n      this.height < this._element.height\n    );\n  }\n\n  /**\n   * Returns svg representation of an instance\n   * @return {string[]} an array of strings with the specific svg representation\n   * of the instance\n   */\n  _toSVG() {\n    const imageMarkup: string[] = [],\n      element = this._element,\n      x = -this.width / 2,\n      y = -this.height / 2;\n    let svgString: string[] = [],\n      strokeSvg: string[] = [],\n      clipPath = '',\n      imageRendering = '';\n    if (!element) {\n      return [];\n    }\n    if (this.hasCrop()) {\n      const clipPathId = uid();\n      svgString.push(\n        '<clipPath id=\"imageCrop_' + clipPathId + '\">\\n',\n        '\\t<rect x=\"' +\n        x +\n        '\" y=\"' +\n        y +\n        '\" width=\"' +\n        this.width +\n        '\" height=\"' +\n        this.height +\n        '\" />\\n',\n        '</clipPath>\\n',\n      );\n      clipPath = ' clip-path=\"url(#imageCrop_' + clipPathId + ')\" ';\n    }\n    if (!this.imageSmoothing) {\n      imageRendering = ' image-rendering=\"optimizeSpeed\"';\n    }\n    imageMarkup.push(\n      '\\t<image ',\n      'COMMON_PARTS',\n      `xlink:href=\"${this.getSvgSrc(true)}\" x=\"${x - this.cropX}\" y=\"${\n        y - this.cropY\n        // we're essentially moving origin of transformation from top/left corner to the center of the shape\n        // by wrapping it in container <g> element with actual transformation, then offsetting object to the top/left\n        // so that object's center aligns with container's left/top\n      }\" width=\"${\n        element.width || (element as HTMLImageElement).naturalWidth\n      }\" height=\"${\n        element.height || (element as HTMLImageElement).naturalHeight\n      }\"${imageRendering}${clipPath}></image>\\n`,\n    );\n\n    if (this.stroke || this.strokeDashArray) {\n      const origFill = this.fill;\n      this.fill = null;\n      strokeSvg = [\n        `\\t<rect x=\"${x}\" y=\"${y}\" width=\"${this.width}\" height=\"${\n          this.height\n        }\" style=\"${this.getSvgStyles()}\" />\\n`,\n      ];\n      this.fill = origFill;\n    }\n    if (this.paintFirst !== FILL) {\n      svgString = svgString.concat(strokeSvg, imageMarkup);\n    } else {\n      svgString = svgString.concat(imageMarkup, strokeSvg);\n    }\n    return svgString;\n  }\n\n  /**\n   * Returns source of an image\n   * @param {Boolean} filtered indicates if the src is needed for svg\n   * @return {String} Source of an image\n   */\n  getSrc(filtered?: boolean): string {\n    const element = filtered ? this._element : this._originalElement;\n    if (element) {\n      if ((element as HTMLCanvasElement).toDataURL) {\n        return (element as HTMLCanvasElement).toDataURL();\n      }\n\n      if (this.srcFromAttribute) {\n        return element.getAttribute('src') || '';\n      } else {\n        return (element as HTMLImageElement).src;\n      }\n    } else {\n      return this.src || '';\n    }\n  }\n\n  /**\n   * Alias for getSrc\n   * @param filtered\n   * @deprecated\n   */\n  getSvgSrc(filtered?: boolean) {\n    return this.getSrc(filtered);\n  }\n\n  /**\n   * Loads and sets source of an image\\\n   * **IMPORTANT**: It is recommended to abort loading tasks before calling this method to prevent race conditions and unnecessary networking\n   * @param {String} src Source string (URL)\n   * @param {LoadImageOptions} [options] Options object\n   */\n  setSrc(src: string, { crossOrigin, signal }: LoadImageOptions = {}) {\n    return loadImage(src, { crossOrigin, signal }).then((img) => {\n      typeof crossOrigin !== 'undefined' && this.set({ crossOrigin });\n      this.setElement(img);\n    });\n  }\n\n  /**\n   * Returns string representation of an instance\n   * @return {String} String representation of an instance\n   */\n  toString() {\n    return `#<Image: { src: \"${this.getSrc()}\" }>`;\n  }\n\n  applyResizeFilters() {\n    const filter = this.resizeFilter,\n      minimumScale = this.minimumScaleTrigger,\n      objectScale = this.getTotalObjectScaling(),\n      scaleX = objectScale.x,\n      scaleY = objectScale.y,\n      elementToFilter = this._filteredEl || this._originalElement;\n    if (this.group) {\n      this.set('dirty', true);\n    }\n    if (!filter || (scaleX > minimumScale && scaleY > minimumScale)) {\n      this._element = elementToFilter;\n      this._filterScalingX = 1;\n      this._filterScalingY = 1;\n      this._lastScaleX = scaleX;\n      this._lastScaleY = scaleY;\n      return;\n    }\n    const canvasEl = createCanvasElementFor(elementToFilter),\n      { width, height } = elementToFilter;\n    this._element = canvasEl;\n    this._lastScaleX = filter.scaleX = scaleX;\n    this._lastScaleY = filter.scaleY = scaleY;\n    getFilterBackend().applyFilters(\n      [filter],\n      elementToFilter,\n      width,\n      height,\n      this._element,\n    );\n    this._filterScalingX = canvasEl.width / this._originalElement.width;\n    this._filterScalingY = canvasEl.height / this._originalElement.height;\n  }\n\n  /**\n   * Applies filters assigned to this image (from \"filters\" array) or from filter param\n   * @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    //*PMW* Return here because filters need to be applied on each frame render for videos\n    if (imgElement.nodeName === 'VIDEO') {\n      return this;\n    }\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    let 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    //*PMW* if video apply filter on each frame draw\n    if (this._element.nodeName === 'VIDEO') {\n      elementToDraw = this._applyVideoFilter(this._element as HTMLVideoElement);\n    }\n\n    elementToDraw &&\n      ctx.drawImage(elementToDraw, sX, sY, sW, sH, x, y, maxDestW, maxDestH);\n  }\n\n  /**\n   * *PMW* function added\n   * Applies filter of video element using webgl backend\n   * @param elementToDraw\n   * @return {*|CanvasElement}\n   * @private\n   */\n  _applyVideoFilter(elementToDraw: HTMLVideoElement) {\n    let filters = this.filters || [];\n    filters = filters.filter(function (filter) {\n      return filter;\n    });\n\n    if (filters.length === 0) {\n      this._element = this._originalElement;\n      this._filteredEl = undefined;\n      this._filterScalingX = 1;\n      this._filterScalingY = 1;\n      return this._element;\n    }\n\n    const videoEl = elementToDraw,\n      sourceWidth =  videoEl.width,\n      sourceHeight = videoEl.height;\n\n    if (this._element === videoEl) {\n      // if the element is the same we need to create a new element\n      const canvasEl = createCanvasElementFor({\n        width: sourceWidth,\n        height: sourceHeight,\n      });\n      this._element = canvasEl;\n      this._filteredEl = canvasEl;\n    } else {\n      // clear the existing element to get new filter data\n      (this._element as HTMLCanvasElement).getContext('2d')?.clearRect(0, 0, sourceWidth, sourceHeight);\n    }\n\n    getFilterBackend().applyFilters(\n      filters,\n      this._originalElement,\n      sourceWidth,\n      sourceHeight,\n      this._element as HTMLCanvasElement,\n    );\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    const modifiedElementToDraw = this._element;\n    this._element = videoEl;\n    return modifiedElementToDraw;\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   * 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      // redundant - handled by enlivenObjectEnlivables, but nicely explicit\n      rf ? enlivenObjects<Resize>([rf], options) : [],\n      enlivenObjectEnlivables(object, options),\n    ]).then(([el, filters = [], [resizeFilter], hydratedProps = {}]) => {\n      return new this(el, {\n        ...object,\n        // TODO: passing src creates a difference between image creation and restoring from JSON\n        src,\n        filters,\n        resizeFilter,\n        ...hydratedProps,\n      });\n    });\n  }\n\n  /**\n   * Creates an instance of Image from an URL string\n   * @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","ownDefaults","constructor","arg0","options","_defineProperty","filters","Object","assign","setOptions","cacheKey","uid","setElement","canvas","getDocumentFromElement","getElement","getFabricDocument","getElementById","_element","element","size","arguments","length","undefined","removeTexture","_originalElement","_setWidthHeight","applyFilters","resizeFilter","applyResizeFilters","key","backend","getFilterBackend","WebGLFilterBackend","evictCachesForKey","dispose","_cacheContext","forEach","elementKey","el","getEnv","getCrossOrigin","crossOrigin","getOriginalSize","width","height","naturalWidth","naturalHeight","_stroke","ctx","stroke","w","h","beginPath","moveTo","lineTo","closePath","toObject","propertiesToInclude","filterObj","push","src","getSrc","hasCrop","_toSVG","imageMarkup","x","y","svgString","strokeSvg","clipPath","imageRendering","clipPathId","getSvgSrc","strokeDashArray","origFill","fill","getSvgStyles","paintFirst","FILL","concat","filtered","toDataURL","getAttribute","setSrc","signal","loadImage","then","img","set","toString","filter","minimumScale","objectScale","getTotalObjectScaling","scaleX","scaleY","elementToFilter","_filteredEl","group","_filterScalingX","_filterScalingY","_lastScaleX","_lastScaleY","canvasEl","createCanvasElementFor","isNeutralState","imgElement","sourceWidth","sourceHeight","nodeName","getContext","clearRect","_render","imageSmoothingEnabled","isMoving","_needsResize","_renderPaintInOrder","drawCacheOnCanvas","shouldCache","needsItsOwnCache","_renderFill","elementToDraw","Math","max","elWidth","elHeight","sX","sY","sW","min","sH","maxDestW","maxDestH","_applyVideoFilter","drawImage","videoEl","_getContext","modifiedElementToDraw","scale","_resetWidthHeight","parsePreserveAspectRatioAttribute","pAR","preserveAspectRatio","pWidth","pHeight","parsedAttributes","rWidth","rHeight","offsetLeft","offsetTop","offset","alignX","NONE","alignY","meetOrSlice","findScaleToFit","findScaleToCover","fromObject","_ref","f","rf","type","object","Promise","all","enlivenObjects","enlivenObjectEnlivables","_ref2","hydratedProps","fromURL","url","imageOptions","fromElement","cssRules","parseAttributes","ATTRIBUTE_NAMES","catch","err","log","cacheProperties","SHARED_ATTRIBUTES","classRegistry","setClass","setSVGClass"],"mappings":"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"}