diff options
Diffstat (limited to 'pdf/pdf_interpret.c')
-rw-r--r-- | pdf/pdf_interpret.c | 91 |
1 files changed, 63 insertions, 28 deletions
diff --git a/pdf/pdf_interpret.c b/pdf/pdf_interpret.c index a11b8c30..8851be6e 100644 --- a/pdf/pdf_interpret.c +++ b/pdf/pdf_interpret.c @@ -104,7 +104,7 @@ struct pdf_csi_s fz_cookie *cookie; }; -static void pdf_run_buffer(pdf_csi *csi, pdf_obj *rdb, fz_buffer *contents); +static void pdf_run_contents_object(pdf_csi *csi, pdf_obj *rdb, pdf_obj *contents); static void pdf_run_xobject(pdf_csi *csi, pdf_obj *resources, pdf_xobject *xobj, fz_matrix transform); static void pdf_show_pattern(pdf_csi *csi, pdf_pattern *pat, fz_rect area, int what); @@ -1291,7 +1291,7 @@ pdf_show_pattern(pdf_csi *csi, pdf_pattern *pat, fz_rect area, int what) gstate->ctm = ptm; csi->top_ctm = gstate->ctm; pdf_gsave(csi); - pdf_run_buffer(csi, pat->resources, pat->contents); + pdf_run_contents_object(csi, pat->resources, pat->contents); /* RJW: "cannot render pattern tile" */ pdf_grestore(csi); while (oldtop < csi->gtop) @@ -1310,7 +1310,7 @@ pdf_show_pattern(pdf_csi *csi, pdf_pattern *pat, fz_rect area, int what) pdf_gsave(csi); fz_try(ctx) { - pdf_run_buffer(csi, pat->resources, pat->contents); + pdf_run_contents_object(csi, pat->resources, pat->contents); } fz_catch(ctx) { @@ -1407,7 +1407,7 @@ pdf_run_xobject(pdf_csi *csi, pdf_obj *resources, pdf_xobject *xobj, fz_matrix t if (xobj->resources) resources = xobj->resources; - pdf_run_buffer(csi, resources, xobj->contents); + pdf_run_contents_object(csi, resources, xobj->contents); /* RJW: "cannot interpret XObject stream" */ } fz_always(ctx) @@ -2528,7 +2528,6 @@ pdf_run_keyword(pdf_csi *csi, pdf_obj *rdb, fz_stream *file, char *buf) fz_warn(ctx, "unknown keyword: '%s'", buf); break; } - fz_assert_lock_not_held(ctx, FZ_LOCK_FILE); } static void @@ -2662,44 +2661,78 @@ pdf_run_stream(pdf_csi *csi, pdf_obj *rdb, fz_stream *file, pdf_lexbuf *buf) */ static void -pdf_run_buffer(pdf_csi *csi, pdf_obj *rdb, fz_buffer *contents) +pdf_run_contents_stream(pdf_csi *csi, pdf_obj *rdb, fz_stream *file) { fz_context *ctx = csi->dev->ctx; pdf_lexbuf_large *buf; - fz_stream * file = NULL; int save_in_text; fz_var(buf); - fz_var(file); + + if (file == NULL) + return; + + buf = fz_malloc(ctx, sizeof(*buf)); /* we must be re-entrant for type3 fonts */ + buf->base.size = PDF_LEXBUF_LARGE; + save_in_text = csi->in_text; + csi->in_text = 0; + fz_try(ctx) + { + pdf_run_stream(csi, rdb, file, &buf->base); + } + fz_catch(ctx) + { + fz_warn(ctx, "Content stream parsing error - rendering truncated"); + } + csi->in_text = save_in_text; + fz_free(ctx, buf); +} + +static void +pdf_run_contents_object(pdf_csi *csi, pdf_obj *rdb, pdf_obj *contents) +{ + fz_context *ctx = csi->dev->ctx; + fz_stream *file = NULL; if (contents == NULL) return; + file = pdf_open_contents_stream(csi->xref, contents); fz_try(ctx) { - buf = fz_malloc(ctx, sizeof(*buf)); /* we must be re-entrant for type3 fonts */ - buf->base.size = PDF_LEXBUF_LARGE; - file = fz_open_buffer(ctx, contents); - save_in_text = csi->in_text; - csi->in_text = 0; - fz_try(ctx) - { - pdf_run_stream(csi, rdb, file, &buf->base); - } - fz_catch(ctx) - { - fz_warn(ctx, "Content stream parsing error - rendering truncated"); - } - csi->in_text = save_in_text; + pdf_run_contents_stream(csi, rdb, file); } fz_always(ctx) { fz_close(file); - fz_free(ctx, buf); } fz_catch(ctx) { - fz_throw(ctx, "cannot parse context stream"); + fz_rethrow(ctx); + } +} + +static void +pdf_run_contents_buffer(pdf_csi *csi, pdf_obj *rdb, fz_buffer *contents) +{ + fz_context *ctx = csi->dev->ctx; + fz_stream *file = NULL; + + if (contents == NULL) + return; + + file = fz_open_buffer(ctx, contents); + fz_try(ctx) + { + pdf_run_contents_stream(csi, rdb, file); + } + fz_always(ctx) + { + fz_close(file); + } + fz_catch(ctx) + { + fz_rethrow(ctx); } } @@ -2719,14 +2752,16 @@ pdf_run_page_with_usage(pdf_document *xref, pdf_page *page, fz_device *dev, fz_m csi = pdf_new_csi(xref, dev, ctm, event, cookie, NULL); fz_try(ctx) { - pdf_run_buffer(csi, page->resources, page->contents); + pdf_run_contents_object(csi, page->resources, page->contents); } - fz_catch(ctx) + fz_always(ctx) { pdf_free_csi(csi); + } + fz_catch(ctx) + { fz_throw(ctx, "cannot parse page content stream"); } - pdf_free_csi(csi); if (cookie && cookie->progress_max != -1) { @@ -2792,7 +2827,7 @@ pdf_run_glyph(pdf_document *xref, pdf_obj *resources, fz_buffer *contents, fz_de fz_try(ctx) { - pdf_run_buffer(csi, resources, contents); + pdf_run_contents_buffer(csi, resources, contents); } fz_catch(ctx) { |