00001 #ifndef __J2K__LZH__LZHLEncoder2_CPP__
00002 #define __J2K__LZH__LZHLEncoder2_CPP__
00003
00004 void LZHLEncoder::_callStat() {
00005 nextStat = 2;
00006
00007 _put( NHUFFSYMBOLS - 2 );
00008
00009 int groups[ 16 ];
00010 stat->calcStat( groups );
00011
00012 int lastNBits = 0;
00013
00014 for( int i=0; i < 16 ; ++i ) {
00015 int nBits = groups[ i ];
00016 assert( nBits >= lastNBits && nBits <= 8 );
00017 int delta = nBits - lastNBits;
00018 lastNBits = nBits;
00019 _putBits( delta + 1, 1 );
00020 }
00021 }
00022
00023 void LZHLEncoder::putRaw( const BYTE* src, size_t sz ) {
00024 for( const BYTE* srcEnd = src + sz; src < srcEnd ; ++src ) {
00025 _put( *src );
00026 }
00027 }
00028
00029 void LZHLEncoder::putMatch( const BYTE* src, size_t nRaw, size_t matchOver, size_t disp )
00030 {
00031 assert( nRaw <= maxRaw );
00032 assert( matchOver <= maxMatchOver );
00033 assert( disp >= 0 && disp < LZBUFSIZE );
00034 putRaw( src, nRaw );
00035 struct MatchOverItem { int symbol; int nBits; UINT16 bits; };
00036
00037 static MatchOverItem _matchOverTable[] = {
00038 { 264, 1, 0x00 },
00039
00040 { 265, 2, 0x00 },
00041 { 265, 2, 0x02 },
00042
00043 { 266, 3, 0x00 },
00044 { 266, 3, 0x02 },
00045 { 266, 3, 0x04 },
00046 { 266, 3, 0x06 },
00047
00048 { 267, 4, 0x00 },
00049 { 267, 4, 0x02 },
00050 { 267, 4, 0x04 },
00051 { 267, 4, 0x06 },
00052 { 267, 4, 0x08 },
00053 { 267, 4, 0x0A },
00054 { 267, 4, 0x0C },
00055 { 267, 4, 0x0E },
00056 };
00057
00058 if ( matchOver < 8 ) {
00059 _put( 256 + matchOver );
00060
00061 } else if ( matchOver < 38 ) {
00062 matchOver -= 8;
00063 MatchOverItem* item = &_matchOverTable[ matchOver >> 1 ];
00064 _put( item->symbol, item->nBits, item->bits | (matchOver & 0x01) );
00065
00066 } else {
00067 matchOver -= 38;
00068 MatchOverItem* item = &_matchOverTable[ matchOver >> 5 ];
00069 _put( item->symbol + 4 );
00070 _putBits( item->nBits + 4, ( item->bits << 4 ) | (matchOver & 0x1F) );
00071 }
00072
00073 static struct DispItem { int nBits; UINT16 bits; } _dispTable[] = {
00074 #include <j2k/LZH/Table/hdisp.tbl>
00075 };
00076
00077 #if LZBUFBITS < 8
00078 #error
00079 #endif
00080
00081 DispItem* item = &_dispTable[ disp >> (LZBUFBITS - 7) ];
00082 int nBits = item->nBits + (LZBUFBITS - 7);
00083 UINT32 bits = ( ((UINT32)item->bits) << (LZBUFBITS - 7) ) | ( disp & ( ( 1 << (LZBUFBITS - 7) ) - 1 ) );
00084
00085 #if LZBUFBITS >= 15
00086 if ( nBits > 16 ) {
00087 assert( nBits <= 32 );
00088 _putBits( nBits - 16, bits >> 16 );
00089 _putBits( 16, bits & 0xFFFF );
00090
00091 } else
00092 #endif
00093
00094 {
00095 assert( nBits <= 16 );
00096 _putBits( nBits, bits );
00097 }
00098 }
00099
00100 size_t LZHLEncoder::flush() {
00101 _put( NHUFFSYMBOLS - 1 );
00102
00103 while( nBits > 0 ) {
00104 *dst++ = (BYTE)( bits >> 24 );
00105 nBits -= 8;
00106 bits <<= 8;
00107 }
00108
00109 return dst - dstBegin;
00110 }
00111
00112 #endif