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

DirextX编程

开发平台:

Visual C++

  1. // Form zlib 1.1.3, Copyright (C) 1995-1998 Jean-loup Gailly
  2. // Copyright (C) 1999 DXGuide.  All Rights Reserved.
  3. // File: Deflater.h
  4. #ifndef _DEFLATER__H
  5. #define _DEFLATER__H
  6. #if _MSC_VER >= 1000
  7. #pragma once
  8. #endif // _MSC_VER >= 1000
  9. //#define FASTEST
  10. //#define GEN_TREES_H
  11. //#define ASMV
  12. //#define UNALIGNED_OK
  13. //#define DUMP_BL_TREE
  14. //#define !!FORCE_STORED!!
  15. //#define FORCE_STATIC
  16. //#define TRUNCATE_BLOCK
  17. //#define USE_DICT_HEAD
  18. #include "Zlib113.h"
  19. #include "Checksum.h"
  20. // compression levels
  21. enum CompressLevel
  22. {
  23. COMPRESSLEVEL_0,
  24. COMPRESSLEVEL_1,
  25. COMPRESSLEVEL_2,
  26. COMPRESSLEVEL_3,
  27. COMPRESSLEVEL_4,
  28. COMPRESSLEVEL_5,
  29. COMPRESSLEVEL_6,
  30. COMPRESSLEVEL_7,
  31. COMPRESSLEVEL_8,
  32. COMPRESSLEVEL_9,
  33. COMPRESSLEVEL_NUM,
  34. COMPRESSLEVEL_NO_COMPRESSION = COMPRESSLEVEL_0,
  35. // Compression level for fastest compression.
  36. COMPRESSLEVEL_BEST_SPEED = COMPRESSLEVEL_1,
  37. // Compression level for best compression.
  38. COMPRESSLEVEL_BEST_COMPRESSION = COMPRESSLEVEL_NUM - 1,
  39. // Default compression level.
  40. COMPRESSLEVEL_DEFAULT_COMPRESSION = COMPRESSLEVEL_6,
  41. };
  42. // compression strategy; see Init() below for details
  43. enum CompressStrategy
  44. {
  45. STRATEGY_DEFAULT = 0,
  46. STRATEGY_FILTERED = 1,
  47. STRATEGY_HUFFMAN_ONLY = 2,
  48. };
  49. // Maximum value for memLevel in Init()
  50. #ifndef MAX_MEM_LEVEL
  51. #define MAX_MEM_LEVEL 9
  52. #endif
  53. // default memLevel
  54. #if MAX_MEM_LEVEL >= 8
  55. #define DEF_MEM_LEVEL 8
  56. #else
  57. #define DEF_MEM_LEVEL MAX_MEM_LEVEL
  58. #endif
  59. // A Pos is an index in the character window. We use
  60. // short instead of int to save space in the various tables.
  61. // IPos is used only for parameter passing.
  62. typedef WORD Pos;
  63. typedef UINT IPos;
  64. // number of length codes, not counting the special END_BLOCK code
  65. #define LENGTH_CODES 29
  66. // number of literal bytes 0..255
  67. #define LITERALS 256
  68. // number of Literal or Length codes, including the END_BLOCK code
  69. #define L_CODES (LITERALS + 1 + LENGTH_CODES)
  70. // number of distance codes
  71. #define D_CODES 30
  72. // number of codes used to transfer the bit lengths
  73. #define BL_CODES 19
  74. // maximum heap size
  75. #define LCODES_HEAP_SIZE (2 * L_CODES + 1)
  76. // All codes must not exceed MAX_BITS bits
  77. #define MAX_BITS 15
  78. // The minimum and maximum match lengths
  79. #define MIN_MATCH  3
  80. #define MAX_MATCH  258 // 255 + MIN_MATCH ?
  81. // Minimum amount of m_uLookAhead, except at the end of the
  82. // input file.
  83. // See Deflate.cpp for comments about the MIN_MATCH + 1.
  84. #define MIN_LOOKAHEAD (MAX_MATCH + MIN_MATCH + 1)
  85. // Data structure describing a single value and its code string.
  86. struct ct_data
  87. {
  88. union
  89. {
  90. WORD m_wFreq; // frequency count
  91. WORD m_wCode; // bit string
  92. };
  93. union
  94. {
  95. WORD m_wDad; // father node in Huffman tree
  96. WORD m_wLen; // length of bit string
  97. };
  98. };
  99. class CDeflater
  100. {
  101. protected:
  102. // The three kinds of block type
  103. enum BlockType
  104. {
  105. STORED_BLOCK = 0,
  106. STATIC_TREES = 1,
  107. DYN_TREES = 2
  108. };
  109. // Function prototypes.
  110. enum BlockState
  111. {
  112. BLOCKSTATE_NEEDMORE, // block not completed, need more input or more output
  113. BLOCKSTATE_BLOCKDONE, // block flush performed
  114. BLOCKSTATE_FINISHSTARTED, // finish started, need only more output at next deflate
  115. BLOCKSTATE_FINISHDONE // finish done, accept no more input or output
  116. };
  117. // Stream status
  118. enum StreamStatus
  119. {
  120. STREAMSTATE_INIT = 42,
  121. STREAMSTATE_BUSY = 113,
  122. STREAMSTATE_FINISH = 666,
  123. };
  124. #ifdef _DEBUG
  125. // Possible values of the m_DataType field
  126. enum DataType
  127. {
  128. Z_BINARY = 0,
  129. Z_ASCII = 1,
  130. Z_UNKNOWN = 2
  131. };
  132. #endif // _DEBUG
  133. public:
  134. struct static_tree_desc
  135. {
  136. const ct_data* m_pStaticTree; // static tree or NULL
  137. const int* m_pExtraBits; // extra bits for each code or NULL
  138. int m_nExtraBaseIndex; // base index for m_pExtraBits
  139. int m_nElements; // max number of elements in the tree
  140. int m_nMaxBitLength; // max bit length for the codes
  141. };
  142. struct tree_desc
  143. {
  144. int m_nMaxCode; // largest code with non zero frequency
  145. ct_data* m_pDynamicTree; // the dynamic tree
  146. static_tree_desc* m_pStaticTreeDesc; // the corresponding static tree
  147. };
  148. // Compression function. Returns the block state after the call.
  149. typedef CDeflater::BlockState (CDeflater::*compress_func)(FlushValues  flush);
  150. // Values for m_uMaxLazyMatch, m_uGoodMatchLength and m_uMaxChainLength,
  151. // depending on the desired pack level (0..9). The values
  152. // given below have been tuned to exclude worst case
  153. // performance for pathological files. Better values may be
  154. // found for specific files.
  155. struct config
  156. {
  157. WORD m_uGoodMatchLength; // reduce lazy search above this match length
  158. WORD m_uMaxLazyMatch; // do not perform lazy search above this match length
  159. WORD m_uNiceMatchLength; // quit search above this match length
  160. WORD m_uMaxChainLength;
  161. compress_func func;
  162. };
  163. public:
  164. CDeflater(void);
  165. ~CDeflater();
  166. public:
  167. ZRetVal Deflate(FlushValues  flush);
  168. // Advanced functions
  169. public:
  170. ZRetVal Init(
  171. CompressLevel  compressLevel = COMPRESSLEVEL_DEFAULT_COMPRESSION,
  172. CompressStrategy  strategy = STRATEGY_DEFAULT,
  173. int  nWindowBits = MAX_WBITS,
  174. int  nMemLevel = DEF_MEM_LEVEL,
  175. CompressMethod  compressMethod = Z_DEFLATED);
  176. ZRetVal DeflateSetDictionary(
  177. const BYTE*  pDictionary, UINT  uDictLength);
  178. ZRetVal DeflateCopy(CDeflater*  source);
  179. ZRetVal DeflateEnd(void);
  180. ZRetVal DeflateReset(void);
  181. ZRetVal DeflateParams(CompressLevel  compressLevel, CompressStrategy  strategy);
  182. protected:
  183. BlockState DeflateStored(FlushValues  flush);
  184. BlockState DeflateFast(FlushValues  flush);
  185. BlockState DeflateSlow(FlushValues  flush);
  186. void InitLongestMatchRoutines(void);
  187. void FlushPending(void);
  188. UINT ReadBuffer(BYTE*  pBuf, UINT  uSize);
  189. void FillWindow(void);
  190. protected:
  191. static UINT LongestMatch(CDeflater*  s, IPos  uCurMatchPos);
  192. #ifdef _DEBUG
  193. void CheckMatch(IPos  uStartPos, IPos  uMatchPos, int  nLength);
  194. #endif // _DEBUG
  195. protected:
  196. void TreeInitTree(void);
  197. void TreeAlign(void);
  198. bool TreeTally(UINT  uDist, UINT  lc);
  199. void TreeFlushBlock(const BYTE*  pBuf, DWORD  dwStoredLen, bool  bEof);
  200. void TreeStoredBlock(const BYTE*  pBuf, DWORD  dwStoredLen, bool  bEof);
  201. void TreeInitBlock(void);
  202. void pqdownheap(ct_data*  tree, int  k);
  203. void pqremove(ct_data*  pTree, int&  top);
  204. void TreeGenBitLen(const tree_desc*  desc);
  205. void TreeBuildTree(tree_desc*  desc);
  206. void TreeSendBits(int  nValue, // value to send
  207. int  nLength); // number of bits
  208. void TreeSendCode(int  c, const ct_data*  pTree);
  209. void TreeScanTree(ct_data*  tree, int  nMaxCode);
  210. void TreeSendTree(ct_data*  pTree, int  nMaxCode);
  211. void TreeSendAllTrees(int nLCodes, int nDCodes, int nBLCodes);
  212. int TreeBuildBLTree(void);
  213. void TreeCompressBlock(const ct_data*  pLitTree, const ct_data*  pDistTree);
  214. void BitBufWindup(void);
  215. void bi_flush(void);
  216. void CopyBlock(const BYTE*  pBuf, UINT  uLen, bool  bHeader);
  217. protected:
  218. UINT MAX_DIST(void);
  219. void UpdateHash(BYTE  c);
  220. Pos InsertString(UINT  uStrStart);
  221. void PutShortMSB(WORD  w);
  222. void PutShortLSB(WORD  w);
  223. BYTE GetDistCode(UINT  uDist);
  224. void FlushBlock(bool  bEof);
  225. bool TreeTallyLit(BYTE  c);
  226. bool TreeTallyDist(WORD  wDist, BYTE  byteLen);
  227. protected:
  228. static const config configuration_table[COMPRESSLEVEL_NUM];
  229. public:
  230. const BYTE* m_pSourceBuf; // next input byte
  231. UINT m_uSourceBufLen; // number of bytes available at m_pSourceBuf
  232. BYTE* m_pDestBuf; // next output byte should be put there
  233. UINT m_uDestBufLen; // remaining free space at m_pDestBuf
  234. public:
  235. DWORD m_dwTotalInputBytes; // total nb of input bytes read so far
  236. DWORD m_dwTotalOutputBytes; // total nb of bytes output so far
  237. protected:
  238. LPCTSTR m_lpszMsg; // last error message, NULL if no error
  239. CChecksum m_checksum; // adler32 value of the uncompressed data
  240. protected:
  241. static BYTE _dist_code[];
  242. static BYTE _length_code[];
  243. #ifdef GEN_TREES_H
  244. static void TreeStaticInit(void);
  245. static void GenTreesHeader(void);
  246. #endif // GEN_TREES_H
  247. #ifdef _DEBUG
  248. protected:
  249. DataType m_DataType; // best guess about the data type: ascii or binary
  250. void SetDataType(void);
  251. #endif // _DEBUG
  252. public:
  253. DWORD GetTotalIn(void) const;
  254. DWORD GetTotalOut(void) const;
  255. DWORD GetAdler32(void) const;
  256. void SetInput(const void*  pBuf, UINT  uLen);
  257. bool NeedsInput(void) const;
  258. protected:
  259. StreamStatus m_streamStatus; // as the name implies
  260. BYTE* m_pPendingBuf; // output still pending
  261. DWORD m_dwPendingBufSize; // size of m_pPendingBuf
  262. BYTE* m_pPendingOutPos; // next pending byte to output to the stream
  263. UINT m_uPendingBytes; // nb of bytes in the pending buffer
  264. int m_noheader; // suppress zlib header and adler32
  265. BYTE m_byteMethod; // STORED (for zip only) or DEFLATED
  266. FlushValues m_lastFlush; // value of flush param for previous deflate call
  267. UINT m_uLZ77WindowSize; // LZ77 window size (32K by default)
  268. UINT m_uLZ77WindowBits; // log2(m_uLZ77WindowSize)  (8..16)
  269. UINT m_uLZ77WindowMask; // m_uLZ77WindowSize - 1
  270. // Sliding window. Input bytes are read into the second
  271. // half of the window, and move to the first half later
  272. // to keep a dictionary of at least wSize bytes. With
  273. // this organization, matches are limited to a distance
  274. // of wSize-MAX_MATCH bytes, but this ensures that IO is
  275. // always performed with a length multiple of the block
  276. // size. Also, it limits the window size to 64K, which is
  277. // quite useful on MSDOS.
  278. // To do: use the user input buffer as sliding window.
  279. BYTE* m_pSlidingWindow;
  280. // Actual size of window: 2 * wSize, except when the user
  281. // input buffer is directly used as sliding window.
  282. DWORD m_dwWindowSize;
  283. #ifndef FASTEST
  284. // Link to older string with same hash index. To limit
  285. // the size of this array to 64K, this link is maintained
  286. // only for the last 32K strings. An index in this array
  287. // is thus a window index modulo 32K.
  288. Pos* m_pPrevStringPos;
  289. #endif // !FASTEST
  290. Pos* m_pHashChainsHeadPos; // Heads of the hash chains or NULL.
  291. UINT m_uInsHashIndex; // hash index of string to be inserted
  292. UINT m_uHashSize; // number of elements in hash table
  293. UINT m_uHashBits; // log2(m_uHashSize)
  294. // Number of bits by which m_uInsHashIndex must be
  295. // shifted at each input step. It must be such that after
  296. // MIN_MATCH steps, the oldest byte no longer takes part
  297. // in the hash key, that is:
  298. // m_uHashShift * MIN_MATCH >= m_uHashBits
  299. UINT m_uHashShift;
  300. // Window position at the beginning of the current output
  301. // block. Gets negative when the window is moved backwards.
  302. long m_lBlockStartPos;
  303. UINT m_uBestMatchLength; // length of best match
  304. IPos m_uPrevMatchPos; // previous match
  305. bool m_bMatchAvailable; // set if previous match exists
  306. UINT m_uStrStart; // start of string to insert
  307. UINT m_uMatchStart; // start of matching string
  308. UINT m_uLookAhead; // number of valid bytes ahead in window
  309. // Length of the best match at previous step. Matches
  310. // not greater than this are discarded. This is used in
  311. // the lazy match evaluation.
  312. UINT m_uPrevLength;
  313. // To speed up deflation, hash chains are never searched
  314. // beyond this length.  A higher limit improves
  315. // compression ratio but degrades the speed.
  316. UINT m_uMaxChainLength;
  317. // Attempt to find a better match only when the current
  318. // match is strictly smaller than this value. This
  319. // mechanism is used only for compression levels >= 4.
  320. // Insert new strings in the hash table only if the match
  321. // length is not greater than this length. This saves
  322. // time but degrades compression. max_insert_length is
  323. // used only for compression levels <= 3.
  324. UINT m_uMaxLazyMatch; // max_insert_length
  325. CompressLevel m_compressLevel; // compression level (1..9)
  326. CompressStrategy m_strategy; // favor or force Huffman coding
  327. // Use a faster search when the previous match is longer than this
  328. UINT m_uGoodMatchLength;
  329. // Stop searching when current match exceeds this
  330. UINT m_uNiceMatchLength;
  331. ct_data m_aDynLiterTree[LCODES_HEAP_SIZE]; // literal and length tree
  332. ct_data m_aDynDistTree[2 * D_CODES + 1]; // distance tree
  333. ct_data m_aBLTree[2 * BL_CODES + 1]; // Huffman tree for bit lengths
  334. tree_desc m_literalTreeDesc; // desc. for literal tree
  335. tree_desc m_distanceTreeDesc; // desc. for distance tree
  336. tree_desc m_bitLenTreeDesc; // desc. for bit length tree
  337. // number of codes at each bit length for an optimal tree
  338. WORD m_awBLCount[MAX_BITS + 1];
  339. int m_aHuffmanHeap[LCODES_HEAP_SIZE]; // heap used to build the Huffman trees
  340. int m_nHeapLen; // number of elements in the heap
  341. int m_nHeapMaxFreq; // element of largest frequency
  342. // The sons of heap[n] are heap[2 * n] and heap[2 * n + 1].
  343. // heap[0] is not used. The same heap array is used to build all trees.
  344. // Depth of each subtree used as tie breaker for trees of
  345. // equal frequency
  346. BYTE m_abyteDepth[LCODES_HEAP_SIZE];
  347. // buffer for literals or lengths
  348. BYTE* m_pLitLenBuf;
  349. UINT m_uLitLenBufSize;
  350. /* Size of match buffer for literals/lengths.  There are 4 reasons for
  351.      * limiting m_uLitLenBufSize to 64K:
  352.      *   - frequencies can be kept in 16 bit counters
  353.      *   - if compression is not successful for the first block, all input
  354.      *     data is still in the window so we can still emit a stored block even
  355.      *     when input comes from standard input.  (This can also be done for
  356.      *     all blocks if m_uLitLenBufSize is not greater than 32K.)
  357.      *   - if compression is not successful for a file smaller than 64K, we can
  358.      *     even emit a stored file instead of a stored block (saving 5 bytes).
  359.      *     This is applicable only for zip (not gzip or zlib).
  360.      *   - creating new Huffman trees less frequently may not provide fast
  361.      *     adaptation to changes in the input data statistics. (Take for
  362.      *     example a binary file with poorly compressible code followed by
  363.      *     a highly compressible string table.) Smaller buffer sizes give
  364.      *     fast adaptation but have of course the overhead of transmitting
  365.      *     trees more frequently.
  366.      *   - I can't count above 4
  367.      */
  368. UINT m_uLastLitLenBufIndex; // running index in m_pLitLenBuf
  369. // Buffer for distances. To simplify the code,
  370. // m_pwDistBuf and m_pLitLenBuf have the same number of
  371. // elements. To use different lengths, an extra flag
  372. // array would be necessary.
  373. WORD* m_pwDistBuf;
  374. DWORD m_dwOptiTreesBitLen; // bit length of current block with optimal trees
  375. DWORD m_dwStaticTreesBitLen; // bit length of current block with static trees
  376. UINT m_uStringMatches; // number of string matches in current block
  377. int m_nLastEOBLen; // bit length of EOB code for last block
  378. #ifdef _DEBUG
  379. DWORD m_dwCompressedLen; // total bit length of compressed file mod 2^32
  380. DWORD m_dwCompressedBitsSent; // bit length of compressed data sent mod 2^32
  381. #endif // _DEBUG
  382. // Output buffer. bits are inserted starting at the
  383. // bottom (least significant bits).
  384. WORD m_wOutputBitBuf;
  385. // Number of valid bits in m_wOutputBitBuf.  All bits
  386. // above the valid bit are always zero.
  387. int m_nValidBits;
  388. };
  389. #include "Deflater.inl"
  390. #endif // _DEFLATER__H