void qacWriteNext(FILE *f, struct qaSeq *qa) /* Write next record to qac file. */ { int cBufSize = qa->size + (qa->size>>1); signed char *cBuf = needLargeMem(cBufSize); bits32 cSize, origSize; origSize = qa->size; cSize = rleCompress(qa->qa, qa->size, cBuf); writeString(f, qa->name); writeOne(f, origSize); writeOne(f, cSize); mustWrite(f, cBuf, cSize); freeMem(cBuf); }
int RleCompressor::compress (const char *inPtr, int inSize, int minY, const char *&outPtr) { // // Special case - empty input buffer // if (inSize == 0) { outPtr = _outBuffer; return 0; } // // Reorder the pixel data. // { char *t1 = _tmpBuffer; char *t2 = _tmpBuffer + (inSize + 1) / 2; const char *stop = inPtr + inSize; while (true) { if (inPtr < stop) *(t1++) = *(inPtr++); else break; if (inPtr < stop) *(t2++) = *(inPtr++); else break; } } // // Predictor. // { unsigned char *t = (unsigned char *) _tmpBuffer + 1; unsigned char *stop = (unsigned char *) _tmpBuffer + inSize; int p = t[-1]; while (t < stop) { int d = int (t[0]) - p + (128 + 256); p = t[0]; t[0] = d; ++t; } } // // Run-length encode the data. // outPtr = _outBuffer; return rleCompress (inSize, _tmpBuffer, (signed char *) _outBuffer); }