Files
Aerofoil/unpacktool/CompactProLZHRLEDecompressor.cpp
2020-05-09 21:05:58 -04:00

54 lines
1.6 KiB
C++

#include "CompactProLZHRLEDecompressor.h"
#include "CompactProRLEDecompressor.h"
#include "CompactProLZHDecompressor.h"
#include "DecompressorProxyReader.h"
CompactProLZHRLEDecompressor::CompactProLZHRLEDecompressor(int blockSize)
: m_proxyReader(nullptr)
, m_proxyInput(nullptr)
, m_lzhDecompressor(nullptr)
, m_rleDecompressor(nullptr)
, m_blockSize(blockSize)
{
}
CompactProLZHRLEDecompressor::~CompactProLZHRLEDecompressor()
{
delete m_rleDecompressor;
delete m_lzhDecompressor;
delete m_proxyReader;
CSInputBufferFree(m_proxyInput);
}
bool CompactProLZHRLEDecompressor::Reset(CSInputBuffer *input, size_t compressedSize, size_t decompressedSize)
{
delete m_rleDecompressor;
delete m_lzhDecompressor;
delete m_proxyReader;
CSInputBufferFree(m_proxyInput);
m_rleDecompressor = nullptr;
m_lzhDecompressor = nullptr;
m_proxyReader = nullptr;
m_proxyInput = nullptr;
m_lzhDecompressor = nullptr;
m_proxyReader = nullptr;
m_lzhDecompressor = new CompactProLZHDecompressor(m_blockSize);
m_proxyReader = new DecompressorProxyReader(m_lzhDecompressor);
// FIXME maybe: This is a really stupid workaround to compensate for the decompressor not actually supporting EOFs, and the fact that we don't know the intermediate size
m_proxyInput = CSInputBufferAlloc(m_proxyReader, 1);
m_rleDecompressor = new CompactProRLEDecompressor();
if (!m_lzhDecompressor->Reset(input, compressedSize, 0))
return false;
if (!m_rleDecompressor->Reset(m_proxyInput, 0, decompressedSize))
return false;
return true;
}
bool CompactProLZHRLEDecompressor::ReadBytes(void *dest, size_t numBytes)
{
return m_rleDecompressor->ReadBytes(dest, numBytes);
}