summaryrefslogtreecommitdiff
path: root/pdf
diff options
context:
space:
mode:
authorTor Andersson <tor.andersson@artifex.com>2012-02-03 14:30:57 +0100
committerTor Andersson <tor.andersson@artifex.com>2012-02-03 14:30:57 +0100
commite2fe317a9e4649cebd88896cfc3fb790e75bfe6c (patch)
tree18fd5cb530dafb824293715af892f028c2432d55 /pdf
parent977ad5326276de29f0b2ae212a1cb4c09d8d94e0 (diff)
downloadmupdf-e2fe317a9e4649cebd88896cfc3fb790e75bfe6c.tar.xz
Add document interface.
Diffstat (limited to 'pdf')
-rw-r--r--pdf/mupdf.h8
-rw-r--r--pdf/pdf_annot.c2
-rw-r--r--pdf/pdf_page.c20
-rw-r--r--pdf/pdf_xref.c73
4 files changed, 92 insertions, 11 deletions
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;
+}