diff options
-rw-r--r-- | android/jni/mupdf.c | 18 | ||||
-rw-r--r-- | fitz/base_geometry.c | 10 | ||||
-rw-r--r-- | fitz/doc_interactive.c | 4 | ||||
-rw-r--r-- | fitz/fitz-internal.h | 2 | ||||
-rw-r--r-- | fitz/fitz.h | 8 | ||||
-rw-r--r-- | pdf/mupdf-internal.h | 2 | ||||
-rw-r--r-- | pdf/pdf_annot.c | 23 |
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); |