This repository has been archived on 2024-06-13. You can view files and clone it, but cannot push or open issues or pull requests.
2020-08-04 13:13:01 -04:00

69 lines
2.1 KiB
C++

//========= 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