/* ======================== idLZWCompressor::DecompressBlock ======================== */ void idLZWCompressor::DecompressBlock() { assert( blockIndex == blockSize ); // Make sure we've read all we can blockIndex = 0; blockSize = 0; int firstChar = -1; while( blockSize < LZW_BLOCK_SIZE - lzwCompressionData_t::LZW_DICT_SIZE ) { assert( lzwData->codeBits <= lzwCompressionData_t::LZW_DICT_BITS ); int code = ReadBits( lzwData->codeBits ); if( code == -1 ) { break; } if( oldCode == -1 ) { assert( code < 256 ); block[blockSize++] = ( uint8 )code; oldCode = code; firstChar = code; continue; } if( code >= lzwData->nextCode ) { assert( code == lzwData->nextCode ); firstChar = WriteChain( oldCode ); block[blockSize++] = ( uint8 )firstChar; } else { firstChar = WriteChain( code ); } AddToDict( oldCode, firstChar ); if( BumpBits() ) { oldCode = -1; } else { oldCode = code; } } }
/* ======================== idLZWCompressor::WriteByte ======================== */ void idLZWCompressor::WriteByte( uint8 value ) { int code = Lookup( lzwData->codeWord, value ); if ( code >= 0 ) { lzwData->codeWord = code; } else { WriteBits( lzwData->codeWord, lzwData->codeBits ); if ( !BumpBits() ) { AddToDict( lzwData->codeWord, value ); } lzwData->codeWord = value; } if ( lzwData->bytesWritten >= maxSize - ( lzwData->codeBits + lzwData->tempBits + 7 ) / 8 ) { overflowed = true; // At any point, if we can't perform an End call, then trigger an overflow return; } }