Exemple #1
0
        public override ArcFile TryOpen(ArcView file)
        {
            if (file.View.ReadUInt32(4) != 0xFFBAA9B6)
            {
                return(null);
            }
            uint index_length = file.View.ReadUInt32(8);

            using (var index_s = OpenDataStream(file, 8))
                using (var index = BinaryStream.FromStream(index_s, file.Name))
                {
                    int count = index.ReadInt32();
                    if (!IsSaneCount(count))
                    {
                        return(null);
                    }
                    uint data_offset = 8 + index_length;
                    var  dir         = new List <Entry> (count);
                    for (int i = 0; i < count; ++i)
                    {
                        var name  = index.ReadCString(0x104);
                        var entry = FormatCatalog.Instance.Create <PackedEntry> (name);
                        entry.Offset = index.ReadUInt32() + data_offset;
                        entry.Size   = index.ReadUInt32();
                        if (!entry.CheckPlacement(file.MaxOffset))
                        {
                            return(null);
                        }
                        dir.Add(entry);
                    }
                    return(new ArcFile(file, this, dir));
                }
        }
Exemple #2
0
        public override ImageMetaData ReadMetaData(IBinaryStream file)
        {
            var header = file.ReadHeader(0x29);

            if (header.Length != 0x29)
            {
                return(null);
            }
            var gps = new GpsMetaData
            {
                Width        = header.ToUInt32(0x19),
                Height       = header.ToUInt32(0x1D),
                Compression  = header[0x10],
                UnpackedSize = header.ToInt32(0x11),
                PackedSize   = header.ToInt32(0x15),
            };

            // read BMP header
            using (var stream = OpenGpsStream(file, gps.Compression, 0x54))
                using (var input = BinaryStream.FromStream(stream, file.Name))
                {
                    var bmp_info = base.ReadMetaData(input);
                    if (null == bmp_info)
                    {
                        return(null);
                    }
                    gps.BPP = bmp_info.BPP;
                    return(gps);
                }
        }
Exemple #3
0
        public override ImageData Read(IBinaryStream file, ImageMetaData info)
        {
            var gps = (GpsMetaData)info;

            file.Position = 0x29;
            using (var stream = OpenGpsStream(file, gps.Compression, gps.UnpackedSize))
                using (var input = BinaryStream.FromStream(stream, file.Name))
                    return(base.Read(input, info));
        }
Exemple #4
0
        List <Entry> ReadIndex(ArcView file, byte[] key = null)
        {
            bool is_encrypted = key != null;
            uint index_offset = file.View.ReadUInt32(file.MaxOffset - 4);

            if (index_offset >= file.MaxOffset)
            {
                return(null);
            }
            int index_size = file.View.ReadInt32(index_offset);

            if (index_size <= 0)
            {
                return(null);
            }
            var    index = new byte[index_size];
            Stream input = file.CreateStream(index_offset + 4);

            if (is_encrypted)
            {
                input = new ByteStringEncryptedStream(input, key);
            }
            using (var packed = BinaryStream.FromStream(input, ""))
                LzUnpack(packed, index);
            var  dir       = new List <Entry>();
            int  index_pos = 0;
            uint offset    = LittleEndian.ToUInt32(index, index_pos);

            while (index_pos < index.Length)
            {
                index_pos += 4;
                int name_length = index[index_pos];
                if (0 == name_length)
                {
                    break;
                }
                bool is_packed = index[index_pos + 1] != 0;
                index_pos   += 6;
                name_length *= 2;
                var name = Encoding.Unicode.GetString(index, index_pos, name_length);
                index_pos += name_length;
                uint next_offset = LittleEndian.ToUInt32(index, index_pos);
                var  entry       = FormatCatalog.Instance.Create <PackedEntry> (name);
                entry.Offset   = offset;
                entry.Size     = next_offset - offset;
                entry.IsPacked = is_packed;
                if (!entry.CheckPlacement(index_offset))
                {
                    return(null);
                }
                dir.Add(entry);
                offset = next_offset;
            }
            return(dir);
        }
Exemple #5
0
        protected virtual IImageDecoder DecryptImage(IBinaryStream input, AImageScheme scheme)
        {
            int type = input.ReadByte();

            if ('c' == type || 'b' == type)
            {
                uint img_size  = Binary.BigEndian(input.ReadUInt32());
                long start_pos = input.Length - img_size;
                input = BinaryStream.FromStream(new StreamRegion(input.AsStream, start_pos, img_size), input.Name);
            }
            else if (scheme != null && ('a' == type || 'd' == type) && input.Length > 21)
            {
                int id = input.ReadByte();
                if (id == scheme.Value2)
                {
                    return(new AImageReader(input, scheme, type));
                }
            }
            input.Position = 0;
            return(new ImageFormatDecoder(input));
        }
Exemple #6
0
 public override SoundInput TryOpen(IBinaryStream file)
 {
     using (var lzss = new LzssStream(file.AsStream, LzssMode.Decompress, true))
     {
         var header = new byte[8];
         if (lzss.Read(header, 0, 8) != 8)
         {
             return(null);
         }
         int length = header.ToInt32(4);
         var wav    = new MemoryStream(length + 8);
         wav.Write(header, 0, 8);
         lzss.CopyTo(wav);
         var bin   = BinaryStream.FromStream(wav, file.Name);
         var sound = Wav.TryOpen(bin);
         if (sound != null)
         {
             file.Dispose();
         }
         return(sound);
     }
 }
Exemple #7
0
 public override IImageDecoder OpenImage(ArcFile arc, Entry entry)
 {
     if (entry.Name.HasAnyOfExtensions(".BGD", ".CRGB"))
     {
         var input = OpenEntry(arc, entry);
         var info  = new ImageMetaData {
             Width = 800, Height = 600, BPP = 24
         };
         return(new CgdReader(BinaryStream.FromStream(input, entry.Name), info));
     }
     else if (entry.Name.HasExtension(".edg"))
     {
         var input = OpenEntry(arc, entry);
         var info  = new ImageMetaData {
             Width = 460, Height = 345, BPP = 24
         };
         return(new ImgReader(BinaryStream.FromStream(input, entry.Name), info));
     }
     else if (entry.Name.HasExtension(".rol"))
     {
         var  input  = OpenEntry(arc, entry);
         uint width  = 202;
         uint height = (uint)input.Length / (((width * 3u) + 3u) & ~3u);
         var  info   = new ImageMetaData {
             Width = width, Height = height, BPP = 24
         };
         return(new ImgReader(BinaryStream.FromStream(input, entry.Name), info));
     }
     else if (entry.Name.HasExtension(".CHAR"))
     {
         var input = OpenEntry(arc, entry);
         var info  = new ChrMetaData {
             Width      = 800, Height = 600, BPP = 32,
             DataOffset = 0, RgbSize = (int)input.Length,
         };
         return(new ChrReader(BinaryStream.FromStream(input, entry.Name), info));
     }
     return(base.OpenImage(arc, entry));
 }
Exemple #8
0
        public override ImageMetaData ReadMetaData(IBinaryStream file)
        {
            var header = file.ReadHeader(0x29);
            var gps    = new GpsMetaData();

            if (header.ToUInt32(4) == 0xCCCCCCCC)
            {
                gps.HeaderSize   = 0x19;
                gps.Compression  = 2;
                gps.UnpackedSize = header.ToInt32(0x9);
                gps.PackedSize   = header.ToInt32(0xD);
            }
            else
            {
                gps.HeaderSize   = 0x29;
                gps.Compression  = header[0x10];
                gps.UnpackedSize = header.ToInt32(0x11);
                gps.PackedSize   = header.ToInt32(0x15);
                gps.Width        = header.ToUInt32(0x19);
                gps.Height       = header.ToUInt32(0x1D);
            }
            file.Position = gps.HeaderSize;
            // read BMP header
            using (var stream = OpenGpsStream(file, gps.Compression, 0x54))
                using (var input = BinaryStream.FromStream(stream, file.Name))
                {
                    var bmp_info = Bmp.ReadMetaData(input);
                    if (null == bmp_info)
                    {
                        return(null);
                    }
                    gps.BPP    = bmp_info.BPP;
                    gps.Width  = bmp_info.Width;
                    gps.Height = bmp_info.Height;
                    return(gps);
                }
        }
Exemple #9
0
 public override void Initialize(Stream input)
 {
     m_input = BinaryStream.FromStream(input, "");
 }
Exemple #10
0
 public AssetReader(Stream input, string name) : this(BinaryStream.FromStream(input, name))
 {
 }
Exemple #11
0
 public AssetReader(Stream input, string name)
 {
     m_input = BinaryStream.FromStream(input, name);
     SetupReaders(0, false);
 }