{"version":3,"file":"TranscoderWorkerWrapper.mjs","sources":["../src/TranscoderWorkerWrapper.ts"],"sourcesContent":["import type { BASIS, BASIS_FORMATS, BasisBinding } from './Basis';\n\n/**\n * Initialization message sent by the main thread.\n * @ignore\n */\nexport interface IInitializeTranscoderMessage\n{\n    wasmSource: ArrayBuffer;\n    type: 'init';\n}\n\n/**\n * Request parameters for transcoding basis files. It only supports transcoding all of the basis file at once.\n * @ignore\n */\nexport interface ITranscodeMessage\n{\n    requestID?: number;\n    rgbFormat: number;\n    rgbaFormat?: number;\n    basisData?: Uint8Array;\n    type: 'transcode';\n}\n\n/** @ignore */\nexport interface ITranscodedImage\n{\n    imageID: number;\n    levelArray: Array<{\n        levelID: number,\n        levelWidth: number,\n        levelHeight: number,\n        levelBuffer: Uint8Array\n    }>;\n    width: number;\n    height: number;\n}\n\n/**\n * Response format for {@link TranscoderWorker}.\n * @ignore\n */\nexport interface ITranscodeResponse\n{\n    type: 'init' | 'transcode';\n    requestID?: number;\n    success: boolean;\n    basisFormat?: BASIS_FORMATS;\n    imageArray?: Array<{\n        imageID: number,\n        levelArray: Array<{\n            levelID: number,\n            levelWidth: number,\n            levelHeight: number,\n            levelBuffer: Uint8Array\n        }>,\n        width: number,\n        height: number\n    }>;\n}\n\ndeclare global\n{\n    interface Window\n    {\n        BASIS: BASIS;\n    }\n}\n\n/**\n * This wraps the transcoder web-worker functionality; it can be converted into a string to get the source code. It expects\n * you to prepend the transcoder JavaScript code so that the `BASIS` namespace is available.\n *\n * The transcoder worker responds to two types of messages: \"init\" and \"transcode\". You must always send the first \"init\"\n * {@link IInitializeTranscoderMessage} message with the WebAssembly binary; if the transcoder is successfully initialized,\n * the web-worker will respond by sending another {@link ITranscodeResponse} message with `success: true`.\n * @ignore\n */\nexport function TranscoderWorkerWrapper(): void\n{\n    let basisBinding: BasisBinding;\n\n    const messageHandlers = {\n        init: (message: IInitializeTranscoderMessage): ITranscodeResponse =>\n        {\n            if (!self.BASIS)\n            {\n                console.warn('jsSource was not prepended?');\n\n                return {\n                    type: 'init',\n                    success: false\n                };\n            }\n\n            self.BASIS({ wasmBinary: message.wasmSource }).then((basisLibrary) =>\n            {\n                basisLibrary.initializeBasis();\n                basisBinding = basisLibrary;\n\n                (self as any).postMessage({\n                    type: 'init',\n                    success: true\n                });\n            });\n\n            return null;\n        },\n        transcode(message: ITranscodeMessage): ITranscodeResponse\n        {\n            const basisData = message.basisData;\n            const BASIS = basisBinding;\n\n            const data = basisData;\n            const basisFile = new BASIS.BasisFile(data);\n            const imageCount = basisFile.getNumImages();\n            const hasAlpha = basisFile.getHasAlpha();\n\n            const basisFormat = hasAlpha\n                ? message.rgbaFormat\n                : message.rgbFormat;\n            const basisFallbackFormat = 14;// BASIS_FORMATS.cTFRGB565 (cannot import values into web-worker!)\n            const imageArray = new Array(imageCount);\n\n            let fallbackMode = false;\n\n            if (!basisFile.startTranscoding())\n            {\n                basisFile.close();\n                basisFile.delete();\n\n                return {\n                    type: 'transcode',\n                    requestID: message.requestID,\n                    success: false,\n                    imageArray: null\n                };\n            }\n\n            for (let i = 0; i < imageCount; i++)\n            {\n                const levels = basisFile.getNumLevels(i);\n                const imageResource: ITranscodedImage = {\n                    imageID: i,\n                    levelArray: new Array<{\n                        levelID: number,\n                        levelWidth: number,\n                        levelHeight: number,\n                        levelBuffer: Uint8Array\n                    }>(),\n                    width: null,\n                    height: null\n                };\n\n                for (let j = 0; j < levels; j++)\n                {\n                    const format = !fallbackMode ? basisFormat : basisFallbackFormat;\n\n                    const width = basisFile.getImageWidth(i, j);\n                    const height = basisFile.getImageHeight(i, j);\n                    const byteSize = basisFile.getImageTranscodedSizeInBytes(i, j, format);\n\n                    const alignedWidth = (width + 3) & ~3;\n                    const alignedHeight = (height + 3) & ~3;\n\n                    // Level 0 is texture's actual width, height\n                    if (j === 0)\n                    {\n                        imageResource.width = alignedWidth;\n                        imageResource.height = alignedHeight;\n                    }\n\n                    const imageBuffer = new Uint8Array(byteSize);\n\n                    if (!basisFile.transcodeImage(imageBuffer, i, j, format, false, false))\n                    {\n                        if (fallbackMode)\n                        {\n                            // We failed in fallback mode as well!\n                            console.error(`Basis failed to transcode image ${i}, level ${j}!`);\n\n                            return { type: 'transcode', requestID: message.requestID, success: false };\n                        }\n\n                        /* eslint-disable-next-line max-len */\n                        console.warn(`Basis failed to transcode image ${i}, level ${j}! Retrying to an uncompressed texture format!`);\n                        i = -1;\n                        fallbackMode = true;\n\n                        break;\n                    }\n\n                    imageResource.levelArray.push({\n                        levelID: j,\n                        levelWidth: width,\n                        levelHeight: height,\n                        levelBuffer: imageBuffer\n                    });\n                }\n\n                imageArray[i] = imageResource;\n            }\n\n            basisFile.close();\n            basisFile.delete();\n\n            return {\n                type: 'transcode',\n                requestID: message.requestID,\n                success: true,\n                basisFormat: !fallbackMode ? basisFormat : basisFallbackFormat,\n                imageArray\n            };\n        }\n    };\n\n    self.onmessage = (e: { data: Partial<IInitializeTranscoderMessage | ITranscodeMessage> }): void =>\n    {\n        const msg = e.data;\n        const response = messageHandlers[msg.type](msg as any);\n\n        if (response)\n        {\n            (self as any).postMessage(response);\n        }\n    };\n}\n"],"names":[],"mappings":"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"}