summaryrefslogtreecommitdiff
path: root/pdf/pdf_interpret.c
diff options
context:
space:
mode:
authorPaul Gardiner <paulg.artifex@glidos.net>2012-10-25 16:44:24 +0100
committerPaul Gardiner <paulg.artifex@glidos.net>2012-10-25 16:44:24 +0100
commitd8266814d24f5bdf95b81e66e9b06a5d188b5edd (patch)
tree03282b583686917c348492d8584b0a134c01e753 /pdf/pdf_interpret.c
parentc2a526b73e6654b99c66747a379a9218ab8683f4 (diff)
downloadmupdf-d8266814d24f5bdf95b81e66e9b06a5d188b5edd.tar.xz
Support separate rendering of the main page contents and the annotations
Diffstat (limited to 'pdf/pdf_interpret.c')
-rw-r--r--pdf/pdf_interpret.c96
1 files changed, 63 insertions, 33 deletions
diff --git a/pdf/pdf_interpret.c b/pdf/pdf_interpret.c
index 7f99f5c0..9304d5b6 100644
--- a/pdf/pdf_interpret.c
+++ b/pdf/pdf_interpret.c
@@ -2788,13 +2788,10 @@ pdf_run_contents_buffer(pdf_csi *csi, pdf_obj *rdb, fz_buffer *contents)
}
}
-void
-pdf_run_page_with_usage(pdf_document *xref, pdf_page *page, fz_device *dev, fz_matrix ctm, char *event, fz_cookie *cookie)
+static void pdf_run_page_contents_with_usage(pdf_document *xref, pdf_page *page, fz_device *dev, fz_matrix ctm, char *event, fz_cookie *cookie)
{
fz_context *ctx = dev->ctx;
pdf_csi *csi;
- pdf_annot *annot;
- int flags;
ctm = fz_concat(page->ctm, ctm);
@@ -2815,6 +2812,61 @@ pdf_run_page_with_usage(pdf_document *xref, pdf_page *page, fz_device *dev, fz_m
fz_throw(ctx, "cannot parse page content stream");
}
+ if (page->transparency)
+ fz_end_group(dev);
+}
+
+void pdf_run_page_contents(pdf_document *xref, pdf_page *page, fz_device *dev, fz_matrix ctm, fz_cookie *cookie)
+{
+ pdf_run_page_contents_with_usage(xref, page, dev, ctm, "View", cookie);
+}
+
+static void pdf_run_annot_with_usage(pdf_document *xref, pdf_page *page, pdf_annot *annot, fz_device *dev, fz_matrix ctm, char *event, fz_cookie *cookie)
+{
+ fz_context *ctx = dev->ctx;
+ pdf_csi *csi;
+ int flags;
+
+ ctm = fz_concat(page->ctm, ctm);
+
+ flags = pdf_to_int(pdf_dict_gets(annot->obj, "F"));
+
+ /* TODO: NoZoom and NoRotate */
+ if (flags & (1 << 0)) /* Invisible */
+ return;
+ if (flags & (1 << 1)) /* Hidden */
+ return;
+ if (!strcmp(event, "Print") && !(flags & (1 << 2))) /* Print */
+ return;
+ if (!strcmp(event, "View") && (flags & (1 << 5))) /* NoView */
+ return;
+
+ csi = pdf_new_csi(xref, dev, ctm, event, cookie, NULL);
+ if (!pdf_is_hidden_ocg(pdf_dict_gets(annot->obj, "OC"), csi, page->resources))
+ {
+ fz_try(ctx)
+ {
+ pdf_update_annot(xref, annot);
+ pdf_run_xobject(csi, page->resources, annot->ap, annot->matrix);
+ }
+ fz_catch(ctx)
+ {
+ pdf_free_csi(csi);
+ fz_throw(ctx, "cannot parse annotation appearance stream");
+ }
+ }
+ pdf_free_csi(csi);
+}
+
+void pdf_run_annot(pdf_document *xref, pdf_page *page, pdf_annot *annot, fz_device *dev, fz_matrix ctm, fz_cookie *cookie)
+{
+ pdf_run_annot_with_usage(xref, page, annot, dev, ctm, "View", cookie);
+}
+
+static void pdf_run_page_annots_with_usage(pdf_document *xref, pdf_page *page, fz_device *dev, fz_matrix ctm, char *event, fz_cookie *cookie)
+{
+ pdf_annot *annot;
+
if (cookie && cookie->progress_max != -1)
{
int count = 1;
@@ -2833,37 +2885,15 @@ pdf_run_page_with_usage(pdf_document *xref, pdf_page *page, fz_device *dev, fz_m
cookie->progress++;
}
- flags = pdf_to_int(pdf_dict_gets(annot->obj, "F"));
-
- /* TODO: NoZoom and NoRotate */
- if (flags & (1 << 0)) /* Invisible */
- continue;
- if (flags & (1 << 1)) /* Hidden */
- continue;
- if (!strcmp(event, "Print") && !(flags & (1 << 2))) /* Print */
- continue;
- if (!strcmp(event, "View") && (flags & (1 << 5))) /* NoView */
- continue;
-
- csi = pdf_new_csi(xref, dev, ctm, event, cookie, NULL);
- if (!pdf_is_hidden_ocg(pdf_dict_gets(annot->obj, "OC"), csi, page->resources))
- {
- fz_try(ctx)
- {
- pdf_update_annot(xref, annot);
- pdf_run_xobject(csi, page->resources, annot->ap, annot->matrix);
- }
- fz_catch(ctx)
- {
- pdf_free_csi(csi);
- fz_throw(ctx, "cannot parse annotation appearance stream");
- }
- }
- pdf_free_csi(csi);
+ pdf_run_annot_with_usage(xref, page, annot, dev, ctm, event, cookie);
}
+}
- if (page->transparency)
- fz_end_group(dev);
+void
+pdf_run_page_with_usage(pdf_document *xref, pdf_page *page, fz_device *dev, fz_matrix ctm, char *event, fz_cookie *cookie)
+{
+ pdf_run_page_contents_with_usage(xref, page, dev, ctm, event, cookie);
+ pdf_run_page_annots_with_usage(xref, page, dev, ctm, event, cookie);
}
void