(SCN): recongize zlib compression.

This commit is contained in:
morkt 2019-02-25 12:57:23 +04:00
parent aadb48a7dc
commit 72452d664a

View File

@ -80,25 +80,35 @@ namespace GameRes.Formats.Seraphim
if (0 == entry.Size) if (0 == entry.Size)
return Stream.Null; return Stream.Null;
uint signature = arc.File.View.ReadUInt32 (entry.Offset); uint signature = arc.File.View.ReadUInt32 (entry.Offset);
ArcViewStream input; IBinaryStream input;
if (1 == signature && 0x78 == arc.File.View.ReadByte (entry.Offset+4)) if (1 == signature && 0x78 == arc.File.View.ReadByte (entry.Offset+4))
{ {
input = arc.File.CreateStream (entry.Offset+4, entry.Size-4); input = arc.File.CreateStream (entry.Offset+4, entry.Size-4);
return new ZLibStream (input, CompressionMode.Decompress); return new ZLibStream (input.AsStream, CompressionMode.Decompress);
} }
input = arc.File.CreateStream (entry.Offset, entry.Size); input = arc.File.CreateStream (entry.Offset, entry.Size);
if (signature < 4 || 0 != (signature & 0xFF000000)) if (signature < 4 || 0 != (signature & 0xFF000000))
return input; {
if (0x78 == (signature & 0xFF))
{
var compr = new ZLibStream (input.AsStream, CompressionMode.Decompress);
input = new BinaryStream (compr, entry.Name);
}
else
return input.AsStream;
}
try try
{ {
var data = LzDecompress (input); var data = LzDecompress (input);
input.Dispose();
return new BinMemoryStream (data, entry.Name); return new BinMemoryStream (data, entry.Name);
} }
catch catch
{ {
input.Position = 0; return arc.File.CreateStream (entry.Offset, entry.Size);
return input; }
finally
{
input.Dispose();
} }
} }