diff options
author | Tor Andersson <tor.andersson@artifex.com> | 2016-07-06 13:15:49 +0200 |
---|---|---|
committer | Tor Andersson <tor.andersson@artifex.com> | 2016-07-06 15:49:55 +0200 |
commit | f0eabc17d6ec113c6e765ac3272f19623a6cbd4e (patch) | |
tree | 873d91bfbc610d70e571358550c59d24c8b64ed2 /source/pdf/pdf-annot-edit.c | |
parent | c3944e2e1cfb4ac86a8580829376357e1d5bccda (diff) | |
download | mupdf-f0eabc17d6ec113c6e765ac3272f19623a6cbd4e.tar.xz |
Start slimming pdf_page.
We want to turn pdf_page into a thin wrapper around a pdf_obj, so that
any updates to the underlying PDF objects will be reflected without
having to reload the pdf_page.
Diffstat (limited to 'source/pdf/pdf-annot-edit.c')
-rw-r--r-- | source/pdf/pdf-annot-edit.c | 40 |
1 files changed, 17 insertions, 23 deletions
diff --git a/source/pdf/pdf-annot-edit.c b/source/pdf/pdf-annot-edit.c index e09a6129..4aa856b0 100644 --- a/source/pdf/pdf-annot-edit.c +++ b/source/pdf/pdf-annot-edit.c @@ -92,6 +92,8 @@ 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, inv_page_ctm; fz_var(annot); fz_var(ind_obj); @@ -100,11 +102,11 @@ pdf_create_annot(fz_context *ctx, pdf_document *doc, pdf_page *page, fz_annot_ty int ind_obj_num; fz_rect rect = {0.0, 0.0, 0.0, 0.0}; const char *type_str = annot_type_str(type); - pdf_obj *annot_arr = pdf_dict_get(ctx, page->me, PDF_NAME_Annots); + pdf_obj *annot_arr = pdf_dict_get(ctx, page->obj, PDF_NAME_Annots); if (annot_arr == NULL) { annot_arr = pdf_new_array(ctx, doc, 0); - pdf_dict_put_drop(ctx, page->me, PDF_NAME_Annots, annot_arr); + pdf_dict_put_drop(ctx, page->obj, PDF_NAME_Annots, annot_arr); } pdf_dict_put_drop(ctx, annot_obj, PDF_NAME_Type, PDF_NAME_Annot); @@ -115,7 +117,10 @@ 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)); - annot = pdf_new_annot(ctx, page); + pdf_page_transform(ctx, page, &mediabox, &page_ctm); + fz_invert_matrix(&inv_page_ctm, &page_ctm); + + annot = pdf_new_annot(ctx, page, &page_ctm, &inv_page_ctm); annot->rect = rect; annot->pagerect = rect; annot->ap = NULL; @@ -191,7 +196,7 @@ pdf_delete_annot(fz_context *ctx, pdf_document *doc, pdf_page *page, pdf_annot * annot->ap = NULL; /* Recreate the "Annots" array with this annot removed */ - old_annot_arr = pdf_dict_get(ctx, page->me, PDF_NAME_Annots); + old_annot_arr = pdf_dict_get(ctx, page->obj, PDF_NAME_Annots); if (old_annot_arr) { @@ -211,7 +216,7 @@ pdf_delete_annot(fz_context *ctx, pdf_document *doc, pdf_page *page, pdf_annot * if (pdf_is_indirect(ctx, old_annot_arr)) pdf_update_object(ctx, doc, pdf_to_num(ctx, old_annot_arr), annot_arr); else - pdf_dict_put(ctx, page->me, PDF_NAME_Annots, annot_arr); + pdf_dict_put(ctx, page->obj, PDF_NAME_Annots, annot_arr); if (pdf_is_indirect(ctx, annot->obj)) pdf_delete_object(ctx, doc, pdf_to_num(ctx, annot->obj)); @@ -234,12 +239,9 @@ pdf_delete_annot(fz_context *ctx, pdf_document *doc, pdf_page *page, pdf_annot * void pdf_set_markup_annot_quadpoints(fz_context *ctx, pdf_document *doc, pdf_annot *annot, fz_point *qp, int n) { - fz_matrix ctm; pdf_obj *arr = pdf_new_array(ctx, doc, n*2); int i; - fz_invert_matrix(&ctm, &annot->page->ctm); - pdf_dict_put_drop(ctx, annot->obj, PDF_NAME_QuadPoints, arr); for (i = 0; i < n; i++) @@ -247,7 +249,7 @@ pdf_set_markup_annot_quadpoints(fz_context *ctx, pdf_document *doc, pdf_annot *a fz_point pt = qp[i]; pdf_obj *r; - fz_transform_point(&pt, &ctm); + fz_transform_point(&pt, &annot->inv_page_ctm); r = pdf_new_real(ctx, doc, pt.x); pdf_array_push_drop(ctx, arr, r); r = pdf_new_real(ctx, doc, pt.y); @@ -259,20 +261,17 @@ static void update_rect(fz_context *ctx, pdf_annot *annot) { pdf_to_rect(ctx, pdf_dict_get(ctx, annot->obj, PDF_NAME_Rect), &annot->rect); annot->pagerect = annot->rect; - fz_transform_rect(&annot->pagerect, &annot->page->ctm); + fz_transform_rect(&annot->pagerect, &annot->page_ctm); } 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) { - fz_matrix ctm; pdf_obj *list = pdf_new_array(ctx, doc, ncount); pdf_obj *bs, *col; fz_rect rect; int i, k = 0; - fz_invert_matrix(&ctm, &annot->page->ctm); - pdf_dict_put_drop(ctx, annot->obj, PDF_NAME_InkList, list); for (i = 0; i < ncount; i++) @@ -286,7 +285,7 @@ pdf_set_ink_annot_list(fz_context *ctx, pdf_document *doc, pdf_annot *annot, fz_ { fz_point pt = pts[k]; - fz_transform_point(&pt, &ctm); + fz_transform_point(&pt, &annot->inv_page_ctm); if (i == 0 && j == 0) { @@ -346,16 +345,14 @@ 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 ctm; fz_rect rect; int flags; - fz_invert_matrix(&ctm, &annot->page->ctm); rect.x0 = pt.x; rect.x1 = pt.x + TEXT_ANNOT_SIZE; rect.y0 = pt.y; rect.y1 = pt.y + TEXT_ANNOT_SIZE; - fz_transform_rect(&rect, &ctm); + fz_transform_rect(&rect, &annot->inv_page_ctm); pdf_dict_put_drop(ctx, annot->obj, PDF_NAME_Rect, pdf_new_rect(ctx, doc, &rect)); @@ -401,16 +398,13 @@ void pdf_set_free_text_details(fz_context *ctx, pdf_document *doc, pdf_annot *an pdf_font_desc *font_desc = NULL; pdf_da_info da_info; fz_buffer *fzbuf = NULL; - fz_matrix ctm; fz_point page_pos; - fz_invert_matrix(&ctm, &annot->page->ctm); - - dr = pdf_dict_get(ctx, annot->page->me, PDF_NAME_Resources); + dr = pdf_dict_get(ctx, annot->page->obj, PDF_NAME_Resources); if (!dr) { dr = pdf_new_dict(ctx, doc, 1); - pdf_dict_put_drop(ctx, annot->page->me, PDF_NAME_Resources, dr); + pdf_dict_put_drop(ctx, annot->page->obj, PDF_NAME_Resources, dr); } /* Ensure the resource dictionary includes a font dict */ @@ -459,7 +453,7 @@ void pdf_set_free_text_details(fz_context *ctx, pdf_document *doc, pdf_annot *an pdf_measure_text(ctx, font_desc, (unsigned char *)text, strlen(text), &bounds); page_pos = *pos; - fz_transform_point(&page_pos, &ctm); + fz_transform_point(&page_pos, &annot->inv_page_ctm); bounds.x0 *= font_size; bounds.x1 *= font_size; |