{"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 PIXI.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 }): 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":"AA+EO,SAAS,0BAChB;AACQ,MAAA;AAEJ,QAAM,kBAAkB;AAAA,IACpB,MAAM,CAAC,YAEE,KAAK,SAUV,KAAK,MAAM,EAAE,YAAY,QAAQ,WAAW,CAAC,EAAE,KAAK,CAAC,iBACrD;AACI,mBAAa,gBAAgB,GAC7B,eAAe,cAEd,KAAa,YAAY;AAAA,QACtB,MAAM;AAAA,QACN,SAAS;AAAA,MAAA,CACZ;AAAA,IACJ,CAAA,GAEM,SAnBH,QAAQ,KAAK,6BAA6B,GAEnC;AAAA,MACH,MAAM;AAAA,MACN,SAAS;AAAA,IAAA;AAAA,IAiBrB,UAAU,SACV;AACI,YAAM,YAAY,QAAQ,WACpB,QAAQ,cAER,OAAO,WACP,YAAY,IAAI,MAAM,UAAU,IAAI,GACpC,aAAa,UAAU,aAAa,GAGpC,cAFW,UAAU,YAAY,IAGjC,QAAQ,aACR,QAAQ,WACR,sBAAsB,IACtB,aAAa,IAAI,MAAM,UAAU;AAEvC,UAAI,eAAe;AAEf,UAAA,CAAC,UAAU,iBAAiB;AAE5B,eAAA,UAAU,MAAM,GAChB,UAAU,OAAA,GAEH;AAAA,UACH,MAAM;AAAA,UACN,WAAW,QAAQ;AAAA,UACnB,SAAS;AAAA,UACT,YAAY;AAAA,QAAA;AAIpB,eAAS,IAAI,GAAG,IAAI,YAAY,KAChC;AACI,cAAM,SAAS,UAAU,aAAa,CAAC,GACjC,gBAAkC;AAAA,UACpC,SAAS;AAAA,UACT,YAAY,IAAI,MAKb;AAAA,UACH,OAAO;AAAA,UACP,QAAQ;AAAA,QAAA;AAGZ,iBAAS,IAAI,GAAG,IAAI,QAAQ,KAC5B;AACI,gBAAM,SAAU,eAA6B,sBAAd,aAEzB,QAAQ,UAAU,cAAc,GAAG,CAAC,GACpC,SAAS,UAAU,eAAe,GAAG,CAAC,GACtC,WAAW,UAAU,8BAA8B,GAAG,GAAG,MAAM,GAE/D,eAAgB,QAAQ,IAAK,IAC7B,gBAAiB,SAAS,IAAK;AAGjC,gBAAM,MAEN,cAAc,QAAQ,cACtB,cAAc,SAAS;AAGrB,gBAAA,cAAc,IAAI,WAAW,QAAQ;AAEvC,cAAA,CAAC,UAAU,eAAe,aAAa,GAAG,GAAG,QAAQ,IAAO,EAAK,GACrE;AACQ,gBAAA;AAGA,qBAAA,QAAQ,MAAM,mCAAmC,CAAC,WAAW,CAAC,GAAG,GAE1D,EAAE,MAAM,aAAa,WAAW,QAAQ,WAAW,SAAS;AAI/D,oBAAA,KAAK,mCAAmC,CAAC,WAAW,CAAC,+CAA+C,GAC5G,IAAI,IACJ,eAAe;AAEf;AAAA,UACJ;AAEA,wBAAc,WAAW,KAAK;AAAA,YAC1B,SAAS;AAAA,YACT,YAAY;AAAA,YACZ,aAAa;AAAA,YACb,aAAa;AAAA,UAAA,CAChB;AAAA,QACL;AAEA,mBAAW,CAAC,IAAI;AAAA,MACpB;AAEA,aAAA,UAAU,MAAM,GAChB,UAAU,OAAA,GAEH;AAAA,QACH,MAAM;AAAA,QACN,WAAW,QAAQ;AAAA,QACnB,SAAS;AAAA,QACT,aAAc,eAA6B,sBAAd;AAAA,QAC7B;AAAA,MAAA;AAAA,IAER;AAAA,EAAA;AAGC,OAAA,YAAY,CAAC,MAClB;AACU,UAAA,MAAM,EAAE,MACR,WAAW,gBAAgB,IAAI,IAAI,EAAE,GAAU;AAEjD,gBAEC,KAAa,YAAY,QAAQ;AAAA,EAAA;AAG9C;"}