public override IImageDecoder OpenImage(ArcFile arc, Entry entry) { byte pic_method = arc.File.View.ReadByte(entry.Offset); if (pic_method != 1 && pic_method != 2) { return(base.OpenImage(arc, entry)); } var pent = (PdImageEntry)entry; byte[] baseline = null; var dir = arc.Dir as List <Entry>; for (int i = pent.Number - 1; i >= 0; --i) { var base_entry = dir[i]; byte base_method = arc.File.View.ReadByte(base_entry.Offset); if (base_method != 1 && base_method != 2) { PicMetaData base_info; using (var base_input = arc.File.CreateStream(base_entry.Offset, base_entry.Size)) { base_info = s_picFormat.Value.ReadMetaData(base_input) as PicMetaData; if (null == base_info) { throw new InvalidFormatException(); } using (var reader = new PicFormat.Reader(base_input, base_info)) { reader.Unpack(); baseline = reader.Data; } } var overlay_info = new PdOverlayMetaData { Width = base_info.Width, Height = base_info.Height, BPP = 24, Method = pic_method, ChunkCount = arc.File.View.ReadInt32(pent.Offset + 4), }; var input = arc.File.CreateStream(pent.Offset, pent.Size); return(new PdOverlayImage(input, overlay_info, baseline)); } } return(base.OpenImage(arc, entry)); // essentialy InvalidFormatException }
public PdOverlayImage(IBinaryStream input, PdOverlayMetaData info, byte[] baseline) : base(input, info) { m_method = info.Method; m_chunk_count = info.ChunkCount; m_baseline = baseline; }