deflateencoder.h
来自「由7-zip提供的压缩、解压缩程序」· C头文件 代码 · 共 211 行
H
211 行
// DeflateEncoder.h#ifndef __DEFLATE_ENCODER_H#define __DEFLATE_ENCODER_H#include "Common/MyCom.h"#include "../../ICoder.h"#include "../../Common/LSBFEncoder.h"#include "../LZ/IMatchFinder.h"#include "../Huffman/HuffmanEncoder.h"#include "DeflateConst.h"namespace NCompress {namespace NDeflate {namespace NEncoder {struct CCodeValue{ UInt16 Len; UInt16 Pos; void SetAsLiteral() { Len = (1 << 15); } bool IsLiteral() const { return ((Len & (1 << 15)) != 0); }};struct COptimal{ UInt32 Price; UInt16 PosPrev; UInt16 BackPrev;};const UInt32 kNumOptsBase = 1 << 12;const UInt32 kNumOpts = kNumOptsBase + kMatchMaxLen;class CCoder;struct CTables: public CLevels{ bool UseSubBlocks; bool StoreMode; bool StaticMode; UInt32 BlockSizeRes; UInt32 m_Pos; void InitStructures();};class CCoder{ CMyComPtr<IMatchFinder> m_MatchFinder; NStream::NLSBF::CEncoder m_OutStream;public: CCodeValue *m_Values; UInt16 *m_MatchDistances; UInt32 m_NumFastBytes; UInt16 *m_OnePosMatchesMemory; UInt16 *m_DistanceMemory; UInt32 m_Pos; int m_NumPasses; int m_NumDivPasses; bool m_CheckStatic; bool m_IsMultiPass; UInt32 m_ValueBlockSize; UInt32 m_NumLenCombinations; UInt32 m_MatchMaxLen; const Byte *m_LenStart; const Byte *m_LenDirectBits; bool m_Created; bool m_Deflate64Mode; NCompression::NHuffman::CEncoder MainCoder; NCompression::NHuffman::CEncoder DistCoder; NCompression::NHuffman::CEncoder LevelCoder; Byte m_LevelLevels[kLevelTableSize]; int m_NumLitLenLevels; int m_NumDistLevels; UInt32 m_NumLevelCodes; UInt32 m_ValueIndex; bool m_SecondPass; UInt32 m_AdditionalOffset; UInt32 m_OptimumEndIndex; UInt32 m_OptimumCurrentIndex; Byte m_LiteralPrices[256]; Byte m_LenPrices[kNumLenSymbolsMax]; Byte m_PosPrices[kDistTableSize64]; CLevels m_NewLevels; UInt32 BlockSizeRes; CTables *m_Tables; COptimal m_Optimum[kNumOpts]; UInt32 m_MatchFinderCycles; IMatchFinderSetNumPasses *m_SetMfPasses; void GetMatches(); void MovePos(UInt32 num); UInt32 Backward(UInt32 &backRes, UInt32 cur); UInt32 GetOptimal(UInt32 &backRes); void CodeLevelTable(NStream::NLSBF::CEncoder *outStream, const Byte *levels, int numLevels); void MakeTables(); UInt32 GetLzBlockPrice(); void TryBlock(bool staticMode); UInt32 TryDynBlock(int tableIndex, UInt32 numPasses); UInt32 TryFixedBlock(int tableIndex); void SetPrices(const CLevels &levels); void WriteBlock(); void WriteDynBlock(bool finalBlock); void WriteFixedBlock(bool finalBlock); HRESULT Create(); void Free(); void WriteStoreBlock(UInt32 blockSize, UInt32 additionalOffset, bool finalBlock); void WriteTables(bool writeMode, bool finalBlock); void WriteBlockData(bool writeMode, bool finalBlock); void ReleaseStreams() { // m_MatchFinder.ReleaseStream(); m_OutStream.ReleaseStream(); } class CCoderReleaser { CCoder *m_Coder; public: CCoderReleaser(CCoder *coder): m_Coder(coder) {} ~CCoderReleaser() { m_Coder->ReleaseStreams(); } }; friend class CCoderReleaser; UInt32 GetBlockPrice(int tableIndex, int numDivPasses); void CodeBlock(int tableIndex, bool finalBlock);public: CCoder(bool deflate64Mode = false); ~CCoder(); HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream, const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress); HRESULT BaseCode(ISequentialInStream *inStream, ISequentialOutStream *outStream, const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress); // ICompressSetCoderProperties HRESULT BaseSetEncoderProperties2(const PROPID *propIDs, const PROPVARIANT *properties, UInt32 numProperties);};///////////////////////////////////////////////////////////////class CCOMCoder : public ICompressCoder, public ICompressSetCoderProperties, public CMyUnknownImp, public CCoder{public: MY_UNKNOWN_IMP1(ICompressSetCoderProperties) CCOMCoder(): CCoder(false) {}; STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream, const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress); // ICompressSetCoderProperties STDMETHOD(SetCoderProperties)(const PROPID *propIDs, const PROPVARIANT *properties, UInt32 numProperties);};class CCOMCoder64 : public ICompressCoder, public ICompressSetCoderProperties, public CMyUnknownImp, public CCoder{public: MY_UNKNOWN_IMP1(ICompressSetCoderProperties) CCOMCoder64(): CCoder(true) {}; STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream, const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress); // ICompressSetCoderProperties STDMETHOD(SetCoderProperties)(const PROPID *propIDs, const PROPVARIANT *properties, UInt32 numProperties);};}}}#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?