mirror of
https://github.com/elasota/Aerofoil.git
synced 2025-09-23 06:53:43 +00:00
54 lines
1.6 KiB
C++
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);
|
|
}
|