bool compressRLEPlus ( const char * inFileName, const char * outFileName )
{
ifstream input;
input.open(inFileName, ifstream::in);
ofstream output(outFileName, ios::binary | ios::out);
if(!input.is_open() || !output.is_open())
return false;
unsigned char c=0,minuly=0, kolikrat=0;
Pole neopakujici(127);
bool prvniPruchod=true;
int pocetprvku=0;
while(true)
{
if(!input.eof())
{
pocetprvku++;
c=(unsigned char) input.get();
if(c==minuly && !prvniPruchod) //pokud se znak opakuje
{
kolikrat++;
if(kolikrat>=127) //pokud jsem na max. poctu opakujicich se znaku
{
//cout << "opakuje se: " << (int)kolikrat << "x" << endl;
output.put((unsigned char) (kolikrat+128));
output.put((unsigned char) minuly);
kolikrat=0;
}
if((kolikrat>=3) && (neopakujici.pocet!=0))
{
//cout << "pisu pocet: " << neopakujici.pocet << endl;
output.put((unsigned char) neopakujici.pocet);
/*
cout << "vypis neopakujiciho pole:" << endl;
for(int i=0;i<neopakujici.pocet;i++)
cout << (int) neopakujici.pole[i] << endl;
*/
for(int i=0;i<neopakujici.pocet;i++)
output.put((unsigned char) neopakujici.pole[i]);
neopakujici.pocet=0;
}
}
else //pokud se znak neopakuje
{
if(prvniPruchod) //osetreni prvniho pruchodu
prvniPruchod=false;
if(kolikrat>=3) //pokud se minuly znak vyskytoval vice nez 3x, komprimuj
{
//cout << "opakuje se: " << (int)kolikrat << "x" << endl;
output.put((unsigned char) (kolikrat+128));
output.put((unsigned char) minuly);
kolikrat=0;
}
if(neopakujici.pocet>=127) //pokud je neopakujich jiz 127, vypis
{
//cout << "nasel jsem 127 neopakujicich" << endl;
output.put((unsigned char) neopakujici.pocet);
for(int i=0;i<neopakujici.pocet;i++)
output.put((unsigned char) neopakujici.pole[i]);
neopakujici.pocet=0;
}
if(kolikrat==2) //pokud se minuly znak vyskytoval 2x, tak ho presun mezi nekomprimovane
{
//cout << "zapisuju do neopakujicich poprve: " << minuly << endl;
neopakujici.pole[neopakujici.pocet]=minuly;
neopakujici.pocet=neopakujici.pocet + 1;
if(neopakujici.pocet>=127) //pokud je neopakujich jiz 127, vypis
{
output.put((unsigned char) neopakujici.pocet);
for(int i=0;i<neopakujici.pocet;i++)
output.put((unsigned char) neopakujici.pole[i]);
neopakujici.pocet=0;
}
else
{
//cout << "zapisuju do neopakujicich podruhe: " << minuly << endl;
neopakujici.pole[neopakujici.pocet]=minuly;
neopakujici.pocet=neopakujici.pocet + 1;
}
}
if(kolikrat==1) //pokud se minuly znak vyskytoval 1x, tak ho presun mezi nekomprimovane
{
//cout << "zapisuju do neopakujicich jeden: " << minuly << endl;
neopakujici.pole[neopakujici.pocet]=minuly;
neopakujici.pocet=neopakujici.pocet + 1;
}
minuly = c; //aktualni uloz jako minuly
kolikrat=1;
}
} // if(!input.eof())
else //finalni vystup toho, co zbylo
{
cout << "oef na poctu: " << (int)pocetprvku << endl;
if(neopakujici.pocet!=0) //pokud mi neco zbylo v bufferu pro neopakujici
{
//cout << "vypisuju co mi zbylo" << endl;
output.put((unsigned char)neopakujici.pocet);
for(int i=0;i<neopakujici.pocet;i++)
output.put((unsigned char) neopakujici.pole[i]);
}
break;
}
}
cout << (int)pocetprvku << endl;
input.close();
output.close();
return true;
}
bool decompressRLEPlus ( const char * inFileName, const char * outFileName )
{
ifstream input;
input.open(inFileName, ifstream::in);
ofstream output(outFileName, ios::binary | ios::out);
if(!input.is_open() || !output.is_open())
return false;
input.close();
output.close();
return true;
}