From 9afbc5e8f030e749395548df891217c38aa1261e Mon Sep 17 00:00:00 2001 From: Tor Andersson Date: Thu, 7 Jul 2016 14:50:16 +0200 Subject: Slim pdf_annot struct: remove cached page_ctm field. --- source/pdf/pdf-annot-edit.c | 26 +++++++++++------------ source/pdf/pdf-annot.c | 12 ++++++----- source/pdf/pdf-appearance.c | 51 +++++++++++++++++++++++++++------------------ source/pdf/pdf-form.c | 6 +----- source/pdf/pdf-page.c | 7 +++++-- 5 files changed, 57 insertions(+), 45 deletions(-) (limited to 'source/pdf') 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) -- cgit v1.2.3