summaryrefslogtreecommitdiff
path: root/fitz/filt_lzwe.c
diff options
context:
space:
mode:
Diffstat (limited to 'fitz/filt_lzwe.c')
-rw-r--r--fitz/filt_lzwe.c261
1 files changed, 0 insertions, 261 deletions
diff --git a/fitz/filt_lzwe.c b/fitz/filt_lzwe.c
deleted file mode 100644
index 6b271dfa..00000000
--- a/fitz/filt_lzwe.c
+++ /dev/null
@@ -1,261 +0,0 @@
-#include "fitz_base.h"
-#include "fitz_stream.h"
-
-#define noDEBUG 1
-
-enum
-{
- MINBITS = 9,
- MAXBITS = 12,
- MAXBYTES = 2,
- NUMCODES = (1 << MAXBITS),
- LZW_CLEAR = 256,
- LZW_EOD = 257,
- LZW_FIRST = 258,
- HSIZE = 9001, /* 91% occupancy (???) */
- HSHIFT = (13 - 8)
-};
-
-typedef struct lzw_hash_s lzw_hash;
-
-struct lzw_hash_s
-{
- int hash;
- int code;
-};
-
-typedef struct fz_lzwe_s fz_lzwe;
-
-struct fz_lzwe_s
-{
- fz_filter super;
-
- int earlychange;
-
- int bidx; /* partial bits used in out->wp */
- unsigned char bsave; /* partial byte saved between process() calls */
-
- int resume;
- int code;
- int fcode;
- int hcode;
-
- int codebits;
- int oldcode;
- int nextcode;
-
- lzw_hash table[HSIZE];
-};
-
-static void
-clearhash(fz_lzwe *lzw)
-{
- int i;
- for (i = 0; i < HSIZE; i++)
- lzw->table[i].hash = -1;
-}
-
-fz_error
-fz_newlzwe(fz_filter **fp, fz_obj *params)
-{
- FZ_NEWFILTER(fz_lzwe, lzw, lzwe);
-
- lzw->earlychange = 0;
-
- if (params)
- {
- fz_obj *obj;
- obj = fz_dictgets(params, "EarlyChange");
- if (obj) lzw->earlychange = fz_toint(obj) != 0;
- }
-
- lzw->bidx = 0;
- lzw->bsave = 0;
-
- lzw->resume = 0;
- lzw->code = -1;
- lzw->hcode = -1;
- lzw->fcode = -1;
-
- lzw->codebits = MINBITS;
- lzw->nextcode = LZW_FIRST;
- lzw->oldcode = -1; /* generates LZW_CLEAR */
-
- clearhash(lzw);
-
- return fz_okay;
-}
-
-void
-fz_droplzwe(fz_filter *filter)
-{
-}
-
-static void
-putcode(fz_lzwe *lzw, fz_buffer *out, int code)
-{
- int nbits = lzw->codebits;
-
- while (nbits > 0)
- {
- if (lzw->bidx == 0)
- {
- *out->wp = 0;
- }
-
- /* code does not fit: shift right */
- if (nbits > (8 - lzw->bidx))
- {
- *out->wp |= code >> (nbits - (8 - lzw->bidx));
- nbits = nbits - (8 - lzw->bidx);
- lzw->bidx = 0;
- out->wp ++;
- }
-
- /* shift left */
- else
- {
- *out->wp |= code << ((8 - lzw->bidx) - nbits);
- lzw->bidx += nbits;
- if (lzw->bidx == 8)
- {
- lzw->bidx = 0;
- out->wp ++;
- }
- nbits = 0;
- }
- }
-}
-
-
-static fz_error
-compress(fz_lzwe *lzw, fz_buffer *in, fz_buffer *out)
-{
- if (lzw->resume)
- {
- lzw->resume = 0;
- goto resume;
- }
-
- /* at start of data, output a clear code */
- if (lzw->oldcode == -1)
- {
- if (out->wp + 3 > out->ep)
- return fz_ioneedout;
-
- if (in->rp + 1 > in->wp)
- {
- if (in->eof)
- goto eof;
- return fz_ioneedin;
- }
-
- putcode(lzw, out, LZW_CLEAR);
-
- lzw->oldcode = *in->rp++;
- }
-
-begin:
- while (1)
- {
- if (in->rp + 1 > in->wp)
- {
- if (in->eof)
- goto eof;
- return fz_ioneedin;
- }
-
- /* read character */
- lzw->code = *in->rp++;
-
- /* hash string + character */
- lzw->fcode = (lzw->code << MAXBITS) + lzw->oldcode;
- lzw->hcode = (lzw->code << HSHIFT) ^ lzw->oldcode;
-
- /* primary hash */
- if (lzw->table[lzw->hcode].hash == lzw->fcode)
- {
- lzw->oldcode = lzw->table[lzw->hcode].code;
- continue;
- }
-
- /* secondary hash */
- if (lzw->table[lzw->hcode].hash != -1)
- {
- int disp = HSIZE - lzw->hcode;
- if (lzw->hcode == 0)
- disp = 1;
- do
- {
- lzw->hcode = lzw->hcode - disp;
- if (lzw->hcode < 0)
- lzw->hcode += HSIZE;
- if (lzw->table[lzw->hcode].hash == lzw->fcode)
- {
- lzw->oldcode = lzw->table[lzw->hcode].code;
- goto begin;
- }
- } while (lzw->table[lzw->hcode].hash != -1);
- }
-
-resume:
- /* new entry: emit code and add to table */
-
- /* reserve space for this code and an eventual CLEAR code */
- if (out->wp + 5 > out->ep)
- {
- lzw->resume = 1;
- return fz_ioneedout;
- }
-
- putcode(lzw, out, lzw->oldcode);
-
- lzw->oldcode = lzw->code;
- lzw->table[lzw->hcode].code = lzw->nextcode;
- lzw->table[lzw->hcode].hash = lzw->fcode;
-
- lzw->nextcode ++;
-
- /* table is full: emit clear code and reset */
- if (lzw->nextcode == NUMCODES - 1)
- {
- putcode(lzw, out, LZW_CLEAR);
- clearhash(lzw);
- lzw->nextcode = LZW_FIRST;
- lzw->codebits = MINBITS;
- }
-
- /* check if next entry will be too big for the code size */
- else if (lzw->nextcode >= (1 << lzw->codebits) - lzw->earlychange)
- {
- lzw->codebits ++;
- }
- }
-
-eof:
- if (out->wp + 5 > out->ep)
- return fz_ioneedout;
-
- putcode(lzw, out, lzw->oldcode);
- putcode(lzw, out, LZW_EOD);
-
- return fz_iodone;
-}
-
-fz_error
-fz_processlzwe(fz_filter *filter, fz_buffer *in, fz_buffer *out)
-{
- fz_lzwe *lzw = (fz_lzwe*)filter;
- fz_error error;
-
- /* restore partial bits */
- *out->wp = lzw->bsave;
-
- error = compress(lzw, in, out);
-
- /* save partial bits */
- lzw->bsave = *out->wp;
-
- return error;
-}
-