Deflater.inl
上传用户:wymy58
上传日期:2007-01-07
资源大小:2086k
文件大小:5k
源码类别:

DirextX编程

开发平台:

Visual C++

  1. // Copyright (C) 1999 DXGuide.  All Rights Reserved.
  2. // File: Deflater.inl
  3. // Inlines for CDeflater
  4. // Index within the heap array of least frequent node in the Huffman tree
  5. #define SMALLEST 1
  6. // Remove the smallest element from the heap and recreate the
  7. // heap with one less element. Updates heap and m_nHeapLen.
  8. inline void CDeflater::pqremove(ct_data*  pTree, int&  top)
  9. {
  10. top = m_aHuffmanHeap[SMALLEST];
  11. m_aHuffmanHeap[SMALLEST] = m_aHuffmanHeap[m_nHeapLen --];
  12. pqdownheap(pTree, SMALLEST);
  13. }
  14. // Send a code of the given tree. c and tree must not have side effects
  15. inline void CDeflater::TreeSendCode(int  c, const ct_data*  pTree)
  16. {
  17. TRACE1("ncd %3d ", c);
  18. TreeSendBits(pTree[c].m_wCode, pTree[c].m_wLen);
  19. }
  20. // In order to simplify the code, particularly on 16 bit
  21. // machines, match distances are limited to MAX_DIST
  22. // instead of WSIZE.
  23. inline UINT CDeflater::MAX_DIST(void)
  24. {
  25. return  m_uLZ77WindowSize - MIN_LOOKAHEAD;
  26. }
  27. // Update a hash value with the given input byte
  28. // IN assertion: all calls to to UpdateHash are made with
  29. // consecutive input characters, so that a running hash key
  30. // can be computed from the previous key instead of complete
  31. // recalculation each time.
  32. inline void CDeflater::UpdateHash(BYTE  c)
  33. {
  34. m_uInsHashIndex = ((m_uInsHashIndex << m_uHashShift) ^ c) & (m_uHashSize - 1);
  35. }
  36. // Insert string str in the dictionary and set uMatchHead to
  37. // the previous head of the hash chain (the most recent string
  38. // with same hash key). Return the previous length of the hash
  39. // chain. If this file is compiled with -DFASTEST, the
  40. // compression level is forced to 1, and no hash chains are
  41. // maintained.
  42. // IN  assertion: all calls to to InsertString are made with
  43. // consecutive input characters and the first MIN_MATCH bytes
  44. // of str are valid (except for the last MIN_MATCH - 1 bytes
  45. // of the input file).
  46. inline Pos CDeflater::InsertString(UINT  uStrStart)
  47. {
  48. UpdateHash(m_pSlidingWindow[uStrStart + (MIN_MATCH - 1)]);
  49. Pos wMatchHeadPos = 
  50. #ifndef FASTEST
  51. m_pPrevStringPos[uStrStart & m_uLZ77WindowMask] =
  52. #endif // !FASTEST
  53. m_pHashChainsHeadPos[m_uInsHashIndex];
  54. m_pHashChainsHeadPos[m_uInsHashIndex] = Pos(uStrStart);
  55. return  wMatchHeadPos;
  56. }
  57. // Put a short in the pending buffer. The 16-bit value is put
  58. // in MSB order.
  59. // IN assertion: the stream state is correct and there is
  60. // enough room in m_pPendingBuf.
  61. inline void CDeflater::PutShortMSB(WORD  w)
  62. {
  63. m_pPendingBuf[m_uPendingBytes ++] = (BYTE)(w >> 8);
  64. m_pPendingBuf[m_uPendingBytes ++] = (BYTE)(w & 0xFF);
  65. }
  66. // Output a short LSB first on the stream.
  67. // IN assertion: there is enough room in pendingBuf.
  68. inline void CDeflater::PutShortLSB(WORD  w)
  69. {
  70. m_pPendingBuf[m_uPendingBytes ++] = (BYTE)(w & 0xFF);
  71. m_pPendingBuf[m_uPendingBytes ++] = (BYTE)(w >> 8);
  72. }
  73. // Mapping from a distance to a distance code. dist is the
  74. // distance - 1 and must not have side effects.
  75. // _dist_code[256] and _dist_code[257] are never used.
  76. inline BYTE CDeflater::GetDistCode(UINT  uDist)
  77. {
  78. return  (uDist < 256) ? _dist_code[uDist] : _dist_code[256 + (uDist >> 7)];
  79. }
  80. // Flush the current block, with given end-of-file flag.
  81. // IN assertion: m_uStrStart is set to the end of the current match.
  82. inline void CDeflater::FlushBlock(bool  bEof)
  83. {
  84. TreeFlushBlock(
  85. (m_lBlockStartPos >= 0L ?
  86. &m_pSlidingWindow[m_lBlockStartPos] : NULL),
  87. (DWORD)((long)m_uStrStart - m_lBlockStartPos),
  88. bEof);
  89. m_lBlockStartPos = m_uStrStart;
  90. FlushPending();
  91. TRACE0("[FLUSH]n");
  92. }
  93. inline bool CDeflater::TreeTallyLit(BYTE  c)
  94. {
  95. TRACE1("%c", c);
  96. #ifndef _DEBUG
  97. m_pwDistBuf[m_uLastLitLenBufIndex] = 0;
  98. m_pLitLenBuf[m_uLastLitLenBufIndex ++] = c;
  99. m_aDynLiterTree[c].m_wFreq ++;
  100. return  (m_uLastLitLenBufIndex == m_uLitLenBufSize - 1);
  101. #else // _DEBUG
  102. return  TreeTally(0, c);
  103. #endif // !_DEBUG
  104. }
  105. inline bool CDeflater::TreeTallyDist(WORD  wDist, BYTE  byteLen)
  106. {
  107. #ifndef _DEBUG
  108. m_pwDistBuf[m_uLastLitLenBufIndex] = wDist;
  109. m_pLitLenBuf[m_uLastLitLenBufIndex++] = byteLen;
  110. wDist --;
  111. m_aDynLiterTree[_length_code[byteLen] + LITERALS + 1].m_wFreq++;
  112. m_aDynDistTree[GetDistCode(wDist)].m_wFreq++;
  113. return  (m_uLastLitLenBufIndex == m_uLitLenBufSize - 1);
  114. #else // _DEBUG
  115. return  TreeTally(wDist, byteLen);
  116. #endif // !_DEBUG
  117. }
  118. inline DWORD CDeflater::GetTotalIn(void) const
  119. {
  120. return  m_dwTotalInputBytes;
  121. }
  122. inline DWORD CDeflater::GetTotalOut(void) const
  123. {
  124. return  m_dwTotalOutputBytes;
  125. }
  126. // Returns the CRC-32 checksum of the uncompressed entry data, or -1 if not known.
  127. inline DWORD CDeflater::GetAdler32(void) const
  128. {
  129. return  m_checksum.GetValue();
  130. }
  131. // Sets input data for compression. This should be called
  132. // whenever NeedsInput() returns true indicating that more
  133. // input data is required.
  134. inline void CDeflater::SetInput(const void*  pBuf, UINT  uLen)
  135. {
  136. ASSERT(pBuf != NULL && uLen > 0);
  137. m_pSourceBuf = (const BYTE*)pBuf;
  138. m_uSourceBufLen = uLen;
  139. }
  140. // Returns true if the input data buffer is empty and
  141. // setInput() should be called in order to provide more input.
  142. inline bool CDeflater::NeedsInput(void) const
  143. {
  144. return  (m_uSourceBufLen == 0);
  145. }