summaryrefslogtreecommitdiff
path: root/include/egg/core/eggStreamDecomp.h
blob: d17a69b80309fd7161ed9151df6a983025795f01 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#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