1*f6dc9357SAndroid Build Coastguard Worker // LzhDecoder.h 2*f6dc9357SAndroid Build Coastguard Worker 3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_COMPRESS_LZH_DECODER_H 4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_COMPRESS_LZH_DECODER_H 5*f6dc9357SAndroid Build Coastguard Worker 6*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/MyCom.h" 7*f6dc9357SAndroid Build Coastguard Worker 8*f6dc9357SAndroid Build Coastguard Worker #include "../ICoder.h" 9*f6dc9357SAndroid Build Coastguard Worker 10*f6dc9357SAndroid Build Coastguard Worker #include "../Common/InBuffer.h" 11*f6dc9357SAndroid Build Coastguard Worker 12*f6dc9357SAndroid Build Coastguard Worker #include "BitmDecoder.h" 13*f6dc9357SAndroid Build Coastguard Worker #include "HuffmanDecoder.h" 14*f6dc9357SAndroid Build Coastguard Worker #include "LzOutWindow.h" 15*f6dc9357SAndroid Build Coastguard Worker 16*f6dc9357SAndroid Build Coastguard Worker namespace NCompress { 17*f6dc9357SAndroid Build Coastguard Worker namespace NLzh { 18*f6dc9357SAndroid Build Coastguard Worker namespace NDecoder { 19*f6dc9357SAndroid Build Coastguard Worker 20*f6dc9357SAndroid Build Coastguard Worker const unsigned kMatchMinLen = 3; 21*f6dc9357SAndroid Build Coastguard Worker const unsigned kMatchMaxLen = 256; 22*f6dc9357SAndroid Build Coastguard Worker const unsigned NC = 256 + kMatchMaxLen - kMatchMinLen + 1; 23*f6dc9357SAndroid Build Coastguard Worker const unsigned NUM_CODE_BITS = 16; 24*f6dc9357SAndroid Build Coastguard Worker const unsigned NUM_DIC_BITS_MAX = 25; 25*f6dc9357SAndroid Build Coastguard Worker const unsigned NT = NUM_CODE_BITS + 3; 26*f6dc9357SAndroid Build Coastguard Worker const unsigned NP = NUM_DIC_BITS_MAX + 1; 27*f6dc9357SAndroid Build Coastguard Worker const unsigned NPT = NP; // Max(NT, NP) 28*f6dc9357SAndroid Build Coastguard Worker 29*f6dc9357SAndroid Build Coastguard Worker class CCoder 30*f6dc9357SAndroid Build Coastguard Worker { 31*f6dc9357SAndroid Build Coastguard Worker CLzOutWindow _outWindow; 32*f6dc9357SAndroid Build Coastguard Worker NBitm::CDecoder<CInBuffer> _inBitStream; 33*f6dc9357SAndroid Build Coastguard Worker 34*f6dc9357SAndroid Build Coastguard Worker int _symbolT; 35*f6dc9357SAndroid Build Coastguard Worker int _symbolC; 36*f6dc9357SAndroid Build Coastguard Worker UInt32 DictSize; 37*f6dc9357SAndroid Build Coastguard Worker // bool FinishMode; 38*f6dc9357SAndroid Build Coastguard Worker 39*f6dc9357SAndroid Build Coastguard Worker NHuffman::CDecoder256<NUM_CODE_BITS, NPT, 7> _decoderT; 40*f6dc9357SAndroid Build Coastguard Worker NHuffman::CDecoder<NUM_CODE_BITS, NC, 10> _decoderC; 41*f6dc9357SAndroid Build Coastguard Worker 42*f6dc9357SAndroid Build Coastguard Worker class CCoderReleaser 43*f6dc9357SAndroid Build Coastguard Worker { 44*f6dc9357SAndroid Build Coastguard Worker CCoder *_coder; 45*f6dc9357SAndroid Build Coastguard Worker public: CCoderReleaser(CCoder * coder)46*f6dc9357SAndroid Build Coastguard Worker CCoderReleaser(CCoder *coder): _coder(coder) {} Disable()47*f6dc9357SAndroid Build Coastguard Worker void Disable() { _coder = NULL; } ~CCoderReleaser()48*f6dc9357SAndroid Build Coastguard Worker ~CCoderReleaser() { if (_coder) _coder->_outWindow.Flush(); } 49*f6dc9357SAndroid Build Coastguard Worker }; 50*f6dc9357SAndroid Build Coastguard Worker friend class CCoderReleaser; 51*f6dc9357SAndroid Build Coastguard Worker 52*f6dc9357SAndroid Build Coastguard Worker bool ReadTP(unsigned num, unsigned numBits, int spec); 53*f6dc9357SAndroid Build Coastguard Worker bool ReadC(); 54*f6dc9357SAndroid Build Coastguard Worker 55*f6dc9357SAndroid Build Coastguard Worker HRESULT CodeReal(UInt32 outSize, ICompressProgressInfo *progress); 56*f6dc9357SAndroid Build Coastguard Worker public: CCoder()57*f6dc9357SAndroid Build Coastguard Worker CCoder(): DictSize(1 << 16) 58*f6dc9357SAndroid Build Coastguard Worker // , FinishMode(true) 59*f6dc9357SAndroid Build Coastguard Worker {} SetDictSize(UInt32 dictSize)60*f6dc9357SAndroid Build Coastguard Worker void SetDictSize(UInt32 dictSize) { DictSize = dictSize; } GetInputProcessedSize()61*f6dc9357SAndroid Build Coastguard Worker UInt64 GetInputProcessedSize() const { return _inBitStream.GetProcessedSize(); } 62*f6dc9357SAndroid Build Coastguard Worker HRESULT Code(ISequentialInStream *inStream, ISequentialOutStream *outStream, 63*f6dc9357SAndroid Build Coastguard Worker UInt32 outSize, ICompressProgressInfo *progress); 64*f6dc9357SAndroid Build Coastguard Worker }; 65*f6dc9357SAndroid Build Coastguard Worker 66*f6dc9357SAndroid Build Coastguard Worker }}} 67*f6dc9357SAndroid Build Coastguard Worker 68*f6dc9357SAndroid Build Coastguard Worker #endif 69