metaforce/Runtime/IOStreams.hpp

74 lines
1.7 KiB
C++
Raw Normal View History

2018-10-07 03:42:33 +00:00
#pragma once
2015-08-23 23:58:07 +00:00
2016-04-11 07:10:28 +00:00
#include "GCNTypes.hpp"
2016-03-04 23:04:53 +00:00
#include <athena/IStreamReader.hpp>
#include <athena/IStreamWriter.hpp>
#include <athena/MemoryReader.hpp>
2016-04-11 07:10:28 +00:00
#include <athena/MemoryWriter.hpp>
2015-08-23 23:58:07 +00:00
#include <zlib.h>
2016-03-04 23:04:53 +00:00
namespace urde
2015-08-23 23:58:07 +00:00
{
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
2017-02-04 03:46:12 +00:00
struct CBitStreamReader : athena::io::MemoryReader
{
2016-03-19 19:19:43 +00:00
u32 x1c_val = 0;
u32 x20_bitOffset = 0;
public:
static u32 GetBitCount(u32 maxVal)
2016-03-19 19:19:43 +00:00
{
u32 ret = 0;
2016-03-20 04:10:29 +00:00
while (maxVal != 0)
2016-03-19 19:19:43 +00:00
{
2016-03-20 04:10:29 +00:00
maxVal /= 2;
2016-03-19 19:19:43 +00:00
ret++;
}
return ret;
}
CBitStreamReader(const void* data, atUint64 length)
2017-02-06 03:21:58 +00:00
: MemoryReader(data, length) {}
2016-03-19 19:19:43 +00:00
s32 ReadEncoded(u32 key);
};
2017-02-04 03:46:12 +00:00
class CBitStreamWriter : public athena::io::MemoryWriter
2016-03-20 04:10:29 +00:00
{
u32 x14_val = 0;
2017-02-06 03:21:58 +00:00
u32 x18_bitOffset = 0x20;
2016-03-20 04:10:29 +00:00
public:
2017-02-06 03:21:58 +00:00
static inline u32 GetBitCount(u32 maxVal) { return CBitStreamReader::GetBitCount(maxVal); }
2016-03-20 04:10:29 +00:00
CBitStreamWriter(atUint8* data = nullptr, atUint64 length=0x10)
2017-02-06 03:21:58 +00:00
: MemoryWriter(data, length) {}
2016-03-20 04:10:29 +00:00
void WriteEncoded(u32 val, u32 bitCount);
2017-02-04 03:46:12 +00:00
void Flush();
~CBitStreamWriter() { Flush(); }
2016-03-20 04:10:29 +00:00
};
2016-03-04 23:04:53 +00:00
using CMemoryInStream = athena::io::MemoryReader;
using CMemoryOutStream = athena::io::MemoryWriter;
2015-08-23 23:58:07 +00:00
class CZipInputStream : public CInputStream
{
std::unique_ptr<u8[]> x24_compBuf;
std::unique_ptr<CInputStream> x28_strm;
z_stream x30_zstrm = {};
public:
CZipInputStream(std::unique_ptr<CInputStream>&& strm);
~CZipInputStream();
atUint64 readUBytesToBuf(void *buf, atUint64 len);
2016-03-04 23:04:53 +00:00
void seek(atInt64, athena::SeekOrigin) {}
2015-08-23 23:58:07 +00:00
atUint64 position() const {return 0;}
atUint64 length() const {return 0;}
};
}