summaryrefslogtreecommitdiff
path: root/Build/source
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source')
-rw-r--r--Build/source/texk/dvipdfm-x/ChangeLog5
-rw-r--r--Build/source/texk/dvipdfm-x/spc_pdfm.c103
2 files changed, 95 insertions, 13 deletions
diff --git a/Build/source/texk/dvipdfm-x/ChangeLog b/Build/source/texk/dvipdfm-x/ChangeLog
index a1894d9b911..c7a72489024 100644
--- a/Build/source/texk/dvipdfm-x/ChangeLog
+++ b/Build/source/texk/dvipdfm-x/ChangeLog
@@ -1,3 +1,8 @@
+2019-05-08 Shunsaku Hirata <shunsaku.hirata74@gmail.com>
+
+ * spc_pdfm.c: Transformation also applies to annotations
+ created by pdf:ann.
+
2019-05-07 Shunsaku Hirata <shunsaku.hirata74@gmail.com>
* tt_cmap.c: Fix a bug that CFF charset data were not read.
diff --git a/Build/source/texk/dvipdfm-x/spc_pdfm.c b/Build/source/texk/dvipdfm-x/spc_pdfm.c
index f19d9a081cb..52a5df78b1f 100644
--- a/Build/source/texk/dvipdfm-x/spc_pdfm.c
+++ b/Build/source/texk/dvipdfm-x/spc_pdfm.c
@@ -597,6 +597,7 @@ parse_pdf_dict_with_tounicode (const char **pp, const char *endptr, struct touni
return dict;
}
+#define SPC_PDFM_SUPPORT_ANNOT_TRANS 1
static int
spc_handler_pdfm_annot (struct spc_env *spe, struct spc_arg *args)
{
@@ -604,7 +605,6 @@ spc_handler_pdfm_annot (struct spc_env *spe, struct spc_arg *args)
pdf_obj *annot_dict;
pdf_rect rect;
char *ident = NULL;
- pdf_coord cp;
transform_info ti;
skip_white(&args->curptr, args->endptr);
@@ -642,19 +642,96 @@ spc_handler_pdfm_annot (struct spc_env *spe, struct spc_arg *args)
return -1;
}
- cp.x = spe->x_user; cp.y = spe->y_user;
- pdf_dev_transform(&cp, NULL);
- if (ti.flags & INFO_HAS_USER_BBOX) {
- rect.llx = ti.bbox.llx + cp.x;
- rect.lly = ti.bbox.lly + cp.y;
- rect.urx = ti.bbox.urx + cp.x;
- rect.ury = ti.bbox.ury + cp.y;
- } else {
- rect.llx = cp.x;
- rect.lly = cp.y - spe->mag * ti.depth;
- rect.urx = cp.x + spe->mag * ti.width;
- rect.ury = cp.y + spe->mag * ti.height;
+#ifdef SPC_PDFM_SUPPORT_ANNOT_TRANS
+ {
+ pdf_coord cp1, cp2, cp3, cp4;
+ /* QuadPoints not working? */
+#ifdef USE_QUADPOINTS
+ pdf_obj *qpoints;
+#endif
+ if (ti.flags & INFO_HAS_USER_BBOX) {
+ cp1.x = spe->x_user + ti.bbox.llx;
+ cp1.y = spe->y_user + ti.bbox.lly;
+ cp2.x = spe->x_user + ti.bbox.urx;
+ cp2.y = spe->y_user + ti.bbox.lly;
+ cp3.x = spe->x_user + ti.bbox.urx;
+ cp3.y = spe->y_user + ti.bbox.ury;
+ cp4.x = spe->x_user + ti.bbox.llx;
+ cp4.y = spe->y_user + ti.bbox.ury;
+ } else {
+ cp1.x = spe->x_user;
+ cp1.y = spe->y_user - spe->mag * ti.depth;
+ cp2.x = spe->x_user + spe->mag * ti.width;
+ cp2.y = spe->y_user - spe->mag * ti.depth;
+ cp3.x = spe->x_user + spe->mag * ti.width;
+ cp3.y = spe->y_user + spe->mag * ti.height;
+ cp4.x = spe->x_user;
+ cp4.y = spe->y_user + spe->mag * ti.height;
+ }
+ pdf_dev_transform(&cp1, NULL);
+ pdf_dev_transform(&cp2, NULL);
+ pdf_dev_transform(&cp3, NULL);
+ pdf_dev_transform(&cp4, NULL);
+ rect.llx = cp1.x;
+ if (cp2.x < rect.llx)
+ rect.llx = cp2.x;
+ if (cp3.x < rect.llx)
+ rect.llx = cp3.x;
+ if (cp4.x < rect.llx)
+ rect.llx = cp4.x;
+ rect.urx = cp1.x;
+ if (cp2.x > rect.urx)
+ rect.urx = cp2.x;
+ if (cp3.x > rect.urx)
+ rect.urx = cp3.x;
+ if (cp4.x > rect.urx)
+ rect.urx = cp4.x;
+ rect.lly = cp1.y;
+ if (cp2.y < rect.lly)
+ rect.lly = cp2.y;
+ if (cp3.y < rect.lly)
+ rect.lly = cp3.y;
+ if (cp4.y < rect.lly)
+ rect.lly = cp4.y;
+ rect.ury = cp1.y;
+ if (cp2.y > rect.ury)
+ rect.ury = cp2.y;
+ if (cp3.y > rect.ury)
+ rect.ury = cp3.y;
+ if (cp4.y > rect.ury)
+ rect.ury = cp4.y;
+#ifdef USE_QUADPOINTS
+ qpoints = pdf_new_array();
+ pdf_add_array(qpoints, pdf_new_number(ROUND(cp1.x, 0.01)));
+ pdf_add_array(qpoints, pdf_new_number(ROUND(cp1.y, 0.01)));
+ pdf_add_array(qpoints, pdf_new_number(ROUND(cp2.x, 0.01)));
+ pdf_add_array(qpoints, pdf_new_number(ROUND(cp2.y, 0.01)));
+ pdf_add_array(qpoints, pdf_new_number(ROUND(cp3.x, 0.01)));
+ pdf_add_array(qpoints, pdf_new_number(ROUND(cp3.y, 0.01)));
+ pdf_add_array(qpoints, pdf_new_number(ROUND(cp4.x, 0.01)));
+ pdf_add_array(qpoints, pdf_new_number(ROUND(cp4.y, 0.01)));
+ pdf_add_dict(annot_dict, pdf_new_name("QuadPoints"), qpoints);
+#endif
}
+#else
+ {
+ pdf_coord cp;
+
+ cp.x = spe->x_user; cp.y = spe->y_user;
+ pdf_dev_transform(&cp, NULL);
+ if (ti.flags & INFO_HAS_USER_BBOX) {
+ rect.llx = ti.bbox.llx + cp.x;
+ rect.lly = ti.bbox.lly + cp.y;
+ rect.urx = ti.bbox.urx + cp.x;
+ rect.ury = ti.bbox.ury + cp.y;
+ } else {
+ rect.llx = cp.x;
+ rect.lly = cp.y - spe->mag * ti.depth;
+ rect.urx = cp.x + spe->mag * ti.width;
+ rect.ury = cp.y + spe->mag * ti.height;
+ }
+ }
+#endif
/* Order is important... */
if (ident)