1*f6dc9357SAndroid Build Coastguard Worker // BitlEncoder.h -- the Least Significant Bit of byte is First 2*f6dc9357SAndroid Build Coastguard Worker 3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_BITL_ENCODER_H 4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_BITL_ENCODER_H 5*f6dc9357SAndroid Build Coastguard Worker 6*f6dc9357SAndroid Build Coastguard Worker #include "../Common/OutBuffer.h" 7*f6dc9357SAndroid Build Coastguard Worker 8*f6dc9357SAndroid Build Coastguard Worker class CBitlEncoder 9*f6dc9357SAndroid Build Coastguard Worker { 10*f6dc9357SAndroid Build Coastguard Worker COutBuffer _stream; 11*f6dc9357SAndroid Build Coastguard Worker unsigned _bitPos; 12*f6dc9357SAndroid Build Coastguard Worker Byte _curByte; 13*f6dc9357SAndroid Build Coastguard Worker public: Create(UInt32 bufSize)14*f6dc9357SAndroid Build Coastguard Worker bool Create(UInt32 bufSize) { return _stream.Create(bufSize); } SetStream(ISequentialOutStream * outStream)15*f6dc9357SAndroid Build Coastguard Worker void SetStream(ISequentialOutStream *outStream) { _stream.SetStream(outStream); } 16*f6dc9357SAndroid Build Coastguard Worker // unsigned GetBitPosition() const { return (8 - _bitPos); } GetProcessedSize()17*f6dc9357SAndroid Build Coastguard Worker UInt64 GetProcessedSize() const { return _stream.GetProcessedSize() + ((8 - _bitPos + 7) >> 3); } Init()18*f6dc9357SAndroid Build Coastguard Worker void Init() 19*f6dc9357SAndroid Build Coastguard Worker { 20*f6dc9357SAndroid Build Coastguard Worker _stream.Init(); 21*f6dc9357SAndroid Build Coastguard Worker _bitPos = 8; 22*f6dc9357SAndroid Build Coastguard Worker _curByte = 0; 23*f6dc9357SAndroid Build Coastguard Worker } Flush()24*f6dc9357SAndroid Build Coastguard Worker HRESULT Flush() 25*f6dc9357SAndroid Build Coastguard Worker { 26*f6dc9357SAndroid Build Coastguard Worker FlushByte(); 27*f6dc9357SAndroid Build Coastguard Worker return _stream.Flush(); 28*f6dc9357SAndroid Build Coastguard Worker } FlushByte()29*f6dc9357SAndroid Build Coastguard Worker void FlushByte() 30*f6dc9357SAndroid Build Coastguard Worker { 31*f6dc9357SAndroid Build Coastguard Worker if (_bitPos < 8) 32*f6dc9357SAndroid Build Coastguard Worker _stream.WriteByte(_curByte); 33*f6dc9357SAndroid Build Coastguard Worker _bitPos = 8; 34*f6dc9357SAndroid Build Coastguard Worker _curByte = 0; 35*f6dc9357SAndroid Build Coastguard Worker } WriteBits(UInt32 value,unsigned numBits)36*f6dc9357SAndroid Build Coastguard Worker void WriteBits(UInt32 value, unsigned numBits) 37*f6dc9357SAndroid Build Coastguard Worker { 38*f6dc9357SAndroid Build Coastguard Worker while (numBits > 0) 39*f6dc9357SAndroid Build Coastguard Worker { 40*f6dc9357SAndroid Build Coastguard Worker if (numBits < _bitPos) 41*f6dc9357SAndroid Build Coastguard Worker { 42*f6dc9357SAndroid Build Coastguard Worker _curByte |= (Byte)((value & ((1 << numBits) - 1)) << (8 - _bitPos)); 43*f6dc9357SAndroid Build Coastguard Worker _bitPos -= numBits; 44*f6dc9357SAndroid Build Coastguard Worker return; 45*f6dc9357SAndroid Build Coastguard Worker } 46*f6dc9357SAndroid Build Coastguard Worker numBits -= _bitPos; 47*f6dc9357SAndroid Build Coastguard Worker _stream.WriteByte((Byte)(_curByte | (value << (8 - _bitPos)))); 48*f6dc9357SAndroid Build Coastguard Worker value >>= _bitPos; 49*f6dc9357SAndroid Build Coastguard Worker _bitPos = 8; 50*f6dc9357SAndroid Build Coastguard Worker _curByte = 0; 51*f6dc9357SAndroid Build Coastguard Worker } 52*f6dc9357SAndroid Build Coastguard Worker } WriteByte(Byte b)53*f6dc9357SAndroid Build Coastguard Worker void WriteByte(Byte b) { _stream.WriteByte(b);} 54*f6dc9357SAndroid Build Coastguard Worker }; 55*f6dc9357SAndroid Build Coastguard Worker 56*f6dc9357SAndroid Build Coastguard Worker #endif 57