mirror of
https://github.com/elasota/Aerofoil.git
synced 2025-09-23 14:53:52 +00:00
This commit contains only the result of `git add --renormalize .` `git show --ignore-space-change` can verify that this commit only changes whitespace.
66 lines
1.6 KiB
C++
66 lines
1.6 KiB
C++
#pragma once
|
|
|
|
#include "IDecompressor.h"
|
|
#include "BWT.h"
|
|
|
|
|
|
class StuffItArsenicDecompressor : public IDecompressor
|
|
{
|
|
public:
|
|
StuffItArsenicDecompressor();
|
|
~StuffItArsenicDecompressor() override;
|
|
|
|
bool Reset(CSInputBuffer *reader, size_t compressedSize, size_t decompressedSize) override;
|
|
bool ReadBytes(void *dest, size_t numBytes) override;
|
|
|
|
private:
|
|
struct ArithmeticSymbol
|
|
{
|
|
int symbol;
|
|
int frequency;
|
|
};
|
|
|
|
struct ArithmeticModel
|
|
{
|
|
int totalfrequency;
|
|
int increment;
|
|
int frequencylimit;
|
|
|
|
int numsymbols;
|
|
ArithmeticSymbol symbols[128];
|
|
};
|
|
|
|
struct ArithmeticDecoder
|
|
{
|
|
CSInputBuffer *input;
|
|
int range, code;
|
|
};
|
|
|
|
ArithmeticModel initialmodel, selectormodel, mtfmodel[7];
|
|
ArithmeticDecoder decoder;
|
|
MTFState mtf;
|
|
|
|
int blockbits, blocksize;
|
|
uint8_t *block;
|
|
bool endofblocks;
|
|
|
|
int numbytes, bytecount, transformindex;
|
|
uint32_t *transform;
|
|
|
|
int randomized, randcount, randindex;
|
|
|
|
int repeat, count, last;
|
|
|
|
uint32_t crc, compcrc;
|
|
|
|
static void ResetArithmeticModel(ArithmeticModel *model);
|
|
static void InitializeArithmeticModel(ArithmeticModel *model, int firstsymbol, int lastsymbol, int increment, int frequencylimit);
|
|
static void IncreaseArithmeticModelFrequency(ArithmeticModel *model, int symindex);
|
|
static bool InitializeArithmeticDecoder(ArithmeticDecoder *decoder, CSInputBuffer *input);
|
|
static bool ReadNextArithmeticCode(ArithmeticDecoder *decoder, int symlow, int symsize, int symtot);
|
|
static bool NextArithmeticSymbol(ArithmeticDecoder *decoder, ArithmeticModel *model, int &outSym);
|
|
static bool NextArithmeticBitString(ArithmeticDecoder *decoder, ArithmeticModel *model, int bits, int &outBitString);
|
|
|
|
bool ReadBlock();
|
|
};
|