{"version":3,"file":"BasisParser.mjs","sources":["../../src/loader/BasisParser.ts"],"sourcesContent":["import { CompressedTextureResource } from 'pixijs/compressed-textures';\nimport { BufferResource, settings, TYPES } from 'pixijs/core';\nimport {\n    BASIS_FORMAT_TO_INTERNAL_FORMAT,\n    BASIS_FORMATS,\n    BASIS_FORMATS_ALPHA,\n    INTERNAL_FORMAT_TO_BASIS_FORMAT,\n} from '../Basis';\nimport { TranscoderWorker } from '../TranscoderWorker';\n\nimport type { CompressedLevelBuffer, INTERNAL_FORMATS } from 'pixijs/compressed-textures';\nimport type { BasisBinding, BasisTextureExtensions } from '../Basis';\n\nexport type TranscodedResourcesArray = (Array<CompressedTextureResource> | Array<BufferResource>) & {\n    basisFormat: BASIS_FORMATS\n};\n\n/**\n * Loader plugin for handling BASIS supercompressed texture files.\n *\n * To use this loader, you must bind the basis_universal WebAssembly transcoder. There are two ways of\n * doing this:\n *\n * 1. Adding a &lt;script&gt; tag to your HTML page to the transcoder bundle in this package, and serving\n * the WASM binary from the same location.\n *\n * ```html\n * <!-- Copy ./node_modules/pixijs/basis/assets/basis_.wasm into your assets directory\n *     as well, so it is served from the same folder as the JavaScript! -->\n * <script src=\"./node_modules/pixijs/basis/assets/basis_transcoder.js\"></script>\n * ```\n *\n * NOTE: `basis_transcoder.js` expects the WebAssembly binary to be named `basis_transcoder.wasm`.\n * NOTE-2: This method supports transcoding on the main-thread. Only use this if you have 1 or 2 *.basis\n * files.\n *\n * 2. Loading the transcoder source from a URL.\n *\n * ```js\n * // Use this if you to use the default CDN url for pixijs/basis\n * BasisParser.loadTranscoder();\n *\n * // Use this if you want to serve the transcoder on your own\n * BasisParser.loadTranscoder('./basis_transcoder.js', './basis_transcoder.wasm');\n * ```\n *\n * NOTE: This can only be used with web-workers.\n * @class\n * @memberof PIXI\n * @implements {PIXI.ILoaderPlugin}\n */\nexport class BasisParser\n{\n    public static basisBinding: BasisBinding;\n    private static defaultRGBFormat: { basisFormat: BASIS_FORMATS, textureFormat: INTERNAL_FORMATS | TYPES };\n    private static defaultRGBAFormat: { basisFormat: BASIS_FORMATS, textureFormat: INTERNAL_FORMATS | TYPES };\n    private static fallbackMode = false;\n    private static workerPool: TranscoderWorker[] = [];\n\n    /**\n     * Runs transcoding and populates {@link imageArray}. It will run the transcoding in a web worker\n     * if they are available.\n     * @private\n     */\n    public static async transcode(arrayBuffer: ArrayBuffer): Promise<TranscodedResourcesArray>\n    {\n        let resources: TranscodedResourcesArray;\n\n        if (typeof Worker !== 'undefined' && BasisParser.TranscoderWorker.wasmSource)\n        {\n            resources = await BasisParser.transcodeAsync(arrayBuffer);\n        }\n        else\n        {\n            resources = BasisParser.transcodeSync(arrayBuffer);\n        }\n\n        return resources;\n    }\n\n    /**\n     * Finds a suitable worker for transcoding and sends a transcoding request\n     * @private\n     * @async\n     */\n    public static async transcodeAsync(arrayBuffer: ArrayBuffer): Promise<TranscodedResourcesArray>\n    {\n        if (!BasisParser.defaultRGBAFormat && !BasisParser.defaultRGBFormat)\n        {\n            BasisParser.autoDetectFormats();\n        }\n\n        const workerPool = BasisParser.workerPool;\n\n        let leastLoad = 0x10000000;\n        let worker = null;\n\n        for (let i = 0, j = workerPool.length; i < j; i++)\n        {\n            if (workerPool[i].load < leastLoad)\n            {\n                worker = workerPool[i];\n                leastLoad = worker.load;\n            }\n        }\n\n        if (!worker)\n        {\n            /* eslint-disable-next-line no-use-before-define */\n            worker = new TranscoderWorker();\n\n            workerPool.push(worker);\n        }\n\n        // Wait until worker is ready\n        await worker.initAsync();\n\n        const response = await worker.transcodeAsync(\n            new Uint8Array(arrayBuffer),\n            BasisParser.defaultRGBAFormat.basisFormat,\n            BasisParser.defaultRGBFormat.basisFormat,\n        );\n\n        const basisFormat = response.basisFormat;\n        const imageArray = response.imageArray;\n\n        // whether it is an uncompressed format\n        const fallbackMode = basisFormat > 12;\n        let imageResources: TranscodedResourcesArray;\n\n        if (!fallbackMode)\n        {\n            const format = BASIS_FORMAT_TO_INTERNAL_FORMAT[response.basisFormat];\n\n            // HINT: this.imageArray is CompressedTextureResource[]\n            imageResources = new Array<CompressedTextureResource>(imageArray.length) as TranscodedResourcesArray;\n\n            for (let i = 0, j = imageArray.length; i < j; i++)\n            {\n                imageResources[i] = new CompressedTextureResource(null, {\n                    format,\n                    width: imageArray[i].width,\n                    height: imageArray[i].height,\n                    levelBuffers: imageArray[i].levelArray,\n                    levels: imageArray[i].levelArray.length,\n                });\n            }\n        }\n        else\n        {\n            // TODO: BufferResource does not support manual mipmapping.\n            imageResources = imageArray.map((image) => new BufferResource(\n                new Uint16Array(image.levelArray[0].levelBuffer.buffer), {\n                    width: image.width,\n                    height: image.height,\n                }),\n            ) as TranscodedResourcesArray;\n        }\n\n        imageResources.basisFormat = basisFormat;\n\n        return imageResources;\n    }\n\n    /**\n     * Runs transcoding on the main thread.\n     * @private\n     */\n    public static transcodeSync(arrayBuffer: ArrayBuffer): TranscodedResourcesArray\n    {\n        if (!BasisParser.defaultRGBAFormat && !BasisParser.defaultRGBFormat)\n        {\n            BasisParser.autoDetectFormats();\n        }\n\n        const BASIS = BasisParser.basisBinding;\n\n        const data = new Uint8Array(arrayBuffer);\n        const basisFile = new BASIS.BasisFile(data);\n        const imageCount = basisFile.getNumImages();\n        const hasAlpha = basisFile.getHasAlpha();\n\n        const basisFormat = hasAlpha\n            ? BasisParser.defaultRGBAFormat.basisFormat\n            : BasisParser.defaultRGBFormat.basisFormat;\n        const basisFallbackFormat = BASIS_FORMATS.cTFRGB565;\n        const imageResources = new Array<CompressedTextureResource | BufferResource>(imageCount);\n\n        let fallbackMode = BasisParser.fallbackMode;\n\n        if (!basisFile.startTranscoding())\n        {\n            // #if _DEBUG\n            console.error(`Basis failed to start transcoding!`);\n            // #endif\n\n            basisFile.close();\n            basisFile.delete();\n\n            return null;\n        }\n\n        for (let i = 0; i < imageCount; i++)\n        {\n            // Don't transcode all mipmap levels in fallback mode!\n            const levels = !fallbackMode ? basisFile.getNumLevels(i) : 1;\n            const width = basisFile.getImageWidth(i, 0);\n            const height = basisFile.getImageHeight(i, 0);\n            const alignedWidth = (width + 3) & ~3;\n            const alignedHeight = (height + 3) & ~3;\n\n            const imageLevels = new Array<CompressedLevelBuffer>(levels);\n\n            // Transcode mipmap levels into \"imageLevels\"\n            for (let j = 0; j < levels; j++)\n            {\n                const levelWidth = basisFile.getImageWidth(i, j);\n                const levelHeight = basisFile.getImageHeight(i, j);\n                const byteSize = basisFile.getImageTranscodedSizeInBytes(\n                    i, 0, !fallbackMode ? basisFormat : basisFallbackFormat);\n\n                imageLevels[j] = {\n                    levelID: j,\n                    levelBuffer: new Uint8Array(byteSize),\n                    levelWidth,\n                    levelHeight,\n                };\n\n                if (!basisFile.transcodeImage(\n                    imageLevels[j].levelBuffer, i, 0, !fallbackMode ? basisFormat : basisFallbackFormat, false, false))\n                {\n                    if (fallbackMode)\n                    {\n                        // #if _DEBUG\n                        console.error(`Basis failed to transcode image ${i}, level ${0}!`);\n                        // #endif\n                        break;\n                    }\n                    else\n                    {\n                        // Try transcoding to an uncompressed format before giving up!\n                        // NOTE: We must start all over again as all Resources must be in compressed OR uncompressed.\n                        i = -1;\n                        fallbackMode = true;\n\n                        // #if _DEBUG\n                        /* eslint-disable-next-line max-len */\n                        console.warn(`Basis failed to transcode image ${i}, level ${0} to a compressed texture format. Retrying to an uncompressed fallback format!`);\n                        // #endif\n                        continue;\n                    }\n                }\n            }\n\n            let imageResource;\n\n            if (!fallbackMode)\n            {\n                imageResource = new CompressedTextureResource(null, {\n                    format: BASIS_FORMAT_TO_INTERNAL_FORMAT[basisFormat],\n                    width: alignedWidth,\n                    height: alignedHeight,\n                    levelBuffers: imageLevels,\n                    levels,\n                });\n            }\n            else\n            {\n                // TODO: BufferResource doesn't support manual mipmap levels\n                imageResource = new BufferResource(\n                    new Uint16Array(imageLevels[0].levelBuffer.buffer), { width, height });\n            }\n\n            imageResources[i] = imageResource;\n        }\n\n        basisFile.close();\n        basisFile.delete();\n\n        const transcodedResources = imageResources as TranscodedResourcesArray;\n\n        transcodedResources.basisFormat = !fallbackMode ? basisFormat : basisFallbackFormat;\n\n        return transcodedResources;\n    }\n\n    /**\n     * Detects the available compressed texture formats on the device.\n     * @param extensions - extensions provided by a WebGL context\n     * @ignore\n     */\n    static autoDetectFormats(extensions?: Partial<BasisTextureExtensions>): void\n    {\n        // Auto-detect WebGL compressed-texture extensions\n        if (!extensions)\n        {\n            const canvas = settings.ADAPTER.createCanvas();\n            const gl = canvas.getContext('webgl');\n\n            if (!gl)\n            {\n                console.error('WebGL not available for BASIS transcoding. Silently failing.');\n\n                return;\n            }\n\n            extensions = {\n                s3tc: gl.getExtension('WEBGL_compressed_texture_s3tc'),\n                s3tc_sRGB: gl.getExtension('WEBGL_compressed_texture_s3tc_srgb'), /* eslint-disable-line camelcase */\n                astc: gl.getExtension('WEBGL_compressed_texture_astc'),\n                etc: gl.getExtension('WEBGL_compressed_texture_etc'),\n                etc1: gl.getExtension('WEBGL_compressed_texture_etc1'),\n                pvrtc: gl.getExtension('WEBGL_compressed_texture_pvrtc')\n                    || gl.getExtension('WEBKIT_WEBGL_compressed_texture_pvrtc'),\n                atc: gl.getExtension('WEBGL_compressed_texture_atc'),\n            };\n        }\n\n        // Discover the available texture formats\n        const supportedFormats: { [id: string]: INTERNAL_FORMATS } = {};\n\n        for (const key in extensions)\n        {\n            const extension = (extensions as any)[key];\n\n            if (!extension)\n            {\n                continue;\n            }\n\n            Object.assign(supportedFormats, Object.getPrototypeOf(extension));\n        }\n\n        // Set the default alpha/non-alpha output formats for basisu transcoding\n        for (let i = 0; i < 2; i++)\n        {\n            const detectWithAlpha = !!i;\n            let internalFormat: number;\n            let basisFormat: number;\n\n            for (const id in supportedFormats)\n            {\n                internalFormat = supportedFormats[id];\n                basisFormat = INTERNAL_FORMAT_TO_BASIS_FORMAT[internalFormat];\n\n                if (basisFormat !== undefined)\n                {\n                    if ((detectWithAlpha && BASIS_FORMATS_ALPHA[basisFormat])\n                        || (!detectWithAlpha && !BASIS_FORMATS_ALPHA[basisFormat]))\n                    {\n                        break;\n                    }\n                }\n            }\n\n            if (internalFormat)\n            {\n                BasisParser[detectWithAlpha ? 'defaultRGBAFormat' : 'defaultRGBFormat'] = {\n                    textureFormat: internalFormat,\n                    basisFormat,\n                };\n            }\n            else\n            {\n                BasisParser[detectWithAlpha ? 'defaultRGBAFormat' : 'defaultRGBFormat'] = {\n                    textureFormat: TYPES.UNSIGNED_SHORT_5_6_5,\n                    basisFormat: BASIS_FORMATS.cTFRGB565,\n                };\n\n                BasisParser.fallbackMode = true;\n            }\n        }\n    }\n\n    /**\n     * Binds the basis_universal transcoder to decompress *.basis files. You must initialize the transcoder library yourself.\n     * @example\n     * import { BasisParser } from 'pixijs/basis';\n     *\n     * // BASIS() returns a Promise-like object\n     * globalThis.BASIS().then((basisLibrary) =>\n     * {\n     *     // Initialize basis-library; otherwise, transcoded results maybe corrupt!\n     *     basisLibrary.initializeBasis();\n     *\n     *     // Bind BasisParser to the transcoder\n     *     BasisParser.bindTranscoder(basisLibrary);\n     * });\n     * @param basisLibrary - the initialized transcoder library\n     * @private\n     */\n    static bindTranscoder(basisLibrary: BasisBinding): void\n    {\n        BasisParser.basisBinding = basisLibrary;\n    }\n\n    /**\n     * Loads the transcoder source code for use in {@link PIXI.BasisParser.TranscoderWorker}.\n     * @private\n     * @param jsURL - URL to the javascript basis transcoder\n     * @param wasmURL - URL to the wasm basis transcoder\n     */\n    static loadTranscoder(jsURL: string, wasmURL: string): Promise<[void, void]>\n    {\n        return BasisParser.TranscoderWorker.loadTranscoder(jsURL, wasmURL);\n    }\n\n    /**\n     * Set the transcoder source code directly\n     * @private\n     * @param jsSource - source for the javascript basis transcoder\n     * @param wasmSource - source for the wasm basis transcoder\n     */\n    static setTranscoder(jsSource: string, wasmSource: ArrayBuffer): void\n    {\n        BasisParser.TranscoderWorker.setTranscoder(jsSource, wasmSource);\n    }\n\n    static TranscoderWorker: typeof TranscoderWorker = TranscoderWorker;\n\n    static get TRANSCODER_WORKER_POOL_LIMIT(): number\n    {\n        return this.workerPool.length || 1;\n    }\n\n    static set TRANSCODER_WORKER_POOL_LIMIT(limit: number)\n    {\n        // TODO: Destroy workers?\n        for (let i = this.workerPool.length; i < limit; i++)\n        {\n            this.workerPool[i] = new TranscoderWorker();\n            this.workerPool[i].initAsync();\n        }\n    }\n}\n"],"names":[],"mappings":"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"}