mirror of
https://github.com/zeldaret/ss
synced 2026-05-23 15:01:38 -04:00
115 lines
3.2 KiB
C++
115 lines
3.2 KiB
C++
#ifndef EGG_STREAM_DECOMP_H
|
|
#define EGG_STREAM_DECOMP_H
|
|
|
|
#include "common.h"
|
|
#include "rvl/CX/cx.h"
|
|
|
|
// NOTE: I put StreamDecomp stuff here. im unsure of the correct place
|
|
|
|
namespace EGG {
|
|
class StreamDecomp {
|
|
public:
|
|
/* vt 0x08 */ virtual bool init(void *pDest, u32 maxCompressedSize);
|
|
/* vt 0x0C */ virtual bool decomp(const void *pSrc, u32 len);
|
|
/* vt 0x10 */ virtual u32 getHeaderSize();
|
|
/* vt 0x14 */ virtual u32 getUncompressedSize(const void *pSrc);
|
|
|
|
public:
|
|
/* 0x04 */ void *mpDest;
|
|
/* 0x08 */ u32 mMaxCompressedSize;
|
|
};
|
|
|
|
class StreamDecompLZ : public StreamDecomp {
|
|
public:
|
|
virtual bool init(void *pDest, u32 maxCompressedSize) override;
|
|
virtual bool decomp(const void *pSrc, u32 len) override;
|
|
virtual u32 getHeaderSize() override {
|
|
return 0x20;
|
|
}
|
|
virtual u32 getUncompressedSize(const void *pSrc) override {
|
|
return CXGetUncompressedSize(pSrc);
|
|
}
|
|
|
|
public:
|
|
/* 0x0C */ CXUncompContextLZ mContext;
|
|
};
|
|
class StreamDecompRL : public StreamDecomp {
|
|
public:
|
|
virtual bool init(void *pDest, u32 maxCompressedSize) override;
|
|
virtual bool decomp(const void *pSrc, u32 len) override;
|
|
virtual u32 getHeaderSize() override {
|
|
return 0x20;
|
|
}
|
|
virtual u32 getUncompressedSize(const void *pSrc) override {
|
|
return CXGetUncompressedSize(pSrc);
|
|
}
|
|
|
|
public:
|
|
/* 0x0C */ CXUncompContextRL mContext;
|
|
};
|
|
|
|
class StreamDecompLH : public StreamDecomp {
|
|
public:
|
|
virtual bool init(void *pDest, u32 maxCompressedSize) override;
|
|
virtual bool decomp(const void *pSrc, u32 len) override;
|
|
virtual u32 getHeaderSize() override {
|
|
return 0x20;
|
|
}
|
|
virtual u32 getUncompressedSize(const void *pSrc) override {
|
|
return CXGetUncompressedSize(pSrc);
|
|
}
|
|
|
|
public:
|
|
/* 0x0C */ CXUncompContextLH mContext;
|
|
};
|
|
class StreamDecompLRC : public StreamDecomp {
|
|
public:
|
|
virtual bool init(void *pDest, u32 maxCompressedSize) override;
|
|
virtual bool decomp(const void *pSrc, u32 len) override;
|
|
virtual u32 getHeaderSize() override {
|
|
return 0x20;
|
|
}
|
|
virtual u32 getUncompressedSize(const void *pSrc) override {
|
|
return CXGetUncompressedSize(pSrc);
|
|
}
|
|
|
|
public:
|
|
/* 0x0C */ CXUncompContextLRC mContext;
|
|
};
|
|
|
|
// NON-OFFICIAL
|
|
struct UncompContextSZS {
|
|
static u32 getUncompressedSize(const void *pSrc);
|
|
void initUncompContext(void *pDest);
|
|
static s32 readHeader(u8 *pHeaderLen, s32 *pUncompSize, const u8 *src, u32 maxCompLen, s32 maxUncompSize);
|
|
s32 readUncomp(const void *pSrca, u32 len);
|
|
|
|
/* 0x00 */ u8 *mpDest;
|
|
/* 0x04 */ s32 mUncompSize;
|
|
/* 0x08 */ s32 mMaxUncompSize;
|
|
/* 0x0C */ u8 mGroupHead;
|
|
/* 0x0D */ u8 mSecondByte;
|
|
/* 0x0E */ u8 mFirstByte;
|
|
/* 0x0F */ u8 mState;
|
|
/* 0x10 */ u16 mCopySrc;
|
|
/* 0x12 */ u8 mHeaderLen;
|
|
};
|
|
|
|
class StreamDecompSZS : public StreamDecomp {
|
|
public:
|
|
virtual bool init(void *pDest, u32 maxCompressedSize) override;
|
|
virtual bool decomp(const void *pSrc, u32 len) override;
|
|
virtual u32 getHeaderSize() override {
|
|
return 0x20;
|
|
}
|
|
virtual u32 getUncompressedSize(const void *pSrc) override {
|
|
return mContext.getUncompressedSize(pSrc);
|
|
}
|
|
|
|
public:
|
|
/* 0x0C */ UncompContextSZS mContext;
|
|
};
|
|
} // namespace EGG
|
|
|
|
#endif
|