From f810f1dba5da32f00cd11142eaa31b1a736d1aa0 Mon Sep 17 00:00:00 2001 From: Robin Watts Date: Thu, 1 Oct 2015 19:39:59 +0100 Subject: Bug 696078: Improve box handling in poster tool. The poster tool worked by rewriting the mediabox, but left the other boxes (crop, bleed, trim, art) unchanged. This could cause problems with viewers that didn't intersect such boxes. This update makes the poster tool write intersected boxes for all boxes. --- source/tools/pdfposter.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) (limited to 'source') diff --git a/source/tools/pdfposter.c b/source/tools/pdfposter.c index 1fa077c2..9a58909e 100644 --- a/source/tools/pdfposter.c +++ b/source/tools/pdfposter.c @@ -17,6 +17,38 @@ static void usage(void) exit(1); } +static void +intersect_box(fz_context *ctx, pdf_document *doc, pdf_obj *page, pdf_obj *box_name, const fz_rect *mb) +{ + pdf_obj *box = pdf_dict_get(ctx, page, box_name); + pdf_obj *newbox; + fz_rect old_rect; + + if (box == NULL) + return; + + old_rect.x0 = pdf_to_real(ctx, pdf_array_get(ctx, box, 0)); + old_rect.y0 = pdf_to_real(ctx, pdf_array_get(ctx, box, 1)); + old_rect.x1 = pdf_to_real(ctx, pdf_array_get(ctx, box, 2)); + old_rect.y1 = pdf_to_real(ctx, pdf_array_get(ctx, box, 3)); + + if (old_rect.x0 < mb->x0) + old_rect.x0 = mb->x0; + if (old_rect.y0 < mb->y0) + old_rect.y0 = mb->y0; + if (old_rect.x1 > mb->x1) + old_rect.x1 = mb->x1; + if (old_rect.y1 > mb->y1) + old_rect.y1 = mb->y1; + + newbox = pdf_new_array(ctx, doc, 4); + pdf_array_push(ctx, newbox, pdf_new_real(ctx, doc, old_rect.x0)); + pdf_array_push(ctx, newbox, pdf_new_real(ctx, doc, old_rect.y0)); + pdf_array_push(ctx, newbox, pdf_new_real(ctx, doc, old_rect.x1)); + pdf_array_push(ctx, newbox, pdf_new_real(ctx, doc, old_rect.y1)); + pdf_dict_put(ctx, page, box_name, newbox); +} + /* * Recreate page tree with our posterised pages in. */ @@ -98,6 +130,11 @@ static void decimatepages(fz_context *ctx, pdf_document *doc) pdf_dict_put(ctx, newpageobj, PDF_NAME_Parent, parent); pdf_dict_put(ctx, newpageobj, PDF_NAME_MediaBox, newmediabox); + intersect_box(ctx, doc, newpageobj, PDF_NAME_CropBox, &mb); + intersect_box(ctx, doc, newpageobj, PDF_NAME_BleedBox, &mb); + intersect_box(ctx, doc, newpageobj, PDF_NAME_TrimBox, &mb); + intersect_box(ctx, doc, newpageobj, PDF_NAME_ArtBox, &mb); + /* Store page object in new kids array */ pdf_array_push(ctx, kids, newpageref); -- cgit v1.2.3