예제 #1
0
파일: ArcMMA.cs 프로젝트: zxc120/GARbro
        Stream UnpackEntry(IBinaryStream input, MmaEntry entry)
        {
            uint flags = entry.Flags & 6;

            if (6 == flags && 0 == entry.HeaderSize)
            {
                using (input)
                {
                    var data = new byte[entry.UnpackedSize];
                    UnpackLz(input, data, 0);
                    return(new BinMemoryStream(data, entry.Name));
                }
            }
            else if (4 == flags)
            {
                using (input)
                {
                    input.Position = (int)entry.HeaderSize;
                    var data = input.ReadBytes((int)entry.UnpackedSize);
                    Decrypt(data, 0, data.Length);
                    return(new BinMemoryStream(data, entry.Name));
                }
            }
            return(input.AsStream);
        }
예제 #2
0
파일: ArcMMA.cs 프로젝트: zxc120/GARbro
 public MmeMaskDecoder(IBinaryStream input, MmaEntry entry) : base(input, entry)
 {
     m_width  = m_input.ReadInt32();
     m_height = m_input.ReadInt32();
     m_stride = m_width;
     Info     = new ImageMetaData {
         Width  = (uint)m_width,
         Height = (uint)m_height,
         BPP    = 8,
     };
     m_output = new byte[entry.UnpackedSize];
     Format   = PixelFormats.Gray8;
 }
예제 #3
0
        void ReadMmaList(ArcView file, List <Entry> dir, MmaEntry index_entry)
        {
            using (var packed = file.CreateStream(index_entry.Offset, index_entry.Size))
                using (var unpacked = UnpackEntry(packed, index_entry))
                    using (var index = new StreamReader(unpacked, Encodings.cp932))
                    {
                        for (int i = 0; i < dir.Count; ++i)
                        {
//                    int type = index.Read();
//                    if (-1 == type)
//                        break;
                            var name = index.ReadLine();
                            if (null == name)
                            {
                                break;
                            }
                            dir[i].Name = Path.GetFileName(name);
                        }
                    }
        }
예제 #4
0
파일: ArcMMA.cs 프로젝트: zxc120/GARbro
 public MmeImageDecoder(IBinaryStream input, MmaEntry entry) : base(input, entry)
 {
     m_width  = m_input.ReadInt32();
     m_height = m_input.ReadInt32();
     m_bpp    = m_input.ReadInt32();
     m_stride = m_input.ReadInt32();
     Info     = new ImageMetaData {
         Width  = (uint)m_width,
         Height = (uint)m_height,
         BPP    = m_bpp,
     };
     m_output = new byte[entry.UnpackedSize];
     if (24 == m_bpp)
     {
         Format = PixelFormats.Bgr24;
     }
     else
     {
         Format = PixelFormats.Bgr32;
     }
 }
예제 #5
0
파일: ArcMMA.cs 프로젝트: zxc120/GARbro
        public override ArcFile TryOpen(ArcView file)
        {
            int version = file.View.ReadInt32(0xC);

            if (version != 1)
            {
                return(null);
            }
            int count = file.View.ReadInt32(0x10);

            if (!IsSaneCount(count))
            {
                return(null);
            }
            uint index_offset = file.View.ReadUInt32(4);

            if (index_offset >= file.MaxOffset)
            {
                return(null);
            }
            var base_name = Path.GetFileNameWithoutExtension(file.Name);
            var dir       = new List <Entry> (count);

            for (int i = 0; i < count; ++i)
            {
                var entry = new MmaEntry {
                    Name         = string.Format("{0}#{1:D5}", base_name, i),
                    Offset       = file.View.ReadUInt32(index_offset),
                    UnpackedSize = file.View.ReadUInt32(index_offset + 4),
                    Size         = file.View.ReadUInt32(index_offset + 8),
                    HeaderSize   = file.View.ReadUInt32(index_offset + 0x0C),
                    Flags        = file.View.ReadUInt32(index_offset + 0x10),
                };
                if (!entry.CheckPlacement(file.MaxOffset))
                {
                    return(null);
                }
                switch (entry.Flags & 0x38)
                {
                case 8:
                case 0x10:
                case 0x18:
                case 0x38:
                    entry.Type = "image";
                    break;

                default:
                    if (0x2D == entry.Flags)
                    {
                        entry.Type = "audio";
                    }
                    break;
                }
                dir.Add(entry);
                index_offset += 0x14;
            }
            var list_entry = dir[0] as MmaEntry;

            if (0x2F == list_entry.Flags)
            {
                ReadMmaList(file, dir, list_entry);
            }
            return(new ArcFile(file, this, dir));
        }
예제 #6
0
파일: ArcMMA.cs 프로젝트: zxc120/GARbro
 protected MmeBaseDecoder(IBinaryStream input, MmaEntry entry) : base(input)
 {
     m_header_size = (int)entry.HeaderSize;
     m_flags       = entry.Flags;
 }