{"version":3,"file":"loadTextures.mjs","sources":["../../../../../src/assets/loader/parsers/textures/loadTextures.ts"],"sourcesContent":["import { DOMAdapter } from '../../../../environment/adapter';\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 assets.loadTextures} plugin.\n * @see assets.loadTextures\n * @memberof assets\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: HTMLImageElement['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 assets.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 * @memberof assets\n */\nexport const loadTextures: LoaderParser<Texture, TextureSourceOptions, LoadTextureConfig> = {\n\n    name: 'loadTextures',\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) =>\n            {\n                src = new Image();\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                }\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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"}