You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

57 lines
1.4 KiB

using System;
using System.Collections.Generic;
using System.IO;
using System.IO.Compression;
using System.Text;
public class Images {
private List<byte[]> images = new List<byte[]>();
private Dictionary<string, int> refs = new Dictionary<string, int>();
public Images(Stream s) {
ExtractTar(Decompress(s));
}
private DeflateStream Decompress(Stream s) {
return new DeflateStream(s, CompressionMode.Decompress);
}
private void ExtractTar(Stream stream) {
var buffer = new byte[100];
while (true) {
stream.Read(buffer, 0, 100);
var name = Encoding.ASCII.GetString(buffer).Trim('\0');
if (String.IsNullOrWhiteSpace(name))
break;
stream.Seek(24, SeekOrigin.Current);
stream.Read(buffer, 0, 12);
var size = Convert.ToInt64(Encoding.ASCII.GetString(buffer, 0, 12).Trim(), 8);
stream.Seek(376L, SeekOrigin.Current);
var buf = new byte[size];
stream.Read(buf, 0, buf.Length);
if (name.EndsWith(".ref.txt")) {
string r = Encoding.UTF8.GetString(buf).Trim('\0');
refs.Add(name.Replace(".ref.txt", ".png"), refs[r]);
}else{
int i = images.Count;
images.Add(buf);
refs.Add(name, i);
}
var pos = stream.Position;
var offset = 512 - (pos % 512);
if (offset == 512)
offset = 0;
stream.Seek(offset, SeekOrigin.Current);
}
}
public byte[] GetImage(string name) {
return images[refs[name]];
}
}