예제 #1
0
 public override ImageMetaData ReadMetaData(Stream stream)
 {
     using (var input = new ArcView.Reader(stream))
     {
         var info = new PicMetaData();
         input.ReadUInt32();
         info.PackedSize   = input.ReadUInt32();
         info.UnpackedSize = input.ReadUInt32();
         info.HeaderSize   = input.ReadUInt32();
         if (info.HeaderSize >= stream.Length || info.PackedSize + info.HeaderSize > stream.Length)
         {
             return(null);
         }
         input.ReadUInt32();
         info.Width  = input.ReadUInt32();
         info.Height = input.ReadUInt32();
         info.BPP    = input.ReadInt32();
         if (info.HeaderSize >= 0x2C)
         {
             input.ReadInt32();
             info.OffsetX = input.ReadInt32();
             info.OffsetY = input.ReadInt32();
         }
         return(info);
     }
 }
예제 #2
0
        }                                                               // 'YGP'

        public override ImageMetaData ReadMetaData(Stream stream)
        {
            stream.Position = 4;
            using (var reader = new ArcView.Reader(stream))
            {
                int  mask_pos = reader.ReadUInt16();        // 04
                byte type     = reader.ReadByte();          // 06
                if (type != 1 && type != 2)
                {
                    return(null);
                }
                var info = new YgpMetaData {
                    Type = type, BPP = 32
                };
                info.Flags = reader.ReadByte();             // 07
                int header_size = reader.ReadInt32();       // 08
                stream.Position = header_size;
                info.DataSize   = reader.ReadInt32();       // XX+00
                info.Width      = reader.ReadUInt16();      // XX+04
                info.Height     = reader.ReadUInt16();      // XX+06
                info.DataOffset = header_size + 8;
                if (0 != (info.Flags & 4))
                {
                    stream.Position = 0x14;
                    info.OffsetX    = reader.ReadInt16();
                    info.OffsetY    = reader.ReadInt16();
                }
                return(info);
            }
        }
예제 #3
0
        HuffmanNode[] CreateHuffmanTree(Stream input)
        {
            var nodes = new HuffmanNode[0x200];
            var tree  = new List <int> (0x100);

            using (var reader = new ArcView.Reader(input))
            {
                m_huffman_unpacked = reader.ReadInt32();
                reader.ReadInt32(); // packed_size

                for (int i = 0; i < 0x100; i++)
                {
                    nodes[i].Freq = reader.ReadUInt32();
                    AddNode(tree, nodes, i);
                }
            }
            int last_node = 0x100;

            while (tree.Count > 1)
            {
                int l = tree[0];
                tree.RemoveAt(0);
                int r = tree[0];
                tree.RemoveAt(0);
                nodes[last_node].Freq  = nodes[l].Freq + nodes[r].Freq;
                nodes[last_node].Left  = l;
                nodes[last_node].Right = r;
                AddNode(tree, nodes, last_node++);
            }
            return(nodes);
        }
예제 #4
0
        }                                                                 // 'hiz'

        public override ImageMetaData ReadMetaData(Stream stream)
        {
            using (var input = new ArcView.Reader(stream))  // sub_4BF900
            {
                input.ReadInt32();
                int n = input.ReadInt32();
                if (100 != n)
                {
                    return(null);
                }
                uint right    = input.ReadUInt32() ^ 0xAA5A5A5A;
                uint bottom   = input.ReadUInt32() ^ 0xAC9326AF;
                int  unknown1 = input.ReadInt32(); // @0x10
                if (unknown1 == 0x375A8436)
                {
                    return(null);
                }
                uint unpacked_size = input.ReadUInt32() ^ 0x19739D6A; // @0x14
                if (unpacked_size != right * bottom * 4)
                {
                    return(null);
                }
                return(new HizMetaData
                {
                    Width = right,
                    Height = bottom,
                    BPP = 32,
                    IsPacked = true,
                    DataOffset = 0x4c,
                    UnpackedSize = unpacked_size,
                });
            }
        }
예제 #5
0
        }                                                                 // 'NGP '

        public override ImageMetaData ReadMetaData(Stream stream)
        {
            stream.Position = 0x12;
            using (var reader = new ArcView.Reader(stream))
            {
                int  packed_size = reader.ReadInt32();
                uint width       = reader.ReadUInt32();
                uint height      = reader.ReadUInt32();
                int  bpp         = reader.ReadUInt16() * 8;
                reader.BaseStream.Position = 0x100;
                int unpacked_size = reader.ReadInt32();
                if (packed_size <= 0 || unpacked_size <= 0)
                {
                    return(null);
                }
                return(new NgpMetaData
                {
                    Width = width,
                    Height = height,
                    BPP = bpp,
                    PackedSize = packed_size,
                    UnpackedSize = unpacked_size,
                });
            }
        }
예제 #6
0
        public override ImageMetaData ReadMetaData(Stream stream)
        {
            using (var header = new ArcView.Reader(stream))
            {
                var info = new EpaMetaData();
                info.Mode      = header.ReadInt32() >> 24;
                info.ColorType = header.ReadInt32() & 0xff;
                switch (info.ColorType)
                {
                case 0: info.BPP = 8; break;

                case 1: info.BPP = 24; break;

                case 2: info.BPP = 32; break;

                case 3: info.BPP = 15; break;

                case 4: info.BPP = 8; break;

                default: return(null);
                }
                info.Width  = header.ReadUInt32();
                info.Height = header.ReadUInt32();
                if (2 == info.Mode)
                {
                    info.OffsetX = header.ReadInt32();
                    info.OffsetY = header.ReadInt32();
                }
                return(info);
            }
        }
예제 #7
0
        }                                                                 // 'S25'

        // in current implementation, only the first frame is returned.
        // per-frame access is provided by S25Opener class.

        public override ImageMetaData ReadMetaData(Stream stream)
        {
            using (var input = new ArcView.Reader(stream))
            {
                input.ReadUInt32();
                int count = input.ReadInt32();
                if (count < 0 || count > 0xfffff)
                {
                    return(null);
                }
                uint first_offset = input.ReadUInt32();
                if (0 == first_offset)
                {
                    return(null);
                }
                input.BaseStream.Position = first_offset;
                var info = new S25MetaData();
                info.Width       = input.ReadUInt32();
                info.Height      = input.ReadUInt32();
                info.OffsetX     = input.ReadInt32();
                info.OffsetY     = input.ReadInt32();
                info.FirstOffset = first_offset + 0x14;
                info.Incremental = 0 != (input.ReadUInt32() & 0x80000000u);
                info.BPP         = 32;
                return(info);
            }
        }
예제 #8
0
 public override ImageMetaData ReadMetaData(Stream stream)
 {
     using (var input = new ArcView.Reader(stream))
     {
         int type = input.ReadInt32();
         if (type < 0 || type > 3)
         {
             return(null);
         }
         if (-1 != input.ReadInt32())
         {
             return(null);
         }
         int  x           = input.ReadInt32();
         int  y           = input.ReadInt32();
         uint width       = input.ReadUInt32();
         uint height      = input.ReadUInt32();
         uint comp_size   = input.ReadUInt32();
         uint uncomp_size = input.ReadUInt32();
         if (uncomp_size != width * height * 3u)
         {
             return(null);
         }
         return(new Pt1MetaData {
             Width = width,
             Height = height,
             OffsetX = x,
             OffsetY = y,
             BPP = 3 == type ? 32 : 24,
             Type = type,
             PackedSize = comp_size,
             UnpackedSize = uncomp_size
         });
     }
 }
예제 #9
0
 public override ImageMetaData ReadMetaData(Stream stream)
 {
     stream.Position = 4;
     using (var reader = new ArcView.Reader(stream))
     {
         int version = reader.ReadInt16();
         if (version != 1)
         {
             return(null);
         }
         int unpacked_size = reader.ReadInt32();
         int data_offset   = reader.ReadInt32();
         if (unpacked_size < 0x36 || data_offset < stream.Position)
         {
             return(null);
         }
         var header = new byte[0x20];
         stream.Position = data_offset;
         Unpack(stream, header);
         if ('B' != header[0] || 'M' != header[1])
         {
             return(null);
         }
         return(new ZbmMetaData
         {
             Width = LittleEndian.ToUInt32(header, 0x12),
             Height = LittleEndian.ToUInt32(header, 0x16),
             BPP = LittleEndian.ToInt16(header, 0x1C),
             UnpackedSize = unpacked_size,
             DataOffset = data_offset,
         });
     }
 }
예제 #10
0
        public override Stream OpenEntry(ArcFile arc, Entry entry)
        {
            var input = arc.File.CreateStream(entry.Offset, entry.Size);

            if (entry.Size <= 8)
            {
                return(input);
            }
            if (!entry.Name.EndsWith(".so4", StringComparison.InvariantCultureIgnoreCase) &&
                !entry.Name.EndsWith(".so5", StringComparison.InvariantCultureIgnoreCase))
            {
                return(input);
            }
            using (var header = new ArcView.Reader(input))
            {
                int packed   = header.ReadInt32();
                int unpacked = header.ReadInt32();
                if (packed + 8 != entry.Size || packed <= 0 || unpacked <= 0)
                {
                    return(input);
                }
                using (input)
                    using (var reader = new LzssReader(input, packed, unpacked))
                    {
                        reader.Unpack();
                        return(new MemoryStream(reader.Data));
                    }
            }
        }
예제 #11
0
 public override ImageMetaData ReadMetaData(Stream stream)
 {
     using (var reader = new ArcView.Reader(stream))
     {
         int count = reader.ReadInt16();
         if (count <= 0 || count >= 0x100)
         {
             return(null);
         }
         int offset;
         if (count > 1)
         {
             offset = reader.ReadInt32();
             if (offset != 2 + count * 4)
             {
                 return(null);
             }
         }
         else
         {
             offset = 2;
         }
         stream.Position = offset;
         int unpacked_size = reader.ReadInt32();
         int packed_size   = reader.ReadInt32();
         offset += 8;
         if (offset + packed_size > stream.Length)
         {
             return(null);
         }
         byte[] header = new byte[0x36];
         if (0x36 != MgrOpener.Decompress(stream, header) ||
             header[0] != 'B' || header[1] != 'M')
         {
             return(null);
         }
         using (var bmp = new MemoryStream(header))
         {
             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,
             });
         }
     }
 }
예제 #12
0
 public BmrDecoder(Stream input)
 {
     input.Position = 3;
     using (var header = new ArcView.Reader(input))
     {
         m_step       = header.ReadByte();
         m_final_size = header.ReadInt32();
         m_key        = header.ReadInt32();
         int unpacked_size = header.ReadInt32();
         m_output = new byte[unpacked_size];
         m_input  = new MsbBitStream(input, true);
     }
 }
예제 #13
0
        }                                                                 // 'HG-2'

        public override ImageMetaData ReadMetaData(Stream stream)
        {
            stream.Position = 8;
            using (var header = new ArcView.Reader(stream))
            {
                var info = new Hg2MetaData();
                int type = header.ReadInt32();
                if (0x25 == type)
                {
                    info.HeaderSize = 0x58;
                }
                else if (0x20 == type)
                {
                    info.HeaderSize = 0x50;
                }
                else
                {
                    return(null);
                }
                info.Width  = header.ReadUInt32();
                info.Height = header.ReadUInt32();
                info.BPP    = header.ReadInt32();
                header.BaseStream.Seek(8, SeekOrigin.Current);
                info.DataPacked   = header.ReadInt32();
                info.DataUnpacked = header.ReadInt32();
                info.CtlPacked    = header.ReadInt32();
                info.CtlUnpacked  = header.ReadInt32();
                header.BaseStream.Seek(8, SeekOrigin.Current);
                info.CanvasWidth  = header.ReadUInt32();
                info.CanvasHeight = header.ReadUInt32();
                info.OffsetX      = header.ReadInt32();
                info.OffsetY      = header.ReadInt32();
                return(info);
            }
        }
예제 #14
0
 public override ImageMetaData ReadMetaData(Stream stream)
 {
     using (var input = new ArcView.Reader(stream))
     {
         int signature = ~input.ReadInt32();
         int mode      = (signature & 0x70) >> 4; // v6
         if (0 != (mode & 4))
         {
             return(null);
         }
         int flag = signature & 0xF; // v7
         int data_size, data_offset;
         if (0 != (signature & 0x80))
         {
             data_offset = 4;
             data_size   = Binary.BigEndian(signature) & 0xFFFFFF;
         }
         else
         {
             data_offset = 8;
             data_size   = Binary.BigEndian(input.ReadInt32());
         }
         if (data_size <= 0 || data_size > 0xFFFFFF) // arbitrary max BMP size
         {
             return(null);
         }
         var reader = new Reader(input, 0x36, mode, flag);  // size of BMP header
         reader.Unpack();
         using (var bmp = new MemoryStream(reader.Data))
         {
             var info = base.ReadMetaData(bmp);
             if (null == info)
             {
                 return(null);
             }
             return(new EgnMetaData
             {
                 Width = info.Width,
                 Height = info.Height,
                 BPP = info.BPP,
                 Mode = mode,
                 Flag = flag,
                 DataOffset = data_offset,
                 UnpackedSize = data_size,
             });
         }
     }
 }
예제 #15
0
 public override ImageMetaData ReadMetaData(Stream stream)
 {
     using (var input = new ArcView.Reader(stream))
     {
         int width  = input.ReadInt16();
         int height = input.ReadInt16();
         if (width <= 0 || height <= 0)
         {
             return(null);
         }
         int bpp = input.ReadInt32();
         if (24 != bpp && 32 != bpp && 8 != bpp)
         {
             return(null);
         }
         if (0 != input.ReadInt64())
         {
             return(null);
         }
         return(new ImageMetaData
         {
             Width = (uint)width,
             Height = (uint)height,
             BPP = bpp,
         });
     }
 }
예제 #16
0
 public Reader(Stream input, Pt1MetaData info)
 {
     m_type         = info.Type;
     m_input        = new byte[info.PackedSize + 8];
     input.Position = 0x20;
     if ((int)info.PackedSize != input.Read(m_input, 0, (int)info.PackedSize))
     {
         throw new InvalidFormatException("Unexpected end of file");
     }
     m_width  = (int)info.Width;
     m_height = (int)info.Height;
     m_output = new byte[info.UnpackedSize];
     m_stride = m_width * 3;
     if (3 == m_type)
     {
         Format = PixelFormats.Bgra32;
         using (var reader = new ArcView.Reader(input))
         {
             int packed_size = reader.ReadInt32();
             m_alpha_packed = new byte[packed_size];
             if (packed_size != input.Read(m_alpha_packed, 0, packed_size))
             {
                 throw new EndOfStreamException();
             }
         }
     }
     else
     {
         Format = PixelFormats.Bgr24;
     }
 }
예제 #17
0
 public override ImageMetaData ReadMetaData(Stream stream)
 {
     using (var reader = new ArcView.Reader(stream))
     {
         stream.Seek(4, SeekOrigin.Current);
         int offset = reader.ReadInt32();
         if (offset <= 8)
         {
             return(null);
         }
         stream.Position = offset;
         uint signature = reader.ReadUInt32();
         if (signature != base.Signature)
         {
             return(null);
         }
         stream.Seek(-4, SeekOrigin.Current);
         var info = base.ReadMetaData(stream) as GrxMetaData;
         if (null == info)
         {
             return(null);
         }
         if (info.AlphaOffset > 0)
         {
             info.AlphaOffset += offset;
         }
         return(new SgxMetaData {
             GrxOffset = offset, GrxInfo = info
         });
     }
 }
예제 #18
0
        }                                                                 // 'CWDP'

        public override ImageMetaData ReadMetaData(Stream stream)
        {
            using (var input = new ArcView.Reader(stream))
            {
                input.ReadInt32();
                uint width  = Binary.BigEndian(input.ReadUInt32());
                uint height = Binary.BigEndian(input.ReadUInt32());
                if (0 == width || 0 == height)
                {
                    return(null);
                }
                int bpp        = input.ReadByte();
                int color_type = input.ReadByte();
                switch (color_type)
                {
                case 2: bpp *= 3; break;

                case 4: bpp *= 2; break;

                case 6: bpp *= 4; break;

                case 3:
                case 0: break;

                default: return(null);
                }
                return(new ImageMetaData
                {
                    Width = width,
                    Height = height,
                    BPP = bpp,
                });
            }
        }
예제 #19
0
 public override ImageMetaData ReadMetaData(Stream stream)
 {
     using (var input = new ArcView.Reader(stream))
     {
         uint size = input.ReadUInt32();
         if (size != stream.Length)
         {
             return(null);
         }
         uint width      = input.ReadUInt32();
         uint height     = input.ReadUInt32();
         int  compressed = input.ReadInt32();
         if (compressed > 1 || 0 == compressed && (width * height + 0x410) != size)
         {
             return(null);
         }
         return(new CmMetaData {
             Width = width,
             Height = height,
             BPP = 8,
             IsCompressed = 1 == compressed,
             DataOffset = 0x10,
             DataLength = size,
         });
     }
 }
예제 #20
0
 public override ImageMetaData ReadMetaData(Stream stream)
 {
     stream.Position = 4;
     using (var file = new ArcView.Reader(stream))
     {
         var info = new ImageMetaData();
         info.OffsetX = file.ReadInt32();
         info.OffsetY = file.ReadInt32();
         info.Width   = file.ReadUInt32();
         info.Height  = file.ReadUInt32();
         info.BPP     = 32;
         if (info.Width > 0x8000 || info.Height > 0x8000)
         {
             return(null);
         }
         return(info);
     }
 }
예제 #21
0
파일: ArcADS.cs 프로젝트: zxc120/GARbro
 List <Entry> ReadIndex(Stream arc, byte[] key, string arc_name)
 {
     arc.Position = 8;
     using (var reader = new ArcView.Reader(arc))
     {
         int count = reader.ReadInt32();
         if (!IsSaneCount(count))
         {
             return(null);
         }
         uint base_offset = reader.ReadUInt32();
         uint index_size  = 4u * (uint)count;
         var  max_offset  = arc.Length;
         if (base_offset >= max_offset || base_offset < (0x10 + index_size))
         {
             return(null);
         }
         var index = new List <uint> (count);
         for (int i = 0; i < count; ++i)
         {
             uint offset = reader.ReadUInt32();
             if (offset != 0xffffffff)
             {
                 if (offset >= max_offset - base_offset)
                 {
                     return(null);
                 }
                 index.Add(base_offset + offset);
             }
         }
         var name_buffer = new byte[0x20];
         var dir         = new List <Entry> (index.Count);
         for (int i = 0; i < index.Count; ++i)
         {
             long offset = index[i];
             reader.BaseStream.Position = offset;
             reader.Read(name_buffer, 0, 0x20);
             string name = Binary.GetCString(name_buffer, 0, 0x20);
             Entry  entry;
             if (0 == name.Length)
             {
                 entry = new Entry {
                     Name = string.Format("{0}#{1:D5}", arc_name, i), Type = "image"
                 }
             }
             ;
             else
             {
                 entry = FormatCatalog.Instance.Create <Entry> (name);
             }
             entry.Offset = offset + 0x24;
             entry.Size   = reader.ReadUInt32();
             dir.Add(entry);
         }
         return(dir);
     }
 }
예제 #22
0
 public override ImageMetaData ReadMetaData(Stream stream)
 {
     using (var input = new ArcView.Reader(stream))
     {
         uint sign        = input.ReadUInt32();
         uint width       = input.ReadUInt32();
         uint height      = input.ReadUInt32();
         int  packed_size = input.ReadInt32();
         int  data_size   = input.ReadInt32();
         return(new GraMetaData
         {
             Width = width,
             Height = height,
             PackedSize = packed_size,
             UnpackedSize = data_size,
             BPP = 0x617267 == sign ? 24 : 8,
         });
     }
 }
예제 #23
0
        }                                                                 // 'GYU'

        public override ImageMetaData ReadMetaData(Stream stream)
        {
            using (var reader = new ArcView.Reader(stream))
            {
                reader.ReadInt32();
                return(new GyuMetaData
                {
                    Flags = reader.ReadUInt16(),
                    CompressionMode = reader.ReadUInt16(),
                    Key = reader.ReadUInt32(),
                    BPP = reader.ReadInt32(),
                    Width = reader.ReadUInt32(),
                    Height = reader.ReadUInt32(),
                    DataSize = reader.ReadInt32(),
                    AlphaSize = reader.ReadInt32(),
                    PaletteSize = reader.ReadInt32(),
                });
            }
        }
예제 #24
0
 public override ImageMetaData ReadMetaData(Stream stream)
 {
     using (var reader = new ArcView.Reader(stream))
     {
         reader.ReadInt32();
         var info = new EmMetaData();
         info.LzssFrameSize = reader.ReadUInt16();
         info.LzssInitPos   = reader.ReadUInt16();
         info.BPP           = reader.ReadUInt16() & 0xFF;
         info.Width         = reader.ReadUInt16();
         info.Height        = reader.ReadUInt16();
         info.Colors        = reader.ReadUInt16();
         info.Stride        = reader.ReadInt32();
         info.OffsetX       = reader.ReadInt32();
         info.OffsetY       = reader.ReadInt32();
         info.DataOffset    = 40;
         return(info);
     }
 }
예제 #25
0
        public override ImageData Read(Stream stream, ImageMetaData info)
        {
            var meta   = (DpngMetaData)info;
            var bitmap = new WriteableBitmap((int)info.Width, (int)info.Height,
                                             ImageData.DefaultDpiX, ImageData.DefaultDpiY, PixelFormats.Pbgra32, null);
            long next_tile = 0x14;

            using (var dpng = new ArcView.Reader(stream))
            {
                for (int i = 0; i < meta.TileCount; ++i)
                {
                    stream.Position = next_tile;
                    int  x      = dpng.ReadInt32();
                    int  y      = dpng.ReadInt32();
                    int  width  = dpng.ReadInt32();
                    int  height = dpng.ReadInt32();
                    uint size   = dpng.ReadUInt32();
                    stream.Seek(8, SeekOrigin.Current);
                    next_tile = stream.Position + size;
                    if (0 == size)
                    {
                        continue;
                    }
                    using (var png = new StreamRegion(stream, stream.Position, size, true))
                    {
                        var decoder = new PngBitmapDecoder(png,
                                                           BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
                        var frame  = new FormatConvertedBitmap(decoder.Frames[0], PixelFormats.Pbgra32, null, 0);
                        int stride = frame.PixelWidth * 4;
                        var pixels = new byte[stride * frame.PixelHeight];
                        frame.CopyPixels(pixels, stride, 0);
                        var rect = new Int32Rect(0, 0, frame.PixelWidth, frame.PixelHeight);
                        bitmap.WritePixels(rect, pixels, stride, x, y);
                    }
                }
            }
            bitmap.Freeze();
            return(new ImageData(bitmap, info));
        }
예제 #26
0
 public PcmInput(Stream file) : base(null)
 {
     file.Position = 4;
     using (var input = new ArcView.Reader(file))
     {
         int src_size = input.ReadInt32();
         if (src_size <= 0)
         {
             throw new InvalidFormatException();
         }
         int mode  = input.ReadInt32();
         int extra = (mode >> 8) & 0xff;
         mode &= 0xff;
         var format = new WaveFormat();
         format.FormatTag             = input.ReadUInt16();
         format.Channels              = input.ReadUInt16();
         format.SamplesPerSecond      = input.ReadUInt32();
         format.AverageBytesPerSecond = input.ReadUInt32();
         format.BlockAlign            = input.ReadUInt16();
         format.BitsPerSample         = input.ReadUInt16();
         this.Format  = format;
         this.PcmSize = src_size;
         if (0 == mode)
         {
             this.Source = new StreamRegion(file, file.Position, src_size);
         }
         else if (1 == mode || 3 == mode)
         {
             var decoder = new PcmDecoder(input, src_size, extra, (XpcmCompression)mode);
             this.Source = new MemoryStream(decoder.Unpack(), 0, src_size);
             file.Dispose();
         }
         else
         {
             throw new NotSupportedException("Not supported Circus PCM audio compression");
         }
     }
 }
예제 #27
0
        }                                                        // 'RIFF'

        public override ImageMetaData ReadMetaData(Stream stream)
        {
            // 'RIFF' isn't included into signature to avoid auto-detection of the WAV files as IPH images.
            if (0x46464952 != FormatCatalog.ReadSignature(stream))  // 'RIFF'
            {
                return(null);
            }
            using (var reader = new ArcView.Reader(stream))
            {
                if (0x38 != reader.ReadInt32())
                {
                    return(null);
                }
                var signature = reader.ReadInt32();
                if (signature != 0x20485049 && signature != 0x00485049) // 'IPH'
                {
                    return(null);
                }
                if (0x20746D66 != reader.ReadInt32()) // 'fmt '
                {
                    return(null);
                }
                reader.BaseStream.Position = 0x38;
                if (0x20706D62 != reader.ReadInt32()) // 'bmp '
                {
                    return(null);
                }
                var info = new IphMetaData();
                info.PackedSize            = reader.ReadInt32();
                info.Width                 = reader.ReadUInt16();
                info.Height                = reader.ReadUInt16();
                reader.BaseStream.Position = 0x50;
                info.BPP          = reader.ReadUInt16();
                info.IsCompressed = 0 != reader.ReadInt16();
                // XXX int16@[0x54] is a transparency color or 0xFFFF if image is not transparent
                return(info);
            }
        }
예제 #28
0
        }                                                                 // 'PB3B'

        public override ImageMetaData ReadMetaData(Stream stream)
        {
            stream.Position = 4;
            using (var reader = new ArcView.Reader(stream))
            {
                int input_size = reader.ReadInt32();
                stream.Position = 0x18;
                int  t2     = reader.ReadInt32();
                int  t1     = reader.ReadUInt16();
                uint width  = reader.ReadUInt16();
                uint height = reader.ReadUInt16();
                int  bpp    = reader.ReadUInt16();
                return(new Pb3MetaData
                {
                    Width = width,
                    Height = height,
                    BPP = bpp,
                    Type = t1,
                    SubType = t2,
                    InputSize = input_size,
                });
            }
        }
예제 #29
0
        }                                                                  // 'AGd'

        public override ImageMetaData ReadMetaData(Stream stream)
        {
            using (var file = new ArcView.Reader(stream))
            {
                file.ReadUInt32();
                var info = new ImageMetaData();
                info.Width  = file.ReadUInt32();
                info.Height = file.ReadUInt32();
                file.BaseStream.Position = 0x38;
                int alpha_size = file.ReadInt32();
                info.BPP = 0 == alpha_size ? 24 : 32;
                return(info);
            }
        }
예제 #30
0
파일: ImagePB3.cs 프로젝트: Casidi/GARbro
 public override ImageMetaData ReadMetaData(Stream stream)
 {
     stream.Position = 4;
     using (var reader = new ArcView.Reader (stream))
     {
         int input_size = reader.ReadInt32();
         stream.Position = 0x18;
         int t2 = reader.ReadInt32();
         int t1 = reader.ReadUInt16();
         uint width = reader.ReadUInt16();
         uint height = reader.ReadUInt16();
         int bpp = reader.ReadUInt16();
         return new Pb3MetaData
         {
             Width       = width,
             Height      = height,
             BPP         = bpp,
             Type        = t1,
             SubType     = t2,
             InputSize   = input_size,
         };
     }
 }
예제 #31
0
        protected override IEnumerator <int> Unpack()
        {
            int unpacked_size;

            using (var reader = new ArcView.Reader(BaseStream))
                unpacked_size = reader.ReadInt32();
            int dst       = 0;
            int prev_byte = BaseStream.ReadByte();

            while (dst + 1 < unpacked_size)
            {
                int b = BaseStream.ReadByte();
                if (-1 == b)
                {
                    break;
                }
                if (b == prev_byte)
                {
                    int count = BaseStream.ReadByte();
                    if (-1 == count)
                    {
                        break;
                    }
                    count += 2;
                    while (count-- > 0)
                    {
                        if (YieldByte((byte)b))
                        {
                            yield return(YieldOffset);
                        }
                        ++dst;
                    }
                    b = BaseStream.ReadByte();
                }
                else
                {
                    if (YieldByte((byte)prev_byte))
                    {
                        yield return(YieldOffset);
                    }
                    ++dst;
                }
                prev_byte = b;
            }
            if (dst < unpacked_size && prev_byte != -1)
            {
                YieldByte((byte)prev_byte);
            }
        }
예제 #32
0
파일: ImageDGC.cs 프로젝트: Casidi/GARbro
 public override ImageMetaData ReadMetaData(Stream stream)
 {
     using (var input = new ArcView.Reader (stream))
     {
         input.ReadInt32();
         var info = new DgcMetaData();
         info.Flags  = input.ReadUInt32();
         info.Width  = input.ReadUInt16();
         info.Height = input.ReadUInt16();
         if (info.Width > 0x7fff || info.Height > 0x7fff)
             return null;
         info.BPP    = 0 == (info.Flags & Reader.FlagAlphaChannel) ? 24 : 32;
         return info;
     }
 }
예제 #33
0
파일: ImageEGN.cs 프로젝트: Casidi/GARbro
 public override ImageMetaData ReadMetaData(Stream stream)
 {
     using (var input = new ArcView.Reader (stream))
     {
         int signature = ~input.ReadInt32();
         int mode = (signature & 0x70) >> 4; // v6
         if (0 != (mode & 4))
             return null;
         int flag = signature & 0xF; // v7
         int data_size, data_offset;
         if (0 != (signature & 0x80))
         {
             data_offset = 4;
             data_size = Binary.BigEndian (signature) & 0xFFFFFF;
         }
         else
         {
             data_offset = 8;
             data_size = Binary.BigEndian (input.ReadInt32());
         }
         if (data_size <= 0 || data_size > 0xFFFFFF) // arbitrary max BMP size
             return null;
         var reader = new Reader (input, 0x36, mode, flag); // size of BMP header
         reader.Unpack();
         using (var bmp = new MemoryStream (reader.Data))
         {
             var info = base.ReadMetaData (bmp);
             if (null == info)
                 return null;
             return new EgnMetaData
             {
                 Width = info.Width,
                 Height = info.Height,
                 BPP = info.BPP,
                 Mode = mode,
                 Flag = flag,
                 DataOffset = data_offset,
                 UnpackedSize = data_size,
             };
         }
     }
 }
예제 #34
0
파일: ImageS25.cs 프로젝트: Casidi/GARbro
 // in current implementation, only the first frame is returned.
 // per-frame access is provided by S25Opener class.
 public override ImageMetaData ReadMetaData(Stream stream)
 {
     using (var input = new ArcView.Reader (stream))
     {
         input.ReadUInt32();
         int count = input.ReadInt32();
         if (count < 0 || count > 0xfffff)
             return null;
         uint first_offset = input.ReadUInt32();
         if (0 == first_offset)
             return null;
         input.BaseStream.Position = first_offset;
         var info = new S25MetaData();
         info.Width = input.ReadUInt32();
         info.Height = input.ReadUInt32();
         info.OffsetX = input.ReadInt32();
         info.OffsetY = input.ReadInt32();
         info.FirstOffset = first_offset+0x14;
         info.Incremental = 0 != (input.ReadUInt32() & 0x80000000u);
         info.BPP = 32;
         return info;
     }
 }
예제 #35
0
파일: ImageAKB.cs 프로젝트: Casidi/GARbro
 public override ImageMetaData ReadMetaData(Stream stream)
 {
     using (var reader = new ArcView.Reader (stream))
     {
         reader.ReadInt32();
         var info = new AkbMetaData();
         info.Width = reader.ReadUInt16();
         info.Height = reader.ReadUInt16();
         int flags = reader.ReadInt32() & 0xFFFF;
         info.BPP = 0 == flags ? 32 : 24;
         info.Background = reader.ReadBytes (4);
         info.OffsetX = reader.ReadInt32();
         info.OffsetY = reader.ReadInt32();
         info.InnerWidth = reader.ReadInt32() - info.OffsetX;
         info.InnerHeight = reader.ReadInt32() - info.OffsetY;
         if (info.InnerWidth > info.Width || info.InnerHeight > info.Height)
             return null;
         return info;
     }
 }
예제 #36
0
파일: ImageYGP.cs 프로젝트: Casidi/GARbro
 public override ImageMetaData ReadMetaData(Stream stream)
 {
     stream.Position = 4;
     using (var reader = new ArcView.Reader (stream))
     {
         int mask_pos = reader.ReadUInt16();         // 04
         byte type = reader.ReadByte();              // 06
         if (type != 1 && type != 2)
             return null;
         var info = new YgpMetaData { Type = type, BPP = 32 };
         info.Flags = reader.ReadByte();             // 07
         int header_size = reader.ReadInt32();       // 08
         stream.Position = header_size;
         info.DataSize = reader.ReadInt32();         // XX+00
         info.Width = reader.ReadUInt16();           // XX+04
         info.Height = reader.ReadUInt16();          // XX+06
         info.DataOffset = header_size+8;
         if (0 != (info.Flags & 4))
         {
             stream.Position = 0x14;
             info.OffsetX = reader.ReadInt16();
             info.OffsetY = reader.ReadInt16();
         }
         return info;
     }
 }
예제 #37
0
파일: ImageMGR.cs 프로젝트: Casidi/GARbro
 public override ImageMetaData ReadMetaData(Stream stream)
 {
     using (var reader = new ArcView.Reader (stream))
     {
         int count = reader.ReadInt16();
         if (count <= 0 || count >= 0x100)
             return null;
         int offset;
         if (count > 1)
         {
             offset = reader.ReadInt32();
             if (offset != 2 + count * 4)
                 return null;
         }
         else
             offset = 2;
         stream.Position = offset;
         int unpacked_size = reader.ReadInt32();
         int packed_size = reader.ReadInt32();
         offset += 8;
         if (offset + packed_size > stream.Length)
             return null;
         byte[] header = new byte[0x36];
         if (0x36 != MgrOpener.Decompress (stream, header)
             || header[0] != 'B' || header[1] != 'M')
             return null;
         using (var bmp = new MemoryStream (header))
         {
             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,
             };
         }
     }
 }
예제 #38
0
파일: ImageBGI.cs 프로젝트: Casidi/GARbro
 public override ImageMetaData ReadMetaData(Stream stream)
 {
     using (var input = new ArcView.Reader (stream))
     {
         int width  = input.ReadInt16();
         int height = input.ReadInt16();
         if (width <= 0 || height <= 0)
             return null;
         int bpp = input.ReadInt32();
         if (24 != bpp && 32 != bpp && 8 != bpp)
             return null;
         if (0 != input.ReadInt64())
             return null;
         return new ImageMetaData
         {
             Width = (uint)width,
             Height = (uint)height,
             BPP = bpp,
         };
     }
 }
예제 #39
0
파일: ArcDX.cs 프로젝트: Casidi/GARbro
        byte[] Unpack(Stream stream)
        {
            using (var input = new ArcView.Reader (stream))
            {
                uint unpacked_size = input.ReadUInt32();
                int remaining = input.ReadInt32() - 9;
                var output = new byte[unpacked_size];
                byte control_code = input.ReadByte();
                int dst = 0;
                while (remaining > 0)
                {
                    byte b = input.ReadByte();
                    --remaining;
                    if (b != control_code)
                    {
                        output[dst++] = b;
                        continue;
                    }
                    b = input.ReadByte();
                    --remaining;
                    if (b == control_code)
                    {
                        output[dst++] = b;
                        continue;
                    }
                    if (b > control_code)
                        --b;
                    int count = b >> 3;
                    if (0 != (b & 4))
                    {
                        count |= input.ReadByte() << 5;
                        --remaining;
                    }
                    count += 4;
                    int offset;
                    switch (b & 3)
                    {
                    case 0:
                        offset = input.ReadByte();
                        --remaining;
                        break;

                    case 1:
                        offset = input.ReadUInt16();
                        remaining -= 2;
                        break;

                    case 2:
                        offset = input.ReadUInt16();
                        offset |= input.ReadByte() << 16;
                        remaining -= 3;
                        break;

                    default:
                        throw new InvalidFormatException ("DX decompression failed");
                    }
                    ++offset;
                    Binary.CopyOverlapped (output, dst - offset, dst, count);
                    dst += count;
                }
                return output;
            }
        }
예제 #40
0
파일: ImageAO.cs 프로젝트: Casidi/GARbro
 public override ImageMetaData ReadMetaData(Stream stream)
 {
     int A = stream.ReadByte();
     int O = stream.ReadByte();
     if ('A' != A || 'O' != O)
         return null;
     using (var file = new ArcView.Reader (stream))
     {
         var info = new ImageMetaData();
         info.Width = file.ReadUInt32();
         info.Height = file.ReadUInt32();
         info.BPP = file.ReadInt16();
         info.OffsetX = file.ReadInt32();
         info.OffsetY = file.ReadInt32();
         if (info.Width > 0x8000 || info.Height > 0x8000 || !(32 == info.BPP || 24 == info.BPP))
             return null;
         return info;
     }
 }
예제 #41
0
파일: ImageDRG.cs 프로젝트: Casidi/GARbro
 public override ImageMetaData ReadMetaData(Stream stream)
 {
     using (var input = new ArcView.Reader (stream))
     {
         input.ReadUInt32();
         var info = new GgdMetaData { BPP = 8 };
         info.HeaderSize = input.ReadUInt32();
         info.Width = input.ReadUInt32();
         int height = input.ReadInt32();
         if (height < 0)
         {
             height = -height;
             info.Flipped = true;
         }
         info.Height = (uint)height;
         input.ReadInt64();
         info.BitmapSize = input.ReadUInt32();
         return info;
     }
 }
예제 #42
0
파일: ImageBGI.cs 프로젝트: Casidi/GARbro
        void UnpackV2(ParallelCbgDecoder decoder)
        {
            var base_offset = Input.Position;
            decoder.Tree1 = new HuffmanTree (ReadWeightTable (Input, 0x10), true);
            decoder.Tree2 = new HuffmanTree (ReadWeightTable (Input, 0xB0), true);

            int y_blocks = decoder.Height / 8;
            var offsets = new int[y_blocks+1];
            int input_base = (int)(Input.Position + offsets.Length*4 - base_offset);
            using (var reader = new ArcView.Reader (Input))
            {
                for (int i = 0; i < offsets.Length; ++i)
                    offsets[i] = reader.ReadInt32() - input_base;
                decoder.Input = reader.ReadBytes ((int)(Input.Length - Input.Position));
            }
            int pad_skip = ((decoder.Width >> 3) + 7) >> 3;
            var tasks = new List<Task> (y_blocks+1);
            decoder.Output = new byte[decoder.Width * decoder.Height * 4];
            int dst = 0;
            for (int i = 0; i < y_blocks; ++i)
            {
                int block_offset = offsets[i] + pad_skip;
                int next_offset = i+1 == y_blocks ? decoder.Input.Length : offsets[i+1];
                int closure_dst = dst;
                var task = Task.Run (() => decoder.UnpackBlock (block_offset, next_offset-block_offset, closure_dst));
                tasks.Add (task);
                dst += decoder.Width * 32;
            }
            if (32 == m_info.BPP)
            {
                var task = Task.Run (() => decoder.UnpackAlpha (offsets[y_blocks]));
                tasks.Add (task);
            }
            var complete = Task.WhenAll (tasks);
            complete.Wait();
            Format = decoder.HasAlpha ? PixelFormats.Bgra32 : PixelFormats.Bgr32;
            Stride = decoder.Width * 4;
            m_output = decoder.Output;
        }
예제 #43
0
파일: ImageNGP.cs 프로젝트: Casidi/GARbro
 public override ImageMetaData ReadMetaData(Stream stream)
 {
     stream.Position = 0x12;
     using (var reader = new ArcView.Reader (stream))
     {
         int packed_size = reader.ReadInt32();
         uint width      = reader.ReadUInt32();
         uint height     = reader.ReadUInt32();
         int bpp         = reader.ReadUInt16() * 8;
         reader.BaseStream.Position = 0x100;
         int unpacked_size = reader.ReadInt32();
         if (packed_size <= 0 || unpacked_size <= 0)
             return null;
         return new NgpMetaData
         {
             Width = width,
             Height = height,
             BPP = bpp,
             PackedSize = packed_size,
             UnpackedSize = unpacked_size,
         };
     }
 }
예제 #44
0
파일: ImageHIZ.cs 프로젝트: Casidi/GARbro
 public override ImageMetaData ReadMetaData(Stream stream)
 {
     using (var input = new ArcView.Reader (stream)) // sub_4BF900
     {
         input.ReadInt32();
         int n = input.ReadInt32();
         if (100 != n)
             return null;
         uint right = input.ReadUInt32() ^ 0xAA5A5A5A;
         uint bottom = input.ReadUInt32() ^ 0xAC9326AF;
         int unknown1 = input.ReadInt32(); // @0x10
         if (unknown1 == 0x375A8436)
             return null;
         uint unpacked_size = input.ReadUInt32() ^ 0x19739D6A; // @0x14
         if (unpacked_size != right*bottom*4)
             return null;
         return new HizMetaData
         {
             Width = right,
             Height = bottom,
             BPP = 32,
             IsPacked = true,
             DataOffset = 0x4c,
             UnpackedSize = unpacked_size,
         };
     }
 }
예제 #45
0
파일: ArcLINK.cs 프로젝트: Casidi/GARbro
 public BmrDecoder(Stream input)
 {
     input.Position = 3;
     using (var header = new ArcView.Reader (input))
     {
         m_step = header.ReadByte();
         m_final_size = header.ReadInt32();
         m_key = header.ReadInt32();
         int unpacked_size = header.ReadInt32();
         m_output = new byte[unpacked_size];
         m_input = new MsbBitStream (input, true);
     }
 }
예제 #46
0
파일: ImageEPA.cs 프로젝트: Casidi/GARbro
 public override ImageMetaData ReadMetaData(Stream stream)
 {
     using (var header = new ArcView.Reader (stream))
     {
         var info = new EpaMetaData();
         info.Mode = header.ReadInt32() >> 24;
         info.ColorType = header.ReadInt32() & 0xff;
         switch (info.ColorType)
         {
         case 0: info.BPP = 8; break;
         case 1: info.BPP = 24; break;
         case 2: info.BPP = 32; break;
         case 3: info.BPP = 15; break;
         case 4: info.BPP = 8; break;
         default: return null;
         }
         info.Width = header.ReadUInt32();
         info.Height = header.ReadUInt32();
         if (2 == info.Mode)
         {
             info.OffsetX = header.ReadInt32();
             info.OffsetY = header.ReadInt32();
         }
         return info;
     }
 }
예제 #47
0
파일: ImageGS.cs 프로젝트: Casidi/GARbro
 public override ImageMetaData ReadMetaData(Stream stream)
 {
     using (var input = new ArcView.Reader (stream))
     {
         var info = new PicMetaData();
         input.ReadUInt32();
         info.PackedSize = input.ReadUInt32();
         info.UnpackedSize = input.ReadUInt32();
         info.HeaderSize = input.ReadUInt32();
         if (info.HeaderSize >= stream.Length || info.PackedSize + info.HeaderSize > stream.Length)
             return null;
         input.ReadUInt32();
         info.Width = input.ReadUInt32();
         info.Height = input.ReadUInt32();
         info.BPP = input.ReadInt32();
         if (info.HeaderSize >= 0x2C)
         {
             input.ReadInt32();
             info.OffsetX = input.ReadInt32();
             info.OffsetY = input.ReadInt32();
         }
         return info;
     }
 }
예제 #48
0
파일: ImageMAI.cs 프로젝트: Casidi/GARbro
 public override ImageMetaData ReadMetaData(Stream stream)
 {
     using (var input = new ArcView.Reader (stream))
     {
         uint size = input.ReadUInt32();
         if (size != stream.Length)
             return null;
         uint width = input.ReadUInt32();
         uint height = input.ReadUInt32();
         int compressed = input.ReadInt32();
         if (compressed > 1 || 0 == compressed && (width*height + 0x410) != size)
             return null;
         return new CmMetaData {
             Width = width,
             Height = height,
             BPP = 8,
             IsCompressed = 1 == compressed,
             DataOffset = 0x10,
             DataLength = size,
         };
     }
 }