summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/mupdf/pdf/annot.h6
-rw-r--r--source/pdf/pdf-annot-edit.c26
-rw-r--r--source/pdf/pdf-annot.c12
-rw-r--r--source/pdf/pdf-appearance.c51
-rw-r--r--source/pdf/pdf-form.c6
-rw-r--r--source/pdf/pdf-page.c7
6 files changed, 59 insertions, 49 deletions
diff --git a/include/mupdf/pdf/annot.h b/include/mupdf/pdf/annot.h
index 16e00c17..499a56fc 100644
--- a/include/mupdf/pdf/annot.h
+++ b/include/mupdf/pdf/annot.h
@@ -61,8 +61,6 @@ struct pdf_annot_s
pdf_page *page;
pdf_obj *obj;
- fz_matrix page_ctm;
-
pdf_xobject *ap;
int ap_iteration;
@@ -80,7 +78,7 @@ pdf_obj *pdf_load_name_tree(fz_context *ctx, pdf_document *doc, pdf_obj *which);
fz_link *pdf_load_link_annots(fz_context *ctx, pdf_document *, pdf_obj *annots, const fz_matrix *page_ctm);
void pdf_annot_transform(fz_context *ctx, pdf_annot *annot, fz_matrix *annot_ctm);
-void pdf_load_annots(fz_context *ctx, pdf_document *, pdf_page *page, pdf_obj *annots, const fz_matrix *page_transform);
+void pdf_load_annots(fz_context *ctx, pdf_document *, pdf_page *page, pdf_obj *annots);
void pdf_update_annot(fz_context *ctx, pdf_document *, pdf_annot *annot);
void pdf_drop_annots(fz_context *ctx, pdf_annot *annot_list);
@@ -152,6 +150,6 @@ pdf_annot *pdf_poll_changed_annot(fz_context *ctx, pdf_document *idoc, pdf_page
/*
pdf_new_annot: Internal function for creating a new pdf annotation.
*/
-pdf_annot *pdf_new_annot(fz_context *ctx, pdf_page *page, const fz_matrix *page_ctm);
+pdf_annot *pdf_new_annot(fz_context *ctx, pdf_page *page);
#endif
diff --git a/source/pdf/pdf-annot-edit.c b/source/pdf/pdf-annot-edit.c
index fe75823c..9f7e74bd 100644
--- a/source/pdf/pdf-annot-edit.c
+++ b/source/pdf/pdf-annot-edit.c
@@ -91,8 +91,6 @@ pdf_create_annot(fz_context *ctx, pdf_document *doc, pdf_page *page, fz_annot_ty
pdf_annot *annot = NULL;
pdf_obj *annot_obj = pdf_new_dict(ctx, doc, 0);
pdf_obj *ind_obj = NULL;
- fz_rect mediabox;
- fz_matrix page_ctm;
fz_var(annot);
fz_var(ind_obj);
@@ -116,9 +114,7 @@ pdf_create_annot(fz_context *ctx, pdf_document *doc, pdf_page *page, fz_annot_ty
/* Make printable as default */
pdf_dict_put_drop(ctx, annot_obj, PDF_NAME_F, pdf_new_int(ctx, doc, F_Print));
- pdf_page_transform(ctx, page, &mediabox, &page_ctm);
-
- annot = pdf_new_annot(ctx, page, &page_ctm);
+ annot = pdf_new_annot(ctx, page);
annot->ap = NULL;
/*
@@ -234,10 +230,11 @@ void
pdf_set_markup_annot_quadpoints(fz_context *ctx, pdf_document *doc, pdf_annot *annot, fz_point *qp, int n)
{
pdf_obj *arr = pdf_new_array(ctx, doc, n*2);
- fz_matrix inv_page_ctm;
+ fz_matrix page_ctm, inv_page_ctm;
int i;
- fz_invert_matrix(&inv_page_ctm, &annot->page_ctm);
+ pdf_page_transform(ctx, annot->page, NULL, &page_ctm);
+ fz_invert_matrix(&inv_page_ctm, &page_ctm);
pdf_dict_put_drop(ctx, annot->obj, PDF_NAME_QuadPoints, arr);
@@ -258,12 +255,13 @@ void
pdf_set_ink_annot_list(fz_context *ctx, pdf_document *doc, pdf_annot *annot, fz_point *pts, int *counts, int ncount, float color[3], float thickness)
{
pdf_obj *list = pdf_new_array(ctx, doc, ncount);
- fz_matrix inv_page_ctm;
+ fz_matrix page_ctm, inv_page_ctm;
pdf_obj *bs, *col;
fz_rect rect;
int i, k = 0;
- fz_invert_matrix(&inv_page_ctm, &annot->page_ctm);
+ pdf_page_transform(ctx, annot->page, NULL, &page_ctm);
+ fz_invert_matrix(&inv_page_ctm, &page_ctm);
pdf_dict_put_drop(ctx, annot->obj, PDF_NAME_InkList, list);
@@ -337,11 +335,12 @@ static void find_free_font_name(fz_context *ctx, pdf_obj *fdict, char *buf, int
void pdf_set_text_annot_position(fz_context *ctx, pdf_document *doc, pdf_annot *annot, fz_point pt)
{
- fz_matrix inv_page_ctm;
+ fz_matrix page_ctm, inv_page_ctm;
fz_rect rect;
int flags;
- fz_invert_matrix(&inv_page_ctm, &annot->page_ctm);
+ pdf_page_transform(ctx, annot->page, NULL, &page_ctm);
+ fz_invert_matrix(&inv_page_ctm, &page_ctm);
rect.x0 = pt.x;
rect.x1 = pt.x + TEXT_ANNOT_SIZE;
@@ -389,12 +388,13 @@ void pdf_set_free_text_details(fz_context *ctx, pdf_document *doc, pdf_annot *an
pdf_obj *font = NULL;
pdf_obj *ref;
pdf_font_desc *font_desc = NULL;
- fz_matrix inv_page_ctm;
+ fz_matrix page_ctm, inv_page_ctm;
pdf_da_info da_info;
fz_buffer *fzbuf = NULL;
fz_point page_pos;
- fz_invert_matrix(&inv_page_ctm, &annot->page_ctm);
+ pdf_page_transform(ctx, annot->page, NULL, &page_ctm);
+ fz_invert_matrix(&inv_page_ctm, &page_ctm);
dr = pdf_dict_get(ctx, annot->page->obj, PDF_NAME_Resources);
if (!dr)
diff --git a/source/pdf/pdf-annot.c b/source/pdf/pdf-annot.c
index 68da8494..b456f2b0 100644
--- a/source/pdf/pdf-annot.c
+++ b/source/pdf/pdf-annot.c
@@ -485,7 +485,7 @@ fz_annot_type pdf_annot_type(fz_context *ctx, pdf_annot *annot)
return -1;
}
-pdf_annot *pdf_new_annot(fz_context *ctx, pdf_page *page, const fz_matrix *page_ctm)
+pdf_annot *pdf_new_annot(fz_context *ctx, pdf_page *page)
{
pdf_annot *annot = fz_new_annot(ctx, sizeof(pdf_annot));
@@ -495,13 +495,12 @@ pdf_annot *pdf_new_annot(fz_context *ctx, pdf_page *page, const fz_matrix *page_
annot->super.next_annot = (fz_annot_next_fn*)pdf_next_annot;
annot->page = page;
- annot->page_ctm = *page_ctm;
return annot;
}
void
-pdf_load_annots(fz_context *ctx, pdf_document *doc, pdf_page *page, pdf_obj *annots, const fz_matrix *page_ctm)
+pdf_load_annots(fz_context *ctx, pdf_document *doc, pdf_page *page, pdf_obj *annots)
{
pdf_annot *annot, **itr;
pdf_obj *obj, *ap, *as, *n;
@@ -526,7 +525,7 @@ pdf_load_annots(fz_context *ctx, pdf_document *doc, pdf_page *page, pdf_obj *ann
{
obj = pdf_array_get(ctx, annots, i);
- annot = pdf_new_annot(ctx, page, page_ctm);
+ annot = pdf_new_annot(ctx, page);
*itr = annot;
annot->obj = pdf_keep_obj(ctx, obj);
itr = &annot->next;
@@ -635,7 +634,10 @@ fz_rect *
pdf_bound_annot(fz_context *ctx, pdf_annot *annot, fz_rect *rect)
{
pdf_obj *obj = pdf_dict_get(ctx, annot->obj, PDF_NAME_Rect);
+ fz_rect mediabox;
+ fz_matrix page_ctm;
pdf_to_rect(ctx, obj, rect);
- fz_transform_rect(rect, &annot->page_ctm);
+ pdf_page_transform(ctx, annot->page, &mediabox, &page_ctm);
+ fz_transform_rect(rect, &page_ctm);
return rect;
}
diff --git a/source/pdf/pdf-appearance.c b/source/pdf/pdf-appearance.c
index ff1aa4fa..e2690c0c 100644
--- a/source/pdf/pdf-appearance.c
+++ b/source/pdf/pdf-appearance.c
@@ -1569,12 +1569,13 @@ void pdf_set_annot_appearance(fz_context *ctx, pdf_document *doc, pdf_annot *ann
pdf_obj *obj = annot->obj;
fz_device *dev = NULL;
pdf_xobject *xobj = NULL;
- fz_matrix inv_page_ctm;
+ fz_matrix page_ctm, inv_page_ctm;
pdf_obj *resources;
fz_buffer *contents;
- fz_invert_matrix(&inv_page_ctm, &annot->page_ctm);
+ pdf_page_transform(ctx, annot->page, NULL, &page_ctm);
+ fz_invert_matrix(&inv_page_ctm, &page_ctm);
fz_var(dev);
fz_try(ctx)
@@ -1674,13 +1675,15 @@ quadpoints(fz_context *ctx, pdf_document *doc, pdf_obj *annot, int *nout)
void pdf_set_markup_appearance(fz_context *ctx, pdf_document *doc, pdf_annot *annot, float color[3], float alpha, float line_thickness, float line_height)
{
- const fz_matrix *page_ctm = &annot->page_ctm;
fz_path *path = NULL;
fz_stroke_state *stroke = NULL;
fz_device *dev = NULL;
fz_display_list *strike_list = NULL;
int i, n;
fz_point *qp = quadpoints(ctx, doc, annot->obj, &n);
+ fz_matrix page_ctm;
+
+ pdf_page_transform(ctx, annot->page, NULL, &page_ctm);
if (!qp || n <= 0)
return;
@@ -1723,7 +1726,7 @@ void pdf_set_markup_appearance(fz_context *ctx, pdf_document *doc, pdf_annot *an
if (stroke)
{
// assert(path)
- fz_stroke_path(ctx, dev, path, stroke, page_ctm, fz_device_rgb(ctx), color, alpha);
+ fz_stroke_path(ctx, dev, path, stroke, &page_ctm, fz_device_rgb(ctx), color, alpha);
fz_drop_stroke_state(ctx, stroke);
stroke = NULL;
fz_drop_path(ctx, path);
@@ -1741,10 +1744,10 @@ void pdf_set_markup_appearance(fz_context *ctx, pdf_document *doc, pdf_annot *an
if (stroke)
{
- fz_stroke_path(ctx, dev, path, stroke, page_ctm, fz_device_rgb(ctx), color, alpha);
+ fz_stroke_path(ctx, dev, path, stroke, &page_ctm, fz_device_rgb(ctx), color, alpha);
}
- fz_transform_rect(&rect, page_ctm);
+ fz_transform_rect(&rect, &page_ctm);
pdf_set_annot_appearance(ctx, doc, annot, &rect, strike_list);
}
fz_always(ctx)
@@ -1782,12 +1785,14 @@ static fz_colorspace *pdf_to_color(fz_context *ctx, pdf_document *doc, pdf_obj *
void pdf_update_ink_appearance(fz_context *ctx, pdf_document *doc, pdf_annot *annot)
{
- const fz_matrix *page_ctm = &annot->page_ctm;
fz_path *path = NULL;
fz_stroke_state *stroke = NULL;
fz_device *dev = NULL;
fz_display_list *strike_list = NULL;
fz_colorspace *cs = NULL;
+ fz_matrix page_ctm;
+
+ pdf_page_transform(ctx, annot->page, NULL, &page_ctm);
fz_var(path);
fz_var(stroke);
@@ -1860,7 +1865,7 @@ void pdf_update_ink_appearance(fz_context *ctx, pdf_document *doc, pdf_annot *an
fz_lineto(ctx, path, pt_last.x, pt_last.y);
}
- fz_stroke_path(ctx, dev, path, stroke, page_ctm, cs, color, 1.0f);
+ fz_stroke_path(ctx, dev, path, stroke, &page_ctm, cs, color, 1.0f);
fz_expand_rect(&rect, width);
/*
@@ -1876,7 +1881,7 @@ void pdf_update_ink_appearance(fz_context *ctx, pdf_document *doc, pdf_annot *an
rect.y1 += width;
}
- fz_transform_rect(&rect, page_ctm);
+ fz_transform_rect(&rect, &page_ctm);
pdf_set_annot_appearance(ctx, doc, annot, &rect, strike_list);
}
fz_always(ctx)
@@ -2079,12 +2084,14 @@ void pdf_update_text_annot_appearance(fz_context *ctx, pdf_document *doc, pdf_an
static float yellow[3] = {1.0, 1.0, 0.0};
static float black[3] = {0.0, 0.0, 0.0};
- const fz_matrix *page_ctm = &annot->page_ctm;
fz_display_list *dlist = NULL;
fz_device *dev = NULL;
fz_colorspace *cs = NULL;
fz_path *path = NULL;
fz_stroke_state *stroke = NULL;
+ fz_matrix page_ctm;
+
+ pdf_page_transform(ctx, annot->page, NULL, &page_ctm);
fz_var(path);
fz_var(stroke);
@@ -2109,7 +2116,7 @@ void pdf_update_text_annot_appearance(fz_context *ctx, pdf_document *doc, pdf_an
fz_bound_path(ctx, path, NULL, &fz_identity, &bounds);
fz_expand_rect(&bounds, outline_thickness);
center_rect_within_rect(&bounds, &rect, &tm);
- fz_concat(&tm, &tm, page_ctm);
+ fz_concat(&tm, &tm, &page_ctm);
cs = fz_device_rgb(ctx);
fz_fill_path(ctx, dev, path, 0, &tm, cs, yellow, 1.0f);
fz_stroke_path(ctx, dev, path, stroke, &tm, cs, black, 1.0f);
@@ -2121,7 +2128,7 @@ void pdf_update_text_annot_appearance(fz_context *ctx, pdf_document *doc, pdf_an
fz_fill_path(ctx, dev, path, 0, &tm, cs, white, 1.0f);
fz_stroke_path(ctx, dev, path, stroke, &tm, cs, black, 1.0f);
- fz_transform_rect(&rect, page_ctm);
+ fz_transform_rect(&rect, &page_ctm);
pdf_set_annot_appearance(ctx, doc, annot, &rect, dlist);
/* Drop the cached xobject from the annotation structure to
@@ -2145,7 +2152,6 @@ void pdf_update_text_annot_appearance(fz_context *ctx, pdf_document *doc, pdf_an
void pdf_update_free_text_annot_appearance(fz_context *ctx, pdf_document *doc, pdf_annot *annot)
{
- const fz_matrix *page_ctm = &annot->page_ctm;
pdf_obj *obj = annot->obj;
pdf_obj *dr = pdf_dict_get(ctx, annot->page->obj, PDF_NAME_Resources);
fz_display_list *dlist = NULL;
@@ -2153,6 +2159,9 @@ void pdf_update_free_text_annot_appearance(fz_context *ctx, pdf_document *doc, p
font_info font_rec;
fz_text *text = NULL;
fz_colorspace *cs = NULL;
+ fz_matrix page_ctm;
+
+ pdf_page_transform(ctx, annot->page, NULL, &page_ctm);
memset(&font_rec, 0, sizeof(font_rec));
@@ -2190,9 +2199,9 @@ void pdf_update_free_text_annot_appearance(fz_context *ctx, pdf_document *doc, p
dlist = fz_new_display_list(ctx, NULL);
dev = fz_new_list_device(ctx, dlist);
- fz_fill_text(ctx, dev, text, page_ctm, cs, font_rec.da_rec.col, 1.0f);
+ fz_fill_text(ctx, dev, text, &page_ctm, cs, font_rec.da_rec.col, 1.0f);
- fz_transform_rect(&rect, page_ctm);
+ fz_transform_rect(&rect, &page_ctm);
pdf_set_annot_appearance(ctx, doc, annot, &rect, dlist);
}
fz_always(ctx)
@@ -2331,7 +2340,6 @@ static float logo_color[3] = {(float)0x25/(float)0xFF, (float)0x72/(float)0xFF,
void pdf_set_signature_appearance(fz_context *ctx, pdf_document *doc, pdf_annot *annot, char *name, char *dn, char *date)
{
- const fz_matrix *page_ctm = &annot->page_ctm;
pdf_obj *obj = annot->obj;
pdf_obj *dr = pdf_dict_getl(ctx, pdf_trailer(ctx, doc), PDF_NAME_Root, PDF_NAME_AcroForm, PDF_NAME_DR, NULL);
fz_display_list *dlist = NULL;
@@ -2341,6 +2349,9 @@ void pdf_set_signature_appearance(fz_context *ctx, pdf_document *doc, pdf_annot
fz_colorspace *cs = NULL;
fz_path *path = NULL;
fz_buffer *fzbuf = NULL;
+ fz_matrix page_ctm;
+
+ pdf_page_transform(ctx, annot->page, NULL, &page_ctm);
if (!dr)
pdf_dict_putl_drop(ctx, pdf_trailer(ctx, doc), pdf_new_dict(ctx, doc, 1), PDF_NAME_Root, PDF_NAME_AcroForm, PDF_NAME_DR, NULL);
@@ -2372,7 +2383,7 @@ void pdf_set_signature_appearance(fz_context *ctx, pdf_document *doc, pdf_annot
draw_logo(ctx, path);
fz_bound_path(ctx, path, NULL, &fz_identity, &logo_bounds);
center_rect_within_rect(&logo_bounds, &rect, &logo_tm);
- fz_concat(&logo_tm, &logo_tm, page_ctm);
+ fz_concat(&logo_tm, &logo_tm, &page_ctm);
cs = fz_device_rgb(ctx);
fz_fill_path(ctx, dev, path, 0, &logo_tm, cs, logo_color, 1.0f);
fz_drop_colorspace(ctx, cs);
@@ -2390,7 +2401,7 @@ void pdf_set_signature_appearance(fz_context *ctx, pdf_document *doc, pdf_annot
/* Display the name in the left-hand half of the form field */
rect.x1 = (rect.x0 + rect.x1)/2.0f;
text = fit_text(ctx, &font_rec, name, &rect);
- fz_fill_text(ctx, dev, text, page_ctm, cs, font_rec.da_rec.col, 1.0f);
+ fz_fill_text(ctx, dev, text, &page_ctm, cs, font_rec.da_rec.col, 1.0f);
fz_drop_text(ctx, text);
text = NULL;
@@ -2404,10 +2415,10 @@ void pdf_set_signature_appearance(fz_context *ctx, pdf_document *doc, pdf_annot
rect = annot_rect;
rect.x0 = (rect.x0 + rect.x1)/2.0f;
text = fit_text(ctx, &font_rec, (char *)bufstr, &rect);
- fz_fill_text(ctx, dev, text, page_ctm, cs, font_rec.da_rec.col, 1.0f);
+ fz_fill_text(ctx, dev, text, &page_ctm, cs, font_rec.da_rec.col, 1.0f);
rect = annot_rect;
- fz_transform_rect(&rect, page_ctm);
+ fz_transform_rect(&rect, &page_ctm);
pdf_set_annot_appearance(ctx, doc, annot, &rect, dlist);
/* Drop the cached xobject from the annotation structure to
diff --git a/source/pdf/pdf-form.c b/source/pdf/pdf-form.c
index d29d7c41..65090a74 100644
--- a/source/pdf/pdf-form.c
+++ b/source/pdf/pdf-form.c
@@ -1168,11 +1168,7 @@ void pdf_field_set_text_color(fz_context *ctx, pdf_document *doc, pdf_obj *field
fz_rect *pdf_bound_widget(fz_context *ctx, pdf_widget *widget, fz_rect *rect)
{
- pdf_annot *annot = (pdf_annot *)widget;
- pdf_obj *obj = pdf_dict_get(ctx, annot->obj, PDF_NAME_Rect);
- pdf_to_rect(ctx, obj, rect);
- fz_transform_rect(rect, &annot->page_ctm);
- return rect;
+ return pdf_bound_annot(ctx, (pdf_annot*)widget, rect);
}
char *pdf_text_widget_text(fz_context *ctx, pdf_document *doc, pdf_widget *tw)
diff --git a/source/pdf/pdf-page.c b/source/pdf/pdf-page.c
index 6a88412d..cc2a4798 100644
--- a/source/pdf/pdf-page.c
+++ b/source/pdf/pdf-page.c
@@ -447,10 +447,13 @@ pdf_page_transform(fz_context *ctx, pdf_page *page, fz_rect *page_mediabox, fz_m
{
pdf_obj *pageobj = page->obj;
pdf_obj *obj;
- fz_rect mediabox, cropbox, realbox;
+ fz_rect mediabox, cropbox, realbox, pagebox;
float userunit = 1;
int rotate;
+ if (!page_mediabox)
+ page_mediabox = &pagebox;
+
obj = pdf_dict_get(ctx, pageobj, PDF_NAME_UserUnit);
if (pdf_is_real(ctx, obj))
userunit = pdf_to_real(ctx, obj);
@@ -584,7 +587,7 @@ pdf_load_page(fz_context *ctx, pdf_document *doc, int number)
fz_matrix page_ctm;
pdf_page_transform(ctx, page, &page_mediabox, &page_ctm);
page->links = pdf_load_link_annots(ctx, doc, obj, &page_ctm);
- pdf_load_annots(ctx, doc, page, obj, &page_ctm);
+ pdf_load_annots(ctx, doc, page, obj);
}
}
fz_catch(ctx)