public static byte[] Decompress(Stream input, int compressedSize, int uncompressedSize, CompressionMethod compressionMode)
{
switch (compressionMode) {
case CompressionMethod.None:
if (compressedSize != uncompressedSize)
throw new Exception("CompressedSize and UncompressedSize are not equal with no compression.");
var output = new byte[uncompressedSize];
input.Read(output, 0, output.Length);
return output;
case CompressionMethod.Huffman:
return new ResourceDecompressor(input, compressedSize, uncompressedSize).DecompressHuffman();
case CompressionMethod.Lzw:
byte[] lzwOutput = new byte[uncompressedSize];
int lzwRead = Alexandria.Compression.LZW.Decompress(input, lzwOutput);
if (lzwRead != uncompressedSize)
throw new InvalidDataException("Invalid LZW decompression.");
return lzwOutput;
//return new LZW(input, compressedSize, uncompressedSize).OutputData;
case CompressionMethod.DclImplode:
byte[] dclOutput = new byte[uncompressedSize];
int dclRead = DclImplode.Decompress(input, dclOutput);
if (dclRead != uncompressedSize)
throw new Exception("Invalid DCL decompression.");
return dclOutput;
case CompressionMethod.Lzs:
return new ResourceDecompressor(input, compressedSize, uncompressedSize).DecompressLZS();
default:
throw new Exception("Unknown or unhandled compression mode " + compressionMode + ".");
}
}