public override IImageDecoder OpenImage(ArcFile arc, Entry entry) { var header = arc.File.View.ReadBytes(entry.Offset, 2); if (header[0] != 0 || header[1] != 0) { return(base.OpenImage(arc, entry)); } header[0] = (byte)'B'; header[1] = (byte)'M'; Stream input = arc.File.CreateStream(entry.Offset + 2, entry.Size - 2); try { input = new PrefixStream(header, input); var bmp = new BinaryStream(input, entry.Name); var info = ImageFormat.Bmp.ReadMetaData(bmp); if (null == info) { throw new InvalidFormatException(); } bmp.Position = 0; return(new ImageFormatDecoder(bmp, ImageFormat.Bmp, info)); } catch { input.Dispose(); throw; } }
} // 'PAD' public override SoundInput TryOpen(IBinaryStream file) { var wav_header = file.ReadHeader(0x2c).ToArray(); int pcm_size = LittleEndian.ToInt32(wav_header, 0x28); int channels = LittleEndian.ToUInt16(wav_header, 0x16); wav_header[0] = (byte)'R'; wav_header[1] = (byte)'I'; wav_header[2] = (byte)'F'; wav_header[3] = (byte)'F'; LittleEndian.Pack(pcm_size + 0x24, wav_header, 4); var decoder = new PadDecoder(file.AsStream, pcm_size, channels); decoder.Unpack(); var data = new MemoryStream(decoder.Data, 0, pcm_size); var wav = new PrefixStream(wav_header, data); try { return(new WaveInput(wav)); } catch { wav.Dispose(); throw; } }