[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.