From e2fe317a9e4649cebd88896cfc3fb790e75bfe6c Mon Sep 17 00:00:00 2001 From: Tor Andersson Date: Fri, 3 Feb 2012 14:30:57 +0100 Subject: Add document interface. --- pdf/mupdf.h | 8 +++++-- pdf/pdf_annot.c | 2 +- pdf/pdf_page.c | 20 ++++++++++------ pdf/pdf_xref.c | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 4 files changed, 92 insertions(+), 11 deletions(-) (limited to 'pdf') diff --git a/pdf/mupdf.h b/pdf/mupdf.h index 5b546ba0..95f44c60 100644 --- a/pdf/mupdf.h +++ b/pdf/mupdf.h @@ -73,8 +73,11 @@ struct pdf_ocg_descriptor_s struct pdf_document_s { + fz_document super; + fz_context *ctx; fz_stream *file; + int version; int startxref; int file_size; @@ -429,7 +432,7 @@ fz_obj *pdf_load_name_tree(pdf_document *doc, char *which); fz_outline *pdf_load_outline(pdf_document *doc); -fz_link *pdf_load_links(pdf_document *, fz_obj *annots, fz_matrix page_ctm); +fz_link *pdf_load_link_annots(pdf_document *, fz_obj *annots, fz_matrix page_ctm); pdf_annot *pdf_load_annots(pdf_document *, fz_obj *annots); void pdf_free_annot(fz_context *ctx, pdf_annot *link); @@ -456,8 +459,9 @@ int pdf_find_page_number(pdf_document *doc, fz_obj *pageobj); int pdf_count_pages(pdf_document *doc); pdf_page *pdf_load_page(pdf_document *doc, int number); +fz_link *pdf_load_links(pdf_document *doc, pdf_page *page); fz_rect pdf_bound_page(pdf_document *doc, pdf_page *page); -void pdf_free_page(fz_context *ctx, pdf_page *page); +void pdf_free_page(pdf_document *doc, pdf_page *page); /* * Content stream parsing diff --git a/pdf/pdf_annot.c b/pdf/pdf_annot.c index 12c08bf4..ae03f2b6 100644 --- a/pdf/pdf_annot.c +++ b/pdf/pdf_annot.c @@ -278,7 +278,7 @@ pdf_load_link(pdf_document *xref, fz_obj *dict, fz_matrix page_ctm) } fz_link * -pdf_load_links(pdf_document *xref, fz_obj *annots, fz_matrix page_ctm) +pdf_load_link_annots(pdf_document *xref, fz_obj *annots, fz_matrix page_ctm) { fz_link *link, *head, *tail; fz_obj *obj; diff --git a/pdf/pdf_page.c b/pdf/pdf_page.c index ed80aa90..6f7a97e3 100644 --- a/pdf/pdf_page.c +++ b/pdf/pdf_page.c @@ -359,7 +359,7 @@ pdf_load_page(pdf_document *xref, int number) obj = fz_dict_gets(pageobj, "Annots"); if (obj) { - page->links = pdf_load_links(xref, obj, page->ctm); + page->links = pdf_load_link_annots(xref, obj, page->ctm); page->annots = pdf_load_annots(xref, obj); } @@ -381,7 +381,7 @@ pdf_load_page(pdf_document *xref, int number) } fz_catch(ctx) { - pdf_free_page(ctx, page); + pdf_free_page(xref, page); fz_throw(ctx, "cannot load page %d contents (%d 0 R)", number + 1, fz_to_num(pageref)); } @@ -398,16 +398,22 @@ pdf_bound_page(pdf_document *xref, pdf_page *page) return bounds; } +fz_link * +pdf_load_links(pdf_document *xref, pdf_page *page) +{ + return page->links; +} + void -pdf_free_page(fz_context *ctx, pdf_page *page) +pdf_free_page(pdf_document *xref, pdf_page *page) { if (page->resources) fz_drop_obj(page->resources); if (page->contents) - fz_drop_buffer(ctx, page->contents); + fz_drop_buffer(xref->ctx, page->contents); if (page->links) - fz_free_link(ctx, page->links); + fz_free_link(xref->ctx, page->links); if (page->annots) - pdf_free_annot(ctx, page->annots); - fz_free(ctx, page); + pdf_free_annot(xref->ctx, page->annots); + fz_free(xref->ctx, page); } diff --git a/pdf/pdf_xref.c b/pdf/pdf_xref.c index 7fb247d9..d1badc79 100644 --- a/pdf/pdf_xref.c +++ b/pdf/pdf_xref.c @@ -638,6 +638,8 @@ pdf_free_ocg(fz_context *ctx, pdf_ocg_descriptor *desc) * If password is not null, try to decrypt. */ +static void pdf_init_document(pdf_document *xref); + pdf_document * pdf_open_document_with_stream(fz_stream *file) { @@ -655,7 +657,9 @@ pdf_open_document_with_stream(fz_stream *file) /* install pdf specific callback */ fz_resolve_indirect = pdf_resolve_indirect; - xref = fz_calloc(ctx, 1, sizeof(pdf_document)); + xref = fz_malloc_struct(ctx, pdf_document); + pdf_init_document(xref); + xref->file = fz_keep_stream(file); xref->ctx = ctx; @@ -1092,3 +1096,70 @@ pdf_open_document(fz_context *ctx, const char *filename) fz_close(file); return xref; } + +/* Document interface wrappers */ + +static void pdf_close_document_shim(fz_document *doc) +{ + pdf_close_document((pdf_document*)doc); +} + +static int pdf_needs_password_shim(fz_document *doc) +{ + return pdf_needs_password((pdf_document*)doc); +} + +static int pdf_authenticate_password_shim(fz_document *doc, char *password) +{ + return pdf_authenticate_password((pdf_document*)doc, password); +} + +static fz_outline *pdf_load_outline_shim(fz_document *doc) +{ + return pdf_load_outline((pdf_document*)doc); +} + +static int pdf_count_pages_shim(fz_document *doc) +{ + return pdf_count_pages((pdf_document*)doc); +} + +static fz_page *pdf_load_page_shim(fz_document *doc, int number) +{ + return (fz_page*) pdf_load_page((pdf_document*)doc, number); +} + +static fz_link *pdf_load_links_shim(fz_document *doc, fz_page *page) +{ + return pdf_load_links((pdf_document*)doc, (pdf_page*)page); +} + +static fz_rect pdf_bound_page_shim(fz_document *doc, fz_page *page) +{ + return pdf_bound_page((pdf_document*)doc, (pdf_page*)page); +} + +static void pdf_run_page_shim(fz_document *doc, fz_page *page, fz_device *dev, fz_matrix transform, fz_cookie *cookie) +{ + pdf_run_page((pdf_document*)doc, (pdf_page*)page, dev, transform, cookie); +} + +static void pdf_free_page_shim(fz_document *doc, fz_page *page) +{ + pdf_free_page((pdf_document*)doc, (pdf_page*)page); +} + +static void +pdf_init_document(pdf_document *doc) +{ + doc->super.close = pdf_close_document_shim; + doc->super.needs_password = pdf_needs_password_shim; + doc->super.authenticate_password = pdf_authenticate_password_shim; + doc->super.load_outline = pdf_load_outline_shim; + doc->super.count_pages = pdf_count_pages_shim; + doc->super.load_page = pdf_load_page_shim; + doc->super.load_links = pdf_load_links_shim; + doc->super.bound_page = pdf_bound_page_shim; + doc->super.run_page = pdf_run_page_shim; + doc->super.free_page = pdf_free_page_shim; +} -- cgit v1.2.3