From abd4c0da5d50cc5b81e430dea3eaa01502370dad Mon Sep 17 00:00:00 2001 From: Robin Watts Date: Thu, 21 Sep 2017 14:10:33 +0100 Subject: Improved overprint (simulation) control. First, we add an fz_page_overprint function to detect if a page uses overprint. Only PDF implements this currently (other formats all return false). PDF looks for '/OP true' in any ExtGState entry. We make Mutool check this. If it finds it, and spot rendering is not completely disabled, then it ensures that the separation object passed to the pixmap into which we draw is non NULL. This causes the draw device to do overprint simulation. We ensure that mutool draw defaults to having the spot rendering mode default to simulation in builds that support it. Finally, we ensure that if an output intent is set by the document, and spot rendering is not completely disabled, then we ensure the seps object is non NULL so that we render to a group in the specified output intent, and THEN convert down to the required colorspace for the output. This should make us match acrobats behaviour. --- source/pdf/pdf-object.c | 22 +++++----- source/pdf/pdf-page.c | 106 +++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 113 insertions(+), 15 deletions(-) (limited to 'source/pdf') diff --git a/source/pdf/pdf-object.c b/source/pdf/pdf-object.c index 2d60edf1..def683d0 100644 --- a/source/pdf/pdf-object.c +++ b/source/pdf/pdf-object.c @@ -28,9 +28,9 @@ enum { PDF_FLAGS_MARKED = 1, PDF_FLAGS_SORTED = 2, - PDF_FLAGS_MEMO = 4, - PDF_FLAGS_MEMO_BOOL = 8, - PDF_FLAGS_DIRTY = 16 + PDF_FLAGS_DIRTY = 4, + PDF_FLAGS_MEMO_BASE = 8, + PDF_FLAGS_MEMO_BASE_BOOL = 16 }; struct pdf_obj_s @@ -1643,26 +1643,28 @@ pdf_unmark_obj(fz_context *ctx, pdf_obj *obj) } void -pdf_set_obj_memo(fz_context *ctx, pdf_obj *obj, int memo) +pdf_set_obj_memo(fz_context *ctx, pdf_obj *obj, int bit, int memo) { if (obj < PDF_OBJ__LIMIT) return; - obj->flags |= PDF_FLAGS_MEMO; + bit <<= 1; + obj->flags |= PDF_FLAGS_MEMO_BASE << bit; if (memo) - obj->flags |= PDF_FLAGS_MEMO_BOOL; + obj->flags |= PDF_FLAGS_MEMO_BASE_BOOL << bit; else - obj->flags &= ~PDF_FLAGS_MEMO_BOOL; + obj->flags &= ~(PDF_FLAGS_MEMO_BASE_BOOL << bit); } int -pdf_obj_memo(fz_context *ctx, pdf_obj *obj, int *memo) +pdf_obj_memo(fz_context *ctx, pdf_obj *obj, int bit, int *memo) { if (obj < PDF_OBJ__LIMIT) return 0; - if (!(obj->flags & PDF_FLAGS_MEMO)) + bit <<= 1; + if (!(obj->flags & (PDF_FLAGS_MEMO_BASE<flags & PDF_FLAGS_MEMO_BOOL); + *memo = !!(obj->flags & (PDF_FLAGS_MEMO_BASE_BOOL<overprint : 0; +} + static void pdf_drop_page_imp(fz_context *ctx, pdf_page *page) { @@ -856,6 +946,7 @@ pdf_new_page(fz_context *ctx, pdf_document *doc) page->super.run_page_contents = (fz_page_run_page_contents_fn*)pdf_run_page_contents; page->super.page_presentation = (fz_page_page_presentation_fn*)pdf_page_presentation; page->super.separations = (fz_page_separations_fn *)pdf_page_separations; + page->super.overprint = (fz_page_uses_overprint_fn *)pdf_page_uses_overprint; page->obj = NULL; @@ -1009,17 +1100,22 @@ pdf_load_page(fz_context *ctx, pdf_document *doc, int number) page->links = NULL; } - /* Scan for transparency */ + /* Scan for transparency and overprint */ fz_try(ctx) { pdf_obj *resources = pdf_page_resources(ctx, page); - if (pdf_resources_use_blending(ctx, resources)) + if (pdf_name_eq(ctx, pdf_dict_getp(ctx, pageobj, "Group/S"), PDF_NAME_Transparency)) page->transparency = 1; - else if (pdf_name_eq(ctx, pdf_dict_getp(ctx, pageobj, "Group/S"), PDF_NAME_Transparency)) + else if (pdf_resources_use_blending(ctx, resources)) page->transparency = 1; for (annot = page->annots; annot && !page->transparency; annot = annot->next) if (annot->ap && pdf_resources_use_blending(ctx, pdf_xobject_resources(ctx, annot->ap))) page->transparency = 1; + if (pdf_resources_use_overprint(ctx, resources)) + page->overprint = 1; + for (annot = page->annots; annot && !page->overprint; annot = annot->next) + if (annot->ap && pdf_resources_use_overprint(ctx, pdf_xobject_resources(ctx, annot->ap))) + page->overprint = 1; } fz_catch(ctx) { -- cgit v1.2.3