// https://msdn.microsoft.com/en-us/library/windows/desktop/bb173059.aspx "DXGI_FORMAT enumeration"
        // https://msdn.microsoft.com/en-us/library/windows/desktop/cc308051.aspx "Legacy Formats: Map Direct3D 9 Formats to Direct3D 10"
        private static Squish.DDS.PixelFormat GetPixelFormat(TextureDX10ArchiveFile.Entry entry)
        {
            switch (entry.Format)
            {
            case 71:     // DXGI_FORMAT_BC1_UNORM
            {
                var pixelFormat = new Squish.DDS.PixelFormat();
                pixelFormat.Initialise(Squish.DDS.FileFormat.DXT1);
                return(pixelFormat);
            }

            case 74:     // DXGI_FORMAT_BC2_UNORM
            {
                var pixelFormat = new Squish.DDS.PixelFormat();
                pixelFormat.Initialise(Squish.DDS.FileFormat.DXT3);
                return(pixelFormat);
            }

            case 77:     // DXGI_FORMAT_BC3_UNORM
            {
                var pixelFormat = new Squish.DDS.PixelFormat();
                pixelFormat.Initialise(Squish.DDS.FileFormat.DXT5);
                return(pixelFormat);
            }

            case 87:     // DXGI_FORMAT_B8G8R8A8_UNORM
            {
                var pixelFormat = new Squish.DDS.PixelFormat();
                pixelFormat.Initialise(Squish.DDS.FileFormat.A8R8G8B8);
                return(pixelFormat);
            }

            case 61:     // DXGI_FORMAT_R8_UNORM
            case 83:     // DXGI_FORMAT_BC5_UNORM
            case 98:     // DXGI_FORMAT_BC7_UNORM
            {
                var pixelFormat = new Squish.DDS.PixelFormat();
                pixelFormat.Size   = pixelFormat.GetSize();
                pixelFormat.FourCC = 0x30315844;     // 'DX10'
                return(pixelFormat);
            }
            }

            throw new NotSupportedException();
        }
        private static void ConvertTexture(Stream input, TextureDX10ArchiveFile.Entry entry, Stream output)
        {
            const Endian endian = Endian.Little;

            var header = new Squish.DDS.Header();

            header.Size              = header.GetSize();
            header.Flags             = Squish.DDS.HeaderFlags.Texture | Squish.DDS.HeaderFlags.Mipmap;
            header.Width             = entry.Width;
            header.Height            = entry.Height;
            header.PitchOrLinearSize = 0;
            header.Depth             = 0;
            header.MipMapCount       = entry.MipMapCount;
            header.PixelFormat       = GetPixelFormat(entry);
            header.SurfaceFlags      = 8;
            header.CubemapFlags      = 0;

            output.WriteValueU32(0x20534444, endian);
            header.Serialize(output, endian);

            if (header.PixelFormat.FourCC == 0x30315844)
            {
                output.WriteValueU32(entry.Format, endian);
                output.WriteValueU32(2, endian);
                output.WriteValueU32(0, endian);
                output.WriteValueU32(1, endian);
                output.WriteValueU32(0, endian);
            }

            foreach (var mipMap in entry.MipMaps)
            {
                if (mipMap.DataCompressedSize == 0)
                {
                    input.Seek(mipMap.DataOffset, SeekOrigin.Begin);
                    output.WriteFromStream(input, mipMap.DataUncompressedSize);
                }
                else
                {
                    input.Seek(mipMap.DataOffset, SeekOrigin.Begin);
                    var zlib = new InflaterInputStream(input);
                    output.WriteFromStream(zlib, mipMap.DataUncompressedSize);
                }
            }
        }