📄 zdeflate_8cpp-source.html
字号:
00558 <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> *end, 00559 <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> *& p, 00560 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> &extraBits, 00561 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> &extraBitsLength)00562 {00563 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> v = *p;00564 <span class="keywordflow">if</span> ((end-p) >= 3)00565 {00566 <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> *oldp = p;00567 <span class="keywordflow">if</span> (v==0 && p[1]==0 && p[2]==0)00568 {00569 <span class="keywordflow">for</span> (p=p+3; p!=end && *p==0 && p!=oldp+138; p++) {}00570 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> repeat = p - oldp;00571 <span class="keywordflow">if</span> (repeat <= 10)00572 {00573 extraBits = repeat-3;00574 extraBitsLength = 3;00575 <span class="keywordflow">return</span> 17;00576 }00577 <span class="keywordflow">else</span>00578 {00579 extraBits = repeat-11;00580 extraBitsLength = 7;00581 <span class="keywordflow">return</span> 18;00582 }00583 }00584 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (p!=begin && v==p[-1] && v==p[1] && v==p[2])00585 {00586 <span class="keywordflow">for</span> (p=p+3; p!=end && *p==v && p!=oldp+6; p++) {}00587 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> repeat = p - oldp;00588 extraBits = repeat-3;00589 extraBitsLength = 2;00590 <span class="keywordflow">return</span> 16;00591 }00592 }00593 p++;00594 extraBits = 0;00595 extraBitsLength = 0;00596 <span class="keywordflow">return</span> v;00597 }00598 00599 <span class="keywordtype">void</span> Deflator::EncodeBlock(<span class="keywordtype">bool</span> eof, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> blockType)00600 {00601 PutBits(eof, 1);00602 PutBits(blockType, 2);00603 00604 <span class="keywordflow">if</span> (blockType == STORED)00605 {00606 assert(m_blockStart + m_blockLength <= m_byteBuffer.<a class="code" href="class_sec_block.html#_sec_block_with_hinta13">size</a>());00607 FlushBitBuffer();00608 <a class="code" href="class_filter.html#_zlib_decompressora8">AttachedTransformation</a>()-><a class="code" href="class_buffered_transformation.html#_zlib_decompressorz1_2">PutWord16</a>(m_blockLength, LITTLE_ENDIAN_ORDER);00609 <a class="code" href="class_filter.html#_zlib_decompressora8">AttachedTransformation</a>()-><a class="code" href="class_buffered_transformation.html#_zlib_decompressorz1_2">PutWord16</a>(~m_blockLength, LITTLE_ENDIAN_ORDER);00610 <a class="code" href="class_filter.html#_zlib_decompressora8">AttachedTransformation</a>()-><a class="code" href="class_buffered_transformation.html#_zlib_decompressorz1_0">Put</a>(m_byteBuffer + m_blockStart, m_blockLength);00611 }00612 <span class="keywordflow">else</span>00613 {00614 <span class="keywordflow">if</span> (blockType == DYNAMIC)00615 {00616 <span class="preprocessor">#if defined(_MSC_VER) && !defined(__MWERKS__)</span>00617 <span class="preprocessor"></span> <span class="comment">// VC60 workaround: built-in reverse_iterator has two template parameters, Dinkumware only has one</span>00618 <span class="keyword">typedef</span> reverse_bidirectional_iterator<unsigned int *, unsigned int> RevIt;00619 <span class="preprocessor">#else</span>00620 <span class="preprocessor"></span> <span class="keyword">typedef</span> reverse_iterator<unsigned int *> RevIt;00621 <span class="preprocessor">#endif</span>00622 <span class="preprocessor"></span>00623 FixedSizeSecBlock<unsigned int, 286> literalCodeLengths;00624 FixedSizeSecBlock<unsigned int, 30> distanceCodeLengths;00625 00626 m_literalCounts[256] = 1;00627 HuffmanEncoder::GenerateCodeLengths(literalCodeLengths, 15, m_literalCounts, 286);00628 m_dynamicLiteralEncoder.<a class="code" href="class_huffman_encoder.html#_huffman_encodera2">Initialize</a>(literalCodeLengths, 286);00629 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> hlit = find_if(RevIt(literalCodeLengths.<a class="code" href="class_sec_block.html#_sec_block_with_hinta9">end</a>()), RevIt(literalCodeLengths.<a class="code" href="class_sec_block.html#_sec_block_with_hinta7">begin</a>()+257), bind2nd(not_equal_to<unsigned int>(), 0)).base() - (literalCodeLengths.<a class="code" href="class_sec_block.html#_sec_block_with_hinta7">begin</a>()+257);00630 00631 HuffmanEncoder::GenerateCodeLengths(distanceCodeLengths, 15, m_distanceCounts, 30);00632 m_dynamicDistanceEncoder.<a class="code" href="class_huffman_encoder.html#_huffman_encodera2">Initialize</a>(distanceCodeLengths, 30);00633 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> hdist = find_if(RevIt(distanceCodeLengths.<a class="code" href="class_sec_block.html#_sec_block_with_hinta9">end</a>()), RevIt(distanceCodeLengths.<a class="code" href="class_sec_block.html#_sec_block_with_hinta7">begin</a>()+1), bind2nd(not_equal_to<unsigned int>(), 0)).base() - (distanceCodeLengths.<a class="code" href="class_sec_block.html#_sec_block_with_hinta7">begin</a>()+1);00634 00635 SecBlockWithHint<unsigned int, 286+30> combinedLengths(hlit+257+hdist+1);00636 memcpy(combinedLengths, literalCodeLengths, (hlit+257)*<span class="keyword">sizeof</span>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>));00637 memcpy(combinedLengths+hlit+257, distanceCodeLengths, (hdist+1)*<span class="keyword">sizeof</span>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>));00638 00639 FixedSizeSecBlock<unsigned int, 19> codeLengthCodeCounts, codeLengthCodeLengths;00640 fill(codeLengthCodeCounts.<a class="code" href="class_sec_block.html#_sec_block_with_hinta7">begin</a>(), codeLengthCodeCounts.<a class="code" href="class_sec_block.html#_sec_block_with_hinta9">end</a>(), 0);00641 <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> *p = combinedLengths.<a class="code" href="class_sec_block.html#_sec_block_with_hinta7">begin</a>(), *begin = combinedLengths.<a class="code" href="class_sec_block.html#_sec_block_with_hinta7">begin</a>(), *end = combinedLengths.<a class="code" href="class_sec_block.html#_sec_block_with_hinta9">end</a>();00642 <span class="keywordflow">while</span> (p != end)00643 {00644 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> code, extraBits, extraBitsLength;00645 code = CodeLengthEncode(begin, end, p, extraBits, extraBitsLength);00646 codeLengthCodeCounts[code]++;00647 }00648 HuffmanEncoder::GenerateCodeLengths(codeLengthCodeLengths, 7, codeLengthCodeCounts, 19);00649 <a class="code" href="class_huffman_encoder.html">HuffmanEncoder</a> codeLengthEncoder(codeLengthCodeLengths, 19);00650 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> border[] = { <span class="comment">// Order of the bit length code lengths</span>00651 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};00652 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> hclen = 19;00653 <span class="keywordflow">while</span> (hclen > 4 && codeLengthCodeLengths[border[hclen-1]] == 0)00654 hclen--;00655 hclen -= 4;00656 00657 PutBits(hlit, 5);00658 PutBits(hdist, 5);00659 PutBits(hclen, 4);00660 00661 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i<hclen+4; i++)00662 PutBits(codeLengthCodeLengths[border[i]], 3);00663 00664 p = combinedLengths.<a class="code" href="class_sec_block.html#_sec_block_with_hinta7">begin</a>();00665 <span class="keywordflow">while</span> (p != end)00666 {00667 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> code, extraBits, extraBitsLength;00668 code = CodeLengthEncode(begin, end, p, extraBits, extraBitsLength);00669 codeLengthEncoder.<a class="code" href="class_huffman_encoder.html#_huffman_encodera3">Encode</a>(*<span class="keyword">this</span>, code);00670 PutBits(extraBits, extraBitsLength);00671 }00672 }00673 00674 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> lengthExtraBits[] = {00675 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2,00676 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0};00677 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> distanceExtraBits[] = {00678 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6,00679 7, 7, 8, 8, 9, 9, 10, 10, 11, 11,00680 12, 12, 13, 13};00681 00682 <span class="keyword">const</span> <a class="code" href="class_huffman_encoder.html">HuffmanEncoder</a> &literalEncoder = (blockType == STATIC) ? m_staticLiteralEncoder : m_dynamicLiteralEncoder;00683 <span class="keyword">const</span> <a class="code" href="class_huffman_encoder.html">HuffmanEncoder</a> &distanceEncoder = (blockType == STATIC) ? m_staticDistanceEncoder : m_dynamicDistanceEncoder;00684 00685 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i<m_matchBufferEnd; i++)00686 {00687 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> literalCode = m_matchBuffer[i].literalCode;00688 literalEncoder.<a class="code" href="class_huffman_encoder.html#_huffman_encodera3">Encode</a>(*<span class="keyword">this</span>, literalCode);00689 <span class="keywordflow">if</span> (literalCode >= 257)00690 {00691 assert(literalCode <= 285);00692 PutBits(m_matchBuffer[i].literalExtra, lengthExtraBits[literalCode-257]);00693 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> distanceCode = m_matchBuffer[i].distanceCode;00694 distanceEncoder.<a class="code" href="class_huffman_encoder.html#_huffman_encodera3">Encode</a>(*<span class="keyword">this</span>, distanceCode);00695 PutBits(m_matchBuffer[i].distanceExtra, distanceExtraBits[distanceCode]);00696 }00697 }00698 literalEncoder.<a class="code" href="class_huffman_encoder.html#_huffman_encodera3">Encode</a>(*<span class="keyword">this</span>, 256); <span class="comment">// end of block</span>00699 }00700 }00701 00702 <span class="keywordtype">void</span> Deflator::EndBlock(<span class="keywordtype">bool</span> eof)00703 {00704 <span class="keywordflow">if</span> (m_matchBufferEnd == 0 && !eof)00705 <span class="keywordflow">return</span>;00706 00707 <span class="keywordflow">if</span> (m_deflateLevel == 0)00708 EncodeBlock(eof, STORED);00709 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (m_blockLength < 128)00710 EncodeBlock(eof, STATIC);00711 <span class="keywordflow">else</span>00712 {00713 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> storedLen = 8*(m_blockLength+4) + RoundUpToMultipleOf(m_bitsBuffered+3, 8U)-m_bitsBuffered;00714 StartCounting();00715 EncodeBlock(eof, STATIC);00716 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> staticLen = FinishCounting();00717 StartCounting();00718 EncodeBlock(eof, DYNAMIC);00719 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> dynamicLen = FinishCounting();00720 00721 <span class="keywordflow">if</span> (storedLen <= staticLen && storedLen <= dynamicLen)00722 EncodeBlock(eof, STORED);00723 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (staticLen <= dynamicLen)00724 EncodeBlock(eof, STATIC);00725 <span class="keywordflow">else</span>00726 EncodeBlock(eof, DYNAMIC);00727 }00728 00729 m_matchBufferEnd = 0;00730 m_blockStart += m_blockLength;00731 m_blockLength = 0;00732 fill(m_literalCounts.<a class="code" href="class_sec_block.html#_sec_block_with_hinta7">begin</a>(), m_literalCounts.<a class="code" href="class_sec_block.html#_sec_block_with_hinta9">end</a>(), 0);00733 fill(m_distanceCounts.<a class="code" href="class_sec_block.html#_sec_block_with_hinta7">begin</a>(), m_distanceCounts.<a class="code" href="class_sec_block.html#_sec_block_with_hinta9">end</a>(), 0);00734 }00735 00736 NAMESPACE_END</pre></div><hr size="1"><address style="align: right;"><small>Generated on Tue Jul 8 23:34:28 2003 for Crypto++ by<a href="http://www.doxygen.org/index.html"><img src="doxygen.png" alt="doxygen" align="middle" border=0 > </a>1.3.2 </small></address></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -