XPlor/libs/compression/compression.h

121 lines
4.3 KiB
C
Raw Normal View History

2025-04-04 20:42:41 -04:00
#ifndef COMPRESSION_H
#define COMPRESSION_H
2025-04-04 20:34:24 -04:00
2025-04-23 00:09:35 -04:00
#include <QtGlobal>
#ifdef Q_OS_WIN
#include "QtZlib/zlib.h"
#else
#include <zlib.h>
#endif
2025-04-04 20:34:24 -04:00
#include <stddef.h>
#include <QByteArray>
#include <QVector>
#include <QCryptographicHash>
2025-04-04 20:42:41 -04:00
enum OodleFormat {
LZH = 0,
LZHLW = 1,
LZNIB = 2,
FormatNone = 3,
LZB16 = 4,
LZBLW = 5,
LZA = 6,
LZNA = 7,
Kraken = 8,
Mermaid = 9,
BitKnit = 10,
Selkie = 11,
Hydra = 12,
Leviathan = 13
};
2025-04-04 20:34:24 -04:00
2025-04-04 20:42:41 -04:00
enum OodleCompressionLevel {
LevelNone = 0,
SuperFast = 1,
VeryFast = 2,
Fast = 3,
Normal = 4,
Optimal1 = 5,
Optimal2 = 6,
Optimal3 = 7,
Optimal4 = 8,
Optimal5 = 9
};
2025-04-04 20:34:24 -04:00
2025-04-04 20:42:41 -04:00
typedef int (*OodleLZ_CompressFunc)(OodleFormat Format, std::byte *Buffer, long BufferSize, std::byte *OutputBuffer, OodleCompressionLevel Level, uint a, uint b, uint c);
typedef int (__stdcall *OodleLZ_DecompressFunc)(
const void *compBuf,
int64_t compBufSize,
void *rawBuf,
int64_t rawLen,
uint32_t fuzzSafe,
uint32_t checkCRC,
uint32_t verbosity,
void *decBufBase,
size_t decBufSize,
void *fpCallback,
void *callbackUserData,
void *decoderMemory,
size_t decoderMemorySize,
int threadPhase
);
2025-04-04 20:34:24 -04:00
2025-04-04 20:42:41 -04:00
class Compression {
public:
// QuickBMS path configuration
static void setQuickBmsPath(const QString &path);
static QString quickBmsPath();
2025-04-23 00:09:35 -04:00
static quint32 CalculateAdler32Checksum(const QByteArray &data);
2025-04-04 20:42:41 -04:00
static QByteArray DecompressZLIB(const QByteArray &aCompressedData);
static QByteArray DecompressZlibAuto(const QByteArray &aCompressedData);
static qint64 FindZlibOffset(const QByteArray &bytes);
static QByteArray StripHashBlocks(const QByteArray &raw,
int dataChunkSize = 0x200000,
int hashChunkSize = 0x2000);
2025-04-04 20:42:41 -04:00
static QByteArray CompressZLIB(const QByteArray &aData);
static QByteArray CompressZLIBWithSettings(const QByteArray &aData,
int aCompressionLevel = Z_BEST_COMPRESSION,
int aWindowBits = MAX_WBITS,
int aMemLevel = 8,
int aStrategy = Z_DEFAULT_STRATEGY,
const QByteArray &aDictionary = {});
static QByteArray DecompressDeflate(const QByteArray &aCompressedData);
static QByteArray CompressDeflate(const QByteArray &aData);
static QByteArray CompressDeflateWithSettings(const QByteArray &aData,
2025-04-23 00:09:35 -04:00
int aCompressionLevel = Z_BEST_COMPRESSION,
int aWindowBits = MAX_WBITS,
int aMemLevel = 8,
int aStrategy = Z_DEFAULT_STRATEGY,
const QByteArray &aDictionary = {});
2025-04-04 20:42:41 -04:00
static QByteArray DecompressLZO(const QByteArray &aCompressedData, quint32 aDestSize);
2025-04-04 20:42:41 -04:00
static QByteArray DecompressOodle(const QByteArray &aCompressedData, quint32 aDecompressedSize);
static QByteArray CompressOodle(const QByteArray &aData);
2025-04-23 00:09:35 -04:00
static QByteArray CompressXMem(const QByteArray &data);
static QByteArray DecompressXMem(const QByteArray &data, int flags = 0, int windowSize = 0x20000, int partSize = 0x80000);
// Dead Rising LZX: 8-byte header (u32 uncompressed_size BE + u32 block_size BE) + raw LZX payload
static QByteArray DecompressDeadRisingLZX(const QByteArray &data);
2025-04-04 20:42:41 -04:00
private:
static quint32 pGetOodleCompressedBounds(quint32 aBufferSize);
static QByteArray pCompressOodle(QByteArray aBuffer, quint32 aBufferSize, quint32 aOutputBufferSize,
OodleFormat aformat, OodleCompressionLevel alevel);
static QByteArray pDecompressOodle(const QByteArray &aBuffer, quint32 aBufferSize, quint32 aOutputBufferSize);
// XMem format-specific decompression helpers
static QByteArray DecompressXMemNative(const QByteArray &data);
static QByteArray DecompressXMemTDecode(const QByteArray &data, int flags, int windowSize, int partSize);
static QByteArray DecompressXMemRaw(const QByteArray &data, int flags, int windowSize, int partSize);
static QString s_quickBmsPath;
2025-04-04 20:34:24 -04:00
};
2025-04-04 20:42:41 -04:00
#endif // COMPRESSION_H