From 84c0c62018110e0cbb01d30d4df96b64e0b6899f Mon Sep 17 00:00:00 2001 From: Tor Andersson Date: Wed, 11 Jul 2018 14:24:19 +0200 Subject: Respect NoRotate flag for icon-based annotations. --- platform/gl/gl-annotate.c | 10 ++++++++-- source/pdf/pdf-annot.c | 19 ++++++++++++++++--- source/pdf/pdf-run.c | 13 +++++++++++++ 3 files changed, 37 insertions(+), 5 deletions(-) diff --git a/platform/gl/gl-annotate.c b/platform/gl/gl-annotate.c index aa40cc51..265ab673 100644 --- a/platform/gl/gl-annotate.c +++ b/platform/gl/gl-annotate.c @@ -115,6 +115,8 @@ static void new_annot(int type) case PDF_ANNOT_SOUND: { fz_rect icon_rect = { 12, 12, 12+20, 12+20 }; + pdf_set_annot_flags(ctx, selected_annot, + PDF_ANNOT_IS_PRINT | PDF_ANNOT_IS_NO_ZOOM | PDF_ANNOT_IS_NO_ROTATE); pdf_set_annot_rect(ctx, selected_annot, icon_rect); pdf_set_annot_color(ctx, selected_annot, 3, yellow); } @@ -721,10 +723,14 @@ static void do_edit_icon(fz_irect canvas_area, fz_irect area, fz_rect *rect) /* Commit movement on mouse-up */ if (!ui.down) { + fz_point dp = { rect->x0 - start_pt.x, rect->y0 - start_pt.y }; moving = 0; - if (fz_abs(start_pt.x - rect->x0) > 0.1f || fz_abs(start_pt.x - rect->y0) > 0.1f) + if (fz_abs(dp.x) > 0.1f || fz_abs(dp.y) > 0.1f) { - fz_rect trect = fz_transform_rect(*rect, view_page_inv_ctm); + fz_rect trect = pdf_annot_rect(ctx, selected_annot); + dp = fz_transform_vector(dp, view_page_inv_ctm); + trect.x0 += dp.x; trect.x1 += dp.x; + trect.y0 += dp.y; trect.y1 += dp.y; pdf_set_annot_rect(ctx, selected_annot, trect); } } diff --git a/source/pdf/pdf-annot.c b/source/pdf/pdf-annot.c index 1c17882c..85c0f28b 100644 --- a/source/pdf/pdf-annot.c +++ b/source/pdf/pdf-annot.c @@ -128,10 +128,23 @@ fz_rect pdf_bound_annot(fz_context *ctx, pdf_annot *annot) { fz_matrix page_ctm; - fz_rect annot_rect; + fz_rect rect; + int flags; + + rect = pdf_dict_get_rect(ctx, annot->obj, PDF_NAME(Rect)); pdf_page_transform(ctx, annot->page, NULL, &page_ctm); - annot_rect = pdf_dict_get_rect(ctx, annot->obj, PDF_NAME(Rect)); - return fz_transform_rect(annot_rect, page_ctm); + + flags = pdf_dict_get_int(ctx, annot->obj, PDF_NAME(F)); + if (flags & PDF_ANNOT_IS_NO_ROTATE) + { + int rotate = pdf_to_int(ctx, pdf_dict_get_inheritable(ctx, annot->page->obj, PDF_NAME(Rotate))); + fz_point tp = fz_transform_point_xy(rect.x0, rect.y1, page_ctm); + page_ctm = fz_concat(page_ctm, fz_translate(-tp.x, -tp.y)); + page_ctm = fz_concat(page_ctm, fz_rotate(-rotate)); + page_ctm = fz_concat(page_ctm, fz_translate(tp.x, tp.y)); + } + + return fz_transform_rect(rect, page_ctm); } void diff --git a/source/pdf/pdf-run.c b/source/pdf/pdf-run.c index 5e4badf3..c9e56622 100644 --- a/source/pdf/pdf-run.c +++ b/source/pdf/pdf-run.c @@ -8,6 +8,7 @@ pdf_run_annot_with_usage(fz_context *ctx, pdf_document *doc, pdf_page *page, pdf fz_rect mediabox; pdf_processor *proc = NULL; fz_default_colorspaces *default_cs; + int flags; fz_var(proc); @@ -16,6 +17,18 @@ pdf_run_annot_with_usage(fz_context *ctx, pdf_document *doc, pdf_page *page, pdf fz_set_default_colorspaces(ctx, dev, default_cs); pdf_page_transform(ctx, page, &mediabox, &page_ctm); + + flags = pdf_dict_get_int(ctx, annot->obj, PDF_NAME(F)); + if (flags & PDF_ANNOT_IS_NO_ROTATE) + { + int rotate = pdf_to_int(ctx, pdf_dict_get_inheritable(ctx, page->obj, PDF_NAME(Rotate))); + fz_rect rect = pdf_dict_get_rect(ctx, annot->obj, PDF_NAME(Rect)); + fz_point tp = fz_transform_point_xy(rect.x0, rect.y1, page_ctm); + page_ctm = fz_concat(page_ctm, fz_translate(-tp.x, -tp.y)); + page_ctm = fz_concat(page_ctm, fz_rotate(-rotate)); + page_ctm = fz_concat(page_ctm, fz_translate(tp.x, tp.y)); + } + ctm = fz_concat(page_ctm, ctm); fz_try(ctx) -- cgit v1.2.3