diff options
Diffstat (limited to 'source/pdf')
-rw-r--r-- | source/pdf/pdf-stream.c | 38 |
1 files changed, 35 insertions, 3 deletions
diff --git a/source/pdf/pdf-stream.c b/source/pdf/pdf-stream.c index bf7f64f2..f747a54b 100644 --- a/source/pdf/pdf-stream.c +++ b/source/pdf/pdf-stream.c @@ -46,6 +46,38 @@ pdf_stream_has_crypt(fz_context *ctx, pdf_obj *stm) return 0; } +static fz_jbig2_globals * +pdf_load_jbig2_globals(pdf_document *doc, pdf_obj *dict) +{ + fz_jbig2_globals *globals; + fz_context *ctx = doc->ctx; + fz_buffer *buf = NULL; + + fz_var(buf); + + if ((globals = pdf_find_item(ctx, fz_free_jbig2_globals_imp, dict)) != NULL) + { + return globals; + } + + fz_try(ctx) + { + buf = pdf_load_stream(doc, pdf_to_num(dict), pdf_to_gen(dict)); + globals = fz_load_jbig2_globals(ctx, buf->data, buf->len); + pdf_store_item(ctx, dict, globals, buf->len); + } + fz_always(ctx) + { + fz_drop_buffer(ctx, buf); + } + fz_catch(ctx) + { + fz_rethrow(ctx); + } + + return globals; +} + /* * Create a filter given a name and param dictionary. */ @@ -161,10 +193,10 @@ build_filter(fz_stream *chain, pdf_document *doc, pdf_obj *f, pdf_obj *p, int nu else if (!strcmp(s, "JBIG2Decode")) { - fz_buffer *globals = NULL; + fz_jbig2_globals *globals = NULL; pdf_obj *obj = pdf_dict_gets(p, "JBIG2Globals"); - if (obj) - globals = pdf_load_stream(doc, pdf_to_num(obj), pdf_to_gen(obj)); + if (pdf_is_indirect(obj)) + globals = pdf_load_jbig2_globals(doc, obj); /* fz_open_jbig2d takes possession of globals */ return fz_open_jbig2d(chain, globals); } |