m2.enlarge-your-data/src/lib/eyd_uncompressor.cpp
2005-10-30 23:36:49 +00:00

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());
}
}