{"version":3,"file":"ImageResource.mjs","sources":["../../../src/textures/resources/ImageResource.ts"],"sourcesContent":["import { ALPHA_MODES } from 'pixijs/constants';\nimport { settings } from 'pixijs/settings';\nimport { BaseImageResource } from './BaseImageResource';\n\nimport type { Renderer } from '../../Renderer';\nimport type { BaseTexture } from '../BaseTexture';\nimport type { GLTexture } from '../GLTexture';\n\nexport interface IImageResourceOptions\n{\n    /** Start loading process automatically when constructed. */\n    autoLoad?: boolean;\n\n    /** Whether its required to create a bitmap before upload. */\n    createBitmap?: boolean;\n\n    /** Load image using cross origin. */\n    crossorigin?: boolean | string;\n\n    /** Premultiply image alpha in bitmap. */\n    alphaMode?: ALPHA_MODES;\n}\n\n/**\n * Resource type for HTMLImageElement.\n * @memberof PIXI\n */\nexport class ImageResource extends BaseImageResource\n{\n    /** URL of the image source */\n    url: string;\n\n    /**\n     * If the image should be disposed after upload\n     * @default false\n     */\n    preserveBitmap: boolean;\n\n    /**\n     * If capable, convert the image using createImageBitmap API.\n     * @default PIXI.settings.CREATE_IMAGE_BITMAP\n     */\n    createBitmap: boolean;\n\n    /**\n     * Controls texture alphaMode field\n     * Copies from options\n     * Default is `null`, copies option from baseTexture\n     * @readonly\n     */\n    alphaMode: ALPHA_MODES;\n\n    /**\n     * The ImageBitmap element created for a {@code HTMLImageElement}.\n     * @default null\n     */\n    bitmap: ImageBitmap;\n\n    /**\n     * Promise when loading.\n     * @default null\n     */\n    private _load: Promise<ImageResource>;\n\n    /** When process is completed */\n    private _process: Promise<ImageResource>;\n\n    /**\n     * @param source - image source or URL\n     * @param options\n     * @param {boolean} [options.autoLoad=true] - start loading process\n     * @param {boolean} [options.createBitmap=PIXI.settings.CREATE_IMAGE_BITMAP] - whether its required to create\n     *        a bitmap before upload\n     * @param {boolean} [options.crossorigin=true] - Load image using cross origin\n     * @param {PIXI.ALPHA_MODES} [options.alphaMode=PIXI.ALPHA_MODES.UNPACK] - Premultiply image alpha in bitmap\n     */\n    constructor(source: HTMLImageElement | string, options?: IImageResourceOptions)\n    {\n        options = options || {};\n\n        if (typeof source === 'string')\n        {\n            const imageElement = new Image();\n\n            BaseImageResource.crossOrigin(imageElement, source, options.crossorigin);\n\n            imageElement.src = source;\n            source = imageElement;\n        }\n\n        super(source);\n\n        // FireFox 68, and possibly other versions, seems like setting the HTMLImageElement#width and #height\n        // to non-zero values before its loading completes if images are in a cache.\n        // Because of this, need to set the `_width` and the `_height` to zero to avoid uploading incomplete images.\n        // Please refer to the issue #5968 (https://github.com/pixijs/pixijs/issues/5968).\n        if (!source.complete && !!this._width && !!this._height)\n        {\n            this._width = 0;\n            this._height = 0;\n        }\n\n        this.url = source.src;\n\n        this._process = null;\n\n        this.preserveBitmap = false;\n        this.createBitmap = (options.createBitmap ?? settings.CREATE_IMAGE_BITMAP) && !!globalThis.createImageBitmap;\n        this.alphaMode = typeof options.alphaMode === 'number' ? options.alphaMode : null;\n        this.bitmap = null;\n\n        this._load = null;\n\n        if (options.autoLoad !== false)\n        {\n            this.load();\n        }\n    }\n\n    /**\n     * Returns a promise when image will be loaded and processed.\n     * @param createBitmap - whether process image into bitmap\n     */\n    load(createBitmap?: boolean): Promise<ImageResource>\n    {\n        if (this._load)\n        {\n            return this._load;\n        }\n\n        if (createBitmap !== undefined)\n        {\n            this.createBitmap = createBitmap;\n        }\n\n        this._load = new Promise((resolve, reject): void =>\n        {\n            const source = this.source as HTMLImageElement;\n\n            this.url = source.src;\n\n            const completed = (): void =>\n            {\n                if (this.destroyed)\n                {\n                    return;\n                }\n                source.onload = null;\n                source.onerror = null;\n\n                this.resize(source.width, source.height);\n                this._load = null;\n\n                if (this.createBitmap)\n                {\n                    resolve(this.process());\n                }\n                else\n                {\n                    resolve(this);\n                }\n            };\n\n            if (source.complete && source.src)\n            {\n                completed();\n            }\n            else\n            {\n                source.onload = completed;\n                source.onerror = (event): void =>\n                {\n                    // Avoids Promise freezing when resource broken\n                    reject(event);\n                    this.onError.emit(event);\n                };\n            }\n        });\n\n        return this._load;\n    }\n\n    /**\n     * Called when we need to convert image into BitmapImage.\n     * Can be called multiple times, real promise is cached inside.\n     * @returns - Cached promise to fill that bitmap\n     */\n    process(): Promise<ImageResource>\n    {\n        const source = this.source as HTMLImageElement;\n\n        if (this._process !== null)\n        {\n            return this._process;\n        }\n        if (this.bitmap !== null || !globalThis.createImageBitmap)\n        {\n            return Promise.resolve(this);\n        }\n\n        const createImageBitmap = globalThis.createImageBitmap as any;\n        const cors = !source.crossOrigin || source.crossOrigin === 'anonymous';\n\n        this._process = fetch(source.src,\n            {\n                mode: cors ? 'cors' : 'no-cors'\n            })\n            .then((r) => r.blob())\n            .then((blob) => createImageBitmap(blob,\n                0, 0, source.width, source.height,\n                {\n                    premultiplyAlpha: this.alphaMode === null || this.alphaMode === ALPHA_MODES.UNPACK\n                        ? 'premultiply' : 'none',\n                }))\n            .then((bitmap: ImageBitmap) =>\n            {\n                if (this.destroyed)\n                {\n                    return Promise.reject();\n                }\n                this.bitmap = bitmap;\n                this.update();\n                this._process = null;\n\n                return Promise.resolve(this);\n            });\n\n        return this._process;\n    }\n\n    /**\n     * Upload the image resource to GPU.\n     * @param renderer - Renderer to upload to\n     * @param baseTexture - BaseTexture for this resource\n     * @param glTexture - GLTexture to use\n     * @returns {boolean} true is success\n     */\n    override upload(renderer: Renderer, baseTexture: BaseTexture, glTexture: GLTexture): boolean\n    {\n        if (typeof this.alphaMode === 'number')\n        {\n            // bitmap stores unpack premultiply flag, we dont have to notify texImage2D about it\n\n            baseTexture.alphaMode = this.alphaMode;\n        }\n\n        if (!this.createBitmap)\n        {\n            return super.upload(renderer, baseTexture, glTexture);\n        }\n        if (!this.bitmap)\n        {\n            // yeah, ignore the output\n            this.process();\n            if (!this.bitmap)\n            {\n                return false;\n            }\n        }\n\n        super.upload(renderer, baseTexture, glTexture, this.bitmap);\n\n        if (!this.preserveBitmap)\n        {\n            // checks if there are other renderers that possibly need this bitmap\n\n            let flag = true;\n\n            const glTextures = baseTexture._glTextures;\n\n            for (const key in glTextures)\n            {\n                const otherTex = glTextures[key];\n\n                if (otherTex !== glTexture && otherTex.dirtyId !== baseTexture.dirtyId)\n                {\n                    flag = false;\n                    break;\n                }\n            }\n\n            if (flag)\n            {\n                if (this.bitmap.close)\n                {\n                    this.bitmap.close();\n                }\n\n                this.bitmap = null;\n            }\n        }\n\n        return true;\n    }\n\n    /** Destroys this resource. */\n    override dispose(): void\n    {\n        (this.source as HTMLImageElement).onload = null;\n        (this.source as HTMLImageElement).onerror = null;\n\n        super.dispose();\n\n        if (this.bitmap)\n        {\n            this.bitmap.close();\n            this.bitmap = null;\n        }\n        this._process = null;\n        this._load = null;\n    }\n\n    /**\n     * Used to auto-detect the type of resource.\n     * @param {*} source - The source object\n     * @returns {boolean} `true` if current environment support HTMLImageElement, and source is string or HTMLImageElement\n     */\n    static override test(source: unknown): source is string | HTMLImageElement\n    {\n        return typeof HTMLImageElement !== 'undefined' && (typeof source === 'string' || source instanceof HTMLImageElement);\n    }\n}\n"],"names":[],"mappings":"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"}