diff options
Diffstat (limited to 'filter/lzwd.c')
-rw-r--r-- | filter/lzwd.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/filter/lzwd.c b/filter/lzwd.c index 74ddd9ce..95fc462a 100644 --- a/filter/lzwd.c +++ b/filter/lzwd.c @@ -109,6 +109,13 @@ static inline fz_error * fillbits(fz_lzwd *lzw, fz_buffer *in) return nil; } +static inline void unstuff(fz_lzwd *lzw, fz_buffer *in) +{ + int i = (32 - lzw->bidx) / 8; + while (i-- && in->rp > in->bp) + in->rp --; +} + fz_error * fz_processlzwd(fz_filter *filter, fz_buffer *in, fz_buffer *out) { @@ -131,6 +138,7 @@ fz_processlzwd(fz_filter *filter, fz_buffer *in, fz_buffer *out) if (lzw->bidx > 32 - lzw->codebits) { out->eof = 1; + unstuff(lzw, in); return fz_iodone; } } @@ -146,6 +154,7 @@ fz_processlzwd(fz_filter *filter, fz_buffer *in, fz_buffer *out) { eatbits(lzw, lzw->codebits); out->eof = 1; + unstuff(lzw, in); return fz_iodone; } @@ -162,6 +171,7 @@ fz_processlzwd(fz_filter *filter, fz_buffer *in, fz_buffer *out) { eatbits(lzw, oldcodebits + MINBITS); out->eof = 1; + unstuff(lzw, in); return fz_iodone; } |