Switch-Toolbox/Switch_Toolbox_Library/IO/FileWriter.cs
KillzXGaming 0c126e4155 More improvements.
Rewrote the compression handling from scatch. It's way easier and cleaner to add new formats code wise as it's handled like file formats.
Added wip TVOL support (Touhou Azure Reflections)
Added XCI support. Note I plan to improve NSP, XCI, NCA, etc later for exefs exporting.
The compression rework now compresses via streams, so files get decompressed properly within archives as streams.
Added hyrule warriors bin.gz compression along with archive rebuilding. Note i do not have texture rebuilding done just yet.
2019-09-15 19:13:01 -04:00

161 lines
4.5 KiB
C#

using Syroot.BinaryData;
using System.IO;
using System.Text;
namespace Toolbox.Library.IO
{
public class FileWriter : BinaryDataWriter
{
public void CheckByteOrderMark(uint ByteOrderMark)
{
if (ByteOrderMark == 0xFEFF)
ByteOrder = ByteOrder.BigEndian;
else
ByteOrder = ByteOrder.LittleEndian;
}
public FileWriter(Stream stream, bool leaveOpen = false)
: base(stream, Encoding.ASCII, leaveOpen)
{
}
public FileWriter(string fileName)
: this(new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.Read))
{
}
public FileWriter(byte[] data)
: this(new MemoryStream(data))
{
}
public void Write(Syroot.Maths.Vector2F v)
{
Write(v.X);
Write(v.Y);
}
public void Write(Syroot.Maths.Vector3F v)
{
Write(v.X);
Write(v.Y);
Write(v.Z);
}
public void Write(Syroot.Maths.Vector4F v)
{
Write(v.X);
Write(v.Y);
Write(v.Z);
Write(v.W);
}
public void Write(STColor color) {
Write(color.ToBytes());
}
public void Write(STColor8 color) {
Write(color.ToBytes());
}
public void Write(STColor8[] colors)
{
foreach (var color in colors)
Write(color.ToBytes());
}
public void WriteStruct<T>(T item) => Write(item.StructToBytes(ByteOrder == ByteOrder.BigEndian));
public void WriteSignature(string value)
{
Write(Encoding.ASCII.GetBytes(value));
}
public void WriteString(string value, Encoding encoding = null)
{
Write(value, BinaryStringFormat.ZeroTerminated, encoding ?? Encoding);
}
public void WriteUint64Offset(long target)
{
long pos = Position;
using (TemporarySeek(target, SeekOrigin.Begin))
{
Write(pos);
}
}
public void SetByteOrder(bool IsBigEndian)
{
if (IsBigEndian)
ByteOrder = ByteOrder.BigEndian;
else
ByteOrder = ByteOrder.LittleEndian;
}
public void WriteString(string text, uint fixedSize, Encoding encoding = null)
{
long pos = Position;
WriteString(text, encoding);
SeekBegin(pos + fixedSize);
}
public void Write(object value, long pos)
{
using (TemporarySeek(pos, SeekOrigin.Begin)) {
if (value is uint) Write((uint)value);
else if (value is int) Write((int)value);
else if (value is long) Write((long)value);
else if (value is ulong) Write((ulong)value);
else if (value is ushort) Write((ushort)value);
else if (value is short) Write((short)value);
else if (value is sbyte) Write((sbyte)value);
else if (value is byte) Write((byte)value);
}
}
//Writes the total size of a section as a uint.
public void WriteSectionSizeU32(long position, long startPosition, long endPosition)
{
using (TemporarySeek(position, System.IO.SeekOrigin.Begin))
{
Write((uint)endPosition - startPosition);
}
}
//
// RelativeOffsetPosition controls the relative position the offset starts at
//
public void WriteUint32Offset(long target, long RelativeOffsetPosition = 0)
{
long pos = Position;
using (TemporarySeek(target, SeekOrigin.Begin))
{
Write((uint)(pos - RelativeOffsetPosition));
}
}
public void SeekBegin(uint Offset) { Seek(Offset, SeekOrigin.Begin); }
public void SeekBegin(int Offset) { Seek(Offset, SeekOrigin.Begin); }
public void SeekBegin(long Offset) { Seek(Offset, SeekOrigin.Begin); }
public void Write(OpenTK.Vector2 v)
{
Write(v.X);
Write(v.Y);
}
public void Write(OpenTK.Vector3 v)
{
Write(v.X);
Write(v.Y);
Write(v.Z);
}
public void Write(OpenTK.Vector4 v)
{
Write(v.X);
Write(v.Y);
Write(v.Z);
Write(v.W);
}
}
}