📄 zdeflate_8cpp-source.html
字号:
<a name="l00170"></a>00170 bits--;<a name="l00171"></a>00171 codeBits[tree[i].symbol] = bits;<a name="l00172"></a>00172 blCount[bits]--;<a name="l00173"></a>00173 }<a name="l00174"></a>00174 assert(blCount[bits] == 0);<a name="l00175"></a>00175 }<a name="l00176"></a>00176 <a name="l00177"></a><a class="code" href="class_huffman_encoder.html#58cdf24aadeaea994f01164e7dea0a3d">00177</a> <span class="keywordtype">void</span> <a class="code" href="class_huffman_encoder.html#58cdf24aadeaea994f01164e7dea0a3d">HuffmanEncoder::Initialize</a>(<span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> *codeBits, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nCodes)<a name="l00178"></a>00178 {<a name="l00179"></a>00179 assert(nCodes > 0);<a name="l00180"></a>00180 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> maxCodeBits = *max_element(codeBits, codeBits+nCodes);<a name="l00181"></a>00181 <span class="keywordflow">if</span> (maxCodeBits == 0)<a name="l00182"></a>00182 <span class="keywordflow">return</span>; <span class="comment">// assume this object won't be used</span><a name="l00183"></a>00183 <a name="l00184"></a>00184 <a class="code" href="class_sec_block_with_hint.html" title="a SecBlock that preallocates size S statically, and uses the heap when this size...">SecBlockWithHint<unsigned int, 15+1></a> blCount(maxCodeBits+1);<a name="l00185"></a>00185 fill(blCount.<a class="code" href="class_sec_block.html#11a05906688172579cd3520816799446">begin</a>(), blCount.<a class="code" href="class_sec_block.html#26d88ba73b5da0f5dd4ab87ce6345d8f">end</a>(), 0);<a name="l00186"></a>00186 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i;<a name="l00187"></a>00187 <span class="keywordflow">for</span> (i=0; i<nCodes; i++)<a name="l00188"></a>00188 blCount[codeBits[i]]++;<a name="l00189"></a>00189 <a name="l00190"></a>00190 <a class="code" href="class_huffman_encoder.html#61375c364cc2b5f0d3b877afe8762606">code_t</a> code = 0;<a name="l00191"></a>00191 <a class="code" href="class_sec_block_with_hint.html" title="a SecBlock that preallocates size S statically, and uses the heap when this size...">SecBlockWithHint<code_t, 15+1></a> nextCode(maxCodeBits+1);<a name="l00192"></a>00192 nextCode[1] = 0;<a name="l00193"></a>00193 <span class="keywordflow">for</span> (i=2; i<=maxCodeBits; i++)<a name="l00194"></a>00194 {<a name="l00195"></a>00195 code = (code + blCount[i-1]) << 1;<a name="l00196"></a>00196 nextCode[i] = code;<a name="l00197"></a>00197 }<a name="l00198"></a>00198 assert(maxCodeBits == 1 || code == (1 << maxCodeBits) - blCount[maxCodeBits]);<a name="l00199"></a>00199 <a name="l00200"></a>00200 <a class="code" href="class_huffman_encoder.html#100511c8332005139f009b63f828d19e">m_valueToCode</a>.<a class="code" href="class_sec_block.html#f9e98d3f4a7af1156fcf3e6e68f4ae5a" title="change size and preserve contents">resize</a>(nCodes);<a name="l00201"></a>00201 <span class="keywordflow">for</span> (i=0; i<nCodes; i++)<a name="l00202"></a>00202 {<a name="l00203"></a>00203 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> len = <a class="code" href="class_huffman_encoder.html#100511c8332005139f009b63f828d19e">m_valueToCode</a>[i].len = codeBits[i];<a name="l00204"></a>00204 <span class="keywordflow">if</span> (len != 0)<a name="l00205"></a>00205 <a class="code" href="class_huffman_encoder.html#100511c8332005139f009b63f828d19e">m_valueToCode</a>[i].code = BitReverse(nextCode[len]++) >> (8*<span class="keyword">sizeof</span>(<a class="code" href="class_huffman_encoder.html#61375c364cc2b5f0d3b877afe8762606">code_t</a>)-len);<a name="l00206"></a>00206 }<a name="l00207"></a>00207 }<a name="l00208"></a>00208 <a name="l00209"></a><a class="code" href="class_huffman_encoder.html#32d5acf1928d57fcd5bdb1b7f7a76f29">00209</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="class_huffman_encoder.html#32d5acf1928d57fcd5bdb1b7f7a76f29">HuffmanEncoder::Encode</a>(<a class="code" href="class_low_first_bit_writer.html" title="_">LowFirstBitWriter</a> &writer, <a class="code" href="class_huffman_encoder.html#434191dc5346a9c25a2365bc7da564ad">value_t</a> value)<span class="keyword"> const</span><a name="l00210"></a>00210 <span class="keyword"></span>{<a name="l00211"></a>00211 assert(<a class="code" href="class_huffman_encoder.html#100511c8332005139f009b63f828d19e">m_valueToCode</a>[value].len > 0);<a name="l00212"></a>00212 writer.<a class="code" href="class_low_first_bit_writer.html#8554aa2126e1236fbcf8956ef98664bc">PutBits</a>(<a class="code" href="class_huffman_encoder.html#100511c8332005139f009b63f828d19e">m_valueToCode</a>[value].code, <a class="code" href="class_huffman_encoder.html#100511c8332005139f009b63f828d19e">m_valueToCode</a>[value].len);<a name="l00213"></a>00213 }<a name="l00214"></a>00214 <a name="l00215"></a><a class="code" href="class_deflator.html#ee81a8ccc99647834b079bbcb70e4027">00215</a> <a class="code" href="class_deflator.html#ee81a8ccc99647834b079bbcb70e4027">Deflator::Deflator</a>(<a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a> *attachment, <span class="keywordtype">int</span> deflateLevel, <span class="keywordtype">int</span> log2WindowSize, <span class="keywordtype">bool</span> detectUncompressible)<a name="l00216"></a>00216 : <a class="code" href="class_low_first_bit_writer.html" title="_">LowFirstBitWriter</a>(attachment)<a name="l00217"></a>00217 {<a name="l00218"></a>00218 <a class="code" href="class_deflator.html#f443cc93b1d40e7226d7b4002e2f3f5a">InitializeStaticEncoders</a>();<a name="l00219"></a>00219 <a class="code" href="class_deflator.html#c9f545b8062a7e822e537364ef422111">IsolatedInitialize</a>(MakeParameters(<span class="stringliteral">"DeflateLevel"</span>, deflateLevel)(<span class="stringliteral">"Log2WindowSize"</span>, log2WindowSize)(<span class="stringliteral">"DetectUncompressible"</span>, detectUncompressible));<a name="l00220"></a>00220 }<a name="l00221"></a>00221 <a name="l00222"></a><a class="code" href="class_deflator.html#c8cc60904628ddbd604458c2fbf15632">00222</a> <a class="code" href="class_deflator.html#ee81a8ccc99647834b079bbcb70e4027">Deflator::Deflator</a>(<span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html" title="interface for retrieving values given their names">NameValuePairs</a> &parameters, <a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a> *attachment)<a name="l00223"></a>00223 : <a class="code" href="class_low_first_bit_writer.html" title="_">LowFirstBitWriter</a>(attachment)<a name="l00224"></a>00224 {<a name="l00225"></a>00225 <a class="code" href="class_deflator.html#f443cc93b1d40e7226d7b4002e2f3f5a">InitializeStaticEncoders</a>();<a name="l00226"></a>00226 <a class="code" href="class_deflator.html#c9f545b8062a7e822e537364ef422111">IsolatedInitialize</a>(parameters);<a name="l00227"></a>00227 }<a name="l00228"></a>00228 <a name="l00229"></a><a class="code" href="class_deflator.html#f443cc93b1d40e7226d7b4002e2f3f5a">00229</a> <span class="keywordtype">void</span> <a class="code" href="class_deflator.html#f443cc93b1d40e7226d7b4002e2f3f5a">Deflator::InitializeStaticEncoders</a>()<a name="l00230"></a>00230 {<a name="l00231"></a>00231 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> codeLengths[288];<a name="l00232"></a>00232 fill(codeLengths + 0, codeLengths + 144, 8);<a name="l00233"></a>00233 fill(codeLengths + 144, codeLengths + 256, 9);<a name="l00234"></a>00234 fill(codeLengths + 256, codeLengths + 280, 7);<a name="l00235"></a>00235 fill(codeLengths + 280, codeLengths + 288, 8);<a name="l00236"></a>00236 <a class="code" href="class_deflator.html#f98457df799bd1bfabcbff9a64ee313b">m_staticLiteralEncoder</a>.<a class="code" href="class_huffman_encoder.html#58cdf24aadeaea994f01164e7dea0a3d">Initialize</a>(codeLengths, 288);<a name="l00237"></a>00237 fill(codeLengths + 0, codeLengths + 32, 5);<a name="l00238"></a>00238 <a class="code" href="class_deflator.html#3ca3308982b779fb60d9d3b6b10f0d02">m_staticDistanceEncoder</a>.<a class="code" href="class_huffman_encoder.html#58cdf24aadeaea994f01164e7dea0a3d">Initialize</a>(codeLengths, 32);<a name="l00239"></a>00239 }<a name="l00240"></a>00240 <a name="l00241"></a><a class="code" href="class_deflator.html#c9f545b8062a7e822e537364ef422111">00241</a> <span class="keywordtype">void</span> <a class="code" href="class_deflator.html#c9f545b8062a7e822e537364ef422111">Deflator::IsolatedInitialize</a>(<span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html" title="interface for retrieving values given their names">NameValuePairs</a> &parameters)<a name="l00242"></a>00242 {<a name="l00243"></a>00243 <span class="keywordtype">int</span> log2WindowSize = parameters.<a class="code" href="class_name_value_pairs.html#7ddb654b7afcd1a04422a7b4b01366d9" title="get a named value with type int, with default">GetIntValueWithDefault</a>(<span class="stringliteral">"Log2WindowSize"</span>, <a class="code" href="class_deflator.html#650e1e1af3a80e1b042fe28ca427ff00255f7554f69a861bf69bf40c2ad79334">DEFAULT_LOG2_WINDOW_SIZE</a>);<a name="l00244"></a>00244 <span class="keywordflow">if</span> (!(<a class="code" href="class_deflator.html#650e1e1af3a80e1b042fe28ca427ff00dc9d5f12cda39d4a4303af54e21a65c8">MIN_LOG2_WINDOW_SIZE</a> <= log2WindowSize && log2WindowSize <= <a class="code" href="class_deflator.html#650e1e1af3a80e1b042fe28ca427ff002ad5ee7b41a04c975a32e721641754d8">MAX_LOG2_WINDOW_SIZE</a>))<a name="l00245"></a>00245 <span class="keywordflow">throw</span> <a class="code" href="class_invalid_argument.html" title="exception thrown when an invalid argument is detected">InvalidArgument</a>(<span class="stringliteral">"Deflator: "</span> + IntToString(log2WindowSize) + <span class="stringliteral">" is an invalid window size"</span>);<a name="l00246"></a>00246 <a name="l00247"></a>00247 <a class="code" href="class_deflator.html#844bd3068fb0eab4d8248a09dea9cbec">m_log2WindowSize</a> = log2WindowSize;<a name="l00248"></a>00248 <a class="code" href="class_deflator.html#cbb3318729a2a96a2d957c36c7dcd158">DSIZE</a> = 1 << <a class="code" href="class_deflator.html#844bd3068fb0eab4d8248a09dea9cbec">m_log2WindowSize</a>;<a name="l00249"></a>00249 <a class="code" href="class_deflator.html#bc8dd3d3c28d9b188dd1c19510294a0b">DMASK</a> = <a class="code" href="class_deflator.html#cbb3318729a2a96a2d957c36c7dcd158">DSIZE</a> - 1;<a name="l00250"></a>00250 <a class="code" href="class_deflator.html#c94920fbb6c4b08bafa4ec541b9f0239">HSIZE</a> = 1 << <a class="code" href="class_deflator.html#844bd3068fb0eab4d8248a09dea9cbec">m_log2WindowSize</a>;<a name="l00251"></a>00251 <a class="code" href="class_deflator.html#dc06bdafc7a354d1665bf141e3ddc9cc">HMASK</a> = <a class="code" href="class_deflator.html#c94920fbb6c4b08bafa4ec541b9f0239">HSIZE</a> - 1;<a name="l00252"></a>00252 <a class="code" href="class_deflator.html#3d899c14cdac6972d8128c32befe3c1a">m_byteBuffer</a>.<a class="code" href="class_sec_block.html#90d46e577c951d81a2d25a4742a3e979" title="change size, without preserving contents">New</a>(2*<a class="code" href="class_deflator.html#cbb3318729a2a96a2d957c36c7dcd158">DSIZE</a>);<a name="l00253"></a>00253 <a class="code" href="class_deflator.html#e72ff240bd264f77f2099c71966fdbf5">m_head</a>.<a class="code" href="class_sec_block.html#90d46e577c951d81a2d25a4742a3e979" title="change size, without preserving contents">New</a>(<a class="code" href="class_deflator.html#c94920fbb6c4b08bafa4ec541b9f0239">HSIZE</a>);<a name="l00254"></a>00254 <a class="code" href="class_deflator.html#ad7bfe8bebc06108c48f08d96e1f88f2">m_prev</a>.<a class="code" href="class_sec_block.html#90d46e577c951d81a2d25a4742a3e979" title="change size, without preserving contents">New</a>(<a class="code" href="class_deflator.html#cbb3318729a2a96a2d957c36c7dcd158">DSIZE</a>);<a name="l00255"></a>00255 <a class="code" href="class_deflator.html#6e0546190e94863417f0ad86bf91834e">m_matchBuffer</a>.<a class="code" href="class_sec_block.html#90d46e577c951d81a2d25a4742a3e979" title="change size, without preserving contents">New</a>(<a class="code" href="class_deflator.html#cbb3318729a2a96a2d957c36c7dcd158">DSIZE</a>/2);<a name="l00256"></a>00256 <a class="code" href="class_deflator.html#7976eb754f823f093846a3ba3c0733d7">Reset</a>(<span class="keyword">true</span>);<a name="l00257"></a>00257 <a name="l00258"></a>00258 <a class="code" href="class_deflator.html#5b19de812080b7b12d0a6cc974f60b33" title="this function can be used to set the deflate level in the middle of compression">SetDeflateLevel</a>(parameters.<a class="code" href="class_name_value_pairs.html#7ddb654b7afcd1a04422a7b4b01366d9" title="get a named value with type int, with default">GetIntValueWithDefault</a>(<span class="stringliteral">"DeflateLevel"</span>, <a class="code" href="class_deflator.html#bf8d4e262511aa0fac24a2a5f808c6df88190923f9a4afb1e3e43daa3aaf32c9">DEFAULT_DEFLATE_LEVEL</a>));<a name="l00259"></a>00259 <span class="keywordtype">bool</span> detectUncompressible = parameters.<a class="code" href="class_name_value_pairs.html#943b2009297783f1c35bae46efc3b5f7" title="get a named value, returns the default if the name doesn't exist">GetValueWithDefault</a>(<span class="stringliteral">"DetectUncompressible"</span>, <span class="keyword">true</span>);<a name="l00260"></a>00260 <a class="code" href="class_deflator.html#e1a3ffe221fd4460b6d8f477fb386029">m_compressibleDeflateLevel</a> = detectUncompressible ? <a class="code" href="class_deflator.html#028cf53ff50d3bdd7ce3b8823fb01036">m_deflateLevel</a> : 0;<a name="l00261"></a>00261 }<a name="l00262"></a>00262 <a name="l00263"></a><a class="code" href="class_deflator.html#7976eb754f823f093846a3ba3c0733d7">00263</a> <span class="keywordtype">void</span> <a class="code" href="class_deflator.html#7976eb754f823f093846a3ba3c0733d7">Deflator::Reset</a>(<span class="keywordtype">bool</span> forceReset)<a name="l00264"></a>00264 {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -