diff options
Diffstat (limited to 'filter/rld.c')
-rw-r--r-- | filter/rld.c | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/filter/rld.c b/filter/rld.c new file mode 100644 index 00000000..a66e0f94 --- /dev/null +++ b/filter/rld.c @@ -0,0 +1,67 @@ +#include <fitz.h> + +fz_error * +fz_newrld(fz_filter **fp, fz_obj *params) +{ + FZ_NEWFILTER(fz_filter, f, rld); + return nil; +} + +void +fz_freerld(fz_filter *rld) +{ + fz_free(rld); +} + +fz_error * +fz_processrld(fz_filter *filter, fz_buffer *in, fz_buffer *out) +{ + int run, i; + unsigned char c; + + while (1) + { + if (in->rp == in->wp) + return fz_ioneedin; + + if (out->wp == out->ep) + return fz_ioneedout; + + run = *in->rp++; + + if (run == 128) { + out->eof = 1; + return fz_iodone; + } + + else if (run < 128) { + run = run + 1; + if (in->rp + run > in->wp) { + in->rp --; + return fz_ioneedin; + } + if (out->wp + run > out->ep) { + in->rp --; + return fz_ioneedout; + } + for (i = 0; i < run; i++) + *out->wp++ = *in->rp++; + } + + else if (run > 128) { + run = 257 - run; + if (in->rp + 1 > in->wp) { + in->rp --; + return fz_ioneedin; + } + if (out->wp + run > out->ep) { + in->rp --; + return fz_ioneedout; + } + c = *in->rp++; + for (i = 0; i < run; i++) + *out->wp++ = c; + } + } +} + |