summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTor Andersson <tor.andersson@artifex.com>2018-07-11 14:24:19 +0200
committerTor Andersson <tor.andersson@artifex.com>2018-08-10 14:09:46 +0200
commit84c0c62018110e0cbb01d30d4df96b64e0b6899f (patch)
treeeb5fa87e5fce4b7897e68e640302325bd6b20ee7
parent37ed199fcebc73954e694b44033aeca4ab8a417f (diff)
downloadmupdf-84c0c62018110e0cbb01d30d4df96b64e0b6899f.tar.xz
Respect NoRotate flag for icon-based annotations.
-rw-r--r--platform/gl/gl-annotate.c10
-rw-r--r--source/pdf/pdf-annot.c19
-rw-r--r--source/pdf/pdf-run.c13
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)