2018-10-07 03:42:33 +00:00
|
|
|
#pragma once
|
2015-08-23 23:58:07 +00:00
|
|
|
|
2019-09-23 19:00:23 +00:00
|
|
|
#include <memory>
|
|
|
|
|
|
|
|
#include "Runtime/GCNTypes.hpp"
|
|
|
|
|
|
|
|
#include <athena/IStreamReader.hpp>
|
|
|
|
#include <athena/IStreamWriter.hpp>
|
|
|
|
#include <athena/MemoryReader.hpp>
|
|
|
|
#include <athena/MemoryWriter.hpp>
|
2019-05-10 04:09:01 +00:00
|
|
|
#ifdef URDE_ZIP_INPUT_STREAM
|
2015-08-23 23:58:07 +00:00
|
|
|
#include <zlib.h>
|
2019-05-10 04:09:01 +00:00
|
|
|
#endif
|
2015-08-23 23:58:07 +00:00
|
|
|
|
2021-04-10 08:42:06 +00:00
|
|
|
namespace metaforce {
|
2016-03-04 23:04:53 +00:00
|
|
|
using CInputStream = athena::io::IStreamReader;
|
|
|
|
using COutputStream = athena::io::IStreamWriter;
|
2015-08-23 23:58:07 +00:00
|
|
|
|
2018-12-08 05:30:43 +00:00
|
|
|
struct CBitStreamReader : athena::io::MemoryReader {
|
|
|
|
u32 x1c_val = 0;
|
|
|
|
u32 x20_bitOffset = 0;
|
|
|
|
|
2016-03-19 19:19:43 +00:00
|
|
|
public:
|
2019-07-20 04:27:21 +00:00
|
|
|
static constexpr u32 GetBitCount(u32 maxVal) {
|
2018-12-08 05:30:43 +00:00
|
|
|
u32 ret = 0;
|
|
|
|
while (maxVal != 0) {
|
|
|
|
maxVal /= 2;
|
|
|
|
ret++;
|
2016-03-19 19:19:43 +00:00
|
|
|
}
|
|
|
|
|
2018-12-08 05:30:43 +00:00
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
CBitStreamReader(const void* data, atUint64 length) : MemoryReader(data, length) {}
|
2016-03-19 19:19:43 +00:00
|
|
|
|
2018-12-08 05:30:43 +00:00
|
|
|
s32 ReadEncoded(u32 key);
|
2016-03-15 23:44:59 +00:00
|
|
|
};
|
|
|
|
|
2018-12-08 05:30:43 +00:00
|
|
|
class CBitStreamWriter : public athena::io::MemoryWriter {
|
|
|
|
u32 x14_val = 0;
|
|
|
|
u32 x18_bitOffset = 0x20;
|
|
|
|
|
2016-03-20 04:10:29 +00:00
|
|
|
public:
|
2019-07-20 04:27:21 +00:00
|
|
|
static constexpr u32 GetBitCount(u32 maxVal) { return CBitStreamReader::GetBitCount(maxVal); }
|
2016-03-20 04:10:29 +00:00
|
|
|
|
2020-04-11 23:23:25 +00:00
|
|
|
explicit CBitStreamWriter(atUint8* data = nullptr, atUint64 length = 0x10) : MemoryWriter(data, length) {}
|
2016-03-20 04:10:29 +00:00
|
|
|
|
2018-12-08 05:30:43 +00:00
|
|
|
void WriteEncoded(u32 val, u32 bitCount);
|
2017-02-04 03:46:12 +00:00
|
|
|
|
2018-12-08 05:30:43 +00:00
|
|
|
void Flush();
|
2017-02-04 03:46:12 +00:00
|
|
|
|
2019-08-09 12:45:18 +00:00
|
|
|
~CBitStreamWriter() override { Flush(); }
|
2016-03-20 04:10:29 +00:00
|
|
|
};
|
|
|
|
|
2016-03-04 23:04:53 +00:00
|
|
|
using CMemoryInStream = athena::io::MemoryReader;
|
2016-09-25 16:45:22 +00:00
|
|
|
using CMemoryOutStream = athena::io::MemoryWriter;
|
2015-08-23 23:58:07 +00:00
|
|
|
|
2019-05-10 04:09:01 +00:00
|
|
|
#ifdef URDE_ZIP_INPUT_STREAM
|
2018-12-08 05:30:43 +00:00
|
|
|
class CZipInputStream : public CInputStream {
|
|
|
|
std::unique_ptr<u8[]> x24_compBuf;
|
|
|
|
std::unique_ptr<CInputStream> x28_strm;
|
|
|
|
z_stream x30_zstrm = {};
|
|
|
|
|
2015-08-23 23:58:07 +00:00
|
|
|
public:
|
2020-04-11 23:23:25 +00:00
|
|
|
explicit CZipInputStream(std::unique_ptr<CInputStream>&& strm);
|
2019-08-09 12:45:18 +00:00
|
|
|
~CZipInputStream() override;
|
|
|
|
atUint64 readUBytesToBuf(void* buf, atUint64 len) override;
|
|
|
|
void seek(atInt64, athena::SeekOrigin) override {}
|
|
|
|
atUint64 position() const override { return 0; }
|
|
|
|
atUint64 length() const override { return 0; }
|
2015-08-23 23:58:07 +00:00
|
|
|
};
|
2019-05-10 04:09:01 +00:00
|
|
|
#endif
|
2015-08-23 23:58:07 +00:00
|
|
|
|
2021-04-10 08:42:06 +00:00
|
|
|
} // namespace metaforce
|