public override ArcFile TryOpen(ArcView file) { if (file.View.ReadUInt32(4) != 0xFFBAA9B6) { return(null); } uint index_length = file.View.ReadUInt32(8); using (var index_s = OpenDataStream(file, 8)) using (var index = BinaryStream.FromStream(index_s, file.Name)) { int count = index.ReadInt32(); if (!IsSaneCount(count)) { return(null); } uint data_offset = 8 + index_length; var dir = new List <Entry> (count); for (int i = 0; i < count; ++i) { var name = index.ReadCString(0x104); var entry = FormatCatalog.Instance.Create <PackedEntry> (name); entry.Offset = index.ReadUInt32() + data_offset; entry.Size = index.ReadUInt32(); if (!entry.CheckPlacement(file.MaxOffset)) { return(null); } dir.Add(entry); } return(new ArcFile(file, this, dir)); } }
public override ImageMetaData ReadMetaData(IBinaryStream file) { var header = file.ReadHeader(0x29); if (header.Length != 0x29) { return(null); } var gps = new GpsMetaData { Width = header.ToUInt32(0x19), Height = header.ToUInt32(0x1D), Compression = header[0x10], UnpackedSize = header.ToInt32(0x11), PackedSize = header.ToInt32(0x15), }; // read BMP header using (var stream = OpenGpsStream(file, gps.Compression, 0x54)) using (var input = BinaryStream.FromStream(stream, file.Name)) { var bmp_info = base.ReadMetaData(input); if (null == bmp_info) { return(null); } gps.BPP = bmp_info.BPP; return(gps); } }
public override ImageData Read(IBinaryStream file, ImageMetaData info) { var gps = (GpsMetaData)info; file.Position = 0x29; using (var stream = OpenGpsStream(file, gps.Compression, gps.UnpackedSize)) using (var input = BinaryStream.FromStream(stream, file.Name)) return(base.Read(input, info)); }
List <Entry> ReadIndex(ArcView file, byte[] key = null) { bool is_encrypted = key != null; uint index_offset = file.View.ReadUInt32(file.MaxOffset - 4); if (index_offset >= file.MaxOffset) { return(null); } int index_size = file.View.ReadInt32(index_offset); if (index_size <= 0) { return(null); } var index = new byte[index_size]; Stream input = file.CreateStream(index_offset + 4); if (is_encrypted) { input = new ByteStringEncryptedStream(input, key); } using (var packed = BinaryStream.FromStream(input, "")) LzUnpack(packed, index); var dir = new List <Entry>(); int index_pos = 0; uint offset = LittleEndian.ToUInt32(index, index_pos); while (index_pos < index.Length) { index_pos += 4; int name_length = index[index_pos]; if (0 == name_length) { break; } bool is_packed = index[index_pos + 1] != 0; index_pos += 6; name_length *= 2; var name = Encoding.Unicode.GetString(index, index_pos, name_length); index_pos += name_length; uint next_offset = LittleEndian.ToUInt32(index, index_pos); var entry = FormatCatalog.Instance.Create <PackedEntry> (name); entry.Offset = offset; entry.Size = next_offset - offset; entry.IsPacked = is_packed; if (!entry.CheckPlacement(index_offset)) { return(null); } dir.Add(entry); offset = next_offset; } return(dir); }
protected virtual IImageDecoder DecryptImage(IBinaryStream input, AImageScheme scheme) { int type = input.ReadByte(); if ('c' == type || 'b' == type) { uint img_size = Binary.BigEndian(input.ReadUInt32()); long start_pos = input.Length - img_size; input = BinaryStream.FromStream(new StreamRegion(input.AsStream, start_pos, img_size), input.Name); } else if (scheme != null && ('a' == type || 'd' == type) && input.Length > 21) { int id = input.ReadByte(); if (id == scheme.Value2) { return(new AImageReader(input, scheme, type)); } } input.Position = 0; return(new ImageFormatDecoder(input)); }
public override SoundInput TryOpen(IBinaryStream file) { using (var lzss = new LzssStream(file.AsStream, LzssMode.Decompress, true)) { var header = new byte[8]; if (lzss.Read(header, 0, 8) != 8) { return(null); } int length = header.ToInt32(4); var wav = new MemoryStream(length + 8); wav.Write(header, 0, 8); lzss.CopyTo(wav); var bin = BinaryStream.FromStream(wav, file.Name); var sound = Wav.TryOpen(bin); if (sound != null) { file.Dispose(); } return(sound); } }
public override IImageDecoder OpenImage(ArcFile arc, Entry entry) { if (entry.Name.HasAnyOfExtensions(".BGD", ".CRGB")) { var input = OpenEntry(arc, entry); var info = new ImageMetaData { Width = 800, Height = 600, BPP = 24 }; return(new CgdReader(BinaryStream.FromStream(input, entry.Name), info)); } else if (entry.Name.HasExtension(".edg")) { var input = OpenEntry(arc, entry); var info = new ImageMetaData { Width = 460, Height = 345, BPP = 24 }; return(new ImgReader(BinaryStream.FromStream(input, entry.Name), info)); } else if (entry.Name.HasExtension(".rol")) { var input = OpenEntry(arc, entry); uint width = 202; uint height = (uint)input.Length / (((width * 3u) + 3u) & ~3u); var info = new ImageMetaData { Width = width, Height = height, BPP = 24 }; return(new ImgReader(BinaryStream.FromStream(input, entry.Name), info)); } else if (entry.Name.HasExtension(".CHAR")) { var input = OpenEntry(arc, entry); var info = new ChrMetaData { Width = 800, Height = 600, BPP = 32, DataOffset = 0, RgbSize = (int)input.Length, }; return(new ChrReader(BinaryStream.FromStream(input, entry.Name), info)); } return(base.OpenImage(arc, entry)); }
public override ImageMetaData ReadMetaData(IBinaryStream file) { var header = file.ReadHeader(0x29); var gps = new GpsMetaData(); if (header.ToUInt32(4) == 0xCCCCCCCC) { gps.HeaderSize = 0x19; gps.Compression = 2; gps.UnpackedSize = header.ToInt32(0x9); gps.PackedSize = header.ToInt32(0xD); } else { gps.HeaderSize = 0x29; gps.Compression = header[0x10]; gps.UnpackedSize = header.ToInt32(0x11); gps.PackedSize = header.ToInt32(0x15); gps.Width = header.ToUInt32(0x19); gps.Height = header.ToUInt32(0x1D); } file.Position = gps.HeaderSize; // read BMP header using (var stream = OpenGpsStream(file, gps.Compression, 0x54)) using (var input = BinaryStream.FromStream(stream, file.Name)) { var bmp_info = Bmp.ReadMetaData(input); if (null == bmp_info) { return(null); } gps.BPP = bmp_info.BPP; gps.Width = bmp_info.Width; gps.Height = bmp_info.Height; return(gps); } }
public override void Initialize(Stream input) { m_input = BinaryStream.FromStream(input, ""); }
public AssetReader(Stream input, string name) : this(BinaryStream.FromStream(input, name)) { }
public AssetReader(Stream input, string name) { m_input = BinaryStream.FromStream(input, name); SetupReaders(0, false); }