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)); }
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)); } }
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)); } }
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)); } }
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)); }
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)); }
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())); } }
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)); } }
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)); }