/* * Shift the components of a complex number left by the specified * number of bits. Negative values shift to the right. */ COMPLEX * cshift(COMPLEX *c, long n) { COMPLEX *r; if (ciszero(c) || (n == 0)) return clink(c); r = comalloc(); qfree(r->real); qfree(r->imag); r->real = qshift(c->real, n); r->imag = qshift(c->imag, n); return r; }
/* * Compresses an individual chunk using a specific format. The format is one * of the 'format' fields listed in the spec; one of the ZTR_FORM_ macros. */ int compress_chunk(ztr_t *ztr, ztr_chunk_t *chunk, int format, int option, int option2) { char *new_data = NULL; int new_len; switch (format) { case ZTR_FORM_RAW: return 0; case ZTR_FORM_RLE: new_data = rle(chunk->data, chunk->dlength, option, &new_len); if (entropy((unsigned char *)new_data, new_len) >= entropy((unsigned char *)chunk->data, chunk->dlength)) { xfree(new_data); return 0; } break; case ZTR_FORM_XRLE: new_data = xrle(chunk->data, chunk->dlength, option,option2, &new_len); break; case ZTR_FORM_XRLE2: new_data = xrle2(chunk->data, chunk->dlength, option, &new_len); break; case ZTR_FORM_ZLIB: new_data = zlib_huff(chunk->data, chunk->dlength, option, &new_len); break; case ZTR_FORM_DELTA1: new_data = decorrelate1(chunk->data, chunk->dlength, option, &new_len); break; case ZTR_FORM_DDELTA1: new_data = decorrelate1dyn(chunk->data, chunk->dlength, &new_len); break; case ZTR_FORM_DELTA2: new_data = decorrelate2(chunk->data, chunk->dlength, option, &new_len); break; case ZTR_FORM_DDELTA2: new_data = decorrelate2dyn(chunk->data, chunk->dlength, &new_len); break; case ZTR_FORM_DELTA4: new_data = decorrelate4(chunk->data, chunk->dlength, option, &new_len); break; case ZTR_FORM_16TO8: new_data = shrink_16to8(chunk->data, chunk->dlength, &new_len); break; case ZTR_FORM_32TO8: new_data = shrink_32to8(chunk->data, chunk->dlength, &new_len); break; case ZTR_FORM_FOLLOW1: new_data = follow1(chunk->data, chunk->dlength, &new_len); break; case ZTR_FORM_ICHEB: new_data = ichebcomp(chunk->data, chunk->dlength, &new_len); break; case ZTR_FORM_LOG2: new_data = log2_data(chunk->data, chunk->dlength, &new_len); break; case ZTR_FORM_STHUFF: new_data = sthuff(ztr, chunk->data, chunk->dlength, option, option2, &new_len); break; case ZTR_FORM_QSHIFT: new_data = qshift(chunk->data, chunk->dlength, &new_len); break; case ZTR_FORM_TSHIFT: new_data = tshift(ztr, chunk->data, chunk->dlength, &new_len); break; } if (!new_data) { fprintf(stderr, "!!ERROR!!\n"); return -1; } /* fprintf(stderr, "Format %d => %d to %d\n", format, chunk->dlength, new_len); */ chunk->dlength = new_len; xfree(chunk->data); chunk->data = new_data; return 0; }