26 packBytemap (
const byte * inBuffer,
byte * outBuffer,
uint inLength);
29 unpackBytemap (
const byte * inBuffer,
byte * outBuffer,
52 byte * tempBuffer =
new byte [CFilterSize];
53 const byte * filterData = filter->
data();
55 if (unpackBytemap (CompressedData, tempBuffer,
56 CompressedLength, CFilterSize) !=
OK) {
60 for (
uint i=0; i < CFilterSize; i++) {
61 if (tempBuffer[i] != filterData[i]) {
81 CFilterSize = filter->
Size();
82 CFilterCount = filter->
Count();
83 if(filter->
data() == NULL) {
85 CompressedData = NULL;
89 CompressedLength = packBytemap (filter->
data(), tempBuf, CFilterSize);
90 CompressedData =
new byte [CompressedLength];
91 std::memcpy (CompressedData, tempBuf, CompressedLength);
112 if (CompressedLength == 0) {
113 filter->
Init(CFilterSize);
117 byte * tempBuffer =
new byte [CFilterSize];
118 if (unpackBytemap (CompressedData, tempBuffer,
119 CompressedLength, CFilterSize) !=
OK) {
123 for (
uint index=0; index < CFilterSize; index++) {
124 filter->
Set (index, tempBuffer[index]);
167 packBytemap (
const byte * inBuffer,
byte * outBuffer,
uint inLength)
169 ASSERT (inBuffer != NULL && outBuffer != NULL);
171 byte prevLiteral = 0;
172 const byte * inPtr = inBuffer;
173 byte * outPtr = outBuffer + 2;
174 byte * controlPtr = outBuffer + 1;
175 const byte * endPtr = inBuffer + inLength;
178 uint controlData = 0;
179 uint controlBits = 8;
183 #define ENCODE_CONTROL_BITS(bits) \ 184 ASSERT (bits >= 0 && bits <= 3); \ 186 controlData |= (bits << 6); \ 188 ASSERT (controlBits >= 2); \ 190 if (controlBits == 0) { \ 191 *controlPtr = controlData; \ 192 controlPtr = outPtr++; \ 200 while (inPtr < endPtr && outBytes <= inLength) {
204 const byte * pb = inPtr + 1;
205 while (pb < endPtr && *pb == value) {
217 *outPtr++ = (rle >> 24) & 255;
218 *outPtr++ = (rle >> 16) & 255;
219 *outPtr++ = (rle >> 8) & 255;
220 *outPtr++ = rle & 255;
226 }
else if (value == 0) {
230 }
else if (value == prevLiteral) {
245 controlData >>= controlBits;
246 *controlPtr = controlData;
249 if (outBytes > inLength) {
251 std::memcpy (outBuffer + 1, inBuffer, inLength);
252 return (inLength + 1);
255 #ifdef COMPRESSION_STATS 256 printf (
"Runs:%u ZeroLits:%u PrevLits:%u DiffLits: %u\n",
259 printf (
"RLE: %u -> %u (%.2f%%)\n", inLength, outBytes,
260 (
float)outBytes * 100.0 / inLength);
279 unpackBytemap (
const byte * inBuffer,
byte * outBuffer,
uint inLength,
282 ASSERT (inBuffer != NULL && outBuffer != NULL);
290 std::memcpy (outBuffer, inBuffer + 1, outLength);
295 const byte * inPtr = inBuffer + 1;
296 int inBytesLeft = inLength - 1;
297 byte * outPtr = outBuffer;
298 int outBytesLeft = outLength;
299 uint controlData = *inPtr++;
300 uint controlBits = 8;
302 byte prevLiteral = 0;
304 while (outBytesLeft > 0) {
308 uint code = controlData & 3;
311 if (controlBits == 0) {
314 controlData = *inPtr++;
325 *outPtr++ = prevLiteral;
339 length <<= 8; length |= *inPtr++;
340 length <<= 8; length |= *inPtr++;
341 length <<= 8; length |= *inPtr++;
343 outBytesLeft -= length;
351 prevLiteral = *inPtr++;
353 *outPtr++ = prevLiteral;
364 if (inBytesLeft != 0 || outBytesLeft != 0) {
const uint MIN_RLE_LENGTH
byte * data()
Return a pointer to the allocated data.
gamenumT Count() const
Return the number of nonzero values in filter.
gamenumT Size() const
Return the number of elements in filter.
const uint CODE_PrevLiteral
const uint CODE_ZeroLiteral
void CompressFrom(Filter *filter)
const uint OVERFLOW_BYTES
const uint CODE_RunLength
const uint CODE_NewLiteral
void Set(gamenumT index, byte value)
Sets the value at index.
errorT Verify(Filter *filter)
const errorT ERROR_Corrupt
#define ENCODE_CONTROL_BITS(bits)
errorT UncompressTo(Filter *filter) const