Esempio n. 1
0
        private void ReadHeaderInfo(EndiannessAwareBinaryReader reader)
        {
            MagicBytes = reader.ReadBytes(4, ByteOrder.LittleEndian);
            if (!IsValidPAC)
            {
                return;
            }

            HeaderSize = reader.ReadUInt32();
            FileLength = reader.ReadUInt32();
            FileCount  = reader.ReadUInt32();

            Parameters = (PACParameters)reader.ReadInt32();

            FileNameLength = reader.ReadInt32();

            reader.BaseStream.Seek(8, SeekOrigin.Current);
        }
Esempio n. 2
0
        public Bitmap GetImage()
        {
            var initstream = GetReadStream();
            var reader     =
                new EndiannessAwareBinaryReader(initstream, Encoding.Default, true, Endianness);

            try
            {
                var savpos = reader.BaseStream.Position;
                if (reader.ReadInt32(ByteOrder.LittleEndian) == 0x73676573)
                {
                    Endianness = ByteOrder.BigEndian;
                    reader.BaseStream.Seek(-4, SeekOrigin.Current);
                    reader.Close();
                    reader.Dispose();
                    reader = new EndiannessAwareBinaryReader(
                        SEGSCompression.DecompressStream(initstream, Endianness), Endianness);
                }
                else
                {
                    reader.BaseStream.Seek(12, SeekOrigin.Current);
                    if (reader.BaseStream.Position != reader.BaseStream.Length)
                    {
                        if (reader.ReadInt32(ByteOrder.LittleEndian) == 0x73676573)
                        {
                            Endianness = ByteOrder.BigEndian;
                            reader.BaseStream.Seek(-4, SeekOrigin.Current);
                            reader.Close();
                            reader.Dispose();
                            reader = new EndiannessAwareBinaryReader(
                                SEGSCompression.DecompressStream(initstream, Endianness), Endianness);
                        }
                        else
                        {
                            reader.BaseStream.Seek(-20, SeekOrigin.Current);
                        }
                    }
                    else
                    {
                        reader.BaseStream.Position = savpos;
                    }
                }

                if (!endiannessChecked)
                {
                    CheckEndianness(reader.ReadBytes(4));
                    reader.ChangeEndianness(Endianness);
                    reader.BaseStream.Seek(-4, SeekOrigin.Current);
                }

                using (var memStream = new MemoryStream())
                {
                    reader.BaseStream.CopyTo(memStream);

                    var ddsImage = new DDSImage(memStream.ToArray(), Endianness);
                    if (ddsImage.BitmapImage == null)
                    {
                        return(null);
                    }
                    return(ddsImage.BitmapImage);
                }
            }
            catch
            {
                return(null);
            }
            finally
            {
                reader.Close();
                reader.Dispose();
                initstream.Close();
                initstream.Dispose();
            }
        }