From 6df51810d3d3b9f47c965ccf2f9a1af49ba0b56f Mon Sep 17 00:00:00 2001 From: Tor Andersson Date: Tue, 27 Jun 2017 16:09:01 +0200 Subject: Reuse pattern tiles when running PDF interpreter directly. --- include/mupdf/pdf/resource.h | 1 + source/pdf/pdf-op-run.c | 28 +++++++++++++++++----------- source/pdf/pdf-pattern.c | 1 + 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/include/mupdf/pdf/resource.h b/include/mupdf/pdf/resource.h index 36eeb91b..5650a12a 100644 --- a/include/mupdf/pdf/resource.h +++ b/include/mupdf/pdf/resource.h @@ -65,6 +65,7 @@ struct pdf_pattern_s pdf_document *document; pdf_obj *resources; pdf_obj *contents; + int id; /* unique ID for caching rendered tiles */ }; pdf_pattern *pdf_load_pattern(fz_context *ctx, pdf_document *doc, pdf_obj *obj); diff --git a/source/pdf/pdf-op-run.c b/source/pdf/pdf-op-run.c index 48dd9d53..8a0ba446 100644 --- a/source/pdf/pdf-op-run.c +++ b/source/pdf/pdf-op-run.c @@ -360,6 +360,7 @@ pdf_show_pattern(fz_context *ctx, pdf_run_processor *pr, pdf_pattern *pat, pdf_g int x0, y0, x1, y1; float fx0, fy0, fx1, fy1; fz_rect local_area; + int id; pdf_gsave(ctx, pr); gstate = pr->gstate + pr->gtop; @@ -383,11 +384,13 @@ pdf_show_pattern(fz_context *ctx, pdf_run_processor *pr, pdf_pattern *pat, pdf_g pdf_keep_material(ctx, &gstate->stroke); gstate->fill = gstate->stroke; } + id = 0; /* don't cache uncolored patterns, since we colorize them when drawing */ } else { // TODO: unset only the current fill/stroke or both? pdf_unset_pattern(ctx, pr, what); + id = pat->id; } /* don't apply soft masks to objects in the pattern as well */ @@ -437,21 +440,24 @@ pdf_show_pattern(fz_context *ctx, pdf_run_processor *pr, pdf_pattern *pat, pdf_g if (0) #endif { - fz_begin_tile(ctx, pr->dev, &local_area, &pat->bbox, pat->xstep, pat->ystep, &ptm); - gstate->ctm = ptm; - pdf_gsave(ctx, pr); - fz_try(ctx) + int cached = fz_begin_tile_id(ctx, pr->dev, &local_area, &pat->bbox, pat->xstep, pat->ystep, &ptm, id); + if (cached) { - pdf_process_contents(ctx, (pdf_processor*)pr, pat->document, pat->resources, pat->contents, NULL); - } - fz_always(ctx) - { - pdf_grestore(ctx, pr); fz_end_tile(ctx, pr->dev); } - fz_catch(ctx) + else { - fz_rethrow(ctx); + gstate->ctm = ptm; + pdf_gsave(ctx, pr); + fz_try(ctx) + pdf_process_contents(ctx, (pdf_processor*)pr, pat->document, pat->resources, pat->contents, NULL); + fz_always(ctx) + { + pdf_grestore(ctx, pr); + fz_end_tile(ctx, pr->dev); + } + fz_catch(ctx) + fz_rethrow(ctx); } } else diff --git a/source/pdf/pdf-pattern.c b/source/pdf/pdf-pattern.c index 0fb01d06..578f1d93 100644 --- a/source/pdf/pdf-pattern.c +++ b/source/pdf/pdf-pattern.c @@ -46,6 +46,7 @@ pdf_load_pattern(fz_context *ctx, pdf_document *doc, pdf_obj *dict) pat->document = doc; pat->resources = NULL; pat->contents = NULL; + pat->id = pdf_to_num(ctx, dict); fz_try(ctx) { -- cgit v1.2.3