{"version":3,"file":"loadTextures.mjs","sources":["../../../../../src/assets/loader/parsers/textures/loadTextures.ts"],"sourcesContent":["import { DOMAdapter } from '../../../../environment/adapter';\nimport { type ImageLike } from '../../../../environment/ImageLike';\nimport { ExtensionType } from '../../../../extensions/Extensions';\nimport { ImageSource } from '../../../../rendering/renderers/shared/texture/sources/ImageSource';\nimport { getResolutionOfUrl } from '../../../../utils/network/getResolutionOfUrl';\nimport { checkDataUrl } from '../../../utils/checkDataUrl';\nimport { checkExtension } from '../../../utils/checkExtension';\nimport { WorkerManager } from '../../workers/WorkerManager';\nimport { LoaderParserPriority } from '../LoaderParser';\nimport { createTexture } from './utils/createTexture';\n\nimport type { TextureSourceOptions } from '../../../../rendering/renderers/shared/texture/sources/TextureSource';\nimport type { Texture } from '../../../../rendering/renderers/shared/texture/Texture';\nimport type { ResolvedAsset } from '../../../types';\nimport type { Loader } from '../../Loader';\nimport type { LoaderParser } from '../LoaderParser';\n\nconst validImageExtensions = ['.jpeg', '.jpg', '.png', '.webp', '.avif'];\nconst validImageMIMEs = [\n    'image/jpeg',\n    'image/png',\n    'image/webp',\n    'image/avif',\n];\n\n/**\n * Configuration for the [loadTextures]{@link loadTextures} plugin.\n * @see loadTextures\n * @category assets\n * @advanced\n */\nexport interface LoadTextureConfig\n{\n    /**\n     * When set to `true`, loading and decoding images will happen with Worker thread,\n     * if available on the browser. This is much more performant as network requests\n     * and decoding can be expensive on the CPU. However, not all environments support\n     * Workers, in some cases it can be helpful to disable by setting to `false`.\n     * @default true\n     */\n    preferWorkers: boolean;\n    /**\n     * When set to `true`, loading and decoding images will happen with `createImageBitmap`,\n     * otherwise it will use `new Image()`.\n     * @default true\n     */\n    preferCreateImageBitmap: boolean;\n    /**\n     * The crossOrigin value to use for images when `preferCreateImageBitmap` is `false`.\n     * @default 'anonymous'\n     */\n    crossOrigin: ImageLike['crossOrigin'];\n}\n\n/**\n * Returns a promise that resolves an ImageBitmaps.\n * This function is designed to be used by a worker.\n * Part of WorkerManager!\n * @param url - The image to load an image bitmap for\n * @ignore\n */\nexport async function loadImageBitmap(url: string, asset?: ResolvedAsset<TextureSourceOptions<any>>): Promise<ImageBitmap>\n{\n    const response = await DOMAdapter.get().fetch(url);\n\n    if (!response.ok)\n    {\n        throw new Error(`[loadImageBitmap] Failed to fetch ${url}: `\n            + `${response.status} ${response.statusText}`);\n    }\n\n    const imageBlob = await response.blob();\n\n    return asset?.data?.alphaMode === 'premultiplied-alpha'\n        ? createImageBitmap(imageBlob, { premultiplyAlpha: 'none' })\n        : createImageBitmap(imageBlob);\n}\n\n/**\n * A simple plugin to load our textures!\n * This makes use of imageBitmaps where available.\n * We load the `ImageBitmap` on a different thread using workers if possible.\n * We can then use the `ImageBitmap` as a source for a Pixi texture\n *\n * You can customize the behavior of this loader by setting the `config` property.\n * Which can be found [here]{@link LoadTextureConfig}\n * ```js\n * // Set the config\n * import { loadTextures } from 'pixi.js';\n *\n * loadTextures.config = {\n *    // If true we will use a worker to load the ImageBitmap\n *    preferWorkers: true,\n *    // If false we will use new Image() instead of createImageBitmap,\n *    // we'll also disable the use of workers as it requires createImageBitmap\n *    preferCreateImageBitmap: true,\n *    crossOrigin: 'anonymous',\n * };\n * ```\n * @category assets\n * @advanced\n */\nexport const loadTextures: LoaderParser<Texture, TextureSourceOptions, LoadTextureConfig> = {\n\n    /** used for deprecation purposes */\n    name: 'loadTextures',\n    id: 'texture',\n\n    extension: {\n        type: ExtensionType.LoadParser,\n        priority: LoaderParserPriority.High,\n        name: 'loadTextures',\n    },\n\n    config: {\n        preferWorkers: true,\n        preferCreateImageBitmap: true,\n        crossOrigin: 'anonymous',\n    },\n\n    test(url: string): boolean\n    {\n        return checkDataUrl(url, validImageMIMEs) || checkExtension(url, validImageExtensions);\n    },\n\n    async load(url: string, asset: ResolvedAsset<TextureSourceOptions>, loader: Loader): Promise<Texture>\n    {\n        let src: any = null;\n\n        if (globalThis.createImageBitmap && this.config.preferCreateImageBitmap)\n        {\n            if (this.config.preferWorkers && await WorkerManager.isImageBitmapSupported())\n            {\n                src = await WorkerManager.loadImageBitmap(url, asset);\n            }\n            else\n            {\n                src = await loadImageBitmap(url, asset);\n            }\n        }\n        else\n        {\n            src = await new Promise((resolve, reject) =>\n            {\n                src = DOMAdapter.get().createImage();\n                src.crossOrigin = this.config.crossOrigin;\n\n                src.src = url;\n                if (src.complete)\n                {\n                    resolve(src);\n                }\n                else\n                {\n                    src.onload = (): void =>\n                    {\n                        resolve(src);\n                    };\n                    src.onerror = reject;\n                }\n            });\n        }\n\n        const base = new ImageSource({\n            resource: src,\n            alphaMode: 'premultiply-alpha-on-upload',\n            resolution: asset.data?.resolution || getResolutionOfUrl(url),\n            ...asset.data,\n        });\n\n        return createTexture(base, loader, url);\n    },\n\n    unload(texture: Texture): void\n    {\n        texture.destroy(true);\n    }\n};\n"],"names":[],"mappings":"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"}