summaryrefslogtreecommitdiff
path: root/pdf/pdf_annot.c
diff options
context:
space:
mode:
Diffstat (limited to 'pdf/pdf_annot.c')
-rw-r--r--pdf/pdf_annot.c55
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;