summaryrefslogtreecommitdiff
path: root/source/pdf/pdf-stream.c
diff options
context:
space:
mode:
authorSimon Bünzli <zeniko@gmail.com>2014-01-03 12:15:09 +0100
committerRobin Watts <robin.watts@artifex.com>2014-01-06 13:13:41 +0000
commit0bfa2ce884eed8bef83fb23cf2e25dae81a2207e (patch)
treedb83c056876db965b5625bef16990b6c6740257e /source/pdf/pdf-stream.c
parent833c6a84bd7edf531b6074e9e13dd5ae57f21f12 (diff)
downloadmupdf-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/pdf-stream.c')
-rw-r--r--source/pdf/pdf-stream.c38
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);
}