{"version":3,"file":"ImageBitmapResource.mjs","sources":["../../../src/textures/resources/ImageBitmapResource.ts"],"sourcesContent":["import { ALPHA_MODES } from '@pixi/constants';\nimport { settings } from '@pixi/settings';\nimport { BaseImageResource } from './BaseImageResource';\n\nimport type { ICanvas } from '@pixi/settings';\nimport type { Renderer } from '../../Renderer';\nimport type { BaseTexture } from '../BaseTexture';\nimport type { GLTexture } from '../GLTexture';\n\n/**\n * Options for ImageBitmapResource.\n * @memberof PIXI\n */\nexport interface IImageBitmapResourceOptions\n{\n    /** Start loading process automatically when constructed. */\n    autoLoad?: boolean;\n\n    /** Load image using cross origin. */\n    crossOrigin?: boolean;\n\n    /** Alpha mode used when creating the ImageBitmap. */\n    alphaMode?: ALPHA_MODES;\n\n    /**\n     * Whether the underlying ImageBitmap is owned by the {@link PIXI.ImageBitmapResource}. When set to `true`,\n     * the underlying ImageBitmap will be disposed automatically when disposing {@link PIXI.ImageBitmapResource}.\n     * If this option is not set, whether it owns the underlying ImageBitmap is determained by the type of `source`\n     * used when constructing {@link PIXI.ImageBitmapResource}:\n     * - When `source` is `ImageBitmap`, the underlying ImageBitmap is not owned by default.\n     * - When `source` is `string` (a URL), the underlying ImageBitmap is owned by default.\n     * @see PIXI.ImageBitmapResource.ownsImageBitmap\n     */\n    ownsImageBitmap?: boolean;\n}\n\n/**\n * Resource type for ImageBitmap.\n * @memberof PIXI\n */\nexport class ImageBitmapResource extends BaseImageResource\n{\n    /** URL of the image source. */\n    url: string | null;\n\n    /**\n     * Load image using cross origin.\n     * @default false\n     */\n    crossOrigin: 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 | null;\n\n    /**\n     * Whether the underlying ImageBitmap is owned by the ImageBitmapResource.\n     * @see PIXI.IImageBitmapResourceOptions.ownsImageBitmap\n     */\n    private ownsImageBitmap: boolean;\n\n    /**\n     * Promise when loading.\n     * @default null\n     */\n    private _load: Promise<this>;\n\n    /**\n     * @param source - ImageBitmap or URL to use.\n     * @param options - Options to use.\n     */\n    constructor(source: ImageBitmap | string, options?: IImageBitmapResourceOptions)\n    {\n        options = options || {};\n\n        let baseSource;\n        let url;\n        let ownsImageBitmap;\n\n        if (typeof source === 'string')\n        {\n            baseSource = ImageBitmapResource.EMPTY;\n            url = source;\n            ownsImageBitmap = true;\n        }\n        else\n        {\n            baseSource = source;\n            url = null;\n            ownsImageBitmap = false;\n        }\n        // Using super() in if() can cause transpilation problems in some cases, so take it out of if().\n        // See https://github.com/pixijs/pixijs/pull/9093 for details.\n        super(baseSource);\n        this.url = url;\n\n        this.crossOrigin = options.crossOrigin ?? true;\n        this.alphaMode = typeof options.alphaMode === 'number' ? options.alphaMode : null;\n        this.ownsImageBitmap = options.ownsImageBitmap ?? ownsImageBitmap;\n\n        this._load = null;\n\n        if (options.autoLoad !== false)\n        {\n            this.load();\n        }\n    }\n\n    load(): Promise<this>\n    {\n        if (this._load)\n        {\n            return this._load;\n        }\n\n        this._load = new Promise(async (resolve, reject) =>\n        {\n            if (this.url === null)\n            {\n                resolve(this);\n\n                return;\n            }\n\n            try\n            {\n                const response = await settings.ADAPTER.fetch(this.url, {\n                    mode: this.crossOrigin ? 'cors' : 'no-cors'\n                });\n\n                if (this.destroyed) return;\n\n                const imageBlob = await response.blob();\n\n                if (this.destroyed) return;\n\n                const imageBitmap = await createImageBitmap(imageBlob, {\n                    premultiplyAlpha: this.alphaMode === null || this.alphaMode === ALPHA_MODES.UNPACK\n                        ? 'premultiply' : 'none',\n                });\n\n                if (this.destroyed)\n                {\n                    imageBitmap.close();\n\n                    return;\n                }\n\n                this.source = imageBitmap;\n                this.update();\n\n                resolve(this);\n            }\n            catch (e)\n            {\n                if (this.destroyed) return;\n\n                reject(e);\n                this.onError.emit(e);\n            }\n        });\n\n        return this._load;\n    }\n\n    /**\n     * Upload the image bitmap 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 (!(this.source instanceof ImageBitmap))\n        {\n            this.load();\n\n            return false;\n        }\n\n        if (typeof this.alphaMode === 'number')\n        {\n            baseTexture.alphaMode = this.alphaMode;\n        }\n\n        return super.upload(renderer, baseTexture, glTexture);\n    }\n\n    /** Destroys this resource. */\n    override dispose(): void\n    {\n        if (this.ownsImageBitmap && this.source instanceof ImageBitmap)\n        {\n            this.source.close();\n        }\n\n        super.dispose();\n\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 ImageBitmap, and source is string or ImageBitmap\n     */\n    static override test(source: unknown): source is string | ImageBitmap\n    {\n        return !!globalThis.createImageBitmap && typeof ImageBitmap !== 'undefined'\n            && (typeof source === 'string' || source instanceof ImageBitmap);\n    }\n\n    /**\n     * Cached empty placeholder canvas.\n     * @see EMPTY\n     */\n    private static _EMPTY: ICanvas;\n\n    /**\n     * ImageBitmap cannot be created synchronously, so a empty placeholder canvas is needed when loading from URLs.\n     * Only for internal usage.\n     * @returns The cached placeholder canvas.\n     */\n    private static get EMPTY(): ICanvas\n    {\n        ImageBitmapResource._EMPTY = ImageBitmapResource._EMPTY ?? settings.ADAPTER.createCanvas(0, 0);\n\n        return ImageBitmapResource._EMPTY;\n    }\n}\n"],"names":[],"mappings":";;;AAwCO,MAAM,4BAA4B,kBACzC;AAAA;AAAA;AAAA;AAAA;AAAA,EAkCI,YAAY,QAA8B,SAC1C;AACI,cAAU,WAAW;AAErB,QAAI,YACA,KACA;AAEA,WAAO,UAAW,YAElB,aAAa,oBAAoB,OACjC,MAAM,QACN,kBAAkB,OAIlB,aAAa,QACb,MAAM,MACN,kBAAkB,KAItB,MAAM,UAAU,GAChB,KAAK,MAAM,KAEX,KAAK,cAAc,QAAQ,eAAe,IAC1C,KAAK,YAAY,OAAO,QAAQ,aAAc,WAAW,QAAQ,YAAY,MAC7E,KAAK,kBAAkB,QAAQ,mBAAmB,iBAElD,KAAK,QAAQ,MAET,QAAQ,aAAa,MAErB,KAAK;EAEb;AAAA,EAEA,OACA;AACQ,WAAA,KAAK,QAEE,KAAK,SAGhB,KAAK,QAAQ,IAAI,QAAQ,OAAO,SAAS,WACzC;AACQ,UAAA,KAAK,QAAQ,MACjB;AACI,gBAAQ,IAAI;AAEZ;AAAA,MACJ;AAGA,UAAA;AACI,cAAM,WAAW,MAAM,SAAS,QAAQ,MAAM,KAAK,KAAK;AAAA,UACpD,MAAM,KAAK,cAAc,SAAS;AAAA,QAAA,CACrC;AAED,YAAI,KAAK;AAAW;AAEd,cAAA,YAAY,MAAM,SAAS;AAEjC,YAAI,KAAK;AAAW;AAEd,cAAA,cAAc,MAAM,kBAAkB,WAAW;AAAA,UACnD,kBAAkB,KAAK,cAAc,QAAQ,KAAK,cAAc,YAAY,SACtE,gBAAgB;AAAA,QAAA,CACzB;AAED,YAAI,KAAK,WACT;AACI,sBAAY,MAAM;AAElB;AAAA,QACJ;AAEA,aAAK,SAAS,aACd,KAAK,UAEL,QAAQ,IAAI;AAAA,eAET,GACP;AACI,YAAI,KAAK;AAAW;AAEpB,eAAO,CAAC,GACR,KAAK,QAAQ,KAAK,CAAC;AAAA,MACvB;AAAA,IAAA,CACH,GAEM,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASS,OAAO,UAAoB,aAA0B,WAC9D;AACI,WAAM,KAAK,kBAAkB,eAOzB,OAAO,KAAK,aAAc,aAE1B,YAAY,YAAY,KAAK,YAG1B,MAAM,OAAO,UAAU,aAAa,SAAS,MAVhD,KAAK,QAEE;AAAA,EASf;AAAA;AAAA,EAGS,UACT;AACQ,SAAK,mBAAmB,KAAK,kBAAkB,eAE/C,KAAK,OAAO,MAGhB,GAAA,MAAM,QAAQ,GAEd,KAAK,QAAQ;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAgB,KAAK,QACrB;AACW,WAAA,CAAC,CAAC,WAAW,qBAAqB,OAAO,cAAgB,QACxD,OAAO,UAAW,YAAY,kBAAkB;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,WAAmB,QACnB;AACwB,WAAA,oBAAA,SAAS,oBAAoB,UAAU,SAAS,QAAQ,aAAa,GAAG,CAAC,GAEtF,oBAAoB;AAAA,EAC/B;AACJ;"}