fabric-vectr 6.7.11 → 6.7.13

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.
Files changed (52) hide show
  1. package/dist/index.js +34 -9
  2. package/dist/index.js.map +1 -1
  3. package/dist/index.min.js +1 -1
  4. package/dist/index.min.js.map +1 -1
  5. package/dist/index.min.mjs +1 -1
  6. package/dist/index.min.mjs.map +1 -1
  7. package/dist/index.mjs +34 -9
  8. package/dist/index.mjs.map +1 -1
  9. package/dist/index.node.cjs +34 -9
  10. package/dist/index.node.cjs.map +1 -1
  11. package/dist/index.node.d.ts +6 -6
  12. package/dist/index.node.mjs +34 -9
  13. package/dist/index.node.mjs.map +1 -1
  14. package/dist/package.json.min.mjs +1 -1
  15. package/dist/package.json.mjs +1 -1
  16. package/dist/src/Pattern/Pattern.d.ts.map +1 -1
  17. package/dist/src/Pattern/Pattern.min.mjs +1 -1
  18. package/dist/src/Pattern/Pattern.min.mjs.map +1 -1
  19. package/dist/src/Pattern/Pattern.mjs +5 -1
  20. package/dist/src/Pattern/Pattern.mjs.map +1 -1
  21. package/dist/src/shapes/Group.d.ts.map +1 -1
  22. package/dist/src/shapes/Group.min.mjs +1 -1
  23. package/dist/src/shapes/Group.min.mjs.map +1 -1
  24. package/dist/src/shapes/Group.mjs +11 -1
  25. package/dist/src/shapes/Group.mjs.map +1 -1
  26. package/dist/src/shapes/Image.d.ts +2 -2
  27. package/dist/src/shapes/Image.d.ts.map +1 -1
  28. package/dist/src/shapes/Image.min.mjs +1 -1
  29. package/dist/src/shapes/Image.min.mjs.map +1 -1
  30. package/dist/src/shapes/Image.mjs +4 -2
  31. package/dist/src/shapes/Image.mjs.map +1 -1
  32. package/dist/src/util/misc/objectEnlive.d.ts +6 -1
  33. package/dist/src/util/misc/objectEnlive.d.ts.map +1 -1
  34. package/dist/src/util/misc/objectEnlive.min.mjs +1 -1
  35. package/dist/src/util/misc/objectEnlive.min.mjs.map +1 -1
  36. package/dist/src/util/misc/objectEnlive.mjs +16 -5
  37. package/dist/src/util/misc/objectEnlive.mjs.map +1 -1
  38. package/dist-extensions/src/Pattern/Pattern.d.ts.map +1 -1
  39. package/dist-extensions/src/shapes/Group.d.ts.map +1 -1
  40. package/dist-extensions/src/shapes/Image.d.ts +2 -2
  41. package/dist-extensions/src/shapes/Image.d.ts.map +1 -1
  42. package/dist-extensions/src/util/misc/objectEnlive.d.ts +6 -1
  43. package/dist-extensions/src/util/misc/objectEnlive.d.ts.map +1 -1
  44. package/package.json +1 -1
  45. package/src/Pattern/Pattern.spec.ts +63 -0
  46. package/src/Pattern/Pattern.ts +3 -1
  47. package/src/shapes/Group.spec.ts +40 -0
  48. package/src/shapes/Group.ts +20 -1
  49. package/src/shapes/Image.spec.ts +21 -2
  50. package/src/shapes/Image.ts +24 -12
  51. package/src/util/misc/objectEnlive.spec.ts +49 -2
  52. package/src/util/misc/objectEnlive.ts +29 -5
@@ -1 +1 @@
1
- {"version":3,"file":"Group.mjs","sources":["../../../src/shapes/Group.ts"],"sourcesContent":["import type { CollectionEvents, ObjectEvents } from '../EventTypeDefs';\nimport { createCollectionMixin } from '../Collection';\nimport type {\n TClassProperties,\n TSVGReviver,\n TOptions,\n Abortable,\n} from '../typedefs';\nimport {\n invertTransform,\n multiplyTransformMatrices,\n} from '../util/misc/matrix';\nimport {\n enlivenObjectEnlivables,\n enlivenObjects,\n} from '../util/misc/objectEnlive';\nimport { applyTransformToObject } from '../util/misc/objectTransforms';\nimport { FabricObject } from './Object/FabricObject';\nimport { Rect } from './Rect';\nimport { classRegistry } from '../ClassRegistry';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport { log } from '../util/internals/console';\nimport type {\n ImperativeLayoutOptions,\n LayoutBeforeEvent,\n LayoutAfterEvent,\n} from '../LayoutManager/types';\nimport { LayoutManager } from '../LayoutManager/LayoutManager';\nimport {\n LAYOUT_TYPE_ADDED,\n LAYOUT_TYPE_IMPERATIVE,\n LAYOUT_TYPE_INITIALIZATION,\n LAYOUT_TYPE_REMOVED,\n} from '../LayoutManager/constants';\nimport type { SerializedLayoutManager } from '../LayoutManager/LayoutManager';\nimport type { FitContentLayout } from '../LayoutManager';\nimport type { DrawContext } from './Object/Object';\n\n/**\n * This class handles the specific case of creating a group using {@link Group#fromObject} and is not meant to be used in any other case.\n * We could have used a boolean in the constructor, as we did previously, but we think the boolean\n * would stay in the group's constructor interface and create confusion, therefore it was removed.\n * This layout manager doesn't do anything and therefore keeps the exact layout the group had when {@link Group#toObject} was called.\n */\nclass NoopLayoutManager extends LayoutManager {\n performLayout() {}\n}\n\nexport interface GroupEvents extends ObjectEvents, CollectionEvents {\n 'layout:before': LayoutBeforeEvent;\n 'layout:after': LayoutAfterEvent;\n}\n\nexport interface GroupOwnProps {\n subTargetCheck: boolean;\n interactive: boolean;\n}\n\nexport interface SerializedGroupProps\n extends SerializedObjectProps,\n GroupOwnProps {\n objects: SerializedObjectProps[];\n layoutManager: SerializedLayoutManager;\n}\n\nexport interface GroupProps extends FabricObjectProps, GroupOwnProps {\n layoutManager: LayoutManager;\n}\n\nexport const groupDefaultValues: Partial<TClassProperties<Group>> = {\n strokeWidth: 0,\n subTargetCheck: false,\n interactive: false,\n};\n\n/**\n * @fires object:added\n * @fires object:removed\n * @fires layout:before\n * @fires layout:after\n */\nexport class Group\n extends createCollectionMixin(\n FabricObject<GroupProps, SerializedGroupProps, GroupEvents>,\n )\n implements GroupProps\n{\n /**\n * Used to optimize performance\n * set to `false` if you don't need contained objects to be targets of events\n * @default\n * @type boolean\n */\n declare subTargetCheck: boolean;\n\n /**\n * Used to allow targeting of object inside groups.\n * set to true if you want to select an object inside a group.\\\n * **REQUIRES** `subTargetCheck` set to true\n * This will be not removed but slowly replaced with a method setInteractive\n * that will take care of enabling subTargetCheck and necessary object events.\n * There is too much attached to group interactivity to just be evaluated by a\n * boolean in the code\n * @default\n * @deprecated\n * @type boolean\n */\n declare interactive: boolean;\n\n declare layoutManager: LayoutManager;\n\n /**\n * Used internally to optimize performance\n * Once an object is selected, instance is rendered without the selected object.\n * This way instance is cached only once for the entire interaction with the selected object.\n * @private\n */\n protected _activeObjects: FabricObject[] = [];\n\n static type = 'Group';\n\n static ownDefaults: Record<string, any> = groupDefaultValues;\n private __objectSelectionTracker: (ev: ObjectEvents['selected']) => void;\n private __objectSelectionDisposer: (ev: ObjectEvents['deselected']) => void;\n\n static getDefaults(): Record<string, any> {\n return {\n ...super.getDefaults(),\n ...Group.ownDefaults,\n };\n }\n\n /**\n * Constructor\n *\n * @param {FabricObject[]} [objects] instance objects\n * @param {Object} [options] Options object\n */\n constructor(objects: FabricObject[] = [], options: Partial<GroupProps> = {}) {\n super();\n Object.assign(this, Group.ownDefaults);\n this.setOptions(options);\n this.groupInit(objects, options);\n }\n\n /**\n * Shared code between group and active selection\n * Meant to be used by the constructor.\n */\n protected groupInit(\n objects: FabricObject[],\n options: {\n layoutManager?: LayoutManager;\n top?: number;\n left?: number;\n },\n ) {\n this._objects = [...objects]; // Avoid unwanted mutations of Collection to affect the caller\n\n this.__objectSelectionTracker = this.__objectSelectionMonitor.bind(\n this,\n true,\n );\n this.__objectSelectionDisposer = this.__objectSelectionMonitor.bind(\n this,\n false,\n );\n\n this.forEachObject((object) => {\n this.enterGroup(object, false);\n });\n\n // perform initial layout\n this.layoutManager = options.layoutManager ?? new LayoutManager();\n this.layoutManager.performLayout({\n type: LAYOUT_TYPE_INITIALIZATION,\n target: this,\n targets: [...objects],\n // @TODO remove this concept from the layout manager.\n // Layout manager will calculate the correct position,\n // group options can override it later.\n x: options.left,\n y: options.top,\n });\n }\n\n /**\n * Checks if object can enter group and logs relevant warnings\n * @private\n * @param {FabricObject} object\n * @returns\n */\n canEnterGroup(object: FabricObject) {\n if (object === this || this.isDescendantOf(object)) {\n // prevent circular object tree\n log(\n 'error',\n 'Group: circular object trees are not supported, this call has no effect',\n );\n return false;\n } else if (this._objects.indexOf(object) !== -1) {\n // is already in the objects array\n log(\n 'error',\n 'Group: duplicate objects are not supported inside group, this call has no effect',\n );\n return false;\n }\n return true;\n }\n\n /**\n * Override this method to enhance performance (for groups with a lot of objects).\n * If Overriding, be sure not pass illegal objects to group - it will break your app.\n * @private\n */\n protected _filterObjectsBeforeEnteringGroup(objects: FabricObject[]) {\n return objects.filter((object, index, array) => {\n // can enter AND is the first occurrence of the object in the passed args (to prevent adding duplicates)\n return this.canEnterGroup(object) && array.indexOf(object) === index;\n });\n }\n\n /**\n * Add objects\n * @param {...FabricObject[]} objects\n */\n add(...objects: FabricObject[]) {\n const allowedObjects = this._filterObjectsBeforeEnteringGroup(objects);\n const size = super.add(...allowedObjects);\n this._onAfterObjectsChange(LAYOUT_TYPE_ADDED, allowedObjects);\n return size;\n }\n\n /**\n * Inserts an object into collection at specified index\n * @param {FabricObject[]} objects Object to insert\n * @param {Number} index Index to insert object at\n */\n insertAt(index: number, ...objects: FabricObject[]) {\n const allowedObjects = this._filterObjectsBeforeEnteringGroup(objects);\n const size = super.insertAt(index, ...allowedObjects);\n this._onAfterObjectsChange(LAYOUT_TYPE_ADDED, allowedObjects);\n return size;\n }\n\n /**\n * Remove objects\n * @param {...FabricObject[]} objects\n * @returns {FabricObject[]} removed objects\n */\n remove(...objects: FabricObject[]) {\n const removed = super.remove(...objects);\n this._onAfterObjectsChange(LAYOUT_TYPE_REMOVED, removed);\n return removed;\n }\n\n _onObjectAdded(object: FabricObject) {\n this.enterGroup(object, true);\n this.fire('object:added', { target: object });\n object.fire('added', { target: this });\n }\n\n /**\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it\n */\n _onObjectRemoved(object: FabricObject, removeParentTransform?: boolean) {\n this.exitGroup(object, removeParentTransform);\n this.fire('object:removed', { target: object });\n object.fire('removed', { target: this });\n }\n\n /**\n * @private\n * @param {'added'|'removed'} type\n * @param {FabricObject[]} targets\n */\n _onAfterObjectsChange(type: 'added' | 'removed', targets: FabricObject[]) {\n this.layoutManager.performLayout({\n type,\n targets,\n target: this,\n });\n }\n\n _onStackOrderChanged() {\n this._set('dirty', true);\n }\n\n /**\n * @private\n * @param {string} key\n * @param {*} value\n */\n _set(key: string, value: any) {\n const prev = this[key as keyof this];\n super._set(key, value);\n if (key === 'canvas' && prev !== value) {\n (this._objects || []).forEach((object) => {\n object._set(key, value);\n });\n }\n return this;\n }\n\n /**\n * @private\n */\n _shouldSetNestedCoords() {\n return this.subTargetCheck;\n }\n\n /**\n * Remove all objects\n * @returns {FabricObject[]} removed objects\n */\n removeAll() {\n this._activeObjects = [];\n return this.remove(...this._objects);\n }\n\n /**\n * keeps track of the selected objects\n * @private\n */\n __objectSelectionMonitor<T extends boolean>(\n selected: T,\n {\n target: object,\n }: ObjectEvents[T extends true ? 'selected' : 'deselected'],\n ) {\n const activeObjects = this._activeObjects;\n if (selected) {\n activeObjects.push(object);\n this._set('dirty', true);\n } else if (activeObjects.length > 0) {\n const index = activeObjects.indexOf(object);\n if (index > -1) {\n activeObjects.splice(index, 1);\n this._set('dirty', true);\n }\n }\n }\n\n /**\n * @private\n * @param {boolean} watch\n * @param {FabricObject} object\n */\n _watchObject(watch: boolean, object: FabricObject) {\n // make sure we listen only once\n watch && this._watchObject(false, object);\n if (watch) {\n object.on('selected', this.__objectSelectionTracker);\n object.on('deselected', this.__objectSelectionDisposer);\n } else {\n object.off('selected', this.__objectSelectionTracker);\n object.off('deselected', this.__objectSelectionDisposer);\n }\n }\n\n /**\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object is in canvas coordinate plane\n */\n enterGroup(object: FabricObject, removeParentTransform?: boolean) {\n object.group && object.group.remove(object);\n object._set('parent', this);\n this._enterGroup(object, removeParentTransform);\n }\n\n /**\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object is in canvas coordinate plane\n */\n _enterGroup(object: FabricObject, removeParentTransform?: boolean) {\n if (removeParentTransform) {\n // can this be converted to utils (sendObjectToPlane)?\n applyTransformToObject(\n object,\n multiplyTransformMatrices(\n invertTransform(this.calcTransformMatrix()),\n object.calcTransformMatrix(),\n ),\n );\n }\n this._shouldSetNestedCoords() && object.setCoords();\n object._set('group', this);\n object._set('canvas', this.canvas);\n this._watchObject(true, object);\n const activeObject =\n this.canvas &&\n this.canvas.getActiveObject &&\n this.canvas.getActiveObject();\n // if we are adding the activeObject in a group\n if (\n activeObject &&\n (activeObject === object || object.isDescendantOf(activeObject))\n ) {\n this._activeObjects.push(object);\n }\n }\n\n /**\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it\n */\n exitGroup(object: FabricObject, removeParentTransform?: boolean) {\n this._exitGroup(object, removeParentTransform);\n object._set('parent', undefined);\n object._set('canvas', undefined);\n }\n\n /**\n * Executes the inner fabric logic of exiting a group.\n * - Stop watching the object\n * - Remove the object from the optimization map this._activeObjects\n * - unset the group property of the object\n * @protected\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it\n */\n _exitGroup(object: FabricObject, removeParentTransform?: boolean) {\n object._set('group', undefined);\n if (!removeParentTransform) {\n applyTransformToObject(\n object,\n multiplyTransformMatrices(\n this.calcTransformMatrix(),\n object.calcTransformMatrix(),\n ),\n );\n object.setCoords();\n }\n this._watchObject(false, object);\n const index =\n this._activeObjects.length > 0 ? this._activeObjects.indexOf(object) : -1;\n if (index > -1) {\n this._activeObjects.splice(index, 1);\n }\n }\n\n /**\n * Decide if the group 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 is already cached.\n * @return {Boolean}\n */\n shouldCache() {\n const ownCache = FabricObject.prototype.shouldCache.call(this);\n if (ownCache) {\n for (let i = 0; i < this._objects.length; i++) {\n if (\n this._objects[i].willDrawShadow() ||\n this._objects[i].preventGroupCache\n ) {\n this.ownCaching = false;\n return false;\n }\n }\n }\n return ownCache;\n }\n\n /**\n * Check if this object or a child object will cast a shadow\n * @return {Boolean}\n */\n willDrawShadow() {\n if (super.willDrawShadow()) {\n return true;\n }\n for (let i = 0; i < this._objects.length; i++) {\n if (this._objects[i].willDrawShadow()) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Check if instance or its group are caching, recursively up\n * @return {Boolean}\n */\n isOnACache(): boolean {\n return this.ownCaching || (!!this.parent && this.parent.isOnACache());\n }\n\n /**\n * Execute the drawing operation for an object on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawObject(\n ctx: CanvasRenderingContext2D,\n forClipping: boolean | undefined,\n context: DrawContext,\n ) {\n this._renderBackground(ctx);\n for (let i = 0; i < this._objects.length; i++) {\n const obj = this._objects[i];\n // TODO: handle rendering edge case somehow\n if (this.canvas?.preserveObjectStacking && obj.group !== this) {\n ctx.save();\n ctx.transform(...invertTransform(this.calcTransformMatrix()));\n obj.render(ctx);\n ctx.restore();\n } else if (obj.group === this) {\n obj.render(ctx);\n }\n }\n this._drawClipPath(ctx, this.clipPath, context);\n }\n\n /**\n * @override\n * @return {Boolean}\n */\n setCoords() {\n super.setCoords();\n this._shouldSetNestedCoords() &&\n this.forEachObject((object) => object.setCoords());\n }\n\n triggerLayout(options: ImperativeLayoutOptions = {}) {\n this.layoutManager.performLayout({\n target: this,\n type: LAYOUT_TYPE_IMPERATIVE,\n ...options,\n });\n }\n\n /**\n * Renders instance on a given context\n * @param {CanvasRenderingContext2D} ctx context to render instance on\n */\n render(ctx: CanvasRenderingContext2D) {\n this._transformDone = true;\n super.render(ctx);\n this._transformDone = false;\n }\n\n /**\n *\n * @private\n * @param {'toObject'|'toDatalessObject'} [method]\n * @param {string[]} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @returns {FabricObject[]} serialized objects\n */\n __serializeObjects(\n method: 'toObject' | 'toDatalessObject',\n propertiesToInclude?: string[],\n ) {\n const _includeDefaultValues = this.includeDefaultValues;\n return this._objects\n .filter(function (obj) {\n return !obj.excludeFromExport;\n })\n .map(function (obj) {\n const originalDefaults = obj.includeDefaultValues;\n obj.includeDefaultValues = _includeDefaultValues;\n const data = obj[method || 'toObject'](propertiesToInclude);\n obj.includeDefaultValues = originalDefaults;\n // delete data.version;\n return data;\n });\n }\n\n /**\n * Returns object representation of an instance\n * @param {string[]} [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<\n GroupProps & TClassProperties<this>,\n keyof SerializedGroupProps\n >,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick<T, K> & SerializedGroupProps {\n const layoutManager = this.layoutManager.toObject();\n\n return {\n ...super.toObject([\n 'subTargetCheck',\n 'interactive',\n ...propertiesToInclude,\n ]),\n ...(layoutManager.strategy !== 'fit-content' || this.includeDefaultValues\n ? { layoutManager }\n : {}),\n objects: this.__serializeObjects(\n 'toObject',\n propertiesToInclude as string[],\n ),\n };\n }\n\n toString() {\n return `#<Group: (${this.complexity()})>`;\n }\n\n dispose() {\n this.layoutManager.unsubscribeTargets({\n targets: this.getObjects(),\n target: this,\n });\n this._activeObjects = [];\n this.forEachObject((object) => {\n this._watchObject(false, object);\n object.dispose();\n });\n super.dispose();\n }\n\n /**\n * @private\n */\n _createSVGBgRect(reviver?: TSVGReviver) {\n if (!this.backgroundColor) {\n return '';\n }\n const fillStroke = Rect.prototype._toSVG.call(this);\n const commons = fillStroke.indexOf('COMMON_PARTS');\n fillStroke[commons] = 'for=\"group\" ';\n const markup = fillStroke.join('');\n return reviver ? reviver(markup) : markup;\n }\n\n /**\n * Returns svg representation of an instance\n * @param {TSVGReviver} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n _toSVG(reviver?: TSVGReviver) {\n const svgString = ['<g ', 'COMMON_PARTS', ' >\\n'];\n const bg = this._createSVGBgRect(reviver);\n bg && svgString.push('\\t\\t', bg);\n for (let i = 0; i < this._objects.length; i++) {\n svgString.push('\\t\\t', this._objects[i].toSVG(reviver));\n }\n svgString.push('</g>\\n');\n return svgString;\n }\n\n /**\n * Returns styles-string for svg-export, specific version for group\n * @return {String}\n */\n getSvgStyles(): string {\n const opacity =\n typeof this.opacity !== 'undefined' && this.opacity !== 1\n ? `opacity: ${this.opacity};`\n : '',\n visibility = this.visible ? '' : ' visibility: hidden;';\n return [opacity, this.getSvgFilter(), visibility].join('');\n }\n\n /**\n * Returns svg clipPath representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toClipPathSVG(reviver?: TSVGReviver): string {\n const svgString = [];\n const bg = this._createSVGBgRect(reviver);\n bg && svgString.push('\\t', bg);\n for (let i = 0; i < this._objects.length; i++) {\n svgString.push('\\t', this._objects[i].toClipPathSVG(reviver));\n }\n return this._createBaseClipPathSVGMarkup(svgString, {\n reviver,\n });\n }\n\n /**\n * @todo support loading from svg\n * @private\n * @static\n * @memberOf Group\n * @param {Object} object Object to create a group from\n * @returns {Promise<Group>}\n */\n static fromObject<T extends TOptions<SerializedGroupProps>>(\n { type, objects = [], layoutManager, ...options }: T,\n abortable?: Abortable,\n ) {\n return Promise.all([\n enlivenObjects<FabricObject>(objects, abortable),\n enlivenObjectEnlivables(options, abortable),\n ]).then(([objects, hydratedOptions]) => {\n const group = new this(objects, {\n ...options,\n ...hydratedOptions,\n layoutManager: new NoopLayoutManager(),\n });\n if (layoutManager) {\n const layoutClass = classRegistry.getClass<typeof LayoutManager>(\n layoutManager.type,\n );\n const strategyClass = classRegistry.getClass<typeof FitContentLayout>(\n layoutManager.strategy,\n );\n group.layoutManager = new layoutClass(new strategyClass());\n } else {\n group.layoutManager = new LayoutManager();\n }\n group.layoutManager.subscribeTargets({\n type: LAYOUT_TYPE_INITIALIZATION,\n target: group,\n targets: group.getObjects(),\n });\n group.setCoords();\n return group;\n });\n }\n}\n\nclassRegistry.setClass(Group);\n"],"names":["NoopLayoutManager","LayoutManager","performLayout","groupDefaultValues","strokeWidth","subTargetCheck","interactive","Group","createCollectionMixin","FabricObject","getDefaults","ownDefaults","constructor","objects","arguments","length","undefined","options","_defineProperty","Object","assign","setOptions","groupInit","_options$layoutManage","_objects","__objectSelectionTracker","__objectSelectionMonitor","bind","__objectSelectionDisposer","forEachObject","object","enterGroup","layoutManager","type","LAYOUT_TYPE_INITIALIZATION","target","targets","x","left","y","top","canEnterGroup","isDescendantOf","log","indexOf","_filterObjectsBeforeEnteringGroup","filter","index","array","add","_len","Array","_key","allowedObjects","size","_onAfterObjectsChange","LAYOUT_TYPE_ADDED","insertAt","_len2","_key2","remove","removed","LAYOUT_TYPE_REMOVED","_onObjectAdded","fire","_onObjectRemoved","removeParentTransform","exitGroup","_onStackOrderChanged","_set","key","value","prev","forEach","_shouldSetNestedCoords","removeAll","_activeObjects","selected","_ref","activeObjects","push","splice","_watchObject","watch","on","off","group","_enterGroup","applyTransformToObject","multiplyTransformMatrices","invertTransform","calcTransformMatrix","setCoords","canvas","activeObject","getActiveObject","_exitGroup","shouldCache","ownCache","prototype","call","i","willDrawShadow","preventGroupCache","ownCaching","isOnACache","parent","drawObject","ctx","forClipping","context","_renderBackground","_this$canvas","obj","preserveObjectStacking","save","transform","render","restore","_drawClipPath","clipPath","triggerLayout","LAYOUT_TYPE_IMPERATIVE","_transformDone","__serializeObjects","method","propertiesToInclude","_includeDefaultValues","includeDefaultValues","excludeFromExport","map","originalDefaults","data","toObject","strategy","toString","complexity","dispose","unsubscribeTargets","getObjects","_createSVGBgRect","reviver","backgroundColor","fillStroke","Rect","_toSVG","commons","markup","join","svgString","bg","toSVG","getSvgStyles","opacity","visibility","visible","getSvgFilter","toClipPathSVG","_createBaseClipPathSVGMarkup","fromObject","_ref2","abortable","Promise","all","enlivenObjects","enlivenObjectEnlivables","then","_ref3","hydratedOptions","layoutClass","classRegistry","getClass","strategyClass","subscribeTargets","setClass"],"mappings":"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"}
1
+ {"version":3,"file":"Group.mjs","sources":["../../../src/shapes/Group.ts"],"sourcesContent":["import type { CollectionEvents, ObjectEvents } from '../EventTypeDefs';\nimport { createCollectionMixin } from '../Collection';\nimport type {\n TClassProperties,\n TSVGReviver,\n TOptions,\n Abortable,\n} from '../typedefs';\nimport {\n invertTransform,\n multiplyTransformMatrices,\n} from '../util/misc/matrix';\nimport {\n enlivenObjectEnlivables,\n enlivenObjects,\n} from '../util/misc/objectEnlive';\nimport { calcPlaneChangeMatrix } from '../util/misc/planeChange';\nimport { applyTransformToObject } from '../util/misc/objectTransforms';\nimport { matrixToSVG } from '../util/misc/svgExport';\nimport { FabricObject } from './Object/FabricObject';\nimport { Rect } from './Rect';\nimport { classRegistry } from '../ClassRegistry';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport { log } from '../util/internals/console';\nimport type {\n ImperativeLayoutOptions,\n LayoutBeforeEvent,\n LayoutAfterEvent,\n} from '../LayoutManager/types';\nimport { LayoutManager } from '../LayoutManager/LayoutManager';\nimport {\n LAYOUT_TYPE_ADDED,\n LAYOUT_TYPE_IMPERATIVE,\n LAYOUT_TYPE_INITIALIZATION,\n LAYOUT_TYPE_REMOVED,\n} from '../LayoutManager/constants';\nimport type { SerializedLayoutManager } from '../LayoutManager/LayoutManager';\nimport type { FitContentLayout } from '../LayoutManager';\nimport type { DrawContext } from './Object/Object';\n\n/**\n * This class handles the specific case of creating a group using {@link Group#fromObject} and is not meant to be used in any other case.\n * We could have used a boolean in the constructor, as we did previously, but we think the boolean\n * would stay in the group's constructor interface and create confusion, therefore it was removed.\n * This layout manager doesn't do anything and therefore keeps the exact layout the group had when {@link Group#toObject} was called.\n */\nclass NoopLayoutManager extends LayoutManager {\n performLayout() {}\n}\n\nexport interface GroupEvents extends ObjectEvents, CollectionEvents {\n 'layout:before': LayoutBeforeEvent;\n 'layout:after': LayoutAfterEvent;\n}\n\nexport interface GroupOwnProps {\n subTargetCheck: boolean;\n interactive: boolean;\n}\n\nexport interface SerializedGroupProps\n extends SerializedObjectProps,\n GroupOwnProps {\n objects: SerializedObjectProps[];\n layoutManager: SerializedLayoutManager;\n}\n\nexport interface GroupProps extends FabricObjectProps, GroupOwnProps {\n layoutManager: LayoutManager;\n}\n\nexport const groupDefaultValues: Partial<TClassProperties<Group>> = {\n strokeWidth: 0,\n subTargetCheck: false,\n interactive: false,\n};\n\n/**\n * @fires object:added\n * @fires object:removed\n * @fires layout:before\n * @fires layout:after\n */\nexport class Group\n extends createCollectionMixin(\n FabricObject<GroupProps, SerializedGroupProps, GroupEvents>,\n )\n implements GroupProps\n{\n /**\n * Used to optimize performance\n * set to `false` if you don't need contained objects to be targets of events\n * @default\n * @type boolean\n */\n declare subTargetCheck: boolean;\n\n /**\n * Used to allow targeting of object inside groups.\n * set to true if you want to select an object inside a group.\\\n * **REQUIRES** `subTargetCheck` set to true\n * This will be not removed but slowly replaced with a method setInteractive\n * that will take care of enabling subTargetCheck and necessary object events.\n * There is too much attached to group interactivity to just be evaluated by a\n * boolean in the code\n * @default\n * @deprecated\n * @type boolean\n */\n declare interactive: boolean;\n\n declare layoutManager: LayoutManager;\n\n /**\n * Used internally to optimize performance\n * Once an object is selected, instance is rendered without the selected object.\n * This way instance is cached only once for the entire interaction with the selected object.\n * @private\n */\n protected _activeObjects: FabricObject[] = [];\n\n static type = 'Group';\n\n static ownDefaults: Record<string, any> = groupDefaultValues;\n private __objectSelectionTracker: (ev: ObjectEvents['selected']) => void;\n private __objectSelectionDisposer: (ev: ObjectEvents['deselected']) => void;\n\n static getDefaults(): Record<string, any> {\n return {\n ...super.getDefaults(),\n ...Group.ownDefaults,\n };\n }\n\n /**\n * Constructor\n *\n * @param {FabricObject[]} [objects] instance objects\n * @param {Object} [options] Options object\n */\n constructor(objects: FabricObject[] = [], options: Partial<GroupProps> = {}) {\n super();\n Object.assign(this, Group.ownDefaults);\n this.setOptions(options);\n this.groupInit(objects, options);\n }\n\n /**\n * Shared code between group and active selection\n * Meant to be used by the constructor.\n */\n protected groupInit(\n objects: FabricObject[],\n options: {\n layoutManager?: LayoutManager;\n top?: number;\n left?: number;\n },\n ) {\n this._objects = [...objects]; // Avoid unwanted mutations of Collection to affect the caller\n\n this.__objectSelectionTracker = this.__objectSelectionMonitor.bind(\n this,\n true,\n );\n this.__objectSelectionDisposer = this.__objectSelectionMonitor.bind(\n this,\n false,\n );\n\n this.forEachObject((object) => {\n this.enterGroup(object, false);\n });\n\n // perform initial layout\n this.layoutManager = options.layoutManager ?? new LayoutManager();\n this.layoutManager.performLayout({\n type: LAYOUT_TYPE_INITIALIZATION,\n target: this,\n targets: [...objects],\n // @TODO remove this concept from the layout manager.\n // Layout manager will calculate the correct position,\n // group options can override it later.\n x: options.left,\n y: options.top,\n });\n }\n\n /**\n * Checks if object can enter group and logs relevant warnings\n * @private\n * @param {FabricObject} object\n * @returns\n */\n canEnterGroup(object: FabricObject) {\n if (object === this || this.isDescendantOf(object)) {\n // prevent circular object tree\n log(\n 'error',\n 'Group: circular object trees are not supported, this call has no effect',\n );\n return false;\n } else if (this._objects.indexOf(object) !== -1) {\n // is already in the objects array\n log(\n 'error',\n 'Group: duplicate objects are not supported inside group, this call has no effect',\n );\n return false;\n }\n return true;\n }\n\n /**\n * Override this method to enhance performance (for groups with a lot of objects).\n * If Overriding, be sure not pass illegal objects to group - it will break your app.\n * @private\n */\n protected _filterObjectsBeforeEnteringGroup(objects: FabricObject[]) {\n return objects.filter((object, index, array) => {\n // can enter AND is the first occurrence of the object in the passed args (to prevent adding duplicates)\n return this.canEnterGroup(object) && array.indexOf(object) === index;\n });\n }\n\n /**\n * Add objects\n * @param {...FabricObject[]} objects\n */\n add(...objects: FabricObject[]) {\n const allowedObjects = this._filterObjectsBeforeEnteringGroup(objects);\n const size = super.add(...allowedObjects);\n this._onAfterObjectsChange(LAYOUT_TYPE_ADDED, allowedObjects);\n return size;\n }\n\n /**\n * Inserts an object into collection at specified index\n * @param {FabricObject[]} objects Object to insert\n * @param {Number} index Index to insert object at\n */\n insertAt(index: number, ...objects: FabricObject[]) {\n const allowedObjects = this._filterObjectsBeforeEnteringGroup(objects);\n const size = super.insertAt(index, ...allowedObjects);\n this._onAfterObjectsChange(LAYOUT_TYPE_ADDED, allowedObjects);\n return size;\n }\n\n /**\n * Remove objects\n * @param {...FabricObject[]} objects\n * @returns {FabricObject[]} removed objects\n */\n remove(...objects: FabricObject[]) {\n const removed = super.remove(...objects);\n this._onAfterObjectsChange(LAYOUT_TYPE_REMOVED, removed);\n return removed;\n }\n\n _onObjectAdded(object: FabricObject) {\n this.enterGroup(object, true);\n this.fire('object:added', { target: object });\n object.fire('added', { target: this });\n }\n\n /**\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it\n */\n _onObjectRemoved(object: FabricObject, removeParentTransform?: boolean) {\n this.exitGroup(object, removeParentTransform);\n this.fire('object:removed', { target: object });\n object.fire('removed', { target: this });\n }\n\n /**\n * @private\n * @param {'added'|'removed'} type\n * @param {FabricObject[]} targets\n */\n _onAfterObjectsChange(type: 'added' | 'removed', targets: FabricObject[]) {\n this.layoutManager.performLayout({\n type,\n targets,\n target: this,\n });\n }\n\n _onStackOrderChanged() {\n this._set('dirty', true);\n }\n\n /**\n * @private\n * @param {string} key\n * @param {*} value\n */\n _set(key: string, value: any) {\n const prev = this[key as keyof this];\n super._set(key, value);\n if (key === 'canvas' && prev !== value) {\n (this._objects || []).forEach((object) => {\n object._set(key, value);\n });\n }\n return this;\n }\n\n /**\n * @private\n */\n _shouldSetNestedCoords() {\n return this.subTargetCheck;\n }\n\n /**\n * Remove all objects\n * @returns {FabricObject[]} removed objects\n */\n removeAll() {\n this._activeObjects = [];\n return this.remove(...this._objects);\n }\n\n /**\n * keeps track of the selected objects\n * @private\n */\n __objectSelectionMonitor<T extends boolean>(\n selected: T,\n {\n target: object,\n }: ObjectEvents[T extends true ? 'selected' : 'deselected'],\n ) {\n const activeObjects = this._activeObjects;\n if (selected) {\n activeObjects.push(object);\n this._set('dirty', true);\n } else if (activeObjects.length > 0) {\n const index = activeObjects.indexOf(object);\n if (index > -1) {\n activeObjects.splice(index, 1);\n this._set('dirty', true);\n }\n }\n }\n\n /**\n * @private\n * @param {boolean} watch\n * @param {FabricObject} object\n */\n _watchObject(watch: boolean, object: FabricObject) {\n // make sure we listen only once\n watch && this._watchObject(false, object);\n if (watch) {\n object.on('selected', this.__objectSelectionTracker);\n object.on('deselected', this.__objectSelectionDisposer);\n } else {\n object.off('selected', this.__objectSelectionTracker);\n object.off('deselected', this.__objectSelectionDisposer);\n }\n }\n\n /**\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object is in canvas coordinate plane\n */\n enterGroup(object: FabricObject, removeParentTransform?: boolean) {\n object.group && object.group.remove(object);\n object._set('parent', this);\n this._enterGroup(object, removeParentTransform);\n }\n\n /**\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object is in canvas coordinate plane\n */\n _enterGroup(object: FabricObject, removeParentTransform?: boolean) {\n if (removeParentTransform) {\n // can this be converted to utils (sendObjectToPlane)?\n applyTransformToObject(\n object,\n multiplyTransformMatrices(\n invertTransform(this.calcTransformMatrix()),\n object.calcTransformMatrix(),\n ),\n );\n }\n this._shouldSetNestedCoords() && object.setCoords();\n object._set('group', this);\n object._set('canvas', this.canvas);\n this._watchObject(true, object);\n const activeObject =\n this.canvas &&\n this.canvas.getActiveObject &&\n this.canvas.getActiveObject();\n // if we are adding the activeObject in a group\n if (\n activeObject &&\n (activeObject === object || object.isDescendantOf(activeObject))\n ) {\n this._activeObjects.push(object);\n }\n }\n\n /**\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it\n */\n exitGroup(object: FabricObject, removeParentTransform?: boolean) {\n this._exitGroup(object, removeParentTransform);\n object._set('parent', undefined);\n object._set('canvas', undefined);\n }\n\n /**\n * Executes the inner fabric logic of exiting a group.\n * - Stop watching the object\n * - Remove the object from the optimization map this._activeObjects\n * - unset the group property of the object\n * @protected\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it\n */\n _exitGroup(object: FabricObject, removeParentTransform?: boolean) {\n object._set('group', undefined);\n if (!removeParentTransform) {\n applyTransformToObject(\n object,\n multiplyTransformMatrices(\n this.calcTransformMatrix(),\n object.calcTransformMatrix(),\n ),\n );\n object.setCoords();\n }\n this._watchObject(false, object);\n const index =\n this._activeObjects.length > 0 ? this._activeObjects.indexOf(object) : -1;\n if (index > -1) {\n this._activeObjects.splice(index, 1);\n }\n }\n\n /**\n * Decide if the group 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 is already cached.\n * @return {Boolean}\n */\n shouldCache() {\n const ownCache = FabricObject.prototype.shouldCache.call(this);\n if (ownCache) {\n for (let i = 0; i < this._objects.length; i++) {\n if (\n this._objects[i].willDrawShadow() ||\n this._objects[i].preventGroupCache\n ) {\n this.ownCaching = false;\n return false;\n }\n }\n }\n return ownCache;\n }\n\n /**\n * Check if this object or a child object will cast a shadow\n * @return {Boolean}\n */\n willDrawShadow() {\n if (super.willDrawShadow()) {\n return true;\n }\n for (let i = 0; i < this._objects.length; i++) {\n if (this._objects[i].willDrawShadow()) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Check if instance or its group are caching, recursively up\n * @return {Boolean}\n */\n isOnACache(): boolean {\n return this.ownCaching || (!!this.parent && this.parent.isOnACache());\n }\n\n /**\n * Execute the drawing operation for an object on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawObject(\n ctx: CanvasRenderingContext2D,\n forClipping: boolean | undefined,\n context: DrawContext,\n ) {\n this._renderBackground(ctx);\n for (let i = 0; i < this._objects.length; i++) {\n const obj = this._objects[i];\n // TODO: handle rendering edge case somehow\n if (this.canvas?.preserveObjectStacking && obj.group !== this) {\n ctx.save();\n ctx.transform(...invertTransform(this.calcTransformMatrix()));\n obj.render(ctx);\n ctx.restore();\n } else if (obj.group === this) {\n obj.render(ctx);\n }\n }\n this._drawClipPath(ctx, this.clipPath, context);\n }\n\n /**\n * @override\n * @return {Boolean}\n */\n setCoords() {\n super.setCoords();\n this._shouldSetNestedCoords() &&\n this.forEachObject((object) => object.setCoords());\n }\n\n triggerLayout(options: ImperativeLayoutOptions = {}) {\n this.layoutManager.performLayout({\n target: this,\n type: LAYOUT_TYPE_IMPERATIVE,\n ...options,\n });\n }\n\n /**\n * Renders instance on a given context\n * @param {CanvasRenderingContext2D} ctx context to render instance on\n */\n render(ctx: CanvasRenderingContext2D) {\n this._transformDone = true;\n super.render(ctx);\n this._transformDone = false;\n }\n\n /**\n *\n * @private\n * @param {'toObject'|'toDatalessObject'} [method]\n * @param {string[]} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @returns {FabricObject[]} serialized objects\n */\n __serializeObjects(\n method: 'toObject' | 'toDatalessObject',\n propertiesToInclude?: string[],\n ) {\n const _includeDefaultValues = this.includeDefaultValues;\n return this._objects\n .filter(function (obj) {\n return !obj.excludeFromExport;\n })\n .map(function (obj) {\n const originalDefaults = obj.includeDefaultValues;\n obj.includeDefaultValues = _includeDefaultValues;\n const data = obj[method || 'toObject'](propertiesToInclude);\n obj.includeDefaultValues = originalDefaults;\n // delete data.version;\n return data;\n });\n }\n\n /**\n * Returns object representation of an instance\n * @param {string[]} [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<\n GroupProps & TClassProperties<this>,\n keyof SerializedGroupProps\n >,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick<T, K> & SerializedGroupProps {\n const layoutManager = this.layoutManager.toObject();\n\n return {\n ...super.toObject([\n 'subTargetCheck',\n 'interactive',\n ...propertiesToInclude,\n ]),\n ...(layoutManager.strategy !== 'fit-content' || this.includeDefaultValues\n ? { layoutManager }\n : {}),\n objects: this.__serializeObjects(\n 'toObject',\n propertiesToInclude as string[],\n ),\n };\n }\n\n toString() {\n return `#<Group: (${this.complexity()})>`;\n }\n\n dispose() {\n this.layoutManager.unsubscribeTargets({\n targets: this.getObjects(),\n target: this,\n });\n this._activeObjects = [];\n this.forEachObject((object) => {\n this._watchObject(false, object);\n object.dispose();\n });\n super.dispose();\n }\n\n /**\n * @private\n */\n _createSVGBgRect(reviver?: TSVGReviver) {\n if (!this.backgroundColor) {\n return '';\n }\n const fillStroke = Rect.prototype._toSVG.call(this);\n const commons = fillStroke.indexOf('COMMON_PARTS');\n fillStroke[commons] = 'for=\"group\" ';\n const markup = fillStroke.join('');\n return reviver ? reviver(markup) : markup;\n }\n\n /**\n * Returns svg representation of an instance\n * @param {TSVGReviver} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n _toSVG(reviver?: TSVGReviver) {\n const svgString = ['<g ', 'COMMON_PARTS', ' >\\n'];\n const bg = this._createSVGBgRect(reviver);\n const groupTransformMatrix = this.calcTransformMatrix();\n bg && svgString.push('\\t\\t', bg);\n for (let i = 0; i < this._objects.length; i++) {\n const object = this._objects[i];\n if (object.group && object.group !== this) {\n // 组内对象被 ActiveSelection 临时接管时,需要补回当前组坐标系的变换。\n const planeChangeMatrix = calcPlaneChangeMatrix(\n object.group.calcTransformMatrix(),\n groupTransformMatrix,\n );\n svgString.push(\n '\\t\\t<g transform=\"',\n matrixToSVG(planeChangeMatrix),\n '\">\\n\\t\\t',\n object.toSVG(reviver),\n '\\t\\t</g>\\n',\n );\n continue;\n }\n svgString.push('\\t\\t', object.toSVG(reviver));\n }\n svgString.push('</g>\\n');\n return svgString;\n }\n\n /**\n * Returns styles-string for svg-export, specific version for group\n * @return {String}\n */\n getSvgStyles(): string {\n const opacity =\n typeof this.opacity !== 'undefined' && this.opacity !== 1\n ? `opacity: ${this.opacity};`\n : '',\n visibility = this.visible ? '' : ' visibility: hidden;';\n return [opacity, this.getSvgFilter(), visibility].join('');\n }\n\n /**\n * Returns svg clipPath representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toClipPathSVG(reviver?: TSVGReviver): string {\n const svgString = [];\n const bg = this._createSVGBgRect(reviver);\n bg && svgString.push('\\t', bg);\n for (let i = 0; i < this._objects.length; i++) {\n svgString.push('\\t', this._objects[i].toClipPathSVG(reviver));\n }\n return this._createBaseClipPathSVGMarkup(svgString, {\n reviver,\n });\n }\n\n /**\n * @todo support loading from svg\n * @private\n * @static\n * @memberOf Group\n * @param {Object} object Object to create a group from\n * @returns {Promise<Group>}\n */\n static fromObject<T extends TOptions<SerializedGroupProps>>(\n { type, objects = [], layoutManager, ...options }: T,\n abortable?: Abortable,\n ) {\n return Promise.all([\n enlivenObjects<FabricObject>(objects, abortable),\n enlivenObjectEnlivables(options, abortable),\n ]).then(([objects, hydratedOptions]) => {\n const group = new this(objects, {\n ...options,\n ...hydratedOptions,\n layoutManager: new NoopLayoutManager(),\n });\n if (layoutManager) {\n const layoutClass = classRegistry.getClass<typeof LayoutManager>(\n layoutManager.type,\n );\n const strategyClass = classRegistry.getClass<typeof FitContentLayout>(\n layoutManager.strategy,\n );\n group.layoutManager = new layoutClass(new strategyClass());\n } else {\n group.layoutManager = new LayoutManager();\n }\n group.layoutManager.subscribeTargets({\n type: LAYOUT_TYPE_INITIALIZATION,\n target: group,\n targets: group.getObjects(),\n });\n group.setCoords();\n return group;\n });\n }\n}\n\nclassRegistry.setClass(Group);\n"],"names":["NoopLayoutManager","LayoutManager","performLayout","groupDefaultValues","strokeWidth","subTargetCheck","interactive","Group","createCollectionMixin","FabricObject","getDefaults","ownDefaults","constructor","objects","arguments","length","undefined","options","_defineProperty","Object","assign","setOptions","groupInit","_options$layoutManage","_objects","__objectSelectionTracker","__objectSelectionMonitor","bind","__objectSelectionDisposer","forEachObject","object","enterGroup","layoutManager","type","LAYOUT_TYPE_INITIALIZATION","target","targets","x","left","y","top","canEnterGroup","isDescendantOf","log","indexOf","_filterObjectsBeforeEnteringGroup","filter","index","array","add","_len","Array","_key","allowedObjects","size","_onAfterObjectsChange","LAYOUT_TYPE_ADDED","insertAt","_len2","_key2","remove","removed","LAYOUT_TYPE_REMOVED","_onObjectAdded","fire","_onObjectRemoved","removeParentTransform","exitGroup","_onStackOrderChanged","_set","key","value","prev","forEach","_shouldSetNestedCoords","removeAll","_activeObjects","selected","_ref","activeObjects","push","splice","_watchObject","watch","on","off","group","_enterGroup","applyTransformToObject","multiplyTransformMatrices","invertTransform","calcTransformMatrix","setCoords","canvas","activeObject","getActiveObject","_exitGroup","shouldCache","ownCache","prototype","call","i","willDrawShadow","preventGroupCache","ownCaching","isOnACache","parent","drawObject","ctx","forClipping","context","_renderBackground","_this$canvas","obj","preserveObjectStacking","save","transform","render","restore","_drawClipPath","clipPath","triggerLayout","LAYOUT_TYPE_IMPERATIVE","_transformDone","__serializeObjects","method","propertiesToInclude","_includeDefaultValues","includeDefaultValues","excludeFromExport","map","originalDefaults","data","toObject","strategy","toString","complexity","dispose","unsubscribeTargets","getObjects","_createSVGBgRect","reviver","backgroundColor","fillStroke","Rect","_toSVG","commons","markup","join","svgString","bg","groupTransformMatrix","planeChangeMatrix","calcPlaneChangeMatrix","matrixToSVG","toSVG","getSvgStyles","opacity","visibility","visible","getSvgFilter","toClipPathSVG","_createBaseClipPathSVGMarkup","fromObject","_ref2","abortable","Promise","all","enlivenObjects","enlivenObjectEnlivables","then","_ref3","hydratedOptions","layoutClass","classRegistry","getClass","strategyClass","subscribeTargets","setClass"],"mappings":"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"}
@@ -289,8 +289,8 @@ export declare class FabricImage<Props extends TOptions<ImageProps> = Partial<Im
289
289
  */
290
290
  static fromObject<T extends TOptions<SerializedImageProps>>({ filters: f, resizeFilter: rf, src, crossOrigin, type, ...object }: T, options?: Abortable): Promise<FabricImage<Omit<T, "type" | "filters" | "resizeFilter" | "src" | "crossOrigin"> & {
291
291
  src: string | undefined;
292
- filters: BaseFilter<string, object, object>[];
293
- resizeFilter: any;
292
+ filters: BaseFilter<string, Record<string, any>, Record<string, any>>[];
293
+ resizeFilter: Resize;
294
294
  }, SerializedImageProps, ObjectEvents>>;
295
295
  /**
296
296
  * Creates an instance of Image from an URL string
@@ -1 +1 @@
1
- {"version":3,"file":"Image.d.ts","sourceRoot":"","sources":["../../../src/shapes/Image.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Image.d.ts","sourceRoot":"","sources":["../../../src/shapes/Image.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAIxD,OAAO,KAAK,EACV,gBAAgB,EAChB,YAAY,EACZ,KAAK,EACL,SAAS,EACT,QAAQ,EACT,MAAM,aAAa,CAAC;AAIrB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAQlE,OAAO,EAAE,YAAY,EAAmB,MAAM,uBAAuB,CAAC;AACtE,OAAO,KAAK,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAC/E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAIrD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAK3D,MAAM,MAAM,WAAW,GACnB,gBAAgB,GAChB,gBAAgB,GAChB,iBAAiB,CAAC;AAEtB,UAAU,gBAAgB;IACxB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,OAAO,CAAC;IACxB,OAAO,EAAE,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;IACnD,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,kBAAkB,EAAE,OAAO,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAOrE,CAAC;AAEF,MAAM,WAAW,oBAAqB,SAAQ,qBAAqB;IACjE,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,YAAY,CAAC;IAC1B,OAAO,EAAE,GAAG,EAAE,CAAC;IACf,YAAY,CAAC,EAAE,GAAG,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAW,SAAQ,iBAAiB,EAAE,gBAAgB;CAAG;AAI1E;;GAEG;AACH,qBAAa,WAAW,CACpB,KAAK,SAAS,QAAQ,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,EACxD,MAAM,SAAS,oBAAoB,GAAG,oBAAoB,EAC1D,SAAS,SAAS,YAAY,GAAG,YAAY,CAE/C,SAAQ,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAC7C,YAAW,UAAU;IAErB;;;;;;OAMG;IACK,gBAAgB,EAAE,OAAO,CAAC;IAElC;;;;;OAKG;IACH,SAAS,CAAC,WAAW,SAAK;IAE1B;;;;;OAKG;IACH,SAAS,CAAC,WAAW,SAAK;IAE1B;;;;OAIG;IACH,SAAS,CAAC,eAAe,SAAK;IAE9B;;;;OAIG;IACH,SAAS,CAAC,eAAe,SAAK;IAE9B;;;;;OAKG;IACK,mBAAmB,EAAE,MAAM,CAAC;IAEpC;;;;;OAKG;IACK,QAAQ,EAAE,MAAM,CAAC;IAEzB;;;;;OAKG;IACK,KAAK,EAAE,MAAM,CAAC;IAEtB;;;;;OAKG;IACK,KAAK,EAAE,MAAM,CAAC;IAEtB;;;;;;OAMG;IACK,cAAc,EAAE,OAAO,CAAC;IAExB,mBAAmB,EAAE,MAAM,CAAC;IAEpC,UAAkB,GAAG,EAAE,MAAM,CAAC;IAEtB,OAAO,EAAE,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;IACnD,YAAY,EAAE,MAAM,CAAC;IAErB,QAAQ,EAAE,WAAW,CAAC;IACtB,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC,gBAAgB,EAAE,WAAW,CAAC;IAEtC,MAAM,CAAC,IAAI,SAAW;IAEtB,MAAM,CAAC,eAAe,WAAwC;IAE9D,MAAM,CAAC,WAAW,kGAAsB;IAExC,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAMzC;;;;;;;;OAQG;gBACS,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK;gBAClC,OAAO,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,KAAK;IAkBjD;;OAEG;IACH,UAAU;IAIV;;;;;;OAMG;IACH,UAAU,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,GAAE,OAAO,CAAC,KAAK,CAAM;IAmB1D;;OAEG;IACH,aAAa,CAAC,GAAG,EAAE,MAAM;IAOzB;;OAEG;IACH,OAAO;IAeP;;OAEG;IACH,cAAc,IAAI,MAAM,GAAG,IAAI;IAO/B;;OAEG;IACH,eAAe;;;;IAcf;;;OAGG;IACH,OAAO,CAAC,GAAG,EAAE,wBAAwB;IAerC;;;;OAIG;IACH,QAAQ,CACN,CAAC,SAAS,IAAI,CAAC,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,EAAE,MAAM,MAAM,CAAC,EAC5D,CAAC,SAAS,MAAM,CAAC,GAAG,KAAK,EACzB,mBAAmB,GAAE,CAAC,EAAO,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM;IAgBrD;;;OAGG;IACH,OAAO;IASP;;;;OAIG;IACH,MAAM;IAiEN;;;;OAIG;IACH,MAAM,CAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM;IAiBlC;;;;OAIG;IACH,SAAS,CAAC,QAAQ,CAAC,EAAE,OAAO;IAI5B;;;;;OAKG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,GAAE,gBAAqB;IAOlE;;;OAGG;IACH,QAAQ;IAIR,kBAAkB;IAkClB;;;;;OAKG;IACH,YAAY,CACV,OAAO,GAAE,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,EAAuB;IA+DzE;;;OAGG;IACH,OAAO,CAAC,GAAG,EAAE,wBAAwB;IASrC;;;;OAIG;IACH,iBAAiB,CACf,IAAI,EAAE,mBAAmB,CAAC,WAAW,CAAC,EACtC,GAAG,EAAE,wBAAwB;IAM/B;;;;;;;;;;OAUG;IACH,WAAW;IAIX,WAAW,CAAC,GAAG,EAAE,wBAAwB;IA+BzC;;;OAGG;IACH,YAAY;IAKZ;;;OAGG;IACH,iBAAiB;IAIjB;;;;OAIG;IACH,eAAe,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAE,OAAO,CAAC,KAAK,CAAM;IAMtD;;;;OAIG;IACH,iCAAiC;;;;;;;;;;IAsEjC;;;;;;;OAOG;IACH,MAAM,CAAC,UAAU,SAAgB;IAEjC;;;;OAIG;IACH,MAAM,CAAC,eAAe,WAWpB;IAEF;;;;;;;OAOG;IACH,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,QAAQ,CAAC,oBAAoB,CAAC,EACxD,EAAE,OAAO,EAAE,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,EAAE,CAAC,EACtE,OAAO,CAAC,EAAE,SAAS;;;;;IAgCrB;;;;;;OAMG;IACH,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,QAAQ,CAAC,UAAU,CAAC,EAC3C,GAAG,EAAE,MAAM,EACX,EAAE,WAAkB,EAAE,MAAM,EAAE,GAAE,gBAAqB,EACrD,YAAY,CAAC,EAAE,CAAC,GACf,OAAO,CAAC,WAAW,CAAC;IAMvB;;;;;;;OAOG;WACU,WAAW,CACtB,OAAO,EAAE,WAAW,EACpB,OAAO,GAAE,SAAc,EACvB,QAAQ,CAAC,EAAE,QAAQ;CAgBtB"}
@@ -1,2 +1,2 @@
1
- import{defineProperty as t}from"../../_virtual/_rollupPluginBabelHelpers.min.mjs";import{getFabricDocument as i,getEnv as e}from"../env/index.min.mjs";import{getFilterBackend as s}from"../filters/FilterBackend.min.mjs";import{SHARED_ATTRIBUTES as h}from"../parser/attributes.min.mjs";import{parseAttributes as r}from"../parser/parseAttributes.min.mjs";import{uid as l}from"../util/internals/uid.min.mjs";import{createCanvasElementFor as n}from"../util/misc/dom.min.mjs";import{findScaleToFit as a,findScaleToCover as o}from"../util/misc/findScaleTo.min.mjs";import{loadImage as m,enlivenObjects as g,enlivenObjectEnlivables as c}from"../util/misc/objectEnlive.min.mjs";import{parsePreserveAspectRatioAttribute as d}from"../util/misc/svgParsing.min.mjs";import{classRegistry as _}from"../ClassRegistry.min.mjs";import{FabricObject as f}from"./Object/FabricObject.min.mjs";import{WebGLFilterBackend as p}from"../filters/WebGLFilterBackend.min.mjs";import{FILL as u,NONE as S}from"../constants.min.mjs";import{getDocumentFromElement as v}from"../util/dom_misc.min.mjs";import{log as w}from"../util/internals/console.min.mjs";import{cacheProperties as E}from"./Object/defaultValues.min.mjs";const O={strokeWidth:0,srcFromAttribute:!1,minimumScaleTrigger:.5,cropX:0,cropY:0,imageSmoothing:!0},y=["cropX","cropY"];class j extends f{static getDefaults(){return{...super.getDefaults(),...j.ownDefaults}}constructor(e,s){super(),t(this,"_lastScaleX",1),t(this,"_lastScaleY",1),t(this,"_filterScalingX",1),t(this,"_filterScalingY",1),this.filters=[],Object.assign(this,j.ownDefaults),this.setOptions(s),this.cacheKey=`texture${l()}`,this.setElement("string"==typeof e?(this.canvas&&v(this.canvas.getElement())||i()).getElementById(e):e,s)}getElement(){return this._element}setElement(t){var i;let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.removeTexture(this.cacheKey),this.removeTexture(`${this.cacheKey}_filtered`),this._element=t,this._originalElement=t,this._setWidthHeight(e),null===(i=t.classList)||void 0===i||i.add(j.CSS_CANVAS),0!==this.filters.length&&this.applyFilters(),this.resizeFilter&&this.applyResizeFilters()}removeTexture(t){const i=s(!1);i instanceof p&&i.evictCachesForKey(t)}dispose(){super.dispose(),this.removeTexture(this.cacheKey),this.removeTexture(`${this.cacheKey}_filtered`),this._cacheContext=null,["_originalElement","_element","_filteredEl","_cacheCanvas"].forEach((t=>{const i=this[t];i&&e().dispose(i),this[t]=void 0}))}getCrossOrigin(){return this._originalElement&&(this._originalElement.crossOrigin||null)}getOriginalSize(){const t=this.getElement();return t?{width:t.naturalWidth||t.width,height:t.naturalHeight||t.height}:{width:0,height:0}}_stroke(t){if(!this.stroke||0===this.strokeWidth)return;const i=this.width/2,e=this.height/2;t.beginPath(),t.moveTo(-i,-e),t.lineTo(i,-e),t.lineTo(i,e),t.lineTo(-i,e),t.lineTo(-i,-e),t.closePath()}toObject(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];const i=[];return this.filters.forEach((t=>{t&&i.push(t.toObject())})),{...super.toObject([...y,...t]),src:this.getSrc(),crossOrigin:this.getCrossOrigin(),filters:i,...this.resizeFilter?{resizeFilter:this.resizeFilter.toObject()}:{}}}hasCrop(){return!!this.cropX||!!this.cropY||this.width<this._element.width||this.height<this._element.height}_toSVG(){const t=[],i=this._element,e=-this.width/2,s=-this.height/2;let h=[],r=[],n="",a="";if(!i)return[];if(this.hasCrop()){const t=l();h.push('<clipPath id="imageCrop_'+t+'">\n','\t<rect x="'+e+'" y="'+s+'" width="'+this.width+'" height="'+this.height+'" />\n',"</clipPath>\n"),n=' clip-path="url(#imageCrop_'+t+')" '}if(this.imageSmoothing||(a=' image-rendering="optimizeSpeed"'),t.push("\t<image ","COMMON_PARTS",`xlink:href="${this.getSvgSrc(!0)}" x="${e-this.cropX}" y="${s-this.cropY}" width="${i.width||i.naturalWidth}" height="${i.height||i.naturalHeight}"${a}${n}></image>\n`),this.stroke||this.strokeDashArray){const t=this.fill;this.fill=null,r=[`\t<rect x="${e}" y="${s}" width="${this.width}" height="${this.height}" style="${this.getSvgStyles()}" />\n`],this.fill=t}return h=this.paintFirst!==u?h.concat(r,t):h.concat(t,r),h}getSrc(t){const i=t?this._element:this._originalElement;return i?i.toDataURL?i.toDataURL():this.srcFromAttribute?i.getAttribute("src")||"":i.src:this.src||""}getSvgSrc(t){return this.getSrc(t)}setSrc(t){let{crossOrigin:i,signal:e}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return m(t,{crossOrigin:i,signal:e}).then((t=>{void 0!==i&&this.set({crossOrigin:i}),this.setElement(t)}))}toString(){return`#<Image: { src: "${this.getSrc()}" }>`}applyResizeFilters(){const t=this.resizeFilter,i=this.minimumScaleTrigger,e=this.getTotalObjectScaling(),h=e.x,r=e.y,l=this._filteredEl||this._originalElement;if(this.group&&this.set("dirty",!0),!t||h>i&&r>i)return this._element=l,this._filterScalingX=1,this._filterScalingY=1,this._lastScaleX=h,void(this._lastScaleY=r);const a=n(l),{width:o,height:m}=l;this._element=a,this._lastScaleX=t.scaleX=h,this._lastScaleY=t.scaleY=r,s().applyFilters([t],l,o,m,this._element),this._filterScalingX=a.width/this._originalElement.width,this._filterScalingY=a.height/this._originalElement.height}applyFilters(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.filters||[];if(t=t.filter((t=>t&&!t.isNeutralState())),this.set("dirty",!0),this.removeTexture(`${this.cacheKey}_filtered`),0===t.length)return this._element=this._originalElement,this._filteredEl=void 0,this._filterScalingX=1,void(this._filterScalingY=1);const i=this._originalElement,e=i.naturalWidth||i.width,h=i.naturalHeight||i.height;if(this._element===this._originalElement){const t=n({width:e,height:h});this._element=t,this._filteredEl=t}else this._filteredEl&&(this._element=this._filteredEl,this._filteredEl.getContext("2d").clearRect(0,0,e,h),this._lastScaleX=1,this._lastScaleY=1);s().applyFilters(t,this._originalElement,e,h,this._element,this.cacheKey),this._originalElement.width===this._element.width&&this._originalElement.height===this._element.height||(this._filterScalingX=this._element.width/this._originalElement.width,this._filterScalingY=this._element.height/this._originalElement.height)}_render(t){t.imageSmoothingEnabled=this.imageSmoothing,!0!==this.isMoving&&this.resizeFilter&&this._needsResize()&&this.applyResizeFilters(),this._stroke(t),this._renderPaintInOrder(t)}drawCacheOnCanvas(t){t.imageSmoothingEnabled=this.imageSmoothing,super.drawCacheOnCanvas(t)}shouldCache(){return this.needsItsOwnCache()}_renderFill(t){const i=this._element;if(!i)return;const e=this._filterScalingX,s=this._filterScalingY,h=this.width,r=this.height,l=Math.max(this.cropX,0),n=Math.max(this.cropY,0),a=i.naturalWidth||i.width,o=i.naturalHeight||i.height,m=l*e,g=n*s,c=Math.min(h*e,a-m),d=Math.min(r*s,o-g),_=-h/2,f=-r/2,p=Math.min(h,a/e-l),u=Math.min(r,o/s-n);i&&t.drawImage(i,m,g,c,d,_,f,p,u)}_needsResize(){const t=this.getTotalObjectScaling();return t.x!==this._lastScaleX||t.y!==this._lastScaleY}_resetWidthHeight(){this.set(this.getOriginalSize())}_setWidthHeight(){let{width:t,height:i}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const e=this.getOriginalSize();this.width=t||e.width,this.height=i||e.height}parsePreserveAspectRatioAttribute(){const t=d(this.preserveAspectRatio||""),i=this.width,e=this.height,s={width:i,height:e};let h,r=this._element.width,l=this._element.height,n=1,m=1,g=0,c=0,_=0,f=0;return!t||t.alignX===S&&t.alignY===S?(n=i/r,m=e/l):("meet"===t.meetOrSlice&&(n=m=a(this._element,s),h=(i-r*n)/2,"Min"===t.alignX&&(g=-h),"Max"===t.alignX&&(g=h),h=(e-l*m)/2,"Min"===t.alignY&&(c=-h),"Max"===t.alignY&&(c=h)),"slice"===t.meetOrSlice&&(n=m=o(this._element,s),h=r-i/n,"Mid"===t.alignX&&(_=h/2),"Max"===t.alignX&&(_=h),h=l-e/m,"Mid"===t.alignY&&(f=h/2),"Max"===t.alignY&&(f=h),r=i/n,l=e/m)),{width:r,height:l,scaleX:n,scaleY:m,offsetLeft:g,offsetTop:c,cropX:_,cropY:f}}static fromObject(t,i){let{filters:e,resizeFilter:s,src:h,crossOrigin:r,type:l,...n}=t;return Promise.all([m(h,{...i,crossOrigin:r}),e&&g(e,i),s&&g([s],i),c(n,i)]).then((t=>{let[i,e=[],[s]=[],r={}]=t;return new this(i,{...n,src:h,filters:e,resizeFilter:s,...r})}))}static fromURL(t){let{crossOrigin:i=null,signal:e}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},s=arguments.length>2?arguments[2]:void 0;return m(t,{crossOrigin:i,signal:e}).then((t=>new this(t,s)))}static async fromElement(t){let i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},e=arguments.length>2?arguments[2]:void 0;const s=r(t,this.ATTRIBUTE_NAMES,e);return this.fromURL(s["xlink:href"]||s.href,i,s).catch((t=>(w("log","Unable to parse Image",t),null)))}}t(j,"type","Image"),t(j,"cacheProperties",[...E,...y]),t(j,"ownDefaults",O),t(j,"CSS_CANVAS","canvas-img"),t(j,"ATTRIBUTE_NAMES",[...h,"x","y","width","height","preserveAspectRatio","xlink:href","href","crossOrigin","image-rendering"]),_.setClass(j),_.setSVGClass(j);export{j as FabricImage,O as imageDefaultValues};
1
+ import{defineProperty as t}from"../../_virtual/_rollupPluginBabelHelpers.min.mjs";import{getFabricDocument as i,getEnv as e}from"../env/index.min.mjs";import{getFilterBackend as s}from"../filters/FilterBackend.min.mjs";import{SHARED_ATTRIBUTES as h}from"../parser/attributes.min.mjs";import{parseAttributes as r}from"../parser/parseAttributes.min.mjs";import{uid as l}from"../util/internals/uid.min.mjs";import{createCanvasElementFor as n}from"../util/misc/dom.min.mjs";import{findScaleToFit as a,findScaleToCover as o}from"../util/misc/findScaleTo.min.mjs";import{loadImage as m,enlivenObjects as g,enlivenObjectEnlivables as c}from"../util/misc/objectEnlive.min.mjs";import{parsePreserveAspectRatioAttribute as d}from"../util/misc/svgParsing.min.mjs";import{classRegistry as _}from"../ClassRegistry.min.mjs";import{FabricObject as f}from"./Object/FabricObject.min.mjs";import{WebGLFilterBackend as p}from"../filters/WebGLFilterBackend.min.mjs";import{FILL as u,NONE as S}from"../constants.min.mjs";import{getDocumentFromElement as v}from"../util/dom_misc.min.mjs";import{log as w}from"../util/internals/console.min.mjs";import{cacheProperties as E}from"./Object/defaultValues.min.mjs";const O={strokeWidth:0,srcFromAttribute:!1,minimumScaleTrigger:.5,cropX:0,cropY:0,imageSmoothing:!0},y=["cropX","cropY"];class j extends f{static getDefaults(){return{...super.getDefaults(),...j.ownDefaults}}constructor(e,s){super(),t(this,"_lastScaleX",1),t(this,"_lastScaleY",1),t(this,"_filterScalingX",1),t(this,"_filterScalingY",1),this.filters=[],Object.assign(this,j.ownDefaults),this.setOptions(s),this.cacheKey=`texture${l()}`,this.setElement("string"==typeof e?(this.canvas&&v(this.canvas.getElement())||i()).getElementById(e):e,s)}getElement(){return this._element}setElement(t){var i;let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.removeTexture(this.cacheKey),this.removeTexture(`${this.cacheKey}_filtered`),this._element=t,this._originalElement=t,this._setWidthHeight(e),null===(i=t.classList)||void 0===i||i.add(j.CSS_CANVAS),0!==this.filters.length&&this.applyFilters(),this.resizeFilter&&this.applyResizeFilters()}removeTexture(t){const i=s(!1);i instanceof p&&i.evictCachesForKey(t)}dispose(){super.dispose(),this.removeTexture(this.cacheKey),this.removeTexture(`${this.cacheKey}_filtered`),this._cacheContext=null,["_originalElement","_element","_filteredEl","_cacheCanvas"].forEach((t=>{const i=this[t];i&&e().dispose(i),this[t]=void 0}))}getCrossOrigin(){return this._originalElement&&(this._originalElement.crossOrigin||null)}getOriginalSize(){const t=this.getElement();return t?{width:t.naturalWidth||t.width,height:t.naturalHeight||t.height}:{width:0,height:0}}_stroke(t){if(!this.stroke||0===this.strokeWidth)return;const i=this.width/2,e=this.height/2;t.beginPath(),t.moveTo(-i,-e),t.lineTo(i,-e),t.lineTo(i,e),t.lineTo(-i,e),t.lineTo(-i,-e),t.closePath()}toObject(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];const i=[];return this.filters.forEach((t=>{t&&i.push(t.toObject())})),{...super.toObject([...y,...t]),src:this.getSrc(),crossOrigin:this.getCrossOrigin(),filters:i,...this.resizeFilter?{resizeFilter:this.resizeFilter.toObject()}:{}}}hasCrop(){return!!this.cropX||!!this.cropY||this.width<this._element.width||this.height<this._element.height}_toSVG(){const t=[],i=this._element,e=-this.width/2,s=-this.height/2;let h=[],r=[],n="",a="";if(!i)return[];if(this.hasCrop()){const t=l();h.push('<clipPath id="imageCrop_'+t+'">\n','\t<rect x="'+e+'" y="'+s+'" width="'+this.width+'" height="'+this.height+'" />\n',"</clipPath>\n"),n=' clip-path="url(#imageCrop_'+t+')" '}if(this.imageSmoothing||(a=' image-rendering="optimizeSpeed"'),t.push("\t<image ","COMMON_PARTS",`xlink:href="${this.getSvgSrc(!0)}" x="${e-this.cropX}" y="${s-this.cropY}" width="${i.width||i.naturalWidth}" height="${i.height||i.naturalHeight}"${a}${n}></image>\n`),this.stroke||this.strokeDashArray){const t=this.fill;this.fill=null,r=[`\t<rect x="${e}" y="${s}" width="${this.width}" height="${this.height}" style="${this.getSvgStyles()}" />\n`],this.fill=t}return h=this.paintFirst!==u?h.concat(r,t):h.concat(t,r),h}getSrc(t){const i=t?this._element:this._originalElement;return i?i.toDataURL?i.toDataURL():this.srcFromAttribute?i.getAttribute("src")||"":i.src:this.src||""}getSvgSrc(t){return this.getSrc(t)}setSrc(t){let{crossOrigin:i,signal:e}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return m(t,{crossOrigin:i,signal:e}).then((t=>{void 0!==i&&this.set({crossOrigin:i}),this.setElement(t)}))}toString(){return`#<Image: { src: "${this.getSrc()}" }>`}applyResizeFilters(){const t=this.resizeFilter,i=this.minimumScaleTrigger,e=this.getTotalObjectScaling(),h=e.x,r=e.y,l=this._filteredEl||this._originalElement;if(this.group&&this.set("dirty",!0),!t||h>i&&r>i)return this._element=l,this._filterScalingX=1,this._filterScalingY=1,this._lastScaleX=h,void(this._lastScaleY=r);const a=n(l),{width:o,height:m}=l;this._element=a,this._lastScaleX=t.scaleX=h,this._lastScaleY=t.scaleY=r,s().applyFilters([t],l,o,m,this._element),this._filterScalingX=a.width/this._originalElement.width,this._filterScalingY=a.height/this._originalElement.height}applyFilters(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.filters||[];if(t=t.filter((t=>t&&!t.isNeutralState())),this.set("dirty",!0),this.removeTexture(`${this.cacheKey}_filtered`),0===t.length)return this._element=this._originalElement,this._filteredEl=void 0,this._filterScalingX=1,void(this._filterScalingY=1);const i=this._originalElement,e=i.naturalWidth||i.width,h=i.naturalHeight||i.height;if(this._element===this._originalElement){const t=n({width:e,height:h});this._element=t,this._filteredEl=t}else this._filteredEl&&(this._element=this._filteredEl,this._filteredEl.getContext("2d").clearRect(0,0,e,h),this._lastScaleX=1,this._lastScaleY=1);s().applyFilters(t,this._originalElement,e,h,this._element,this.cacheKey),this._originalElement.width===this._element.width&&this._originalElement.height===this._element.height||(this._filterScalingX=this._element.width/this._originalElement.width,this._filterScalingY=this._element.height/this._originalElement.height)}_render(t){t.imageSmoothingEnabled=this.imageSmoothing,!0!==this.isMoving&&this.resizeFilter&&this._needsResize()&&this.applyResizeFilters(),this._stroke(t),this._renderPaintInOrder(t)}drawCacheOnCanvas(t){t.imageSmoothingEnabled=this.imageSmoothing,super.drawCacheOnCanvas(t)}shouldCache(){return this.needsItsOwnCache()}_renderFill(t){const i=this._element;if(!i)return;const e=this._filterScalingX,s=this._filterScalingY,h=this.width,r=this.height,l=Math.max(this.cropX,0),n=Math.max(this.cropY,0),a=i.naturalWidth||i.width,o=i.naturalHeight||i.height,m=l*e,g=n*s,c=Math.min(h*e,a-m),d=Math.min(r*s,o-g),_=-h/2,f=-r/2,p=Math.min(h,a/e-l),u=Math.min(r,o/s-n);i&&t.drawImage(i,m,g,c,d,_,f,p,u)}_needsResize(){const t=this.getTotalObjectScaling();return t.x!==this._lastScaleX||t.y!==this._lastScaleY}_resetWidthHeight(){this.set(this.getOriginalSize())}_setWidthHeight(){let{width:t,height:i}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const e=this.getOriginalSize();this.width=t||e.width,this.height=i||e.height}parsePreserveAspectRatioAttribute(){const t=d(this.preserveAspectRatio||""),i=this.width,e=this.height,s={width:i,height:e};let h,r=this._element.width,l=this._element.height,n=1,m=1,g=0,c=0,_=0,f=0;return!t||t.alignX===S&&t.alignY===S?(n=i/r,m=e/l):("meet"===t.meetOrSlice&&(n=m=a(this._element,s),h=(i-r*n)/2,"Min"===t.alignX&&(g=-h),"Max"===t.alignX&&(g=h),h=(e-l*m)/2,"Min"===t.alignY&&(c=-h),"Max"===t.alignY&&(c=h)),"slice"===t.meetOrSlice&&(n=m=o(this._element,s),h=r-i/n,"Mid"===t.alignX&&(_=h/2),"Max"===t.alignX&&(_=h),h=l-e/m,"Mid"===t.alignY&&(f=h/2),"Max"===t.alignY&&(f=h),r=i/n,l=e/m)),{width:r,height:l,scaleX:n,scaleY:m,offsetLeft:g,offsetTop:c,cropX:_,cropY:f}}static fromObject(t,i){let{filters:e,resizeFilter:s,src:h,crossOrigin:r,type:l,...n}=t;return Promise.all([m(h,{...i,crossOrigin:r,fallbackToEmptyImage:!0}),e&&g(e,i),s&&g([s],i),c(n,i)]).then((t=>{let[i,e=[],s=[],r={}]=t;const[l]=s;return new this(i,{...n,src:h,filters:e,resizeFilter:l,...r})}))}static fromURL(t){let{crossOrigin:i=null,signal:e}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},s=arguments.length>2?arguments[2]:void 0;return m(t,{crossOrigin:i,signal:e}).then((t=>new this(t,s)))}static async fromElement(t){let i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},e=arguments.length>2?arguments[2]:void 0;const s=r(t,this.ATTRIBUTE_NAMES,e);return this.fromURL(s["xlink:href"]||s.href,i,s).catch((t=>(w("log","Unable to parse Image",t),null)))}}t(j,"type","Image"),t(j,"cacheProperties",[...E,...y]),t(j,"ownDefaults",O),t(j,"CSS_CANVAS","canvas-img"),t(j,"ATTRIBUTE_NAMES",[...h,"x","y","width","height","preserveAspectRatio","xlink:href","href","crossOrigin","image-rendering"]),_.setClass(j),_.setSVGClass(j);export{j as FabricImage,O as imageDefaultValues};
2
2
  //# sourceMappingURL=Image.min.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Image.min.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","super","ownDefaults","constructor","arg0","options","_defineProperty","this","filters","Object","assign","setOptions","cacheKey","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","naturalWidth","height","naturalHeight","_stroke","ctx","stroke","w","h","beginPath","moveTo","lineTo","closePath","toObject","propertiesToInclude","filterObj","push","src","getSrc","hasCrop","_toSVG","imageMarkup","x","y","svgString","strokeSvg","clipPath","imageRendering","clipPathId","getSvgSrc","strokeDashArray","origFill","fill","getSvgStyles","paintFirst","FILL","concat","filtered","toDataURL","getAttribute","setSrc","signal","loadImage","then","img","set","toString","filter","minimumScale","objectScale","getTotalObjectScaling","scaleX","scaleY","elementToFilter","_filteredEl","group","_filterScalingX","_filterScalingY","_lastScaleX","_lastScaleY","canvasEl","createCanvasElementFor","isNeutralState","imgElement","sourceWidth","sourceHeight","getContext","clearRect","_render","imageSmoothingEnabled","isMoving","_needsResize","_renderPaintInOrder","drawCacheOnCanvas","shouldCache","needsItsOwnCache","_renderFill","elementToDraw","Math","max","elWidth","elHeight","sX","sY","sW","min","sH","maxDestW","maxDestH","drawImage","scale","_resetWidthHeight","parsePreserveAspectRatioAttribute","pAR","preserveAspectRatio","pWidth","pHeight","parsedAttributes","offset","rWidth","rHeight","offsetLeft","offsetTop","alignX","NONE","alignY","meetOrSlice","findScaleToFit","findScaleToCover","fromObject","_ref","f","rf","type","object","Promise","all","enlivenObjects","enlivenObjectEnlivables","_ref2","hydratedProps","fromURL","url","imageOptions","fromElement","cssRules","parseAttributes","ATTRIBUTE_NAMES","catch","err","log","cacheProperties","SHARED_ATTRIBUTES","classRegistry","setClass","setSVGClass"],"mappings":"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"}
1
+ {"version":3,"file":"Image.min.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!, {\n ...options,\n crossOrigin,\n fallbackToEmptyImage: true,\n }),\n f && enlivenObjects<BaseFilter<string>>(f, options),\n // TODO: redundant - handled by enlivenObjectEnlivables\n rf && enlivenObjects<Resize>([rf], options),\n enlivenObjectEnlivables(object, options),\n ]).then(\n ([el, filters = [], resizeFilters = [], hydratedProps = {}]: [\n HTMLImageElement,\n BaseFilter<string, Record<string, any>>[]?,\n Resize[]?,\n Record<string, any>?,\n ]) => {\n const [resizeFilter] = resizeFilters;\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 /**\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","super","ownDefaults","constructor","arg0","options","_defineProperty","this","filters","Object","assign","setOptions","cacheKey","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","naturalWidth","height","naturalHeight","_stroke","ctx","stroke","w","h","beginPath","moveTo","lineTo","closePath","toObject","propertiesToInclude","filterObj","push","src","getSrc","hasCrop","_toSVG","imageMarkup","x","y","svgString","strokeSvg","clipPath","imageRendering","clipPathId","getSvgSrc","strokeDashArray","origFill","fill","getSvgStyles","paintFirst","FILL","concat","filtered","toDataURL","getAttribute","setSrc","signal","loadImage","then","img","set","toString","filter","minimumScale","objectScale","getTotalObjectScaling","scaleX","scaleY","elementToFilter","_filteredEl","group","_filterScalingX","_filterScalingY","_lastScaleX","_lastScaleY","canvasEl","createCanvasElementFor","isNeutralState","imgElement","sourceWidth","sourceHeight","getContext","clearRect","_render","imageSmoothingEnabled","isMoving","_needsResize","_renderPaintInOrder","drawCacheOnCanvas","shouldCache","needsItsOwnCache","_renderFill","elementToDraw","Math","max","elWidth","elHeight","sX","sY","sW","min","sH","maxDestW","maxDestH","drawImage","scale","_resetWidthHeight","parsePreserveAspectRatioAttribute","pAR","preserveAspectRatio","pWidth","pHeight","parsedAttributes","offset","rWidth","rHeight","offsetLeft","offsetTop","alignX","NONE","alignY","meetOrSlice","findScaleToFit","findScaleToCover","fromObject","_ref","f","rf","type","object","Promise","all","fallbackToEmptyImage","enlivenObjects","enlivenObjectEnlivables","_ref2","resizeFilters","hydratedProps","fromURL","url","imageOptions","fromElement","cssRules","parseAttributes","ATTRIBUTE_NAMES","catch","err","log","cacheProperties","SHARED_ATTRIBUTES","classRegistry","setClass","setSVGClass"],"mappings":"mqCAmDO,MAAMA,EAA6D,CACxEC,YAAa,EACbC,kBAAkB,EAClBC,oBAAqB,GACrBC,MAAO,EACPC,MAAO,EACPC,gBAAgB,GAcZC,EAAc,CAAC,QAAS,SAKvB,MAAMC,UAKHC,EAoGR,kBAAOC,GACL,MAAO,IACFC,MAAMD,iBACNF,EAAYI,YAEnB,CAYAC,WAAAA,CAAYC,EAA4BC,GACtCJ,QA1GFK,qBAMwB,GAExBA,qBAMwB,GAExBA,yBAK4B,GAE5BA,yBAK4B,GA+E1BC,KAAKC,QAAU,GACfC,OAAOC,OAAOH,KAAMT,EAAYI,aAChCK,KAAKI,WAAWN,GAChBE,KAAKK,SAAW,UAAUC,MAC1BN,KAAKO,WACa,iBAATV,GAEAG,KAAKQ,QAAUC,EAAuBT,KAAKQ,OAAOE,eACnDC,KACAC,eAAef,GACjBA,EACJC,EAEJ,CAKAY,UAAAA,GACE,OAAOV,KAAKa,QACd,CASAN,UAAAA,CAAWO,GAAiD,IAAAC,EAAA,IAA3BC,EAAoBC,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAE,EACxDjB,KAAKoB,cAAcpB,KAAKK,UACxBL,KAAKoB,cAAc,GAAGpB,KAAKK,qBAC3BL,KAAKa,SAAWC,EAChBd,KAAKqB,iBAAmBP,EACxBd,KAAKsB,gBAAgBN,GACJD,QAAjBA,EAAAD,EAAQS,iBAARR,IAAiBA,GAAjBA,EAAmBS,IAAIjC,EAAYkC,YACP,IAAxBzB,KAAKC,QAAQiB,QACflB,KAAK0B,eAMH1B,KAAK2B,cACP3B,KAAK4B,oBAET,CAKAR,aAAAA,CAAcS,GACZ,MAAMC,EAAUC,GAAiB,GAC7BD,aAAmBE,GACrBF,EAAQG,kBAAkBJ,EAE9B,CAKAK,OAAAA,GACExC,MAAMwC,UACNlC,KAAKoB,cAAcpB,KAAKK,UACxBL,KAAKoB,cAAc,GAAGpB,KAAKK,qBAC3BL,KAAKmC,cAAgB,KAEnB,CAAC,mBAAoB,WAAY,cAAe,gBAChDC,SAASC,IACT,MAAMC,EAAKtC,KAAKqC,GAChBC,GAAMC,IAASL,QAAQI,GAEvBtC,KAAKqC,QAAclB,CAAS,GAEhC,CAKAqB,cAAAA,GACE,OACExC,KAAKqB,mBACHrB,KAAKqB,iBAAyBoB,aAAe,KAEnD,CAKAC,eAAAA,GACE,MAAM5B,EAAUd,KAAKU,aACrB,OAAKI,EAME,CACL6B,MAAO7B,EAAQ8B,cAAgB9B,EAAQ6B,MACvCE,OAAQ/B,EAAQgC,eAAiBhC,EAAQ+B,QAPlC,CACLF,MAAO,EACPE,OAAQ,EAOd,CAMAE,OAAAA,CAAQC,GACN,IAAKhD,KAAKiD,QAA+B,IAArBjD,KAAKhB,YACvB,OAEF,MAAMkE,EAAIlD,KAAK2C,MAAQ,EACrBQ,EAAInD,KAAK6C,OAAS,EACpBG,EAAII,YACJJ,EAAIK,QAAQH,GAAIC,GAChBH,EAAIM,OAAOJ,GAAIC,GACfH,EAAIM,OAAOJ,EAAGC,GACdH,EAAIM,QAAQJ,EAAGC,GACfH,EAAIM,QAAQJ,GAAIC,GAChBH,EAAIO,WACN,CAOAC,QAAAA,GAGsD,IAApDC,EAAwBxC,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,GAC3B,MAAMhB,EAAiC,GAIvC,OAHAD,KAAKC,QAAQmC,SAASsB,IACpBA,GAAazD,EAAQ0D,KAAKD,EAAUF,WAAW,IAE1C,IACF9D,MAAM8D,SAAS,IAAIlE,KAAgBmE,IACtCG,IAAK5D,KAAK6D,SACVpB,YAAazC,KAAKwC,iBAClBvC,aACID,KAAK2B,aACL,CAAEA,aAAc3B,KAAK2B,aAAa6B,YAClC,CAAE,EAEV,CAMAM,OAAAA,GACE,QACI9D,KAAKb,SACLa,KAAKZ,OACPY,KAAK2C,MAAQ3C,KAAKa,SAAS8B,OAC3B3C,KAAK6C,OAAS7C,KAAKa,SAASgC,MAEhC,CAOAkB,MAAAA,GACE,MAAMC,EAAwB,GAC5BlD,EAAUd,KAAKa,SACfoD,GAAKjE,KAAK2C,MAAQ,EAClBuB,GAAKlE,KAAK6C,OAAS,EACrB,IAAIsB,EAAsB,GACxBC,EAAsB,GACtBC,EAAW,GACXC,EAAiB,GACnB,IAAKxD,EACH,MAAO,GAET,GAAId,KAAK8D,UAAW,CAClB,MAAMS,EAAajE,IACnB6D,EAAUR,KACR,2BAA6BY,EAAa,OAC1C,cACEN,EACA,QACAC,EACA,YACAlE,KAAK2C,MACL,aACA3C,KAAK6C,OACL,SACF,iBAEFwB,EAAW,8BAAgCE,EAAa,KAC1D,CAmBA,GAlBKvE,KAAKX,iBACRiF,EAAiB,oCAEnBN,EAAYL,KACV,YACA,eACA,eAAe3D,KAAKwE,WAAU,UAAaP,EAAIjE,KAAKb,aAClD+E,EAAIlE,KAAKZ,iBAKT0B,EAAQ6B,OAAU7B,EAA6B8B,yBAE/C9B,EAAQ+B,QAAW/B,EAA6BgC,iBAC9CwB,IAAiBD,gBAGnBrE,KAAKiD,QAAUjD,KAAKyE,gBAAiB,CACvC,MAAMC,EAAW1E,KAAK2E,KACtB3E,KAAK2E,KAAO,KACZP,EAAY,CACV,cAAcH,SAASC,aAAalE,KAAK2C,kBACvC3C,KAAK6C,kBACK7C,KAAK4E,wBAEnB5E,KAAK2E,KAAOD,CACd,CAMA,OAJEP,EADEnE,KAAK6E,aAAeC,EACVX,EAAUY,OAAOX,EAAWJ,GAE5BG,EAAUY,OAAOf,EAAaI,GAErCD,CACT,CAOAN,MAAAA,CAAOmB,GACL,MAAMlE,EAAUkE,EAAWhF,KAAKa,SAAWb,KAAKqB,iBAChD,OAAIP,EACGA,EAA8BmE,UACzBnE,EAA8BmE,YAGpCjF,KAAKf,iBACA6B,EAAQoE,aAAa,QAAU,GAE9BpE,EAA6B8C,IAGhC5D,KAAK4D,KAAO,EAEvB,CAOAY,SAAAA,CAAUQ,GACR,OAAOhF,KAAK6D,OAAOmB,EACrB,CAQAG,MAAAA,CAAOvB,GAA6D,IAAhDnB,YAAEA,EAAW2C,OAAEA,GAA0BnE,UAAAC,OAAAD,QAAAE,IAAAF,UAAAE,GAAAF,UAAG,GAAA,CAAE,EAChE,OAAOoE,EAAUzB,EAAK,CAAEnB,cAAa2C,WAAUE,MAAMC,SAC5B,IAAhB9C,GAA+BzC,KAAKwF,IAAI,CAAE/C,gBACjDzC,KAAKO,WAAWgF,EAAI,GAExB,CAMAE,QAAAA,GACE,MAAO,oBAAoBzF,KAAK6D,cAClC,CAEAjC,kBAAAA,GACE,MAAM8D,EAAS1F,KAAK2B,aAClBgE,EAAe3F,KAAKd,oBACpB0G,EAAc5F,KAAK6F,wBACnBC,EAASF,EAAY3B,EACrB8B,EAASH,EAAY1B,EACrB8B,EAAkBhG,KAAKiG,aAAejG,KAAKqB,iBAI7C,GAHIrB,KAAKkG,OACPlG,KAAKwF,IAAI,SAAS,IAEfE,GAAWI,EAASH,GAAgBI,EAASJ,EAMhD,OALA3F,KAAKa,SAAWmF,EAChBhG,KAAKmG,gBAAkB,EACvBnG,KAAKoG,gBAAkB,EACvBpG,KAAKqG,YAAcP,OACnB9F,KAAKsG,YAAcP,GAGrB,MAAMQ,EAAWC,EAAuBR,IACtCrD,MAAEA,EAAKE,OAAEA,GAAWmD,EACtBhG,KAAKa,SAAW0F,EAChBvG,KAAKqG,YAAcX,EAAOI,OAASA,EACnC9F,KAAKsG,YAAcZ,EAAOK,OAASA,EACnChE,IAAmBL,aACjB,CAACgE,GACDM,EACArD,EACAE,EACA7C,KAAKa,UAEPb,KAAKmG,gBAAkBI,EAAS5D,MAAQ3C,KAAKqB,iBAAiBsB,MAC9D3C,KAAKoG,gBAAkBG,EAAS1D,OAAS7C,KAAKqB,iBAAiBwB,MACjE,CAQAnB,YAAAA,GAEE,IADAzB,EAAkDgB,UAAAC,eAAAC,IAAAF,UAAA,GAAAA,UAAG,GAAAjB,KAAKC,SAAW,GAQrE,GANAA,EAAUA,EAAQyF,QAAQA,GAAWA,IAAWA,EAAOe,mBACvDzG,KAAKwF,IAAI,SAAS,GAGlBxF,KAAKoB,cAAc,GAAGpB,KAAKK,qBAEJ,IAAnBJ,EAAQiB,OAMV,OALAlB,KAAKa,SAAWb,KAAKqB,iBAErBrB,KAAKiG,iBAAc9E,EACnBnB,KAAKmG,gBAAkB,OACvBnG,KAAKoG,gBAAkB,GAIzB,MAAMM,EAAa1G,KAAKqB,iBACtBsF,EACGD,EAAgC9D,cAAgB8D,EAAW/D,MAC9DiE,EACGF,EAAgC5D,eAAiB4D,EAAW7D,OAEjE,GAAI7C,KAAKa,WAAab,KAAKqB,iBAAkB,CAG3C,MAAMkF,EAAWC,EAAuB,CACtC7D,MAAOgE,EACP9D,OAAQ+D,IAEV5G,KAAKa,SAAW0F,EAChBvG,KAAKiG,YAAcM,CACrB,MAAWvG,KAAKiG,cAKdjG,KAAKa,SAAWb,KAAKiG,YACrBjG,KAAKiG,YACFY,WAAW,MACXC,UAAU,EAAG,EAAGH,EAAaC,GAEhC5G,KAAKqG,YAAc,EACnBrG,KAAKsG,YAAc,GAErBvE,IAAmBL,aACjBzB,EACAD,KAAKqB,iBACLsF,EACAC,EACA5G,KAAKa,SACLb,KAAKK,UAGLL,KAAKqB,iBAAiBsB,QAAU3C,KAAKa,SAAS8B,OAC9C3C,KAAKqB,iBAAiBwB,SAAW7C,KAAKa,SAASgC,SAE/C7C,KAAKmG,gBAAkBnG,KAAKa,SAAS8B,MAAQ3C,KAAKqB,iBAAiBsB,MACnE3C,KAAKoG,gBACHpG,KAAKa,SAASgC,OAAS7C,KAAKqB,iBAAiBwB,OAEnD,CAMAkE,OAAAA,CAAQ/D,GACNA,EAAIgE,sBAAwBhH,KAAKX,gBACX,IAAlBW,KAAKiH,UAAqBjH,KAAK2B,cAAgB3B,KAAKkH,gBACtDlH,KAAK4B,qBAEP5B,KAAK+C,QAAQC,GACbhD,KAAKmH,oBAAoBnE,EAC3B,CAOAoE,iBAAAA,CAEEpE,GAEAA,EAAIgE,sBAAwBhH,KAAKX,eACjCK,MAAM0H,kBAAkBpE,EAC1B,CAaAqE,WAAAA,GACE,OAAOrH,KAAKsH,kBACd,CAEAC,WAAAA,CAAYvE,GACV,MAAMwE,EAAgBxH,KAAKa,SAC3B,IAAK2G,EACH,OAEF,MAAM1B,EAAS9F,KAAKmG,gBAClBJ,EAAS/F,KAAKoG,gBACdlD,EAAIlD,KAAK2C,MACTQ,EAAInD,KAAK6C,OAET1D,EAAQsI,KAAKC,IAAI1H,KAAKb,MAAO,GAC7BC,EAAQqI,KAAKC,IAAI1H,KAAKZ,MAAO,GAC7BuI,EACGH,EAAmC5E,cAAgB4E,EAAc7E,MACpEiF,EACGJ,EAAmC1E,eACpC0E,EAAc3E,OAChBgF,EAAK1I,EAAQ2G,EACbgC,EAAK1I,EAAQ2G,EAEbgC,EAAKN,KAAKO,IAAI9E,EAAI4C,EAAQ6B,EAAUE,GACpCI,EAAKR,KAAKO,IAAI7E,EAAI4C,EAAQ6B,EAAWE,GACrC7D,GAAKf,EAAI,EACTgB,GAAKf,EAAI,EACT+E,EAAWT,KAAKO,IAAI9E,EAAGyE,EAAU7B,EAAS3G,GAC1CgJ,EAAWV,KAAKO,IAAI7E,EAAGyE,EAAW7B,EAAS3G,GAE7CoI,GACExE,EAAIoF,UAAUZ,EAAeK,EAAIC,EAAIC,EAAIE,EAAIhE,EAAGC,EAAGgE,EAAUC,EACjE,CAMAjB,YAAAA,GACE,MAAMmB,EAAQrI,KAAK6F,wBACnB,OAAOwC,EAAMpE,IAAMjE,KAAKqG,aAAegC,EAAMnE,IAAMlE,KAAKsG,WAC1D,CAMAgC,iBAAAA,GACEtI,KAAKwF,IAAIxF,KAAK0C,kBAChB,CAOApB,eAAAA,GAAwD,IAAxCqB,MAAEA,EAAKE,OAAEA,GAAwB5B,UAAAC,OAAAD,QAAAE,IAAAF,UAAAE,GAAAF,UAAG,GAAA,CAAE,EACpD,MAAMD,EAAOhB,KAAK0C,kBAClB1C,KAAK2C,MAAQA,GAAS3B,EAAK2B,MAC3B3C,KAAK6C,OAASA,GAAU7B,EAAK6B,MAC/B,CAOA0F,iCAAAA,GACE,MAAMC,EAAMD,EACRvI,KAAKyI,qBAAuB,IAE9BC,EAAS1I,KAAK2C,MACdgG,EAAU3I,KAAK6C,OACf+F,EAAmB,CAAEjG,MAAO+F,EAAQ7F,OAAQ8F,GAC9C,IAQEE,EAREC,EAAS9I,KAAKa,SAAS8B,MACzBoG,EAAU/I,KAAKa,SAASgC,OACxBiD,EAAS,EACTC,EAAS,EACTiD,EAAa,EACbC,EAAY,EACZ9J,EAAQ,EACRC,EAAQ,EA4CV,OAzCIoJ,GAAQA,EAAIU,SAAWC,GAAQX,EAAIY,SAAWD,GAsChDrD,EAAS4C,EAASI,EAClB/C,EAAS4C,EAAUI,IAtCK,SAApBP,EAAIa,cACNvD,EAASC,EAASuD,EAAetJ,KAAKa,SAAU+H,GAChDC,GAAUH,EAASI,EAAShD,GAAU,EACnB,QAAf0C,EAAIU,SACNF,GAAcH,GAEG,QAAfL,EAAIU,SACNF,EAAaH,GAEfA,GAAUF,EAAUI,EAAUhD,GAAU,EACrB,QAAfyC,EAAIY,SACNH,GAAaJ,GAEI,QAAfL,EAAIY,SACNH,EAAYJ,IAGQ,UAApBL,EAAIa,cACNvD,EAASC,EAASwD,EAAiBvJ,KAAKa,SAAU+H,GAClDC,EAASC,EAASJ,EAAS5C,EACR,QAAf0C,EAAIU,SACN/J,EAAQ0J,EAAS,GAEA,QAAfL,EAAIU,SACN/J,EAAQ0J,GAEVA,EAASE,EAAUJ,EAAU5C,EACV,QAAfyC,EAAIY,SACNhK,EAAQyJ,EAAS,GAEA,QAAfL,EAAIY,SACNhK,EAAQyJ,GAEVC,EAASJ,EAAS5C,EAClBiD,EAAUJ,EAAU5C,IAMjB,CACLpD,MAAOmG,EACPjG,OAAQkG,EACRjD,SACAC,SACAiD,aACAC,YACA9J,QACAC,QAEJ,CAsCA,iBAAOoK,CAAUC,EAEf3J,GACA,IAFEG,QAASyJ,EAAG/H,aAAcgI,EAAE/F,IAAEA,EAAGnB,YAAEA,EAAWmH,KAAEA,KAASC,GAAWJ,EAGtE,OAAOK,QAAQC,IAAI,CACjB1E,EAAUzB,EAAM,IACX9D,EACH2C,cACAuH,sBAAsB,IAExBN,GAAKO,EAAmCP,EAAG5J,GAE3C6J,GAAMM,EAAuB,CAACN,GAAK7J,GACnCoK,EAAwBL,EAAQ/J,KAC/BwF,MACD6E,IAKM,IALJ7H,EAAIrC,EAAU,GAAImK,EAAgB,GAAIC,EAAgB,CAAE,GAKzDF,EACC,MAAOxI,GAAgByI,EACvB,OAAO,IAAIpK,KAAKsC,EAAI,IACfuH,EAEHjG,MACA3D,UACA0B,kBACG0I,GACH,GAGR,CASA,cAAOC,CACLC,GAGsB,IAFtB9H,YAAEA,EAAc,KAAI2C,OAAEA,GAA0BnE,UAAAC,OAAAD,QAAAE,IAAAF,UAAAE,GAAAF,UAAG,GAAA,CAAE,EACrDuJ,EAAgBvJ,UAAAC,OAAAD,EAAAA,kBAAAE,EAEhB,OAAOkE,EAAUkF,EAAK,CAAE9H,cAAa2C,WAAUE,MAC5CC,GAAQ,IAAIvF,KAAKuF,EAAKiF,IAE3B,CAUA,wBAAaC,CACX3J,GAGA,IAFAhB,EAAkBmB,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAE,EACvByJ,EAAmBzJ,UAAAC,OAAAD,EAAAA,kBAAAE,EAEnB,MAAMyH,EAAmB+B,EACvB7J,EACAd,KAAK4K,gBACLF,GAEF,OAAO1K,KAAKsK,QACV1B,EAAiB,eAAiBA,EAAuB,KACzD9I,EACA8I,GACAiC,OAAOC,IACPC,EAAI,MAAO,wBAAyBD,GAC7B,OAEX,EACD/K,EA9xBYR,EAAW,OAmGR,SAAOQ,EAnGVR,EAqGc,kBAAA,IAAIyL,KAAoB1L,IAAYS,EArGlDR,EAAW,cAuGDR,GAAkBgB,EAvG5BR,EAAW,aAorBF,cAEpBQ,EAtrBWR,EAAW,kBA2rBG,IACpB0L,EACH,IACA,IACA,QACA,SACA,sBACA,aACA,OACA,cACA,oBA2FJC,EAAcC,SAAS5L,GACvB2L,EAAcE,YAAY7L"}
@@ -607,11 +607,13 @@ class FabricImage extends FabricObject {
607
607
  } = _ref;
608
608
  return Promise.all([loadImage(src, {
609
609
  ...options,
610
- crossOrigin
610
+ crossOrigin,
611
+ fallbackToEmptyImage: true
611
612
  }), f && enlivenObjects(f, options),
612
613
  // TODO: redundant - handled by enlivenObjectEnlivables
613
614
  rf && enlivenObjects([rf], options), enlivenObjectEnlivables(object, options)]).then(_ref2 => {
614
- let [el, filters = [], [resizeFilter] = [], hydratedProps = {}] = _ref2;
615
+ let [el, filters = [], resizeFilters = [], hydratedProps = {}] = _ref2;
616
+ const [resizeFilter] = resizeFilters;
615
617
  return new this(el, {
616
618
  ...object,
617
619
  // TODO: this creates a difference between image creation and restoring from JSON