#ifndef COMPRES_SMOL #define COMPRES_SMOL #include #include #include #include #include #include #include #include #include #include "fileDispatcher.h" #include "tANS.h" #define OVERWORLD_16X16 256 #define OVERWORLD_32X32 1024 #define TANS_TABLE_SIZE 64 #define LO_CONTINUE_BIT 0x80 #define LO_LOW_BITS_MASK 0x7f #define LO_NUM_LOW_BITS 0x7 #define BYTE_MASK 0xff #define SHORT_MASK 0xffff #define NIBBLE_MASK 0xf #define NUM_SHORT_BITS 0xf #define LENGTH_MOD_MASK 0xf #define INITIAL_STATE_MASK 0x3f #define MODE_MASK 0x1f #define IMAGE_SIZE_MASK 0x3fff #define IMAGE_SIZE_OFFSET 4 #define SYM_SIZE_MASK 0x3fff #define SYM_SIZE_OFFSET 18 #define BITSTREAM_SIZE_MASK 0x1fff #define BITSTREAM_SIZE_OFFSET 6 #define LO_SIZE_MASK 0x1fff #define LO_SIZE_OFFSET 19 #define IMAGE_SIZE_MODIFIER 4 enum CompressionMode { LZ77 = 0, BASE_ONLY = 1, ENCODE_SYMS = 2, ENCODE_DELTA_SYMS = 3, ENCODE_LO = 4, ENCODE_BOTH = 5, ENCODE_BOTH_DELTA_SYMS = 6, IS_FRAME_CONTAINER = 7, IS_TILEMAP = 8, }; struct ShortCopy { size_t index; size_t length; size_t offset; unsigned short firstSymbol; ShortCopy(size_t index, size_t length, size_t offset, unsigned short firstSymbol); }; struct ShortCompressionInstruction { size_t length; size_t offset; size_t index; unsigned short firstSymbol; std::vector loBytes; std::vector symShorts; void buildBytes(std::vector *pInput); }; struct CompressedImage { std::string fileName; CompressionMode mode; size_t lzSize; size_t loSize; size_t symSize; size_t bitreamSize = 0; size_t rawNumBytes; int initialState; std::vector headers; unsigned int loFreqs[3]; unsigned int symFreqs[3]; size_t compressedSize; bool isValid = false; std::vector writeVec; std::vector tANSbits; std::vector otherBits; std::vector symVec; std::vector loVec; }; struct InputSettings { bool canEncodeLO = true; bool canEncodeSyms = true; bool canDeltaSyms = true; bool useFrames = false; InputSettings(); InputSettings(bool canEncodeLO, bool canEncodeSyms, bool canDeltaSyms); }; struct DataVecs { std::vector loVec; std::vector symVec; }; CompressedImage processImage(std::string fileName, InputSettings settings); CompressedImage processImageFrames(std::string fileName, InputSettings settings); bool processImageData(std::vector *pInput, CompressedImage *pImage, InputSettings settings, std::string fileName); bool readFileAsUInt(std::string filePath, std::vector *pFileData); bool getShortCopies(std::vector *pInput, size_t minLength, std::vector *pShortCopies); bool verifyShortCopies(std::vector *pCopies, std::vector *pImage); std::vector getNormalizedCounts(std::vector input); std::vector getFreqWriteInts(std::vector input); std::vector getNewHeaders(CompressionMode mode, size_t imageSize, size_t symLength, int initialState, size_t bitstreamSize, size_t loLength); int findInitialState(EncodeCol *encodeCol, unsigned char firstSymbol); bool fillCompressVec(std::vector *pLoVec, std::vector *pSymVec, CompressionMode mode, size_t imageBytes, std::string name, CompressedImage *pOutput); bool getShortInstructions(std::vector *pCopies, std::vector *pInstructions, std::vector *pInput); void getLosFromInstructions(std::vector *pInstructions, std::vector *pOutput); void getSymsFromInstructions(std::vector *pInstructions, std::vector *pOutput); std::vector unpackFrequencies(unsigned int pInts[3]); void readNewHeader(std::vector *pInput, CompressedImage *pOutput); void getUIntVecFromData(CompressedImage *pImage, std::vector *pOutput); std::vector decodeBytesShort(std::vector *pLoVec, std::vector *pSymVec); std::vector decodeImageShort(CompressedImage *pInput); DataVecs decodeDataVectorsNew(CompressedImage *pInput); bool compareVectorsShort(std::vector *pVec1, std::vector *pVec2); bool verifyCompressionShort(CompressedImage *pInput, std::vector *pImage); bool verifyBytesShort(std::vector *pLoVec, std::vector *pSymVec, std::vector *pImage); void readRawDataVecs(std::vector *pInput, std::vector *pOutput); bool isModeLoEncoded(CompressionMode mode); bool isModeSymEncoded(CompressionMode mode); bool isModeSymDelta(CompressionMode mode); void deltaEncode(std::vector *buffer, int length); void deltaDecode(std::vector *buffer, int length); std::vector getTestFreqs(std::vector freqs, std::string name); #endif