2 #include "fitz-stream.h"
6 typedef struct fz_flate_s fz_flate
;
15 zmalloc(void *opaque
, unsigned int items
, unsigned int size
)
17 fz_memorycontext
*mctx
= (fz_memorycontext
*)opaque
;
18 return mctx
->malloc(mctx
, items
* size
);
22 fz_newflated(fz_filter
**fp
, fz_obj
*params
)
29 FZ_NEWFILTER(fz_flate
, f
, flated
);
31 f
->z
.zalloc
= zmalloc
;
32 f
->z
.zfree
= (void(*)(void*,void*))fz_currentmemorycontext()->free
;
33 f
->z
.opaque
= fz_currentmemorycontext();
41 obj
= fz_dictgets(params
, "ZIP");
42 if (obj
) zipfmt
= fz_tobool(obj
);
47 /* if windowbits is negative the zlib header is skipped */
48 ei
= inflateInit2(&f
->z
, -15);
51 ei
= inflateInit(&f
->z
);
55 eo
= fz_throw("ioerror: inflateInit: %s", f
->z
.msg
);
64 fz_dropflated(fz_filter
*f
)
66 z_streamp zp
= &((fz_flate
*)f
)->z
;
71 fprintf(stderr
, "inflateEnd: %s", zp
->msg
);
75 fz_processflated(fz_filter
*f
, fz_buffer
*in
, fz_buffer
*out
)
77 z_streamp zp
= &((fz_flate
*)f
)->z
;
80 if (in
->rp
== in
->wp
&& !in
->eof
)
82 if (out
->wp
== out
->ep
)
86 zp
->avail_in
= in
->wp
- in
->rp
;
88 zp
->next_out
= out
->wp
;
89 zp
->avail_out
= out
->ep
- out
->wp
;
91 err
= inflate(zp
, Z_NO_FLUSH
);
93 in
->rp
= in
->wp
- zp
->avail_in
;
94 out
->wp
= out
->ep
- zp
->avail_out
;
96 if (err
== Z_STREAM_END
)
101 else if (err
== Z_OK
)
103 if (in
->rp
== in
->wp
&& !in
->eof
)
105 if (out
->wp
== out
->ep
)
107 return fz_ioneedin
; /* hmm, what's going on here? */
111 return fz_throw("ioerror: inflate: %s", zp
->msg
);
116 fz_newflatee(fz_filter
**fp
, fz_obj
*params
)
124 FZ_NEWFILTER(fz_flate
, f
, flatee
);
131 obj
= fz_dictgets(params
, "Effort");
132 if (obj
) effort
= fz_toint(obj
);
133 obj
= fz_dictgets(params
, "ZIP");
134 if (obj
) effort
= fz_tobool(obj
);
137 f
->z
.zalloc
= zmalloc
;
138 f
->z
.zfree
= (void(*)(void*,void*))fz_currentmemorycontext()->free
;
139 f
->z
.opaque
= fz_currentmemorycontext();
144 ei
= deflateInit2(&f
->z
, effort
, Z_DEFLATED
, -15, 8, Z_DEFAULT_STRATEGY
);
146 ei
= deflateInit(&f
->z
, effort
);
150 eo
= fz_throw("ioerror: deflateInit: %s", f
->z
.msg
);
159 fz_dropflatee(fz_filter
*f
)
161 z_streamp zp
= &((fz_flate
*)f
)->z
;
164 err
= deflateEnd(zp
);
166 fprintf(stderr
, "deflateEnd: %s", zp
->msg
);
172 fz_processflatee(fz_filter
*f
, fz_buffer
*in
, fz_buffer
*out
)
174 z_streamp zp
= &((fz_flate
*)f
)->z
;
177 if (in
->rp
== in
->wp
&& !in
->eof
)
179 if (out
->wp
== out
->ep
)
182 zp
->next_in
= in
->rp
;
183 zp
->avail_in
= in
->wp
- in
->rp
;
185 zp
->next_out
= out
->wp
;
186 zp
->avail_out
= out
->ep
- out
->wp
;
188 err
= deflate(zp
, in
->eof
? Z_FINISH
: Z_NO_FLUSH
);
190 in
->rp
= in
->wp
- zp
->avail_in
;
191 out
->wp
= out
->ep
- zp
->avail_out
;
193 if (err
== Z_STREAM_END
)
198 else if (err
== Z_OK
)
200 if (in
->rp
== in
->wp
&& !in
->eof
)
202 if (out
->wp
== out
->ep
)
204 return fz_ioneedin
; /* hmm? */
208 return fz_throw("ioerror: deflate: %s", zp
->msg
);