예제 #1
0
파일: ArcGPC.cs 프로젝트: zxc120/GARbro
        public override Stream OpenEntry(ArcFile arc, Entry entry)
        {
            var           pent  = entry as PackedEntry;
            IBinaryStream input = arc.File.CreateStream(entry.Offset, entry.Size, entry.Name);

            if (null != pent && pent.IsPacked)
            {
                IBinaryStream unpacked;
                using (input)
                {
                    var data = new byte[pent.UnpackedSize];
                    UnpackEntry(input.AsStream, data);
                    unpacked = new BinMemoryStream(data, entry.Name);
                }
                input = unpacked;
            }
            if (input.Length > 4 && input.Length < 0x10000)
            {
                int unpacked_size = input.ReadUInt16();
                int packed_size   = input.ReadUInt16();
                if (packed_size == input.Length - 4)
                {
                    using (input)
                    {
                        var data = new byte[unpacked_size];
                        UnpackLz77(input.AsStream, data);
                        return(new BinMemoryStream(data, entry.Name));
                    }
                }
                input.Position = 0;
            }
            return(input.AsStream);
        }
예제 #2
0
파일: ImageK2.cs 프로젝트: zxc120/GARbro
        public override ImageData Read(IBinaryStream file, ImageMetaData info)
        {
            var bmp_data = Decompress(file);

            using (var bmp = new BinMemoryStream(bmp_data))
                return(Bmp.Read(bmp, info));
        }
예제 #3
0
        public override Stream OpenEntry(ArcFile arc, Entry entry)
        {
            var actarc = arc as ActressArchive;

            if (null == actarc || null == actarc.Key)
            {
                return(base.OpenEntry(arc, entry));
            }
            var    header = ReadEntryHeader(actarc, entry);
            Stream input;

            if (entry.Size <= 0x20)
            {
                input = new BinMemoryStream(header, entry.Name);
            }
            else
            {
                input = new PrefixStream(header, arc.File.CreateStream(entry.Offset + 0x20, entry.Size - 0x20));
            }
            if (header.AsciiEqual("BM"))
            {
                return(input);
            }
            input.Position = 4;
            return(new LzssStream(input));
        }
예제 #4
0
파일: ImageK2.cs 프로젝트: zxc120/GARbro
        public override ImageMetaData ReadMetaData(IBinaryStream file)
        {
            var bmp_header = Decompress(file, 0x36);

            using (var bmp = new BinMemoryStream(bmp_header))
                return(Bmp.ReadMetaData(bmp));
        }
예제 #5
0
파일: ImageSCP.cs 프로젝트: ziyuejun/GARbro
        public override ImageMetaData ReadMetaData(IBinaryStream file)
        {
            file.Position = 4;
            uint length = file.ReadUInt32() ^ DefaultHeaderKey;

            if (length <= 0)
            {
                return(null);
            }
            var header = new byte[0x36];

            Unpack(file, header);
            if (!header.AsciiEqual("BM"))
            {
                return(null);
            }
            using (var bmp = new BinMemoryStream(header))
            {
                var info = Bmp.ReadMetaData(bmp) as BmpMetaData;
                if (info != null)
                {
                    info.ImageLength = length;
                }
                return(info);
            }
        }
예제 #6
0
        public override ImageMetaData ReadMetaData(IBinaryStream file)
        {
            var header = file.ReadHeader(8);

            if (!header.AsciiEqual("YP"))
            {
                return(null);
            }
            int unpacked_size = header.ToInt24(2);
            int packed_size   = header.ToInt24(5);
            var data          = LzUnpack(file, 0x36);

            using (var bmp = new BinMemoryStream(data, file.Name))
            {
                var info = Bmp.ReadMetaData(bmp);
                if (null == info)
                {
                    return(info);
                }
                return(new YpMetaData {
                    Width = info.Width,
                    Height = info.Height,
                    BPP = info.BPP,
                    UnpackedSize = unpacked_size,
                });
            }
        }
예제 #7
0
파일: ArcSWF.cs 프로젝트: ziyuejun/GARbro
        ImageData Unpack()
        {
            BitmapSource image;

            using (var jpeg = new BinMemoryStream(m_input, 6, m_jpeg_length))
            {
                var decoder = new JpegBitmapDecoder(jpeg, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
                image = decoder.Frames[0];
            }
            Info = new ImageMetaData {
                Width  = (uint)image.PixelWidth,
                Height = (uint)image.PixelHeight,
                BPP    = image.Format.BitsPerPixel,
            };
            byte[] alpha = new byte[image.PixelWidth * image.PixelHeight];
            using (var input = new BinMemoryStream(m_input, 6 + m_jpeg_length, m_input.Length - (6 + m_jpeg_length)))
                using (var alpha_data = new ZLibStream(input, CompressionMode.Decompress))
                {
                    alpha_data.Read(alpha, 0, alpha.Length);
                }
            if (image.Format.BitsPerPixel != 32)
            {
                image = new FormatConvertedBitmap(image, PixelFormats.Bgr32, null, 0);
            }
            int stride = image.PixelWidth * 4;
            var pixels = new byte[stride * image.PixelHeight];

            image.CopyPixels(pixels, stride, 0);
            ApplyAlpha(pixels, alpha);
            return(ImageData.Create(Info, PixelFormats.Bgra32, null, pixels, stride));
        }
예제 #8
0
파일: ImageDAT.cs 프로젝트: zxc120/GARbro
        public override ImageMetaData ReadMetaData(IBinaryStream file)
        {
            var header        = file.ReadHeader(9);
            int packed_size   = header.ToInt32(1);
            int unpacked_size = header.ToInt32(5);

            if (header[0] != 3 || packed_size != file.Length - 9)
            {
                return(null);
            }
            var bmp_header = new byte[56];

            Unpack(file, bmp_header);
            using (var bmp = new BinMemoryStream(bmp_header))
            {
                var info = Bmp.ReadMetaData(bmp);
                if (null == info)
                {
                    return(null);
                }
                return(new MinkMetaData {
                    Width = info.Width,
                    Height = info.Height,
                    BPP = info.BPP,
                    UnpackedSize = unpacked_size,
                });
            }
        }
예제 #9
0
        public override ImageData Read(IBinaryStream stream, ImageMetaData info)
        {
            if (stream.Length > int.MaxValue)
            {
                throw new FileSizeException();
            }
            var header       = stream.ReadHeader(14);
            int data_length  = header.ToInt32(10);
            int input_length = (int)(stream.Length - stream.Position);

            using (var lz = new LzssReader(stream.AsStream, input_length, data_length))
            {
                lz.FrameSize    = 0x1000;
                lz.FrameFill    = 0x20;
                lz.FrameInitPos = 0x1000 - 0x10;
                lz.Unpack();
                var data  = lz.Data;
                int count = Math.Min(100, data.Length);
                for (int i = 0; i < count; ++i)
                {
                    data[i] ^= 0xff;
                }
                using (var bmp = new BinMemoryStream(data, stream.Name))
                    return(base.Read(bmp, info));
            }
        }
예제 #10
0
파일: ArcDAT.cs 프로젝트: tuchang/GARbro
        public override IImageDecoder OpenImage(ArcFile arc, Entry entry)
        {
            // XXX compression method identical to Maika.Mk2Opener
            var id_str = arc.File.View.ReadString(entry.Offset, 2);

            if (id_str != "B1" && id_str != "D1" && id_str != "E1")
            {
                return(base.OpenImage(arc, entry));
            }
            uint packed_size = arc.File.View.ReadUInt32(entry.Offset + 2);

            if (packed_size != entry.Size - 10)
            {
                return(base.OpenImage(arc, entry));
            }
            uint unpacked_size = arc.File.View.ReadUInt32(entry.Offset + 6);

            using (var input = arc.File.CreateStream(entry.Offset + 10, packed_size))
                using (var lzss = new LzssReader(input, (int)packed_size, (int)unpacked_size))
                {
                    lzss.Unpack();
                    var bmp = new BinMemoryStream(lzss.Data, entry.Name);
                    return(new ImageFormatDecoder(bmp));
                }
        }
예제 #11
0
파일: CzCrypt.cs 프로젝트: zxc120/GARbro
        public override Stream EntryReadFilter(Xp3Entry entry, Stream input)
        {
            if (entry.UnpackedSize <= 15 || "audio" == entry.Type)
                return input;

            var header = new byte[15];
            input.Read (header, 0, 15);
            if (CzMagic == header.ToUInt32 (0))
            {
                var type = new char[3] {
                    (char)(header[4] ^ 0x11),
                    (char)(header[5] ^ 0x7F),
                    (char)(header[6] ^ 0x9A)
                };
                byte key = (byte)type[0];
                int unpacked_size = CzDecryptInt (header, 7, key);
                int packed_size = CzDecryptInt (header, 11, key);
                if (packed_size < entry.UnpackedSize && 0 == ((packed_size-5) & 0xF))
                {
                    var data = new byte[packed_size];
                    input.Read (data, 0, packed_size);
                    input.Dispose();
                    data = CzDecryptData (data);
                    input = new BinMemoryStream (data);
                    if ('C' == type[0])
                        input = new ZLibStream (input, CompressionMode.Decompress);
                    return input;
                }
            }
            if (!input.CanSeek)
                return new PrefixStream (header, input);
            input.Position = 0;
            return input;
        }
예제 #12
0
 /// <summary>
 // Try to parse file containing game meta-information.
 /// </summary>
 internal string TryParseMeta(string meta_arc_name)
 {
     if (!VFS.FileExists(meta_arc_name))
     {
         return(null);
     }
     using (var unpacker = new TocUnpacker(meta_arc_name))
     {
         if (unpacker.Length > 0x1000)
         {
             return(null);
         }
         var data = unpacker.Unpack(8);
         if (null == data)
         {
             return(null);
         }
         using (var content = new BinMemoryStream(data))
         {
             int title_length = content.ReadInt32();
             if (title_length <= 0 || title_length > content.Length)
             {
                 return(null);
             }
             var title = content.ReadBytes(title_length);
             if (title.Length != title_length)
             {
                 return(null);
             }
             return(Encodings.cp932.GetString(title));
         }
     }
 }
예제 #13
0
 public static byte[] GetKeyDataFromExe(string filename)
 {
     using (var exe = new ExeFile.ResourceAccessor(filename))
     {
         var tform = exe.GetResource("TFORM1", "#10");
         if (null == tform || !tform.AsciiEqual(0, "TPF0"))
         {
             return(null);
         }
         using (var input = new BinMemoryStream(tform))
         {
             var deserializer = new DelphiDeserializer(input);
             var form         = deserializer.Deserialize();
             var image        = form.Contents.FirstOrDefault(n => n.Name == "IconKeyImage");
             if (null == image)
             {
                 return(null);
             }
             var icon = image.Props["Picture.Data"] as byte[];
             if (null == icon || icon.Length < 0x106 || !icon.AsciiEqual(0, "\x05TIcon"))
             {
                 return(null);
             }
             return(new CowArray <byte> (icon, 6, 0x100).ToArray());
         }
     }
 }
예제 #14
0
파일: ArcDAT.cs 프로젝트: minhrg/GARbro
        public override Stream OpenEntry(ArcFile arc, Entry entry)
        {
            var rent = entry as RepiEntry;

            if (null == rent || !rent.HasEncryptionKey)
            {
                return(arc.File.CreateStream(entry.Offset, entry.Size));
            }
            var  key        = rent.CreateKey();
            uint enc_length = Math.Min((uint)key.Length, entry.Size);

            byte[] encrypted = arc.File.View.ReadBytes(entry.Offset, enc_length);
            DecryptEntry(encrypted, key);
            Stream input;

            if (enc_length == entry.Size)
            {
                input = new BinMemoryStream(encrypted, entry.Name);
            }
            else
            {
                input = arc.File.CreateStream(entry.Offset + enc_length, entry.Size - enc_length);
                input = new PrefixStream(encrypted, input);
            }
            if (rent.IsPacked)
            {
                input = new LzssStream(input);
            }
            return(input);
        }
예제 #15
0
파일: ImageMGR.cs 프로젝트: zxc120/GARbro
        public override ImageData Read(IBinaryStream stream, ImageMetaData info)
        {
            var meta = (MgrMetaData)info;

            stream.Position = meta.Offset;
            var data = new byte[meta.UnpackedSize];

            if (data.Length != MgrOpener.Decompress(stream.AsStream, data))
            {
                throw new InvalidFormatException();
            }
            if (meta.BPP != 32)
            {
                using (var bmp = new BinMemoryStream(data, stream.Name))
                    return(Bmp.Read(bmp, info));
            }
            // special case for 32bpp bitmaps with alpha-channel
            int stride = (int)meta.Width * 4;
            var pixels = new byte[stride * (int)meta.Height];
            int src    = LittleEndian.ToInt32(data, 0xA);

            for (int dst = stride * ((int)meta.Height - 1); dst >= 0; dst -= stride)
            {
                Buffer.BlockCopy(data, src, pixels, dst, stride);
                src += stride;
            }
            return(ImageData.Create(info, PixelFormats.Bgra32, null, pixels));
        }
예제 #16
0
파일: ArcG00.cs 프로젝트: zxc120/GARbro
        public override IImageDecoder OpenImage(ArcFile arc, Entry entry)
        {
            var g00arc = (G00Archive)arc;
            var g00ent = (G00Entry)entry;
            var input  = new BinMemoryStream(g00arc.Bitmap);

            return(new G00TileDecoder(input, g00arc.ImageInfo, g00ent));
        }
예제 #17
0
파일: AudioFSB5.cs 프로젝트: zxc120/GARbro
        SoundInput RebuildVorbis(Sample sample)
        {
            if (!sample.MetaData.ContainsKey(ChunkType.VorbisData))
            {
                throw new InvalidFormatException("No VORBISDATA chunk in FSB5 Vorbis stream.");
            }
            var vorbis_data = sample.MetaData[ChunkType.VorbisData] as VorbisData;
            var setup_data  = GetVorbisHeader(vorbis_data.Crc32);
            var state       = new OggStreamState(1);

            var id_packet      = RebuildIdPacket(sample, 0x100, 0x800);
            var comment_packet = RebuildCommentPacket();
            var setup_packet   = RebuildSetupPacket(setup_data);
            var info           = CreateVorbisInfo(sample, setup_packet);

            var output = new MemoryStream();

            state.PacketIn(id_packet);
            state.Write(output);
            state.PacketIn(comment_packet);
            state.Write(output);
            state.PacketIn(setup_packet);
            state.Write(output);
            state.Flush(output);

            long packet_no       = setup_packet.PacketNo + 1;
            long granule_pos     = 0;
            int  prev_block_size = 0;

            using (var input = new BinMemoryStream(sample.Data))
            {
                var packet      = new OggPacket();
                int packet_size = ReadPacketSize(input);
                while (packet_size > 0)
                {
                    packet.SetPacket(packet_no++, input.ReadBytes(packet_size));
                    packet_size = ReadPacketSize(input);
                    packet.EoS  = 0 == packet_size;

                    int block_size = info.PacketBlockSize(packet);
                    if (prev_block_size != 0)
                    {
                        granule_pos += (block_size + prev_block_size) / 4;
                    }
                    else
                    {
                        granule_pos = 0;
                    }
                    packet.GranulePos = granule_pos;
                    prev_block_size   = block_size;

                    state.PacketIn(packet);
                    state.Write(output);
                }
            }
            output.Position = 0;
            return(new OggInput(output));
        }
예제 #18
0
 public byte[] Unpack()
 {
     using (var packed = new BinMemoryStream(m_src, m_input_pos, m_remaining))
         using (var hstr = new HuffmanStream(packed))
         {
             hstr.Read(m_dst, 0, m_dst.Length);
             return(m_dst);
         }
 }
예제 #19
0
파일: ArcAFA.cs 프로젝트: zxc120/GARbro
 public List <Entry> Read()
 {
     byte[] packed;
     using (var input = m_file.CreateStream(12, m_data_offset - 12))
         using (var bits = new MsbBitStream(input))
         {
             bits.GetNextBit();
             m_dict = ReadBytes(bits);
             if (null == m_dict)
             {
                 return(null);
             }
             int packed_size   = ReadInt32(bits);
             int unpacked_size = ReadInt32(bits);
             packed = new byte[packed_size];
             for (int i = 0; i < packed_size; ++i)
             {
                 packed[i] = (byte)bits.GetBits(8);
             }
         }
     using (var bstr = new BinMemoryStream(packed))
         using (var zstr = new ZLibStream(bstr, CompressionMode.Decompress))
             using (var index = new MsbBitStream(zstr))
             {
                 index.GetNextBit();
                 int count = ReadInt32(index);
                 if (!ArchiveFormat.IsSaneCount(count))
                 {
                     return(null);
                 }
                 var dir = new List <Entry> (count);
                 for (int i = 0; i < count; ++i)
                 {
                     if (index.GetBits(2) == -1)
                     {
                         break;
                     }
                     var name_buf = ReadEncryptedChars(index);
                     if (null == name_buf)
                     {
                         return(null);
                     }
                     var name  = DecryptString(name_buf, name_buf.Length);
                     var entry = FormatCatalog.Instance.Create <Entry> (name);
                     ReadInt32(index);
                     ReadInt32(index);
                     entry.Offset = (uint)ReadInt32(index) + m_data_offset;
                     entry.Size   = (uint)ReadInt32(index);
                     if (!entry.CheckPlacement(m_file.MaxOffset))
                     {
                         return(null);
                     }
                     dir.Add(entry);
                 }
                 return(dir);
             }
 }
예제 #20
0
        IarImage CombineImage(IarImage overlay, IarArchive iarc)
        {
            using (var input = new BinMemoryStream(overlay.Data))
            {
                var dir        = (List <Entry>)iarc.Dir;
                int base_index = input.ReadInt32();
                if (base_index >= dir.Count)
                {
                    throw new InvalidFormatException("Invalid base image index");
                }
                int diff_y     = input.ReadInt32();
                int diff_count = input.ReadInt32();

                var    overlay_info = overlay.Info;
                int    pixel_size   = overlay_info.BPP / 8;
                var    base_image   = new IarImage(iarc, dir[base_index]);
                byte[] output       = base_image.Data;
                if (overlay_info.Height != base_image.Info.Height || overlay_info.Stride != base_image.Info.Stride)
                {
                    int    src_height = (int)Math.Min(overlay_info.Height, base_image.Info.Height);
                    int    src_stride = Math.Min(overlay_info.Stride, base_image.Info.Stride);
                    byte[] src        = base_image.Data;
                    output = new byte[overlay_info.Height * overlay_info.Stride];
                    int dst_pos = 0;
                    if (base_image.Info.OffsetY < overlay_info.OffsetY)
                    {
                        dst_pos += (-base_image.Info.OffsetY + overlay_info.OffsetY) * overlay_info.Stride;
                    }
                    if (base_image.Info.OffsetX < overlay_info.OffsetX)
                    {
                        dst_pos += (-base_image.Info.OffsetX + overlay_info.OffsetX) * pixel_size;
                    }
                    for (int y = 0; y < src_height; ++y)
                    {
                        Buffer.BlockCopy(src, y * base_image.Info.Stride, output, dst_pos, src_stride);
                        dst_pos += overlay_info.Stride;
                    }
                }
                int dst = diff_y * overlay_info.Stride;
                for (int i = 0; i < diff_count; ++i)
                {
                    int chunk_count = input.ReadUInt16();
                    int x           = 0;
                    for (int j = 0; j < chunk_count; ++j)
                    {
                        int skip_count = pixel_size * input.ReadUInt16();
                        int copy_count = pixel_size * input.ReadUInt16();

                        x += skip_count;
                        input.Read(output, dst + x, copy_count);
                        x += copy_count;
                    }
                    dst += overlay_info.Stride;
                }
                return(new IarImage(overlay_info, output, overlay.Palette));
            }
        }
예제 #21
0
        public override ImageData Read(IBinaryStream file, ImageMetaData info)
        {
            int unpacked_size = (int)file.Signature;

            file.Position = 4;
            var unpacked = Decompress(file, unpacked_size);

            using (var bmp = new BinMemoryStream(unpacked, file.Name))
                return(Bmp.Read(bmp, info));
        }
예제 #22
0
        public override ImageData Read(IBinaryStream file, ImageMetaData info)
        {
            var meta = (YpMetaData)info;

            file.Position = 8;
            var data = LzUnpack(file, meta.UnpackedSize);

            using (var bmp = new BinMemoryStream(data, file.Name))
                return(Bmp.Read(bmp, info));
        }
예제 #23
0
파일: ImageSCP.cs 프로젝트: ziyuejun/GARbro
        public override ImageData Read(IBinaryStream file, ImageMetaData info)
        {
            var meta = (BmpMetaData)info;
            var data = new byte[meta.ImageLength];

            file.Position = 8;
            Unpack(file, data);
            using (var bmp = new BinMemoryStream(data))
                return(Bmp.Read(bmp, info));
        }
예제 #24
0
        public void UnpackAlpha(int offset)
        {
            using (var input = new BinMemoryStream(this.Input, offset, Input.Length - offset))
            {
                if (1 != input.ReadInt32())
                {
                    return;
                }
                int dst = 3;
                int ctl = 1 << 1;
                while (dst < Output.Length)
                {
                    ctl >>= 1;
                    if (1 == ctl)
                    {
                        ctl = input.ReadUInt8() | 0x100;
                    }

                    if (0 != (ctl & 1))
                    {
                        int v = input.ReadUInt16();
                        int x = v & 0x3F;
                        if (x > 0x1F)
                        {
                            x |= -0x40;
                        }
                        int y = (v >> 6) & 7;
                        if (y != 0)
                        {
                            y |= -8;
                        }
                        int count = ((v >> 9) & 0x7F) + 3;

                        int src = dst + (x + y * Width) * 4;
                        if (src < 0 || src >= dst)
                        {
                            return;
                        }

                        for (int i = 0; i < count; ++i)
                        {
                            Output[dst] = Output[src];
                            src        += 4;
                            dst        += 4;
                        }
                    }
                    else
                    {
                        Output[dst] = input.ReadUInt8();
                        dst        += 4;
                    }
                }
                HasAlpha = true;
            }
        }
예제 #25
0
파일: ArcYK.cs 프로젝트: zxc120/GARbro
        public override ArcFile TryOpen(ArcView file)
        {
            if ((file.View.ReadInt32(0) | file.View.ReadInt32(4) | file.View.ReadInt32(8)) != 0)
            {
                return(null);
            }
            int key   = file.View.ReadInt32(0x10);
            int count = file.View.ReadInt32(0x14);

            if (!IsSaneCount(count))
            {
                return(null);
            }
            uint index_offset = 0x18;
            var  index        = new Dictionary <int, Entry> (count);

            for (int i = 0; i < count; ++i)
            {
                int id    = file.View.ReadInt32(index_offset);
                var entry = new Entry {
                    Offset = file.View.ReadUInt32(index_offset + 4),
                    Size   = file.View.ReadUInt32(index_offset + 8),
                };
                if (!entry.CheckPlacement(file.MaxOffset))
                {
                    return(null);
                }
                index[id]     = entry;
                index_offset += 12;
            }
            var names_entry = index[0];
            var names       = file.View.ReadBytes(names_entry.Offset, names_entry.Size);

            if (key != 0)
            {
                DecryptData(names, key);
            }
            using (var input = new BinMemoryStream(names))
            {
                while (input.PeekByte() != -1)
                {
                    int id   = input.ReadInt32();
                    var name = input.ReadCString();
                    if (!string.IsNullOrEmpty(name))
                    {
                        var entry = index[id];
                        entry.Name = name;
                        entry.Type = FormatCatalog.Instance.GetTypeFromName(name);
                    }
                }
            }
            var dir = index.Values.Where(e => !string.IsNullOrEmpty(e.Name)).ToList();

            return(new YkArchive(file, this, dir, key));
        }
예제 #26
0
파일: ImageMGR.cs 프로젝트: zxc120/GARbro
        public override ImageMetaData ReadMetaData(IBinaryStream stream)
        {
            int count = stream.ReadInt16();

            if (count <= 0 || count >= 0x100)
            {
                return(null);
            }
            int offset;

            if (count > 1)
            {
                offset = stream.ReadInt32();
                if (offset != 2 + count * 4)
                {
                    return(null);
                }
            }
            else
            {
                offset = 2;
            }
            stream.Position = offset;
            int unpacked_size = stream.ReadInt32();
            int packed_size   = stream.ReadInt32();

            offset += 8;
            if (offset + packed_size > stream.Length)
            {
                return(null);
            }
            byte[] header = new byte[0x36];
            if (0x36 != MgrOpener.Decompress(stream.AsStream, header) ||
                header[0] != 'B' || header[1] != 'M')
            {
                return(null);
            }
            using (var bmp = new BinMemoryStream(header, stream.Name))
            {
                var info = Bmp.ReadMetaData(bmp);
                if (null == info)
                {
                    return(null);
                }
                return(new MgrMetaData
                {
                    Width = info.Width,
                    Height = info.Height,
                    BPP = info.BPP,
                    Offset = offset,
                    PackedSize = packed_size,
                    UnpackedSize = unpacked_size,
                });
            }
        }
예제 #27
0
파일: ArcPAK.cs 프로젝트: uboaa/GARbro
        public override ArcFile TryOpen(ArcView file)
        {
            uint index_size = file.View.ReadUInt32(4);

            if (index_size < 0x10 || index_size >= file.MaxOffset)
            {
                return(null);
            }
            IBinaryStream index;
            bool          is_encrypted = file.View.ReadByte(3) == '2';

            if (is_encrypted)
            {
                var index_bytes = new byte[(index_size + 3) & ~3u];
                file.View.Read(8, index_bytes, 0, index_size);
                DecryptIndex(index_bytes, (int)index_size);
                index = new BinMemoryStream(index_bytes, 0, (int)index_size, file.Name);
            }
            else
            {
                index = file.CreateStream(8, index_size);
            }
            using (index)
            {
                uint index_pos = 0;
                var  dir       = new List <Entry>();
                while (index_pos < index_size)
                {
                    index.Position = index_pos;
                    uint offset = index.ReadUInt32();
                    if (0 == offset)
                    {
                        break;
                    }
                    uint size        = index.ReadUInt32();
                    byte name_length = index.ReadUInt8();
                    var  name        = index.ReadCString(name_length);
                    index_pos += ((5u + name_length) & ~3u) + 8u;

                    var entry = FormatCatalog.Instance.Create <Entry> (name);
                    entry.Offset = offset;
                    entry.Size   = size;
                    if (!entry.CheckPlacement(file.MaxOffset))
                    {
                        return(null);
                    }
                    dir.Add(entry);
                }
                if (0 == dir.Count)
                {
                    return(null);
                }
                return(new ArcFile(file, this, dir));
            }
        }
예제 #28
0
        public override ImageData Read(IBinaryStream stream, ImageMetaData info)
        {
            var meta = (EgnMetaData)info;

            stream.Position = meta.DataOffset;
            var reader = new Reader(stream, meta.UnpackedSize, meta.Mode, meta.Flag);

            reader.Unpack();
            using (var bmp = new BinMemoryStream(reader.Data, stream.Name))
                return(Bmp.Read(bmp, info));
        }
예제 #29
0
파일: ImageDAT.cs 프로젝트: zxc120/GARbro
        public override ImageData Read(IBinaryStream file, ImageMetaData info)
        {
            var meta = (MinkMetaData)info;

            file.Position = 9;
            var pixels = new byte[meta.UnpackedSize];

            Unpack(file, pixels);
            using (var bmp = new BinMemoryStream(pixels, file.Name))
                return(Bmp.Read(bmp, info));
        }
예제 #30
0
        public override ImageData Read(IBinaryStream file, ImageMetaData info)
        {
            var meta = (ExpMetaData)info;

            file.Position = 0x28;
            var reader   = new ExpReader(file, meta.BitmapFileName);
            var bmp_data = reader.Unpack(meta.BitmapSize);

            using (var mem_bmp = new BinMemoryStream(bmp_data, file.Name))
                return(Bmp.Read(mem_bmp, info));
        }