private static byte[] DecodeCmpr(byte[] fileData, uint dataOffset, uint width, uint height) { //Decode S3TC1 byte[] buffer = new byte[width * height * 4]; for (int y = 0; y < height / 4; y += 2) { for (int x = 0; x < width / 4; x += 2) { for (int dy = 0; dy < 2; ++dy) { for (int dx = 0; dx < 2; ++dx, dataOffset += 8) { if (4 * (x + dx) < width && 4 * (y + dy) < height) { Buffer.BlockCopy(fileData, (int)dataOffset, buffer, (int)(8 * ((y + dy) * width / 4 + x + dx)), 8); } } } } } for (int i = 0; i < width * height / 2; i += 8) { FSHelpers.Swap(ref buffer[i], ref buffer[i + 1]); FSHelpers.Swap(ref buffer[i + 2], ref buffer[i + 3]); buffer[i + 4] = S3TC1ReverseByte(buffer[i + 4]); buffer[i + 5] = S3TC1ReverseByte(buffer[i + 5]); buffer[i + 6] = S3TC1ReverseByte(buffer[i + 6]); buffer[i + 7] = S3TC1ReverseByte(buffer[i + 7]); } //Now decompress the DXT1 data within it. return(DecompressDxt1(buffer, width, height)); }