@bis-toolkit/edds 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +674 -0
- package/README.md +49 -0
- package/dist/Edds.d.ts +17 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +1509 -0
- package/dist/index.js.map +7 -0
- package/package.json +55 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../utils/src/BinaryReader.ts", "../../utils/src/Lz4.ts", "../../utils/src/Lzo.ts", "../../utils/src/Lzss.ts", "../../bcn/src/utils.ts", "../../bcn/src/bc1.ts", "../../bcn/src/bc2.ts", "../../bcn/src/bc3.ts", "../../bcn/src/bc4.ts", "../../bcn/src/bc5.ts", "../../bcn/src/bc7.ts", "../src/Edds.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Binary reader utility for reading binary data from a buffer\n * Works with both Node.js Buffer and browser Uint8Array\n */\nexport class BinaryReader {\n protected buffer: Uint8Array;\n protected view: DataView;\n protected position = 0;\n\n constructor(buffer: Buffer | Uint8Array) {\n // Ensure we have a Uint8Array - Buffer extends Uint8Array so instanceof check covers both\n this.buffer = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer);\n this.view = new DataView(this.buffer.buffer, this.buffer.byteOffset, this.buffer.byteLength);\n }\n\n get length(): number {\n return this.buffer.length;\n }\n\n get pos(): number {\n return this.position;\n }\n\n seek(offset: number, origin: 'begin' | 'current' | 'end' = 'begin'): void {\n switch (origin) {\n case 'begin':\n this.position = offset;\n break;\n case 'current':\n this.position += offset;\n break;\n case 'end':\n this.position = this.buffer.length + offset;\n break;\n }\n }\n\n readByte(): number {\n const value = this.view.getUint8(this.position);\n this.position += 1;\n return value;\n }\n\n readUInt16(): number {\n const value = this.view.getUint16(this.position, true); // true = little endian\n this.position += 2;\n return value;\n }\n\n readUInt32(): number {\n const value = this.view.getUint32(this.position, true);\n this.position += 4;\n return value;\n }\n\n readInt32(): number {\n const value = this.view.getInt32(this.position, true);\n this.position += 4;\n return value;\n }\n\n readInt24(): number {\n const b1 = this.view.getUint8(this.position);\n const b2 = this.view.getUint8(this.position + 1);\n const b3 = this.view.getUint8(this.position + 2);\n this.position += 3;\n return b1 | (b2 << 8) | (b3 << 16);\n }\n\n readBytes(count: number): Uint8Array {\n const bytes = this.buffer.subarray(this.position, this.position + count);\n this.position += count;\n return bytes;\n }\n\n readRawString(length: number): string {\n const bytes = this.buffer.subarray(this.position, this.position + length);\n this.position += length;\n return String.fromCharCode(...bytes);\n }\n\n readFloat(): number {\n const value = this.view.getFloat32(this.position, true);\n this.position += 4;\n return value;\n }\n\n readBoolean(): boolean {\n return this.readByte() !== 0;\n }\n\n /**\n * Read a null-terminated C-style string\n */\n readCString(): string {\n const start = this.position;\n let end = start;\n \n // Find null terminator\n while (end < this.buffer.length && this.buffer[end] !== 0) {\n end++;\n }\n \n const bytes = this.buffer.subarray(start, end);\n this.position = end + 1; // Skip null terminator\n \n // Decode as UTF-8\n const decoder = new TextDecoder('utf-8');\n return decoder.decode(bytes);\n }\n\n /**\n * Alias for readRawString for compatibility\n */\n readString(length: number): string {\n return this.readRawString(length);\n }\n}\n", "import { BinaryReader } from './BinaryReader';\n\n/**\n * Decompresses an LZ4 block with the declared size from the reader.\n * This implementation supports LZ4 chain decoder which maintains a dictionary across chunks.\n * \n * @param reader - Binary reader positioned at the start of the LZ4 block\n * @param declaredSize - The declared size of the LZ4 block (including headers)\n * @returns Decompressed data as Uint8Array\n */\nexport function decompressLz4Block(reader: BinaryReader, declaredSize: number): Uint8Array {\n const startPos = reader.pos;\n const targetSize = reader.readUInt32();\n const target = new Uint8Array(targetSize);\n let targetIdx = 0;\n\n // LZ4 chain decoder - maintains dictionary across chunks\n const LzBlockSize = 65536;\n const dict = new Uint8Array(LzBlockSize);\n let dictSize = 0;\n\n // Each chunk is: compressedSize (int24), flags (byte), compressedData\n while (true) {\n const compressedSize = reader.readInt24();\n const flags = reader.readByte();\n if ((flags & ~0x80) !== 0) {\n throw new Error(`Unknown LZ4 flags 0x${flags.toString(16)}`);\n }\n\n const compressed = reader.readBytes(compressedSize);\n const decoded = decompressLz4BlockWithDict(compressed, dict, dictSize);\n if (targetIdx + decoded.length > target.length) {\n throw new Error('Decoded LZ4 data overruns target buffer');\n }\n target.set(decoded, targetIdx);\n targetIdx += decoded.length;\n\n // Update dictionary with decoded data\n if (decoded.length >= LzBlockSize) {\n // Copy last LZ_BLOCK_SIZE bytes\n dict.set(decoded.subarray(decoded.length - LzBlockSize));\n dictSize = LzBlockSize;\n } else {\n // Append to dictionary, possibly overflowing\n const available = LzBlockSize - dictSize;\n if (decoded.length <= available) {\n dict.set(decoded, dictSize);\n dictSize += decoded.length;\n } else {\n // Shift and append\n const shift = decoded.length - available;\n dict.copyWithin(0, shift);\n dict.set(decoded, LzBlockSize - decoded.length);\n dictSize = LzBlockSize;\n }\n }\n\n if ((flags & 0x80) !== 0) {\n break;\n }\n }\n\n if (startPos + declaredSize !== reader.pos) {\n throw new Error('LZ4 block length mismatch');\n }\n if (targetIdx !== targetSize) {\n throw new Error(`LZ4 decoded size mismatch (expected ${targetSize}, got ${targetIdx})`);\n }\n\n return target;\n}\n\n/**\n * Decompresses an LZ4 block with dictionary support.\n * \n * @param compressed - Compressed data\n * @param dict - Dictionary buffer for LZ4 chain decoder\n * @param dictSize - Current size of valid data in dictionary\n * @returns Decompressed data as Uint8Array\n */\nfunction decompressLz4BlockWithDict(compressed: Uint8Array, dict: Uint8Array, dictSize: number): Uint8Array {\n const output: number[] = [];\n let src = 0;\n\n while (src < compressed.length) {\n const token = compressed[src++];\n let literalLength = token >> 4;\n if (literalLength === 15) {\n let len = 0;\n do {\n len = compressed[src++];\n literalLength += len;\n } while (len === 255 && src < compressed.length);\n }\n\n // Copy literals\n for (let i = 0; i < literalLength; i++) {\n output.push(compressed[src++]);\n }\n\n if (src >= compressed.length) {\n break; // No more matches\n }\n\n const offset = compressed[src] | (compressed[src + 1] << 8);\n src += 2;\n\n let matchLength = token & 0x0f;\n if (matchLength === 15) {\n let len = 0;\n do {\n len = compressed[src++];\n matchLength += len;\n } while (len === 255 && src < compressed.length);\n }\n matchLength += 4;\n\n // LZ4 chain decoder: offset can reference into dictionary or output\n if (offset === 0) {\n throw new Error('Invalid LZ4 offset');\n }\n\n // Copy from dictionary and/or output\n const totalAvailable = dictSize + output.length;\n if (offset > totalAvailable) {\n throw new Error('Invalid LZ4 offset');\n }\n\n for (let i = 0; i < matchLength; i++) {\n const backPos = output.length - offset;\n if (backPos >= 0) {\n // Copy from output\n output.push(output[backPos]);\n } else {\n // Copy from dictionary\n const dictPos = dictSize + backPos;\n output.push(dict[dictPos]);\n }\n }\n }\n\n return Uint8Array.from(output);\n}\n", "/**\n * LZO1X compression and decompression\n * Based on https://github.com/thaumictom/lzo-ts\n * @license GPL-3.0\n */\n\nexport interface LzoDecompressResult {\n data: Uint8Array;\n bytesRead: number;\n}\n\n/**\n * Compress and decompress data using the LZO1X-1 algorithm.\n */\nexport class LZO {\n private _blockSize = 128 * 1024;\n\n public get blockSize(): number {\n return this._blockSize;\n }\n\n public set blockSize(value: number) {\n if (value <= 0) throw new Error('Block size must be a positive integer');\n this._blockSize = value;\n }\n\n private _minNewSize = this.blockSize;\n\n private _out = new Uint8Array(256 * 1024);\n private _cbl = 0;\n private _t = 0;\n\n private _inputPointer = 0;\n private _outputPointer = 0;\n private _matchPosition = 0;\n\n private _skipToFirstLiteralFunc = false;\n\n private _buffer!: Uint8Array;\n\n private _extendBuffer(): void {\n const newBuffer = new Uint8Array(\n this._minNewSize + (this.blockSize - (this._minNewSize % this.blockSize))\n );\n\n newBuffer.set(this._out);\n\n this._out = newBuffer;\n this._cbl = this._out.length;\n }\n\n private _matchNext(): void {\n this._minNewSize = this._outputPointer + 3;\n\n if (this._minNewSize > this._cbl) this._extendBuffer();\n\n this._out[this._outputPointer++] = this._buffer[this._inputPointer++];\n\n if (this._t > 1) {\n this._out[this._outputPointer++] = this._buffer[this._inputPointer++];\n if (this._t > 2) {\n this._out[this._outputPointer++] = this._buffer[this._inputPointer++];\n }\n }\n\n this._t = this._buffer[this._inputPointer++];\n }\n\n private _matchDone(): number {\n this._t = this._buffer[this._inputPointer - 2] & 3;\n return this._t;\n }\n\n private _copyMatch(): void {\n this._t += 2;\n this._minNewSize = this._outputPointer + this._t;\n if (this._minNewSize > this._cbl) {\n this._extendBuffer();\n }\n\n do {\n this._out[this._outputPointer++] = this._out[this._matchPosition++];\n } while (--this._t > 0);\n }\n\n private _copyFromBuffer(): void {\n this._minNewSize = this._outputPointer + this._t;\n if (this._minNewSize > this._cbl) {\n this._extendBuffer();\n }\n\n do {\n this._out[this._outputPointer++] = this._buffer[this._inputPointer++];\n } while (--this._t > 0);\n }\n\n private _match(): boolean | Uint8Array {\n while (true) {\n if (this._t >= 64) {\n this._matchPosition =\n this._outputPointer -\n 1 -\n ((this._t >> 2) & 7) -\n (this._buffer[this._inputPointer++] << 3);\n this._t = (this._t >> 5) - 1;\n\n this._copyMatch();\n } else if (this._t >= 32) {\n this._t &= 31;\n\n if (this._t === 0) {\n while (this._buffer[this._inputPointer] === 0) {\n this._t += 255;\n this._inputPointer++;\n }\n\n this._t += 31 + this._buffer[this._inputPointer++];\n }\n\n this._matchPosition =\n this._outputPointer -\n 1 -\n (this._buffer[this._inputPointer] >> 2) -\n (this._buffer[this._inputPointer + 1] << 6);\n this._inputPointer += 2;\n\n this._copyMatch();\n } else if (this._t >= 16) {\n this._matchPosition = this._outputPointer - ((this._t & 8) << 11);\n\n this._t &= 7;\n\n if (this._t === 0) {\n while (this._buffer[this._inputPointer] === 0) {\n this._t += 255;\n this._inputPointer++;\n }\n\n this._t += 7 + this._buffer[this._inputPointer++];\n }\n\n this._matchPosition -=\n (this._buffer[this._inputPointer] >> 2) +\n (this._buffer[this._inputPointer + 1] << 6);\n this._inputPointer += 2;\n\n // End reached\n if (this._matchPosition === this._outputPointer) {\n return this._out.subarray(0, this._outputPointer);\n } else {\n this._matchPosition -= 0x4000;\n this._copyMatch();\n }\n } else {\n this._matchPosition =\n this._outputPointer - 1 - (this._t >> 2) - (this._buffer[this._inputPointer++] << 2);\n\n this._minNewSize = this._outputPointer + 2;\n\n if (this._minNewSize > this._cbl) {\n this._extendBuffer();\n }\n\n this._out[this._outputPointer++] = this._out[this._matchPosition++];\n this._out[this._outputPointer++] = this._out[this._matchPosition];\n }\n\n if (this._matchDone() === 0) {\n return true;\n }\n\n this._matchNext();\n }\n }\n\n private _decompressBuffer(buffer: Uint8Array): Uint8Array {\n this._buffer = buffer;\n\n this._cbl = this._out.length;\n\n this._t = 0;\n this._inputPointer = 0;\n this._outputPointer = 0;\n this._matchPosition = 0;\n\n this._skipToFirstLiteralFunc = false;\n\n if (this._buffer[this._inputPointer] > 17) {\n this._t = this._buffer[this._inputPointer++] - 17;\n\n if (this._t < 4) {\n this._matchNext();\n\n const matched = this._match();\n\n if (matched !== true) return matched as Uint8Array;\n } else {\n this._copyFromBuffer();\n this._skipToFirstLiteralFunc = true;\n }\n }\n\n while (true) {\n if (!this._skipToFirstLiteralFunc) {\n this._t = this._buffer[this._inputPointer++];\n\n if (this._t >= 16) {\n const matched = this._match();\n\n if (matched !== true) return matched as Uint8Array;\n\n continue;\n } else if (this._t === 0) {\n while (this._buffer[this._inputPointer] === 0) {\n this._t += 255;\n this._inputPointer++;\n }\n\n this._t += 15 + this._buffer[this._inputPointer++];\n }\n\n this._t += 3;\n this._copyFromBuffer();\n } else this._skipToFirstLiteralFunc = false;\n\n this._t = this._buffer[this._inputPointer++];\n\n if (this._t < 16) {\n this._matchPosition = this._outputPointer - (1 + 0x0800);\n this._matchPosition -= this._t >> 2;\n this._matchPosition -= this._buffer[this._inputPointer++] << 2;\n\n this._minNewSize = this._outputPointer + 3;\n\n if (this._minNewSize > this._cbl) {\n this._extendBuffer();\n }\n\n this._out[this._outputPointer++] = this._out[this._matchPosition++];\n this._out[this._outputPointer++] = this._out[this._matchPosition++];\n this._out[this._outputPointer++] = this._out[this._matchPosition];\n\n if (this._matchDone() === 0) continue;\n else this._matchNext();\n }\n\n const matched = this._match();\n\n if (matched !== true) return matched as Uint8Array;\n }\n }\n\n /**\n * Decompresses the given buffer using the LZO1X-1 algorithm.\n * @param buffer The buffer to decompress.\n * @returns The decompressed buffer.\n */\n static decompress(buffer: Uint8Array | number[]): Uint8Array {\n return new LZO()._decompressBuffer(buffer as Uint8Array);\n }\n\n /**\n * Decompresses the given buffer and returns both the decompressed data and bytes read.\n * @param buffer The buffer to decompress.\n * @returns Object containing decompressed data and number of bytes consumed from input.\n */\n static decompressWithSize(buffer: Uint8Array | number[]): LzoDecompressResult {\n const lzo = new LZO();\n const decompressed = lzo._decompressBuffer(buffer as Uint8Array);\n return {\n data: decompressed,\n bytesRead: lzo._inputPointer\n };\n }\n}\n\n/**\n * Simple decompression helper\n */\nexport function lzoDecompress(src: Uint8Array | Buffer, expectedSize: number): Uint8Array {\n const input = src instanceof Uint8Array ? src : new Uint8Array(src);\n const decompressed = LZO.decompress(input);\n\n if (decompressed.length !== expectedSize) {\n throw new Error(`LZO decompression size mismatch: expected ${expectedSize}, got ${decompressed.length}`);\n }\n\n return decompressed;\n}\n\n/**\n * Decompression with size tracking\n */\nexport function lzoDecompressWithSize(src: Uint8Array | Buffer, expectedSize: number): LzoDecompressResult {\n const input = src instanceof Uint8Array ? src : new Uint8Array(src);\n const result = LZO.decompressWithSize(input);\n\n if (result.data.length !== expectedSize) {\n throw new Error(`LZO decompression size mismatch: expected ${expectedSize}, got ${result.data.length}`);\n }\n\n return result;\n}\n", "/**\n * LZSS (Lempel-Ziv-Storer-Szymanski) decompression\n */\n\nconst N = 4096;\nconst F = 18;\nconst THRESHOLD = 2;\n\n/**\n * Decompress LZSS compressed data\n * @param input Input stream containing compressed data\n * @param expectedSize Expected size of decompressed output\n * @param useSignedChecksum Whether to use signed checksum calculation\n * @returns Object containing decompressed data and bytes read\n */\nexport function lzssDecompress(\n input: Buffer | Uint8Array,\n inputOffset: number,\n expectedSize: number,\n useSignedChecksum = false\n): { data: Uint8Array; bytesRead: number } {\n const buffer = new Array<number>(N + F - 1);\n const dst = new Uint8Array(expectedSize);\n\n if (expectedSize <= 0) {\n return { data: new Uint8Array(0), bytesRead: 0 };\n }\n\n const startPos = inputOffset;\n let inPos = inputOffset;\n let iDst = 0;\n\n let calculatedChecksum = 0;\n let r = N - F;\n \n // Initialize buffer with spaces\n for (let i = 0; i < r; i++) {\n buffer[i] = 0x20; // space character\n }\n\n let flags = 0;\n while (expectedSize > 0) {\n if (((flags >>>= 1) & 256) === 0) {\n const c = input[inPos++];\n flags = c | 0xff00;\n }\n\n if ((flags & 1) !== 0) {\n // Literal byte\n const c = input[inPos++];\n calculatedChecksum = (calculatedChecksum + (useSignedChecksum ? (c << 24 >> 24) : c)) | 0;\n dst[iDst++] = c;\n expectedSize--;\n \n // Update ring buffer\n buffer[r] = c;\n r = (r + 1) & (N - 1);\n } else {\n // Match (backreference)\n const i = input[inPos++];\n const j = input[inPos++];\n const offset = i | ((j & 0xf0) << 4);\n const length = (j & 0x0f) + THRESHOLD;\n\n if (length + 1 > expectedSize + length - THRESHOLD) {\n throw new Error('LZSS overflow');\n }\n\n let ii = r - offset;\n const jj = length + ii;\n \n for (; ii <= jj; ii++) {\n const c = buffer[ii & (N - 1)];\n calculatedChecksum = (calculatedChecksum + (useSignedChecksum ? (c << 24 >> 24) : c)) | 0;\n \n // Save byte\n dst[iDst++] = c;\n expectedSize--;\n \n // Update ring buffer\n buffer[r] = c;\n r = (r + 1) & (N - 1);\n }\n }\n }\n\n // Read and verify checksum using DataView\n const view = new DataView(input.buffer, input.byteOffset, input.byteLength);\n const checksum = view.getInt32(inPos, true); // true = little endian\n inPos += 4;\n\n if (checksum !== calculatedChecksum) {\n throw new Error(`Checksum mismatch: expected ${checksum}, got ${calculatedChecksum}`);\n }\n\n return {\n data: dst,\n bytesRead: inPos - startPos\n };\n}\n\n/**\n * Calculate CRC/checksum for data\n */\nexport function calculateChecksum(data: Buffer, signed = false): number {\n let checksum = 0;\n for (const byte of data) {\n checksum = (checksum + (signed ? (byte << 24 >> 24) : byte)) | 0;\n }\n return checksum;\n}\n", "/**\n * Shared utilities for BC decoders\n * Source: https://github.com/Nominom/BCnEncoder.NET\n */\n\nexport interface ColorRgba32 {\n r: number;\n g: number;\n b: number;\n a: number;\n}\n\nexport interface ColorRgb24 {\n r: number;\n g: number;\n b: number;\n}\n\n// RGB565 color (5 bits red, 6 bits green, 5 bits blue)\nexport class ColorRgb565 {\n data: number;\n\n constructor(r?: number, g?: number, b?: number) {\n if (r !== undefined && g !== undefined && b !== undefined) {\n // Convert 8-bit RGB to 565\n const r5 = (r >> 3) & 0x1F;\n const g6 = (g >> 2) & 0x3F;\n const b5 = (b >> 3) & 0x1F;\n this.data = (r5 << 11) | (g6 << 5) | b5;\n } else {\n this.data = 0;\n }\n }\n\n toColorRgb24(): ColorRgb24 {\n const r5 = (this.data >> 11) & 0x1F;\n const g6 = (this.data >> 5) & 0x3F;\n const b5 = this.data & 0x1F;\n\n // Expand to 8-bit\n const r = (r5 << 3) | (r5 >> 2);\n const g = (g6 << 2) | (g6 >> 4);\n const b = (b5 << 3) | (b5 >> 2);\n\n return { r, g, b };\n }\n}\n\n// Color interpolation helpers\nexport function interpolateHalf(c0: ColorRgb24, c1: ColorRgb24): ColorRgb24 {\n return {\n r: ((c0.r + c1.r) / 2) | 0,\n g: ((c0.g + c1.g) / 2) | 0,\n b: ((c0.b + c1.b) / 2) | 0\n };\n}\n\nexport function interpolateThird(c0: ColorRgb24, c1: ColorRgb24, step: number): ColorRgb24 {\n if (step === 1) {\n return {\n r: ((2 * c0.r + c1.r) / 3) | 0,\n g: ((2 * c0.g + c1.g) / 3) | 0,\n b: ((2 * c0.b + c1.b) / 3) | 0\n };\n } else { // step === 2\n return {\n r: ((c0.r + 2 * c1.r) / 3) | 0,\n g: ((c0.g + 2 * c1.g) / 3) | 0,\n b: ((c0.b + 2 * c1.b) / 3) | 0\n };\n }\n}\n\n// Byte interpolation for alpha/component channels\nexport function interpolateByteFifth(e0: number, e1: number, step: number): number {\n if (step === 1) return ((4 * e0 + e1) / 5) | 0;\n if (step === 2) return ((3 * e0 + 2 * e1) / 5) | 0;\n if (step === 3) return ((2 * e0 + 3 * e1) / 5) | 0;\n return ((e0 + 4 * e1) / 5) | 0; // step === 4\n}\n\nexport function interpolateByteSeventh(e0: number, e1: number, step: number): number {\n if (step === 1) return ((6 * e0 + e1) / 7) | 0;\n if (step === 2) return ((5 * e0 + 2 * e1) / 7) | 0;\n if (step === 3) return ((4 * e0 + 3 * e1) / 7) | 0;\n if (step === 4) return ((3 * e0 + 4 * e1) / 7) | 0;\n if (step === 5) return ((2 * e0 + 5 * e1) / 7) | 0;\n return ((e0 + 6 * e1) / 7) | 0; // step === 6\n}\n", "/**\n * BC1 (DXT1) Decoder\n * Source: https://github.com/Nominom/BCnEncoder.NET\n */\n\nimport { ColorRgb565, interpolateHalf, interpolateThird } from './utils';\n\nexport function decodeBC1(data: DataView, width: number, height: number, useAlpha = false): Uint8Array {\n const rgba = new Uint8Array(width * height * 4);\n const blocksX = Math.ceil(width / 4);\n const blocksY = Math.ceil(height / 4);\n\n let offset = 0;\n for (let by = 0; by < blocksY; by++) {\n for (let bx = 0; bx < blocksX; bx++) {\n const color0Data = data.getUint16(offset, true);\n const color1Data = data.getUint16(offset + 2, true);\n const indices = data.getUint32(offset + 4, true);\n\n const color0 = new ColorRgb565();\n color0.data = color0Data;\n const color1 = new ColorRgb565();\n color1.data = color1Data;\n\n const c0 = color0.toColorRgb24();\n const c1 = color1.toColorRgb24();\n\n const hasAlphaOrBlack = color0Data <= color1Data;\n const actualUseAlpha = useAlpha && hasAlphaOrBlack;\n\n // Build color palette\n const colors = hasAlphaOrBlack ? [\n c0,\n c1,\n interpolateHalf(c0, c1),\n { r: 0, g: 0, b: 0 }\n ] : [\n c0,\n c1,\n interpolateThird(c0, c1, 1),\n interpolateThird(c0, c1, 2)\n ];\n\n // Decode 4x4 block\n for (let y = 0; y < 4; y++) {\n for (let x = 0; x < 4; x++) {\n const px = bx * 4 + x;\n const py = by * 4 + y;\n\n if (px < width && py < height) {\n const i = y * 4 + x;\n const colorIndex = (indices >> (i * 2)) & 0b11;\n const color = colors[colorIndex];\n\n const dstIdx = (py * width + px) * 4;\n\n if (actualUseAlpha && colorIndex === 3) {\n rgba[dstIdx] = 0;\n rgba[dstIdx + 1] = 0;\n rgba[dstIdx + 2] = 0;\n rgba[dstIdx + 3] = 0;\n } else {\n rgba[dstIdx] = color.r;\n rgba[dstIdx + 1] = color.g;\n rgba[dstIdx + 2] = color.b;\n rgba[dstIdx + 3] = 255;\n }\n }\n }\n }\n\n offset += 8;\n }\n }\n\n return rgba;\n}\n", "/**\n * BC2 (DXT3) Decoder - RGBA with explicit alpha\n * Source: https://github.com/Nominom/BCnEncoder.NET\n */\n\nimport { ColorRgb565, interpolateThird } from './utils';\n\nexport function decodeBC2(data: DataView, width: number, height: number): Uint8Array {\n const rgba = new Uint8Array(width * height * 4);\n const blocksX = Math.ceil(width / 4);\n const blocksY = Math.ceil(height / 4);\n\n let offset = 0;\n for (let by = 0; by < blocksY; by++) {\n for (let bx = 0; bx < blocksX; bx++) {\n // Read alpha block (64 bits = 16 pixels * 4 bits each)\n const alphaLow = data.getUint32(offset, true);\n const alphaHigh = data.getUint32(offset + 4, true);\n\n // Read color block\n const color0Data = data.getUint16(offset + 8, true);\n const color1Data = data.getUint16(offset + 10, true);\n const indices = data.getUint32(offset + 12, true);\n\n const color0 = new ColorRgb565();\n color0.data = color0Data;\n const color1 = new ColorRgb565();\n color1.data = color1Data;\n\n const c0 = color0.toColorRgb24();\n const c1 = color1.toColorRgb24();\n\n // Build color palette (BC2 always uses 4-color mode)\n const colors = [\n c0,\n c1,\n interpolateThird(c0, c1, 1),\n interpolateThird(c0, c1, 2)\n ];\n\n // Decode 4x4 block\n for (let y = 0; y < 4; y++) {\n for (let x = 0; x < 4; x++) {\n const px = bx * 4 + x;\n const py = by * 4 + y;\n\n if (px < width && py < height) {\n const i = y * 4 + x;\n const colorIndex = (indices >> (i * 2)) & 0b11;\n const color = colors[colorIndex];\n\n // Extract 4-bit alpha\n const alphaIndex = i * 4;\n let alpha: number;\n if (alphaIndex < 32) {\n alpha = (alphaLow >> alphaIndex) & 0xF;\n } else {\n alpha = (alphaHigh >> (alphaIndex - 32)) & 0xF;\n }\n // Expand 4-bit alpha to 8-bit\n alpha = (alpha << 4) | alpha;\n\n const dstIdx = (py * width + px) * 4;\n rgba[dstIdx] = color.r;\n rgba[dstIdx + 1] = color.g;\n rgba[dstIdx + 2] = color.b;\n rgba[dstIdx + 3] = alpha;\n }\n }\n }\n\n offset += 16;\n }\n }\n\n return rgba;\n}\n", "/**\n * BC3 (DXT5) Decoder - RGBA with interpolated alpha\n * Source: https://github.com/Nominom/BCnEncoder.NET\n */\n\nimport { ColorRgb565, interpolateThird, interpolateByteFifth, interpolateByteSeventh } from './utils';\n\nfunction decodeAlphaBlock(alphaData: bigint): number[] {\n const alpha = new Array<number>(16);\n\n const alpha0 = Number(alphaData & 0xFFn);\n const alpha1 = Number((alphaData >> 8n) & 0xFFn);\n\n // Build alpha palette\n const alphas = alpha0 > alpha1 ? [\n alpha0,\n alpha1,\n interpolateByteSeventh(alpha0, alpha1, 1),\n interpolateByteSeventh(alpha0, alpha1, 2),\n interpolateByteSeventh(alpha0, alpha1, 3),\n interpolateByteSeventh(alpha0, alpha1, 4),\n interpolateByteSeventh(alpha0, alpha1, 5),\n interpolateByteSeventh(alpha0, alpha1, 6)\n ] : [\n alpha0,\n alpha1,\n interpolateByteFifth(alpha0, alpha1, 1),\n interpolateByteFifth(alpha0, alpha1, 2),\n interpolateByteFifth(alpha0, alpha1, 3),\n interpolateByteFifth(alpha0, alpha1, 4),\n 0,\n 255\n ];\n\n // Decode indices (3 bits per pixel, 48 bits total starting at bit 16)\n for (let i = 0; i < 16; i++) {\n const bitOffset = 16 + i * 3;\n const index = Number((alphaData >> BigInt(bitOffset)) & 0x7n);\n alpha[i] = alphas[index];\n }\n\n return alpha;\n}\n\nexport function decodeBC3(data: DataView, width: number, height: number): Uint8Array {\n const rgba = new Uint8Array(width * height * 4);\n const blocksX = Math.ceil(width / 4);\n const blocksY = Math.ceil(height / 4);\n\n let offset = 0;\n for (let by = 0; by < blocksY; by++) {\n for (let bx = 0; bx < blocksX; bx++) {\n // Read alpha block (64 bits)\n const alphaBlock = data.getBigUint64(offset, true);\n const alphas = decodeAlphaBlock(alphaBlock);\n\n // Read color block\n const color0Data = data.getUint16(offset + 8, true);\n const color1Data = data.getUint16(offset + 10, true);\n const indices = data.getUint32(offset + 12, true);\n\n const color0 = new ColorRgb565();\n color0.data = color0Data;\n const color1 = new ColorRgb565();\n color1.data = color1Data;\n\n const c0 = color0.toColorRgb24();\n const c1 = color1.toColorRgb24();\n\n // Build color palette (BC3 always uses 4-color mode)\n const colors = [\n c0,\n c1,\n interpolateThird(c0, c1, 1),\n interpolateThird(c0, c1, 2)\n ];\n\n // Decode 4x4 block\n for (let y = 0; y < 4; y++) {\n for (let x = 0; x < 4; x++) {\n const px = bx * 4 + x;\n const py = by * 4 + y;\n\n if (px < width && py < height) {\n const i = y * 4 + x;\n const colorIndex = (indices >> (i * 2)) & 0b11;\n const color = colors[colorIndex];\n\n const dstIdx = (py * width + px) * 4;\n rgba[dstIdx] = color.r;\n rgba[dstIdx + 1] = color.g;\n rgba[dstIdx + 2] = color.b;\n rgba[dstIdx + 3] = alphas[i];\n }\n }\n }\n\n offset += 16;\n }\n }\n\n return rgba;\n}\n", "/**\n * BC4 Decoder - Single channel compression\n * Source: https://github.com/Nominom/BCnEncoder.NET\n */\n\nimport { interpolateByteFifth, interpolateByteSeventh } from './utils';\n\nfunction decodeComponentBlock(componentData: bigint): number[] {\n const output = new Array<number>(16);\n\n const c0 = Number(componentData & 0xFFn);\n const c1 = Number((componentData >> 8n) & 0xFFn);\n\n // Build component palette\n const components = c0 > c1 ? [\n c0,\n c1,\n interpolateByteSeventh(c0, c1, 1),\n interpolateByteSeventh(c0, c1, 2),\n interpolateByteSeventh(c0, c1, 3),\n interpolateByteSeventh(c0, c1, 4),\n interpolateByteSeventh(c0, c1, 5),\n interpolateByteSeventh(c0, c1, 6)\n ] : [\n c0,\n c1,\n interpolateByteFifth(c0, c1, 1),\n interpolateByteFifth(c0, c1, 2),\n interpolateByteFifth(c0, c1, 3),\n interpolateByteFifth(c0, c1, 4),\n 0,\n 255\n ];\n\n // Decode indices (3 bits per pixel, 48 bits total starting at bit 16)\n for (let i = 0; i < 16; i++) {\n const bitOffset = 16 + i * 3;\n const index = Number((componentData >> BigInt(bitOffset)) & 0x7n);\n output[i] = components[index];\n }\n\n return output;\n}\n\nexport function decodeBC4(data: DataView, width: number, height: number, channel: 'r' | 'g' | 'b' | 'a' = 'r'): Uint8Array {\n const rgba = new Uint8Array(width * height * 4);\n const blocksX = Math.ceil(width / 4);\n const blocksY = Math.ceil(height / 4);\n\n const channelMap = { r: 0, g: 1, b: 2, a: 3 };\n const outputChannel = channelMap[channel];\n\n let offset = 0;\n for (let by = 0; by < blocksY; by++) {\n for (let bx = 0; bx < blocksX; bx++) {\n const componentBlock = data.getBigUint64(offset, true);\n const components = decodeComponentBlock(componentBlock);\n\n // Decode 4x4 block\n for (let y = 0; y < 4; y++) {\n for (let x = 0; x < 4; x++) {\n const px = bx * 4 + x;\n const py = by * 4 + y;\n\n if (px < width && py < height) {\n const i = y * 4 + x;\n const dstIdx = (py * width + px) * 4;\n\n // Initialize to default\n rgba[dstIdx] = 0;\n rgba[dstIdx + 1] = 0;\n rgba[dstIdx + 2] = 0;\n rgba[dstIdx + 3] = 255;\n\n // Set the decoded channel\n rgba[dstIdx + outputChannel] = components[i];\n }\n }\n }\n\n offset += 8;\n }\n }\n\n return rgba;\n}\n", "/**\n * BC5 Decoder - Two channel compression (typically for normal maps)\n * Source: https://github.com/Nominom/BCnEncoder.NET\n */\n\nimport { interpolateByteFifth, interpolateByteSeventh } from './utils';\n\nfunction decodeComponentBlock(componentData: bigint): number[] {\n const output = new Array<number>(16);\n\n const c0 = Number(componentData & 0xFFn);\n const c1 = Number((componentData >> 8n) & 0xFFn);\n\n // Build component palette\n const components = c0 > c1 ? [\n c0,\n c1,\n interpolateByteSeventh(c0, c1, 1),\n interpolateByteSeventh(c0, c1, 2),\n interpolateByteSeventh(c0, c1, 3),\n interpolateByteSeventh(c0, c1, 4),\n interpolateByteSeventh(c0, c1, 5),\n interpolateByteSeventh(c0, c1, 6)\n ] : [\n c0,\n c1,\n interpolateByteFifth(c0, c1, 1),\n interpolateByteFifth(c0, c1, 2),\n interpolateByteFifth(c0, c1, 3),\n interpolateByteFifth(c0, c1, 4),\n 0,\n 255\n ];\n\n // Decode indices (3 bits per pixel, 48 bits total starting at bit 16)\n for (let i = 0; i < 16; i++) {\n const bitOffset = 16 + i * 3;\n const index = Number((componentData >> BigInt(bitOffset)) & 0x7n);\n output[i] = components[index];\n }\n\n return output;\n}\n\nexport function decodeBC5(\n data: DataView, \n width: number, \n height: number,\n channel1: 'r' | 'g' | 'b' | 'a' = 'r',\n channel2: 'r' | 'g' | 'b' | 'a' = 'g'\n): Uint8Array {\n const rgba = new Uint8Array(width * height * 4);\n const blocksX = Math.ceil(width / 4);\n const blocksY = Math.ceil(height / 4);\n\n const channelMap = { r: 0, g: 1, b: 2, a: 3 };\n const outputChannel1 = channelMap[channel1];\n const outputChannel2 = channelMap[channel2];\n\n let offset = 0;\n for (let by = 0; by < blocksY; by++) {\n for (let bx = 0; bx < blocksX; bx++) {\n // Read red channel block\n const redBlock = data.getBigUint64(offset, true);\n const reds = decodeComponentBlock(redBlock);\n\n // Read green channel block\n const greenBlock = data.getBigUint64(offset + 8, true);\n const greens = decodeComponentBlock(greenBlock);\n\n // Decode 4x4 block\n for (let y = 0; y < 4; y++) {\n for (let x = 0; x < 4; x++) {\n const px = bx * 4 + x;\n const py = by * 4 + y;\n\n if (px < width && py < height) {\n const i = y * 4 + x;\n const dstIdx = (py * width + px) * 4;\n\n // Initialize to default\n rgba[dstIdx] = 0;\n rgba[dstIdx + 1] = 0;\n rgba[dstIdx + 2] = 0;\n rgba[dstIdx + 3] = 255;\n\n // Set the decoded channels\n rgba[dstIdx + outputChannel1] = reds[i];\n rgba[dstIdx + outputChannel2] = greens[i];\n }\n }\n }\n\n offset += 16;\n }\n }\n\n return rgba;\n}\n", "/**\n * BC7 Decoder - Direct port from BCnEnc.Net\n * Source: https://github.com/Nominom/BCnEncoder.NET\n */\n\nimport { ColorRgba32 } from './utils';\n\n// ByteHelper utilities\n// eslint-disable-next-line @typescript-eslint/no-extraneous-class\nclass ByteHelper {\n static extract(source: bigint, index: number, bitCount: number): number {\n const mask = (1n << BigInt(bitCount)) - 1n;\n return Number((source >> BigInt(index)) & mask);\n }\n\n static extractFrom128(low: bigint, high: bigint, index: number, bitCount: number): number {\n // Extract from low\n if (index + bitCount <= 64) {\n return ByteHelper.extract(low, index, bitCount);\n }\n\n // Extract from high\n if (index >= 64) {\n return ByteHelper.extract(high, index - 64, bitCount);\n }\n\n // Handle boundary case\n const lowBitCount = 64 - index;\n const highBitCount = bitCount - lowBitCount;\n\n const lowValue = ByteHelper.extract(low, index, lowBitCount);\n const highValue = ByteHelper.extract(high, 0, highBitCount);\n \n return lowValue | (highValue << lowBitCount);\n }\n\n static extract1(source: bigint, index: number): number {\n return Number((source >> BigInt(index)) & 1n);\n }\n\n static extract2(source: bigint, index: number): number {\n return Number((source >> BigInt(index)) & 3n);\n }\n\n static extract4(source: bigint, index: number): number {\n return Number((source >> BigInt(index)) & 15n);\n }\n\n static extract6(source: bigint, index: number): number {\n return Number((source >> BigInt(index)) & 63n);\n }\n}\n\n// Interpolation weights\nconst COLOR_WEIGHTS_2 = [0, 21, 43, 64];\nconst COLOR_WEIGHTS_3 = [0, 9, 18, 27, 37, 46, 55, 64];\nconst COLOR_WEIGHTS_4 = [0, 4, 9, 13, 17, 21, 26, 30, 34, 38, 43, 47, 51, 55, 60, 64];\n\nfunction interpolateByte(e0: number, e1: number, index: number, indexPrecision: number): number {\n if (indexPrecision === 0) return e0;\n \n const weights = indexPrecision === 2 ? COLOR_WEIGHTS_2 :\n indexPrecision === 3 ? COLOR_WEIGHTS_3 :\n COLOR_WEIGHTS_4;\n \n const w = weights[index];\n return ((64 - w) * e0 + w * e1 + 32) >> 6;\n}\n\n// Partition tables (complete 64 patterns)\nconst SUBSETS_2_PARTITION_TABLE = [\n [0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1],[0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1],\n [0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1],[0,0,0,1,0,0,1,1,0,0,1,1,0,1,1,1],\n [0,0,0,0,0,0,0,1,0,0,0,1,0,0,1,1],[0,0,1,1,0,1,1,1,0,1,1,1,1,1,1,1],\n [0,0,0,1,0,0,1,1,0,1,1,1,1,1,1,1],[0,0,0,0,0,0,0,1,0,0,1,1,0,1,1,1],\n [0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1],[0,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1],\n [0,0,0,0,0,0,0,1,0,1,1,1,1,1,1,1],[0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1],\n [0,0,0,1,0,1,1,1,1,1,1,1,1,1,1,1],[0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1],\n [0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1],[0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1],\n [0,0,0,0,1,0,0,0,1,1,1,0,1,1,1,1],[0,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0],\n [0,0,0,0,0,0,0,0,1,0,0,0,1,1,1,0],[0,1,1,1,0,0,1,1,0,0,0,1,0,0,0,0],\n [0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0],[0,0,0,0,1,0,0,0,1,1,0,0,1,1,1,0],\n [0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0],[0,1,1,1,0,0,1,1,0,0,1,1,0,0,0,1],\n [0,0,1,1,0,0,0,1,0,0,0,1,0,0,0,0],[0,0,0,0,1,0,0,0,1,0,0,0,1,1,0,0],\n [0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0],[0,0,1,1,0,1,1,0,0,1,1,0,1,1,0,0],\n [0,0,0,1,0,1,1,1,1,1,1,0,1,0,0,0],[0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0],\n [0,1,1,1,0,0,0,1,1,0,0,0,1,1,1,0],[0,0,1,1,1,0,0,1,1,0,0,1,1,1,0,0],\n [0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1],[0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1],\n [0,1,0,1,1,0,1,0,0,1,0,1,1,0,1,0],[0,0,1,1,0,0,1,1,1,1,0,0,1,1,0,0],\n [0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0],[0,1,0,1,0,1,0,1,1,0,1,0,1,0,1,0],\n [0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1],[0,1,0,1,1,0,1,0,1,0,1,0,0,1,0,1],\n [0,1,1,1,0,0,1,1,1,1,0,0,1,1,1,0],[0,0,0,1,0,0,1,1,1,1,0,0,1,0,0,0],\n [0,0,1,1,0,0,1,0,0,1,0,0,1,1,0,0],[0,0,1,1,1,0,1,1,1,1,0,1,1,1,0,0],\n [0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0],[0,0,1,1,1,1,0,0,1,1,0,0,0,0,1,1],\n [0,1,1,0,0,1,1,0,1,0,0,1,1,0,0,1],[0,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0],\n [0,1,0,0,1,1,1,0,0,1,0,0,0,0,0,0],[0,0,1,0,0,1,1,1,0,0,1,0,0,0,0,0],\n [0,0,0,0,0,0,1,0,0,1,1,1,0,0,1,0],[0,0,0,0,0,1,0,0,1,1,1,0,0,1,0,0],\n [0,1,1,0,1,1,0,0,1,0,0,1,0,0,1,1],[0,0,1,1,0,1,1,0,1,1,0,0,1,0,0,1],\n [0,1,1,0,0,0,1,1,1,0,0,1,1,1,0,0],[0,0,1,1,1,0,0,1,1,1,0,0,0,1,1,0],\n [0,1,1,0,1,1,0,0,1,1,0,0,1,0,0,1],[0,1,1,0,0,0,1,1,0,0,1,1,1,0,0,1],\n [0,1,1,1,1,1,1,0,1,0,0,0,0,0,0,1],[0,0,0,1,1,0,0,0,1,1,1,0,0,1,1,1],\n [0,0,0,0,1,1,1,1,0,0,1,1,0,0,1,1],[0,0,1,1,0,0,1,1,1,1,1,1,0,0,0,0],\n [0,0,1,0,0,0,1,0,1,1,1,0,1,1,1,0],[0,1,0,0,0,1,0,0,0,1,1,1,0,1,1,1]\n];\n\nconst SUBSETS_3_PARTITION_TABLE = [\n [0,0,1,1,0,0,1,1,0,2,2,1,2,2,2,2],[0,0,0,1,0,0,1,1,2,2,1,1,2,2,2,1],\n [0,0,0,0,2,0,0,1,2,2,1,1,2,2,1,1],[0,2,2,2,0,0,2,2,0,0,1,1,0,1,1,1],\n [0,0,0,0,0,0,0,0,1,1,2,2,1,1,2,2],[0,0,1,1,0,0,1,1,0,0,2,2,0,0,2,2],\n [0,0,2,2,0,0,2,2,1,1,1,1,1,1,1,1],[0,0,1,1,0,0,1,1,2,2,1,1,2,2,1,1],\n [0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2],[0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,2],\n [0,0,0,0,1,1,1,1,2,2,2,2,2,2,2,2],[0,0,1,2,0,0,1,2,0,0,1,2,0,0,1,2],\n [0,1,1,2,0,1,1,2,0,1,1,2,0,1,1,2],[0,1,2,2,0,1,2,2,0,1,2,2,0,1,2,2],\n [0,0,1,1,0,1,1,2,1,1,2,2,1,2,2,2],[0,0,1,1,2,0,0,1,2,2,0,0,2,2,2,0],\n [0,0,0,1,0,0,1,1,0,1,1,2,1,1,2,2],[0,1,1,1,0,0,1,1,2,0,0,1,2,2,0,0],\n [0,0,0,0,1,1,2,2,1,1,2,2,1,1,2,2],[0,0,2,2,0,0,2,2,0,0,2,2,1,1,1,1],\n [0,1,1,1,0,1,1,1,0,2,2,2,0,2,2,2],[0,0,0,1,0,0,0,1,2,2,2,1,2,2,2,1],\n [0,0,0,0,0,0,1,1,0,1,2,2,0,1,2,2],[0,0,0,0,1,1,0,0,2,2,1,0,2,2,1,0],\n [0,1,2,2,0,1,2,2,0,0,1,1,0,0,0,0],[0,0,1,2,0,0,1,2,1,1,2,2,2,2,2,2],\n [0,1,1,0,1,2,2,1,1,2,2,1,0,1,1,0],[0,0,0,0,0,1,1,0,1,2,2,1,1,2,2,1],\n [0,0,2,2,1,1,0,2,1,1,0,2,0,0,2,2],[0,1,1,0,0,1,1,0,2,0,0,2,2,2,2,2],\n [0,0,1,1,0,1,2,2,0,1,2,2,0,0,1,1],[0,0,0,0,2,0,0,0,2,2,1,1,2,2,2,1],\n [0,0,0,0,0,0,0,2,1,1,2,2,1,2,2,2],[0,2,2,2,0,0,2,2,0,0,1,2,0,0,1,1],\n [0,0,1,1,0,0,1,2,0,0,2,2,0,2,2,2],[0,1,2,0,0,1,2,0,0,1,2,0,0,1,2,0],\n [0,0,0,0,1,1,1,1,2,2,2,2,0,0,0,0],[0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0],\n [0,1,2,0,2,0,1,2,1,2,0,1,0,1,2,0],[0,0,1,1,2,2,0,0,1,1,2,2,0,0,1,1],\n [0,0,1,1,1,1,2,2,2,2,0,0,0,0,1,1],[0,1,0,1,0,1,0,1,2,2,2,2,2,2,2,2],\n [0,0,0,0,0,0,0,0,2,1,2,1,2,1,2,1],[0,0,2,2,1,1,2,2,0,0,2,2,1,1,2,2],\n [0,0,2,2,0,0,1,1,0,0,2,2,0,0,1,1],[0,2,2,0,1,2,2,1,0,2,2,0,1,2,2,1],\n [0,1,0,1,2,2,2,2,2,2,2,2,0,1,0,1],[0,0,0,0,2,1,2,1,2,1,2,1,2,1,2,1],\n [0,1,0,1,0,1,0,1,0,1,0,1,2,2,2,2],[0,2,2,2,0,1,1,1,0,2,2,2,0,1,1,1],\n [0,0,0,2,1,1,1,2,0,0,0,2,1,1,1,2],[0,0,0,0,2,1,1,2,2,1,1,2,2,1,1,2],\n [0,2,2,2,0,1,1,1,0,1,1,1,0,2,2,2],[0,0,0,2,1,1,1,2,1,1,1,2,0,0,0,2],\n [0,1,1,0,0,1,1,0,0,1,1,0,2,2,2,2],[0,0,0,0,0,0,0,0,2,1,1,2,2,1,1,2],\n [0,1,1,0,0,1,1,0,2,2,2,2,2,2,2,2],[0,0,2,2,0,0,1,1,0,0,1,1,0,0,2,2],\n [0,0,2,2,1,1,2,2,1,1,2,2,0,0,2,2],[0,0,0,0,0,0,0,0,0,0,0,0,2,1,1,2],\n [0,0,0,2,0,0,0,1,0,0,0,2,0,0,0,1],[0,2,2,2,1,2,2,2,0,2,2,2,1,2,2,2],\n [0,1,0,1,2,2,2,2,2,2,2,2,2,2,2,2],[0,1,1,1,2,0,1,1,2,2,0,1,2,2,2,0]\n];\n\nconst SUBSETS_2_ANCHOR_INDICES = [\n 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,\n 15,2,8,2,2,8,8,15,2,8,2,2,8,8,2,2,\n 15,15,6,8,2,8,15,15,2,8,2,2,2,15,15,6,\n 6,2,6,8,15,15,2,2,15,15,15,15,15,2,2,15\n];\n\nconst SUBSETS_3_ANCHOR_INDICES_2 = [\n 3,3,15,15,8,3,15,15,8,8,6,6,6,5,3,3,\n 3,3,8,15,3,3,6,10,5,8,8,6,8,5,15,15,\n 8,15,3,5,6,10,8,15,15,3,15,5,15,15,15,15,\n 3,15,5,5,5,8,5,10,5,10,8,13,15,12,3,3\n];\n\nconst SUBSETS_3_ANCHOR_INDICES_3 = [\n 15,8,8,3,15,15,3,8,15,15,15,15,15,15,15,8,\n 15,8,15,3,15,8,15,8,3,15,6,10,15,15,10,8,\n 15,3,15,10,10,8,9,10,6,15,8,15,3,6,6,8,\n 15,3,15,15,15,15,15,15,15,15,15,15,3,15,15,8\n];\n\nclass Bc7Block {\n private lowBits: bigint;\n private highBits: bigint;\n\n constructor(data: Uint8Array) {\n // Read 16 bytes as two 64-bit values\n const view = new DataView(data.buffer, data.byteOffset, 16);\n this.lowBits = view.getBigUint64(0, true);\n this.highBits = view.getBigUint64(8, true);\n }\n\n private getType(): number {\n for (let i = 0; i < 8; i++) {\n const mask = 1n << BigInt(i);\n if ((this.lowBits & mask) === mask) {\n return i;\n }\n }\n return 8; // Reserved\n }\n\n private getNumSubsets(type: number): number {\n if (type === 0 || type === 2) return 3;\n if (type === 1 || type === 3 || type === 7) return 2;\n return 1;\n }\n\n private getPartitionSetId(type: number): number {\n switch (type) {\n case 0: return ByteHelper.extract4(this.lowBits, 1);\n case 1: return ByteHelper.extract6(this.lowBits, 2);\n case 2: return ByteHelper.extract6(this.lowBits, 3);\n case 3: return ByteHelper.extract6(this.lowBits, 4);\n case 7: return ByteHelper.extract6(this.lowBits, 8);\n default: return 0;\n }\n }\n\n private getRotationBits(type: number): number {\n if (type === 4) return ByteHelper.extract2(this.lowBits, 5);\n if (type === 5) return ByteHelper.extract2(this.lowBits, 6);\n return 0;\n }\n\n private getColorComponentPrecision(type: number): number {\n const precisions = [5, 7, 5, 8, 5, 7, 8, 6];\n return precisions[type] || 0;\n }\n\n private getAlphaComponentPrecision(type: number): number {\n if (type === 4) return 6;\n if (type === 5 || type === 6) return 8;\n if (type === 7) return 6;\n return 0;\n }\n\n private getType4IndexMode(): number {\n return ByteHelper.extract1(this.lowBits, 7);\n }\n\n private getColorIndexBitCount(type: number): number {\n if (type === 0 || type === 1) return 3;\n if (type === 2 || type === 3 || type === 5 || type === 7) return 2;\n if (type === 4) {\n const indexMode = this.getType4IndexMode();\n return indexMode === 0 ? 2 : 3;\n }\n if (type === 6) return 4;\n return 0;\n }\n\n private getAlphaIndexBitCount(type: number): number {\n if (type === 4) {\n const indexMode = this.getType4IndexMode();\n return indexMode === 0 ? 3 : 2;\n }\n if (type === 5 || type === 7) return 2;\n if (type === 6) return 4;\n return 0;\n }\n\n private extractRawEndpoints(type: number, numSubsets: number): ColorRgba32[] {\n const endpoints: ColorRgba32[] = Array(numSubsets * 2).fill(null).map(() => ({ r: 0, g: 0, b: 0, a: 0 }));\n\n switch (type) {\n case 0:\n for (let i = 0; i < 6; i++) {\n endpoints[i].r = ByteHelper.extractFrom128(this.lowBits, this.highBits, 5 + i * 4, 4);\n endpoints[i].g = ByteHelper.extractFrom128(this.lowBits, this.highBits, 29 + i * 4, 4);\n endpoints[i].b = ByteHelper.extractFrom128(this.lowBits, this.highBits, 53 + i * 4, 4);\n }\n break;\n case 1:\n for (let i = 0; i < 4; i++) {\n endpoints[i].r = ByteHelper.extractFrom128(this.lowBits, this.highBits, 8 + i * 6, 6);\n endpoints[i].g = ByteHelper.extractFrom128(this.lowBits, this.highBits, 32 + i * 6, 6);\n endpoints[i].b = ByteHelper.extractFrom128(this.lowBits, this.highBits, 56 + i * 6, 6);\n }\n break;\n case 2:\n for (let i = 0; i < 6; i++) {\n endpoints[i].r = ByteHelper.extractFrom128(this.lowBits, this.highBits, 9 + i * 5, 5);\n endpoints[i].g = ByteHelper.extractFrom128(this.lowBits, this.highBits, 39 + i * 5, 5);\n endpoints[i].b = ByteHelper.extractFrom128(this.lowBits, this.highBits, 69 + i * 5, 5);\n }\n break;\n case 3:\n for (let i = 0; i < 4; i++) {\n endpoints[i].r = ByteHelper.extractFrom128(this.lowBits, this.highBits, 10 + i * 7, 7);\n endpoints[i].g = ByteHelper.extractFrom128(this.lowBits, this.highBits, 38 + i * 7, 7);\n endpoints[i].b = ByteHelper.extractFrom128(this.lowBits, this.highBits, 66 + i * 7, 7);\n }\n break;\n case 4:\n endpoints[0].r = ByteHelper.extractFrom128(this.lowBits, this.highBits, 8, 5);\n endpoints[1].r = ByteHelper.extractFrom128(this.lowBits, this.highBits, 13, 5);\n endpoints[0].g = ByteHelper.extractFrom128(this.lowBits, this.highBits, 18, 5);\n endpoints[1].g = ByteHelper.extractFrom128(this.lowBits, this.highBits, 23, 5);\n endpoints[0].b = ByteHelper.extractFrom128(this.lowBits, this.highBits, 28, 5);\n endpoints[1].b = ByteHelper.extractFrom128(this.lowBits, this.highBits, 33, 5);\n endpoints[0].a = ByteHelper.extractFrom128(this.lowBits, this.highBits, 38, 6);\n endpoints[1].a = ByteHelper.extractFrom128(this.lowBits, this.highBits, 44, 6);\n break;\n case 5:\n endpoints[0].r = ByteHelper.extractFrom128(this.lowBits, this.highBits, 8, 7);\n endpoints[1].r = ByteHelper.extractFrom128(this.lowBits, this.highBits, 15, 7);\n endpoints[0].g = ByteHelper.extractFrom128(this.lowBits, this.highBits, 22, 7);\n endpoints[1].g = ByteHelper.extractFrom128(this.lowBits, this.highBits, 29, 7);\n endpoints[0].b = ByteHelper.extractFrom128(this.lowBits, this.highBits, 36, 7);\n endpoints[1].b = ByteHelper.extractFrom128(this.lowBits, this.highBits, 43, 7);\n endpoints[0].a = ByteHelper.extractFrom128(this.lowBits, this.highBits, 50, 8);\n endpoints[1].a = ByteHelper.extractFrom128(this.lowBits, this.highBits, 58, 8);\n break;\n case 6:\n endpoints[0].r = ByteHelper.extractFrom128(this.lowBits, this.highBits, 7, 7);\n endpoints[1].r = ByteHelper.extractFrom128(this.lowBits, this.highBits, 14, 7);\n endpoints[0].g = ByteHelper.extractFrom128(this.lowBits, this.highBits, 21, 7);\n endpoints[1].g = ByteHelper.extractFrom128(this.lowBits, this.highBits, 28, 7);\n endpoints[0].b = ByteHelper.extractFrom128(this.lowBits, this.highBits, 35, 7);\n endpoints[1].b = ByteHelper.extractFrom128(this.lowBits, this.highBits, 42, 7);\n endpoints[0].a = ByteHelper.extractFrom128(this.lowBits, this.highBits, 49, 7);\n endpoints[1].a = ByteHelper.extractFrom128(this.lowBits, this.highBits, 56, 7);\n break;\n case 7:\n for (let i = 0; i < 4; i++) {\n endpoints[i].r = ByteHelper.extractFrom128(this.lowBits, this.highBits, 14 + i * 5, 5);\n endpoints[i].g = ByteHelper.extractFrom128(this.lowBits, this.highBits, 34 + i * 5, 5);\n endpoints[i].b = ByteHelper.extractFrom128(this.lowBits, this.highBits, 54 + i * 5, 5);\n endpoints[i].a = ByteHelper.extractFrom128(this.lowBits, this.highBits, 74 + i * 5, 5);\n }\n break;\n }\n\n return endpoints;\n }\n\n private extractPBits(type: number, _numSubsets: number): number[] {\n switch (type) {\n case 0:\n return [\n ByteHelper.extract1(this.highBits, 77 - 64),\n ByteHelper.extract1(this.highBits, 78 - 64),\n ByteHelper.extract1(this.highBits, 79 - 64),\n ByteHelper.extract1(this.highBits, 80 - 64),\n ByteHelper.extract1(this.highBits, 81 - 64),\n ByteHelper.extract1(this.highBits, 82 - 64)\n ];\n case 1:\n return [\n ByteHelper.extract1(this.highBits, 80 - 64),\n ByteHelper.extract1(this.highBits, 81 - 64)\n ];\n case 3:\n return [\n ByteHelper.extract1(this.highBits, 94 - 64),\n ByteHelper.extract1(this.highBits, 95 - 64),\n ByteHelper.extract1(this.highBits, 96 - 64),\n ByteHelper.extract1(this.highBits, 97 - 64)\n ];\n case 6:\n return [\n ByteHelper.extract1(this.lowBits, 63),\n ByteHelper.extract1(this.highBits, 0)\n ];\n case 7:\n return [\n ByteHelper.extract1(this.highBits, 94 - 64),\n ByteHelper.extract1(this.highBits, 95 - 64),\n ByteHelper.extract1(this.highBits, 96 - 64),\n ByteHelper.extract1(this.highBits, 97 - 64)\n ];\n default:\n return [];\n }\n }\n\n private hasPBits(type: number): boolean {\n return type === 0 || type === 1 || type === 3 || type === 6 || type === 7;\n }\n\n private hasAlpha(type: number): boolean {\n return type === 4 || type === 5 || type === 6 || type === 7;\n }\n\n private finalizeEndpoints(endpoints: ColorRgba32[], type: number): void {\n const hasPBits = this.hasPBits(type);\n \n if (hasPBits) {\n const pBits = this.extractPBits(type, endpoints.length);\n \n // Left shift by 1\n for (const ep of endpoints) {\n ep.r <<= 1;\n ep.g <<= 1;\n ep.b <<= 1;\n ep.a <<= 1;\n }\n\n // Apply P-bits\n if (type === 1) {\n // Shared P-bits for Type 1\n endpoints[0].r |= pBits[0]; endpoints[0].g |= pBits[0]; endpoints[0].b |= pBits[0];\n endpoints[1].r |= pBits[0]; endpoints[1].g |= pBits[0]; endpoints[1].b |= pBits[0];\n endpoints[2].r |= pBits[1]; endpoints[2].g |= pBits[1]; endpoints[2].b |= pBits[1];\n endpoints[3].r |= pBits[1]; endpoints[3].g |= pBits[1]; endpoints[3].b |= pBits[1];\n } else {\n for (let i = 0; i < endpoints.length; i++) {\n endpoints[i].r |= pBits[i];\n endpoints[i].g |= pBits[i];\n endpoints[i].b |= pBits[i];\n if (this.hasAlpha(type)) {\n endpoints[i].a |= pBits[i];\n }\n }\n }\n }\n\n const colorPrec = this.getColorComponentPrecision(type);\n const alphaPrec = this.getAlphaComponentPrecision(type);\n\n for (const ep of endpoints) {\n // Left shift to place MSB in bit 7\n ep.r = (ep.r << (8 - colorPrec)) | (ep.r >> (colorPrec - (8 - colorPrec)));\n ep.g = (ep.g << (8 - colorPrec)) | (ep.g >> (colorPrec - (8 - colorPrec)));\n ep.b = (ep.b << (8 - colorPrec)) | (ep.b >> (colorPrec - (8 - colorPrec)));\n ep.a = alphaPrec > 0 \n ? (ep.a << (8 - alphaPrec)) | (ep.a >> (alphaPrec - (8 - alphaPrec)))\n : 255;\n }\n\n if (!this.hasAlpha(type)) {\n for (const ep of endpoints) {\n ep.a = 255;\n }\n }\n }\n\n private getPartitionIndex(numSubsets: number, partitionSetId: number, pixelIndex: number): number {\n if (numSubsets === 1) return 0;\n if (numSubsets === 2) return SUBSETS_2_PARTITION_TABLE[partitionSetId][pixelIndex];\n return SUBSETS_3_PARTITION_TABLE[partitionSetId][pixelIndex];\n }\n\n private getIndexBegin(type: number, bitCount: number, isAlpha: boolean): number {\n switch (type) {\n case 0: return 83;\n case 1: return 82;\n case 2: return 99;\n case 3: return 98;\n case 4: return bitCount === 2 ? 50 : 81;\n case 5: return isAlpha ? 97 : 66;\n case 6: return 65;\n case 7: return 98;\n default: return 0;\n }\n }\n\n private getIndexBitCount(numSubsets: number, partitionIndex: number, bitCount: number, pixelIndex: number): number {\n if (pixelIndex === 0) return bitCount - 1;\n \n if (numSubsets === 2) {\n const anchorIndex = SUBSETS_2_ANCHOR_INDICES[partitionIndex];\n if (pixelIndex === anchorIndex) return bitCount - 1;\n } else if (numSubsets === 3) {\n const anchor2 = SUBSETS_3_ANCHOR_INDICES_2[partitionIndex];\n const anchor3 = SUBSETS_3_ANCHOR_INDICES_3[partitionIndex];\n if (pixelIndex === anchor2 || pixelIndex === anchor3) return bitCount - 1;\n }\n \n return bitCount;\n }\n\n private getIndexOffset(type: number, numSubsets: number, partitionIndex: number, bitCount: number, pixelIndex: number): number {\n if (pixelIndex === 0) return 0;\n \n if (numSubsets === 1) {\n return bitCount * pixelIndex - 1;\n }\n\n if (numSubsets === 2) {\n const anchorIndex = SUBSETS_2_ANCHOR_INDICES[partitionIndex];\n if (pixelIndex <= anchorIndex) {\n return bitCount * pixelIndex - 1;\n } else {\n return bitCount * pixelIndex - 2;\n }\n }\n\n if (numSubsets === 3) {\n const anchor2 = SUBSETS_3_ANCHOR_INDICES_2[partitionIndex];\n const anchor3 = SUBSETS_3_ANCHOR_INDICES_3[partitionIndex];\n\n if (pixelIndex <= anchor2 && pixelIndex <= anchor3) {\n return bitCount * pixelIndex - 1;\n } else if (pixelIndex > anchor2 && pixelIndex > anchor3) {\n return bitCount * pixelIndex - 3;\n } else {\n return bitCount * pixelIndex - 2;\n }\n }\n\n return 0;\n }\n\n private getColorIndex(type: number, numSubsets: number, partitionIndex: number, bitCount: number, pixelIndex: number): number {\n const indexOffset = this.getIndexOffset(type, numSubsets, partitionIndex, bitCount, pixelIndex);\n const indexBitCount = this.getIndexBitCount(numSubsets, partitionIndex, bitCount, pixelIndex);\n const indexBegin = this.getIndexBegin(type, bitCount, false);\n return ByteHelper.extractFrom128(this.lowBits, this.highBits, indexBegin + indexOffset, indexBitCount);\n }\n\n private getAlphaIndex(type: number, numSubsets: number, partitionIndex: number, bitCount: number, pixelIndex: number): number {\n if (bitCount === 0) return 0;\n const indexOffset = this.getIndexOffset(type, numSubsets, partitionIndex, bitCount, pixelIndex);\n const indexBitCount = this.getIndexBitCount(numSubsets, partitionIndex, bitCount, pixelIndex);\n const indexBegin = this.getIndexBegin(type, bitCount, true);\n return ByteHelper.extractFrom128(this.lowBits, this.highBits, indexBegin + indexOffset, indexBitCount);\n }\n\n private swapChannels(color: ColorRgba32, rotation: number): ColorRgba32 {\n switch (rotation) {\n case 0: return color;\n case 1: return { r: color.a, g: color.g, b: color.b, a: color.r };\n case 2: return { r: color.r, g: color.a, b: color.b, a: color.g };\n case 3: return { r: color.r, g: color.g, b: color.a, a: color.b };\n default: return color;\n }\n }\n\n decode(): Uint8Array {\n const output = new Uint8Array(16 * 4);\n const type = this.getType();\n\n if (type === 8) {\n // Reserved type - return error color (magenta)\n for (let i = 0; i < 16; i++) {\n output[i * 4] = 255;\n output[i * 4 + 1] = 0;\n output[i * 4 + 2] = 255;\n output[i * 4 + 3] = 255;\n }\n return output;\n }\n\n const numSubsets = this.getNumSubsets(type);\n const partitionSetId = this.getPartitionSetId(type);\n const rotation = this.getRotationBits(type);\n\n const endpoints = this.extractRawEndpoints(type, numSubsets);\n this.finalizeEndpoints(endpoints, type);\n\n const colorBitCount = this.getColorIndexBitCount(type);\n const alphaBitCount = this.getAlphaIndexBitCount(type);\n\n for (let i = 0; i < 16; i++) {\n const subsetIndex = this.getPartitionIndex(numSubsets, partitionSetId, i);\n const ep0 = endpoints[2 * subsetIndex];\n const ep1 = endpoints[2 * subsetIndex + 1];\n\n const colorIndex = this.getColorIndex(type, numSubsets, partitionSetId, colorBitCount, i);\n const alphaIndex = this.getAlphaIndex(type, numSubsets, partitionSetId, alphaBitCount, i);\n\n let color: ColorRgba32 = {\n r: interpolateByte(ep0.r, ep1.r, colorIndex, colorBitCount),\n g: interpolateByte(ep0.g, ep1.g, colorIndex, colorBitCount),\n b: interpolateByte(ep0.b, ep1.b, colorIndex, colorBitCount),\n a: interpolateByte(ep0.a, ep1.a, alphaIndex, alphaBitCount || colorBitCount)\n };\n\n if (rotation > 0) {\n color = this.swapChannels(color, rotation);\n }\n\n output[i * 4] = color.r;\n output[i * 4 + 1] = color.g;\n output[i * 4 + 2] = color.b;\n output[i * 4 + 3] = color.a;\n }\n\n return output;\n }\n}\n\nexport function decodeBC7(imageData: DataView, width: number, height: number): Uint8Array {\n const rgba = new Uint8Array(width * height * 4);\n const blocksX = Math.ceil(width / 4);\n const blocksY = Math.ceil(height / 4);\n\n let offset = 0;\n for (let by = 0; by < blocksY; by++) {\n for (let bx = 0; bx < blocksX; bx++) {\n const blockData = new Uint8Array(16);\n for (let i = 0; i < 16; i++) {\n blockData[i] = imageData.getUint8(offset + i);\n }\n \n const block = new Bc7Block(blockData);\n const decodedBlock = block.decode();\n\n for (let y = 0; y < 4; y++) {\n for (let x = 0; x < 4; x++) {\n const px = bx * 4 + x;\n const py = by * 4 + y;\n \n if (px < width && py < height) {\n const srcIdx = (y * 4 + x) * 4;\n const dstIdx = (py * width + px) * 4;\n rgba[dstIdx] = decodedBlock[srcIdx];\n rgba[dstIdx + 1] = decodedBlock[srcIdx + 1];\n rgba[dstIdx + 2] = decodedBlock[srcIdx + 2];\n rgba[dstIdx + 3] = decodedBlock[srcIdx + 3];\n }\n }\n }\n\n offset += 16;\n }\n }\n\n return rgba;\n}\n", "import { BinaryReader, decompressLz4Block } from '@bis-toolkit/utils';\nimport { decodeBC1, decodeBC2, decodeBC3, decodeBC7 } from '@bis-toolkit/bcn';\n\nconst DDS_MAGIC = 'DDS ';\nconst LZ4_MAGIC = 'LZ4 ';\nconst COPY_MAGIC = 'COPY';\nconst HEADER_SIZE = 124;\nconst FOURCC_DX10 = fourCcToInt('DX10');\n\nconst HEADER_CAPS_MIPMAP = 0x400000;\nconst HEADER_CAPS2_CUBEMAP = 0x200;\nconst PIXELFORMAT_FLAG_FOURCC = 0x4;\nconst PIXELFORMAT_FLAG_RGB = 0x40;\nconst PIXELFORMAT_FLAG_ALPHA_PIXELS = 0x1;\nconst PIXELFORMAT_FLAG_LUMINANCE = 0x20000;\n\nexport type EddsFormat = 'BC1' | 'BC2' | 'BC3' | 'BC4' | 'BC5' | 'BC6' | 'BC7' | 'RGBA8' | 'BGRA8' | 'UNKNOWN';\n\nexport interface EddsMipMap {\n width: number;\n height: number;\n data: Uint8Array;\n compression?: 'COPY' | 'LZ4';\n}\n\ninterface DdsHeader {\n size: number;\n flags: number;\n height: number;\n width: number;\n pitchOrLinearSize: number;\n depth: number;\n mipMapCount: number;\n pixelFormat: DdsPixelFormat;\n caps: number;\n caps2: number;\n caps3: number;\n caps4: number;\n}\n\ninterface DdsPixelFormat {\n size: number;\n flags: number;\n fourCC: number;\n rgbBitCount: number;\n rMask: number;\n gMask: number;\n bMask: number;\n aMask: number;\n}\n\ninterface DdsHeaderDx10 {\n dxgiFormat: number;\n resourceDimension: number;\n miscFlag: number;\n arraySize: number;\n miscFlags2: number;\n}\n\ninterface MipMapBlock {\n kind: 'COPY' | 'LZ4';\n size: number;\n}\n\nfunction fourCcToInt(text: string): number {\n if (text.length !== 4) {\n throw new Error('FourCC needs exactly four characters');\n }\n return (\n text.charCodeAt(0) |\n (text.charCodeAt(1) << 8) |\n (text.charCodeAt(2) << 16) |\n (text.charCodeAt(3) << 24)\n ) >>> 0;\n}\n\nfunction intToFourCc(value: number): string {\n return String.fromCharCode(\n value & 0xff,\n (value >> 8) & 0xff,\n (value >> 16) & 0xff,\n (value >> 24) & 0xff,\n );\n}\n\nfunction readDdsHeader(reader: BinaryReader): { header: DdsHeader; dx10?: DdsHeaderDx10 } {\n const size = reader.readUInt32();\n if (size !== HEADER_SIZE) {\n throw new Error(`Unexpected DDS header size ${size} (expected ${HEADER_SIZE})`);\n }\n\n const flags = reader.readUInt32();\n const height = reader.readUInt32();\n const width = reader.readUInt32();\n const pitchOrLinearSize = reader.readUInt32();\n const depth = reader.readUInt32();\n const mipMapCount = reader.readUInt32();\n\n // Skip reserved1[11]\n reader.readBytes(11 * 4);\n\n const pfSize = reader.readUInt32();\n const pfFlags = reader.readUInt32();\n const pfFourCC = reader.readUInt32();\n const pfRgbBitCount = reader.readUInt32();\n const pfRMask = reader.readUInt32();\n const pfGMask = reader.readUInt32();\n const pfBMask = reader.readUInt32();\n const pfAMask = reader.readUInt32();\n\n const pixelFormat: DdsPixelFormat = {\n size: pfSize,\n flags: pfFlags,\n fourCC: pfFourCC >>> 0,\n rgbBitCount: pfRgbBitCount,\n rMask: pfRMask >>> 0,\n gMask: pfGMask >>> 0,\n bMask: pfBMask >>> 0,\n aMask: pfAMask >>> 0,\n };\n\n const caps = reader.readUInt32();\n const caps2 = reader.readUInt32();\n const caps3 = reader.readUInt32();\n const caps4 = reader.readUInt32();\n const reserved2 = reader.readUInt32();\n if (reserved2 !== 0) {\n // Keep reading aligned while warning about unexpected value\n throw new Error('Invalid DDS header: reserved2 is not zero');\n }\n\n const header: DdsHeader = {\n size,\n flags,\n height,\n width,\n pitchOrLinearSize,\n depth,\n mipMapCount,\n pixelFormat,\n caps,\n caps2,\n caps3,\n caps4,\n };\n\n if ((pixelFormat.flags & PIXELFORMAT_FLAG_FOURCC) !== 0 && pixelFormat.fourCC === FOURCC_DX10) {\n const dxgiFormat = reader.readUInt32();\n const resourceDimension = reader.readUInt32();\n const miscFlag = reader.readUInt32();\n const arraySize = reader.readUInt32();\n const miscFlags2 = reader.readUInt32();\n\n return {\n header,\n dx10: { dxgiFormat, resourceDimension, miscFlag, arraySize, miscFlags2 },\n };\n }\n\n return { header };\n}\n\nfunction mipDimension(base: number, level: number): number {\n return Math.max(1, base >> level);\n}\n\nfunction expectedDataLength(format: EddsFormat, width: number, height: number): number | null {\n switch (format) {\n case 'BC1':\n case 'BC4': {\n const blocksW = Math.max(1, Math.ceil(width / 4));\n const blocksH = Math.max(1, Math.ceil(height / 4));\n return blocksW * blocksH * 8;\n }\n case 'BC2':\n case 'BC3':\n case 'BC5':\n case 'BC6':\n case 'BC7': {\n const blocksW = Math.max(1, Math.ceil(width / 4));\n const blocksH = Math.max(1, Math.ceil(height / 4));\n return blocksW * blocksH * 16;\n }\n case 'RGBA8':\n case 'BGRA8':\n return width * height * 4;\n default:\n return null;\n }\n}\n\nfunction detectFormat(header: DdsHeader, dx10?: DdsHeaderDx10): { format: EddsFormat; details: string } {\n if (dx10) {\n const format = mapDxgiFormat(dx10.dxgiFormat);\n return { format, details: `DXGI ${dx10.dxgiFormat}` };\n }\n\n const pf = header.pixelFormat;\n if ((pf.flags & PIXELFORMAT_FLAG_FOURCC) !== 0) {\n const fourCCStr = intToFourCc(pf.fourCC).toUpperCase();\n switch (fourCCStr) {\n case 'DXT1':\n return { format: 'BC1', details: fourCCStr };\n case 'DXT2':\n case 'DXT3':\n return { format: 'BC2', details: fourCCStr };\n case 'DXT4':\n case 'DXT5':\n return { format: 'BC3', details: fourCCStr };\n case 'ATI1':\n case 'BC4U':\n case 'BC4S':\n return { format: 'BC4', details: fourCCStr };\n case 'ATI2':\n case 'BC5U':\n case 'BC5S':\n return { format: 'BC5', details: fourCCStr };\n default:\n return { format: 'UNKNOWN', details: fourCCStr };\n }\n }\n\n if ((pf.flags & PIXELFORMAT_FLAG_RGB) !== 0) {\n if ((pf.flags & PIXELFORMAT_FLAG_ALPHA_PIXELS) !== 0 && pf.rgbBitCount === 32) {\n if (pf.rMask === 0xff && pf.gMask === 0xff00 && pf.bMask === 0xff0000 && pf.aMask === 0xff000000) {\n return { format: 'RGBA8', details: 'RGBA8' };\n }\n if (pf.rMask === 0xff0000 && pf.gMask === 0xff00 && pf.bMask === 0xff && pf.aMask === 0xff000000) {\n return { format: 'BGRA8', details: 'BGRA8' };\n }\n }\n }\n\n if ((pf.flags & PIXELFORMAT_FLAG_LUMINANCE) !== 0 && pf.rgbBitCount === 8) {\n return { format: 'RGBA8', details: 'LUMINANCE8' };\n }\n\n return { format: 'UNKNOWN', details: 'UNKNOWN' };\n}\n\nfunction mapDxgiFormat(dxgiFormat: number): EddsFormat {\n // Common DXGI values we expect in EDDS payloads\n switch (dxgiFormat) {\n case 71: // DXGI_FORMAT_BC1_UNORM\n return 'BC1';\n case 74: // DXGI_FORMAT_BC2_UNORM\n return 'BC2';\n case 77: // DXGI_FORMAT_BC3_UNORM\n return 'BC3';\n case 80: // DXGI_FORMAT_BC4_UNORM\n return 'BC4';\n case 83: // DXGI_FORMAT_BC5_UNORM\n return 'BC5';\n case 95: // DXGI_FORMAT_BC6H_UF16\n return 'BC6';\n case 98: // DXGI_FORMAT_BC7_UNORM\n return 'BC7';\n case 87: // DXGI_FORMAT_B8G8R8A8_UNORM\n return 'BGRA8';\n case 28: // DXGI_FORMAT_R8G8B8A8_UNORM\n return 'RGBA8';\n default:\n return 'UNKNOWN';\n }\n}\n\nfunction convertToRgba(mip: EddsMipMap, format: EddsFormat): Uint8Array {\n const dataView = new DataView(mip.data.buffer, mip.data.byteOffset, mip.data.byteLength);\n \n switch (format) {\n case 'BC1':\n return decodeBC1(dataView, mip.width, mip.height);\n case 'BC2':\n return decodeBC2(dataView, mip.width, mip.height);\n case 'BC3':\n return decodeBC3(dataView, mip.width, mip.height);\n case 'BC6':\n throw new Error(`RGBA conversion for BC6 (HDR) is not yet implemented`);\n case 'BC7':\n return decodeBC7(dataView, mip.width, mip.height);\n case 'RGBA8':\n return mip.data.slice();\n case 'BGRA8': {\n const rgba = new Uint8Array(mip.data.length);\n for (let i = 0; i < mip.data.length; i += 4) {\n rgba[i] = mip.data[i + 2];\n rgba[i + 1] = mip.data[i + 1];\n rgba[i + 2] = mip.data[i];\n rgba[i + 3] = mip.data[i + 3];\n }\n return rgba;\n }\n default:\n throw new Error(`RGBA conversion is not implemented for format ${format}`);\n }\n}\n\nexport class Edds {\n width = 0;\n height = 0;\n format: EddsFormat = 'UNKNOWN';\n formatDetails = '';\n mipmaps: EddsMipMap[] = [];\n\n read(buffer: Buffer | Uint8Array): void {\n const reader = new BinaryReader(buffer);\n const magic = reader.readRawString(4);\n if (magic !== DDS_MAGIC) {\n throw new Error('File is not a valid EDDS (missing DDS magic)');\n }\n\n const { header, dx10 } = readDdsHeader(reader);\n const mipCount = (header.caps & HEADER_CAPS_MIPMAP) !== 0 && header.mipMapCount > 0 ? header.mipMapCount : 1;\n const faceCount = (header.caps2 & HEADER_CAPS2_CUBEMAP) !== 0 ? 6 : 1;\n if (faceCount !== 1) {\n throw new Error('Cubemap EDDS files are not supported yet');\n }\n\n this.width = header.width;\n this.height = header.height;\n\n const blocks: MipMapBlock[] = [];\n for (let i = 0; i < mipCount; i++) {\n const blockMagic = reader.readRawString(4);\n const size = reader.readInt32();\n if (blockMagic === COPY_MAGIC) {\n blocks.push({ kind: 'COPY', size });\n } else if (blockMagic === LZ4_MAGIC) {\n blocks.push({ kind: 'LZ4', size });\n } else {\n throw new Error(`Unknown EDDS block magic: ${blockMagic}`);\n }\n }\n\n const { format, details } = detectFormat(header, dx10);\n this.format = format;\n this.formatDetails = details;\n\n if (blocks.length !== mipCount) {\n throw new Error('Block header count does not match mip map count');\n }\n\n this.mipmaps = new Array<EddsMipMap>(mipCount);\n for (let mipIdx = 0; mipIdx < mipCount; mipIdx++) {\n const block = blocks[mipIdx];\n const mipLevel = mipCount - mipIdx - 1;\n const mipWidth = mipDimension(header.width, mipLevel);\n const mipHeight = mipDimension(header.height, mipLevel);\n\n let data: Uint8Array;\n if (block.kind === 'COPY') {\n const raw = reader.readBytes(block.size);\n data = new Uint8Array(raw); // copy to detach from the source buffer\n } else {\n data = decompressLz4Block(reader, block.size);\n }\n\n const expected = expectedDataLength(this.format, mipWidth, mipHeight);\n if (expected !== null && expected !== data.length) {\n throw new Error(`Unexpected mip level size (expected ${expected} bytes, got ${data.length})`);\n }\n\n this.mipmaps[mipLevel] = { width: mipWidth, height: mipHeight, data, compression: block.kind };\n }\n }\n\n getRgbaPixelData(mipLevel = 0): Uint8Array {\n if (this.mipmaps.length === 0) {\n throw new Error('No mipmaps loaded');\n }\n if (mipLevel < 0 || mipLevel >= this.mipmaps.length) {\n throw new RangeError(`mipLevel ${mipLevel} is out of range`);\n }\n\n const mip = this.mipmaps[mipLevel];\n return convertToRgba(mip, this.format);\n }\n\n get formatName(): string {\n if (this.formatDetails && this.format !== 'UNKNOWN') {\n return `${this.format} (${this.formatDetails})`;\n }\n return this.formatDetails || this.format;\n }\n}\n"],
|
|
5
|
+
"mappings": "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AE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAClE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAClE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAClE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAClE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAClE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAClE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAClE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAClE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAClE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAClE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAClE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAClE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAClE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAClE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAClE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAClE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAClE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAClE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAClE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAClE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAClE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAClE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAClE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAClE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAClE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAClE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAClE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAClE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAClE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAClE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;AACtE;AAEA,IAAM,4BAA4B;EAC9B,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAClE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAClE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAClE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAClE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAClE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAClE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAClE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAClE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAClE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAClE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAClE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAClE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAClE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAClE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAClE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAClE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAClE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAClE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAClE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAClE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAClE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAClE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAClE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAClE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAClE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAClE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAClE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAClE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC;EAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@bis-toolkit/edds",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "EDDS (Enfusion DDS) reader with RGBA output",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js",
|
|
12
|
+
"default": "./dist/index.js"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist",
|
|
17
|
+
"README.md",
|
|
18
|
+
"LICENSE"
|
|
19
|
+
],
|
|
20
|
+
"publishConfig": {
|
|
21
|
+
"access": "public"
|
|
22
|
+
},
|
|
23
|
+
"scripts": {
|
|
24
|
+
"build": "npm run build:types && npm run build:bundle",
|
|
25
|
+
"build:types": "tsc --declaration --emitDeclarationOnly --outDir dist",
|
|
26
|
+
"build:bundle": "node esbuild.config.js",
|
|
27
|
+
"prepublishOnly": "npm run build",
|
|
28
|
+
"watch": "tsc --watch",
|
|
29
|
+
"lint": "eslint",
|
|
30
|
+
"lint:fix": "eslint --fix"
|
|
31
|
+
},
|
|
32
|
+
"keywords": [
|
|
33
|
+
"edds",
|
|
34
|
+
"dds",
|
|
35
|
+
"texture",
|
|
36
|
+
"lz4"
|
|
37
|
+
],
|
|
38
|
+
"author": "Alpine Labs",
|
|
39
|
+
"license": "GPL-3.0-or-later",
|
|
40
|
+
"devDependencies": {
|
|
41
|
+
"@types/decode-dxt": "^1.0.3",
|
|
42
|
+
"@types/node": "^25.0.3",
|
|
43
|
+
"@typescript-eslint/eslint-plugin": "^8.52.0",
|
|
44
|
+
"@typescript-eslint/parser": "^8.52.0",
|
|
45
|
+
"esbuild": "^0.27.2",
|
|
46
|
+
"esbuild-plugin-copy": "^2.1.1",
|
|
47
|
+
"eslint": "^9.39.2",
|
|
48
|
+
"typescript": "^5.9.3",
|
|
49
|
+
"typescript-eslint": "^8.52.0"
|
|
50
|
+
},
|
|
51
|
+
"dependencies": {
|
|
52
|
+
"@bis-toolkit/utils": "^1.0.0",
|
|
53
|
+
"@bis-toolkit/bcn": "^1.0.0"
|
|
54
|
+
}
|
|
55
|
+
}
|