/// <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); }
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); }