summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--android/jni/mupdf.c18
-rw-r--r--fitz/base_geometry.c10
-rw-r--r--fitz/doc_interactive.c4
-rw-r--r--fitz/fitz-internal.h2
-rw-r--r--fitz/fitz.h8
-rw-r--r--pdf/mupdf-internal.h2
-rw-r--r--pdf/pdf_annot.c23
7 files changed, 47 insertions, 20 deletions
diff --git a/android/jni/mupdf.c b/android/jni/mupdf.c
index 26af9149..1c717f91 100644
--- a/android/jni/mupdf.c
+++ b/android/jni/mupdf.c
@@ -1427,6 +1427,7 @@ JNI_FN(MuPDFCore_addMarkupAnnotationInternal)(JNIEnv * env, jobject thiz, jobjec
{
fz_annot *annot;
fz_matrix ctm;
+ fz_rect rect = fz_empty_rect;
float zoom = glo->resolution / 72;
zoom = 1.0 / zoom;
@@ -1449,6 +1450,17 @@ JNI_FN(MuPDFCore_addMarkupAnnotationInternal)(JNIEnv * env, jobject thiz, jobjec
jobject opt = (*env)->GetObjectArrayElement(env, points, i);
pts[i].x = opt ? (*env)->GetFloatField(env, opt, x_fid) : 0.0f;
pts[i].y = opt ? (*env)->GetFloatField(env, opt, y_fid) : 0.0f;
+ fz_transform_point(&pts[i], &ctm);
+
+ if (i == 0)
+ {
+ rect.x0 = rect.x1 = pts[i].x;
+ rect.y0 = rect.y1 = pts[i].y;
+ }
+ else
+ {
+ fz_include_point_in_rect(&rect, &pts[i]);
+ }
}
annot = fz_create_annot(idoc, pc->page, type);
@@ -1477,7 +1489,7 @@ JNI_FN(MuPDFCore_addMarkupAnnotationInternal)(JNIEnv * env, jobject thiz, jobjec
if (stroke)
{
// assert(path)
- fz_stroke_path(dev, path, stroke, &ctm, fz_device_rgb, color, alpha);
+ fz_stroke_path(dev, path, stroke, &fz_identity, fz_device_rgb, color, alpha);
fz_drop_stroke_state(ctx, stroke);
stroke = NULL;
fz_free_path(ctx, path);
@@ -1495,10 +1507,10 @@ JNI_FN(MuPDFCore_addMarkupAnnotationInternal)(JNIEnv * env, jobject thiz, jobjec
if (stroke)
{
- fz_stroke_path(dev, path, stroke, &ctm, fz_device_rgb, color, alpha);
+ fz_stroke_path(dev, path, stroke, &fz_identity, fz_device_rgb, color, alpha);
}
- fz_set_annot_appearance(idoc, annot, strike_list);
+ fz_set_annot_appearance(idoc, annot, &rect, strike_list);
dump_annotation_display_lists(glo);
}
fz_always(ctx)
diff --git a/fitz/base_geometry.c b/fitz/base_geometry.c
index 378fd266..7f589ff5 100644
--- a/fitz/base_geometry.c
+++ b/fitz/base_geometry.c
@@ -459,3 +459,13 @@ fz_expand_rect(fz_rect *a, float expand)
a->y1 += expand;
return a;
}
+
+fz_rect *fz_include_point_in_rect(fz_rect *r, const fz_point *p)
+{
+ if (p->x < r->x0) r->x0 = p->x;
+ if (p->x > r->x1) r->x1 = p->x;
+ if (p->y < r->y0) r->y0 = p->y;
+ if (p->y > r->y1) r->y1 = p->y;
+
+ return r;
+} \ No newline at end of file
diff --git a/fitz/doc_interactive.c b/fitz/doc_interactive.c
index c39cf05d..a14b87d6 100644
--- a/fitz/doc_interactive.c
+++ b/fitz/doc_interactive.c
@@ -96,9 +96,9 @@ void fz_delete_annot(fz_interactive *idoc, fz_page *page, fz_annot *annot)
pdf_delete_annot((pdf_document *)idoc, (pdf_page *)page, (pdf_annot *)annot);
}
-void fz_set_annot_appearance(fz_interactive *idoc, fz_annot *annot, fz_display_list *disp_list)
+void fz_set_annot_appearance(fz_interactive *idoc, fz_annot *annot, fz_rect *rect, fz_display_list *disp_list)
{
- pdf_set_annot_appearance((pdf_document *)idoc, (pdf_annot *)annot, disp_list);
+ pdf_set_annot_appearance((pdf_document *)idoc, (pdf_annot *)annot, rect, disp_list);
}
void fz_set_markup_annot_quadpoints(fz_interactive *idoc, fz_annot *annot, fz_point *qp, int n)
diff --git a/fitz/fitz-internal.h b/fitz/fitz-internal.h
index c1751fe9..d0fc01e2 100644
--- a/fitz/fitz-internal.h
+++ b/fitz/fitz-internal.h
@@ -1209,7 +1209,7 @@ void fz_delete_annot(fz_interactive *idoc, fz_page *page, fz_annot *annot);
fz_set_annot_appearance: update the appearance of an annotation based
on a display list.
*/
-void fz_set_annot_appearance(fz_interactive *idoc, fz_annot *annot, fz_display_list *disp_list);
+void fz_set_annot_appearance(fz_interactive *idoc, fz_annot *annot, fz_rect *rect, fz_display_list *disp_list);
/*
fz_set_markup_annot_quadpoints: set the quadpoints for a text-markup annotation.
diff --git a/fitz/fitz.h b/fitz/fitz.h
index 4c7022d4..29b9cee4 100644
--- a/fitz/fitz.h
+++ b/fitz/fitz.h
@@ -1138,6 +1138,14 @@ fz_rect *fz_rect_from_irect(fz_rect *restrict rect, const fz_irect *restrict bbo
fz_rect *fz_expand_rect(fz_rect *b, float expand);
/*
+ fz_include_point_in_rect: Expand a bbox to include a given point.
+ To create a rectangle that encompasses a sequence of points, the
+ rectangle must first be set to be the empty rectangle at one of
+ the points before including the others.
+*/
+fz_rect *fz_include_point_in_rect(fz_rect *r, const fz_point *p);
+
+/*
fz_translate_irect: Translate bounding box.
Translate a bbox by a given x and y offset. Allows for overflow.
diff --git a/pdf/mupdf-internal.h b/pdf/mupdf-internal.h
index a4e34a8f..e0c0c56a 100644
--- a/pdf/mupdf-internal.h
+++ b/pdf/mupdf-internal.h
@@ -589,7 +589,7 @@ int pdf_choice_widget_value(pdf_document *doc, fz_widget *tw, char *opts[]);
void pdf_choice_widget_set_value(pdf_document *doc, fz_widget *tw, int n, char *opts[]);
pdf_annot *pdf_create_annot(pdf_document *doc, pdf_page *page, fz_annot_type type);
void pdf_delete_annot(pdf_document *doc, pdf_page *page, pdf_annot *annot);
-void pdf_set_annot_appearance(pdf_document *doc, pdf_annot *annot, fz_display_list *disp_list);
+void pdf_set_annot_appearance(pdf_document *doc, pdf_annot *annot, fz_rect *rect, fz_display_list *disp_list);
void pdf_set_markup_annot_quadpoints(pdf_document *doc, pdf_annot *annot, fz_point *qp, int n);
void pdf_set_doc_event_callback(pdf_document *doc, fz_doc_event_cb *event_cb, void *data);
diff --git a/pdf/pdf_annot.c b/pdf/pdf_annot.c
index e79f8c45..db5b10f1 100644
--- a/pdf/pdf_annot.c
+++ b/pdf/pdf_annot.c
@@ -639,7 +639,7 @@ pdf_create_annot(pdf_document *doc, pdf_page *page, fz_annot_type type)
{
int ind_obj_num;
fz_rect rect = {0.0, 0.0, 0.0, 0.0};
- char *type_str = annot_type_str(type);
+ const char *type_str = annot_type_str(type);
pdf_obj *annot_arr = pdf_dict_gets(page->me, "Annots");
if (annot_arr == NULL)
{
@@ -790,24 +790,22 @@ pdf_set_markup_annot_quadpoints(pdf_document *doc, pdf_annot *annot, fz_point *q
}
void
-pdf_set_annot_appearance(pdf_document *doc, pdf_annot *annot, fz_display_list *disp_list)
+pdf_set_annot_appearance(pdf_document *doc, pdf_annot *annot, fz_rect *rect, fz_display_list *disp_list)
{
fz_context *ctx = doc->ctx;
fz_matrix ctm;
- fz_rect rect;
fz_matrix mat = fz_identity;
- fz_device *dev = fz_new_bbox_device(ctx, &rect);
+ fz_device *dev = NULL;
fz_invert_matrix(&ctm, &annot->page->ctm);
fz_try(ctx)
{
pdf_obj *ap_obj;
+ fz_rect trect = *rect;
- fz_run_display_list(disp_list, dev, &ctm, &fz_infinite_rect, NULL);
- fz_free_device(dev);
- dev = NULL;
+ fz_transform_rect(&trect, &ctm);
- pdf_dict_puts_drop(annot->obj, "Rect", pdf_new_rect(ctx, &rect));
+ pdf_dict_puts_drop(annot->obj, "Rect", pdf_new_rect(ctx, &trect));
/* See if there is a current normal appearance */
ap_obj = pdf_dict_getp(annot->obj, "AP/N");
@@ -816,12 +814,12 @@ pdf_set_annot_appearance(pdf_document *doc, pdf_annot *annot, fz_display_list *d
if (ap_obj == NULL)
{
- ap_obj = pdf_new_xobject(doc, &rect, &mat);
+ ap_obj = pdf_new_xobject(doc, &trect, &mat);
pdf_dict_putp_drop(annot->obj, "AP/N", ap_obj);
}
else
{
- pdf_dict_puts_drop(ap_obj, "Rect", pdf_new_rect(ctx, &rect));
+ pdf_dict_puts_drop(ap_obj, "Rect", pdf_new_rect(ctx, &trect));
pdf_dict_puts_drop(ap_obj, "Matrix", pdf_new_matrix(ctx, &mat));
}
@@ -830,9 +828,8 @@ pdf_set_annot_appearance(pdf_document *doc, pdf_annot *annot, fz_display_list *d
pdf_drop_xobject(ctx, annot->ap);
annot->ap = NULL;
- annot->rect = rect;
- annot->pagerect = rect;
- fz_transform_rect(&annot->pagerect, &annot->page->ctm);
+ annot->rect = trect;
+ annot->pagerect = *rect;
dev = pdf_new_pdf_device(doc, ap_obj, pdf_dict_gets(ap_obj, "Resources"), &mat);
fz_run_display_list(disp_list, dev, &ctm, &fz_infinite_rect, NULL);