ref: 7c2e795156b5d969bdc807da910a35aa3afd315a
dir: /filter.c/
#include <u.h> #include <libc.h> #include "pdf.h" /* 7.4 Filters */ int fFlate(void *aux, Buffer *bi, Buffer *bo); int openFlate(Filter *f, Object *o); void closeFlate(Filter *f); static int fCopy(void *aux, Buffer *bi, Buffer *bo) { bufput(bo, bi->b, bi->sz); return 0; } static Filter filters[] = { {"ASCII85Decode", nil, nil, nil}, {"ASCIIHexDecode", nil, nil, nil}, {"CCITTFaxDecode", nil, nil, nil}, {"CryptDecode", nil, nil, nil}, {"DCTDecode", fCopy, nil, nil}, {"FlateDecode", fFlate, openFlate, closeFlate}, {"JBIG2Decode", nil, nil, nil}, {"JPXDecode", nil, nil, nil}, {"LZWDecode", nil, nil, nil}, {"RunLengthDecode", nil, nil, nil}, }; Filter * filteropen(char *name, Object *o) { int i; Filter *f; for(i = 0; i < nelem(filters) && strcmp(filters[i].name, name) != 0; i++); if(i >= nelem(filters)){ werrstr("no such filter %q", name); return nil; } if(filters[i].readall == nil){ werrstr("filter %q not implemented", name); return nil; } if((f = malloc(sizeof(*f))) == nil) return nil; memmove(f, &filters[i], sizeof(*f)); if(f->open != nil && f->open(f, o) != 0){ free(f); return nil; } return f; } int filterrun(Filter *f, Buffer *bi, Buffer *bo) { if(f->readall(f->aux, bi, bo) != 0){ werrstr("filter[%s]: %r", f->name); return -1; } return 0; } void filterclose(Filter *f) { if(f->close != nil) f->close(f); free(f); }