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