Exemplo n.º 1
0
        /// <summary>
        /// Parses a DDS from a buffer.
        /// </summary>
        /// <param name="buffer">The buffer the DDS is stored in.</param>
        /// <param name="offset">The position of the DDS in buffer.</param>
        /// <param name="length">The length of the DDS in buffer.</param>
        /// <returns></returns>
        public static DDS Parse(byte[] buffer, int offset = 0, int length = -1)
        {
            if (length < 0)
            {
                length = buffer.Length - offset;
            }
            var stream = new MemoryStream(buffer, offset, length);
            var reader = new BinaryReader(stream);

            var dds = new DDS();

            if (Encoding.ASCII.GetString(reader.ReadBytes(3)) != Magic)
            {
                throw new ArgumentException("Invalid Magic!");
            }

            dds.Variant = (DDSVariant)reader.ReadByte();

            dds.Header = DDSHeader.Parse(reader.ReadBytes(DDSHeader.DefaultSize));
            if (dds.Header.Flags.HasFlag(DDSHeaderFlags.PixelFormat))
            {
                if (dds.Header.PixelFormat.Flags.HasFlag(DDSPixelFlags.FourCC))
                {
                    if (dds.Header.PixelFormat.FourCC == "DX10")
                    {
                        throw new NotImplementedException("DX10 not implemented!");
                    }
                }
            }

            dds.ParseMipmaps(reader);

            return(dds);
        }
Exemplo n.º 2
0
        public static DDSHeader Parse(byte[] buffer, int offset = 0)
        {
            int length = buffer.Length - offset;
            var stream = new MemoryStream(buffer, offset, length);
            var reader = new BinaryReader(stream);

            var header = new DDSHeader {
                Size = reader.ReadUInt32()
            };

            if (header.Size != DefaultSize)
            {
                throw new ArgumentException("Wrong Header Size!");
            }
            header.Flags       = (DDSHeaderFlags)reader.ReadUInt32();
            header.Height      = reader.ReadUInt32();
            header.Width       = reader.ReadUInt32();
            header.LinearSize  = reader.ReadUInt32();
            header.Depth       = reader.ReadUInt32();
            header.MipmapCount = reader.ReadUInt32();
            header.Reserved1   = new uint[11];
            for (int i = 0; i < header.Reserved1.Length; i++)
            {
                header.Reserved1[i] = reader.ReadUInt32();
            }

            header.PixelFormat = DDSPixelFormat.Parse(reader.ReadBytes(32));
            header.Caps        = (DDSCaps)reader.ReadUInt32();
            header.Caps2       = (DDSCaps2)reader.ReadUInt32();
            header.Caps3       = reader.ReadUInt32();
            header.Caps4       = reader.ReadUInt32();
            header.Reserved2   = reader.ReadUInt32();

            return(header);
        }