//========= Copyright Valve Corporation, All rights reserved. ============// // // LZSS Codec. Designed for fast cheap gametime encoding/decoding. Compression results // are not aggresive as other alogrithms, but gets 2:1 on most arbitrary uncompressed data. // //=====================================================================================// #ifndef _LZSS_H #define _LZSS_H #pragma once #define LZSS_ID uint32( BigLong( ('L'<<24)|('Z'<<16)|('S'<<8)|('S') ) ) #define SNAPPY_ID uint32( BigLong( ('S'<<24)|('N'<<16)|('A'<<8)|('P') ) ) // bind the buffer for correct identification struct lzss_header_t { unsigned int id; unsigned int actualSize; // always little endian }; class CUtlBuffer; #define DEFAULT_LZSS_WINDOW_SIZE 4096 class CLZSS { public: unsigned char* Compress( const unsigned char *pInput, int inputlen, unsigned int *pOutputSize ); unsigned char* CompressNoAlloc( const unsigned char *pInput, int inputlen, unsigned char *pOutput, unsigned int *pOutputSize ); unsigned int Uncompress( const unsigned char *pInput, unsigned char *pOutput ); //unsigned int Uncompress( unsigned char *pInput, CUtlBuffer &buf ); unsigned int SafeUncompress( const unsigned char *pInput, unsigned char *pOutput, unsigned int unBufSize ); static bool IsCompressed( const unsigned char *pInput ); static unsigned int GetActualSize( const unsigned char *pInput ); // windowsize must be a power of two. FORCEINLINE CLZSS( int nWindowSize = DEFAULT_LZSS_WINDOW_SIZE ); private: // expected to be sixteen bytes struct lzss_node_t { const unsigned char *pData; lzss_node_t *pPrev; lzss_node_t *pNext; char empty[4]; }; struct lzss_list_t { lzss_node_t *pStart; lzss_node_t *pEnd; }; void BuildHash( const unsigned char *pData ); lzss_list_t *m_pHashTable; lzss_node_t *m_pHashTarget; int m_nWindowSize; }; FORCEINLINE CLZSS::CLZSS( int nWindowSize ) { m_nWindowSize = nWindowSize; } #endif