"L. Spiro Engine"
|
00001 00017 #ifndef __LSC_ZLIB_H__ 00018 #define __LSC_ZLIB_H__ 00019 00020 #include "../LSCCompressionLib.h" 00021 #include "../BitStream/LSCBitStream.h" 00022 #include "Streams/LSSTDExternalByteStream.h" 00023 #include "Vector/LSTLVectorPoD.h" 00024 00025 namespace lsc { 00026 00034 class CZLib { 00035 public : 00036 // == Various constructors. 00037 LSE_CALLCTOR CZLib(); 00038 00039 00040 // == Types. 00044 typedef CVectorPoD<LSUINT8, LSUINT32, 0xFFFFUL> 00045 LSC_ZLIB_BUFFER; 00046 00047 // == Functions. 00057 LSBOOL LSE_CALL DecodeZLib( const LSUINT8 * _pui8Buffer, LSUINTPTR _uiptrLen, 00058 LSBOOL _bSkipHeaders, LSC_ZLIB_BUFFER &_zbOut ); 00059 00060 00061 protected : 00062 // == Enumerations. 00066 enum { 00067 LSC_FAST_BITS = 9UL, 00068 LSC_MASK = (1UL << LSC_FAST_BITS) - 1UL, 00069 }; 00070 00071 00072 // == Types. 00076 typedef struct LSC_HUFFMAN { 00080 LSINT32 i32MaxCode[17]; 00081 00085 LSUINT16 ui16Fast[1UL<<LSC_FAST_BITS]; 00086 00090 LSUINT16 ui16FirstCode[16]; 00091 00095 LSUINT16 ui16FirstSymbol[16]; 00096 00100 LSUINT16 ui16Values[288]; 00101 00105 LSUINT8 ui8Size[288]; 00106 } * LPLSC_HUFFMAN, * const LPCLSC_HUFFMAN; 00107 00108 // == Members. 00112 LSUINT32 m_ui32BufferedBits; 00113 00117 LSUINT32 m_ui32TotalBitsBuffered; 00118 00122 LSC_HUFFMAN m_hLength; 00123 00127 LSC_HUFFMAN m_hDistance; 00128 00132 static LSUINT8 m_ui8DefaultLengths[288]; 00133 00137 static LSUINT8 m_ui8DefaultDistances[32]; 00138 00142 static CCriticalSection m_scCrit; 00143 00144 00145 // == Functions. 00152 LSBOOL LSE_CALL FillBits( const CExternalByteStream &_ebsStream ); 00153 00162 LSBOOL LSE_CALL Receive( const CExternalByteStream &_ebsStream, LSUINT32 _ui32Total, LSUINT32 &_ui32Return ); 00163 00170 LSBOOL LSE_CALL ComputeHuffmanCodes( const CExternalByteStream &_ebsStream ); 00171 00180 LSBOOL LSE_CALL BuildHuffman( LSC_HUFFMAN &_hHuffman, 00181 const LSUINT8 * _pui8Codes, LSUINT32 _ui32Total ); 00182 00190 LSINT32 LSE_CALL DecodeHuffman( const CExternalByteStream &_ebsStream, LSC_HUFFMAN &_hHuffman ); 00191 00199 LSBOOL LSE_CALL ParseHuffmanBlock( const CExternalByteStream &_ebsStream, LSC_ZLIB_BUFFER &_zbOut ); 00200 00208 LSBOOL LSE_CALL ParseUncompressed( const CExternalByteStream &_ebsStream, LSC_ZLIB_BUFFER &_zbOut ); 00209 00216 static LSBOOL LSE_CALL CheckHeader( const CExternalByteStream &_ebsStream ); 00217 00225 static LSBOOL LSE_CALL ReadUi8( const CExternalByteStream &_ebsStream, LSUINT8 &_ui8Dst ); 00226 00234 static LSE_INLINE LSUINT16 LSE_CALL 00235 ReverseBits( LSUINT16 _ui16ReverseMe, LSUINT32 _ui32Shift ); 00236 00240 static LSVOID LSE_CALL SetDefaults(); 00241 }; 00242 00243 00244 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 00245 // DEFINITIONS 00246 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 00247 // == Functions. 00255 LSE_INLINE LSUINT16 LSE_CALL CZLib::ReverseBits( LSUINT16 _ui16ReverseMe, LSUINT32 _ui32Shift ) { 00256 return static_cast<LSUINT16>(CStd::BitSwap16( _ui16ReverseMe ) >> (16 - _ui32Shift)); 00257 } 00258 00259 } // namespace lsc 00260 00261 #endif // __LSC_ZLIB_H__