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
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]];
|
|
}
|
|
|
|
}
|