public override ArcFile TryOpen(ArcView file) { int count = file.View.ReadInt32(0); if (count <= 0 || count > 100) { return(null); } int first_offset = file.View.ReadInt32(4); if (0 != first_offset) { return(null); } string base_name = Path.GetFileNameWithoutExtension(file.Name); int base_offset = 4 + count * 0x1C; int index_offset = 4; var dir = new List <Entry> (count); for (int i = 0; i < count; ++i) { var entry = new BdfFrame { Number = i, Name = string.Format("{0}#{1:D2}", base_name, i), Type = "image", Offset = base_offset + file.View.ReadUInt32(index_offset), Size = file.View.ReadUInt32(index_offset + 4), Incremental = 0 != file.View.ReadInt32(index_offset + 8), Width = file.View.ReadInt32(index_offset + 0x14), Height = file.View.ReadInt32(index_offset + 0x18), }; if (entry.Size > 0) { if (entry.Size < 4 || entry.Width <= 0 || entry.Height <= 0 || !entry.CheckPlacement(file.MaxOffset)) { return(null); } dir.Add(entry); } index_offset += 0x1C; } return(new BdfArchive(file, this, dir)); }
public byte[] ReadFrame(BdfFrame frame) { byte[] pixels; if (!frame.Incremental) { if (null != FirstFrame && 0 == frame.Number) { return(FirstFrame); } pixels = new byte[frame.Width * frame.Height * 3]; using (var input = File.CreateStream(frame.Offset, frame.Size)) DecodeFrame(input, pixels); if (null == FirstFrame && 0 == frame.Number) { FirstFrame = pixels; } } else { if (null == FirstFrame) { var base_frame = Dir.First() as BdfFrame; FirstFrame = new byte[base_frame.Width * base_frame.Height * 3]; using (var input = File.CreateStream(base_frame.Offset, base_frame.Size)) DecodeFrame(input, FirstFrame); } pixels = FirstFrame.Clone() as byte[]; int i = 1; foreach (BdfFrame entry in Dir.Skip(1)) { if (i++ > frame.Number) { break; } using (var input = File.CreateStream(entry.Offset, entry.Size)) DecodeFrame(input, pixels, entry.Incremental); } } return(pixels); }
public override ArcFile TryOpen(ArcView file) { int count = file.View.ReadInt32 (0); if (count <= 0 || count > 100) return null; int first_offset = file.View.ReadInt32 (4); if (0 != first_offset) return null; string base_name = Path.GetFileNameWithoutExtension (file.Name); int base_offset = 4 + count * 0x1C; int index_offset = 4; var dir = new List<Entry> (count); for (int i = 0; i < count; ++i) { var entry = new BdfFrame { Number = i, Name = string.Format ("{0}#{1:D2}.tga", base_name, i), Type = "image", Offset = base_offset + file.View.ReadUInt32 (index_offset), Size = file.View.ReadUInt32 (index_offset+4), Incremental = 0 != file.View.ReadInt32 (index_offset+8), Width = file.View.ReadInt32 (index_offset+0x14), Height = file.View.ReadInt32 (index_offset+0x18), }; if (entry.Size < 4 || entry.Width <= 0 || entry.Height <= 0 || !entry.CheckPlacement (file.MaxOffset)) return null; dir.Add (entry); index_offset += 0x1C; } return new BdfArchive (file, this, dir); }
public byte[] ReadFrame(BdfFrame frame) { byte[] pixels; if (!frame.Incremental) { if (null != FirstFrame && 0 == frame.Number) return FirstFrame; pixels = new byte[frame.Width * frame.Height * 3]; using (var input = File.CreateStream (frame.Offset, frame.Size)) DecodeFrame (input, pixels); if (null == FirstFrame && 0 == frame.Number) FirstFrame = pixels; } else { if (null == FirstFrame) { var base_frame = Dir.First() as BdfFrame; FirstFrame = new byte[base_frame.Width * base_frame.Height * 3]; using (var input = File.CreateStream (base_frame.Offset, base_frame.Size)) DecodeFrame (input, FirstFrame); } pixels = FirstFrame.Clone() as byte[]; int i = 1; foreach (BdfFrame entry in Dir.Skip(1)) { if (i++ > frame.Number) break; using (var input = File.CreateStream (entry.Offset, entry.Size)) DecodeFrame (input, pixels, entry.Incremental); } } return pixels; }
public BdfImageDecoder(BdfArchive arc, BdfFrame entry) : base(arc.File.CreateStream(entry.Offset, entry.Size), arc.Info) { m_bdf = arc; m_frame = entry; }