diff options
author | Robin Watts <robin.watts@artifex.com> | 2011-11-14 18:22:13 +0000 |
---|---|---|
committer | Robin Watts <robin.watts@artifex.com> | 2011-11-15 15:20:54 +0000 |
commit | 9c0a49060475b2dea1e4c2668bebd1d566113a7b (patch) | |
tree | 49e45a691cf105f4266d5c6b7242a4a3256c1200 /ios/document.c | |
parent | 60c0544742931da63db623ad7a79ba3758704cc1 (diff) | |
parent | fd6def85f22b598d4c278e76138ab7dccbb84c36 (diff) | |
download | mupdf-9c0a49060475b2dea1e4c2668bebd1d566113a7b.tar.xz |
Merge branch 'master' into context
Mostly redoing the xps_context to xps_document change and adding
contexts to newly written code.
Conflicts:
apps/pdfapp.c
apps/pdfapp.h
apps/x11_main.c
apps/xpsdraw.c
draw/draw_device.c
draw/draw_scale.c
fitz/base_object.c
fitz/fitz.h
pdf/mupdf.h
pdf/pdf_interpret.c
pdf/pdf_outline.c
pdf/pdf_page.c
xps/muxps.h
xps/xps_doc.c
xps/xps_xml.c
Diffstat (limited to 'ios/document.c')
-rw-r--r-- | ios/document.c | 157 |
1 files changed, 157 insertions, 0 deletions
diff --git a/ios/document.c b/ios/document.c new file mode 100644 index 00000000..6d30a0bc --- /dev/null +++ b/ios/document.c @@ -0,0 +1,157 @@ +#include "fitz/fitz.h" +#include "pdf/mupdf.h" +#include "xps/muxps.h" +#include "document.h" + +struct document * +open_document(char *filename) +{ + fz_error error; + + if (strstr(filename, ".pdf") || strstr(filename, ".PDF")) { + struct document *doc = fz_malloc(sizeof *doc); + memset(doc, 0, sizeof *doc); + doc->number = -1; + error = pdf_open_xref(&doc->pdf, filename, ""); + if (error) { + fz_free(doc); + fz_rethrow(error, "cannot open pdf document"); + return NULL; + } + error = pdf_load_page_tree(doc->pdf); + if (error) { + pdf_free_xref(doc->pdf); + fz_free(doc); + fz_rethrow(error, "cannot open pdf document"); + return NULL; + } + return doc; + } else if (strstr(filename, ".xps") || strstr(filename, ".XPS")) { + struct document *doc = fz_malloc(sizeof *doc); + memset(doc, 0, sizeof *doc); + doc->number = -1; + error = xps_open_file(&doc->xps, filename); + if (error) { + fz_free(doc); + fz_rethrow(error, "cannot open xps document"); + return NULL; + } + return doc; + } else { + fz_throw("unknown document format"); + return NULL; + } +} + +fz_outline * +load_outline(struct document *doc) +{ + if (doc->pdf) + return pdf_load_outline(doc->pdf); + else if (doc->xps) + return xps_load_outline(doc->xps); + else + return NULL; +} + +int +count_pages(struct document *doc) +{ + if (doc->pdf) + return pdf_count_pages(doc->pdf); + else if (doc->xps) + return xps_count_pages(doc->xps); + else + return 1; +} + +static void +load_page(struct document *doc, int number) +{ + fz_error error; + if (doc->number == number) + return; + doc->number = number; + if (doc->pdf) { + if (doc->pdf_page) { + pdf_age_store(doc->pdf->store, 1); + pdf_free_page(doc->pdf_page); + } + doc->pdf_page = NULL; +printf("load pdf page %d\n", number); + error = pdf_load_page(&doc->pdf_page, doc->pdf, number); + if (error) + fz_catch(error, "cannot load page %d", number); + } + if (doc->xps) { + if (doc->xps_page) + xps_free_page(doc->xps, doc->xps_page); + doc->xps_page = NULL; +printf("load xps page %d\n", number); + error = xps_load_page(&doc->xps_page, doc->xps, number); + if (error) + fz_catch(error, "cannot load page %d", number); + } +} + +void +measure_page(struct document *doc, int number, float *w, float *h) +{ + load_page(doc, number); + if (doc->pdf_page) { + pdf_page *page = doc->pdf_page; + fz_rect mediabox = fz_transform_rect(fz_rotate(page->rotate), page->mediabox); + *w = mediabox.x1 - mediabox.x0; + *h = mediabox.y1 - mediabox.y0; + } + else if (doc->xps_page) { + xps_page *page = doc->xps_page; + *w = page->width * 72.0f / 96.0f; + *h = page->height * 72.0f / 96.0f; + } + else { + *w = *h = 72; + } + fz_flush_warnings(); +} + +void +draw_page(struct document *doc, int number, fz_device *dev, fz_matrix ctm) +{ + load_page(doc, number); + if (doc->pdf_page) { + pdf_page *page = doc->pdf_page; + fz_matrix page_ctm = fz_concat(fz_rotate(-page->rotate), fz_scale(1, -1)); + fz_rect mediabox = fz_transform_rect(page_ctm, page->mediabox); + page_ctm = fz_concat(page_ctm, fz_translate(-mediabox.x0, -mediabox.y0)); + ctm = fz_concat(page_ctm, ctm); + pdf_run_page(doc->pdf, page, dev, ctm); + } else if (doc->xps_page) { + xps_page *page = doc->xps_page; + fz_matrix page_ctm = fz_scale(72.0f / 96.0f, 72.0f / 96.0f); + ctm = fz_concat(page_ctm, ctm); + doc->xps->dev = dev; + xps_parse_fixed_page(doc->xps, ctm, page); + doc->xps->dev = NULL; + } + fz_flush_warnings(); +} + +void +close_document(struct document *doc) +{ + if (doc->pdf) { + if (doc->pdf_page) + pdf_free_page(doc->pdf_page); + if (doc->pdf->store) + pdf_free_store(doc->pdf->store); + doc->pdf->store = NULL; + pdf_free_xref(doc->pdf); + } + if (doc->xps) { + if (doc->xps_page) + xps_free_page(doc->xps, doc->xps_page); + xps_free_context(doc->xps); + } + fz_flush_warnings(); +} |