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.
77 lines
2.0 KiB
77 lines
2.0 KiB
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.IO.Compression;
|
|
using System.Text;
|
|
using UnityEngine;
|
|
|
|
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 maybeSeekableStream) {
|
|
Stream stream;
|
|
if (maybeSeekableStream.CanSeek) {
|
|
stream = maybeSeekableStream;
|
|
}else{
|
|
stream = new MemoryStream();
|
|
maybeSeekableStream.CopyTo(stream);
|
|
stream.Seek(0, SeekOrigin.Begin);
|
|
}
|
|
var buffer = new byte[100];
|
|
while (true) {
|
|
stream.Read(buffer, 0, 100);
|
|
var name = Encoding.ASCII.GetString(buffer).Trim('\0');
|
|
// Debug.Log("Unpacked image: " + name);
|
|
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().Trim('\0'), 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');
|
|
if (!refs.ContainsKey(name.Replace(".ref.txt", ".png")))
|
|
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[] GetImageFromPath(string path) {
|
|
// Debug.Log("Getting image: " + path);
|
|
return images[refs[path]];
|
|
}
|
|
|
|
public Game.Image GetImage(string cardKind) {
|
|
return new Game.Image() {
|
|
Kind = cardKind,
|
|
Face = Google.Protobuf.ByteString.CopyFrom(GetImageFromPath(cardKind + "/face.png")),
|
|
Back = Google.Protobuf.ByteString.CopyFrom(GetImageFromPath(cardKind + "/back.png"))
|
|
};
|
|
}
|
|
|
|
}
|