m2.enlarge-your-data/src/lib/eyd_compressor_rle2.cpp
2005-10-31 17:54:08 +00:00

82 lines
1.8 KiB
C++

#include "eyd_compressor_rle2.hh"
namespace EydLib {
BitCompressorRle2::BitCompressorRle2(int size) : _rle(size) {
// la taille des donnees enregistrees dépend de size
_last_count = 0;
_compressed.clear();
_input_size = 0;
_output_size = 0;
}
void BitCompressorRle2::clear(){
// we clear everything
_last_count = 0;
_compressed.clear();
_input_size = 0;
_output_size = 0;
}
void BitCompressorRle2::forceFlush(){
if (_last_count > 0){
printf(" -> flushing %d",_last_count);
BitGroup result(_rle.size());
result.setValue(_last_count);
printf("(=> %s)\n",result.toString().c_str());
_compressed.push_back(result);
_output_size += result.size();
} else {
printf(" -> no flush %d\n",_last_count);
}
}
void BitCompressorRle2::appendBit(bool bit){
printf("%d",bit);
fflush(stdout);
if (!bit){
_last_count++;
} else {
printf(" -> flushing %d",_last_count);
// on écrit _last_count sur la sortie
BitGroup result(_rle.size());
result.setValue(_last_count);
printf("(=> %s)\n",result.toString().c_str());
_compressed.push_back(result);
_output_size += result.size();
_last_count=0;
}
}
void BitCompressorRle2::append(BitGroup data){
_input_size += data.size();
// take the data and make it smaller...
// foreach bit of data, append it...
for (int i=0; i<data.size(); i++){
this->appendBit(data.getBitAt(i));
}
}
std::list<BitGroup> BitCompressorRle2::flush(){
// we add the data from _last* to the outlist
std::list<BitGroup> result;
result = _compressed;
_compressed.clear();
return result;
}
bool BitCompressorRle2::hasContent(){
return (!_compressed.empty());
}
float BitCompressorRle2::getRatio(){
float ratio = 1000 * (float)_output_size / (float)_input_size;
int ratio2 = (int)ratio;
return (((float)ratio2) / 10.0);
}
}