diff options
Diffstat (limited to 'pdf/pdf_annot.c')
-rw-r--r-- | pdf/pdf_annot.c | 55 |
1 files changed, 31 insertions, 24 deletions
diff --git a/pdf/pdf_annot.c b/pdf/pdf_annot.c index 3ba37da7..32de1eb9 100644 --- a/pdf/pdf_annot.c +++ b/pdf/pdf_annot.c @@ -243,7 +243,7 @@ pdf_parse_action(pdf_document *xref, pdf_obj *action) } static fz_link * -pdf_load_link(pdf_document *xref, pdf_obj *dict, fz_matrix page_ctm) +pdf_load_link(pdf_document *xref, pdf_obj *dict, const fz_matrix *page_ctm) { pdf_obj *dest = NULL; pdf_obj *action; @@ -256,11 +256,11 @@ pdf_load_link(pdf_document *xref, pdf_obj *dict, fz_matrix page_ctm) obj = pdf_dict_gets(dict, "Rect"); if (obj) - bbox = pdf_to_rect(ctx, obj); + pdf_to_rect(ctx, obj, &bbox); else bbox = fz_empty_rect; - bbox = fz_transform_rect(page_ctm, bbox); + fz_transform_rect(&bbox, page_ctm); obj = pdf_dict_gets(dict, "Dest"); if (obj) @@ -279,11 +279,11 @@ pdf_load_link(pdf_document *xref, pdf_obj *dict, fz_matrix page_ctm) } if (ld.kind == FZ_LINK_NONE) return NULL; - return fz_new_link(ctx, bbox, ld); + return fz_new_link(ctx, &bbox, ld); } fz_link * -pdf_load_link_annots(pdf_document *xref, pdf_obj *annots, fz_matrix page_ctm) +pdf_load_link_annots(pdf_document *xref, pdf_obj *annots, const fz_matrix *page_ctm) { fz_link *link, *head, *tail; pdf_obj *obj; @@ -332,12 +332,11 @@ pdf_free_annot(fz_context *ctx, pdf_annot *annot) static void pdf_transform_annot(pdf_annot *annot) { - fz_matrix matrix = annot->ap->matrix; fz_rect bbox = annot->ap->bbox; fz_rect rect = annot->rect; float w, h, x, y; - bbox = fz_transform_rect(matrix, bbox); + fz_transform_rect(&bbox, &annot->ap->matrix); if (bbox.x1 == bbox.x0) w = 0; else @@ -349,7 +348,7 @@ pdf_transform_annot(pdf_annot *annot) x = rect.x0 - bbox.x0; y = rect.y0 - bbox.y0; - annot->matrix = fz_concat(fz_scale(w, h), fz_translate(x, y)); + fz_pre_scale(fz_translate(&annot->matrix, x, y), w, h); } pdf_annot * @@ -402,8 +401,9 @@ pdf_load_annots(pdf_document *xref, pdf_obj *annots, pdf_page *page) annot = fz_malloc_struct(ctx, pdf_annot); annot->page = page; annot->obj = pdf_keep_obj(obj); - annot->rect = pdf_to_rect(ctx, rect); - annot->pagerect = fz_transform_rect(page->ctm, annot->rect); + pdf_to_rect(ctx, rect, &annot->rect); + annot->pagerect = annot->rect; + fz_transform_rect(&annot->pagerect, &page->ctm); annot->ap = NULL; annot->type = pdf_field_type(xref, obj); @@ -501,12 +501,17 @@ pdf_next_annot(pdf_document *doc, pdf_annot *annot) return annot ? annot->next : NULL; } -fz_rect -pdf_bound_annot(pdf_document *doc, pdf_annot *annot) +fz_rect * +pdf_bound_annot(pdf_document *doc, pdf_annot *annot, fz_rect *rect) { + if (rect == NULL) + return NULL; + if (annot) - return annot->pagerect; - return fz_empty_rect; + *rect = annot->pagerect; + else + *rect = fz_empty_rect; + return rect; } pdf_annot * @@ -541,7 +546,7 @@ pdf_create_annot(pdf_document *doc, pdf_page *page, fz_annot_type type) } pdf_dict_puts_drop(annot_obj, "Subtype", pdf_new_name(ctx, type_str)); - pdf_dict_puts_drop(annot_obj, "Rect", pdf_new_rect(ctx, rect)); + pdf_dict_puts_drop(annot_obj, "Rect", pdf_new_rect(ctx, &rect)); annot = fz_malloc_struct(ctx, pdf_annot); annot->page = page; @@ -588,20 +593,21 @@ void pdf_set_annot_appearance(pdf_document *doc, pdf_annot *annot, fz_display_list *disp_list) { fz_context *ctx = doc->ctx; - fz_matrix ctm = fz_invert_matrix(annot->page->ctm); + fz_matrix ctm; fz_rect rect; fz_matrix mat = fz_identity; fz_device *dev = fz_new_bbox_device(ctx, &rect); + fz_invert_matrix(&ctm, &annot->page->ctm); fz_try(ctx) { pdf_obj *ap_obj; - fz_run_display_list(disp_list, dev, ctm, fz_infinite_rect, NULL); + fz_run_display_list(disp_list, dev, &ctm, &fz_infinite_rect, NULL); fz_free_device(dev); dev = NULL; - pdf_dict_puts_drop(annot->obj, "Rect", pdf_new_rect(ctx, rect)); + pdf_dict_puts_drop(annot->obj, "Rect", pdf_new_rect(ctx, &rect)); /* See if there is a current normal appearance */ ap_obj = pdf_dict_getp(annot->obj, "AP/N"); @@ -610,13 +616,13 @@ 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, &rect, &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, "Matrix", pdf_new_matrix(ctx, mat)); + pdf_dict_puts_drop(ap_obj, "Rect", pdf_new_rect(ctx, &rect)); + pdf_dict_puts_drop(ap_obj, "Matrix", pdf_new_matrix(ctx, &mat)); } /* Remove annot reference to the xobject and don't recreate it @@ -625,10 +631,11 @@ pdf_set_annot_appearance(pdf_document *doc, pdf_annot *annot, fz_display_list *d annot->ap = NULL; annot->rect = rect; - annot->pagerect = fz_transform_rect(annot->page->ctm, rect); + annot->pagerect = rect; + fz_transform_rect(&annot->pagerect, &annot->page->ctm); - 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); + 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); fz_free_device(dev); doc->dirty = 1; |