00001 #ifndef __J2K__LZH__LZHLEncoder_CPP__ 00002 #define __J2K__LZH__LZHLEncoder_CPP__ 00003 00004 inline LZHLEncoder::LZHLEncoder( LZHLEncoderStat* stat_, BYTE* dst_ ) 00005 : stat( stat_ ), 00006 sstat( stat_->stat ), 00007 nextStat( stat_->nextStat ), 00008 dst( dst_ ), 00009 dstBegin( dst_ ), 00010 bits( 0 ), 00011 nBits( 0 ) 00012 { } 00013 00014 inline LZHLEncoder::~LZHLEncoder() { } 00015 00016 inline void LZHLEncoder::_putBits( int codeBits, UINT32 code ) { 00017 assert( codeBits <= 16 ); 00018 bits |= ( code << ( 32 - nBits - codeBits ) ); 00019 nBits += codeBits; 00020 00021 if ( nBits >= 16 ) { 00022 *dst++ = (BYTE)( bits >> 24 ); 00023 *dst++ = (BYTE)( bits >> 16 ); 00024 00025 nBits -= 16; 00026 bits <<= 16; 00027 } 00028 } 00029 00030 inline void LZHLEncoder::_put( UINT16 symbol ) { 00031 assert( symbol < NHUFFSYMBOLS ); 00032 00033 if ( --nextStat <= 0 ) { 00034 _callStat(); 00035 } 00036 00037 ++sstat[ symbol ]; 00038 00039 LZHLEncoderStat::Symbol* item = &stat->symbolTable[ symbol ]; 00040 assert( item->nBits >= 0 ); 00041 00042 _putBits( item->nBits, item->code ); 00043 } 00044 00045 inline void LZHLEncoder::_put( UINT16 symbol, int codeBits, UINT32 code ) { 00046 assert( symbol < NHUFFSYMBOLS ); 00047 assert( codeBits <= 4 ); 00048 00049 if ( --nextStat <= 0 ) { 00050 _callStat(); 00051 } 00052 00053 ++sstat[ symbol ]; 00054 00055 LZHLEncoderStat::Symbol* item = &stat->symbolTable[ symbol ]; 00056 assert( item->nBits >= 0 ); 00057 00058 int nBits = item->nBits; 00059 _putBits( nBits + codeBits, ( item->code << codeBits ) | code ); 00060 } 00061 00062 #endif