diff options
author | Tor Andersson <tor@ghostscript.com> | 2010-07-29 23:17:46 +0000 |
---|---|---|
committer | Tor Andersson <tor@ghostscript.com> | 2010-07-29 23:17:46 +0000 |
commit | d797d4707564bd9c0e1536d1d6355945aa1be740 (patch) | |
tree | b6aef992de0ce2aa306c4dd330512852c1a63ede /fitz/filt_flate.c | |
parent | 0b954421d7908c8b835d96b4a945418c2ae08de7 (diff) | |
download | mupdf-d797d4707564bd9c0e1536d1d6355945aa1be740.tar.xz |
Use chained reader like interface for filters instead of process interface.
Diffstat (limited to 'fitz/filt_flate.c')
-rw-r--r-- | fitz/filt_flate.c | 119 |
1 files changed, 55 insertions, 64 deletions
diff --git a/fitz/filt_flate.c b/fitz/filt_flate.c index 96a7a09a..bb3ac692 100644 --- a/fitz/filt_flate.c +++ b/fitz/filt_flate.c @@ -6,97 +6,88 @@ typedef struct fz_flate_s fz_flate; struct fz_flate_s { - fz_filter super; + fz_stream *chain; z_stream z; }; -static void * -zmalloc(void *opaque, unsigned int items, unsigned int size) +static void * zmalloc(void *opaque, unsigned int items, unsigned int size) { return fz_malloc(items * size); } -static void -zfree(void *opaque, void *ptr) +static void zfree(void *opaque, void *ptr) { fz_free(ptr); } -fz_filter * -fz_newflated(fz_obj *params) +static int +readflated(fz_stream *stm, unsigned char *outbuf, int outlen) { - int ei; + fz_flate *state = stm->state; + fz_stream *chain = state->chain; + z_streamp zp = &state->z; + int inlen, code; + + if (chain->rp == chain->wp) + fz_fillbuffer(chain); - FZ_NEWFILTER(fz_flate, f, flated); + inlen = chain->wp - chain->rp; + zp->next_in = chain->rp; + zp->avail_in = inlen; + zp->next_out = outbuf; + zp->avail_out = outlen; - f->z.zalloc = zmalloc; - f->z.zfree = zfree; - f->z.opaque = nil; - f->z.next_in = nil; - f->z.avail_in = 0; + code = inflate(zp, Z_SYNC_FLUSH); - ei = inflateInit(&f->z); + chain->rp = chain->wp - zp->avail_in; - if (ei != Z_OK) + if (code == Z_STREAM_END || code == Z_OK) { - fz_warn("zlib error: inflateInit: %s", f->z.msg); + return outlen - zp->avail_out; + } + else if (code == Z_DATA_ERROR && inlen == 0) + { + fz_warn("ignoring zlib error: %s", zp->msg); + return outlen - zp->avail_out; + } + else + { + return fz_throw("zlib error: %s", zp->msg); } - - return (fz_filter*)f; } -void -fz_dropflated(fz_filter *f) +static void +closeflated(fz_stream *stm) { - z_streamp zp = &((fz_flate*)f)->z; - int err; + fz_flate *state = stm->state; + int code; + + code = inflateEnd(&state->z); + if (code != Z_OK) + fz_warn("zlib error: inflateEnd: %s", state->z.msg); - err = inflateEnd(zp); - if (err != Z_OK) - fz_warn("inflateEnd: %s", zp->msg); + fz_close(state->chain); + fz_free(state); } -fz_error -fz_processflated(fz_filter *f, fz_buffer *in, fz_buffer *out) +fz_stream * +fz_openflated(fz_stream *chain) { - z_streamp zp = &((fz_flate*)f)->z; - int err; - - if (in->rp == in->wp && !in->eof) - return fz_ioneedin; - if (out->wp == out->ep) - return fz_ioneedout; + fz_flate *state; + int code; - zp->next_in = in->rp; - zp->avail_in = in->wp - in->rp; + state = fz_malloc(sizeof(fz_flate)); + state->chain = chain; - zp->next_out = out->wp; - zp->avail_out = out->ep - out->wp; + state->z.zalloc = zmalloc; + state->z.zfree = zfree; + state->z.opaque = nil; + state->z.next_in = nil; + state->z.avail_in = 0; - err = inflate(zp, Z_SYNC_FLUSH); + code = inflateInit(&state->z); + if (code != Z_OK) + fz_warn("zlib error: inflateInit: %s", state->z.msg); - in->rp = in->wp - zp->avail_in; - out->wp = out->ep - zp->avail_out; - - if (err == Z_DATA_ERROR && in->eof && in->rp == in->wp) - { - fz_warn("ignoring zlib error: %s", zp->msg); - return fz_iodone; - } - else if (err == Z_STREAM_END || err == Z_BUF_ERROR) - { - return fz_iodone; - } - else if (err == Z_OK) - { - if (in->rp == in->wp && !in->eof) - return fz_ioneedin; - if (out->wp == out->ep) - return fz_ioneedout; - return fz_ioneedin; /* hmm, what's going on here? */ - } - else - { - return fz_throw("zlib error: inflate: %s", zp->msg); - } + return fz_newstream(state, readflated, closeflated); } |