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); } }
} // '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); } }
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); }
} // '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, }); } }
} // '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, }); } }
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); } }
} // '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); } }
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 }); } }
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, }); } }
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)); } } }
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, }); } } }
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); } }
} // '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); } }
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, }); } } }
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, }); } }
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; } }
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 }); } }
} // '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, }); } }
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, }); } }
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); } }
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); } }
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, }); } }
} // '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(), }); } }
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); } }
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)); }
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"); } } }
} // '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); } }
} // '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, }); } }
} // '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); } }
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, }; } }
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); } }
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; } }
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, }; } } }
// 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; } }
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; } }
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; } }
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, }; } } }
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, }; } }
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; } }
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; } }
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; } }
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; }
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, }; } }
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, }; } }
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); } }
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; } }
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; } }
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, }; } }