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);
        }
        public static DDSPixelFormat Parse(byte[] buffer, int offset = 0)
        {
            int length = buffer.Length - offset;
            var stream = new MemoryStream(buffer, offset, length);
            var reader = new BinaryReader(stream);

            var pixelFormat = new DDSPixelFormat {
                Size = reader.ReadUInt32()
            };

            if (pixelFormat.Size != DefaultSize)
            {
                throw new ArgumentException("Invalid PixelFormat Size!");
            }
            pixelFormat.Flags       = (DDSPixelFlags)reader.ReadUInt32();
            pixelFormat.FourCC      = Encoding.ASCII.GetString(reader.ReadBytes(4));
            pixelFormat.RGBBitCount = reader.ReadUInt32();
            pixelFormat.RBitMask    = reader.ReadUInt32();
            pixelFormat.GBitMask    = reader.ReadUInt32();
            pixelFormat.BBitMask    = reader.ReadUInt32();
            pixelFormat.ABitMask    = reader.ReadUInt32();

            return(pixelFormat);
        }