-
Notifications
You must be signed in to change notification settings - Fork 78
/
Copy pathBitstream.hpp
58 lines (47 loc) · 1.45 KB
/
Bitstream.hpp
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
#pragma once
#include "../Shared/D2Shared.hpp"
/*
* Bitstreams are used for both DCCs and networking.
* Based partially on id Tech 4's bitstreams.
* @author eezstreet
*/
class Bitstream
{
public:
Bitstream();
~Bitstream();
void LoadStream(BYTE* pNewStream, size_t dwStreamSizeBytes);
void SplitFrom(Bitstream* pSplitStream, size_t dwSplitStreamSizeBits);
void SetCurrentPosition(DWORD dwPosition, DWORD dwBitOffset = 0);
void ReadByte(BYTE& outByte);
void ReadWord(WORD& outWord);
void ReadDWord(DWORD& outWord);
void ReadBits(BYTE& outBits, int bitCount);
void ReadBits(WORD& outBits, int bitCount);
void ReadBits(DWORD& outBits, int bitCount);
void ReadByte(BYTE* outByte);
void ReadWord(WORD* outWord);
void ReadDWord(DWORD* outWord);
void ReadBits(BYTE* outBits, int bitCount);
void ReadBits(WORD* outBits, int bitCount);
void ReadBits(DWORD* outBits, int bitCount);
void ReadBits(void* outBits, size_t outSize, int bitCount);
void ReadData(void* data, size_t outSize);
// Helper function - convert from unsigned to 2C
void ConvertFormat(long* dwOutBits, int bitCount);
void Rewind();
size_t GetRemainingReadBits();
BYTE* GetHeldData(size_t& outSize);
void Align();
private:
int ReadBits(int bitsCount);
void FreeInternalStreamSource();
bool bExternalStorage;
BYTE* pStream;
size_t dwStreamStartByte;
size_t dwStreamStartBit;
size_t dwTotalStreamSizeBytes;
size_t dwTotalStreamSizeBits;
size_t dwCurrentByte;
size_t dwReadBit;
};