[gs-commits] mupdf 1.16.1.epub-prerelease-20 Redact all images that in

[email protected] (Tor Andersson) Thu, 31 Oct 2019 12:53:37 +0000 (UTC)
Newsgroups gmane.comp.printing.ghostscript.cvs
Message-ID <[email protected]>
commit 785a1b0ba10aceec341b7a0385833f180bca4d8e
Author: Tor Andersson <[email protected]>
Date:   Wed Oct 30 13:21:31 2019 +0100

    Redact all images that intersect any part of the redaction area.

diff --git a/include/mupdf/pdf/page.h b/include/mupdf/pdf/page.h
index 6f0cc5c..04b623e 100644
--- a/include/mupdf/pdf/page.h
+++ b/include/mupdf/pdf/page.h
@@ -49,6 +49,7 @@ typedef struct pdf_redact_options_s pdf_redact_options;
 struct pdf_redact_options_s
 {
 	int no_black_boxes;
+	int keep_images;
 };
 
 int pdf_redact_page(fz_context *ctx, pdf_document *doc, pdf_page *page, pdf_redact_options *opts);
diff --git a/source/pdf/pdf-clean.c b/source/pdf/pdf-clean.c
index 5c9e608..8df83d0 100644
--- a/source/pdf/pdf-clean.c
+++ b/source/pdf/pdf-clean.c
@@ -484,23 +484,70 @@ pdf_redact_text_filter(fz_context *ctx, void *opaque, int *ucsbuf, int ucslen, f
 	return 0;
 }
 
+static int
+pdf_redact_image_filter(fz_context *ctx, void *opaque, fz_matrix ctm, const char *name, fz_image *image)
+{
+	pdf_page *page = opaque;
+	pdf_annot *annot;
+	pdf_obj *qp;
+	fz_rect area;
+	fz_rect r;
+	fz_quad q;
+	int i, n;
+
+	area = fz_transform_rect(fz_unit_rect, ctm);
+
+	for (annot = pdf_first_annot(ctx, page); annot; annot = pdf_next_annot(ctx, annot))
+	{
+		if (pdf_dict_get(ctx, annot->obj, PDF_NAME(Subtype)) == PDF_NAME(Redact))
+		{
+			qp = pdf_dict_get(ctx, annot->obj, PDF_NAME(QuadPoints));
+			n = pdf_array_len(ctx, qp);
+			if (n > 0)
+			{
+				for (i = 0; i < n; i += 8)
+				{
+					q = pdf_to_quad(ctx, qp, i);
+					r = fz_rect_from_quad(q);
+					r = fz_intersect_rect(r, area);
+					if (!fz_is_empty_rect(r))
+						return 1;
+				}
+			}
+			else
+			{
+				r = pdf_dict_get_rect(ctx, annot->obj, PDF_NAME(Rect));
+				r = fz_intersect_rect(r, area);
+				if (!fz_is_empty_rect(r))
+					return 1;
+			}
+		}
+	}
+
+	return 0;
+}
+
 int
 pdf_redact_page(fz_context *ctx, pdf_document *doc, pdf_page *page, pdf_redact_options *opts)
 {
 	pdf_annot *annot;
 	int has_redactions = 0;
 	int no_black_boxes = 0;
+	int keep_images = 0;
 
 	pdf_filter_options filter;
 
 	if (opts)
 	{
 		no_black_boxes = opts->no_black_boxes;
+		keep_images = opts->keep_images;
 	}
 
 	memset(&filter, 0, sizeof filter);
 	filter.opaque = page;
 	filter.text_filter = pdf_redact_text_filter;
+	if (!keep_images)
+		filter.image_filter = pdf_redact_image_filter;
 	if (!no_black_boxes)
 		filter.end_page = pdf_redact_end_page;
 	filter.recurse = 0; /* don't redact patterns, softmasks, and type3 fonts */

http://git.ghostscript.com/?p=mupdf.git;a=commit;h=785a1b0ba10aceec341b7a0385833f180bca4d8e

--
MuPDF library
Artifex Software, Inc.