Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
7643 views
1
#include "mupdf/pdf.h"
2
3
static void
4
pdf_run_annot_with_usage(fz_context *ctx, pdf_document *doc, pdf_page *page, pdf_annot *annot, fz_device *dev, const fz_matrix *ctm, char *event, fz_cookie *cookie)
5
{
6
fz_matrix local_ctm;
7
pdf_processor *proc;
8
9
fz_concat(&local_ctm, &page->ctm, ctm);
10
11
proc = pdf_new_run_processor(ctx, dev, &local_ctm, event, NULL, 0);
12
fz_try(ctx)
13
pdf_process_annot(ctx, proc, doc, page, annot, cookie);
14
fz_always(ctx)
15
pdf_drop_processor(ctx, proc);
16
fz_catch(ctx)
17
fz_rethrow(ctx);
18
}
19
20
static void pdf_run_page_contents_with_usage(fz_context *ctx, pdf_document *doc, pdf_page *page, fz_device *dev, const fz_matrix *ctm, char *event, fz_cookie *cookie)
21
{
22
fz_matrix local_ctm;
23
pdf_processor *proc;
24
25
fz_concat(&local_ctm, &page->ctm, ctm);
26
27
if (page->transparency)
28
{
29
fz_rect mediabox = page->mediabox;
30
fz_begin_group(ctx, dev, fz_transform_rect(&mediabox, &local_ctm), 1, 0, 0, 1);
31
}
32
33
proc = pdf_new_run_processor(ctx, dev, &local_ctm, event, NULL, 0);
34
35
fz_try(ctx)
36
pdf_process_contents(ctx, proc, doc, page->resources, page->contents, cookie);
37
fz_always(ctx)
38
pdf_drop_processor(ctx, proc);
39
fz_catch(ctx)
40
fz_rethrow(ctx);
41
42
if (page->transparency)
43
fz_end_group(ctx, dev);
44
}
45
46
void pdf_run_page_contents(fz_context *ctx, pdf_page *page, fz_device *dev, const fz_matrix *ctm, fz_cookie *cookie)
47
{
48
pdf_document *doc = page->doc;
49
int nocache;
50
51
nocache = !!(dev->hints & FZ_NO_CACHE);
52
if (nocache)
53
pdf_mark_xref(ctx, doc);
54
55
fz_try(ctx)
56
{
57
pdf_run_page_contents_with_usage(ctx, doc, page, dev, ctm, "View", cookie);
58
}
59
fz_always(ctx)
60
{
61
if (nocache)
62
pdf_clear_xref_to_mark(ctx, doc);
63
}
64
fz_catch(ctx)
65
{
66
fz_rethrow(ctx);
67
}
68
if (page->incomplete & PDF_PAGE_INCOMPLETE_CONTENTS)
69
fz_throw(ctx, FZ_ERROR_TRYLATER, "incomplete rendering");
70
}
71
72
void pdf_run_annot(fz_context *ctx, pdf_page *page, pdf_annot *annot, fz_device *dev, const fz_matrix *ctm, fz_cookie *cookie)
73
{
74
pdf_document *doc = page->doc;
75
int nocache;
76
77
nocache = !!(dev->hints & FZ_NO_CACHE);
78
if (nocache)
79
pdf_mark_xref(ctx, doc);
80
fz_try(ctx)
81
{
82
pdf_run_annot_with_usage(ctx, doc, page, annot, dev, ctm, "View", cookie);
83
}
84
fz_always(ctx)
85
{
86
if (nocache)
87
pdf_clear_xref_to_mark(ctx, doc);
88
}
89
fz_catch(ctx)
90
{
91
fz_rethrow(ctx);
92
}
93
if (page->incomplete & PDF_PAGE_INCOMPLETE_ANNOTS)
94
fz_throw(ctx, FZ_ERROR_TRYLATER, "incomplete rendering");
95
}
96
97
static void pdf_run_page_annots_with_usage(fz_context *ctx, pdf_document *doc, pdf_page *page, fz_device *dev, const fz_matrix *ctm, char *event, fz_cookie *cookie)
98
{
99
pdf_annot *annot;
100
101
if (cookie && cookie->progress_max != -1)
102
{
103
int count = 1;
104
for (annot = page->annots; annot; annot = annot->next)
105
count++;
106
cookie->progress_max += count;
107
}
108
109
for (annot = page->annots; annot; annot = annot->next)
110
{
111
/* Check the cookie for aborting */
112
if (cookie)
113
{
114
if (cookie->abort)
115
break;
116
cookie->progress++;
117
}
118
119
pdf_run_annot_with_usage(ctx, doc, page, annot, dev, ctm, event, cookie);
120
}
121
}
122
123
void
124
pdf_run_page_with_usage(fz_context *ctx, pdf_document *doc, pdf_page *page, fz_device *dev, const fz_matrix *ctm, char *event, fz_cookie *cookie)
125
{
126
int nocache = !!(dev->hints & FZ_NO_CACHE);
127
128
if (nocache)
129
pdf_mark_xref(ctx, doc);
130
fz_try(ctx)
131
{
132
pdf_run_page_contents_with_usage(ctx, doc, page, dev, ctm, event, cookie);
133
pdf_run_page_annots_with_usage(ctx, doc, page, dev, ctm, event, cookie);
134
}
135
fz_always(ctx)
136
{
137
if (nocache)
138
pdf_clear_xref_to_mark(ctx, doc);
139
}
140
fz_catch(ctx)
141
{
142
fz_rethrow(ctx);
143
}
144
if (page->incomplete)
145
fz_throw(ctx, FZ_ERROR_TRYLATER, "incomplete rendering");
146
}
147
148
void
149
pdf_run_page(fz_context *ctx, pdf_page *page, fz_device *dev, const fz_matrix *ctm, fz_cookie *cookie)
150
{
151
pdf_document *doc = page->doc;
152
pdf_run_page_with_usage(ctx, doc, page, dev, ctm, "View", cookie);
153
}
154
155
void
156
pdf_run_glyph(fz_context *ctx, pdf_document *doc, pdf_obj *resources, fz_buffer *contents, fz_device *dev, const fz_matrix *ctm, void *gstate, int nested_depth)
157
{
158
pdf_processor *proc;
159
160
if (nested_depth > 10)
161
fz_throw(ctx, FZ_ERROR_GENERIC, "Too many nestings of Type3 glyphs");
162
163
proc = pdf_new_run_processor(ctx, dev, ctm, "View", gstate, nested_depth+1);
164
fz_try(ctx)
165
pdf_process_glyph(ctx, proc, doc, resources, contents);
166
fz_always(ctx)
167
pdf_drop_processor(ctx, proc);
168
fz_catch(ctx)
169
fz_rethrow(ctx);
170
}
171
172