1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
|
// rleencoder.cpp: implementation of the RleEncoder class.
//
//////////////////////////////////////////////////////////////////////
#include "rleencoder.h"
RleEncoder::RleEncoder() : Encoder()
{
oldSize = 0;
}
RleEncoder::RleEncoder(Encoder *chain) : Encoder(chain)
{
oldSize = 0;
}
size_t RleEncoder::encode(unsigned char **encData, unsigned char *rawData, size_t size)
{
cleanUp();
if (oldSize != size) {
if (this->encData != NULL) {
delete[] encData;
}
this->encData = new unsigned char[size * 7 / 6];
oldSize = size;
}
*encData = this->encData;
unsigned char *act1 = rawData;
unsigned char *act2 = rawData + 1;
unsigned char *act3 = rawData + 2;
unsigned char val1 = *act1;
unsigned char val2 = *act2;
unsigned char val3 = *act3;
unsigned char *tmp_target = this->encData;
size_t count = 0;
size_t samcount = 0;
while (count < size) {
if ((*act1 == val1) && (*act2 == val2) && (*act3 == val3)) {
samcount++;
*tmp_target++ = val1;
*tmp_target++ = val2;
*tmp_target++ = val3;
act1 += 3;
act2 += 3;
act3 += 3;
count += 3;
if (samcount == 2) {
samcount = 0;
unsigned char samruncount = 0;
while (count < size && samruncount < 255) {
if ((*act1 == val1) && (*act2 == val2) && (*act3 == val3)) {
samruncount++;
act1 += 3;
act2 += 3;
act3 += 3;
count += 3;
} else {
break;
}
}
if (count < size) {
val1 = *act1;
val2 = *act2;
val3 = *act3;
}
*tmp_target++ = samruncount;
}
} else {
samcount = 0;
*tmp_target++ = val1 = *act1;
*tmp_target++ = val2 = *act2;
*tmp_target++ = val3 = *act3;
act1 += 3;
act2 += 3;
act3 += 3;
count += 3;
}
}
return tmp_target - this->encData;
}
RleEncoder::~RleEncoder()
{
if (this->encData != NULL) {
delete[] encData;
}
}
|