diff options
author | Michael Vrhel <michael.vrhel@artifex.com> | 2017-06-23 12:23:36 -0700 |
---|---|---|
committer | Robin Watts <robin.watts@artifex.com> | 2017-07-17 19:32:06 +0100 |
commit | 63713f22ae830142dfe0d3896948ec53c4705ace (patch) | |
tree | fe8334e262f4507dc2cd2a3ee6d6239bb2c44b40 /source/pdf/pdf-op-run.c | |
parent | 28bfd69eb4101a2197920da6cbc21f491d8cb288 (diff) | |
download | mupdf-63713f22ae830142dfe0d3896948ec53c4705ace.tar.xz |
Add colorspace handling to transparency groups
Also force softmasks to be isolated groups.
Diffstat (limited to 'source/pdf/pdf-op-run.c')
-rw-r--r-- | source/pdf/pdf-op-run.c | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/source/pdf/pdf-op-run.c b/source/pdf/pdf-op-run.c index 2e6d9cac..56c84cd9 100644 --- a/source/pdf/pdf-op-run.c +++ b/source/pdf/pdf-op-run.c @@ -13,7 +13,7 @@ typedef struct pdf_material_s pdf_material; typedef struct pdf_run_processor_s pdf_run_processor; -static void pdf_run_xobject(fz_context *ctx, pdf_run_processor *proc, pdf_xobject *xobj, pdf_obj *page_resources, const fz_matrix *transform); +static void pdf_run_xobject(fz_context *ctx, pdf_run_processor *proc, pdf_xobject *xobj, pdf_obj *page_resources, const fz_matrix *transform, int is_smask); enum { @@ -150,7 +150,7 @@ begin_softmask(fz_context *ctx, pdf_run_processor *pr, softmask_save *save) fz_try(ctx) { fz_begin_mask(ctx, pr->dev, &mask_bbox, gstate->luminosity, mask_colorspace, gstate->softmask_bc, &gstate->fill.color_params); - pdf_run_xobject(ctx, pr, softmask, save->page_resources, &fz_identity); + pdf_run_xobject(ctx, pr, softmask, save->page_resources, &fz_identity, 1); } fz_always(ctx) fz_drop_colorspace(ctx, mask_colorspace); @@ -193,7 +193,7 @@ pdf_begin_group(fz_context *ctx, pdf_run_processor *pr, const fz_rect *bbox, sof pdf_gstate *gstate = begin_softmask(ctx, pr, softmask); if (gstate->blendmode) - fz_begin_group(ctx, pr->dev, bbox, 1, 0, gstate->blendmode, 1); + fz_begin_group(ctx, pr->dev, bbox, NULL, 1, 0, gstate->blendmode, 1); return pr->gstate + pr->gtop; } @@ -527,7 +527,7 @@ pdf_show_image(fz_context *ctx, pdf_run_processor *pr, fz_image *image) { /* apply blend group even though we skip the soft mask */ if (gstate->blendmode) - fz_begin_group(ctx, pr->dev, &bbox, 0, 0, gstate->blendmode, 1); + fz_begin_group(ctx, pr->dev, &bbox, NULL, 0, 0, gstate->blendmode, 1); fz_clip_image_mask(ctx, pr->dev, image->mask, &image_ctm, &bbox); } else @@ -635,7 +635,7 @@ pdf_show_path(fz_context *ctx, pdf_run_processor *pr, int doclose, int dofill, i else { knockout_group = 1; - fz_begin_group(ctx, pr->dev, &bbox, 0, 1, FZ_BLEND_NORMAL, 1); + fz_begin_group(ctx, pr->dev, &bbox, NULL, 0, 1, FZ_BLEND_NORMAL, 1); } } @@ -780,7 +780,7 @@ pdf_flush_text(fz_context *ctx, pdf_run_processor *pr) else { knockout_group = 1; - fz_begin_group(ctx, pr->dev, &tb, 0, 1, FZ_BLEND_NORMAL, 1); + fz_begin_group(ctx, pr->dev, &tb, NULL, 0, 1, FZ_BLEND_NORMAL, 1); } } @@ -1197,7 +1197,7 @@ pdf_set_pattern(fz_context *ctx, pdf_run_processor *pr, int what, pdf_pattern *p } static void -pdf_run_xobject(fz_context *ctx, pdf_run_processor *proc, pdf_xobject *xobj, pdf_obj *page_resources, const fz_matrix *transform) +pdf_run_xobject(fz_context *ctx, pdf_run_processor *proc, pdf_xobject *xobj, pdf_obj *page_resources, const fz_matrix *transform, int is_smask) { pdf_run_processor *pr = (pdf_run_processor *)proc; pdf_gstate *gstate = NULL; @@ -1262,7 +1262,8 @@ pdf_run_xobject(fz_context *ctx, pdf_run_processor *proc, pdf_xobject *xobj, pdf * if it throws an error, we must call fz_end_group. */ cleanup_state = 2; fz_begin_group(ctx, pr->dev, &bbox, - pdf_xobject_isolated(ctx, xobj), + pdf_xobject_colorspace(ctx, xobj), + (is_smask ? 1 : pdf_xobject_isolated(ctx, xobj)), pdf_xobject_knockout(ctx, xobj), gstate->blendmode, gstate->fill.alpha); @@ -1983,7 +1984,7 @@ static void pdf_run_Do_image(fz_context *ctx, pdf_processor *proc, const char *n static void pdf_run_Do_form(fz_context *ctx, pdf_processor *proc, const char *name, pdf_xobject *xobj, pdf_obj *page_resources) { - pdf_run_xobject(ctx, (pdf_run_processor*)proc, xobj, page_resources, &fz_identity); + pdf_run_xobject(ctx, (pdf_run_processor*)proc, xobj, page_resources, &fz_identity, 0); } /* marked content */ |