Пример #1
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);
            }
        }
Пример #2
0
        public override ImageMetaData ReadMetaData(Stream stream)
        {
            stream.Seek(5, SeekOrigin.Current);
            int bpp = stream.ReadByte();

            if (24 != bpp && 32 != bpp)
            {
                throw new NotSupportedException("Not supported CPB image format");
            }
            using (var input = new ArcView.Reader(stream))
            {
                int version = input.ReadInt16();
                if (1 != version)
                {
                    throw new NotSupportedException("Not supported CPB image version");
                }
                var info = new CpbMetaData();
                info.BPP = bpp;
                input.ReadUInt32();
                info.Width      = input.ReadUInt16();
                info.Height     = input.ReadUInt16();
                info.Channel[0] = input.ReadUInt32(); // Alpha
                info.Channel[1] = input.ReadUInt32();
                info.Channel[2] = input.ReadUInt32();
                info.Channel[3] = input.ReadUInt32();
                return(info);
            }
        }
Пример #3
0
 public override ImageMetaData ReadMetaData(Stream stream)
 {
     stream.Seek(3, SeekOrigin.Current);
     using (var input = new ArcView.Reader(stream))
     {
         int bpp         = input.ReadByte();
         int x           = 0;
         int y           = 0;
         int type        = bpp;
         int header_size = 8;
         if (2 == type)
         {
             bpp         = input.ReadByte();
             header_size = 13;
         }
         else if (1 == type)
         {
             bpp         = input.ReadByte();
             x           = input.ReadInt16();
             y           = input.ReadInt16();
             header_size = 13;
         }
         else
         {
             type = 0;
         }
         if (8 != bpp && 24 != bpp && 32 != bpp)
         {
             return(null);
         }
         uint w = input.ReadUInt16();
         uint h = input.ReadUInt16();
         if (2 == type)
         {
             x = input.ReadInt16();
             y = input.ReadInt16();
         }
         return(new ElgMetaData
         {
             Width = w,
             Height = h,
             OffsetX = x,
             OffsetY = y,
             BPP = bpp,
             Type = type,
             HeaderSize = header_size,
         });
     }
 }
Пример #4
0
 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;
     }
 }
Пример #5
0
        static WaveFormat ReadFormat(Stream file)
        {
            var format = new WaveFormat();

            using (var input = new ArcView.Reader(file))
            {
                format.FormatTag             = input.ReadUInt16();
                format.Channels              = input.ReadUInt16();
                format.SamplesPerSecond      = input.ReadUInt32();
                format.AverageBytesPerSecond = input.ReadUInt32();
                format.BlockAlign            = input.ReadUInt16();
                format.BitsPerSample         = input.ReadUInt16();
            }
            return(format);
        }
Пример #6
0
 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;
     }
 }
Пример #7
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,
                });
            }
        }
Пример #8
0
        }                                                                 // 'DGC'

        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);
            }
        }
Пример #9
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(),
                });
            }
        }
Пример #10
0
 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;
     }
 }
Пример #11
0
        public override ImageMetaData ReadMetaData(Stream stream)
        {
            stream.Position = 4;
            int  bpp         = stream.ReadByte();
            bool has_palette = stream.ReadByte() != 0;

            using (var input = new ArcView.Reader(stream))
            {
                var info = new Typ1MetaData {
                    BPP = bpp, HasPalette = has_palette
                };
                info.Width  = input.ReadUInt16();
                info.Height = input.ReadUInt16();
                input.ReadInt32();
                info.Channel[0] = input.ReadUInt32();
                info.Channel[1] = input.ReadUInt32();
                info.Channel[2] = input.ReadUInt32();
                info.Channel[3] = input.ReadUInt32();
                return(info);
            }
        }
Пример #12
0
        }                                                                 // 'AKB '

        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);
            }
        }
Пример #13
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);
            }
        }
Пример #14
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");
         }
     }
 }
Пример #15
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,
                });
            }
        }
Пример #16
0
 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,
         };
     }
 }
Пример #17
0
        public override ImageMetaData ReadMetaData(Stream stream)
        {
            int alpha_channel = stream.ReadByte();
            int method        = stream.ReadByte();
            int align1        = stream.ReadByte();
            int align2        = stream.ReadByte();
            int bpp           = stream.ReadByte();

            if (alpha_channel < 0 || alpha_channel > 1 || method < 0 || method > 2 ||
                align1 < 0 || align1 > 4 || align2 < 0 || align2 > 4 ||
                bpp <= 0 || !(bpp <= 16 || 24 == bpp || 32 == bpp))
            {
                return(null);
            }
            using (var reader = new ArcView.Reader(stream))
            {
                int  palette_size = reader.ReadInt32();
                uint width        = reader.ReadUInt16();
                uint height       = reader.ReadUInt16();
                if (0 == palette_size || 0 == width || 0 == height || palette_size >= stream.Length)
                {
                    return(null);
                }
                return(new GpMetaData
                {
                    Width = width,
                    Height = height,
                    BPP = bpp,
                    HasAlpha = alpha_channel != 0,
                    Method = method,
                    ElementSize = align1,
                    PixelsPerElement = align2,
                    PaletteSize = palette_size,
                });
            }
        }
Пример #18
0
        public override Stream OpenEntry(ArcFile arc, Entry entry)
        {
            var    pent  = entry as PackedEntry;
            Stream input = arc.File.CreateStream(entry.Offset, entry.Size);

            if (null != pent && pent.IsPacked)
            {
                Stream unpacked;
                using (input)
                {
                    var data = new byte[pent.UnpackedSize];
                    UnpackEntry(input, data);
                    unpacked = new MemoryStream(data);
                }
                input = unpacked;
            }
            if (input.Length > 4 && input.Length < 0x10000)
            {
                using (var reader = new ArcView.Reader(input))
                {
                    int unpacked_size = reader.ReadUInt16();
                    int packed_size   = reader.ReadUInt16();
                    if (packed_size == input.Length - 4)
                    {
                        using (input)
                        {
                            var data = new byte[unpacked_size];
                            UnpackLz77(input, data);
                            return(new MemoryStream(data));
                        }
                    }
                    input.Position = 0;
                }
            }
            return(input);
        }
Пример #19
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);
     }
 }
Пример #20
0
        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);
            }
        }
Пример #21
0
 public override ImageMetaData ReadMetaData(Stream stream)
 {
     stream.Seek (4, SeekOrigin.Current);
     int type = stream.ReadByte();
     int bpp = stream.ReadByte();
     if (24 != bpp && 32 != bpp)
         throw new NotSupportedException ("Not supported CPB image format");
     using (var input = new ArcView.Reader (stream))
     {
         int version = input.ReadInt16 ();
         if (1 != version && 0 != version)
             throw new NotSupportedException ("Not supported CPB image version");
         var info = new CpbMetaData {
             Type = type,
             Version = version,
             BPP = bpp,
         };
         if (1 == version)
         {
             input.ReadUInt32();
             info.Width  = input.ReadUInt16();
             info.Height = input.ReadUInt16();
             info.Channel[0] = input.ReadUInt32();
             info.Channel[1] = input.ReadUInt32();
             info.Channel[2] = input.ReadUInt32();
             info.Channel[3] = input.ReadUInt32();
         }
         else
         {
             info.Width  = input.ReadUInt16();
             info.Height = input.ReadUInt16();
             input.ReadUInt32();
             info.Channel[0] = input.ReadUInt32();
             info.Channel[1] = input.ReadUInt32();
             info.Channel[2] = input.ReadUInt32();
             info.Channel[3] = input.ReadUInt32();
         }
         info.DataOffset = (uint)stream.Position;
         return info;
     }
 }
Пример #22
0
 public override ImageMetaData ReadMetaData(Stream stream)
 {
     stream.Seek (3, SeekOrigin.Current);
     using (var input = new ArcView.Reader (stream))
     {
         int bpp = input.ReadByte();
         int x = 0;
         int y = 0;
         int type = bpp;
         int header_size = 8;
         if (2 == type)
         {
             bpp = input.ReadByte();
             header_size = 13;
         }
         else if (1 == type)
         {
             bpp = input.ReadByte();
             x = input.ReadInt16();
             y = input.ReadInt16();
             header_size = 13;
         }
         else
             type = 0;
         if (8 != bpp && 24 != bpp && 32 != bpp)
             return null;
         uint w = input.ReadUInt16();
         uint h = input.ReadUInt16();
         if (2 == type)
         {
             x = input.ReadInt16();
             y = input.ReadInt16();
         }
         return new ElgMetaData
         {
             Width = w,
             Height = h,
             OffsetX = x,
             OffsetY = y,
             BPP = bpp,
             Type = type,
             HeaderSize = header_size,
         };
     }
 }
Пример #23
0
            private void UnpackV1()
            {
                using (var src = new ArcView.Reader(m_input))
                {
                    byte[] window  = new byte[0x10000];
                    int    flag    = 0;
                    int    win_pos = 0;
                    int    dst     = 0;
                    while (dst < m_output.Length)
                    {
                        flag >>= 1;
                        if (0 == (flag & 0x100))
                        {
                            flag = src.ReadByte() | 0xff00;
                        }

                        if (0 != (flag & 1))
                        {
                            byte dat = src.ReadByte();
                            window[win_pos++] = dat;
                            win_pos          &= 0xffff;
                            m_output[dst++]   = dat;
                        }
                        else
                        {
                            byte control = src.ReadByte();
                            int  count, offset;

                            if (control >= 0xc0)
                            {
                                offset = ((control & 3) << 8) | src.ReadByte();
                                count  = 4 + ((control >> 2) & 0xf);
                            }
                            else if (0 != (control & 0x80))
                            {
                                offset = control & 0x1f;
                                count  = 2 + ((control >> 5) & 3);
                                if (0 == offset)
                                {
                                    offset = src.ReadByte();
                                }
                            }
                            else if (0x7f == control)
                            {
                                count  = 2 + src.ReadUInt16();
                                offset = src.ReadUInt16();
                            }
                            else
                            {
                                offset = src.ReadUInt16();
                                count  = control + 4;
                            }
                            offset = win_pos - offset;
                            for (int k = 0; k < count && dst < m_output.Length; k++)
                            {
                                offset &= 0xffff;
                                byte dat = window[offset++];
                                window[win_pos++] = dat;
                                win_pos          &= 0xffff;
                                m_output[dst++]   = dat;
                            }
                        }
                    }
                }
            }
Пример #24
0
        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;
            }
        }
Пример #25
0
        protected override IEnumerator <int> Unpack()
        {
            int unpacked_size, frame_size;

            using (var reader = new ArcView.Reader(BaseStream))
            {
                unpacked_size = reader.ReadInt32();
                frame_size    = 2 << reader.ReadUInt16();
            }
            var frame     = new byte[frame_size];
            int frame_pos = 0;
            int dst       = 0;
            int bits      = 2;

            while (dst < unpacked_size)
            {
                bits >>= 1;
                if (1 == bits)
                {
                    bits = BaseStream.ReadByte();
                    if (-1 == bits)
                    {
                        yield break;
                    }
                    bits |= 0x100;
                }
                int c = BaseStream.ReadByte();
                if (-1 == c)
                {
                    yield break;
                }
                if (0 != (bits & 1))
                {
                    if (YieldByte((byte)c))
                    {
                        yield return(YieldOffset);
                    }
                    frame[frame_pos++ % frame_size] = (byte)c;
                    ++dst;
                }
                else
                {
                    int p     = c | BaseStream.ReadByte() << 8;
                    int count = BaseStream.ReadByte();
                    if (-1 == count)
                    {
                        yield break;
                    }
                    count += 4;
                    p      = frame_pos - p;
                    if (p < 0)
                    {
                        p += frame_size;
                    }

                    while (count-- > 0)
                    {
                        byte b = frame[p++ % frame_size];
                        if (YieldByte(b))
                        {
                            yield return(YieldOffset);
                        }
                        frame[frame_pos++ % frame_size] = b;
                        ++dst;
                    }
                }
            }
        }
Пример #26
0
 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,
         };
     }
 }
Пример #27
0
 public override Stream OpenEntry(ArcFile arc, Entry entry)
 {
     var pent = entry as PackedEntry;
     Stream input = arc.File.CreateStream (entry.Offset, entry.Size);
     if (null != pent && pent.IsPacked)
     {
         Stream unpacked;
         using (input)
         {
             var data = new byte[pent.UnpackedSize];
             UnpackEntry (input, data);
             unpacked = new MemoryStream (data);
         }
         input = unpacked;
     }
     if (input.Length > 4 && input.Length < 0x10000)
     {
         using (var reader = new ArcView.Reader (input))
         {
             int unpacked_size = reader.ReadUInt16();
             int packed_size = reader.ReadUInt16();
             if (packed_size == input.Length-4)
             {
                 using (input)
                 {
                     var data = new byte[unpacked_size];
                     UnpackLz77 (input, data);
                     return new MemoryStream (data);
                 }
             }
             input.Position = 0;
         }
     }
     return input;
 }