summaryrefslogtreecommitdiff
path: root/fitz/filt_flate.c
diff options
context:
space:
mode:
authorTor Andersson <tor@ghostscript.com>2010-07-29 23:17:46 +0000
committerTor Andersson <tor@ghostscript.com>2010-07-29 23:17:46 +0000
commitd797d4707564bd9c0e1536d1d6355945aa1be740 (patch)
treeb6aef992de0ce2aa306c4dd330512852c1a63ede /fitz/filt_flate.c
parent0b954421d7908c8b835d96b4a945418c2ae08de7 (diff)
downloadmupdf-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.c119
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);
}