"L. Spiro Engine"

F:/My Projects/LSEngine/Modules/LSCompressionLib/Src/ZLib/LSCZLib.h

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__
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator