Example #1
0
 public override ImageData Read(Stream stream, ImageMetaData info)
 {
     var header = PngHeader.Clone() as byte[];
     using (var data = new StreamRegion (stream, 8, stream.Length - 8, true))
     using (var png = new PrefixStream (header, data))
         return base.Read (png, info);
 }
Example #2
0
 BitmapSource ReadBitmapSource(IBinaryStream file, GdtMetaData info)
 {
     using (var bmp = new StreamRegion(file.AsStream, info.BitmapOffset, true))
     {
         var decoder = new BmpBitmapDecoder(bmp,
                                            BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
         return(decoder.Frames[0]);
     }
 }
Example #3
0
        public override ImageData Read(IBinaryStream stream, ImageMetaData info)
        {
            var meta = (GaxMetaData)info;

            using (var enc = new StreamRegion(stream.AsStream, 0x14, true))
                using (var crypto = new InputCryptoStream(enc, new GaxTransform(meta.Key)))
                    using (var input = new BinaryStream(crypto, stream.Name))
                        return(Png.Read(input, info));
        }
Example #4
0
        public override ImageData Read(IBinaryStream stream, ImageMetaData info)
        {
            var header = PngHeader.Clone() as byte[];

            using (var data = new StreamRegion(stream.AsStream, 8, true))
                using (var pre = new PrefixStream(header, data))
                    using (var png = new BinaryStream(pre, stream.Name))
                        return(base.Read(png, info));
        }
Example #5
0
        public override ImageData Read(IBinaryStream file, ImageMetaData info)
        {
            var meta = (GgpMetaData)info;

            using (var input = new StreamRegion(file.AsStream, meta.Offset, meta.Length, true))
                using (var enc = new EncryptedStream(input, meta.Key))
                    using (var png = new BinaryStream(enc, file.Name))
                        return(base.Read(png, info));
        }
Example #6
0
 /// <summary>
 /// Peeks the value at given offset in the stream without changing stream position.
 /// </summary>
 /// <typeparam name="T">The type of the value which is peeked from the stream.</typeparam>
 /// <param name="offset">The offset which the channel peeks value from.</param>
 /// <returns>The value peeked from the channel.</returns>
 public T Peek <T>(int offset)
 {
     lock (readerLock)
     {
         StreamRegion region = new StreamRegion(this, offset);
         object       x      = readerMarshaler.UnmarshalFrom(new MarshalingDescriptor(typeof(T)), region);
         return((T)x);
     }
 }
Example #7
0
        public override ImageData Read(IBinaryStream stream, ImageMetaData info)
        {
            var meta = (KgpMetaData)info;

            using (var input = new StreamRegion(stream.AsStream, meta.DataOffset, true))
                using (var crypto = new XoredStream(input, meta.Key))
                    using (var png = new BinaryStream(crypto, stream.Name))
                        return(Png.Read(png, info));
        }
Example #8
0
        void ReadAlpha()
        {
            int    alpha_stride = (m_width + 3) & ~3;
            Stream alpha_stream;

            if (m_info.AlphaSize == alpha_stride * m_height)
            {
                alpha_stream = new StreamRegion(m_input, m_input.Position, true);
            }
            else
            {
                alpha_stream = new LzssStream(m_input, LzssMode.Decompress, true);
            }
            using (alpha_stream)
            {
                int  src_stride   = Stride;
                int  new_stride   = m_width * 4;
                bool extend_alpha = 3 != m_info.Flags;
                var  alpha_line   = new byte[alpha_stride];
                var  pixels       = new byte[new_stride * m_height];
                for (int y = 0; y < m_height; ++y)
                {
                    int src = y * src_stride;
                    int dst = y * new_stride;
                    if (alpha_line.Length != alpha_stream.Read(alpha_line, 0, alpha_line.Length))
                    {
                        throw new EndOfStreamException();
                    }
                    for (int x = 0; x < m_width; ++x)
                    {
                        if (8 == m_info.BPP)
                        {
                            var color = Palette.Colors[m_output[src++]];
                            pixels[dst++] = color.B;
                            pixels[dst++] = color.G;
                            pixels[dst++] = color.R;
                        }
                        else
                        {
                            pixels[dst++] = m_output[src++];
                            pixels[dst++] = m_output[src++];
                            pixels[dst++] = m_output[src++];
                        }
                        int alpha = alpha_line[x];
                        if (extend_alpha)
                        {
                            alpha = alpha >= 0x10 ? 0xFF : alpha * 0x10;
                        }
                        pixels[dst++] = (byte)alpha;
                    }
                }
                Stride   = new_stride;
                Palette  = null;
                m_output = pixels;
            }
        }
Example #9
0
        IBinaryStream DeobfuscateStream(IBinaryStream file)
        {
            var header = file.ReadHeader(4).ToArray();

            header[0] = 0x89;
            var body = new StreamRegion(file.AsStream, 4, true);
            var png  = new PrefixStream(header, body);

            return(new BinaryStream(png, file.Name));
        }
Example #10
0
        IBinaryStream OpenAsBitmap(IBinaryStream input)
        {
            var header = new byte[2] {
                (byte)'B', (byte)'M'
            };
            Stream stream = new StreamRegion(input.AsStream, 2, true);

            stream = new PrefixStream(header, stream);
            return(new BinaryStream(stream, input.Name));
        }
Example #11
0
 /// <summary>
 /// Reads a value of the given type T from the stream which uses the underlying marshaler to unmarshal it.
 /// </summary>
 /// <typeparam name="T">The type of the value to be read.</typeparam>
 /// <returns>The value read from the channel.</returns>
 public virtual T Read <T>()
 {
     lock (readerLock)
     {
         StreamRegion region = new StreamRegion(this, 0);
         object       value  = readerMarshaler.UnmarshalFrom(new MarshalingDescriptor(typeof(T)), region);
         AdvanceReadBuffer(region.Offset);
         return((T)value);
     }
 }
Example #12
0
 public override SoundInput TryOpen(Stream file)
 {
     var header = new byte[0x30];
     if (header.Length != file.Read (header, 0, header.Length))
         return null;
     if (!Binary.AsciiEqual (header, 0, "AoiOgg") || !Binary.AsciiEqual (header, 0x2C, "OggS"))
         return null;
     var ogg = new StreamRegion (file, 0x2C);
     return new OggInput (ogg);
 }
Example #13
0
        public override ImageData Read(IBinaryStream file, ImageMetaData info)
        {
            var meta = (MgxMetaData)info;

            using (var input = new StreamRegion(file.AsStream, meta.GrxOffset, true))
            {
                var reader = new Reader(input, meta);
                reader.Unpack();
                return(ImageData.Create(info, reader.Format, null, reader.Data, reader.Stride));
            }
        }
Example #14
0
        public override ImageData Read(IBinaryStream stream, ImageMetaData info)
        {
            var meta = (SgxMetaData)info;

            using (var grx = new StreamRegion(stream.AsStream, meta.GrxOffset, true))
            {
                var reader = new Reader(grx, (GrxMetaData)meta.GrxInfo);
                reader.Unpack();
                return(ImageData.Create(info, reader.Format, null, reader.Data, reader.Stride));
            }
        }
Example #15
0
        }                                                                 // 'AoiO'

        public override SoundInput TryOpen(IBinaryStream file)
        {
            var header = file.ReadHeader(0x30);

            if (!header.AsciiEqual(0, "AoiOgg") || !header.AsciiEqual(0x2C, "OggS"))
            {
                return(null);
            }
            var ogg = new StreamRegion(file.AsStream, 0x2C);

            return(new OggInput(ogg));
        }
Example #16
0
        public override ImageData Read(Stream file, ImageMetaData info)
        {
            var meta = info as GgpMetaData;

            if (null == meta)
            {
                throw new ArgumentException("GgpFormat.Read should be supplied with GgpMetaData", "info");
            }
            using (var input = new StreamRegion(file, meta.Offset, meta.Length, true))
                using (var png = new EncryptedStream(input, meta.Key, true))
                    return(base.Read(png, info));
        }
Example #17
0
        IBinaryStream OpenAsBitmap(IBinaryStream input)
        {
            var header = new byte[HeaderSize];

            header[0] = (byte)'B';
            header[1] = (byte)'M';
            LittleEndian.Pack((uint)input.Length, header, 2);
            Stream stream = new StreamRegion(input.AsStream, HeaderSize, true);

            stream = new PrefixStream(header, stream);
            return(new BinaryStream(stream, input.Name));
        }
Example #18
0
        public override ImageData Read(IBinaryStream stream, ImageMetaData info)
        {
            var meta = (BipMetaData)info;

            var header = new byte[0x7c];
            var bitmap = new WriteableBitmap((int)meta.Width, (int)meta.Height,
                                             ImageData.DefaultDpiX, ImageData.DefaultDpiY, PixelFormats.Bgra32, null);

            foreach (var tile in meta.Tiles)
            {
                stream.Position = tile.Offset;
                if (header.Length != stream.Read(header, 0, header.Length))
                {
                    throw new InvalidFormatException("Invalid tile header");
                }
                if (!Binary.AsciiEqual(header, "PNGFILE2"))
                {
                    throw new InvalidFormatException("Unknown tile format");
                }
                int data_size = LittleEndian.ToInt32(header, 0x18) - header.Length;
                int alpha     = LittleEndian.ToInt32(header, 0x68);
                int x         = LittleEndian.ToInt32(header, 0x6c);
                int y         = LittleEndian.ToInt32(header, 0x70);
                using (var png = new StreamRegion(stream.AsStream, stream.Position, data_size, true))
                {
                    var decoder = new PngBitmapDecoder(png,
                                                       BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
                    BitmapSource frame     = decoder.Frames[0];
                    PixelFormat  format    = 0 == alpha ? PixelFormats.Bgr32 : PixelFormats.Bgra32;
                    var          converted = new FormatConvertedBitmap(frame, format, null, 0);
                    int          stride    = converted.PixelWidth * 4;
                    var          pixels    = new byte[stride * converted.PixelHeight];
                    converted.CopyPixels(pixels, stride, 0);
                    for (int p = 0; p < pixels.Length; p += 4)
                    {
                        byte r = pixels[p];
                        pixels[p]     = pixels[p + 2];
                        pixels[p + 2] = r;
                        int a = 0 == alpha ? 0xff : pixels[p + 3] * 0xff / 0x80;
                        if (a > 0xff)
                        {
                            a = 0xff;
                        }
                        pixels[p + 3] = (byte)a;
                    }
                    var rect = new Int32Rect(tile.Left + x, tile.Top + y, converted.PixelWidth, converted.PixelHeight);
                    bitmap.WritePixels(rect, pixels, stride, 0);
                }
            }
            bitmap.Freeze();
            return(new ImageData(bitmap, meta));
        }
Example #19
0
        public override ImageMetaData ReadMetaData(Stream stream)
        {
            var header = new byte[8];
            if (8 != stream.Read (header, 0, 8))
                return null;
            if (!Binary.AsciiEqual (header, "MalieGF"))
                return null;
            Buffer.BlockCopy (PngHeader, 0, header, 0, 8);

            using (var data = new StreamRegion (stream, 8, stream.Length - 8, true))
            using (var png = new PrefixStream (header, data))
                return base.ReadMetaData (png);
        }
Example #20
0
        public override SoundInput TryOpen(IBinaryStream file)
        {
            var header = file.ReadHeader(0x10);  // header contains music loop timing

            if (!header.AsciiEqual(0xC, "OggS"))
            {
                return(null);
            }
            var input = new StreamRegion(file.AsStream, 12);

            return(new OggInput(input));
            // input is [intentionally] left undisposed in case of exception.
        }
Example #21
0
        internal IBinaryStream DeobfuscateStream(IBinaryStream file)
        {
            var header = file.ReadHeader(0x20).ToArray();

            for (int i = 0; i < 0x20; ++i)
            {
                header[i] ^= 0xFF;
            }
            Stream stream = new StreamRegion(file.AsStream, 0x20, true);

            stream = new PrefixStream(header, stream);
            return(new BinaryStream(stream, file.Name));
        }
Example #22
0
 /// <summary>
 /// Writes a value of given type T to the stream which uses the underlying marshaler to marshal it.
 /// </summary>
 /// <typeparam name="T">The type of the value which is written to the stream.</typeparam>
 /// <param name="value">The value which is written to the stream.</param>
 public virtual void Write <T>(T value)
 {
     lock (writerLock)
     {
         StreamRegion region = new StreamRegion(this, writeBufferFill);
         writerMarshaler.MarshalInto(new MarshalingDescriptor(typeof(T)), region, value);
         writeBufferFill += region.Offset;
         if (writeGrouping == 0)
         {
             FlushWriteBuffer();
         }
     }
 }
Example #23
0
        public override SoundInput TryOpen(IBinaryStream file)
        {
            var header = file.ReadHeader(0xF);

            if (!header.AsciiEqual("OGGPAK"))
            {
                return(null);
            }
            uint length = header.ToUInt32(0xB);
            var  input  = new StreamRegion(file.AsStream, 0xF, length);

            return(new OggInput(input));
        }
Example #24
0
        public override ImageMetaData ReadMetaData(IBinaryStream stream)
        {
            var          header = stream.ReadHeader(0x24);
            CrxdMetaData info   = null;

            if (header.AsciiEqual(0x20, "CRXJ"))
            {
                stream.Position = 0x28;
                uint diff_offset = stream.ReadUInt32();
                using (var crx = OpenByOffset(diff_offset))
                {
                    if (null == crx)
                    {
                        return(null);
                    }
                    info = ReadMetaData(crx) as CrxdMetaData;
                    if (info != null)
                    {
                        info.DiffOffset = diff_offset;
                    }
                }
            }
            else if (header.AsciiEqual(0x20, "CRXG"))
            {
                using (var crx_input = new StreamRegion(stream.AsStream, 0x20, true))
                    using (var crx = new BinaryStream(crx_input, stream.Name))
                    {
                        var diff_info = base.ReadMetaData(crx) as CrxMetaData;
                        if (null == diff_info)
                        {
                            return(null);
                        }
                        info = new CrxdMetaData
                        {
                            Width      = diff_info.Width,
                            Height     = diff_info.Height,
                            OffsetX    = diff_info.OffsetX,
                            OffsetY    = diff_info.OffsetY,
                            BPP        = diff_info.BPP,
                            DiffInfo   = diff_info,
                            DiffOffset = 0,
                        };
                    }
            }
            if (info != null)
            {
                info.BaseOffset   = header.ToUInt32(8);
                info.BaseFileName = header.GetCString(0xC, 0x14);
            }
            return(info);
        }
Example #25
0
        public override Stream OpenEntry(ArcFile arc, Entry entry)
        {
            var nsa_arc = arc as NsaEncryptedArchive;

            if (null == nsa_arc)
            {
                var input = arc.File.CreateStream(entry.Offset, entry.Size);
                return(UnpackEntry(input, entry as NsaEntry));
            }
            var encrypted = new EncryptedViewStream(arc.File, nsa_arc.Key);
            var stream    = new StreamRegion(encrypted, entry.Offset, entry.Size);

            return(UnpackEntry(stream, entry as NsaEntry));
        }
Example #26
0
        Stream DeobfuscateStream(Stream stream)
        {
            var png_header = new byte[0x10];

            stream.Read(png_header, 5, 11);
            System.Buffer.BlockCopy(PngHeader, 0, png_header, 0, 8);
            for (int i = 0; i < 8; ++i)
            {
                png_header[i + 8] ^= (byte)"PGAECODE"[i];
            }
            var png_body = new StreamRegion(stream, 11, true);

            return(new PrefixStream(png_header, png_body));
        }
Example #27
0
 /// <summary>
 /// Reads the given number of bytes from the stream.
 /// </summary>
 /// <param name="count">The number of bytes which is read from the stream.</param>
 /// <returns>The byte array which contains the bytes reading from the stream.</returns>
 public byte[] ReadBytes(int count)
 {
     byte[] result = new byte[count];
     lock (readerLock)
     {
         StreamRegion region = new StreamRegion(this, 0);
         for (int i = 0; i < count; i++)
         {
             result[i] = region.ReadByte();
         }
         AdvanceReadBuffer(region.Offset);
         return(result);
     }
 }
Example #28
0
 IBinaryStream OpenLzss(IBinaryStream file, int unpacked_size, bool is_compressed)
 {
     if (is_compressed)
     {
         var output = new byte[unpacked_size];
         file.Position = 0x10;
         Decompress(file, output);
         return(new BinMemoryStream(output, 12, unpacked_size - 12, file.Name));
     }
     else
     {
         var bmp = new StreamRegion(file.AsStream, 0x1C, true);
         return(new BinaryStream(bmp, file.Name));
     }
 }
Example #29
0
 byte[] UnpackLayer(Frame frame, int length, bool is_alpha = false)
 {
     using (var packed = new StreamRegion(m_input.AsStream, m_input.Position, length, true))
     {
         if (0 == m_info.Compression || 2 == m_info.Compression && is_alpha)
         {
             return(ReadZlib(frame, packed, is_alpha));
         }
         if (2 == m_info.Compression)
         {
             return(ReadJpeg(frame, packed));
         }
         return(ReadBlocks(frame, packed, is_alpha));
     }
 }
Example #30
0
        public override ImageMetaData ReadMetaData(IBinaryStream stream)
        {
            var header = stream.ReadHeader(8).ToArray();

            if (!Binary.AsciiEqual(header, "MalieGF"))
            {
                return(null);
            }
            Buffer.BlockCopy(HeaderBytes, 0, header, 0, 8);

            using (var data = new StreamRegion(stream.AsStream, 8, true))
                using (var pre = new PrefixStream(header, data))
                    using (var png = new BinaryStream(pre, stream.Name))
                        return(base.ReadMetaData(png));
        }
Example #31
0
        public override SoundInput TryOpen(IBinaryStream file)
        {
            var header = file.ReadHeader(0x12);

            if (!header.AsciiEqual("\0\0\0\0"))
            {
                return(null);
            }
            int riff_length = header.ToInt32(4);

            if (file.Length != riff_length + 8)
            {
                return(null);
            }
            if (!header.AsciiEqual(8, "\0\0\0\0\0\0\0\0"))
            {
                return(null);
            }
            int header_length = header.ToUInt16(0x10);

            if (header_length < 0x10 || header_length > riff_length)
            {
                return(null);
            }
            header = file.ReadHeader(0x18 + header_length);
            if (!header.AsciiEqual(0x14 + header_length, "data"))
            {
                return(null);
            }
            var header_bytes = new byte[0x10] {
                (byte)'R', (byte)'I', (byte)'F', (byte)'F', header[4], header[5], header[6], header[7],
                (byte)'W', (byte)'A', (byte)'V', (byte)'E', (byte)'f', (byte)'m', (byte)'t', (byte)' '
            };
            Stream riff = new StreamRegion(file.AsStream, 0x10);

            riff = new PrefixStream(header_bytes, riff);
            var wav = new BinaryStream(riff, file.Name);

            try
            {
                return(Wav.TryOpen(wav));
            }
            catch
            {
                wav.Dispose();
                throw;
            }
        }
Example #32
0
        }                                                                 // 'AoiO'

        public override SoundInput TryOpen(Stream file)
        {
            var header = new byte[0x30];

            if (header.Length != file.Read(header, 0, header.Length))
            {
                return(null);
            }
            if (!Binary.AsciiEqual(header, 0, "AoiOgg") || !Binary.AsciiEqual(header, 0x2C, "OggS"))
            {
                return(null);
            }
            var ogg = new StreamRegion(file, 0x2C);

            return(new OggInput(ogg));
        }
Example #33
0
        public override SoundInput TryOpen(IBinaryStream file)
        {
            var header = file.ReadHeader(0x20);
            var format = new WaveFormat {
                FormatTag        = 1,
                Channels         = header.ToUInt16(4),
                SamplesPerSecond = header.ToUInt32(8),
                BitsPerSample    = header.ToUInt16(6),
            };

            format.BlockAlign = (ushort)(format.Channels * format.BitsPerSample / 8);
            format.SetBPS();
            var input = new StreamRegion(file.AsStream, 0x20);

            return(new RawPcmInput(input, format));
        }
Example #34
0
 public override ImageData Read(Stream stream, ImageMetaData info)
 {
     var meta = (EencMetaData)info;
     meta.Info.FileName = info.FileName;
     Stream input = new StreamRegion (stream, 8, true);
     try
     {
         input = new EencStream (input, meta.Key);
         if (meta.Compressed)
             input = new ZLibStream (input, CompressionMode.Decompress);
         return meta.Format.Read (input, meta.Info);
     }
     finally
     {
         input.Dispose();
     }
 }
Example #35
0
 public override ImageMetaData ReadMetaData(Stream stream)
 {
     ImageMetaData info;
     using (var png = new StreamRegion (stream, 0x10, true))
         info = base.ReadMetaData (png);
     if (null == info)
         return null;
     stream.Seek (-14, SeekOrigin.End);
     var cntr = new byte[12];
     stream.Read (cntr, 0, 12);
     if (Binary.AsciiEqual (cntr, "CNTR"))
     {
         info.OffsetX = LittleEndian.ToInt32 (cntr, 4);
         info.OffsetY = LittleEndian.ToInt32 (cntr, 8);
     }
     return info;
 }
Example #36
0
        public override ImageData Read(Stream stream, ImageMetaData info)
        {
            var meta = (NgpMetaData)info;
            using (var input = new StreamRegion (stream, 0x104, meta.PackedSize, true))
            using (var z = new ZLibStream (input, CompressionMode.Decompress))
            {
                var pixels = new byte[meta.UnpackedSize];
                if (pixels.Length != z.Read (pixels, 0, pixels.Length))
                    throw new EndOfStreamException();
                PixelFormat format;
                if (32 == meta.BPP)
                    format = PixelFormats.Bgra32;
                else if (24 == meta.BPP)
                    format = PixelFormats.Bgr24;
                else if (8 == meta.BPP)
                    format = PixelFormats.Gray8;
                else
                    throw new System.NotSupportedException ("Not supported NGP image color depth");

                return ImageData.Create (info, format, null, pixels);
            }
        }
Example #37
0
        public override ImageData Read(Stream stream, ImageMetaData info)
        {
            var meta = info as BipMetaData;
            if (null == meta)
                throw new ArgumentException ("BipFormat.Read should be supplied with BipMetaData", "info");

            var header = new byte[0x7c];
            var bitmap = new WriteableBitmap ((int)meta.Width, (int)meta.Height,
                    ImageData.DefaultDpiX, ImageData.DefaultDpiY, PixelFormats.Bgra32, null);
            foreach (var tile in meta.Tiles)
            {
                stream.Position = tile.Offset;
                if (header.Length != stream.Read (header, 0, header.Length))
                    throw new InvalidFormatException ("Invalid tile header");
                if (!Binary.AsciiEqual (header, "PNGFILE2"))
                    throw new InvalidFormatException ("Unknown tile format");
                int data_size = LittleEndian.ToInt32 (header, 0x18) - header.Length;
                int alpha = LittleEndian.ToInt32 (header, 0x68);
                int x = LittleEndian.ToInt32 (header, 0x6c);
                int y = LittleEndian.ToInt32 (header, 0x70);
                using (var png = new StreamRegion (stream, stream.Position, data_size, true))
                {
                    var decoder = new PngBitmapDecoder (png,
                        BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
                    BitmapSource frame = decoder.Frames[0];
                    PixelFormat format = 0 == alpha ? PixelFormats.Bgr32 : PixelFormats.Bgra32;
                    var converted = new FormatConvertedBitmap (frame, format, null, 0);
                    int stride = converted.PixelWidth * 4;
                    var pixels = new byte[stride * converted.PixelHeight];
                    converted.CopyPixels (pixels, stride, 0);
                    for (int p = 0; p < pixels.Length; p += 4)
                    {
                        byte r = pixels[p];
                        pixels[p] = pixels[p+2];
                        pixels[p+2] = r;
                        int a = 0 == alpha ? 0xff : pixels[p+3] * 0xff / 0x80;
                        if (a > 0xff) a = 0xff;
                        pixels[p+3] = (byte)a;
                    }
                    var rect = new Int32Rect (tile.Left+x, tile.Top+y, converted.PixelWidth, converted.PixelHeight);
                    bitmap.WritePixels (rect, pixels, stride, 0);
                }
            }
            bitmap.Freeze();
            return new ImageData (bitmap, meta);
        }
Example #38
0
 public override ImageMetaData ReadMetaData(Stream stream)
 {
     var header = new byte[0x40];
     if (header.Length != stream.Read (header, 0, header.Length))
         return null;
     if (!Binary.AsciiEqual (header, 4, "00\0\0"))
         return null;
     var ykg = new YkgMetaData {
         DataOffset = LittleEndian.ToUInt32 (header, 0x28),
         DataSize   = LittleEndian.ToUInt32 (header, 0x2C)
     };
     if (0 == ykg.DataOffset)
         ykg.DataOffset = LittleEndian.ToUInt32 (header, 8);
     if (ykg.DataOffset < 0x30)
         return null;
     if (0 == ykg.DataSize)
         ykg.DataSize = (uint)(stream.Length - ykg.DataOffset);
     ImageMetaData info = null;
     using (var img = new StreamRegion (stream, ykg.DataOffset, ykg.DataSize, true))
     {
         if (4 != img.Read (header, 0, 4))
             return null;
         if (Binary.AsciiEqual (header, "BM"))
         {
             img.Position = 0;
             info = ImageFormat.Bmp.ReadMetaData (img);
             ykg.Format = YkgImage.Bmp;
         }
         else if (Binary.AsciiEqual (header, "\x89PNG"))
         {
             img.Position = 0;
             info = Png.ReadMetaData (img);
             ykg.Format = YkgImage.Png;
         }
         else if (Binary.AsciiEqual (header, "\x89GNP"))
         {
             using (var body = new StreamRegion (stream, ykg.DataOffset+4, ykg.DataSize-4, true))
             using (var png = new PrefixStream (PngPrefix, body))
                 info = Png.ReadMetaData (png);
             ykg.Format = YkgImage.Gnp;
         }
     }
     if (null == info)
         return null;
     ykg.Width = info.Width;
     ykg.Height = info.Height;
     ykg.BPP = info.BPP;
     ykg.OffsetX = info.OffsetX;
     ykg.OffsetY = info.OffsetY;
     return ykg;
 }
Example #39
0
        public override ImageData Read(Stream stream, ImageMetaData info)
        {
            var meta = info as YkgMetaData;
            if (null == meta)
                throw new ArgumentException ("YkgFormat.Read should be supplied with YkgMetaData", "info");

            switch (meta.Format)
            {
            case YkgImage.Bmp:
                using (var bmp = new StreamRegion (stream, meta.DataOffset, meta.DataSize, true))
                    return Bmp.Read (bmp, info);
            case YkgImage.Png:
                using (var png = new StreamRegion (stream, meta.DataOffset, meta.DataSize, true))
                    return Png.Read (png, info);
            case YkgImage.Gnp:
                using (var body = new StreamRegion (stream, meta.DataOffset+4, meta.DataSize-4, true))
                using (var png = new PrefixStream (PngPrefix, body))
                    return Png.Read (png, info);
            default:
                throw new InvalidFormatException();
            }
        }
Example #40
0
 public override ImageMetaData ReadMetaData(Stream stream)
 {
     var header = new byte[8];
     if (8 != stream.Read (header, 0, 8))
         return null;
     bool compressed = 'Z' == header[3];
     uint key = LittleEndian.ToUInt32 (header, 4) ^ EencKey;
     Stream input = new StreamRegion (stream, 8, true);
     try
     {
         input = new EencStream (input, key);
         if (compressed)
         {
             input = new ZLibStream (input, CompressionMode.Decompress);
             input = new SeekableStream (input);
         }
         var format = FindFormat (input);
         if (null == format)
             return null;
         return new EencMetaData
         {
             Width = format.Item2.Width,
             Height = format.Item2.Height,
             BPP = format.Item2.BPP,
             Key = key,
             Info = format.Item2,
             Format = format.Item1,
             Compressed = compressed,
         };
     }
     finally
     {
         input.Dispose();
     }
 }
Example #41
0
 public override Stream OpenEntry(ArcFile arc, Entry entry)
 {
     var nsa_arc = arc as NsaEncryptedArchive;
     if (null == nsa_arc)
     {
         var input = arc.File.CreateStream (entry.Offset, entry.Size);
         return UnpackEntry (input, entry as NsaEntry);
     }
     var encrypted = new EncryptedViewStream (arc.File, nsa_arc.Key);
     var stream = new StreamRegion (encrypted, entry.Offset, entry.Size);
     return UnpackEntry (stream, entry as NsaEntry);
 }
Example #42
0
 public override SoundInput TryOpen(Stream file)
 {
     var header = new byte[0x24];
     if (header.Length != file.Read (header, 0, header.Length))
         return null;
     if (!Binary.AsciiEqual (header, 4, "WAV"))
         return null;
     if (LittleEndian.ToInt32 (header, 8) < 2)
         return null;
     int fmt_offset = LittleEndian.ToInt32 (header, 0x10);
     int fmt_size   = LittleEndian.ToInt32 (header, 0x14);
     int data_offset = LittleEndian.ToInt32 (header, 0x1C);
     int data_size   = LittleEndian.ToInt32 (header, 0x20);
     var wav_header = new byte[8+12+fmt_size+8];
     Buffer.BlockCopy (WavHeader, 0, wav_header, 0, WavHeader.Length);
     LittleEndian.Pack (wav_header.Length-8+data_size, wav_header, 4);
     LittleEndian.Pack (fmt_size, wav_header, 0x10);
     file.Position = fmt_offset;
     file.Read (wav_header, 0x14, fmt_size);
     int d = wav_header.Length-8;
     wav_header[d++]= (byte)'d';
     wav_header[d++]= (byte)'a';
     wav_header[d++]= (byte)'t';
     wav_header[d++]= (byte)'a';
     LittleEndian.Pack (data_size, wav_header, d);
     var wav_data = new StreamRegion (file, data_offset, data_size);
     return new WaveInput (new PrefixStream (wav_header, wav_data));
 }
Example #43
0
 public override SoundInput TryOpen(Stream file)
 {
     if (file.ReadByte() != 0x44)
         return null;
     file.Position = 4;
     if (file.ReadByte() != 0)
         return null;
     int length = ReadInt32 (file);
     if (length != file.Length - 9)
         return null;
     var format = new WaveFormat
     {
         FormatTag                = 1,
         Channels                 = 2,
         SamplesPerSecond         = 44100,
         BitsPerSample            = 16,
         BlockAlign               = 4,
         AverageBytesPerSecond    = 44100*4,
     };
     var pcm = new StreamRegion (file, 9, length);
     return new RawPcmInput (pcm, format);
 }
Example #44
0
 public override ImageData Read(Stream stream, ImageMetaData info)
 {
     using (var png = new StreamRegion (stream, 0x10, true))
         return base.Read (png, info);
 }
Example #45
0
 Stream DeobfuscateStream(Stream stream)
 {
     var png_header = new byte[0x10];
     stream.Read (png_header, 5, 11);
     System.Buffer.BlockCopy (PngHeader, 0, png_header, 0, 8);
     for (int i = 0; i < 8; ++i)
         png_header[i+8] ^= (byte)"PGAECODE"[i];
     var png_body = new StreamRegion (stream, 11, true);
     return new PrefixStream (png_header, png_body);
 }
Example #46
0
 public override SoundInput TryOpen(Stream file)
 {
     var ogg = new StreamRegion (file, 8);
     return new OggInput (ogg);
     // in case of exception ogg stream is left undisposed
 }
Example #47
0
        public override ImageMetaData ReadMetaData(Stream stream)
        {
            byte[] header = new byte[0x18];
            if (0x18 != stream.Read (header, 0, 0x18))
                return null;
            int index_offset = 0xC;
            uint first_offset = LittleEndian.ToUInt32 (header, index_offset);
            if (0 == first_offset)
            {
                index_offset += 4;
                first_offset = LittleEndian.ToUInt32 (header, index_offset);
                if (0 == first_offset)
                    return null;
            }
            index_offset += 4;

            long first_length;
            uint second_offset = LittleEndian.ToUInt32 (header, index_offset);
            if (0 == second_offset)
                first_length = stream.Length - first_offset;
            else if (second_offset < first_offset)
                return null;
            else
                first_length = second_offset - first_offset;

            using (var hiz = new StreamRegion (stream, first_offset, first_length, true))
            {
                var info = base.ReadMetaData (hiz);
                (info as HizMetaData).DataOffset += 0x18;
                return info;
            }
        }