diff options
author | Simon Bünzli <zeniko@gmail.com> | 2014-01-03 12:15:09 +0100 |
---|---|---|
committer | Robin Watts <robin.watts@artifex.com> | 2014-01-06 13:13:41 +0000 |
commit | 0bfa2ce884eed8bef83fb23cf2e25dae81a2207e (patch) | |
tree | db83c056876db965b5625bef16990b6c6740257e /source/pdf | |
parent | 833c6a84bd7edf531b6074e9e13dd5ae57f21f12 (diff) | |
download | mupdf-0bfa2ce884eed8bef83fb23cf2e25dae81a2207e.tar.xz |
reuse JBIG2Globals
Certain optimized documents use a rather large common symbol dictionary
for all JBIG2 images. Caching these JBIG2Globals speeds up loading and
rendering of such documents.
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); } |