コード例 #1
0
ファイル: ArcMCA.cs プロジェクト: tenyuhuang/GARbro
        public override Stream OpenEntry(ArcFile arc, Entry entry)
        {
            var mca    = arc as McaArchive;
            int method = arc.File.View.ReadInt32(entry.Offset);

            if (null == mca || method < 0 || method > 1)
            {
                return(base.OpenEntry(arc, entry));
            }
            uint width         = arc.File.View.ReadUInt32(entry.Offset + 0xC);
            uint height        = arc.File.View.ReadUInt32(entry.Offset + 0x10);
            uint packed_size   = arc.File.View.ReadUInt32(entry.Offset + 0x14);
            int  unpacked_size = arc.File.View.ReadInt32(entry.Offset + 0x18);

            var data = arc.File.View.ReadBytes(entry.Offset + 0x20, packed_size);

            MrgOpener.Decrypt(data, 0, data.Length, mca.Key);
            if (method > 0)
            {
                using (var input = new MemoryStream(data))
                    using (var lzss = new MrgLzssReader(input, data.Length, unpacked_size))
                    {
                        lzss.Unpack();
                        data = lzss.Data;
                    }
            }
            int stride = ((int)width * 3 + 3) & ~3;
            var info   = new ImageMetaData {
                Width = width, Height = height, BPP = 24
            };

            return(TgaStream.Create(info, stride, data));
        }
コード例 #2
0
ファイル: ArcHG2.cs プロジェクト: tenyuhuang/GARbro
        public override Stream OpenEntry(ArcFile arc, Entry entry)
        {
            // emulate TGA image
            var offset = entry.Offset;
            var info   = new Hg2MetaData
            {
                HeaderSize   = 0x4C,
                Width        = arc.File.View.ReadUInt32(offset),
                Height       = arc.File.View.ReadUInt32(offset + 4),
                BPP          = arc.File.View.ReadInt32(offset + 8),
                DataPacked   = arc.File.View.ReadInt32(offset + 0x14),
                DataUnpacked = arc.File.View.ReadInt32(offset + 0x18),
                CtlPacked    = arc.File.View.ReadInt32(offset + 0x1C),
                CtlUnpacked  = arc.File.View.ReadInt32(offset + 0x20),
                CanvasWidth  = arc.File.View.ReadUInt32(offset + 0x2C),
                CanvasHeight = arc.File.View.ReadUInt32(offset + 0x30),
                OffsetX      = arc.File.View.ReadInt32(offset + 0x34),
                OffsetY      = arc.File.View.ReadInt32(offset + 0x38),
            };

            using (var input = arc.File.CreateStream(entry.Offset, entry.Size))
                using (var reader = new Hg2Reader(input, info))
                {
                    return(TgaStream.Create(info, reader.Unpack(), true));
                }
        }
コード例 #3
0
ファイル: ArcHZC.cs プロジェクト: tenyuhuang/GARbro
        public override Stream OpenEntry(ArcFile arc, Entry entry)
        {
            var hzc = (HzcArchive)arc;

            using (var input = arc.File.CreateStream(0xC + hzc.ImageInfo.HeaderSize))
                using (var z = new ZLibStream(input, CompressionMode.Decompress))
                {
                    uint frame_size = entry.Size - 0x12;
                    var  pixels     = new byte[frame_size];
                    uint offset     = 0;
                    for (;;)
                    {
                        if (pixels.Length != z.Read(pixels, 0, pixels.Length))
                        {
                            break;
                        }
                        if (offset >= entry.Offset)
                        {
                            break;
                        }
                        offset += frame_size;
                    }
                    if (4 == hzc.ImageInfo.Type)
                    {
                        for (int i = 0; i < pixels.Length; ++i)
                        {
                            if (1 == pixels[i])
                            {
                                pixels[i] = 0xFF;
                            }
                        }
                    }
                    return(TgaStream.Create(hzc.ImageInfo, pixels));
                }
        }
コード例 #4
0
ファイル: ImageAinos.cs プロジェクト: tenyuhuang/GARbro
        public override Stream OpenEntry(ArcFile arc, Entry entry)
        {
            var ani = (AniEntry)entry;

            byte[] key_frame = null;
            if (ani.KeyFrame != ani.FrameIndex)
            {
                var dir = (List <Entry>)arc.Dir;
                for (int i = ani.KeyFrame; i < ani.FrameIndex; ++i)
                {
                    var frame = dir[i];
                    using (var s = arc.File.CreateStream(frame.Offset, frame.Size))
                    {
                        var frame_info = Cg.ReadMetaData(s) as CgMetaData;
                        if (null == frame_info)
                        {
                            break;
                        }
                        using (var reader = new CgFormat.Reader(s, frame_info, key_frame))
                        {
                            reader.Unpack();
                            key_frame = reader.Data;
                        }
                    }
                }
            }
            var        input = arc.File.CreateStream(entry.Offset, entry.Size);
            CgMetaData info  = null;

            try
            {
                info = Cg.ReadMetaData(input) as CgMetaData;
            }
            catch
            {
                input.Dispose();
                throw;
            }
            if (null == info)
            {
                input.Position = 0;
                return(input);
            }
            using (input)
                using (var reader = new CgFormat.Reader(input, info, key_frame))
                {
                    reader.Unpack();
                    return(TgaStream.Create(info, reader.Data));
                }
        }
コード例 #5
0
ファイル: ArcERI.cs プロジェクト: tenyuhuang/GARbro
        public override Stream OpenEntry(ArcFile arc, Entry entry)
        {
            var earc   = (EriMultiImage)arc;
            var eent   = (EriEntry)entry;
            var pixels = earc.GetFrame(eent.FrameIndex);

            if (32 == earc.Info.BPP && 0 == (earc.Info.FormatType & EriType.WithAlpha))
            {
                for (int p = 3; p < pixels.Length; p += 4)
                {
                    pixels[p] = 0xFF;
                }
            }
            return(TgaStream.Create(earc.Info, pixels));
        }
コード例 #6
0
        public override Stream OpenEntry(ArcFile arc, Entry entry)
        {
            var base_info = ((AnmArchive)arc).ImageInfo;
            // emulate TGA image
            var offset = entry.Offset;
            var info   = new ImageMetaData
            {
                OffsetX = base_info.OffsetX + arc.File.View.ReadInt32(offset),
                OffsetY = base_info.OffsetY + arc.File.View.ReadInt32(offset + 4),
                Width   = arc.File.View.ReadUInt32(offset + 8),
                Height  = arc.File.View.ReadUInt32(offset + 12),
                BPP     = 32,
            };

            offset += 0x10;
            var pixels = arc.File.View.ReadBytes(offset, 4 * info.Width * info.Height);

            return(TgaStream.Create(info, pixels, true));
        }
コード例 #7
0
ファイル: ArcS25.cs プロジェクト: tenyuhuang/GARbro
        public override Stream OpenEntry(ArcFile arc, Entry entry)
        {
            // emulate TGA image
            var offset = entry.Offset;
            var info   = new S25MetaData
            {
                Width       = arc.File.View.ReadUInt32(offset),
                Height      = arc.File.View.ReadUInt32(offset + 4),
                OffsetX     = arc.File.View.ReadInt32(offset + 8),
                OffsetY     = arc.File.View.ReadInt32(offset + 12),
                BPP         = 32,
                FirstOffset = (uint)(offset + 0x14),
                Incremental = 0 != (arc.File.View.ReadUInt32(offset + 0x10) & 0x80000000u),
            };

            using (var input = arc.File.CreateStream(0, (uint)arc.File.MaxOffset))
                using (var reader = new S25Format.Reader(input, info))
                {
                    return(TgaStream.Create(info, reader.Unpack()));
                }
        }
コード例 #8
0
        public override Stream OpenEntry(ArcFile arc, Entry entry)
        {
            // emulate TGA image
            var offset = entry.Offset + 8;
            var info   = new HgMetaData
            {
                HeaderSize   = arc.File.View.ReadUInt32(offset),
                Width        = arc.File.View.ReadUInt32(offset + 8),
                Height       = arc.File.View.ReadUInt32(offset + 0xC),
                BPP          = arc.File.View.ReadInt32(offset + 0x10),
                OffsetX      = arc.File.View.ReadInt32(offset + 0x14),
                OffsetY      = arc.File.View.ReadInt32(offset + 0x18),
                CanvasWidth  = arc.File.View.ReadUInt32(offset + 0x1C),
                CanvasHeight = arc.File.View.ReadUInt32(offset + 0x20),
            };

            using (var input = arc.File.CreateStream(entry.Offset, entry.Size))
                using (var reader = new Hg3Reader(input, info))
                {
                    var pixels = reader.Unpack();
                    return(TgaStream.Create(info, pixels, reader.Flipped));
                }
        }
コード例 #9
0
ファイル: ArcPNA.cs プロジェクト: tenyuhuang/GARbro
        public override Stream OpenEntry(ArcFile arc, Entry entry)
        {
            var pent = entry as PnaEntry;

            if (null == pent)
            {
                return(base.OpenEntry(arc, entry));
            }
            ImageData image;

            using (var input = arc.File.CreateStream(entry.Offset, entry.Size))
                image = ImageFormat.Read(input);
            var bitmap = image.Bitmap;

            if (bitmap.Format.BitsPerPixel != 32)
            {
                bitmap = new FormatConvertedBitmap(bitmap, PixelFormats.Bgra32, null, 0);
            }
            int stride = bitmap.PixelWidth * 4;
            var pixels = new byte[stride * bitmap.PixelHeight];

            bitmap.CopyPixels(pixels, stride, 0);

            // restore colors premultiplied by alpha
            for (int i = 0; i < pixels.Length; i += 4)
            {
                int alpha = pixels[i + 3];
                if (alpha != 0 && alpha != 0xFF)
                {
                    pixels[i]     = (byte)(pixels[i] * 0xFF / alpha);
                    pixels[i + 1] = (byte)(pixels[i + 1] * 0xFF / alpha);
                    pixels[i + 2] = (byte)(pixels[i + 2] * 0xFF / alpha);
                }
            }
            return(TgaStream.Create(pent.Info, pixels));
        }