This repository has been archived on 2024-04-07. You can view files and clone it, but cannot push or open issues or pull requests.
chovy-gm/GMAssetCompiler/StreamHelper.cs

274 lines
6.1 KiB
C#

using Ionic.Zlib;
using System;
using System.Drawing;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;
namespace GMAssetCompiler
{
public static class StreamHelper
{
public static short ReadShort(this Stream _s)
{
int num = _s.ReadByte();
int num2 = _s.ReadByte();
return (short)(num | (num2 << 8));
}
public static int ReadInteger(this Stream _s)
{
int num = _s.ReadByte();
int num2 = _s.ReadByte();
int num3 = _s.ReadByte();
int num4 = _s.ReadByte();
return num | (num2 << 8) | (num3 << 16) | (num4 << 24);
}
public static long ReadLong(this Stream _s)
{
long num = _s.ReadInteger();
long num2 = _s.ReadInteger();
return num | (num2 << 32);
}
public static bool ReadBoolean(this Stream _s)
{
return _s.ReadInteger() != 0;
}
public static string ReadString(this Stream _s)
{
int num = _s.ReadInteger();
byte[] array = new byte[num];
int num2 = 0;
while (num > 0)
{
array[num2] = (byte)_s.ReadByte();
num--;
num2++;
}
return Encoding.UTF8.GetString(array);
}
public static Image ReadBitmap(this Stream _s)
{
Image result = null;
if (_s.ReadBoolean())
{
byte[] buffer = _s.ReadCompressedStream();
MemoryStream stream = new MemoryStream(buffer);
result = Image.FromStream(stream);
}
return result;
}
public static Guid ReadGuid(this Stream _s)
{
int num = Marshal.SizeOf(typeof(Guid));
byte[] array = new byte[num];
_s.Read(array, 0, num);
return new Guid(array);
}
public static byte[] ReadCompressedStream(this Stream _s)
{
int num = _s.ReadInteger();
byte[] result = null;
if (num >= 0)
{
byte[] array = new byte[num];
_s.Read(array, 0, num);
result = ZlibStream.UncompressBuffer(array);
}
return result;
}
public static Stream ReadStreamC(this Stream _s)
{
return new MemoryStream(_s.ReadCompressedStream());
}
public static Stream ReadStreamE(this Stream _s)
{
int num = _s.ReadInteger();
int num2 = _s.ReadInteger();
for (int i = 1; i <= num; i++)
{
_s.ReadInteger();
}
byte[] array = new byte[256];
_s.Read(array, 0, 256);
for (int j = 1; j <= num2; j++)
{
_s.ReadInteger();
}
byte[] array2 = new byte[256];
for (int k = 0; k < 256; k++)
{
array2[array[k]] = (byte)k;
}
int num3 = _s.ReadInteger();
byte[] array3 = new byte[num3];
_s.Read(array3, 0, num3);
for (int num4 = num3 - 1; num4 >= 1; num4--)
{
int num5 = (array2[array3[num4]] - array3[num4 - 1] - num4) % 256;
if (num5 < 0)
{
num5 += 256;
}
array3[num4] = (byte)num5;
}
for (int num6 = num3 - 1; num6 >= 0; num6--)
{
int num7 = Math.Max(0, num6 - array[num6 % 256]);
byte b = array3[num6];
array3[num6] = array3[num7];
array3[num7] = b;
}
return new MemoryStream(array3);
}
public static byte[] ReadStream(this Stream _s)
{
int num = _s.ReadInteger();
byte[] array = null;
if (num > 0)
{
array = new byte[num];
_s.Read(array, 0, num);
}
return array;
}
public static float ReadSingle(this Stream _s)
{
return BitConverter.ToSingle(new byte[4]
{
(byte)_s.ReadByte(),
(byte)_s.ReadByte(),
(byte)_s.ReadByte(),
(byte)_s.ReadByte()
}, 0);
}
public static double ReadDouble(this Stream _s)
{
return BitConverter.ToDouble(new byte[8]
{
(byte)_s.ReadByte(),
(byte)_s.ReadByte(),
(byte)_s.ReadByte(),
(byte)_s.ReadByte(),
(byte)_s.ReadByte(),
(byte)_s.ReadByte(),
(byte)_s.ReadByte(),
(byte)_s.ReadByte()
}, 0);
}
public static void WriteInteger(this Stream _s, int _i)
{
_s.WriteByte((byte)(_i & 0xFF));
_s.WriteByte((byte)((_i >> 8) & 0xFF));
_s.WriteByte((byte)((_i >> 16) & 0xFF));
_s.WriteByte((byte)((_i >> 24) & 0xFF));
}
public static void WriteShort(this Stream _s, short _i)
{
_s.WriteByte((byte)(_i & 0xFF));
_s.WriteByte((byte)((_i >> 8) & 0xFF));
}
public static void WriteGUID(this Stream _s, Guid _g)
{
byte[] array = _g.ToByteArray();
byte[] array2 = array;
foreach (byte value in array2)
{
_s.WriteByte(value);
}
}
public static void WriteLong(this Stream _s, long _l)
{
_s.WriteInteger((int)(_l & uint.MaxValue));
_s.WriteInteger((int)(_l >> 32));
}
public static void WriteBoolean(this Stream _s, bool _b)
{
_s.WriteInteger(_b ? 1 : 0);
}
public static void WriteChunk(this Stream _s, string _chunkName)
{
byte value = (byte)((_chunkName.Length > 0) ? _chunkName[0] : ' ');
byte value2 = (byte)((_chunkName.Length > 1) ? _chunkName[1] : ' ');
byte value3 = (byte)((_chunkName.Length > 2) ? _chunkName[2] : ' ');
byte value4 = (byte)((_chunkName.Length > 3) ? _chunkName[3] : ' ');
_s.WriteByte(value);
_s.WriteByte(value2);
_s.WriteByte(value3);
_s.WriteByte(value4);
}
public static long WriteChunkSize(this Stream _s)
{
long position = _s.Position;
_s.WriteInteger(0);
return position;
}
public static void PatchChunkSize(this Stream _s, long _patchSite)
{
long position = _s.Position;
_s.Seek(_patchSite, SeekOrigin.Begin);
_s.WriteInteger((int)(position - _patchSite - 4));
_s.Seek(position, SeekOrigin.Begin);
}
public static void PatchOffset(this Stream _s, long _patchSite)
{
long position = _s.Position;
_s.Seek(_patchSite, SeekOrigin.Begin);
_s.WriteInteger((int)position);
_s.Seek(position, SeekOrigin.Begin);
}
public static void WriteString(this Stream _s, string _str)
{
byte[] bytes = Encoding.UTF8.GetBytes(_str);
_s.WriteInteger(bytes.Length);
for (int i = 0; i < bytes.Length; i++)
{
_s.WriteByte(bytes[i]);
}
_s.WriteByte(0);
}
public static void WriteDouble(this Stream _s, double db)
{
long l = BitConverter.DoubleToInt64Bits(db);
_s.WriteLong(l);
}
public static void WriteSingle(this Stream _s, float ft)
{
byte[] bytes = BitConverter.GetBytes(ft);
_s.Write(bytes, 0, bytes.Length);
}
public static void Align(this Stream _s, int _align)
{
int num = _align - 1;
while ((_s.Position & num) != 0)
{
_s.WriteByte(0);
}
}
}
}