Started work on Cor .res decompression
parent
e24d09073a
commit
d29691e0ee
|
@ -0,0 +1,88 @@
|
||||||
|
using NLog;
|
||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
|
||||||
|
namespace Resources
|
||||||
|
{
|
||||||
|
public class Compression
|
||||||
|
{
|
||||||
|
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
|
||||||
|
|
||||||
|
class Header
|
||||||
|
{
|
||||||
|
public const int Size = 9;
|
||||||
|
|
||||||
|
public byte[] Buffer;
|
||||||
|
public byte Flags => Buffer[0];
|
||||||
|
public uint CompressedLength => BitConverter.ToUInt32(Buffer, 1);
|
||||||
|
public uint DecompressedLength => BitConverter.ToUInt32(Buffer, 5);
|
||||||
|
public bool IsCompressed => (Flags & 1) > 0;
|
||||||
|
public int LengthSize => (Flags & 2) > 0 ? 4 : 1;
|
||||||
|
|
||||||
|
public static Header Read(BinaryReader reader)
|
||||||
|
{
|
||||||
|
var buffer = new byte[Size];
|
||||||
|
reader.Read(buffer, 0, buffer.Length);
|
||||||
|
return new Header { Buffer = buffer };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private readonly Stream _stream;
|
||||||
|
private readonly BinaryReader _reader;
|
||||||
|
private readonly long _streamSize;
|
||||||
|
|
||||||
|
public Compression(Stream stream)
|
||||||
|
{
|
||||||
|
_stream = stream;
|
||||||
|
_reader = new BinaryReader(stream);
|
||||||
|
_streamSize = stream.Length;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Stream Decompress()
|
||||||
|
{
|
||||||
|
var output = new MemoryStream();
|
||||||
|
var buffer = new byte[5120];
|
||||||
|
|
||||||
|
var offset = (uint)0;
|
||||||
|
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
var header = Header.Read(_reader);
|
||||||
|
|
||||||
|
if (header.DecompressedLength == 4096)
|
||||||
|
{
|
||||||
|
Logger.Debug("Compression block header read at offset 0x{0:X}", offset);
|
||||||
|
Logger.Debug("Flags 0x{0:X}, Compressed {1}, Decompressed {2}, LengthSize {3}",
|
||||||
|
header.Flags, header.CompressedLength, header.DecompressedLength, header.LengthSize);
|
||||||
|
|
||||||
|
_reader.Read(buffer, 0, (int)header.CompressedLength - 9);
|
||||||
|
offset += header.CompressedLength;
|
||||||
|
|
||||||
|
|
||||||
|
if (header.IsCompressed)
|
||||||
|
{
|
||||||
|
// Here should be decompression
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
output.Write(buffer, 0, (int)header.CompressedLength);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var latestBlock = _streamSize - offset;
|
||||||
|
Logger.Debug("Latest block read at offset 0x{0:X}, size: {1}", offset, latestBlock);
|
||||||
|
|
||||||
|
_reader.Read(buffer, 0, (int)(latestBlock - Header.Size));
|
||||||
|
|
||||||
|
output.Write(header.Buffer, 0, Header.Size);
|
||||||
|
output.Write(buffer, 0, (int)(latestBlock - Header.Size));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
output.Seek(0, SeekOrigin.Begin);
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -48,6 +48,7 @@
|
||||||
<Reference Include="System.Xml" />
|
<Reference Include="System.Xml" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<Compile Include="Compression.cs" />
|
||||||
<Compile Include="Extractor.cs" />
|
<Compile Include="Extractor.cs" />
|
||||||
<Compile Include="ImageLoader.cs" />
|
<Compile Include="ImageLoader.cs" />
|
||||||
<Compile Include="Image\ImageType.cs" />
|
<Compile Include="Image\ImageType.cs" />
|
||||||
|
|
|
@ -72,6 +72,9 @@ namespace WatchFace
|
||||||
case ".bin":
|
case ".bin":
|
||||||
UnpackWatchFace(inputFileName);
|
UnpackWatchFace(inputFileName);
|
||||||
break;
|
break;
|
||||||
|
case ".res":
|
||||||
|
UnpackResources(inputFileName);
|
||||||
|
break;
|
||||||
case ".json":
|
case ".json":
|
||||||
PackWatchFace(inputFileName);
|
PackWatchFace(inputFileName);
|
||||||
break;
|
break;
|
||||||
|
@ -205,7 +208,8 @@ namespace WatchFace
|
||||||
FileDescriptor resDescriptor;
|
FileDescriptor resDescriptor;
|
||||||
using (var stream = File.OpenRead(inputFileName))
|
using (var stream = File.OpenRead(inputFileName))
|
||||||
{
|
{
|
||||||
resDescriptor = FileReader.Read(stream);
|
var decompressedStream = new Compression(stream).Decompress();
|
||||||
|
resDescriptor = FileReader.Read(decompressedStream);
|
||||||
}
|
}
|
||||||
|
|
||||||
ExportResConfig(resDescriptor, Path.Combine(outputDirectory, "header.json"));
|
ExportResConfig(resDescriptor, Path.Combine(outputDirectory, "header.json"));
|
||||||
|
|
Loading…
Reference in New Issue