public override ImageData Read(IBinaryStream stream, ImageMetaData info) { using (var reader = new G00Reader(stream, (G00MetaData)info)) { reader.Unpack(); return(ImageData.Create(info, reader.Format, reader.Palette, reader.Data)); } }
public override ArcFile TryOpen(ArcView file) { if (!file.Name.HasExtension(".g00")) { return(null); } if (file.View.ReadByte(0) != 2) { return(null); } uint width = file.View.ReadUInt16(1); uint height = file.View.ReadUInt16(3); if (0 == width || width > 0x8000 || 0 == height || height > 0x8000) { return(null); } int count = file.View.ReadInt16(5); if (count <= 1 || count > 0x1000) { return(null); } var base_name = Path.GetFileNameWithoutExtension(file.Name); uint index_offset = 9; var dir = new List <Entry> (count); for (int i = 0; i < count; ++i) { var entry = new G00Entry { Name = string.Format("{0}#{1:D3}", base_name, i), X = file.View.ReadInt32(index_offset), Y = file.View.ReadInt32(index_offset + 4), }; dir.Add(entry); index_offset += 0x18; } byte[] bitmap; using (var input = file.CreateStream(index_offset)) bitmap = G00Reader.LzDecompress(input, 2, 1); using (var input = new BinMemoryStream(bitmap)) { if (input.ReadInt32() != count) { return(null); } for (int i = 0; i < count; ++i) { dir[i].Offset = input.ReadUInt32(); dir[i].Size = input.ReadUInt32(); } } dir = dir.Where(e => e.Size != 0).ToList(); if (0 == dir.Count) { return(null); } var info = new ImageMetaData { Width = width, Height = height, BPP = 32 }; return(new G00Archive(file, this, dir, info, bitmap)); }