summaryrefslogtreecommitdiff
path: root/source/pdf/pdf-run.c
diff options
context:
space:
mode:
Diffstat (limited to 'source/pdf/pdf-run.c')
-rw-r--r--source/pdf/pdf-run.c105
1 files changed, 105 insertions, 0 deletions
diff --git a/source/pdf/pdf-run.c b/source/pdf/pdf-run.c
new file mode 100644
index 00000000..4ac92bb0
--- /dev/null
+++ b/source/pdf/pdf-run.c
@@ -0,0 +1,105 @@
+#include "pdf-interpret-imp.h"
+
+static void
+pdf_run_annot_with_usage(pdf_document *doc, pdf_page *page, pdf_annot *annot, fz_device *dev, const fz_matrix *ctm, char *event, fz_cookie *cookie)
+{
+ fz_matrix local_ctm;
+ pdf_process process;
+
+ fz_concat(&local_ctm, &page->ctm, ctm);
+
+ pdf_process_run(&process, dev, &local_ctm, event, NULL, 0);
+
+ pdf_process_annot(doc, page, annot, &process, cookie);
+}
+
+static void pdf_run_page_contents_with_usage(pdf_document *doc, pdf_page *page, fz_device *dev, const fz_matrix *ctm, char *event, fz_cookie *cookie)
+{
+ fz_matrix local_ctm;
+ pdf_process process;
+
+ fz_concat(&local_ctm, &page->ctm, ctm);
+
+ if (page->transparency)
+ {
+ fz_rect mediabox = page->mediabox;
+ fz_begin_group(dev, fz_transform_rect(&mediabox, &local_ctm), 1, 0, 0, 1);
+ }
+
+ pdf_process_run(&process, dev, &local_ctm, event, NULL, 0);
+
+ pdf_process_page_contents(doc, page, &process, cookie);
+
+ if (page->transparency)
+ fz_end_group(dev);
+}
+
+void pdf_run_page_contents(pdf_document *doc, pdf_page *page, fz_device *dev, const fz_matrix *ctm, fz_cookie *cookie)
+{
+ pdf_run_page_contents_with_usage(doc, page, dev, ctm, "View", cookie);
+ if (page->incomplete & PDF_PAGE_INCOMPLETE_CONTENTS)
+ fz_throw(doc->ctx, FZ_ERROR_TRYLATER, "incomplete rendering");
+}
+
+
+void pdf_run_annot(pdf_document *doc, pdf_page *page, pdf_annot *annot, fz_device *dev, const fz_matrix *ctm, fz_cookie *cookie)
+{
+ pdf_run_annot_with_usage(doc, page, annot, dev, ctm, "View", cookie);
+ if (page->incomplete & PDF_PAGE_INCOMPLETE_ANNOTS)
+ fz_throw(doc->ctx, FZ_ERROR_TRYLATER, "incomplete rendering");
+}
+
+static void pdf_run_page_annots_with_usage(pdf_document *doc, pdf_page *page, fz_device *dev, const fz_matrix *ctm, char *event, fz_cookie *cookie)
+{
+ pdf_annot *annot;
+
+ if (cookie && cookie->progress_max != -1)
+ {
+ int count = 1;
+ for (annot = page->annots; annot; annot = annot->next)
+ count++;
+ cookie->progress_max += count;
+ }
+
+ for (annot = page->annots; annot; annot = annot->next)
+ {
+ /* Check the cookie for aborting */
+ if (cookie)
+ {
+ if (cookie->abort)
+ break;
+ cookie->progress++;
+ }
+
+ pdf_run_annot_with_usage(doc, page, annot, dev, ctm, event, cookie);
+ }
+}
+
+void
+pdf_run_page_with_usage(pdf_document *doc, pdf_page *page, fz_device *dev, const fz_matrix *ctm, char *event, fz_cookie *cookie)
+{
+ pdf_run_page_contents_with_usage(doc, page, dev, ctm, event, cookie);
+ pdf_run_page_annots_with_usage(doc, page, dev, ctm, event, cookie);
+ if (page->incomplete)
+ fz_throw(doc->ctx, FZ_ERROR_TRYLATER, "incomplete rendering");
+}
+
+void
+pdf_run_page(pdf_document *doc, pdf_page *page, fz_device *dev, const fz_matrix *ctm, fz_cookie *cookie)
+{
+ pdf_run_page_with_usage(doc, page, dev, ctm, "View", cookie);
+}
+
+void
+pdf_run_glyph(pdf_document *doc, pdf_obj *resources, fz_buffer *contents, fz_device *dev, const fz_matrix *ctm, void *gstate, int nested_depth)
+{
+ fz_context *ctx = doc->ctx;
+ pdf_process process;
+
+ if (nested_depth > 10)
+ fz_throw(ctx, FZ_ERROR_GENERIC, "Too many nestings of Type3 glyphs");
+
+ pdf_process_run(&process, dev, ctm, "View", gstate, nested_depth+1);
+
+ pdf_process_glyph(doc, resources, contents, &process);
+}