88 lines
2.1 KiB
C++
88 lines
2.1 KiB
C++
|
|
#include "eyd_uncompressor_rle1.hh"
|
|
|
|
namespace EydLib {
|
|
|
|
/*
|
|
class BitUncompressorRle1 {
|
|
private:
|
|
BitGroup _last_group;
|
|
int _last_count;
|
|
std::list<BitGroup> _uncompressed;
|
|
|
|
public:
|
|
BitUncompressorRle1();
|
|
|
|
void clear();
|
|
void append(BitGroup bg);
|
|
std::list<BitGroup> flush();
|
|
bool hasContent();
|
|
};
|
|
*/
|
|
|
|
BitUncompressorRle1::BitUncompressorRle1(int size) : _rle(size) {
|
|
_group_size = size;
|
|
_last_count = 0;
|
|
_status = UNCOMPRESSOR_STATUS_NORMAL;
|
|
}
|
|
|
|
void BitUncompressorRle1::clear(){
|
|
// we clear everything
|
|
_last_count = 0;
|
|
_uncompressed.clear();
|
|
}
|
|
|
|
void BitUncompressorRle1::append(BitGroup data){
|
|
switch (_status){
|
|
case UNCOMPRESSOR_STATUS_NORMAL:
|
|
printf("STATUS NORMAL : %s\n", data.toString().c_str());
|
|
if (data == _rle){
|
|
// on change le status et on n'écrit rien
|
|
_status = UNCOMPRESSOR_STATUS_GOTRLE;
|
|
} else {
|
|
// on écrit directement le resultat non décompressé
|
|
_uncompressed.push_back(data);
|
|
}
|
|
break;
|
|
case UNCOMPRESSOR_STATUS_GOTRLE:
|
|
printf("STATUS GOT RLE : %s\n", data.toString().c_str() );
|
|
if (data == _rle){
|
|
// deux RLE c'est 1 RLE
|
|
// on écrit juste un RLE
|
|
_uncompressed.push_back(data);
|
|
_status = UNCOMPRESSOR_STATUS_NORMAL;
|
|
} else {
|
|
// un RLE et un différent c'est une longueur
|
|
// sauf si égal à 1 ou 2
|
|
_status = UNCOMPRESSOR_STATUS_GOTLEN; // sauf si égal à RLE
|
|
_last_count = data.getValue(); // on stocke la value
|
|
}
|
|
break;
|
|
case UNCOMPRESSOR_STATUS_GOTLEN:
|
|
printf("STATUS GOT LEN : %s\n", data.toString().c_str() );
|
|
// ce qu'on lit est la valeur
|
|
// on écrit donc _last_count fois data
|
|
for (int i=0; i<_last_count; i++){
|
|
_uncompressed.push_back(data);
|
|
}
|
|
_status = UNCOMPRESSOR_STATUS_NORMAL;
|
|
_last_count = 0;
|
|
break;
|
|
|
|
}
|
|
}
|
|
|
|
std::list<BitGroup> BitUncompressorRle1::flush(){
|
|
// we add the data from _last* to the outlist
|
|
std::list<BitGroup> result;
|
|
result = _uncompressed;
|
|
_uncompressed.clear();
|
|
return result;
|
|
}
|
|
|
|
bool BitUncompressorRle1::hasContent(){
|
|
return (!_uncompressed.empty());
|
|
}
|
|
}
|
|
|