Exemplo n.º 1
0
        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));
        }