summaryrefslogtreecommitdiff
path: root/source/pdf
diff options
context:
space:
mode:
Diffstat (limited to 'source/pdf')
-rw-r--r--source/pdf/js/pdf-js.c137
-rw-r--r--source/pdf/pdf-annot-edit.c197
-rw-r--r--source/pdf/pdf-annot.c268
-rw-r--r--source/pdf/pdf-appearance.c447
-rw-r--r--source/pdf/pdf-clean.c159
-rw-r--r--source/pdf/pdf-cmap-load.c41
-rw-r--r--source/pdf/pdf-cmap-parse.c34
-rw-r--r--source/pdf/pdf-colorspace.c103
-rw-r--r--source/pdf/pdf-crypt.c210
-rw-r--r--source/pdf/pdf-device.c550
-rw-r--r--source/pdf/pdf-event.c34
-rw-r--r--source/pdf/pdf-field.c47
-rw-r--r--source/pdf/pdf-font.c274
-rw-r--r--source/pdf/pdf-fontfile.c30
-rw-r--r--source/pdf/pdf-form.c633
-rw-r--r--source/pdf/pdf-function.c201
-rw-r--r--source/pdf/pdf-image.c112
-rw-r--r--source/pdf/pdf-interpret-imp.h13
-rw-r--r--source/pdf/pdf-interpret.c119
-rw-r--r--source/pdf/pdf-lex.c133
-rw-r--r--source/pdf/pdf-nametree.c115
-rw-r--r--source/pdf/pdf-object.c1098
-rw-r--r--source/pdf/pdf-op-buffer.c267
-rw-r--r--source/pdf/pdf-op-filter.c25
-rw-r--r--source/pdf/pdf-op-run.c414
-rw-r--r--source/pdf/pdf-outline.c39
-rw-r--r--source/pdf/pdf-page.c397
-rw-r--r--source/pdf/pdf-parse.c267
-rw-r--r--source/pdf/pdf-pattern.c25
-rw-r--r--source/pdf/pdf-pkcs7.c67
-rw-r--r--source/pdf/pdf-repair.c248
-rw-r--r--source/pdf/pdf-run.c76
-rw-r--r--source/pdf/pdf-shade.c200
-rw-r--r--source/pdf/pdf-store.c26
-rw-r--r--source/pdf/pdf-stream.c323
-rw-r--r--source/pdf/pdf-type3.c80
-rw-r--r--source/pdf/pdf-unicode.c7
-rw-r--r--source/pdf/pdf-write.c980
-rw-r--r--source/pdf/pdf-xobject.c130
-rw-r--r--source/pdf/pdf-xref-aux.c6
-rw-r--r--source/pdf/pdf-xref.c959
41 files changed, 4633 insertions, 4858 deletions
diff --git a/source/pdf/js/pdf-js.c b/source/pdf/js/pdf-js.c
index 8364fc95..008cebfb 100644
--- a/source/pdf/js/pdf-js.c
+++ b/source/pdf/js/pdf-js.c
@@ -1,7 +1,11 @@
#include "mupdf/pdf.h"
+/* TODO: js->doc -> doc */
+/* TODO: js->ctx -> ctx */
+
struct pdf_js_s
{
+ fz_context *ctx;
pdf_document *doc;
pdf_obj *form;
pdf_js_event event;
@@ -15,7 +19,7 @@ struct pdf_js_s
static pdf_jsimp_obj *app_alert(void *jsctx, void *obj, int argc, pdf_jsimp_obj *args[])
{
pdf_js *js = (pdf_js *)jsctx;
- fz_context *ctx = js->doc->ctx;
+ fz_context *ctx = js->ctx;
pdf_jsimp_obj *cMsg_obj = NULL;
pdf_jsimp_obj *nIcon_obj = NULL;
pdf_jsimp_obj *nType_obj = NULL;
@@ -77,7 +81,7 @@ static pdf_jsimp_obj *app_alert(void *jsctx, void *obj, int argc, pdf_jsimp_obj
if (cTitle_obj)
event.title = pdf_jsimp_to_string(js->imp, cTitle_obj);
- pdf_event_issue_alert(js->doc, &event);
+ pdf_event_issue_alert(ctx, js->doc, &event);
nButton_obj = pdf_jsimp_from_number(js->imp, (double)event.button_pressed);
}
fz_always(ctx)
@@ -102,7 +106,7 @@ static pdf_jsimp_obj *app_execDialog(void *jsctx, void *obj, int argc, pdf_jsimp
{
pdf_js *js = (pdf_js *)jsctx;
- pdf_event_issue_exec_dialog(js->doc);
+ pdf_event_issue_exec_dialog(js->ctx, js->doc);
return NULL;
}
@@ -112,7 +116,7 @@ static pdf_jsimp_obj *app_execMenuItem(void *jsctx, void *obj, int argc, pdf_jsi
pdf_js *js = (pdf_js *)jsctx;
if (argc == 1)
- pdf_event_issue_exec_menu_item(js->doc, pdf_jsimp_to_string(js->imp, args[0]));
+ pdf_event_issue_exec_menu_item(js->ctx, js->doc, pdf_jsimp_to_string(js->imp, args[0]));
return NULL;
}
@@ -133,19 +137,18 @@ static pdf_jsimp_obj *app_launchURL(void *jsctx, void *obj, int argc, pdf_jsimp_
cUrl = pdf_jsimp_to_string(js->imp, args[0]);
}
- pdf_event_issue_launch_url(js->doc, cUrl, bNewFrame);
+ pdf_event_issue_launch_url(js->ctx, js->doc, cUrl, bNewFrame);
return NULL;
}
-static pdf_obj *load_color(pdf_document *doc, pdf_jsimp *imp, pdf_jsimp_obj *val)
+static pdf_obj *load_color(fz_context *ctx, pdf_document *doc, pdf_jsimp *imp, pdf_jsimp_obj *val)
{
pdf_obj *col = NULL;
pdf_obj *comp = NULL;
pdf_jsimp_obj *jscomp = NULL;
int i;
int n;
- fz_context *ctx = doc->ctx;
n = pdf_jsimp_array_len(imp, val);
@@ -155,7 +158,7 @@ static pdf_obj *load_color(pdf_document *doc, pdf_jsimp *imp, pdf_jsimp_obj *val
if (n <= 1)
return NULL;
- col = pdf_new_array(doc, n-1);
+ col = pdf_new_array(ctx, doc, n-1);
fz_var(comp);
fz_var(jscomp);
@@ -164,19 +167,19 @@ static pdf_obj *load_color(pdf_document *doc, pdf_jsimp *imp, pdf_jsimp_obj *val
for (i = 0; i < n-1; i++)
{
jscomp = pdf_jsimp_array_item(imp, val, i+1);
- comp = pdf_new_real(doc, pdf_jsimp_to_number(imp, jscomp));
- pdf_array_push(col, comp);
+ comp = pdf_new_real(ctx, doc, pdf_jsimp_to_number(imp, jscomp));
+ pdf_array_push(ctx, col, comp);
pdf_jsimp_drop_obj(imp, jscomp);
jscomp = NULL;
- pdf_drop_obj(comp);
+ pdf_drop_obj(ctx, comp);
comp = NULL;
}
}
fz_catch(ctx)
{
pdf_jsimp_drop_obj(imp, jscomp);
- pdf_drop_obj(comp);
- pdf_drop_obj(col);
+ pdf_drop_obj(ctx, comp);
+ pdf_drop_obj(ctx, col);
fz_rethrow(ctx);
}
@@ -193,7 +196,7 @@ static pdf_jsimp_obj *field_buttonSetCaption(void *jsctx, void *obj, int argc, p
return NULL;
name = pdf_jsimp_to_string(js->imp, args[0]);
- pdf_field_set_button_caption(js->doc, field, name);
+ pdf_field_set_button_caption(js->ctx, js->doc, field, name);
return NULL;
}
@@ -201,7 +204,7 @@ static pdf_jsimp_obj *field_buttonSetCaption(void *jsctx, void *obj, int argc, p
static pdf_jsimp_obj *field_getName(void *jsctx, void *obj)
{
pdf_js *js = (pdf_js *)jsctx;
- fz_context *ctx = js->doc->ctx;
+ fz_context *ctx = js->ctx;
pdf_obj *field = (pdf_obj *)obj;
char *name;
pdf_jsimp_obj *oname = NULL;
@@ -209,7 +212,7 @@ static pdf_jsimp_obj *field_getName(void *jsctx, void *obj)
if (field == NULL)
return NULL;
- name = pdf_field_name(js->doc, field);
+ name = pdf_field_name(ctx, js->doc, field);
fz_try(ctx)
{
oname = pdf_jsimp_from_string(js->imp, name);
@@ -229,7 +232,7 @@ static pdf_jsimp_obj *field_getName(void *jsctx, void *obj)
static void field_setName(void *jsctx, void *obj, pdf_jsimp_obj *val)
{
pdf_js *js = (pdf_js *)jsctx;
- fz_warn(js->doc->ctx, "Unexpected call to field_setName");
+ fz_warn(js->ctx, "Unexpected call to field_setName");
}
static pdf_jsimp_obj *field_getDisplay(void *jsctx, void *obj)
@@ -237,7 +240,7 @@ static pdf_jsimp_obj *field_getDisplay(void *jsctx, void *obj)
pdf_js *js = (pdf_js *)jsctx;
pdf_obj *field = (pdf_obj *)obj;
- return field ? pdf_jsimp_from_number(js->imp, (double)pdf_field_display(js->doc, field)) : NULL;
+ return field ? pdf_jsimp_from_number(js->imp, (double)pdf_field_display(js->ctx, js->doc, field)) : NULL;
}
static void field_setDisplay(void *jsctx, void *obj, pdf_jsimp_obj *val)
@@ -245,7 +248,7 @@ static void field_setDisplay(void *jsctx, void *obj, pdf_jsimp_obj *val)
pdf_js *js = (pdf_js *)jsctx;
pdf_obj *field = (pdf_obj *)obj;
if (field)
- pdf_field_set_display(js->doc, field, (int)pdf_jsimp_to_number(js->imp, val));
+ pdf_field_set_display(js->ctx, js->doc, field, (int)pdf_jsimp_to_number(js->imp, val));
}
static pdf_jsimp_obj *field_getFillColor(void *jsctx, void *obj)
@@ -256,21 +259,21 @@ static pdf_jsimp_obj *field_getFillColor(void *jsctx, void *obj)
static void field_setFillColor(void *jsctx, void *obj, pdf_jsimp_obj *val)
{
pdf_js *js = (pdf_js *)jsctx;
- fz_context *ctx = js->doc->ctx;
+ fz_context *ctx = js->ctx;
pdf_obj *field = (pdf_obj *)obj;
pdf_obj *col;
if (!field)
return;
- col = load_color(js->doc, js->imp, val);
+ col = load_color(ctx, js->doc, js->imp, val);
fz_try(ctx)
{
- pdf_field_set_fill_color(js->doc, field, col);
+ pdf_field_set_fill_color(ctx, js->doc, field, col);
}
fz_always(ctx)
{
- pdf_drop_obj(col);
+ pdf_drop_obj(ctx, col);
}
fz_catch(ctx)
{
@@ -286,21 +289,21 @@ static pdf_jsimp_obj *field_getTextColor(void *jsctx, void *obj)
static void field_setTextColor(void *jsctx, void *obj, pdf_jsimp_obj *val)
{
pdf_js *js = (pdf_js *)jsctx;
- fz_context *ctx = js->doc->ctx;
+ fz_context *ctx = js->ctx;
pdf_obj *field = (pdf_obj *)obj;
pdf_obj *col;
if (!field)
return;
- col = load_color(js->doc, js->imp, val);
+ col = load_color(ctx, js->doc, js->imp, val);
fz_try(ctx)
{
- pdf_field_set_text_color(js->doc, field, col);
+ pdf_field_set_text_color(ctx, js->doc, field, col);
}
fz_always(ctx)
{
- pdf_drop_obj(col);
+ pdf_drop_obj(ctx, col);
}
fz_catch(ctx)
{
@@ -313,7 +316,7 @@ static pdf_jsimp_obj *field_getBorderStyle(void *jsctx, void *obj)
pdf_js *js = (pdf_js *)jsctx;
pdf_obj *field = (pdf_obj *)obj;
- return field ? pdf_jsimp_from_string(js->imp, pdf_field_border_style(js->doc, field)) : NULL;
+ return field ? pdf_jsimp_from_string(js->imp, pdf_field_border_style(js->ctx, js->doc, field)) : NULL;
}
static void field_setBorderStyle(void *jsctx, void *obj, pdf_jsimp_obj *val)
@@ -322,7 +325,7 @@ static void field_setBorderStyle(void *jsctx, void *obj, pdf_jsimp_obj *val)
pdf_obj *field = (pdf_obj *)obj;
if (field)
- pdf_field_set_border_style(js->doc, field, pdf_jsimp_to_string(js->imp, val));
+ pdf_field_set_border_style(js->ctx, js->doc, field, pdf_jsimp_to_string(js->imp, val));
}
static pdf_jsimp_obj *field_getValue(void *jsctx, void *obj)
@@ -334,7 +337,7 @@ static pdf_jsimp_obj *field_getValue(void *jsctx, void *obj)
if (!field)
return NULL;
- fval = pdf_field_value(js->doc, field);
+ fval = pdf_field_value(js->ctx, js->doc, field);
return pdf_jsimp_from_string(js->imp, fval?fval:"");
}
@@ -344,7 +347,7 @@ static void field_setValue(void *jsctx, void *obj, pdf_jsimp_obj *val)
pdf_obj *field = (pdf_obj *)obj;
if (field)
- (void)pdf_field_set_value(js->doc, field, pdf_jsimp_to_string(js->imp, val));
+ (void)pdf_field_set_value(js->ctx, js->doc, field, pdf_jsimp_to_string(js->imp, val));
}
static pdf_jsimp_obj *event_getTarget(void *jsctx, void *obj)
@@ -357,7 +360,7 @@ static pdf_jsimp_obj *event_getTarget(void *jsctx, void *obj)
static void event_setTarget(void *jsctx, void *obj, pdf_jsimp_obj *val)
{
pdf_js *js = (pdf_js *)jsctx;
- fz_warn(js->doc->ctx, "Unexpected call to event_setTarget");
+ fz_warn(js->ctx, "Unexpected call to event_setTarget");
}
static pdf_jsimp_obj *event_getValue(void *jsctx, void *obj)
@@ -371,7 +374,7 @@ static pdf_jsimp_obj *event_getValue(void *jsctx, void *obj)
static void event_setValue(void *jsctx, void *obj, pdf_jsimp_obj *val)
{
pdf_js *js = (pdf_js *)jsctx;
- fz_context *ctx = js->doc->ctx;
+ fz_context *ctx = js->ctx;
fz_free(ctx, js->event.value);
js->event.value = NULL;
js->event.value = fz_strdup(ctx, pdf_jsimp_to_string(js->imp, val));
@@ -387,7 +390,7 @@ static pdf_jsimp_obj *event_getWillCommit(void *jsctx, void *obj)
static void event_setWillCommit(void *jsctx, void *obj, pdf_jsimp_obj *val)
{
pdf_js *js = (pdf_js *)jsctx;
- fz_warn(js->doc->ctx, "Unexpected call to event_setWillCommit");
+ fz_warn(js->ctx, "Unexpected call to event_setWillCommit");
}
static pdf_jsimp_obj *event_getRC(void *jsctx, void *obj)
@@ -414,7 +417,7 @@ static pdf_jsimp_obj *doc_getEvent(void *jsctx, void *obj)
static void doc_setEvent(void *jsctx, void *obj, pdf_jsimp_obj *val)
{
pdf_js *js = (pdf_js *)jsctx;
- fz_warn(js->doc->ctx, "Unexpected call to doc_setEvent");
+ fz_warn(js->ctx, "Unexpected call to doc_setEvent");
}
static pdf_jsimp_obj *doc_getApp(void *jsctx, void *obj)
@@ -427,7 +430,7 @@ static pdf_jsimp_obj *doc_getApp(void *jsctx, void *obj)
static void doc_setApp(void *jsctx, void *obj, pdf_jsimp_obj *val)
{
pdf_js *js = (pdf_js *)jsctx;
- fz_warn(js->doc->ctx, "Unexpected call to doc_setApp");
+ fz_warn(js->ctx, "Unexpected call to doc_setApp");
}
static char *utf8_to_pdf(fz_context *ctx, char *utf8)
@@ -466,7 +469,7 @@ static char *utf8_to_pdf(fz_context *ctx, char *utf8)
static pdf_jsimp_obj *doc_getField(void *jsctx, void *obj, int argc, pdf_jsimp_obj *args[])
{
pdf_js *js = (pdf_js *)jsctx;
- fz_context *ctx = js->doc->ctx;
+ fz_context *ctx = js->ctx;
pdf_obj *dict = NULL;
char *utf8;
char *name = NULL;
@@ -483,7 +486,7 @@ static pdf_jsimp_obj *doc_getField(void *jsctx, void *obj, int argc, pdf_jsimp_o
if (utf8)
{
name = utf8_to_pdf(ctx, utf8);
- dict = pdf_lookup_field(js->form, name);
+ dict = pdf_lookup_field(js->ctx, js->form, name);
}
}
fz_always(ctx)
@@ -502,7 +505,7 @@ static pdf_jsimp_obj *doc_getField(void *jsctx, void *obj, int argc, pdf_jsimp_o
static void reset_field(pdf_js *js, pdf_jsimp_obj *item)
{
- fz_context *ctx = js->doc->ctx;
+ fz_context *ctx = js->ctx;
char *name = NULL;
char *utf8 = pdf_jsimp_to_string(js->imp, item);
@@ -514,9 +517,9 @@ static void reset_field(pdf_js *js, pdf_jsimp_obj *item)
fz_try(ctx)
{
name = utf8_to_pdf(ctx, utf8);
- field = pdf_lookup_field(js->form, name);
+ field = pdf_lookup_field(js->ctx, js->form, name);
if (field)
- pdf_field_reset(js->doc, field);
+ pdf_field_reset(js->ctx, js->doc, field);
}
fz_always(ctx)
{
@@ -532,7 +535,7 @@ static void reset_field(pdf_js *js, pdf_jsimp_obj *item)
static pdf_jsimp_obj *doc_resetForm(void *jsctx, void *obj, int argc, pdf_jsimp_obj *args[])
{
pdf_js *js = (pdf_js *)jsctx;
- fz_context *ctx = js->doc->ctx;
+ fz_context *ctx = js->ctx;
pdf_jsimp_obj *arr = NULL;
pdf_jsimp_obj *elem = NULL;
@@ -583,10 +586,10 @@ static pdf_jsimp_obj *doc_resetForm(void *jsctx, void *obj, int argc, pdf_jsimp_
else
{
/* No argument or null passed in means reset all. */
- int i, n = pdf_array_len(js->form);
+ int i, n = pdf_array_len(ctx, js->form);
for (i = 0; i < n; i++)
- pdf_field_reset(js->doc, pdf_array_get(js->form, i));
+ pdf_field_reset(js->ctx, js->doc, pdf_array_get(ctx, js->form, i));
}
}
fz_catch(ctx)
@@ -601,7 +604,7 @@ static pdf_jsimp_obj *doc_print(void *jsctx, void *obj, int argc, pdf_jsimp_obj
{
pdf_js *js = (pdf_js *)jsctx;
- pdf_event_issue_print(js->doc);
+ pdf_event_issue_print(js->ctx, js->doc);
return NULL;
}
@@ -609,7 +612,7 @@ static pdf_jsimp_obj *doc_print(void *jsctx, void *obj, int argc, pdf_jsimp_obj
static pdf_jsimp_obj *doc_mailDoc(void *jsctx, void *obj, int argc, pdf_jsimp_obj *args[])
{
pdf_js *js = (pdf_js *)jsctx;
- fz_context *ctx = js->doc->ctx;
+ fz_context *ctx = js->ctx;
pdf_jsimp_obj *bUI_obj = NULL;
pdf_jsimp_obj *cTo_obj = NULL;
pdf_jsimp_obj *cCc_obj = NULL;
@@ -684,7 +687,7 @@ static pdf_jsimp_obj *doc_mailDoc(void *jsctx, void *obj, int argc, pdf_jsimp_ob
if (cMessage_obj)
event.message = pdf_jsimp_to_string(js->imp, cMessage_obj);
- pdf_event_issue_mail_doc(js->doc, &event);
+ pdf_event_issue_mail_doc(js->ctx, js->doc, &event);
}
fz_always(ctx)
{
@@ -774,7 +777,7 @@ static void pdf_drop_js(pdf_js *js)
{
if (js)
{
- fz_context *ctx = js->doc->ctx;
+ fz_context *ctx = js->ctx;
fz_free(ctx, js->event.value);
pdf_jsimp_drop_type(js->imp, js->apptype);
pdf_jsimp_drop_type(js->imp, js->eventtype);
@@ -785,9 +788,8 @@ static void pdf_drop_js(pdf_js *js)
}
}
-static pdf_js *pdf_new_js(pdf_document *doc)
+static pdf_js *pdf_new_js(fz_context *ctx, pdf_document *doc)
{
- fz_context *ctx = doc->ctx;
pdf_js *js = NULL;
fz_var(js);
@@ -796,12 +798,13 @@ static pdf_js *pdf_new_js(pdf_document *doc)
pdf_obj *root, *acroform;
js = fz_malloc_struct(ctx, pdf_js);
+ js->ctx = ctx;
js->doc = doc;
/* Find the form array */
- root = pdf_dict_gets(pdf_trailer(doc), "Root");
- acroform = pdf_dict_gets(root, "AcroForm");
- js->form = pdf_dict_gets(acroform, "Fields");
+ root = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Root");
+ acroform = pdf_dict_gets(ctx, root, "AcroForm");
+ js->form = pdf_dict_gets(ctx, acroform, "Fields");
/* Initialise the javascript engine, passing the main context
* for use in memory allocation and exception handling. Also
@@ -823,7 +826,7 @@ static pdf_js *pdf_new_js(pdf_document *doc)
static void pdf_js_load_document_level(pdf_js *js)
{
pdf_document *doc = js->doc;
- fz_context *ctx = doc->ctx;
+ fz_context *ctx = js->ctx;
pdf_obj *javascript = NULL;
char *codebuf = NULL;
@@ -833,18 +836,18 @@ static void pdf_js_load_document_level(pdf_js *js)
{
int len, i;
- javascript = pdf_load_name_tree(doc, "JavaScript");
- len = pdf_dict_len(javascript);
+ javascript = pdf_load_name_tree(ctx, doc, "JavaScript");
+ len = pdf_dict_len(ctx, javascript);
for (i = 0; i < len; i++)
{
- pdf_obj *fragment = pdf_dict_get_val(javascript, i);
- pdf_obj *code = pdf_dict_gets(fragment, "JS");
+ pdf_obj *fragment = pdf_dict_get_val(ctx, javascript, i);
+ pdf_obj *code = pdf_dict_gets(ctx, fragment, "JS");
fz_var(codebuf);
fz_try(ctx)
{
- codebuf = pdf_to_utf8(doc, code);
+ codebuf = pdf_to_utf8(ctx, doc, code);
pdf_jsimp_execute(js->imp, codebuf);
}
fz_always(ctx)
@@ -861,7 +864,7 @@ static void pdf_js_load_document_level(pdf_js *js)
}
fz_always(ctx)
{
- pdf_drop_obj(javascript);
+ pdf_drop_obj(ctx, javascript);
}
fz_catch(ctx)
{
@@ -873,7 +876,7 @@ void pdf_js_setup_event(pdf_js *js, pdf_js_event *e)
{
if (js)
{
- fz_context *ctx = js->doc->ctx;
+ fz_context *ctx = js->ctx;
char *ev = e->value ? e->value : "";
char *v = fz_strdup(ctx, ev);
@@ -894,7 +897,7 @@ void pdf_js_execute(pdf_js *js, char *code)
{
if (js)
{
- fz_context *ctx = js->doc->ctx;
+ fz_context *ctx = js->ctx;
fz_try(ctx)
{
pdf_jsimp_execute(js->imp, code);
@@ -909,7 +912,7 @@ void pdf_js_execute_count(pdf_js *js, char *code, int count)
{
if (js)
{
- fz_context *ctx = js->doc->ctx;
+ fz_context *ctx = js->ctx;
fz_try(ctx)
{
pdf_jsimp_execute_count(js->imp, code, count);
@@ -920,23 +923,23 @@ void pdf_js_execute_count(pdf_js *js, char *code, int count)
}
}
-void pdf_enable_js(pdf_document *doc)
+void pdf_enable_js(fz_context *ctx, pdf_document *doc)
{
if (!doc->js) {
- doc->js = pdf_new_js(doc);
+ doc->js = pdf_new_js(ctx, doc);
doc->drop_js = pdf_drop_js;
pdf_js_load_document_level(doc->js);
}
}
-void pdf_disable_js(pdf_document *doc)
+void pdf_disable_js(fz_context *ctx, pdf_document *doc)
{
if (doc->js)
doc->drop_js(doc->js);
doc->js = NULL;
}
-int pdf_js_supported(pdf_document *doc)
+int pdf_js_supported(fz_context *ctx, pdf_document *doc)
{
return doc->js != NULL;
}
diff --git a/source/pdf/pdf-annot-edit.c b/source/pdf/pdf-annot-edit.c
index 719f92bd..565e3171 100644
--- a/source/pdf/pdf-annot-edit.c
+++ b/source/pdf/pdf-annot-edit.c
@@ -36,48 +36,47 @@ static const char *annot_type_str(fz_annot_type type)
}
void
-pdf_update_annot(pdf_document *doc, pdf_annot *annot)
+pdf_update_annot(fz_context *ctx, pdf_document *doc, pdf_annot *annot)
{
pdf_obj *obj, *ap, *as, *n;
- fz_context *ctx = doc->ctx;
if (doc->update_appearance)
- doc->update_appearance(doc, annot);
+ doc->update_appearance(ctx, doc, annot);
obj = annot->obj;
- ap = pdf_dict_gets(obj, "AP");
- as = pdf_dict_gets(obj, "AS");
+ ap = pdf_dict_gets(ctx, obj, "AP");
+ as = pdf_dict_gets(ctx, obj, "AS");
- if (pdf_is_dict(ap))
+ if (pdf_is_dict(ctx, ap))
{
pdf_hotspot *hp = &doc->hotspot;
n = NULL;
- if (hp->num == pdf_to_num(obj)
- && hp->gen == pdf_to_gen(obj)
+ if (hp->num == pdf_to_num(ctx, obj)
+ && hp->gen == pdf_to_gen(ctx, obj)
&& (hp->state & HOTSPOT_POINTER_DOWN))
{
- n = pdf_dict_gets(ap, "D"); /* down state */
+ n = pdf_dict_gets(ctx, ap, "D"); /* down state */
}
if (n == NULL)
- n = pdf_dict_gets(ap, "N"); /* normal state */
+ n = pdf_dict_gets(ctx, ap, "N"); /* normal state */
/* lookup current state in sub-dictionary */
- if (!pdf_is_stream(doc, pdf_to_num(n), pdf_to_gen(n)))
- n = pdf_dict_get(n, as);
+ if (!pdf_is_stream(ctx, doc, pdf_to_num(ctx, n), pdf_to_gen(ctx, n)))
+ n = pdf_dict_get(ctx, n, as);
pdf_drop_xobject(ctx, annot->ap);
annot->ap = NULL;
- if (pdf_is_stream(doc, pdf_to_num(n), pdf_to_gen(n)))
+ if (pdf_is_stream(ctx, doc, pdf_to_num(ctx, n), pdf_to_gen(ctx, n)))
{
fz_try(ctx)
{
- annot->ap = pdf_load_xobject(doc, n);
- pdf_transform_annot(annot);
+ annot->ap = pdf_load_xobject(ctx, doc, n);
+ pdf_transform_annot(ctx, annot);
annot->ap_iteration = annot->ap->iteration;
}
fz_catch(ctx)
@@ -90,11 +89,10 @@ pdf_update_annot(pdf_document *doc, pdf_annot *annot)
}
pdf_annot *
-pdf_create_annot(pdf_document *doc, pdf_page *page, fz_annot_type type)
+pdf_create_annot(fz_context *ctx, pdf_document *doc, pdf_page *page, fz_annot_type type)
{
- fz_context *ctx = doc->ctx;
pdf_annot *annot = NULL;
- pdf_obj *annot_obj = pdf_new_dict(doc, 0);
+ pdf_obj *annot_obj = pdf_new_dict(ctx, doc, 0);
pdf_obj *ind_obj = NULL;
fz_var(annot);
@@ -104,20 +102,20 @@ pdf_create_annot(pdf_document *doc, pdf_page *page, fz_annot_type type)
int ind_obj_num;
fz_rect rect = {0.0, 0.0, 0.0, 0.0};
const char *type_str = annot_type_str(type);
- pdf_obj *annot_arr = pdf_dict_gets(page->me, "Annots");
+ pdf_obj *annot_arr = pdf_dict_gets(ctx, page->me, "Annots");
if (annot_arr == NULL)
{
- annot_arr = pdf_new_array(doc, 0);
- pdf_dict_puts_drop(page->me, "Annots", annot_arr);
+ annot_arr = pdf_new_array(ctx, doc, 0);
+ pdf_dict_puts_drop(ctx, page->me, "Annots", annot_arr);
}
- pdf_dict_puts_drop(annot_obj, "Type", pdf_new_name(doc, "Annot"));
+ pdf_dict_puts_drop(ctx, annot_obj, "Type", pdf_new_name(ctx, doc, "Annot"));
- pdf_dict_puts_drop(annot_obj, "Subtype", pdf_new_name(doc, type_str));
- pdf_dict_puts_drop(annot_obj, "Rect", pdf_new_rect(doc, &rect));
+ pdf_dict_puts_drop(ctx, annot_obj, "Subtype", pdf_new_name(ctx, doc, type_str));
+ pdf_dict_puts_drop(ctx, annot_obj, "Rect", pdf_new_rect(ctx, doc, &rect));
/* Make printable as default */
- pdf_dict_puts_drop(annot_obj, "F", pdf_new_int(doc, F_Print));
+ pdf_dict_puts_drop(ctx, annot_obj, "F", pdf_new_int(ctx, doc, F_Print));
annot = fz_malloc_struct(ctx, pdf_annot);
annot->page = page;
@@ -132,11 +130,11 @@ pdf_create_annot(pdf_document *doc, pdf_page *page, fz_annot_type type)
Insert the object in the hierarchy and the structure in the
page's array.
*/
- ind_obj_num = pdf_create_object(doc);
- pdf_update_object(doc, ind_obj_num, annot_obj);
- ind_obj = pdf_new_indirect(doc, ind_obj_num, 0);
- pdf_array_push(annot_arr, ind_obj);
- annot->obj = pdf_keep_obj(ind_obj);
+ ind_obj_num = pdf_create_object(ctx, doc);
+ pdf_update_object(ctx, doc, ind_obj_num, annot_obj);
+ ind_obj = pdf_new_indirect(ctx, doc, ind_obj_num, 0);
+ pdf_array_push(ctx, annot_arr, ind_obj);
+ annot->obj = pdf_keep_obj(ctx, ind_obj);
/*
Linking must be done after any call that might throw because
@@ -150,8 +148,8 @@ pdf_create_annot(pdf_document *doc, pdf_page *page, fz_annot_type type)
}
fz_always(ctx)
{
- pdf_drop_obj(annot_obj);
- pdf_drop_obj(ind_obj);
+ pdf_drop_obj(ctx, annot_obj);
+ pdf_drop_obj(ctx, ind_obj);
}
fz_catch(ctx)
{
@@ -163,9 +161,8 @@ pdf_create_annot(pdf_document *doc, pdf_page *page, fz_annot_type type)
}
void
-pdf_delete_annot(pdf_document *doc, pdf_page *page, pdf_annot *annot)
+pdf_delete_annot(fz_context *ctx, pdf_document *doc, pdf_page *page, pdf_annot *annot)
{
- fz_context *ctx = doc->ctx;
pdf_annot **annotptr;
pdf_obj *old_annot_arr;
pdf_obj *annot_arr;
@@ -197,34 +194,34 @@ pdf_delete_annot(pdf_document *doc, pdf_page *page, pdf_annot *annot)
annot->ap = NULL;
/* Recreate the "Annots" array with this annot removed */
- old_annot_arr = pdf_dict_gets(page->me, "Annots");
+ old_annot_arr = pdf_dict_gets(ctx, page->me, "Annots");
if (old_annot_arr)
{
- int i, n = pdf_array_len(old_annot_arr);
- annot_arr = pdf_new_array(doc, n?(n-1):0);
+ int i, n = pdf_array_len(ctx, old_annot_arr);
+ annot_arr = pdf_new_array(ctx, doc, n?(n-1):0);
fz_try(ctx)
{
for (i = 0; i < n; i++)
{
- pdf_obj *obj = pdf_array_get(old_annot_arr, i);
+ pdf_obj *obj = pdf_array_get(ctx, old_annot_arr, i);
if (obj != annot->obj)
- pdf_array_push(annot_arr, obj);
+ pdf_array_push(ctx, annot_arr, obj);
}
- if (pdf_is_indirect(old_annot_arr))
- pdf_update_object(doc, pdf_to_num(old_annot_arr), annot_arr);
+ if (pdf_is_indirect(ctx, old_annot_arr))
+ pdf_update_object(ctx, doc, pdf_to_num(ctx, old_annot_arr), annot_arr);
else
- pdf_dict_puts(page->me, "Annots", annot_arr);
+ pdf_dict_puts(ctx, page->me, "Annots", annot_arr);
- if (pdf_is_indirect(annot->obj))
- pdf_delete_object(doc, pdf_to_num(annot->obj));
+ if (pdf_is_indirect(ctx, annot->obj))
+ pdf_delete_object(ctx, doc, pdf_to_num(ctx, annot->obj));
}
fz_always(ctx)
{
- pdf_drop_obj(annot_arr);
+ pdf_drop_obj(ctx, annot_arr);
}
fz_catch(ctx)
{
@@ -232,21 +229,21 @@ pdf_delete_annot(pdf_document *doc, pdf_page *page, pdf_annot *annot)
}
}
- pdf_drop_obj(annot->obj);
+ pdf_drop_obj(ctx, annot->obj);
annot->obj = NULL;
doc->dirty = 1;
}
void
-pdf_set_markup_annot_quadpoints(pdf_document *doc, pdf_annot *annot, fz_point *qp, int n)
+pdf_set_markup_annot_quadpoints(fz_context *ctx, pdf_document *doc, pdf_annot *annot, fz_point *qp, int n)
{
fz_matrix ctm;
- pdf_obj *arr = pdf_new_array(doc, n*2);
+ pdf_obj *arr = pdf_new_array(ctx, doc, n*2);
int i;
fz_invert_matrix(&ctm, &annot->page->ctm);
- pdf_dict_puts_drop(annot->obj, "QuadPoints", arr);
+ pdf_dict_puts_drop(ctx, annot->obj, "QuadPoints", arr);
for (i = 0; i < n; i++)
{
@@ -254,40 +251,39 @@ pdf_set_markup_annot_quadpoints(pdf_document *doc, pdf_annot *annot, fz_point *q
pdf_obj *r;
fz_transform_point(&pt, &ctm);
- r = pdf_new_real(doc, pt.x);
- pdf_array_push_drop(arr, r);
- r = pdf_new_real(doc, pt.y);
- pdf_array_push_drop(arr, r);
+ r = pdf_new_real(ctx, doc, pt.x);
+ pdf_array_push_drop(ctx, arr, r);
+ r = pdf_new_real(ctx, doc, pt.y);
+ pdf_array_push_drop(ctx, arr, r);
}
}
static void update_rect(fz_context *ctx, pdf_annot *annot)
{
- pdf_to_rect(ctx, pdf_dict_gets(annot->obj, "Rect"), &annot->rect);
+ pdf_to_rect(ctx, pdf_dict_gets(ctx, annot->obj, "Rect"), &annot->rect);
annot->pagerect = annot->rect;
fz_transform_rect(&annot->pagerect, &annot->page->ctm);
}
void
-pdf_set_ink_annot_list(pdf_document *doc, pdf_annot *annot, fz_point *pts, int *counts, int ncount, float color[3], float thickness)
+pdf_set_ink_annot_list(fz_context *ctx, pdf_document *doc, pdf_annot *annot, fz_point *pts, int *counts, int ncount, float color[3], float thickness)
{
- fz_context *ctx = doc->ctx;
fz_matrix ctm;
- pdf_obj *list = pdf_new_array(doc, ncount);
+ pdf_obj *list = pdf_new_array(ctx, doc, ncount);
pdf_obj *bs, *col;
fz_rect rect;
int i, k = 0;
fz_invert_matrix(&ctm, &annot->page->ctm);
- pdf_dict_puts_drop(annot->obj, "InkList", list);
+ pdf_dict_puts_drop(ctx, annot->obj, "InkList", list);
for (i = 0; i < ncount; i++)
{
int j;
- pdf_obj *arc = pdf_new_array(doc, counts[i]);
+ pdf_obj *arc = pdf_new_array(ctx, doc, counts[i]);
- pdf_array_push_drop(list, arc);
+ pdf_array_push_drop(ctx, list, arc);
for (j = 0; j < counts[i]; j++)
{
@@ -305,8 +301,8 @@ pdf_set_ink_annot_list(pdf_document *doc, pdf_annot *annot, fz_point *pts, int *
fz_include_point_in_rect(&rect, &pt);
}
- pdf_array_push_drop(arc, pdf_new_real(doc, pt.x));
- pdf_array_push_drop(arc, pdf_new_real(doc, pt.y));
+ pdf_array_push_drop(ctx, arc, pdf_new_real(ctx, doc, pt.x));
+ pdf_array_push_drop(ctx, arc, pdf_new_real(ctx, doc, pt.y));
k++;
}
}
@@ -324,20 +320,20 @@ pdf_set_ink_annot_list(pdf_document *doc, pdf_annot *annot, fz_point *pts, int *
rect.y1 += thickness;
}
- pdf_dict_puts_drop(annot->obj, "Rect", pdf_new_rect(doc, &rect));
+ pdf_dict_puts_drop(ctx, annot->obj, "Rect", pdf_new_rect(ctx, doc, &rect));
update_rect(ctx, annot);
- bs = pdf_new_dict(doc, 1);
- pdf_dict_puts_drop(annot->obj, "BS", bs);
- pdf_dict_puts_drop(bs, "W", pdf_new_real(doc, thickness));
+ bs = pdf_new_dict(ctx, doc, 1);
+ pdf_dict_puts_drop(ctx, annot->obj, "BS", bs);
+ pdf_dict_puts_drop(ctx, bs, "W", pdf_new_real(ctx, doc, thickness));
- col = pdf_new_array(doc, 3);
- pdf_dict_puts_drop(annot->obj, "C", col);
+ col = pdf_new_array(ctx, doc, 3);
+ pdf_dict_puts_drop(ctx, annot->obj, "C", col);
for (i = 0; i < 3; i++)
- pdf_array_push_drop(col, pdf_new_real(doc, color[i]));
+ pdf_array_push_drop(ctx, col, pdf_new_real(ctx, doc, color[i]));
}
-static void find_free_font_name(pdf_obj *fdict, char *buf, int buf_size)
+static void find_free_font_name(fz_context *ctx, pdf_obj *fdict, char *buf, int buf_size)
{
int i;
@@ -346,12 +342,12 @@ static void find_free_font_name(pdf_obj *fdict, char *buf, int buf_size)
{
snprintf(buf, buf_size, "F%d", i);
- if (!pdf_dict_gets(fdict, buf))
+ if (!pdf_dict_gets(ctx, fdict, buf))
break;
}
}
-void pdf_set_text_annot_position(pdf_document *doc, pdf_annot *annot, fz_point pt)
+void pdf_set_text_annot_position(fz_context *ctx, pdf_document *doc, pdf_annot *annot, fz_point pt)
{
fz_matrix ctm;
fz_rect rect;
@@ -364,28 +360,27 @@ void pdf_set_text_annot_position(pdf_document *doc, pdf_annot *annot, fz_point p
rect.y1 = pt.y + TEXT_ANNOT_SIZE;
fz_transform_rect(&rect, &ctm);
- pdf_dict_puts_drop(annot->obj, "Rect", pdf_new_rect(doc, &rect));
+ pdf_dict_puts_drop(ctx, annot->obj, "Rect", pdf_new_rect(ctx, doc, &rect));
- flags = pdf_to_int(pdf_dict_gets(annot->obj, "F"));
+ flags = pdf_to_int(ctx, pdf_dict_gets(ctx, annot->obj, "F"));
flags |= (F_NoZoom|F_NoRotate);
- pdf_dict_puts_drop(annot->obj, "F", pdf_new_int(doc, flags));
+ pdf_dict_puts_drop(ctx, annot->obj, "F", pdf_new_int(ctx, doc, flags));
- update_rect(doc->ctx, annot);
+ update_rect(ctx, annot);
}
-void pdf_set_annot_contents(pdf_document *doc, pdf_annot *annot, char *text)
+void pdf_set_annot_contents(fz_context *ctx, pdf_document *doc, pdf_annot *annot, char *text)
{
- pdf_dict_puts_drop(annot->obj, "Contents", pdf_new_string(doc, text, strlen(text)));
+ pdf_dict_puts_drop(ctx, annot->obj, "Contents", pdf_new_string(ctx, doc, text, strlen(text)));
}
-char *pdf_annot_contents(pdf_document *doc, pdf_annot *annot)
+char *pdf_annot_contents(fz_context *ctx, pdf_document *doc, pdf_annot *annot)
{
- return pdf_to_str_buf(pdf_dict_getp(annot->obj, "Contents"));
+ return pdf_to_str_buf(ctx, pdf_dict_getp(ctx, annot->obj, "Contents"));
}
-void pdf_set_free_text_details(pdf_document *doc, pdf_annot *annot, fz_point *pos, char *text, char *font_name, float font_size, float color[3])
+void pdf_set_free_text_details(fz_context *ctx, pdf_document *doc, pdf_annot *annot, fz_point *pos, char *text, char *font_name, float font_size, float color[3])
{
- fz_context *ctx = doc->ctx;
char nbuf[32];
pdf_obj *dr;
pdf_obj *form_fonts;
@@ -399,19 +394,19 @@ void pdf_set_free_text_details(pdf_document *doc, pdf_annot *annot, fz_point *po
fz_invert_matrix(&ctm, &annot->page->ctm);
- dr = pdf_dict_gets(annot->page->me, "Resources");
+ dr = pdf_dict_gets(ctx, annot->page->me, "Resources");
if (!dr)
{
- dr = pdf_new_dict(doc, 1);
- pdf_dict_putp_drop(annot->page->me, "Resources", dr);
+ dr = pdf_new_dict(ctx, doc, 1);
+ pdf_dict_putp_drop(ctx, annot->page->me, "Resources", dr);
}
/* Ensure the resource dictionary includes a font dict */
- form_fonts = pdf_dict_gets(dr, "Font");
+ form_fonts = pdf_dict_gets(ctx, dr, "Font");
if (!form_fonts)
{
- form_fonts = pdf_new_dict(doc, 1);
- pdf_dict_puts_drop(dr, "Font", form_fonts);
+ form_fonts = pdf_new_dict(ctx, doc, 1);
+ pdf_dict_puts_drop(ctx, dr, "Font", form_fonts);
/* form_fonts is still valid if execution continues past the above call */
}
@@ -423,16 +418,16 @@ void pdf_set_free_text_details(pdf_document *doc, pdf_annot *annot, fz_point *po
int da_len;
fz_rect bounds;
- find_free_font_name(form_fonts, nbuf, sizeof(nbuf));
+ find_free_font_name(ctx, form_fonts, nbuf, sizeof(nbuf));
- font = pdf_new_dict(doc, 5);
- ref = pdf_new_ref(doc, font);
- pdf_dict_puts_drop(form_fonts, nbuf, ref);
+ font = pdf_new_dict(ctx, doc, 5);
+ ref = pdf_new_ref(ctx, doc, font);
+ pdf_dict_puts_drop(ctx, form_fonts, nbuf, ref);
- pdf_dict_puts_drop(font, "Type", pdf_new_name(doc, "Font"));
- pdf_dict_puts_drop(font, "Subtype", pdf_new_name(doc, "Type1"));
- pdf_dict_puts_drop(font, "BaseFont", pdf_new_name(doc, font_name));
- pdf_dict_puts_drop(font, "Encoding", pdf_new_name(doc, "WinAnsiEncoding"));
+ pdf_dict_puts_drop(ctx, font, "Type", pdf_new_name(ctx, doc, "Font"));
+ pdf_dict_puts_drop(ctx, font, "Subtype", pdf_new_name(ctx, doc, "Type1"));
+ pdf_dict_puts_drop(ctx, font, "BaseFont", pdf_new_name(ctx, doc, font_name));
+ pdf_dict_puts_drop(ctx, font, "Encoding", pdf_new_name(ctx, doc, "WinAnsiEncoding"));
memcpy(da_info.col, color, sizeof(float)*3);
da_info.col_size = 3;
@@ -443,12 +438,12 @@ void pdf_set_free_text_details(pdf_document *doc, pdf_annot *annot, fz_point *po
pdf_fzbuf_print_da(ctx, fzbuf, &da_info);
da_len = fz_buffer_storage(ctx, fzbuf, &da_str);
- pdf_dict_puts_drop(annot->obj, "DA", pdf_new_string(doc, (char *)da_str, da_len));
+ pdf_dict_puts_drop(ctx, annot->obj, "DA", pdf_new_string(ctx, doc, (char *)da_str, da_len));
/* FIXME: should convert to WinAnsiEncoding */
- pdf_dict_puts_drop(annot->obj, "Contents", pdf_new_string(doc, text, strlen(text)));
+ pdf_dict_puts_drop(ctx, annot->obj, "Contents", pdf_new_string(ctx, doc, text, strlen(text)));
- font_desc = pdf_load_font(doc, NULL, font, 0);
+ font_desc = pdf_load_font(ctx, doc, NULL, font, 0);
pdf_measure_text(ctx, font_desc, (unsigned char *)text, strlen(text), &bounds);
page_pos = *pos;
@@ -464,12 +459,12 @@ void pdf_set_free_text_details(pdf_document *doc, pdf_annot *annot, fz_point *po
bounds.y0 += page_pos.y;
bounds.y1 += page_pos.y;
- pdf_dict_puts_drop(annot->obj, "Rect", pdf_new_rect(doc, &bounds));
+ pdf_dict_puts_drop(ctx, annot->obj, "Rect", pdf_new_rect(ctx, doc, &bounds));
update_rect(ctx, annot);
}
fz_always(ctx)
{
- pdf_drop_obj(font);
+ pdf_drop_obj(ctx, font);
fz_drop_buffer(ctx, fzbuf);
pdf_drop_font(ctx, font_desc);
}
diff --git a/source/pdf/pdf-annot.c b/source/pdf/pdf-annot.c
index 72f5cd8e..b25c24df 100644
--- a/source/pdf/pdf-annot.c
+++ b/source/pdf/pdf-annot.c
@@ -1,47 +1,47 @@
#include "mupdf/pdf.h"
static pdf_obj *
-resolve_dest_rec(pdf_document *doc, pdf_obj *dest, fz_link_kind kind, int depth)
+resolve_dest_rec(fz_context *ctx, pdf_document *doc, pdf_obj *dest, fz_link_kind kind, int depth)
{
if (depth > 10) /* Arbitrary to avoid infinite recursion */
return NULL;
- if (pdf_is_name(dest) || pdf_is_string(dest))
+ if (pdf_is_name(ctx, dest) || pdf_is_string(ctx, dest))
{
if (kind == FZ_LINK_GOTO)
{
- dest = pdf_lookup_dest(doc, dest);
- dest = resolve_dest_rec(doc, dest, kind, depth+1);
+ dest = pdf_lookup_dest(ctx, doc, dest);
+ dest = resolve_dest_rec(ctx, doc, dest, kind, depth+1);
}
return dest;
}
- else if (pdf_is_array(dest))
+ else if (pdf_is_array(ctx, dest))
{
return dest;
}
- else if (pdf_is_dict(dest))
+ else if (pdf_is_dict(ctx, dest))
{
- dest = pdf_dict_gets(dest, "D");
- return resolve_dest_rec(doc, dest, kind, depth+1);
+ dest = pdf_dict_gets(ctx, dest, "D");
+ return resolve_dest_rec(ctx, doc, dest, kind, depth+1);
}
- else if (pdf_is_indirect(dest))
+ else if (pdf_is_indirect(ctx, dest))
return dest;
return NULL;
}
static pdf_obj *
-resolve_dest(pdf_document *doc, pdf_obj *dest, fz_link_kind kind)
+resolve_dest(fz_context *ctx, pdf_document *doc, pdf_obj *dest, fz_link_kind kind)
{
- return resolve_dest_rec(doc, dest, kind, 0);
+ return resolve_dest_rec(ctx, doc, dest, kind, 0);
}
fz_link_dest
-pdf_parse_link_dest(pdf_document *doc, fz_link_kind kind, pdf_obj *dest)
+pdf_parse_link_dest(fz_context *ctx, pdf_document *doc, fz_link_kind kind, pdf_obj *dest)
{
fz_link_dest ld;
pdf_obj *obj;
@@ -63,65 +63,65 @@ pdf_parse_link_dest(pdf_document *doc, fz_link_kind kind, pdf_obj *dest)
ld.ld.gotor.page = -1;
ld.ld.gotor.dest = NULL;
- dest = resolve_dest(doc, dest, kind);
+ dest = resolve_dest(ctx, doc, dest, kind);
if (dest == NULL)
{
- fz_warn(doc->ctx, "undefined link destination");
+ fz_warn(ctx, "undefined link destination");
return ld;
}
- if (pdf_is_name(dest))
+ if (pdf_is_name(ctx, dest))
{
- ld.ld.gotor.dest = pdf_to_name(dest);
+ ld.ld.gotor.dest = pdf_to_name(ctx, dest);
return ld;
}
- else if (pdf_is_string(dest))
+ else if (pdf_is_string(ctx, dest))
{
- ld.ld.gotor.dest = pdf_to_str_buf(dest);
+ ld.ld.gotor.dest = pdf_to_str_buf(ctx, dest);
return ld;
}
- obj = pdf_array_get(dest, 0);
- if (pdf_is_int(obj))
- ld.ld.gotor.page = pdf_to_int(obj);
+ obj = pdf_array_get(ctx, dest, 0);
+ if (pdf_is_int(ctx, obj))
+ ld.ld.gotor.page = pdf_to_int(ctx, obj);
else
{
- fz_try(doc->ctx)
+ fz_try(ctx)
{
- ld.ld.gotor.page = pdf_lookup_page_number(doc, obj);
+ ld.ld.gotor.page = pdf_lookup_page_number(ctx, doc, obj);
}
- fz_catch(doc->ctx)
+ fz_catch(ctx)
{
ld.kind = FZ_LINK_NONE;
return ld;
}
}
- obj = pdf_array_get(dest, 1);
- if (!pdf_is_name(obj))
+ obj = pdf_array_get(ctx, dest, 1);
+ if (!pdf_is_name(ctx, obj))
return ld;
- if (!strcmp("XYZ", pdf_to_name(obj)))
+ if (!strcmp("XYZ", pdf_to_name(ctx, obj)))
{
l_from_2 = t_from_3 = z_from_4 = 1;
ld.ld.gotor.flags |= fz_link_flag_r_is_zoom;
}
- else if ((!strcmp("Fit", pdf_to_name(obj))) || (!strcmp("FitB", pdf_to_name(obj))))
+ else if ((!strcmp("Fit", pdf_to_name(ctx, obj))) || (!strcmp("FitB", pdf_to_name(ctx, obj))))
{
ld.ld.gotor.flags |= fz_link_flag_fit_h;
ld.ld.gotor.flags |= fz_link_flag_fit_v;
}
- else if ((!strcmp("FitH", pdf_to_name(obj))) || (!strcmp("FitBH", pdf_to_name(obj))))
+ else if ((!strcmp("FitH", pdf_to_name(ctx, obj))) || (!strcmp("FitBH", pdf_to_name(ctx, obj))))
{
t_from_2 = 1;
ld.ld.gotor.flags |= fz_link_flag_fit_h;
}
- else if ((!strcmp("FitV", pdf_to_name(obj))) || (!strcmp("FitBV", pdf_to_name(obj))))
+ else if ((!strcmp("FitV", pdf_to_name(ctx, obj))) || (!strcmp("FitBV", pdf_to_name(ctx, obj))))
{
l_from_2 = 1;
ld.ld.gotor.flags |= fz_link_flag_fit_v;
}
- else if (!strcmp("FitR", pdf_to_name(obj)))
+ else if (!strcmp("FitR", pdf_to_name(ctx, obj)))
{
l_from_2 = b_from_3 = r_from_4 = t_from_5 = 1;
ld.ld.gotor.flags |= fz_link_flag_fit_h;
@@ -130,77 +130,77 @@ pdf_parse_link_dest(pdf_document *doc, fz_link_kind kind, pdf_obj *dest)
if (l_from_2)
{
- obj = pdf_array_get(dest, 2);
- if (pdf_is_int(obj))
+ obj = pdf_array_get(ctx, dest, 2);
+ if (pdf_is_int(ctx, obj))
{
ld.ld.gotor.flags |= fz_link_flag_l_valid;
- ld.ld.gotor.lt.x = pdf_to_int(obj);
+ ld.ld.gotor.lt.x = pdf_to_int(ctx, obj);
}
- else if (pdf_is_real(obj))
+ else if (pdf_is_real(ctx, obj))
{
ld.ld.gotor.flags |= fz_link_flag_l_valid;
- ld.ld.gotor.lt.x = pdf_to_real(obj);
+ ld.ld.gotor.lt.x = pdf_to_real(ctx, obj);
}
}
if (b_from_3)
{
- obj = pdf_array_get(dest, 3);
- if (pdf_is_int(obj))
+ obj = pdf_array_get(ctx, dest, 3);
+ if (pdf_is_int(ctx, obj))
{
ld.ld.gotor.flags |= fz_link_flag_b_valid;
- ld.ld.gotor.rb.y = pdf_to_int(obj);
+ ld.ld.gotor.rb.y = pdf_to_int(ctx, obj);
}
- else if (pdf_is_real(obj))
+ else if (pdf_is_real(ctx, obj))
{
ld.ld.gotor.flags |= fz_link_flag_b_valid;
- ld.ld.gotor.rb.y = pdf_to_real(obj);
+ ld.ld.gotor.rb.y = pdf_to_real(ctx, obj);
}
}
if (r_from_4)
{
- obj = pdf_array_get(dest, 4);
- if (pdf_is_int(obj))
+ obj = pdf_array_get(ctx, dest, 4);
+ if (pdf_is_int(ctx, obj))
{
ld.ld.gotor.flags |= fz_link_flag_r_valid;
- ld.ld.gotor.rb.x = pdf_to_int(obj);
+ ld.ld.gotor.rb.x = pdf_to_int(ctx, obj);
}
- else if (pdf_is_real(obj))
+ else if (pdf_is_real(ctx, obj))
{
ld.ld.gotor.flags |= fz_link_flag_r_valid;
- ld.ld.gotor.rb.x = pdf_to_real(obj);
+ ld.ld.gotor.rb.x = pdf_to_real(ctx, obj);
}
}
if (t_from_5 || t_from_3 || t_from_2)
{
if (t_from_5)
- obj = pdf_array_get(dest, 5);
+ obj = pdf_array_get(ctx, dest, 5);
else if (t_from_3)
- obj = pdf_array_get(dest, 3);
+ obj = pdf_array_get(ctx, dest, 3);
else
- obj = pdf_array_get(dest, 2);
- if (pdf_is_int(obj))
+ obj = pdf_array_get(ctx, dest, 2);
+ if (pdf_is_int(ctx, obj))
{
ld.ld.gotor.flags |= fz_link_flag_t_valid;
- ld.ld.gotor.lt.y = pdf_to_int(obj);
+ ld.ld.gotor.lt.y = pdf_to_int(ctx, obj);
}
- else if (pdf_is_real(obj))
+ else if (pdf_is_real(ctx, obj))
{
ld.ld.gotor.flags |= fz_link_flag_t_valid;
- ld.ld.gotor.lt.y = pdf_to_real(obj);
+ ld.ld.gotor.lt.y = pdf_to_real(ctx, obj);
}
}
if (z_from_4)
{
- obj = pdf_array_get(dest, 4);
- if (pdf_is_int(obj))
+ obj = pdf_array_get(ctx, dest, 4);
+ if (pdf_is_int(ctx, obj))
{
ld.ld.gotor.flags |= fz_link_flag_r_valid;
- ld.ld.gotor.rb.x = pdf_to_int(obj);
+ ld.ld.gotor.rb.x = pdf_to_int(ctx, obj);
}
- else if (pdf_is_real(obj))
+ else if (pdf_is_real(ctx, obj))
{
ld.ld.gotor.flags |= fz_link_flag_r_valid;
- ld.ld.gotor.rb.x = pdf_to_real(obj);
+ ld.ld.gotor.rb.x = pdf_to_real(ctx, obj);
}
}
@@ -218,26 +218,25 @@ pdf_parse_link_dest(pdf_document *doc, fz_link_kind kind, pdf_obj *dest)
}
static char *
-pdf_parse_file_spec(pdf_document *doc, pdf_obj *file_spec)
+pdf_parse_file_spec(fz_context *ctx, pdf_document *doc, pdf_obj *file_spec)
{
- fz_context *ctx = doc->ctx;
pdf_obj *filename;
- if (pdf_is_string(file_spec))
- return pdf_to_utf8(doc, file_spec);
+ if (pdf_is_string(ctx, file_spec))
+ return pdf_to_utf8(ctx, doc, file_spec);
- if (pdf_is_dict(file_spec)) {
- filename = pdf_dict_gets(file_spec, "UF");
+ if (pdf_is_dict(ctx, file_spec)) {
+ filename = pdf_dict_gets(ctx, file_spec, "UF");
if (!filename)
- filename = pdf_dict_gets(file_spec, "F");
+ filename = pdf_dict_gets(ctx, file_spec, "F");
if (!filename)
- filename = pdf_dict_gets(file_spec, "Unix");
+ filename = pdf_dict_gets(ctx, file_spec, "Unix");
if (!filename)
- filename = pdf_dict_gets(file_spec, "Mac");
+ filename = pdf_dict_gets(ctx, file_spec, "Mac");
if (!filename)
- filename = pdf_dict_gets(file_spec, "DOS");
+ filename = pdf_dict_gets(ctx, file_spec, "DOS");
- return pdf_to_utf8(doc, filename);
+ return pdf_to_utf8(ctx, doc, filename);
}
fz_warn(ctx, "cannot parse file specification");
@@ -245,65 +244,61 @@ pdf_parse_file_spec(pdf_document *doc, pdf_obj *file_spec)
}
fz_link_dest
-pdf_parse_action(pdf_document *doc, pdf_obj *action)
+pdf_parse_action(fz_context *ctx, pdf_document *doc, pdf_obj *action)
{
fz_link_dest ld;
pdf_obj *obj, *dest, *file_spec;
- fz_context *ctx = doc->ctx;
-
- UNUSED(ctx);
ld.kind = FZ_LINK_NONE;
if (!action)
return ld;
- obj = pdf_dict_gets(action, "S");
- if (!strcmp(pdf_to_name(obj), "GoTo"))
+ obj = pdf_dict_gets(ctx, action, "S");
+ if (!strcmp(pdf_to_name(ctx, obj), "GoTo"))
{
- dest = pdf_dict_gets(action, "D");
- ld = pdf_parse_link_dest(doc, FZ_LINK_GOTO, dest);
+ dest = pdf_dict_gets(ctx, action, "D");
+ ld = pdf_parse_link_dest(ctx, doc, FZ_LINK_GOTO, dest);
}
- else if (!strcmp(pdf_to_name(obj), "URI"))
+ else if (!strcmp(pdf_to_name(ctx, obj), "URI"))
{
ld.kind = FZ_LINK_URI;
- ld.ld.uri.is_map = pdf_to_bool(pdf_dict_gets(action, "IsMap"));
- ld.ld.uri.uri = pdf_to_utf8(doc, pdf_dict_gets(action, "URI"));
+ ld.ld.uri.is_map = pdf_to_bool(ctx, pdf_dict_gets(ctx, action, "IsMap"));
+ ld.ld.uri.uri = pdf_to_utf8(ctx, doc, pdf_dict_gets(ctx, action, "URI"));
}
- else if (!strcmp(pdf_to_name(obj), "Launch"))
+ else if (!strcmp(pdf_to_name(ctx, obj), "Launch"))
{
ld.kind = FZ_LINK_LAUNCH;
- file_spec = pdf_dict_gets(action, "F");
- ld.ld.launch.file_spec = pdf_parse_file_spec(doc, file_spec);
- ld.ld.launch.new_window = pdf_to_int(pdf_dict_gets(action, "NewWindow"));
- ld.ld.launch.is_uri = !strcmp(pdf_to_name(pdf_dict_gets(file_spec, "FS")), "URL");
+ file_spec = pdf_dict_gets(ctx, action, "F");
+ ld.ld.launch.file_spec = pdf_parse_file_spec(ctx, doc, file_spec);
+ ld.ld.launch.new_window = pdf_to_int(ctx, pdf_dict_gets(ctx, action, "NewWindow"));
+ ld.ld.launch.is_uri = !strcmp(pdf_to_name(ctx, pdf_dict_gets(ctx, file_spec, "FS")), "URL");
}
- else if (!strcmp(pdf_to_name(obj), "Named"))
+ else if (!strcmp(pdf_to_name(ctx, obj), "Named"))
{
ld.kind = FZ_LINK_NAMED;
- ld.ld.named.named = fz_strdup(ctx, pdf_to_name(pdf_dict_gets(action, "N")));
+ ld.ld.named.named = fz_strdup(ctx, pdf_to_name(ctx, pdf_dict_gets(ctx, action, "N")));
}
- else if (!strcmp(pdf_to_name(obj), "GoToR"))
+ else if (!strcmp(pdf_to_name(ctx, obj), "GoToR"))
{
- dest = pdf_dict_gets(action, "D");
- file_spec = pdf_dict_gets(action, "F");
- ld = pdf_parse_link_dest(doc, FZ_LINK_GOTOR, dest);
- ld.ld.gotor.file_spec = pdf_parse_file_spec(doc, file_spec);
- ld.ld.gotor.new_window = pdf_to_int(pdf_dict_gets(action, "NewWindow"));
+ dest = pdf_dict_gets(ctx, action, "D");
+ file_spec = pdf_dict_gets(ctx, action, "F");
+ ld = pdf_parse_link_dest(ctx, doc, FZ_LINK_GOTOR, dest);
+ ld.ld.gotor.file_spec = pdf_parse_file_spec(ctx, doc, file_spec);
+ ld.ld.gotor.new_window = pdf_to_int(ctx, pdf_dict_gets(ctx, action, "NewWindow"));
}
return ld;
}
static fz_link *
-pdf_load_link(pdf_document *doc, pdf_obj *dict, const fz_matrix *page_ctm)
+pdf_load_link(fz_context *ctx, pdf_document *doc, pdf_obj *dict, const fz_matrix *page_ctm)
{
pdf_obj *action;
pdf_obj *obj;
fz_rect bbox;
- fz_context *ctx = doc->ctx;
fz_link_dest ld;
- obj = pdf_dict_gets(dict, "Rect");
+ obj = pdf_dict_gets(ctx, dict, "Rect");
if (obj)
pdf_to_rect(ctx, obj, &bbox);
else
@@ -311,17 +306,17 @@ pdf_load_link(pdf_document *doc, pdf_obj *dict, const fz_matrix *page_ctm)
fz_transform_rect(&bbox, page_ctm);
- obj = pdf_dict_gets(dict, "Dest");
+ obj = pdf_dict_gets(ctx, dict, "Dest");
if (obj)
- ld = pdf_parse_link_dest(doc, FZ_LINK_GOTO, obj);
+ ld = pdf_parse_link_dest(ctx, doc, FZ_LINK_GOTO, obj);
else
{
- action = pdf_dict_gets(dict, "A");
+ action = pdf_dict_gets(ctx, dict, "A");
/* fall back to additional action button's down/up action */
if (!action)
- action = pdf_dict_getsa(pdf_dict_gets(dict, "AA"), "U", "D");
+ action = pdf_dict_getsa(ctx, pdf_dict_gets(ctx, dict, "AA"), "U", "D");
- ld = pdf_parse_action(doc, action);
+ ld = pdf_parse_action(ctx, doc, action);
}
if (ld.kind == FZ_LINK_NONE)
return NULL;
@@ -329,7 +324,7 @@ pdf_load_link(pdf_document *doc, pdf_obj *dict, const fz_matrix *page_ctm)
}
fz_link *
-pdf_load_link_annots(pdf_document *doc, pdf_obj *annots, const fz_matrix *page_ctm)
+pdf_load_link_annots(fz_context *ctx, pdf_document *doc, pdf_obj *annots, const fz_matrix *page_ctm)
{
fz_link *link, *head, *tail;
pdf_obj *obj;
@@ -338,18 +333,18 @@ pdf_load_link_annots(pdf_document *doc, pdf_obj *annots, const fz_matrix *page_c
head = tail = NULL;
link = NULL;
- n = pdf_array_len(annots);
+ n = pdf_array_len(ctx, annots);
for (i = 0; i < n; i++)
{
/* FIXME: Move the try/catch out of the loop for performance? */
- fz_try(doc->ctx)
+ fz_try(ctx)
{
- obj = pdf_array_get(annots, i);
- link = pdf_load_link(doc, obj, page_ctm);
+ obj = pdf_array_get(ctx, annots, i);
+ link = pdf_load_link(ctx, doc, obj, page_ctm);
}
- fz_catch(doc->ctx)
+ fz_catch(ctx)
{
- fz_rethrow_if(doc->ctx, FZ_ERROR_TRYLATER);
+ fz_rethrow_if(ctx, FZ_ERROR_TRYLATER);
link = NULL;
}
@@ -378,14 +373,14 @@ pdf_drop_annot(fz_context *ctx, pdf_annot *annot)
next = annot->next;
if (annot->ap)
pdf_drop_xobject(ctx, annot->ap);
- pdf_drop_obj(annot->obj);
+ pdf_drop_obj(ctx, annot->obj);
fz_free(ctx, annot);
annot = next;
}
}
void
-pdf_transform_annot(pdf_annot *annot)
+pdf_transform_annot(fz_context *ctx, pdf_annot *annot)
{
fz_rect bbox = annot->ap->bbox;
fz_rect rect = annot->rect;
@@ -406,9 +401,9 @@ pdf_transform_annot(pdf_annot *annot)
fz_pre_scale(fz_translate(&annot->matrix, x, y), w, h);
}
-fz_annot_type pdf_annot_obj_type(pdf_obj *obj)
+fz_annot_type pdf_annot_obj_type(fz_context *ctx, pdf_obj *obj)
{
- char *subtype = pdf_to_name(pdf_dict_gets(obj, "Subtype"));
+ char *subtype = pdf_to_name(ctx, pdf_dict_gets(ctx, obj, "Subtype"));
if (!strcmp(subtype, "Text"))
return FZ_ANNOT_TEXT;
else if (!strcmp(subtype, "Link"))
@@ -464,12 +459,11 @@ fz_annot_type pdf_annot_obj_type(pdf_obj *obj)
}
void
-pdf_load_annots(pdf_document *doc, pdf_page *page, pdf_obj *annots)
+pdf_load_annots(fz_context *ctx, pdf_document *doc, pdf_page *page, pdf_obj *annots)
{
pdf_annot *annot, **itr;
pdf_obj *obj, *ap, *as, *n, *rect;
int i, len, keep_annot;
- fz_context *ctx = doc->ctx;
fz_var(annot);
fz_var(itr);
@@ -477,7 +471,7 @@ pdf_load_annots(pdf_document *doc, pdf_page *page, pdf_obj *annots)
itr = &page->annots;
- len = pdf_array_len(annots);
+ len = pdf_array_len(ctx, annots);
/*
Create an initial linked list of pdf_annot structures with only the obj field
filled in. We do this because update_appearance has the potential to change
@@ -488,9 +482,9 @@ pdf_load_annots(pdf_document *doc, pdf_page *page, pdf_obj *annots)
{
for (i = 0; i < len; i++)
{
- obj = pdf_array_get(annots, i);
+ obj = pdf_array_get(ctx, annots, i);
annot = fz_malloc_struct(ctx, pdf_annot);
- annot->obj = pdf_keep_obj(obj);
+ annot->obj = pdf_keep_obj(ctx, obj);
annot->page = page;
annot->next = NULL;
@@ -521,45 +515,45 @@ pdf_load_annots(pdf_document *doc, pdf_page *page, pdf_obj *annots)
n = NULL;
if (doc->update_appearance)
- doc->update_appearance(doc, annot);
+ doc->update_appearance(ctx, doc, annot);
obj = annot->obj;
- rect = pdf_dict_gets(obj, "Rect");
- ap = pdf_dict_gets(obj, "AP");
- as = pdf_dict_gets(obj, "AS");
+ rect = pdf_dict_gets(ctx, obj, "Rect");
+ ap = pdf_dict_gets(ctx, obj, "AP");
+ as = pdf_dict_gets(ctx, obj, "AS");
/* We only collect annotations with an appearance
* stream into this list, so remove any that don't
* (such as links) and continue. */
- keep_annot = pdf_is_dict(ap);
+ keep_annot = pdf_is_dict(ctx, ap);
if (!keep_annot)
break;
- if (hp->num == pdf_to_num(obj)
- && hp->gen == pdf_to_gen(obj)
+ if (hp->num == pdf_to_num(ctx, obj)
+ && hp->gen == pdf_to_gen(ctx, obj)
&& (hp->state & HOTSPOT_POINTER_DOWN))
{
- n = pdf_dict_gets(ap, "D"); /* down state */
+ n = pdf_dict_gets(ctx, ap, "D"); /* down state */
}
if (n == NULL)
- n = pdf_dict_gets(ap, "N"); /* normal state */
+ n = pdf_dict_gets(ctx, ap, "N"); /* normal state */
/* lookup current state in sub-dictionary */
- if (!pdf_is_stream(doc, pdf_to_num(n), pdf_to_gen(n)))
- n = pdf_dict_get(n, as);
+ if (!pdf_is_stream(ctx, doc, pdf_to_num(ctx, n), pdf_to_gen(ctx, n)))
+ n = pdf_dict_get(ctx, n, as);
pdf_to_rect(ctx, rect, &annot->rect);
annot->pagerect = annot->rect;
fz_transform_rect(&annot->pagerect, &page->ctm);
annot->ap = NULL;
- annot->annot_type = pdf_annot_obj_type(obj);
- annot->widget_type = annot->annot_type == FZ_ANNOT_WIDGET ? pdf_field_type(doc, obj) : PDF_WIDGET_TYPE_NOT_WIDGET;
+ annot->annot_type = pdf_annot_obj_type(ctx, obj);
+ annot->widget_type = annot->annot_type == FZ_ANNOT_WIDGET ? pdf_field_type(ctx, doc, obj) : PDF_WIDGET_TYPE_NOT_WIDGET;
- if (pdf_is_stream(doc, pdf_to_num(n), pdf_to_gen(n)))
+ if (pdf_is_stream(ctx, doc, pdf_to_num(ctx, n), pdf_to_gen(ctx, n)))
{
- annot->ap = pdf_load_xobject(doc, n);
- pdf_transform_annot(annot);
+ annot->ap = pdf_load_xobject(ctx, doc, n);
+ pdf_transform_annot(ctx, annot);
annot->ap_iteration = annot->ap->iteration;
}
@@ -593,19 +587,19 @@ pdf_load_annots(pdf_document *doc, pdf_page *page, pdf_obj *annots)
}
pdf_annot *
-pdf_first_annot(pdf_document *doc, pdf_page *page)
+pdf_first_annot(fz_context *ctx, pdf_page *page)
{
return page ? page->annots : NULL;
}
pdf_annot *
-pdf_next_annot(pdf_document *doc, pdf_annot *annot)
+pdf_next_annot(fz_context *ctx, pdf_page *page, pdf_annot *annot)
{
return annot ? annot->next : NULL;
}
fz_rect *
-pdf_bound_annot(pdf_document *doc, pdf_annot *annot, fz_rect *rect)
+pdf_bound_annot(fz_context *ctx, pdf_page *page, pdf_annot *annot, fz_rect *rect)
{
if (rect == NULL)
return NULL;
@@ -618,7 +612,7 @@ pdf_bound_annot(pdf_document *doc, pdf_annot *annot, fz_rect *rect)
}
fz_annot_type
-pdf_annot_type(pdf_annot *annot)
+pdf_annot_type(fz_context *ctx, pdf_annot *annot)
{
return annot->annot_type;
}
diff --git a/source/pdf/pdf-appearance.c b/source/pdf/pdf-appearance.c
index a8d8d6ef..ce9bdb1f 100644
--- a/source/pdf/pdf-appearance.c
+++ b/source/pdf/pdf-appearance.c
@@ -93,7 +93,7 @@ void pdf_parse_da(fz_context *ctx, char *da, pdf_da_info *di)
fz_var(name);
fz_try(ctx)
{
- for (tok = pdf_lex(str, &lbuf); tok != PDF_TOK_EOF; tok = pdf_lex(str, &lbuf))
+ for (tok = pdf_lex(ctx, str, &lbuf); tok != PDF_TOK_EOF; tok = pdf_lex(ctx, str, &lbuf))
{
switch (tok)
{
@@ -147,8 +147,8 @@ void pdf_parse_da(fz_context *ctx, char *da, pdf_da_info *di)
fz_always(ctx)
{
fz_free(ctx, name);
- fz_drop_stream(str);
- pdf_lexbuf_fin(&lbuf);
+ fz_drop_stream(ctx, str);
+ pdf_lexbuf_fin(ctx, &lbuf);
}
fz_catch(ctx)
{
@@ -156,16 +156,15 @@ void pdf_parse_da(fz_context *ctx, char *da, pdf_da_info *di)
}
}
-static void get_font_info(pdf_document *doc, pdf_obj *dr, char *da, font_info *font_rec)
+static void get_font_info(fz_context *ctx, pdf_document *doc, pdf_obj *dr, char *da, font_info *font_rec)
{
- fz_context *ctx = doc->ctx;
pdf_font_desc *font;
pdf_parse_da(ctx, da, &font_rec->da_rec);
if (font_rec->da_rec.font_name == NULL)
fz_throw(ctx, FZ_ERROR_GENERIC, "No font name in default appearance");
- font_rec->font = font = pdf_load_font(doc, dr, pdf_dict_gets(pdf_dict_gets(dr, "Font"), font_rec->da_rec.font_name), 0);
+ font_rec->font = font = pdf_load_font(ctx, doc, dr, pdf_dict_gets(ctx, pdf_dict_gets(ctx, dr, "Font"), font_rec->da_rec.font_name), 0);
font_rec->lineheight = 1.0;
if (font && font->ascent != 0.0f && font->descent != 0.0f)
font_rec->lineheight = (font->ascent - font->descent) / 1000.0;
@@ -178,24 +177,24 @@ static void font_info_fin(fz_context *ctx, font_info *font_rec)
pdf_da_info_fin(ctx, &font_rec->da_rec);
}
-static void get_text_widget_info(pdf_document *doc, pdf_obj *widget, text_widget_info *info)
+static void get_text_widget_info(fz_context *ctx, pdf_document *doc, pdf_obj *widget, text_widget_info *info)
{
- char *da = pdf_to_str_buf(pdf_get_inheritable(doc, widget, "DA"));
- int ff = pdf_get_field_flags(doc, widget);
- pdf_obj *ml = pdf_get_inheritable(doc, widget, "MaxLen");
+ char *da = pdf_to_str_buf(ctx, pdf_get_inheritable(ctx, doc, widget, "DA"));
+ int ff = pdf_get_field_flags(ctx, doc, widget);
+ pdf_obj *ml = pdf_get_inheritable(ctx, doc, widget, "MaxLen");
- info->dr = pdf_get_inheritable(doc, widget, "DR");
- info->col = pdf_dict_getp(widget, "MK/BG");
- info->q = pdf_to_int(pdf_get_inheritable(doc, widget, "Q"));
+ info->dr = pdf_get_inheritable(ctx, doc, widget, "DR");
+ info->col = pdf_dict_getp(ctx, widget, "MK/BG");
+ info->q = pdf_to_int(ctx, pdf_get_inheritable(ctx, doc, widget, "Q"));
info->multiline = (ff & Ff_Multiline) != 0;
info->comb = (ff & (Ff_Multiline|Ff_Password|Ff_FileSelect|Ff_Comb)) == Ff_Comb;
if (ml == NULL)
info->comb = 0;
else
- info->max_len = pdf_to_int(ml);
+ info->max_len = pdf_to_int(ctx, ml);
- get_font_info(doc, info->dr, da, &info->font_rec);
+ get_font_info(ctx, doc, info->dr, da, &info->font_rec);
}
void pdf_fzbuf_print_da(fz_context *ctx, fz_buffer *fzbuf, pdf_da_info *di)
@@ -223,9 +222,9 @@ void pdf_fzbuf_print_da(fz_context *ctx, fz_buffer *fzbuf, pdf_da_info *di)
}
}
-static fz_rect *measure_text(pdf_document *doc, font_info *font_rec, const fz_matrix *tm, char *text, fz_rect *bbox)
+static fz_rect *measure_text(fz_context *ctx, pdf_document *doc, font_info *font_rec, const fz_matrix *tm, char *text, fz_rect *bbox)
{
- pdf_measure_text(doc->ctx, font_rec->font, (unsigned char *)text, strlen(text), bbox);
+ pdf_measure_text(ctx, font_rec->font, (unsigned char *)text, strlen(text), bbox);
bbox->x0 *= font_rec->da_rec.font_size * tm->a;
bbox->y0 *= font_rec->da_rec.font_size * tm->d;
@@ -237,24 +236,24 @@ static fz_rect *measure_text(pdf_document *doc, font_info *font_rec, const fz_ma
static void fzbuf_print_color(fz_context *ctx, fz_buffer *fzbuf, pdf_obj *arr, int stroke, float adj)
{
- switch (pdf_array_len(arr))
+ switch (pdf_array_len(ctx, arr))
{
case 1:
fz_buffer_printf(ctx, fzbuf, stroke?"%f G\n":"%f g\n",
- pdf_to_real(pdf_array_get(arr, 0)) + adj);
+ pdf_to_real(ctx, pdf_array_get(ctx, arr, 0)) + adj);
break;
case 3:
fz_buffer_printf(ctx, fzbuf, stroke?"%f %f %f RG\n":"%f %f %f rg\n",
- pdf_to_real(pdf_array_get(arr, 0)) + adj,
- pdf_to_real(pdf_array_get(arr, 1)) + adj,
- pdf_to_real(pdf_array_get(arr, 2)) + adj);
+ pdf_to_real(ctx, pdf_array_get(ctx, arr, 0)) + adj,
+ pdf_to_real(ctx, pdf_array_get(ctx, arr, 1)) + adj,
+ pdf_to_real(ctx, pdf_array_get(ctx, arr, 2)) + adj);
break;
case 4:
fz_buffer_printf(ctx, fzbuf, stroke?"%f %f %f %f K\n":"%f %f %f %f k\n",
- pdf_to_real(pdf_array_get(arr, 0)),
- pdf_to_real(pdf_array_get(arr, 1)),
- pdf_to_real(pdf_array_get(arr, 2)),
- pdf_to_real(pdf_array_get(arr, 3)));
+ pdf_to_real(ctx, pdf_array_get(ctx, arr, 0)),
+ pdf_to_real(ctx, pdf_array_get(ctx, arr, 1)),
+ pdf_to_real(ctx, pdf_array_get(ctx, arr, 2)),
+ pdf_to_real(ctx, pdf_array_get(ctx, arr, 3)));
break;
}
}
@@ -310,25 +309,23 @@ static fz_buffer *create_text_buffer(fz_context *ctx, const fz_rect *clip, text_
return fzbuf;
}
-static fz_buffer *create_aligned_text_buffer(pdf_document *doc, const fz_rect *clip, text_widget_info *info, const fz_matrix *tm, char *text)
+static fz_buffer *create_aligned_text_buffer(fz_context *ctx, pdf_document *doc, const fz_rect *clip, text_widget_info *info, const fz_matrix *tm, char *text)
{
- fz_context *ctx = doc->ctx;
fz_matrix atm = *tm;
if (info->q != Q_Left)
{
fz_rect rect;
- measure_text(doc, &info->font_rec, tm, text, &rect);
+ measure_text(ctx, doc, &info->font_rec, tm, text, &rect);
atm.e -= info->q == Q_Right ? rect.x1 : (rect.x1 - rect.x0) / 2;
}
return create_text_buffer(ctx, clip, info, &atm, text);
}
-static void measure_ascent_descent(pdf_document *doc, font_info *finf, char *text, float *ascent, float *descent)
+static void measure_ascent_descent(fz_context *ctx, pdf_document *doc, font_info *finf, char *text, float *ascent, float *descent)
{
- fz_context *ctx = doc->ctx;
char *testtext = NULL;
fz_rect bbox;
font_info tinf = *finf;
@@ -342,7 +339,7 @@ static void measure_ascent_descent(pdf_document *doc, font_info *finf, char *tex
strcpy(testtext, "My");
strcat(testtext, text);
tinf.da_rec.font_size = 1;
- measure_text(doc, &tinf, &fz_identity, testtext, &bbox);
+ measure_text(ctx, doc, &tinf, &fz_identity, testtext, &bbox);
*descent = -bbox.y0;
*ascent = bbox.y1;
}
@@ -572,9 +569,8 @@ static void fzbuf_print_text_word(fz_context *ctx, fz_buffer *fzbuf, float x, fl
fz_buffer_printf(ctx, fzbuf, ") Tj\n");
}
-static fz_buffer *create_text_appearance(pdf_document *doc, const fz_rect *bbox, const fz_matrix *oldtm, text_widget_info *info, char *text)
+static fz_buffer *create_text_appearance(fz_context *ctx, pdf_document *doc, const fz_rect *bbox, const fz_matrix *oldtm, text_widget_info *info, char *text)
{
- fz_context *ctx = doc->ctx;
int fontsize;
int variable;
float height, width, full_width;
@@ -610,7 +606,7 @@ static fz_buffer *create_text_appearance(pdf_document *doc, const fz_rect *bbox,
info->font_rec.da_rec.font_size = fontsize;
- measure_ascent_descent(doc, &info->font_rec, text, &ascent, &descent);
+ measure_ascent_descent(ctx, doc, &info->font_rec, text, &ascent, &descent);
if (info->multiline)
{
@@ -709,7 +705,7 @@ static fz_buffer *create_text_appearance(pdf_document *doc, const fz_rect *bbox,
if (variable)
{
- measure_text(doc, &info->font_rec, &tm, text, &tbox);
+ measure_text(ctx, doc, &info->font_rec, &tm, text, &tbox);
if (tbox.x1 - tbox.x0 > width)
{
@@ -720,7 +716,7 @@ static fz_buffer *create_text_appearance(pdf_document *doc, const fz_rect *bbox,
}
}
- fzbuf = create_aligned_text_buffer(doc, &rect, info, &tm, text);
+ fzbuf = create_aligned_text_buffer(ctx, doc, &rect, info, &tm, text);
}
}
fz_always(ctx)
@@ -736,14 +732,13 @@ static fz_buffer *create_text_appearance(pdf_document *doc, const fz_rect *bbox,
return fzbuf;
}
-static int get_matrix(pdf_document *doc, pdf_xobject *form, int q, fz_matrix *mt)
+static int get_matrix(fz_context *ctx, pdf_document *doc, pdf_xobject *form, int q, fz_matrix *mt)
{
- fz_context *ctx = doc->ctx;
int found = 0;
pdf_lexbuf lbuf;
fz_stream *str;
- str = pdf_open_stream(doc, pdf_to_num(form->contents), pdf_to_gen(form->contents));
+ str = pdf_open_stream(ctx, doc, pdf_to_num(ctx, form->contents), pdf_to_gen(ctx, form->contents));
pdf_lexbuf_init(ctx, &lbuf, PDF_LEXBUF_SMALL);
@@ -754,7 +749,7 @@ static int get_matrix(pdf_document *doc, pdf_xobject *form, int q, fz_matrix *mt
int coef_i = 0;
/* Look for the text matrix Tm in the stream */
- for (tok = pdf_lex(str, &lbuf); tok != PDF_TOK_EOF; tok = pdf_lex(str, &lbuf))
+ for (tok = pdf_lex(ctx, str, &lbuf); tok != PDF_TOK_EOF; tok = pdf_lex(ctx, str, &lbuf))
{
if (tok == PDF_TOK_INT || tok == PDF_TOK_REAL)
{
@@ -789,7 +784,7 @@ static int get_matrix(pdf_document *doc, pdf_xobject *form, int q, fz_matrix *mt
if (found)
{
fz_rect bbox;
- pdf_to_rect(ctx, pdf_dict_gets(form->contents, "BBox"), &bbox);
+ pdf_to_rect(ctx, pdf_dict_gets(ctx, form->contents, "BBox"), &bbox);
switch (q)
{
@@ -809,8 +804,8 @@ static int get_matrix(pdf_document *doc, pdf_xobject *form, int q, fz_matrix *mt
}
fz_always(ctx)
{
- fz_drop_stream(str);
- pdf_lexbuf_fin(&lbuf);
+ fz_drop_stream(ctx, str);
+ pdf_lexbuf_fin(ctx, &lbuf);
}
fz_catch(ctx)
{
@@ -912,23 +907,22 @@ static void account_for_rot(fz_rect *rect, fz_matrix *mat, int rot)
}
}
-static void copy_resources(pdf_obj *dst, pdf_obj *src)
+static void copy_resources(fz_context *ctx, pdf_obj *dst, pdf_obj *src)
{
int i, len;
- len = pdf_dict_len(src);
+ len = pdf_dict_len(ctx, src);
for (i = 0; i < len; i++)
{
- pdf_obj *key = pdf_dict_get_key(src, i);
+ pdf_obj *key = pdf_dict_get_key(ctx, src, i);
- if (!pdf_dict_get(dst, key))
- pdf_dict_put(dst, key, pdf_dict_get_val(src, i));
+ if (!pdf_dict_get(ctx, dst, key))
+ pdf_dict_put(ctx, dst, key, pdf_dict_get_val(ctx, src, i));
}
}
-static pdf_xobject *load_or_create_form(pdf_document *doc, pdf_obj *obj, fz_rect *rect)
+static pdf_xobject *load_or_create_form(fz_context *ctx, pdf_document *doc, pdf_obj *obj, fz_rect *rect)
{
- fz_context *ctx = doc->ctx;
pdf_obj *ap = NULL;
fz_matrix mat;
int rot;
@@ -943,36 +937,36 @@ static pdf_xobject *load_or_create_form(pdf_document *doc, pdf_obj *obj, fz_rect
fz_var(fzbuf);
fz_try(ctx)
{
- rot = pdf_to_int(pdf_dict_getp(obj, "MK/R"));
- pdf_to_rect(ctx, pdf_dict_gets(obj, "Rect"), rect);
+ rot = pdf_to_int(ctx, pdf_dict_getp(ctx, obj, "MK/R"));
+ pdf_to_rect(ctx, pdf_dict_gets(ctx, obj, "Rect"), rect);
rect->x1 -= rect->x0;
rect->y1 -= rect->y0;
rect->x0 = rect->y0 = 0;
account_for_rot(rect, &mat, rot);
- ap = pdf_dict_gets(obj, "AP");
+ ap = pdf_dict_gets(ctx, obj, "AP");
if (ap == NULL)
{
- ap = pdf_new_dict(doc, 1);
- pdf_dict_puts_drop(obj, "AP", ap);
+ ap = pdf_new_dict(ctx, doc, 1);
+ pdf_dict_puts_drop(ctx, obj, "AP", ap);
}
- formobj = pdf_dict_gets(ap, dn);
+ formobj = pdf_dict_gets(ctx, ap, dn);
if (formobj == NULL)
{
- formobj = pdf_new_xobject(doc, rect, &mat);
- pdf_dict_puts_drop(ap, dn, formobj);
+ formobj = pdf_new_xobject(ctx, doc, rect, &mat);
+ pdf_dict_puts_drop(ctx, ap, dn, formobj);
create_form = 1;
}
- form = pdf_load_xobject(doc, formobj);
+ form = pdf_load_xobject(ctx, doc, formobj);
if (create_form)
{
fzbuf = fz_new_buffer(ctx, 1);
- pdf_update_xobject_contents(doc, form, fzbuf);
+ pdf_update_xobject_contents(ctx, doc, form, fzbuf);
}
- copy_resources(form->resources, pdf_get_inheritable(doc, obj, "DR"));
+ copy_resources(ctx, form->resources, pdf_get_inheritable(ctx, doc, obj, "DR"));
}
fz_always(ctx)
{
@@ -987,9 +981,8 @@ static pdf_xobject *load_or_create_form(pdf_document *doc, pdf_obj *obj, fz_rect
return form;
}
-static void update_marked_content(pdf_document *doc, pdf_xobject *form, fz_buffer *fzbuf)
+static void update_marked_content(fz_context *ctx, pdf_document *doc, pdf_xobject *form, fz_buffer *fzbuf)
{
- fz_context *ctx = doc->ctx;
pdf_token tok;
pdf_lexbuf lbuf;
fz_stream *str_outer = NULL;
@@ -1009,12 +1002,12 @@ static void update_marked_content(pdf_document *doc, pdf_xobject *form, fz_buffe
int first = 1;
newbuf = fz_new_buffer(ctx, 0);
- str_outer = pdf_open_stream(doc, pdf_to_num(form->contents), pdf_to_gen(form->contents));
+ str_outer = pdf_open_stream(ctx, doc, pdf_to_num(ctx, form->contents), pdf_to_gen(ctx, form->contents));
len = fz_buffer_storage(ctx, fzbuf, &buf);
str_inner = fz_open_memory(ctx, buf, len);
/* Copy the existing appearance stream to newbuf while looking for BMC */
- for (tok = pdf_lex(str_outer, &lbuf); tok != PDF_TOK_EOF; tok = pdf_lex(str_outer, &lbuf))
+ for (tok = pdf_lex(ctx, str_outer, &lbuf); tok != PDF_TOK_EOF; tok = pdf_lex(ctx, str_outer, &lbuf))
{
if (first)
first = 0;
@@ -1031,12 +1024,12 @@ static void update_marked_content(pdf_document *doc, pdf_xobject *form, fz_buffe
if (bmc_found)
{
/* Drop Tx BMC from the replacement appearance stream */
- (void)pdf_lex(str_inner, &lbuf);
- (void)pdf_lex(str_inner, &lbuf);
+ (void)pdf_lex(ctx, str_inner, &lbuf);
+ (void)pdf_lex(ctx, str_inner, &lbuf);
}
/* Copy the replacement appearance stream to newbuf */
- for (tok = pdf_lex(str_inner, &lbuf); tok != PDF_TOK_EOF; tok = pdf_lex(str_inner, &lbuf))
+ for (tok = pdf_lex(ctx, str_inner, &lbuf); tok != PDF_TOK_EOF; tok = pdf_lex(ctx, str_inner, &lbuf))
{
fz_buffer_printf(ctx, newbuf, " ");
pdf_print_token(ctx, newbuf, tok, &lbuf);
@@ -1045,14 +1038,14 @@ static void update_marked_content(pdf_document *doc, pdf_xobject *form, fz_buffe
if (bmc_found)
{
/* Drop the rest of the existing appearance stream until EMC found */
- for (tok = pdf_lex(str_outer, &lbuf); tok != PDF_TOK_EOF; tok = pdf_lex(str_outer, &lbuf))
+ for (tok = pdf_lex(ctx, str_outer, &lbuf); tok != PDF_TOK_EOF; tok = pdf_lex(ctx, str_outer, &lbuf))
{
if (tok == PDF_TOK_KEYWORD && !strcmp(lbuf.scratch, "EMC"))
break;
}
/* Copy the rest of the existing appearance stream to newbuf */
- for (tok = pdf_lex(str_outer, &lbuf); tok != PDF_TOK_EOF; tok = pdf_lex(str_outer, &lbuf))
+ for (tok = pdf_lex(ctx, str_outer, &lbuf); tok != PDF_TOK_EOF; tok = pdf_lex(ctx, str_outer, &lbuf))
{
fz_buffer_printf(ctx, newbuf, " ");
pdf_print_token(ctx, newbuf, tok, &lbuf);
@@ -1060,14 +1053,14 @@ static void update_marked_content(pdf_document *doc, pdf_xobject *form, fz_buffe
}
/* Use newbuf in place of the existing appearance stream */
- pdf_update_xobject_contents(doc, form, newbuf);
+ pdf_update_xobject_contents(ctx, doc, form, newbuf);
}
fz_always(ctx)
{
- fz_drop_stream(str_outer);
- fz_drop_stream(str_inner);
+ fz_drop_stream(ctx, str_outer);
+ fz_drop_stream(ctx, str_inner);
fz_drop_buffer(ctx, newbuf);
- pdf_lexbuf_fin(&lbuf);
+ pdf_lexbuf_fin(ctx, &lbuf);
}
fz_catch(ctx)
{
@@ -1075,9 +1068,9 @@ static void update_marked_content(pdf_document *doc, pdf_xobject *form, fz_buffe
}
}
-static int get_border_style(pdf_obj *obj)
+static int get_border_style(fz_context *ctx, pdf_obj *obj)
{
- char *sname = pdf_to_name(pdf_dict_getp(obj, "BS/S"));
+ char *sname = pdf_to_name(ctx, pdf_dict_getp(ctx, obj, "BS/S"));
if (!strcmp(sname, "D"))
return BS_Dashed;
@@ -1091,15 +1084,14 @@ static int get_border_style(pdf_obj *obj)
return BS_Solid;
}
-static float get_border_width(pdf_obj *obj)
+static float get_border_width(fz_context *ctx, pdf_obj *obj)
{
- float w = pdf_to_real(pdf_dict_getp(obj, "BS/W"));
+ float w = pdf_to_real(ctx, pdf_dict_getp(ctx, obj, "BS/W"));
return w == 0.0 ? 1.0 : w;
}
-void pdf_update_text_appearance(pdf_document *doc, pdf_obj *obj, char *eventValue)
+void pdf_update_text_appearance(fz_context *ctx, pdf_document *doc, pdf_obj *obj, char *eventValue)
{
- fz_context *ctx = doc->ctx;
text_widget_info info;
pdf_xobject *form = NULL;
fz_buffer *fzbuf = NULL;
@@ -1116,19 +1108,19 @@ void pdf_update_text_appearance(pdf_document *doc, pdf_obj *obj, char *eventValu
fz_var(text);
fz_try(ctx)
{
- get_text_widget_info(doc, obj, &info);
+ get_text_widget_info(ctx, doc, obj, &info);
if (eventValue)
text = to_font_encoding(ctx, info.font_rec.font, eventValue);
else
- text = pdf_field_value(doc, obj);
+ text = pdf_field_value(ctx, doc, obj);
- form = load_or_create_form(doc, obj, &rect);
+ form = load_or_create_form(ctx, doc, obj, &rect);
- has_tm = get_matrix(doc, form, info.q, &tm);
- fzbuf = create_text_appearance(doc, &form->bbox, has_tm ? &tm : NULL, &info,
+ has_tm = get_matrix(ctx, doc, form, info.q, &tm);
+ fzbuf = create_text_appearance(ctx, doc, &form->bbox, has_tm ? &tm : NULL, &info,
text?text:"");
- update_marked_content(doc, form, fzbuf);
+ update_marked_content(ctx, doc, form, fzbuf);
}
fz_always(ctx)
{
@@ -1143,9 +1135,8 @@ void pdf_update_text_appearance(pdf_document *doc, pdf_obj *obj, char *eventValu
}
}
-void pdf_update_combobox_appearance(pdf_document *doc, pdf_obj *obj)
+void pdf_update_combobox_appearance(fz_context *ctx, pdf_document *doc, pdf_obj *obj)
{
- fz_context *ctx = doc->ctx;
text_widget_info info;
pdf_xobject *form = NULL;
fz_buffer *fzbuf = NULL;
@@ -1162,24 +1153,24 @@ void pdf_update_combobox_appearance(pdf_document *doc, pdf_obj *obj)
fz_var(fzbuf);
fz_try(ctx)
{
- get_text_widget_info(doc, obj, &info);
+ get_text_widget_info(ctx, doc, obj, &info);
- val = pdf_get_inheritable(doc, obj, "V");
+ val = pdf_get_inheritable(ctx, doc, obj, "V");
- if (pdf_is_array(val))
- val = pdf_array_get(val, 0);
+ if (pdf_is_array(ctx, val))
+ val = pdf_array_get(ctx, val, 0);
- text = pdf_to_str_buf(val);
+ text = pdf_to_str_buf(ctx, val);
if (!text)
text = "";
- form = load_or_create_form(doc, obj, &rect);
+ form = load_or_create_form(ctx, doc, obj, &rect);
- has_tm = get_matrix(doc, form, info.q, &tm);
- fzbuf = create_text_appearance(doc, &form->bbox, has_tm ? &tm : NULL, &info,
+ has_tm = get_matrix(ctx, doc, form, info.q, &tm);
+ fzbuf = create_text_appearance(ctx, doc, &form->bbox, has_tm ? &tm : NULL, &info,
text?text:"");
- update_marked_content(doc, form, fzbuf);
+ update_marked_content(ctx, doc, form, fzbuf);
}
fz_always(ctx)
{
@@ -1193,9 +1184,8 @@ void pdf_update_combobox_appearance(pdf_document *doc, pdf_obj *obj)
}
}
-void pdf_update_pushbutton_appearance(pdf_document *doc, pdf_obj *obj)
+void pdf_update_pushbutton_appearance(fz_context *ctx, pdf_document *doc, pdf_obj *obj)
{
- fz_context *ctx = doc->ctx;
fz_rect rect;
pdf_xobject *form = NULL;
fz_buffer *fzbuf = NULL;
@@ -1212,18 +1202,18 @@ void pdf_update_pushbutton_appearance(pdf_document *doc, pdf_obj *obj)
fz_var(fzbuf);
fz_try(ctx)
{
- form = load_or_create_form(doc, obj, &rect);
+ form = load_or_create_form(ctx, doc, obj, &rect);
fzbuf = fz_new_buffer(ctx, 0);
- tobj = pdf_dict_getp(obj, "MK/BG");
- if (pdf_is_array(tobj))
+ tobj = pdf_dict_getp(ctx, obj, "MK/BG");
+ if (pdf_is_array(ctx, tobj))
{
fzbuf_print_color(ctx, fzbuf, tobj, 0, 0.0);
fz_buffer_printf(ctx, fzbuf, fmt_re,
rect.x0, rect.y0, rect.x1, rect.y1);
fz_buffer_printf(ctx, fzbuf, fmt_f);
}
- bstyle = get_border_style(obj);
- bwidth = get_border_width(obj);
+ bstyle = get_border_style(ctx, obj);
+ bwidth = get_border_width(ctx, obj);
btotal = bwidth;
if (bstyle == BS_Beveled || bstyle == BS_Inset)
{
@@ -1253,7 +1243,7 @@ void pdf_update_pushbutton_appearance(pdf_document *doc, pdf_obj *obj)
fz_buffer_printf(ctx, fzbuf, fmt_f);
}
- tobj = pdf_dict_getp(obj, "MK/BC");
+ tobj = pdf_dict_getp(ctx, obj, "MK/BC");
if (tobj)
{
fzbuf_print_color(ctx, fzbuf, tobj, 1, 0.0);
@@ -1264,27 +1254,27 @@ void pdf_update_pushbutton_appearance(pdf_document *doc, pdf_obj *obj)
fz_buffer_printf(ctx, fzbuf, fmt_s);
}
- tobj = pdf_dict_getp(obj, "MK/CA");
+ tobj = pdf_dict_getp(ctx, obj, "MK/CA");
if (tobj)
{
fz_rect clip = rect;
fz_rect bounds;
fz_matrix mat;
- char *da = pdf_to_str_buf(pdf_get_inheritable(doc, obj, "DA"));
- char *text = pdf_to_str_buf(tobj);
+ char *da = pdf_to_str_buf(ctx, pdf_get_inheritable(ctx, doc, obj, "DA"));
+ char *text = pdf_to_str_buf(ctx, tobj);
clip.x0 += btotal;
clip.y0 += btotal;
clip.x1 -= btotal;
clip.y1 -= btotal;
- get_font_info(doc, form->resources, da, &font_rec);
- measure_text(doc, &font_rec, &fz_identity, text, &bounds);
+ get_font_info(ctx, doc, form->resources, da, &font_rec);
+ measure_text(ctx, doc, &font_rec, &fz_identity, text, &bounds);
fz_translate(&mat, (rect.x1 - bounds.x1)/2, (rect.y1 - bounds.y1)/2);
fzbuf_print_text(ctx, fzbuf, &clip, NULL, &font_rec, &mat, text);
}
- pdf_update_xobject_contents(doc, form, fzbuf);
+ pdf_update_xobject_contents(ctx, doc, form, fzbuf);
}
fz_always(ctx)
{
@@ -1298,7 +1288,7 @@ void pdf_update_pushbutton_appearance(pdf_document *doc, pdf_obj *obj)
}
}
-void pdf_update_text_markup_appearance(pdf_document *doc, pdf_annot *annot, fz_annot_type type)
+void pdf_update_text_markup_appearance(fz_context *ctx, pdf_document *doc, pdf_annot *annot, fz_annot_type type)
{
float color[3];
float alpha;
@@ -1335,19 +1325,18 @@ void pdf_update_text_markup_appearance(pdf_document *doc, pdf_annot *annot, fz_a
return;
}
- pdf_set_markup_appearance(doc, annot, color, alpha, line_thickness, line_height);
+ pdf_set_markup_appearance(ctx, doc, annot, color, alpha, line_thickness, line_height);
}
static void update_rect(fz_context *ctx, pdf_annot *annot)
{
- pdf_to_rect(ctx, pdf_dict_gets(annot->obj, "Rect"), &annot->rect);
+ pdf_to_rect(ctx, pdf_dict_gets(ctx, annot->obj, "Rect"), &annot->rect);
annot->pagerect = annot->rect;
fz_transform_rect(&annot->pagerect, &annot->page->ctm);
}
-void pdf_set_annot_appearance(pdf_document *doc, pdf_annot *annot, fz_rect *rect, fz_display_list *disp_list)
+void pdf_set_annot_appearance(fz_context *ctx, pdf_document *doc, pdf_annot *annot, fz_rect *rect, fz_display_list *disp_list)
{
- fz_context *ctx = doc->ctx;
pdf_obj *obj = annot->obj;
const fz_matrix *page_ctm = &annot->page->ctm;
fz_matrix ctm;
@@ -1365,32 +1354,32 @@ void pdf_set_annot_appearance(pdf_document *doc, pdf_annot *annot, fz_rect *rect
fz_transform_rect(&trect, &ctm);
- pdf_dict_puts_drop(obj, "Rect", pdf_new_rect(doc, &trect));
+ pdf_dict_puts_drop(ctx, obj, "Rect", pdf_new_rect(ctx, doc, &trect));
/* See if there is a current normal appearance */
- ap_obj = pdf_dict_getp(obj, "AP/N");
- if (!pdf_is_stream(doc, pdf_to_num(ap_obj), pdf_to_gen(ap_obj)))
+ ap_obj = pdf_dict_getp(ctx, obj, "AP/N");
+ if (!pdf_is_stream(ctx, doc, pdf_to_num(ctx, ap_obj), pdf_to_gen(ctx, ap_obj)))
ap_obj = NULL;
if (ap_obj == NULL)
{
- ap_obj = pdf_new_xobject(doc, &trect, &mat);
- pdf_dict_putp_drop(obj, "AP/N", ap_obj);
+ ap_obj = pdf_new_xobject(ctx, doc, &trect, &mat);
+ pdf_dict_putp_drop(ctx, obj, "AP/N", ap_obj);
}
else
{
- pdf_xref_ensure_incremental_object(doc, pdf_to_num(ap_obj));
+ pdf_xref_ensure_incremental_object(ctx, doc, pdf_to_num(ctx, ap_obj));
/* Update bounding box and matrix in reused xobject obj */
- pdf_dict_puts_drop(ap_obj, "BBox", pdf_new_rect(doc, &trect));
- pdf_dict_puts_drop(ap_obj, "Matrix", pdf_new_matrix(doc, &mat));
+ pdf_dict_puts_drop(ctx, ap_obj, "BBox", pdf_new_rect(ctx, doc, &trect));
+ pdf_dict_puts_drop(ctx, ap_obj, "Matrix", pdf_new_matrix(ctx, doc, &mat));
}
- dev = pdf_new_pdf_device(doc, ap_obj, pdf_dict_gets(ap_obj, "Resources"), &mat);
- fz_run_display_list(disp_list, dev, &ctm, &fz_infinite_rect, NULL);
- fz_drop_device(dev);
+ dev = pdf_new_pdf_device(ctx, doc, ap_obj, pdf_dict_gets(ctx, ap_obj, "Resources"), &mat);
+ fz_run_display_list(ctx, disp_list, dev, &ctm, &fz_infinite_rect, NULL);
+ fz_drop_device(ctx, dev);
/* Mark the appearance as changed - required for partial update */
- xobj = pdf_load_xobject(doc, ap_obj);
+ xobj = pdf_load_xobject(ctx, doc, ap_obj);
if (xobj)
{
/* Update bounding box and matrix also in the xobject structure */
@@ -1406,23 +1395,22 @@ void pdf_set_annot_appearance(pdf_document *doc, pdf_annot *annot, fz_rect *rect
}
fz_catch(ctx)
{
- fz_drop_device(dev);
+ fz_drop_device(ctx, dev);
fz_rethrow(ctx);
}
}
static fz_point *
-quadpoints(pdf_document *doc, pdf_obj *annot, int *nout)
+quadpoints(fz_context *ctx, pdf_document *doc, pdf_obj *annot, int *nout)
{
- fz_context *ctx = doc->ctx;
- pdf_obj *quad = pdf_dict_gets(annot, "QuadPoints");
+ pdf_obj *quad = pdf_dict_gets(ctx, annot, "QuadPoints");
fz_point *qp = NULL;
int i, n;
if (!quad)
return NULL;
- n = pdf_array_len(quad);
+ n = pdf_array_len(ctx, quad);
if (n%8 != 0)
return NULL;
@@ -1434,8 +1422,8 @@ quadpoints(pdf_document *doc, pdf_obj *annot, int *nout)
for (i = 0; i < n; i += 2)
{
- qp[i/2].x = pdf_to_real(pdf_array_get(quad, i));
- qp[i/2].y = pdf_to_real(pdf_array_get(quad, i+1));
+ qp[i/2].x = pdf_to_real(ctx, pdf_array_get(ctx, quad, i));
+ qp[i/2].y = pdf_to_real(ctx, pdf_array_get(ctx, quad, i+1));
}
}
fz_catch(ctx)
@@ -1449,16 +1437,15 @@ quadpoints(pdf_document *doc, pdf_obj *annot, int *nout)
return qp;
}
-void pdf_set_markup_appearance(pdf_document *doc, pdf_annot *annot, float color[3], float alpha, float line_thickness, float line_height)
+void pdf_set_markup_appearance(fz_context *ctx, pdf_document *doc, pdf_annot *annot, float color[3], float alpha, float line_thickness, float line_height)
{
- fz_context *ctx = doc->ctx;
const fz_matrix *page_ctm = &annot->page->ctm;
fz_path *path = NULL;
fz_stroke_state *stroke = NULL;
fz_device *dev = NULL;
fz_display_list *strike_list = NULL;
int i, n;
- fz_point *qp = quadpoints(doc, annot->obj, &n);
+ fz_point *qp = quadpoints(ctx, doc, annot->obj, &n);
if (!qp || n <= 0)
return;
@@ -1501,7 +1488,7 @@ void pdf_set_markup_appearance(pdf_document *doc, pdf_annot *annot, float color[
if (stroke)
{
// assert(path)
- fz_stroke_path(dev, path, stroke, page_ctm, fz_device_rgb(ctx), color, alpha);
+ fz_stroke_path(ctx, dev, path, stroke, page_ctm, fz_device_rgb(ctx), color, alpha);
fz_drop_stroke_state(ctx, stroke);
stroke = NULL;
fz_drop_path(ctx, path);
@@ -1519,16 +1506,16 @@ void pdf_set_markup_appearance(pdf_document *doc, pdf_annot *annot, float color[
if (stroke)
{
- fz_stroke_path(dev, path, stroke, page_ctm, fz_device_rgb(ctx), color, alpha);
+ fz_stroke_path(ctx, dev, path, stroke, page_ctm, fz_device_rgb(ctx), color, alpha);
}
fz_transform_rect(&rect, page_ctm);
- pdf_set_annot_appearance(doc, annot, &rect, strike_list);
+ pdf_set_annot_appearance(ctx, doc, annot, &rect, strike_list);
}
fz_always(ctx)
{
fz_free(ctx, qp);
- fz_drop_device(dev);
+ fz_drop_device(ctx, dev);
fz_drop_stroke_state(ctx, stroke);
fz_drop_path(ctx, path);
fz_drop_display_list(ctx, strike_list);
@@ -1539,28 +1526,27 @@ void pdf_set_markup_appearance(pdf_document *doc, pdf_annot *annot, float color[
}
}
-static fz_colorspace *pdf_to_color(pdf_document *doc, pdf_obj *col, float color[4])
+static fz_colorspace *pdf_to_color(fz_context *ctx, pdf_document *doc, pdf_obj *col, float color[4])
{
fz_colorspace *cs;
- int i, ncol = pdf_array_len(col);
+ int i, ncol = pdf_array_len(ctx, col);
switch (ncol)
{
- case 1: cs = fz_device_gray(doc->ctx); break;
- case 3: cs = fz_device_rgb(doc->ctx); break;
- case 4: cs = fz_device_cmyk(doc->ctx); break;
+ case 1: cs = fz_device_gray(ctx); break;
+ case 3: cs = fz_device_rgb(ctx); break;
+ case 4: cs = fz_device_cmyk(ctx); break;
default: return NULL;
}
for (i = 0; i < ncol; i++)
- color[i] = pdf_to_real(pdf_array_get(col, i));
+ color[i] = pdf_to_real(ctx, pdf_array_get(ctx, col, i));
return cs;
}
-void pdf_update_ink_appearance(pdf_document *doc, pdf_annot *annot)
+void pdf_update_ink_appearance(fz_context *ctx, pdf_document *doc, pdf_annot *annot)
{
- fz_context *ctx = doc->ctx;
const fz_matrix *page_ctm = &annot->page->ctm;
fz_path *path = NULL;
fz_stroke_state *stroke = NULL;
@@ -1582,7 +1568,7 @@ void pdf_update_ink_appearance(pdf_document *doc, pdf_annot *annot)
int n, m, i, j;
int empty = 1;
- cs = pdf_to_color(doc, pdf_dict_gets(annot->obj, "C"), color);
+ cs = pdf_to_color(ctx, doc, pdf_dict_gets(ctx, annot->obj, "C"), color);
if (!cs)
{
cs = fz_device_rgb(ctx);
@@ -1591,13 +1577,13 @@ void pdf_update_ink_appearance(pdf_document *doc, pdf_annot *annot)
color[2] = 0.0f;
}
- width = pdf_to_real(pdf_dict_gets(pdf_dict_gets(annot->obj, "BS"), "W"));
+ width = pdf_to_real(ctx, pdf_dict_gets(ctx, pdf_dict_gets(ctx, annot->obj, "BS"), "W"));
if (width == 0.0f)
width = 1.0f;
- list = pdf_dict_gets(annot->obj, "InkList");
+ list = pdf_dict_gets(ctx, annot->obj, "InkList");
- n = pdf_array_len(list);
+ n = pdf_array_len(ctx, list);
strike_list = fz_new_display_list(ctx);
dev = fz_new_list_device(ctx, strike_list);
@@ -1610,14 +1596,14 @@ void pdf_update_ink_appearance(pdf_document *doc, pdf_annot *annot)
for (i = 0; i < n; i ++)
{
fz_point pt_last;
- pdf_obj *arc = pdf_array_get(list, i);
- m = pdf_array_len(arc);
+ pdf_obj *arc = pdf_array_get(ctx, list, i);
+ m = pdf_array_len(ctx, arc);
for (j = 0; j < m-1; j += 2)
{
fz_point pt;
- pt.x = pdf_to_real(pdf_array_get(arc, j));
- pt.y = pdf_to_real(pdf_array_get(arc, j+1));
+ pt.x = pdf_to_real(ctx, pdf_array_get(ctx, arc, j));
+ pt.y = pdf_to_real(ctx, pdf_array_get(ctx, arc, j+1));
if (i == 0 && j == 0)
{
@@ -1639,7 +1625,7 @@ void pdf_update_ink_appearance(pdf_document *doc, pdf_annot *annot)
fz_lineto(ctx, path, pt_last.x, pt_last.y);
}
- fz_stroke_path(dev, path, stroke, page_ctm, cs, color, 1.0f);
+ fz_stroke_path(ctx, dev, path, stroke, page_ctm, cs, color, 1.0f);
fz_expand_rect(&rect, width);
/*
@@ -1657,12 +1643,12 @@ void pdf_update_ink_appearance(pdf_document *doc, pdf_annot *annot)
fz_transform_rect(&rect, page_ctm);
- pdf_set_annot_appearance(doc, annot, &rect, strike_list);
+ pdf_set_annot_appearance(ctx, doc, annot, &rect, strike_list);
}
fz_always(ctx)
{
fz_drop_colorspace(ctx, cs);
- fz_drop_device(dev);
+ fz_drop_device(ctx, dev);
fz_drop_stroke_state(ctx, stroke);
fz_drop_path(ctx, path);
fz_drop_display_list(ctx, strike_list);
@@ -1847,12 +1833,12 @@ static void draw_speech_bubble(fz_context *ctx, fz_path *path)
fz_closepath(ctx, path);
}
-void pdf_update_text_annot_appearance(pdf_document *doc, pdf_annot *annot)
+void pdf_update_text_annot_appearance(fz_context *ctx, pdf_document *doc, pdf_annot *annot)
{
static float white[3] = {1.0, 1.0, 1.0};
static float yellow[3] = {1.0, 1.0, 0.0};
static float black[3] = {0.0, 0.0, 0.0};
- fz_context *ctx = doc->ctx;
+
const fz_matrix *page_ctm = &annot->page->ctm;
fz_display_list *dlist = NULL;
fz_device *dev = NULL;
@@ -1871,7 +1857,7 @@ void pdf_update_text_annot_appearance(pdf_document *doc, pdf_annot *annot)
fz_rect bounds;
fz_matrix tm;
- pdf_to_rect(ctx, pdf_dict_gets(annot->obj, "Rect"), &rect);
+ pdf_to_rect(ctx, pdf_dict_gets(ctx, annot->obj, "Rect"), &rect);
dlist = fz_new_display_list(ctx);
dev = fz_new_list_device(ctx, dlist);
stroke = fz_new_stroke_state(ctx);
@@ -1885,18 +1871,18 @@ void pdf_update_text_annot_appearance(pdf_document *doc, pdf_annot *annot)
center_rect_within_rect(&bounds, &rect, &tm);
fz_concat(&tm, &tm, page_ctm);
cs = fz_device_rgb(ctx);
- fz_fill_path(dev, path, 0, &tm, cs, yellow, 1.0f);
- fz_stroke_path(dev, path, stroke, &tm, cs, black, 1.0f);
+ fz_fill_path(ctx, dev, path, 0, &tm, cs, yellow, 1.0f);
+ fz_stroke_path(ctx, dev, path, stroke, &tm, cs, black, 1.0f);
fz_drop_path(ctx, path);
path = NULL;
path = fz_new_path(ctx);
draw_speech_bubble(ctx, path);
- fz_fill_path(dev, path, 0, &tm, cs, white, 1.0f);
- fz_stroke_path(dev, path, stroke, &tm, cs, black, 1.0f);
+ fz_fill_path(ctx, dev, path, 0, &tm, cs, white, 1.0f);
+ fz_stroke_path(ctx, dev, path, stroke, &tm, cs, black, 1.0f);
fz_transform_rect(&rect, page_ctm);
- pdf_set_annot_appearance(doc, annot, &rect, dlist);
+ pdf_set_annot_appearance(ctx, doc, annot, &rect, dlist);
/* Drop the cached xobject from the annotation structure to
* force a redraw on next pdf_update_page call */
@@ -1905,7 +1891,7 @@ void pdf_update_text_annot_appearance(pdf_document *doc, pdf_annot *annot)
}
fz_always(ctx)
{
- fz_drop_device(dev);
+ fz_drop_device(ctx, dev);
fz_drop_display_list(ctx, dlist);
fz_drop_stroke_state(ctx, stroke);
fz_drop_path(ctx, path);
@@ -1917,12 +1903,11 @@ void pdf_update_text_annot_appearance(pdf_document *doc, pdf_annot *annot)
}
}
-void pdf_update_free_text_annot_appearance(pdf_document *doc, pdf_annot *annot)
+void pdf_update_free_text_annot_appearance(fz_context *ctx, pdf_document *doc, pdf_annot *annot)
{
- fz_context *ctx = doc->ctx;
const fz_matrix *page_ctm = &annot->page->ctm;
pdf_obj *obj = annot->obj;
- pdf_obj *dr = pdf_dict_getp(annot->page->me, "Resources");
+ pdf_obj *dr = pdf_dict_getp(ctx, annot->page->me, "Resources");
fz_display_list *dlist = NULL;
fz_device *dev = NULL;
font_info font_rec;
@@ -1941,18 +1926,18 @@ void pdf_update_free_text_annot_appearance(pdf_document *doc, pdf_annot *annot)
fz_var(cs);
fz_try(ctx)
{
- char *contents = pdf_to_str_buf(pdf_dict_gets(obj, "Contents"));
- char *da = pdf_to_str_buf(pdf_dict_gets(obj, "DA"));
+ char *contents = pdf_to_str_buf(ctx, pdf_dict_gets(ctx, obj, "Contents"));
+ char *da = pdf_to_str_buf(ctx, pdf_dict_gets(ctx, obj, "DA"));
fz_rect rect = annot->rect;
fz_point pos;
- get_font_info(doc, dr, da, &font_rec);
+ get_font_info(ctx, doc, dr, da, &font_rec);
switch (font_rec.da_rec.col_size)
{
- default: cs = fz_device_gray(doc->ctx); break;
- case 3: cs = fz_device_rgb(doc->ctx); break;
- case 4: cs = fz_device_cmyk(doc->ctx); break;
+ default: cs = fz_device_gray(ctx); break;
+ case 3: cs = fz_device_rgb(ctx); break;
+ case 4: cs = fz_device_cmyk(ctx); break;
}
/* Adjust for the descender */
@@ -1963,14 +1948,14 @@ void pdf_update_free_text_annot_appearance(pdf_document *doc, pdf_annot *annot)
dlist = fz_new_display_list(ctx);
dev = fz_new_list_device(ctx, dlist);
- fz_fill_text(dev, text, page_ctm, cs, font_rec.da_rec.col, 1.0f);
+ fz_fill_text(ctx, dev, text, page_ctm, cs, font_rec.da_rec.col, 1.0f);
fz_transform_rect(&rect, page_ctm);
- pdf_set_annot_appearance(doc, annot, &rect, dlist);
+ pdf_set_annot_appearance(ctx, doc, annot, &rect, dlist);
}
fz_always(ctx)
{
- fz_drop_device(dev);
+ fz_drop_device(ctx, dev);
fz_drop_display_list(ctx, dlist);
font_info_fin(ctx, &font_rec);
fz_drop_text(ctx, text);
@@ -2042,17 +2027,16 @@ static void draw_logo(fz_context *ctx, fz_path *path)
fz_closepath(ctx, path);
};
-static void insert_signature_appearance_layers(pdf_document *doc, pdf_annot *annot)
+static void insert_signature_appearance_layers(fz_context *ctx, pdf_document *doc, pdf_annot *annot)
{
- fz_context *ctx = doc->ctx;
- pdf_obj *ap = pdf_dict_getp(annot->obj, "AP/N");
+ pdf_obj *ap = pdf_dict_getp(ctx, annot->obj, "AP/N");
pdf_obj *main_ap = NULL;
pdf_obj *frm = NULL;
pdf_obj *n0 = NULL;
fz_rect bbox;
fz_buffer *fzbuf = NULL;
- pdf_to_rect(ctx, pdf_dict_gets(ap, "BBox"), &bbox);
+ pdf_to_rect(ctx, pdf_dict_gets(ctx, ap, "BBox"), &bbox);
fz_var(main_ap);
fz_var(frm);
@@ -2060,41 +2044,41 @@ static void insert_signature_appearance_layers(pdf_document *doc, pdf_annot *ann
fz_var(fzbuf);
fz_try(ctx)
{
- main_ap = pdf_new_xobject(doc, &bbox, &fz_identity);
- frm = pdf_new_xobject(doc, &bbox, &fz_identity);
- n0 = pdf_new_xobject(doc, &bbox, &fz_identity);
+ main_ap = pdf_new_xobject(ctx, doc, &bbox, &fz_identity);
+ frm = pdf_new_xobject(ctx, doc, &bbox, &fz_identity);
+ n0 = pdf_new_xobject(ctx, doc, &bbox, &fz_identity);
- pdf_dict_putp(main_ap, "Resources/XObject/FRM", frm);
+ pdf_dict_putp(ctx, main_ap, "Resources/XObject/FRM", frm);
fzbuf = fz_new_buffer(ctx, 8);
fz_buffer_printf(ctx, fzbuf, "/FRM Do");
- pdf_update_stream(doc, pdf_to_num(main_ap), fzbuf);
- pdf_dict_puts_drop(main_ap, "Length", pdf_new_int(doc, fzbuf->len));
+ pdf_update_stream(ctx, doc, pdf_to_num(ctx, main_ap), fzbuf);
+ pdf_dict_puts_drop(ctx, main_ap, "Length", pdf_new_int(ctx, doc, fzbuf->len));
fz_drop_buffer(ctx, fzbuf);
fzbuf = NULL;
- pdf_dict_putp(frm, "Resources/XObject/n0", n0);
- pdf_dict_putp(frm, "Resources/XObject/n2", ap);
+ pdf_dict_putp(ctx, frm, "Resources/XObject/n0", n0);
+ pdf_dict_putp(ctx, frm, "Resources/XObject/n2", ap);
fzbuf = fz_new_buffer(ctx, 8);
fz_buffer_printf(ctx, fzbuf, "q 1 0 0 1 0 0 cm /n0 Do Q q 1 0 0 1 0 0 cm /n2 Do Q");
- pdf_update_stream(doc, pdf_to_num(frm), fzbuf);
- pdf_dict_puts_drop(frm, "Length", pdf_new_int(doc, fzbuf->len));
+ pdf_update_stream(ctx, doc, pdf_to_num(ctx, frm), fzbuf);
+ pdf_dict_puts_drop(ctx, frm, "Length", pdf_new_int(ctx, doc, fzbuf->len));
fz_drop_buffer(ctx, fzbuf);
fzbuf = NULL;
fzbuf = fz_new_buffer(ctx, 8);
fz_buffer_printf(ctx, fzbuf, "%% DSBlank");
- pdf_update_stream(doc, pdf_to_num(n0), fzbuf);
- pdf_dict_puts_drop(n0, "Length", pdf_new_int(doc, fzbuf->len));
+ pdf_update_stream(ctx, doc, pdf_to_num(ctx, n0), fzbuf);
+ pdf_dict_puts_drop(ctx, n0, "Length", pdf_new_int(ctx, doc, fzbuf->len));
fz_drop_buffer(ctx, fzbuf);
fzbuf = NULL;
- pdf_dict_putp(annot->obj, "AP/N", main_ap);
+ pdf_dict_putp(ctx, annot->obj, "AP/N", main_ap);
}
fz_always(ctx)
{
- pdf_drop_obj(main_ap);
- pdf_drop_obj(frm);
- pdf_drop_obj(n0);
+ pdf_drop_obj(ctx, main_ap);
+ pdf_drop_obj(ctx, frm);
+ pdf_drop_obj(ctx, n0);
}
fz_catch(ctx)
{
@@ -2106,12 +2090,11 @@ static void insert_signature_appearance_layers(pdf_document *doc, pdf_annot *ann
/* MuPDF blue */
static float logo_color[3] = {(float)0x25/(float)0xFF, (float)0x72/(float)0xFF, (float)0xAC/(float)0xFF};
-void pdf_set_signature_appearance(pdf_document *doc, pdf_annot *annot, char *name, char *dn, char *date)
+void pdf_set_signature_appearance(fz_context *ctx, pdf_document *doc, pdf_annot *annot, char *name, char *dn, char *date)
{
- fz_context *ctx = doc->ctx;
const fz_matrix *page_ctm = &annot->page->ctm;
pdf_obj *obj = annot->obj;
- pdf_obj *dr = pdf_dict_getp(pdf_trailer(doc), "Root/AcroForm/DR");
+ pdf_obj *dr = pdf_dict_getp(ctx, pdf_trailer(ctx, doc), "Root/AcroForm/DR");
fz_display_list *dlist = NULL;
fz_device *dev = NULL;
font_info font_rec;
@@ -2121,7 +2104,7 @@ void pdf_set_signature_appearance(pdf_document *doc, pdf_annot *annot, char *nam
fz_buffer *fzbuf = NULL;
if (!dr)
- pdf_dict_putp_drop(pdf_trailer(doc), "Root/AcroForm/DR", pdf_new_dict(doc, 1));
+ pdf_dict_putp_drop(ctx, pdf_trailer(ctx, doc), "Root/AcroForm/DR", pdf_new_dict(ctx, doc, 1));
memset(&font_rec, 0, sizeof(font_rec));
@@ -2133,7 +2116,7 @@ void pdf_set_signature_appearance(pdf_document *doc, pdf_annot *annot, char *nam
fz_var(fzbuf);
fz_try(ctx)
{
- char *da = pdf_to_str_buf(pdf_dict_gets(obj, "DA"));
+ char *da = pdf_to_str_buf(ctx, pdf_dict_gets(ctx, obj, "DA"));
fz_rect rect = annot->rect;
fz_rect logo_bounds;
fz_matrix logo_tm;
@@ -2148,11 +2131,11 @@ void pdf_set_signature_appearance(pdf_document *doc, pdf_annot *annot, char *nam
center_rect_within_rect(&logo_bounds, &rect, &logo_tm);
fz_concat(&logo_tm, &logo_tm, page_ctm);
cs = fz_device_rgb(ctx);
- fz_fill_path(dev, path, 0, &logo_tm, cs, logo_color, 1.0f);
+ fz_fill_path(ctx, dev, path, 0, &logo_tm, cs, logo_color, 1.0f);
fz_drop_colorspace(ctx, cs);
cs = NULL;
- get_font_info(doc, dr, da, &font_rec);
+ get_font_info(ctx, doc, dr, da, &font_rec);
switch (font_rec.da_rec.col_size)
{
@@ -2164,7 +2147,7 @@ void pdf_set_signature_appearance(pdf_document *doc, pdf_annot *annot, char *nam
/* Display the name in the left-hand half of the form field */
rect.x1 = (rect.x0 + rect.x1)/2.0f;
text = fit_text(ctx, &font_rec, name, &rect);
- fz_fill_text(dev, text, page_ctm, cs, font_rec.da_rec.col, 1.0f);
+ fz_fill_text(ctx, dev, text, page_ctm, cs, font_rec.da_rec.col, 1.0f);
fz_drop_text(ctx, text);
text = NULL;
@@ -2178,22 +2161,22 @@ void pdf_set_signature_appearance(pdf_document *doc, pdf_annot *annot, char *nam
rect = annot->rect;
rect.x0 = (rect.x0 + rect.x1)/2.0f;
text = fit_text(ctx, &font_rec, (char *)bufstr, &rect);
- fz_fill_text(dev, text, page_ctm, cs, font_rec.da_rec.col, 1.0f);
+ fz_fill_text(ctx, dev, text, page_ctm, cs, font_rec.da_rec.col, 1.0f);
rect = annot->rect;
fz_transform_rect(&rect, page_ctm);
- pdf_set_annot_appearance(doc, annot, &rect, dlist);
+ pdf_set_annot_appearance(ctx, doc, annot, &rect, dlist);
/* Drop the cached xobject from the annotation structure to
* force a redraw on next pdf_update_page call */
pdf_drop_xobject(ctx, annot->ap);
annot->ap = NULL;
- insert_signature_appearance_layers(doc, annot);
+ insert_signature_appearance_layers(ctx, doc, annot);
}
fz_always(ctx)
{
- fz_drop_device(dev);
+ fz_drop_device(ctx, dev);
fz_drop_display_list(ctx, dlist);
font_info_fin(ctx, &font_rec);
fz_drop_path(ctx, path);
@@ -2207,29 +2190,27 @@ void pdf_set_signature_appearance(pdf_document *doc, pdf_annot *annot, char *nam
}
}
-void pdf_update_appearance(pdf_document *doc, pdf_annot *annot)
+void pdf_update_appearance(fz_context *ctx, pdf_document *doc, pdf_annot *annot)
{
pdf_obj *obj = annot->obj;
- if (!pdf_dict_gets(obj, "AP") || pdf_obj_is_dirty(obj))
+ if (!pdf_dict_gets(ctx, obj, "AP") || pdf_obj_is_dirty(ctx, obj))
{
- fz_annot_type type = pdf_annot_obj_type(obj);
+ fz_annot_type type = pdf_annot_obj_type(ctx, obj);
switch (type)
{
case FZ_ANNOT_WIDGET:
- switch (pdf_field_type(doc, obj))
+ switch (pdf_field_type(ctx, doc, obj))
{
case PDF_WIDGET_TYPE_TEXT:
{
#if 0
- pdf_obj *formatting = pdf_dict_getp(obj, "AA/F");
+ pdf_obj *formatting = pdf_dict_getp(ctx, obj, "AA/F");
if (formatting && doc->js)
{
/* Apply formatting */
pdf_js_event e;
- fz_context *ctx = doc->ctx;
-
e.target = obj;
- e.value = pdf_field_value(doc, obj);
+ e.value = pdf_field_value(ctx, doc, obj);
fz_try(ctx)
{
pdf_js_setup_event(doc->js, &e);
@@ -2242,47 +2223,47 @@ void pdf_update_appearance(pdf_document *doc, pdf_annot *annot)
{
fz_rethrow(ctx);
}
- execute_action(doc, obj, formatting);
+ execute_action(ctx, doc, obj, formatting);
/* Update appearance from JS event.value */
- pdf_update_text_appearance(doc, obj, pdf_js_get_event(doc->js)->value);
+ pdf_update_text_appearance(ctx, doc, obj, pdf_js_get_event(doc->js)->value);
}
else
#endif
{
/* Update appearance from field value */
- pdf_update_text_appearance(doc, obj, NULL);
+ pdf_update_text_appearance(ctx, doc, obj, NULL);
}
}
break;
case PDF_WIDGET_TYPE_PUSHBUTTON:
- pdf_update_pushbutton_appearance(doc, obj);
+ pdf_update_pushbutton_appearance(ctx, doc, obj);
break;
case PDF_WIDGET_TYPE_LISTBOX:
case PDF_WIDGET_TYPE_COMBOBOX:
/* Treating listbox and combobox identically for now,
* and the behaviour is most appropriate for a combobox */
- pdf_update_combobox_appearance(doc, obj);
+ pdf_update_combobox_appearance(ctx, doc, obj);
break;
}
break;
case FZ_ANNOT_TEXT:
- pdf_update_text_annot_appearance(doc, annot);
+ pdf_update_text_annot_appearance(ctx, doc, annot);
break;
case FZ_ANNOT_FREETEXT:
- pdf_update_free_text_annot_appearance(doc, annot);
+ pdf_update_free_text_annot_appearance(ctx, doc, annot);
break;
case FZ_ANNOT_STRIKEOUT:
case FZ_ANNOT_UNDERLINE:
case FZ_ANNOT_HIGHLIGHT:
- pdf_update_text_markup_appearance(doc, annot, type);
+ pdf_update_text_markup_appearance(ctx, doc, annot, type);
break;
case FZ_ANNOT_INK:
- pdf_update_ink_appearance(doc, annot);
+ pdf_update_ink_appearance(ctx, doc, annot);
break;
default:
break;
}
- pdf_clean_obj(obj);
+ pdf_clean_obj(ctx, obj);
}
}
diff --git a/source/pdf/pdf-clean.c b/source/pdf/pdf-clean.c
index 51a8b6de..89926832 100644
--- a/source/pdf/pdf-clean.c
+++ b/source/pdf/pdf-clean.c
@@ -1,9 +1,8 @@
#include "pdf-interpret-imp.h"
static void
-pdf_clean_stream_object(pdf_document *doc, pdf_obj *obj, pdf_obj *orig_res, fz_cookie *cookie, int own_res)
+pdf_clean_stream_object(fz_context *ctx, pdf_document *doc, pdf_obj *obj, pdf_obj *orig_res, fz_cookie *cookie, int own_res)
{
- fz_context *ctx = doc->ctx;
pdf_process process, process2;
fz_buffer *buffer;
int num;
@@ -22,33 +21,33 @@ pdf_clean_stream_object(pdf_document *doc, pdf_obj *obj, pdf_obj *orig_res, fz_c
{
if (own_res)
{
- pdf_obj *r = pdf_dict_gets(obj, "Resources");
+ pdf_obj *r = pdf_dict_gets(ctx, obj, "Resources");
if (r)
orig_res = r;
}
- res = pdf_new_dict(doc, 1);
+ res = pdf_new_dict(ctx, doc, 1);
- pdf_process_buffer(&process2, ctx, buffer);
- pdf_process_filter(&process, ctx, &process2, res);
+ pdf_init_process_buffer(ctx, &process2, buffer);
+ pdf_init_process_filter(ctx, &process, &process2, res);
- pdf_process_stream_object(doc, obj, &process, orig_res, cookie);
+ pdf_process_stream_object(ctx, doc, obj, &process, orig_res, cookie);
- num = pdf_to_num(obj);
- pdf_dict_dels(obj, "Filter");
- pdf_update_stream(doc, num, buffer);
+ num = pdf_to_num(ctx, obj);
+ pdf_dict_dels(ctx, obj, "Filter");
+ pdf_update_stream(ctx, doc, num, buffer);
if (own_res)
{
- ref = pdf_new_ref(doc, res);
- pdf_dict_puts(obj, "Resources", ref);
+ ref = pdf_new_ref(ctx, doc, res);
+ pdf_dict_puts(ctx, obj, "Resources", ref);
}
}
fz_always(ctx)
{
fz_drop_buffer(ctx, buffer);
- pdf_drop_obj(res);
- pdf_drop_obj(ref);
+ pdf_drop_obj(ctx, res);
+ pdf_drop_obj(ctx, ref);
}
fz_catch(ctx)
{
@@ -57,9 +56,8 @@ pdf_clean_stream_object(pdf_document *doc, pdf_obj *obj, pdf_obj *orig_res, fz_c
}
static void
-pdf_clean_type3(pdf_document *doc, pdf_obj *obj, pdf_obj *orig_res, fz_cookie *cookie)
+pdf_clean_type3(fz_context *ctx, pdf_document *doc, pdf_obj *obj, pdf_obj *orig_res, fz_cookie *cookie)
{
- fz_context *ctx = doc->ctx;
pdf_process process, process2;
fz_buffer *buffer;
int num, i, l;
@@ -72,46 +70,46 @@ pdf_clean_type3(pdf_document *doc, pdf_obj *obj, pdf_obj *orig_res, fz_cookie *c
fz_try(ctx)
{
- res = pdf_dict_gets(obj, "Resources");
+ res = pdf_dict_gets(ctx, obj, "Resources");
if (res)
orig_res = res;
res = NULL;
- res = pdf_new_dict(doc, 1);
+ res = pdf_new_dict(ctx, doc, 1);
- charprocs = pdf_dict_gets(obj, "CharProcs");
- l = pdf_dict_len(charprocs);
+ charprocs = pdf_dict_gets(ctx, obj, "CharProcs");
+ l = pdf_dict_len(ctx, charprocs);
for (i = 0; i < l; i++)
{
- pdf_obj *key = pdf_dict_get_key(charprocs, i);
- pdf_obj *val = pdf_dict_get_val(charprocs, i);
+ pdf_obj *key = pdf_dict_get_key(ctx, charprocs, i);
+ pdf_obj *val = pdf_dict_get_val(ctx, charprocs, i);
buffer = fz_new_buffer(ctx, 1024);
- pdf_process_buffer(&process2, ctx, buffer);
- pdf_process_filter(&process, ctx, &process2, res);
+ pdf_init_process_buffer(ctx, &process2, buffer);
+ pdf_init_process_filter(ctx, &process, &process2, res);
- pdf_process_stream_object(doc, val, &process, orig_res, cookie);
+ pdf_process_stream_object(ctx, doc, val, &process, orig_res, cookie);
- num = pdf_to_num(val);
- pdf_dict_dels(val, "Filter");
- pdf_update_stream(doc, num, buffer);
- pdf_dict_put(charprocs, key, val);
+ num = pdf_to_num(ctx, val);
+ pdf_dict_dels(ctx, val, "Filter");
+ pdf_update_stream(ctx, doc, num, buffer);
+ pdf_dict_put(ctx, charprocs, key, val);
fz_drop_buffer(ctx, buffer);
buffer = NULL;
}
/* ProcSet - no cleaning possible. Inherit this from the old dict. */
- pdf_dict_puts(res, "ProcSet", pdf_dict_gets(orig_res, "ProcSet"));
+ pdf_dict_puts(ctx, res, "ProcSet", pdf_dict_gets(ctx, orig_res, "ProcSet"));
- ref = pdf_new_ref(doc, res);
- pdf_dict_puts(obj, "Resources", ref);
+ ref = pdf_new_ref(ctx, doc, res);
+ pdf_dict_puts(ctx, obj, "Resources", ref);
}
fz_always(ctx)
{
fz_drop_buffer(ctx, buffer);
- pdf_drop_obj(res);
- pdf_drop_obj(ref);
+ pdf_drop_obj(ctx, res);
+ pdf_drop_obj(ctx, ref);
}
fz_catch(ctx)
{
@@ -119,9 +117,8 @@ pdf_clean_type3(pdf_document *doc, pdf_obj *obj, pdf_obj *orig_res, fz_cookie *c
}
}
-void pdf_clean_page_contents(pdf_document *doc, pdf_page *page, fz_cookie *cookie)
+void pdf_clean_page_contents(fz_context *ctx, pdf_document *doc, pdf_page *page, fz_cookie *cookie)
{
- fz_context *ctx = doc->ctx;
pdf_process process, process2;
fz_buffer *buffer = fz_new_buffer(ctx, 1024);
int num;
@@ -139,37 +136,37 @@ void pdf_clean_page_contents(pdf_document *doc, pdf_page *page, fz_cookie *cooki
fz_try(ctx)
{
- res = pdf_new_dict(doc, 1);
+ res = pdf_new_dict(ctx, doc, 1);
- pdf_process_buffer(&process2, ctx, buffer);
- pdf_process_filter(&process, ctx, &process2, res);
+ pdf_init_process_buffer(ctx, &process2, buffer);
+ pdf_init_process_filter(ctx, &process, &process2, res);
- pdf_process_stream_object(doc, page->contents, &process, page->resources, cookie);
+ pdf_process_stream_object(ctx, doc, page->contents, &process, page->resources, cookie);
contents = page->contents;
- if (pdf_is_array(contents))
+ if (pdf_is_array(ctx, contents))
{
- int n = pdf_array_len(contents);
+ int n = pdf_array_len(ctx, contents);
int i;
for (i = n-1; i > 0; i--)
- pdf_array_delete(contents, i);
+ pdf_array_delete(ctx, contents, i);
/* We cannot rewrite the 0th entry of contents
* directly as it may occur in other pages content
* dictionaries too. We therefore clone it and make
* a new object reference. */
- new_obj = pdf_copy_dict(pdf_array_get(contents, 0));
- new_ref = pdf_new_ref(doc, new_obj);
- num = pdf_to_num(new_ref);
- pdf_array_put(contents, 0, new_ref);
- pdf_dict_dels(new_obj, "Filter");
+ new_obj = pdf_copy_dict(ctx, pdf_array_get(ctx, contents, 0));
+ new_ref = pdf_new_ref(ctx, doc, new_obj);
+ num = pdf_to_num(ctx, new_ref);
+ pdf_array_put(ctx, contents, 0, new_ref);
+ pdf_dict_dels(ctx, new_obj, "Filter");
}
else
{
- num = pdf_to_num(contents);
- pdf_dict_dels(contents, "Filter");
+ num = pdf_to_num(ctx, contents);
+ pdf_dict_dels(ctx, contents, "Filter");
}
- pdf_update_stream(doc, num, buffer);
+ pdf_update_stream(ctx, doc, num, buffer);
/* Now deal with resources. The spec allows for Type3 fonts and form
* XObjects to omit a resource dictionary and look in the parent.
@@ -177,104 +174,104 @@ void pdf_clean_page_contents(pdf_document *doc, pdf_page *page, fz_cookie *cooki
* conceivably cause changes in rendering, but we don't care. */
/* ExtGState */
- obj = pdf_dict_gets(res, "ExtGState");
+ obj = pdf_dict_gets(ctx, res, "ExtGState");
if (obj)
{
int i, l;
- l = pdf_dict_len(obj);
+ l = pdf_dict_len(ctx, obj);
for (i = 0; i < l; i++)
{
- pdf_obj *o = pdf_dict_gets(pdf_dict_get_val(obj, i), "SMask");
+ pdf_obj *o = pdf_dict_gets(ctx, pdf_dict_get_val(ctx, obj, i), "SMask");
if (!o)
continue;
- o = pdf_dict_gets(o, "G");
+ o = pdf_dict_gets(ctx, o, "G");
if (!o)
continue;
/* Transparency group XObject */
- pdf_clean_stream_object(doc, o, page->resources, cookie, 1);
+ pdf_clean_stream_object(ctx, doc, o, page->resources, cookie, 1);
}
}
/* ColorSpace - no cleaning possible */
/* Pattern */
- obj = pdf_dict_gets(res, "Pattern");
+ obj = pdf_dict_gets(ctx, res, "Pattern");
if (obj)
{
int i, l;
- l = pdf_dict_len(obj);
+ l = pdf_dict_len(ctx, obj);
for (i = 0; i < l; i++)
{
- pdf_obj *pat = pdf_dict_get_val(obj, i);
+ pdf_obj *pat = pdf_dict_get_val(ctx, obj, i);
if (!pat)
continue;
- if (pdf_to_int(pdf_dict_gets(pat, "PatternType")) == 1)
- pdf_clean_stream_object(doc, pat, page->resources, cookie, 0);
+ if (pdf_to_int(ctx, pdf_dict_gets(ctx, pat, "PatternType")) == 1)
+ pdf_clean_stream_object(ctx, doc, pat, page->resources, cookie, 0);
}
}
/* Shading - no cleaning possible */
/* XObject */
- obj = pdf_dict_gets(res, "XObject");
+ obj = pdf_dict_gets(ctx, res, "XObject");
if (obj)
{
int i, l;
- l = pdf_dict_len(obj);
+ l = pdf_dict_len(ctx, obj);
for (i = 0; i < l; i++)
{
- pdf_obj *xobj = pdf_dict_get_val(obj, i);
+ pdf_obj *xobj = pdf_dict_get_val(ctx, obj, i);
- if (strcmp(pdf_to_name(pdf_dict_gets(xobj, "Subtype")), "Form"))
+ if (strcmp(pdf_to_name(ctx, pdf_dict_gets(ctx, xobj, "Subtype")), "Form"))
continue;
- pdf_clean_stream_object(doc, xobj, page->resources, cookie, 1);
+ pdf_clean_stream_object(ctx, doc, xobj, page->resources, cookie, 1);
}
}
/* Font */
- obj = pdf_dict_gets(res, "Font");
+ obj = pdf_dict_gets(ctx, res, "Font");
if (obj)
{
int i, l;
- l = pdf_dict_len(obj);
+ l = pdf_dict_len(ctx, obj);
for (i = 0; i < l; i++)
{
- pdf_obj *o = pdf_dict_get_val(obj, i);
+ pdf_obj *o = pdf_dict_get_val(ctx, obj, i);
- if (!strcmp(pdf_to_name(pdf_dict_gets(o, "Subtype")), "Type3"))
+ if (!strcmp(pdf_to_name(ctx, pdf_dict_gets(ctx, o, "Subtype")), "Type3"))
{
- pdf_clean_type3(doc, o, page->resources, cookie);
+ pdf_clean_type3(ctx, doc, o, page->resources, cookie);
}
}
}
/* ProcSet - no cleaning possible. Inherit this from the old dict. */
- obj = pdf_dict_gets(page->resources, "ProcSet");
+ obj = pdf_dict_gets(ctx, page->resources, "ProcSet");
if (obj)
- pdf_dict_puts(res, "ProcSet", obj);
+ pdf_dict_puts(ctx, res, "ProcSet", obj);
/* Properties - no cleaning possible. */
- pdf_drop_obj(page->resources);
- ref = pdf_new_ref(doc, res);
- page->resources = pdf_keep_obj(ref);
- pdf_dict_puts(page->me, "Resources", ref);
+ pdf_drop_obj(ctx, page->resources);
+ ref = pdf_new_ref(ctx, doc, res);
+ page->resources = pdf_keep_obj(ctx, ref);
+ pdf_dict_puts(ctx, page->me, "Resources", ref);
}
fz_always(ctx)
{
fz_drop_buffer(ctx, buffer);
- pdf_drop_obj(new_obj);
- pdf_drop_obj(new_ref);
- pdf_drop_obj(res);
- pdf_drop_obj(ref);
+ pdf_drop_obj(ctx, new_obj);
+ pdf_drop_obj(ctx, new_ref);
+ pdf_drop_obj(ctx, res);
+ pdf_drop_obj(ctx, ref);
}
fz_catch(ctx)
{
diff --git a/source/pdf/pdf-cmap-load.c b/source/pdf/pdf-cmap-load.c
index e3bf943d..46338539 100644
--- a/source/pdf/pdf-cmap-load.c
+++ b/source/pdf/pdf-cmap-load.c
@@ -18,14 +18,13 @@ pdf_cmap_size(fz_context *ctx, pdf_cmap *cmap)
* Load CMap stream in PDF file
*/
pdf_cmap *
-pdf_load_embedded_cmap(pdf_document *doc, pdf_obj *stmobj)
+pdf_load_embedded_cmap(fz_context *ctx, pdf_document *doc, pdf_obj *stmobj)
{
fz_stream *file = NULL;
pdf_cmap *cmap = NULL;
pdf_cmap *usecmap;
pdf_obj *wmode;
pdf_obj *obj = NULL;
- fz_context *ctx = doc->ctx;
int phase = 0;
fz_var(phase);
@@ -33,7 +32,7 @@ pdf_load_embedded_cmap(pdf_document *doc, pdf_obj *stmobj)
fz_var(file);
fz_var(cmap);
- if (pdf_obj_marked(stmobj))
+ if (pdf_obj_marked(ctx, stmobj))
fz_throw(ctx, FZ_ERROR_GENERIC, "Recursion in embedded cmap");
if ((cmap = pdf_find_item(ctx, pdf_drop_cmap_imp, stmobj)) != NULL)
@@ -43,29 +42,29 @@ pdf_load_embedded_cmap(pdf_document *doc, pdf_obj *stmobj)
fz_try(ctx)
{
- file = pdf_open_stream(doc, pdf_to_num(stmobj), pdf_to_gen(stmobj));
+ file = pdf_open_stream(ctx, doc, pdf_to_num(ctx, stmobj), pdf_to_gen(ctx, stmobj));
phase = 1;
cmap = pdf_load_cmap(ctx, file);
phase = 2;
- fz_drop_stream(file);
+ fz_drop_stream(ctx, file);
file = NULL;
- wmode = pdf_dict_gets(stmobj, "WMode");
- if (pdf_is_int(wmode))
- pdf_set_cmap_wmode(ctx, cmap, pdf_to_int(wmode));
- obj = pdf_dict_gets(stmobj, "UseCMap");
- if (pdf_is_name(obj))
+ wmode = pdf_dict_gets(ctx, stmobj, "WMode");
+ if (pdf_is_int(ctx, wmode))
+ pdf_set_cmap_wmode(ctx, cmap, pdf_to_int(ctx, wmode));
+ obj = pdf_dict_gets(ctx, stmobj, "UseCMap");
+ if (pdf_is_name(ctx, obj))
{
- usecmap = pdf_load_system_cmap(ctx, pdf_to_name(obj));
+ usecmap = pdf_load_system_cmap(ctx, pdf_to_name(ctx, obj));
pdf_set_usecmap(ctx, cmap, usecmap);
pdf_drop_cmap(ctx, usecmap);
}
- else if (pdf_is_indirect(obj))
+ else if (pdf_is_indirect(ctx, obj))
{
phase = 3;
- pdf_mark_obj(obj);
- usecmap = pdf_load_embedded_cmap(doc, obj);
- pdf_unmark_obj(obj);
+ pdf_mark_obj(ctx, obj);
+ usecmap = pdf_load_embedded_cmap(ctx, doc, obj);
+ pdf_unmark_obj(ctx, obj);
phase = 4;
pdf_set_usecmap(ctx, cmap, usecmap);
pdf_drop_cmap(ctx, usecmap);
@@ -76,20 +75,20 @@ pdf_load_embedded_cmap(pdf_document *doc, pdf_obj *stmobj)
fz_catch(ctx)
{
if (file)
- fz_drop_stream(file);
+ fz_drop_stream(ctx, file);
if (cmap)
pdf_drop_cmap(ctx, cmap);
if (phase < 1)
- fz_rethrow_message(ctx, "cannot open cmap stream (%d %d R)", pdf_to_num(stmobj), pdf_to_gen(stmobj));
+ fz_rethrow_message(ctx, "cannot open cmap stream (%d %d R)", pdf_to_num(ctx, stmobj), pdf_to_gen(ctx, stmobj));
else if (phase < 2)
- fz_rethrow_message(ctx, "cannot parse cmap stream (%d %d R)", pdf_to_num(stmobj), pdf_to_gen(stmobj));
+ fz_rethrow_message(ctx, "cannot parse cmap stream (%d %d R)", pdf_to_num(ctx, stmobj), pdf_to_gen(ctx, stmobj));
else if (phase < 3)
- fz_rethrow_message(ctx, "cannot load system usecmap '%s'", pdf_to_name(obj));
+ fz_rethrow_message(ctx, "cannot load system usecmap '%s'", pdf_to_name(ctx, obj));
else
{
if (phase == 3)
- pdf_unmark_obj(obj);
- fz_rethrow_message(ctx, "cannot load embedded usecmap (%d %d R)", pdf_to_num(obj), pdf_to_gen(obj));
+ pdf_unmark_obj(ctx, obj);
+ fz_rethrow_message(ctx, "cannot load embedded usecmap (%d %d R)", pdf_to_num(ctx, obj), pdf_to_gen(ctx, obj));
}
}
diff --git a/source/pdf/pdf-cmap-parse.c b/source/pdf/pdf-cmap-parse.c
index 361c512f..c502ffe5 100644
--- a/source/pdf/pdf-cmap-parse.c
+++ b/source/pdf/pdf-cmap-parse.c
@@ -18,7 +18,7 @@ pdf_parse_cmap_name(fz_context *ctx, pdf_cmap *cmap, fz_stream *file, pdf_lexbuf
{
pdf_token tok;
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
if (tok == PDF_TOK_NAME)
fz_strlcpy(cmap->cmap_name, buf->scratch, sizeof(cmap->cmap_name));
@@ -31,7 +31,7 @@ pdf_parse_wmode(fz_context *ctx, pdf_cmap *cmap, fz_stream *file, pdf_lexbuf *bu
{
pdf_token tok;
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
if (tok == PDF_TOK_INT)
pdf_set_cmap_wmode(ctx, cmap, buf->i);
@@ -47,7 +47,7 @@ pdf_parse_codespace_range(fz_context *ctx, pdf_cmap *cmap, fz_stream *file, pdf_
while (1)
{
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
if (tok == PDF_TOK_KEYWORD && !strcmp(buf->scratch, "endcodespacerange"))
return;
@@ -55,7 +55,7 @@ pdf_parse_codespace_range(fz_context *ctx, pdf_cmap *cmap, fz_stream *file, pdf_
else if (tok == PDF_TOK_STRING)
{
lo = pdf_code_from_string(buf->scratch, buf->len);
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
if (tok == PDF_TOK_STRING)
{
hi = pdf_code_from_string(buf->scratch, buf->len);
@@ -78,7 +78,7 @@ pdf_parse_cid_range(fz_context *ctx, pdf_cmap *cmap, fz_stream *file, pdf_lexbuf
while (1)
{
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
if (tok == PDF_TOK_KEYWORD && !strcmp(buf->scratch, "endcidrange"))
return;
@@ -88,13 +88,13 @@ pdf_parse_cid_range(fz_context *ctx, pdf_cmap *cmap, fz_stream *file, pdf_lexbuf
lo = pdf_code_from_string(buf->scratch, buf->len);
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
if (tok != PDF_TOK_STRING)
fz_throw(ctx, FZ_ERROR_GENERIC, "expected string");
hi = pdf_code_from_string(buf->scratch, buf->len);
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
if (tok != PDF_TOK_INT)
fz_throw(ctx, FZ_ERROR_GENERIC, "expected integer");
@@ -112,7 +112,7 @@ pdf_parse_cid_char(fz_context *ctx, pdf_cmap *cmap, fz_stream *file, pdf_lexbuf
while (1)
{
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
if (tok == PDF_TOK_KEYWORD && !strcmp(buf->scratch, "endcidchar"))
return;
@@ -122,7 +122,7 @@ pdf_parse_cid_char(fz_context *ctx, pdf_cmap *cmap, fz_stream *file, pdf_lexbuf
src = pdf_code_from_string(buf->scratch, buf->len);
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
if (tok != PDF_TOK_INT)
fz_throw(ctx, FZ_ERROR_GENERIC, "expected integer");
@@ -141,7 +141,7 @@ pdf_parse_bf_range_array(fz_context *ctx, pdf_cmap *cmap, fz_stream *file, pdf_l
while (1)
{
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
if (tok == PDF_TOK_CLOSE_ARRAY)
return;
@@ -171,7 +171,7 @@ pdf_parse_bf_range(fz_context *ctx, pdf_cmap *cmap, fz_stream *file, pdf_lexbuf
while (1)
{
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
if (tok == PDF_TOK_KEYWORD && !strcmp(buf->scratch, "endbfrange"))
return;
@@ -181,7 +181,7 @@ pdf_parse_bf_range(fz_context *ctx, pdf_cmap *cmap, fz_stream *file, pdf_lexbuf
lo = pdf_code_from_string(buf->scratch, buf->len);
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
if (tok != PDF_TOK_STRING)
fz_throw(ctx, FZ_ERROR_GENERIC, "expected string");
@@ -192,7 +192,7 @@ pdf_parse_bf_range(fz_context *ctx, pdf_cmap *cmap, fz_stream *file, pdf_lexbuf
return;
}
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
if (tok == PDF_TOK_STRING)
{
@@ -244,7 +244,7 @@ pdf_parse_bf_char(fz_context *ctx, pdf_cmap *cmap, fz_stream *file, pdf_lexbuf *
while (1)
{
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
if (tok == PDF_TOK_KEYWORD && !strcmp(buf->scratch, "endbfchar"))
return;
@@ -254,7 +254,7 @@ pdf_parse_bf_char(fz_context *ctx, pdf_cmap *cmap, fz_stream *file, pdf_lexbuf *
src = pdf_code_from_string(buf->scratch, buf->len);
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
/* Note: does not handle /dstName */
if (tok != PDF_TOK_STRING)
fz_throw(ctx, FZ_ERROR_GENERIC, "expected string");
@@ -286,7 +286,7 @@ pdf_load_cmap(fz_context *ctx, fz_stream *file)
{
while (1)
{
- tok = pdf_lex(file, &buf);
+ tok = pdf_lex(ctx, file, &buf);
if (tok == PDF_TOK_EOF)
break;
@@ -332,7 +332,7 @@ pdf_load_cmap(fz_context *ctx, fz_stream *file)
}
fz_always(ctx)
{
- pdf_lexbuf_fin(&buf);
+ pdf_lexbuf_fin(ctx, &buf);
}
fz_catch(ctx)
{
diff --git a/source/pdf/pdf-colorspace.c b/source/pdf/pdf-colorspace.c
index 50a6f9d1..a58dc961 100644
--- a/source/pdf/pdf-colorspace.c
+++ b/source/pdf/pdf-colorspace.c
@@ -3,14 +3,13 @@
/* ICCBased */
static fz_colorspace *
-load_icc_based(pdf_document *doc, pdf_obj *dict)
+load_icc_based(fz_context *ctx, pdf_document *doc, pdf_obj *dict)
{
int n;
pdf_obj *obj;
- fz_context *ctx = doc->ctx;
- n = pdf_to_int(pdf_dict_gets(dict, "N"));
- obj = pdf_dict_gets(dict, "Alternate");
+ n = pdf_to_int(ctx, pdf_dict_gets(ctx, dict, "N"));
+ obj = pdf_dict_gets(ctx, dict, "Alternate");
if (obj)
{
@@ -18,7 +17,7 @@ load_icc_based(pdf_document *doc, pdf_obj *dict)
fz_try(ctx)
{
- cs_alt = pdf_load_colorspace(doc, obj);
+ cs_alt = pdf_load_colorspace(ctx, doc, obj);
if (cs_alt->n != n)
{
fz_drop_colorspace(ctx, cs_alt);
@@ -114,14 +113,13 @@ free_separation(fz_context *ctx, fz_colorspace *cs)
}
static fz_colorspace *
-load_separation(pdf_document *doc, pdf_obj *array)
+load_separation(fz_context *ctx, pdf_document *doc, pdf_obj *array)
{
fz_colorspace *cs;
struct separation *sep = NULL;
- fz_context *ctx = doc->ctx;
- pdf_obj *nameobj = pdf_array_get(array, 1);
- pdf_obj *baseobj = pdf_array_get(array, 2);
- pdf_obj *tintobj = pdf_array_get(array, 3);
+ pdf_obj *nameobj = pdf_array_get(ctx, array, 1);
+ pdf_obj *baseobj = pdf_array_get(ctx, array, 2);
+ pdf_obj *tintobj = pdf_array_get(ctx, array, 3);
fz_colorspace *base;
fz_function *tint = NULL;
int n;
@@ -129,21 +127,21 @@ load_separation(pdf_document *doc, pdf_obj *array)
fz_var(tint);
fz_var(sep);
- if (pdf_is_array(nameobj))
- n = pdf_array_len(nameobj);
+ if (pdf_is_array(ctx, nameobj))
+ n = pdf_array_len(ctx, nameobj);
else
n = 1;
if (n > FZ_MAX_COLORS)
fz_throw(ctx, FZ_ERROR_GENERIC, "too many components in colorspace");
- base = pdf_load_colorspace(doc, baseobj);
+ base = pdf_load_colorspace(ctx, doc, baseobj);
fz_try(ctx)
{
- tint = pdf_load_function(doc, tintobj, n, base->n);
+ tint = pdf_load_function(ctx, doc, tintobj, n, base->n);
/* RJW: fz_drop_colorspace(ctx, base);
- * "cannot load tint function (%d %d R)", pdf_to_num(tintobj), pdf_to_gen(tintobj) */
+ * "cannot load tint function (%d %d R)", pdf_to_num(ctx, tintobj), pdf_to_gen(ctx, tintobj) */
sep = fz_malloc_struct(ctx, struct separation);
sep->base = base;
@@ -153,7 +151,7 @@ load_separation(pdf_document *doc, pdf_obj *array)
cs->to_rgb = separation_to_rgb;
cs->free_data = free_separation;
cs->data = sep;
- cs->size += sizeof(struct separation) + (base ? base->size : 0) + fz_function_size(tint);
+ cs->size += sizeof(struct separation) + (base ? base->size : 0) + fz_function_size(ctx, tint);
}
fz_catch(ctx)
{
@@ -167,7 +165,7 @@ load_separation(pdf_document *doc, pdf_obj *array)
}
int
-pdf_is_tint_colorspace(fz_colorspace *cs)
+pdf_is_tint_colorspace(fz_context *ctx, fz_colorspace *cs)
{
return cs && cs->to_rgb == separation_to_rgb;
}
@@ -175,12 +173,11 @@ pdf_is_tint_colorspace(fz_colorspace *cs)
/* Indexed */
static fz_colorspace *
-load_indexed(pdf_document *doc, pdf_obj *array)
+load_indexed(fz_context *ctx, pdf_document *doc, pdf_obj *array)
{
- fz_context *ctx = doc->ctx;
- pdf_obj *baseobj = pdf_array_get(array, 1);
- pdf_obj *highobj = pdf_array_get(array, 2);
- pdf_obj *lookupobj = pdf_array_get(array, 3);
+ pdf_obj *baseobj = pdf_array_get(ctx, array, 1);
+ pdf_obj *highobj = pdf_array_get(ctx, array, 2);
+ pdf_obj *lookupobj = pdf_array_get(ctx, array, 3);
fz_colorspace *base = NULL;
fz_colorspace *cs;
int i, n, high;
@@ -191,20 +188,20 @@ load_indexed(pdf_document *doc, pdf_obj *array)
fz_try(ctx)
{
- base = pdf_load_colorspace(doc, baseobj);
+ base = pdf_load_colorspace(ctx, doc, baseobj);
- high = pdf_to_int(highobj);
+ high = pdf_to_int(ctx, highobj);
high = fz_clampi(high, 0, 255);
n = base->n * (high + 1);
lookup = fz_malloc_array(ctx, 1, n);
- if (pdf_is_string(lookupobj) && pdf_to_str_len(lookupobj) >= n)
+ if (pdf_is_string(ctx, lookupobj) && pdf_to_str_len(ctx, lookupobj) >= n)
{
- unsigned char *buf = (unsigned char *) pdf_to_str_buf(lookupobj);
+ unsigned char *buf = (unsigned char *) pdf_to_str_buf(ctx, lookupobj);
for (i = 0; i < n; i++)
lookup[i] = buf[i];
}
- else if (pdf_is_indirect(lookupobj))
+ else if (pdf_is_indirect(ctx, lookupobj))
{
fz_stream *file = NULL;
@@ -212,18 +209,18 @@ load_indexed(pdf_document *doc, pdf_obj *array)
fz_try(ctx)
{
- file = pdf_open_stream(doc, pdf_to_num(lookupobj), pdf_to_gen(lookupobj));
- i = fz_read(file, lookup, n);
+ file = pdf_open_stream(ctx, doc, pdf_to_num(ctx, lookupobj), pdf_to_gen(ctx, lookupobj));
+ i = fz_read(ctx, file, lookup, n);
if (i < n)
memset(lookup+i, 0, n-i);
}
fz_always(ctx)
{
- fz_drop_stream(file);
+ fz_drop_stream(ctx, file);
}
fz_catch(ctx)
{
- fz_rethrow_message(ctx, "cannot open colorspace lookup table (%d 0 R)", pdf_to_num(lookupobj));
+ fz_rethrow_message(ctx, "cannot open colorspace lookup table (%d 0 R)", pdf_to_num(ctx, lookupobj));
}
}
else
@@ -246,16 +243,15 @@ load_indexed(pdf_document *doc, pdf_obj *array)
/* Parse and create colorspace from PDF object */
static fz_colorspace *
-pdf_load_colorspace_imp(pdf_document *doc, pdf_obj *obj)
+pdf_load_colorspace_imp(fz_context *ctx, pdf_document *doc, pdf_obj *obj)
{
- fz_context *ctx = doc->ctx;
- if (pdf_obj_marked(obj))
+ if (pdf_obj_marked(ctx, obj))
fz_throw(ctx, FZ_ERROR_GENERIC, "Recursion in colorspace definition");
- if (pdf_is_name(obj))
+ if (pdf_is_name(ctx, obj))
{
- const char *str = pdf_to_name(obj);
+ const char *str = pdf_to_name(ctx, obj);
if (!strcmp(str, "Pattern"))
return fz_device_gray(ctx);
else if (!strcmp(str, "G"))
@@ -271,15 +267,15 @@ pdf_load_colorspace_imp(pdf_document *doc, pdf_obj *obj)
else if (!strcmp(str, "DeviceCMYK"))
return fz_device_cmyk(ctx);
else
- fz_throw(ctx, FZ_ERROR_GENERIC, "unknown colorspace: %s", pdf_to_name(obj));
+ fz_throw(ctx, FZ_ERROR_GENERIC, "unknown colorspace: %s", pdf_to_name(ctx, obj));
}
- else if (pdf_is_array(obj))
+ else if (pdf_is_array(ctx, obj))
{
- pdf_obj *name = pdf_array_get(obj, 0);
- const char *str = pdf_to_name(name);
+ pdf_obj *name = pdf_array_get(ctx, obj, 0);
+ const char *str = pdf_to_name(ctx, name);
- if (pdf_is_name(name))
+ if (pdf_is_name(ctx, name))
{
/* load base colorspace instead */
if (!strcmp(str, "G"))
@@ -307,39 +303,39 @@ pdf_load_colorspace_imp(pdf_document *doc, pdf_obj *obj)
fz_colorspace *cs;
fz_try(ctx)
{
- pdf_mark_obj(obj);
+ pdf_mark_obj(ctx, obj);
if (!strcmp(str, "ICCBased"))
- cs = load_icc_based(doc, pdf_array_get(obj, 1));
+ cs = load_icc_based(ctx, doc, pdf_array_get(ctx, obj, 1));
else if (!strcmp(str, "Indexed"))
- cs = load_indexed(doc, obj);
+ cs = load_indexed(ctx, doc, obj);
else if (!strcmp(str, "I"))
- cs = load_indexed(doc, obj);
+ cs = load_indexed(ctx, doc, obj);
else if (!strcmp(str, "Separation"))
- cs = load_separation(doc, obj);
+ cs = load_separation(ctx, doc, obj);
else if (!strcmp(str, "DeviceN"))
- cs = load_separation(doc, obj);
+ cs = load_separation(ctx, doc, obj);
else if (!strcmp(str, "Pattern"))
{
pdf_obj *pobj;
- pobj = pdf_array_get(obj, 1);
+ pobj = pdf_array_get(ctx, obj, 1);
if (!pobj)
{
cs = fz_device_gray(ctx);
break;
}
- cs = pdf_load_colorspace(doc, pobj);
+ cs = pdf_load_colorspace(ctx, doc, pobj);
}
else
fz_throw(ctx, FZ_ERROR_GENERIC, "syntaxerror: unknown colorspace %s", str);
}
fz_always(ctx)
{
- pdf_unmark_obj(obj);
+ pdf_unmark_obj(ctx, obj);
}
fz_catch(ctx)
{
@@ -350,13 +346,12 @@ pdf_load_colorspace_imp(pdf_document *doc, pdf_obj *obj)
}
}
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "syntaxerror: could not parse color space (%d %d R)", pdf_to_num(obj), pdf_to_gen(obj));
+ fz_throw(ctx, FZ_ERROR_GENERIC, "syntaxerror: could not parse color space (%d %d R)", pdf_to_num(ctx, obj), pdf_to_gen(ctx, obj));
}
fz_colorspace *
-pdf_load_colorspace(pdf_document *doc, pdf_obj *obj)
+pdf_load_colorspace(fz_context *ctx, pdf_document *doc, pdf_obj *obj)
{
- fz_context *ctx = doc->ctx;
fz_colorspace *cs;
if ((cs = pdf_find_item(ctx, fz_drop_colorspace_imp, obj)) != NULL)
@@ -364,7 +359,7 @@ pdf_load_colorspace(pdf_document *doc, pdf_obj *obj)
return cs;
}
- cs = pdf_load_colorspace_imp(doc, obj);
+ cs = pdf_load_colorspace_imp(ctx, doc, obj);
pdf_store_item(ctx, obj, cs, cs->size);
diff --git a/source/pdf/pdf-crypt.c b/source/pdf/pdf-crypt.c
index 621885d0..4519657f 100644
--- a/source/pdf/pdf-crypt.c
+++ b/source/pdf/pdf-crypt.c
@@ -55,22 +55,22 @@ pdf_new_crypt(fz_context *ctx, pdf_obj *dict, pdf_obj *id)
/* Common to all security handlers (PDF 1.7 table 3.18) */
- obj = pdf_dict_gets(dict, "Filter");
- if (!pdf_is_name(obj))
+ obj = pdf_dict_gets(ctx, dict, "Filter");
+ if (!pdf_is_name(ctx, obj))
{
pdf_drop_crypt(ctx, crypt);
fz_throw(ctx, FZ_ERROR_GENERIC, "unspecified encryption handler");
}
- if (strcmp(pdf_to_name(obj), "Standard") != 0)
+ if (strcmp(pdf_to_name(ctx, obj), "Standard") != 0)
{
pdf_drop_crypt(ctx, crypt);
- fz_throw(ctx, FZ_ERROR_GENERIC, "unknown encryption handler: '%s'", pdf_to_name(obj));
+ fz_throw(ctx, FZ_ERROR_GENERIC, "unknown encryption handler: '%s'", pdf_to_name(ctx, obj));
}
crypt->v = 0;
- obj = pdf_dict_gets(dict, "V");
- if (pdf_is_int(obj))
- crypt->v = pdf_to_int(obj);
+ obj = pdf_dict_gets(ctx, dict, "V");
+ if (pdf_is_int(ctx, obj))
+ crypt->v = pdf_to_int(ctx, obj);
if (crypt->v != 1 && crypt->v != 2 && crypt->v != 4 && crypt->v != 5)
{
pdf_drop_crypt(ctx, crypt);
@@ -79,9 +79,9 @@ pdf_new_crypt(fz_context *ctx, pdf_obj *dict, pdf_obj *id)
/* Standard security handler (PDF 1.7 table 3.19) */
- obj = pdf_dict_gets(dict, "R");
- if (pdf_is_int(obj))
- crypt->r = pdf_to_int(obj);
+ obj = pdf_dict_gets(ctx, dict, "R");
+ if (pdf_is_int(ctx, obj))
+ crypt->r = pdf_to_int(ctx, obj);
else if (crypt->v <= 4)
{
fz_warn(ctx, "encryption dictionary missing revision value, guessing...");
@@ -104,28 +104,28 @@ pdf_new_crypt(fz_context *ctx, pdf_obj *dict, pdf_obj *id)
fz_throw(ctx, FZ_ERROR_GENERIC, "unknown crypt revision %d", r);
}
- obj = pdf_dict_gets(dict, "O");
- if (pdf_is_string(obj) && pdf_to_str_len(obj) == 32)
- memcpy(crypt->o, pdf_to_str_buf(obj), 32);
+ obj = pdf_dict_gets(ctx, dict, "O");
+ if (pdf_is_string(ctx, obj) && pdf_to_str_len(ctx, obj) == 32)
+ memcpy(crypt->o, pdf_to_str_buf(ctx, obj), 32);
/* /O and /U are supposed to be 48 bytes long for revision 5 and 6, they're often longer, though */
- else if (crypt->r >= 5 && pdf_is_string(obj) && pdf_to_str_len(obj) >= 48)
- memcpy(crypt->o, pdf_to_str_buf(obj), 48);
+ else if (crypt->r >= 5 && pdf_is_string(ctx, obj) && pdf_to_str_len(ctx, obj) >= 48)
+ memcpy(crypt->o, pdf_to_str_buf(ctx, obj), 48);
else
{
pdf_drop_crypt(ctx, crypt);
fz_throw(ctx, FZ_ERROR_GENERIC, "encryption dictionary missing owner password");
}
- obj = pdf_dict_gets(dict, "U");
- if (pdf_is_string(obj) && pdf_to_str_len(obj) == 32)
- memcpy(crypt->u, pdf_to_str_buf(obj), 32);
+ obj = pdf_dict_gets(ctx, dict, "U");
+ if (pdf_is_string(ctx, obj) && pdf_to_str_len(ctx, obj) == 32)
+ memcpy(crypt->u, pdf_to_str_buf(ctx, obj), 32);
/* /O and /U are supposed to be 48 bytes long for revision 5 and 6, they're often longer, though */
- else if (crypt->r >= 5 && pdf_is_string(obj) && pdf_to_str_len(obj) >= 48)
- memcpy(crypt->u, pdf_to_str_buf(obj), 48);
- else if (pdf_is_string(obj) && pdf_to_str_len(obj) < 32)
+ else if (crypt->r >= 5 && pdf_is_string(ctx, obj) && pdf_to_str_len(ctx, obj) >= 48)
+ memcpy(crypt->u, pdf_to_str_buf(ctx, obj), 48);
+ else if (pdf_is_string(ctx, obj) && pdf_to_str_len(ctx, obj) < 32)
{
- fz_warn(ctx, "encryption password key too short (%d)", pdf_to_str_len(obj));
- memcpy(crypt->u, pdf_to_str_buf(obj), pdf_to_str_len(obj));
+ fz_warn(ctx, "encryption password key too short (%d)", pdf_to_str_len(ctx, obj));
+ memcpy(crypt->u, pdf_to_str_buf(ctx, obj), pdf_to_str_len(ctx, obj));
}
else
{
@@ -133,9 +133,9 @@ pdf_new_crypt(fz_context *ctx, pdf_obj *dict, pdf_obj *id)
fz_throw(ctx, FZ_ERROR_GENERIC, "encryption dictionary missing user password");
}
- obj = pdf_dict_gets(dict, "P");
- if (pdf_is_int(obj))
- crypt->p = pdf_to_int(obj);
+ obj = pdf_dict_gets(ctx, dict, "P");
+ if (pdf_is_int(ctx, obj))
+ crypt->p = pdf_to_int(ctx, obj);
else
{
fz_warn(ctx, "encryption dictionary missing permissions");
@@ -144,35 +144,35 @@ pdf_new_crypt(fz_context *ctx, pdf_obj *dict, pdf_obj *id)
if (crypt->r == 5 || crypt->r == 6)
{
- obj = pdf_dict_gets(dict, "OE");
- if (!pdf_is_string(obj) || pdf_to_str_len(obj) != 32)
+ obj = pdf_dict_gets(ctx, dict, "OE");
+ if (!pdf_is_string(ctx, obj) || pdf_to_str_len(ctx, obj) != 32)
{
pdf_drop_crypt(ctx, crypt);
fz_throw(ctx, FZ_ERROR_GENERIC, "encryption dictionary missing owner encryption key");
}
- memcpy(crypt->oe, pdf_to_str_buf(obj), 32);
+ memcpy(crypt->oe, pdf_to_str_buf(ctx, obj), 32);
- obj = pdf_dict_gets(dict, "UE");
- if (!pdf_is_string(obj) || pdf_to_str_len(obj) != 32)
+ obj = pdf_dict_gets(ctx, dict, "UE");
+ if (!pdf_is_string(ctx, obj) || pdf_to_str_len(ctx, obj) != 32)
{
pdf_drop_crypt(ctx, crypt);
fz_throw(ctx, FZ_ERROR_GENERIC, "encryption dictionary missing user encryption key");
}
- memcpy(crypt->ue, pdf_to_str_buf(obj), 32);
+ memcpy(crypt->ue, pdf_to_str_buf(ctx, obj), 32);
}
crypt->encrypt_metadata = 1;
- obj = pdf_dict_gets(dict, "EncryptMetadata");
- if (pdf_is_bool(obj))
- crypt->encrypt_metadata = pdf_to_bool(obj);
+ obj = pdf_dict_gets(ctx, dict, "EncryptMetadata");
+ if (pdf_is_bool(ctx, obj))
+ crypt->encrypt_metadata = pdf_to_bool(ctx, obj);
/* Extract file identifier string */
- if (pdf_is_array(id) && pdf_array_len(id) == 2)
+ if (pdf_is_array(ctx, id) && pdf_array_len(ctx, id) == 2)
{
- obj = pdf_array_get(id, 0);
- if (pdf_is_string(obj))
- crypt->id = pdf_keep_obj(obj);
+ obj = pdf_array_get(ctx, id, 0);
+ if (pdf_is_string(ctx, obj))
+ crypt->id = pdf_keep_obj(ctx, obj);
}
else
fz_warn(ctx, "missing file identifier, may not be able to do decryption");
@@ -182,9 +182,9 @@ pdf_new_crypt(fz_context *ctx, pdf_obj *dict, pdf_obj *id)
crypt->length = 40;
if (crypt->v == 2 || crypt->v == 4)
{
- obj = pdf_dict_gets(dict, "Length");
- if (pdf_is_int(obj))
- crypt->length = pdf_to_int(obj);
+ obj = pdf_dict_gets(ctx, dict, "Length");
+ if (pdf_is_int(ctx, obj))
+ crypt->length = pdf_to_int(ctx, obj);
/* work-around for pdf generators that assume length is in bytes */
if (crypt->length < 40)
@@ -222,10 +222,10 @@ pdf_new_crypt(fz_context *ctx, pdf_obj *dict, pdf_obj *id)
crypt->strf.method = PDF_CRYPT_NONE;
crypt->strf.length = crypt->length;
- obj = pdf_dict_gets(dict, "CF");
- if (pdf_is_dict(obj))
+ obj = pdf_dict_gets(ctx, dict, "CF");
+ if (pdf_is_dict(ctx, obj))
{
- crypt->cf = pdf_keep_obj(obj);
+ crypt->cf = pdf_keep_obj(ctx, obj);
}
else
{
@@ -234,18 +234,18 @@ pdf_new_crypt(fz_context *ctx, pdf_obj *dict, pdf_obj *id)
fz_try(ctx)
{
- obj = pdf_dict_gets(dict, "StmF");
- if (pdf_is_name(obj))
- pdf_parse_crypt_filter(ctx, &crypt->stmf, crypt, pdf_to_name(obj));
+ obj = pdf_dict_gets(ctx, dict, "StmF");
+ if (pdf_is_name(ctx, obj))
+ pdf_parse_crypt_filter(ctx, &crypt->stmf, crypt, pdf_to_name(ctx, obj));
- obj = pdf_dict_gets(dict, "StrF");
- if (pdf_is_name(obj))
- pdf_parse_crypt_filter(ctx, &crypt->strf, crypt, pdf_to_name(obj));
+ obj = pdf_dict_gets(ctx, dict, "StrF");
+ if (pdf_is_name(ctx, obj))
+ pdf_parse_crypt_filter(ctx, &crypt->strf, crypt, pdf_to_name(ctx, obj));
}
fz_catch(ctx)
{
pdf_drop_crypt(ctx, crypt);
- fz_rethrow_message(ctx, "cannot parse string crypt filter (%d %d R)", pdf_to_num(obj), pdf_to_gen(obj));
+ fz_rethrow_message(ctx, "cannot parse string crypt filter (%d %d R)", pdf_to_num(ctx, obj), pdf_to_gen(ctx, obj));
}
/* in crypt revision 4, the crypt filter determines the key length */
@@ -259,8 +259,8 @@ pdf_new_crypt(fz_context *ctx, pdf_obj *dict, pdf_obj *id)
void
pdf_drop_crypt(fz_context *ctx, pdf_crypt *crypt)
{
- pdf_drop_obj(crypt->id);
- pdf_drop_obj(crypt->cf);
+ pdf_drop_obj(ctx, crypt->id);
+ pdf_drop_obj(ctx, crypt->cf);
fz_free(ctx, crypt);
}
@@ -277,7 +277,7 @@ pdf_parse_crypt_filter(fz_context *ctx, pdf_crypt_filter *cf, pdf_crypt *crypt,
int is_stdcf = (!is_identity && (strcmp(name, "StdCF") == 0));
if (!is_identity && !is_stdcf)
- fz_throw(ctx, FZ_ERROR_GENERIC, "Crypt Filter not Identity or StdCF (%d %d R)", pdf_to_num(crypt->cf), pdf_to_gen(crypt->cf));
+ fz_throw(ctx, FZ_ERROR_GENERIC, "Crypt Filter not Identity or StdCF (%d %d R)", pdf_to_num(ctx, crypt->cf), pdf_to_gen(ctx, crypt->cf));
cf->method = PDF_CRYPT_NONE;
cf->length = crypt->length;
@@ -288,28 +288,28 @@ pdf_parse_crypt_filter(fz_context *ctx, pdf_crypt_filter *cf, pdf_crypt *crypt,
return;
}
- dict = pdf_dict_gets(crypt->cf, name);
- if (!pdf_is_dict(dict))
- fz_throw(ctx, FZ_ERROR_GENERIC, "cannot parse crypt filter (%d %d R)", pdf_to_num(crypt->cf), pdf_to_gen(crypt->cf));
+ dict = pdf_dict_gets(ctx, crypt->cf, name);
+ if (!pdf_is_dict(ctx, dict))
+ fz_throw(ctx, FZ_ERROR_GENERIC, "cannot parse crypt filter (%d %d R)", pdf_to_num(ctx, crypt->cf), pdf_to_gen(ctx, crypt->cf));
- obj = pdf_dict_gets(dict, "CFM");
- if (pdf_is_name(obj))
+ obj = pdf_dict_gets(ctx, dict, "CFM");
+ if (pdf_is_name(ctx, obj))
{
- if (!strcmp(pdf_to_name(obj), "None"))
+ if (!strcmp(pdf_to_name(ctx, obj), "None"))
cf->method = PDF_CRYPT_NONE;
- else if (!strcmp(pdf_to_name(obj), "V2"))
+ else if (!strcmp(pdf_to_name(ctx, obj), "V2"))
cf->method = PDF_CRYPT_RC4;
- else if (!strcmp(pdf_to_name(obj), "AESV2"))
+ else if (!strcmp(pdf_to_name(ctx, obj), "AESV2"))
cf->method = PDF_CRYPT_AESV2;
- else if (!strcmp(pdf_to_name(obj), "AESV3"))
+ else if (!strcmp(pdf_to_name(ctx, obj), "AESV3"))
cf->method = PDF_CRYPT_AESV3;
else
- fz_warn(ctx, "unknown encryption method: %s", pdf_to_name(obj));
+ fz_warn(ctx, "unknown encryption method: %s", pdf_to_name(ctx, obj));
}
- obj = pdf_dict_gets(dict, "Length");
- if (pdf_is_int(obj))
- cf->length = pdf_to_int(obj);
+ obj = pdf_dict_gets(ctx, dict, "Length");
+ if (pdf_is_int(ctx, obj))
+ cf->length = pdf_to_int(ctx, obj);
/* the length for crypt filters is supposed to be in bytes not bits */
if (cf->length < 40)
@@ -338,7 +338,7 @@ static const unsigned char padding[32] =
};
static void
-pdf_compute_encryption_key(pdf_crypt *crypt, unsigned char *password, int pwlen, unsigned char *key)
+pdf_compute_encryption_key(fz_context *ctx, pdf_crypt *crypt, unsigned char *password, int pwlen, unsigned char *key)
{
unsigned char buf[32];
unsigned int p;
@@ -369,7 +369,7 @@ pdf_compute_encryption_key(pdf_crypt *crypt, unsigned char *password, int pwlen,
fz_md5_update(&md5, buf, 4);
/* Step 5 - pass first element of ID array */
- fz_md5_update(&md5, (unsigned char *)pdf_to_str_buf(crypt->id), pdf_to_str_len(crypt->id));
+ fz_md5_update(&md5, (unsigned char *)pdf_to_str_buf(ctx, crypt->id), pdf_to_str_len(ctx, crypt->id));
/* Step 6 (revision 4 or greater) - if metadata is not encrypted pass 0xFFFFFFFF */
if (crypt->r >= 4)
@@ -558,7 +558,7 @@ pdf_compute_user_password(fz_context *ctx, pdf_crypt *crypt, unsigned char *pass
{
fz_arc4 arc4;
- pdf_compute_encryption_key(crypt, password, pwlen, crypt->key);
+ pdf_compute_encryption_key(ctx, crypt, password, pwlen, crypt->key);
fz_arc4_init(&arc4, crypt->key, crypt->length / 8);
fz_arc4_encrypt(&arc4, output, padding, 32);
}
@@ -573,11 +573,11 @@ pdf_compute_user_password(fz_context *ctx, pdf_crypt *crypt, unsigned char *pass
n = crypt->length / 8;
- pdf_compute_encryption_key(crypt, password, pwlen, crypt->key);
+ pdf_compute_encryption_key(ctx, crypt, password, pwlen, crypt->key);
fz_md5_init(&md5);
fz_md5_update(&md5, padding, 32);
- fz_md5_update(&md5, (unsigned char*)pdf_to_str_buf(crypt->id), pdf_to_str_len(crypt->id));
+ fz_md5_update(&md5, (unsigned char*)pdf_to_str_buf(ctx, crypt->id), pdf_to_str_len(ctx, crypt->id));
fz_md5_final(&md5, digest);
fz_arc4_init(&arc4, crypt->key, n);
@@ -730,7 +730,7 @@ static void pdf_saslprep_from_utf8(char *password, const char *utf8, int n)
}
int
-pdf_authenticate_password(pdf_document *doc, const char *pwd_utf8)
+pdf_authenticate_password(fz_context *ctx, pdf_document *doc, const char *pwd_utf8)
{
char password[2048];
@@ -745,9 +745,9 @@ pdf_authenticate_password(pdf_document *doc, const char *pwd_utf8)
pdf_saslprep_from_utf8(password, pwd_utf8, sizeof password);
}
- if (pdf_authenticate_user_password(doc->ctx, doc->crypt, (unsigned char *)password, strlen(password)))
+ if (pdf_authenticate_user_password(ctx, doc->crypt, (unsigned char *)password, strlen(password)))
return 1;
- if (pdf_authenticate_owner_password(doc->ctx, doc->crypt, (unsigned char *)password, strlen(password)))
+ if (pdf_authenticate_owner_password(ctx, doc->crypt, (unsigned char *)password, strlen(password)))
return 1;
return 0;
}
@@ -755,17 +755,17 @@ pdf_authenticate_password(pdf_document *doc, const char *pwd_utf8)
}
int
-pdf_needs_password(pdf_document *doc)
+pdf_needs_password(fz_context *ctx, pdf_document *doc)
{
if (!doc->crypt)
return 0;
- if (pdf_authenticate_password(doc, ""))
+ if (pdf_authenticate_password(ctx, doc, ""))
return 0;
return 1;
}
int
-pdf_has_permission(pdf_document *doc, int p)
+pdf_has_permission(fz_context *ctx, pdf_document *doc, int p)
{
if (!doc->crypt)
return 1;
@@ -773,7 +773,7 @@ pdf_has_permission(pdf_document *doc, int p)
}
unsigned char *
-pdf_crypt_key(pdf_document *doc)
+pdf_crypt_key(fz_context *ctx, pdf_document *doc)
{
if (doc->crypt)
return doc->crypt->key;
@@ -781,14 +781,14 @@ pdf_crypt_key(pdf_document *doc)
}
int
-pdf_crypt_version(pdf_document *doc)
+pdf_crypt_version(fz_context *ctx, pdf_document *doc)
{
if (doc->crypt)
return doc->crypt->v;
return 0;
}
-int pdf_crypt_revision(pdf_document *doc)
+int pdf_crypt_revision(fz_context *ctx, pdf_document *doc)
{
if (doc->crypt)
return doc->crypt->r;
@@ -796,7 +796,7 @@ int pdf_crypt_revision(pdf_document *doc)
}
char *
-pdf_crypt_method(pdf_document *doc)
+pdf_crypt_method(fz_context *ctx, pdf_document *doc)
{
if (doc->crypt)
{
@@ -813,7 +813,7 @@ pdf_crypt_method(pdf_document *doc)
}
int
-pdf_crypt_length(pdf_document *doc)
+pdf_crypt_length(fz_context *ctx, pdf_document *doc)
{
if (doc->crypt)
return doc->crypt->length;
@@ -878,13 +878,13 @@ pdf_crypt_obj_imp(fz_context *ctx, pdf_crypt *crypt, pdf_obj *obj, unsigned char
unsigned char *s;
int i, n;
- if (pdf_is_indirect(obj))
+ if (pdf_is_indirect(ctx, obj))
return;
- if (pdf_is_string(obj))
+ if (pdf_is_string(ctx, obj))
{
- s = (unsigned char *)pdf_to_str_buf(obj);
- n = pdf_to_str_len(obj);
+ s = (unsigned char *)pdf_to_str_buf(ctx, obj);
+ n = pdf_to_str_len(ctx, obj);
if (crypt->strf.method == PDF_CRYPT_RC4)
{
@@ -913,26 +913,26 @@ pdf_crypt_obj_imp(fz_context *ctx, pdf_crypt *crypt, pdf_obj *obj, unsigned char
if (s[n - 17] < 1 || s[n - 17] > 16)
fz_warn(ctx, "aes padding out of range");
else
- pdf_set_str_len(obj, n - 16 - s[n - 17]);
+ pdf_set_str_len(ctx, obj, n - 16 - s[n - 17]);
}
}
}
- else if (pdf_is_array(obj))
+ else if (pdf_is_array(ctx, obj))
{
- n = pdf_array_len(obj);
+ n = pdf_array_len(ctx, obj);
for (i = 0; i < n; i++)
{
- pdf_crypt_obj_imp(ctx, crypt, pdf_array_get(obj, i), key, keylen);
+ pdf_crypt_obj_imp(ctx, crypt, pdf_array_get(ctx, obj, i), key, keylen);
}
}
- else if (pdf_is_dict(obj))
+ else if (pdf_is_dict(ctx, obj))
{
- n = pdf_dict_len(obj);
+ n = pdf_dict_len(ctx, obj);
for (i = 0; i < n; i++)
{
- pdf_crypt_obj_imp(ctx, crypt, pdf_dict_get_val(obj, i), key, keylen);
+ pdf_crypt_obj_imp(ctx, crypt, pdf_dict_get_val(ctx, obj, i), key, keylen);
}
}
}
@@ -954,7 +954,7 @@ pdf_crypt_obj(fz_context *ctx, pdf_crypt *crypt, pdf_obj *obj, int num, int gen)
* Create filter suitable for de/encrypting a stream.
*/
static fz_stream *
-pdf_open_crypt_imp(fz_stream *chain, pdf_crypt *crypt, pdf_crypt_filter *stmf, int num, int gen)
+pdf_open_crypt_imp(fz_context *ctx, fz_stream *chain, pdf_crypt *crypt, pdf_crypt_filter *stmf, int num, int gen)
{
unsigned char key[32];
int len;
@@ -962,34 +962,34 @@ pdf_open_crypt_imp(fz_stream *chain, pdf_crypt *crypt, pdf_crypt_filter *stmf, i
len = pdf_compute_object_key(crypt, stmf, num, gen, key, 32);
if (stmf->method == PDF_CRYPT_RC4)
- return fz_open_arc4(chain, key, len);
+ return fz_open_arc4(ctx, chain, key, len);
if (stmf->method == PDF_CRYPT_AESV2 || stmf->method == PDF_CRYPT_AESV3)
- return fz_open_aesd(chain, key, len);
+ return fz_open_aesd(ctx, chain, key, len);
- return fz_open_copy(chain);
+ return fz_open_copy(ctx, chain);
}
fz_stream *
-pdf_open_crypt(fz_stream *chain, pdf_crypt *crypt, int num, int gen)
+pdf_open_crypt(fz_context *ctx, fz_stream *chain, pdf_crypt *crypt, int num, int gen)
{
- return pdf_open_crypt_imp(chain, crypt, &crypt->stmf, num, gen);
+ return pdf_open_crypt_imp(ctx, chain, crypt, &crypt->stmf, num, gen);
}
fz_stream *
-pdf_open_crypt_with_filter(fz_stream *chain, pdf_crypt *crypt, char *name, int num, int gen)
+pdf_open_crypt_with_filter(fz_context *ctx, fz_stream *chain, pdf_crypt *crypt, char *name, int num, int gen)
{
if (strcmp(name, "Identity"))
{
pdf_crypt_filter cf;
- pdf_parse_crypt_filter(chain->ctx, &cf, crypt, name);
- return pdf_open_crypt_imp(chain, crypt, &cf, num, gen);
+ pdf_parse_crypt_filter(ctx, &cf, crypt, name);
+ return pdf_open_crypt_imp(ctx, chain, crypt, &cf, num, gen);
}
return chain;
}
#ifndef NDEBUG
-void pdf_print_crypt(pdf_crypt *crypt)
+void pdf_print_crypt(fz_context *ctx, pdf_crypt *crypt)
{
int i;
diff --git a/source/pdf/pdf-device.c b/source/pdf/pdf-device.c
index 0d8974be..471aaced 100644
--- a/source/pdf/pdf-device.c
+++ b/source/pdf/pdf-device.c
@@ -16,7 +16,7 @@ struct gstate_s
* they are recorded here as they are fundamentally intertwined with
* the push/pulling of the gstates. */
fz_buffer *buf;
- void (*on_pop)(pdf_device*,void *);
+ void (*on_pop)(fz_context*,pdf_device*,void *);
void *on_pop_arg;
/* The graphics state proper */
fz_colorspace *colorspace[2];
@@ -72,7 +72,6 @@ struct group_entry_s
struct pdf_device_s
{
- fz_context *ctx;
pdf_document *doc;
pdf_obj *contents;
pdf_obj *resources;
@@ -108,9 +107,8 @@ struct pdf_device_s
/* Helper functions */
static int
-send_image(pdf_device *pdev, fz_image *image, int mask, int smask)
+send_image(fz_context *ctx, pdf_device *pdev, fz_image *image, int mask, int smask)
{
- fz_context *ctx = pdev->ctx;
fz_pixmap *pixmap = NULL;
pdf_obj *imobj = NULL;
pdf_obj *imref = NULL;
@@ -197,21 +195,21 @@ send_image(pdf_device *pdev, fz_image *image, int mask, int smask)
memcpy(pdev->images[num].digest,digest,16);
pdev->images[num].ref = NULL; /* Will be filled in later */
- imobj = pdf_new_dict(doc, 3);
- pdf_dict_puts_drop(imobj, "Type", pdf_new_name(doc, "XObject"));
- pdf_dict_puts_drop(imobj, "Subtype", pdf_new_name(doc, "Image"));
- pdf_dict_puts_drop(imobj, "Width", pdf_new_int(doc, image->w));
- pdf_dict_puts_drop(imobj, "Height", pdf_new_int(doc, image->h));
+ imobj = pdf_new_dict(ctx, doc, 3);
+ pdf_dict_puts_drop(ctx, imobj, "Type", pdf_new_name(ctx, doc, "XObject"));
+ pdf_dict_puts_drop(ctx, imobj, "Subtype", pdf_new_name(ctx, doc, "Image"));
+ pdf_dict_puts_drop(ctx, imobj, "Width", pdf_new_int(ctx, doc, image->w));
+ pdf_dict_puts_drop(ctx, imobj, "Height", pdf_new_int(ctx, doc, image->h));
if (mask)
{}
else if (!colorspace || colorspace->n == 1)
- pdf_dict_puts_drop(imobj, "ColorSpace", pdf_new_name(doc, "DeviceGray"));
+ pdf_dict_puts_drop(ctx, imobj, "ColorSpace", pdf_new_name(ctx, doc, "DeviceGray"));
else if (colorspace->n == 3)
- pdf_dict_puts_drop(imobj, "ColorSpace", pdf_new_name(doc, "DeviceRGB"));
+ pdf_dict_puts_drop(ctx, imobj, "ColorSpace", pdf_new_name(ctx, doc, "DeviceRGB"));
else if (colorspace->n == 4)
- pdf_dict_puts_drop(imobj, "ColorSpace", pdf_new_name(doc, "DeviceCMYK"));
+ pdf_dict_puts_drop(ctx, imobj, "ColorSpace", pdf_new_name(ctx, doc, "DeviceCMYK"));
if (!mask)
- pdf_dict_puts_drop(imobj, "BitsPerComponent", pdf_new_int(doc, image->bpc));
+ pdf_dict_puts_drop(ctx, imobj, "BitsPerComponent", pdf_new_int(ctx, doc, image->bpc));
switch (cp ? cp->type : FZ_IMAGE_UNKNOWN)
{
case FZ_IMAGE_UNKNOWN: /* Unknown also means raw */
@@ -219,32 +217,32 @@ send_image(pdf_device *pdev, fz_image *image, int mask, int smask)
break;
case FZ_IMAGE_JPEG:
if (cp->u.jpeg.color_transform != -1)
- pdf_dict_puts_drop(imobj, "ColorTransform", pdf_new_int(doc, cp->u.jpeg.color_transform));
- pdf_dict_puts_drop(imobj, "Filter", pdf_new_name(doc, "DCTDecode"));
+ pdf_dict_puts_drop(ctx, imobj, "ColorTransform", pdf_new_int(ctx, doc, cp->u.jpeg.color_transform));
+ pdf_dict_puts_drop(ctx, imobj, "Filter", pdf_new_name(ctx, doc, "DCTDecode"));
break;
case FZ_IMAGE_JPX:
if (cp->u.jpx.smask_in_data)
- pdf_dict_puts_drop(imobj, "SMaskInData", pdf_new_int(doc, cp->u.jpx.smask_in_data));
- pdf_dict_puts_drop(imobj, "Filter", pdf_new_name(doc, "JPXDecode"));
+ pdf_dict_puts_drop(ctx, imobj, "SMaskInData", pdf_new_int(ctx, doc, cp->u.jpx.smask_in_data));
+ pdf_dict_puts_drop(ctx, imobj, "Filter", pdf_new_name(ctx, doc, "JPXDecode"));
break;
case FZ_IMAGE_FAX:
if (cp->u.fax.columns)
- pdf_dict_puts_drop(imobj, "Columns", pdf_new_int(doc, cp->u.fax.columns));
+ pdf_dict_puts_drop(ctx, imobj, "Columns", pdf_new_int(ctx, doc, cp->u.fax.columns));
if (cp->u.fax.rows)
- pdf_dict_puts_drop(imobj, "Rows", pdf_new_int(doc, cp->u.fax.rows));
+ pdf_dict_puts_drop(ctx, imobj, "Rows", pdf_new_int(ctx, doc, cp->u.fax.rows));
if (cp->u.fax.k)
- pdf_dict_puts_drop(imobj, "K", pdf_new_int(doc, cp->u.fax.k));
+ pdf_dict_puts_drop(ctx, imobj, "K", pdf_new_int(ctx, doc, cp->u.fax.k));
if (cp->u.fax.end_of_line)
- pdf_dict_puts_drop(imobj, "EndOfLine", pdf_new_int(doc, cp->u.fax.end_of_line));
+ pdf_dict_puts_drop(ctx, imobj, "EndOfLine", pdf_new_int(ctx, doc, cp->u.fax.end_of_line));
if (cp->u.fax.encoded_byte_align)
- pdf_dict_puts_drop(imobj, "EncodedByteAlign", pdf_new_int(doc, cp->u.fax.encoded_byte_align));
+ pdf_dict_puts_drop(ctx, imobj, "EncodedByteAlign", pdf_new_int(ctx, doc, cp->u.fax.encoded_byte_align));
if (cp->u.fax.end_of_block)
- pdf_dict_puts_drop(imobj, "EndOfBlock", pdf_new_int(doc, cp->u.fax.end_of_block));
+ pdf_dict_puts_drop(ctx, imobj, "EndOfBlock", pdf_new_int(ctx, doc, cp->u.fax.end_of_block));
if (cp->u.fax.black_is_1)
- pdf_dict_puts_drop(imobj, "BlackIs1", pdf_new_int(doc, cp->u.fax.black_is_1));
+ pdf_dict_puts_drop(ctx, imobj, "BlackIs1", pdf_new_int(ctx, doc, cp->u.fax.black_is_1));
if (cp->u.fax.damaged_rows_before_error)
- pdf_dict_puts_drop(imobj, "DamagedRowsBeforeError", pdf_new_int(doc, cp->u.fax.damaged_rows_before_error));
- pdf_dict_puts_drop(imobj, "Filter", pdf_new_name(doc, "CCITTFaxDecode"));
+ pdf_dict_puts_drop(ctx, imobj, "DamagedRowsBeforeError", pdf_new_int(ctx, doc, cp->u.fax.damaged_rows_before_error));
+ pdf_dict_puts_drop(ctx, imobj, "Filter", pdf_new_name(ctx, doc, "CCITTFaxDecode"));
break;
case FZ_IMAGE_JBIG2:
/* FIXME - jbig2globals */
@@ -252,68 +250,67 @@ send_image(pdf_device *pdev, fz_image *image, int mask, int smask)
break;
case FZ_IMAGE_FLATE:
if (cp->u.flate.columns)
- pdf_dict_puts_drop(imobj, "Columns", pdf_new_int(doc, cp->u.flate.columns));
+ pdf_dict_puts_drop(ctx, imobj, "Columns", pdf_new_int(ctx, doc, cp->u.flate.columns));
if (cp->u.flate.colors)
- pdf_dict_puts_drop(imobj, "Colors", pdf_new_int(doc, cp->u.flate.colors));
+ pdf_dict_puts_drop(ctx, imobj, "Colors", pdf_new_int(ctx, doc, cp->u.flate.colors));
if (cp->u.flate.predictor)
- pdf_dict_puts_drop(imobj, "Predictor", pdf_new_int(doc, cp->u.flate.predictor));
- pdf_dict_puts_drop(imobj, "Filter", pdf_new_name(doc, "FlateDecode"));
- pdf_dict_puts_drop(imobj, "BitsPerComponent", pdf_new_int(doc, image->bpc));
+ pdf_dict_puts_drop(ctx, imobj, "Predictor", pdf_new_int(ctx, doc, cp->u.flate.predictor));
+ pdf_dict_puts_drop(ctx, imobj, "Filter", pdf_new_name(ctx, doc, "FlateDecode"));
+ pdf_dict_puts_drop(ctx, imobj, "BitsPerComponent", pdf_new_int(ctx, doc, image->bpc));
break;
case FZ_IMAGE_LZW:
if (cp->u.lzw.columns)
- pdf_dict_puts_drop(imobj, "Columns", pdf_new_int(doc, cp->u.lzw.columns));
+ pdf_dict_puts_drop(ctx, imobj, "Columns", pdf_new_int(ctx, doc, cp->u.lzw.columns));
if (cp->u.lzw.colors)
- pdf_dict_puts_drop(imobj, "Colors", pdf_new_int(doc, cp->u.lzw.colors));
+ pdf_dict_puts_drop(ctx, imobj, "Colors", pdf_new_int(ctx, doc, cp->u.lzw.colors));
if (cp->u.lzw.predictor)
- pdf_dict_puts_drop(imobj, "Predictor", pdf_new_int(doc, cp->u.lzw.predictor));
+ pdf_dict_puts_drop(ctx, imobj, "Predictor", pdf_new_int(ctx, doc, cp->u.lzw.predictor));
if (cp->u.lzw.early_change)
- pdf_dict_puts_drop(imobj, "EarlyChange", pdf_new_int(doc, cp->u.lzw.early_change));
- pdf_dict_puts_drop(imobj, "Filter", pdf_new_name(doc, "LZWDecode"));
+ pdf_dict_puts_drop(ctx, imobj, "EarlyChange", pdf_new_int(ctx, doc, cp->u.lzw.early_change));
+ pdf_dict_puts_drop(ctx, imobj, "Filter", pdf_new_name(ctx, doc, "LZWDecode"));
break;
case FZ_IMAGE_RLD:
- pdf_dict_puts_drop(imobj, "Filter", pdf_new_name(doc, "RunLengthDecode"));
+ pdf_dict_puts_drop(ctx, imobj, "Filter", pdf_new_name(ctx, doc, "RunLengthDecode"));
break;
}
if (mask)
{
- pdf_dict_puts_drop(imobj, "ImageMask", pdf_new_bool(doc, 1));
+ pdf_dict_puts_drop(ctx, imobj, "ImageMask", pdf_new_bool(ctx, doc, 1));
}
if (image->mask)
{
- int smasknum = send_image(pdev, image->mask, 0, 1);
- pdf_dict_puts(imobj, "SMask", pdev->images[smasknum].ref);
+ int smasknum = send_image(ctx, pdev, image->mask, 0, 1);
+ pdf_dict_puts(ctx, imobj, "SMask", pdev->images[smasknum].ref);
}
- imref = pdf_new_ref(doc, imobj);
- pdf_update_stream(doc, pdf_to_num(imref), buffer);
- pdf_dict_puts_drop(imobj, "Length", pdf_new_int(doc, buffer->len));
+ imref = pdf_new_ref(ctx, doc, imobj);
+ pdf_update_stream(ctx, doc, pdf_to_num(ctx, imref), buffer);
+ pdf_dict_puts_drop(ctx, imobj, "Length", pdf_new_int(ctx, doc, buffer->len));
{
char text[32];
snprintf(text, sizeof(text), "XObject/Img%d", num);
- pdf_dict_putp(pdev->resources, text, imref);
+ pdf_dict_putp(ctx, pdev->resources, text, imref);
}
pdev->images[num].ref = imref;
}
fz_always(ctx)
{
fz_drop_buffer(ctx, buffer);
- pdf_drop_obj(imobj);
+ pdf_drop_obj(ctx, imobj);
fz_drop_pixmap(ctx, pixmap);
}
fz_catch(ctx)
{
- pdf_drop_obj(imref);
+ pdf_drop_obj(ctx, imref);
fz_rethrow(ctx);
}
return num;
}
static void
-pdf_dev_stroke_state(pdf_device *pdev, fz_stroke_state *stroke_state)
+pdf_dev_stroke_state(fz_context *ctx, pdf_device *pdev, fz_stroke_state *stroke_state)
{
- fz_context *ctx = pdev->ctx;
gstate *gs = CURRENT_GSTATE(pdev);
if (stroke_state == gs->stroke_state)
@@ -361,9 +358,8 @@ pdf_dev_stroke_state(pdf_device *pdev, fz_stroke_state *stroke_state)
}
static void
-pdf_dev_path(pdf_device *pdev, fz_path *path)
+pdf_dev_path(fz_context *ctx, pdf_device *pdev, fz_path *path)
{
- fz_context *ctx = pdev->ctx;
gstate *gs = CURRENT_GSTATE(pdev);
float x, y;
int i = 0, k = 0;
@@ -400,7 +396,7 @@ pdf_dev_path(pdf_device *pdev, fz_path *path)
}
static void
-pdf_dev_ctm(pdf_device *pdev, const fz_matrix *ctm)
+pdf_dev_ctm(fz_context *ctx, pdf_device *pdev, const fz_matrix *ctm)
{
fz_matrix inverse;
gstate *gs = CURRENT_GSTATE(pdev);
@@ -410,16 +406,15 @@ pdf_dev_ctm(pdf_device *pdev, const fz_matrix *ctm)
fz_invert_matrix(&inverse, &gs->ctm);
fz_concat(&inverse, ctm, &inverse);
memcpy(&gs->ctm, ctm, sizeof(*ctm));
- fz_buffer_printf(pdev->ctx, gs->buf, "%f %f %f %f %f %f cm\n", inverse.a, inverse.b, inverse.c, inverse.d, inverse.e, inverse.f);
+ fz_buffer_printf(ctx, gs->buf, "%f %f %f %f %f %f cm\n", inverse.a, inverse.b, inverse.c, inverse.d, inverse.e, inverse.f);
}
static void
-pdf_dev_color(pdf_device *pdev, fz_colorspace *colorspace, float *color, int stroke)
+pdf_dev_color(fz_context *ctx, pdf_device *pdev, fz_colorspace *colorspace, float *color, int stroke)
{
int diff = 0;
int i;
int cspace = 0;
- fz_context *ctx = pdev->ctx;
float rgb[FZ_MAX_COLORS];
gstate *gs = CURRENT_GSTATE(pdev);
@@ -478,10 +473,9 @@ pdf_dev_color(pdf_device *pdev, fz_colorspace *colorspace, float *color, int str
}
static void
-pdf_dev_alpha(pdf_device *pdev, float alpha, int stroke)
+pdf_dev_alpha(fz_context *ctx, pdf_device *pdev, float alpha, int stroke)
{
int i;
- fz_context *ctx = pdev->ctx;
pdf_document *doc = pdev->doc;
gstate *gs = CURRENT_GSTATE(pdev);
@@ -513,19 +507,19 @@ pdf_dev_alpha(pdf_device *pdev, float alpha, int stroke)
pdev->alphas[i].alpha = alpha;
pdev->alphas[i].stroke = stroke;
- o = pdf_new_dict(doc, 1);
+ o = pdf_new_dict(ctx, doc, 1);
fz_try(ctx)
{
char text[32];
- pdf_dict_puts_drop(o, (stroke ? "CA" : "ca"), pdf_new_real(doc, alpha));
- ref = pdf_new_ref(doc, o);
+ pdf_dict_puts_drop(ctx, o, (stroke ? "CA" : "ca"), pdf_new_real(ctx, doc, alpha));
+ ref = pdf_new_ref(ctx, doc, o);
snprintf(text, sizeof(text), "ExtGState/Alp%d", i);
- pdf_dict_putp(pdev->resources, text, ref);
+ pdf_dict_putp(ctx, pdev->resources, text, ref);
}
fz_always(ctx)
{
- pdf_drop_obj(o);
- pdf_drop_obj(ref);
+ pdf_drop_obj(ctx, o);
+ pdf_drop_obj(ctx, ref);
}
fz_catch(ctx)
{
@@ -537,11 +531,10 @@ pdf_dev_alpha(pdf_device *pdev, float alpha, int stroke)
}
static void
-pdf_dev_font(pdf_device *pdev, fz_font *font, float size)
+pdf_dev_font(fz_context *ctx, pdf_device *pdev, fz_font *font, float size)
{
int i;
pdf_document *doc = pdev->doc;
- fz_context *ctx = pdev->ctx;
gstate *gs = CURRENT_GSTATE(pdev);
/* If the font is unchanged, nothing to do */
@@ -549,7 +542,7 @@ pdf_dev_font(pdf_device *pdev, fz_font *font, float size)
return;
if (font->ft_buffer != NULL || font->ft_substitute)
- fz_throw(pdev->ctx, FZ_ERROR_GENERIC, "pdf device supports only base 14 fonts currently");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "pdf device supports only base 14 fonts currently");
/* Have we sent such a font before? */
for (i = 0; i < pdev->num_fonts; i++)
@@ -574,22 +567,22 @@ pdf_dev_font(pdf_device *pdev, fz_font *font, float size)
}
pdev->fonts[i].font = fz_keep_font(ctx, font);
- o = pdf_new_dict(doc, 3);
+ o = pdf_new_dict(ctx, doc, 3);
fz_try(ctx)
{
char text[32];
- pdf_dict_puts_drop(o, "Type", pdf_new_name(doc, "Font"));
- pdf_dict_puts_drop(o, "Subtype", pdf_new_name(doc, "Type1"));
- pdf_dict_puts_drop(o, "BaseFont", pdf_new_name(doc, font->name));
- pdf_dict_puts_drop(o, "Encoding", pdf_new_name(doc, "WinAnsiEncoding"));
- ref = pdf_new_ref(doc, o);
+ pdf_dict_puts_drop(ctx, o, "Type", pdf_new_name(ctx, doc, "Font"));
+ pdf_dict_puts_drop(ctx, o, "Subtype", pdf_new_name(ctx, doc, "Type1"));
+ pdf_dict_puts_drop(ctx, o, "BaseFont", pdf_new_name(ctx, doc, font->name));
+ pdf_dict_puts_drop(ctx, o, "Encoding", pdf_new_name(ctx, doc, "WinAnsiEncoding"));
+ ref = pdf_new_ref(ctx, doc, o);
snprintf(text, sizeof(text), "Font/F%d", i);
- pdf_dict_putp(pdev->resources, text, ref);
+ pdf_dict_putp(ctx, pdev->resources, text, ref);
}
fz_always(ctx)
{
- pdf_drop_obj(o);
- pdf_drop_obj(ref);
+ pdf_drop_obj(ctx, o);
+ pdf_drop_obj(ctx, ref);
}
fz_catch(ctx)
{
@@ -601,21 +594,19 @@ pdf_dev_font(pdf_device *pdev, fz_font *font, float size)
}
static void
-pdf_dev_tm(pdf_device *pdev, const fz_matrix *tm)
+pdf_dev_tm(fz_context *ctx, pdf_device *pdev, const fz_matrix *tm)
{
gstate *gs = CURRENT_GSTATE(pdev);
if (memcmp(&gs->tm, tm, sizeof(*tm)) == 0)
return;
- fz_buffer_printf(pdev->ctx, gs->buf, "%f %f %f %f %f %f Tm\n", tm->a, tm->b, tm->c, tm->d, tm->e, tm->f);
+ fz_buffer_printf(ctx, gs->buf, "%f %f %f %f %f %f Tm\n", tm->a, tm->b, tm->c, tm->d, tm->e, tm->f);
gs->tm = *tm;
}
static void
-pdf_dev_push_new_buf(pdf_device *pdev, fz_buffer *buf, void (*on_pop)(pdf_device*,void *), void *on_pop_arg)
+pdf_dev_push_new_buf(fz_context *ctx, pdf_device *pdev, fz_buffer *buf, void (*on_pop)(fz_context*,pdf_device*,void*), void *on_pop_arg)
{
- fz_context *ctx = pdev->ctx;
-
if (pdev->num_gstates == pdev->max_gstates)
{
int newmax = pdev->max_gstates*2;
@@ -636,21 +627,20 @@ pdf_dev_push_new_buf(pdf_device *pdev, fz_buffer *buf, void (*on_pop)(pdf_device
}
static void
-pdf_dev_push(pdf_device *pdev)
+pdf_dev_push(fz_context *ctx, pdf_device *pdev)
{
- pdf_dev_push_new_buf(pdev, NULL, NULL, NULL);
+ pdf_dev_push_new_buf(ctx, pdev, NULL, NULL, NULL);
}
static void *
-pdf_dev_pop(pdf_device *pdev)
+pdf_dev_pop(fz_context *ctx, pdf_device *pdev)
{
- fz_context *ctx = pdev->ctx;
gstate *gs = CURRENT_GSTATE(pdev);
void *arg = gs->on_pop_arg;
- fz_buffer_printf(pdev->ctx, gs->buf, "Q\n");
+ fz_buffer_printf(ctx, gs->buf, "Q\n");
if (gs->on_pop)
- gs->on_pop(pdev, arg);
+ gs->on_pop(ctx, pdev, arg);
pdev->num_gstates--;
fz_drop_stroke_state(ctx, pdev->gstates[pdev->num_gstates].stroke_state);
fz_drop_buffer(ctx, pdev->gstates[pdev->num_gstates].buf);
@@ -658,7 +648,7 @@ pdf_dev_pop(pdf_device *pdev)
}
static void
-pdf_dev_text(pdf_device *pdev, fz_text *text, float size)
+pdf_dev_text(fz_context *ctx, pdf_device *pdev, fz_text *text, float size)
{
int mask = FT_LOAD_NO_SCALE | FT_LOAD_IGNORE_TRANSFORM;
int i;
@@ -689,7 +679,7 @@ pdf_dev_text(pdf_device *pdev, fz_text *text, float size)
fz_transform_point(&delta, &inverse);
if (delta.x != 0 || delta.y != 0)
{
- fz_buffer_printf(pdev->ctx, gs->buf, "%f %f Td ", delta.x, delta.y);
+ fz_buffer_printf(ctx, gs->buf, "%f %f Td ", delta.x, delta.y);
trm.e = it->x;
trm.f = it->y;
}
@@ -711,38 +701,38 @@ pdf_dev_text(pdf_device *pdev, fz_text *text, float size)
}
}
- fz_buffer_printf(pdev->ctx, gs->buf, "<");
+ fz_buffer_printf(ctx, gs->buf, "<");
for (/* i from its current value */; i < j; i++)
{
/* FIXME: should use it->gid, rather than it->ucs, and convert
* to the correct encoding */
- fz_buffer_printf(pdev->ctx, gs->buf, "%02x", text->items[i].ucs);
+ fz_buffer_printf(ctx, gs->buf, "%02x", text->items[i].ucs);
}
- fz_buffer_printf(pdev->ctx, gs->buf, "> Tj\n");
+ fz_buffer_printf(ctx, gs->buf, "> Tj\n");
}
gs->tm.e = trm.e;
gs->tm.f = trm.f;
}
static void
-pdf_dev_trm(pdf_device *pdev, int trm)
+pdf_dev_trm(fz_context *ctx, pdf_device *pdev, int trm)
{
gstate *gs = CURRENT_GSTATE(pdev);
if (gs->text_rendering_mode == trm)
return;
gs->text_rendering_mode = trm;
- fz_buffer_printf(pdev->ctx, gs->buf, "%d Tr\n", trm);
+ fz_buffer_printf(ctx, gs->buf, "%d Tr\n", trm);
}
static void
-pdf_dev_begin_text(pdf_device *pdev, const fz_matrix *tm, int trm)
+pdf_dev_begin_text(fz_context *ctx, pdf_device *pdev, const fz_matrix *tm, int trm)
{
- pdf_dev_trm(pdev, trm);
+ pdf_dev_trm(ctx, pdev, trm);
if (!pdev->in_text)
{
gstate *gs = CURRENT_GSTATE(pdev);
- fz_buffer_printf(pdev->ctx, gs->buf, "BT\n");
+ fz_buffer_printf(ctx, gs->buf, "BT\n");
gs->tm.a = 1;
gs->tm.b = 0;
gs->tm.c = 0;
@@ -751,24 +741,23 @@ pdf_dev_begin_text(pdf_device *pdev, const fz_matrix *tm, int trm)
gs->tm.f = 0;
pdev->in_text = 1;
}
- pdf_dev_tm(pdev, tm);
+ pdf_dev_tm(ctx, pdev, tm);
}
static void
-pdf_dev_end_text(pdf_device *pdev)
+pdf_dev_end_text(fz_context *ctx, pdf_device *pdev)
{
gstate *gs = CURRENT_GSTATE(pdev);
if (!pdev->in_text)
return;
pdev->in_text = 0;
- fz_buffer_printf(pdev->ctx, gs->buf, "ET\n");
+ fz_buffer_printf(ctx, gs->buf, "ET\n");
}
static int
-pdf_dev_new_form(pdf_obj **form_ref, pdf_device *pdev, const fz_rect *bbox, int isolated, int knockout, float alpha, fz_colorspace *colorspace)
+pdf_dev_new_form(fz_context *ctx, pdf_obj **form_ref, pdf_device *pdev, const fz_rect *bbox, int isolated, int knockout, float alpha, fz_colorspace *colorspace)
{
- fz_context *ctx = pdev->ctx;
pdf_document *doc = pdev->doc;
int num;
pdf_obj *group_ref;
@@ -805,26 +794,26 @@ pdf_dev_new_form(pdf_obj **form_ref, pdf_device *pdev, const fz_rect *bbox, int
pdev->groups[num].alpha = alpha;
pdev->groups[num].colorspace = fz_keep_colorspace(ctx, colorspace);
pdev->groups[num].ref = NULL;
- group = pdf_new_dict(doc, 5);
+ group = pdf_new_dict(ctx, doc, 5);
fz_try(ctx)
{
- pdf_dict_puts_drop(group, "Type", pdf_new_name(doc, "Group"));
- pdf_dict_puts_drop(group, "S", pdf_new_name(doc, "Transparency"));
- pdf_dict_puts_drop(group, "K", pdf_new_bool(doc, knockout));
- pdf_dict_puts_drop(group, "I", pdf_new_bool(doc, isolated));
+ pdf_dict_puts_drop(ctx, group, "Type", pdf_new_name(ctx, doc, "Group"));
+ pdf_dict_puts_drop(ctx, group, "S", pdf_new_name(ctx, doc, "Transparency"));
+ pdf_dict_puts_drop(ctx, group, "K", pdf_new_bool(ctx, doc, knockout));
+ pdf_dict_puts_drop(ctx, group, "I", pdf_new_bool(ctx, doc, isolated));
if (!colorspace)
{}
else if (colorspace->n == 1)
- pdf_dict_puts_drop(group, "CS", pdf_new_name(doc, "DeviceGray"));
+ pdf_dict_puts_drop(ctx, group, "CS", pdf_new_name(ctx, doc, "DeviceGray"));
else if (colorspace->n == 4)
- pdf_dict_puts_drop(group, "CS", pdf_new_name(doc, "DeviceCMYK"));
+ pdf_dict_puts_drop(ctx, group, "CS", pdf_new_name(ctx, doc, "DeviceCMYK"));
else
- pdf_dict_puts_drop(group, "CS", pdf_new_name(doc, "DeviceRGB"));
- group_ref = pdev->groups[num].ref = pdf_new_ref(doc, group);
+ pdf_dict_puts_drop(ctx, group, "CS", pdf_new_name(ctx, doc, "DeviceRGB"));
+ group_ref = pdev->groups[num].ref = pdf_new_ref(ctx, doc, group);
}
fz_always(ctx)
{
- pdf_drop_obj(group);
+ pdf_drop_obj(ctx, group);
}
fz_catch(ctx)
{
@@ -834,18 +823,18 @@ pdf_dev_new_form(pdf_obj **form_ref, pdf_device *pdev, const fz_rect *bbox, int
/* Make us a new Forms object that points to that group, and change
* to writing into the buffer for that Forms object. */
- form = pdf_new_dict(doc, 4);
+ form = pdf_new_dict(ctx, doc, 4);
fz_try(ctx)
{
- pdf_dict_puts_drop(form, "Subtype", pdf_new_name(doc, "Form"));
- pdf_dict_puts(form, "Group", group_ref);
- pdf_dict_puts_drop(form, "FormType", pdf_new_int(doc, 1));
- pdf_dict_puts_drop(form, "BBox", pdf_new_rect(doc, bbox));
- *form_ref = pdf_new_ref(doc, form);
+ pdf_dict_puts_drop(ctx, form, "Subtype", pdf_new_name(ctx, doc, "Form"));
+ pdf_dict_puts(ctx, form, "Group", group_ref);
+ pdf_dict_puts_drop(ctx, form, "FormType", pdf_new_int(ctx, doc, 1));
+ pdf_dict_puts_drop(ctx, form, "BBox", pdf_new_rect(ctx, doc, bbox));
+ *form_ref = pdf_new_ref(ctx, doc, form);
}
fz_catch(ctx)
{
- pdf_drop_obj(form);
+ pdf_drop_obj(ctx, form);
fz_rethrow(ctx);
}
@@ -854,7 +843,7 @@ pdf_dev_new_form(pdf_obj **form_ref, pdf_device *pdev, const fz_rect *bbox, int
char text[32];
num = pdev->num_forms++;
snprintf(text, sizeof(text), "XObject/Fm%d", num);
- pdf_dict_putp(pdev->resources, text, *form_ref);
+ pdf_dict_putp(ctx, pdev->resources, text, *form_ref);
}
return num;
@@ -863,70 +852,70 @@ pdf_dev_new_form(pdf_obj **form_ref, pdf_device *pdev, const fz_rect *bbox, int
/* Entry points */
static void
-pdf_dev_fill_path(fz_device *dev, fz_path *path, int even_odd, const fz_matrix *ctm,
+pdf_dev_fill_path(fz_context *ctx, fz_device *dev, fz_path *path, int even_odd, const fz_matrix *ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
pdf_device *pdev = dev->user;
gstate *gs = CURRENT_GSTATE(pdev);
- pdf_dev_end_text(pdev);
- pdf_dev_alpha(pdev, alpha, 0);
- pdf_dev_color(pdev, colorspace, color, 0);
- pdf_dev_ctm(pdev, ctm);
- pdf_dev_path(pdev, path);
- fz_buffer_printf(dev->ctx, gs->buf, (even_odd ? "f*\n" : "f\n"));
+ pdf_dev_end_text(ctx, pdev);
+ pdf_dev_alpha(ctx, pdev, alpha, 0);
+ pdf_dev_color(ctx, pdev, colorspace, color, 0);
+ pdf_dev_ctm(ctx, pdev, ctm);
+ pdf_dev_path(ctx, pdev, path);
+ fz_buffer_printf(ctx, gs->buf, (even_odd ? "f*\n" : "f\n"));
}
static void
-pdf_dev_stroke_path(fz_device *dev, fz_path *path, fz_stroke_state *stroke, const fz_matrix *ctm,
+pdf_dev_stroke_path(fz_context *ctx, fz_device *dev, fz_path *path, fz_stroke_state *stroke, const fz_matrix *ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
pdf_device *pdev = dev->user;
gstate *gs = CURRENT_GSTATE(pdev);
- pdf_dev_end_text(pdev);
- pdf_dev_alpha(pdev, alpha, 1);
- pdf_dev_color(pdev, colorspace, color, 1);
- pdf_dev_ctm(pdev, ctm);
- pdf_dev_stroke_state(pdev, stroke);
- pdf_dev_path(pdev, path);
- fz_buffer_printf(dev->ctx, gs->buf, "S\n");
+ pdf_dev_end_text(ctx, pdev);
+ pdf_dev_alpha(ctx, pdev, alpha, 1);
+ pdf_dev_color(ctx, pdev, colorspace, color, 1);
+ pdf_dev_ctm(ctx, pdev, ctm);
+ pdf_dev_stroke_state(ctx, pdev, stroke);
+ pdf_dev_path(ctx, pdev, path);
+ fz_buffer_printf(ctx, gs->buf, "S\n");
}
static void
-pdf_dev_clip_path(fz_device *dev, fz_path *path, const fz_rect *rect, int even_odd, const fz_matrix *ctm)
+pdf_dev_clip_path(fz_context *ctx, fz_device *dev, fz_path *path, const fz_rect *rect, int even_odd, const fz_matrix *ctm)
{
pdf_device *pdev = dev->user;
gstate *gs;
- pdf_dev_end_text(pdev);
- pdf_dev_push(pdev);
- pdf_dev_ctm(pdev, ctm);
- pdf_dev_path(pdev, path);
+ pdf_dev_end_text(ctx, pdev);
+ pdf_dev_push(ctx, pdev);
+ pdf_dev_ctm(ctx, pdev, ctm);
+ pdf_dev_path(ctx, pdev, path);
gs = CURRENT_GSTATE(pdev);
- fz_buffer_printf(dev->ctx, gs->buf, (even_odd ? "W* n\n" : "W n\n"));
+ fz_buffer_printf(ctx, gs->buf, (even_odd ? "W* n\n" : "W n\n"));
}
static void
-pdf_dev_clip_stroke_path(fz_device *dev, fz_path *path, const fz_rect *rect, fz_stroke_state *stroke, const fz_matrix *ctm)
+pdf_dev_clip_stroke_path(fz_context *ctx, fz_device *dev, fz_path *path, const fz_rect *rect, fz_stroke_state *stroke, const fz_matrix *ctm)
{
pdf_device *pdev = dev->user;
gstate *gs;
- pdf_dev_end_text(pdev);
- pdf_dev_push(pdev);
+ pdf_dev_end_text(ctx, pdev);
+ pdf_dev_push(ctx, pdev);
/* FIXME: Need to push a group, select a pattern (or shading) here,
* stroke with the pattern/shading. Then move to defining that pattern
* with the next calls to the device interface until the next pop
* when we pop the group. */
- pdf_dev_ctm(pdev, ctm);
- pdf_dev_path(pdev, path);
+ pdf_dev_ctm(ctx, pdev, ctm);
+ pdf_dev_path(ctx, pdev, path);
gs = CURRENT_GSTATE(pdev);
- fz_buffer_printf(dev->ctx, gs->buf, "W n\n");
+ fz_buffer_printf(ctx, gs->buf, "W n\n");
}
static void
-pdf_dev_fill_text(fz_device *dev, fz_text *text, const fz_matrix *ctm,
+pdf_dev_fill_text(fz_context *ctx, fz_device *dev, fz_text *text, const fz_matrix *ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
pdf_device *pdev = dev->user;
@@ -935,16 +924,16 @@ pdf_dev_fill_text(fz_device *dev, fz_text *text, const fz_matrix *ctm,
fz_pre_scale(&trm, 1/size, 1/size);
- pdf_dev_begin_text(pdev, &trm, 0);
- pdf_dev_font(pdev, text->font, size);
- pdf_dev_ctm(pdev, ctm);
- pdf_dev_alpha(pdev, alpha, 0);
- pdf_dev_color(pdev, colorspace, color, 0);
- pdf_dev_text(pdev, text, size);
+ pdf_dev_begin_text(ctx, pdev, &trm, 0);
+ pdf_dev_font(ctx, pdev, text->font, size);
+ pdf_dev_ctm(ctx, pdev, ctm);
+ pdf_dev_alpha(ctx, pdev, alpha, 0);
+ pdf_dev_color(ctx, pdev, colorspace, color, 0);
+ pdf_dev_text(ctx, pdev, text, size);
}
static void
-pdf_dev_stroke_text(fz_device *dev, fz_text *text, fz_stroke_state *stroke, const fz_matrix *ctm,
+pdf_dev_stroke_text(fz_context *ctx, fz_device *dev, fz_text *text, fz_stroke_state *stroke, const fz_matrix *ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
pdf_device *pdev = dev->user;
@@ -953,16 +942,16 @@ pdf_dev_stroke_text(fz_device *dev, fz_text *text, fz_stroke_state *stroke, cons
fz_pre_scale(&trm, 1/size, 1/size);
- pdf_dev_begin_text(pdev, &text->trm, 1);
- pdf_dev_font(pdev, text->font, 1);
- pdf_dev_ctm(pdev, ctm);
- pdf_dev_alpha(pdev, alpha, 1);
- pdf_dev_color(pdev, colorspace, color, 1);
- pdf_dev_text(pdev, text, size);
+ pdf_dev_begin_text(ctx, pdev, &text->trm, 1);
+ pdf_dev_font(ctx, pdev, text->font, 1);
+ pdf_dev_ctm(ctx, pdev, ctm);
+ pdf_dev_alpha(ctx, pdev, alpha, 1);
+ pdf_dev_color(ctx, pdev, colorspace, color, 1);
+ pdf_dev_text(ctx, pdev, text, size);
}
static void
-pdf_dev_clip_text(fz_device *dev, fz_text *text, const fz_matrix *ctm, int accumulate)
+pdf_dev_clip_text(fz_context *ctx, fz_device *dev, fz_text *text, const fz_matrix *ctm, int accumulate)
{
pdf_device *pdev = dev->user;
fz_matrix trm = text->trm;
@@ -970,14 +959,14 @@ pdf_dev_clip_text(fz_device *dev, fz_text *text, const fz_matrix *ctm, int accum
fz_pre_scale(&trm, 1/size, 1/size);
- pdf_dev_begin_text(pdev, &text->trm, 0);
- pdf_dev_ctm(pdev, ctm);
- pdf_dev_font(pdev, text->font, 7);
- pdf_dev_text(pdev, text, size);
+ pdf_dev_begin_text(ctx, pdev, &text->trm, 0);
+ pdf_dev_ctm(ctx, pdev, ctm);
+ pdf_dev_font(ctx, pdev, text->font, 7);
+ pdf_dev_text(ctx, pdev, text, size);
}
static void
-pdf_dev_clip_stroke_text(fz_device *dev, fz_text *text, fz_stroke_state *stroke, const fz_matrix *ctm)
+pdf_dev_clip_stroke_text(fz_context *ctx, fz_device *dev, fz_text *text, fz_stroke_state *stroke, const fz_matrix *ctm)
{
pdf_device *pdev = dev->user;
fz_matrix trm = text->trm;
@@ -985,14 +974,14 @@ pdf_dev_clip_stroke_text(fz_device *dev, fz_text *text, fz_stroke_state *stroke,
fz_pre_scale(&trm, 1/size, 1/size);
- pdf_dev_begin_text(pdev, &text->trm, 0);
- pdf_dev_font(pdev, text->font, 5);
- pdf_dev_ctm(pdev, ctm);
- pdf_dev_text(pdev, text, size);
+ pdf_dev_begin_text(ctx, pdev, &text->trm, 0);
+ pdf_dev_font(ctx, pdev, text->font, 5);
+ pdf_dev_ctm(ctx, pdev, ctm);
+ pdf_dev_text(ctx, pdev, text, size);
}
static void
-pdf_dev_ignore_text(fz_device *dev, fz_text *text, const fz_matrix *ctm)
+pdf_dev_ignore_text(fz_context *ctx, fz_device *dev, fz_text *text, const fz_matrix *ctm)
{
pdf_device *pdev = dev->user;
fz_matrix trm = text->trm;
@@ -1000,86 +989,85 @@ pdf_dev_ignore_text(fz_device *dev, fz_text *text, const fz_matrix *ctm)
fz_pre_scale(&trm, 1/size, 1/size);
- pdf_dev_begin_text(pdev, &text->trm, 0);
- pdf_dev_ctm(pdev, ctm);
- pdf_dev_font(pdev, text->font, 3);
- pdf_dev_text(pdev, text, size);
+ pdf_dev_begin_text(ctx, pdev, &text->trm, 0);
+ pdf_dev_ctm(ctx, pdev, ctm);
+ pdf_dev_font(ctx, pdev, text->font, 3);
+ pdf_dev_text(ctx, pdev, text, size);
}
static void
-pdf_dev_fill_image(fz_device *dev, fz_image *image, const fz_matrix *ctm, float alpha)
+pdf_dev_fill_image(fz_context *ctx, fz_device *dev, fz_image *image, const fz_matrix *ctm, float alpha)
{
- pdf_device *pdev = (pdf_device *)dev->user;
+ pdf_device *pdev = dev->user;
int num;
gstate *gs = CURRENT_GSTATE(pdev);
fz_matrix local_ctm = *ctm;
- pdf_dev_end_text(pdev);
- num = send_image(pdev, image, 0, 0);
- pdf_dev_alpha(pdev, alpha, 0);
+ pdf_dev_end_text(ctx, pdev);
+ num = send_image(ctx, pdev, image, 0, 0);
+ pdf_dev_alpha(ctx, pdev, alpha, 0);
/* PDF images are upside down, so fiddle the ctm */
fz_pre_scale(&local_ctm, 1, -1);
fz_pre_translate(&local_ctm, 0, -1);
- pdf_dev_ctm(pdev, &local_ctm);
- fz_buffer_printf(dev->ctx, gs->buf, "/Img%d Do\n", num);
+ pdf_dev_ctm(ctx, pdev, &local_ctm);
+ fz_buffer_printf(ctx, gs->buf, "/Img%d Do\n", num);
}
static void
-pdf_dev_fill_shade(fz_device *dev, fz_shade *shade, const fz_matrix *ctm, float alpha)
+pdf_dev_fill_shade(fz_context *ctx, fz_device *dev, fz_shade *shade, const fz_matrix *ctm, float alpha)
{
- pdf_device *pdev = (pdf_device *)dev->user;
+ pdf_device *pdev = dev->user;
/* FIXME */
- pdf_dev_end_text(pdev);
+ pdf_dev_end_text(ctx, pdev);
}
static void
-pdf_dev_fill_image_mask(fz_device *dev, fz_image *image, const fz_matrix *ctm,
+pdf_dev_fill_image_mask(fz_context *ctx, fz_device *dev, fz_image *image, const fz_matrix *ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
- pdf_device *pdev = (pdf_device *)dev->user;
+ pdf_device *pdev = dev->user;
gstate *gs = CURRENT_GSTATE(pdev);
int num;
fz_matrix local_ctm = *ctm;
- pdf_dev_end_text(pdev);
- num = send_image(pdev, image, 1, 0);
- fz_buffer_printf(dev->ctx, gs->buf, "q\n");
- pdf_dev_alpha(pdev, alpha, 0);
- pdf_dev_color(pdev, colorspace, color, 0);
+ pdf_dev_end_text(ctx, pdev);
+ num = send_image(ctx, pdev, image, 1, 0);
+ fz_buffer_printf(ctx, gs->buf, "q\n");
+ pdf_dev_alpha(ctx, pdev, alpha, 0);
+ pdf_dev_color(ctx, pdev, colorspace, color, 0);
/* PDF images are upside down, so fiddle the ctm */
fz_pre_scale(&local_ctm, 1, -1);
fz_pre_translate(&local_ctm, 0, -1);
- pdf_dev_ctm(pdev, &local_ctm);
- fz_buffer_printf(dev->ctx, gs->buf, "/Img%d Do Q\n", num);
+ pdf_dev_ctm(ctx, pdev, &local_ctm);
+ fz_buffer_printf(ctx, gs->buf, "/Img%d Do Q\n", num);
}
static void
-pdf_dev_clip_image_mask(fz_device *dev, fz_image *image, const fz_rect *rect, const fz_matrix *ctm)
+pdf_dev_clip_image_mask(fz_context *ctx, fz_device *dev, fz_image *image, const fz_rect *rect, const fz_matrix *ctm)
{
- pdf_device *pdev = (pdf_device *)dev->user;
+ pdf_device *pdev = dev->user;
/* FIXME */
- pdf_dev_end_text(pdev);
- pdf_dev_push(pdev);
+ pdf_dev_end_text(ctx, pdev);
+ pdf_dev_push(ctx, pdev);
}
static void
-pdf_dev_pop_clip(fz_device *dev)
+pdf_dev_pop_clip(fz_context *ctx, fz_device *dev)
{
- pdf_device *pdev = (pdf_device *)dev->user;
+ pdf_device *pdev = dev->user;
/* FIXME */
- pdf_dev_end_text(pdev);
- pdf_dev_pop(pdev);
+ pdf_dev_end_text(ctx, pdev);
+ pdf_dev_pop(ctx, pdev);
}
static void
-pdf_dev_begin_mask(fz_device *dev, const fz_rect *bbox, int luminosity, fz_colorspace *colorspace, float *color)
+pdf_dev_begin_mask(fz_context *ctx, fz_device *dev, const fz_rect *bbox, int luminosity, fz_colorspace *colorspace, float *color)
{
- pdf_device *pdev = (pdf_device *)dev->user;
+ pdf_device *pdev = dev->user;
pdf_document *doc = pdev->doc;
- fz_context *ctx = pdev->ctx;
gstate *gs;
pdf_obj *smask = NULL;
pdf_obj *egs = NULL;
@@ -1092,163 +1080,159 @@ pdf_dev_begin_mask(fz_device *dev, const fz_rect *bbox, int luminosity, fz_color
fz_var(egs);
fz_var(color_obj);
- pdf_dev_end_text(pdev);
+ pdf_dev_end_text(ctx, pdev);
/* Make a new form to contain the contents of the softmask */
- pdf_dev_new_form(&form_ref, pdev, bbox, 0, 0, 1, colorspace);
+ pdf_dev_new_form(ctx, &form_ref, pdev, bbox, 0, 0, 1, colorspace);
fz_try(ctx)
{
- smask = pdf_new_dict(doc, 4);
- pdf_dict_puts_drop(smask, "Type", pdf_new_name(doc, "Mask"));
- pdf_dict_puts_drop(smask, "S", pdf_new_name(doc, (luminosity ? "Luminosity" : "Alpha")));
- pdf_dict_puts(smask, "G", form_ref);
- color_obj = pdf_new_array(doc, colorspace->n);
+ smask = pdf_new_dict(ctx, doc, 4);
+ pdf_dict_puts_drop(ctx, smask, "Type", pdf_new_name(ctx, doc, "Mask"));
+ pdf_dict_puts_drop(ctx, smask, "S", pdf_new_name(ctx, doc, (luminosity ? "Luminosity" : "Alpha")));
+ pdf_dict_puts(ctx, smask, "G", form_ref);
+ color_obj = pdf_new_array(ctx, doc, colorspace->n);
for (i = 0; i < colorspace->n; i++)
- pdf_array_push(color_obj, pdf_new_real(doc, color[i]));
- pdf_dict_puts_drop(smask, "BC", color_obj);
+ pdf_array_push(ctx, color_obj, pdf_new_real(ctx, doc, color[i]));
+ pdf_dict_puts_drop(ctx, smask, "BC", color_obj);
color_obj = NULL;
- egs = pdf_new_dict(doc, 5);
- pdf_dict_puts_drop(egs, "Type", pdf_new_name(doc, "ExtGState"));
- pdf_dict_puts_drop(egs, "SMask", pdf_new_ref(doc, smask));
- egs_ref = pdf_new_ref(doc, egs);
+ egs = pdf_new_dict(ctx, doc, 5);
+ pdf_dict_puts_drop(ctx, egs, "Type", pdf_new_name(ctx, doc, "ExtGState"));
+ pdf_dict_puts_drop(ctx, egs, "SMask", pdf_new_ref(ctx, doc, smask));
+ egs_ref = pdf_new_ref(ctx, doc, egs);
{
char text[32];
snprintf(text, sizeof(text), "ExtGState/SM%d", pdev->num_smasks++);
- pdf_dict_putp(pdev->resources, text, egs_ref);
- pdf_drop_obj(egs_ref);
+ pdf_dict_putp(ctx, pdev->resources, text, egs_ref);
+ pdf_drop_obj(ctx, egs_ref);
}
gs = CURRENT_GSTATE(pdev);
- fz_buffer_printf(dev->ctx, gs->buf, "/SM%d gs\n", pdev->num_smasks-1);
+ fz_buffer_printf(ctx, gs->buf, "/SM%d gs\n", pdev->num_smasks-1);
}
fz_always(ctx)
{
- pdf_drop_obj(smask);
+ pdf_drop_obj(ctx, smask);
}
fz_catch(ctx)
{
- pdf_drop_obj(form_ref);
- pdf_drop_obj(color_obj);
+ pdf_drop_obj(ctx, form_ref);
+ pdf_drop_obj(ctx, color_obj);
fz_rethrow(ctx);
}
/* Now, everything we get until the end_mask needs to go into a
* new buffer, which will be the stream contents for the form. */
- pdf_dev_push_new_buf(pdev, fz_new_buffer(ctx, 1024), NULL, form_ref);
+ pdf_dev_push_new_buf(ctx, pdev, fz_new_buffer(ctx, 1024), NULL, form_ref);
}
static void
-pdf_dev_end_mask(fz_device *dev)
+pdf_dev_end_mask(fz_context *ctx, fz_device *dev)
{
- pdf_device *pdev = (pdf_device *)dev->user;
+ pdf_device *pdev = dev->user;
pdf_document *doc = pdev->doc;
- fz_context *ctx = pdev->ctx;
gstate *gs = CURRENT_GSTATE(pdev);
fz_buffer *buf = fz_keep_buffer(ctx, gs->buf);
pdf_obj *form_ref = (pdf_obj *)gs->on_pop_arg;
/* Here we do part of the pop, but not all of it. */
- pdf_dev_end_text(pdev);
+ pdf_dev_end_text(ctx, pdev);
fz_buffer_printf(ctx, buf, "Q\n");
- pdf_dict_puts_drop(form_ref, "Length", pdf_new_int(doc, buf->len));
- pdf_update_stream(doc, pdf_to_num(form_ref), buf);
+ pdf_dict_puts_drop(ctx, form_ref, "Length", pdf_new_int(ctx, doc, buf->len));
+ pdf_update_stream(ctx, doc, pdf_to_num(ctx, form_ref), buf);
fz_drop_buffer(ctx, buf);
gs->buf = fz_keep_buffer(ctx, gs[-1].buf);
gs->on_pop_arg = NULL;
- pdf_drop_obj(form_ref);
+ pdf_drop_obj(ctx, form_ref);
fz_buffer_printf(ctx, gs->buf, "q\n");
}
static void
-pdf_dev_begin_group(fz_device *dev, const fz_rect *bbox, int isolated, int knockout, int blendmode, float alpha)
+pdf_dev_begin_group(fz_context *ctx, fz_device *dev, const fz_rect *bbox, int isolated, int knockout, int blendmode, float alpha)
{
- pdf_device *pdev = (pdf_device *)dev->user;
- fz_context *ctx = pdev->ctx;
+ pdf_device *pdev = dev->user;
pdf_document *doc = pdev->doc;
int num;
pdf_obj *form_ref;
gstate *gs;
- pdf_dev_end_text(pdev);
+ pdf_dev_end_text(ctx, pdev);
- num = pdf_dev_new_form(&form_ref, pdev, bbox, isolated, knockout, alpha, NULL);
+ num = pdf_dev_new_form(ctx, &form_ref, pdev, bbox, isolated, knockout, alpha, NULL);
/* Do we have an appropriate blending extgstate already? */
{
char text[32];
pdf_obj *obj;
snprintf(text, sizeof(text), "ExtGState/BlendMode%d", blendmode);
- obj = pdf_dict_getp(pdev->resources, text);
+ obj = pdf_dict_getp(ctx, pdev->resources, text);
if (obj == NULL)
{
/* No, better make one */
- obj = pdf_new_dict(pdev->doc, 2);
- pdf_dict_puts_drop(obj, "Type", pdf_new_name(doc, "ExtGState"));
- pdf_dict_puts_drop(obj, "BM", pdf_new_name(doc, fz_blendmode_name(blendmode)));
- pdf_dict_putp_drop(pdev->resources, text, obj);
+ obj = pdf_new_dict(ctx, doc, 2);
+ pdf_dict_puts_drop(ctx, obj, "Type", pdf_new_name(ctx, doc, "ExtGState"));
+ pdf_dict_puts_drop(ctx, obj, "BM", pdf_new_name(ctx, doc, fz_blendmode_name(blendmode)));
+ pdf_dict_putp_drop(ctx, pdev->resources, text, obj);
}
}
/* Add the call to this group */
gs = CURRENT_GSTATE(pdev);
- fz_buffer_printf(dev->ctx, gs->buf, "/BlendMode%d gs /Fm%d Do\n", blendmode, num);
+ fz_buffer_printf(ctx, gs->buf, "/BlendMode%d gs /Fm%d Do\n", blendmode, num);
/* Now, everything we get until the end of group needs to go into a
* new buffer, which will be the stream contents for the form. */
- pdf_dev_push_new_buf(pdev, fz_new_buffer(ctx, 1024), NULL, form_ref);
+ pdf_dev_push_new_buf(ctx, pdev, fz_new_buffer(ctx, 1024), NULL, form_ref);
}
static void
-pdf_dev_end_group(fz_device *dev)
+pdf_dev_end_group(fz_context *ctx, fz_device *dev)
{
- pdf_device *pdev = (pdf_device *)dev->user;
+ pdf_device *pdev = dev->user;
pdf_document *doc = pdev->doc;
gstate *gs = CURRENT_GSTATE(pdev);
- fz_context *ctx = pdev->ctx;
fz_buffer *buf = fz_keep_buffer(ctx, gs->buf);
pdf_obj *form_ref;
- pdf_dev_end_text(pdev);
- form_ref = (pdf_obj *)pdf_dev_pop(pdev);
- pdf_dict_puts_drop(form_ref, "Length", pdf_new_int(doc, gs->buf->len));
- pdf_update_stream(doc, pdf_to_num(form_ref), buf);
+ pdf_dev_end_text(ctx, pdev);
+ form_ref = (pdf_obj *)pdf_dev_pop(ctx, pdev);
+ pdf_dict_puts_drop(ctx, form_ref, "Length", pdf_new_int(ctx, doc, gs->buf->len));
+ pdf_update_stream(ctx, doc, pdf_to_num(ctx, form_ref), buf);
fz_drop_buffer(ctx, buf);
- pdf_drop_obj(form_ref);
+ pdf_drop_obj(ctx, form_ref);
}
static int
-pdf_dev_begin_tile(fz_device *dev, const fz_rect *area, const fz_rect *view, float xstep, float ystep, const fz_matrix *ctm, int id)
+pdf_dev_begin_tile(fz_context *ctx, fz_device *dev, const fz_rect *area, const fz_rect *view, float xstep, float ystep, const fz_matrix *ctm, int id)
{
- pdf_device *pdev = (pdf_device *)dev->user;
+ pdf_device *pdev = dev->user;
/* FIXME */
- pdf_dev_end_text(pdev);
+ pdf_dev_end_text(ctx, pdev);
return 0;
}
static void
-pdf_dev_end_tile(fz_device *dev)
+pdf_dev_end_tile(fz_context *ctx, fz_device *dev)
{
- pdf_device *pdev = (pdf_device *)dev->user;
+ pdf_device *pdev = dev->user;
/* FIXME */
- pdf_dev_end_text(pdev);
+ pdf_dev_end_text(ctx, pdev);
}
static void
-pdf_dev_drop_user(fz_device *dev)
+pdf_dev_drop_user(fz_context *ctx, fz_device *dev)
{
pdf_device *pdev = dev->user;
pdf_document *doc = pdev->doc;
- fz_context *ctx = pdev->ctx;
gstate *gs = CURRENT_GSTATE(pdev);
int i;
- pdf_dev_end_text(pdev);
+ pdf_dev_end_text(ctx, pdev);
- pdf_dict_puts_drop(pdev->contents, "Length", pdf_new_int(doc, gs->buf->len));
+ pdf_dict_puts_drop(ctx, pdev->contents, "Length", pdf_new_int(ctx, doc, gs->buf->len));
for (i = pdev->num_gstates-1; i >= 0; i--)
{
@@ -1262,14 +1246,14 @@ pdf_dev_drop_user(fz_device *dev)
for (i = pdev->num_imgs-1; i >= 0; i--)
{
- pdf_drop_obj(pdev->images[i].ref);
+ pdf_drop_obj(ctx, pdev->images[i].ref);
}
- pdf_update_stream(doc, pdf_to_num(pdev->contents), pdev->gstates[0].buf);
+ pdf_update_stream(ctx, doc, pdf_to_num(ctx, pdev->contents), pdev->gstates[0].buf);
fz_drop_buffer(ctx, pdev->gstates[0].buf);
- pdf_drop_obj(pdev->contents);
- pdf_drop_obj(pdev->resources);
+ pdf_drop_obj(ctx, pdev->contents);
+ pdf_drop_obj(ctx, pdev->resources);
fz_free(ctx, pdev->images);
fz_free(ctx, pdev->alphas);
@@ -1277,26 +1261,16 @@ pdf_dev_drop_user(fz_device *dev)
fz_free(ctx, pdev);
}
-static void
-pdf_dev_rebind(fz_device *dev)
-{
- pdf_device *pdev = dev->user;
-
- fz_rebind_document((fz_document *)pdev->doc, dev->ctx);
-}
-
-fz_device *pdf_new_pdf_device(pdf_document *doc, pdf_obj *contents, pdf_obj *resources, const fz_matrix *ctm)
+fz_device *pdf_new_pdf_device(fz_context *ctx, pdf_document *doc, pdf_obj *contents, pdf_obj *resources, const fz_matrix *ctm)
{
- fz_context *ctx = doc->ctx;
pdf_device *pdev = fz_malloc_struct(ctx, pdf_device);
fz_device *dev;
fz_try(ctx)
{
- pdev->ctx = ctx;
pdev->doc = doc;
- pdev->contents = pdf_keep_obj(contents);
- pdev->resources = pdf_keep_obj(resources);
+ pdev->contents = pdf_keep_obj(ctx, contents);
+ pdev->resources = pdf_keep_obj(ctx, resources);
pdev->gstates = fz_malloc_struct(ctx, gstate);
pdev->gstates[0].buf = fz_new_buffer(ctx, 256);
pdev->gstates[0].ctm = *ctm;
@@ -1321,7 +1295,6 @@ fz_device *pdf_new_pdf_device(pdf_document *doc, pdf_obj *contents, pdf_obj *res
fz_rethrow(ctx);
}
- dev->rebind = pdf_dev_rebind;
dev->drop_user = pdf_dev_drop_user;
dev->fill_path = pdf_dev_fill_path;
@@ -1353,30 +1326,29 @@ fz_device *pdf_new_pdf_device(pdf_document *doc, pdf_obj *contents, pdf_obj *res
return dev;
}
-fz_device *pdf_page_write(pdf_document *doc, pdf_page *page)
+fz_device *pdf_page_write(fz_context *ctx, pdf_document *doc, pdf_page *page)
{
- fz_context *ctx = doc->ctx;
- pdf_obj *resources = pdf_dict_gets(page->me, "Resources");
+ pdf_obj *resources = pdf_dict_gets(ctx, page->me, "Resources");
fz_matrix ctm;
fz_pre_translate(fz_scale(&ctm, 1, -1), 0, page->mediabox.y0-page->mediabox.y1);
if (resources == NULL)
{
- resources = pdf_new_dict(doc, 0);
- pdf_dict_puts_drop(page->me, "Resources", resources);
+ resources = pdf_new_dict(ctx, doc, 0);
+ pdf_dict_puts_drop(ctx, page->me, "Resources", resources);
}
if (page->contents == NULL)
{
- pdf_obj *obj = pdf_new_dict(doc, 0);
+ pdf_obj *obj = pdf_new_dict(ctx, doc, 0);
fz_try(ctx)
{
- page->contents = pdf_new_ref(doc, obj);
- pdf_dict_puts(page->me, "Contents", page->contents);
+ page->contents = pdf_new_ref(ctx, doc, obj);
+ pdf_dict_puts(ctx, page->me, "Contents", page->contents);
}
fz_always(ctx)
{
- pdf_drop_obj(obj);
+ pdf_drop_obj(ctx, obj);
}
fz_catch(ctx)
{
@@ -1384,5 +1356,5 @@ fz_device *pdf_page_write(pdf_document *doc, pdf_page *page)
}
}
- return pdf_new_pdf_device(doc, page->contents, resources, &ctm);
+ return pdf_new_pdf_device(ctx, doc, page->contents, resources, &ctm);
}
diff --git a/source/pdf/pdf-event.c b/source/pdf/pdf-event.c
index dc908985..b031dd72 100644
--- a/source/pdf/pdf-event.c
+++ b/source/pdf/pdf-event.c
@@ -7,7 +7,7 @@ typedef struct
pdf_alert_event alert;
} pdf_alert_event_internal;
-pdf_alert_event *pdf_access_alert_event(pdf_doc_event *event)
+pdf_alert_event *pdf_access_alert_event(fz_context *ctx, pdf_doc_event *event)
{
pdf_alert_event *alert = NULL;
@@ -17,7 +17,7 @@ pdf_alert_event *pdf_access_alert_event(pdf_doc_event *event)
return alert;
}
-void pdf_event_issue_alert(pdf_document *doc, pdf_alert_event *alert)
+void pdf_event_issue_alert(fz_context *ctx, pdf_document *doc, pdf_alert_event *alert)
{
if (doc->event_cb)
{
@@ -25,20 +25,20 @@ void pdf_event_issue_alert(pdf_document *doc, pdf_alert_event *alert)
ievent.base.type = PDF_DOCUMENT_EVENT_ALERT;
ievent.alert = *alert;
- doc->event_cb((pdf_doc_event *)&ievent, doc->event_cb_data);
+ doc->event_cb(ctx, doc, (pdf_doc_event *)&ievent, doc->event_cb_data);
*alert = ievent.alert;
}
}
-void pdf_event_issue_print(pdf_document *doc)
+void pdf_event_issue_print(fz_context *ctx, pdf_document *doc)
{
pdf_doc_event e;
e.type = PDF_DOCUMENT_EVENT_PRINT;
if (doc->event_cb)
- doc->event_cb(&e, doc->event_cb_data);
+ doc->event_cb(ctx, doc, &e, doc->event_cb_data);
}
typedef struct
@@ -47,7 +47,7 @@ typedef struct
char *item;
} pdf_exec_menu_item_event_internal;
-char *pdf_access_exec_menu_item_event(pdf_doc_event *event)
+char *pdf_access_exec_menu_item_event(fz_context *ctx, pdf_doc_event *event)
{
char *item = NULL;
@@ -57,7 +57,7 @@ char *pdf_access_exec_menu_item_event(pdf_doc_event *event)
return item;
}
-void pdf_event_issue_exec_menu_item(pdf_document *doc, char *item)
+void pdf_event_issue_exec_menu_item(fz_context *ctx, pdf_document *doc, char *item)
{
if (doc->event_cb)
{
@@ -65,18 +65,18 @@ void pdf_event_issue_exec_menu_item(pdf_document *doc, char *item)
ievent.base.type = PDF_DOCUMENT_EVENT_EXEC_MENU_ITEM;
ievent.item = item;
- doc->event_cb((pdf_doc_event *)&ievent, doc->event_cb_data);
+ doc->event_cb(ctx, doc, (pdf_doc_event *)&ievent, doc->event_cb_data);
}
}
-void pdf_event_issue_exec_dialog(pdf_document *doc)
+void pdf_event_issue_exec_dialog(fz_context *ctx, pdf_document *doc)
{
pdf_doc_event e;
e.type = PDF_DOCUMENT_EVENT_EXEC_DIALOG;
if (doc->event_cb)
- doc->event_cb(&e, doc->event_cb_data);
+ doc->event_cb(ctx, doc, &e, doc->event_cb_data);
}
typedef struct
@@ -85,7 +85,7 @@ typedef struct
pdf_launch_url_event launch_url;
} pdf_launch_url_event_internal;
-pdf_launch_url_event *pdf_access_launch_url_event(pdf_doc_event *event)
+pdf_launch_url_event *pdf_access_launch_url_event(fz_context *ctx, pdf_doc_event *event)
{
pdf_launch_url_event *launch_url = NULL;
@@ -95,7 +95,7 @@ pdf_launch_url_event *pdf_access_launch_url_event(pdf_doc_event *event)
return launch_url;
}
-void pdf_event_issue_launch_url(pdf_document *doc, char *url, int new_frame)
+void pdf_event_issue_launch_url(fz_context *ctx, pdf_document *doc, char *url, int new_frame)
{
if (doc->event_cb)
{
@@ -104,7 +104,7 @@ void pdf_event_issue_launch_url(pdf_document *doc, char *url, int new_frame)
e.base.type = PDF_DOCUMENT_EVENT_LAUNCH_URL;
e.launch_url.url = url;
e.launch_url.new_frame = new_frame;
- doc->event_cb((pdf_doc_event *)&e, doc->event_cb_data);
+ doc->event_cb(ctx, doc, (pdf_doc_event *)&e, doc->event_cb_data);
}
}
@@ -114,7 +114,7 @@ typedef struct
pdf_mail_doc_event mail_doc;
} pdf_mail_doc_event_internal;
-pdf_mail_doc_event *pdf_access_mail_doc_event(pdf_doc_event *event)
+pdf_mail_doc_event *pdf_access_mail_doc_event(fz_context *ctx, pdf_doc_event *event)
{
pdf_mail_doc_event *mail_doc = NULL;
@@ -124,7 +124,7 @@ pdf_mail_doc_event *pdf_access_mail_doc_event(pdf_doc_event *event)
return mail_doc;
}
-void pdf_event_issue_mail_doc(pdf_document *doc, pdf_mail_doc_event *event)
+void pdf_event_issue_mail_doc(fz_context *ctx, pdf_document *doc, pdf_mail_doc_event *event)
{
if (doc->event_cb)
{
@@ -133,11 +133,11 @@ void pdf_event_issue_mail_doc(pdf_document *doc, pdf_mail_doc_event *event)
e.base.type = PDF_DOCUMENT_EVENT_MAIL_DOC;
e.mail_doc = *event;
- doc->event_cb((pdf_doc_event *)&e, doc->event_cb_data);
+ doc->event_cb(ctx, doc, (pdf_doc_event *)&e, doc->event_cb_data);
}
}
-void pdf_set_doc_event_callback(pdf_document *doc, pdf_doc_event_cb *fn, void *data)
+void pdf_set_doc_event_callback(fz_context *ctx, pdf_document *doc, pdf_doc_event_cb *fn, void *data)
{
doc->event_cb = fn;
doc->event_cb_data = data;
diff --git a/source/pdf/pdf-field.c b/source/pdf/pdf-field.c
index e8f2508f..5105125a 100644
--- a/source/pdf/pdf-field.c
+++ b/source/pdf/pdf-field.c
@@ -1,23 +1,22 @@
#include "mupdf/pdf.h"
-pdf_obj *pdf_get_inheritable(pdf_document *doc, pdf_obj *obj, char *key)
+pdf_obj *pdf_get_inheritable(fz_context *ctx, pdf_document *doc, pdf_obj *obj, char *key)
{
pdf_obj *fobj = NULL;
while (!fobj && obj)
{
- fobj = pdf_dict_gets(obj, key);
+ fobj = pdf_dict_gets(ctx, obj, key);
if (!fobj)
- obj = pdf_dict_gets(obj, "Parent");
+ obj = pdf_dict_gets(ctx, obj, "Parent");
}
- return fobj ? fobj : pdf_dict_gets(pdf_dict_gets(pdf_dict_gets(pdf_trailer(doc), "Root"), "AcroForm"), key);
+ return fobj ? fobj : pdf_dict_gets(ctx, pdf_dict_gets(ctx, pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Root"), "AcroForm"), key);
}
-char *pdf_get_string_or_stream(pdf_document *doc, pdf_obj *obj)
+char *pdf_get_string_or_stream(fz_context *ctx, pdf_document *doc, pdf_obj *obj)
{
- fz_context *ctx = doc->ctx;
int len = 0;
char *buf = NULL;
fz_buffer *strmbuf = NULL;
@@ -27,14 +26,14 @@ char *pdf_get_string_or_stream(pdf_document *doc, pdf_obj *obj)
fz_var(text);
fz_try(ctx)
{
- if (pdf_is_string(obj))
+ if (pdf_is_string(ctx, obj))
{
- len = pdf_to_str_len(obj);
- buf = pdf_to_str_buf(obj);
+ len = pdf_to_str_len(ctx, obj);
+ buf = pdf_to_str_buf(ctx, obj);
}
- else if (pdf_is_stream(doc, pdf_to_num(obj), pdf_to_gen(obj)))
+ else if (pdf_is_stream(ctx, doc, pdf_to_num(ctx, obj), pdf_to_gen(ctx, obj)))
{
- strmbuf = pdf_load_stream(doc, pdf_to_num(obj), pdf_to_gen(obj));
+ strmbuf = pdf_load_stream(ctx, doc, pdf_to_num(ctx, obj), pdf_to_gen(ctx, obj));
len = fz_buffer_storage(ctx, strmbuf, (unsigned char **)&buf);
}
@@ -58,25 +57,25 @@ char *pdf_get_string_or_stream(pdf_document *doc, pdf_obj *obj)
return text;
}
-char *pdf_field_value(pdf_document *doc, pdf_obj *field)
+char *pdf_field_value(fz_context *ctx, pdf_document *doc, pdf_obj *field)
{
- return pdf_get_string_or_stream(doc, pdf_get_inheritable(doc, field, "V"));
+ return pdf_get_string_or_stream(ctx, doc, pdf_get_inheritable(ctx, doc, field, "V"));
}
-int pdf_get_field_flags(pdf_document *doc, pdf_obj *obj)
+int pdf_get_field_flags(fz_context *ctx, pdf_document *doc, pdf_obj *obj)
{
- return pdf_to_int(pdf_get_inheritable(doc, obj, "Ff"));
+ return pdf_to_int(ctx, pdf_get_inheritable(ctx, doc, obj, "Ff"));
}
-static char *get_field_type_name(pdf_document *doc, pdf_obj *obj)
+static char *get_field_type_name(fz_context *ctx, pdf_document *doc, pdf_obj *obj)
{
- return pdf_to_name(pdf_get_inheritable(doc, obj, "FT"));
+ return pdf_to_name(ctx, pdf_get_inheritable(ctx, doc, obj, "FT"));
}
-int pdf_field_type(pdf_document *doc, pdf_obj *obj)
+int pdf_field_type(fz_context *ctx, pdf_document *doc, pdf_obj *obj)
{
- char *type = get_field_type_name(doc, obj);
- int flags = pdf_get_field_flags(doc, obj);
+ char *type = get_field_type_name(ctx, doc, obj);
+ int flags = pdf_get_field_flags(ctx, doc, obj);
if (!strcmp(type, "Btn"))
{
@@ -102,7 +101,7 @@ int pdf_field_type(pdf_document *doc, pdf_obj *obj)
return PDF_WIDGET_TYPE_NOT_WIDGET;
}
-void pdf_set_field_type(pdf_document *doc, pdf_obj *obj, int type)
+void pdf_set_field_type(fz_context *ctx, pdf_document *doc, pdf_obj *obj, int type)
{
int setbits = 0;
int clearbits = 0;
@@ -140,13 +139,13 @@ void pdf_set_field_type(pdf_document *doc, pdf_obj *obj, int type)
}
if (typename)
- pdf_dict_puts_drop(obj, "FT", pdf_new_name(doc, typename));
+ pdf_dict_puts_drop(ctx, obj, "FT", pdf_new_name(ctx, doc, typename));
if (setbits != 0 || clearbits != 0)
{
- int bits = pdf_to_int(pdf_dict_gets(obj, "Ff"));
+ int bits = pdf_to_int(ctx, pdf_dict_gets(ctx, obj, "Ff"));
bits &= ~clearbits;
bits |= setbits;
- pdf_dict_puts_drop(obj, "Ff", pdf_new_int(doc, bits));
+ pdf_dict_puts_drop(ctx, obj, "Ff", pdf_new_int(ctx, doc, bits));
}
}
diff --git a/source/pdf/pdf-font.c b/source/pdf/pdf-font.c
index a0ee8bee..5e3f1e19 100644
--- a/source/pdf/pdf-font.c
+++ b/source/pdf/pdf-font.c
@@ -4,7 +4,7 @@
#include FT_FREETYPE_H
#include FT_XFREE86_H
-static void pdf_load_font_descriptor(pdf_font_desc *fontdesc, pdf_document *doc, pdf_obj *dict, char *collection, char *basefont, int iscidfont);
+static void pdf_load_font_descriptor(fz_context *ctx, pdf_document *doc, pdf_font_desc *fontdesc, pdf_obj *dict, char *collection, char *basefont, int iscidfont);
static const char *base_font_names[][10] =
{
@@ -184,7 +184,7 @@ pdf_load_builtin_font(fz_context *ctx, pdf_font_desc *fontdesc, char *fontname,
unsigned char *data;
unsigned int len;
- data = pdf_lookup_builtin_font(clean_name, &len);
+ data = pdf_lookup_builtin_font(ctx, clean_name, &len);
if (!data)
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find builtin font: '%s'", fontname);
@@ -208,7 +208,7 @@ pdf_load_substitute_font(fz_context *ctx, pdf_font_desc *fontdesc, char *fontnam
unsigned char *data;
unsigned int len;
- data = pdf_lookup_substitute_font(mono, serif, bold, italic, &len);
+ data = pdf_lookup_substitute_font(ctx, mono, serif, bold, italic, &len);
if (!data)
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find substitute font");
@@ -230,7 +230,7 @@ pdf_load_substitute_cjk_font(fz_context *ctx, pdf_font_desc *fontdesc, char *fon
unsigned int len;
int index;
- data = pdf_lookup_substitute_cjk_font(ros, serif, fontdesc->wmode, &len, &index);
+ data = pdf_lookup_substitute_cjk_font(ctx, ros, serif, fontdesc->wmode, &len, &index);
if (!data)
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find builtin CJK font");
@@ -289,18 +289,17 @@ pdf_load_system_font(fz_context *ctx, pdf_font_desc *fontdesc, char *fontname, c
}
static void
-pdf_load_embedded_font(pdf_document *doc, pdf_font_desc *fontdesc, char *fontname, pdf_obj *stmref)
+pdf_load_embedded_font(fz_context *ctx, pdf_document *doc, pdf_font_desc *fontdesc, char *fontname, pdf_obj *stmref)
{
fz_buffer *buf;
- fz_context *ctx = doc->ctx;
fz_try(ctx)
{
- buf = pdf_load_stream(doc, pdf_to_num(stmref), pdf_to_gen(stmref));
+ buf = pdf_load_stream(ctx, doc, pdf_to_num(ctx, stmref), pdf_to_gen(ctx, stmref));
}
fz_catch(ctx)
{
- fz_rethrow_message(ctx, "cannot load font stream (%d %d R)", pdf_to_num(stmref), pdf_to_gen(stmref));
+ fz_rethrow_message(ctx, "cannot load font stream (%d %d R)", pdf_to_num(ctx, stmref), pdf_to_gen(ctx, stmref));
}
fz_try(ctx)
@@ -313,7 +312,7 @@ pdf_load_embedded_font(pdf_document *doc, pdf_font_desc *fontdesc, char *fontnam
}
fz_catch(ctx)
{
- fz_rethrow_message(ctx, "cannot load embedded font (%d %d R)", pdf_to_num(stmref), pdf_to_gen(stmref));
+ fz_rethrow_message(ctx, "cannot load embedded font (%d %d R)", pdf_to_num(ctx, stmref), pdf_to_gen(ctx, stmref));
}
fontdesc->size += buf->len;
@@ -413,7 +412,7 @@ pdf_new_font_desc(fz_context *ctx)
*/
static pdf_font_desc *
-pdf_load_simple_font_by_name(pdf_document *doc, pdf_obj *dict, char *basefont)
+pdf_load_simple_font_by_name(fz_context *ctx, pdf_document *doc, pdf_obj *dict, char *basefont)
{
pdf_obj *descriptor;
pdf_obj *encoding;
@@ -431,7 +430,6 @@ pdf_load_simple_font_by_name(pdf_document *doc, pdf_obj *dict, char *basefont)
int i, k, n;
int fterr;
int has_lock = 0;
- fz_context *ctx = doc->ctx;
fz_var(fontdesc);
fz_var(etable);
@@ -442,17 +440,17 @@ pdf_load_simple_font_by_name(pdf_document *doc, pdf_obj *dict, char *basefont)
{
fontdesc = pdf_new_font_desc(ctx);
- descriptor = pdf_dict_gets(dict, "FontDescriptor");
+ descriptor = pdf_dict_gets(ctx, dict, "FontDescriptor");
if (descriptor)
- pdf_load_font_descriptor(fontdesc, doc, descriptor, NULL, basefont, 0);
+ pdf_load_font_descriptor(ctx, doc, fontdesc, descriptor, NULL, basefont, 0);
else
pdf_load_builtin_font(ctx, fontdesc, basefont, 0);
/* Some chinese documents mistakenly consider WinAnsiEncoding to be codepage 936 */
- if (descriptor && pdf_is_string(pdf_dict_gets(descriptor, "FontName")) &&
- !pdf_dict_gets(dict, "ToUnicode") &&
- !strcmp(pdf_to_name(pdf_dict_gets(dict, "Encoding")), "WinAnsiEncoding") &&
- pdf_to_int(pdf_dict_gets(descriptor, "Flags")) == 4)
+ if (descriptor && pdf_is_string(ctx, pdf_dict_gets(ctx, descriptor, "FontName")) &&
+ !pdf_dict_gets(ctx, dict, "ToUnicode") &&
+ !strcmp(pdf_to_name(ctx, pdf_dict_gets(ctx, dict, "Encoding")), "WinAnsiEncoding") &&
+ pdf_to_int(ctx, pdf_dict_gets(ctx, descriptor, "Flags")) == 4)
{
char *cp936fonts[] = {
"\xCB\xCE\xCC\xE5", "SimSun,Regular",
@@ -471,7 +469,7 @@ pdf_load_simple_font_by_name(pdf_document *doc, pdf_obj *dict, char *basefont)
pdf_drop_font(ctx, fontdesc);
fontdesc = NULL;
fontdesc = pdf_new_font_desc(ctx);
- pdf_load_font_descriptor(fontdesc, doc, descriptor, "Adobe-GB1", cp936fonts[i+1], 0);
+ pdf_load_font_descriptor(ctx, doc, fontdesc, descriptor, "Adobe-GB1", cp936fonts[i+1], 0);
fontdesc->encoding = pdf_load_system_cmap(ctx, "GBK-EUC-H");
fontdesc->to_unicode = pdf_load_system_cmap(ctx, "Adobe-GB1-UCS2");
fontdesc->to_ttf_cmap = pdf_load_system_cmap(ctx, "Adobe-GB1-UCS2");
@@ -532,34 +530,34 @@ pdf_load_simple_font_by_name(pdf_document *doc, pdf_obj *dict, char *basefont)
etable[i] = 0;
}
- encoding = pdf_dict_gets(dict, "Encoding");
+ encoding = pdf_dict_gets(ctx, dict, "Encoding");
if (encoding)
{
- if (pdf_is_name(encoding))
- pdf_load_encoding(estrings, pdf_to_name(encoding));
+ if (pdf_is_name(ctx, encoding))
+ pdf_load_encoding(estrings, pdf_to_name(ctx, encoding));
- if (pdf_is_dict(encoding))
+ if (pdf_is_dict(ctx, encoding))
{
pdf_obj *base, *diff, *item;
- base = pdf_dict_gets(encoding, "BaseEncoding");
- if (pdf_is_name(base))
- pdf_load_encoding(estrings, pdf_to_name(base));
+ base = pdf_dict_gets(ctx, encoding, "BaseEncoding");
+ if (pdf_is_name(ctx, base))
+ pdf_load_encoding(estrings, pdf_to_name(ctx, base));
else if (!fontdesc->is_embedded && !symbolic)
pdf_load_encoding(estrings, "StandardEncoding");
- diff = pdf_dict_gets(encoding, "Differences");
- if (pdf_is_array(diff))
+ diff = pdf_dict_gets(ctx, encoding, "Differences");
+ if (pdf_is_array(ctx, diff))
{
- n = pdf_array_len(diff);
+ n = pdf_array_len(ctx, diff);
k = 0;
for (i = 0; i < n; i++)
{
- item = pdf_array_get(diff, i);
- if (pdf_is_int(item))
- k = pdf_to_int(item);
- if (pdf_is_name(item) && k >= 0 && k < nelem(estrings))
- estrings[k++] = pdf_to_name(item);
+ item = pdf_array_get(ctx, diff, i);
+ if (pdf_is_int(ctx, item))
+ k = pdf_to_int(ctx, item);
+ if (pdf_is_name(ctx, item) && k >= 0 && k < nelem(estrings))
+ estrings[k++] = pdf_to_name(ctx, item);
}
}
}
@@ -575,7 +573,7 @@ pdf_load_simple_font_by_name(pdf_document *doc, pdf_obj *dict, char *basefont)
has_lock = 1;
/* built-in and substitute fonts may be a different type than what the document expects */
- subtype = pdf_to_name(pdf_dict_gets(dict, "Subtype"));
+ subtype = pdf_to_name(ctx, pdf_dict_gets(ctx, dict, "Subtype"));
if (!strcmp(subtype, "Type1"))
kind = TYPE1;
else if (!strcmp(subtype, "MMType1"))
@@ -705,7 +703,7 @@ pdf_load_simple_font_by_name(pdf_document *doc, pdf_obj *dict, char *basefont)
fz_try(ctx)
{
- pdf_load_to_unicode(doc, fontdesc, estrings, NULL, pdf_dict_gets(dict, "ToUnicode"));
+ pdf_load_to_unicode(ctx, doc, fontdesc, estrings, NULL, pdf_dict_gets(ctx, dict, "ToUnicode"));
}
fz_catch(ctx)
{
@@ -719,20 +717,20 @@ pdf_load_simple_font_by_name(pdf_document *doc, pdf_obj *dict, char *basefont)
pdf_set_default_hmtx(ctx, fontdesc, fontdesc->missing_width);
- widths = pdf_dict_gets(dict, "Widths");
+ widths = pdf_dict_gets(ctx, dict, "Widths");
if (widths)
{
int first, last;
- first = pdf_to_int(pdf_dict_gets(dict, "FirstChar"));
- last = pdf_to_int(pdf_dict_gets(dict, "LastChar"));
+ first = pdf_to_int(ctx, pdf_dict_gets(ctx, dict, "FirstChar"));
+ last = pdf_to_int(ctx, pdf_dict_gets(ctx, dict, "LastChar"));
if (first < 0 || last > 255 || first > last)
first = last = 0;
for (i = 0; i < last - first + 1; i++)
{
- int wid = pdf_to_int(pdf_array_get(widths, i));
+ int wid = pdf_to_int(ctx, pdf_array_get(ctx, widths, i));
pdf_add_hmtx(ctx, fontdesc, i + first, i + first, wid);
}
}
@@ -760,21 +758,21 @@ pdf_load_simple_font_by_name(pdf_document *doc, pdf_obj *dict, char *basefont)
if (fontdesc && etable != fontdesc->cid_to_gid)
fz_free(ctx, etable);
pdf_drop_font(ctx, fontdesc);
- fz_rethrow_message(ctx, "cannot load simple font (%d %d R)", pdf_to_num(dict), pdf_to_gen(dict));
+ fz_rethrow_message(ctx, "cannot load simple font (%d %d R)", pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict));
}
return fontdesc;
}
static pdf_font_desc *
-pdf_load_simple_font(pdf_document *doc, pdf_obj *dict)
+pdf_load_simple_font(fz_context *ctx, pdf_document *doc, pdf_obj *dict)
{
- char *basefont = pdf_to_name(pdf_dict_gets(dict, "BaseFont"));
+ char *basefont = pdf_to_name(ctx, pdf_dict_gets(ctx, dict, "BaseFont"));
- return pdf_load_simple_font_by_name(doc, dict, basefont);
+ return pdf_load_simple_font_by_name(ctx, doc, dict, basefont);
}
static int
-hail_mary_make_hash_key(fz_store_hash *hash, void *key_)
+hail_mary_make_hash_key(fz_context *ctx, fz_store_hash *hash, void *key_)
{
hash->u.i.i0 = 0;
hash->u.i.i1 = 0;
@@ -794,14 +792,14 @@ hail_mary_drop_key(fz_context *ctx, void *key)
}
static int
-hail_mary_cmp_key(void *k0, void *k1)
+hail_mary_cmp_key(fz_context *ctx, void *k0, void *k1)
{
return k0 == k1;
}
#ifndef NDEBUG
static void
-hail_mary_debug_key(FILE *out, void *key_)
+hail_mary_debug_key(fz_context *ctx, FILE *out, void *key_)
{
fprintf(out, "hail mary ");
}
@@ -819,9 +817,8 @@ static fz_store_type hail_mary_store_type =
};
pdf_font_desc *
-pdf_load_hail_mary_font(pdf_document *doc)
+pdf_load_hail_mary_font(fz_context *ctx, pdf_document *doc)
{
- fz_context *ctx = doc->ctx;
pdf_font_desc *fontdesc;
pdf_font_desc *existing;
@@ -831,7 +828,7 @@ pdf_load_hail_mary_font(pdf_document *doc)
}
/* FIXME: Get someone with a clue about fonts to fix this */
- fontdesc = pdf_load_simple_font_by_name(doc, NULL, "Helvetica");
+ fontdesc = pdf_load_simple_font_by_name(ctx, doc, NULL, "Helvetica");
existing = fz_store_item(ctx, &hail_mary_store_type, fontdesc, fontdesc->size, &hail_mary_store_type);
assert(existing == NULL);
@@ -844,7 +841,7 @@ pdf_load_hail_mary_font(pdf_document *doc)
*/
static pdf_font_desc *
-load_cid_font(pdf_document *doc, pdf_obj *dict, pdf_obj *encoding, pdf_obj *to_unicode)
+load_cid_font(fz_context *ctx, pdf_document *doc, pdf_obj *dict, pdf_obj *encoding, pdf_obj *to_unicode)
{
pdf_obj *widths;
pdf_obj *descriptor;
@@ -857,7 +854,6 @@ load_cid_font(pdf_document *doc, pdf_obj *dict, pdf_obj *encoding, pdf_obj *to_u
pdf_obj *cidtogidmap;
pdf_obj *obj;
int dw;
- fz_context *ctx = doc->ctx;
fz_var(fontdesc);
@@ -865,46 +861,46 @@ load_cid_font(pdf_document *doc, pdf_obj *dict, pdf_obj *encoding, pdf_obj *to_u
{
/* Get font name and CID collection */
- basefont = pdf_to_name(pdf_dict_gets(dict, "BaseFont"));
+ basefont = pdf_to_name(ctx, pdf_dict_gets(ctx, dict, "BaseFont"));
{
pdf_obj *cidinfo;
char tmpstr[64];
int tmplen;
- cidinfo = pdf_dict_gets(dict, "CIDSystemInfo");
+ cidinfo = pdf_dict_gets(ctx, dict, "CIDSystemInfo");
if (!cidinfo)
fz_throw(ctx, FZ_ERROR_GENERIC, "cid font is missing info");
- obj = pdf_dict_gets(cidinfo, "Registry");
- tmplen = fz_mini(sizeof tmpstr - 1, pdf_to_str_len(obj));
- memcpy(tmpstr, pdf_to_str_buf(obj), tmplen);
+ obj = pdf_dict_gets(ctx, cidinfo, "Registry");
+ tmplen = fz_mini(sizeof tmpstr - 1, pdf_to_str_len(ctx, obj));
+ memcpy(tmpstr, pdf_to_str_buf(ctx, obj), tmplen);
tmpstr[tmplen] = '\0';
fz_strlcpy(collection, tmpstr, sizeof collection);
fz_strlcat(collection, "-", sizeof collection);
- obj = pdf_dict_gets(cidinfo, "Ordering");
- tmplen = fz_mini(sizeof tmpstr - 1, pdf_to_str_len(obj));
- memcpy(tmpstr, pdf_to_str_buf(obj), tmplen);
+ obj = pdf_dict_gets(ctx, cidinfo, "Ordering");
+ tmplen = fz_mini(sizeof tmpstr - 1, pdf_to_str_len(ctx, obj));
+ memcpy(tmpstr, pdf_to_str_buf(ctx, obj), tmplen);
tmpstr[tmplen] = '\0';
fz_strlcat(collection, tmpstr, sizeof collection);
}
/* Encoding */
- if (pdf_is_name(encoding))
+ if (pdf_is_name(ctx, encoding))
{
- if (!strcmp(pdf_to_name(encoding), "Identity-H"))
+ if (!strcmp(pdf_to_name(ctx, encoding), "Identity-H"))
cmap = pdf_new_identity_cmap(ctx, 0, 2);
- else if (!strcmp(pdf_to_name(encoding), "Identity-V"))
+ else if (!strcmp(pdf_to_name(ctx, encoding), "Identity-V"))
cmap = pdf_new_identity_cmap(ctx, 1, 2);
else
- cmap = pdf_load_system_cmap(ctx, pdf_to_name(encoding));
+ cmap = pdf_load_system_cmap(ctx, pdf_to_name(ctx, encoding));
}
- else if (pdf_is_indirect(encoding))
+ else if (pdf_is_indirect(ctx, encoding))
{
- cmap = pdf_load_embedded_cmap(doc, encoding);
+ cmap = pdf_load_embedded_cmap(ctx, doc, encoding);
}
else
{
@@ -920,21 +916,21 @@ load_cid_font(pdf_document *doc, pdf_obj *dict, pdf_obj *encoding, pdf_obj *to_u
pdf_set_font_wmode(ctx, fontdesc, pdf_cmap_wmode(ctx, fontdesc->encoding));
- descriptor = pdf_dict_gets(dict, "FontDescriptor");
+ descriptor = pdf_dict_gets(ctx, dict, "FontDescriptor");
if (!descriptor)
fz_throw(ctx, FZ_ERROR_GENERIC, "syntaxerror: missing font descriptor");
- pdf_load_font_descriptor(fontdesc, doc, descriptor, collection, basefont, 1);
+ pdf_load_font_descriptor(ctx, doc, fontdesc, descriptor, collection, basefont, 1);
face = fontdesc->font->ft_face;
/* Apply encoding */
- cidtogidmap = pdf_dict_gets(dict, "CIDToGIDMap");
- if (pdf_is_indirect(cidtogidmap))
+ cidtogidmap = pdf_dict_gets(ctx, dict, "CIDToGIDMap");
+ if (pdf_is_indirect(ctx, cidtogidmap))
{
fz_buffer *buf;
- buf = pdf_load_stream(doc, pdf_to_num(cidtogidmap), pdf_to_gen(cidtogidmap));
+ buf = pdf_load_stream(ctx, doc, pdf_to_num(ctx, cidtogidmap), pdf_to_gen(ctx, cidtogidmap));
fontdesc->cid_to_gid_len = (buf->len) / 2;
fontdesc->cid_to_gid = fz_malloc_array(ctx, fontdesc->cid_to_gid_len, sizeof(unsigned short));
@@ -968,7 +964,7 @@ load_cid_font(pdf_document *doc, pdf_obj *dict, pdf_obj *encoding, pdf_obj *to_u
fontdesc->to_ttf_cmap = pdf_load_system_cmap(ctx, "Adobe-Korea1-UCS2");
}
- pdf_load_to_unicode(doc, fontdesc, NULL, collection, to_unicode);
+ pdf_load_to_unicode(ctx, doc, fontdesc, NULL, collection, to_unicode);
/* If we have an identity encoding, we're supposed to use the glyph ids directly.
* If we only have a substitute font, that won't work.
@@ -984,35 +980,35 @@ load_cid_font(pdf_document *doc, pdf_obj *dict, pdf_obj *encoding, pdf_obj *to_u
/* Horizontal */
dw = 1000;
- obj = pdf_dict_gets(dict, "DW");
+ obj = pdf_dict_gets(ctx, dict, "DW");
if (obj)
- dw = pdf_to_int(obj);
+ dw = pdf_to_int(ctx, obj);
pdf_set_default_hmtx(ctx, fontdesc, dw);
- widths = pdf_dict_gets(dict, "W");
+ widths = pdf_dict_gets(ctx, dict, "W");
if (widths)
{
int c0, c1, w, n, m;
- n = pdf_array_len(widths);
+ n = pdf_array_len(ctx, widths);
for (i = 0; i < n; )
{
- c0 = pdf_to_int(pdf_array_get(widths, i));
- obj = pdf_array_get(widths, i + 1);
- if (pdf_is_array(obj))
+ c0 = pdf_to_int(ctx, pdf_array_get(ctx, widths, i));
+ obj = pdf_array_get(ctx, widths, i + 1);
+ if (pdf_is_array(ctx, obj))
{
- m = pdf_array_len(obj);
+ m = pdf_array_len(ctx, obj);
for (k = 0; k < m; k++)
{
- w = pdf_to_int(pdf_array_get(obj, k));
+ w = pdf_to_int(ctx, pdf_array_get(ctx, obj, k));
pdf_add_hmtx(ctx, fontdesc, c0 + k, c0 + k, w);
}
i += 2;
}
else
{
- c1 = pdf_to_int(obj);
- w = pdf_to_int(pdf_array_get(widths, i + 2));
+ c1 = pdf_to_int(ctx, obj);
+ w = pdf_to_int(ctx, pdf_array_get(ctx, widths, i + 2));
pdf_add_hmtx(ctx, fontdesc, c0, c1, w);
i += 3;
}
@@ -1028,43 +1024,43 @@ load_cid_font(pdf_document *doc, pdf_obj *dict, pdf_obj *encoding, pdf_obj *to_u
int dw2y = 880;
int dw2w = -1000;
- obj = pdf_dict_gets(dict, "DW2");
+ obj = pdf_dict_gets(ctx, dict, "DW2");
if (obj)
{
- dw2y = pdf_to_int(pdf_array_get(obj, 0));
- dw2w = pdf_to_int(pdf_array_get(obj, 1));
+ dw2y = pdf_to_int(ctx, pdf_array_get(ctx, obj, 0));
+ dw2w = pdf_to_int(ctx, pdf_array_get(ctx, obj, 1));
}
pdf_set_default_vmtx(ctx, fontdesc, dw2y, dw2w);
- widths = pdf_dict_gets(dict, "W2");
+ widths = pdf_dict_gets(ctx, dict, "W2");
if (widths)
{
int c0, c1, w, x, y, n;
- n = pdf_array_len(widths);
+ n = pdf_array_len(ctx, widths);
for (i = 0; i < n; )
{
- c0 = pdf_to_int(pdf_array_get(widths, i));
- obj = pdf_array_get(widths, i + 1);
- if (pdf_is_array(obj))
+ c0 = pdf_to_int(ctx, pdf_array_get(ctx, widths, i));
+ obj = pdf_array_get(ctx, widths, i + 1);
+ if (pdf_is_array(ctx, obj))
{
- int m = pdf_array_len(obj);
+ int m = pdf_array_len(ctx, obj);
for (k = 0; k * 3 < m; k ++)
{
- w = pdf_to_int(pdf_array_get(obj, k * 3 + 0));
- x = pdf_to_int(pdf_array_get(obj, k * 3 + 1));
- y = pdf_to_int(pdf_array_get(obj, k * 3 + 2));
+ w = pdf_to_int(ctx, pdf_array_get(ctx, obj, k * 3 + 0));
+ x = pdf_to_int(ctx, pdf_array_get(ctx, obj, k * 3 + 1));
+ y = pdf_to_int(ctx, pdf_array_get(ctx, obj, k * 3 + 2));
pdf_add_vmtx(ctx, fontdesc, c0 + k, c0 + k, x, y, w);
}
i += 2;
}
else
{
- c1 = pdf_to_int(obj);
- w = pdf_to_int(pdf_array_get(widths, i + 2));
- x = pdf_to_int(pdf_array_get(widths, i + 3));
- y = pdf_to_int(pdf_array_get(widths, i + 4));
+ c1 = pdf_to_int(ctx, obj);
+ w = pdf_to_int(ctx, pdf_array_get(ctx, widths, i + 2));
+ x = pdf_to_int(ctx, pdf_array_get(ctx, widths, i + 3));
+ y = pdf_to_int(ctx, pdf_array_get(ctx, widths, i + 4));
pdf_add_vmtx(ctx, fontdesc, c0, c1, x, y, w);
i += 5;
}
@@ -1077,14 +1073,14 @@ load_cid_font(pdf_document *doc, pdf_obj *dict, pdf_obj *encoding, pdf_obj *to_u
fz_catch(ctx)
{
pdf_drop_font(ctx, fontdesc);
- fz_rethrow_message(ctx, "cannot load cid font (%d %d R)", pdf_to_num(dict), pdf_to_gen(dict));
+ fz_rethrow_message(ctx, "cannot load cid font (%d %d R)", pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict));
}
return fontdesc;
}
static pdf_font_desc *
-pdf_load_type0_font(pdf_document *doc, pdf_obj *dict)
+pdf_load_type0_font(fz_context *ctx, pdf_document *doc, pdf_obj *dict)
{
pdf_obj *dfonts;
pdf_obj *dfont;
@@ -1092,21 +1088,21 @@ pdf_load_type0_font(pdf_document *doc, pdf_obj *dict)
pdf_obj *encoding;
pdf_obj *to_unicode;
- dfonts = pdf_dict_gets(dict, "DescendantFonts");
+ dfonts = pdf_dict_gets(ctx, dict, "DescendantFonts");
if (!dfonts)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "cid font is missing descendant fonts");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "cid font is missing descendant fonts");
- dfont = pdf_array_get(dfonts, 0);
+ dfont = pdf_array_get(ctx, dfonts, 0);
- subtype = pdf_dict_gets(dfont, "Subtype");
- encoding = pdf_dict_gets(dict, "Encoding");
- to_unicode = pdf_dict_gets(dict, "ToUnicode");
+ subtype = pdf_dict_gets(ctx, dfont, "Subtype");
+ encoding = pdf_dict_gets(ctx, dict, "Encoding");
+ to_unicode = pdf_dict_gets(ctx, dict, "ToUnicode");
- if (pdf_is_name(subtype) && !strcmp(pdf_to_name(subtype), "CIDFontType0"))
- return load_cid_font(doc, dfont, encoding, to_unicode);
- if (pdf_is_name(subtype) && !strcmp(pdf_to_name(subtype), "CIDFontType2"))
- return load_cid_font(doc, dfont, encoding, to_unicode);
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "syntaxerror: unknown cid font type");
+ if (pdf_is_name(ctx, subtype) && !strcmp(pdf_to_name(ctx, subtype), "CIDFontType0"))
+ return load_cid_font(ctx, doc, dfont, encoding, to_unicode);
+ if (pdf_is_name(ctx, subtype) && !strcmp(pdf_to_name(ctx, subtype), "CIDFontType2"))
+ return load_cid_font(ctx, doc, dfont, encoding, to_unicode);
+ fz_throw(ctx, FZ_ERROR_GENERIC, "syntaxerror: unknown cid font type");
}
/*
@@ -1114,34 +1110,33 @@ pdf_load_type0_font(pdf_document *doc, pdf_obj *dict)
*/
static void
-pdf_load_font_descriptor(pdf_font_desc *fontdesc, pdf_document *doc, pdf_obj *dict, char *collection, char *basefont, int iscidfont)
+pdf_load_font_descriptor(fz_context *ctx, pdf_document *doc, pdf_font_desc *fontdesc, pdf_obj *dict, char *collection, char *basefont, int iscidfont)
{
pdf_obj *obj1, *obj2, *obj3, *obj;
char *fontname;
FT_Face face;
- fz_context *ctx = doc->ctx;
/* Prefer BaseFont; don't bother with FontName */
fontname = basefont;
- fontdesc->flags = pdf_to_int(pdf_dict_gets(dict, "Flags"));
- fontdesc->italic_angle = pdf_to_real(pdf_dict_gets(dict, "ItalicAngle"));
- fontdesc->ascent = pdf_to_real(pdf_dict_gets(dict, "Ascent"));
- fontdesc->descent = pdf_to_real(pdf_dict_gets(dict, "Descent"));
- fontdesc->cap_height = pdf_to_real(pdf_dict_gets(dict, "CapHeight"));
- fontdesc->x_height = pdf_to_real(pdf_dict_gets(dict, "XHeight"));
- fontdesc->missing_width = pdf_to_real(pdf_dict_gets(dict, "MissingWidth"));
-
- obj1 = pdf_dict_gets(dict, "FontFile");
- obj2 = pdf_dict_gets(dict, "FontFile2");
- obj3 = pdf_dict_gets(dict, "FontFile3");
+ fontdesc->flags = pdf_to_int(ctx, pdf_dict_gets(ctx, dict, "Flags"));
+ fontdesc->italic_angle = pdf_to_real(ctx, pdf_dict_gets(ctx, dict, "ItalicAngle"));
+ fontdesc->ascent = pdf_to_real(ctx, pdf_dict_gets(ctx, dict, "Ascent"));
+ fontdesc->descent = pdf_to_real(ctx, pdf_dict_gets(ctx, dict, "Descent"));
+ fontdesc->cap_height = pdf_to_real(ctx, pdf_dict_gets(ctx, dict, "CapHeight"));
+ fontdesc->x_height = pdf_to_real(ctx, pdf_dict_gets(ctx, dict, "XHeight"));
+ fontdesc->missing_width = pdf_to_real(ctx, pdf_dict_gets(ctx, dict, "MissingWidth"));
+
+ obj1 = pdf_dict_gets(ctx, dict, "FontFile");
+ obj2 = pdf_dict_gets(ctx, dict, "FontFile2");
+ obj3 = pdf_dict_gets(ctx, dict, "FontFile3");
obj = obj1 ? obj1 : obj2 ? obj2 : obj3;
- if (pdf_is_indirect(obj))
+ if (pdf_is_indirect(ctx, obj))
{
fz_try(ctx)
{
- pdf_load_embedded_font(doc, fontdesc, fontname, obj);
+ pdf_load_embedded_font(ctx, doc, fontdesc, fontname, obj);
}
fz_catch(ctx)
{
@@ -1212,12 +1207,11 @@ pdf_make_width_table(fz_context *ctx, pdf_font_desc *fontdesc)
}
pdf_font_desc *
-pdf_load_font(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, int nested_depth)
+pdf_load_font(fz_context *ctx, pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, int nested_depth)
{
char *subtype;
pdf_obj *dfonts;
pdf_obj *charprocs;
- fz_context *ctx = doc->ctx;
pdf_font_desc *fontdesc;
int type3 = 0;
@@ -1226,38 +1220,38 @@ pdf_load_font(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, int nested_depth)
return fontdesc;
}
- subtype = pdf_to_name(pdf_dict_gets(dict, "Subtype"));
- dfonts = pdf_dict_gets(dict, "DescendantFonts");
- charprocs = pdf_dict_gets(dict, "CharProcs");
+ subtype = pdf_to_name(ctx, pdf_dict_gets(ctx, dict, "Subtype"));
+ dfonts = pdf_dict_gets(ctx, dict, "DescendantFonts");
+ charprocs = pdf_dict_gets(ctx, dict, "CharProcs");
if (subtype && !strcmp(subtype, "Type0"))
- fontdesc = pdf_load_type0_font(doc, dict);
+ fontdesc = pdf_load_type0_font(ctx, doc, dict);
else if (subtype && !strcmp(subtype, "Type1"))
- fontdesc = pdf_load_simple_font(doc, dict);
+ fontdesc = pdf_load_simple_font(ctx, doc, dict);
else if (subtype && !strcmp(subtype, "MMType1"))
- fontdesc = pdf_load_simple_font(doc, dict);
+ fontdesc = pdf_load_simple_font(ctx, doc, dict);
else if (subtype && !strcmp(subtype, "TrueType"))
- fontdesc = pdf_load_simple_font(doc, dict);
+ fontdesc = pdf_load_simple_font(ctx, doc, dict);
else if (subtype && !strcmp(subtype, "Type3"))
{
- fontdesc = pdf_load_type3_font(doc, rdb, dict);
+ fontdesc = pdf_load_type3_font(ctx, doc, rdb, dict);
type3 = 1;
}
else if (charprocs)
{
fz_warn(ctx, "unknown font format, guessing type3.");
- fontdesc = pdf_load_type3_font(doc, rdb, dict);
+ fontdesc = pdf_load_type3_font(ctx, doc, rdb, dict);
type3 = 1;
}
else if (dfonts)
{
fz_warn(ctx, "unknown font format, guessing type0.");
- fontdesc = pdf_load_type0_font(doc, dict);
+ fontdesc = pdf_load_type0_font(ctx, doc, dict);
}
else
{
fz_warn(ctx, "unknown font format, guessing type1 or truetype.");
- fontdesc = pdf_load_simple_font(doc, dict);
+ fontdesc = pdf_load_simple_font(ctx, doc, dict);
}
/* Save the widths to stretch non-CJK substitute fonts */
@@ -1267,7 +1261,7 @@ pdf_load_font(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, int nested_depth)
pdf_store_item(ctx, dict, fontdesc, fontdesc->size);
if (type3)
- pdf_load_type3_glyphs(doc, fontdesc, nested_depth);
+ pdf_load_type3_glyphs(ctx, doc, fontdesc, nested_depth);
return fontdesc;
}
diff --git a/source/pdf/pdf-fontfile.c b/source/pdf/pdf-fontfile.c
index cf62108b..86b6682b 100644
--- a/source/pdf/pdf-fontfile.c
+++ b/source/pdf/pdf-fontfile.c
@@ -26,7 +26,7 @@
#endif
unsigned char *
-pdf_lookup_builtin_font(const char *name, unsigned int *len)
+pdf_lookup_builtin_font(fz_context *ctx, const char *name, unsigned int *len)
{
if (!strcmp("Courier", name)) {
*len = sizeof pdf_font_NimbusMono_Regular;
@@ -89,37 +89,37 @@ pdf_lookup_builtin_font(const char *name, unsigned int *len)
}
unsigned char *
-pdf_lookup_substitute_font(int mono, int serif, int bold, int italic, unsigned int *len)
+pdf_lookup_substitute_font(fz_context *ctx, int mono, int serif, int bold, int italic, unsigned int *len)
{
if (mono) {
if (bold) {
- if (italic) return pdf_lookup_builtin_font("Courier-BoldOblique", len);
- else return pdf_lookup_builtin_font("Courier-Bold", len);
+ if (italic) return pdf_lookup_builtin_font(ctx, "Courier-BoldOblique", len);
+ else return pdf_lookup_builtin_font(ctx, "Courier-Bold", len);
} else {
- if (italic) return pdf_lookup_builtin_font("Courier-Oblique", len);
- else return pdf_lookup_builtin_font("Courier", len);
+ if (italic) return pdf_lookup_builtin_font(ctx, "Courier-Oblique", len);
+ else return pdf_lookup_builtin_font(ctx, "Courier", len);
}
} else if (serif) {
if (bold) {
- if (italic) return pdf_lookup_builtin_font("Times-BoldItalic", len);
- else return pdf_lookup_builtin_font("Times-Bold", len);
+ if (italic) return pdf_lookup_builtin_font(ctx, "Times-BoldItalic", len);
+ else return pdf_lookup_builtin_font(ctx, "Times-Bold", len);
} else {
- if (italic) return pdf_lookup_builtin_font("Times-Italic", len);
- else return pdf_lookup_builtin_font("Times-Roman", len);
+ if (italic) return pdf_lookup_builtin_font(ctx, "Times-Italic", len);
+ else return pdf_lookup_builtin_font(ctx, "Times-Roman", len);
}
} else {
if (bold) {
- if (italic) return pdf_lookup_builtin_font("Helvetica-BoldOblique", len);
- else return pdf_lookup_builtin_font("Helvetica-Bold", len);
+ if (italic) return pdf_lookup_builtin_font(ctx, "Helvetica-BoldOblique", len);
+ else return pdf_lookup_builtin_font(ctx, "Helvetica-Bold", len);
} else {
- if (italic) return pdf_lookup_builtin_font("Helvetica-Oblique", len);
- else return pdf_lookup_builtin_font("Helvetica", len);
+ if (italic) return pdf_lookup_builtin_font(ctx, "Helvetica-Oblique", len);
+ else return pdf_lookup_builtin_font(ctx, "Helvetica", len);
}
}
}
unsigned char *
-pdf_lookup_substitute_cjk_font(int ros, int serif, int wmode, unsigned int *len, int *index)
+pdf_lookup_substitute_cjk_font(fz_context *ctx, int ros, int serif, int wmode, unsigned int *len, int *index)
{
#ifndef NOCJKFONT
#ifndef NOCJKFULL
diff --git a/source/pdf/pdf-form.c b/source/pdf/pdf-form.c
index 62e635ca..4caadd25 100644
--- a/source/pdf/pdf-form.c
+++ b/source/pdf/pdf-form.c
@@ -15,9 +15,9 @@ enum
SigFlag_AppendOnly = 2
};
-static int pdf_field_dirties_document(pdf_document *doc, pdf_obj *field)
+static int pdf_field_dirties_document(fz_context *ctx, pdf_document *doc, pdf_obj *field)
{
- int ff = pdf_get_field_flags(doc, field);
+ int ff = pdf_get_field_flags(ctx, doc, field);
if (ff & Ff_NoExport) return 0;
if (ff & Ff_ReadOnly) return 0;
return 1;
@@ -25,33 +25,32 @@ static int pdf_field_dirties_document(pdf_document *doc, pdf_obj *field)
/* Find the point in a field hierarchy where all descendents
* share the same name */
-static pdf_obj *find_head_of_field_group(pdf_obj *obj)
+static pdf_obj *find_head_of_field_group(fz_context *ctx, pdf_obj *obj)
{
- if (obj == NULL || pdf_dict_gets(obj, "T"))
+ if (obj == NULL || pdf_dict_gets(ctx, obj, "T"))
return obj;
else
- return find_head_of_field_group(pdf_dict_gets(obj, "Parent"));
+ return find_head_of_field_group(ctx, pdf_dict_gets(ctx, obj, "Parent"));
}
-static void pdf_field_mark_dirty(pdf_document *doc, pdf_obj *field)
+static void pdf_field_mark_dirty(fz_context *ctx, pdf_document *doc, pdf_obj *field)
{
- pdf_obj *kids = pdf_dict_gets(field, "Kids");
+ pdf_obj *kids = pdf_dict_gets(ctx, field, "Kids");
if (kids)
{
- int i, n = pdf_array_len(kids);
+ int i, n = pdf_array_len(ctx, kids);
for (i = 0; i < n; i++)
- pdf_field_mark_dirty(doc, pdf_array_get(kids, i));
+ pdf_field_mark_dirty(ctx, doc, pdf_array_get(ctx, kids, i));
}
else
{
- pdf_dirty_obj(field);
+ pdf_dirty_obj(ctx, field);
}
}
-static void update_field_value(pdf_document *doc, pdf_obj *obj, char *text)
+static void update_field_value(fz_context *ctx, pdf_document *doc, pdf_obj *obj, char *text)
{
- fz_context *ctx = doc->ctx;
pdf_obj *sobj = NULL;
pdf_obj *grp;
@@ -60,40 +59,40 @@ static void update_field_value(pdf_document *doc, pdf_obj *obj, char *text)
/* All fields of the same name should be updated, so
* set the value at the head of the group */
- grp = find_head_of_field_group(obj);
+ grp = find_head_of_field_group(ctx, obj);
if (grp)
obj = grp;
fz_var(sobj);
fz_try(ctx)
{
- sobj = pdf_new_string(doc, text, strlen(text));
- pdf_dict_puts(obj, "V", sobj);
+ sobj = pdf_new_string(ctx, doc, text, strlen(text));
+ pdf_dict_puts(ctx, obj, "V", sobj);
}
fz_always(ctx)
{
- pdf_drop_obj(sobj);
+ pdf_drop_obj(ctx, sobj);
}
fz_catch(ctx)
{
fz_rethrow(ctx);
}
- pdf_field_mark_dirty(doc, obj);
+ pdf_field_mark_dirty(ctx, doc, obj);
}
-static pdf_obj *find_field(pdf_obj *dict, char *name, int len)
+static pdf_obj *find_field(fz_context *ctx, pdf_obj *dict, char *name, int len)
{
pdf_obj *field;
- int i, n = pdf_array_len(dict);
+ int i, n = pdf_array_len(ctx, dict);
for (i = 0; i < n; i++)
{
char *part;
- field = pdf_array_get(dict, i);
- part = pdf_to_str_buf(pdf_dict_gets(field, "T"));
+ field = pdf_array_get(ctx, dict, i);
+ part = pdf_to_str_buf(ctx, pdf_dict_gets(ctx, field, "T"));
if (strlen(part) == (size_t)len && !memcmp(part, name, len))
return field;
}
@@ -101,7 +100,7 @@ static pdf_obj *find_field(pdf_obj *dict, char *name, int len)
return NULL;
}
-pdf_obj *pdf_lookup_field(pdf_obj *form, char *name)
+pdf_obj *pdf_lookup_field(fz_context *ctx, pdf_obj *form, char *name)
{
char *dot;
char *namep;
@@ -118,17 +117,16 @@ pdf_obj *pdf_lookup_field(pdf_obj *form, char *name)
namep = dot + 1;
dot = strchr(namep, '.');
len = dot ? dot - namep : strlen(namep);
- dict = find_field(form, namep, len);
+ dict = find_field(ctx, form, namep, len);
if (dot)
- form = pdf_dict_gets(dict, "Kids");
+ form = pdf_dict_gets(ctx, dict, "Kids");
}
return dict;
}
-static void reset_field(pdf_document *doc, pdf_obj *field)
+static void reset_field(fz_context *ctx, pdf_document *doc, pdf_obj *field)
{
- fz_context *ctx = doc->ctx;
/* Set V to DV whereever DV is present, and delete V where DV is not.
* FIXME: we assume for now that V has not been set unequal
* to DV higher in the hierarchy than "field".
@@ -136,13 +134,13 @@ static void reset_field(pdf_document *doc, pdf_obj *field)
* At the bottom of the hierarchy we may find widget annotations
* that aren't also fields, but DV and V will not be present in their
* dictionaries, and attempts to remove V will be harmless. */
- pdf_obj *dv = pdf_dict_gets(field, "DV");
- pdf_obj *kids = pdf_dict_gets(field, "Kids");
+ pdf_obj *dv = pdf_dict_gets(ctx, field, "DV");
+ pdf_obj *kids = pdf_dict_gets(ctx, field, "Kids");
if (dv)
- pdf_dict_puts(field, "V", dv);
+ pdf_dict_puts(ctx, field, "V", dv);
else
- pdf_dict_dels(field, "V");
+ pdf_dict_dels(ctx, field, "V");
if (kids == NULL)
{
@@ -150,25 +148,25 @@ static void reset_field(pdf_document *doc, pdf_obj *field)
* In some cases we need to update the appearance state;
* in others we need to mark the field as dirty so that
* the appearance stream will be regenerated. */
- switch (pdf_field_type(doc, field))
+ switch (pdf_field_type(ctx, doc, field))
{
case PDF_WIDGET_TYPE_RADIOBUTTON:
case PDF_WIDGET_TYPE_CHECKBOX:
{
- pdf_obj *leafv = pdf_get_inheritable(doc, field, "V");
+ pdf_obj *leafv = pdf_get_inheritable(ctx, doc, field, "V");
if (leafv)
- pdf_keep_obj(leafv);
+ pdf_keep_obj(ctx, leafv);
else
- leafv = pdf_new_name(doc, "Off");
+ leafv = pdf_new_name(ctx, doc, "Off");
fz_try(ctx)
{
- pdf_dict_puts(field, "AS", leafv);
+ pdf_dict_puts(ctx, field, "AS", leafv);
}
fz_always(ctx)
{
- pdf_drop_obj(leafv);
+ pdf_drop_obj(ctx, leafv);
}
fz_catch(ctx)
{
@@ -181,46 +179,46 @@ static void reset_field(pdf_document *doc, pdf_obj *field)
break;
default:
- pdf_field_mark_dirty(doc, field);
+ pdf_field_mark_dirty(ctx, doc, field);
break;
}
}
- if (pdf_field_dirties_document(doc, field))
+ if (pdf_field_dirties_document(ctx, doc, field))
doc->dirty = 1;
}
-void pdf_field_reset(pdf_document *doc, pdf_obj *field)
+void pdf_field_reset(fz_context *ctx, pdf_document *doc, pdf_obj *field)
{
- pdf_obj *kids = pdf_dict_gets(field, "Kids");
+ pdf_obj *kids = pdf_dict_gets(ctx, field, "Kids");
- reset_field(doc, field);
+ reset_field(ctx, doc, field);
if (kids)
{
- int i, n = pdf_array_len(kids);
+ int i, n = pdf_array_len(ctx, kids);
for (i = 0; i < n; i++)
- pdf_field_reset(doc, pdf_array_get(kids, i));
+ pdf_field_reset(ctx, doc, pdf_array_get(ctx, kids, i));
}
}
-static void add_field_hierarchy_to_array(pdf_obj *array, pdf_obj *field)
+static void add_field_hierarchy_to_array(fz_context *ctx, pdf_obj *array, pdf_obj *field)
{
- pdf_obj *kids = pdf_dict_gets(field, "Kids");
- pdf_obj *exclude = pdf_dict_gets(field, "Exclude");
+ pdf_obj *kids = pdf_dict_gets(ctx, field, "Kids");
+ pdf_obj *exclude = pdf_dict_gets(ctx, field, "Exclude");
if (exclude)
return;
- pdf_array_push(array, field);
+ pdf_array_push(ctx, array, field);
if (kids)
{
- int i, n = pdf_array_len(kids);
+ int i, n = pdf_array_len(ctx, kids);
for (i = 0; i < n; i++)
- add_field_hierarchy_to_array(array, pdf_array_get(kids, i));
+ add_field_hierarchy_to_array(ctx, array, pdf_array_get(ctx, kids, i));
}
}
@@ -231,12 +229,11 @@ static void add_field_hierarchy_to_array(pdf_obj *array, pdf_obj *field)
the array. specified_fields interprets this information and produces the array
of fields to be acted upon.
*/
-static pdf_obj *specified_fields(pdf_document *doc, pdf_obj *fields, int exclude)
+static pdf_obj *specified_fields(fz_context *ctx, pdf_document *doc, pdf_obj *fields, int exclude)
{
- fz_context *ctx = doc->ctx;
- pdf_obj *form = pdf_dict_getp(pdf_trailer(doc), "Root/AcroForm/Fields");
+ pdf_obj *form = pdf_dict_getp(ctx, pdf_trailer(ctx, doc), "Root/AcroForm/Fields");
int i, n;
- pdf_obj *result = pdf_new_array(doc, 0);
+ pdf_obj *result = pdf_new_array(ctx, doc, 0);
pdf_obj *nil = NULL;
fz_var(nil);
@@ -247,85 +244,84 @@ static pdf_obj *specified_fields(pdf_document *doc, pdf_obj *fields, int exclude
if (exclude || !fields)
{
/* mark the fields we don't want to act upon */
- nil = pdf_new_null(doc);
+ nil = pdf_new_null(ctx, doc);
- n = pdf_array_len(fields);
+ n = pdf_array_len(ctx, fields);
for (i = 0; i < n; i++)
{
- pdf_obj *field = pdf_array_get(fields, i);
+ pdf_obj *field = pdf_array_get(ctx, fields, i);
- if (pdf_is_string(field))
- field = pdf_lookup_field(form, pdf_to_str_buf(field));
+ if (pdf_is_string(ctx, field))
+ field = pdf_lookup_field(ctx, form, pdf_to_str_buf(ctx, field));
if (field)
- pdf_dict_puts(field, "Exclude", nil);
+ pdf_dict_puts(ctx, field, "Exclude", nil);
}
/* Act upon all unmarked fields */
- n = pdf_array_len(form);
+ n = pdf_array_len(ctx, form);
for (i = 0; i < n; i++)
- add_field_hierarchy_to_array(result, pdf_array_get(form, i));
+ add_field_hierarchy_to_array(ctx, result, pdf_array_get(ctx, form, i));
/* Unmark the marked fields */
- n = pdf_array_len(fields);
+ n = pdf_array_len(ctx, fields);
for (i = 0; i < n; i++)
{
- pdf_obj *field = pdf_array_get(fields, i);
+ pdf_obj *field = pdf_array_get(ctx, fields, i);
- if (pdf_is_string(field))
- field = pdf_lookup_field(form, pdf_to_str_buf(field));
+ if (pdf_is_string(ctx, field))
+ field = pdf_lookup_field(ctx, form, pdf_to_str_buf(ctx, field));
if (field)
- pdf_dict_dels(field, "Exclude");
+ pdf_dict_dels(ctx, field, "Exclude");
}
}
else
{
- n = pdf_array_len(fields);
+ n = pdf_array_len(ctx, fields);
for (i = 0; i < n; i++)
{
- pdf_obj *field = pdf_array_get(fields, i);
+ pdf_obj *field = pdf_array_get(ctx, fields, i);
- if (pdf_is_string(field))
- field = pdf_lookup_field(form, pdf_to_str_buf(field));
+ if (pdf_is_string(ctx, field))
+ field = pdf_lookup_field(ctx, form, pdf_to_str_buf(ctx, field));
if (field)
- add_field_hierarchy_to_array(result, field);
+ add_field_hierarchy_to_array(ctx, result, field);
}
}
}
fz_always(ctx)
{
- pdf_drop_obj(nil);
+ pdf_drop_obj(ctx, nil);
}
fz_catch(ctx)
{
- pdf_drop_obj(result);
+ pdf_drop_obj(ctx, result);
fz_rethrow(ctx);
}
return result;
}
-static void reset_form(pdf_document *doc, pdf_obj *fields, int exclude)
+static void reset_form(fz_context *ctx, pdf_document *doc, pdf_obj *fields, int exclude)
{
- fz_context *ctx = doc->ctx;
- pdf_obj *sfields = specified_fields(doc, fields, exclude);
+ pdf_obj *sfields = specified_fields(ctx, doc, fields, exclude);
fz_try(ctx)
{
- int i, n = pdf_array_len(sfields);
+ int i, n = pdf_array_len(ctx, sfields);
for (i = 0; i < n; i++)
- reset_field(doc, pdf_array_get(sfields, i));
+ reset_field(ctx, doc, pdf_array_get(ctx, sfields, i));
}
fz_always(ctx)
{
- pdf_drop_obj(sfields);
+ pdf_drop_obj(ctx, sfields);
}
fz_catch(ctx)
{
@@ -333,19 +329,18 @@ static void reset_form(pdf_document *doc, pdf_obj *fields, int exclude)
}
}
-static void execute_action(pdf_document *doc, pdf_obj *obj, pdf_obj *a)
+static void execute_action(fz_context *ctx, pdf_document *doc, pdf_obj *obj, pdf_obj *a)
{
- fz_context *ctx = doc->ctx;
if (a)
{
- char *type = pdf_to_name(pdf_dict_gets(a, "S"));
+ char *type = pdf_to_name(ctx, pdf_dict_gets(ctx, a, "S"));
if (!strcmp(type, "JavaScript"))
{
- pdf_obj *js = pdf_dict_gets(a, "JS");
+ pdf_obj *js = pdf_dict_gets(ctx, a, "JS");
if (js)
{
- char *code = pdf_to_utf8(doc, js);
+ char *code = pdf_to_utf8(ctx, doc, js);
fz_try(ctx)
{
pdf_js_execute(doc->js, code);
@@ -362,21 +357,21 @@ static void execute_action(pdf_document *doc, pdf_obj *obj, pdf_obj *a)
}
else if (!strcmp(type, "ResetForm"))
{
- reset_form(doc, pdf_dict_gets(a, "Fields"), pdf_to_int(pdf_dict_gets(a, "Flags")) & 1);
+ reset_form(ctx, doc, pdf_dict_gets(ctx, a, "Fields"), pdf_to_int(ctx, pdf_dict_gets(ctx, a, "Flags")) & 1);
}
else if (!strcmp(type, "Named"))
{
- char *name = pdf_to_name(pdf_dict_gets(a, "N"));
+ char *name = pdf_to_name(ctx, pdf_dict_gets(ctx, a, "N"));
if (!strcmp(name, "Print"))
- pdf_event_issue_print(doc);
+ pdf_event_issue_print(ctx, doc);
}
}
}
-static void execute_action_chain(pdf_document *doc, pdf_obj *obj)
+static void execute_action_chain(fz_context *ctx, pdf_document *doc, pdf_obj *obj)
{
- pdf_obj *a = pdf_dict_gets(obj, "A");
+ pdf_obj *a = pdf_dict_gets(ctx, obj, "A");
pdf_js_event e;
e.target = obj;
@@ -385,14 +380,14 @@ static void execute_action_chain(pdf_document *doc, pdf_obj *obj)
while (a)
{
- execute_action(doc, obj, a);
- a = pdf_dict_gets(a, "Next");
+ execute_action(ctx, doc, obj, a);
+ a = pdf_dict_gets(ctx, a, "Next");
}
}
-static void execute_additional_action(pdf_document *doc, pdf_obj *obj, char *act)
+static void execute_additional_action(fz_context *ctx, pdf_document *doc, pdf_obj *obj, char *act)
{
- pdf_obj *a = pdf_dict_getp(obj, act);
+ pdf_obj *a = pdf_dict_getp(ctx, obj, act);
if (a)
{
@@ -401,24 +396,23 @@ static void execute_additional_action(pdf_document *doc, pdf_obj *obj, char *act
e.target = obj;
e.value = "";
pdf_js_setup_event(doc->js, &e);
- execute_action(doc, obj, a);
+ execute_action(ctx, doc, obj, a);
}
}
-static void check_off(pdf_document *doc, pdf_obj *obj)
+static void check_off(fz_context *ctx, pdf_document *doc, pdf_obj *obj)
{
- fz_context *ctx = doc->ctx;
pdf_obj *off = NULL;
fz_var(off);
fz_try(ctx);
{
- off = pdf_new_name(doc, "Off");
- pdf_dict_puts(obj, "AS", off);
+ off = pdf_new_name(ctx, doc, "Off");
+ pdf_dict_puts(ctx, obj, "AS", off);
}
fz_always(ctx)
{
- pdf_drop_obj(off);
+ pdf_drop_obj(ctx, off);
}
fz_catch(ctx)
{
@@ -426,27 +420,26 @@ static void check_off(pdf_document *doc, pdf_obj *obj)
}
}
-static void set_check(pdf_document *doc, pdf_obj *chk, char *name)
+static void set_check(fz_context *ctx, pdf_document *doc, pdf_obj *chk, char *name)
{
- pdf_obj *n = pdf_dict_getp(chk, "AP/N");
+ pdf_obj *n = pdf_dict_getp(ctx, chk, "AP/N");
pdf_obj *val = NULL;
- fz_context *ctx = doc->ctx;
fz_var(val);
fz_try(ctx)
{
/* If name is a possible value of this check
* box then use it, otherwise use "Off" */
- if (pdf_dict_gets(n, name))
- val = pdf_new_name(doc, name);
+ if (pdf_dict_gets(ctx, n, name))
+ val = pdf_new_name(ctx, doc, name);
else
- val = pdf_new_name(doc, "Off");
+ val = pdf_new_name(ctx, doc, "Off");
- pdf_dict_puts(chk, "AS", val);
+ pdf_dict_puts(ctx, chk, "AS", val);
}
fz_always(ctx)
{
- pdf_drop_obj(val);
+ pdf_drop_obj(ctx, val);
}
fz_catch(ctx)
{
@@ -456,55 +449,53 @@ static void set_check(pdf_document *doc, pdf_obj *chk, char *name)
/* Set the values of all fields in a group defined by a node
* in the hierarchy */
-static void set_check_grp(pdf_document *doc, pdf_obj *grp, char *val)
+static void set_check_grp(fz_context *ctx, pdf_document *doc, pdf_obj *grp, char *val)
{
- pdf_obj *kids = pdf_dict_gets(grp, "Kids");
+ pdf_obj *kids = pdf_dict_gets(ctx, grp, "Kids");
if (kids == NULL)
{
- set_check(doc, grp, val);
+ set_check(ctx, doc, grp, val);
}
else
{
- int i, n = pdf_array_len(kids);
+ int i, n = pdf_array_len(ctx, kids);
for (i = 0; i < n; i++)
- set_check_grp(doc, pdf_array_get(kids, i), val);
+ set_check_grp(ctx, doc, pdf_array_get(ctx, kids, i), val);
}
}
-static void recalculate(pdf_document *doc)
+static void recalculate(fz_context *ctx, pdf_document *doc)
{
- fz_context *ctx = doc->ctx;
-
if (doc->recalculating)
return;
doc->recalculating = 1;
fz_try(ctx)
{
- pdf_obj *co = pdf_dict_getp(pdf_trailer(doc), "Root/AcroForm/CO");
+ pdf_obj *co = pdf_dict_getp(ctx, pdf_trailer(ctx, doc), "Root/AcroForm/CO");
if (co && doc->js)
{
- int i, n = pdf_array_len(co);
+ int i, n = pdf_array_len(ctx, co);
for (i = 0; i < n; i++)
{
- pdf_obj *field = pdf_array_get(co, i);
- pdf_obj *calc = pdf_dict_getp(field, "AA/C");
+ pdf_obj *field = pdf_array_get(ctx, co, i);
+ pdf_obj *calc = pdf_dict_getp(ctx, field, "AA/C");
if (calc)
{
pdf_js_event e;
e.target = field;
- e.value = pdf_field_value(doc, field);
+ e.value = pdf_field_value(ctx, doc, field);
pdf_js_setup_event(doc->js, &e);
- execute_action(doc, field, calc);
+ execute_action(ctx, doc, field, calc);
/* A calculate action, updates event.value. We need
* to place the value in the field */
- update_field_value(doc, field, pdf_js_get_event(doc->js)->value);
+ update_field_value(ctx, doc, field, pdf_js_get_event(doc->js)->value);
}
}
}
@@ -519,25 +510,24 @@ static void recalculate(pdf_document *doc)
}
}
-static void toggle_check_box(pdf_document *doc, pdf_obj *obj)
+static void toggle_check_box(fz_context *ctx, pdf_document *doc, pdf_obj *obj)
{
- fz_context *ctx = doc->ctx;
- pdf_obj *as = pdf_dict_gets(obj, "AS");
- int ff = pdf_get_field_flags(doc, obj);
+ pdf_obj *as = pdf_dict_gets(ctx, obj, "AS");
+ int ff = pdf_get_field_flags(ctx, doc, obj);
int radio = ((ff & (Ff_Pushbutton|Ff_Radio)) == Ff_Radio);
char *val = NULL;
- pdf_obj *grp = radio ? pdf_dict_gets(obj, "Parent") : find_head_of_field_group(obj);
+ pdf_obj *grp = radio ? pdf_dict_gets(ctx, obj, "Parent") : find_head_of_field_group(ctx, obj);
if (!grp)
grp = obj;
- if (as && strcmp(pdf_to_name(as), "Off"))
+ if (as && strcmp(pdf_to_name(ctx, as), "Off"))
{
/* "as" neither missing nor set to Off. Set it to Off, unless
* this is a non-toggle-off radio button. */
if ((ff & (Ff_Pushbutton|Ff_NoToggleToOff|Ff_Radio)) != (Ff_NoToggleToOff|Ff_Radio))
{
- check_off(doc, obj);
+ check_off(ctx, doc, obj);
val = "Off";
}
}
@@ -546,14 +536,14 @@ static void toggle_check_box(pdf_document *doc, pdf_obj *obj)
pdf_obj *n, *key = NULL;
int len, i;
- n = pdf_dict_getp(obj, "AP/N");
+ n = pdf_dict_getp(ctx, obj, "AP/N");
/* Look for a key that isn't "Off" */
- len = pdf_dict_len(n);
+ len = pdf_dict_len(ctx, n);
for (i = 0; i < len; i++)
{
- key = pdf_dict_get_key(n, i);
- if (pdf_is_name(key) && strcmp(pdf_to_name(key), "Off"))
+ key = pdf_dict_get_key(ctx, n, i);
+ if (pdf_is_name(ctx, key) && strcmp(pdf_to_name(ctx, key), "Off"))
break;
}
@@ -561,19 +551,19 @@ static void toggle_check_box(pdf_document *doc, pdf_obj *obj)
if (!key)
return;
- val = pdf_to_name(key);
+ val = pdf_to_name(ctx, key);
if (radio)
{
/* For radio buttons, first turn off all buttons in the group and
* then set the one that was clicked */
- pdf_obj *kids = pdf_dict_gets(grp, "Kids");
+ pdf_obj *kids = pdf_dict_gets(ctx, grp, "Kids");
- len = pdf_array_len(kids);
+ len = pdf_array_len(ctx, kids);
for (i = 0; i < len; i++)
- check_off(doc, pdf_array_get(kids, i));
+ check_off(ctx, doc, pdf_array_get(ctx, kids, i));
- pdf_dict_puts(obj, "AS", key);
+ pdf_dict_puts(ctx, obj, "AS", key);
}
else
{
@@ -582,9 +572,9 @@ static void toggle_check_box(pdf_document *doc, pdf_obj *obj)
* all to the same value. This may cause the group to act like
* radio buttons, if each have distinct "On" values */
if (grp)
- set_check_grp(doc, grp, val);
+ set_check_grp(ctx, doc, grp, val);
else
- set_check(doc, obj, val);
+ set_check(ctx, doc, obj, val);
}
}
@@ -595,28 +585,28 @@ static void toggle_check_box(pdf_document *doc, pdf_obj *obj)
fz_var(v);
fz_try(ctx)
{
- v = pdf_new_string(doc, val, strlen(val));
- pdf_dict_puts(grp, "V", v);
+ v = pdf_new_string(ctx, doc, val, strlen(val));
+ pdf_dict_puts(ctx, grp, "V", v);
}
fz_always(ctx)
{
- pdf_drop_obj(v);
+ pdf_drop_obj(ctx, v);
}
fz_catch(ctx)
{
fz_rethrow(ctx);
}
- recalculate(doc);
+ recalculate(ctx, doc);
}
}
-int pdf_has_unsaved_changes(pdf_document *doc)
+int pdf_has_unsaved_changes(fz_context *ctx, pdf_document *doc)
{
return doc->dirty;
}
-int pdf_pass_event(pdf_document *doc, pdf_page *page, pdf_ui_event *ui_event)
+int pdf_pass_event(fz_context *ctx, pdf_document *doc, pdf_page *page, pdf_ui_event *ui_event)
{
pdf_annot *annot;
pdf_hotspot *hp = &doc->hotspot;
@@ -635,7 +625,7 @@ int pdf_pass_event(pdf_document *doc, pdf_page *page, pdf_ui_event *ui_event)
if (annot)
{
- int f = pdf_to_int(pdf_dict_gets(annot->obj, "F"));
+ int f = pdf_to_int(ctx, pdf_dict_gets(ctx, annot->obj, "F"));
if (f & (F_Hidden|F_NoView))
annot = NULL;
@@ -651,24 +641,24 @@ int pdf_pass_event(pdf_document *doc, pdf_page *page, pdf_ui_event *ui_event)
if (doc->focus_obj)
{
/* Execute the blur action */
- execute_additional_action(doc, doc->focus_obj, "AA/Bl");
+ execute_additional_action(ctx, doc, doc->focus_obj, "AA/Bl");
doc->focus = NULL;
- pdf_drop_obj(doc->focus_obj);
+ pdf_drop_obj(ctx, doc->focus_obj);
doc->focus_obj = NULL;
}
if (annot)
{
doc->focus = annot;
- doc->focus_obj = pdf_keep_obj(annot->obj);
+ doc->focus_obj = pdf_keep_obj(ctx, annot->obj);
- hp->num = pdf_to_num(annot->obj);
- hp->gen = pdf_to_gen(annot->obj);
+ hp->num = pdf_to_num(ctx, annot->obj);
+ hp->gen = pdf_to_gen(ctx, annot->obj);
hp->state = HOTSPOT_POINTER_DOWN;
changed = 1;
/* Exectute the down and focus actions */
- execute_additional_action(doc, annot->obj, "AA/Fo");
- execute_additional_action(doc, annot->obj, "AA/D");
+ execute_additional_action(ctx, doc, annot->obj, "AA/Fo");
+ execute_additional_action(ctx, doc, annot->obj, "AA/D");
}
break;
@@ -687,15 +677,15 @@ int pdf_pass_event(pdf_document *doc, pdf_page *page, pdf_ui_event *ui_event)
case PDF_WIDGET_TYPE_RADIOBUTTON:
case PDF_WIDGET_TYPE_CHECKBOX:
/* FIXME: treating radio buttons like check boxes, for now */
- toggle_check_box(doc, annot->obj);
+ toggle_check_box(ctx, doc, annot->obj);
changed = 1;
break;
}
/* Execute the up action */
- execute_additional_action(doc, annot->obj, "AA/U");
+ execute_additional_action(ctx, doc, annot->obj, "AA/U");
/* Execute the main action chain */
- execute_action_chain(doc, annot->obj);
+ execute_action_chain(ctx, doc, annot->obj);
}
break;
}
@@ -706,9 +696,8 @@ int pdf_pass_event(pdf_document *doc, pdf_page *page, pdf_ui_event *ui_event)
return changed;
}
-void pdf_update_page(pdf_document *doc, pdf_page *page)
+void pdf_update_page(fz_context *ctx, pdf_document *doc, pdf_page *page)
{
- fz_context *ctx = doc->ctx;
pdf_annot *annot;
/* Reset changed_annots to empty */
@@ -732,7 +721,7 @@ void pdf_update_page(pdf_document *doc, pdf_page *page)
fz_try(ctx)
{
- pdf_update_annot(doc, annot);
+ pdf_update_annot(ctx, doc, annot);
if ((ap != annot->ap || ap_iteration != annot->ap_iteration))
{
@@ -769,7 +758,7 @@ void pdf_update_page(pdf_document *doc, pdf_page *page)
page->deleted_annots = NULL;
}
-pdf_annot *pdf_poll_changed_annot(pdf_document *idoc, pdf_page *page)
+pdf_annot *pdf_poll_changed_annot(fz_context *ctx, pdf_document *idoc, pdf_page *page)
{
pdf_annot *annot = page->changed_annots;
@@ -779,12 +768,12 @@ pdf_annot *pdf_poll_changed_annot(pdf_document *idoc, pdf_page *page)
return annot;
}
-pdf_widget *pdf_focused_widget(pdf_document *doc)
+pdf_widget *pdf_focused_widget(fz_context *ctx, pdf_document *doc)
{
return (pdf_widget *)doc->focus;
}
-pdf_widget *pdf_first_widget(pdf_document *doc, pdf_page *page)
+pdf_widget *pdf_first_widget(fz_context *ctx, pdf_document *doc, pdf_page *page)
{
pdf_annot *annot = page->annots;
@@ -794,7 +783,7 @@ pdf_widget *pdf_first_widget(pdf_document *doc, pdf_page *page)
return (pdf_widget *)annot;
}
-pdf_widget *pdf_next_widget(pdf_widget *previous)
+pdf_widget *pdf_next_widget(fz_context *ctx, pdf_widget *previous)
{
pdf_annot *annot = (pdf_annot *)previous;
@@ -807,46 +796,45 @@ pdf_widget *pdf_next_widget(pdf_widget *previous)
return (pdf_widget *)annot;
}
-pdf_widget *pdf_create_widget(pdf_document *doc, pdf_page *page, int type, char *fieldname)
+pdf_widget *pdf_create_widget(fz_context *ctx, pdf_document *doc, pdf_page *page, int type, char *fieldname)
{
- fz_context *ctx = doc->ctx;
pdf_obj *form = NULL;
- int old_sigflags = pdf_to_int(pdf_dict_getp(pdf_trailer(doc), "Root/AcroForm/SigFlags"));
- pdf_annot *annot = pdf_create_annot(doc, page, FZ_ANNOT_WIDGET);
+ int old_sigflags = pdf_to_int(ctx, pdf_dict_getp(ctx, pdf_trailer(ctx, doc), "Root/AcroForm/SigFlags"));
+ pdf_annot *annot = pdf_create_annot(ctx, doc, page, FZ_ANNOT_WIDGET);
fz_try(ctx)
{
- pdf_set_field_type(doc, annot->obj, type);
- pdf_dict_puts_drop(annot->obj, "T", pdf_new_string(doc, fieldname, strlen(fieldname)));
+ pdf_set_field_type(ctx, doc, annot->obj, type);
+ pdf_dict_puts_drop(ctx, annot->obj, "T", pdf_new_string(ctx, doc, fieldname, strlen(fieldname)));
annot->widget_type = type;
if (type == PDF_WIDGET_TYPE_SIGNATURE)
{
int sigflags = (old_sigflags | (SigFlag_SignaturesExist|SigFlag_AppendOnly));
- pdf_dict_putp_drop(pdf_trailer(doc), "Root/AcroForm/SigFlags", pdf_new_int(doc, sigflags));
+ pdf_dict_putp_drop(ctx, pdf_trailer(ctx, doc), "Root/AcroForm/SigFlags", pdf_new_int(ctx, doc, sigflags));
}
/*
pdf_create_annot will have linked the new widget into the page's
annot array. We also need it linked into the document's form
*/
- form = pdf_dict_getp(pdf_trailer(doc), "Root/AcroForm/Fields");
+ form = pdf_dict_getp(ctx, pdf_trailer(ctx, doc), "Root/AcroForm/Fields");
if (!form)
{
- form = pdf_new_array(doc, 1);
- pdf_dict_putp_drop(pdf_trailer(doc), "Root/AcroForm/Fields", form);
+ form = pdf_new_array(ctx, doc, 1);
+ pdf_dict_putp_drop(ctx, pdf_trailer(ctx, doc), "Root/AcroForm/Fields", form);
}
- pdf_array_push(form, annot->obj); /* Cleanup relies on this statement being last */
+ pdf_array_push(ctx, form, annot->obj); /* Cleanup relies on this statement being last */
}
fz_catch(ctx)
{
- pdf_delete_annot(doc, page, annot);
+ pdf_delete_annot(ctx, doc, page, annot);
/* An empty Fields array may have been created, but that is harmless */
if (type == PDF_WIDGET_TYPE_SIGNATURE)
- pdf_dict_putp_drop(pdf_trailer(doc), "Root/AcroForm/SigFlags", pdf_new_int(doc, old_sigflags));
+ pdf_dict_putp_drop(ctx, pdf_trailer(ctx, doc), "Root/AcroForm/SigFlags", pdf_new_int(ctx, doc, old_sigflags));
fz_rethrow(ctx);
}
@@ -854,15 +842,15 @@ pdf_widget *pdf_create_widget(pdf_document *doc, pdf_page *page, int type, char
return (pdf_widget *)annot;
}
-int pdf_widget_get_type(pdf_widget *widget)
+int pdf_widget_get_type(fz_context *ctx, pdf_widget *widget)
{
pdf_annot *annot = (pdf_annot *)widget;
return annot->widget_type;
}
-static int set_text_field_value(pdf_document *doc, pdf_obj *field, char *text)
+static int set_text_field_value(fz_context *ctx, pdf_document *doc, pdf_obj *field, char *text)
{
- pdf_obj *v = pdf_dict_getp(field, "AA/V");
+ pdf_obj *v = pdf_dict_getp(ctx, field, "AA/V");
if (v && doc->js)
{
@@ -871,7 +859,7 @@ static int set_text_field_value(pdf_document *doc, pdf_obj *field, char *text)
e.target = field;
e.value = text;
pdf_js_setup_event(doc->js, &e);
- execute_action(doc, field, v);
+ execute_action(ctx, doc, field, v);
if (!pdf_js_get_event(doc->js)->rc)
return 0;
@@ -879,43 +867,42 @@ static int set_text_field_value(pdf_document *doc, pdf_obj *field, char *text)
text = pdf_js_get_event(doc->js)->value;
}
- if (pdf_field_dirties_document(doc, field))
+ if (pdf_field_dirties_document(ctx, doc, field))
doc->dirty = 1;
- update_field_value(doc, field, text);
+ update_field_value(ctx, doc, field, text);
return 1;
}
-static void update_checkbox_selector(pdf_document *doc, pdf_obj *field, char *val)
+static void update_checkbox_selector(fz_context *ctx, pdf_document *doc, pdf_obj *field, char *val)
{
- fz_context *ctx = doc->ctx;
- pdf_obj *kids = pdf_dict_gets(field, "Kids");
+ pdf_obj *kids = pdf_dict_gets(ctx, field, "Kids");
if (kids)
{
- int i, n = pdf_array_len(kids);
+ int i, n = pdf_array_len(ctx, kids);
for (i = 0; i < n; i++)
- update_checkbox_selector(doc, pdf_array_get(kids, i), val);
+ update_checkbox_selector(ctx, doc, pdf_array_get(ctx, kids, i), val);
}
else
{
- pdf_obj *n = pdf_dict_getp(field, "AP/N");
+ pdf_obj *n = pdf_dict_getp(ctx, field, "AP/N");
pdf_obj *oval = NULL;
fz_var(oval);
fz_try(ctx)
{
- if (pdf_dict_gets(n, val))
- oval = pdf_new_name(doc, val);
+ if (pdf_dict_gets(ctx, n, val))
+ oval = pdf_new_name(ctx, doc, val);
else
- oval = pdf_new_name(doc, "Off");
+ oval = pdf_new_name(ctx, doc, "Off");
- pdf_dict_puts(field, "AS", oval);
+ pdf_dict_puts(ctx, field, "AS", oval);
}
fz_always(ctx)
{
- pdf_drop_obj(oval);
+ pdf_drop_obj(ctx, oval);
}
fz_catch(ctx)
{
@@ -924,43 +911,43 @@ static void update_checkbox_selector(pdf_document *doc, pdf_obj *field, char *va
}
}
-static int set_checkbox_value(pdf_document *doc, pdf_obj *field, char *val)
+static int set_checkbox_value(fz_context *ctx, pdf_document *doc, pdf_obj *field, char *val)
{
- update_checkbox_selector(doc, field, val);
- update_field_value(doc, field, val);
+ update_checkbox_selector(ctx, doc, field, val);
+ update_field_value(ctx, doc, field, val);
return 1;
}
-int pdf_field_set_value(pdf_document *doc, pdf_obj *field, char *text)
+int pdf_field_set_value(fz_context *ctx, pdf_document *doc, pdf_obj *field, char *text)
{
int res = 0;
- switch (pdf_field_type(doc, field))
+ switch (pdf_field_type(ctx, doc, field))
{
case PDF_WIDGET_TYPE_TEXT:
- res = set_text_field_value(doc, field, text);
+ res = set_text_field_value(ctx, doc, field, text);
break;
case PDF_WIDGET_TYPE_CHECKBOX:
case PDF_WIDGET_TYPE_RADIOBUTTON:
- res = set_checkbox_value(doc, field, text);
+ res = set_checkbox_value(ctx, doc, field, text);
break;
default:
/* text updater will do in most cases */
- update_field_value(doc, field, text);
+ update_field_value(ctx, doc, field, text);
res = 1;
break;
}
- recalculate(doc);
+ recalculate(ctx, doc);
return res;
}
-char *pdf_field_border_style(pdf_document *doc, pdf_obj *field)
+char *pdf_field_border_style(fz_context *ctx, pdf_document *doc, pdf_obj *field)
{
- char *bs = pdf_to_name(pdf_dict_getp(field, "BS/S"));
+ char *bs = pdf_to_name(ctx, pdf_dict_getp(ctx, field, "BS/S"));
switch (*bs)
{
@@ -974,32 +961,31 @@ char *pdf_field_border_style(pdf_document *doc, pdf_obj *field)
return "Solid";
}
-void pdf_field_set_border_style(pdf_document *doc, pdf_obj *field, char *text)
+void pdf_field_set_border_style(fz_context *ctx, pdf_document *doc, pdf_obj *field, char *text)
{
- fz_context *ctx = doc->ctx;
pdf_obj *val = NULL;
if (!strcmp(text, "Solid"))
- val = pdf_new_name(doc, "S");
+ val = pdf_new_name(ctx, doc, "S");
else if (!strcmp(text, "Dashed"))
- val = pdf_new_name(doc, "D");
+ val = pdf_new_name(ctx, doc, "D");
else if (!strcmp(text, "Beveled"))
- val = pdf_new_name(doc, "B");
+ val = pdf_new_name(ctx, doc, "B");
else if (!strcmp(text, "Inset"))
- val = pdf_new_name(doc, "I");
+ val = pdf_new_name(ctx, doc, "I");
else if (!strcmp(text, "Underline"))
- val = pdf_new_name(doc, "U");
+ val = pdf_new_name(ctx, doc, "U");
else
return;
fz_try(ctx);
{
- pdf_dict_putp(field, "BS/S", val);
- pdf_field_mark_dirty(doc, field);
+ pdf_dict_putp(ctx, field, "BS/S", val);
+ pdf_field_mark_dirty(ctx, doc, field);
}
fz_always(ctx)
{
- pdf_drop_obj(val);
+ pdf_drop_obj(ctx, val);
}
fz_catch(ctx)
{
@@ -1007,22 +993,21 @@ void pdf_field_set_border_style(pdf_document *doc, pdf_obj *field, char *text)
}
}
-void pdf_field_set_button_caption(pdf_document *doc, pdf_obj *field, char *text)
+void pdf_field_set_button_caption(fz_context *ctx, pdf_document *doc, pdf_obj *field, char *text)
{
- fz_context *ctx = doc->ctx;
- pdf_obj *val = pdf_new_string(doc, text, strlen(text));
+ pdf_obj *val = pdf_new_string(ctx, doc, text, strlen(text));
fz_try(ctx);
{
- if (pdf_field_type(doc, field) == PDF_WIDGET_TYPE_PUSHBUTTON)
+ if (pdf_field_type(ctx, doc, field) == PDF_WIDGET_TYPE_PUSHBUTTON)
{
- pdf_dict_putp(field, "MK/CA", val);
- pdf_field_mark_dirty(doc, field);
+ pdf_dict_putp(ctx, field, "MK/CA", val);
+ pdf_field_mark_dirty(ctx, doc, field);
}
}
fz_always(ctx)
{
- pdf_drop_obj(val);
+ pdf_drop_obj(ctx, val);
}
fz_catch(ctx)
{
@@ -1030,7 +1015,7 @@ void pdf_field_set_button_caption(pdf_document *doc, pdf_obj *field, char *text)
}
}
-int pdf_field_display(pdf_document *doc, pdf_obj *field)
+int pdf_field_display(fz_context *ctx, pdf_document *doc, pdf_obj *field)
{
pdf_obj *kids;
int f, res = Display_Visible;
@@ -1038,10 +1023,10 @@ int pdf_field_display(pdf_document *doc, pdf_obj *field)
/* Base response on first of children. Not ideal,
* but not clear how to handle children with
* differing values */
- while ((kids = pdf_dict_gets(field, "Kids")) != NULL)
- field = pdf_array_get(kids, 0);
+ while ((kids = pdf_dict_gets(ctx, field, "Kids")) != NULL)
+ field = pdf_array_get(ctx, kids, 0);
- f = pdf_to_int(pdf_dict_gets(field, "F"));
+ f = pdf_to_int(ctx, pdf_dict_gets(ctx, field, "F"));
if (f & F_Hidden)
{
@@ -1067,12 +1052,11 @@ int pdf_field_display(pdf_document *doc, pdf_obj *field)
* get the field name in a char buffer that has spare room to
* add more characters at the end.
*/
-static char *get_field_name(pdf_document *doc, pdf_obj *field, int spare)
+static char *get_field_name(fz_context *ctx, pdf_document *doc, pdf_obj *field, int spare)
{
- fz_context *ctx = doc->ctx;
char *res = NULL;
- pdf_obj *parent = pdf_dict_gets(field, "Parent");
- char *lname = pdf_to_str_buf(pdf_dict_gets(field, "T"));
+ pdf_obj *parent = pdf_dict_gets(ctx, field, "Parent");
+ char *lname = pdf_to_str_buf(ctx, pdf_dict_gets(ctx, field, "T"));
int llen = strlen(lname);
/*
@@ -1084,7 +1068,7 @@ static char *get_field_name(pdf_document *doc, pdf_obj *field, int spare)
if (parent)
{
- res = get_field_name(doc, parent, spare);
+ res = get_field_name(ctx, doc, parent, spare);
}
else
{
@@ -1103,20 +1087,19 @@ static char *get_field_name(pdf_document *doc, pdf_obj *field, int spare)
return res;
}
-char *pdf_field_name(pdf_document *doc, pdf_obj *field)
+char *pdf_field_name(fz_context *ctx, pdf_document *doc, pdf_obj *field)
{
- return get_field_name(doc, field, 0);
+ return get_field_name(ctx, doc, field, 0);
}
-void pdf_field_set_display(pdf_document *doc, pdf_obj *field, int d)
+void pdf_field_set_display(fz_context *ctx, pdf_document *doc, pdf_obj *field, int d)
{
- fz_context *ctx = doc->ctx;
- pdf_obj *kids = pdf_dict_gets(field, "Kids");
+ pdf_obj *kids = pdf_dict_gets(ctx, field, "Kids");
if (!kids)
{
int mask = (F_Hidden|F_Print|F_NoView);
- int f = pdf_to_int(pdf_dict_gets(field, "F")) & ~mask;
+ int f = pdf_to_int(ctx, pdf_dict_gets(ctx, field, "F")) & ~mask;
pdf_obj *fo = NULL;
switch (d)
@@ -1137,12 +1120,12 @@ void pdf_field_set_display(pdf_document *doc, pdf_obj *field, int d)
fz_var(fo);
fz_try(ctx)
{
- fo = pdf_new_int(doc, f);
- pdf_dict_puts(field, "F", fo);
+ fo = pdf_new_int(ctx, doc, f);
+ pdf_dict_puts(ctx, field, "F", fo);
}
fz_always(ctx)
{
- pdf_drop_obj(fo);
+ pdf_drop_obj(ctx, fo);
}
fz_catch(ctx)
{
@@ -1151,28 +1134,27 @@ void pdf_field_set_display(pdf_document *doc, pdf_obj *field, int d)
}
else
{
- int i, n = pdf_array_len(kids);
+ int i, n = pdf_array_len(ctx, kids);
for (i = 0; i < n; i++)
- pdf_field_set_display(doc, pdf_array_get(kids, i), d);
+ pdf_field_set_display(ctx, doc, pdf_array_get(ctx, kids, i), d);
}
}
-void pdf_field_set_fill_color(pdf_document *doc, pdf_obj *field, pdf_obj *col)
+void pdf_field_set_fill_color(fz_context *ctx, pdf_document *doc, pdf_obj *field, pdf_obj *col)
{
/* col == NULL mean transparent, but we can simply pass it on as with
* non-NULL values because pdf_dict_putp interprets a NULL value as
* delete */
- pdf_dict_putp(field, "MK/BG", col);
- pdf_field_mark_dirty(doc, field);
+ pdf_dict_putp(ctx, field, "MK/BG", col);
+ pdf_field_mark_dirty(ctx, doc, field);
}
-void pdf_field_set_text_color(pdf_document *doc, pdf_obj *field, pdf_obj *col)
+void pdf_field_set_text_color(fz_context *ctx, pdf_document *doc, pdf_obj *field, pdf_obj *col)
{
- fz_context *ctx = doc->ctx;
pdf_da_info di;
fz_buffer *fzbuf = NULL;
- char *da = pdf_to_str_buf(pdf_get_inheritable(doc, field, "DA"));
+ char *da = pdf_to_str_buf(ctx, pdf_get_inheritable(ctx, doc, field, "DA"));
unsigned char *buf;
int len;
pdf_obj *daobj = NULL;
@@ -1187,24 +1169,24 @@ void pdf_field_set_text_color(pdf_document *doc, pdf_obj *field, pdf_obj *col)
int i;
pdf_parse_da(ctx, da, &di);
- di.col_size = pdf_array_len(col);
+ di.col_size = pdf_array_len(ctx, col);
len = fz_mini(di.col_size, nelem(di.col));
for (i = 0; i < len; i++)
- di.col[i] = pdf_to_real(pdf_array_get(col, i));
+ di.col[i] = pdf_to_real(ctx, pdf_array_get(ctx, col, i));
fzbuf = fz_new_buffer(ctx, 0);
pdf_fzbuf_print_da(ctx, fzbuf, &di);
len = fz_buffer_storage(ctx, fzbuf, &buf);
- daobj = pdf_new_string(doc, (char *)buf, len);
- pdf_dict_puts(field, "DA", daobj);
- pdf_field_mark_dirty(doc, field);
+ daobj = pdf_new_string(ctx, doc, (char *)buf, len);
+ pdf_dict_puts(ctx, field, "DA", daobj);
+ pdf_field_mark_dirty(ctx, doc, field);
}
fz_always(ctx)
{
pdf_da_info_fin(ctx, &di);
fz_drop_buffer(ctx, fzbuf);
- pdf_drop_obj(daobj);
+ pdf_drop_obj(ctx, daobj);
}
fz_catch(ctx)
{
@@ -1212,7 +1194,7 @@ void pdf_field_set_text_color(pdf_document *doc, pdf_obj *field, pdf_obj *col)
}
}
-fz_rect *pdf_bound_widget(pdf_widget *widget, fz_rect *rect)
+fz_rect *pdf_bound_widget(fz_context *ctx, pdf_widget *widget, fz_rect *rect)
{
pdf_annot *annot = (pdf_annot *)widget;
@@ -1223,16 +1205,15 @@ fz_rect *pdf_bound_widget(pdf_widget *widget, fz_rect *rect)
return rect;
}
-char *pdf_text_widget_text(pdf_document *doc, pdf_widget *tw)
+char *pdf_text_widget_text(fz_context *ctx, pdf_document *doc, pdf_widget *tw)
{
pdf_annot *annot = (pdf_annot *)tw;
- fz_context *ctx = doc->ctx;
char *text = NULL;
fz_var(text);
fz_try(ctx)
{
- text = pdf_field_value(doc, annot->obj);
+ text = pdf_field_value(ctx, doc, annot->obj);
}
fz_catch(ctx)
{
@@ -1242,24 +1223,23 @@ char *pdf_text_widget_text(pdf_document *doc, pdf_widget *tw)
return text;
}
-int pdf_text_widget_max_len(pdf_document *doc, pdf_widget *tw)
+int pdf_text_widget_max_len(fz_context *ctx, pdf_document *doc, pdf_widget *tw)
{
pdf_annot *annot = (pdf_annot *)tw;
- return pdf_to_int(pdf_get_inheritable(doc, annot->obj, "MaxLen"));
+ return pdf_to_int(ctx, pdf_get_inheritable(ctx, doc, annot->obj, "MaxLen"));
}
-int pdf_text_widget_content_type(pdf_document *doc, pdf_widget *tw)
+int pdf_text_widget_content_type(fz_context *ctx, pdf_document *doc, pdf_widget *tw)
{
pdf_annot *annot = (pdf_annot *)tw;
- fz_context *ctx = doc->ctx;
char *code = NULL;
int type = PDF_WIDGET_CONTENT_UNRESTRAINED;
fz_var(code);
fz_try(ctx)
{
- code = pdf_get_string_or_stream(doc, pdf_dict_getp(annot->obj, "AA/F/JS"));
+ code = pdf_get_string_or_stream(ctx, doc, pdf_dict_getp(ctx, annot->obj, "AA/F/JS"));
if (code)
{
if (strstr(code, "AFNumber_Format"))
@@ -1284,9 +1264,9 @@ int pdf_text_widget_content_type(pdf_document *doc, pdf_widget *tw)
return type;
}
-static int run_keystroke(pdf_document *doc, pdf_obj *field, char **text)
+static int run_keystroke(fz_context *ctx, pdf_document *doc, pdf_obj *field, char **text)
{
- pdf_obj *k = pdf_dict_getp(field, "AA/K");
+ pdf_obj *k = pdf_dict_getp(ctx, field, "AA/K");
if (k && doc->js)
{
@@ -1295,7 +1275,7 @@ static int run_keystroke(pdf_document *doc, pdf_obj *field, char **text)
e.target = field;
e.value = *text;
pdf_js_setup_event(doc->js, &e);
- execute_action(doc, field, k);
+ execute_action(ctx, doc, field, k);
if (!pdf_js_get_event(doc->js)->rc)
return 0;
@@ -1306,17 +1286,16 @@ static int run_keystroke(pdf_document *doc, pdf_obj *field, char **text)
return 1;
}
-int pdf_text_widget_set_text(pdf_document *doc, pdf_widget *tw, char *text)
+int pdf_text_widget_set_text(fz_context *ctx, pdf_document *doc, pdf_widget *tw, char *text)
{
pdf_annot *annot = (pdf_annot *)tw;
- fz_context *ctx = doc->ctx;
int accepted = 0;
fz_try(ctx)
{
- accepted = run_keystroke(doc, annot->obj, &text);
+ accepted = run_keystroke(ctx, doc, annot->obj, &text);
if (accepted)
- accepted = pdf_field_set_value(doc, annot->obj, text);
+ accepted = pdf_field_set_value(ctx, doc, annot->obj, text);
}
fz_catch(ctx)
{
@@ -1326,7 +1305,7 @@ int pdf_text_widget_set_text(pdf_document *doc, pdf_widget *tw, char *text)
return accepted;
}
-int pdf_choice_widget_options(pdf_document *doc, pdf_widget *tw, char *opts[])
+int pdf_choice_widget_options(fz_context *ctx, pdf_document *doc, pdf_widget *tw, char *opts[])
{
pdf_annot *annot = (pdf_annot *)tw;
pdf_obj *optarr;
@@ -1335,37 +1314,37 @@ int pdf_choice_widget_options(pdf_document *doc, pdf_widget *tw, char *opts[])
if (!annot)
return 0;
- optarr = pdf_dict_gets(annot->obj, "Opt");
- n = pdf_array_len(optarr);
+ optarr = pdf_dict_gets(ctx, annot->obj, "Opt");
+ n = pdf_array_len(ctx, optarr);
if (opts)
{
for (i = 0; i < n; i++)
{
- opts[i] = pdf_to_str_buf(pdf_array_get(optarr, i));
+ opts[i] = pdf_to_str_buf(ctx, pdf_array_get(ctx, optarr, i));
}
}
return n;
}
-int pdf_choice_widget_is_multiselect(pdf_document *doc, pdf_widget *tw)
+int pdf_choice_widget_is_multiselect(fz_context *ctx, pdf_document *doc, pdf_widget *tw)
{
pdf_annot *annot = (pdf_annot *)tw;
if (!annot) return 0;
- switch (pdf_field_type(doc, annot->obj))
+ switch (pdf_field_type(ctx, doc, annot->obj))
{
case PDF_WIDGET_TYPE_LISTBOX:
case PDF_WIDGET_TYPE_COMBOBOX:
- return (pdf_get_field_flags(doc, annot->obj) & Ff_MultiSelect) != 0;
+ return (pdf_get_field_flags(ctx, doc, annot->obj) & Ff_MultiSelect) != 0;
default:
return 0;
}
}
-int pdf_choice_widget_value(pdf_document *doc, pdf_widget *tw, char *opts[])
+int pdf_choice_widget_value(fz_context *ctx, pdf_document *doc, pdf_widget *tw, char *opts[])
{
pdf_annot *annot = (pdf_annot *)tw;
pdf_obj *optarr;
@@ -1374,29 +1353,29 @@ int pdf_choice_widget_value(pdf_document *doc, pdf_widget *tw, char *opts[])
if (!annot)
return 0;
- optarr = pdf_dict_gets(annot->obj, "V");
+ optarr = pdf_dict_gets(ctx, annot->obj, "V");
- if (pdf_is_string(optarr))
+ if (pdf_is_string(ctx, optarr))
{
if (opts)
- opts[0] = pdf_to_str_buf(optarr);
+ opts[0] = pdf_to_str_buf(ctx, optarr);
return 1;
}
else
{
- n = pdf_array_len(optarr);
+ n = pdf_array_len(ctx, optarr);
if (opts)
{
for (i = 0; i < n; i++)
{
- pdf_obj *elem = pdf_array_get(optarr, i);
+ pdf_obj *elem = pdf_array_get(ctx, optarr, i);
- if (pdf_is_array(elem))
- elem = pdf_array_get(elem, 1);
+ if (pdf_is_array(ctx, elem))
+ elem = pdf_array_get(ctx, elem, 1);
- opts[i] = pdf_to_str_buf(elem);
+ opts[i] = pdf_to_str_buf(ctx, elem);
}
}
@@ -1404,9 +1383,8 @@ int pdf_choice_widget_value(pdf_document *doc, pdf_widget *tw, char *opts[])
}
}
-void pdf_choice_widget_set_value(pdf_document *doc, pdf_widget *tw, int n, char *opts[])
+void pdf_choice_widget_set_value(fz_context *ctx, pdf_document *doc, pdf_widget *tw, int n, char *opts[])
{
- fz_context *ctx = doc->ctx;
pdf_annot *annot = (pdf_annot *)tw;
pdf_obj *optarr = NULL, *opt = NULL;
int i;
@@ -1420,71 +1398,70 @@ void pdf_choice_widget_set_value(pdf_document *doc, pdf_widget *tw, int n, char
{
if (n != 1)
{
- optarr = pdf_new_array(doc, n);
+ optarr = pdf_new_array(ctx, doc, n);
for (i = 0; i < n; i++)
{
- opt = pdf_new_string(doc, opts[i], strlen(opts[i]));
- pdf_array_push(optarr, opt);
- pdf_drop_obj(opt);
+ opt = pdf_new_string(ctx, doc, opts[i], strlen(opts[i]));
+ pdf_array_push(ctx, optarr, opt);
+ pdf_drop_obj(ctx, opt);
opt = NULL;
}
- pdf_dict_puts(annot->obj, "V", optarr);
- pdf_drop_obj(optarr);
+ pdf_dict_puts(ctx, annot->obj, "V", optarr);
+ pdf_drop_obj(ctx, optarr);
}
else
{
- opt = pdf_new_string(doc, opts[0], strlen(opts[0]));
- pdf_dict_puts(annot->obj, "V", opt);
- pdf_drop_obj(opt);
+ opt = pdf_new_string(ctx, doc, opts[0], strlen(opts[0]));
+ pdf_dict_puts(ctx, annot->obj, "V", opt);
+ pdf_drop_obj(ctx, opt);
}
/* FIXME: when n > 1, we should be regenerating the indexes */
- pdf_dict_dels(annot->obj, "I");
+ pdf_dict_dels(ctx, annot->obj, "I");
- pdf_field_mark_dirty(doc, annot->obj);
- if (pdf_field_dirties_document(doc, annot->obj))
+ pdf_field_mark_dirty(ctx, doc, annot->obj);
+ if (pdf_field_dirties_document(ctx, doc, annot->obj))
doc->dirty = 1;
}
fz_catch(ctx)
{
- pdf_drop_obj(optarr);
- pdf_drop_obj(opt);
+ pdf_drop_obj(ctx, optarr);
+ pdf_drop_obj(ctx, opt);
fz_rethrow(ctx);
}
}
-int pdf_signature_widget_byte_range(pdf_document *doc, pdf_widget *widget, int (*byte_range)[2])
+int pdf_signature_widget_byte_range(fz_context *ctx, pdf_document *doc, pdf_widget *widget, int (*byte_range)[2])
{
pdf_annot *annot = (pdf_annot *)widget;
- pdf_obj *br = pdf_dict_getp(annot->obj, "V/ByteRange");
- int i, n = pdf_array_len(br)/2;
+ pdf_obj *br = pdf_dict_getp(ctx, annot->obj, "V/ByteRange");
+ int i, n = pdf_array_len(ctx, br)/2;
if (byte_range)
{
for (i = 0; i < n; i++)
{
- byte_range[i][0] = pdf_to_int(pdf_array_get(br, 2*i));
- byte_range[i][1] = pdf_to_int(pdf_array_get(br, 2*i+1));
+ byte_range[i][0] = pdf_to_int(ctx, pdf_array_get(ctx, br, 2*i));
+ byte_range[i][1] = pdf_to_int(ctx, pdf_array_get(ctx, br, 2*i+1));
}
}
return n;
}
-int pdf_signature_widget_contents(pdf_document *doc, pdf_widget *widget, char **contents)
+int pdf_signature_widget_contents(fz_context *ctx, pdf_document *doc, pdf_widget *widget, char **contents)
{
pdf_annot *annot = (pdf_annot *)widget;
- pdf_obj *c = pdf_dict_getp(annot->obj, "V/Contents");
+ pdf_obj *c = pdf_dict_getp(ctx, annot->obj, "V/Contents");
if (contents)
- *contents = pdf_to_str_buf(c);
- return pdf_to_str_len(c);
+ *contents = pdf_to_str_buf(ctx, c);
+ return pdf_to_str_len(ctx, c);
}
-void pdf_signature_set_value(pdf_document *doc, pdf_obj *field, pdf_signer *signer)
+void pdf_signature_set_value(fz_context *ctx, pdf_document *doc, pdf_obj *field, pdf_signer *signer)
{
- fz_context *ctx = doc->ctx;
pdf_obj *v;
pdf_obj *indv;
int vnum;
@@ -1495,40 +1472,40 @@ void pdf_signature_set_value(pdf_document *doc, pdf_obj *field, pdf_signer *sign
memset(buf, 0, sizeof(buf));
- vnum = pdf_create_object(doc);
- indv = pdf_new_indirect(doc, vnum, 0);
- pdf_dict_puts_drop(field, "V", indv);
+ vnum = pdf_create_object(ctx, doc);
+ indv = pdf_new_indirect(ctx, doc, vnum, 0);
+ pdf_dict_puts_drop(ctx, field, "V", indv);
fz_var(v);
fz_try(ctx)
{
- v = pdf_new_dict(doc, 4);
- pdf_update_object(doc, vnum, v);
+ v = pdf_new_dict(ctx, doc, 4);
+ pdf_update_object(ctx, doc, vnum, v);
}
fz_always(ctx)
{
- pdf_drop_obj(v);
+ pdf_drop_obj(ctx, v);
}
fz_catch(ctx)
{
fz_rethrow(ctx);
}
- byte_range = pdf_new_array(doc, 4);
- pdf_dict_puts_drop(v, "ByteRange", byte_range);
+ byte_range = pdf_new_array(ctx, doc, 4);
+ pdf_dict_puts_drop(ctx, v, "ByteRange", byte_range);
- contents = pdf_new_string(doc, buf, sizeof(buf));
- pdf_dict_puts_drop(v, "Contents", contents);
+ contents = pdf_new_string(ctx, doc, buf, sizeof(buf));
+ pdf_dict_puts_drop(ctx, v, "Contents", contents);
- pdf_dict_puts_drop(v, "Filter", pdf_new_name(doc, "Adobe.PPKLite"));
- pdf_dict_puts_drop(v, "SubFilter", pdf_new_name(doc, "adbe.pkcs7.detached"));
+ pdf_dict_puts_drop(ctx, v, "Filter", pdf_new_name(ctx, doc, "Adobe.PPKLite"));
+ pdf_dict_puts_drop(ctx, v, "SubFilter", pdf_new_name(ctx, doc, "adbe.pkcs7.detached"));
/* Record details within the document structure so that contents
* and byte_range can be updated with their correct values at
* saving time */
- unsaved_sig = fz_malloc_struct(doc->ctx, pdf_unsaved_sig);
- unsaved_sig->field = pdf_keep_obj(field);
- unsaved_sig->signer = pdf_keep_signer(signer);
+ unsaved_sig = fz_malloc_struct(ctx, pdf_unsaved_sig);
+ unsaved_sig->field = pdf_keep_obj(ctx, field);
+ unsaved_sig->signer = pdf_keep_signer(ctx, signer);
unsaved_sig->next = doc->unsaved_sigs;
doc->unsaved_sigs = unsaved_sig;
}
diff --git a/source/pdf/pdf-function.c b/source/pdf/pdf-function.c
index c8986e32..7ead09ca 100644
--- a/source/pdf/pdf-function.c
+++ b/source/pdf/pdf-function.c
@@ -111,7 +111,7 @@ struct ps_stack_s
#ifndef NDEBUG
void
-pdf_debug_ps_stack(ps_stack *st)
+pdf_debug_ps_stack(fz_context *ctx, ps_stack *st)
{
int i;
@@ -693,16 +693,15 @@ resize_code(fz_context *ctx, pdf_function *func, int newsize)
}
static void
-parse_code(pdf_function *func, fz_stream *stream, int *codeptr, pdf_lexbuf *buf)
+parse_code(fz_context *ctx, pdf_function *func, fz_stream *stream, int *codeptr, pdf_lexbuf *buf)
{
pdf_token tok;
int opptr, elseptr, ifptr;
int a, b, mid, cmp;
- fz_context *ctx = stream->ctx;
while (1)
{
- tok = pdf_lex(stream, buf);
+ tok = pdf_lex(ctx, stream, buf);
switch (tok)
{
@@ -744,16 +743,16 @@ parse_code(pdf_function *func, fz_stream *stream, int *codeptr, pdf_lexbuf *buf)
resize_code(ctx, func, *codeptr);
ifptr = *codeptr;
- parse_code(func, stream, codeptr, buf);
+ parse_code(ctx, func, stream, codeptr, buf);
- tok = pdf_lex(stream, buf);
+ tok = pdf_lex(ctx, stream, buf);
if (tok == PDF_TOK_OPEN_BRACE)
{
elseptr = *codeptr;
- parse_code(func, stream, codeptr, buf);
+ parse_code(ctx, func, stream, codeptr, buf);
- tok = pdf_lex(stream, buf);
+ tok = pdf_lex(ctx, stream, buf);
}
else
{
@@ -835,13 +834,12 @@ parse_code(pdf_function *func, fz_stream *stream, int *codeptr, pdf_lexbuf *buf)
}
static void
-load_postscript_func(pdf_function *func, pdf_document *doc, pdf_obj *dict, int num, int gen)
+load_postscript_func(fz_context *ctx, pdf_document *doc, pdf_function *func, pdf_obj *dict, int num, int gen)
{
fz_stream *stream = NULL;
int codeptr;
pdf_lexbuf buf;
pdf_token tok;
- fz_context *ctx = doc->ctx;
int locked = 0;
pdf_lexbuf_init(ctx, &buf, PDF_LEXBUF_SMALL);
@@ -851,9 +849,9 @@ load_postscript_func(pdf_function *func, pdf_document *doc, pdf_obj *dict, int n
fz_try(ctx)
{
- stream = pdf_open_stream(doc, num, gen);
+ stream = pdf_open_stream(ctx, doc, num, gen);
- tok = pdf_lex(stream, &buf);
+ tok = pdf_lex(ctx, stream, &buf);
if (tok != PDF_TOK_OPEN_BRACE)
{
fz_throw(ctx, FZ_ERROR_GENERIC, "stream is not a calculator function");
@@ -863,12 +861,12 @@ load_postscript_func(pdf_function *func, pdf_document *doc, pdf_obj *dict, int n
func->u.p.cap = 0;
codeptr = 0;
- parse_code(func, stream, &codeptr, &buf);
+ parse_code(ctx, func, stream, &codeptr, &buf);
}
fz_always(ctx)
{
- fz_drop_stream(stream);
- pdf_lexbuf_fin(&buf);
+ fz_drop_stream(ctx, stream);
+ pdf_lexbuf_fin(ctx, &buf);
}
fz_catch(ctx)
{
@@ -909,9 +907,8 @@ eval_postscript_func(fz_context *ctx, pdf_function *func, const float *in, float
#define MAX_SAMPLE_FUNCTION_SIZE (100 << 20)
static void
-load_sample_func(pdf_function *func, pdf_document *doc, pdf_obj *dict, int num, int gen)
+load_sample_func(fz_context *ctx, pdf_document *doc, pdf_function *func, pdf_obj *dict, int num, int gen)
{
- fz_context *ctx = doc->ctx;
fz_stream *stream;
pdf_obj *obj;
int samplecount;
@@ -922,14 +919,14 @@ load_sample_func(pdf_function *func, pdf_document *doc, pdf_obj *dict, int num,
func->u.sa.samples = NULL;
- obj = pdf_dict_gets(dict, "Size");
- if (pdf_array_len(obj) < func->base.m)
+ obj = pdf_dict_gets(ctx, dict, "Size");
+ if (pdf_array_len(ctx, obj) < func->base.m)
fz_throw(ctx, FZ_ERROR_GENERIC, "too few sample function dimension sizes");
- if (pdf_array_len(obj) > func->base.m)
+ if (pdf_array_len(ctx, obj) > func->base.m)
fz_warn(ctx, "too many sample function dimension sizes");
for (i = 0; i < func->base.m; i++)
{
- func->u.sa.size[i] = pdf_to_int(pdf_array_get(obj, i));
+ func->u.sa.size[i] = pdf_to_int(ctx, pdf_array_get(ctx, obj, i));
if (func->u.sa.size[i] <= 0)
{
fz_warn(ctx, "non-positive sample function dimension size");
@@ -937,25 +934,25 @@ load_sample_func(pdf_function *func, pdf_document *doc, pdf_obj *dict, int num,
}
}
- obj = pdf_dict_gets(dict, "BitsPerSample");
- func->u.sa.bps = bps = pdf_to_int(obj);
+ obj = pdf_dict_gets(ctx, dict, "BitsPerSample");
+ func->u.sa.bps = bps = pdf_to_int(ctx, obj);
for (i = 0; i < func->base.m; i++)
{
func->u.sa.encode[i][0] = 0;
func->u.sa.encode[i][1] = func->u.sa.size[i] - 1;
}
- obj = pdf_dict_gets(dict, "Encode");
- if (pdf_is_array(obj))
+ obj = pdf_dict_gets(ctx, dict, "Encode");
+ if (pdf_is_array(ctx, obj))
{
- int ranges = fz_mini(func->base.m, pdf_array_len(obj) / 2);
+ int ranges = fz_mini(func->base.m, pdf_array_len(ctx, obj) / 2);
if (ranges != func->base.m)
fz_warn(ctx, "wrong number of sample function input mappings");
for (i = 0; i < ranges; i++)
{
- func->u.sa.encode[i][0] = pdf_to_real(pdf_array_get(obj, i * 2 + 0));
- func->u.sa.encode[i][1] = pdf_to_real(pdf_array_get(obj, i * 2 + 1));
+ func->u.sa.encode[i][0] = pdf_to_real(ctx, pdf_array_get(ctx, obj, i * 2 + 0));
+ func->u.sa.encode[i][1] = pdf_to_real(ctx, pdf_array_get(ctx, obj, i * 2 + 1));
}
}
@@ -965,17 +962,17 @@ load_sample_func(pdf_function *func, pdf_document *doc, pdf_obj *dict, int num,
func->u.sa.decode[i][1] = func->range[i][1];
}
- obj = pdf_dict_gets(dict, "Decode");
- if (pdf_is_array(obj))
+ obj = pdf_dict_gets(ctx, dict, "Decode");
+ if (pdf_is_array(ctx, obj))
{
- int ranges = fz_mini(func->base.n, pdf_array_len(obj) / 2);
+ int ranges = fz_mini(func->base.n, pdf_array_len(ctx, obj) / 2);
if (ranges != func->base.n)
fz_warn(ctx, "wrong number of sample function output mappings");
for (i = 0; i < ranges; i++)
{
- func->u.sa.decode[i][0] = pdf_to_real(pdf_array_get(obj, i * 2 + 0));
- func->u.sa.decode[i][1] = pdf_to_real(pdf_array_get(obj, i * 2 + 1));
+ func->u.sa.decode[i][0] = pdf_to_real(ctx, pdf_array_get(ctx, obj, i * 2 + 0));
+ func->u.sa.decode[i][1] = pdf_to_real(ctx, pdf_array_get(ctx, obj, i * 2 + 1));
}
}
@@ -988,7 +985,7 @@ load_sample_func(pdf_function *func, pdf_document *doc, pdf_obj *dict, int num,
func->u.sa.samples = fz_malloc_array(ctx, samplecount, sizeof(float));
func->base.size += samplecount * sizeof(float);
- stream = pdf_open_stream(doc, num, gen);
+ stream = pdf_open_stream(ctx, doc, num, gen);
fz_try(ctx)
{
@@ -998,32 +995,32 @@ load_sample_func(pdf_function *func, pdf_document *doc, pdf_obj *dict, int num,
unsigned int x;
float s;
- if (fz_is_eof_bits(stream))
+ if (fz_is_eof_bits(ctx, stream))
fz_throw(ctx, FZ_ERROR_GENERIC, "truncated sample function stream");
switch (bps)
{
- case 1: s = fz_read_bits(stream, 1); break;
- case 2: s = fz_read_bits(stream, 2) / 3.0f; break;
- case 4: s = fz_read_bits(stream, 4) / 15.0f; break;
- case 8: s = fz_read_byte(stream) / 255.0f; break;
- case 12: s = fz_read_bits(stream, 12) / 4095.0f; break;
+ case 1: s = fz_read_bits(ctx, stream, 1); break;
+ case 2: s = fz_read_bits(ctx, stream, 2) / 3.0f; break;
+ case 4: s = fz_read_bits(ctx, stream, 4) / 15.0f; break;
+ case 8: s = fz_read_byte(ctx, stream) / 255.0f; break;
+ case 12: s = fz_read_bits(ctx, stream, 12) / 4095.0f; break;
case 16:
- x = fz_read_byte(stream) << 8;
- x |= fz_read_byte(stream);
+ x = fz_read_byte(ctx, stream) << 8;
+ x |= fz_read_byte(ctx, stream);
s = x / 65535.0f;
break;
case 24:
- x = fz_read_byte(stream) << 16;
- x |= fz_read_byte(stream) << 8;
- x |= fz_read_byte(stream);
+ x = fz_read_byte(ctx, stream) << 16;
+ x |= fz_read_byte(ctx, stream) << 8;
+ x |= fz_read_byte(ctx, stream);
s = x / 16777215.0f;
break;
case 32:
- x = fz_read_byte(stream) << 24;
- x |= fz_read_byte(stream) << 16;
- x |= fz_read_byte(stream) << 8;
- x |= fz_read_byte(stream);
+ x = fz_read_byte(ctx, stream) << 24;
+ x |= fz_read_byte(ctx, stream) << 16;
+ x |= fz_read_byte(ctx, stream) << 8;
+ x |= fz_read_byte(ctx, stream);
s = x / 4294967295.0f;
break;
default:
@@ -1035,7 +1032,7 @@ load_sample_func(pdf_function *func, pdf_document *doc, pdf_obj *dict, int num,
}
fz_always(ctx)
{
- fz_drop_stream(stream);
+ fz_drop_stream(ctx, stream);
}
fz_catch(ctx)
{
@@ -1135,7 +1132,7 @@ eval_sample_func(fz_context *ctx, pdf_function *func, const float *in, float *ou
*/
static void
-load_exponential_func(fz_context *ctx, pdf_function *func, pdf_obj *dict)
+load_exponential_func(fz_context *ctx, pdf_document *doc, pdf_function *func, pdf_obj *dict)
{
pdf_obj *obj;
int i;
@@ -1144,8 +1141,8 @@ load_exponential_func(fz_context *ctx, pdf_function *func, pdf_obj *dict)
fz_warn(ctx, "exponential functions have at most one input");
func->base.m = 1;
- obj = pdf_dict_gets(dict, "N");
- func->u.e.n = pdf_to_real(obj);
+ obj = pdf_dict_gets(ctx, dict, "N");
+ func->u.e.n = pdf_to_real(ctx, obj);
/* See exponential functions (PDF 1.7 section 3.9.2) */
if (func->u.e.n != (int) func->u.e.n)
@@ -1170,26 +1167,26 @@ load_exponential_func(fz_context *ctx, pdf_function *func, pdf_obj *dict)
func->u.e.c1[i] = 1;
}
- obj = pdf_dict_gets(dict, "C0");
- if (pdf_is_array(obj))
+ obj = pdf_dict_gets(ctx, dict, "C0");
+ if (pdf_is_array(ctx, obj))
{
- int ranges = fz_mini(func->base.n, pdf_array_len(obj));
+ int ranges = fz_mini(func->base.n, pdf_array_len(ctx, obj));
if (ranges != func->base.n)
fz_warn(ctx, "wrong number of C0 constants for exponential function");
for (i = 0; i < ranges; i++)
- func->u.e.c0[i] = pdf_to_real(pdf_array_get(obj, i));
+ func->u.e.c0[i] = pdf_to_real(ctx, pdf_array_get(ctx, obj, i));
}
- obj = pdf_dict_gets(dict, "C1");
- if (pdf_is_array(obj))
+ obj = pdf_dict_gets(ctx, dict, "C1");
+ if (pdf_is_array(ctx, obj))
{
- int ranges = fz_mini(func->base.n, pdf_array_len(obj));
+ int ranges = fz_mini(func->base.n, pdf_array_len(ctx, obj));
if (ranges != func->base.n)
fz_warn(ctx, "wrong number of C1 constants for exponential function");
for (i = 0; i < ranges; i++)
- func->u.e.c1[i] = pdf_to_real(pdf_array_get(obj, i));
+ func->u.e.c1[i] = pdf_to_real(ctx, pdf_array_get(ctx, obj, i));
}
}
@@ -1220,9 +1217,8 @@ eval_exponential_func(fz_context *ctx, pdf_function *func, float in, float *out)
*/
static void
-load_stitching_func(pdf_function *func, pdf_document *doc, pdf_obj *dict)
+load_stitching_func(fz_context *ctx, pdf_document *doc, pdf_function *func, pdf_obj *dict)
{
- fz_context *ctx = doc->ctx;
fz_function **funcs;
pdf_obj *obj;
pdf_obj *sub;
@@ -1236,14 +1232,14 @@ load_stitching_func(pdf_function *func, pdf_document *doc, pdf_obj *dict)
fz_warn(ctx, "stitching functions have at most one input");
func->base.m = 1;
- obj = pdf_dict_gets(dict, "Functions");
- if (!pdf_is_array(obj))
+ obj = pdf_dict_gets(ctx, dict, "Functions");
+ if (!pdf_is_array(ctx, obj))
fz_throw(ctx, FZ_ERROR_GENERIC, "stitching function has no input functions");
fz_try(ctx)
{
- pdf_mark_obj(obj);
- k = pdf_array_len(obj);
+ pdf_mark_obj(ctx, obj);
+ k = pdf_array_len(ctx, obj);
func->u.st.funcs = fz_malloc_array(ctx, k, sizeof(fz_function*));
func->u.st.bounds = fz_malloc_array(ctx, k - 1, sizeof(float));
@@ -1252,10 +1248,10 @@ load_stitching_func(pdf_function *func, pdf_document *doc, pdf_obj *dict)
for (i = 0; i < k; i++)
{
- sub = pdf_array_get(obj, i);
- funcs[i] = pdf_load_function(doc, sub, 1, func->base.n);
+ sub = pdf_array_get(ctx, obj, i);
+ funcs[i] = pdf_load_function(ctx, doc, sub, 1, func->base.n);
- func->base.size += fz_function_size(funcs[i]);
+ func->base.size += fz_function_size(ctx, funcs[i]);
func->u.st.k ++;
if (funcs[i]->m != func->base.m)
@@ -1266,26 +1262,26 @@ load_stitching_func(pdf_function *func, pdf_document *doc, pdf_obj *dict)
}
fz_always(ctx)
{
- pdf_unmark_obj(obj);
+ pdf_unmark_obj(ctx, obj);
}
fz_catch(ctx)
{
fz_rethrow(ctx);
}
- obj = pdf_dict_gets(dict, "Bounds");
- if (!pdf_is_array(obj))
+ obj = pdf_dict_gets(ctx, dict, "Bounds");
+ if (!pdf_is_array(ctx, obj))
fz_throw(ctx, FZ_ERROR_GENERIC, "stitching function has no bounds");
{
- if (pdf_array_len(obj) < k - 1)
+ if (pdf_array_len(ctx, obj) < k - 1)
fz_throw(ctx, FZ_ERROR_GENERIC, "too few subfunction boundaries");
- if (pdf_array_len(obj) > k)
+ if (pdf_array_len(ctx, obj) > k)
fz_warn(ctx, "too many subfunction boundaries");
for (i = 0; i < k - 1; i++)
{
- num = pdf_array_get(obj, i);
- func->u.st.bounds[i] = pdf_to_real(num);
+ num = pdf_array_get(ctx, obj, i);
+ func->u.st.bounds[i] = pdf_to_real(ctx, num);
if (i && func->u.st.bounds[i - 1] > func->u.st.bounds[i])
fz_throw(ctx, FZ_ERROR_GENERIC, "subfunction %d boundary out of range", i);
}
@@ -1301,17 +1297,17 @@ load_stitching_func(pdf_function *func, pdf_document *doc, pdf_obj *dict)
func->u.st.encode[i * 2 + 1] = 0;
}
- obj = pdf_dict_gets(dict, "Encode");
- if (pdf_is_array(obj))
+ obj = pdf_dict_gets(ctx, dict, "Encode");
+ if (pdf_is_array(ctx, obj))
{
- int ranges = fz_mini(k, pdf_array_len(obj) / 2);
+ int ranges = fz_mini(k, pdf_array_len(ctx, obj) / 2);
if (ranges != k)
fz_warn(ctx, "wrong number of stitching function input mappings");
for (i = 0; i < ranges; i++)
{
- func->u.st.encode[i * 2 + 0] = pdf_to_real(pdf_array_get(obj, i * 2 + 0));
- func->u.st.encode[i * 2 + 1] = pdf_to_real(pdf_array_get(obj, i * 2 + 1));
+ func->u.st.encode[i * 2 + 0] = pdf_to_real(ctx, pdf_array_get(ctx, obj, i * 2 + 0));
+ func->u.st.encode[i * 2 + 1] = pdf_to_real(ctx, pdf_array_get(ctx, obj, i * 2 + 1));
}
}
}
@@ -1620,21 +1616,20 @@ pdf_debug_function_imp(fz_function *func_, int level)
}
void
-pdf_debug_function(fz_function *func)
+pdf_debug_function(fz_context *ctx, fz_function *func)
{
pdf_debug_function_imp(func, 0);
}
#endif
fz_function *
-pdf_load_function(pdf_document *doc, pdf_obj *dict, int in, int out)
+pdf_load_function(fz_context *ctx, pdf_document *doc, pdf_obj *dict, int in, int out)
{
- fz_context *ctx = doc->ctx;
pdf_function *func;
pdf_obj *obj;
int i;
- if (pdf_obj_marked(dict))
+ if (pdf_obj_marked(ctx, dict))
fz_throw(ctx, FZ_ERROR_GENERIC, "Recursion in function definition");
if ((func = pdf_find_item(ctx, pdf_drop_function_imp, dict)) != NULL)
@@ -1650,28 +1645,28 @@ pdf_load_function(pdf_document *doc, pdf_obj *dict, int in, int out)
func->base.debug = pdf_debug_function;
#endif
- obj = pdf_dict_gets(dict, "FunctionType");
- func->type = pdf_to_int(obj);
+ obj = pdf_dict_gets(ctx, dict, "FunctionType");
+ func->type = pdf_to_int(ctx, obj);
/* required for all */
- obj = pdf_dict_gets(dict, "Domain");
- func->base.m = fz_clampi(pdf_array_len(obj) / 2, 1, FZ_FN_MAXM);
+ obj = pdf_dict_gets(ctx, dict, "Domain");
+ func->base.m = fz_clampi(pdf_array_len(ctx, obj) / 2, 1, FZ_FN_MAXM);
for (i = 0; i < func->base.m; i++)
{
- func->domain[i][0] = pdf_to_real(pdf_array_get(obj, i * 2 + 0));
- func->domain[i][1] = pdf_to_real(pdf_array_get(obj, i * 2 + 1));
+ func->domain[i][0] = pdf_to_real(ctx, pdf_array_get(ctx, obj, i * 2 + 0));
+ func->domain[i][1] = pdf_to_real(ctx, pdf_array_get(ctx, obj, i * 2 + 1));
}
/* required for type0 and type4, optional otherwise */
- obj = pdf_dict_gets(dict, "Range");
- if (pdf_is_array(obj))
+ obj = pdf_dict_gets(ctx, dict, "Range");
+ if (pdf_is_array(ctx, obj))
{
func->has_range = 1;
- func->base.n = fz_clampi(pdf_array_len(obj) / 2, 1, FZ_FN_MAXN);
+ func->base.n = fz_clampi(pdf_array_len(ctx, obj) / 2, 1, FZ_FN_MAXN);
for (i = 0; i < func->base.n; i++)
{
- func->range[i][0] = pdf_to_real(pdf_array_get(obj, i * 2 + 0));
- func->range[i][1] = pdf_to_real(pdf_array_get(obj, i * 2 + 1));
+ func->range[i][0] = pdf_to_real(ctx, pdf_array_get(ctx, obj, i * 2 + 0));
+ func->range[i][1] = pdf_to_real(ctx, pdf_array_get(ctx, obj, i * 2 + 1));
}
}
else
@@ -1690,23 +1685,23 @@ pdf_load_function(pdf_document *doc, pdf_obj *dict, int in, int out)
switch (func->type)
{
case SAMPLE:
- load_sample_func(func, doc, dict, pdf_to_num(dict), pdf_to_gen(dict));
+ load_sample_func(ctx, doc, func, dict, pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict));
break;
case EXPONENTIAL:
- load_exponential_func(ctx, func, dict);
+ load_exponential_func(ctx, doc, func, dict);
break;
case STITCHING:
- load_stitching_func(func, doc, dict);
+ load_stitching_func(ctx, doc, func, dict);
break;
case POSTSCRIPT:
- load_postscript_func(func, doc, dict, pdf_to_num(dict), pdf_to_gen(dict));
+ load_postscript_func(ctx, doc, func, dict, pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict));
break;
default:
- fz_throw(ctx, FZ_ERROR_GENERIC, "unknown function type (%d %d R)", pdf_to_num(dict), pdf_to_gen(dict));
+ fz_throw(ctx, FZ_ERROR_GENERIC, "unknown function type (%d %d R)", pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict));
}
pdf_store_item(ctx, dict, func, func->base.size);
@@ -1721,7 +1716,7 @@ pdf_load_function(pdf_document *doc, pdf_obj *dict, int in, int out)
type == STITCHING ? "stitching" :
type == POSTSCRIPT ? "calculator" :
"unknown",
- pdf_to_num(dict), pdf_to_gen(dict));
+ pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict));
}
return (fz_function *)func;
diff --git a/source/pdf/pdf-image.c b/source/pdf/pdf-image.c
index dd96f4fb..30f96dc8 100644
--- a/source/pdf/pdf-image.c
+++ b/source/pdf/pdf-image.c
@@ -1,9 +1,9 @@
#include "mupdf/pdf.h"
-static fz_image *pdf_load_jpx(pdf_document *doc, pdf_obj *dict, int forcemask);
+static fz_image *pdf_load_jpx(fz_context *ctx, pdf_document *doc, pdf_obj *dict, int forcemask);
static fz_image *
-pdf_load_image_imp(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *cstm, int forcemask)
+pdf_load_image_imp(fz_context *ctx, pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *cstm, int forcemask)
{
fz_stream *stm = NULL;
fz_image *image = NULL;
@@ -21,7 +21,6 @@ pdf_load_image_imp(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *cs
int stride;
int i;
- fz_context *ctx = doc->ctx;
fz_compressed_buffer *buffer;
fz_var(stm);
@@ -34,7 +33,7 @@ pdf_load_image_imp(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *cs
/* special case for JPEG2000 images */
if (pdf_is_jpx_image(ctx, dict))
{
- image = pdf_load_jpx(doc, dict, forcemask);
+ image = pdf_load_jpx(ctx, doc, dict, forcemask);
if (forcemask)
{
@@ -56,13 +55,13 @@ pdf_load_image_imp(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *cs
break; /* Out of fz_try */
}
- w = pdf_to_int(pdf_dict_getsa(dict, "Width", "W"));
- h = pdf_to_int(pdf_dict_getsa(dict, "Height", "H"));
- bpc = pdf_to_int(pdf_dict_getsa(dict, "BitsPerComponent", "BPC"));
+ w = pdf_to_int(ctx, pdf_dict_getsa(ctx, dict, "Width", "W"));
+ h = pdf_to_int(ctx, pdf_dict_getsa(ctx, dict, "Height", "H"));
+ bpc = pdf_to_int(ctx, pdf_dict_getsa(ctx, dict, "BitsPerComponent", "BPC"));
if (bpc == 0)
bpc = 8;
- imagemask = pdf_to_bool(pdf_dict_getsa(dict, "ImageMask", "IM"));
- interpolate = pdf_to_bool(pdf_dict_getsa(dict, "Interpolate", "I"));
+ imagemask = pdf_to_bool(ctx, pdf_dict_getsa(ctx, dict, "ImageMask", "IM"));
+ interpolate = pdf_to_bool(ctx, pdf_dict_getsa(ctx, dict, "Interpolate", "I"));
indexed = 0;
usecolorkey = 0;
@@ -83,19 +82,19 @@ pdf_load_image_imp(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *cs
if (h > (1 << 16))
fz_throw(ctx, FZ_ERROR_GENERIC, "image is too high");
- obj = pdf_dict_getsa(dict, "ColorSpace", "CS");
+ obj = pdf_dict_getsa(ctx, dict, "ColorSpace", "CS");
if (obj && !imagemask && !forcemask)
{
/* colorspace resource lookup is only done for inline images */
- if (pdf_is_name(obj))
+ if (pdf_is_name(ctx, obj))
{
- res = pdf_dict_get(pdf_dict_gets(rdb, "ColorSpace"), obj);
+ res = pdf_dict_get(ctx, pdf_dict_gets(ctx, rdb, "ColorSpace"), obj);
if (res)
obj = res;
}
- colorspace = pdf_load_colorspace(doc, obj);
- indexed = fz_colorspace_is_indexed(colorspace);
+ colorspace = pdf_load_colorspace(ctx, doc, obj);
+ indexed = fz_colorspace_is_indexed(ctx, colorspace);
n = colorspace->n;
}
@@ -104,11 +103,11 @@ pdf_load_image_imp(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *cs
n = 1;
}
- obj = pdf_dict_getsa(dict, "Decode", "D");
+ obj = pdf_dict_getsa(ctx, dict, "Decode", "D");
if (obj)
{
for (i = 0; i < n * 2; i++)
- decode[i] = pdf_to_real(pdf_array_get(obj, i));
+ decode[i] = pdf_to_real(ctx, pdf_array_get(ctx, obj, i));
}
else
{
@@ -117,8 +116,8 @@ pdf_load_image_imp(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *cs
decode[i] = i & 1 ? maxval : 0;
}
- obj = pdf_dict_getsa(dict, "SMask", "Mask");
- if (pdf_is_dict(obj))
+ obj = pdf_dict_getsa(ctx, dict, "SMask", "Mask");
+ if (pdf_is_dict(ctx, obj))
{
/* Not allowed for inline images or soft masks */
if (cstm)
@@ -127,27 +126,27 @@ pdf_load_image_imp(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *cs
fz_warn(ctx, "Ignoring recursive image soft mask");
else
{
- mask = pdf_load_image_imp(doc, rdb, obj, NULL, 1);
- obj = pdf_dict_gets(obj, "Matte");
- if (pdf_is_array(obj))
+ mask = pdf_load_image_imp(ctx, doc, rdb, obj, NULL, 1);
+ obj = pdf_dict_gets(ctx, obj, "Matte");
+ if (pdf_is_array(ctx, obj))
{
usecolorkey = 1;
for (i = 0; i < n; i++)
- colorkey[i] = pdf_to_real(pdf_array_get(obj, i)) * 255;
+ colorkey[i] = pdf_to_real(ctx, pdf_array_get(ctx, obj, i)) * 255;
}
}
}
- else if (pdf_is_array(obj))
+ else if (pdf_is_array(ctx, obj))
{
usecolorkey = 1;
for (i = 0; i < n * 2; i++)
{
- if (!pdf_is_int(pdf_array_get(obj, i)))
+ if (!pdf_is_int(ctx, pdf_array_get(ctx, obj, i)))
{
fz_warn(ctx, "invalid value in color key mask");
usecolorkey = 0;
}
- colorkey[i] = pdf_to_int(pdf_array_get(obj, i));
+ colorkey[i] = pdf_to_int(ctx, pdf_array_get(ctx, obj, i));
}
}
@@ -156,9 +155,9 @@ pdf_load_image_imp(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *cs
{
/* Just load the compressed image data now and we can
* decode it on demand. */
- int num = pdf_to_num(dict);
- int gen = pdf_to_gen(dict);
- buffer = pdf_load_compressed_stream(doc, num, gen);
+ int num = pdf_to_num(ctx, dict);
+ int gen = pdf_to_gen(ctx, dict);
+ buffer = pdf_load_compressed_stream(ctx, doc, num, gen);
image = fz_new_image(ctx, w, h, bpc, colorspace, 96, 96, interpolate, imagemask, decode, usecolorkey ? colorkey : NULL, buffer, mask);
}
else
@@ -166,7 +165,7 @@ pdf_load_image_imp(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *cs
/* Inline stream */
stride = (w * n * bpc + 7) / 8;
image = fz_new_image(ctx, w, h, bpc, colorspace, 96, 96, interpolate, imagemask, decode, usecolorkey ? colorkey : NULL, NULL, mask);
- pdf_load_compressed_inline_image(doc, dict, stride * h, cstm, indexed, image);
+ pdf_load_compressed_inline_image(ctx, doc, dict, stride * h, cstm, indexed, image);
}
}
@@ -181,9 +180,9 @@ pdf_load_image_imp(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *cs
}
fz_image *
-pdf_load_inline_image(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *file)
+pdf_load_inline_image(fz_context *ctx, pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *file)
{
- return pdf_load_image_imp(doc, rdb, dict, file, 0);
+ return pdf_load_image_imp(ctx, doc, rdb, dict, file, 0);
}
int
@@ -192,79 +191,81 @@ pdf_is_jpx_image(fz_context *ctx, pdf_obj *dict)
pdf_obj *filter;
int i, n;
- filter = pdf_dict_gets(dict, "Filter");
- if (!strcmp(pdf_to_name(filter), "JPXDecode"))
+ filter = pdf_dict_gets(ctx, dict, "Filter");
+ if (!strcmp(pdf_to_name(ctx, filter), "JPXDecode"))
return 1;
- n = pdf_array_len(filter);
+ n = pdf_array_len(ctx, filter);
for (i = 0; i < n; i++)
- if (!strcmp(pdf_to_name(pdf_array_get(filter, i)), "JPXDecode"))
+ if (!strcmp(pdf_to_name(ctx, pdf_array_get(ctx, filter, i)), "JPXDecode"))
return 1;
return 0;
}
static fz_image *
-pdf_load_jpx(pdf_document *doc, pdf_obj *dict, int forcemask)
+pdf_load_jpx(fz_context *ctx, pdf_document *doc, pdf_obj *dict, int forcemask)
{
fz_buffer *buf = NULL;
fz_colorspace *colorspace = NULL;
- fz_pixmap *img = NULL;
+ fz_pixmap *pix = NULL;
pdf_obj *obj;
- fz_context *ctx = doc->ctx;
int indexed = 0;
fz_image *mask = NULL;
+ fz_image *img = NULL;
- fz_var(img);
+ fz_var(pix);
fz_var(buf);
fz_var(colorspace);
fz_var(mask);
- buf = pdf_load_stream(doc, pdf_to_num(dict), pdf_to_gen(dict));
+ buf = pdf_load_stream(ctx, doc, pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict));
/* FIXME: We can't handle decode arrays for indexed images currently */
fz_try(ctx)
{
- obj = pdf_dict_gets(dict, "ColorSpace");
+ obj = pdf_dict_gets(ctx, dict, "ColorSpace");
if (obj)
{
- colorspace = pdf_load_colorspace(doc, obj);
- indexed = fz_colorspace_is_indexed(colorspace);
+ colorspace = pdf_load_colorspace(ctx, doc, obj);
+ indexed = fz_colorspace_is_indexed(ctx, colorspace);
}
- img = fz_load_jpx(ctx, buf->data, buf->len, colorspace, indexed);
+ pix = fz_load_jpx(ctx, buf->data, buf->len, colorspace, indexed);
- obj = pdf_dict_getsa(dict, "SMask", "Mask");
- if (pdf_is_dict(obj))
+ obj = pdf_dict_getsa(ctx, dict, "SMask", "Mask");
+ if (pdf_is_dict(ctx, obj))
{
if (forcemask)
fz_warn(ctx, "Ignoring recursive JPX soft mask");
else
- mask = pdf_load_image_imp(doc, NULL, obj, NULL, 1);
+ mask = pdf_load_image_imp(ctx, doc, NULL, obj, NULL, 1);
}
- obj = pdf_dict_getsa(dict, "Decode", "D");
+ obj = pdf_dict_getsa(ctx, dict, "Decode", "D");
if (obj && !indexed)
{
float decode[FZ_MAX_COLORS * 2];
int i;
- for (i = 0; i < img->n * 2; i++)
- decode[i] = pdf_to_real(pdf_array_get(obj, i));
+ for (i = 0; i < pix->n * 2; i++)
+ decode[i] = pdf_to_real(ctx, pdf_array_get(ctx, obj, i));
- fz_decode_tile(img, decode);
+ fz_decode_tile(ctx, pix, decode);
}
+
+ img = fz_new_image_from_pixmap(ctx, pix, mask);
}
fz_always(ctx)
{
fz_drop_colorspace(ctx, colorspace);
fz_drop_buffer(ctx, buf);
+ fz_drop_pixmap(ctx, pix);
}
fz_catch(ctx)
{
- fz_drop_pixmap(ctx, img);
fz_rethrow(ctx);
}
- return fz_new_image_from_pixmap(ctx, img, mask);
+ return img;
}
static int
@@ -276,9 +277,8 @@ fz_image_size(fz_context *ctx, fz_image *im)
}
fz_image *
-pdf_load_image(pdf_document *doc, pdf_obj *dict)
+pdf_load_image(fz_context *ctx, pdf_document *doc, pdf_obj *dict)
{
- fz_context *ctx = doc->ctx;
fz_image *image;
if ((image = pdf_find_item(ctx, fz_drop_image_imp, dict)) != NULL)
@@ -286,7 +286,7 @@ pdf_load_image(pdf_document *doc, pdf_obj *dict)
return (fz_image *)image;
}
- image = pdf_load_image_imp(doc, NULL, dict, NULL, 0);
+ image = pdf_load_image_imp(ctx, doc, NULL, dict, NULL, 0);
pdf_store_item(ctx, dict, image, fz_image_size(ctx, image));
diff --git a/source/pdf/pdf-interpret-imp.h b/source/pdf/pdf-interpret-imp.h
index 314e6d2b..817a7d2c 100644
--- a/source/pdf/pdf-interpret-imp.h
+++ b/source/pdf/pdf-interpret-imp.h
@@ -106,6 +106,7 @@ typedef struct pdf_process_s
struct pdf_csi_s
{
+ fz_context *ctx;
pdf_document *doc;
/* Current resource dict and file. These are in here to reduce param
@@ -142,14 +143,14 @@ void pdf_process_contents_object(pdf_csi *csi, pdf_obj *rdb, pdf_obj *contents);
void pdf_process_stream(pdf_csi *csi, pdf_lexbuf *buf);
/* Functions to set up pdf_process structures */
-pdf_process *pdf_process_run(pdf_process *process, fz_device *dev, const fz_matrix *ctm, const char *event, pdf_gstate *gstate, int nested);
-pdf_process *pdf_process_buffer(pdf_process *process, fz_context *ctx, fz_buffer *buffer);
-pdf_process *pdf_process_filter(pdf_process *process, fz_context *ctx, pdf_process *underlying, pdf_obj *resources);
+pdf_process *pdf_init_process_run(fz_context *ctx, pdf_process *process, fz_device *dev, const fz_matrix *ctm, const char *event, pdf_gstate *gstate, int nested);
+pdf_process *pdf_init_process_buffer(fz_context *ctx, pdf_process *process, fz_buffer *buffer);
+pdf_process *pdf_init_process_filter(fz_context *ctx, pdf_process *process, pdf_process *underlying, pdf_obj *resources);
/* Functions to actually use the pdf_process structures to process
* annotations, glyphs and general stream objects */
-void pdf_process_annot(pdf_document *doc, pdf_page *page, pdf_annot *annot, const pdf_process *process, fz_cookie *cookie);
-void pdf_process_glyph(pdf_document *doc, pdf_obj *resources, fz_buffer *contents, pdf_process *process);
-void pdf_process_stream_object(pdf_document *doc, pdf_obj *obj, const pdf_process *process, pdf_obj *res, fz_cookie *cookie);
+void pdf_process_annot(fz_context *ctx, pdf_document *doc, pdf_page *page, pdf_annot *annot, const pdf_process *process, fz_cookie *cookie);
+void pdf_process_glyph(fz_context *ctx, pdf_document *doc, pdf_obj *resources, fz_buffer *contents, pdf_process *process);
+void pdf_process_stream_object(fz_context *ctx, pdf_document *doc, pdf_obj *obj, const pdf_process *process, pdf_obj *res, fz_cookie *cookie);
#endif
diff --git a/source/pdf/pdf-interpret.c b/source/pdf/pdf-interpret.c
index b67de46e..a3df4c77 100644
--- a/source/pdf/pdf-interpret.c
+++ b/source/pdf/pdf-interpret.c
@@ -1,17 +1,18 @@
#include "pdf-interpret-imp.h"
static pdf_csi *
-pdf_new_csi(pdf_document *doc, fz_cookie *cookie, const pdf_process *process)
+pdf_new_csi(fz_context *ctx, pdf_document *doc, fz_cookie *cookie, const pdf_process *process)
{
pdf_csi *csi = NULL;
- fz_context *ctx = doc->ctx;
fz_var(csi);
fz_try(ctx)
{
csi = fz_malloc_struct(ctx, pdf_csi);
- csi->doc = doc;
+ csi->ctx = ctx; /* FIXME */
+ csi->doc = doc; /* FIXME */
+
csi->in_text = 0;
csi->top = 0;
@@ -38,12 +39,14 @@ pdf_new_csi(pdf_document *doc, fz_cookie *cookie, const pdf_process *process)
static void
pdf_clear_stack(pdf_csi *csi)
{
+ fz_context *ctx = csi->ctx;
+
int i;
- fz_drop_image(csi->doc->ctx, csi->img);
+ fz_drop_image(ctx, csi->img);
csi->img = NULL;
- pdf_drop_obj(csi->obj);
+ pdf_drop_obj(ctx, csi->obj);
csi->obj = NULL;
csi->name[0] = 0;
@@ -57,7 +60,7 @@ pdf_clear_stack(pdf_csi *csi)
static void
pdf_drop_csi(pdf_csi *csi)
{
- fz_context *ctx = csi->doc->ctx;
+ fz_context *ctx = csi->ctx;
pdf_process_op(csi, PDF_OP_END, &csi->process);
fz_free(ctx, csi);
@@ -70,27 +73,29 @@ pdf_drop_csi(pdf_csi *csi)
static void
parse_inline_image(pdf_csi *csi)
{
- fz_context *ctx = csi->doc->ctx;
+ fz_context *ctx = csi->ctx;
+ pdf_document *doc = csi->doc;
+
pdf_obj *rdb = csi->rdb;
fz_stream *file = csi->file;
int ch, found;
fz_drop_image(ctx, csi->img);
csi->img = NULL;
- pdf_drop_obj(csi->obj);
+ pdf_drop_obj(ctx, csi->obj);
csi->obj = NULL;
- csi->obj = pdf_parse_dict(csi->doc, file, &csi->doc->lexbuf.base);
+ csi->obj = pdf_parse_dict(ctx, doc, file, &doc->lexbuf.base);
/* read whitespace after ID keyword */
- ch = fz_read_byte(file);
+ ch = fz_read_byte(ctx, file);
if (ch == '\r')
- if (fz_peek_byte(file) == '\n')
- fz_read_byte(file);
+ if (fz_peek_byte(ctx, file) == '\n')
+ fz_read_byte(ctx, file);
fz_try(ctx)
{
- csi->img = pdf_load_inline_image(csi->doc, rdb, csi->obj, file);
+ csi->img = pdf_load_inline_image(ctx, doc, rdb, csi->obj, file);
}
fz_catch(ctx)
{
@@ -99,17 +104,17 @@ parse_inline_image(pdf_csi *csi)
/* find EI */
found = 0;
- ch = fz_read_byte(file);
+ ch = fz_read_byte(ctx, file);
do
{
while (ch != 'E' && ch != EOF)
- ch = fz_read_byte(file);
+ ch = fz_read_byte(ctx, file);
if (ch == 'E')
{
- ch = fz_read_byte(file);
+ ch = fz_read_byte(ctx, file);
if (ch == 'I')
{
- ch = fz_peek_byte(file);
+ ch = fz_peek_byte(ctx, file);
if (ch == ' ' || ch <= 32 || ch == EOF || ch == '<' || ch == '/')
{
found = 1;
@@ -125,7 +130,8 @@ parse_inline_image(pdf_csi *csi)
static int
pdf_run_keyword(pdf_csi *csi, char *buf)
{
- fz_context *ctx = csi->doc->ctx;
+ fz_context *ctx = csi->ctx;
+
int key;
PDF_OP op;
@@ -278,7 +284,9 @@ pdf_run_keyword(pdf_csi *csi, char *buf)
void
pdf_process_stream(pdf_csi *csi, pdf_lexbuf *buf)
{
- fz_context *ctx = csi->doc->ctx;
+ fz_context *ctx = csi->ctx;
+ pdf_document *doc = csi->doc;
+
fz_stream *file = csi->file;
pdf_token tok = PDF_TOK_ERROR;
int in_text_array = 0;
@@ -313,7 +321,7 @@ pdf_process_stream(pdf_csi *csi, pdf_lexbuf *buf)
csi->cookie->progress++;
}
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
if (in_text_array)
{
@@ -323,27 +331,27 @@ pdf_process_stream(pdf_csi *csi, pdf_lexbuf *buf)
in_text_array = 0;
break;
case PDF_TOK_REAL:
- pdf_array_push_drop(csi->obj, pdf_new_real(csi->doc, buf->f));
+ pdf_array_push_drop(ctx, csi->obj, pdf_new_real(ctx, doc, buf->f));
break;
case PDF_TOK_INT:
- pdf_array_push_drop(csi->obj, pdf_new_int(csi->doc, buf->i));
+ pdf_array_push_drop(ctx, csi->obj, pdf_new_int(ctx, doc, buf->i));
break;
case PDF_TOK_STRING:
- pdf_array_push_drop(csi->obj, pdf_new_string(csi->doc, buf->scratch, buf->len));
+ pdf_array_push_drop(ctx, csi->obj, pdf_new_string(ctx, doc, buf->scratch, buf->len));
break;
case PDF_TOK_EOF:
break;
case PDF_TOK_KEYWORD:
if (!strcmp(buf->scratch, "Tw") || !strcmp(buf->scratch, "Tc"))
{
- int l = pdf_array_len(csi->obj);
+ int l = pdf_array_len(ctx, csi->obj);
if (l > 0)
{
- pdf_obj *o = pdf_array_get(csi->obj, l-1);
- if (pdf_is_number(o))
+ pdf_obj *o = pdf_array_get(ctx, csi->obj, l-1);
+ if (pdf_is_number(ctx, o))
{
- csi->stack[0] = pdf_to_real(o);
- pdf_array_delete(csi->obj, l-1);
+ csi->stack[0] = pdf_to_real(ctx, o);
+ pdf_array_delete(ctx, csi->obj, l-1);
if (pdf_run_keyword(csi, buf->scratch) == 0)
break;
}
@@ -364,35 +372,35 @@ pdf_process_stream(pdf_csi *csi, pdf_lexbuf *buf)
case PDF_TOK_OPEN_ARRAY:
if (csi->obj)
{
- pdf_drop_obj(csi->obj);
+ pdf_drop_obj(ctx, csi->obj);
csi->obj = NULL;
}
if (csi->in_text)
{
in_text_array = 1;
- csi->obj = pdf_new_array(csi->doc, 4);
+ csi->obj = pdf_new_array(ctx, doc, 4);
}
else
{
- csi->obj = pdf_parse_array(csi->doc, file, buf);
+ csi->obj = pdf_parse_array(ctx, doc, file, buf);
}
break;
case PDF_TOK_OPEN_DICT:
if (csi->obj)
{
- pdf_drop_obj(csi->obj);
+ pdf_drop_obj(ctx, csi->obj);
csi->obj = NULL;
}
- csi->obj = pdf_parse_dict(csi->doc, file, buf);
+ csi->obj = pdf_parse_dict(ctx, doc, file, buf);
break;
case PDF_TOK_NAME:
if (csi->name[0])
{
- pdf_drop_obj(csi->obj);
+ pdf_drop_obj(ctx, csi->obj);
csi->obj = NULL;
- csi->obj = pdf_new_name(csi->doc, buf->scratch);
+ csi->obj = pdf_new_name(ctx, doc, buf->scratch);
}
else
fz_strlcpy(csi->name, buf->scratch, sizeof(csi->name));
@@ -426,10 +434,10 @@ pdf_process_stream(pdf_csi *csi, pdf_lexbuf *buf)
{
if (csi->obj)
{
- pdf_drop_obj(csi->obj);
+ pdf_drop_obj(ctx, csi->obj);
csi->obj = NULL;
}
- csi->obj = pdf_new_string(csi->doc, buf->scratch, buf->len);
+ csi->obj = pdf_new_string(ctx, doc, buf->scratch, buf->len);
}
break;
@@ -494,7 +502,8 @@ pdf_process_stream(pdf_csi *csi, pdf_lexbuf *buf)
static void
pdf_process_contents_stream(pdf_csi *csi, pdf_obj *rdb, fz_stream *file)
{
- fz_context *ctx = csi->doc->ctx;
+ fz_context *ctx = csi->ctx;
+
pdf_lexbuf *buf;
int save_in_text;
pdf_obj *save_obj;
@@ -521,11 +530,11 @@ pdf_process_contents_stream(pdf_csi *csi, pdf_obj *rdb, fz_stream *file)
fz_always(ctx)
{
csi->in_text = save_in_text;
- pdf_drop_obj(csi->obj);
+ pdf_drop_obj(ctx, csi->obj);
csi->obj = save_obj;
csi->rdb = save_rdb;
csi->file = save_file;
- pdf_lexbuf_fin(buf);
+ pdf_lexbuf_fin(ctx, buf);
fz_free(ctx, buf);
}
fz_catch(ctx)
@@ -537,16 +546,15 @@ pdf_process_contents_stream(pdf_csi *csi, pdf_obj *rdb, fz_stream *file)
}
void
-pdf_process_annot(pdf_document *doc, pdf_page *page, pdf_annot *annot, const pdf_process *process, fz_cookie *cookie)
+pdf_process_annot(fz_context *ctx, pdf_document *doc, pdf_page *page, pdf_annot *annot, const pdf_process *process, fz_cookie *cookie)
{
- fz_context *ctx = doc->ctx;
pdf_csi *csi;
int flags;
- csi = pdf_new_csi(doc, cookie, process);
+ csi = pdf_new_csi(ctx, doc, cookie, process);
fz_try(ctx)
{
- flags = pdf_to_int(pdf_dict_gets(annot->obj, "F"));
+ flags = pdf_to_int(ctx, pdf_dict_gets(ctx, annot->obj, "F"));
/* Check not invisible (bit 0) and hidden (bit 1) */
/* TODO: NoZoom and NoRotate */
@@ -568,20 +576,22 @@ pdf_process_annot(pdf_document *doc, pdf_page *page, pdf_annot *annot, const pdf
void
pdf_process_contents_object(pdf_csi *csi, pdf_obj *rdb, pdf_obj *contents)
{
- fz_context *ctx = csi->doc->ctx;
+ fz_context *ctx = csi->ctx;
+ pdf_document *doc = csi->doc;
+
fz_stream *file = NULL;
if (contents == NULL)
return;
- file = pdf_open_contents_stream(csi->doc, contents);
+ file = pdf_open_contents_stream(ctx, doc, contents);
fz_try(ctx)
{
pdf_process_contents_stream(csi, rdb, file);
}
fz_always(ctx)
{
- fz_drop_stream(file);
+ fz_drop_stream(ctx, file);
}
fz_catch(ctx)
{
@@ -592,7 +602,8 @@ pdf_process_contents_object(pdf_csi *csi, pdf_obj *rdb, pdf_obj *contents)
static void
pdf_process_contents_buffer(pdf_csi *csi, pdf_obj *rdb, fz_buffer *contents)
{
- fz_context *ctx = csi->doc->ctx;
+ fz_context *ctx = csi->ctx;
+
fz_stream *file = NULL;
if (contents == NULL)
@@ -605,7 +616,7 @@ pdf_process_contents_buffer(pdf_csi *csi, pdf_obj *rdb, fz_buffer *contents)
}
fz_always(ctx)
{
- fz_drop_stream(file);
+ fz_drop_stream(ctx, file);
}
fz_catch(ctx)
{
@@ -614,12 +625,11 @@ pdf_process_contents_buffer(pdf_csi *csi, pdf_obj *rdb, fz_buffer *contents)
}
void
-pdf_process_stream_object(pdf_document *doc, pdf_obj *obj, const pdf_process *process, pdf_obj *res, fz_cookie *cookie)
+pdf_process_stream_object(fz_context *ctx, pdf_document *doc, pdf_obj *obj, const pdf_process *process, pdf_obj *res, fz_cookie *cookie)
{
- fz_context *ctx = doc->ctx;
pdf_csi *csi;
- csi = pdf_new_csi(doc, cookie, process);
+ csi = pdf_new_csi(ctx, doc, cookie, process);
fz_try(ctx)
{
csi->process.processor->process_contents(csi, csi->process.state, res, obj);
@@ -636,12 +646,11 @@ pdf_process_stream_object(pdf_document *doc, pdf_obj *obj, const pdf_process *pr
}
void
-pdf_process_glyph(pdf_document *doc, pdf_obj *resources, fz_buffer *contents, pdf_process *process)
+pdf_process_glyph(fz_context *ctx, pdf_document *doc, pdf_obj *resources, fz_buffer *contents, pdf_process *process)
{
pdf_csi *csi;
- fz_context *ctx = doc->ctx;
- csi = pdf_new_csi(doc, NULL, process);
+ csi = pdf_new_csi(ctx, doc, NULL, process);
fz_try(ctx)
{
pdf_process_contents_buffer(csi, resources, contents);
diff --git a/source/pdf/pdf-lex.c b/source/pdf/pdf-lex.c
index 096cb540..a8dfd916 100644
--- a/source/pdf/pdf-lex.c
+++ b/source/pdf/pdf-lex.c
@@ -44,27 +44,27 @@ static inline int unhex(int ch)
}
static void
-lex_white(fz_stream *f)
+lex_white(fz_context *ctx, fz_stream *f)
{
int c;
do {
- c = fz_read_byte(f);
+ c = fz_read_byte(ctx, f);
} while ((c <= 32) && (iswhite(c)));
if (c != EOF)
- fz_unread_byte(f);
+ fz_unread_byte(ctx, f);
}
static void
-lex_comment(fz_stream *f)
+lex_comment(fz_context *ctx, fz_stream *f)
{
int c;
do {
- c = fz_read_byte(f);
+ c = fz_read_byte(ctx, f);
} while ((c != '\012') && (c != '\015') && (c != EOF));
}
static int
-lex_number(fz_stream *f, pdf_lexbuf *buf, int c)
+lex_number(fz_context *ctx, fz_stream *f, pdf_lexbuf *buf, int c)
{
int neg = 0;
int i = 0;
@@ -89,7 +89,7 @@ lex_number(fz_stream *f, pdf_lexbuf *buf, int c)
while (1)
{
- c = fz_read_byte(f);
+ c = fz_read_byte(ctx, f);
switch (c)
{
case '.':
@@ -99,7 +99,7 @@ lex_number(fz_stream *f, pdf_lexbuf *buf, int c)
/* FIXME: Need overflow check here; do we care? */
break;
default:
- fz_unread_byte(f);
+ fz_unread_byte(ctx, f);
/* Fallthrough */
case EOF:
if (neg)
@@ -115,7 +115,7 @@ loop_after_dot:
d = 1;
while (1)
{
- c = fz_read_byte(f);
+ c = fz_read_byte(ctx, f);
switch (c)
{
case RANGE_0_9:
@@ -125,7 +125,7 @@ loop_after_dot:
d *= 10;
break;
default:
- fz_unread_byte(f);
+ fz_unread_byte(ctx, f);
/* Fallthrough */
case EOF:
v = (float)i + ((float)n / (float)d);
@@ -140,13 +140,13 @@ underflow:
/* Ignore any digits after here, because they are too small */
while (1)
{
- c = fz_read_byte(f);
+ c = fz_read_byte(ctx, f);
switch (c)
{
case RANGE_0_9:
break;
default:
- fz_unread_byte(f);
+ fz_unread_byte(ctx, f);
/* Fallthrough */
case EOF:
v = (float)i + ((float)n / (float)d);
@@ -159,26 +159,26 @@ underflow:
}
static void
-lex_name(fz_stream *f, pdf_lexbuf *buf)
+lex_name(fz_context *ctx, fz_stream *f, pdf_lexbuf *buf)
{
char *s = buf->scratch;
int n = buf->size;
while (n > 1)
{
- int c = fz_read_byte(f);
+ int c = fz_read_byte(ctx, f);
switch (c)
{
case IS_WHITE:
case IS_DELIM:
- fz_unread_byte(f);
+ fz_unread_byte(ctx, f);
goto end;
case EOF:
goto end;
case '#':
{
int d;
- c = fz_read_byte(f);
+ c = fz_read_byte(ctx, f);
switch (c)
{
case RANGE_0_9:
@@ -191,12 +191,12 @@ lex_name(fz_stream *f, pdf_lexbuf *buf)
d = (c - 'A' + 10) << 4;
break;
default:
- fz_unread_byte(f);
+ fz_unread_byte(ctx, f);
/* fallthrough */
case EOF:
goto end;
}
- c = fz_read_byte(f);
+ c = fz_read_byte(ctx, f);
switch (c)
{
case RANGE_0_9:
@@ -209,7 +209,7 @@ lex_name(fz_stream *f, pdf_lexbuf *buf)
c -= 'A' - 10;
break;
default:
- fz_unread_byte(f);
+ fz_unread_byte(ctx, f);
/* fallthrough */
case EOF:
*s++ = d;
@@ -232,7 +232,7 @@ end:
}
static int
-lex_string(fz_stream *f, pdf_lexbuf *lb)
+lex_string(fz_context *ctx, fz_stream *f, pdf_lexbuf *lb)
{
char *s = lb->scratch;
char *e = s + lb->size;
@@ -244,10 +244,10 @@ lex_string(fz_stream *f, pdf_lexbuf *lb)
{
if (s == e)
{
- s += pdf_lexbuf_grow(lb);
+ s += pdf_lexbuf_grow(ctx, lb);
e = lb->scratch + lb->size;
}
- c = fz_read_byte(f);
+ c = fz_read_byte(ctx, f);
switch (c)
{
case EOF:
@@ -263,7 +263,7 @@ lex_string(fz_stream *f, pdf_lexbuf *lb)
*s++ = c;
break;
case '\\':
- c = fz_read_byte(f);
+ c = fz_read_byte(ctx, f);
switch (c)
{
case EOF:
@@ -294,26 +294,26 @@ lex_string(fz_stream *f, pdf_lexbuf *lb)
break;
case RANGE_0_7:
oct = c - '0';
- c = fz_read_byte(f);
+ c = fz_read_byte(ctx, f);
if (c >= '0' && c <= '7')
{
oct = oct * 8 + (c - '0');
- c = fz_read_byte(f);
+ c = fz_read_byte(ctx, f);
if (c >= '0' && c <= '7')
oct = oct * 8 + (c - '0');
else if (c != EOF)
- fz_unread_byte(f);
+ fz_unread_byte(ctx, f);
}
else if (c != EOF)
- fz_unread_byte(f);
+ fz_unread_byte(ctx, f);
*s++ = oct;
break;
case '\n':
break;
case '\r':
- c = fz_read_byte(f);
+ c = fz_read_byte(ctx, f);
if ((c != '\n') && (c != EOF))
- fz_unread_byte(f);
+ fz_unread_byte(ctx, f);
break;
default:
*s++ = c;
@@ -330,7 +330,7 @@ end:
}
static int
-lex_hex_string(fz_stream *f, pdf_lexbuf *lb)
+lex_hex_string(fz_context *ctx, fz_stream *f, pdf_lexbuf *lb)
{
char *s = lb->scratch;
char *e = s + lb->size;
@@ -341,10 +341,10 @@ lex_hex_string(fz_stream *f, pdf_lexbuf *lb)
{
if (s == e)
{
- s += pdf_lexbuf_grow(lb);
+ s += pdf_lexbuf_grow(ctx, lb);
e = lb->scratch + lb->size;
}
- c = fz_read_byte(f);
+ c = fz_read_byte(ctx, f);
switch (c)
{
case IS_WHITE:
@@ -365,7 +365,7 @@ lex_hex_string(fz_stream *f, pdf_lexbuf *lb)
case EOF:
goto end;
default:
- fz_warn(f->ctx, "ignoring invalid character in hex string");
+ fz_warn(ctx, "ignoring invalid character in hex string");
}
}
end:
@@ -416,80 +416,79 @@ void pdf_lexbuf_init(fz_context *ctx, pdf_lexbuf *lb, int size)
{
lb->size = lb->base_size = size;
lb->len = 0;
- lb->ctx = ctx;
lb->scratch = &lb->buffer[0];
}
-void pdf_lexbuf_fin(pdf_lexbuf *lb)
+void pdf_lexbuf_fin(fz_context *ctx, pdf_lexbuf *lb)
{
if (lb && lb->size != lb->base_size)
- fz_free(lb->ctx, lb->scratch);
+ fz_free(ctx, lb->scratch);
}
-ptrdiff_t pdf_lexbuf_grow(pdf_lexbuf *lb)
+ptrdiff_t pdf_lexbuf_grow(fz_context *ctx, pdf_lexbuf *lb)
{
char *old = lb->scratch;
int newsize = lb->size * 2;
if (lb->size == lb->base_size)
{
- lb->scratch = fz_malloc(lb->ctx, newsize);
+ lb->scratch = fz_malloc(ctx, newsize);
memcpy(lb->scratch, lb->buffer, lb->size);
}
else
{
- lb->scratch = fz_resize_array(lb->ctx, lb->scratch, newsize, 1);
+ lb->scratch = fz_resize_array(ctx, lb->scratch, newsize, 1);
}
lb->size = newsize;
return lb->scratch - old;
}
pdf_token
-pdf_lex(fz_stream *f, pdf_lexbuf *buf)
+pdf_lex(fz_context *ctx, fz_stream *f, pdf_lexbuf *buf)
{
while (1)
{
- int c = fz_read_byte(f);
+ int c = fz_read_byte(ctx, f);
switch (c)
{
case EOF:
return PDF_TOK_EOF;
case IS_WHITE:
- lex_white(f);
+ lex_white(ctx, f);
break;
case '%':
- lex_comment(f);
+ lex_comment(ctx, f);
break;
case '/':
- lex_name(f, buf);
+ lex_name(ctx, f, buf);
return PDF_TOK_NAME;
case '(':
- return lex_string(f, buf);
+ return lex_string(ctx, f, buf);
case ')':
- fz_warn(f->ctx, "lexical error (unexpected ')')");
+ fz_warn(ctx, "lexical error (unexpected ')')");
continue;
case '<':
- c = fz_read_byte(f);
+ c = fz_read_byte(ctx, f);
if (c == '<')
{
return PDF_TOK_OPEN_DICT;
}
else
{
- fz_unread_byte(f);
- return lex_hex_string(f, buf);
+ fz_unread_byte(ctx, f);
+ return lex_hex_string(ctx, f, buf);
}
case '>':
- c = fz_read_byte(f);
+ c = fz_read_byte(ctx, f);
if (c == '>')
{
return PDF_TOK_CLOSE_DICT;
}
- fz_warn(f->ctx, "lexical error (unexpected '>')");
+ fz_warn(ctx, "lexical error (unexpected '>')");
if (c == EOF)
{
return PDF_TOK_EOF;
}
- fz_unread_byte(f);
+ fz_unread_byte(ctx, f);
continue;
case '[':
return PDF_TOK_OPEN_ARRAY;
@@ -500,40 +499,40 @@ pdf_lex(fz_stream *f, pdf_lexbuf *buf)
case '}':
return PDF_TOK_CLOSE_BRACE;
case IS_NUMBER:
- return lex_number(f, buf, c);
+ return lex_number(ctx, f, buf, c);
default: /* isregular: !isdelim && !iswhite && c != EOF */
- fz_unread_byte(f);
- lex_name(f, buf);
+ fz_unread_byte(ctx, f);
+ lex_name(ctx, f, buf);
return pdf_token_from_keyword(buf->scratch);
}
}
}
pdf_token
-pdf_lex_no_string(fz_stream *f, pdf_lexbuf *buf)
+pdf_lex_no_string(fz_context *ctx, fz_stream *f, pdf_lexbuf *buf)
{
while (1)
{
- int c = fz_read_byte(f);
+ int c = fz_read_byte(ctx, f);
switch (c)
{
case EOF:
return PDF_TOK_EOF;
case IS_WHITE:
- lex_white(f);
+ lex_white(ctx, f);
break;
case '%':
- lex_comment(f);
+ lex_comment(ctx, f);
break;
case '/':
- lex_name(f, buf);
+ lex_name(ctx, f, buf);
return PDF_TOK_NAME;
case '(':
continue;
case ')':
continue;
case '<':
- c = fz_read_byte(f);
+ c = fz_read_byte(ctx, f);
if (c == '<')
{
return PDF_TOK_OPEN_DICT;
@@ -543,7 +542,7 @@ pdf_lex_no_string(fz_stream *f, pdf_lexbuf *buf)
continue;
}
case '>':
- c = fz_read_byte(f);
+ c = fz_read_byte(ctx, f);
if (c == '>')
{
return PDF_TOK_CLOSE_DICT;
@@ -552,7 +551,7 @@ pdf_lex_no_string(fz_stream *f, pdf_lexbuf *buf)
{
return PDF_TOK_EOF;
}
- fz_unread_byte(f);
+ fz_unread_byte(ctx, f);
continue;
case '[':
return PDF_TOK_OPEN_ARRAY;
@@ -563,10 +562,10 @@ pdf_lex_no_string(fz_stream *f, pdf_lexbuf *buf)
case '}':
return PDF_TOK_CLOSE_BRACE;
case IS_NUMBER:
- return lex_number(f, buf, c);
+ return lex_number(ctx, f, buf, c);
default: /* isregular: !isdelim && !iswhite && c != EOF */
- fz_unread_byte(f);
- lex_name(f, buf);
+ fz_unread_byte(ctx, f);
+ lex_name(ctx, f, buf);
return pdf_token_from_keyword(buf->scratch);
}
}
@@ -581,7 +580,7 @@ void pdf_print_token(fz_context *ctx, fz_buffer *fzbuf, int tok, pdf_lexbuf *buf
break;
case PDF_TOK_STRING:
if (buf->len >= buf->size)
- pdf_lexbuf_grow(buf);
+ pdf_lexbuf_grow(ctx, buf);
buf->scratch[buf->len] = 0;
fz_buffer_cat_pdf_string(ctx, fzbuf, buf->scratch);
break;
diff --git a/source/pdf/pdf-nametree.c b/source/pdf/pdf-nametree.c
index bcbe8002..eecbb320 100644
--- a/source/pdf/pdf-nametree.c
+++ b/source/pdf/pdf-nametree.c
@@ -3,52 +3,52 @@
static pdf_obj *
pdf_lookup_name_imp(fz_context *ctx, pdf_obj *node, pdf_obj *needle)
{
- pdf_obj *kids = pdf_dict_gets(node, "Kids");
- pdf_obj *names = pdf_dict_gets(node, "Names");
+ pdf_obj *kids = pdf_dict_gets(ctx, node, "Kids");
+ pdf_obj *names = pdf_dict_gets(ctx, node, "Names");
- if (pdf_is_array(kids))
+ if (pdf_is_array(ctx, kids))
{
int l = 0;
- int r = pdf_array_len(kids) - 1;
+ int r = pdf_array_len(ctx, kids) - 1;
while (l <= r)
{
int m = (l + r) >> 1;
- pdf_obj *kid = pdf_array_get(kids, m);
- pdf_obj *limits = pdf_dict_gets(kid, "Limits");
- pdf_obj *first = pdf_array_get(limits, 0);
- pdf_obj *last = pdf_array_get(limits, 1);
+ pdf_obj *kid = pdf_array_get(ctx, kids, m);
+ pdf_obj *limits = pdf_dict_gets(ctx, kid, "Limits");
+ pdf_obj *first = pdf_array_get(ctx, limits, 0);
+ pdf_obj *last = pdf_array_get(ctx, limits, 1);
- if (pdf_objcmp(needle, first) < 0)
+ if (pdf_objcmp(ctx, needle, first) < 0)
r = m - 1;
- else if (pdf_objcmp(needle, last) > 0)
+ else if (pdf_objcmp(ctx, needle, last) > 0)
l = m + 1;
else
{
pdf_obj *obj;
- if (pdf_mark_obj(node))
+ if (pdf_mark_obj(ctx, node))
break;
obj = pdf_lookup_name_imp(ctx, kid, needle);
- pdf_unmark_obj(node);
+ pdf_unmark_obj(ctx, node);
return obj;
}
}
}
- if (pdf_is_array(names))
+ if (pdf_is_array(ctx, names))
{
int l = 0;
- int r = (pdf_array_len(names) / 2) - 1;
+ int r = (pdf_array_len(ctx, names) / 2) - 1;
while (l <= r)
{
int m = (l + r) >> 1;
int c;
- pdf_obj *key = pdf_array_get(names, m * 2);
- pdf_obj *val = pdf_array_get(names, m * 2 + 1);
+ pdf_obj *key = pdf_array_get(ctx, names, m * 2);
+ pdf_obj *val = pdf_array_get(ctx, names, m * 2 + 1);
- c = pdf_objcmp(needle, key);
+ c = pdf_objcmp(ctx, needle, key);
if (c < 0)
r = m - 1;
else if (c > 0)
@@ -60,49 +60,45 @@ pdf_lookup_name_imp(fz_context *ctx, pdf_obj *node, pdf_obj *needle)
/* Spec says names should be sorted (hence the binary search,
* above), but Acrobat copes with non-sorted. Drop back to a
* simple search if the binary search fails. */
- r = pdf_array_len(names)/2;
+ r = pdf_array_len(ctx, names)/2;
for (l = 0; l < r; l++)
- if (!pdf_objcmp(needle, pdf_array_get(names, l * 2)))
- return pdf_array_get(names, l * 2 + 1);
+ if (!pdf_objcmp(ctx, needle, pdf_array_get(ctx, names, l * 2)))
+ return pdf_array_get(ctx, names, l * 2 + 1);
}
return NULL;
}
pdf_obj *
-pdf_lookup_name(pdf_document *doc, char *which, pdf_obj *needle)
+pdf_lookup_name(fz_context *ctx, pdf_document *doc, char *which, pdf_obj *needle)
{
- fz_context *ctx = doc->ctx;
-
- pdf_obj *root = pdf_dict_gets(pdf_trailer(doc), "Root");
- pdf_obj *names = pdf_dict_gets(root, "Names");
- pdf_obj *tree = pdf_dict_gets(names, which);
+ pdf_obj *root = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Root");
+ pdf_obj *names = pdf_dict_gets(ctx, root, "Names");
+ pdf_obj *tree = pdf_dict_gets(ctx, names, which);
return pdf_lookup_name_imp(ctx, tree, needle);
}
pdf_obj *
-pdf_lookup_dest(pdf_document *doc, pdf_obj *needle)
+pdf_lookup_dest(fz_context *ctx, pdf_document *doc, pdf_obj *needle)
{
- fz_context *ctx = doc->ctx;
-
- pdf_obj *root = pdf_dict_gets(pdf_trailer(doc), "Root");
- pdf_obj *dests = pdf_dict_gets(root, "Dests");
- pdf_obj *names = pdf_dict_gets(root, "Names");
+ pdf_obj *root = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Root");
+ pdf_obj *dests = pdf_dict_gets(ctx, root, "Dests");
+ pdf_obj *names = pdf_dict_gets(ctx, root, "Names");
pdf_obj *dest = NULL;
/* PDF 1.1 has destinations in a dictionary */
if (dests)
{
- if (pdf_is_name(needle))
- return pdf_dict_get(dests, needle);
+ if (pdf_is_name(ctx, needle))
+ return pdf_dict_get(ctx, dests, needle);
else
- return pdf_dict_gets(dests, pdf_to_str_buf(needle));
+ return pdf_dict_gets(ctx, dests, pdf_to_str_buf(ctx, needle));
}
/* PDF 1.2 has destinations in a name tree */
if (names && !dest)
{
- pdf_obj *tree = pdf_dict_gets(names, "Dests");
+ pdf_obj *tree = pdf_dict_gets(ctx, names, "Dests");
return pdf_lookup_name_imp(ctx, tree, needle);
}
@@ -110,54 +106,53 @@ pdf_lookup_dest(pdf_document *doc, pdf_obj *needle)
}
static void
-pdf_load_name_tree_imp(pdf_obj *dict, pdf_document *doc, pdf_obj *node)
+pdf_load_name_tree_imp(fz_context *ctx, pdf_obj *dict, pdf_document *doc, pdf_obj *node)
{
- fz_context *ctx = doc->ctx;
- pdf_obj *kids = pdf_dict_gets(node, "Kids");
- pdf_obj *names = pdf_dict_gets(node, "Names");
+ pdf_obj *kids = pdf_dict_gets(ctx, node, "Kids");
+ pdf_obj *names = pdf_dict_gets(ctx, node, "Names");
int i;
UNUSED(ctx);
- if (kids && !pdf_mark_obj(node))
+ if (kids && !pdf_mark_obj(ctx, node))
{
- int len = pdf_array_len(kids);
+ int len = pdf_array_len(ctx, kids);
for (i = 0; i < len; i++)
- pdf_load_name_tree_imp(dict, doc, pdf_array_get(kids, i));
- pdf_unmark_obj(node);
+ pdf_load_name_tree_imp(ctx, dict, doc, pdf_array_get(ctx, kids, i));
+ pdf_unmark_obj(ctx, node);
}
if (names)
{
- int len = pdf_array_len(names);
+ int len = pdf_array_len(ctx, names);
for (i = 0; i + 1 < len; i += 2)
{
- pdf_obj *key = pdf_array_get(names, i);
- pdf_obj *val = pdf_array_get(names, i + 1);
- if (pdf_is_string(key))
+ pdf_obj *key = pdf_array_get(ctx, names, i);
+ pdf_obj *val = pdf_array_get(ctx, names, i + 1);
+ if (pdf_is_string(ctx, key))
{
- key = pdf_to_utf8_name(doc, key);
- pdf_dict_put(dict, key, val);
- pdf_drop_obj(key);
+ key = pdf_to_utf8_name(ctx, doc, key);
+ pdf_dict_put(ctx, dict, key, val);
+ pdf_drop_obj(ctx, key);
}
- else if (pdf_is_name(key))
+ else if (pdf_is_name(ctx, key))
{
- pdf_dict_put(dict, key, val);
+ pdf_dict_put(ctx, dict, key, val);
}
}
}
}
pdf_obj *
-pdf_load_name_tree(pdf_document *doc, char *which)
+pdf_load_name_tree(fz_context *ctx, pdf_document *doc, char *which)
{
- pdf_obj *root = pdf_dict_gets(pdf_trailer(doc), "Root");
- pdf_obj *names = pdf_dict_gets(root, "Names");
- pdf_obj *tree = pdf_dict_gets(names, which);
- if (pdf_is_dict(tree))
+ pdf_obj *root = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Root");
+ pdf_obj *names = pdf_dict_gets(ctx, root, "Names");
+ pdf_obj *tree = pdf_dict_gets(ctx, names, which);
+ if (pdf_is_dict(ctx, tree))
{
- pdf_obj *dict = pdf_new_dict(doc, 100);
- pdf_load_name_tree_imp(dict, doc, tree);
+ pdf_obj *dict = pdf_new_dict(ctx, doc, 100);
+ pdf_load_name_tree_imp(ctx, dict, doc, tree);
return dict;
}
return NULL;
diff --git a/source/pdf/pdf-object.c b/source/pdf/pdf-object.c
index c3ac178a..d4b008fb 100644
--- a/source/pdf/pdf-object.c
+++ b/source/pdf/pdf-object.c
@@ -33,7 +33,7 @@ struct pdf_obj_s
int refs;
unsigned char kind;
unsigned char flags;
- pdf_document *doc;
+ pdf_document *doc; /* KEEP */
int parent_num;
union
{
@@ -63,10 +63,9 @@ struct pdf_obj_s
};
pdf_obj *
-pdf_new_null(pdf_document *doc)
+pdf_new_null(fz_context *ctx, pdf_document *doc)
{
pdf_obj *obj;
- fz_context *ctx = doc->ctx;
obj = Memento_label(fz_malloc(ctx, sizeof(pdf_obj)), "pdf_obj(null)");
obj->doc = doc;
obj->refs = 1;
@@ -77,10 +76,9 @@ pdf_new_null(pdf_document *doc)
}
pdf_obj *
-pdf_new_bool(pdf_document *doc, int b)
+pdf_new_bool(fz_context *ctx, pdf_document *doc, int b)
{
pdf_obj *obj;
- fz_context *ctx = doc->ctx;
obj = Memento_label(fz_malloc(ctx, sizeof(pdf_obj)), "pdf_obj(bool)");
obj->doc = doc;
obj->refs = 1;
@@ -92,10 +90,9 @@ pdf_new_bool(pdf_document *doc, int b)
}
pdf_obj *
-pdf_new_int(pdf_document *doc, int i)
+pdf_new_int(fz_context *ctx, pdf_document *doc, int i)
{
pdf_obj *obj;
- fz_context *ctx = doc->ctx;
obj = Memento_label(fz_malloc(ctx, sizeof(pdf_obj)), "pdf_obj(int)");
obj->doc = doc;
obj->refs = 1;
@@ -107,10 +104,9 @@ pdf_new_int(pdf_document *doc, int i)
}
pdf_obj *
-pdf_new_real(pdf_document *doc, float f)
+pdf_new_real(fz_context *ctx, pdf_document *doc, float f)
{
pdf_obj *obj;
- fz_context *ctx = doc->ctx;
obj = Memento_label(fz_malloc(ctx, sizeof(pdf_obj)), "pdf_obj(real)");
obj->doc = doc;
obj->refs = 1;
@@ -122,10 +118,9 @@ pdf_new_real(pdf_document *doc, float f)
}
pdf_obj *
-pdf_new_string(pdf_document *doc, const char *str, int len)
+pdf_new_string(fz_context *ctx, pdf_document *doc, const char *str, int len)
{
pdf_obj *obj;
- fz_context *ctx = doc->ctx;
obj = Memento_label(fz_malloc(ctx, offsetof(pdf_obj, u.s.buf) + len + 1), "pdf_obj(string)");
obj->doc = doc;
obj->refs = 1;
@@ -139,10 +134,9 @@ pdf_new_string(pdf_document *doc, const char *str, int len)
}
pdf_obj *
-pdf_new_name(pdf_document *doc, const char *str)
+pdf_new_name(fz_context *ctx, pdf_document *doc, const char *str)
{
pdf_obj *obj;
- fz_context *ctx = doc->ctx;
obj = Memento_label(fz_malloc(ctx, offsetof(pdf_obj, u.n) + strlen(str) + 1), "pdf_obj(name)");
obj->doc = doc;
obj->refs = 1;
@@ -154,10 +148,9 @@ pdf_new_name(pdf_document *doc, const char *str)
}
pdf_obj *
-pdf_new_indirect(pdf_document *doc, int num, int gen)
+pdf_new_indirect(fz_context *ctx, pdf_document *doc, int num, int gen)
{
pdf_obj *obj;
- fz_context *ctx = doc->ctx;
obj = Memento_label(fz_malloc(ctx, sizeof(pdf_obj)), "pdf_obj(indirect)");
obj->doc = doc;
obj->refs = 1;
@@ -170,81 +163,77 @@ pdf_new_indirect(pdf_document *doc, int num, int gen)
}
pdf_obj *
-pdf_keep_obj(pdf_obj *obj)
+pdf_keep_obj(fz_context *ctx, pdf_obj *obj)
{
if (obj)
obj->refs ++;
return obj;
}
-int pdf_is_indirect(pdf_obj *obj)
+int pdf_is_indirect(fz_context *ctx, pdf_obj *obj)
{
return obj ? obj->kind == PDF_INDIRECT : 0;
}
#define RESOLVE(obj) \
- do { \
- if (obj && obj->kind == PDF_INDIRECT) \
- {\
- obj = pdf_resolve_indirect(obj); \
- } \
- } while (0)
+ if (obj && obj->kind == PDF_INDIRECT) \
+ obj = pdf_resolve_indirect(ctx, obj); \
-int pdf_is_null(pdf_obj *obj)
+int pdf_is_null(fz_context *ctx, pdf_obj *obj)
{
RESOLVE(obj);
return obj ? obj->kind == PDF_NULL : 0;
}
-int pdf_is_bool(pdf_obj *obj)
+int pdf_is_bool(fz_context *ctx, pdf_obj *obj)
{
RESOLVE(obj);
return obj ? obj->kind == PDF_BOOL : 0;
}
-int pdf_is_int(pdf_obj *obj)
+int pdf_is_int(fz_context *ctx, pdf_obj *obj)
{
RESOLVE(obj);
return obj ? obj->kind == PDF_INT : 0;
}
-int pdf_is_real(pdf_obj *obj)
+int pdf_is_real(fz_context *ctx, pdf_obj *obj)
{
RESOLVE(obj);
return obj ? obj->kind == PDF_REAL : 0;
}
-int pdf_is_number(pdf_obj *obj)
+int pdf_is_number(fz_context *ctx, pdf_obj *obj)
{
RESOLVE(obj);
return obj ? (obj->kind == PDF_REAL || obj->kind == PDF_INT) : 0;
}
-int pdf_is_string(pdf_obj *obj)
+int pdf_is_string(fz_context *ctx, pdf_obj *obj)
{
RESOLVE(obj);
return obj ? obj->kind == PDF_STRING : 0;
}
-int pdf_is_name(pdf_obj *obj)
+int pdf_is_name(fz_context *ctx, pdf_obj *obj)
{
RESOLVE(obj);
return obj ? obj->kind == PDF_NAME : 0;
}
-int pdf_is_array(pdf_obj *obj)
+int pdf_is_array(fz_context *ctx, pdf_obj *obj)
{
RESOLVE(obj);
return obj ? obj->kind == PDF_ARRAY : 0;
}
-int pdf_is_dict(pdf_obj *obj)
+int pdf_is_dict(fz_context *ctx, pdf_obj *obj)
{
RESOLVE(obj);
return obj ? obj->kind == PDF_DICT : 0;
}
-int pdf_to_bool(pdf_obj *obj)
+int pdf_to_bool(fz_context *ctx, pdf_obj *obj)
{
RESOLVE(obj);
if (!obj)
@@ -252,7 +241,7 @@ int pdf_to_bool(pdf_obj *obj)
return obj->kind == PDF_BOOL ? obj->u.b : 0;
}
-int pdf_to_int(pdf_obj *obj)
+int pdf_to_int(fz_context *ctx, pdf_obj *obj)
{
RESOLVE(obj);
if (!obj)
@@ -264,7 +253,7 @@ int pdf_to_int(pdf_obj *obj)
return 0;
}
-float pdf_to_real(pdf_obj *obj)
+float pdf_to_real(fz_context *ctx, pdf_obj *obj)
{
RESOLVE(obj);
if (!obj)
@@ -276,7 +265,7 @@ float pdf_to_real(pdf_obj *obj)
return 0;
}
-char *pdf_to_name(pdf_obj *obj)
+char *pdf_to_name(fz_context *ctx, pdf_obj *obj)
{
RESOLVE(obj);
if (!obj || obj->kind != PDF_NAME)
@@ -284,7 +273,7 @@ char *pdf_to_name(pdf_obj *obj)
return obj->u.n;
}
-char *pdf_to_str_buf(pdf_obj *obj)
+char *pdf_to_str_buf(fz_context *ctx, pdf_obj *obj)
{
RESOLVE(obj);
if (!obj || obj->kind != PDF_STRING)
@@ -292,7 +281,7 @@ char *pdf_to_str_buf(pdf_obj *obj)
return obj->u.s.buf;
}
-int pdf_to_str_len(pdf_obj *obj)
+int pdf_to_str_len(fz_context *ctx, pdf_obj *obj)
{
RESOLVE(obj);
if (!obj || obj->kind != PDF_STRING)
@@ -300,7 +289,7 @@ int pdf_to_str_len(pdf_obj *obj)
return obj->u.s.len;
}
-void pdf_set_int(pdf_obj *obj, int i)
+void pdf_set_int(fz_context *ctx, pdf_obj *obj, int i)
{
if (!obj || obj->kind != PDF_INT)
return;
@@ -308,7 +297,7 @@ void pdf_set_int(pdf_obj *obj, int i)
}
/* for use by pdf_crypt_obj_imp to decrypt AES string in place */
-void pdf_set_str_len(pdf_obj *obj, int newlen)
+void pdf_set_str_len(fz_context *ctx, pdf_obj *obj, int newlen)
{
RESOLVE(obj);
if (!obj || obj->kind != PDF_STRING)
@@ -318,27 +307,27 @@ void pdf_set_str_len(pdf_obj *obj, int newlen)
obj->u.s.len = newlen;
}
-pdf_obj *pdf_to_dict(pdf_obj *obj)
+pdf_obj *pdf_to_dict(fz_context *ctx, pdf_obj *obj)
{
RESOLVE(obj);
return (obj && obj->kind == PDF_DICT ? obj : NULL);
}
-int pdf_to_num(pdf_obj *obj)
+int pdf_to_num(fz_context *ctx, pdf_obj *obj)
{
if (!obj || obj->kind != PDF_INDIRECT)
return 0;
return obj->u.r.num;
}
-int pdf_to_gen(pdf_obj *obj)
+int pdf_to_gen(fz_context *ctx, pdf_obj *obj)
{
if (!obj || obj->kind != PDF_INDIRECT)
return 0;
return obj->u.r.gen;
}
-pdf_document *pdf_get_indirect_document(pdf_obj *obj)
+pdf_document *pdf_get_indirect_document(fz_context *ctx, pdf_obj *obj)
{
if (!obj || obj->kind != PDF_INDIRECT)
return NULL;
@@ -346,7 +335,7 @@ pdf_document *pdf_get_indirect_document(pdf_obj *obj)
}
int
-pdf_objcmp(pdf_obj *a, pdf_obj *b)
+pdf_objcmp(fz_context *ctx, pdf_obj *a, pdf_obj *b)
{
int i;
@@ -404,7 +393,7 @@ pdf_objcmp(pdf_obj *a, pdf_obj *b)
if (a->u.a.len != b->u.a.len)
return a->u.a.len - b->u.a.len;
for (i = 0; i < a->u.a.len; i++)
- if (pdf_objcmp(a->u.a.items[i], b->u.a.items[i]))
+ if (pdf_objcmp(ctx, a->u.a.items[i], b->u.a.items[i]))
return 1;
return 0;
@@ -413,9 +402,9 @@ pdf_objcmp(pdf_obj *a, pdf_obj *b)
return a->u.d.len - b->u.d.len;
for (i = 0; i < a->u.d.len; i++)
{
- if (pdf_objcmp(a->u.d.items[i].k, b->u.d.items[i].k))
+ if (pdf_objcmp(ctx, a->u.d.items[i].k, b->u.d.items[i].k))
return 1;
- if (pdf_objcmp(a->u.d.items[i].v, b->u.d.items[i].v))
+ if (pdf_objcmp(ctx, a->u.d.items[i].v, b->u.d.items[i].v))
return 1;
}
return 0;
@@ -445,11 +434,10 @@ pdf_objkindstr(pdf_obj *obj)
}
pdf_obj *
-pdf_new_array(pdf_document *doc, int initialcap)
+pdf_new_array(fz_context *ctx, pdf_document *doc, int initialcap)
{
pdf_obj *obj;
int i;
- fz_context *ctx = doc->ctx;
obj = Memento_label(fz_malloc(ctx, sizeof(pdf_obj)), "pdf_obj(array)");
obj->doc = doc;
@@ -477,12 +465,12 @@ pdf_new_array(pdf_document *doc, int initialcap)
}
static void
-pdf_array_grow(pdf_obj *obj)
+pdf_array_grow(fz_context *ctx, pdf_obj *obj)
{
int i;
int new_cap = (obj->u.a.cap * 3) / 2;
- obj->u.a.items = fz_resize_array(obj->doc->ctx, obj->u.a.items, new_cap, sizeof(pdf_obj*));
+ obj->u.a.items = fz_resize_array(ctx, obj->u.a.items, new_cap, sizeof(pdf_obj*));
obj->u.a.cap = new_cap;
for (i = obj->u.a.len ; i < obj->u.a.cap; i++)
@@ -490,29 +478,32 @@ pdf_array_grow(pdf_obj *obj)
}
pdf_obj *
-pdf_copy_array(pdf_obj *obj)
+pdf_copy_array(fz_context *ctx, pdf_obj *obj)
{
- pdf_obj *arr;
- int i;
- int n;
- fz_context *ctx = obj->doc->ctx;
-
RESOLVE(obj);
- if (!obj)
- return NULL; /* Can't warn :( */
- if (obj->kind != PDF_ARRAY)
- fz_warn(ctx, "assert: not an array (%s)", pdf_objkindstr(obj));
+ if (obj)
+ {
+ pdf_document *doc = obj->doc;
- arr = pdf_new_array(obj->doc, pdf_array_len(obj));
- n = pdf_array_len(obj);
- for (i = 0; i < n; i++)
- pdf_array_push(arr, pdf_array_get(obj, i));
+ pdf_obj *arr;
+ int i;
+ int n;
- return arr;
+ if (obj->kind != PDF_ARRAY)
+ fz_warn(ctx, "assert: not an array (%s)", pdf_objkindstr(obj));
+
+ arr = pdf_new_array(ctx, doc, pdf_array_len(ctx, obj));
+ n = pdf_array_len(ctx, obj);
+ for (i = 0; i < n; i++)
+ pdf_array_push(ctx, arr, pdf_array_get(ctx, obj, i));
+
+ return arr;
+ }
+ return NULL; /* Can't warn :( */
}
int
-pdf_array_len(pdf_obj *obj)
+pdf_array_len(fz_context *ctx, pdf_obj *obj)
{
RESOLVE(obj);
if (!obj || obj->kind != PDF_ARRAY)
@@ -521,258 +512,252 @@ pdf_array_len(pdf_obj *obj)
}
pdf_obj *
-pdf_array_get(pdf_obj *obj, int i)
+pdf_array_get(fz_context *ctx, pdf_obj *obj, int i)
{
RESOLVE(obj);
-
if (!obj || obj->kind != PDF_ARRAY)
return NULL;
-
if (i < 0 || i >= obj->u.a.len)
return NULL;
-
return obj->u.a.items[i];
}
-static void object_altered(pdf_obj *obj, pdf_obj *val)
+static void object_altered(fz_context *ctx, pdf_obj *obj, pdf_obj *val)
{
+ pdf_document *doc = obj->doc;
+
/*
- parent_num = 0 while an object is being parsed from the file.
- No further action is necessary.
+ parent_num = 0 while an object is being parsed from the file.
+ No further action is necessary.
*/
- if (obj->parent_num == 0 || obj->doc->freeze_updates)
+ if (obj->parent_num == 0 || doc->freeze_updates)
return;
/*
- Otherwise we need to ensure that the containing hierarchy of objects
- has been moved to the incremental xref section and the newly linked
- object needs to record the parent_num
+ Otherwise we need to ensure that the containing hierarchy of objects
+ has been moved to the incremental xref section and the newly linked
+ object needs to record the parent_num
*/
- pdf_xref_ensure_incremental_object(obj->doc, obj->parent_num);
- pdf_set_obj_parent(val, obj->parent_num);
+ pdf_xref_ensure_incremental_object(ctx, doc, obj->parent_num);
+ pdf_set_obj_parent(ctx, val, obj->parent_num);
}
void
-pdf_array_put(pdf_obj *obj, int i, pdf_obj *item)
+pdf_array_put(fz_context *ctx, pdf_obj *obj, int i, pdf_obj *item)
{
RESOLVE(obj);
-
- if (!obj)
- return; /* Can't warn :( */
- if (obj->kind != PDF_ARRAY)
- fz_warn(obj->doc->ctx, "assert: not an array (%s)", pdf_objkindstr(obj));
- else if (i < 0)
- fz_warn(obj->doc->ctx, "assert: index %d < 0", i);
- else if (i >= obj->u.a.len)
- fz_warn(obj->doc->ctx, "assert: index %d > length %d", i, obj->u.a.len);
- else
+ if (obj)
{
- pdf_drop_obj(obj->u.a.items[i]);
- obj->u.a.items[i] = pdf_keep_obj(item);
- }
+ if (obj->kind != PDF_ARRAY)
+ fz_warn(ctx, "assert: not an array (%s)", pdf_objkindstr(obj));
+ else if (i < 0)
+ fz_warn(ctx, "assert: index %d < 0", i);
+ else if (i >= obj->u.a.len)
+ fz_warn(ctx, "assert: index %d > length %d", i, obj->u.a.len);
+ else
+ {
+ pdf_drop_obj(ctx, obj->u.a.items[i]);
+ obj->u.a.items[i] = pdf_keep_obj(ctx, item);
+ }
- object_altered(obj, item);
+ object_altered(ctx, obj, item);
+ }
+ return; /* Can't warn :( */
}
void
-pdf_array_push(pdf_obj *obj, pdf_obj *item)
+pdf_array_push(fz_context *ctx, pdf_obj *obj, pdf_obj *item)
{
RESOLVE(obj);
-
- if (!obj)
- return; /* Can't warn :( */
- if (obj->kind != PDF_ARRAY)
- fz_warn(obj->doc->ctx, "assert: not an array (%s)", pdf_objkindstr(obj));
- else
+ if (obj)
{
- if (obj->u.a.len + 1 > obj->u.a.cap)
- pdf_array_grow(obj);
- obj->u.a.items[obj->u.a.len] = pdf_keep_obj(item);
- obj->u.a.len++;
- }
+ if (obj->kind != PDF_ARRAY)
+ fz_warn(ctx, "assert: not an array (%s)", pdf_objkindstr(obj));
+ else
+ {
+ if (obj->u.a.len + 1 > obj->u.a.cap)
+ pdf_array_grow(ctx, obj);
+ obj->u.a.items[obj->u.a.len] = pdf_keep_obj(ctx, item);
+ obj->u.a.len++;
+ }
- object_altered(obj, item);
+ object_altered(ctx, obj, item);
+ }
+ return; /* Can't warn :( */
}
void
-pdf_array_push_drop(pdf_obj *obj, pdf_obj *item)
+pdf_array_push_drop(fz_context *ctx, pdf_obj *obj, pdf_obj *item)
{
- fz_context *ctx = obj->doc->ctx;
-
- fz_try(ctx)
- {
- pdf_array_push(obj, item);
- }
- fz_always(ctx)
- {
- pdf_drop_obj(item);
- }
- fz_catch(ctx)
+ RESOLVE(obj);
+ if (obj)
{
- fz_rethrow(ctx);
+ fz_try(ctx)
+ pdf_array_push(ctx, obj, item);
+ fz_always(ctx)
+ pdf_drop_obj(ctx, item);
+ fz_catch(ctx)
+ fz_rethrow(ctx);
}
}
void
-pdf_array_insert(pdf_obj *obj, pdf_obj *item, int i)
+pdf_array_insert(fz_context *ctx, pdf_obj *obj, pdf_obj *item, int i)
{
RESOLVE(obj);
-
- if (!obj)
- return; /* Can't warn :( */
- if (obj->kind != PDF_ARRAY)
- fz_warn(obj->doc->ctx, "assert: not an array (%s)", pdf_objkindstr(obj));
- else
+ if (obj)
{
- if (i < 0 || i > obj->u.a.len)
- fz_throw(obj->doc->ctx, FZ_ERROR_GENERIC, "attempt to insert object %d in array of length %d", i, obj->u.a.len);
- if (obj->u.a.len + 1 > obj->u.a.cap)
- pdf_array_grow(obj);
- memmove(obj->u.a.items + i + 1, obj->u.a.items + i, (obj->u.a.len - i) * sizeof(pdf_obj*));
- obj->u.a.items[i] = pdf_keep_obj(item);
- obj->u.a.len++;
- }
+ if (obj->kind != PDF_ARRAY)
+ fz_warn(ctx, "assert: not an array (%s)", pdf_objkindstr(obj));
+ else
+ {
+ if (i < 0 || i > obj->u.a.len)
+ fz_throw(ctx, FZ_ERROR_GENERIC, "attempt to insert object %d in array of length %d", i, obj->u.a.len);
+ if (obj->u.a.len + 1 > obj->u.a.cap)
+ pdf_array_grow(ctx, obj);
+ memmove(obj->u.a.items + i + 1, obj->u.a.items + i, (obj->u.a.len - i) * sizeof(pdf_obj*));
+ obj->u.a.items[i] = pdf_keep_obj(ctx, item);
+ obj->u.a.len++;
+ }
- object_altered(obj, item);
+ object_altered(ctx, obj, item);
+ }
+ return; /* Can't warn :( */
}
void
-pdf_array_insert_drop(pdf_obj *obj, pdf_obj *item, int i)
+pdf_array_insert_drop(fz_context *ctx, pdf_obj *obj, pdf_obj *item, int i)
{
- fz_context *ctx = obj->doc->ctx;
- fz_try(ctx)
- {
- pdf_array_insert(obj, item, i);
- }
- fz_always(ctx)
+ RESOLVE(obj);
+ if (obj)
{
- pdf_drop_obj(item);
- }
- fz_catch(ctx)
- {
- fz_rethrow(ctx);
+ fz_try(ctx)
+ pdf_array_insert(ctx, obj, item, i);
+ fz_always(ctx)
+ pdf_drop_obj(ctx, item);
+ fz_catch(ctx)
+ fz_rethrow(ctx);
}
}
void
-pdf_array_delete(pdf_obj *obj, int i)
+pdf_array_delete(fz_context *ctx, pdf_obj *obj, int i)
{
RESOLVE(obj);
-
- if (!obj)
- return; /* Can't warn :( */
- if (obj->kind != PDF_ARRAY)
- fz_warn(obj->doc->ctx, "assert: not an array (%s)", pdf_objkindstr(obj));
- else
+ if (obj)
{
- pdf_drop_obj(obj->u.a.items[i]);
- obj->u.a.items[i] = 0;
- obj->u.a.len--;
- memmove(obj->u.a.items + i, obj->u.a.items + i + 1, (obj->u.a.len - i) * sizeof(pdf_obj*));
+ if (obj->kind != PDF_ARRAY)
+ fz_warn(ctx, "assert: not an array (%s)", pdf_objkindstr(obj));
+ else
+ {
+ pdf_drop_obj(ctx, obj->u.a.items[i]);
+ obj->u.a.items[i] = 0;
+ obj->u.a.len--;
+ memmove(obj->u.a.items + i, obj->u.a.items + i + 1, (obj->u.a.len - i) * sizeof(pdf_obj*));
+ }
}
+ return; /* Can't warn :( */
}
int
-pdf_array_contains(pdf_obj *arr, pdf_obj *obj)
+pdf_array_contains(fz_context *ctx, pdf_obj *arr, pdf_obj *obj)
{
int i, len;
- len = pdf_array_len(arr);
+ len = pdf_array_len(ctx, arr);
for (i = 0; i < len; i++)
- if (!pdf_objcmp(pdf_array_get(arr, i), obj))
+ if (!pdf_objcmp(ctx, pdf_array_get(ctx, arr, i), obj))
return 1;
return 0;
}
-pdf_obj *pdf_new_rect(pdf_document *doc, const fz_rect *rect)
+pdf_obj *pdf_new_rect(fz_context *ctx, pdf_document *doc, const fz_rect *rect)
{
pdf_obj *arr = NULL;
pdf_obj *item = NULL;
- fz_context *ctx = doc->ctx;
fz_var(arr);
fz_var(item);
fz_try(ctx)
{
- arr = pdf_new_array(doc, 4);
+ arr = pdf_new_array(ctx, doc, 4);
- item = pdf_new_real(doc, rect->x0);
- pdf_array_push(arr, item);
- pdf_drop_obj(item);
+ item = pdf_new_real(ctx, doc, rect->x0);
+ pdf_array_push(ctx, arr, item);
+ pdf_drop_obj(ctx, item);
item = NULL;
- item = pdf_new_real(doc, rect->y0);
- pdf_array_push(arr, item);
- pdf_drop_obj(item);
+ item = pdf_new_real(ctx, doc, rect->y0);
+ pdf_array_push(ctx, arr, item);
+ pdf_drop_obj(ctx, item);
item = NULL;
- item = pdf_new_real(doc, rect->x1);
- pdf_array_push(arr, item);
- pdf_drop_obj(item);
+ item = pdf_new_real(ctx, doc, rect->x1);
+ pdf_array_push(ctx, arr, item);
+ pdf_drop_obj(ctx, item);
item = NULL;
- item = pdf_new_real(doc, rect->y1);
- pdf_array_push(arr, item);
- pdf_drop_obj(item);
+ item = pdf_new_real(ctx, doc, rect->y1);
+ pdf_array_push(ctx, arr, item);
+ pdf_drop_obj(ctx, item);
item = NULL;
}
fz_catch(ctx)
{
- pdf_drop_obj(item);
- pdf_drop_obj(arr);
+ pdf_drop_obj(ctx, item);
+ pdf_drop_obj(ctx, arr);
fz_rethrow(ctx);
}
return arr;
}
-pdf_obj *pdf_new_matrix(pdf_document *doc, const fz_matrix *mtx)
+pdf_obj *pdf_new_matrix(fz_context *ctx, pdf_document *doc, const fz_matrix *mtx)
{
pdf_obj *arr = NULL;
pdf_obj *item = NULL;
- fz_context *ctx = doc->ctx;
fz_var(arr);
fz_var(item);
fz_try(ctx)
{
- arr = pdf_new_array(doc, 6);
+ arr = pdf_new_array(ctx, doc, 6);
- item = pdf_new_real(doc, mtx->a);
- pdf_array_push(arr, item);
- pdf_drop_obj(item);
+ item = pdf_new_real(ctx, doc, mtx->a);
+ pdf_array_push(ctx, arr, item);
+ pdf_drop_obj(ctx, item);
item = NULL;
- item = pdf_new_real(doc, mtx->b);
- pdf_array_push(arr, item);
- pdf_drop_obj(item);
+ item = pdf_new_real(ctx, doc, mtx->b);
+ pdf_array_push(ctx, arr, item);
+ pdf_drop_obj(ctx, item);
item = NULL;
- item = pdf_new_real(doc, mtx->c);
- pdf_array_push(arr, item);
- pdf_drop_obj(item);
+ item = pdf_new_real(ctx, doc, mtx->c);
+ pdf_array_push(ctx, arr, item);
+ pdf_drop_obj(ctx, item);
item = NULL;
- item = pdf_new_real(doc, mtx->d);
- pdf_array_push(arr, item);
- pdf_drop_obj(item);
+ item = pdf_new_real(ctx, doc, mtx->d);
+ pdf_array_push(ctx, arr, item);
+ pdf_drop_obj(ctx, item);
item = NULL;
- item = pdf_new_real(doc, mtx->e);
- pdf_array_push(arr, item);
- pdf_drop_obj(item);
+ item = pdf_new_real(ctx, doc, mtx->e);
+ pdf_array_push(ctx, arr, item);
+ pdf_drop_obj(ctx, item);
item = NULL;
- item = pdf_new_real(doc, mtx->f);
- pdf_array_push(arr, item);
- pdf_drop_obj(item);
+ item = pdf_new_real(ctx, doc, mtx->f);
+ pdf_array_push(ctx, arr, item);
+ pdf_drop_obj(ctx, item);
item = NULL;
}
fz_catch(ctx)
{
- pdf_drop_obj(item);
- pdf_drop_obj(arr);
+ pdf_drop_obj(ctx, item);
+ pdf_drop_obj(ctx, arr);
fz_rethrow(ctx);
}
@@ -785,15 +770,16 @@ static int keyvalcmp(const void *ap, const void *bp)
{
const struct keyval *a = ap;
const struct keyval *b = bp;
- return strcmp(pdf_to_name(a->k), pdf_to_name(b->k));
+ if (a->k->kind == PDF_NAME && b->k->kind == PDF_NAME)
+ return strcmp(a->k->u.n, b->k->u.n);
+ return 0;
}
pdf_obj *
-pdf_new_dict(pdf_document *doc, int initialcap)
+pdf_new_dict(fz_context *ctx, pdf_document *doc, int initialcap)
{
pdf_obj *obj;
int i;
- fz_context *ctx = doc->ctx;
obj = Memento_label(fz_malloc(ctx, sizeof(pdf_obj)), "pdf_obj(dict)");
obj->doc = doc;
@@ -824,12 +810,12 @@ pdf_new_dict(pdf_document *doc, int initialcap)
}
static void
-pdf_dict_grow(pdf_obj *obj)
+pdf_dict_grow(fz_context *ctx, pdf_obj *obj)
{
int i;
int new_cap = (obj->u.d.cap * 3) / 2;
- obj->u.d.items = fz_resize_array(obj->doc->ctx, obj->u.d.items, new_cap, sizeof(struct keyval));
+ obj->u.d.items = fz_resize_array(ctx, obj->u.d.items, new_cap, sizeof(struct keyval));
obj->u.d.cap = new_cap;
for (i = obj->u.d.len; i < obj->u.d.cap; i++)
@@ -840,29 +826,31 @@ pdf_dict_grow(pdf_obj *obj)
}
pdf_obj *
-pdf_copy_dict(pdf_obj *obj)
+pdf_copy_dict(fz_context *ctx, pdf_obj *obj)
{
pdf_obj *dict;
int i, n;
- pdf_document *doc;
RESOLVE(obj);
- if (!obj)
- return NULL; /* Can't warn :( */
- doc = obj->doc;
- if (obj->kind != PDF_DICT)
- fz_warn(doc->ctx, "assert: not a dict (%s)", pdf_objkindstr(obj));
+ if (obj)
+ {
+ pdf_document *doc = obj->doc;
- n = pdf_dict_len(obj);
- dict = pdf_new_dict(doc, n);
- for (i = 0; i < n; i++)
- pdf_dict_put(dict, pdf_dict_get_key(obj, i), pdf_dict_get_val(obj, i));
+ if (obj->kind != PDF_DICT)
+ fz_warn(ctx, "assert: not a dict (%s)", pdf_objkindstr(obj));
+
+ n = pdf_dict_len(ctx, obj);
+ dict = pdf_new_dict(ctx, doc, n);
+ for (i = 0; i < n; i++)
+ pdf_dict_put(ctx, dict, pdf_dict_get_key(ctx, obj, i), pdf_dict_get_val(ctx, obj, i));
- return dict;
+ return dict;
+ }
+ return NULL; /* Can't warn :( */
}
int
-pdf_dict_len(pdf_obj *obj)
+pdf_dict_len(fz_context *ctx, pdf_obj *obj)
{
RESOLVE(obj);
if (!obj || obj->kind != PDF_DICT)
@@ -871,40 +859,36 @@ pdf_dict_len(pdf_obj *obj)
}
pdf_obj *
-pdf_dict_get_key(pdf_obj *obj, int i)
+pdf_dict_get_key(fz_context *ctx, pdf_obj *obj, int i)
{
RESOLVE(obj);
if (!obj || obj->kind != PDF_DICT)
return NULL;
-
if (i < 0 || i >= obj->u.d.len)
return NULL;
-
return obj->u.d.items[i].k;
}
pdf_obj *
-pdf_dict_get_val(pdf_obj *obj, int i)
+pdf_dict_get_val(fz_context *ctx, pdf_obj *obj, int i)
{
RESOLVE(obj);
if (!obj || obj->kind != PDF_DICT)
return NULL;
-
if (i < 0 || i >= obj->u.d.len)
return NULL;
-
return obj->u.d.items[i].v;
}
static int
-pdf_dict_finds(pdf_obj *obj, const char *key, int *location)
+pdf_dict_finds(fz_context *ctx, pdf_obj *obj, const char *key, int *location)
{
if ((obj->flags & PDF_FLAGS_SORTED) && obj->u.d.len > 0)
{
int l = 0;
int r = obj->u.d.len - 1;
- if (strcmp(pdf_to_name(obj->u.d.items[r].k), key) < 0)
+ if (strcmp(pdf_to_name(ctx, obj->u.d.items[r].k), key) < 0)
{
if (location)
*location = r + 1;
@@ -914,7 +898,7 @@ pdf_dict_finds(pdf_obj *obj, const char *key, int *location)
while (l <= r)
{
int m = (l + r) >> 1;
- int c = -strcmp(pdf_to_name(obj->u.d.items[m].k), key);
+ int c = -strcmp(pdf_to_name(ctx, obj->u.d.items[m].k), key);
if (c < 0)
r = m - 1;
else if (c > 0)
@@ -931,7 +915,7 @@ pdf_dict_finds(pdf_obj *obj, const char *key, int *location)
{
int i;
for (i = 0; i < obj->u.d.len; i++)
- if (strcmp(pdf_to_name(obj->u.d.items[i].k), key) == 0)
+ if (strcmp(pdf_to_name(ctx, obj->u.d.items[i].k), key) == 0)
return i;
if (location)
@@ -942,7 +926,7 @@ pdf_dict_finds(pdf_obj *obj, const char *key, int *location)
}
pdf_obj *
-pdf_dict_gets(pdf_obj *obj, const char *key)
+pdf_dict_gets(fz_context *ctx, pdf_obj *obj, const char *key)
{
int i;
@@ -950,7 +934,7 @@ pdf_dict_gets(pdf_obj *obj, const char *key)
if (!obj || obj->kind != PDF_DICT)
return NULL;
- i = pdf_dict_finds(obj, key, NULL);
+ i = pdf_dict_finds(ctx, obj, key, NULL);
if (i >= 0)
return obj->u.d.items[i].v;
@@ -958,155 +942,154 @@ pdf_dict_gets(pdf_obj *obj, const char *key)
}
pdf_obj *
-pdf_dict_getp(pdf_obj *obj, const char *keys)
+pdf_dict_getp(fz_context *ctx, pdf_obj *obj, const char *keys)
{
- char buf[256];
- char *k, *e;
-
- if (strlen(keys)+1 > 256)
- fz_throw(obj->doc->ctx, FZ_ERROR_GENERIC, "buffer overflow in pdf_dict_getp");
+ RESOLVE(obj);
+ if (obj)
+ {
+ char buf[256];
+ char *k, *e;
- strcpy(buf, keys);
+ if (strlen(keys)+1 > 256)
+ fz_throw(ctx, FZ_ERROR_GENERIC, "buffer overflow in pdf_dict_getp");
- e = buf;
- while (*e && obj)
- {
- k = e;
- while (*e != '/' && *e != '\0')
- e++;
+ strcpy(buf, keys);
- if (*e == '/')
+ e = buf;
+ while (*e && obj)
{
- *e = '\0';
- e++;
+ k = e;
+ while (*e != '/' && *e != '\0')
+ e++;
+
+ if (*e == '/')
+ {
+ *e = '\0';
+ e++;
+ }
+
+ obj = pdf_dict_gets(ctx, obj, k);
}
- obj = pdf_dict_gets(obj, k);
+ return obj;
}
-
- return obj;
+ return NULL; /* Can't warn */
}
pdf_obj *
-pdf_dict_get(pdf_obj *obj, pdf_obj *key)
+pdf_dict_get(fz_context *ctx, pdf_obj *obj, pdf_obj *key)
{
if (!key || key->kind != PDF_NAME)
return NULL;
- return pdf_dict_gets(obj, pdf_to_name(key));
+ return pdf_dict_gets(ctx, obj, pdf_to_name(ctx, key));
}
pdf_obj *
-pdf_dict_getsa(pdf_obj *obj, const char *key, const char *abbrev)
+pdf_dict_getsa(fz_context *ctx, pdf_obj *obj, const char *key, const char *abbrev)
{
pdf_obj *v;
- v = pdf_dict_gets(obj, key);
+ v = pdf_dict_gets(ctx, obj, key);
if (v)
return v;
- return pdf_dict_gets(obj, abbrev);
+ return pdf_dict_gets(ctx, obj, abbrev);
}
void
-pdf_dict_put(pdf_obj *obj, pdf_obj *key, pdf_obj *val)
+pdf_dict_put(fz_context *ctx, pdf_obj *obj, pdf_obj *key, pdf_obj *val)
{
- int location;
- char *s;
- int i;
-
RESOLVE(obj);
- if (!obj)
- return; /* Can't warn :( */
- if (obj->kind != PDF_DICT)
+ if (obj)
{
- fz_warn(obj->doc->ctx, "assert: not a dict (%s)", pdf_objkindstr(obj));
- return;
- }
+ int location;
+ char *s;
+ int i;
- RESOLVE(key);
- if (!key || key->kind != PDF_NAME)
- {
- fz_warn(obj->doc->ctx, "assert: key is not a name (%s)", pdf_objkindstr(obj));
- return;
- }
- else
- s = pdf_to_name(key);
+ if (obj->kind != PDF_DICT)
+ {
+ fz_warn(ctx, "assert: not a dict (%s)", pdf_objkindstr(obj));
+ return;
+ }
- if (!val)
- {
- fz_warn(obj->doc->ctx, "assert: val does not exist for key (%s)", s);
- return;
- }
+ RESOLVE(key);
+ if (!key || key->kind != PDF_NAME)
+ {
+ fz_warn(ctx, "assert: key is not a name (%s)", pdf_objkindstr(obj));
+ return;
+ }
+ else
+ s = pdf_to_name(ctx, key);
+
+ if (!val)
+ {
+ fz_warn(ctx, "assert: val does not exist for key (%s)", s);
+ return;
+ }
- if (obj->u.d.len > 100 && !(obj->flags & PDF_FLAGS_SORTED))
- pdf_sort_dict(obj);
+ if (obj->u.d.len > 100 && !(obj->flags & PDF_FLAGS_SORTED))
+ pdf_sort_dict(ctx, obj);
- i = pdf_dict_finds(obj, s, &location);
- if (i >= 0 && i < obj->u.d.len)
- {
- if (obj->u.d.items[i].v != val)
+ i = pdf_dict_finds(ctx, obj, s, &location);
+ if (i >= 0 && i < obj->u.d.len)
{
- pdf_obj *d = obj->u.d.items[i].v;
- obj->u.d.items[i].v = pdf_keep_obj(val);
- pdf_drop_obj(d);
+ if (obj->u.d.items[i].v != val)
+ {
+ pdf_obj *d = obj->u.d.items[i].v;
+ obj->u.d.items[i].v = pdf_keep_obj(ctx, val);
+ pdf_drop_obj(ctx, d);
+ }
+ }
+ else
+ {
+ if (obj->u.d.len + 1 > obj->u.d.cap)
+ pdf_dict_grow(ctx, obj);
+
+ i = location;
+ if ((obj->flags & PDF_FLAGS_SORTED) && obj->u.d.len > 0)
+ memmove(&obj->u.d.items[i + 1],
+ &obj->u.d.items[i],
+ (obj->u.d.len - i) * sizeof(struct keyval));
+
+ obj->u.d.items[i].k = pdf_keep_obj(ctx, key);
+ obj->u.d.items[i].v = pdf_keep_obj(ctx, val);
+ obj->u.d.len ++;
}
- }
- else
- {
- if (obj->u.d.len + 1 > obj->u.d.cap)
- pdf_dict_grow(obj);
-
- i = location;
- if ((obj->flags & PDF_FLAGS_SORTED) && obj->u.d.len > 0)
- memmove(&obj->u.d.items[i + 1],
- &obj->u.d.items[i],
- (obj->u.d.len - i) * sizeof(struct keyval));
-
- obj->u.d.items[i].k = pdf_keep_obj(key);
- obj->u.d.items[i].v = pdf_keep_obj(val);
- obj->u.d.len ++;
- }
- object_altered(obj, val);
+ object_altered(ctx, obj, val);
+ }
+ return; /* Can't warn :( */
}
void
-pdf_dict_puts(pdf_obj *obj, const char *key, pdf_obj *val)
+pdf_dict_puts(fz_context *ctx, pdf_obj *obj, const char *key, pdf_obj *val)
{
pdf_document *doc = obj->doc;
- fz_context *ctx = doc->ctx;
- pdf_obj *keyobj = pdf_new_name(doc, key);
+ pdf_obj *keyobj = pdf_new_name(ctx, doc, key);
fz_try(ctx)
- {
- pdf_dict_put(obj, keyobj, val);
- }
+ pdf_dict_put(ctx, obj, keyobj, val);
fz_always(ctx)
- {
- pdf_drop_obj(keyobj);
- }
+ pdf_drop_obj(ctx, keyobj);
fz_catch(ctx)
- {
fz_rethrow(ctx);
- }
}
void
-pdf_dict_puts_drop(pdf_obj *obj, const char *key, pdf_obj *val)
+pdf_dict_puts_drop(fz_context *ctx, pdf_obj *obj, const char *key, pdf_obj *val)
{
pdf_document *doc = obj->doc;
- fz_context *ctx = doc->ctx;
pdf_obj *keyobj = NULL;
fz_var(keyobj);
fz_try(ctx)
{
- keyobj = pdf_new_name(doc, key);
- pdf_dict_put(obj, keyobj, val);
+ keyobj = pdf_new_name(ctx, doc, key);
+ pdf_dict_put(ctx, obj, keyobj, val);
}
fz_always(ctx)
{
- pdf_drop_obj(keyobj);
- pdf_drop_obj(val);
+ pdf_drop_obj(ctx, keyobj);
+ pdf_drop_obj(ctx, val);
}
fz_catch(ctx)
{
@@ -1115,122 +1098,113 @@ pdf_dict_puts_drop(pdf_obj *obj, const char *key, pdf_obj *val)
}
void
-pdf_dict_putp(pdf_obj *obj, const char *keys, pdf_obj *val)
+pdf_dict_putp(fz_context *ctx, pdf_obj *obj, const char *keys, pdf_obj *val)
{
- fz_context *ctx = obj->doc->ctx;
- char buf[256];
- char *k, *e;
- pdf_obj *cobj = NULL;
+ RESOLVE(obj);
+ if (obj)
+ {
+ pdf_document *doc = obj->doc;
- if (strlen(keys)+1 > 256)
- fz_throw(ctx, FZ_ERROR_GENERIC, "buffer overflow in pdf_dict_putp");
+ char buf[256];
+ char *k, *e;
+ pdf_obj *cobj = NULL;
- strcpy(buf, keys);
+ if (strlen(keys)+1 > 256)
+ fz_throw(ctx, FZ_ERROR_GENERIC, "buffer overflow in pdf_dict_putp");
- e = buf;
- while (*e)
- {
- k = e;
- while (*e != '/' && *e != '\0')
- e++;
+ strcpy(buf, keys);
- if (*e == '/')
+ e = buf;
+ while (*e)
{
- *e = '\0';
- e++;
- }
+ k = e;
+ while (*e != '/' && *e != '\0')
+ e++;
- if (*e)
- {
- /* Not the last key in the key path. Create subdict if not already there. */
- cobj = pdf_dict_gets(obj, k);
- if (cobj == NULL)
+ if (*e == '/')
{
- cobj = pdf_new_dict(obj->doc, 1);
- fz_try(ctx)
- {
- pdf_dict_puts(obj, k, cobj);
- }
- fz_always(ctx)
- {
- pdf_drop_obj(cobj);
- }
- fz_catch(ctx)
+ *e = '\0';
+ e++;
+ }
+
+ if (*e)
+ {
+ /* Not the last key in the key path. Create subdict if not already there. */
+ cobj = pdf_dict_gets(ctx, obj, k);
+ if (cobj == NULL)
{
- fz_rethrow(ctx);
+ cobj = pdf_new_dict(ctx, doc, 1);
+ fz_try(ctx)
+ pdf_dict_puts(ctx, obj, k, cobj);
+ fz_always(ctx)
+ pdf_drop_obj(ctx, cobj);
+ fz_catch(ctx)
+ fz_rethrow(ctx);
}
+ /* Move to subdict */
+ obj = cobj;
}
- /* Move to subdict */
- obj = cobj;
- }
- else
- {
- /* Last key. Use it to store the value */
- /* Use val = NULL to request delete */
- if (val)
- pdf_dict_puts(obj, k, val);
else
- pdf_dict_dels(obj, k);
+ {
+ /* Last key. Use it to store the value */
+ /* Use val = NULL to request delete */
+ if (val)
+ pdf_dict_puts(ctx, obj, k, val);
+ else
+ pdf_dict_dels(ctx, obj, k);
+ }
}
}
}
void
-pdf_dict_putp_drop(pdf_obj *obj, const char *keys, pdf_obj *val)
+pdf_dict_putp_drop(fz_context *ctx, pdf_obj *obj, const char *keys, pdf_obj *val)
{
- fz_context *ctx = obj->doc->ctx;
-
fz_try(ctx)
- {
- pdf_dict_putp(obj, keys, val);
- }
+ pdf_dict_putp(ctx, obj, keys, val);
fz_always(ctx)
- {
- pdf_drop_obj(val);
- }
+ pdf_drop_obj(ctx, val);
fz_catch(ctx)
- {
fz_rethrow(ctx);
- }
}
void
-pdf_dict_dels(pdf_obj *obj, const char *key)
+pdf_dict_dels(fz_context *ctx, pdf_obj *obj, const char *key)
{
RESOLVE(obj);
-
- if (!obj)
- return; /* Can't warn :( */
- if (obj->kind != PDF_DICT)
- fz_warn(obj->doc->ctx, "assert: not a dict (%s)", pdf_objkindstr(obj));
- else
+ if (obj)
{
- int i = pdf_dict_finds(obj, key, NULL);
- if (i >= 0)
+ if (obj->kind != PDF_DICT)
+ fz_warn(ctx, "assert: not a dict (%s)", pdf_objkindstr(obj));
+ else
{
- pdf_drop_obj(obj->u.d.items[i].k);
- pdf_drop_obj(obj->u.d.items[i].v);
- obj->flags &= ~PDF_FLAGS_SORTED;
- obj->u.d.items[i] = obj->u.d.items[obj->u.d.len-1];
- obj->u.d.len --;
+ int i = pdf_dict_finds(ctx, obj, key, NULL);
+ if (i >= 0)
+ {
+ pdf_drop_obj(ctx, obj->u.d.items[i].k);
+ pdf_drop_obj(ctx, obj->u.d.items[i].v);
+ obj->flags &= ~PDF_FLAGS_SORTED;
+ obj->u.d.items[i] = obj->u.d.items[obj->u.d.len-1];
+ obj->u.d.len --;
+ }
}
- }
- object_altered(obj, NULL);
+ object_altered(ctx, obj, NULL);
+ }
+ return; /* Can't warn :( */
}
void
-pdf_dict_del(pdf_obj *obj, pdf_obj *key)
+pdf_dict_del(fz_context *ctx, pdf_obj *obj, pdf_obj *key)
{
RESOLVE(key);
- if (!key || key->kind != PDF_NAME)
- fz_warn(obj->doc->ctx, "assert: key is not a name (%s)", pdf_objkindstr(obj));
- else
- pdf_dict_dels(obj, key->u.n);
+ if (key && key->kind == PDF_NAME)
+ pdf_dict_dels(ctx, obj, key->u.n);
+ /* else Can't warn */
}
void
-pdf_sort_dict(pdf_obj *obj)
+pdf_sort_dict(fz_context *ctx, pdf_obj *obj)
{
RESOLVE(obj);
if (!obj || obj->kind != PDF_DICT)
@@ -1243,7 +1217,7 @@ pdf_sort_dict(pdf_obj *obj)
}
int
-pdf_obj_marked(pdf_obj *obj)
+pdf_obj_marked(fz_context *ctx, pdf_obj *obj)
{
RESOLVE(obj);
if (!obj)
@@ -1252,7 +1226,7 @@ pdf_obj_marked(pdf_obj *obj)
}
int
-pdf_mark_obj(pdf_obj *obj)
+pdf_mark_obj(fz_context *ctx, pdf_obj *obj)
{
int marked;
RESOLVE(obj);
@@ -1264,7 +1238,7 @@ pdf_mark_obj(pdf_obj *obj)
}
void
-pdf_unmark_obj(pdf_obj *obj)
+pdf_unmark_obj(fz_context *ctx, pdf_obj *obj)
{
RESOLVE(obj);
if (!obj)
@@ -1273,7 +1247,7 @@ pdf_unmark_obj(pdf_obj *obj)
}
void
-pdf_set_obj_memo(pdf_obj *obj, int memo)
+pdf_set_obj_memo(fz_context *ctx, pdf_obj *obj, int memo)
{
obj->flags |= PDF_FLAGS_MEMO;
if (memo)
@@ -1283,7 +1257,7 @@ pdf_set_obj_memo(pdf_obj *obj, int memo)
}
int
-pdf_obj_memo(pdf_obj *obj, int *memo)
+pdf_obj_memo(fz_context *ctx, pdf_obj *obj, int *memo)
{
if (!(obj->flags & PDF_FLAGS_MEMO))
return 0;
@@ -1291,7 +1265,7 @@ pdf_obj_memo(pdf_obj *obj, int *memo)
return 1;
}
-int pdf_obj_is_dirty(pdf_obj *obj)
+int pdf_obj_is_dirty(fz_context *ctx, pdf_obj *obj)
{
RESOLVE(obj);
if (!obj)
@@ -1299,7 +1273,7 @@ int pdf_obj_is_dirty(pdf_obj *obj)
return !!(obj->flags & PDF_FLAGS_DIRTY);
}
-void pdf_dirty_obj(pdf_obj *obj)
+void pdf_dirty_obj(fz_context *ctx, pdf_obj *obj)
{
RESOLVE(obj);
if (!obj)
@@ -1307,7 +1281,7 @@ void pdf_dirty_obj(pdf_obj *obj)
obj->flags |= PDF_FLAGS_DIRTY;
}
-void pdf_clean_obj(pdf_obj *obj)
+void pdf_clean_obj(fz_context *ctx, pdf_obj *obj)
{
if (!obj)
return;
@@ -1315,27 +1289,25 @@ void pdf_clean_obj(pdf_obj *obj)
}
static void
-pdf_drop_array(pdf_obj *obj)
+pdf_drop_array(fz_context *ctx, pdf_obj *obj)
{
- fz_context *ctx = obj->doc->ctx;
int i;
for (i = 0; i < obj->u.a.len; i++)
- pdf_drop_obj(obj->u.a.items[i]);
+ pdf_drop_obj(ctx, obj->u.a.items[i]);
fz_free(ctx, obj->u.a.items);
fz_free(ctx, obj);
}
static void
-pdf_drop_dict(pdf_obj *obj)
+pdf_drop_dict(fz_context *ctx, pdf_obj *obj)
{
int i;
- fz_context *ctx = obj->doc->ctx;
for (i = 0; i < obj->u.d.len; i++) {
- pdf_drop_obj(obj->u.d.items[i].k);
- pdf_drop_obj(obj->u.d.items[i].v);
+ pdf_drop_obj(ctx, obj->u.d.items[i].k);
+ pdf_drop_obj(ctx, obj->u.d.items[i].v);
}
fz_free(ctx, obj->u.d.items);
@@ -1343,22 +1315,23 @@ pdf_drop_dict(pdf_obj *obj)
}
void
-pdf_drop_obj(pdf_obj *obj)
+pdf_drop_obj(fz_context *ctx, pdf_obj *obj)
{
- if (!obj)
- return;
- if (--obj->refs)
- return;
- if (obj->kind == PDF_ARRAY)
- pdf_drop_array(obj);
- else if (obj->kind == PDF_DICT)
- pdf_drop_dict(obj);
- else
- fz_free(obj->doc->ctx, obj);
+ if (obj)
+ {
+ if (--obj->refs)
+ return;
+ if (obj->kind == PDF_ARRAY)
+ pdf_drop_array(ctx, obj);
+ else if (obj->kind == PDF_DICT)
+ pdf_drop_dict(ctx, obj);
+ else
+ fz_free(ctx, obj);
+ }
}
void
-pdf_set_obj_parent(pdf_obj *obj, int num)
+pdf_set_obj_parent(fz_context *ctx, pdf_obj *obj, int num)
{
int n, i;
@@ -1370,39 +1343,38 @@ pdf_set_obj_parent(pdf_obj *obj, int num)
switch(obj->kind)
{
case PDF_ARRAY:
- n = pdf_array_len(obj);
+ n = pdf_array_len(ctx, obj);
for (i = 0; i < n; i++)
- pdf_set_obj_parent(pdf_array_get(obj, i), num);
+ pdf_set_obj_parent(ctx, pdf_array_get(ctx, obj, i), num);
break;
case PDF_DICT:
- n = pdf_dict_len(obj);
+ n = pdf_dict_len(ctx, obj);
for (i = 0; i < n; i++)
- pdf_set_obj_parent(pdf_dict_get_val(obj, i), num);
+ pdf_set_obj_parent(ctx, pdf_dict_get_val(ctx, obj, i), num);
break;
}
}
-int pdf_obj_parent_num(pdf_obj *obj)
+int pdf_obj_parent_num(fz_context *ctx, pdf_obj *obj)
{
return obj->parent_num;
}
-pdf_obj *pdf_new_obj_from_str(pdf_document *doc, const char *src)
+pdf_obj *pdf_new_obj_from_str(fz_context *ctx, pdf_document *doc, const char *src)
{
pdf_obj *result;
pdf_lexbuf lexbuf;
- fz_context *ctx = doc->ctx;
fz_stream *stream = fz_open_memory(ctx, (unsigned char *)src, strlen(src));
pdf_lexbuf_init(ctx, &lexbuf, PDF_LEXBUF_SMALL);
fz_try(ctx)
{
- result = pdf_parse_stm_obj(doc, stream, &lexbuf);
+ result = pdf_parse_stm_obj(ctx, doc, stream, &lexbuf);
}
fz_always(ctx)
{
- pdf_lexbuf_fin(&lexbuf);
- fz_drop_stream(stream);
+ pdf_lexbuf_fin(ctx, &lexbuf);
+ fz_drop_stream(ctx, stream);
}
fz_catch(ctx)
{
@@ -1426,7 +1398,7 @@ struct fmt
int last;
};
-static void fmt_obj(struct fmt *fmt, pdf_obj *obj);
+static void fmt_obj(fz_context *ctx, struct fmt *fmt, pdf_obj *obj);
static inline int iswhite(int ch)
{
@@ -1450,11 +1422,11 @@ static inline int isdelim(int ch)
ch == '%';
}
-static inline void fmt_putc(struct fmt *fmt, int c)
+static inline void fmt_putc(fz_context *ctx, struct fmt *fmt, int c)
{
if (fmt->sep && !isdelim(fmt->last) && !isdelim(c)) {
fmt->sep = 0;
- fmt_putc(fmt, ' ');
+ fmt_putc(ctx, fmt, ' ');
}
fmt->sep = 0;
@@ -1471,201 +1443,201 @@ static inline void fmt_putc(struct fmt *fmt, int c)
fmt->last = c;
}
-static inline void fmt_indent(struct fmt *fmt)
+static inline void fmt_indent(fz_context *ctx, struct fmt *fmt)
{
int i = fmt->indent;
while (i--) {
- fmt_putc(fmt, ' ');
- fmt_putc(fmt, ' ');
+ fmt_putc(ctx, fmt, ' ');
+ fmt_putc(ctx, fmt, ' ');
}
}
-static inline void fmt_puts(struct fmt *fmt, char *s)
+static inline void fmt_puts(fz_context *ctx, struct fmt *fmt, char *s)
{
while (*s)
- fmt_putc(fmt, *s++);
+ fmt_putc(ctx, fmt, *s++);
}
-static inline void fmt_sep(struct fmt *fmt)
+static inline void fmt_sep(fz_context *ctx, struct fmt *fmt)
{
fmt->sep = 1;
}
-static void fmt_str(struct fmt *fmt, pdf_obj *obj)
+static void fmt_str(fz_context *ctx, struct fmt *fmt, pdf_obj *obj)
{
- char *s = pdf_to_str_buf(obj);
- int n = pdf_to_str_len(obj);
+ char *s = pdf_to_str_buf(ctx, obj);
+ int n = pdf_to_str_len(ctx, obj);
int i, c;
- fmt_putc(fmt, '(');
+ fmt_putc(ctx, fmt, '(');
for (i = 0; i < n; i++)
{
c = (unsigned char)s[i];
if (c == '\n')
- fmt_puts(fmt, "\\n");
+ fmt_puts(ctx, fmt, "\\n");
else if (c == '\r')
- fmt_puts(fmt, "\\r");
+ fmt_puts(ctx, fmt, "\\r");
else if (c == '\t')
- fmt_puts(fmt, "\\t");
+ fmt_puts(ctx, fmt, "\\t");
else if (c == '\b')
- fmt_puts(fmt, "\\b");
+ fmt_puts(ctx, fmt, "\\b");
else if (c == '\f')
- fmt_puts(fmt, "\\f");
+ fmt_puts(ctx, fmt, "\\f");
else if (c == '(')
- fmt_puts(fmt, "\\(");
+ fmt_puts(ctx, fmt, "\\(");
else if (c == ')')
- fmt_puts(fmt, "\\)");
+ fmt_puts(ctx, fmt, "\\)");
else if (c == '\\')
- fmt_puts(fmt, "\\\\");
+ fmt_puts(ctx, fmt, "\\\\");
else if (c < 32 || c >= 127) {
- fmt_putc(fmt, '\\');
- fmt_putc(fmt, '0' + ((c / 64) & 7));
- fmt_putc(fmt, '0' + ((c / 8) & 7));
- fmt_putc(fmt, '0' + ((c) & 7));
+ fmt_putc(ctx, fmt, '\\');
+ fmt_putc(ctx, fmt, '0' + ((c / 64) & 7));
+ fmt_putc(ctx, fmt, '0' + ((c / 8) & 7));
+ fmt_putc(ctx, fmt, '0' + ((c) & 7));
}
else
- fmt_putc(fmt, c);
+ fmt_putc(ctx, fmt, c);
}
- fmt_putc(fmt, ')');
+ fmt_putc(ctx, fmt, ')');
}
-static void fmt_hex(struct fmt *fmt, pdf_obj *obj)
+static void fmt_hex(fz_context *ctx, struct fmt *fmt, pdf_obj *obj)
{
- char *s = pdf_to_str_buf(obj);
- int n = pdf_to_str_len(obj);
+ char *s = pdf_to_str_buf(ctx, obj);
+ int n = pdf_to_str_len(ctx, obj);
int i, b, c;
- fmt_putc(fmt, '<');
+ fmt_putc(ctx, fmt, '<');
for (i = 0; i < n; i++) {
b = (unsigned char) s[i];
c = (b >> 4) & 0x0f;
- fmt_putc(fmt, c < 0xA ? c + '0' : c + 'A' - 0xA);
+ fmt_putc(ctx, fmt, c < 0xA ? c + '0' : c + 'A' - 0xA);
c = (b) & 0x0f;
- fmt_putc(fmt, c < 0xA ? c + '0' : c + 'A' - 0xA);
+ fmt_putc(ctx, fmt, c < 0xA ? c + '0' : c + 'A' - 0xA);
}
- fmt_putc(fmt, '>');
+ fmt_putc(ctx, fmt, '>');
}
-static void fmt_name(struct fmt *fmt, pdf_obj *obj)
+static void fmt_name(fz_context *ctx, struct fmt *fmt, pdf_obj *obj)
{
- unsigned char *s = (unsigned char *) pdf_to_name(obj);
+ unsigned char *s = (unsigned char *) pdf_to_name(ctx, obj);
int i, c;
- fmt_putc(fmt, '/');
+ fmt_putc(ctx, fmt, '/');
for (i = 0; s[i]; i++)
{
if (isdelim(s[i]) || iswhite(s[i]) ||
s[i] == '#' || s[i] < 32 || s[i] >= 127)
{
- fmt_putc(fmt, '#');
+ fmt_putc(ctx, fmt, '#');
c = (s[i] >> 4) & 0xf;
- fmt_putc(fmt, c < 0xA ? c + '0' : c + 'A' - 0xA);
+ fmt_putc(ctx, fmt, c < 0xA ? c + '0' : c + 'A' - 0xA);
c = s[i] & 0xf;
- fmt_putc(fmt, c < 0xA ? c + '0' : c + 'A' - 0xA);
+ fmt_putc(ctx, fmt, c < 0xA ? c + '0' : c + 'A' - 0xA);
}
else
{
- fmt_putc(fmt, s[i]);
+ fmt_putc(ctx, fmt, s[i]);
}
}
}
-static void fmt_array(struct fmt *fmt, pdf_obj *obj)
+static void fmt_array(fz_context *ctx, struct fmt *fmt, pdf_obj *obj)
{
int i, n;
- n = pdf_array_len(obj);
+ n = pdf_array_len(ctx, obj);
if (fmt->tight) {
- fmt_putc(fmt, '[');
+ fmt_putc(ctx, fmt, '[');
for (i = 0; i < n; i++) {
- fmt_obj(fmt, pdf_array_get(obj, i));
- fmt_sep(fmt);
+ fmt_obj(ctx, fmt, pdf_array_get(ctx, obj, i));
+ fmt_sep(ctx, fmt);
}
- fmt_putc(fmt, ']');
+ fmt_putc(ctx, fmt, ']');
}
else {
- fmt_puts(fmt, "[ ");
+ fmt_puts(ctx, fmt, "[ ");
for (i = 0; i < n; i++) {
if (fmt->col > 60) {
- fmt_putc(fmt, '\n');
- fmt_indent(fmt);
+ fmt_putc(ctx, fmt, '\n');
+ fmt_indent(ctx, fmt);
}
- fmt_obj(fmt, pdf_array_get(obj, i));
- fmt_putc(fmt, ' ');
+ fmt_obj(ctx, fmt, pdf_array_get(ctx, obj, i));
+ fmt_putc(ctx, fmt, ' ');
}
- fmt_putc(fmt, ']');
- fmt_sep(fmt);
+ fmt_putc(ctx, fmt, ']');
+ fmt_sep(ctx, fmt);
}
}
-static void fmt_dict(struct fmt *fmt, pdf_obj *obj)
+static void fmt_dict(fz_context *ctx, struct fmt *fmt, pdf_obj *obj)
{
int i, n;
pdf_obj *key, *val;
- n = pdf_dict_len(obj);
+ n = pdf_dict_len(ctx, obj);
if (fmt->tight) {
- fmt_puts(fmt, "<<");
+ fmt_puts(ctx, fmt, "<<");
for (i = 0; i < n; i++) {
- fmt_obj(fmt, pdf_dict_get_key(obj, i));
- fmt_sep(fmt);
- fmt_obj(fmt, pdf_dict_get_val(obj, i));
- fmt_sep(fmt);
+ fmt_obj(ctx, fmt, pdf_dict_get_key(ctx, obj, i));
+ fmt_sep(ctx, fmt);
+ fmt_obj(ctx, fmt, pdf_dict_get_val(ctx, obj, i));
+ fmt_sep(ctx, fmt);
}
- fmt_puts(fmt, ">>");
+ fmt_puts(ctx, fmt, ">>");
}
else {
- fmt_puts(fmt, "<<\n");
+ fmt_puts(ctx, fmt, "<<\n");
fmt->indent ++;
for (i = 0; i < n; i++) {
- key = pdf_dict_get_key(obj, i);
- val = pdf_dict_get_val(obj, i);
- fmt_indent(fmt);
- fmt_obj(fmt, key);
- fmt_putc(fmt, ' ');
- if (!pdf_is_indirect(val) && pdf_is_array(val))
+ key = pdf_dict_get_key(ctx, obj, i);
+ val = pdf_dict_get_val(ctx, obj, i);
+ fmt_indent(ctx, fmt);
+ fmt_obj(ctx, fmt, key);
+ fmt_putc(ctx, fmt, ' ');
+ if (!pdf_is_indirect(ctx, val) && pdf_is_array(ctx, val))
fmt->indent ++;
- fmt_obj(fmt, val);
- fmt_putc(fmt, '\n');
- if (!pdf_is_indirect(val) && pdf_is_array(val))
+ fmt_obj(ctx, fmt, val);
+ fmt_putc(ctx, fmt, '\n');
+ if (!pdf_is_indirect(ctx, val) && pdf_is_array(ctx, val))
fmt->indent --;
}
fmt->indent --;
- fmt_indent(fmt);
- fmt_puts(fmt, ">>");
+ fmt_indent(ctx, fmt);
+ fmt_puts(ctx, fmt, ">>");
}
}
-static void fmt_obj(struct fmt *fmt, pdf_obj *obj)
+static void fmt_obj(fz_context *ctx, struct fmt *fmt, pdf_obj *obj)
{
char buf[256];
if (!obj)
- fmt_puts(fmt, "<NULL>");
- else if (pdf_is_indirect(obj))
+ fmt_puts(ctx, fmt, "<NULL>");
+ else if (pdf_is_indirect(ctx, obj))
{
- fz_snprintf(buf, sizeof buf, "%d %d R", pdf_to_num(obj), pdf_to_gen(obj));
- fmt_puts(fmt, buf);
- }
- else if (pdf_is_null(obj))
- fmt_puts(fmt, "null");
- else if (pdf_is_bool(obj))
- fmt_puts(fmt, pdf_to_bool(obj) ? "true" : "false");
- else if (pdf_is_int(obj))
+ fz_snprintf(buf, sizeof buf, "%d %d R", pdf_to_num(ctx, obj), pdf_to_gen(ctx, obj));
+ fmt_puts(ctx, fmt, buf);
+ }
+ else if (pdf_is_null(ctx, obj))
+ fmt_puts(ctx, fmt, "null");
+ else if (pdf_is_bool(ctx, obj))
+ fmt_puts(ctx, fmt, pdf_to_bool(ctx, obj) ? "true" : "false");
+ else if (pdf_is_int(ctx, obj))
{
- fz_snprintf(buf, sizeof buf, "%d", pdf_to_int(obj));
- fmt_puts(fmt, buf);
+ fz_snprintf(buf, sizeof buf, "%d", pdf_to_int(ctx, obj));
+ fmt_puts(ctx, fmt, buf);
}
- else if (pdf_is_real(obj))
+ else if (pdf_is_real(ctx, obj))
{
- fz_snprintf(buf, sizeof buf, "%g", pdf_to_real(obj));
- fmt_puts(fmt, buf);
+ fz_snprintf(buf, sizeof buf, "%g", pdf_to_real(ctx, obj));
+ fmt_puts(ctx, fmt, buf);
}
- else if (pdf_is_string(obj))
+ else if (pdf_is_string(ctx, obj))
{
- char *str = pdf_to_str_buf(obj);
- int len = pdf_to_str_len(obj);
+ char *str = pdf_to_str_buf(ctx, obj);
+ int len = pdf_to_str_len(ctx, obj);
int added = 0;
int i, c;
for (i = 0; i < len; i++) {
@@ -1676,22 +1648,22 @@ static void fmt_obj(struct fmt *fmt, pdf_obj *obj)
added += 3;
}
if (added < len)
- fmt_str(fmt, obj);
+ fmt_str(ctx, fmt, obj);
else
- fmt_hex(fmt, obj);
- }
- else if (pdf_is_name(obj))
- fmt_name(fmt, obj);
- else if (pdf_is_array(obj))
- fmt_array(fmt, obj);
- else if (pdf_is_dict(obj))
- fmt_dict(fmt, obj);
+ fmt_hex(ctx, fmt, obj);
+ }
+ else if (pdf_is_name(ctx, obj))
+ fmt_name(ctx, fmt, obj);
+ else if (pdf_is_array(ctx, obj))
+ fmt_array(ctx, fmt, obj);
+ else if (pdf_is_dict(ctx, obj))
+ fmt_dict(ctx, fmt, obj);
else
- fmt_puts(fmt, "<unknown object>");
+ fmt_puts(ctx, fmt, "<unknown object>");
}
int
-pdf_sprint_obj(char *s, int n, pdf_obj *obj, int tight)
+pdf_sprint_obj(fz_context *ctx, char *s, int n, pdf_obj *obj, int tight)
{
struct fmt fmt;
@@ -1704,7 +1676,7 @@ pdf_sprint_obj(char *s, int n, pdf_obj *obj, int tight)
fmt.buf = s;
fmt.cap = n;
fmt.len = 0;
- fmt_obj(&fmt, obj);
+ fmt_obj(ctx, &fmt, obj);
if (fmt.buf && fmt.len < fmt.cap)
fmt.buf[fmt.len] = '\0';
@@ -1713,67 +1685,67 @@ pdf_sprint_obj(char *s, int n, pdf_obj *obj, int tight)
}
int
-pdf_fprint_obj(FILE *fp, pdf_obj *obj, int tight)
+pdf_fprint_obj(fz_context *ctx, FILE *fp, pdf_obj *obj, int tight)
{
char buf[1024];
char *ptr;
int n;
- n = pdf_sprint_obj(NULL, 0, obj, tight);
+ n = pdf_sprint_obj(ctx, NULL, 0, obj, tight);
if ((n + 1) < sizeof buf)
{
- pdf_sprint_obj(buf, sizeof buf, obj, tight);
+ pdf_sprint_obj(ctx, buf, sizeof buf, obj, tight);
fputs(buf, fp);
fputc('\n', fp);
}
else
{
- ptr = fz_malloc(obj->doc->ctx, n + 1);
- pdf_sprint_obj(ptr, n + 1, obj, tight);
+ ptr = fz_malloc(ctx, n + 1);
+ pdf_sprint_obj(ctx, ptr, n + 1, obj, tight);
fputs(ptr, fp);
fputc('\n', fp);
- fz_free(obj->doc->ctx, ptr);
+ fz_free(ctx, ptr);
}
return n;
}
-int pdf_output_obj(fz_output *out, pdf_obj *obj, int tight)
+int pdf_output_obj(fz_context *ctx, fz_output *out, pdf_obj *obj, int tight)
{
char buf[1024];
char *ptr;
int n;
- n = pdf_sprint_obj(NULL, 0, obj, tight);
+ n = pdf_sprint_obj(ctx, NULL, 0, obj, tight);
if ((n + 1) < sizeof buf)
{
- pdf_sprint_obj(buf, sizeof buf, obj, tight);
- fz_printf(out, "%s\n", buf);
+ pdf_sprint_obj(ctx, buf, sizeof buf, obj, tight);
+ fz_printf(ctx, out, "%s\n", buf);
}
else
{
- ptr = fz_malloc(obj->doc->ctx, n + 1);
- pdf_sprint_obj(ptr, n + 1, obj, tight);
- fz_printf(out, "%s\n", ptr);
- fz_free(obj->doc->ctx, ptr);
+ ptr = fz_malloc(ctx, n + 1);
+ pdf_sprint_obj(ctx, ptr, n + 1, obj, tight);
+ fz_printf(ctx, out, "%s\n", ptr);
+ fz_free(ctx, ptr);
}
return n;
}
#ifndef NDEBUG
void
-pdf_print_obj(pdf_obj *obj)
+pdf_print_obj(fz_context *ctx, pdf_obj *obj)
{
- pdf_fprint_obj(stdout, obj, 0);
+ pdf_fprint_obj(ctx, stdout, obj, 0);
}
void
-pdf_print_ref(pdf_obj *ref)
+pdf_print_ref(fz_context *ctx, pdf_obj *ref)
{
- pdf_print_obj(pdf_resolve_indirect(ref));
+ pdf_print_obj(ctx, pdf_resolve_indirect(ctx, ref));
}
#endif
-int pdf_obj_refs(pdf_obj *ref)
+int pdf_obj_refs(fz_context *ctx, pdf_obj *ref)
{
return (ref ? ref->refs : 0);
}
diff --git a/source/pdf/pdf-op-buffer.c b/source/pdf/pdf-op-buffer.c
index 6142620c..e2bbd343 100644
--- a/source/pdf/pdf-op-buffer.c
+++ b/source/pdf/pdf-op-buffer.c
@@ -9,18 +9,18 @@ typedef struct pdf_buffer_state_s
pdf_buffer_state;
static void
-put_hexstring(pdf_csi *csi, fz_output *out)
+put_hexstring(fz_context *ctx, fz_output *out, pdf_csi *csi)
{
int i;
- fz_printf(out, "<");
+ fz_printf(ctx, out, "<");
for (i = 0; i < csi->string_len; i++)
- fz_printf(out, "%02x", csi->string[i]);
- fz_printf(out, ">");
+ fz_printf(ctx, out, "%02x", csi->string[i]);
+ fz_printf(ctx, out, ">");
}
static void
-put_string(pdf_csi *csi, fz_output *out)
+put_string(fz_context *ctx, fz_output *out, pdf_csi *csi)
{
int i;
@@ -28,40 +28,40 @@ put_string(pdf_csi *csi, fz_output *out)
if (csi->string[i] < 32 || csi->string[i] >= 127)
break;
if (i < csi->string_len)
- put_hexstring(csi, out);
+ put_hexstring(ctx, out, csi);
else
{
- fz_printf(out, "(");
+ fz_printf(ctx, out, "(");
for (i = 0; i < csi->string_len; i++)
{
char c = csi->string[i];
switch (c)
{
case '(':
- fz_printf(out, "\\(");
+ fz_printf(ctx, out, "\\(");
break;
case ')':
- fz_printf(out, "\\)");
+ fz_printf(ctx, out, "\\)");
break;
case '\\':
- fz_printf(out, "\\\\");
+ fz_printf(ctx, out, "\\\\");
break;
default:
- fz_printf(out, "%c", csi->string[i]);
+ fz_printf(ctx, out, "%c", csi->string[i]);
break;
}
}
- fz_printf(out, ")");
+ fz_printf(ctx, out, ")");
}
}
static void
-put_string_or_obj(pdf_csi *csi, fz_output *out)
+put_string_or_obj(fz_context *ctx, fz_output *out, pdf_csi *csi)
{
if (csi->string_len)
- put_string(csi, out);
+ put_string(ctx, out, csi);
else
- pdf_output_obj(out, csi->obj, 1);
+ pdf_output_obj(ctx, out, csi->obj, 1);
}
static void
@@ -69,9 +69,9 @@ pdf_buffer_dquote(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "%f %f ", csi->stack[0], csi->stack[1]);
- put_string_or_obj(csi, state->out);
- fz_printf(state->out, " \"\n");
+ fz_printf(state->ctx, state->out, "%f %f ", csi->stack[0], csi->stack[1]);
+ put_string_or_obj(state->ctx, state->out, csi);
+ fz_printf(state->ctx, state->out, " \"\n");
}
static void
@@ -79,8 +79,8 @@ pdf_buffer_squote(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- put_string_or_obj(csi, state->out);
- fz_printf(state->out, " \'\n");
+ put_string_or_obj(state->ctx, state->out, csi);
+ fz_printf(state->ctx, state->out, " \'\n");
}
static void
@@ -88,7 +88,7 @@ pdf_buffer_B(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "B\n");
+ fz_printf(state->ctx, state->out, "B\n");
}
static void
@@ -96,7 +96,7 @@ pdf_buffer_Bstar(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "B*\n");
+ fz_printf(state->ctx, state->out, "B*\n");
}
static void
@@ -104,9 +104,9 @@ pdf_buffer_BDC(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "/%s ", csi->name);
- pdf_output_obj(state->out, csi->obj, 1);
- fz_printf(state->out, " BDC\n");
+ fz_printf(state->ctx, state->out, "/%s ", csi->name);
+ pdf_output_obj(state->ctx, state->out, csi->obj, 1);
+ fz_printf(state->ctx, state->out, " BDC\n");
}
static void
@@ -120,7 +120,7 @@ pdf_buffer_BI(pdf_csi *csi, void *state_)
const char *match;
const char *match2;
pdf_obj *filter;
- fz_context *ctx = csi->doc->ctx;
+ fz_context *ctx = csi->ctx;
if (csi->img == NULL)
return;
@@ -163,44 +163,44 @@ pdf_buffer_BI(pdf_csi *csi, void *state_)
return;
}
- filter = pdf_dict_gets(csi->obj, "Filter");
+ filter = pdf_dict_gets(ctx, csi->obj, "Filter");
if (filter == NULL)
- filter = pdf_dict_gets(csi->obj, "F");
+ filter = pdf_dict_gets(ctx, csi->obj, "F");
if (match == NULL)
{
/* Remove any filter entry (e.g. Ascii85Decode) */
if (filter)
{
- pdf_dict_dels(csi->obj, "Filter");
- pdf_dict_dels(csi->obj, "F");
+ pdf_dict_dels(ctx, csi->obj, "Filter");
+ pdf_dict_dels(ctx, csi->obj, "F");
}
- pdf_dict_dels(csi->obj, "DecodeParms");
- pdf_dict_dels(csi->obj, "DP");
+ pdf_dict_dels(ctx, csi->obj, "DecodeParms");
+ pdf_dict_dels(ctx, csi->obj, "DP");
}
- else if (pdf_is_array(filter))
+ else if (pdf_is_array(ctx, filter))
{
- int l = pdf_array_len(filter);
- pdf_obj *o = (l == 0 ? NULL : pdf_array_get(filter, l-1));
- const char *fil = pdf_to_name(o);
+ int l = pdf_array_len(ctx, filter);
+ pdf_obj *o = (l == 0 ? NULL : pdf_array_get(ctx, filter, l-1));
+ const char *fil = pdf_to_name(ctx, o);
if (l == 0 || (strcmp(fil, match) && strcmp(fil, match2)))
{
fz_warn(ctx, "Unexpected Filter configuration in inline image");
return;
}
- pdf_dict_puts(csi->obj, "F", o);
+ pdf_dict_puts(ctx, csi->obj, "F", o);
- o = pdf_dict_gets(csi->obj, "DecodeParms");
+ o = pdf_dict_gets(ctx, csi->obj, "DecodeParms");
if (o == NULL)
- o = pdf_dict_gets(csi->obj, "DP");
+ o = pdf_dict_gets(ctx, csi->obj, "DP");
if (o)
{
- o = pdf_array_get(o, l-1);
+ o = pdf_array_get(ctx, o, l-1);
if (o)
- pdf_dict_puts(csi->obj, "DP", o);
+ pdf_dict_puts(ctx, csi->obj, "DP", o);
else
- pdf_dict_dels(csi->obj, "DP");
- pdf_dict_dels(csi->obj, "DecodeParms");
+ pdf_dict_dels(ctx, csi->obj, "DP");
+ pdf_dict_dels(ctx, csi->obj, "DecodeParms");
}
}
else
@@ -208,25 +208,25 @@ pdf_buffer_BI(pdf_csi *csi, void *state_)
/* It's a singleton. It must be correct */
}
- fz_printf(state->out, "BI\n");
+ fz_printf(state->ctx, state->out, "BI\n");
- len = pdf_dict_len(csi->obj);
+ len = pdf_dict_len(ctx, csi->obj);
for (i = 0; i < len; i++)
{
- pdf_output_obj(state->out, pdf_dict_get_key(csi->obj, i), 1);
- pdf_output_obj(state->out, pdf_dict_get_val(csi->obj, i), 1);
+ pdf_output_obj(state->ctx, state->out, pdf_dict_get_key(ctx, csi->obj, i), 1);
+ pdf_output_obj(state->ctx, state->out, pdf_dict_get_val(ctx, csi->obj, i), 1);
}
- fz_printf(state->out, "ID\n");
+ fz_printf(state->ctx, state->out, "ID\n");
buffer = csi->img->buffer->buffer;
len = buffer->len;
data = buffer->data;
for (i = 0; i < len; i++)
{
- fz_printf(state->out, "%c", data[i]);
+ fz_printf(state->ctx, state->out, "%c", data[i]);
}
- fz_printf(state->out, "\nEI\n");
+ fz_printf(state->ctx, state->out, "\nEI\n");
}
static void
@@ -234,7 +234,7 @@ pdf_buffer_BMC(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "/%s BMC\n", csi->name);
+ fz_printf(state->ctx, state->out, "/%s BMC\n", csi->name);
}
static void
@@ -242,7 +242,7 @@ pdf_buffer_BT(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "BT\n");
+ fz_printf(state->ctx, state->out, "BT\n");
}
static void
@@ -250,7 +250,7 @@ pdf_buffer_BX(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "BX\n");
+ fz_printf(state->ctx, state->out, "BX\n");
}
static void
@@ -258,7 +258,7 @@ pdf_buffer_CS(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "/%s CS\n", csi->name);
+ fz_printf(state->ctx, state->out, "/%s CS\n", csi->name);
}
static void
@@ -266,9 +266,9 @@ pdf_buffer_DP(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "/%s ", csi->name);
- pdf_output_obj(state->out, csi->obj, 1);
- fz_printf(state->out, " DP\n");
+ fz_printf(state->ctx, state->out, "/%s ", csi->name);
+ pdf_output_obj(state->ctx, state->out, csi->obj, 1);
+ fz_printf(state->ctx, state->out, " DP\n");
}
static void
@@ -276,7 +276,7 @@ pdf_buffer_EMC(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "EMC\n");
+ fz_printf(state->ctx, state->out, "EMC\n");
}
static void
@@ -284,7 +284,7 @@ pdf_buffer_ET(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "ET\n");
+ fz_printf(state->ctx, state->out, "ET\n");
}
static void
@@ -292,7 +292,7 @@ pdf_buffer_EX(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "EX\n");
+ fz_printf(state->ctx, state->out, "EX\n");
}
static void
@@ -300,7 +300,7 @@ pdf_buffer_F(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "F\n");
+ fz_printf(state->ctx, state->out, "F\n");
}
static void
@@ -308,7 +308,7 @@ pdf_buffer_G(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "%f G\n", csi->stack[0]);
+ fz_printf(state->ctx, state->out, "%f G\n", csi->stack[0]);
}
static void
@@ -316,7 +316,7 @@ pdf_buffer_J(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "%d J\n", (int)csi->stack[0]);
+ fz_printf(state->ctx, state->out, "%d J\n", (int)csi->stack[0]);
}
static void
@@ -324,7 +324,7 @@ pdf_buffer_K(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "%f %f %f %f K\n", csi->stack[0],
+ fz_printf(state->ctx, state->out, "%f %f %f %f K\n", csi->stack[0],
csi->stack[1], csi->stack[2], csi->stack[3]);
}
@@ -333,7 +333,7 @@ pdf_buffer_M(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "%f M\n", csi->stack[0]);
+ fz_printf(state->ctx, state->out, "%f M\n", csi->stack[0]);
}
static void
@@ -341,7 +341,7 @@ pdf_buffer_MP(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "/%s MP\n", csi->name);
+ fz_printf(state->ctx, state->out, "/%s MP\n", csi->name);
}
static void
@@ -349,7 +349,7 @@ pdf_buffer_Q(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "Q\n");
+ fz_printf(state->ctx, state->out, "Q\n");
}
static void
@@ -357,7 +357,7 @@ pdf_buffer_RG(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "%f %f %f RG\n", csi->stack[0], csi->stack[1], csi->stack[2]);
+ fz_printf(state->ctx, state->out, "%f %f %f RG\n", csi->stack[0], csi->stack[1], csi->stack[2]);
}
static void
@@ -365,7 +365,7 @@ pdf_buffer_S(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "S\n");
+ fz_printf(state->ctx, state->out, "S\n");
}
static void
@@ -375,8 +375,8 @@ pdf_buffer_SC(pdf_csi *csi, void *state_)
int i;
for (i = 0; i < csi->top; i++)
- fz_printf(state->out, "%f ", csi->stack[i]);
- fz_printf(state->out, "SC\n");
+ fz_printf(state->ctx, state->out, "%f ", csi->stack[i]);
+ fz_printf(state->ctx, state->out, "SC\n");
}
static void
@@ -386,10 +386,10 @@ pdf_buffer_SCN(pdf_csi *csi, void *state_)
int i;
for (i = 0; i < csi->top; i++)
- fz_printf(state->out, "%f ", csi->stack[i]);
+ fz_printf(state->ctx, state->out, "%f ", csi->stack[i]);
if (csi->name[0])
- fz_printf(state->out, "/%s ", csi->name);
- fz_printf(state->out, "SCN\n");
+ fz_printf(state->ctx, state->out, "/%s ", csi->name);
+ fz_printf(state->ctx, state->out, "SCN\n");
}
static void
@@ -397,7 +397,7 @@ pdf_buffer_Tstar(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "T*\n");
+ fz_printf(state->ctx, state->out, "T*\n");
}
static void
@@ -405,7 +405,7 @@ pdf_buffer_TD(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "%f %f TD\n", csi->stack[0], csi->stack[1]);
+ fz_printf(state->ctx, state->out, "%f %f TD\n", csi->stack[0], csi->stack[1]);
}
static void
@@ -413,8 +413,8 @@ pdf_buffer_TJ(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- pdf_output_obj(state->out, csi->obj, 1);
- fz_printf(state->out, " TJ\n");
+ pdf_output_obj(state->ctx, state->out, csi->obj, 1);
+ fz_printf(state->ctx, state->out, " TJ\n");
}
static void
@@ -422,7 +422,7 @@ pdf_buffer_TL(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "%f TL\n", csi->stack[0]);
+ fz_printf(state->ctx, state->out, "%f TL\n", csi->stack[0]);
}
static void
@@ -430,7 +430,7 @@ pdf_buffer_Tc(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "%f Tc\n", csi->stack[0]);
+ fz_printf(state->ctx, state->out, "%f Tc\n", csi->stack[0]);
}
static void
@@ -438,7 +438,7 @@ pdf_buffer_Td(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "%f %f Td\n", csi->stack[0], csi->stack[1]);
+ fz_printf(state->ctx, state->out, "%f %f Td\n", csi->stack[0], csi->stack[1]);
}
static void
@@ -446,8 +446,8 @@ pdf_buffer_Tj(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- put_string_or_obj(csi, state->out);
- fz_printf(state->out, " Tj\n");
+ put_string_or_obj(state->ctx, state->out, csi);
+ fz_printf(state->ctx, state->out, " Tj\n");
}
static void
@@ -455,7 +455,7 @@ pdf_buffer_Tm(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "%f %f %f %f %f %f Tm\n",
+ fz_printf(state->ctx, state->out, "%f %f %f %f %f %f Tm\n",
csi->stack[0], csi->stack[1], csi->stack[2],
csi->stack[3], csi->stack[4], csi->stack[5]);
}
@@ -465,7 +465,7 @@ pdf_buffer_Tr(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "%f Tr\n", csi->stack[0]);
+ fz_printf(state->ctx, state->out, "%f Tr\n", csi->stack[0]);
}
static void
@@ -473,7 +473,7 @@ pdf_buffer_Ts(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "%f Ts\n", csi->stack[0]);
+ fz_printf(state->ctx, state->out, "%f Ts\n", csi->stack[0]);
}
static void
@@ -481,7 +481,7 @@ pdf_buffer_Tw(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "%f Tw\n", csi->stack[0]);
+ fz_printf(state->ctx, state->out, "%f Tw\n", csi->stack[0]);
}
static void
@@ -489,7 +489,7 @@ pdf_buffer_Tz(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "%f Tz\n", csi->stack[0]);
+ fz_printf(state->ctx, state->out, "%f Tz\n", csi->stack[0]);
}
static void
@@ -497,7 +497,7 @@ pdf_buffer_W(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "W\n");
+ fz_printf(state->ctx, state->out, "W\n");
}
static void
@@ -505,7 +505,7 @@ pdf_buffer_Wstar(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "W*\n");
+ fz_printf(state->ctx, state->out, "W*\n");
}
static void
@@ -513,7 +513,7 @@ pdf_buffer_b(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "b\n");
+ fz_printf(state->ctx, state->out, "b\n");
}
static void
@@ -521,7 +521,7 @@ pdf_buffer_bstar(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "b*\n");
+ fz_printf(state->ctx, state->out, "b*\n");
}
static void
@@ -529,7 +529,7 @@ pdf_buffer_c(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "%f %f %f %f %f %f c\n",
+ fz_printf(state->ctx, state->out, "%f %f %f %f %f %f c\n",
csi->stack[0], csi->stack[1], csi->stack[2],
csi->stack[3], csi->stack[4], csi->stack[5]);
}
@@ -539,7 +539,7 @@ pdf_buffer_cm(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "%f %f %f %f %f %f cm\n",
+ fz_printf(state->ctx, state->out, "%f %f %f %f %f %f cm\n",
csi->stack[0], csi->stack[1], csi->stack[2],
csi->stack[3], csi->stack[4], csi->stack[5]);
}
@@ -549,7 +549,7 @@ pdf_buffer_cs(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "/%s cs\n", csi->name);
+ fz_printf(state->ctx, state->out, "/%s cs\n", csi->name);
}
static void
@@ -557,8 +557,8 @@ pdf_buffer_d(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- pdf_output_obj(state->out, csi->obj, 1);
- fz_printf(state->out, " %f d\n", csi->stack[0]);
+ pdf_output_obj(state->ctx, state->out, csi->obj, 1);
+ fz_printf(state->ctx, state->out, " %f d\n", csi->stack[0]);
}
static void
@@ -566,7 +566,7 @@ pdf_buffer_d0(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "%f %f d0\n", csi->stack[0], csi->stack[1]);
+ fz_printf(state->ctx, state->out, "%f %f d0\n", csi->stack[0], csi->stack[1]);
}
static void
@@ -574,7 +574,7 @@ pdf_buffer_d1(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "%f %f %f %f %f %f d1\n",
+ fz_printf(state->ctx, state->out, "%f %f %f %f %f %f d1\n",
csi->stack[0], csi->stack[1], csi->stack[2],
csi->stack[3], csi->stack[4], csi->stack[5]);
}
@@ -584,7 +584,7 @@ pdf_buffer_f(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "f\n");
+ fz_printf(state->ctx, state->out, "f\n");
}
static void
@@ -592,7 +592,7 @@ pdf_buffer_fstar(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "f*\n");
+ fz_printf(state->ctx, state->out, "f*\n");
}
static void
@@ -600,7 +600,7 @@ pdf_buffer_g(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "%f g\n", csi->stack[0]);
+ fz_printf(state->ctx, state->out, "%f g\n", csi->stack[0]);
}
static void
@@ -608,7 +608,7 @@ pdf_buffer_h(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "h\n");
+ fz_printf(state->ctx, state->out, "h\n");
}
static void
@@ -616,7 +616,7 @@ pdf_buffer_i(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "%f i\n", csi->stack[0]);
+ fz_printf(state->ctx, state->out, "%f i\n", csi->stack[0]);
}
static void
@@ -624,7 +624,7 @@ pdf_buffer_j(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "%d j\n", (int)csi->stack[0]);
+ fz_printf(state->ctx, state->out, "%d j\n", (int)csi->stack[0]);
}
static void
@@ -632,7 +632,7 @@ pdf_buffer_k(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "%f %f %f %f k\n", csi->stack[0],
+ fz_printf(state->ctx, state->out, "%f %f %f %f k\n", csi->stack[0],
csi->stack[1], csi->stack[2], csi->stack[3]);
}
@@ -641,7 +641,7 @@ pdf_buffer_l(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "%f %f l\n", csi->stack[0], csi->stack[1]);
+ fz_printf(state->ctx, state->out, "%f %f l\n", csi->stack[0], csi->stack[1]);
}
static void
@@ -649,7 +649,7 @@ pdf_buffer_m(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "%f %f m\n", csi->stack[0], csi->stack[1]);
+ fz_printf(state->ctx, state->out, "%f %f m\n", csi->stack[0], csi->stack[1]);
}
static void
@@ -657,7 +657,7 @@ pdf_buffer_n(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "n\n");
+ fz_printf(state->ctx, state->out, "n\n");
}
static void
@@ -665,7 +665,7 @@ pdf_buffer_q(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "q\n");
+ fz_printf(state->ctx, state->out, "q\n");
}
static void
@@ -673,7 +673,7 @@ pdf_buffer_re(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "%f %f %f %f re\n", csi->stack[0],
+ fz_printf(state->ctx, state->out, "%f %f %f %f re\n", csi->stack[0],
csi->stack[1], csi->stack[2], csi->stack[3]);
}
@@ -682,7 +682,7 @@ pdf_buffer_rg(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "%f %f %f rg\n",
+ fz_printf(state->ctx, state->out, "%f %f %f rg\n",
csi->stack[0], csi->stack[1], csi->stack[2]);
}
@@ -691,7 +691,7 @@ pdf_buffer_ri(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "/%s ri\n", csi->name);
+ fz_printf(state->ctx, state->out, "/%s ri\n", csi->name);
}
static void
@@ -699,7 +699,7 @@ pdf_buffer_s(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "s\n");
+ fz_printf(state->ctx, state->out, "s\n");
}
static void
@@ -709,8 +709,8 @@ pdf_buffer_sc(pdf_csi *csi, void *state_)
int i;
for (i = 0; i < csi->top; i++)
- fz_printf(state->out, "%f ", csi->stack[i]);
- fz_printf(state->out, "sc\n");
+ fz_printf(state->ctx, state->out, "%f ", csi->stack[i]);
+ fz_printf(state->ctx, state->out, "sc\n");
}
static void
@@ -720,10 +720,10 @@ pdf_buffer_scn(pdf_csi *csi, void *state_)
int i;
for (i = 0; i < csi->top; i++)
- fz_printf(state->out, "%f ", csi->stack[i]);
+ fz_printf(state->ctx, state->out, "%f ", csi->stack[i]);
if (csi->name[0])
- fz_printf(state->out, "/%s ", csi->name);
- fz_printf(state->out, "scn\n");
+ fz_printf(state->ctx, state->out, "/%s ", csi->name);
+ fz_printf(state->ctx, state->out, "scn\n");
}
static void
@@ -731,7 +731,7 @@ pdf_buffer_v(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "%f %f %f %f v\n", csi->stack[0],
+ fz_printf(state->ctx, state->out, "%f %f %f %f v\n", csi->stack[0],
csi->stack[1], csi->stack[2], csi->stack[3]);
}
@@ -740,7 +740,7 @@ pdf_buffer_w(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "%f w\n", csi->stack[0]);
+ fz_printf(state->ctx, state->out, "%f w\n", csi->stack[0]);
}
static void
@@ -748,7 +748,7 @@ pdf_buffer_y(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "%f %f %f %f y\n", csi->stack[0],
+ fz_printf(state->ctx, state->out, "%f %f %f %f y\n", csi->stack[0],
csi->stack[1], csi->stack[2], csi->stack[3]);
}
@@ -757,7 +757,7 @@ pdf_buffer_Do(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "/%s Do\n", csi->name);
+ fz_printf(state->ctx, state->out, "/%s Do\n", csi->name);
}
static void
@@ -765,7 +765,7 @@ pdf_buffer_Tf(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "/%s %f Tf\n", csi->name, csi->stack[0]);
+ fz_printf(state->ctx, state->out, "/%s %f Tf\n", csi->name, csi->stack[0]);
}
static void
@@ -773,7 +773,7 @@ pdf_buffer_gs(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "/%s gs\n", csi->name);
+ fz_printf(state->ctx, state->out, "/%s gs\n", csi->name);
}
static void
@@ -781,27 +781,26 @@ pdf_buffer_sh(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "/%s sh\n", csi->name);
+ fz_printf(state->ctx, state->out, "/%s sh\n", csi->name);
}
static void
free_processor_buffer(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_context *ctx = state->ctx;
- fz_drop_output(state->out);
- fz_free(ctx, state);
+ fz_drop_output(state->ctx, state->out);
+ fz_free(state->ctx, state);
}
static void
process_annot(pdf_csi *csi, void *state, pdf_obj *resources, pdf_annot *annot)
{
- fz_context *ctx = csi->doc->ctx;
+ fz_context *ctx = csi->ctx;
pdf_xobject *xobj = annot->ap;
/* Avoid infinite recursion */
- if (xobj == NULL || pdf_mark_obj(xobj->me))
+ if (xobj == NULL || pdf_mark_obj(ctx, xobj->me))
return;
fz_try(ctx)
@@ -813,7 +812,7 @@ process_annot(pdf_csi *csi, void *state, pdf_obj *resources, pdf_annot *annot)
}
fz_always(ctx)
{
- pdf_unmark_obj(xobj->me);
+ pdf_unmark_obj(ctx, xobj->me);
}
fz_catch(ctx)
{
@@ -914,7 +913,7 @@ static const pdf_processor pdf_processor_buffer =
process_contents
};
-pdf_process *pdf_process_buffer(pdf_process *process, fz_context *ctx, fz_buffer *buffer)
+pdf_process *pdf_init_process_buffer(fz_context *ctx, pdf_process *process, fz_buffer *buffer)
{
fz_output *out = fz_new_output_with_buffer(ctx, buffer);
pdf_buffer_state *p = NULL;
@@ -930,7 +929,7 @@ pdf_process *pdf_process_buffer(pdf_process *process, fz_context *ctx, fz_buffer
}
fz_catch(ctx)
{
- fz_drop_output(out);
+ fz_drop_output(ctx, out);
fz_rethrow(ctx);
}
diff --git a/source/pdf/pdf-op-filter.c b/source/pdf/pdf-op-filter.c
index 17bd3af0..ec08b305 100644
--- a/source/pdf/pdf-op-filter.c
+++ b/source/pdf/pdf-op-filter.c
@@ -47,21 +47,22 @@ typedef struct pdf_filter_state_s
static void insert_resource_name(pdf_csi *csi, pdf_filter_state *state, const char *key, const char *name)
{
+ fz_context *ctx = csi->ctx;
pdf_obj *xobj;
pdf_obj *obj;
if (!state->resources || !name || name[0] == 0)
return;
- xobj = pdf_dict_gets(csi->rdb, key);
- obj = pdf_dict_gets(xobj, name);
+ xobj = pdf_dict_gets(ctx, csi->rdb, key);
+ obj = pdf_dict_gets(ctx, xobj, name);
- xobj = pdf_dict_gets(state->resources, key);
+ xobj = pdf_dict_gets(ctx, state->resources, key);
if (xobj == NULL) {
- xobj = pdf_new_dict(csi->doc, 1);
- pdf_dict_puts_drop(state->resources, key, xobj);
+ xobj = pdf_new_dict(csi->ctx, csi->doc, 1);
+ pdf_dict_puts_drop(ctx, state->resources, key, xobj);
}
- pdf_dict_putp(xobj, name, obj);
+ pdf_dict_putp(ctx, xobj, name, obj);
}
static void insert_resource(pdf_csi *csi, pdf_filter_state *state, const char *key)
@@ -408,7 +409,7 @@ pdf_filter_BDC(pdf_csi *csi, void *state_)
{
pdf_filter_state *state = (pdf_filter_state *)state_;
- insert_resource_name(csi, state, "Properties", pdf_to_name(csi->obj));
+ insert_resource_name(csi, state, "Properties", pdf_to_name(csi->ctx, csi->obj));
filter_flush(csi, state, 0);
call_op(csi, state, PDF_OP_BDC);
@@ -467,7 +468,7 @@ pdf_filter_DP(pdf_csi *csi, void *state_)
{
pdf_filter_state *state = (pdf_filter_state *)state_;
- insert_resource_name(csi, state, "Properties", pdf_to_name(csi->obj));
+ insert_resource_name(csi, state, "Properties", pdf_to_name(csi->ctx, csi->obj));
filter_flush(csi, state, 0);
call_op(csi, state, PDF_OP_DP);
@@ -1085,11 +1086,11 @@ free_processor_filter(pdf_csi *csi, void *state_)
static void
process_annot(pdf_csi *csi, void *state, pdf_obj *resources, pdf_annot *annot)
{
- fz_context *ctx = csi->doc->ctx;
+ fz_context *ctx = csi->ctx;
pdf_xobject *xobj = annot->ap;
/* Avoid infinite recursion */
- if (xobj == NULL || pdf_mark_obj(xobj->me))
+ if (xobj == NULL || pdf_mark_obj(ctx, xobj->me))
return;
fz_try(ctx)
@@ -1101,7 +1102,7 @@ process_annot(pdf_csi *csi, void *state, pdf_obj *resources, pdf_annot *annot)
}
fz_always(ctx)
{
- pdf_unmark_obj(xobj->me);
+ pdf_unmark_obj(ctx, xobj->me);
}
fz_catch(ctx)
{
@@ -1203,7 +1204,7 @@ static const pdf_processor pdf_processor_filter =
};
pdf_process *
-pdf_process_filter(pdf_process *process, fz_context *ctx, pdf_process *underlying, pdf_obj *resources)
+pdf_init_process_filter(fz_context *ctx, pdf_process *process, pdf_process *underlying, pdf_obj *resources)
{
pdf_filter_state *p = NULL;
diff --git a/source/pdf/pdf-op-run.c b/source/pdf/pdf-op-run.c
index 52000b40..139f7e50 100644
--- a/source/pdf/pdf-op-run.c
+++ b/source/pdf/pdf-op-run.c
@@ -107,7 +107,7 @@ static void
run_xobject(pdf_csi *csi, void *state, pdf_obj *resources, pdf_xobject *xobj, const fz_matrix *transform);
static int
-ocg_intents_include(pdf_ocg_descriptor *desc, char *name)
+ocg_intents_include(fz_context *ctx, pdf_ocg_descriptor *desc, char *name)
{
int i, len;
@@ -118,20 +118,20 @@ ocg_intents_include(pdf_ocg_descriptor *desc, char *name)
if (!desc->intent)
return (strcmp(name, "View") == 0);
- if (pdf_is_name(desc->intent))
+ if (pdf_is_name(ctx, desc->intent))
{
- char *intent = pdf_to_name(desc->intent);
+ char *intent = pdf_to_name(ctx, desc->intent);
if (strcmp(intent, "All") == 0)
return 1;
return (strcmp(intent, name) == 0);
}
- if (!pdf_is_array(desc->intent))
+ if (!pdf_is_array(ctx, desc->intent))
return 0;
- len = pdf_array_len(desc->intent);
+ len = pdf_array_len(ctx, desc->intent);
for (i=0; i < len; i++)
{
- char *intent = pdf_to_name(pdf_array_get(desc->intent, i));
+ char *intent = pdf_to_name(ctx, pdf_array_get(ctx, desc->intent, i));
if (strcmp(intent, "All") == 0)
return 1;
if (strcmp(intent, name) == 0)
@@ -147,10 +147,10 @@ pdf_is_hidden_ocg(pdf_obj *ocg, pdf_csi *csi, pdf_run_state *pr, pdf_obj *rdb)
pdf_obj *obj, *obj2;
char *type;
pdf_ocg_descriptor *desc = csi->doc->ocg;
- fz_context *ctx = csi->doc->ctx;
+ fz_context *ctx = csi->ctx;
/* Avoid infinite recursions */
- if (pdf_obj_marked(ocg))
+ if (pdf_obj_marked(ctx, ocg))
return 0;
/* If no ocg descriptor, everything is visible */
@@ -158,9 +158,9 @@ pdf_is_hidden_ocg(pdf_obj *ocg, pdf_csi *csi, pdf_run_state *pr, pdf_obj *rdb)
return 0;
/* If we've been handed a name, look it up in the properties. */
- if (pdf_is_name(ocg))
+ if (pdf_is_name(ctx, ocg))
{
- ocg = pdf_dict_gets(pdf_dict_gets(rdb, "Properties"), pdf_to_name(ocg));
+ ocg = pdf_dict_gets(ctx, pdf_dict_gets(ctx, rdb, "Properties"), pdf_to_name(ctx, ocg));
}
/* If we haven't been given an ocg at all, then we're visible */
if (!ocg)
@@ -169,14 +169,14 @@ pdf_is_hidden_ocg(pdf_obj *ocg, pdf_csi *csi, pdf_run_state *pr, pdf_obj *rdb)
fz_strlcpy(event_state, pr->event, sizeof event_state);
fz_strlcat(event_state, "State", sizeof event_state);
- type = pdf_to_name(pdf_dict_gets(ocg, "Type"));
+ type = pdf_to_name(ctx, pdf_dict_gets(ctx, ocg, "Type"));
if (strcmp(type, "OCG") == 0)
{
/* An Optional Content Group */
int default_value = 0;
- int num = pdf_to_num(ocg);
- int gen = pdf_to_gen(ocg);
+ int num = pdf_to_num(ctx, ocg);
+ int gen = pdf_to_gen(ctx, ocg);
int len = desc->len;
int i;
@@ -192,19 +192,19 @@ pdf_is_hidden_ocg(pdf_obj *ocg, pdf_csi *csi, pdf_run_state *pr, pdf_obj *rdb)
/* Check Intents; if our intent is not part of the set given
* by the current config, we should ignore it. */
- obj = pdf_dict_gets(ocg, "Intent");
- if (pdf_is_name(obj))
+ obj = pdf_dict_gets(ctx, ocg, "Intent");
+ if (pdf_is_name(ctx, obj))
{
/* If it doesn't match, it's hidden */
- if (ocg_intents_include(desc, pdf_to_name(obj)) == 0)
+ if (ocg_intents_include(ctx, desc, pdf_to_name(ctx, obj)) == 0)
return 1;
}
- else if (pdf_is_array(obj))
+ else if (pdf_is_array(ctx, obj))
{
int match = 0;
- len = pdf_array_len(obj);
+ len = pdf_array_len(ctx, obj);
for (i=0; i<len; i++) {
- match |= ocg_intents_include(desc, pdf_to_name(pdf_array_get(obj, i)));
+ match |= ocg_intents_include(ctx, desc, pdf_to_name(ctx, pdf_array_get(ctx, obj, i)));
if (match)
break;
}
@@ -215,7 +215,7 @@ pdf_is_hidden_ocg(pdf_obj *ocg, pdf_csi *csi, pdf_run_state *pr, pdf_obj *rdb)
else
{
/* If it doesn't match, it's hidden */
- if (ocg_intents_include(desc, "View") == 0)
+ if (ocg_intents_include(ctx, desc, "View") == 0)
return 1;
}
@@ -228,19 +228,19 @@ pdf_is_hidden_ocg(pdf_obj *ocg, pdf_csi *csi, pdf_run_state *pr, pdf_obj *rdb)
* correspond to entries in the AS list in the OCG config.
* Given that we don't handle Zoom or User, or Language
* dicts, this is not really a problem. */
- obj = pdf_dict_gets(ocg, "Usage");
- if (!pdf_is_dict(obj))
+ obj = pdf_dict_gets(ctx, ocg, "Usage");
+ if (!pdf_is_dict(ctx, obj))
return default_value;
/* FIXME: Should look at Zoom (and return hidden if out of
* max/min range) */
/* FIXME: Could provide hooks to the caller to check if
* User is appropriate - if not return hidden. */
- obj2 = pdf_dict_gets(obj, pr->event);
- if (strcmp(pdf_to_name(pdf_dict_gets(obj2, event_state)), "OFF") == 0)
+ obj2 = pdf_dict_gets(ctx, obj, pr->event);
+ if (strcmp(pdf_to_name(ctx, pdf_dict_gets(ctx, obj2, event_state)), "OFF") == 0)
{
return 1;
}
- if (strcmp(pdf_to_name(pdf_dict_gets(obj2, event_state)), "ON") == 0)
+ if (strcmp(pdf_to_name(ctx, pdf_dict_gets(ctx, obj2, event_state)), "ON") == 0)
{
return 0;
}
@@ -252,12 +252,12 @@ pdf_is_hidden_ocg(pdf_obj *ocg, pdf_csi *csi, pdf_run_state *pr, pdf_obj *rdb)
char *name;
int combine, on;
- obj = pdf_dict_gets(ocg, "VE");
- if (pdf_is_array(obj)) {
+ obj = pdf_dict_gets(ctx, ocg, "VE");
+ if (pdf_is_array(ctx, obj)) {
/* FIXME: Calculate visibility from array */
return 0;
}
- name = pdf_to_name(pdf_dict_gets(ocg, "P"));
+ name = pdf_to_name(ctx, pdf_dict_gets(ctx, ocg, "P"));
/* Set combine; Bit 0 set => AND, Bit 1 set => true means
* Off, otherwise true means On */
if (strcmp(name, "AllOn") == 0)
@@ -277,19 +277,19 @@ pdf_is_hidden_ocg(pdf_obj *ocg, pdf_csi *csi, pdf_run_state *pr, pdf_obj *rdb)
combine = 0;
}
- if (pdf_mark_obj(ocg))
+ if (pdf_mark_obj(ctx, ocg))
return 0; /* Should never happen */
fz_try(ctx)
{
- obj = pdf_dict_gets(ocg, "OCGs");
+ obj = pdf_dict_gets(ctx, ocg, "OCGs");
on = combine & 1;
- if (pdf_is_array(obj)) {
+ if (pdf_is_array(ctx, obj)) {
int i, len;
- len = pdf_array_len(obj);
+ len = pdf_array_len(ctx, obj);
for (i = 0; i < len; i++)
{
int hidden;
- hidden = pdf_is_hidden_ocg(pdf_array_get(obj, i), csi, pr, rdb);
+ hidden = pdf_is_hidden_ocg(pdf_array_get(ctx, obj, i), csi, pr, rdb);
if ((combine & 1) == 0)
hidden = !hidden;
if (combine & 2)
@@ -307,7 +307,7 @@ pdf_is_hidden_ocg(pdf_obj *ocg, pdf_csi *csi, pdf_run_state *pr, pdf_obj *rdb)
}
fz_always(ctx)
{
- pdf_unmark_obj(ocg);
+ pdf_unmark_obj(ctx, ocg);
}
fz_catch(ctx)
{
@@ -349,7 +349,7 @@ begin_softmask(pdf_csi *csi, pdf_run_state *pr, softmask_save *save)
gstate->softmask = NULL;
gstate->ctm = gstate->softmask_ctm;
- fz_begin_mask(pr->dev, &mask_bbox, gstate->luminosity,
+ fz_begin_mask(ctx, pr->dev, &mask_bbox, gstate->luminosity,
softmask->colorspace, gstate->softmask_bc);
fz_try(ctx)
{
@@ -364,7 +364,7 @@ begin_softmask(pdf_csi *csi, pdf_run_state *pr, softmask_save *save)
csi->cookie->errors++;
}
- fz_end_mask(pr->dev);
+ fz_end_mask(ctx, pr->dev);
pr->tm = save_tm;
pr->tlm = save_tlm;
@@ -378,6 +378,7 @@ begin_softmask(pdf_csi *csi, pdf_run_state *pr, softmask_save *save)
static void
end_softmask(pdf_csi *csi, pdf_run_state *pr, softmask_save *save)
{
+ fz_context *ctx = pr->ctx;
pdf_gstate *gstate = pr->gstate + pr->gtop;
if (save->softmask == NULL)
@@ -385,7 +386,7 @@ end_softmask(pdf_csi *csi, pdf_run_state *pr, softmask_save *save)
gstate->softmask = save->softmask;
gstate->softmask_ctm = save->ctm;
- fz_pop_clip(pr->dev);
+ fz_pop_clip(ctx, pr->dev);
}
static pdf_gstate *
@@ -394,7 +395,7 @@ pdf_begin_group(pdf_csi *csi, pdf_run_state *pr, const fz_rect *bbox, softmask_s
pdf_gstate *gstate = begin_softmask(csi, pr, softmask);
if (gstate->blendmode)
- fz_begin_group(pr->dev, bbox, 1, 0, gstate->blendmode, 1);
+ fz_begin_group(pr->ctx, pr->dev, bbox, 1, 0, gstate->blendmode, 1);
return pr->gstate + pr->gtop;
}
@@ -405,7 +406,7 @@ pdf_end_group(pdf_csi *csi, pdf_run_state *pr, softmask_save *softmask)
pdf_gstate *gstate = pr->gstate + pr->gtop;
if (gstate->blendmode)
- fz_end_group(pr->dev);
+ fz_end_group(pr->ctx, pr->dev);
end_softmask(csi, pr, softmask);
}
@@ -427,7 +428,7 @@ pdf_show_shade(pdf_csi *csi, pdf_run_state *pr, fz_shade *shd)
/* FIXME: The gstate->ctm in the next line may be wrong; maybe
* it should be the parent gstates ctm? */
- fz_fill_shade(pr->dev, shd, &gstate->ctm, gstate->fill.alpha);
+ fz_fill_shade(ctx, pr->dev, shd, &gstate->ctm, gstate->fill.alpha);
pdf_end_group(csi, pr, &softmask);
}
@@ -549,7 +550,7 @@ pdf_grestore(pdf_run_state *pr)
{
fz_try(ctx)
{
- fz_pop_clip(pr->dev);
+ fz_pop_clip(ctx, pr->dev);
}
fz_catch(ctx)
{
@@ -649,14 +650,14 @@ pdf_show_pattern(pdf_csi *csi, pdf_run_state *pr, pdf_pattern *pat, pdf_gstate *
if (0)
#endif
{
- fz_begin_tile(pr->dev, &local_area, &pat->bbox, pat->xstep, pat->ystep, &ptm);
+ fz_begin_tile(ctx, pr->dev, &local_area, &pat->bbox, pat->xstep, pat->ystep, &ptm);
gstate->ctm = ptm;
pdf_gsave(pr);
pdf_process_contents_object(csi, pat->resources, pat->contents);
pdf_grestore(pr);
while (oldtop < pr->gtop)
pdf_grestore(pr);
- fz_end_tile(pr->dev);
+ fz_end_tile(ctx, pr->dev);
}
else
{
@@ -720,6 +721,7 @@ pdf_show_pattern(pdf_csi *csi, pdf_run_state *pr, pdf_pattern *pat, pdf_gstate *
static void
pdf_show_image(pdf_csi *csi, pdf_run_state *pr, fz_image *image)
{
+ fz_context *ctx = pr->ctx;
pdf_gstate *gstate = pr->gstate + pr->gtop;
fz_matrix image_ctm;
fz_rect bbox;
@@ -739,8 +741,8 @@ pdf_show_image(pdf_csi *csi, pdf_run_state *pr, fz_image *image)
{
/* apply blend group even though we skip the soft mask */
if (gstate->blendmode)
- fz_begin_group(pr->dev, &bbox, 0, 0, gstate->blendmode, 1);
- fz_clip_image_mask(pr->dev, image->mask, &bbox, &image_ctm);
+ fz_begin_group(ctx, pr->dev, &bbox, 0, 0, gstate->blendmode, 1);
+ fz_clip_image_mask(ctx, pr->dev, image->mask, &bbox, &image_ctm);
}
else
gstate = pdf_begin_group(csi, pr, &bbox, &softmask);
@@ -753,37 +755,37 @@ pdf_show_image(pdf_csi *csi, pdf_run_state *pr, fz_image *image)
case PDF_MAT_NONE:
break;
case PDF_MAT_COLOR:
- fz_fill_image_mask(pr->dev, image, &image_ctm,
+ fz_fill_image_mask(ctx, pr->dev, image, &image_ctm,
gstate->fill.colorspace, gstate->fill.v, gstate->fill.alpha);
break;
case PDF_MAT_PATTERN:
if (gstate->fill.pattern)
{
- fz_clip_image_mask(pr->dev, image, &bbox, &image_ctm);
+ fz_clip_image_mask(ctx, pr->dev, image, &bbox, &image_ctm);
pdf_show_pattern(csi, pr, gstate->fill.pattern, &pr->gstate[gstate->fill.gstate_num], &bbox, PDF_FILL);
- fz_pop_clip(pr->dev);
+ fz_pop_clip(ctx, pr->dev);
}
break;
case PDF_MAT_SHADE:
if (gstate->fill.shade)
{
- fz_clip_image_mask(pr->dev, image, &bbox, &image_ctm);
- fz_fill_shade(pr->dev, gstate->fill.shade, &pr->gstate[gstate->fill.gstate_num].ctm, gstate->fill.alpha);
- fz_pop_clip(pr->dev);
+ fz_clip_image_mask(ctx, pr->dev, image, &bbox, &image_ctm);
+ fz_fill_shade(ctx, pr->dev, gstate->fill.shade, &pr->gstate[gstate->fill.gstate_num].ctm, gstate->fill.alpha);
+ fz_pop_clip(ctx, pr->dev);
}
break;
}
}
else
{
- fz_fill_image(pr->dev, image, &image_ctm, gstate->fill.alpha);
+ fz_fill_image(ctx, pr->dev, image, &image_ctm, gstate->fill.alpha);
}
if (image->mask)
{
- fz_pop_clip(pr->dev);
+ fz_pop_clip(ctx, pr->dev);
if (gstate->blendmode)
- fz_end_group(pr->dev);
+ fz_end_group(ctx, pr->dev);
}
else
pdf_end_group(csi, pr, &softmask);
@@ -825,7 +827,7 @@ pdf_show_path(pdf_csi *csi, pdf_run_state *pr, int doclose, int dofill, int dost
if (pr->clip)
{
gstate->clip_depth++;
- fz_clip_path(pr->dev, path, &bbox, pr->clip_even_odd, &gstate->ctm);
+ fz_clip_path(ctx, pr->dev, path, &bbox, pr->clip_even_odd, &gstate->ctm);
pr->clip = 0;
}
@@ -849,7 +851,7 @@ pdf_show_path(pdf_csi *csi, pdf_run_state *pr, int doclose, int dofill, int dost
else
{
knockout_group = 1;
- fz_begin_group(pr->dev, &bbox, 0, 1, FZ_BLEND_NORMAL, 1);
+ fz_begin_group(ctx, pr->dev, &bbox, 0, 1, FZ_BLEND_NORMAL, 1);
}
}
@@ -860,24 +862,24 @@ pdf_show_path(pdf_csi *csi, pdf_run_state *pr, int doclose, int dofill, int dost
case PDF_MAT_NONE:
break;
case PDF_MAT_COLOR:
- fz_fill_path(pr->dev, path, even_odd, &gstate->ctm,
+ fz_fill_path(ctx, pr->dev, path, even_odd, &gstate->ctm,
gstate->fill.colorspace, gstate->fill.v, gstate->fill.alpha);
break;
case PDF_MAT_PATTERN:
if (gstate->fill.pattern)
{
- fz_clip_path(pr->dev, path, &bbox, even_odd, &gstate->ctm);
+ fz_clip_path(ctx, pr->dev, path, &bbox, even_odd, &gstate->ctm);
pdf_show_pattern(csi, pr, gstate->fill.pattern, &pr->gstate[gstate->fill.gstate_num], &bbox, PDF_FILL);
- fz_pop_clip(pr->dev);
+ fz_pop_clip(ctx, pr->dev);
}
break;
case PDF_MAT_SHADE:
if (gstate->fill.shade)
{
- fz_clip_path(pr->dev, path, &bbox, even_odd, &gstate->ctm);
+ fz_clip_path(ctx, pr->dev, path, &bbox, even_odd, &gstate->ctm);
/* The cluster and page 2 of patterns.pdf shows that fz_fill_shade should NOT be called with gstate->ctm. */
- fz_fill_shade(pr->dev, gstate->fill.shade, &pr->gstate[gstate->fill.gstate_num].ctm, gstate->fill.alpha);
- fz_pop_clip(pr->dev);
+ fz_fill_shade(ctx, pr->dev, gstate->fill.shade, &pr->gstate[gstate->fill.gstate_num].ctm, gstate->fill.alpha);
+ fz_pop_clip(ctx, pr->dev);
}
break;
}
@@ -890,30 +892,30 @@ pdf_show_path(pdf_csi *csi, pdf_run_state *pr, int doclose, int dofill, int dost
case PDF_MAT_NONE:
break;
case PDF_MAT_COLOR:
- fz_stroke_path(pr->dev, path, gstate->stroke_state, &gstate->ctm,
+ fz_stroke_path(ctx, pr->dev, path, gstate->stroke_state, &gstate->ctm,
gstate->stroke.colorspace, gstate->stroke.v, gstate->stroke.alpha);
break;
case PDF_MAT_PATTERN:
if (gstate->stroke.pattern)
{
- fz_clip_stroke_path(pr->dev, path, &bbox, gstate->stroke_state, &gstate->ctm);
+ fz_clip_stroke_path(ctx, pr->dev, path, &bbox, gstate->stroke_state, &gstate->ctm);
pdf_show_pattern(csi, pr, gstate->stroke.pattern, &pr->gstate[gstate->stroke.gstate_num], &bbox, PDF_STROKE);
- fz_pop_clip(pr->dev);
+ fz_pop_clip(ctx, pr->dev);
}
break;
case PDF_MAT_SHADE:
if (gstate->stroke.shade)
{
- fz_clip_stroke_path(pr->dev, path, &bbox, gstate->stroke_state, &gstate->ctm);
- fz_fill_shade(pr->dev, gstate->stroke.shade, &pr->gstate[gstate->stroke.gstate_num].ctm, gstate->stroke.alpha);
- fz_pop_clip(pr->dev);
+ fz_clip_stroke_path(ctx, pr->dev, path, &bbox, gstate->stroke_state, &gstate->ctm);
+ fz_fill_shade(ctx, pr->dev, gstate->stroke.shade, &pr->gstate[gstate->stroke.gstate_num].ctm, gstate->stroke.alpha);
+ fz_pop_clip(ctx, pr->dev);
}
break;
}
}
if (knockout_group)
- fz_end_group(pr->dev);
+ fz_end_group(ctx, pr->dev);
if (dofill || dostroke)
pdf_end_group(csi, pr, &softmask);
@@ -978,7 +980,7 @@ pdf_flush_text(pdf_csi *csi, pdf_run_state *pr)
gstate = pdf_begin_group(csi, pr, &tb, &softmask);
if (doinvisible)
- fz_ignore_text(pr->dev, text, &gstate->ctm);
+ fz_ignore_text(ctx, pr->dev, text, &gstate->ctm);
if (dofill)
{
@@ -987,24 +989,24 @@ pdf_flush_text(pdf_csi *csi, pdf_run_state *pr)
case PDF_MAT_NONE:
break;
case PDF_MAT_COLOR:
- fz_fill_text(pr->dev, text, &gstate->ctm,
+ fz_fill_text(ctx, pr->dev, text, &gstate->ctm,
gstate->fill.colorspace, gstate->fill.v, gstate->fill.alpha);
break;
case PDF_MAT_PATTERN:
if (gstate->fill.pattern)
{
- fz_clip_text(pr->dev, text, &gstate->ctm, 0);
+ fz_clip_text(ctx, pr->dev, text, &gstate->ctm, 0);
pdf_show_pattern(csi, pr, gstate->fill.pattern, &pr->gstate[gstate->fill.gstate_num], &tb, PDF_FILL);
- fz_pop_clip(pr->dev);
+ fz_pop_clip(ctx, pr->dev);
}
break;
case PDF_MAT_SHADE:
if (gstate->fill.shade)
{
- fz_clip_text(pr->dev, text, &gstate->ctm, 0);
+ fz_clip_text(ctx, pr->dev, text, &gstate->ctm, 0);
/* Page 2 of patterns.pdf shows that fz_fill_shade should NOT be called with gstate->ctm */
- fz_fill_shade(pr->dev, gstate->fill.shade, &pr->gstate[gstate->fill.gstate_num].ctm, gstate->fill.alpha);
- fz_pop_clip(pr->dev);
+ fz_fill_shade(ctx, pr->dev, gstate->fill.shade, &pr->gstate[gstate->fill.gstate_num].ctm, gstate->fill.alpha);
+ fz_pop_clip(ctx, pr->dev);
}
break;
}
@@ -1017,23 +1019,23 @@ pdf_flush_text(pdf_csi *csi, pdf_run_state *pr)
case PDF_MAT_NONE:
break;
case PDF_MAT_COLOR:
- fz_stroke_text(pr->dev, text, gstate->stroke_state, &gstate->ctm,
+ fz_stroke_text(ctx, pr->dev, text, gstate->stroke_state, &gstate->ctm,
gstate->stroke.colorspace, gstate->stroke.v, gstate->stroke.alpha);
break;
case PDF_MAT_PATTERN:
if (gstate->stroke.pattern)
{
- fz_clip_stroke_text(pr->dev, text, gstate->stroke_state, &gstate->ctm);
+ fz_clip_stroke_text(ctx, pr->dev, text, gstate->stroke_state, &gstate->ctm);
pdf_show_pattern(csi, pr, gstate->stroke.pattern, &pr->gstate[gstate->stroke.gstate_num], &tb, PDF_STROKE);
- fz_pop_clip(pr->dev);
+ fz_pop_clip(ctx, pr->dev);
}
break;
case PDF_MAT_SHADE:
if (gstate->stroke.shade)
{
- fz_clip_stroke_text(pr->dev, text, gstate->stroke_state, &gstate->ctm);
- fz_fill_shade(pr->dev, gstate->stroke.shade, &pr->gstate[gstate->stroke.gstate_num].ctm, gstate->stroke.alpha);
- fz_pop_clip(pr->dev);
+ fz_clip_stroke_text(ctx, pr->dev, text, gstate->stroke_state, &gstate->ctm);
+ fz_fill_shade(ctx, pr->dev, gstate->stroke.shade, &pr->gstate[gstate->stroke.gstate_num].ctm, gstate->stroke.alpha);
+ fz_pop_clip(ctx, pr->dev);
}
break;
}
@@ -1043,7 +1045,7 @@ pdf_flush_text(pdf_csi *csi, pdf_run_state *pr)
{
if (pr->accumulate < 2)
gstate->clip_depth++;
- fz_clip_text(pr->dev, text, &gstate->ctm, pr->accumulate);
+ fz_clip_text(ctx, pr->dev, text, &gstate->ctm, pr->accumulate);
pr->accumulate = 2;
}
@@ -1231,24 +1233,25 @@ pdf_show_string(pdf_csi *csi, pdf_run_state *pr, unsigned char *buf, int len)
static void
pdf_show_text(pdf_csi *csi, pdf_run_state *pr, pdf_obj *text)
{
+ fz_context *ctx = csi->ctx;
pdf_gstate *gstate = pr->gstate + pr->gtop;
int i;
- if (pdf_is_array(text))
+ if (pdf_is_array(ctx, text))
{
- int n = pdf_array_len(text);
+ int n = pdf_array_len(ctx, text);
for (i = 0; i < n; i++)
{
- pdf_obj *item = pdf_array_get(text, i);
- if (pdf_is_string(item))
- pdf_show_string(csi, pr, (unsigned char *)pdf_to_str_buf(item), pdf_to_str_len(item));
+ pdf_obj *item = pdf_array_get(ctx, text, i);
+ if (pdf_is_string(ctx, item))
+ pdf_show_string(csi, pr, (unsigned char *)pdf_to_str_buf(ctx, item), pdf_to_str_len(ctx, item));
else
- pdf_show_space(pr, - pdf_to_real(item) * gstate->size * 0.001f);
+ pdf_show_space(pr, - pdf_to_real(ctx, item) * gstate->size * 0.001f);
}
}
- else if (pdf_is_string(text))
+ else if (pdf_is_string(ctx, text))
{
- pdf_show_string(csi, pr, (unsigned char *)pdf_to_str_buf(text), pdf_to_str_len(text));
+ pdf_show_string(csi, pr, (unsigned char *)pdf_to_str_buf(ctx, text), pdf_to_str_len(ctx, text));
}
}
@@ -1328,7 +1331,7 @@ pdf_set_colorspace(pdf_csi *csi, pdf_run_state *pr, int what, fz_colorspace *col
mat->v[2] = 0;
mat->v[3] = 1;
- if (pdf_is_tint_colorspace(colorspace))
+ if (pdf_is_tint_colorspace(ctx, colorspace))
{
int i;
for (i = 0; i < colorspace->n; i++)
@@ -1352,7 +1355,7 @@ pdf_set_color(pdf_csi *csi, pdf_run_state *pr, int what, float *v)
{
case PDF_MAT_PATTERN:
case PDF_MAT_COLOR:
- if (fz_colorspace_is_indexed(mat->colorspace))
+ if (fz_colorspace_is_indexed(ctx, mat->colorspace))
{
mat->v[0] = v[0] / 255;
break;
@@ -1411,13 +1414,13 @@ pdf_set_pattern(pdf_csi *csi, pdf_run_state *pr, int what, pdf_pattern *pat, flo
static pdf_font_desc *
load_font_or_hail_mary(pdf_csi *csi, pdf_obj *rdb, pdf_obj *font, int depth)
{
+ fz_context *ctx = csi->ctx;
pdf_document *doc = csi->doc;
- fz_context *ctx = doc->ctx;
pdf_font_desc *desc;
fz_try(ctx)
{
- desc = pdf_load_font(doc, rdb, font, depth);
+ desc = pdf_load_font(ctx, doc, rdb, font, depth);
}
fz_catch(ctx)
{
@@ -1429,7 +1432,7 @@ load_font_or_hail_mary(pdf_csi *csi, pdf_obj *rdb, pdf_obj *font, int depth)
csi->cookie->incomplete++;
}
if (desc == NULL)
- desc = pdf_load_hail_mary_font(doc);
+ desc = pdf_load_hail_mary_font(ctx, doc);
return desc;
}
@@ -1443,18 +1446,18 @@ pdf_run_extgstate(pdf_csi *csi, pdf_run_state *pr, pdf_obj *rdb, pdf_obj *extgst
gstate = pdf_flush_text(csi, pr);
- n = pdf_dict_len(extgstate);
+ n = pdf_dict_len(ctx, extgstate);
for (i = 0; i < n; i++)
{
- pdf_obj *key = pdf_dict_get_key(extgstate, i);
- pdf_obj *val = pdf_dict_get_val(extgstate, i);
- char *s = pdf_to_name(key);
+ pdf_obj *key = pdf_dict_get_key(ctx, extgstate, i);
+ pdf_obj *val = pdf_dict_get_val(ctx, extgstate, i);
+ char *s = pdf_to_name(ctx, key);
if (!strcmp(s, "Font"))
{
- if (pdf_is_array(val) && pdf_array_len(val) == 2)
+ if (pdf_is_array(ctx, val) && pdf_array_len(ctx, val) == 2)
{
- pdf_obj *font = pdf_array_get(val, 0);
+ pdf_obj *font = pdf_array_get(ctx, val, 0);
if (gstate->font)
{
@@ -1465,7 +1468,7 @@ pdf_run_extgstate(pdf_csi *csi, pdf_run_state *pr, pdf_obj *rdb, pdf_obj *extgst
gstate->font = load_font_or_hail_mary(csi, rdb, font, pr->nested_depth);
if (!gstate->font)
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find font in store");
- gstate->size = pdf_to_real(pdf_array_get(val, 1));
+ gstate->size = pdf_to_real(ctx, pdf_array_get(ctx, val, 1));
}
else
fz_throw(ctx, FZ_ERROR_GENERIC, "malformed /Font dictionary");
@@ -1475,61 +1478,61 @@ pdf_run_extgstate(pdf_csi *csi, pdf_run_state *pr, pdf_obj *rdb, pdf_obj *extgst
{
pr->dev->flags &= ~(FZ_DEVFLAG_STARTCAP_UNDEFINED | FZ_DEVFLAG_DASHCAP_UNDEFINED | FZ_DEVFLAG_ENDCAP_UNDEFINED);
gstate->stroke_state = fz_unshare_stroke_state(ctx, gstate->stroke_state);
- gstate->stroke_state->start_cap = pdf_to_int(val);
- gstate->stroke_state->dash_cap = pdf_to_int(val);
- gstate->stroke_state->end_cap = pdf_to_int(val);
+ gstate->stroke_state->start_cap = pdf_to_int(ctx, val);
+ gstate->stroke_state->dash_cap = pdf_to_int(ctx, val);
+ gstate->stroke_state->end_cap = pdf_to_int(ctx, val);
}
else if (!strcmp(s, "LW"))
{
pr->dev->flags &= ~FZ_DEVFLAG_LINEWIDTH_UNDEFINED;
gstate->stroke_state = fz_unshare_stroke_state(ctx, gstate->stroke_state);
- gstate->stroke_state->linewidth = pdf_to_real(val);
+ gstate->stroke_state->linewidth = pdf_to_real(ctx, val);
}
else if (!strcmp(s, "LJ"))
{
pr->dev->flags &= ~FZ_DEVFLAG_LINEJOIN_UNDEFINED;
gstate->stroke_state = fz_unshare_stroke_state(ctx, gstate->stroke_state);
- gstate->stroke_state->linejoin = pdf_to_int(val);
+ gstate->stroke_state->linejoin = pdf_to_int(ctx, val);
}
else if (!strcmp(s, "ML"))
{
pr->dev->flags &= ~FZ_DEVFLAG_MITERLIMIT_UNDEFINED;
gstate->stroke_state = fz_unshare_stroke_state(ctx, gstate->stroke_state);
- gstate->stroke_state->miterlimit = pdf_to_real(val);
+ gstate->stroke_state->miterlimit = pdf_to_real(ctx, val);
}
else if (!strcmp(s, "D"))
{
- if (pdf_is_array(val) && pdf_array_len(val) == 2)
+ if (pdf_is_array(ctx, val) && pdf_array_len(ctx, val) == 2)
{
- pdf_obj *dashes = pdf_array_get(val, 0);
- int len = pdf_array_len(dashes);
+ pdf_obj *dashes = pdf_array_get(ctx, val, 0);
+ int len = pdf_array_len(ctx, dashes);
gstate->stroke_state = fz_unshare_stroke_state_with_dash_len(ctx, gstate->stroke_state, len);
gstate->stroke_state->dash_len = len;
for (k = 0; k < len; k++)
- gstate->stroke_state->dash_list[k] = pdf_to_real(pdf_array_get(dashes, k));
- gstate->stroke_state->dash_phase = pdf_to_real(pdf_array_get(val, 1));
+ gstate->stroke_state->dash_list[k] = pdf_to_real(ctx, pdf_array_get(ctx, dashes, k));
+ gstate->stroke_state->dash_phase = pdf_to_real(ctx, pdf_array_get(ctx, val, 1));
}
else
fz_throw(ctx, FZ_ERROR_GENERIC, "malformed /D");
}
else if (!strcmp(s, "CA"))
- gstate->stroke.alpha = fz_clamp(pdf_to_real(val), 0, 1);
+ gstate->stroke.alpha = fz_clamp(pdf_to_real(ctx, val), 0, 1);
else if (!strcmp(s, "ca"))
- gstate->fill.alpha = fz_clamp(pdf_to_real(val), 0, 1);
+ gstate->fill.alpha = fz_clamp(pdf_to_real(ctx, val), 0, 1);
else if (!strcmp(s, "BM"))
{
- if (pdf_is_array(val))
- val = pdf_array_get(val, 0);
- gstate->blendmode = fz_lookup_blendmode(pdf_to_name(val));
+ if (pdf_is_array(ctx, val))
+ val = pdf_array_get(ctx, val, 0);
+ gstate->blendmode = fz_lookup_blendmode(pdf_to_name(ctx, val));
}
else if (!strcmp(s, "SMask"))
{
- if (pdf_is_dict(val))
+ if (pdf_is_dict(ctx, val))
{
pdf_xobject *xobj;
pdf_obj *group, *luminosity, *bc, *tr;
@@ -1540,10 +1543,10 @@ pdf_run_extgstate(pdf_csi *csi, pdf_run_state *pr, pdf_obj *rdb, pdf_obj *extgst
gstate->softmask = NULL;
}
- group = pdf_dict_gets(val, "G");
+ group = pdf_dict_gets(ctx, val, "G");
if (!group)
- fz_throw(ctx, FZ_ERROR_GENERIC, "cannot load softmask xobject (%d %d R)", pdf_to_num(val), pdf_to_gen(val));
- xobj = pdf_load_xobject(csi->doc, group);
+ fz_throw(ctx, FZ_ERROR_GENERIC, "cannot load softmask xobject (%d %d R)", pdf_to_num(ctx, val), pdf_to_gen(ctx, val));
+ xobj = pdf_load_xobject(ctx, csi->doc, group);
colorspace = xobj->colorspace;
if (!colorspace)
@@ -1556,24 +1559,24 @@ pdf_run_extgstate(pdf_csi *csi, pdf_run_state *pr, pdf_obj *rdb, pdf_obj *extgst
for (k = 0; k < colorspace->n; k++)
gstate->softmask_bc[k] = 0;
- bc = pdf_dict_gets(val, "BC");
- if (pdf_is_array(bc))
+ bc = pdf_dict_gets(ctx, val, "BC");
+ if (pdf_is_array(ctx, bc))
{
for (k = 0; k < colorspace->n; k++)
- gstate->softmask_bc[k] = pdf_to_real(pdf_array_get(bc, k));
+ gstate->softmask_bc[k] = pdf_to_real(ctx, pdf_array_get(ctx, bc, k));
}
- luminosity = pdf_dict_gets(val, "S");
- if (pdf_is_name(luminosity) && !strcmp(pdf_to_name(luminosity), "Luminosity"))
+ luminosity = pdf_dict_gets(ctx, val, "S");
+ if (pdf_is_name(ctx, luminosity) && !strcmp(pdf_to_name(ctx, luminosity), "Luminosity"))
gstate->luminosity = 1;
else
gstate->luminosity = 0;
- tr = pdf_dict_gets(val, "TR");
- if (tr && strcmp(pdf_to_name(tr), "Identity"))
+ tr = pdf_dict_gets(ctx, val, "TR");
+ if (tr && strcmp(pdf_to_name(ctx, tr), "Identity"))
fz_warn(ctx, "ignoring transfer function");
}
- else if (pdf_is_name(val) && !strcmp(pdf_to_name(val), "None"))
+ else if (pdf_is_name(ctx, val) && !strcmp(pdf_to_name(ctx, val), "None"))
{
if (gstate->softmask)
{
@@ -1585,15 +1588,15 @@ pdf_run_extgstate(pdf_csi *csi, pdf_run_state *pr, pdf_obj *rdb, pdf_obj *extgst
else if (!strcmp(s, "TR2"))
{
- if (strcmp(pdf_to_name(val), "Identity") && strcmp(pdf_to_name(val), "Default"))
+ if (strcmp(pdf_to_name(ctx, val), "Identity") && strcmp(pdf_to_name(ctx, val), "Default"))
fz_warn(ctx, "ignoring transfer function");
}
else if (!strcmp(s, "TR"))
{
/* TR is ignored in the presence of TR2 */
- pdf_obj *tr2 = pdf_dict_gets(extgstate, "TR2");
- if (tr2 && strcmp(pdf_to_name(val), "Identity"))
+ pdf_obj *tr2 = pdf_dict_gets(ctx, extgstate, "TR2");
+ if (tr2 && strcmp(pdf_to_name(ctx, val), "Identity"))
fz_warn(ctx, "ignoring transfer function");
}
}
@@ -1602,7 +1605,7 @@ pdf_run_extgstate(pdf_csi *csi, pdf_run_state *pr, pdf_obj *rdb, pdf_obj *extgst
static void
run_xobject(pdf_csi *csi, void *state, pdf_obj *resources, pdf_xobject *xobj, const fz_matrix *transform)
{
- fz_context *ctx = csi->doc->ctx;
+ fz_context *ctx = csi->ctx;
pdf_gstate *gstate = NULL;
int oldtop = 0;
fz_matrix local_transform = *transform;
@@ -1614,7 +1617,7 @@ run_xobject(pdf_csi *csi, void *state, pdf_obj *resources, pdf_xobject *xobj, co
char errmess[256] = "";
/* Avoid infinite recursion */
- if (xobj == NULL || pdf_mark_obj(xobj->me))
+ if (xobj == NULL || pdf_mark_obj(ctx, xobj->me))
return;
fz_var(cleanup_state);
@@ -1653,7 +1656,7 @@ run_xobject(pdf_csi *csi, void *state, pdf_obj *resources, pdf_xobject *xobj, co
/* Remember that we tried to call fz_begin_group. Even
* if it throws an error, we must call fz_end_group. */
cleanup_state = 2;
- fz_begin_group(pr->dev, &bbox,
+ fz_begin_group(ctx, pr->dev, &bbox,
xobj->isolated, xobj->knockout, gstate->blendmode, gstate->fill.alpha);
gstate->blendmode = 0;
@@ -1694,7 +1697,7 @@ run_xobject(pdf_csi *csi, void *state, pdf_obj *resources, pdf_xobject *xobj, co
{
fz_try(ctx)
{
- fz_end_group(pr->dev);
+ fz_end_group(ctx, pr->dev);
}
fz_catch(ctx)
{
@@ -1727,7 +1730,7 @@ run_xobject(pdf_csi *csi, void *state, pdf_obj *resources, pdf_xobject *xobj, co
pdf_grestore(pr);
}
- pdf_unmark_obj(xobj->me);
+ pdf_unmark_obj(ctx, xobj->me);
}
fz_catch(ctx)
{
@@ -1741,6 +1744,7 @@ run_xobject(pdf_csi *csi, void *state, pdf_obj *resources, pdf_xobject *xobj, co
static void pdf_run_BDC(pdf_csi *csi, void *state)
{
+ fz_context *ctx = csi->ctx;
pdf_run_state *pr = (pdf_run_state *)state;
pdf_obj *ocg;
pdf_obj *rdb = csi->rdb;
@@ -1758,9 +1762,9 @@ static void pdf_run_BDC(pdf_csi *csi, void *state)
return;
}
- if (pdf_is_name(csi->obj))
+ if (pdf_is_name(ctx, csi->obj))
{
- ocg = pdf_dict_gets(pdf_dict_gets(rdb, "Properties"), pdf_to_name(csi->obj));
+ ocg = pdf_dict_gets(ctx, pdf_dict_gets(ctx, rdb, "Properties"), pdf_to_name(ctx, csi->obj));
}
else
ocg = csi->obj;
@@ -1771,7 +1775,7 @@ static void pdf_run_BDC(pdf_csi *csi, void *state)
* means visible. */
return;
}
- if (strcmp(pdf_to_name(pdf_dict_gets(ocg, "Type")), "OCG") != 0)
+ if (strcmp(pdf_to_name(ctx, pdf_dict_gets(ctx, ocg, "Type")), "OCG") != 0)
{
/* Wrong type of property */
return;
@@ -1847,13 +1851,13 @@ static void pdf_run_cs_imp(pdf_csi *csi, pdf_run_state *pr, int what)
colorspace = fz_device_cmyk(ctx); /* No fz_keep_colorspace as static */
else
{
- dict = pdf_dict_gets(rdb, "ColorSpace");
+ dict = pdf_dict_gets(ctx, rdb, "ColorSpace");
if (!dict)
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find ColorSpace dictionary");
- obj = pdf_dict_gets(dict, csi->name);
+ obj = pdf_dict_gets(ctx, dict, csi->name);
if (!obj)
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find colorspace resource '%s'", csi->name);
- colorspace = pdf_load_colorspace(csi->doc, obj);
+ colorspace = pdf_load_colorspace(ctx, csi->doc, obj);
}
pdf_set_colorspace(csi, pr, what, colorspace);
@@ -1887,39 +1891,39 @@ static void pdf_run_DP(pdf_csi *csi, void *state)
static void pdf_run_Do(pdf_csi *csi, void *state)
{
pdf_run_state *pr = (pdf_run_state *)state;
- fz_context *ctx = csi->doc->ctx;
+ fz_context *ctx = csi->ctx;
pdf_obj *dict;
pdf_obj *obj;
pdf_obj *subtype;
pdf_obj *rdb = csi->rdb;
- dict = pdf_dict_gets(rdb, "XObject");
+ dict = pdf_dict_gets(ctx, rdb, "XObject");
if (!dict)
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find XObject dictionary when looking for: '%s'", csi->name);
- obj = pdf_dict_gets(dict, csi->name);
+ obj = pdf_dict_gets(ctx, dict, csi->name);
if (!obj)
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find xobject resource: '%s'", csi->name);
- subtype = pdf_dict_gets(obj, "Subtype");
- if (!pdf_is_name(subtype))
+ subtype = pdf_dict_gets(ctx, obj, "Subtype");
+ if (!pdf_is_name(ctx, subtype))
fz_throw(ctx, FZ_ERROR_GENERIC, "no XObject subtype specified");
- if (pdf_is_hidden_ocg(pdf_dict_gets(obj, "OC"), csi, pr, rdb))
+ if (pdf_is_hidden_ocg(pdf_dict_gets(ctx, obj, "OC"), csi, pr, rdb))
return;
- if (!strcmp(pdf_to_name(subtype), "Form") && pdf_dict_gets(obj, "Subtype2"))
- subtype = pdf_dict_gets(obj, "Subtype2");
+ if (!strcmp(pdf_to_name(ctx, subtype), "Form") && pdf_dict_gets(ctx, obj, "Subtype2"))
+ subtype = pdf_dict_gets(ctx, obj, "Subtype2");
- if (!strcmp(pdf_to_name(subtype), "Form"))
+ if (!strcmp(pdf_to_name(ctx, subtype), "Form"))
{
pdf_xobject *xobj;
- xobj = pdf_load_xobject(csi->doc, obj);
+ xobj = pdf_load_xobject(ctx, csi->doc, obj);
/* Inherit parent resources, in case this one was empty XXX check where it's loaded */
if (!xobj->resources)
- xobj->resources = pdf_keep_obj(rdb);
+ xobj->resources = pdf_keep_obj(ctx, rdb);
fz_try(ctx)
{
@@ -1931,15 +1935,15 @@ static void pdf_run_Do(pdf_csi *csi, void *state)
}
fz_catch(ctx)
{
- fz_rethrow_message(ctx, "cannot draw xobject (%d %d R)", pdf_to_num(obj), pdf_to_gen(obj));
+ fz_rethrow_message(ctx, "cannot draw xobject (%d %d R)", pdf_to_num(ctx, obj), pdf_to_gen(ctx, obj));
}
}
- else if (!strcmp(pdf_to_name(subtype), "Image"))
+ else if (!strcmp(pdf_to_name(ctx, subtype), "Image"))
{
if ((pr->dev->hints & FZ_IGNORE_IMAGE) == 0)
{
- fz_image *img = pdf_load_image(csi->doc, obj);
+ fz_image *img = pdf_load_image(ctx, csi->doc, obj);
fz_try(ctx)
{
@@ -1956,14 +1960,14 @@ static void pdf_run_Do(pdf_csi *csi, void *state)
}
}
- else if (!strcmp(pdf_to_name(subtype), "PS"))
+ else if (!strcmp(pdf_to_name(ctx, subtype), "PS"))
{
fz_warn(ctx, "ignoring XObject with subtype PS");
}
else
{
- fz_throw(ctx, FZ_ERROR_GENERIC, "unknown XObject subtype: '%s'", pdf_to_name(subtype));
+ fz_throw(ctx, FZ_ERROR_GENERIC, "unknown XObject subtype: '%s'", pdf_to_name(ctx, subtype));
}
}
@@ -1999,7 +2003,7 @@ static void pdf_run_G(pdf_csi *csi, void *state)
pdf_run_state *pr = (pdf_run_state *)state;
pr->dev->flags &= ~FZ_DEVFLAG_STROKECOLOR_UNDEFINED;
- pdf_set_colorspace(csi, pr, PDF_STROKE, fz_device_gray(csi->doc->ctx));
+ pdf_set_colorspace(csi, pr, PDF_STROKE, fz_device_gray(csi->ctx));
pdf_set_color(csi, pr, PDF_STROKE, csi->stack);
}
@@ -2009,7 +2013,7 @@ static void pdf_run_J(pdf_csi *csi, void *state)
pdf_gstate *gstate = pr->gstate + pr->gtop;
pr->dev->flags &= ~(FZ_DEVFLAG_STARTCAP_UNDEFINED | FZ_DEVFLAG_DASHCAP_UNDEFINED | FZ_DEVFLAG_ENDCAP_UNDEFINED);
- gstate->stroke_state = fz_unshare_stroke_state(csi->doc->ctx, gstate->stroke_state);
+ gstate->stroke_state = fz_unshare_stroke_state(csi->ctx, gstate->stroke_state);
gstate->stroke_state->start_cap = csi->stack[0];
gstate->stroke_state->dash_cap = csi->stack[0];
gstate->stroke_state->end_cap = csi->stack[0];
@@ -2020,7 +2024,7 @@ static void pdf_run_K(pdf_csi *csi, void *state)
pdf_run_state *pr = (pdf_run_state *)state;
pr->dev->flags &= ~FZ_DEVFLAG_STROKECOLOR_UNDEFINED;
- pdf_set_colorspace(csi, pr, PDF_STROKE, fz_device_cmyk(csi->doc->ctx));
+ pdf_set_colorspace(csi, pr, PDF_STROKE, fz_device_cmyk(csi->ctx));
pdf_set_color(csi, pr, PDF_STROKE, csi->stack);
}
@@ -2030,7 +2034,7 @@ static void pdf_run_M(pdf_csi *csi, void *state)
pdf_gstate *gstate = pr->gstate + pr->gtop;
pr->dev->flags &= ~FZ_DEVFLAG_MITERLIMIT_UNDEFINED;
- gstate->stroke_state = fz_unshare_stroke_state(csi->doc->ctx, gstate->stroke_state);
+ gstate->stroke_state = fz_unshare_stroke_state(csi->ctx, gstate->stroke_state);
gstate->stroke_state->miterlimit = csi->stack[0];
}
@@ -2050,7 +2054,7 @@ static void pdf_run_RG(pdf_csi *csi, void *state)
pdf_run_state *pr = (pdf_run_state *)state;
pr->dev->flags &= ~FZ_DEVFLAG_STROKECOLOR_UNDEFINED;
- pdf_set_colorspace(csi, pr, PDF_STROKE, fz_device_rgb(csi->doc->ctx));
+ pdf_set_colorspace(csi, pr, PDF_STROKE, fz_device_rgb(csi->ctx));
pdf_set_color(csi, pr, PDF_STROKE, csi->stack);
}
@@ -2084,33 +2088,33 @@ static void pdf_run_SC_imp(pdf_csi *csi, pdf_run_state *pr, int what, pdf_materi
break;
case PDF_MAT_PATTERN:
- dict = pdf_dict_gets(rdb, "Pattern");
+ dict = pdf_dict_gets(ctx, rdb, "Pattern");
if (!dict)
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find Pattern dictionary");
- obj = pdf_dict_gets(dict, csi->name);
+ obj = pdf_dict_gets(ctx, dict, csi->name);
if (!obj)
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find pattern resource '%s'", csi->name);
- patterntype = pdf_dict_gets(obj, "PatternType");
+ patterntype = pdf_dict_gets(ctx, obj, "PatternType");
- if (pdf_to_int(patterntype) == 1)
+ if (pdf_to_int(ctx, patterntype) == 1)
{
pdf_pattern *pat;
- pat = pdf_load_pattern(csi->doc, obj);
+ pat = pdf_load_pattern(ctx, csi->doc, obj);
pdf_set_pattern(csi, pr, what, pat, csi->top > 0 ? csi->stack : NULL);
pdf_drop_pattern(ctx, pat);
}
- else if (pdf_to_int(patterntype) == 2)
+ else if (pdf_to_int(ctx, patterntype) == 2)
{
fz_shade *shd;
- shd = pdf_load_shading(csi->doc, obj);
+ shd = pdf_load_shading(ctx, csi->doc, obj);
pdf_set_shade(csi, pr, what, shd);
fz_drop_shade(ctx, shd);
}
else
{
- fz_throw(ctx, FZ_ERROR_GENERIC, "unknown pattern type: %d", pdf_to_int(patterntype));
+ fz_throw(ctx, FZ_ERROR_GENERIC, "unknown pattern type: %d", pdf_to_int(ctx, patterntype));
}
break;
@@ -2175,7 +2179,7 @@ static void pdf_run_TL(pdf_csi *csi, void *state)
static void pdf_run_Tf(pdf_csi *csi, void *state)
{
pdf_run_state *pr = (pdf_run_state *)state;
- fz_context *ctx = csi->doc->ctx;
+ fz_context *ctx = csi->ctx;
pdf_obj *rdb = csi->rdb;
pdf_gstate *gstate = pr->gstate + pr->gtop;
pdf_obj *dict;
@@ -2186,11 +2190,11 @@ static void pdf_run_Tf(pdf_csi *csi, void *state)
pdf_drop_font(ctx, gstate->font);
gstate->font = NULL;
- dict = pdf_dict_gets(rdb, "Font");
+ dict = pdf_dict_gets(ctx, rdb, "Font");
if (!dict)
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find Font dictionary");
- obj = pdf_dict_gets(dict, csi->name);
+ obj = pdf_dict_gets(ctx, dict, csi->name);
if (!obj)
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find font resource: '%s'", csi->name);
@@ -2314,7 +2318,7 @@ static void pdf_run_c(pdf_csi *csi, void *state)
d = csi->stack[3];
e = csi->stack[4];
f = csi->stack[5];
- fz_curveto(csi->doc->ctx, pr->path, a, b, c, d, e, f);
+ fz_curveto(csi->ctx, pr->path, a, b, c, d, e, f);
}
static void pdf_run_cm(pdf_csi *csi, void *state)
@@ -2336,6 +2340,7 @@ static void pdf_run_cm(pdf_csi *csi, void *state)
static void pdf_run_d(pdf_csi *csi, void *state)
{
+ fz_context *ctx = csi->ctx;
pdf_run_state *pr = (pdf_run_state *)state;
pdf_gstate *gstate = pr->gstate + pr->gtop;
pdf_obj *array;
@@ -2343,11 +2348,11 @@ static void pdf_run_d(pdf_csi *csi, void *state)
int len;
array = csi->obj;
- len = pdf_array_len(array);
- gstate->stroke_state = fz_unshare_stroke_state_with_dash_len(csi->doc->ctx, gstate->stroke_state, len);
+ len = pdf_array_len(ctx, array);
+ gstate->stroke_state = fz_unshare_stroke_state_with_dash_len(csi->ctx, gstate->stroke_state, len);
gstate->stroke_state->dash_len = len;
for (i = 0; i < len; i++)
- gstate->stroke_state->dash_list[i] = pdf_to_real(pdf_array_get(array, i));
+ gstate->stroke_state->dash_list[i] = pdf_to_real(ctx, pdf_array_get(ctx, array, i));
gstate->stroke_state->dash_phase = csi->stack[0];
}
@@ -2396,7 +2401,7 @@ static void pdf_run_g(pdf_csi *csi, void *state)
pdf_run_state *pr = (pdf_run_state *)state;
pr->dev->flags &= ~FZ_DEVFLAG_FILLCOLOR_UNDEFINED;
- pdf_set_colorspace(csi, pr, PDF_FILL, fz_device_gray(csi->doc->ctx));
+ pdf_set_colorspace(csi, pr, PDF_FILL, fz_device_gray(csi->ctx));
pdf_set_color(csi, pr, PDF_FILL, csi->stack);
}
@@ -2405,14 +2410,14 @@ static void pdf_run_gs(pdf_csi *csi, void *state)
pdf_run_state *pr = (pdf_run_state *)state;
pdf_obj *dict;
pdf_obj *obj;
- fz_context *ctx = csi->doc->ctx;
+ fz_context *ctx = csi->ctx;
pdf_obj *rdb = csi->rdb;
- dict = pdf_dict_gets(rdb, "ExtGState");
+ dict = pdf_dict_gets(ctx, rdb, "ExtGState");
if (!dict)
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find ExtGState dictionary");
- obj = pdf_dict_gets(dict, csi->name);
+ obj = pdf_dict_gets(ctx, dict, csi->name);
if (!obj)
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find extgstate resource '%s'", csi->name);
@@ -2423,7 +2428,7 @@ static void pdf_run_h(pdf_csi *csi, void *state)
{
pdf_run_state *pr = (pdf_run_state *)state;
- fz_closepath(csi->doc->ctx, pr->path);
+ fz_closepath(csi->ctx, pr->path);
}
static void pdf_run_i(pdf_csi *csi, void *state)
@@ -2436,7 +2441,7 @@ static void pdf_run_j(pdf_csi *csi, void *state)
pdf_gstate *gstate = pr->gstate + pr->gtop;
pr->dev->flags &= ~FZ_DEVFLAG_LINEJOIN_UNDEFINED;
- gstate->stroke_state = fz_unshare_stroke_state(csi->doc->ctx, gstate->stroke_state);
+ gstate->stroke_state = fz_unshare_stroke_state(csi->ctx, gstate->stroke_state);
gstate->stroke_state->linejoin = csi->stack[0];
}
@@ -2445,7 +2450,7 @@ static void pdf_run_k(pdf_csi *csi, void *state)
pdf_run_state *pr = (pdf_run_state *)state;
pr->dev->flags &= ~FZ_DEVFLAG_FILLCOLOR_UNDEFINED;
- pdf_set_colorspace(csi, pr, PDF_FILL, fz_device_cmyk(csi->doc->ctx));
+ pdf_set_colorspace(csi, pr, PDF_FILL, fz_device_cmyk(csi->ctx));
pdf_set_color(csi, pr, PDF_FILL, csi->stack);
}
@@ -2456,7 +2461,7 @@ static void pdf_run_l(pdf_csi *csi, void *state)
a = csi->stack[0];
b = csi->stack[1];
- fz_lineto(csi->doc->ctx, pr->path, a, b);
+ fz_lineto(csi->ctx, pr->path, a, b);
}
static void pdf_run_m(pdf_csi *csi, void *state)
@@ -2466,7 +2471,7 @@ static void pdf_run_m(pdf_csi *csi, void *state)
a = csi->stack[0];
b = csi->stack[1];
- fz_moveto(csi->doc->ctx, pr->path, a, b);
+ fz_moveto(csi->ctx, pr->path, a, b);
}
static void pdf_run_n(pdf_csi *csi, void *state)
@@ -2486,7 +2491,7 @@ static void pdf_run_q(pdf_csi *csi, void *state)
static void pdf_run_re(pdf_csi *csi, void *state)
{
pdf_run_state *pr = (pdf_run_state *)state;
- fz_context *ctx = csi->doc->ctx;
+ fz_context *ctx = csi->ctx;
float x, y, w, h;
x = csi->stack[0];
@@ -2506,7 +2511,7 @@ static void pdf_run_rg(pdf_csi *csi, void *state)
pdf_run_state *pr = (pdf_run_state *)state;
pr->dev->flags &= ~FZ_DEVFLAG_FILLCOLOR_UNDEFINED;
- pdf_set_colorspace(csi, pr, PDF_FILL, fz_device_rgb(csi->doc->ctx));
+ pdf_set_colorspace(csi, pr, PDF_FILL, fz_device_rgb(csi->ctx));
pdf_set_color(csi, pr, PDF_FILL, csi->stack);
}
@@ -2524,23 +2529,23 @@ static void pdf_run_s(pdf_csi *csi, void *state)
static void pdf_run_sh(pdf_csi *csi, void *state)
{
pdf_run_state *pr = (pdf_run_state *)state;
- fz_context *ctx = csi->doc->ctx;
+ fz_context *ctx = csi->ctx;
pdf_obj *rdb = csi->rdb;
pdf_obj *dict;
pdf_obj *obj;
fz_shade *shd;
- dict = pdf_dict_gets(rdb, "Shading");
+ dict = pdf_dict_gets(ctx, rdb, "Shading");
if (!dict)
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find shading dictionary");
- obj = pdf_dict_gets(dict, csi->name);
+ obj = pdf_dict_gets(ctx, dict, csi->name);
if (!obj)
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find shading resource: '%s'", csi->name);
if ((pr->dev->hints & FZ_IGNORE_SHADE) == 0)
{
- shd = pdf_load_shading(csi->doc, obj);
+ shd = pdf_load_shading(ctx, csi->doc, obj);
fz_try(ctx)
{
@@ -2566,7 +2571,7 @@ static void pdf_run_v(pdf_csi *csi, void *state)
b = csi->stack[1];
c = csi->stack[2];
d = csi->stack[3];
- fz_curvetov(csi->doc->ctx, pr->path, a, b, c, d);
+ fz_curvetov(csi->ctx, pr->path, a, b, c, d);
}
static void pdf_run_w(pdf_csi *csi, void *state)
@@ -2576,7 +2581,7 @@ static void pdf_run_w(pdf_csi *csi, void *state)
gstate = pdf_flush_text(csi, pr); /* linewidth affects stroked text rendering mode */
pr->dev->flags &= ~FZ_DEVFLAG_LINEWIDTH_UNDEFINED;
- gstate->stroke_state = fz_unshare_stroke_state(csi->doc->ctx, gstate->stroke_state);
+ gstate->stroke_state = fz_unshare_stroke_state(csi->ctx, gstate->stroke_state);
gstate->stroke_state->linewidth = csi->stack[0];
}
@@ -2589,7 +2594,7 @@ static void pdf_run_y(pdf_csi *csi, void *state)
b = csi->stack[1];
c = csi->stack[2];
d = csi->stack[3];
- fz_curvetoy(csi->doc->ctx, pr->path, a, b, c, d);
+ fz_curvetoy(csi->ctx, pr->path, a, b, c, d);
}
static void pdf_run_squote(pdf_csi *csi, void *state)
@@ -2625,7 +2630,7 @@ static void pdf_run_dquote(pdf_csi *csi, void *state)
static void free_processor_normal(pdf_csi *csi, void *state)
{
- fz_context *ctx = csi->doc->ctx;
+ fz_context *ctx = csi->ctx;
pdf_run_state *pr = (pdf_run_state *)state;
while (pr->gtop)
@@ -2640,7 +2645,7 @@ static void free_processor_normal(pdf_csi *csi, void *state)
fz_drop_stroke_state(ctx, pr->gstate[0].stroke_state);
while (pr->gstate[0].clip_depth--)
- fz_pop_clip(pr->dev);
+ fz_pop_clip(ctx, pr->dev);
if (pr->path) fz_drop_path(ctx, pr->path);
if (pr->text) fz_drop_text(ctx, pr->text);
@@ -2656,10 +2661,10 @@ process_annot(pdf_csi *csi, void *state, pdf_obj *resources, pdf_annot *annot)
fz_context *ctx = pr->ctx;
int flags;
- if (pdf_is_hidden_ocg(pdf_dict_gets(annot->obj, "OC"), csi, pr, resources))
+ if (pdf_is_hidden_ocg(pdf_dict_gets(ctx, annot->obj, "OC"), csi, pr, resources))
return;
- flags = pdf_to_int(pdf_dict_gets(annot->obj, "F"));
+ flags = pdf_to_int(ctx, pdf_dict_gets(ctx, annot->obj, "F"));
if (!strcmp(pr->event, "Print") && !(flags & (1 << 2))) /* Print */
return;
if (!strcmp(pr->event, "View") && (flags & (1 << 5))) /* NoView */
@@ -2810,9 +2815,8 @@ const pdf_processor pdf_processor_normal =
process_contents
};
-pdf_process *pdf_process_run(pdf_process *process, fz_device *dev, const fz_matrix *ctm, const char *event, pdf_gstate *gstate, int nested)
+pdf_process *pdf_init_process_run(fz_context *ctx, pdf_process *process, fz_device *dev, const fz_matrix *ctm, const char *event, pdf_gstate *gstate, int nested)
{
- fz_context *ctx = dev->ctx;
pdf_run_state *pr;
pr = fz_malloc_struct(ctx, pdf_run_state);
diff --git a/source/pdf/pdf-outline.c b/source/pdf/pdf-outline.c
index 4e4ad642..34bb79ed 100644
--- a/source/pdf/pdf-outline.c
+++ b/source/pdf/pdf-outline.c
@@ -1,9 +1,8 @@
#include "mupdf/pdf.h"
static fz_outline *
-pdf_load_outline_imp(pdf_document *doc, pdf_obj *dict)
+pdf_load_outline_imp(fz_context *ctx, pdf_document *doc, pdf_obj *dict)
{
- fz_context *ctx = doc->ctx;
fz_outline *node, **prev, *first;
pdf_obj *obj;
pdf_obj *odict = dict;
@@ -15,9 +14,9 @@ pdf_load_outline_imp(pdf_document *doc, pdf_obj *dict)
{
first = NULL;
prev = &first;
- while (dict && pdf_is_dict(dict))
+ while (dict && pdf_is_dict(ctx, dict))
{
- if (pdf_mark_obj(dict))
+ if (pdf_mark_obj(ctx, dict))
break;
node = fz_malloc_struct(ctx, fz_outline);
node->title = NULL;
@@ -27,26 +26,26 @@ pdf_load_outline_imp(pdf_document *doc, pdf_obj *dict)
*prev = node;
prev = &node->next;
- obj = pdf_dict_gets(dict, "Title");
+ obj = pdf_dict_gets(ctx, dict, "Title");
if (obj)
- node->title = pdf_to_utf8(doc, obj);
+ node->title = pdf_to_utf8(ctx, doc, obj);
- if ((obj = pdf_dict_gets(dict, "Dest")) != NULL)
- node->dest = pdf_parse_link_dest(doc, FZ_LINK_GOTO, obj);
- else if ((obj = pdf_dict_gets(dict, "A")) != NULL)
- node->dest = pdf_parse_action(doc, obj);
+ if ((obj = pdf_dict_gets(ctx, dict, "Dest")) != NULL)
+ node->dest = pdf_parse_link_dest(ctx, doc, FZ_LINK_GOTO, obj);
+ else if ((obj = pdf_dict_gets(ctx, dict, "A")) != NULL)
+ node->dest = pdf_parse_action(ctx, doc, obj);
- obj = pdf_dict_gets(dict, "First");
+ obj = pdf_dict_gets(ctx, dict, "First");
if (obj)
- node->down = pdf_load_outline_imp(doc, obj);
+ node->down = pdf_load_outline_imp(ctx, doc, obj);
- dict = pdf_dict_gets(dict, "Next");
+ dict = pdf_dict_gets(ctx, dict, "Next");
}
}
fz_always(ctx)
{
- for (dict = odict; dict && pdf_obj_marked(dict); dict = pdf_dict_gets(dict, "Next"))
- pdf_unmark_obj(dict);
+ for (dict = odict; dict && pdf_obj_marked(ctx, dict); dict = pdf_dict_gets(ctx, dict, "Next"))
+ pdf_unmark_obj(ctx, dict);
}
fz_catch(ctx)
{
@@ -58,15 +57,15 @@ pdf_load_outline_imp(pdf_document *doc, pdf_obj *dict)
}
fz_outline *
-pdf_load_outline(pdf_document *doc)
+pdf_load_outline(fz_context *ctx, pdf_document *doc)
{
pdf_obj *root, *obj, *first;
- root = pdf_dict_gets(pdf_trailer(doc), "Root");
- obj = pdf_dict_gets(root, "Outlines");
- first = pdf_dict_gets(obj, "First");
+ root = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Root");
+ obj = pdf_dict_gets(ctx, root, "Outlines");
+ first = pdf_dict_gets(ctx, obj, "First");
if (first)
- return pdf_load_outline_imp(doc, first);
+ return pdf_load_outline_imp(ctx, doc, first);
return NULL;
}
diff --git a/source/pdf/pdf-page.c b/source/pdf/pdf-page.c
index cf4d1803..c9c92307 100644
--- a/source/pdf/pdf-page.c
+++ b/source/pdf/pdf-page.c
@@ -1,12 +1,12 @@
#include "mupdf/pdf.h"
int
-pdf_count_pages(pdf_document *doc)
+pdf_count_pages(fz_context *ctx, pdf_document *doc)
{
if (doc->page_count == 0)
{
- pdf_obj *count = pdf_dict_getp(pdf_trailer(doc), "Root/Pages/Count");
- doc->page_count = pdf_to_int(count);
+ pdf_obj *count = pdf_dict_getp(ctx, pdf_trailer(ctx, doc), "Root/Pages/Count");
+ doc->page_count = pdf_to_int(ctx, count);
}
return doc->page_count;
}
@@ -17,9 +17,8 @@ enum
};
static pdf_obj *
-pdf_lookup_page_loc_imp(pdf_document *doc, pdf_obj *node, int *skip, pdf_obj **parentp, int *indexp)
+pdf_lookup_page_loc_imp(fz_context *ctx, pdf_document *doc, pdf_obj *node, int *skip, pdf_obj **parentp, int *indexp)
{
- fz_context *ctx = doc->ctx;
pdf_obj *kids;
pdf_obj *hit = NULL;
int i, len;
@@ -37,8 +36,8 @@ pdf_lookup_page_loc_imp(pdf_document *doc, pdf_obj *node, int *skip, pdf_obj **p
{
do
{
- kids = pdf_dict_gets(node, "Kids");
- len = pdf_array_len(kids);
+ kids = pdf_dict_gets(ctx, node, "Kids");
+ len = pdf_array_len(ctx, kids);
if (len == 0)
fz_throw(ctx, FZ_ERROR_GENERIC, "Malformed pages tree");
@@ -57,16 +56,16 @@ pdf_lookup_page_loc_imp(pdf_document *doc, pdf_obj *node, int *skip, pdf_obj **p
}
stack[stack_len++] = node;
- if (pdf_mark_obj(node))
+ if (pdf_mark_obj(ctx, node))
fz_throw(ctx, FZ_ERROR_GENERIC, "cycle in page tree");
for (i = 0; i < len; i++)
{
- pdf_obj *kid = pdf_array_get(kids, i);
- char *type = pdf_to_name(pdf_dict_gets(kid, "Type"));
- if (*type ? !strcmp(type, "Pages") : pdf_dict_gets(kid, "Kids") && !pdf_dict_gets(kid, "MediaBox"))
+ pdf_obj *kid = pdf_array_get(ctx, kids, i);
+ char *type = pdf_to_name(ctx, pdf_dict_gets(ctx, kid, "Type"));
+ if (*type ? !strcmp(type, "Pages") : pdf_dict_gets(ctx, kid, "Kids") && !pdf_dict_gets(ctx, kid, "MediaBox"))
{
- int count = pdf_to_int(pdf_dict_gets(kid, "Count"));
+ int count = pdf_to_int(ctx, pdf_dict_gets(ctx, kid, "Count"));
if (*skip < count)
{
node = kid;
@@ -79,7 +78,7 @@ pdf_lookup_page_loc_imp(pdf_document *doc, pdf_obj *node, int *skip, pdf_obj **p
}
else
{
- if (*type ? strcmp(type, "Page") != 0 : !pdf_dict_gets(kid, "MediaBox"))
+ if (*type ? strcmp(type, "Page") != 0 : !pdf_dict_gets(ctx, kid, "MediaBox"))
fz_warn(ctx, "non-page object in page tree (%s)", type);
if (*skip == 0)
{
@@ -100,7 +99,7 @@ pdf_lookup_page_loc_imp(pdf_document *doc, pdf_obj *node, int *skip, pdf_obj **p
fz_always(ctx)
{
for (i = stack_len; i > 0; i--)
- pdf_unmark_obj(stack[i-1]);
+ pdf_unmark_obj(ctx, stack[i-1]);
if (stack != &local_stack[0])
fz_free(ctx, stack);
}
@@ -113,74 +112,73 @@ pdf_lookup_page_loc_imp(pdf_document *doc, pdf_obj *node, int *skip, pdf_obj **p
}
pdf_obj *
-pdf_lookup_page_loc(pdf_document *doc, int needle, pdf_obj **parentp, int *indexp)
+pdf_lookup_page_loc(fz_context *ctx, pdf_document *doc, int needle, pdf_obj **parentp, int *indexp)
{
- pdf_obj *root = pdf_dict_gets(pdf_trailer(doc), "Root");
- pdf_obj *node = pdf_dict_gets(root, "Pages");
+ pdf_obj *root = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Root");
+ pdf_obj *node = pdf_dict_gets(ctx, root, "Pages");
int skip = needle;
pdf_obj *hit;
if (!node)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "cannot find page tree");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find page tree");
- hit = pdf_lookup_page_loc_imp(doc, node, &skip, parentp, indexp);
+ hit = pdf_lookup_page_loc_imp(ctx, doc, node, &skip, parentp, indexp);
if (!hit)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "cannot find page %d in page tree", needle);
+ fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find page %d in page tree", needle);
return hit;
}
pdf_obj *
-pdf_lookup_page_obj(pdf_document *doc, int needle)
+pdf_lookup_page_obj(fz_context *ctx, pdf_document *doc, int needle)
{
- return pdf_lookup_page_loc(doc, needle, NULL, NULL);
+ return pdf_lookup_page_loc(ctx, doc, needle, NULL, NULL);
}
static int
-pdf_count_pages_before_kid(pdf_document *doc, pdf_obj *parent, int kid_num)
+pdf_count_pages_before_kid(fz_context *ctx, pdf_document *doc, pdf_obj *parent, int kid_num)
{
- pdf_obj *kids = pdf_dict_gets(parent, "Kids");
- int i, total = 0, len = pdf_array_len(kids);
+ pdf_obj *kids = pdf_dict_gets(ctx, parent, "Kids");
+ int i, total = 0, len = pdf_array_len(ctx, kids);
for (i = 0; i < len; i++)
{
- pdf_obj *kid = pdf_array_get(kids, i);
- if (pdf_to_num(kid) == kid_num)
+ pdf_obj *kid = pdf_array_get(ctx, kids, i);
+ if (pdf_to_num(ctx, kid) == kid_num)
return total;
- if (!strcmp(pdf_to_name(pdf_dict_gets(kid, "Type")), "Pages"))
+ if (!strcmp(pdf_to_name(ctx, pdf_dict_gets(ctx, kid, "Type")), "Pages"))
{
- pdf_obj *count = pdf_dict_gets(kid, "Count");
- int n = pdf_to_int(count);
- if (!pdf_is_int(count) || n < 0)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "illegal or missing count in pages tree");
+ pdf_obj *count = pdf_dict_gets(ctx, kid, "Count");
+ int n = pdf_to_int(ctx, count);
+ if (!pdf_is_int(ctx, count) || n < 0)
+ fz_throw(ctx, FZ_ERROR_GENERIC, "illegal or missing count in pages tree");
total += n;
}
else
total++;
}
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "kid not found in parent's kids array");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "kid not found in parent's kids array");
}
int
-pdf_lookup_page_number(pdf_document *doc, pdf_obj *node)
+pdf_lookup_page_number(fz_context *ctx, pdf_document *doc, pdf_obj *node)
{
- fz_context *ctx = doc->ctx;
- int needle = pdf_to_num(node);
+ int needle = pdf_to_num(ctx, node);
int total = 0;
pdf_obj *parent, *parent2;
- if (strcmp(pdf_to_name(pdf_dict_gets(node, "Type")), "Page") != 0)
+ if (strcmp(pdf_to_name(ctx, pdf_dict_gets(ctx, node, "Type")), "Page") != 0)
fz_throw(ctx, FZ_ERROR_GENERIC, "invalid page object");
- parent2 = parent = pdf_dict_gets(node, "Parent");
+ parent2 = parent = pdf_dict_gets(ctx, node, "Parent");
fz_var(parent);
fz_try(ctx)
{
- while (pdf_is_dict(parent))
+ while (pdf_is_dict(ctx, parent))
{
- if (pdf_mark_obj(parent))
+ if (pdf_mark_obj(ctx, parent))
fz_throw(ctx, FZ_ERROR_GENERIC, "cycle in page tree (parents)");
- total += pdf_count_pages_before_kid(doc, parent, needle);
- needle = pdf_to_num(parent);
- parent = pdf_dict_gets(parent, "Parent");
+ total += pdf_count_pages_before_kid(ctx, doc, parent, needle);
+ needle = pdf_to_num(ctx, parent);
+ parent = pdf_dict_gets(ctx, parent, "Parent");
}
}
fz_always(ctx)
@@ -188,10 +186,10 @@ pdf_lookup_page_number(pdf_document *doc, pdf_obj *node)
/* Run back and unmark */
while (parent2)
{
- pdf_unmark_obj(parent2);
+ pdf_unmark_obj(ctx, parent2);
if (parent2 == parent)
break;
- parent2 = pdf_dict_gets(parent2, "Parent");
+ parent2 = pdf_dict_gets(ctx, parent2, "Parent");
}
}
fz_catch(ctx)
@@ -203,9 +201,8 @@ pdf_lookup_page_number(pdf_document *doc, pdf_obj *node)
}
static pdf_obj *
-pdf_lookup_inherited_page_item(pdf_document *doc, pdf_obj *node, const char *key)
+pdf_lookup_inherited_page_item(fz_context *ctx, pdf_document *doc, pdf_obj *node, const char *key)
{
- fz_context *ctx = doc->ctx;
pdf_obj *node2 = node;
pdf_obj *val;
@@ -215,12 +212,12 @@ pdf_lookup_inherited_page_item(pdf_document *doc, pdf_obj *node, const char *key
{
do
{
- val = pdf_dict_gets(node, key);
+ val = pdf_dict_gets(ctx, node, key);
if (val)
break;
- if (pdf_mark_obj(node))
+ if (pdf_mark_obj(ctx, node))
fz_throw(ctx, FZ_ERROR_GENERIC, "cycle in page tree (parents)");
- node = pdf_dict_gets(node, "Parent");
+ node = pdf_dict_gets(ctx, node, "Parent");
}
while (node);
}
@@ -228,10 +225,10 @@ pdf_lookup_inherited_page_item(pdf_document *doc, pdf_obj *node, const char *key
{
do
{
- pdf_unmark_obj(node2);
+ pdf_unmark_obj(ctx, node2);
if (node2 == node)
break;
- node2 = pdf_dict_gets(node2, "Parent");
+ node2 = pdf_dict_gets(ctx, node2, "Parent");
}
while (node2);
}
@@ -245,41 +242,40 @@ pdf_lookup_inherited_page_item(pdf_document *doc, pdf_obj *node, const char *key
/* We need to know whether to install a page-level transparency group */
-static int pdf_resources_use_blending(pdf_document *doc, pdf_obj *rdb);
+static int pdf_resources_use_blending(fz_context *ctx, pdf_document *doc, pdf_obj *rdb);
static int
-pdf_extgstate_uses_blending(pdf_document *doc, pdf_obj *dict)
+pdf_extgstate_uses_blending(fz_context *ctx, pdf_document *doc, pdf_obj *dict)
{
- pdf_obj *obj = pdf_dict_gets(dict, "BM");
- if (pdf_is_name(obj) && strcmp(pdf_to_name(obj), "Normal"))
+ pdf_obj *obj = pdf_dict_gets(ctx, dict, "BM");
+ if (pdf_is_name(ctx, obj) && strcmp(pdf_to_name(ctx, obj), "Normal"))
return 1;
return 0;
}
static int
-pdf_pattern_uses_blending(pdf_document *doc, pdf_obj *dict)
+pdf_pattern_uses_blending(fz_context *ctx, pdf_document *doc, pdf_obj *dict)
{
pdf_obj *obj;
- obj = pdf_dict_gets(dict, "Resources");
- if (pdf_resources_use_blending(doc, obj))
+ obj = pdf_dict_gets(ctx, dict, "Resources");
+ if (pdf_resources_use_blending(ctx, doc, obj))
return 1;
- obj = pdf_dict_gets(dict, "ExtGState");
- return pdf_extgstate_uses_blending(doc, obj);
+ obj = pdf_dict_gets(ctx, dict, "ExtGState");
+ return pdf_extgstate_uses_blending(ctx, doc, obj);
}
static int
-pdf_xobject_uses_blending(pdf_document *doc, pdf_obj *dict)
+pdf_xobject_uses_blending(fz_context *ctx, pdf_document *doc, pdf_obj *dict)
{
- pdf_obj *obj = pdf_dict_gets(dict, "Resources");
- if (!strcmp(pdf_to_name(pdf_dict_getp(dict, "Group/S")), "Transparency"))
+ pdf_obj *obj = pdf_dict_gets(ctx, dict, "Resources");
+ if (!strcmp(pdf_to_name(ctx, pdf_dict_getp(ctx, dict, "Group/S")), "Transparency"))
return 1;
- return pdf_resources_use_blending(doc, obj);
+ return pdf_resources_use_blending(ctx, doc, obj);
}
static int
-pdf_resources_use_blending(pdf_document *doc, pdf_obj *rdb)
+pdf_resources_use_blending(fz_context *ctx, pdf_document *doc, pdf_obj *rdb)
{
- fz_context *ctx = doc->ctx;
pdf_obj *obj;
int i, n, useBM = 0;
@@ -287,31 +283,31 @@ pdf_resources_use_blending(pdf_document *doc, pdf_obj *rdb)
return 0;
/* Have we been here before and remembered an answer? */
- if (pdf_obj_memo(rdb, &useBM))
+ if (pdf_obj_memo(ctx, rdb, &useBM))
return useBM;
/* stop on cyclic resource dependencies */
- if (pdf_mark_obj(rdb))
+ if (pdf_mark_obj(ctx, rdb))
return 0;
fz_try(ctx)
{
- obj = pdf_dict_gets(rdb, "ExtGState");
- n = pdf_dict_len(obj);
+ obj = pdf_dict_gets(ctx, rdb, "ExtGState");
+ n = pdf_dict_len(ctx, obj);
for (i = 0; i < n; i++)
- if (pdf_extgstate_uses_blending(doc, pdf_dict_get_val(obj, i)))
+ if (pdf_extgstate_uses_blending(ctx, doc, pdf_dict_get_val(ctx, obj, i)))
goto found;
- obj = pdf_dict_gets(rdb, "Pattern");
- n = pdf_dict_len(obj);
+ obj = pdf_dict_gets(ctx, rdb, "Pattern");
+ n = pdf_dict_len(ctx, obj);
for (i = 0; i < n; i++)
- if (pdf_pattern_uses_blending(doc, pdf_dict_get_val(obj, i)))
+ if (pdf_pattern_uses_blending(ctx, doc, pdf_dict_get_val(ctx, obj, i)))
goto found;
- obj = pdf_dict_gets(rdb, "XObject");
- n = pdf_dict_len(obj);
+ obj = pdf_dict_gets(ctx, rdb, "XObject");
+ n = pdf_dict_len(ctx, obj);
for (i = 0; i < n; i++)
- if (pdf_xobject_uses_blending(doc, pdf_dict_get_val(obj, i)))
+ if (pdf_xobject_uses_blending(ctx, doc, pdf_dict_get_val(ctx, obj, i)))
goto found;
if (0)
{
@@ -321,36 +317,36 @@ found:
}
fz_always(ctx)
{
- pdf_unmark_obj(rdb);
+ pdf_unmark_obj(ctx, rdb);
}
fz_catch(ctx)
{
fz_rethrow(ctx);
}
- pdf_set_obj_memo(rdb, useBM);
+ pdf_set_obj_memo(ctx, rdb, useBM);
return useBM;
}
static void
-pdf_load_transition(pdf_document *doc, pdf_page *page, pdf_obj *transdict)
+pdf_load_transition(fz_context *ctx, pdf_document *doc, pdf_page *page, pdf_obj *transdict)
{
char *name;
pdf_obj *obj;
int type;
- obj = pdf_dict_gets(transdict, "D");
- page->transition.duration = (obj ? pdf_to_real(obj) : 1);
+ obj = pdf_dict_gets(ctx, transdict, "D");
+ page->transition.duration = (obj ? pdf_to_real(ctx, obj) : 1);
- page->transition.vertical = (pdf_to_name(pdf_dict_gets(transdict, "Dm"))[0] != 'H');
- page->transition.outwards = (pdf_to_name(pdf_dict_gets(transdict, "M"))[0] != 'I');
+ page->transition.vertical = (pdf_to_name(ctx, pdf_dict_gets(ctx, transdict, "Dm"))[0] != 'H');
+ page->transition.outwards = (pdf_to_name(ctx, pdf_dict_gets(ctx, transdict, "M"))[0] != 'I');
/* FIXME: If 'Di' is None, it should be handled differently, but
* this only affects Fly, and we don't implement that currently. */
- page->transition.direction = (pdf_to_int(pdf_dict_gets(transdict, "Di")));
+ page->transition.direction = (pdf_to_int(ctx, pdf_dict_gets(ctx, transdict, "Di")));
/* FIXME: Read SS for Fly when we implement it */
/* FIXME: Read B for Fly when we implement it */
- name = pdf_to_name(pdf_dict_gets(transdict, "S"));
+ name = pdf_to_name(ctx, pdf_dict_gets(ctx, transdict, "S"));
if (!strcmp(name, "Split"))
type = FZ_TRANSITION_SPLIT;
else if (!strcmp(name, "Blinds"))
@@ -378,10 +374,55 @@ pdf_load_transition(pdf_document *doc, pdf_page *page, pdf_obj *transdict)
page->transition.type = type;
}
+fz_rect *
+pdf_bound_page(fz_context *ctx, pdf_page *page, fz_rect *bounds)
+{
+ fz_matrix mtx;
+ fz_rect mediabox = page->mediabox;
+ fz_transform_rect(&mediabox, fz_rotate(&mtx, page->rotate));
+ bounds->x0 = bounds->y0 = 0;
+ bounds->x1 = mediabox.x1 - mediabox.x0;
+ bounds->y1 = mediabox.y1 - mediabox.y0;
+ return bounds;
+}
+
+fz_link *
+pdf_load_links(fz_context *ctx, pdf_page *page)
+{
+ return fz_keep_link(ctx, page->links);
+}
+
+static void
+pdf_drop_page_imp(fz_context *ctx, pdf_page *page)
+{
+ pdf_document *doc = page->doc;
+
+ if (page == NULL)
+ return;
+
+ pdf_drop_obj(ctx, page->resources);
+ pdf_drop_obj(ctx, page->contents);
+ if (page->links)
+ fz_drop_link(ctx, page->links);
+ if (page->annots)
+ pdf_drop_annot(ctx, page->annots);
+ if (page->deleted_annots)
+ pdf_drop_annot(ctx, page->deleted_annots);
+ if (page->tmp_annots)
+ pdf_drop_annot(ctx, page->tmp_annots);
+ /* doc->focus, when not NULL, refers to one of
+ * the annotations and must be NULLed when the
+ * annotations are destroyed. doc->focus_obj
+ * keeps track of the actual annotation object. */
+ doc->focus = NULL;
+ pdf_drop_obj(ctx, page->me);
+
+ fz_drop_document(ctx, &page->doc->super);
+}
+
pdf_page *
-pdf_load_page(pdf_document *doc, int number)
+pdf_load_page(fz_context *ctx, pdf_document *doc, int number)
{
- fz_context *ctx = doc->ctx;
pdf_page *page;
pdf_annot *annot;
pdf_obj *pageobj, *pageref, *obj;
@@ -391,15 +432,27 @@ pdf_load_page(pdf_document *doc, int number)
if (doc->file_reading_linearly)
{
- pageref = pdf_progressive_advance(doc, number);
+ pageref = pdf_progressive_advance(ctx, doc, number);
if (pageref == NULL)
- fz_throw(doc->ctx, FZ_ERROR_TRYLATER, "page %d not available yet", number);
+ fz_throw(ctx, FZ_ERROR_TRYLATER, "page %d not available yet", number);
}
else
- pageref = pdf_lookup_page_obj(doc, number);
- pageobj = pdf_resolve_indirect(pageref);
+ pageref = pdf_lookup_page_obj(ctx, doc, number);
+ pageobj = pdf_resolve_indirect(ctx, pageref);
page = fz_malloc_struct(ctx, pdf_page);
+ page->doc = (pdf_document*) fz_keep_document(ctx, &doc->super);
+
+ page->super.drop_page_imp = (fz_page_drop_page_imp_fn *)pdf_drop_page_imp;
+ page->super.load_links = (fz_page_load_links_fn *)pdf_load_links;
+ page->super.bound_page = (fz_page_bound_page_fn *)pdf_bound_page;
+ page->super.first_annot = (fz_page_first_annot_fn *)pdf_first_annot;
+ page->super.next_annot = (fz_page_next_annot_fn *)pdf_next_annot;
+ page->super.bound_annot = (fz_page_bound_annot_fn *)pdf_bound_annot;
+ page->super.run_page_contents = (fz_page_run_page_contents_fn *)pdf_run_page_contents;
+ page->super.run_annot = (fz_page_run_annot_fn *)pdf_run_annot;
+ page->super.page_presentation = (fz_page_page_presentation_fn *)pdf_page_presentation;
+
page->resources = NULL;
page->contents = NULL;
page->transparency = 0;
@@ -408,16 +461,16 @@ pdf_load_page(pdf_document *doc, int number)
page->annot_tailp = &page->annots;
page->deleted_annots = NULL;
page->tmp_annots = NULL;
- page->me = pdf_keep_obj(pageobj);
+ page->me = pdf_keep_obj(ctx, pageobj);
page->incomplete = 0;
- obj = pdf_dict_gets(pageobj, "UserUnit");
- if (pdf_is_real(obj))
- userunit = pdf_to_real(obj);
+ obj = pdf_dict_gets(ctx, pageobj, "UserUnit");
+ if (pdf_is_real(ctx, obj))
+ userunit = pdf_to_real(ctx, obj);
else
userunit = 1;
- pdf_to_rect(ctx, pdf_lookup_inherited_page_item(doc, pageobj, "MediaBox"), &mediabox);
+ pdf_to_rect(ctx, pdf_lookup_inherited_page_item(ctx, doc, pageobj, "MediaBox"), &mediabox);
if (fz_is_empty_rect(&mediabox))
{
fz_warn(ctx, "cannot find page size for page %d", number + 1);
@@ -427,7 +480,7 @@ pdf_load_page(pdf_document *doc, int number)
mediabox.y1 = 792;
}
- pdf_to_rect(ctx, pdf_lookup_inherited_page_item(doc, pageobj, "CropBox"), &cropbox);
+ pdf_to_rect(ctx, pdf_lookup_inherited_page_item(ctx, doc, pageobj, "CropBox"), &cropbox);
if (!fz_is_empty_rect(&cropbox))
fz_intersect_rect(&mediabox, &cropbox);
@@ -442,7 +495,7 @@ pdf_load_page(pdf_document *doc, int number)
page->mediabox = fz_unit_rect;
}
- page->rotate = pdf_to_int(pdf_lookup_inherited_page_item(doc, pageobj, "Rotate"));
+ page->rotate = pdf_to_int(ctx, pdf_lookup_inherited_page_item(ctx, doc, pageobj, "Rotate"));
/* Snap page->rotate to 0, 90, 180 or 270 */
if (page->rotate < 0)
page->rotate = 360 - ((-page->rotate) % 360);
@@ -460,11 +513,11 @@ pdf_load_page(pdf_document *doc, int number)
fz_try(ctx)
{
- obj = pdf_dict_gets(pageobj, "Annots");
+ obj = pdf_dict_gets(ctx, pageobj, "Annots");
if (obj)
{
- page->links = pdf_load_link_annots(doc, obj, &page->ctm);
- pdf_load_annots(doc, page, obj);
+ page->links = pdf_load_link_annots(ctx, doc, obj, &page->ctm);
+ pdf_load_annots(ctx, doc, page, obj);
}
}
fz_catch(ctx)
@@ -476,40 +529,40 @@ pdf_load_page(pdf_document *doc, int number)
page->links = NULL;
}
- page->duration = pdf_to_real(pdf_dict_gets(pageobj, "Dur"));
+ page->duration = pdf_to_real(ctx, pdf_dict_gets(ctx, pageobj, "Dur"));
- obj = pdf_dict_gets(pageobj, "Trans");
+ obj = pdf_dict_gets(ctx, pageobj, "Trans");
page->transition_present = (obj != NULL);
if (obj)
{
- pdf_load_transition(doc, page, obj);
+ pdf_load_transition(ctx, doc, page, obj);
}
// TODO: inherit
- page->resources = pdf_lookup_inherited_page_item(doc, pageobj, "Resources");
+ page->resources = pdf_lookup_inherited_page_item(ctx, doc, pageobj, "Resources");
if (page->resources)
- pdf_keep_obj(page->resources);
+ pdf_keep_obj(ctx, page->resources);
- obj = pdf_dict_gets(pageobj, "Contents");
+ obj = pdf_dict_gets(ctx, pageobj, "Contents");
fz_try(ctx)
{
- page->contents = pdf_keep_obj(obj);
+ page->contents = pdf_keep_obj(ctx, obj);
- if (pdf_resources_use_blending(doc, page->resources))
+ if (pdf_resources_use_blending(ctx, doc, page->resources))
page->transparency = 1;
- else if (!strcmp(pdf_to_name(pdf_dict_getp(pageobj, "Group/S")), "Transparency"))
+ else if (!strcmp(pdf_to_name(ctx, pdf_dict_getp(ctx, pageobj, "Group/S")), "Transparency"))
page->transparency = 1;
for (annot = page->annots; annot && !page->transparency; annot = annot->next)
- if (annot->ap && pdf_resources_use_blending(doc, annot->ap->resources))
+ if (annot->ap && pdf_resources_use_blending(ctx, doc, annot->ap->resources))
page->transparency = 1;
}
fz_catch(ctx)
{
if (fz_caught(ctx) != FZ_ERROR_TRYLATER)
{
- pdf_drop_page(doc, page);
- fz_rethrow_message(ctx, "cannot load page %d contents (%d 0 R)", number + 1, pdf_to_num(pageref));
+ fz_drop_page(ctx, &page->super);
+ fz_rethrow_message(ctx, "cannot load page %d contents (%d 0 R)", number + 1, pdf_to_num(ctx, pageref));
}
page->incomplete |= PDF_PAGE_INCOMPLETE_CONTENTS;
}
@@ -517,93 +570,50 @@ pdf_load_page(pdf_document *doc, int number)
return page;
}
-fz_rect *
-pdf_bound_page(pdf_document *doc, pdf_page *page, fz_rect *bounds)
-{
- fz_matrix mtx;
- fz_rect mediabox = page->mediabox;
- fz_transform_rect(&mediabox, fz_rotate(&mtx, page->rotate));
- bounds->x0 = bounds->y0 = 0;
- bounds->x1 = mediabox.x1 - mediabox.x0;
- bounds->y1 = mediabox.y1 - mediabox.y0;
- return bounds;
-}
-
-fz_link *
-pdf_load_links(pdf_document *doc, pdf_page *page)
-{
- return fz_keep_link(doc->ctx, page->links);
-}
-
-void
-pdf_drop_page(pdf_document *doc, pdf_page *page)
-{
- if (page == NULL)
- return;
- pdf_drop_obj(page->resources);
- pdf_drop_obj(page->contents);
- if (page->links)
- fz_drop_link(doc->ctx, page->links);
- if (page->annots)
- pdf_drop_annot(doc->ctx, page->annots);
- if (page->deleted_annots)
- pdf_drop_annot(doc->ctx, page->deleted_annots);
- if (page->tmp_annots)
- pdf_drop_annot(doc->ctx, page->tmp_annots);
- /* doc->focus, when not NULL, refers to one of
- * the annotations and must be NULLed when the
- * annotations are destroyed. doc->focus_obj
- * keeps track of the actual annotation object. */
- doc->focus = NULL;
- pdf_drop_obj(page->me);
- fz_free(doc->ctx, page);
-}
-
void
-pdf_delete_page(pdf_document *doc, int at)
+pdf_delete_page(fz_context *ctx, pdf_document *doc, int at)
{
pdf_obj *parent, *kids;
int i;
- pdf_lookup_page_loc(doc, at, &parent, &i);
- kids = pdf_dict_gets(parent, "Kids");
- pdf_array_delete(kids, i);
+ pdf_lookup_page_loc(ctx, doc, at, &parent, &i);
+ kids = pdf_dict_gets(ctx, parent, "Kids");
+ pdf_array_delete(ctx, kids, i);
while (parent)
{
- int count = pdf_to_int(pdf_dict_gets(parent, "Count"));
- pdf_dict_puts_drop(parent, "Count", pdf_new_int(doc, count - 1));
- parent = pdf_dict_gets(parent, "Parent");
+ int count = pdf_to_int(ctx, pdf_dict_gets(ctx, parent, "Count"));
+ pdf_dict_puts_drop(ctx, parent, "Count", pdf_new_int(ctx, doc, count - 1));
+ parent = pdf_dict_gets(ctx, parent, "Parent");
}
doc->page_count = 0; /* invalidate cached value */
}
void
-pdf_insert_page(pdf_document *doc, pdf_page *page, int at)
+pdf_insert_page(fz_context *ctx, pdf_document *doc, pdf_page *page, int at)
{
- fz_context *ctx = doc->ctx;
- int count = pdf_count_pages(doc);
+ int count = pdf_count_pages(ctx, doc);
pdf_obj *parent, *kids;
pdf_obj *page_ref;
int i;
- page_ref = pdf_new_ref(doc, page->me);
+ page_ref = pdf_new_ref(ctx, doc, page->me);
fz_try(ctx)
{
if (count == 0)
{
- pdf_obj *root = pdf_dict_gets(pdf_trailer(doc), "Root");
- parent = pdf_dict_gets(root, "Pages");
+ pdf_obj *root = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Root");
+ parent = pdf_dict_gets(ctx, root, "Pages");
if (!parent)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "cannot find page tree");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find page tree");
- kids = pdf_dict_gets(parent, "Kids");
+ kids = pdf_dict_gets(ctx, parent, "Kids");
if (!kids)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "malformed page tree");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "malformed page tree");
- pdf_array_insert(kids, page_ref, 0);
+ pdf_array_insert(ctx, kids, page_ref, 0);
}
else if (at >= count)
{
@@ -614,32 +624,32 @@ pdf_insert_page(pdf_document *doc, pdf_page *page, int at)
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot insert page beyond end of page tree");
/* append after last page */
- pdf_lookup_page_loc(doc, count - 1, &parent, &i);
- kids = pdf_dict_gets(parent, "Kids");
- pdf_array_insert(kids, page_ref, i + 1);
+ pdf_lookup_page_loc(ctx, doc, count - 1, &parent, &i);
+ kids = pdf_dict_gets(ctx, parent, "Kids");
+ pdf_array_insert(ctx, kids, page_ref, i + 1);
}
else
{
/* insert before found page */
- pdf_lookup_page_loc(doc, at, &parent, &i);
- kids = pdf_dict_gets(parent, "Kids");
- pdf_array_insert(kids, page_ref, i);
+ pdf_lookup_page_loc(ctx, doc, at, &parent, &i);
+ kids = pdf_dict_gets(ctx, parent, "Kids");
+ pdf_array_insert(ctx, kids, page_ref, i);
}
- pdf_dict_puts(page->me, "Parent", parent);
+ pdf_dict_puts(ctx, page->me, "Parent", parent);
/* Adjust page counts */
while (parent)
{
- int count = pdf_to_int(pdf_dict_gets(parent, "Count"));
- pdf_dict_puts_drop(parent, "Count", pdf_new_int(doc, count + 1));
- parent = pdf_dict_gets(parent, "Parent");
+ int count = pdf_to_int(ctx, pdf_dict_gets(ctx, parent, "Count"));
+ pdf_dict_puts_drop(ctx, parent, "Count", pdf_new_int(ctx, doc, count + 1));
+ parent = pdf_dict_gets(ctx, parent, "Parent");
}
}
fz_always(ctx)
{
- pdf_drop_obj(page_ref);
+ pdf_drop_obj(ctx, page_ref);
}
fz_catch(ctx)
{
@@ -650,19 +660,18 @@ pdf_insert_page(pdf_document *doc, pdf_page *page, int at)
}
void
-pdf_delete_page_range(pdf_document *doc, int start, int end)
+pdf_delete_page_range(fz_context *ctx, pdf_document *doc, int start, int end)
{
while (start < end)
- pdf_delete_page(doc, start++);
+ pdf_delete_page(ctx, doc, start++);
}
pdf_page *
-pdf_create_page(pdf_document *doc, fz_rect mediabox, int res, int rotate)
+pdf_create_page(fz_context *ctx, pdf_document *doc, fz_rect mediabox, int res, int rotate)
{
pdf_page *page = NULL;
pdf_obj *pageobj;
float userunit = 1;
- fz_context *ctx = doc->ctx;
fz_matrix ctm, tmp;
fz_rect realbox;
@@ -675,15 +684,15 @@ pdf_create_page(pdf_document *doc, fz_rect mediabox, int res, int rotate)
page->transparency = 0;
page->links = NULL;
page->annots = NULL;
- page->me = pageobj = pdf_new_dict(doc, 4);
+ page->me = pageobj = pdf_new_dict(ctx, doc, 4);
- pdf_dict_puts_drop(pageobj, "Type", pdf_new_name(doc, "Page"));
+ pdf_dict_puts_drop(ctx, pageobj, "Type", pdf_new_name(ctx, doc, "Page"));
page->mediabox.x0 = fz_min(mediabox.x0, mediabox.x1) * userunit;
page->mediabox.y0 = fz_min(mediabox.y0, mediabox.y1) * userunit;
page->mediabox.x1 = fz_max(mediabox.x0, mediabox.x1) * userunit;
page->mediabox.y1 = fz_max(mediabox.y0, mediabox.y1) * userunit;
- pdf_dict_puts_drop(pageobj, "MediaBox", pdf_new_rect(doc, &page->mediabox));
+ pdf_dict_puts_drop(ctx, pageobj, "MediaBox", pdf_new_rect(ctx, doc, &page->mediabox));
/* Snap page->rotate to 0, 90, 180 or 270 */
if (page->rotate < 0)
@@ -693,7 +702,7 @@ pdf_create_page(pdf_document *doc, fz_rect mediabox, int res, int rotate)
page->rotate = 90*((page->rotate + 45)/90);
if (page->rotate > 360)
page->rotate = 0;
- pdf_dict_puts_drop(pageobj, "Rotate", pdf_new_int(doc, page->rotate));
+ pdf_dict_puts_drop(ctx, pageobj, "Rotate", pdf_new_int(ctx, doc, page->rotate));
fz_pre_rotate(fz_scale(&ctm, 1, -1), -page->rotate);
realbox = page->mediabox;
@@ -706,7 +715,7 @@ pdf_create_page(pdf_document *doc, fz_rect mediabox, int res, int rotate)
}
fz_catch(ctx)
{
- pdf_drop_obj(page->me);
+ pdf_drop_obj(ctx, page->me);
fz_free(ctx, page);
fz_rethrow_message(ctx, "Failed to create page");
}
diff --git a/source/pdf/pdf-parse.c b/source/pdf/pdf-parse.c
index a2fd09db..48761374 100644
--- a/source/pdf/pdf-parse.c
+++ b/source/pdf/pdf-parse.c
@@ -3,10 +3,10 @@
fz_rect *
pdf_to_rect(fz_context *ctx, pdf_obj *array, fz_rect *r)
{
- float a = pdf_to_real(pdf_array_get(array, 0));
- float b = pdf_to_real(pdf_array_get(array, 1));
- float c = pdf_to_real(pdf_array_get(array, 2));
- float d = pdf_to_real(pdf_array_get(array, 3));
+ float a = pdf_to_real(ctx, pdf_array_get(ctx, array, 0));
+ float b = pdf_to_real(ctx, pdf_array_get(ctx, array, 1));
+ float c = pdf_to_real(ctx, pdf_array_get(ctx, array, 2));
+ float d = pdf_to_real(ctx, pdf_array_get(ctx, array, 3));
r->x0 = fz_min(a, c);
r->y0 = fz_min(b, d);
r->x1 = fz_max(a, c);
@@ -17,20 +17,19 @@ pdf_to_rect(fz_context *ctx, pdf_obj *array, fz_rect *r)
fz_matrix *
pdf_to_matrix(fz_context *ctx, pdf_obj *array, fz_matrix *m)
{
- m->a = pdf_to_real(pdf_array_get(array, 0));
- m->b = pdf_to_real(pdf_array_get(array, 1));
- m->c = pdf_to_real(pdf_array_get(array, 2));
- m->d = pdf_to_real(pdf_array_get(array, 3));
- m->e = pdf_to_real(pdf_array_get(array, 4));
- m->f = pdf_to_real(pdf_array_get(array, 5));
+ m->a = pdf_to_real(ctx, pdf_array_get(ctx, array, 0));
+ m->b = pdf_to_real(ctx, pdf_array_get(ctx, array, 1));
+ m->c = pdf_to_real(ctx, pdf_array_get(ctx, array, 2));
+ m->d = pdf_to_real(ctx, pdf_array_get(ctx, array, 3));
+ m->e = pdf_to_real(ctx, pdf_array_get(ctx, array, 4));
+ m->f = pdf_to_real(ctx, pdf_array_get(ctx, array, 5));
return m;
}
/* Convert Unicode/PdfDocEncoding string into utf-8 */
char *
-pdf_to_utf8(pdf_document *doc, pdf_obj *src)
+pdf_to_utf8(fz_context *ctx, pdf_document *doc, pdf_obj *src)
{
- fz_context *ctx = doc->ctx;
fz_buffer *strmbuf = NULL;
unsigned char *srcptr;
char *dstptr, *dst;
@@ -42,14 +41,14 @@ pdf_to_utf8(pdf_document *doc, pdf_obj *src)
fz_var(strmbuf);
fz_try(ctx)
{
- if (pdf_is_string(src))
+ if (pdf_is_string(ctx, src))
{
- srcptr = (unsigned char *) pdf_to_str_buf(src);
- srclen = pdf_to_str_len(src);
+ srcptr = (unsigned char *) pdf_to_str_buf(ctx, src);
+ srclen = pdf_to_str_len(ctx, src);
}
- else if (pdf_is_stream(doc, pdf_to_num(src), pdf_to_gen(src)))
+ else if (pdf_is_stream(ctx, doc, pdf_to_num(ctx, src), pdf_to_gen(ctx, src)))
{
- strmbuf = pdf_load_stream(doc, pdf_to_num(src), pdf_to_gen(src));
+ strmbuf = pdf_load_stream(ctx, doc, pdf_to_num(ctx, src), pdf_to_gen(ctx, src));
srclen = fz_buffer_storage(ctx, strmbuf, (unsigned char **)&srcptr);
}
else
@@ -118,12 +117,11 @@ pdf_to_utf8(pdf_document *doc, pdf_obj *src)
/* Convert Unicode/PdfDocEncoding string into ucs-2 */
unsigned short *
-pdf_to_ucs2(pdf_document *doc, pdf_obj *src)
+pdf_to_ucs2(fz_context *ctx, pdf_document *doc, pdf_obj *src)
{
- fz_context *ctx = doc->ctx;
- unsigned char *srcptr = (unsigned char *) pdf_to_str_buf(src);
+ unsigned char *srcptr = (unsigned char *) pdf_to_str_buf(ctx, src);
unsigned short *dstptr, *dst;
- int srclen = pdf_to_str_len(src);
+ int srclen = pdf_to_str_len(ctx, src);
int i;
if (srclen >= 2 && srcptr[0] == 254 && srcptr[1] == 255)
@@ -152,11 +150,11 @@ pdf_to_ucs2(pdf_document *doc, pdf_obj *src)
/* allow to convert to UCS-2 without the need for an fz_context */
/* (buffer must be at least (fz_to_str_len(src) + 1) * 2 bytes in size) */
void
-pdf_to_ucs2_buf(unsigned short *buffer, pdf_obj *src)
+pdf_to_ucs2_buf(fz_context *ctx, unsigned short *buffer, pdf_obj *src)
{
- unsigned char *srcptr = (unsigned char *) pdf_to_str_buf(src);
+ unsigned char *srcptr = (unsigned char *) pdf_to_str_buf(ctx, src);
unsigned short *dstptr = buffer;
- int srclen = pdf_to_str_len(src);
+ int srclen = pdf_to_str_len(ctx, src);
int i;
if (srclen >= 2 && srcptr[0] == 254 && srcptr[1] == 255)
@@ -180,9 +178,8 @@ pdf_to_ucs2_buf(unsigned short *buffer, pdf_obj *src)
/* Convert UCS-2 string into PdfDocEncoding for authentication */
char *
-pdf_from_ucs2(pdf_document *doc, unsigned short *src)
+pdf_from_ucs2(fz_context *ctx, pdf_document *doc, unsigned short *src)
{
- fz_context *ctx = doc->ctx;
int i, j, len;
char *docstr;
@@ -219,48 +216,47 @@ pdf_from_ucs2(pdf_document *doc, unsigned short *src)
}
pdf_obj *
-pdf_to_utf8_name(pdf_document *doc, pdf_obj *src)
+pdf_to_utf8_name(fz_context *ctx, pdf_document *doc, pdf_obj *src)
{
- char *buf = pdf_to_utf8(doc, src);
- pdf_obj *dst = pdf_new_name(doc, buf);
- fz_free(doc->ctx, buf);
+ char *buf = pdf_to_utf8(ctx, doc, src);
+ pdf_obj *dst = pdf_new_name(ctx, doc, buf);
+ fz_free(ctx, buf);
return dst;
}
pdf_obj *
-pdf_parse_array(pdf_document *doc, fz_stream *file, pdf_lexbuf *buf)
+pdf_parse_array(fz_context *ctx, pdf_document *doc, fz_stream *file, pdf_lexbuf *buf)
{
pdf_obj *ary = NULL;
pdf_obj *obj = NULL;
int a = 0, b = 0, n = 0;
pdf_token tok;
- fz_context *ctx = file->ctx;
pdf_obj *op = NULL;
fz_var(obj);
- ary = pdf_new_array(doc, 4);
+ ary = pdf_new_array(ctx, doc, 4);
fz_try(ctx)
{
while (1)
{
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
if (tok != PDF_TOK_INT && tok != PDF_TOK_R)
{
if (n > 0)
{
- obj = pdf_new_int(doc, a);
- pdf_array_push(ary, obj);
- pdf_drop_obj(obj);
+ obj = pdf_new_int(ctx, doc, a);
+ pdf_array_push(ctx, ary, obj);
+ pdf_drop_obj(ctx, obj);
obj = NULL;
}
if (n > 1)
{
- obj = pdf_new_int(doc, b);
- pdf_array_push(ary, obj);
- pdf_drop_obj(obj);
+ obj = pdf_new_int(ctx, doc, b);
+ pdf_array_push(ctx, ary, obj);
+ pdf_drop_obj(ctx, obj);
obj = NULL;
}
n = 0;
@@ -268,9 +264,9 @@ pdf_parse_array(pdf_document *doc, fz_stream *file, pdf_lexbuf *buf)
if (tok == PDF_TOK_INT && n == 2)
{
- obj = pdf_new_int(doc, a);
- pdf_array_push(ary, obj);
- pdf_drop_obj(obj);
+ obj = pdf_new_int(ctx, doc, a);
+ pdf_array_push(ctx, ary, obj);
+ pdf_drop_obj(ctx, obj);
obj = NULL;
a = b;
n --;
@@ -293,61 +289,61 @@ pdf_parse_array(pdf_document *doc, fz_stream *file, pdf_lexbuf *buf)
case PDF_TOK_R:
if (n != 2)
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot parse indirect reference in array");
- obj = pdf_new_indirect(doc, a, b);
- pdf_array_push(ary, obj);
- pdf_drop_obj(obj);
+ obj = pdf_new_indirect(ctx, doc, a, b);
+ pdf_array_push(ctx, ary, obj);
+ pdf_drop_obj(ctx, obj);
obj = NULL;
n = 0;
break;
case PDF_TOK_OPEN_ARRAY:
- obj = pdf_parse_array(doc, file, buf);
- pdf_array_push(ary, obj);
- pdf_drop_obj(obj);
+ obj = pdf_parse_array(ctx, doc, file, buf);
+ pdf_array_push(ctx, ary, obj);
+ pdf_drop_obj(ctx, obj);
obj = NULL;
break;
case PDF_TOK_OPEN_DICT:
- obj = pdf_parse_dict(doc, file, buf);
- pdf_array_push(ary, obj);
- pdf_drop_obj(obj);
+ obj = pdf_parse_dict(ctx, doc, file, buf);
+ pdf_array_push(ctx, ary, obj);
+ pdf_drop_obj(ctx, obj);
obj = NULL;
break;
case PDF_TOK_NAME:
- obj = pdf_new_name(doc, buf->scratch);
- pdf_array_push(ary, obj);
- pdf_drop_obj(obj);
+ obj = pdf_new_name(ctx, doc, buf->scratch);
+ pdf_array_push(ctx, ary, obj);
+ pdf_drop_obj(ctx, obj);
obj = NULL;
break;
case PDF_TOK_REAL:
- obj = pdf_new_real(doc, buf->f);
- pdf_array_push(ary, obj);
- pdf_drop_obj(obj);
+ obj = pdf_new_real(ctx, doc, buf->f);
+ pdf_array_push(ctx, ary, obj);
+ pdf_drop_obj(ctx, obj);
obj = NULL;
break;
case PDF_TOK_STRING:
- obj = pdf_new_string(doc, buf->scratch, buf->len);
- pdf_array_push(ary, obj);
- pdf_drop_obj(obj);
+ obj = pdf_new_string(ctx, doc, buf->scratch, buf->len);
+ pdf_array_push(ctx, ary, obj);
+ pdf_drop_obj(ctx, obj);
obj = NULL;
break;
case PDF_TOK_TRUE:
- obj = pdf_new_bool(doc, 1);
- pdf_array_push(ary, obj);
- pdf_drop_obj(obj);
+ obj = pdf_new_bool(ctx, doc, 1);
+ pdf_array_push(ctx, ary, obj);
+ pdf_drop_obj(ctx, obj);
obj = NULL;
break;
case PDF_TOK_FALSE:
- obj = pdf_new_bool(doc, 0);
- pdf_array_push(ary, obj);
- pdf_drop_obj(obj);
+ obj = pdf_new_bool(ctx, doc, 0);
+ pdf_array_push(ctx, ary, obj);
+ pdf_drop_obj(ctx, obj);
obj = NULL;
break;
case PDF_TOK_NULL:
- obj = pdf_new_null(doc);
- pdf_array_push(ary, obj);
- pdf_drop_obj(obj);
+ obj = pdf_new_null(ctx, doc);
+ pdf_array_push(ctx, ary, obj);
+ pdf_drop_obj(ctx, obj);
obj = NULL;
break;
@@ -360,24 +356,23 @@ end:
}
fz_catch(ctx)
{
- pdf_drop_obj(obj);
- pdf_drop_obj(ary);
+ pdf_drop_obj(ctx, obj);
+ pdf_drop_obj(ctx, ary);
fz_rethrow_message(ctx, "cannot parse array");
}
return op;
}
pdf_obj *
-pdf_parse_dict(pdf_document *doc, fz_stream *file, pdf_lexbuf *buf)
+pdf_parse_dict(fz_context *ctx, pdf_document *doc, fz_stream *file, pdf_lexbuf *buf)
{
pdf_obj *dict;
pdf_obj *key = NULL;
pdf_obj *val = NULL;
pdf_token tok;
int a, b;
- fz_context *ctx = file->ctx;
- dict = pdf_new_dict(doc, 8);
+ dict = pdf_new_dict(ctx, doc, 8);
fz_var(key);
fz_var(val);
@@ -386,7 +381,7 @@ pdf_parse_dict(pdf_document *doc, fz_stream *file, pdf_lexbuf *buf)
{
while (1)
{
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
skip:
if (tok == PDF_TOK_CLOSE_DICT)
break;
@@ -398,49 +393,49 @@ pdf_parse_dict(pdf_document *doc, fz_stream *file, pdf_lexbuf *buf)
if (tok != PDF_TOK_NAME)
fz_throw(ctx, FZ_ERROR_GENERIC, "invalid key in dict");
- key = pdf_new_name(doc, buf->scratch);
+ key = pdf_new_name(ctx, doc, buf->scratch);
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
switch (tok)
{
case PDF_TOK_OPEN_ARRAY:
- val = pdf_parse_array(doc, file, buf);
+ val = pdf_parse_array(ctx, doc, file, buf);
break;
case PDF_TOK_OPEN_DICT:
- val = pdf_parse_dict(doc, file, buf);
+ val = pdf_parse_dict(ctx, doc, file, buf);
break;
- case PDF_TOK_NAME: val = pdf_new_name(doc, buf->scratch); break;
- case PDF_TOK_REAL: val = pdf_new_real(doc, buf->f); break;
- case PDF_TOK_STRING: val = pdf_new_string(doc, buf->scratch, buf->len); break;
- case PDF_TOK_TRUE: val = pdf_new_bool(doc, 1); break;
- case PDF_TOK_FALSE: val = pdf_new_bool(doc, 0); break;
- case PDF_TOK_NULL: val = pdf_new_null(doc); break;
+ case PDF_TOK_NAME: val = pdf_new_name(ctx, doc, buf->scratch); break;
+ case PDF_TOK_REAL: val = pdf_new_real(ctx, doc, buf->f); break;
+ case PDF_TOK_STRING: val = pdf_new_string(ctx, doc, buf->scratch, buf->len); break;
+ case PDF_TOK_TRUE: val = pdf_new_bool(ctx, doc, 1); break;
+ case PDF_TOK_FALSE: val = pdf_new_bool(ctx, doc, 0); break;
+ case PDF_TOK_NULL: val = pdf_new_null(ctx, doc); break;
case PDF_TOK_INT:
/* 64-bit to allow for numbers > INT_MAX and overflow */
a = buf->i;
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
if (tok == PDF_TOK_CLOSE_DICT || tok == PDF_TOK_NAME ||
(tok == PDF_TOK_KEYWORD && !strcmp(buf->scratch, "ID")))
{
- val = pdf_new_int(doc, a);
- pdf_dict_put(dict, key, val);
- pdf_drop_obj(val);
+ val = pdf_new_int(ctx, doc, a);
+ pdf_dict_put(ctx, dict, key, val);
+ pdf_drop_obj(ctx, val);
val = NULL;
- pdf_drop_obj(key);
+ pdf_drop_obj(ctx, key);
key = NULL;
goto skip;
}
if (tok == PDF_TOK_INT)
{
b = buf->i;
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
if (tok == PDF_TOK_R)
{
- val = pdf_new_indirect(doc, a, b);
+ val = pdf_new_indirect(ctx, doc, a, b);
break;
}
}
@@ -450,50 +445,49 @@ pdf_parse_dict(pdf_document *doc, fz_stream *file, pdf_lexbuf *buf)
fz_throw(ctx, FZ_ERROR_GENERIC, "unknown token in dict");
}
- pdf_dict_put(dict, key, val);
- pdf_drop_obj(val);
+ pdf_dict_put(ctx, dict, key, val);
+ pdf_drop_obj(ctx, val);
val = NULL;
- pdf_drop_obj(key);
+ pdf_drop_obj(ctx, key);
key = NULL;
}
}
fz_catch(ctx)
{
- pdf_drop_obj(dict);
- pdf_drop_obj(key);
- pdf_drop_obj(val);
+ pdf_drop_obj(ctx, dict);
+ pdf_drop_obj(ctx, key);
+ pdf_drop_obj(ctx, val);
fz_rethrow_message(ctx, "cannot parse dict");
}
return dict;
}
pdf_obj *
-pdf_parse_stm_obj(pdf_document *doc, fz_stream *file, pdf_lexbuf *buf)
+pdf_parse_stm_obj(fz_context *ctx, pdf_document *doc, fz_stream *file, pdf_lexbuf *buf)
{
pdf_token tok;
- fz_context *ctx = file->ctx;
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
switch (tok)
{
case PDF_TOK_OPEN_ARRAY:
- return pdf_parse_array(doc, file, buf);
+ return pdf_parse_array(ctx, doc, file, buf);
case PDF_TOK_OPEN_DICT:
- return pdf_parse_dict(doc, file, buf);
- case PDF_TOK_NAME: return pdf_new_name(doc, buf->scratch); break;
- case PDF_TOK_REAL: return pdf_new_real(doc, buf->f); break;
- case PDF_TOK_STRING: return pdf_new_string(doc, buf->scratch, buf->len); break;
- case PDF_TOK_TRUE: return pdf_new_bool(doc, 1); break;
- case PDF_TOK_FALSE: return pdf_new_bool(doc, 0); break;
- case PDF_TOK_NULL: return pdf_new_null(doc); break;
- case PDF_TOK_INT: return pdf_new_int(doc, buf->i); break;
+ return pdf_parse_dict(ctx, doc, file, buf);
+ case PDF_TOK_NAME: return pdf_new_name(ctx, doc, buf->scratch); break;
+ case PDF_TOK_REAL: return pdf_new_real(ctx, doc, buf->f); break;
+ case PDF_TOK_STRING: return pdf_new_string(ctx, doc, buf->scratch, buf->len); break;
+ case PDF_TOK_TRUE: return pdf_new_bool(ctx, doc, 1); break;
+ case PDF_TOK_FALSE: return pdf_new_bool(ctx, doc, 0); break;
+ case PDF_TOK_NULL: return pdf_new_null(ctx, doc); break;
+ case PDF_TOK_INT: return pdf_new_int(ctx, doc, buf->i); break;
default: fz_throw(ctx, FZ_ERROR_GENERIC, "unknown token in object stream");
}
}
pdf_obj *
-pdf_parse_ind_obj(pdf_document *doc,
+pdf_parse_ind_obj(fz_context *ctx, pdf_document *doc,
fz_stream *file, pdf_lexbuf *buf,
int *onum, int *ogen, int *ostmofs, int *try_repair)
{
@@ -501,11 +495,10 @@ pdf_parse_ind_obj(pdf_document *doc,
int num = 0, gen = 0, stm_ofs;
pdf_token tok;
int a, b;
- fz_context *ctx = file->ctx;
fz_var(obj);
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
if (tok != PDF_TOK_INT)
{
if (try_repair)
@@ -514,7 +507,7 @@ pdf_parse_ind_obj(pdf_document *doc,
}
num = buf->i;
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
if (tok != PDF_TOK_INT)
{
if (try_repair)
@@ -523,7 +516,7 @@ pdf_parse_ind_obj(pdf_document *doc,
}
gen = buf->i;
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
if (tok != PDF_TOK_OBJ)
{
if (try_repair)
@@ -531,48 +524,48 @@ pdf_parse_ind_obj(pdf_document *doc,
fz_throw(ctx, FZ_ERROR_GENERIC, "expected 'obj' keyword (%d %d ?)", num, gen);
}
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
switch (tok)
{
case PDF_TOK_OPEN_ARRAY:
- obj = pdf_parse_array(doc, file, buf);
+ obj = pdf_parse_array(ctx, doc, file, buf);
break;
case PDF_TOK_OPEN_DICT:
- obj = pdf_parse_dict(doc, file, buf);
+ obj = pdf_parse_dict(ctx, doc, file, buf);
break;
- case PDF_TOK_NAME: obj = pdf_new_name(doc, buf->scratch); break;
- case PDF_TOK_REAL: obj = pdf_new_real(doc, buf->f); break;
- case PDF_TOK_STRING: obj = pdf_new_string(doc, buf->scratch, buf->len); break;
- case PDF_TOK_TRUE: obj = pdf_new_bool(doc, 1); break;
- case PDF_TOK_FALSE: obj = pdf_new_bool(doc, 0); break;
- case PDF_TOK_NULL: obj = pdf_new_null(doc); break;
+ case PDF_TOK_NAME: obj = pdf_new_name(ctx, doc, buf->scratch); break;
+ case PDF_TOK_REAL: obj = pdf_new_real(ctx, doc, buf->f); break;
+ case PDF_TOK_STRING: obj = pdf_new_string(ctx, doc, buf->scratch, buf->len); break;
+ case PDF_TOK_TRUE: obj = pdf_new_bool(ctx, doc, 1); break;
+ case PDF_TOK_FALSE: obj = pdf_new_bool(ctx, doc, 0); break;
+ case PDF_TOK_NULL: obj = pdf_new_null(ctx, doc); break;
case PDF_TOK_INT:
a = buf->i;
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
if (tok == PDF_TOK_STREAM || tok == PDF_TOK_ENDOBJ)
{
- obj = pdf_new_int(doc, a);
+ obj = pdf_new_int(ctx, doc, a);
goto skip;
}
if (tok == PDF_TOK_INT)
{
b = buf->i;
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
if (tok == PDF_TOK_R)
{
- obj = pdf_new_indirect(doc, a, b);
+ obj = pdf_new_indirect(ctx, doc, a, b);
break;
}
}
fz_throw(ctx, FZ_ERROR_GENERIC, "expected 'R' keyword (%d %d R)", num, gen);
case PDF_TOK_ENDOBJ:
- obj = pdf_new_null(doc);
+ obj = pdf_new_null(ctx, doc);
goto skip;
default:
@@ -581,29 +574,29 @@ pdf_parse_ind_obj(pdf_document *doc,
fz_try(ctx)
{
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
}
fz_catch(ctx)
{
- pdf_drop_obj(obj);
+ pdf_drop_obj(ctx, obj);
fz_rethrow_message(ctx, "cannot parse indirect object (%d %d R)", num, gen);
}
skip:
if (tok == PDF_TOK_STREAM)
{
- int c = fz_read_byte(file);
+ int c = fz_read_byte(ctx, file);
while (c == ' ')
- c = fz_read_byte(file);
+ c = fz_read_byte(ctx, file);
if (c == '\r')
{
- c = fz_peek_byte(file);
+ c = fz_peek_byte(ctx, file);
if (c != '\n')
fz_warn(ctx, "line feed missing after stream begin marker (%d %d R)", num, gen);
else
- fz_read_byte(file);
+ fz_read_byte(ctx, file);
}
- stm_ofs = fz_tell(file);
+ stm_ofs = fz_tell(ctx, file);
}
else if (tok == PDF_TOK_ENDOBJ)
{
diff --git a/source/pdf/pdf-pattern.c b/source/pdf/pdf-pattern.c
index 785acfe5..93fbdd3e 100644
--- a/source/pdf/pdf-pattern.c
+++ b/source/pdf/pdf-pattern.c
@@ -18,9 +18,9 @@ pdf_drop_pattern_imp(fz_context *ctx, fz_storable *pat_)
pdf_pattern *pat = (pdf_pattern *)pat_;
if (pat->resources)
- pdf_drop_obj(pat->resources);
+ pdf_drop_obj(ctx, pat->resources);
if (pat->contents)
- pdf_drop_obj(pat->contents);
+ pdf_drop_obj(ctx, pat->contents);
fz_free(ctx, pat);
}
@@ -33,11 +33,10 @@ pdf_pattern_size(pdf_pattern *pat)
}
pdf_pattern *
-pdf_load_pattern(pdf_document *doc, pdf_obj *dict)
+pdf_load_pattern(fz_context *ctx, pdf_document *doc, pdf_obj *dict)
{
pdf_pattern *pat;
pdf_obj *obj;
- fz_context *ctx = doc->ctx;
if ((pat = pdf_find_item(ctx, pdf_drop_pattern_imp, dict)) != NULL)
{
@@ -52,32 +51,32 @@ pdf_load_pattern(pdf_document *doc, pdf_obj *dict)
/* Store pattern now, to avoid possible recursion if objects refer back to this one */
pdf_store_item(ctx, dict, pat, pdf_pattern_size(pat));
- pat->ismask = pdf_to_int(pdf_dict_gets(dict, "PaintType")) == 2;
- pat->xstep = pdf_to_real(pdf_dict_gets(dict, "XStep"));
- pat->ystep = pdf_to_real(pdf_dict_gets(dict, "YStep"));
+ pat->ismask = pdf_to_int(ctx, pdf_dict_gets(ctx, dict, "PaintType")) == 2;
+ pat->xstep = pdf_to_real(ctx, pdf_dict_gets(ctx, dict, "XStep"));
+ pat->ystep = pdf_to_real(ctx, pdf_dict_gets(ctx, dict, "YStep"));
- obj = pdf_dict_gets(dict, "BBox");
+ obj = pdf_dict_gets(ctx, dict, "BBox");
pdf_to_rect(ctx, obj, &pat->bbox);
- obj = pdf_dict_gets(dict, "Matrix");
+ obj = pdf_dict_gets(ctx, dict, "Matrix");
if (obj)
pdf_to_matrix(ctx, obj, &pat->matrix);
else
pat->matrix = fz_identity;
- pat->resources = pdf_dict_gets(dict, "Resources");
+ pat->resources = pdf_dict_gets(ctx, dict, "Resources");
if (pat->resources)
- pdf_keep_obj(pat->resources);
+ pdf_keep_obj(ctx, pat->resources);
fz_try(ctx)
{
- pat->contents = pdf_keep_obj(dict);
+ pat->contents = pdf_keep_obj(ctx, dict);
}
fz_catch(ctx)
{
pdf_remove_item(ctx, pdf_drop_pattern_imp, dict);
pdf_drop_pattern(ctx, pat);
- fz_rethrow_message(ctx, "cannot load pattern stream (%d %d R)", pdf_to_num(dict), pdf_to_gen(dict));
+ fz_rethrow_message(ctx, "cannot load pattern stream (%d %d R)", pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict));
}
return pat;
}
diff --git a/source/pdf/pdf-pkcs7.c b/source/pdf/pdf-pkcs7.c
index 7af97a6d..c1a97599 100644
--- a/source/pdf/pdf-pkcs7.c
+++ b/source/pdf/pdf-pkcs7.c
@@ -345,22 +345,20 @@ exit:
typedef struct pdf_designated_name_openssl_s
{
pdf_designated_name base;
- fz_context *ctx;
char buf[8192];
} pdf_designated_name_openssl;
struct pdf_signer_s
{
- fz_context *ctx;
int refs;
X509 *x509;
EVP_PKEY *pkey;
};
-void pdf_drop_designated_name(pdf_designated_name *dn)
+void pdf_drop_designated_name(fz_context *ctx, pdf_designated_name *dn)
{
if (dn)
- fz_free(((pdf_designated_name_openssl *)dn)->ctx, dn);
+ fz_free(ctx, dn);
}
@@ -436,7 +434,6 @@ pdf_signer *pdf_read_pfx(fz_context *ctx, const char *pfile, const char *pw)
fz_try(ctx)
{
signer = fz_malloc_struct(ctx, pdf_signer);
- signer->ctx = ctx;
signer->refs = 1;
OpenSSL_add_all_algorithms();
@@ -502,22 +499,21 @@ pdf_signer *pdf_read_pfx(fz_context *ctx, const char *pfile, const char *pw)
}
fz_catch(ctx)
{
- pdf_drop_signer(signer);
+ pdf_drop_signer(ctx, signer);
fz_rethrow(ctx);
}
return signer;
}
-pdf_signer *pdf_keep_signer(pdf_signer *signer)
+pdf_signer *pdf_keep_signer(fz_context *ctx, pdf_signer *signer)
{
if (signer)
signer->refs++;
-
return signer;
}
-void pdf_drop_signer(pdf_signer *signer)
+void pdf_drop_signer(fz_context *ctx, pdf_signer *signer)
{
if (signer)
{
@@ -525,18 +521,16 @@ void pdf_drop_signer(pdf_signer *signer)
{
X509_free(signer->x509);
EVP_PKEY_free(signer->pkey);
- fz_free(signer->ctx, signer);
+ fz_free(ctx, signer);
}
}
}
-pdf_designated_name *pdf_signer_designated_name(pdf_signer *signer)
+pdf_designated_name *pdf_signer_designated_name(fz_context *ctx, pdf_signer *signer)
{
- fz_context *ctx = signer->ctx;
pdf_designated_name_openssl *dn = fz_malloc_struct(ctx, pdf_designated_name_openssl);
char *p;
- dn->ctx = ctx;
X509_NAME_oneline(X509_get_subject_name(signer->x509), dn->buf, sizeof(dn->buf));
p = strstr(dn->buf, "/CN=");
if (p) dn->base.cn = p+4;
@@ -556,9 +550,8 @@ pdf_designated_name *pdf_signer_designated_name(pdf_signer *signer)
return (pdf_designated_name *)dn;
}
-void pdf_write_digest(pdf_document *doc, char *filename, pdf_obj *byte_range, int digest_offset, int digest_length, pdf_signer *signer)
+void pdf_write_digest(fz_context *ctx, pdf_document *doc, char *filename, pdf_obj *byte_range, int digest_offset, int digest_length, pdf_signer *signer)
{
- fz_context *ctx = doc->ctx;
BIO *bdata = NULL;
BIO *bsegs = NULL;
BIO *bp7in = NULL;
@@ -568,7 +561,7 @@ void pdf_write_digest(pdf_document *doc, char *filename, pdf_obj *byte_range, in
FILE *f = NULL;
int (*brange)[2] = NULL;
- int brange_len = pdf_array_len(byte_range)/2;
+ int brange_len = pdf_array_len(ctx, byte_range)/2;
fz_var(bdata);
fz_var(bsegs);
@@ -586,8 +579,8 @@ void pdf_write_digest(pdf_document *doc, char *filename, pdf_obj *byte_range, in
brange = fz_calloc(ctx, brange_len, sizeof(*brange));
for (i = 0; i < brange_len; i++)
{
- brange[i][0] = pdf_to_int(pdf_array_get(byte_range, 2*i));
- brange[i][1] = pdf_to_int(pdf_array_get(byte_range, 2*i+1));
+ brange[i][0] = pdf_to_int(ctx, pdf_array_get(ctx, byte_range, 2*i));
+ brange[i][1] = pdf_to_int(ctx, pdf_array_get(ctx, byte_range, 2*i+1));
}
bdata = BIO_new(BIO_s_file());
@@ -671,9 +664,8 @@ void pdf_write_digest(pdf_document *doc, char *filename, pdf_obj *byte_range, in
}
}
-int pdf_check_signature(pdf_document *doc, pdf_widget *widget, char *file, char *ebuf, int ebufsize)
+int pdf_check_signature(fz_context *ctx, pdf_document *doc, pdf_widget *widget, char *file, char *ebuf, int ebufsize)
{
- fz_context *ctx = doc->ctx;
int (*byte_range)[2] = NULL;
int byte_range_len;
char *contents = NULL;
@@ -696,14 +688,14 @@ int pdf_check_signature(pdf_document *doc, pdf_widget *widget, char *file, char
fz_var(res);
fz_try(ctx);
{
- byte_range_len = pdf_signature_widget_byte_range(doc, widget, NULL);
+ byte_range_len = pdf_signature_widget_byte_range(ctx, doc, widget, NULL);
if (byte_range_len)
{
byte_range = fz_calloc(ctx, byte_range_len, sizeof(*byte_range));
- pdf_signature_widget_byte_range(doc, widget, byte_range);
+ pdf_signature_widget_byte_range(ctx, doc, widget, byte_range);
}
- contents_len = pdf_signature_widget_contents(doc, widget, &contents);
+ contents_len = pdf_signature_widget_contents(ctx, doc, widget, &contents);
if (byte_range && contents)
{
res = verify_sig(contents, contents_len, file, byte_range, byte_range_len, ebuf, ebufsize);
@@ -731,9 +723,8 @@ int pdf_check_signature(pdf_document *doc, pdf_widget *widget, char *file, char
return res;
}
-void pdf_sign_signature(pdf_document *doc, pdf_widget *widget, const char *sigfile, const char *password)
+void pdf_sign_signature(fz_context *ctx, pdf_document *doc, pdf_widget *widget, const char *sigfile, const char *password)
{
- fz_context *ctx = doc->ctx;
pdf_signer *signer = pdf_read_pfx(ctx, sigfile, password);
pdf_designated_name *dn = NULL;
fz_buffer *fzbuf = NULL;
@@ -744,13 +735,13 @@ void pdf_sign_signature(pdf_document *doc, pdf_widget *widget, const char *sigfi
pdf_obj *wobj = ((pdf_annot *)widget)->obj;
fz_rect rect = fz_empty_rect;
- pdf_signature_set_value(doc, wobj, signer);
+ pdf_signature_set_value(ctx, doc, wobj, signer);
- pdf_to_rect(ctx, pdf_dict_gets(wobj, "Rect"), &rect);
+ pdf_to_rect(ctx, pdf_dict_gets(ctx, wobj, "Rect"), &rect);
/* Create an appearance stream only if the signature is intended to be visible */
if (!fz_is_empty_rect(&rect))
{
- dn = pdf_signer_designated_name(signer);
+ dn = pdf_signer_designated_name(ctx, signer);
fzbuf = fz_new_buffer(ctx, 256);
if (!dn->cn)
fz_throw(ctx, FZ_ERROR_GENERIC, "Certificate has no common name");
@@ -770,13 +761,13 @@ void pdf_sign_signature(pdf_document *doc, pdf_widget *widget, const char *sigfi
fz_buffer_printf(ctx, fzbuf, ", c=%s", dn->c);
(void)fz_buffer_storage(ctx, fzbuf, (unsigned char **) &dn_str);
- pdf_set_signature_appearance(doc, (pdf_annot *)widget, dn->cn, dn_str, NULL);
+ pdf_set_signature_appearance(ctx, doc, (pdf_annot *)widget, dn->cn, dn_str, NULL);
}
}
fz_always(ctx)
{
- pdf_drop_signer(signer);
- pdf_drop_designated_name(dn);
+ pdf_drop_signer(ctx, signer);
+ pdf_drop_designated_name(ctx, dn);
fz_drop_buffer(ctx, fzbuf);
}
fz_catch(ctx)
@@ -785,37 +776,37 @@ void pdf_sign_signature(pdf_document *doc, pdf_widget *widget, const char *sigfi
}
}
-int pdf_signatures_supported(void)
+int pdf_signatures_supported(fz_context *ctx)
{
return 1;
}
#else /* HAVE_OPENSSL */
-int pdf_check_signature(pdf_document *doc, pdf_widget *widget, char *file, char *ebuf, int ebufsize)
+int pdf_check_signature(fz_context *ctx, pdf_document *doc, pdf_widget *widget, char *file, char *ebuf, int ebufsize)
{
fz_strlcpy(ebuf, "This version of MuPDF was built without signature support", ebufsize);
return 0;
}
-void pdf_sign_signature(pdf_document *doc, pdf_widget *widget, const char *sigfile, const char *password)
+void pdf_sign_signature(fz_context *ctx, pdf_document *doc, pdf_widget *widget, const char *sigfile, const char *password)
{
}
-pdf_signer *pdf_keep_signer(pdf_signer *signer)
+pdf_signer *pdf_keep_signer(fz_context *ctx, pdf_signer *signer)
{
return NULL;
}
-void pdf_drop_signer(pdf_signer *signer)
+void pdf_drop_signer(fz_context *ctx, pdf_signer *signer)
{
}
-void pdf_write_digest(pdf_document *doc, char *filename, pdf_obj *byte_range, int digest_offset, int digest_length, pdf_signer *signer)
+void pdf_write_digest(fz_context *ctx, pdf_document *doc, char *filename, pdf_obj *byte_range, int digest_offset, int digest_length, pdf_signer *signer)
{
}
-int pdf_signatures_supported(void)
+int pdf_signatures_supported(fz_context *ctx)
{
return 0;
}
diff --git a/source/pdf/pdf-repair.c b/source/pdf/pdf-repair.c
index 3cc05fc5..0c1c504c 100644
--- a/source/pdf/pdf-repair.c
+++ b/source/pdf/pdf-repair.c
@@ -15,12 +15,11 @@ struct entry
};
int
-pdf_repair_obj(pdf_document *doc, pdf_lexbuf *buf, int *stmofsp, int *stmlenp, pdf_obj **encrypt, pdf_obj **id, pdf_obj **page, int *tmpofs)
+pdf_repair_obj(fz_context *ctx, pdf_document *doc, pdf_lexbuf *buf, int *stmofsp, int *stmlenp, pdf_obj **encrypt, pdf_obj **id, pdf_obj **page, int *tmpofs)
{
+ fz_stream *file = doc->file;
pdf_token tok;
int stm_len;
- fz_stream *file = doc->file;
- fz_context *ctx = file->ctx;
*stmofsp = 0;
if (stmlenp)
@@ -32,7 +31,7 @@ pdf_repair_obj(pdf_document *doc, pdf_lexbuf *buf, int *stmofsp, int *stmlenp, p
* '<int> <int> obj'. We expect the next thing we see to be a
* pdf object. Regardless of the type of thing we meet next
* we only need to fully parse it if it is a dictionary. */
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
if (tok == PDF_TOK_OPEN_DICT)
{
@@ -41,7 +40,7 @@ pdf_repair_obj(pdf_document *doc, pdf_lexbuf *buf, int *stmofsp, int *stmlenp, p
/* Send NULL xref so we don't try to resolve references */
fz_try(ctx)
{
- dict = pdf_parse_dict(doc, file, buf);
+ dict = pdf_parse_dict(ctx, doc, file, buf);
}
fz_catch(ctx)
{
@@ -50,45 +49,45 @@ pdf_repair_obj(pdf_document *doc, pdf_lexbuf *buf, int *stmofsp, int *stmlenp, p
if (file->eof)
fz_rethrow_message(ctx, "broken object at EOF ignored");
/* Silently swallow the error */
- dict = pdf_new_dict(doc, 2);
+ dict = pdf_new_dict(ctx, doc, 2);
}
if (encrypt && id)
{
- obj = pdf_dict_gets(dict, "Type");
- if (pdf_is_name(obj) && !strcmp(pdf_to_name(obj), "XRef"))
+ obj = pdf_dict_gets(ctx, dict, "Type");
+ if (pdf_is_name(ctx, obj) && !strcmp(pdf_to_name(ctx, obj), "XRef"))
{
- obj = pdf_dict_gets(dict, "Encrypt");
+ obj = pdf_dict_gets(ctx, dict, "Encrypt");
if (obj)
{
- pdf_drop_obj(*encrypt);
- *encrypt = pdf_keep_obj(obj);
+ pdf_drop_obj(ctx, *encrypt);
+ *encrypt = pdf_keep_obj(ctx, obj);
}
- obj = pdf_dict_gets(dict, "ID");
+ obj = pdf_dict_gets(ctx, dict, "ID");
if (obj)
{
- pdf_drop_obj(*id);
- *id = pdf_keep_obj(obj);
+ pdf_drop_obj(ctx, *id);
+ *id = pdf_keep_obj(ctx, obj);
}
}
}
- obj = pdf_dict_gets(dict, "Length");
- if (!pdf_is_indirect(obj) && pdf_is_int(obj))
- stm_len = pdf_to_int(obj);
+ obj = pdf_dict_gets(ctx, dict, "Length");
+ if (!pdf_is_indirect(ctx, obj) && pdf_is_int(ctx, obj))
+ stm_len = pdf_to_int(ctx, obj);
if (doc->file_reading_linearly && page)
{
- obj = pdf_dict_gets(dict, "Type");
- if (!strcmp(pdf_to_name(obj), "Page"))
+ obj = pdf_dict_gets(ctx, dict, "Type");
+ if (!strcmp(pdf_to_name(ctx, obj), "Page"))
{
- pdf_drop_obj(*page);
- *page = pdf_keep_obj(dict);
+ pdf_drop_obj(ctx, *page);
+ *page = pdf_keep_obj(ctx, dict);
}
}
- pdf_drop_obj(dict);
+ pdf_drop_obj(ctx, dict);
}
while ( tok != PDF_TOK_STREAM &&
@@ -97,31 +96,31 @@ pdf_repair_obj(pdf_document *doc, pdf_lexbuf *buf, int *stmofsp, int *stmlenp, p
tok != PDF_TOK_EOF &&
tok != PDF_TOK_INT )
{
- *tmpofs = fz_tell(file);
+ *tmpofs = fz_tell(ctx, file);
if (*tmpofs < 0)
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot tell in file");
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
}
if (tok == PDF_TOK_STREAM)
{
- int c = fz_read_byte(file);
+ int c = fz_read_byte(ctx, file);
if (c == '\r') {
- c = fz_peek_byte(file);
+ c = fz_peek_byte(ctx, file);
if (c == '\n')
- fz_read_byte(file);
+ fz_read_byte(ctx, file);
}
- *stmofsp = fz_tell(file);
+ *stmofsp = fz_tell(ctx, file);
if (*stmofsp < 0)
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot seek in file");
if (stm_len > 0)
{
- fz_seek(file, *stmofsp + stm_len, 0);
+ fz_seek(ctx, file, *stmofsp + stm_len, 0);
fz_try(ctx)
{
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
}
fz_catch(ctx)
{
@@ -130,14 +129,14 @@ pdf_repair_obj(pdf_document *doc, pdf_lexbuf *buf, int *stmofsp, int *stmlenp, p
}
if (tok == PDF_TOK_ENDSTREAM)
goto atobjend;
- fz_seek(file, *stmofsp, 0);
+ fz_seek(ctx, file, *stmofsp, 0);
}
- (void)fz_read(file, (unsigned char *) buf->scratch, 9);
+ (void)fz_read(ctx, file, (unsigned char *) buf->scratch, 9);
while (memcmp(buf->scratch, "endstream", 9) != 0)
{
- c = fz_read_byte(file);
+ c = fz_read_byte(ctx, file);
if (c == EOF)
break;
memmove(&buf->scratch[0], &buf->scratch[1], 8);
@@ -145,35 +144,34 @@ pdf_repair_obj(pdf_document *doc, pdf_lexbuf *buf, int *stmofsp, int *stmlenp, p
}
if (stmlenp)
- *stmlenp = fz_tell(file) - *stmofsp - 9;
+ *stmlenp = fz_tell(ctx, file) - *stmofsp - 9;
atobjend:
- *tmpofs = fz_tell(file);
+ *tmpofs = fz_tell(ctx, file);
if (*tmpofs < 0)
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot tell in file");
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
if (tok != PDF_TOK_ENDOBJ)
fz_warn(ctx, "object missing 'endobj' token");
else
{
/* Read another token as we always return the next one */
- *tmpofs = fz_tell(file);
+ *tmpofs = fz_tell(ctx, file);
if (*tmpofs < 0)
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot tell in file");
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
}
}
return tok;
}
static void
-pdf_repair_obj_stm(pdf_document *doc, int num, int gen)
+pdf_repair_obj_stm(fz_context *ctx, pdf_document *doc, int num, int gen)
{
pdf_obj *obj;
fz_stream *stm = NULL;
pdf_token tok;
int i, n, count;
- fz_context *ctx = doc->ctx;
pdf_lexbuf buf;
fz_var(stm);
@@ -182,19 +180,19 @@ pdf_repair_obj_stm(pdf_document *doc, int num, int gen)
fz_try(ctx)
{
- obj = pdf_load_object(doc, num, gen);
+ obj = pdf_load_object(ctx, doc, num, gen);
- count = pdf_to_int(pdf_dict_gets(obj, "N"));
+ count = pdf_to_int(ctx, pdf_dict_gets(ctx, obj, "N"));
- pdf_drop_obj(obj);
+ pdf_drop_obj(ctx, obj);
- stm = pdf_open_stream(doc, num, gen);
+ stm = pdf_open_stream(ctx, doc, num, gen);
for (i = 0; i < count; i++)
{
pdf_xref_entry *entry;
- tok = pdf_lex(stm, &buf);
+ tok = pdf_lex(ctx, stm, &buf);
if (tok != PDF_TOK_INT)
fz_throw(ctx, FZ_ERROR_GENERIC, "corrupt object stream (%d %d R)", num, gen);
@@ -204,29 +202,29 @@ pdf_repair_obj_stm(pdf_document *doc, int num, int gen)
fz_warn(ctx, "ignoring object with invalid object number (%d %d R)", n, i);
continue;
}
- else if (n >= pdf_xref_len(doc))
+ else if (n >= pdf_xref_len(ctx, doc))
{
fz_warn(ctx, "ignoring object with invalid object number (%d %d R)", n, i);
continue;
}
- entry = pdf_get_populating_xref_entry(doc, n);
+ entry = pdf_get_populating_xref_entry(ctx, doc, n);
entry->ofs = num;
entry->gen = i;
entry->stm_ofs = 0;
- pdf_drop_obj(entry->obj);
+ pdf_drop_obj(ctx, entry->obj);
entry->obj = NULL;
entry->type = 'o';
- tok = pdf_lex(stm, &buf);
+ tok = pdf_lex(ctx, stm, &buf);
if (tok != PDF_TOK_INT)
fz_throw(ctx, FZ_ERROR_GENERIC, "corrupt object stream (%d %d R)", num, gen);
}
}
fz_always(ctx)
{
- fz_drop_stream(stm);
- pdf_lexbuf_fin(&buf);
+ fz_drop_stream(ctx, stm);
+ pdf_lexbuf_fin(ctx, &buf);
}
fz_catch(ctx)
{
@@ -235,7 +233,7 @@ pdf_repair_obj_stm(pdf_document *doc, int num, int gen)
}
void
-pdf_repair_xref(pdf_document *doc)
+pdf_repair_xref(fz_context *ctx, pdf_document *doc)
{
pdf_obj *dict, *obj = NULL;
pdf_obj *length;
@@ -257,7 +255,6 @@ pdf_repair_xref(pdf_document *doc)
pdf_token tok;
int next;
int i, n, c;
- fz_context *ctx = doc->ctx;
pdf_lexbuf *buf = &doc->lexbuf.base;
fz_var(encrypt);
@@ -268,14 +265,14 @@ pdf_repair_xref(pdf_document *doc)
fz_var(obj);
if (doc->repair_attempted)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "Repair failed already - not trying again");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "Repair failed already - not trying again");
doc->repair_attempted = 1;
doc->dirty = 1;
/* Can't support incremental update after repair */
doc->freeze_updates = 1;
- fz_seek(doc->file, 0, 0);
+ fz_seek(ctx, doc->file, 0, 0);
fz_try(ctx)
{
@@ -285,34 +282,34 @@ pdf_repair_xref(pdf_document *doc)
list = fz_malloc_array(ctx, listcap, sizeof(struct entry));
/* look for '%PDF' version marker within first kilobyte of file */
- n = fz_read(doc->file, (unsigned char *)buf->scratch, fz_mini(buf->size, 1024));
+ n = fz_read(ctx, doc->file, (unsigned char *)buf->scratch, fz_mini(buf->size, 1024));
- fz_seek(doc->file, 0, 0);
+ fz_seek(ctx, doc->file, 0, 0);
for (i = 0; i < n - 4; i++)
{
if (memcmp(&buf->scratch[i], "%PDF", 4) == 0)
{
- fz_seek(doc->file, i + 8, 0); /* skip "%PDF-X.Y" */
+ fz_seek(ctx, doc->file, i + 8, 0); /* skip "%PDF-X.Y" */
break;
}
}
/* skip comment line after version marker since some generators
* forget to terminate the comment with a newline */
- c = fz_read_byte(doc->file);
+ c = fz_read_byte(ctx, doc->file);
while (c >= 0 && (c == ' ' || c == '%'))
- c = fz_read_byte(doc->file);
- fz_unread_byte(doc->file);
+ c = fz_read_byte(ctx, doc->file);
+ fz_unread_byte(ctx, doc->file);
while (1)
{
- tmpofs = fz_tell(doc->file);
+ tmpofs = fz_tell(ctx, doc->file);
if (tmpofs < 0)
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot tell in file");
fz_try(ctx)
{
- tok = pdf_lex_no_string(doc->file, buf);
+ tok = pdf_lex_no_string(ctx, doc->file, buf);
}
fz_catch(ctx)
{
@@ -346,7 +343,7 @@ pdf_repair_xref(pdf_document *doc)
{
stm_len = 0;
stm_ofs = 0;
- tok = pdf_repair_obj(doc, buf, &stm_ofs, &stm_len, &encrypt, &id, NULL, &tmpofs);
+ tok = pdf_repair_obj(ctx, doc, buf, &stm_ofs, &stm_len, &encrypt, &id, NULL, &tmpofs);
}
fz_catch(ctx)
{
@@ -394,7 +391,7 @@ pdf_repair_xref(pdf_document *doc)
{
fz_try(ctx)
{
- dict = pdf_parse_dict(doc, doc->file, buf);
+ dict = pdf_parse_dict(ctx, doc, doc->file, buf);
}
fz_catch(ctx)
{
@@ -406,35 +403,35 @@ pdf_repair_xref(pdf_document *doc)
continue;
}
- obj = pdf_dict_gets(dict, "Encrypt");
+ obj = pdf_dict_gets(ctx, dict, "Encrypt");
if (obj)
{
- pdf_drop_obj(encrypt);
- encrypt = pdf_keep_obj(obj);
+ pdf_drop_obj(ctx, encrypt);
+ encrypt = pdf_keep_obj(ctx, obj);
}
- obj = pdf_dict_gets(dict, "ID");
- if (obj && (!id || !encrypt || pdf_dict_gets(dict, "Encrypt")))
+ obj = pdf_dict_gets(ctx, dict, "ID");
+ if (obj && (!id || !encrypt || pdf_dict_gets(ctx, dict, "Encrypt")))
{
- pdf_drop_obj(id);
- id = pdf_keep_obj(obj);
+ pdf_drop_obj(ctx, id);
+ id = pdf_keep_obj(ctx, obj);
}
- obj = pdf_dict_gets(dict, "Root");
+ obj = pdf_dict_gets(ctx, dict, "Root");
if (obj)
{
- pdf_drop_obj(root);
- root = pdf_keep_obj(obj);
+ pdf_drop_obj(ctx, root);
+ root = pdf_keep_obj(ctx, obj);
}
- obj = pdf_dict_gets(dict, "Info");
+ obj = pdf_dict_gets(ctx, dict, "Info");
if (obj)
{
- pdf_drop_obj(info);
- info = pdf_keep_obj(obj);
+ pdf_drop_obj(ctx, info);
+ info = pdf_keep_obj(ctx, obj);
}
- pdf_drop_obj(dict);
+ pdf_drop_obj(ctx, dict);
obj = NULL;
}
@@ -443,7 +440,7 @@ pdf_repair_xref(pdf_document *doc)
else
{
if (tok == PDF_TOK_ERROR)
- fz_read_byte(doc->file);
+ fz_read_byte(ctx, doc->file);
num = 0;
gen = 0;
}
@@ -458,11 +455,11 @@ pdf_repair_xref(pdf_document *doc)
*/
/* Ensure that the first xref table is a 'solid' one from
* 0 to maxnum. */
- pdf_ensure_solid_xref(doc, maxnum);
+ pdf_ensure_solid_xref(ctx, doc, maxnum);
for (i = 0; i < listlen; i++)
{
- entry = pdf_get_populating_xref_entry(doc, list[i].num);
+ entry = pdf_get_populating_xref_entry(ctx, doc, list[i].num);
entry->type = 'n';
entry->ofs = list[i].ofs;
entry->gen = list[i].gen;
@@ -472,26 +469,26 @@ pdf_repair_xref(pdf_document *doc)
/* correct stream length for unencrypted documents */
if (!encrypt && list[i].stm_len >= 0)
{
- dict = pdf_load_object(doc, list[i].num, list[i].gen);
+ dict = pdf_load_object(ctx, doc, list[i].num, list[i].gen);
- length = pdf_new_int(doc, list[i].stm_len);
- pdf_dict_puts(dict, "Length", length);
- pdf_drop_obj(length);
+ length = pdf_new_int(ctx, doc, list[i].stm_len);
+ pdf_dict_puts(ctx, dict, "Length", length);
+ pdf_drop_obj(ctx, length);
- pdf_drop_obj(dict);
+ pdf_drop_obj(ctx, dict);
}
}
- entry = pdf_get_populating_xref_entry(doc, 0);
+ entry = pdf_get_populating_xref_entry(ctx, doc, 0);
entry->type = 'f';
entry->ofs = 0;
entry->gen = 65535;
entry->stm_ofs = 0;
next = 0;
- for (i = pdf_xref_len(doc) - 1; i >= 0; i--)
+ for (i = pdf_xref_len(ctx, doc) - 1; i >= 0; i--)
{
- entry = pdf_get_populating_xref_entry(doc, i);
+ entry = pdf_get_populating_xref_entry(ctx, doc, i);
if (entry->type == 'f')
{
entry->ofs = next;
@@ -503,57 +500,57 @@ pdf_repair_xref(pdf_document *doc)
/* create a repaired trailer, Root will be added later */
- obj = pdf_new_dict(doc, 5);
+ obj = pdf_new_dict(ctx, doc, 5);
/* During repair there is only a single xref section */
- pdf_set_populating_xref_trailer(doc, obj);
- pdf_drop_obj(obj);
+ pdf_set_populating_xref_trailer(ctx, doc, obj);
+ pdf_drop_obj(ctx, obj);
obj = NULL;
- obj = pdf_new_int(doc, maxnum + 1);
- pdf_dict_puts(pdf_trailer(doc), "Size", obj);
- pdf_drop_obj(obj);
+ obj = pdf_new_int(ctx, doc, maxnum + 1);
+ pdf_dict_puts(ctx, pdf_trailer(ctx, doc), "Size", obj);
+ pdf_drop_obj(ctx, obj);
obj = NULL;
if (root)
{
- pdf_dict_puts(pdf_trailer(doc), "Root", root);
- pdf_drop_obj(root);
+ pdf_dict_puts(ctx, pdf_trailer(ctx, doc), "Root", root);
+ pdf_drop_obj(ctx, root);
root = NULL;
}
if (info)
{
- pdf_dict_puts(pdf_trailer(doc), "Info", info);
- pdf_drop_obj(info);
+ pdf_dict_puts(ctx, pdf_trailer(ctx, doc), "Info", info);
+ pdf_drop_obj(ctx, info);
info = NULL;
}
if (encrypt)
{
- if (pdf_is_indirect(encrypt))
+ if (pdf_is_indirect(ctx, encrypt))
{
/* create new reference with non-NULL xref pointer */
- obj = pdf_new_indirect(doc, pdf_to_num(encrypt), pdf_to_gen(encrypt));
- pdf_drop_obj(encrypt);
+ obj = pdf_new_indirect(ctx, doc, pdf_to_num(ctx, encrypt), pdf_to_gen(ctx, encrypt));
+ pdf_drop_obj(ctx, encrypt);
encrypt = obj;
obj = NULL;
}
- pdf_dict_puts(pdf_trailer(doc), "Encrypt", encrypt);
- pdf_drop_obj(encrypt);
+ pdf_dict_puts(ctx, pdf_trailer(ctx, doc), "Encrypt", encrypt);
+ pdf_drop_obj(ctx, encrypt);
encrypt = NULL;
}
if (id)
{
- if (pdf_is_indirect(id))
+ if (pdf_is_indirect(ctx, id))
{
/* create new reference with non-NULL xref pointer */
- obj = pdf_new_indirect(doc, pdf_to_num(id), pdf_to_gen(id));
- pdf_drop_obj(id);
+ obj = pdf_new_indirect(ctx, doc, pdf_to_num(ctx, id), pdf_to_gen(ctx, id));
+ pdf_drop_obj(ctx, id);
id = obj;
obj = NULL;
}
- pdf_dict_puts(pdf_trailer(doc), "ID", id);
- pdf_drop_obj(id);
+ pdf_dict_puts(ctx, pdf_trailer(ctx, doc), "ID", id);
+ pdf_drop_obj(ctx, id);
id = NULL;
}
@@ -561,50 +558,49 @@ pdf_repair_xref(pdf_document *doc)
}
fz_catch(ctx)
{
- pdf_drop_obj(encrypt);
- pdf_drop_obj(id);
- pdf_drop_obj(root);
- pdf_drop_obj(obj);
- pdf_drop_obj(info);
+ pdf_drop_obj(ctx, encrypt);
+ pdf_drop_obj(ctx, id);
+ pdf_drop_obj(ctx, root);
+ pdf_drop_obj(ctx, obj);
+ pdf_drop_obj(ctx, info);
fz_free(ctx, list);
fz_rethrow(ctx);
}
}
void
-pdf_repair_obj_stms(pdf_document *doc)
+pdf_repair_obj_stms(fz_context *ctx, pdf_document *doc)
{
- fz_context *ctx = doc->ctx;
pdf_obj *dict;
int i;
- int xref_len = pdf_xref_len(doc);
+ int xref_len = pdf_xref_len(ctx, doc);
for (i = 0; i < xref_len; i++)
{
- pdf_xref_entry *entry = pdf_get_populating_xref_entry(doc, i);
+ pdf_xref_entry *entry = pdf_get_populating_xref_entry(ctx, doc, i);
if (entry->stm_ofs)
{
- dict = pdf_load_object(doc, i, 0);
+ dict = pdf_load_object(ctx, doc, i, 0);
fz_try(ctx)
{
- if (!strcmp(pdf_to_name(pdf_dict_gets(dict, "Type")), "ObjStm"))
- pdf_repair_obj_stm(doc, i, 0);
+ if (!strcmp(pdf_to_name(ctx, pdf_dict_gets(ctx, dict, "Type")), "ObjStm"))
+ pdf_repair_obj_stm(ctx, doc, i, 0);
}
fz_catch(ctx)
{
fz_warn(ctx, "ignoring broken object stream (%d 0 R)", i);
}
- pdf_drop_obj(dict);
+ pdf_drop_obj(ctx, dict);
}
}
/* Ensure that streamed objects reside inside a known non-streamed object */
for (i = 0; i < xref_len; i++)
{
- pdf_xref_entry *entry = pdf_get_populating_xref_entry(doc, i);
+ pdf_xref_entry *entry = pdf_get_populating_xref_entry(ctx, doc, i);
- if (entry->type == 'o' && pdf_get_populating_xref_entry(doc, entry->ofs)->type != 'n')
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "invalid reference to non-object-stream: %d (%d 0 R)", entry->ofs, i);
+ if (entry->type == 'o' && pdf_get_populating_xref_entry(ctx, doc, entry->ofs)->type != 'n')
+ fz_throw(ctx, FZ_ERROR_GENERIC, "invalid reference to non-object-stream: %d (%d 0 R)", entry->ofs, i);
}
}
diff --git a/source/pdf/pdf-run.c b/source/pdf/pdf-run.c
index d52d8282..e6f3d5b9 100644
--- a/source/pdf/pdf-run.c
+++ b/source/pdf/pdf-run.c
@@ -1,19 +1,19 @@
#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)
+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)
{
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_init_process_run(ctx, &process, dev, &local_ctm, event, NULL, 0);
- pdf_process_annot(doc, page, annot, &process, cookie);
+ pdf_process_annot(ctx, 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)
+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)
{
fz_matrix local_ctm;
pdf_process process;
@@ -23,67 +23,70 @@ static void pdf_run_page_contents_with_usage(pdf_document *doc, pdf_page *page,
if (page->transparency)
{
fz_rect mediabox = page->mediabox;
- fz_begin_group(dev, fz_transform_rect(&mediabox, &local_ctm), 1, 0, 0, 1);
+ fz_begin_group(ctx, dev, fz_transform_rect(&mediabox, &local_ctm), 1, 0, 0, 1);
}
- pdf_process_run(&process, dev, &local_ctm, event, NULL, 0);
+ pdf_init_process_run(ctx, &process, dev, &local_ctm, event, NULL, 0);
- pdf_process_stream_object(doc, page->contents, &process, page->resources, cookie);
+ pdf_process_stream_object(ctx, doc, page->contents, &process, page->resources, cookie);
if (page->transparency)
- fz_end_group(dev);
+ fz_end_group(ctx, dev);
}
-void pdf_run_page_contents(pdf_document *doc, pdf_page *page, fz_device *dev, const fz_matrix *ctm, fz_cookie *cookie)
+void pdf_run_page_contents(fz_context *ctx, pdf_page *page, fz_device *dev, const fz_matrix *ctm, fz_cookie *cookie)
{
- fz_context *ctx = doc->ctx;
- int nocache = !!(dev->hints & FZ_NO_CACHE);
+ pdf_document *doc = page->doc;
+ int nocache;
+ nocache = !!(dev->hints & FZ_NO_CACHE);
if (nocache)
- pdf_mark_xref(doc);
+ pdf_mark_xref(ctx, doc);
+
fz_try(ctx)
{
- pdf_run_page_contents_with_usage(doc, page, dev, ctm, "View", cookie);
+ pdf_run_page_contents_with_usage(ctx, doc, page, dev, ctm, "View", cookie);
}
fz_always(ctx)
{
if (nocache)
- pdf_clear_xref_to_mark(doc);
+ pdf_clear_xref_to_mark(ctx, doc);
}
fz_catch(ctx)
{
fz_rethrow(ctx);
}
if (page->incomplete & PDF_PAGE_INCOMPLETE_CONTENTS)
- fz_throw(doc->ctx, FZ_ERROR_TRYLATER, "incomplete rendering");
+ fz_throw(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)
+void pdf_run_annot(fz_context *ctx, pdf_page *page, pdf_annot *annot, fz_device *dev, const fz_matrix *ctm, fz_cookie *cookie)
{
- fz_context *ctx = doc->ctx;
- int nocache = !!(dev->hints & FZ_NO_CACHE);
+ pdf_document *doc = page->doc;
+ int nocache;
+ nocache = !!(dev->hints & FZ_NO_CACHE);
if (nocache)
- pdf_mark_xref(doc);
+ pdf_mark_xref(ctx, doc);
fz_try(ctx)
{
- pdf_run_annot_with_usage(doc, page, annot, dev, ctm, "View", cookie);
+ pdf_run_annot_with_usage(ctx, doc, page, annot, dev, ctm, "View", cookie);
}
fz_always(ctx)
{
if (nocache)
- pdf_clear_xref_to_mark(doc);
+ pdf_clear_xref_to_mark(ctx, doc);
}
fz_catch(ctx)
{
fz_rethrow(ctx);
}
if (page->incomplete & PDF_PAGE_INCOMPLETE_ANNOTS)
- fz_throw(doc->ctx, FZ_ERROR_TRYLATER, "incomplete rendering");
+ fz_throw(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)
+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)
{
pdf_annot *annot;
@@ -105,52 +108,51 @@ static void pdf_run_page_annots_with_usage(pdf_document *doc, pdf_page *page, fz
cookie->progress++;
}
- pdf_run_annot_with_usage(doc, page, annot, dev, ctm, event, cookie);
+ pdf_run_annot_with_usage(ctx, 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_with_usage(fz_context *ctx, pdf_document *doc, pdf_page *page, fz_device *dev, const fz_matrix *ctm, char *event, fz_cookie *cookie)
{
- fz_context *ctx = doc->ctx;
int nocache = !!(dev->hints & FZ_NO_CACHE);
if (nocache)
- pdf_mark_xref(doc);
+ pdf_mark_xref(ctx, doc);
fz_try(ctx)
{
- pdf_run_page_contents_with_usage(doc, page, dev, ctm, event, cookie);
- pdf_run_page_annots_with_usage(doc, page, dev, ctm, event, cookie);
+ pdf_run_page_contents_with_usage(ctx, doc, page, dev, ctm, event, cookie);
+ pdf_run_page_annots_with_usage(ctx, doc, page, dev, ctm, event, cookie);
}
fz_always(ctx)
{
if (nocache)
- pdf_clear_xref_to_mark(doc);
+ pdf_clear_xref_to_mark(ctx, doc);
}
fz_catch(ctx)
{
fz_rethrow(ctx);
}
if (page->incomplete)
- fz_throw(doc->ctx, FZ_ERROR_TRYLATER, "incomplete rendering");
+ fz_throw(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(fz_context *ctx, pdf_page *page, fz_device *dev, const fz_matrix *ctm, fz_cookie *cookie)
{
- pdf_run_page_with_usage(doc, page, dev, ctm, "View", cookie);
+ pdf_document *doc = page->doc;
+ pdf_run_page_with_usage(ctx, 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)
+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)
{
- 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_init_process_run(ctx, &process, dev, ctm, "View", gstate, nested_depth+1);
- pdf_process_glyph(doc, resources, contents, &process);
+ pdf_process_glyph(ctx, doc, resources, contents, &process);
}
diff --git a/source/pdf/pdf-shade.c b/source/pdf/pdf-shade.c
index c5009059..4203d1b0 100644
--- a/source/pdf/pdf-shade.c
+++ b/source/pdf/pdf-shade.c
@@ -47,28 +47,27 @@ pdf_sample_shade_function(fz_context *ctx, fz_shade *shade, int funcs, fz_functi
/* Type 1-3 -- Function-based, linear and radial shadings */
static void
-pdf_load_function_based_shading(fz_shade *shade, pdf_document *doc, pdf_obj *dict, fz_function *func)
+pdf_load_function_based_shading(fz_context *ctx, pdf_document *doc, fz_shade *shade, pdf_obj *dict, fz_function *func)
{
pdf_obj *obj;
float x0, y0, x1, y1;
float fv[2];
fz_matrix matrix;
int xx, yy;
- fz_context *ctx = doc->ctx;
float *p;
x0 = y0 = 0;
x1 = y1 = 1;
- obj = pdf_dict_gets(dict, "Domain");
+ obj = pdf_dict_gets(ctx, dict, "Domain");
if (obj)
{
- x0 = pdf_to_real(pdf_array_get(obj, 0));
- x1 = pdf_to_real(pdf_array_get(obj, 1));
- y0 = pdf_to_real(pdf_array_get(obj, 2));
- y1 = pdf_to_real(pdf_array_get(obj, 3));
+ x0 = pdf_to_real(ctx, pdf_array_get(ctx, obj, 0));
+ x1 = pdf_to_real(ctx, pdf_array_get(ctx, obj, 1));
+ y0 = pdf_to_real(ctx, pdf_array_get(ctx, obj, 2));
+ y1 = pdf_to_real(ctx, pdf_array_get(ctx, obj, 3));
}
- obj = pdf_dict_gets(dict, "Matrix");
+ obj = pdf_dict_gets(ctx, dict, "Matrix");
if (obj)
pdf_to_matrix(ctx, obj, &matrix);
else
@@ -98,34 +97,33 @@ pdf_load_function_based_shading(fz_shade *shade, pdf_document *doc, pdf_obj *dic
}
static void
-pdf_load_linear_shading(fz_shade *shade, pdf_document *doc, pdf_obj *dict, int funcs, fz_function **func)
+pdf_load_linear_shading(fz_context *ctx, pdf_document *doc, fz_shade *shade, pdf_obj *dict, int funcs, fz_function **func)
{
pdf_obj *obj;
float d0, d1;
int e0, e1;
- fz_context *ctx = doc->ctx;
- obj = pdf_dict_gets(dict, "Coords");
- shade->u.l_or_r.coords[0][0] = pdf_to_real(pdf_array_get(obj, 0));
- shade->u.l_or_r.coords[0][1] = pdf_to_real(pdf_array_get(obj, 1));
- shade->u.l_or_r.coords[1][0] = pdf_to_real(pdf_array_get(obj, 2));
- shade->u.l_or_r.coords[1][1] = pdf_to_real(pdf_array_get(obj, 3));
+ obj = pdf_dict_gets(ctx, dict, "Coords");
+ shade->u.l_or_r.coords[0][0] = pdf_to_real(ctx, pdf_array_get(ctx, obj, 0));
+ shade->u.l_or_r.coords[0][1] = pdf_to_real(ctx, pdf_array_get(ctx, obj, 1));
+ shade->u.l_or_r.coords[1][0] = pdf_to_real(ctx, pdf_array_get(ctx, obj, 2));
+ shade->u.l_or_r.coords[1][1] = pdf_to_real(ctx, pdf_array_get(ctx, obj, 3));
d0 = 0;
d1 = 1;
- obj = pdf_dict_gets(dict, "Domain");
+ obj = pdf_dict_gets(ctx, dict, "Domain");
if (obj)
{
- d0 = pdf_to_real(pdf_array_get(obj, 0));
- d1 = pdf_to_real(pdf_array_get(obj, 1));
+ d0 = pdf_to_real(ctx, pdf_array_get(ctx, obj, 0));
+ d1 = pdf_to_real(ctx, pdf_array_get(ctx, obj, 1));
}
e0 = e1 = 0;
- obj = pdf_dict_gets(dict, "Extend");
+ obj = pdf_dict_gets(ctx, dict, "Extend");
if (obj)
{
- e0 = pdf_to_bool(pdf_array_get(obj, 0));
- e1 = pdf_to_bool(pdf_array_get(obj, 1));
+ e0 = pdf_to_bool(ctx, pdf_array_get(ctx, obj, 0));
+ e1 = pdf_to_bool(ctx, pdf_array_get(ctx, obj, 1));
}
pdf_sample_shade_function(ctx, shade, funcs, func, d0, d1);
@@ -135,36 +133,35 @@ pdf_load_linear_shading(fz_shade *shade, pdf_document *doc, pdf_obj *dict, int f
}
static void
-pdf_load_radial_shading(fz_shade *shade, pdf_document *doc, pdf_obj *dict, int funcs, fz_function **func)
+pdf_load_radial_shading(fz_context *ctx, pdf_document *doc, fz_shade *shade, pdf_obj *dict, int funcs, fz_function **func)
{
pdf_obj *obj;
float d0, d1;
int e0, e1;
- fz_context *ctx = doc->ctx;
- obj = pdf_dict_gets(dict, "Coords");
- shade->u.l_or_r.coords[0][0] = pdf_to_real(pdf_array_get(obj, 0));
- shade->u.l_or_r.coords[0][1] = pdf_to_real(pdf_array_get(obj, 1));
- shade->u.l_or_r.coords[0][2] = pdf_to_real(pdf_array_get(obj, 2));
- shade->u.l_or_r.coords[1][0] = pdf_to_real(pdf_array_get(obj, 3));
- shade->u.l_or_r.coords[1][1] = pdf_to_real(pdf_array_get(obj, 4));
- shade->u.l_or_r.coords[1][2] = pdf_to_real(pdf_array_get(obj, 5));
+ obj = pdf_dict_gets(ctx, dict, "Coords");
+ shade->u.l_or_r.coords[0][0] = pdf_to_real(ctx, pdf_array_get(ctx, obj, 0));
+ shade->u.l_or_r.coords[0][1] = pdf_to_real(ctx, pdf_array_get(ctx, obj, 1));
+ shade->u.l_or_r.coords[0][2] = pdf_to_real(ctx, pdf_array_get(ctx, obj, 2));
+ shade->u.l_or_r.coords[1][0] = pdf_to_real(ctx, pdf_array_get(ctx, obj, 3));
+ shade->u.l_or_r.coords[1][1] = pdf_to_real(ctx, pdf_array_get(ctx, obj, 4));
+ shade->u.l_or_r.coords[1][2] = pdf_to_real(ctx, pdf_array_get(ctx, obj, 5));
d0 = 0;
d1 = 1;
- obj = pdf_dict_gets(dict, "Domain");
+ obj = pdf_dict_gets(ctx, dict, "Domain");
if (obj)
{
- d0 = pdf_to_real(pdf_array_get(obj, 0));
- d1 = pdf_to_real(pdf_array_get(obj, 1));
+ d0 = pdf_to_real(ctx, pdf_array_get(ctx, obj, 0));
+ d1 = pdf_to_real(ctx, pdf_array_get(ctx, obj, 1));
}
e0 = e1 = 0;
- obj = pdf_dict_gets(dict, "Extend");
+ obj = pdf_dict_gets(ctx, dict, "Extend");
if (obj)
{
- e0 = pdf_to_bool(pdf_array_get(obj, 0));
- e1 = pdf_to_bool(pdf_array_get(obj, 1));
+ e0 = pdf_to_bool(ctx, pdf_array_get(ctx, obj, 0));
+ e1 = pdf_to_bool(ctx, pdf_array_get(ctx, obj, 1));
}
pdf_sample_shade_function(ctx, shade, funcs, func, d0, d1);
@@ -188,9 +185,8 @@ struct mesh_params
};
static void
-pdf_load_mesh_params(fz_shade *shade, pdf_document *doc, pdf_obj *dict)
+pdf_load_mesh_params(fz_context *ctx, pdf_document *doc, fz_shade *shade, pdf_obj *dict)
{
- fz_context *ctx = doc->ctx;
pdf_obj *obj;
int i, n;
@@ -202,23 +198,23 @@ pdf_load_mesh_params(fz_shade *shade, pdf_document *doc, pdf_obj *dict)
shade->u.m.c1[i] = 1;
}
- shade->u.m.vprow = pdf_to_int(pdf_dict_gets(dict, "VerticesPerRow"));
- shade->u.m.bpflag = pdf_to_int(pdf_dict_gets(dict, "BitsPerFlag"));
- shade->u.m.bpcoord = pdf_to_int(pdf_dict_gets(dict, "BitsPerCoordinate"));
- shade->u.m.bpcomp = pdf_to_int(pdf_dict_gets(dict, "BitsPerComponent"));
+ shade->u.m.vprow = pdf_to_int(ctx, pdf_dict_gets(ctx, dict, "VerticesPerRow"));
+ shade->u.m.bpflag = pdf_to_int(ctx, pdf_dict_gets(ctx, dict, "BitsPerFlag"));
+ shade->u.m.bpcoord = pdf_to_int(ctx, pdf_dict_gets(ctx, dict, "BitsPerCoordinate"));
+ shade->u.m.bpcomp = pdf_to_int(ctx, pdf_dict_gets(ctx, dict, "BitsPerComponent"));
- obj = pdf_dict_gets(dict, "Decode");
- if (pdf_array_len(obj) >= 6)
+ obj = pdf_dict_gets(ctx, dict, "Decode");
+ if (pdf_array_len(ctx, obj) >= 6)
{
- n = (pdf_array_len(obj) - 4) / 2;
- shade->u.m.x0 = pdf_to_real(pdf_array_get(obj, 0));
- shade->u.m.x1 = pdf_to_real(pdf_array_get(obj, 1));
- shade->u.m.y0 = pdf_to_real(pdf_array_get(obj, 2));
- shade->u.m.y1 = pdf_to_real(pdf_array_get(obj, 3));
+ n = (pdf_array_len(ctx, obj) - 4) / 2;
+ shade->u.m.x0 = pdf_to_real(ctx, pdf_array_get(ctx, obj, 0));
+ shade->u.m.x1 = pdf_to_real(ctx, pdf_array_get(ctx, obj, 1));
+ shade->u.m.y0 = pdf_to_real(ctx, pdf_array_get(ctx, obj, 2));
+ shade->u.m.y1 = pdf_to_real(ctx, pdf_array_get(ctx, obj, 3));
for (i = 0; i < n; i++)
{
- shade->u.m.c0[i] = pdf_to_real(pdf_array_get(obj, 4 + i * 2));
- shade->u.m.c1[i] = pdf_to_real(pdf_array_get(obj, 5 + i * 2));
+ shade->u.m.c0[i] = pdf_to_real(ctx, pdf_array_get(ctx, obj, 4 + i * 2));
+ shade->u.m.c1[i] = pdf_to_real(ctx, pdf_array_get(ctx, obj, 5 + i * 2));
}
}
@@ -252,67 +248,59 @@ pdf_load_mesh_params(fz_shade *shade, pdf_document *doc, pdf_obj *dict)
}
static void
-pdf_load_type4_shade(fz_shade *shade, pdf_document *doc, pdf_obj *dict,
- int funcs, fz_function **func)
+pdf_load_type4_shade(fz_context *ctx, pdf_document *doc, fz_shade *shade, pdf_obj *dict, int funcs, fz_function **func)
{
- fz_context *ctx = doc->ctx;
- pdf_load_mesh_params(shade, doc, dict);
+ pdf_load_mesh_params(ctx, doc, shade, dict);
if (funcs > 0)
pdf_sample_shade_function(ctx, shade, funcs, func, shade->u.m.c0[0], shade->u.m.c1[0]);
- shade->buffer = pdf_load_compressed_stream(doc, pdf_to_num(dict), pdf_to_gen(dict));
+ shade->buffer = pdf_load_compressed_stream(ctx, doc, pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict));
}
static void
-pdf_load_type5_shade(fz_shade *shade, pdf_document *doc, pdf_obj *dict,
- int funcs, fz_function **func)
+pdf_load_type5_shade(fz_context *ctx, pdf_document *doc, fz_shade *shade, pdf_obj *dict, int funcs, fz_function **func)
{
- fz_context *ctx = doc->ctx;
- pdf_load_mesh_params(shade, doc, dict);
+ pdf_load_mesh_params(ctx, doc, shade, dict);
if (funcs > 0)
pdf_sample_shade_function(ctx, shade, funcs, func, shade->u.m.c0[0], shade->u.m.c1[0]);
- shade->buffer = pdf_load_compressed_stream(doc, pdf_to_num(dict), pdf_to_gen(dict));
+ shade->buffer = pdf_load_compressed_stream(ctx, doc, pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict));
}
/* Type 6 & 7 -- Patch mesh shadings */
static void
-pdf_load_type6_shade(fz_shade *shade, pdf_document *doc, pdf_obj *dict,
- int funcs, fz_function **func)
+pdf_load_type6_shade(fz_context *ctx, pdf_document *doc, fz_shade *shade, pdf_obj *dict, int funcs, fz_function **func)
{
- fz_context *ctx = doc->ctx;
- pdf_load_mesh_params(shade, doc, dict);
+ pdf_load_mesh_params(ctx, doc, shade, dict);
if (funcs > 0)
pdf_sample_shade_function(ctx, shade, funcs, func, shade->u.m.c0[0], shade->u.m.c1[0]);
- shade->buffer = pdf_load_compressed_stream(doc, pdf_to_num(dict), pdf_to_gen(dict));
+ shade->buffer = pdf_load_compressed_stream(ctx, doc, pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict));
}
static void
-pdf_load_type7_shade(fz_shade *shade, pdf_document *doc, pdf_obj *dict,
- int funcs, fz_function **func)
+pdf_load_type7_shade(fz_context *ctx, pdf_document *doc, fz_shade *shade, pdf_obj *dict, int funcs, fz_function **func)
{
- fz_context *ctx = doc->ctx;
- pdf_load_mesh_params(shade, doc, dict);
+ pdf_load_mesh_params(ctx, doc, shade, dict);
if (funcs > 0)
pdf_sample_shade_function(ctx, shade, funcs, func, shade->u.m.c0[0], shade->u.m.c1[0]);
- shade->buffer = pdf_load_compressed_stream(doc, pdf_to_num(dict), pdf_to_gen(dict));
+ shade->buffer = pdf_load_compressed_stream(ctx, doc, pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict));
}
/* Load all of the shading dictionary parameters, then switch on the shading type. */
static fz_shade *
-pdf_load_shading_dict(pdf_document *doc, pdf_obj *dict, const fz_matrix *transform)
+pdf_load_shading_dict(fz_context *ctx, pdf_document *doc, pdf_obj *dict, const fz_matrix *transform)
{
fz_shade *shade = NULL;
fz_function *func[FZ_MAX_COLORS] = { NULL };
@@ -320,7 +308,6 @@ pdf_load_shading_dict(pdf_document *doc, pdf_obj *dict, const fz_matrix *transfo
int funcs = 0;
int type = 0;
int i, in, out;
- fz_context *ctx = doc->ctx;
fz_var(shade);
fz_var(func);
@@ -341,28 +328,28 @@ pdf_load_shading_dict(pdf_document *doc, pdf_obj *dict, const fz_matrix *transfo
funcs = 0;
- obj = pdf_dict_gets(dict, "ShadingType");
- type = pdf_to_int(obj);
+ obj = pdf_dict_gets(ctx, dict, "ShadingType");
+ type = pdf_to_int(ctx, obj);
- obj = pdf_dict_gets(dict, "ColorSpace");
+ obj = pdf_dict_gets(ctx, dict, "ColorSpace");
if (!obj)
fz_throw(ctx, FZ_ERROR_GENERIC, "shading colorspace is missing");
- shade->colorspace = pdf_load_colorspace(doc, obj);
+ shade->colorspace = pdf_load_colorspace(ctx, doc, obj);
- obj = pdf_dict_gets(dict, "Background");
+ obj = pdf_dict_gets(ctx, dict, "Background");
if (obj)
{
shade->use_background = 1;
for (i = 0; i < shade->colorspace->n; i++)
- shade->background[i] = pdf_to_real(pdf_array_get(obj, i));
+ shade->background[i] = pdf_to_real(ctx, pdf_array_get(ctx, obj, i));
}
- obj = pdf_dict_gets(dict, "BBox");
- if (pdf_is_array(obj))
+ obj = pdf_dict_gets(ctx, dict, "BBox");
+ if (pdf_is_array(ctx, obj))
pdf_to_rect(ctx, obj, &shade->bbox);
- obj = pdf_dict_gets(dict, "Function");
- if (pdf_is_dict(obj))
+ obj = pdf_dict_gets(ctx, dict, "Function");
+ if (pdf_is_dict(ctx, obj))
{
funcs = 1;
@@ -372,13 +359,13 @@ pdf_load_shading_dict(pdf_document *doc, pdf_obj *dict, const fz_matrix *transfo
in = 1;
out = shade->colorspace->n;
- func[0] = pdf_load_function(doc, obj, in, out);
+ func[0] = pdf_load_function(ctx, doc, obj, in, out);
if (!func[0])
- fz_throw(ctx, FZ_ERROR_GENERIC, "cannot load shading function (%d %d R)", pdf_to_num(obj), pdf_to_gen(obj));
+ fz_throw(ctx, FZ_ERROR_GENERIC, "cannot load shading function (%d %d R)", pdf_to_num(ctx, obj), pdf_to_gen(ctx, obj));
}
- else if (pdf_is_array(obj))
+ else if (pdf_is_array(ctx, obj))
{
- funcs = pdf_array_len(obj);
+ funcs = pdf_array_len(ctx, obj);
if (funcs != 1 && funcs != shade->colorspace->n)
{
funcs = 0;
@@ -398,27 +385,27 @@ pdf_load_shading_dict(pdf_document *doc, pdf_obj *dict, const fz_matrix *transfo
for (i = 0; i < funcs; i++)
{
- func[i] = pdf_load_function(doc, pdf_array_get(obj, i), in, out);
+ func[i] = pdf_load_function(ctx, doc, pdf_array_get(ctx, obj, i), in, out);
if (!func[i])
- fz_throw(ctx, FZ_ERROR_GENERIC, "cannot load shading function (%d %d R)", pdf_to_num(obj), pdf_to_gen(obj));
+ fz_throw(ctx, FZ_ERROR_GENERIC, "cannot load shading function (%d %d R)", pdf_to_num(ctx, obj), pdf_to_gen(ctx, obj));
}
}
else if (type < 4)
{
/* Functions are compulsory for types 1,2,3 */
- fz_throw(ctx, FZ_ERROR_GENERIC, "cannot load shading function (%d %d R)", pdf_to_num(obj), pdf_to_gen(obj));
+ fz_throw(ctx, FZ_ERROR_GENERIC, "cannot load shading function (%d %d R)", pdf_to_num(ctx, obj), pdf_to_gen(ctx, obj));
}
shade->type = type;
switch (type)
{
- case 1: pdf_load_function_based_shading(shade, doc, dict, func[0]); break;
- case 2: pdf_load_linear_shading(shade, doc, dict, funcs, func); break;
- case 3: pdf_load_radial_shading(shade, doc, dict, funcs, func); break;
- case 4: pdf_load_type4_shade(shade, doc, dict, funcs, func); break;
- case 5: pdf_load_type5_shade(shade, doc, dict, funcs, func); break;
- case 6: pdf_load_type6_shade(shade, doc, dict, funcs, func); break;
- case 7: pdf_load_type7_shade(shade, doc, dict, funcs, func); break;
+ case 1: pdf_load_function_based_shading(ctx, doc, shade, dict, func[0]); break;
+ case 2: pdf_load_linear_shading(ctx, doc, shade, dict, funcs, func); break;
+ case 3: pdf_load_radial_shading(ctx, doc, shade, dict, funcs, func); break;
+ case 4: pdf_load_type4_shade(ctx, doc, shade, dict, funcs, func); break;
+ case 5: pdf_load_type5_shade(ctx, doc, shade, dict, funcs, func); break;
+ case 6: pdf_load_type6_shade(ctx, doc, shade, dict, funcs, func); break;
+ case 7: pdf_load_type7_shade(ctx, doc, shade, dict, funcs, func); break;
default:
fz_throw(ctx, FZ_ERROR_GENERIC, "unknown shading type: %d", type);
}
@@ -433,7 +420,7 @@ pdf_load_shading_dict(pdf_document *doc, pdf_obj *dict, const fz_matrix *transfo
{
fz_drop_shade(ctx, shade);
- fz_rethrow_message(ctx, "cannot load shading type %d (%d %d R)", type, pdf_to_num(dict), pdf_to_gen(dict));
+ fz_rethrow_message(ctx, "cannot load shading type %d (%d %d R)", type, pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict));
}
return shade;
}
@@ -449,11 +436,10 @@ fz_shade_size(fz_shade *s)
}
fz_shade *
-pdf_load_shading(pdf_document *doc, pdf_obj *dict)
+pdf_load_shading(fz_context *ctx, pdf_document *doc, pdf_obj *dict)
{
fz_matrix mat;
pdf_obj *obj;
- fz_context *ctx = doc->ctx;
fz_shade *shade;
if ((shade = pdf_find_item(ctx, fz_drop_shade_imp, dict)) != NULL)
@@ -462,34 +448,34 @@ pdf_load_shading(pdf_document *doc, pdf_obj *dict)
}
/* Type 2 pattern dictionary */
- if (pdf_dict_gets(dict, "PatternType"))
+ if (pdf_dict_gets(ctx, dict, "PatternType"))
{
- obj = pdf_dict_gets(dict, "Matrix");
+ obj = pdf_dict_gets(ctx, dict, "Matrix");
if (obj)
pdf_to_matrix(ctx, obj, &mat);
else
mat = fz_identity;
- obj = pdf_dict_gets(dict, "ExtGState");
+ obj = pdf_dict_gets(ctx, dict, "ExtGState");
if (obj)
{
- if (pdf_dict_gets(obj, "CA") || pdf_dict_gets(obj, "ca"))
+ if (pdf_dict_gets(ctx, obj, "CA") || pdf_dict_gets(ctx, obj, "ca"))
{
fz_warn(ctx, "shading with alpha not supported");
}
}
- obj = pdf_dict_gets(dict, "Shading");
+ obj = pdf_dict_gets(ctx, dict, "Shading");
if (!obj)
fz_throw(ctx, FZ_ERROR_GENERIC, "syntaxerror: missing shading dictionary");
- shade = pdf_load_shading_dict(doc, obj, &mat);
+ shade = pdf_load_shading_dict(ctx, doc, obj, &mat);
}
/* Naked shading dictionary */
else
{
- shade = pdf_load_shading_dict(doc, dict, &fz_identity);
+ shade = pdf_load_shading_dict(ctx, doc, dict, &fz_identity);
}
pdf_store_item(ctx, dict, shade, fz_shade_size(shade));
diff --git a/source/pdf/pdf-store.c b/source/pdf/pdf-store.c
index 7349e9d4..51255414 100644
--- a/source/pdf/pdf-store.c
+++ b/source/pdf/pdf-store.c
@@ -1,48 +1,48 @@
#include "mupdf/pdf.h"
static int
-pdf_make_hash_key(fz_store_hash *hash, void *key_)
+pdf_make_hash_key(fz_context *ctx, fz_store_hash *hash, void *key_)
{
pdf_obj *key = (pdf_obj *)key_;
- if (!pdf_is_indirect(key))
+ if (!pdf_is_indirect(ctx, key))
return 0;
- hash->u.i.i0 = pdf_to_num(key);
- hash->u.i.i1 = pdf_to_gen(key);
- hash->u.i.ptr = pdf_get_indirect_document(key);
+ hash->u.i.i0 = pdf_to_num(ctx, key);
+ hash->u.i.i1 = pdf_to_gen(ctx, key);
+ hash->u.i.ptr = pdf_get_indirect_document(ctx, key);
return 1;
}
static void *
pdf_keep_key(fz_context *ctx, void *key)
{
- return (void *)pdf_keep_obj((pdf_obj *)key);
+ return (void *)pdf_keep_obj(ctx, (pdf_obj *)key);
}
static void
pdf_drop_key(fz_context *ctx, void *key)
{
- pdf_drop_obj((pdf_obj *)key);
+ pdf_drop_obj(ctx, (pdf_obj *)key);
}
static int
-pdf_cmp_key(void *k0, void *k1)
+pdf_cmp_key(fz_context *ctx, void *k0, void *k1)
{
- return pdf_objcmp((pdf_obj *)k0, (pdf_obj *)k1);
+ return pdf_objcmp(ctx, (pdf_obj *)k0, (pdf_obj *)k1);
}
#ifndef NDEBUG
static void
-pdf_debug_key(FILE *out, void *key_)
+pdf_debug_key(fz_context *ctx, FILE *out, void *key_)
{
pdf_obj *key = (pdf_obj *)key_;
- if (pdf_is_indirect(key))
+ if (pdf_is_indirect(ctx, key))
{
- fprintf(out, "(%d %d R) ", pdf_to_num(key), pdf_to_gen(key));
+ fprintf(out, "(%d %d R) ", pdf_to_num(ctx, key), pdf_to_gen(ctx, key));
}
else
- pdf_fprint_obj(out, key, 0);
+ pdf_fprint_obj(ctx, out, key, 0);
}
#endif
diff --git a/source/pdf/pdf-stream.c b/source/pdf/pdf-stream.c
index 9efd1887..2335e67a 100644
--- a/source/pdf/pdf-stream.c
+++ b/source/pdf/pdf-stream.c
@@ -4,14 +4,14 @@
* Check if an object is a stream or not.
*/
int
-pdf_is_stream(pdf_document *doc, int num, int gen)
+pdf_is_stream(fz_context *ctx, pdf_document *doc, int num, int gen)
{
pdf_xref_entry *entry;
- if (num <= 0 || num >= pdf_xref_len(doc))
+ if (num <= 0 || num >= pdf_xref_len(ctx, doc))
return 0;
- entry = pdf_cache_object(doc, num, gen);
+ entry = pdf_cache_object(ctx, doc, num, gen);
return entry->stm_ofs != 0 || entry->stm_buf;
}
@@ -26,18 +26,18 @@ pdf_stream_has_crypt(fz_context *ctx, pdf_obj *stm)
pdf_obj *obj;
int i;
- filters = pdf_dict_getsa(stm, "Filter", "F");
+ filters = pdf_dict_getsa(ctx, stm, "Filter", "F");
if (filters)
{
- if (!strcmp(pdf_to_name(filters), "Crypt"))
+ if (!strcmp(pdf_to_name(ctx, filters), "Crypt"))
return 1;
- if (pdf_is_array(filters))
+ if (pdf_is_array(ctx, filters))
{
- int n = pdf_array_len(filters);
+ int n = pdf_array_len(ctx, filters);
for (i = 0; i < n; i++)
{
- obj = pdf_array_get(filters, i);
- if (!strcmp(pdf_to_name(obj), "Crypt"))
+ obj = pdf_array_get(ctx, filters, i);
+ if (!strcmp(pdf_to_name(ctx, obj), "Crypt"))
return 1;
}
}
@@ -46,10 +46,9 @@ pdf_stream_has_crypt(fz_context *ctx, pdf_obj *stm)
}
static fz_jbig2_globals *
-pdf_load_jbig2_globals(pdf_document *doc, pdf_obj *dict)
+pdf_load_jbig2_globals(fz_context *ctx, pdf_document *doc, pdf_obj *dict)
{
fz_jbig2_globals *globals;
- fz_context *ctx = doc->ctx;
fz_buffer *buf = NULL;
fz_var(buf);
@@ -61,7 +60,7 @@ pdf_load_jbig2_globals(pdf_document *doc, pdf_obj *dict)
fz_try(ctx)
{
- buf = pdf_load_stream(doc, pdf_to_num(dict), pdf_to_gen(dict));
+ buf = pdf_load_stream(ctx, doc, pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict));
globals = fz_load_jbig2_globals(ctx, buf->data, buf->len);
pdf_store_item(ctx, dict, globals, buf->len);
}
@@ -81,68 +80,67 @@ pdf_load_jbig2_globals(pdf_document *doc, pdf_obj *dict)
* Create a filter given a name and param dictionary.
*/
static fz_stream *
-build_filter(fz_stream *chain, pdf_document *doc, pdf_obj *f, pdf_obj *p, int num, int gen, fz_compression_params *params)
+build_filter(fz_context *ctx, fz_stream *chain, pdf_document *doc, pdf_obj *f, pdf_obj *p, int num, int gen, fz_compression_params *params)
{
- fz_context *ctx = chain->ctx;
- char *s = pdf_to_name(f);
+ char *s = pdf_to_name(ctx, f);
- int predictor = pdf_to_int(pdf_dict_gets(p, "Predictor"));
- pdf_obj *columns_obj = pdf_dict_gets(p, "Columns");
- int columns = pdf_to_int(columns_obj);
- int colors = pdf_to_int(pdf_dict_gets(p, "Colors"));
- int bpc = pdf_to_int(pdf_dict_gets(p, "BitsPerComponent"));
+ int predictor = pdf_to_int(ctx, pdf_dict_gets(ctx, p, "Predictor"));
+ pdf_obj *columns_obj = pdf_dict_gets(ctx, p, "Columns");
+ int columns = pdf_to_int(ctx, columns_obj);
+ int colors = pdf_to_int(ctx, pdf_dict_gets(ctx, p, "Colors"));
+ int bpc = pdf_to_int(ctx, pdf_dict_gets(ctx, p, "BitsPerComponent"));
if (params)
params->type = FZ_IMAGE_RAW;
if (!strcmp(s, "ASCIIHexDecode") || !strcmp(s, "AHx"))
- return fz_open_ahxd(chain);
+ return fz_open_ahxd(ctx, chain);
else if (!strcmp(s, "ASCII85Decode") || !strcmp(s, "A85"))
- return fz_open_a85d(chain);
+ return fz_open_a85d(ctx, chain);
else if (!strcmp(s, "CCITTFaxDecode") || !strcmp(s, "CCF"))
{
- pdf_obj *k = pdf_dict_gets(p, "K");
- pdf_obj *eol = pdf_dict_gets(p, "EndOfLine");
- pdf_obj *eba = pdf_dict_gets(p, "EncodedByteAlign");
- pdf_obj *rows = pdf_dict_gets(p, "Rows");
- pdf_obj *eob = pdf_dict_gets(p, "EndOfBlock");
- pdf_obj *bi1 = pdf_dict_gets(p, "BlackIs1");
+ pdf_obj *k = pdf_dict_gets(ctx, p, "K");
+ pdf_obj *eol = pdf_dict_gets(ctx, p, "EndOfLine");
+ pdf_obj *eba = pdf_dict_gets(ctx, p, "EncodedByteAlign");
+ pdf_obj *rows = pdf_dict_gets(ctx, p, "Rows");
+ pdf_obj *eob = pdf_dict_gets(ctx, p, "EndOfBlock");
+ pdf_obj *bi1 = pdf_dict_gets(ctx, p, "BlackIs1");
if (params)
{
/* We will shortstop here */
params->type = FZ_IMAGE_FAX;
- params->u.fax.k = (k ? pdf_to_int(k) : 0);
- params->u.fax.end_of_line = (eol ? pdf_to_bool(eol) : 0);
- params->u.fax.encoded_byte_align = (eba ? pdf_to_bool(eba) : 0);
+ params->u.fax.k = (k ? pdf_to_int(ctx, k) : 0);
+ params->u.fax.end_of_line = (eol ? pdf_to_bool(ctx, eol) : 0);
+ params->u.fax.encoded_byte_align = (eba ? pdf_to_bool(ctx, eba) : 0);
params->u.fax.columns = (columns_obj ? columns : 1728);
- params->u.fax.rows = (rows ? pdf_to_int(rows) : 0);
- params->u.fax.end_of_block = (eob ? pdf_to_bool(eob) : 1);
- params->u.fax.black_is_1 = (bi1 ? pdf_to_bool(bi1) : 0);
+ params->u.fax.rows = (rows ? pdf_to_int(ctx, rows) : 0);
+ params->u.fax.end_of_block = (eob ? pdf_to_bool(ctx, eob) : 1);
+ params->u.fax.black_is_1 = (bi1 ? pdf_to_bool(ctx, bi1) : 0);
return chain;
}
- return fz_open_faxd(chain,
- k ? pdf_to_int(k) : 0,
- eol ? pdf_to_bool(eol) : 0,
- eba ? pdf_to_bool(eba) : 0,
+ return fz_open_faxd(ctx, chain,
+ k ? pdf_to_int(ctx, k) : 0,
+ eol ? pdf_to_bool(ctx, eol) : 0,
+ eba ? pdf_to_bool(ctx, eba) : 0,
columns_obj ? columns : 1728,
- rows ? pdf_to_int(rows) : 0,
- eob ? pdf_to_bool(eob) : 1,
- bi1 ? pdf_to_bool(bi1) : 0);
+ rows ? pdf_to_int(ctx, rows) : 0,
+ eob ? pdf_to_bool(ctx, eob) : 1,
+ bi1 ? pdf_to_bool(ctx, bi1) : 0);
}
else if (!strcmp(s, "DCTDecode") || !strcmp(s, "DCT"))
{
- pdf_obj *ct = pdf_dict_gets(p, "ColorTransform");
+ pdf_obj *ct = pdf_dict_gets(ctx, p, "ColorTransform");
if (params)
{
/* We will shortstop here */
params->type = FZ_IMAGE_JPEG;
- params->u.jpeg.color_transform = (ct ? pdf_to_int(ct) : -1);
+ params->u.jpeg.color_transform = (ct ? pdf_to_int(ctx, ct) : -1);
return chain;
}
- return fz_open_dctd(chain, ct ? pdf_to_int(ct) : -1, 0, NULL);
+ return fz_open_dctd(ctx, chain, ct ? pdf_to_int(ctx, ct) : -1, 0, NULL);
}
else if (!strcmp(s, "RunLengthDecode") || !strcmp(s, "RL"))
@@ -153,7 +151,7 @@ build_filter(fz_stream *chain, pdf_document *doc, pdf_obj *f, pdf_obj *p, int nu
params->type = FZ_IMAGE_RLD;
return chain;
}
- return fz_open_rld(chain);
+ return fz_open_rld(ctx, chain);
}
else if (!strcmp(s, "FlateDecode") || !strcmp(s, "Fl"))
{
@@ -167,15 +165,15 @@ build_filter(fz_stream *chain, pdf_document *doc, pdf_obj *f, pdf_obj *p, int nu
params->u.flate.bpc = bpc;
return chain;
}
- chain = fz_open_flated(chain, 15);
+ chain = fz_open_flated(ctx, chain, 15);
if (predictor > 1)
- chain = fz_open_predict(chain, predictor, columns, colors, bpc);
+ chain = fz_open_predict(ctx, chain, predictor, columns, colors, bpc);
return chain;
}
else if (!strcmp(s, "LZWDecode") || !strcmp(s, "LZW"))
{
- pdf_obj *ec = pdf_dict_gets(p, "EarlyChange");
+ pdf_obj *ec = pdf_dict_gets(ctx, p, "EarlyChange");
if (params)
{
/* We will shortstop here */
@@ -184,23 +182,23 @@ build_filter(fz_stream *chain, pdf_document *doc, pdf_obj *f, pdf_obj *p, int nu
params->u.lzw.columns = columns;
params->u.lzw.colors = colors;
params->u.lzw.bpc = bpc;
- params->u.lzw.early_change = (ec ? pdf_to_int(ec) : 1);
+ params->u.lzw.early_change = (ec ? pdf_to_int(ctx, ec) : 1);
return chain;
}
- chain = fz_open_lzwd(chain, ec ? pdf_to_int(ec) : 1);
+ chain = fz_open_lzwd(ctx, chain, ec ? pdf_to_int(ctx, ec) : 1);
if (predictor > 1)
- chain = fz_open_predict(chain, predictor, columns, colors, bpc);
+ chain = fz_open_predict(ctx, chain, predictor, columns, colors, bpc);
return chain;
}
else if (!strcmp(s, "JBIG2Decode"))
{
fz_jbig2_globals *globals = NULL;
- pdf_obj *obj = pdf_dict_gets(p, "JBIG2Globals");
- if (pdf_is_indirect(obj))
- globals = pdf_load_jbig2_globals(doc, obj);
+ pdf_obj *obj = pdf_dict_gets(ctx, p, "JBIG2Globals");
+ if (pdf_is_indirect(ctx, obj))
+ globals = pdf_load_jbig2_globals(ctx, doc, obj);
/* fz_open_jbig2d takes possession of globals */
- return fz_open_jbig2d(chain, globals);
+ return fz_open_jbig2d(ctx, chain, globals);
}
else if (!strcmp(s, "JPXDecode"))
@@ -216,9 +214,9 @@ build_filter(fz_stream *chain, pdf_document *doc, pdf_obj *f, pdf_obj *p, int nu
return chain;
}
- name = pdf_dict_gets(p, "Name");
- if (pdf_is_name(name))
- return pdf_open_crypt_with_filter(chain, doc->crypt, pdf_to_name(name), num, gen);
+ name = pdf_dict_gets(ctx, p, "Name");
+ if (pdf_is_name(ctx, name))
+ return pdf_open_crypt_with_filter(ctx, chain, doc->crypt, pdf_to_name(ctx, name), num, gen);
return chain;
}
@@ -233,30 +231,29 @@ build_filter(fz_stream *chain, pdf_document *doc, pdf_obj *f, pdf_obj *p, int nu
* Assume ownership of head.
*/
static fz_stream *
-build_filter_chain(fz_stream *chain, pdf_document *doc, pdf_obj *fs, pdf_obj *ps, int num, int gen, fz_compression_params *params)
+build_filter_chain(fz_context *ctx, fz_stream *chain, pdf_document *doc, pdf_obj *fs, pdf_obj *ps, int num, int gen, fz_compression_params *params)
{
pdf_obj *f;
pdf_obj *p;
int i, n;
- fz_context *ctx = chain->ctx;
fz_try(ctx)
{
- n = pdf_array_len(fs);
+ n = pdf_array_len(ctx, fs);
for (i = 0; i < n; i++)
{
fz_stream *chain2;
- f = pdf_array_get(fs, i);
- p = pdf_array_get(ps, i);
+ f = pdf_array_get(ctx, fs, i);
+ p = pdf_array_get(ctx, ps, i);
chain2 = chain;
chain = NULL;
- chain = build_filter(chain2, doc, f, p, num, gen, (i == n-1 ? params : NULL));
+ chain = build_filter(ctx, chain2, doc, f, p, num, gen, (i == n-1 ? params : NULL));
}
}
fz_catch(ctx)
{
- fz_drop_stream(chain);
+ fz_drop_stream(ctx, chain);
fz_rethrow(ctx);
}
@@ -272,28 +269,27 @@ build_filter_chain(fz_stream *chain, pdf_document *doc, pdf_obj *fs, pdf_obj *ps
* orig_num and orig_gen are used purely to seed the encryption.
*/
static fz_stream *
-pdf_open_raw_filter(fz_stream *chain, pdf_document *doc, pdf_obj *stmobj, int num, int orig_num, int orig_gen, int offset)
+pdf_open_raw_filter(fz_context *ctx, fz_stream *chain, pdf_document *doc, pdf_obj *stmobj, int num, int orig_num, int orig_gen, int offset)
{
- fz_context *ctx = chain->ctx;
int hascrypt;
int len;
- if (num > 0 && num < pdf_xref_len(doc))
+ if (num > 0 && num < pdf_xref_len(ctx, doc))
{
- pdf_xref_entry *entry = pdf_get_xref_entry(doc, num);
+ pdf_xref_entry *entry = pdf_get_xref_entry(ctx, doc, num);
if (entry->stm_buf)
return fz_open_buffer(ctx, entry->stm_buf);
}
/* don't close chain when we close this filter */
- fz_keep_stream(chain);
+ fz_keep_stream(ctx, chain);
- len = pdf_to_int(pdf_dict_gets(stmobj, "Length"));
- chain = fz_open_null(chain, len, offset);
+ len = pdf_to_int(ctx, pdf_dict_gets(ctx, stmobj, "Length"));
+ chain = fz_open_null(ctx, chain, len, offset);
hascrypt = pdf_stream_has_crypt(ctx, stmobj);
if (doc->crypt && !hascrypt)
- chain = pdf_open_crypt(chain, doc->crypt, orig_num, orig_gen);
+ chain = pdf_open_crypt(ctx, chain, doc->crypt, orig_num, orig_gen);
return chain;
}
@@ -303,37 +299,37 @@ pdf_open_raw_filter(fz_stream *chain, pdf_document *doc, pdf_obj *stmobj, int nu
* to stream length and decrypting.
*/
static fz_stream *
-pdf_open_filter(fz_stream *chain, pdf_document *doc, pdf_obj *stmobj, int num, int gen, int offset, fz_compression_params *imparams)
+pdf_open_filter(fz_context *ctx, pdf_document *doc, fz_stream *chain, pdf_obj *stmobj, int num, int gen, int offset, fz_compression_params *imparams)
{
pdf_obj *filters;
pdf_obj *params;
- filters = pdf_dict_getsa(stmobj, "Filter", "F");
- params = pdf_dict_getsa(stmobj, "DecodeParms", "DP");
+ filters = pdf_dict_getsa(ctx, stmobj, "Filter", "F");
+ params = pdf_dict_getsa(ctx, stmobj, "DecodeParms", "DP");
- chain = pdf_open_raw_filter(chain, doc, stmobj, num, num, gen, offset);
+ chain = pdf_open_raw_filter(ctx, chain, doc, stmobj, num, num, gen, offset);
fz_var(chain);
- fz_try(doc->ctx)
+ fz_try(ctx)
{
- if (pdf_is_name(filters))
+ if (pdf_is_name(ctx, filters))
{
fz_stream *chain2 = chain;
chain = NULL;
- chain = build_filter(chain2, doc, filters, params, num, gen, imparams);
+ chain = build_filter(ctx, chain2, doc, filters, params, num, gen, imparams);
}
- else if (pdf_array_len(filters) > 0)
+ else if (pdf_array_len(ctx, filters) > 0)
{
fz_stream *chain2 = chain;
chain = NULL;
- chain = build_filter_chain(chain2, doc, filters, params, num, gen, imparams);
+ chain = build_filter_chain(ctx, chain2, doc, filters, params, num, gen, imparams);
}
}
- fz_catch(doc->ctx)
+ fz_catch(ctx)
{
- fz_drop_stream(chain);
- fz_rethrow(doc->ctx);
+ fz_drop_stream(ctx, chain);
+ fz_rethrow(ctx);
}
return chain;
@@ -344,31 +340,30 @@ pdf_open_filter(fz_stream *chain, pdf_document *doc, pdf_obj *stmobj, int num, i
* constraining to stream length, and without decryption.
*/
fz_stream *
-pdf_open_inline_stream(pdf_document *doc, pdf_obj *stmobj, int length, fz_stream *chain, fz_compression_params *imparams)
+pdf_open_inline_stream(fz_context *ctx, pdf_document *doc, pdf_obj *stmobj, int length, fz_stream *chain, fz_compression_params *imparams)
{
pdf_obj *filters;
pdf_obj *params;
- filters = pdf_dict_getsa(stmobj, "Filter", "F");
- params = pdf_dict_getsa(stmobj, "DecodeParms", "DP");
+ filters = pdf_dict_getsa(ctx, stmobj, "Filter", "F");
+ params = pdf_dict_getsa(ctx, stmobj, "DecodeParms", "DP");
/* don't close chain when we close this filter */
- fz_keep_stream(chain);
+ fz_keep_stream(ctx, chain);
- if (pdf_is_name(filters))
- return build_filter(chain, doc, filters, params, 0, 0, imparams);
- if (pdf_array_len(filters) > 0)
- return build_filter_chain(chain, doc, filters, params, 0, 0, imparams);
+ if (pdf_is_name(ctx, filters))
+ return build_filter(ctx, chain, doc, filters, params, 0, 0, imparams);
+ if (pdf_array_len(ctx, filters) > 0)
+ return build_filter_chain(ctx, chain, doc, filters, params, 0, 0, imparams);
if (imparams)
imparams->type = FZ_IMAGE_RAW;
- return fz_open_null(chain, length, fz_tell(chain));
+ return fz_open_null(ctx, chain, length, fz_tell(ctx, chain));
}
void
-pdf_load_compressed_inline_image(pdf_document *doc, pdf_obj *dict, int length, fz_stream *stm, int indexed, fz_image *image)
+pdf_load_compressed_inline_image(fz_context *ctx, pdf_document *doc, pdf_obj *dict, int length, fz_stream *stm, int indexed, fz_image *image)
{
- fz_context *ctx = doc->ctx;
fz_compressed_buffer *bc = fz_malloc_struct(ctx, fz_compressed_buffer);
fz_try(ctx)
@@ -376,8 +371,8 @@ pdf_load_compressed_inline_image(pdf_document *doc, pdf_obj *dict, int length, f
int dummy_l2factor = 0;
bc->buffer = fz_new_buffer(ctx, 1024);
- stm = pdf_open_inline_stream(doc, dict, length, stm, &bc->params);
- stm = fz_open_leecher(stm, bc->buffer);
+ stm = pdf_open_inline_stream(ctx, doc, dict, length, stm, &bc->params);
+ stm = fz_open_leecher(ctx, stm, bc->buffer);
stm = fz_open_image_decomp_stream(ctx, stm, &bc->params, &dummy_l2factor);
image->tile = fz_decomp_image_from_stream(ctx, stm, image, indexed, 0, 0);
@@ -394,39 +389,39 @@ pdf_load_compressed_inline_image(pdf_document *doc, pdf_obj *dict, int length, f
* Open a stream for reading the raw (compressed but decrypted) data.
*/
fz_stream *
-pdf_open_raw_stream(pdf_document *doc, int num, int gen)
+pdf_open_raw_stream(fz_context *ctx, pdf_document *doc, int num, int gen)
{
- return pdf_open_raw_renumbered_stream(doc, num, gen, num, gen);
+ return pdf_open_raw_renumbered_stream(ctx, doc, num, gen, num, gen);
}
fz_stream *
-pdf_open_raw_renumbered_stream(pdf_document *doc, int num, int gen, int orig_num, int orig_gen)
+pdf_open_raw_renumbered_stream(fz_context *ctx, pdf_document *doc, int num, int gen, int orig_num, int orig_gen)
{
pdf_xref_entry *x;
- if (num <= 0 || num >= pdf_xref_len(doc))
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "object id out of range (%d %d R)", num, gen);
+ if (num <= 0 || num >= pdf_xref_len(ctx, doc))
+ fz_throw(ctx, FZ_ERROR_GENERIC, "object id out of range (%d %d R)", num, gen);
- x = pdf_cache_object(doc, num, gen);
+ x = pdf_cache_object(ctx, doc, num, gen);
if (x->stm_ofs == 0)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "object is not a stream");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "object is not a stream");
- return pdf_open_raw_filter(doc->file, doc, x->obj, num, orig_num, orig_gen, x->stm_ofs);
+ return pdf_open_raw_filter(ctx, doc->file, doc, x->obj, num, orig_num, orig_gen, x->stm_ofs);
}
static fz_stream *
-pdf_open_image_stream(pdf_document *doc, int num, int gen, int orig_num, int orig_gen, fz_compression_params *params)
+pdf_open_image_stream(fz_context *ctx, pdf_document *doc, int num, int gen, int orig_num, int orig_gen, fz_compression_params *params)
{
pdf_xref_entry *x;
- if (num <= 0 || num >= pdf_xref_len(doc))
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "object id out of range (%d %d R)", num, gen);
+ if (num <= 0 || num >= pdf_xref_len(ctx, doc))
+ fz_throw(ctx, FZ_ERROR_GENERIC, "object id out of range (%d %d R)", num, gen);
- x = pdf_cache_object(doc, num, gen);
+ x = pdf_cache_object(ctx, doc, num, gen);
if (x->stm_ofs == 0 && x->stm_buf == NULL)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "object is not a stream");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "object is not a stream");
- return pdf_open_filter(doc->file, doc, x->obj, orig_num, orig_gen, x->stm_ofs, params);
+ return pdf_open_filter(ctx, doc, doc->file, x->obj, orig_num, orig_gen, x->stm_ofs, params);
}
/*
@@ -435,55 +430,55 @@ pdf_open_image_stream(pdf_document *doc, int num, int gen, int orig_num, int ori
* Using doc->file while a stream is open is a Bad idea.
*/
fz_stream *
-pdf_open_stream(pdf_document *doc, int num, int gen)
+pdf_open_stream(fz_context *ctx, pdf_document *doc, int num, int gen)
{
- return pdf_open_image_stream(doc, num, gen, num, gen, NULL);
+ return pdf_open_image_stream(ctx, doc, num, gen, num, gen, NULL);
}
fz_stream *
-pdf_open_stream_with_offset(pdf_document *doc, int num, int gen, pdf_obj *dict, int stm_ofs)
+pdf_open_stream_with_offset(fz_context *ctx, pdf_document *doc, int num, int gen, pdf_obj *dict, int stm_ofs)
{
if (stm_ofs == 0)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "object is not a stream");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "object is not a stream");
- return pdf_open_filter(doc->file, doc, dict, num, gen, stm_ofs, NULL);
+ return pdf_open_filter(ctx, doc, doc->file, dict, num, gen, stm_ofs, NULL);
}
/*
* Load raw (compressed but decrypted) contents of a stream into buf.
*/
fz_buffer *
-pdf_load_raw_stream(pdf_document *doc, int num, int gen)
+pdf_load_raw_stream(fz_context *ctx, pdf_document *doc, int num, int gen)
{
- return pdf_load_raw_renumbered_stream(doc, num, gen, num, gen);
+ return pdf_load_raw_renumbered_stream(ctx, doc, num, gen, num, gen);
}
fz_buffer *
-pdf_load_raw_renumbered_stream(pdf_document *doc, int num, int gen, int orig_num, int orig_gen)
+pdf_load_raw_renumbered_stream(fz_context *ctx, pdf_document *doc, int num, int gen, int orig_num, int orig_gen)
{
fz_stream *stm;
pdf_obj *dict;
int len;
fz_buffer *buf;
- if (num > 0 && num < pdf_xref_len(doc))
+ if (num > 0 && num < pdf_xref_len(ctx, doc))
{
- pdf_xref_entry *entry = pdf_get_xref_entry(doc, num);
+ pdf_xref_entry *entry = pdf_get_xref_entry(ctx, doc, num);
if (entry->stm_buf)
- return fz_keep_buffer(doc->ctx, entry->stm_buf);
+ return fz_keep_buffer(ctx, entry->stm_buf);
}
- dict = pdf_load_object(doc, num, gen);
+ dict = pdf_load_object(ctx, doc, num, gen);
- len = pdf_to_int(pdf_dict_gets(dict, "Length"));
+ len = pdf_to_int(ctx, pdf_dict_gets(ctx, dict, "Length"));
- pdf_drop_obj(dict);
+ pdf_drop_obj(ctx, dict);
- stm = pdf_open_raw_renumbered_stream(doc, num, gen, orig_num, orig_gen);
+ stm = pdf_open_raw_renumbered_stream(ctx, doc, num, gen, orig_num, orig_gen);
- buf = fz_read_all(stm, len);
+ buf = fz_read_all(ctx, stm, len);
- fz_drop_stream(stm);
+ fz_drop_stream(ctx, stm);
return buf;
}
@@ -504,9 +499,8 @@ pdf_guess_filter_length(int len, char *filter)
}
static fz_buffer *
-pdf_load_image_stream(pdf_document *doc, int num, int gen, int orig_num, int orig_gen, fz_compression_params *params, int *truncated)
+pdf_load_image_stream(fz_context *ctx, pdf_document *doc, int num, int gen, int orig_num, int orig_gen, fz_compression_params *params, int *truncated)
{
- fz_context *ctx = doc->ctx;
fz_stream *stm = NULL;
pdf_obj *dict, *obj;
int i, len, n;
@@ -514,36 +508,36 @@ pdf_load_image_stream(pdf_document *doc, int num, int gen, int orig_num, int ori
fz_var(buf);
- if (num > 0 && num < pdf_xref_len(doc))
+ if (num > 0 && num < pdf_xref_len(ctx, doc))
{
- pdf_xref_entry *entry = pdf_get_xref_entry(doc, num);
+ pdf_xref_entry *entry = pdf_get_xref_entry(ctx, doc, num);
if (entry->stm_buf)
- return fz_keep_buffer(doc->ctx, entry->stm_buf);
+ return fz_keep_buffer(ctx, entry->stm_buf);
}
- dict = pdf_load_object(doc, num, gen);
+ dict = pdf_load_object(ctx, doc, num, gen);
- len = pdf_to_int(pdf_dict_gets(dict, "Length"));
- obj = pdf_dict_gets(dict, "Filter");
- len = pdf_guess_filter_length(len, pdf_to_name(obj));
- n = pdf_array_len(obj);
+ len = pdf_to_int(ctx, pdf_dict_gets(ctx, dict, "Length"));
+ obj = pdf_dict_gets(ctx, dict, "Filter");
+ len = pdf_guess_filter_length(len, pdf_to_name(ctx, obj));
+ n = pdf_array_len(ctx, obj);
for (i = 0; i < n; i++)
- len = pdf_guess_filter_length(len, pdf_to_name(pdf_array_get(obj, i)));
+ len = pdf_guess_filter_length(len, pdf_to_name(ctx, pdf_array_get(ctx, obj, i)));
- pdf_drop_obj(dict);
+ pdf_drop_obj(ctx, dict);
- stm = pdf_open_image_stream(doc, num, gen, orig_num, orig_gen, params);
+ stm = pdf_open_image_stream(ctx, doc, num, gen, orig_num, orig_gen, params);
fz_try(ctx)
{
if (truncated)
- buf = fz_read_best(stm, len, truncated);
+ buf = fz_read_best(ctx, stm, len, truncated);
else
- buf = fz_read_all(stm, len);
+ buf = fz_read_all(ctx, stm, len);
}
fz_always(ctx)
{
- fz_drop_stream(stm);
+ fz_drop_stream(ctx, stm);
}
fz_catch(ctx)
{
@@ -557,26 +551,25 @@ pdf_load_image_stream(pdf_document *doc, int num, int gen, int orig_num, int ori
* Load uncompressed contents of a stream into buf.
*/
fz_buffer *
-pdf_load_stream(pdf_document *doc, int num, int gen)
+pdf_load_stream(fz_context *ctx, pdf_document *doc, int num, int gen)
{
- return pdf_load_image_stream(doc, num, gen, num, gen, NULL, NULL);
+ return pdf_load_image_stream(ctx, doc, num, gen, num, gen, NULL, NULL);
}
fz_buffer *
-pdf_load_renumbered_stream(pdf_document *doc, int num, int gen, int orig_num, int orig_gen, int *truncated)
+pdf_load_renumbered_stream(fz_context *ctx, pdf_document *doc, int num, int gen, int orig_num, int orig_gen, int *truncated)
{
- return pdf_load_image_stream(doc, num, gen, orig_num, orig_gen, NULL, truncated);
+ return pdf_load_image_stream(ctx, doc, num, gen, orig_num, orig_gen, NULL, truncated);
}
fz_compressed_buffer *
-pdf_load_compressed_stream(pdf_document *doc, int num, int gen)
+pdf_load_compressed_stream(fz_context *ctx, pdf_document *doc, int num, int gen)
{
- fz_context *ctx = doc->ctx;
fz_compressed_buffer *bc = fz_malloc_struct(ctx, fz_compressed_buffer);
fz_try(ctx)
{
- bc->buffer = pdf_load_image_stream(doc, num, gen, num, gen, &bc->params, NULL);
+ bc->buffer = pdf_load_image_stream(ctx, doc, num, gen, num, gen, &bc->params, NULL);
}
fz_catch(ctx)
{
@@ -587,22 +580,21 @@ pdf_load_compressed_stream(pdf_document *doc, int num, int gen)
}
static fz_stream *
-pdf_open_object_array(pdf_document *doc, pdf_obj *list)
+pdf_open_object_array(fz_context *ctx, pdf_document *doc, pdf_obj *list)
{
- int i, n;
- fz_context *ctx = doc->ctx;
fz_stream *stm;
+ int i, n;
- n = pdf_array_len(list);
+ n = pdf_array_len(ctx, list);
stm = fz_open_concat(ctx, n, 1);
fz_var(i); /* Workaround Mac compiler bug */
for (i = 0; i < n; i++)
{
- pdf_obj *obj = pdf_array_get(list, i);
+ pdf_obj *obj = pdf_array_get(ctx, list, i);
fz_try(ctx)
{
- fz_concat_push(stm, pdf_open_stream(doc, pdf_to_num(obj), pdf_to_gen(obj)));
+ fz_concat_push(ctx, stm, pdf_open_stream(ctx, doc, pdf_to_num(ctx, obj), pdf_to_gen(ctx, obj)));
}
fz_catch(ctx)
{
@@ -616,18 +608,17 @@ pdf_open_object_array(pdf_document *doc, pdf_obj *list)
}
fz_stream *
-pdf_open_contents_stream(pdf_document *doc, pdf_obj *obj)
+pdf_open_contents_stream(fz_context *ctx, pdf_document *doc, pdf_obj *obj)
{
- fz_context *ctx = doc->ctx;
int num, gen;
- if (pdf_is_array(obj))
- return pdf_open_object_array(doc, obj);
+ if (pdf_is_array(ctx, obj))
+ return pdf_open_object_array(ctx, doc, obj);
- num = pdf_to_num(obj);
- gen = pdf_to_gen(obj);
- if (pdf_is_stream(doc, num, gen))
- return pdf_open_image_stream(doc, num, gen, num, gen, NULL);
+ num = pdf_to_num(ctx, obj);
+ gen = pdf_to_gen(ctx, obj);
+ if (pdf_is_stream(ctx, doc, num, gen))
+ return pdf_open_image_stream(ctx, doc, num, gen, num, gen, NULL);
fz_warn(ctx, "pdf object stream missing (%d %d R)", num, gen);
return NULL;
diff --git a/source/pdf/pdf-type3.c b/source/pdf/pdf-type3.c
index 3bb01a1c..3da74806 100644
--- a/source/pdf/pdf-type3.c
+++ b/source/pdf/pdf-type3.c
@@ -1,20 +1,20 @@
#include "mupdf/pdf.h"
static void
-pdf_run_glyph_func(void *doc, void *rdb, fz_buffer *contents, fz_device *dev, const fz_matrix *ctm, void *gstate, int nested_depth)
+pdf_run_glyph_func(fz_context *ctx, void *doc, void *rdb, fz_buffer *contents, fz_device *dev, const fz_matrix *ctm, void *gstate, int nested_depth)
{
- pdf_run_glyph(doc, (pdf_obj *)rdb, contents, dev, ctm, gstate, nested_depth);
+ pdf_run_glyph(ctx, doc, (pdf_obj *)rdb, contents, dev, ctm, gstate, nested_depth);
}
static void
-pdf_t3_free_resources(void *doc, void *rdb_)
+pdf_t3_free_resources(fz_context *ctx, void *doc, void *rdb_)
{
pdf_obj *rdb = (pdf_obj *)rdb_;
- pdf_drop_obj(rdb);
+ pdf_drop_obj(ctx, rdb);
}
pdf_font_desc *
-pdf_load_type3_font(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict)
+pdf_load_type3_font(fz_context *ctx, pdf_document *doc, pdf_obj *rdb, pdf_obj *dict)
{
char buf[256];
char *estrings[256];
@@ -27,7 +27,6 @@ pdf_load_type3_font(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict)
int i, k, n;
fz_rect bbox;
fz_matrix matrix;
- fz_context *ctx = doc->ctx;
fz_var(fontdesc);
@@ -38,24 +37,24 @@ pdf_load_type3_font(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict)
if (new_max == 0)
new_max = 4;
- doc->type3_fonts = fz_resize_array(doc->ctx, doc->type3_fonts, new_max, sizeof(*doc->type3_fonts));
+ doc->type3_fonts = fz_resize_array(ctx, doc->type3_fonts, new_max, sizeof(*doc->type3_fonts));
doc->max_type3_fonts = new_max;
}
fz_try(ctx)
{
- obj = pdf_dict_gets(dict, "Name");
- if (pdf_is_name(obj))
- fz_strlcpy(buf, pdf_to_name(obj), sizeof buf);
+ obj = pdf_dict_gets(ctx, dict, "Name");
+ if (pdf_is_name(ctx, obj))
+ fz_strlcpy(buf, pdf_to_name(ctx, obj), sizeof buf);
else
fz_strlcpy(buf, "Unnamed-T3", sizeof buf);
fontdesc = pdf_new_font_desc(ctx);
- obj = pdf_dict_gets(dict, "FontMatrix");
+ obj = pdf_dict_gets(ctx, dict, "FontMatrix");
pdf_to_matrix(ctx, obj, &matrix);
- obj = pdf_dict_gets(dict, "FontBBox");
+ obj = pdf_dict_gets(ctx, dict, "FontBBox");
fz_transform_rect(pdf_to_rect(ctx, obj, &bbox), &matrix);
fontdesc->font = fz_new_type3_font(ctx, buf, &matrix);
@@ -68,35 +67,35 @@ pdf_load_type3_font(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict)
for (i = 0; i < 256; i++)
estrings[i] = NULL;
- encoding = pdf_dict_gets(dict, "Encoding");
+ encoding = pdf_dict_gets(ctx, dict, "Encoding");
if (!encoding)
{
fz_throw(ctx, FZ_ERROR_GENERIC, "syntaxerror: Type3 font missing Encoding");
}
- if (pdf_is_name(encoding))
- pdf_load_encoding(estrings, pdf_to_name(encoding));
+ if (pdf_is_name(ctx, encoding))
+ pdf_load_encoding(estrings, pdf_to_name(ctx, encoding));
- if (pdf_is_dict(encoding))
+ if (pdf_is_dict(ctx, encoding))
{
pdf_obj *base, *diff, *item;
- base = pdf_dict_gets(encoding, "BaseEncoding");
- if (pdf_is_name(base))
- pdf_load_encoding(estrings, pdf_to_name(base));
+ base = pdf_dict_gets(ctx, encoding, "BaseEncoding");
+ if (pdf_is_name(ctx, base))
+ pdf_load_encoding(estrings, pdf_to_name(ctx, base));
- diff = pdf_dict_gets(encoding, "Differences");
- if (pdf_is_array(diff))
+ diff = pdf_dict_gets(ctx, encoding, "Differences");
+ if (pdf_is_array(ctx, diff))
{
- n = pdf_array_len(diff);
+ n = pdf_array_len(ctx, diff);
k = 0;
for (i = 0; i < n; i++)
{
- item = pdf_array_get(diff, i);
- if (pdf_is_int(item))
- k = pdf_to_int(item);
- if (pdf_is_name(item) && k >= 0 && k < nelem(estrings))
- estrings[k++] = pdf_to_name(item);
+ item = pdf_array_get(ctx, diff, i);
+ if (pdf_is_int(ctx, item))
+ k = pdf_to_int(ctx, item);
+ if (pdf_is_name(ctx, item) && k >= 0 && k < nelem(estrings))
+ estrings[k++] = pdf_to_name(ctx, item);
}
}
}
@@ -104,19 +103,19 @@ pdf_load_type3_font(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict)
fontdesc->encoding = pdf_new_identity_cmap(ctx, 0, 1);
fontdesc->size += pdf_cmap_size(ctx, fontdesc->encoding);
- pdf_load_to_unicode(doc, fontdesc, estrings, NULL, pdf_dict_gets(dict, "ToUnicode"));
+ pdf_load_to_unicode(ctx, doc, fontdesc, estrings, NULL, pdf_dict_gets(ctx, dict, "ToUnicode"));
/* Widths */
pdf_set_default_hmtx(ctx, fontdesc, 0);
- first = pdf_to_int(pdf_dict_gets(dict, "FirstChar"));
- last = pdf_to_int(pdf_dict_gets(dict, "LastChar"));
+ first = pdf_to_int(ctx, pdf_dict_gets(ctx, dict, "FirstChar"));
+ last = pdf_to_int(ctx, pdf_dict_gets(ctx, dict, "LastChar"));
if (first < 0 || last > 255 || first > last)
first = last = 0;
- widths = pdf_dict_gets(dict, "Widths");
+ widths = pdf_dict_gets(ctx, dict, "Widths");
if (!widths)
{
fz_throw(ctx, FZ_ERROR_GENERIC, "syntaxerror: Type3 font missing Widths");
@@ -124,7 +123,7 @@ pdf_load_type3_font(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict)
for (i = first; i <= last; i++)
{
- float w = pdf_to_real(pdf_array_get(widths, i - first));
+ float w = pdf_to_real(ctx, pdf_array_get(ctx, widths, i - first));
w = fontdesc->font->t3matrix.a * w * 1000;
fontdesc->font->t3widths[i] = w * 0.001f;
pdf_add_hmtx(ctx, fontdesc, i, i, w);
@@ -135,11 +134,11 @@ pdf_load_type3_font(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict)
/* Resources -- inherit page resources if the font doesn't have its own */
fontdesc->font->t3freeres = pdf_t3_free_resources;
- fontdesc->font->t3resources = pdf_dict_gets(dict, "Resources");
+ fontdesc->font->t3resources = pdf_dict_gets(ctx, dict, "Resources");
if (!fontdesc->font->t3resources)
fontdesc->font->t3resources = rdb;
if (fontdesc->font->t3resources)
- pdf_keep_obj(fontdesc->font->t3resources);
+ pdf_keep_obj(ctx, fontdesc->font->t3resources);
if (!fontdesc->font->t3resources)
fz_warn(ctx, "no resource dictionary for type 3 font!");
@@ -148,7 +147,7 @@ pdf_load_type3_font(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict)
/* CharProcs */
- charprocs = pdf_dict_gets(dict, "CharProcs");
+ charprocs = pdf_dict_gets(ctx, dict, "CharProcs");
if (!charprocs)
{
fz_throw(ctx, FZ_ERROR_GENERIC, "syntaxerror: Type3 font missing CharProcs");
@@ -158,10 +157,10 @@ pdf_load_type3_font(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict)
{
if (estrings[i])
{
- obj = pdf_dict_gets(charprocs, estrings[i]);
- if (pdf_is_stream(doc, pdf_to_num(obj), pdf_to_gen(obj)))
+ obj = pdf_dict_gets(ctx, charprocs, estrings[i]);
+ if (pdf_is_stream(ctx, doc, pdf_to_num(ctx, obj), pdf_to_gen(ctx, obj)))
{
- fontdesc->font->t3procs[i] = pdf_load_stream(doc, pdf_to_num(obj), pdf_to_gen(obj));
+ fontdesc->font->t3procs[i] = pdf_load_stream(ctx, doc, pdf_to_num(ctx, obj), pdf_to_gen(ctx, obj));
fontdesc->size += fontdesc->font->t3procs[i]->cap;
fontdesc->size += 0; // TODO: display list size calculation
}
@@ -172,7 +171,7 @@ pdf_load_type3_font(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict)
{
if (fontdesc)
pdf_drop_font(ctx, fontdesc);
- fz_rethrow_message(ctx, "cannot load type3 font (%d %d R)", pdf_to_num(dict), pdf_to_gen(dict));
+ fz_rethrow_message(ctx, "cannot load type3 font (%d %d R)", pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict));
}
doc->type3_fonts[doc->num_type3_fonts++] = fz_keep_font(ctx, fontdesc->font);
@@ -180,10 +179,9 @@ pdf_load_type3_font(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict)
return fontdesc;
}
-void pdf_load_type3_glyphs(pdf_document *doc, pdf_font_desc *fontdesc, int nested_depth)
+void pdf_load_type3_glyphs(fz_context *ctx, pdf_document *doc, pdf_font_desc *fontdesc, int nested_depth)
{
int i;
- fz_context *ctx = doc->ctx;
fz_try(ctx)
{
diff --git a/source/pdf/pdf-unicode.c b/source/pdf/pdf-unicode.c
index d51d580b..7b04c02c 100644
--- a/source/pdf/pdf-unicode.c
+++ b/source/pdf/pdf-unicode.c
@@ -56,15 +56,14 @@ pdf_remap_cmap(fz_context *ctx, pdf_cmap *gid_from_cpt, pdf_cmap *ucs_from_cpt)
}
void
-pdf_load_to_unicode(pdf_document *doc, pdf_font_desc *font,
+pdf_load_to_unicode(fz_context *ctx, pdf_document *doc, pdf_font_desc *font,
char **strings, char *collection, pdf_obj *cmapstm)
{
- fz_context *ctx = doc->ctx;
unsigned int cpt;
- if (pdf_is_stream(doc, pdf_to_num(cmapstm), pdf_to_gen(cmapstm)))
+ if (pdf_is_stream(ctx, doc, pdf_to_num(ctx, cmapstm), pdf_to_gen(ctx, cmapstm)))
{
- pdf_cmap *ucs_from_cpt = pdf_load_embedded_cmap(doc, cmapstm);
+ pdf_cmap *ucs_from_cpt = pdf_load_embedded_cmap(ctx, doc, cmapstm);
font->to_unicode = pdf_remap_cmap(ctx, font->encoding, ucs_from_cpt);
pdf_drop_cmap(ctx, ucs_from_cpt);
font->size += pdf_cmap_size(ctx, font->to_unicode);
diff --git a/source/pdf/pdf-write.c b/source/pdf/pdf-write.c
index 32143c10..1016e8af 100644
--- a/source/pdf/pdf-write.c
+++ b/source/pdf/pdf-write.c
@@ -489,11 +489,11 @@ page_objects_dump(pdf_write_options *opts)
}
static void
-objects_dump(pdf_document *doc, pdf_write_options *opts)
+objects_dump(fz_context *ctx, pdf_document *doc, pdf_write_options *opts)
{
int i;
- for (i=0; i < pdf_xref_len(doc); i++)
+ for (i=0; i < pdf_xref_len(ctx, doc); i++)
{
fprintf(stderr, "Object %d use=%x offset=%d\n", i, opts->use_list[i], opts->ofs_list[i]);
}
@@ -504,13 +504,12 @@ objects_dump(pdf_document *doc, pdf_write_options *opts)
* Garbage collect objects not reachable from the trailer.
*/
-static pdf_obj *sweepref(pdf_document *doc, pdf_write_options *opts, pdf_obj *obj)
+static pdf_obj *sweepref(fz_context *ctx, pdf_document *doc, pdf_write_options *opts, pdf_obj *obj)
{
- int num = pdf_to_num(obj);
- int gen = pdf_to_gen(obj);
- fz_context *ctx = doc->ctx;
+ int num = pdf_to_num(ctx, obj);
+ int gen = pdf_to_gen(ctx, obj);
- if (num <= 0 || num >= pdf_xref_len(doc))
+ if (num <= 0 || num >= pdf_xref_len(ctx, doc))
return NULL;
if (opts->use_list[num])
return NULL;
@@ -520,14 +519,14 @@ static pdf_obj *sweepref(pdf_document *doc, pdf_write_options *opts, pdf_obj *ob
/* Bake in /Length in stream objects */
fz_try(ctx)
{
- if (pdf_is_stream(doc, num, gen))
+ if (pdf_is_stream(ctx, doc, num, gen))
{
- pdf_obj *len = pdf_dict_gets(obj, "Length");
- if (pdf_is_indirect(len))
+ pdf_obj *len = pdf_dict_gets(ctx, obj, "Length");
+ if (pdf_is_indirect(ctx, len))
{
- opts->use_list[pdf_to_num(len)] = 0;
- len = pdf_resolve_indirect(len);
- pdf_dict_puts(obj, "Length", len);
+ opts->use_list[pdf_to_num(ctx, len)] = 0;
+ len = pdf_resolve_indirect(ctx, len);
+ pdf_dict_puts(ctx, obj, "Length", len);
}
}
}
@@ -537,28 +536,28 @@ static pdf_obj *sweepref(pdf_document *doc, pdf_write_options *opts, pdf_obj *ob
/* Leave broken */
}
- return pdf_resolve_indirect(obj);
+ return pdf_resolve_indirect(ctx, obj);
}
-static void sweepobj(pdf_document *doc, pdf_write_options *opts, pdf_obj *obj)
+static void sweepobj(fz_context *ctx, pdf_document *doc, pdf_write_options *opts, pdf_obj *obj)
{
int i;
- if (pdf_is_indirect(obj))
- obj = sweepref(doc, opts, obj);
+ if (pdf_is_indirect(ctx, obj))
+ obj = sweepref(ctx, doc, opts, obj);
- if (pdf_is_dict(obj))
+ if (pdf_is_dict(ctx, obj))
{
- int n = pdf_dict_len(obj);
+ int n = pdf_dict_len(ctx, obj);
for (i = 0; i < n; i++)
- sweepobj(doc, opts, pdf_dict_get_val(obj, i));
+ sweepobj(ctx, doc, opts, pdf_dict_get_val(ctx, obj, i));
}
- else if (pdf_is_array(obj))
+ else if (pdf_is_array(ctx, obj))
{
- int n = pdf_array_len(obj);
+ int n = pdf_array_len(ctx, obj);
for (i = 0; i < n; i++)
- sweepobj(doc, opts, pdf_array_get(obj, i));
+ sweepobj(ctx, doc, opts, pdf_array_get(ctx, obj, i));
}
}
@@ -566,11 +565,10 @@ static void sweepobj(pdf_document *doc, pdf_write_options *opts, pdf_obj *obj)
* Scan for and remove duplicate objects (slow)
*/
-static void removeduplicateobjs(pdf_document *doc, pdf_write_options *opts)
+static void removeduplicateobjs(fz_context *ctx, pdf_document *doc, pdf_write_options *opts)
{
int num, other;
- fz_context *ctx = doc->ctx;
- int xref_len = pdf_xref_len(doc);
+ int xref_len = pdf_xref_len(ctx, doc);
for (num = 1; num < xref_len; num++)
{
@@ -591,8 +589,8 @@ static void removeduplicateobjs(pdf_document *doc, pdf_write_options *opts)
*/
fz_try(ctx)
{
- streama = pdf_is_stream(doc, num, 0);
- streamb = pdf_is_stream(doc, other, 0);
+ streama = pdf_is_stream(ctx, doc, num, 0);
+ streamb = pdf_is_stream(ctx, doc, other, 0);
differ = streama || streamb;
if (streama && streamb && opts->do_garbage >= 4)
differ = 0;
@@ -605,13 +603,13 @@ static void removeduplicateobjs(pdf_document *doc, pdf_write_options *opts)
if (differ)
continue;
- a = pdf_get_xref_entry(doc, num)->obj;
- b = pdf_get_xref_entry(doc, other)->obj;
+ a = pdf_get_xref_entry(ctx, doc, num)->obj;
+ b = pdf_get_xref_entry(ctx, doc, other)->obj;
- a = pdf_resolve_indirect(a);
- b = pdf_resolve_indirect(b);
+ a = pdf_resolve_indirect(ctx, a);
+ b = pdf_resolve_indirect(ctx, b);
- if (pdf_objcmp(a, b))
+ if (pdf_objcmp(ctx, a, b))
continue;
if (streama && streamb)
@@ -628,8 +626,8 @@ static void removeduplicateobjs(pdf_document *doc, pdf_write_options *opts)
{
unsigned char *dataa, *datab;
int lena, lenb;
- sa = pdf_load_raw_renumbered_stream(doc, num, 0, num, 0);
- sb = pdf_load_raw_renumbered_stream(doc, other, 0, other, 0);
+ sa = pdf_load_raw_renumbered_stream(ctx, doc, num, 0, num, 0);
+ sb = pdf_load_raw_renumbered_stream(ctx, doc, other, 0, other, 0);
lena = fz_buffer_storage(ctx, sa, &dataa);
lenb = fz_buffer_storage(ctx, sb, &datab);
if (lena == lenb && memcmp(dataa, datab, lena) == 0)
@@ -667,10 +665,10 @@ static void removeduplicateobjs(pdf_document *doc, pdf_write_options *opts)
* This code assumes that any opts->renumber_map[n] <= n for all n.
*/
-static void compactxref(pdf_document *doc, pdf_write_options *opts)
+static void compactxref(fz_context *ctx, pdf_document *doc, pdf_write_options *opts)
{
int num, newnum;
- int xref_len = pdf_xref_len(doc);
+ int xref_len = pdf_xref_len(ctx, doc);
/*
* Update renumber_map in-place, clustering all used
@@ -709,75 +707,74 @@ static void compactxref(pdf_document *doc, pdf_write_options *opts)
* removing duplicate objects and compacting the xref.
*/
-static void renumberobj(pdf_document *doc, pdf_write_options *opts, pdf_obj *obj)
+static void renumberobj(fz_context *ctx, pdf_document *doc, pdf_write_options *opts, pdf_obj *obj)
{
int i;
- int xref_len = pdf_xref_len(doc);
+ int xref_len = pdf_xref_len(ctx, doc);
- if (pdf_is_dict(obj))
+ if (pdf_is_dict(ctx, obj))
{
- int n = pdf_dict_len(obj);
+ int n = pdf_dict_len(ctx, obj);
for (i = 0; i < n; i++)
{
- pdf_obj *key = pdf_dict_get_key(obj, i);
- pdf_obj *val = pdf_dict_get_val(obj, i);
- if (pdf_is_indirect(val))
+ pdf_obj *key = pdf_dict_get_key(ctx, obj, i);
+ pdf_obj *val = pdf_dict_get_val(ctx, obj, i);
+ if (pdf_is_indirect(ctx, val))
{
- int o = pdf_to_num(val);
+ int o = pdf_to_num(ctx, val);
if (o >= xref_len || o <= 0 || opts->renumber_map[o] == 0)
- val = pdf_new_null(doc);
+ val = pdf_new_null(ctx, doc);
else
- val = pdf_new_indirect(doc, opts->renumber_map[o], 0);
- pdf_dict_put(obj, key, val);
- pdf_drop_obj(val);
+ val = pdf_new_indirect(ctx, doc, opts->renumber_map[o], 0);
+ pdf_dict_put(ctx, obj, key, val);
+ pdf_drop_obj(ctx, val);
}
else
{
- renumberobj(doc, opts, val);
+ renumberobj(ctx, doc, opts, val);
}
}
}
- else if (pdf_is_array(obj))
+ else if (pdf_is_array(ctx, obj))
{
- int n = pdf_array_len(obj);
+ int n = pdf_array_len(ctx, obj);
for (i = 0; i < n; i++)
{
- pdf_obj *val = pdf_array_get(obj, i);
- if (pdf_is_indirect(val))
+ pdf_obj *val = pdf_array_get(ctx, obj, i);
+ if (pdf_is_indirect(ctx, val))
{
- int o = pdf_to_num(val);
+ int o = pdf_to_num(ctx, val);
if (o >= xref_len || o <= 0 || opts->renumber_map[o] == 0)
- val = pdf_new_null(doc);
+ val = pdf_new_null(ctx, doc);
else
- val = pdf_new_indirect(doc, opts->renumber_map[o], 0);
- pdf_array_put(obj, i, val);
- pdf_drop_obj(val);
+ val = pdf_new_indirect(ctx, doc, opts->renumber_map[o], 0);
+ pdf_array_put(ctx, obj, i, val);
+ pdf_drop_obj(ctx, val);
}
else
{
- renumberobj(doc, opts, val);
+ renumberobj(ctx, doc, opts, val);
}
}
}
}
-static void renumberobjs(pdf_document *doc, pdf_write_options *opts)
+static void renumberobjs(fz_context *ctx, pdf_document *doc, pdf_write_options *opts)
{
pdf_xref_entry *newxref = NULL;
int newlen;
int num;
- fz_context *ctx = doc->ctx;
int *new_use_list;
- int xref_len = pdf_xref_len(doc);
+ int xref_len = pdf_xref_len(ctx, doc);
- new_use_list = fz_calloc(ctx, pdf_xref_len(doc)+3, sizeof(int));
+ new_use_list = fz_calloc(ctx, pdf_xref_len(ctx, doc)+3, sizeof(int));
fz_var(newxref);
fz_try(ctx)
{
/* Apply renumber map to indirect references in all objects in xref */
- renumberobj(doc, opts, pdf_trailer(doc));
+ renumberobj(ctx, doc, opts, pdf_trailer(ctx, doc));
for (num = 0; num < xref_len; num++)
{
pdf_obj *obj;
@@ -787,23 +784,23 @@ static void renumberobjs(pdf_document *doc, pdf_write_options *opts)
if (to == 0)
continue;
- obj = pdf_get_xref_entry(doc, num)->obj;
+ obj = pdf_get_xref_entry(ctx, doc, num)->obj;
- if (pdf_is_indirect(obj))
+ if (pdf_is_indirect(ctx, obj))
{
- obj = pdf_new_indirect(doc, to, 0);
- pdf_update_object(doc, num, obj);
- pdf_drop_obj(obj);
+ obj = pdf_new_indirect(ctx, doc, to, 0);
+ pdf_update_object(ctx, doc, num, obj);
+ pdf_drop_obj(ctx, obj);
}
else
{
- renumberobj(doc, opts, obj);
+ renumberobj(ctx, doc, opts, obj);
}
}
/* Create new table for the reordered, compacted xref */
newxref = fz_malloc_array(ctx, xref_len + 3, sizeof(pdf_xref_entry));
- newxref[0] = *pdf_get_xref_entry(doc, 0);
+ newxref[0] = *pdf_get_xref_entry(ctx, doc, 0);
/* Move used objects into the new compacted xref */
newlen = 0;
@@ -814,24 +811,24 @@ static void renumberobjs(pdf_document *doc, pdf_write_options *opts)
pdf_xref_entry *e;
if (newlen < opts->renumber_map[num])
newlen = opts->renumber_map[num];
- e = pdf_get_xref_entry(doc, num);
+ e = pdf_get_xref_entry(ctx, doc, num);
newxref[opts->renumber_map[num]] = *e;
if (e->obj)
{
- pdf_set_obj_parent(e->obj, opts->renumber_map[num]);
+ pdf_set_obj_parent(ctx, e->obj, opts->renumber_map[num]);
e->obj = NULL;
}
new_use_list[opts->renumber_map[num]] = opts->use_list[num];
}
else
{
- pdf_xref_entry *e = pdf_get_xref_entry(doc, num);
- pdf_drop_obj(e->obj);
+ pdf_xref_entry *e = pdf_get_xref_entry(ctx, doc, num);
+ pdf_drop_obj(ctx, e->obj);
e->obj = NULL;
}
}
- pdf_replace_xref(doc, newxref, newlen + 1);
+ pdf_replace_xref(ctx, doc, newxref, newlen + 1);
newxref = NULL;
}
fz_catch(ctx)
@@ -865,18 +862,17 @@ static void page_objects_list_renumber(pdf_write_options *opts)
}
static void
-mark_all(pdf_document *doc, pdf_write_options *opts, pdf_obj *val, int flag, int page)
+mark_all(fz_context *ctx, pdf_document *doc, pdf_write_options *opts, pdf_obj *val, int flag, int page)
{
- fz_context *ctx = doc->ctx;
- if (pdf_mark_obj(val))
+ if (pdf_mark_obj(ctx, val))
return;
fz_try(ctx)
{
- if (pdf_is_indirect(val))
+ if (pdf_is_indirect(ctx, val))
{
- int num = pdf_to_num(val);
+ int num = pdf_to_num(ctx, val);
if (opts->use_list[num] & USE_PAGE_MASK)
/* Already used */
opts->use_list[num] |= USE_SHARED;
@@ -886,28 +882,28 @@ mark_all(pdf_document *doc, pdf_write_options *opts, pdf_obj *val, int flag, int
page_objects_list_insert(ctx, opts, page, num);
}
- if (pdf_is_dict(val))
+ if (pdf_is_dict(ctx, val))
{
- int i, n = pdf_dict_len(val);
+ int i, n = pdf_dict_len(ctx, val);
for (i = 0; i < n; i++)
{
- mark_all(doc, opts, pdf_dict_get_val(val, i), flag, page);
+ mark_all(ctx, doc, opts, pdf_dict_get_val(ctx, val, i), flag, page);
}
}
- else if (pdf_is_array(val))
+ else if (pdf_is_array(ctx, val))
{
- int i, n = pdf_array_len(val);
+ int i, n = pdf_array_len(ctx, val);
for (i = 0; i < n; i++)
{
- mark_all(doc, opts, pdf_array_get(val, i), flag, page);
+ mark_all(ctx, doc, opts, pdf_array_get(ctx, val, i), flag, page);
}
}
}
fz_always(ctx)
{
- pdf_unmark_obj(val);
+ pdf_unmark_obj(ctx, val);
}
fz_catch(ctx)
{
@@ -916,66 +912,65 @@ mark_all(pdf_document *doc, pdf_write_options *opts, pdf_obj *val, int flag, int
}
static int
-mark_pages(pdf_document *doc, pdf_write_options *opts, pdf_obj *val, int pagenum)
+mark_pages(fz_context *ctx, pdf_document *doc, pdf_write_options *opts, pdf_obj *val, int pagenum)
{
- fz_context *ctx = doc->ctx;
- if (pdf_mark_obj(val))
+ if (pdf_mark_obj(ctx, val))
return pagenum;
fz_try(ctx)
{
- if (pdf_is_dict(val))
+ if (pdf_is_dict(ctx, val))
{
- if (!strcmp("Page", pdf_to_name(pdf_dict_gets(val, "Type"))))
+ if (!strcmp("Page", pdf_to_name(ctx, pdf_dict_gets(ctx, val, "Type"))))
{
- int num = pdf_to_num(val);
- pdf_unmark_obj(val);
- mark_all(doc, opts, val, pagenum == 0 ? USE_PAGE1 : (pagenum<<USE_PAGE_SHIFT), pagenum);
+ int num = pdf_to_num(ctx, val);
+ pdf_unmark_obj(ctx, val);
+ mark_all(ctx, doc, opts, val, pagenum == 0 ? USE_PAGE1 : (pagenum<<USE_PAGE_SHIFT), pagenum);
page_objects_list_set_page_object(ctx, opts, pagenum, num);
pagenum++;
opts->use_list[num] |= USE_PAGE_OBJECT;
}
else
{
- int i, n = pdf_dict_len(val);
+ int i, n = pdf_dict_len(ctx, val);
for (i = 0; i < n; i++)
{
- pdf_obj *key = pdf_dict_get_key(val, i);
- pdf_obj *obj = pdf_dict_get_val(val, i);
+ pdf_obj *key = pdf_dict_get_key(ctx, val, i);
+ pdf_obj *obj = pdf_dict_get_val(ctx, val, i);
- if (!strcmp("Kids", pdf_to_name(key)))
- pagenum = mark_pages(doc, opts, obj, pagenum);
+ if (!strcmp("Kids", pdf_to_name(ctx, key)))
+ pagenum = mark_pages(ctx, doc, opts, obj, pagenum);
else
- mark_all(doc, opts, obj, USE_CATALOGUE, -1);
+ mark_all(ctx, doc, opts, obj, USE_CATALOGUE, -1);
}
- if (pdf_is_indirect(val))
+ if (pdf_is_indirect(ctx, val))
{
- int num = pdf_to_num(val);
+ int num = pdf_to_num(ctx, val);
opts->use_list[num] |= USE_CATALOGUE;
}
}
}
- else if (pdf_is_array(val))
+ else if (pdf_is_array(ctx, val))
{
- int i, n = pdf_array_len(val);
+ int i, n = pdf_array_len(ctx, val);
for (i = 0; i < n; i++)
{
- pagenum = mark_pages(doc, opts, pdf_array_get(val, i), pagenum);
+ pagenum = mark_pages(ctx, doc, opts, pdf_array_get(ctx, val, i), pagenum);
}
- if (pdf_is_indirect(val))
+ if (pdf_is_indirect(ctx, val))
{
- int num = pdf_to_num(val);
+ int num = pdf_to_num(ctx, val);
opts->use_list[num] |= USE_CATALOGUE;
}
}
}
fz_always(ctx)
{
- pdf_unmark_obj(val);
+ pdf_unmark_obj(ctx, val);
}
fz_catch(ctx)
{
@@ -985,51 +980,50 @@ mark_pages(pdf_document *doc, pdf_write_options *opts, pdf_obj *val, int pagenum
}
static void
-mark_root(pdf_document *doc, pdf_write_options *opts, pdf_obj *dict)
+mark_root(fz_context *ctx, pdf_document *doc, pdf_write_options *opts, pdf_obj *dict)
{
- fz_context *ctx = doc->ctx;
- int i, n = pdf_dict_len(dict);
+ int i, n = pdf_dict_len(ctx, dict);
- if (pdf_mark_obj(dict))
+ if (pdf_mark_obj(ctx, dict))
return;
fz_try(ctx)
{
- if (pdf_is_indirect(dict))
+ if (pdf_is_indirect(ctx, dict))
{
- int num = pdf_to_num(dict);
+ int num = pdf_to_num(ctx, dict);
opts->use_list[num] |= USE_CATALOGUE;
}
for (i = 0; i < n; i++)
{
- char *key = pdf_to_name(pdf_dict_get_key(dict, i));
- pdf_obj *val = pdf_dict_get_val(dict, i);
+ char *key = pdf_to_name(ctx, pdf_dict_get_key(ctx, dict, i));
+ pdf_obj *val = pdf_dict_get_val(ctx, dict, i);
if (!strcmp("Pages", key))
- opts->page_count = mark_pages(doc, opts, val, 0);
+ opts->page_count = mark_pages(ctx, doc, opts, val, 0);
else if (!strcmp("Names", key))
- mark_all(doc, opts, val, USE_OTHER_OBJECTS, -1);
+ mark_all(ctx, doc, opts, val, USE_OTHER_OBJECTS, -1);
else if (!strcmp("Dests", key))
- mark_all(doc, opts, val, USE_OTHER_OBJECTS, -1);
+ mark_all(ctx, doc, opts, val, USE_OTHER_OBJECTS, -1);
else if (!strcmp("Outlines", key))
{
int section;
/* Look at PageMode to decide whether to
* USE_OTHER_OBJECTS or USE_PAGE1 here. */
- if (strcmp(pdf_to_name(pdf_dict_gets(dict, "PageMode")), "UseOutlines") == 0)
+ if (strcmp(pdf_to_name(ctx, pdf_dict_gets(ctx, dict, "PageMode")), "UseOutlines") == 0)
section = USE_PAGE1;
else
section = USE_OTHER_OBJECTS;
- mark_all(doc, opts, val, section, -1);
+ mark_all(ctx, doc, opts, val, section, -1);
}
else
- mark_all(doc, opts, val, USE_CATALOGUE, -1);
+ mark_all(ctx, doc, opts, val, USE_CATALOGUE, -1);
}
}
fz_always(ctx)
{
- pdf_unmark_obj(dict);
+ pdf_unmark_obj(ctx, dict);
}
fz_catch(ctx)
{
@@ -1038,30 +1032,29 @@ mark_root(pdf_document *doc, pdf_write_options *opts, pdf_obj *dict)
}
static void
-mark_trailer(pdf_document *doc, pdf_write_options *opts, pdf_obj *dict)
+mark_trailer(fz_context *ctx, pdf_document *doc, pdf_write_options *opts, pdf_obj *dict)
{
- fz_context *ctx = doc->ctx;
- int i, n = pdf_dict_len(dict);
+ int i, n = pdf_dict_len(ctx, dict);
- if (pdf_mark_obj(dict))
+ if (pdf_mark_obj(ctx, dict))
return;
fz_try(ctx)
{
for (i = 0; i < n; i++)
{
- char *key = pdf_to_name(pdf_dict_get_key(dict, i));
- pdf_obj *val = pdf_dict_get_val(dict, i);
+ char *key = pdf_to_name(ctx, pdf_dict_get_key(ctx, dict, i));
+ pdf_obj *val = pdf_dict_get_val(ctx, dict, i);
if (!strcmp("Root", key))
- mark_root(doc, opts, val);
+ mark_root(ctx, doc, opts, val);
else
- mark_all(doc, opts, val, USE_CATALOGUE, -1);
+ mark_all(ctx, doc, opts, val, USE_CATALOGUE, -1);
}
}
fz_always(ctx)
{
- pdf_unmark_obj(dict);
+ pdf_unmark_obj(ctx, dict);
}
fz_catch(ctx)
{
@@ -1070,7 +1063,7 @@ mark_trailer(pdf_document *doc, pdf_write_options *opts, pdf_obj *dict)
}
static void
-add_linearization_objs(pdf_document *doc, pdf_write_options *opts)
+add_linearization_objs(fz_context *ctx, pdf_document *doc, pdf_write_options *opts)
{
pdf_obj *params_obj = NULL;
pdf_obj *params_ref = NULL;
@@ -1078,7 +1071,6 @@ add_linearization_objs(pdf_document *doc, pdf_write_options *opts)
pdf_obj *hint_ref = NULL;
pdf_obj *o = NULL;
int params_num, hint_num;
- fz_context *ctx = doc->ctx;
fz_var(params_obj);
fz_var(params_ref);
@@ -1089,47 +1081,47 @@ add_linearization_objs(pdf_document *doc, pdf_write_options *opts)
fz_try(ctx)
{
/* Linearization params */
- params_obj = pdf_new_dict(doc, 10);
- params_ref = pdf_new_ref(doc, params_obj);
- params_num = pdf_to_num(params_ref);
+ params_obj = pdf_new_dict(ctx, doc, 10);
+ params_ref = pdf_new_ref(ctx, doc, params_obj);
+ params_num = pdf_to_num(ctx, params_ref);
opts->use_list[params_num] = USE_PARAMS;
opts->renumber_map[params_num] = params_num;
opts->rev_renumber_map[params_num] = params_num;
opts->gen_list[params_num] = 0;
opts->rev_gen_list[params_num] = 0;
- pdf_dict_puts_drop(params_obj, "Linearized", pdf_new_real(doc, 1.0));
- opts->linear_l = pdf_new_int(doc, INT_MIN);
- pdf_dict_puts(params_obj, "L", opts->linear_l);
- opts->linear_h0 = pdf_new_int(doc, INT_MIN);
- o = pdf_new_array(doc, 2);
- pdf_array_push(o, opts->linear_h0);
- opts->linear_h1 = pdf_new_int(doc, INT_MIN);
- pdf_array_push(o, opts->linear_h1);
- pdf_dict_puts_drop(params_obj, "H", o);
+ pdf_dict_puts_drop(ctx, params_obj, "Linearized", pdf_new_real(ctx, doc, 1.0));
+ opts->linear_l = pdf_new_int(ctx, doc, INT_MIN);
+ pdf_dict_puts(ctx, params_obj, "L", opts->linear_l);
+ opts->linear_h0 = pdf_new_int(ctx, doc, INT_MIN);
+ o = pdf_new_array(ctx, doc, 2);
+ pdf_array_push(ctx, o, opts->linear_h0);
+ opts->linear_h1 = pdf_new_int(ctx, doc, INT_MIN);
+ pdf_array_push(ctx, o, opts->linear_h1);
+ pdf_dict_puts_drop(ctx, params_obj, "H", o);
o = NULL;
- opts->linear_o = pdf_new_int(doc, INT_MIN);
- pdf_dict_puts(params_obj, "O", opts->linear_o);
- opts->linear_e = pdf_new_int(doc, INT_MIN);
- pdf_dict_puts(params_obj, "E", opts->linear_e);
- opts->linear_n = pdf_new_int(doc, INT_MIN);
- pdf_dict_puts(params_obj, "N", opts->linear_n);
- opts->linear_t = pdf_new_int(doc, INT_MIN);
- pdf_dict_puts(params_obj, "T", opts->linear_t);
+ opts->linear_o = pdf_new_int(ctx, doc, INT_MIN);
+ pdf_dict_puts(ctx, params_obj, "O", opts->linear_o);
+ opts->linear_e = pdf_new_int(ctx, doc, INT_MIN);
+ pdf_dict_puts(ctx, params_obj, "E", opts->linear_e);
+ opts->linear_n = pdf_new_int(ctx, doc, INT_MIN);
+ pdf_dict_puts(ctx, params_obj, "N", opts->linear_n);
+ opts->linear_t = pdf_new_int(ctx, doc, INT_MIN);
+ pdf_dict_puts(ctx, params_obj, "T", opts->linear_t);
/* Primary hint stream */
- hint_obj = pdf_new_dict(doc, 10);
- hint_ref = pdf_new_ref(doc, hint_obj);
- hint_num = pdf_to_num(hint_ref);
+ hint_obj = pdf_new_dict(ctx, doc, 10);
+ hint_ref = pdf_new_ref(ctx, doc, hint_obj);
+ hint_num = pdf_to_num(ctx, hint_ref);
opts->use_list[hint_num] = USE_HINTS;
opts->renumber_map[hint_num] = hint_num;
opts->rev_renumber_map[hint_num] = hint_num;
opts->gen_list[hint_num] = 0;
opts->rev_gen_list[hint_num] = 0;
- pdf_dict_puts_drop(hint_obj, "P", pdf_new_int(doc, 0));
- opts->hints_s = pdf_new_int(doc, INT_MIN);
- pdf_dict_puts(hint_obj, "S", opts->hints_s);
+ pdf_dict_puts_drop(ctx, hint_obj, "P", pdf_new_int(ctx, doc, 0));
+ opts->hints_s = pdf_new_int(ctx, doc, INT_MIN);
+ pdf_dict_puts(ctx, hint_obj, "S", opts->hints_s);
/* FIXME: Do we have thumbnails? Do a T entry */
/* FIXME: Do we have outlines? Do an O entry */
/* FIXME: Do we have article threads? Do an A entry */
@@ -1138,18 +1130,18 @@ add_linearization_objs(pdf_document *doc, pdf_write_options *opts)
/* FIXME: Do we have document information? Do an I entry */
/* FIXME: Do we have logical structure heirarchy? Do a C entry */
/* FIXME: Do L, Page Label hint table */
- pdf_dict_puts_drop(hint_obj, "Filter", pdf_new_name(doc, "FlateDecode"));
- opts->hints_length = pdf_new_int(doc, INT_MIN);
- pdf_dict_puts(hint_obj, "Length", opts->hints_length);
- pdf_get_xref_entry(doc, hint_num)->stm_ofs = -1;
+ pdf_dict_puts_drop(ctx, hint_obj, "Filter", pdf_new_name(ctx, doc, "FlateDecode"));
+ opts->hints_length = pdf_new_int(ctx, doc, INT_MIN);
+ pdf_dict_puts(ctx, hint_obj, "Length", opts->hints_length);
+ pdf_get_xref_entry(ctx, doc, hint_num)->stm_ofs = -1;
}
fz_always(ctx)
{
- pdf_drop_obj(params_obj);
- pdf_drop_obj(params_ref);
- pdf_drop_obj(hint_ref);
- pdf_drop_obj(hint_obj);
- pdf_drop_obj(o);
+ pdf_drop_obj(ctx, params_obj);
+ pdf_drop_obj(ctx, params_ref);
+ pdf_drop_obj(ctx, hint_ref);
+ pdf_drop_obj(ctx, hint_obj);
+ pdf_drop_obj(ctx, o);
}
fz_catch(ctx)
{
@@ -1164,39 +1156,39 @@ lpr_inherit_res_contents(fz_context *ctx, pdf_obj *res, pdf_obj *dict, char *tex
int i, n;
/* If the parent node doesn't have an entry of this type, give up. */
- o = pdf_dict_gets(dict, text);
+ o = pdf_dict_gets(ctx, dict, text);
if (!o)
return;
/* If the resources dict we are building doesn't have an entry of this
* type yet, then just copy it (ensuring it's not a reference) */
- r = pdf_dict_gets(res, text);
+ r = pdf_dict_gets(ctx, res, text);
if (r == NULL)
{
- o = pdf_resolve_indirect(o);
- if (pdf_is_dict(o))
- o = pdf_copy_dict(o);
- else if (pdf_is_array(o))
- o = pdf_copy_array(o);
+ o = pdf_resolve_indirect(ctx, o);
+ if (pdf_is_dict(ctx, o))
+ o = pdf_copy_dict(ctx, o);
+ else if (pdf_is_array(ctx, o))
+ o = pdf_copy_array(ctx, o);
else
o = NULL;
if (o)
- pdf_dict_puts(res, text, o);
+ pdf_dict_puts(ctx, res, text, o);
return;
}
/* Otherwise we need to merge o into r */
- if (pdf_is_dict(o))
+ if (pdf_is_dict(ctx, o))
{
- n = pdf_dict_len(o);
+ n = pdf_dict_len(ctx, o);
for (i = 0; i < n; i++)
{
- pdf_obj *key = pdf_dict_get_key(o, i);
- pdf_obj *val = pdf_dict_get_val(o, i);
+ pdf_obj *key = pdf_dict_get_key(ctx, o, i);
+ pdf_obj *val = pdf_dict_get_val(ctx, o, i);
- if (pdf_dict_gets(res, pdf_to_name(key)))
+ if (pdf_dict_gets(ctx, res, pdf_to_name(ctx, key)))
continue;
- pdf_dict_puts(res, pdf_to_name(key), val);
+ pdf_dict_puts(ctx, res, pdf_to_name(ctx, key), val);
}
}
}
@@ -1208,12 +1200,12 @@ lpr_inherit_res(fz_context *ctx, pdf_obj *node, int depth, pdf_obj *dict)
{
pdf_obj *o;
- node = pdf_dict_gets(node, "Parent");
+ node = pdf_dict_gets(ctx, node, "Parent");
depth--;
if (!node || depth < 0)
break;
- o = pdf_dict_gets(node, "Resources");
+ o = pdf_dict_gets(ctx, node, "Resources");
if (o)
{
lpr_inherit_res_contents(ctx, dict, o, "ExtGState");
@@ -1233,11 +1225,11 @@ lpr_inherit(fz_context *ctx, pdf_obj *node, char *text, int depth)
{
do
{
- pdf_obj *o = pdf_dict_gets(node, text);
+ pdf_obj *o = pdf_dict_gets(ctx, node, text);
if (o)
- return pdf_resolve_indirect(o);
- node = pdf_dict_gets(node, "Parent");
+ return pdf_resolve_indirect(ctx, o);
+ node = pdf_dict_gets(ctx, node, "Parent");
depth--;
}
while (depth >= 0 && node);
@@ -1246,103 +1238,101 @@ lpr_inherit(fz_context *ctx, pdf_obj *node, char *text, int depth)
}
static int
-lpr(pdf_document *doc, pdf_obj *node, int depth, int page)
+lpr(fz_context *ctx, pdf_document *doc, pdf_obj *node, int depth, int page)
{
pdf_obj *kids;
pdf_obj *o = NULL;
int i, n;
- fz_context *ctx = doc->ctx;
- if (pdf_mark_obj(node))
+ if (pdf_mark_obj(ctx, node))
return page;
fz_var(o);
fz_try(ctx)
{
- if (!strcmp("Page", pdf_to_name(pdf_dict_gets(node, "Type"))))
+ if (!strcmp("Page", pdf_to_name(ctx, pdf_dict_gets(ctx, node, "Type"))))
{
pdf_obj *r; /* r is deliberately not cleaned up */
/* Copy resources down to the child */
- o = pdf_keep_obj(pdf_dict_gets(node, "Resources"));
+ o = pdf_keep_obj(ctx, pdf_dict_gets(ctx, node, "Resources"));
if (!o)
{
- o = pdf_keep_obj(pdf_new_dict(doc, 2));
- pdf_dict_puts(node, "Resources", o);
+ o = pdf_keep_obj(ctx, pdf_new_dict(ctx, doc, 2));
+ pdf_dict_puts(ctx, node, "Resources", o);
}
lpr_inherit_res(ctx, node, depth, o);
r = lpr_inherit(ctx, node, "MediaBox", depth);
if (r)
- pdf_dict_puts(node, "MediaBox", r);
+ pdf_dict_puts(ctx, node, "MediaBox", r);
r = lpr_inherit(ctx, node, "CropBox", depth);
if (r)
- pdf_dict_puts(node, "CropBox", r);
+ pdf_dict_puts(ctx, node, "CropBox", r);
r = lpr_inherit(ctx, node, "BleedBox", depth);
if (r)
- pdf_dict_puts(node, "BleedBox", r);
+ pdf_dict_puts(ctx, node, "BleedBox", r);
r = lpr_inherit(ctx, node, "TrimBox", depth);
if (r)
- pdf_dict_puts(node, "TrimBox", r);
+ pdf_dict_puts(ctx, node, "TrimBox", r);
r = lpr_inherit(ctx, node, "ArtBox", depth);
if (r)
- pdf_dict_puts(node, "ArtBox", r);
+ pdf_dict_puts(ctx, node, "ArtBox", r);
r = lpr_inherit(ctx, node, "Rotate", depth);
if (r)
- pdf_dict_puts(node, "Rotate", r);
+ pdf_dict_puts(ctx, node, "Rotate", r);
page++;
}
else
{
- kids = pdf_dict_gets(node, "Kids");
- n = pdf_array_len(kids);
+ kids = pdf_dict_gets(ctx, node, "Kids");
+ n = pdf_array_len(ctx, kids);
for(i = 0; i < n; i++)
{
- page = lpr(doc, pdf_array_get(kids, i), depth+1, page);
+ page = lpr(ctx, doc, pdf_array_get(ctx, kids, i), depth+1, page);
}
- pdf_dict_dels(node, "Resources");
- pdf_dict_dels(node, "MediaBox");
- pdf_dict_dels(node, "CropBox");
- pdf_dict_dels(node, "BleedBox");
- pdf_dict_dels(node, "TrimBox");
- pdf_dict_dels(node, "ArtBox");
- pdf_dict_dels(node, "Rotate");
+ pdf_dict_dels(ctx, node, "Resources");
+ pdf_dict_dels(ctx, node, "MediaBox");
+ pdf_dict_dels(ctx, node, "CropBox");
+ pdf_dict_dels(ctx, node, "BleedBox");
+ pdf_dict_dels(ctx, node, "TrimBox");
+ pdf_dict_dels(ctx, node, "ArtBox");
+ pdf_dict_dels(ctx, node, "Rotate");
}
}
fz_always(ctx)
{
- pdf_drop_obj(o);
+ pdf_drop_obj(ctx, o);
}
fz_catch(ctx)
{
fz_rethrow(ctx);
}
- pdf_unmark_obj(node);
+ pdf_unmark_obj(ctx, node);
return page;
}
void
-pdf_localise_page_resources(pdf_document *doc)
+pdf_localise_page_resources(fz_context *ctx, pdf_document *doc)
{
if (doc->resources_localised)
return;
- lpr(doc, pdf_dict_getp(pdf_trailer(doc), "Root/Pages"), 0, 0);
+ lpr(ctx, doc, pdf_dict_getp(ctx, pdf_trailer(ctx, doc), "Root/Pages"), 0, 0);
doc->resources_localised = 1;
}
static void
-linearize(pdf_document *doc, pdf_write_options *opts)
+linearize(fz_context *ctx, pdf_document *doc, pdf_write_options *opts)
{
int i;
- int n = pdf_xref_len(doc) + 2;
+ int n = pdf_xref_len(ctx, doc) + 2;
int *reorder;
int *rev_renumber_map;
int *rev_gen_list;
- fz_context *ctx = doc->ctx;
opts->page_object_lists = page_objects_list_create(ctx);
@@ -1350,18 +1340,18 @@ linearize(pdf_document *doc, pdf_write_options *opts)
/* FIXME: We could 'thin' the resources according to what is actually
* required for each page, but this would require us to run the page
* content streams. */
- pdf_localise_page_resources(doc);
+ pdf_localise_page_resources(ctx, doc);
/* Walk the objects for each page, marking which ones are used, where */
memset(opts->use_list, 0, n * sizeof(int));
- mark_trailer(doc, opts, pdf_trailer(doc));
+ mark_trailer(ctx, doc, opts, pdf_trailer(ctx, doc));
/* Add new objects required for linearization */
- add_linearization_objs(doc, opts);
+ add_linearization_objs(ctx, doc, opts);
#ifdef DEBUG_WRITING
fprintf(stderr, "Usage calculated:\n");
- for (i=0; i < pdf_xref_len(doc); i++)
+ for (i=0; i < pdf_xref_len(ctx, doc); i++)
{
fprintf(stderr, "%d: use=%d\n", i, opts->use_list[i]);
}
@@ -1381,7 +1371,7 @@ linearize(pdf_document *doc, pdf_write_options *opts)
#ifdef DEBUG_WRITING
fprintf(stderr, "Reordered:\n");
- for (i=1; i < pdf_xref_len(doc); i++)
+ for (i=1; i < pdf_xref_len(ctx, doc); i++)
{
fprintf(stderr, "%d: use=%d\n", i, opts->use_list[reorder[i]]);
}
@@ -1406,55 +1396,55 @@ linearize(pdf_document *doc, pdf_write_options *opts)
/* Apply the renumber_map */
page_objects_list_renumber(opts);
- renumberobjs(doc, opts);
+ renumberobjs(ctx, doc, opts);
page_objects_list_sort_and_dedupe(ctx, opts->page_object_lists);
}
static void
-update_linearization_params(pdf_document *doc, pdf_write_options *opts)
+update_linearization_params(fz_context *ctx, pdf_document *doc, pdf_write_options *opts)
{
int offset;
- pdf_set_int(opts->linear_l, opts->file_len);
+ pdf_set_int(ctx, opts->linear_l, opts->file_len);
/* Primary hint stream offset (of object, not stream!) */
- pdf_set_int(opts->linear_h0, opts->ofs_list[pdf_xref_len(doc)-1]);
+ pdf_set_int(ctx, opts->linear_h0, opts->ofs_list[pdf_xref_len(ctx, doc)-1]);
/* Primary hint stream length (of object, not stream!) */
offset = (opts->start == 1 ? opts->main_xref_offset : opts->ofs_list[1] + opts->hintstream_len);
- pdf_set_int(opts->linear_h1, offset - opts->ofs_list[pdf_xref_len(doc)-1]);
+ pdf_set_int(ctx, opts->linear_h1, offset - opts->ofs_list[pdf_xref_len(ctx, doc)-1]);
/* Object number of first pages page object (the first object of page 0) */
- pdf_set_int(opts->linear_o, opts->page_object_lists->page[0]->object[0]);
+ pdf_set_int(ctx, opts->linear_o, opts->page_object_lists->page[0]->object[0]);
/* Offset of end of first page (first page is followed by primary
* hint stream (object n-1) then remaining pages (object 1...). The
* primary hint stream counts as part of the first pages data, I think.
*/
offset = (opts->start == 1 ? opts->main_xref_offset : opts->ofs_list[1] + opts->hintstream_len);
- pdf_set_int(opts->linear_e, offset);
+ pdf_set_int(ctx, opts->linear_e, offset);
/* Number of pages in document */
- pdf_set_int(opts->linear_n, opts->page_count);
+ pdf_set_int(ctx, opts->linear_n, opts->page_count);
/* Offset of first entry in main xref table */
- pdf_set_int(opts->linear_t, opts->first_xref_entry_offset + opts->hintstream_len);
+ pdf_set_int(ctx, opts->linear_t, opts->first_xref_entry_offset + opts->hintstream_len);
/* Offset of shared objects hint table in the primary hint stream */
- pdf_set_int(opts->hints_s, opts->hints_shared_offset);
+ pdf_set_int(ctx, opts->hints_s, opts->hints_shared_offset);
/* Primary hint stream length */
- pdf_set_int(opts->hints_length, opts->hintstream_len);
+ pdf_set_int(ctx, opts->hints_length, opts->hintstream_len);
}
/*
* Make sure we have loaded objects from object streams.
*/
-static void preloadobjstms(pdf_document *doc)
+static void preloadobjstms(fz_context *ctx, pdf_document *doc)
{
pdf_obj *obj;
int num;
- int xref_len = pdf_xref_len(doc);
+ int xref_len = pdf_xref_len(ctx, doc);
for (num = 0; num < xref_len; num++)
{
- if (pdf_get_xref_entry(doc, num)->type == 'o')
+ if (pdf_get_xref_entry(ctx, doc, num)->type == 'o')
{
- obj = pdf_load_object(doc, num, 0);
- pdf_drop_obj(obj);
+ obj = pdf_load_object(ctx, doc, num, 0);
+ pdf_drop_obj(ctx, obj);
}
}
}
@@ -1505,103 +1495,101 @@ static fz_buffer *hexbuf(fz_context *ctx, unsigned char *p, int n)
return buf;
}
-static void addhexfilter(pdf_document *doc, pdf_obj *dict)
+static void addhexfilter(fz_context *ctx, pdf_document *doc, pdf_obj *dict)
{
pdf_obj *f, *dp, *newf, *newdp;
pdf_obj *ahx, *nullobj;
- ahx = pdf_new_name(doc, "ASCIIHexDecode");
- nullobj = pdf_new_null(doc);
+ ahx = pdf_new_name(ctx, doc, "ASCIIHexDecode");
+ nullobj = pdf_new_null(ctx, doc);
newf = newdp = NULL;
- f = pdf_dict_gets(dict, "Filter");
- dp = pdf_dict_gets(dict, "DecodeParms");
+ f = pdf_dict_gets(ctx, dict, "Filter");
+ dp = pdf_dict_gets(ctx, dict, "DecodeParms");
- if (pdf_is_name(f))
+ if (pdf_is_name(ctx, f))
{
- newf = pdf_new_array(doc, 2);
- pdf_array_push(newf, ahx);
- pdf_array_push(newf, f);
+ newf = pdf_new_array(ctx, doc, 2);
+ pdf_array_push(ctx, newf, ahx);
+ pdf_array_push(ctx, newf, f);
f = newf;
- if (pdf_is_dict(dp))
+ if (pdf_is_dict(ctx, dp))
{
- newdp = pdf_new_array(doc, 2);
- pdf_array_push(newdp, nullobj);
- pdf_array_push(newdp, dp);
+ newdp = pdf_new_array(ctx, doc, 2);
+ pdf_array_push(ctx, newdp, nullobj);
+ pdf_array_push(ctx, newdp, dp);
dp = newdp;
}
}
- else if (pdf_is_array(f))
+ else if (pdf_is_array(ctx, f))
{
- pdf_array_insert(f, ahx, 0);
- if (pdf_is_array(dp))
- pdf_array_insert(dp, nullobj, 0);
+ pdf_array_insert(ctx, f, ahx, 0);
+ if (pdf_is_array(ctx, dp))
+ pdf_array_insert(ctx, dp, nullobj, 0);
}
else
f = ahx;
- pdf_dict_puts(dict, "Filter", f);
+ pdf_dict_puts(ctx, dict, "Filter", f);
if (dp)
- pdf_dict_puts(dict, "DecodeParms", dp);
+ pdf_dict_puts(ctx, dict, "DecodeParms", dp);
- pdf_drop_obj(ahx);
- pdf_drop_obj(nullobj);
- pdf_drop_obj(newf);
- pdf_drop_obj(newdp);
+ pdf_drop_obj(ctx, ahx);
+ pdf_drop_obj(ctx, nullobj);
+ pdf_drop_obj(ctx, newf);
+ pdf_drop_obj(ctx, newdp);
}
-static void copystream(pdf_document *doc, pdf_write_options *opts, pdf_obj *obj_orig, int num, int gen)
+static void copystream(fz_context *ctx, pdf_document *doc, pdf_write_options *opts, pdf_obj *obj_orig, int num, int gen)
{
fz_buffer *buf, *tmp;
pdf_obj *newlen;
pdf_obj *obj;
- fz_context *ctx = doc->ctx;
int orig_num = opts->rev_renumber_map[num];
int orig_gen = opts->rev_gen_list[num];
- buf = pdf_load_raw_renumbered_stream(doc, num, gen, orig_num, orig_gen);
+ buf = pdf_load_raw_renumbered_stream(ctx, doc, num, gen, orig_num, orig_gen);
- obj = pdf_copy_dict(obj_orig);
+ obj = pdf_copy_dict(ctx, obj_orig);
if (opts->do_ascii && isbinarystream(buf))
{
tmp = hexbuf(ctx, buf->data, buf->len);
fz_drop_buffer(ctx, buf);
buf = tmp;
- addhexfilter(doc, obj);
+ addhexfilter(ctx, doc, obj);
- newlen = pdf_new_int(doc, buf->len);
- pdf_dict_puts(obj, "Length", newlen);
- pdf_drop_obj(newlen);
+ newlen = pdf_new_int(ctx, doc, buf->len);
+ pdf_dict_puts(ctx, obj, "Length", newlen);
+ pdf_drop_obj(ctx, newlen);
}
fprintf(opts->out, "%d %d obj\n", num, gen);
- pdf_fprint_obj(opts->out, obj, opts->do_expand == 0);
+ pdf_fprint_obj(ctx, opts->out, obj, opts->do_expand == 0);
fprintf(opts->out, "stream\n");
fwrite(buf->data, 1, buf->len, opts->out);
fprintf(opts->out, "endstream\nendobj\n\n");
fz_drop_buffer(ctx, buf);
- pdf_drop_obj(obj);
+ pdf_drop_obj(ctx, obj);
}
-static void expandstream(pdf_document *doc, pdf_write_options *opts, pdf_obj *obj_orig, int num, int gen)
+static void expandstream(fz_context *ctx, pdf_document *doc, pdf_write_options *opts, pdf_obj *obj_orig, int num, int gen)
{
fz_buffer *buf, *tmp;
pdf_obj *newlen;
pdf_obj *obj;
- fz_context *ctx = doc->ctx;
int orig_num = opts->rev_renumber_map[num];
int orig_gen = opts->rev_gen_list[num];
int truncated = 0;
- buf = pdf_load_renumbered_stream(doc, num, gen, orig_num, orig_gen, (opts->continue_on_error ? &truncated : NULL));
+ buf = pdf_load_renumbered_stream(ctx, doc, num, gen, orig_num, orig_gen, (opts->continue_on_error ? &truncated : NULL));
if (truncated && opts->errors)
(*opts->errors)++;
- obj = pdf_copy_dict(obj_orig);
- pdf_dict_dels(obj, "Filter");
- pdf_dict_dels(obj, "DecodeParms");
+ obj = pdf_copy_dict(ctx, obj_orig);
+ pdf_dict_dels(ctx, obj, "Filter");
+ pdf_dict_dels(ctx, obj, "DecodeParms");
if (opts->do_ascii && isbinarystream(buf))
{
@@ -1609,21 +1597,21 @@ static void expandstream(pdf_document *doc, pdf_write_options *opts, pdf_obj *ob
fz_drop_buffer(ctx, buf);
buf = tmp;
- addhexfilter(doc, obj);
+ addhexfilter(ctx, doc, obj);
}
- newlen = pdf_new_int(doc, buf->len);
- pdf_dict_puts(obj, "Length", newlen);
- pdf_drop_obj(newlen);
+ newlen = pdf_new_int(ctx, doc, buf->len);
+ pdf_dict_puts(ctx, obj, "Length", newlen);
+ pdf_drop_obj(ctx, newlen);
fprintf(opts->out, "%d %d obj\n", num, gen);
- pdf_fprint_obj(opts->out, obj, opts->do_expand == 0);
+ pdf_fprint_obj(ctx, opts->out, obj, opts->do_expand == 0);
fprintf(opts->out, "stream\n");
fwrite(buf->data, 1, buf->len, opts->out);
fprintf(opts->out, "endstream\nendobj\n\n");
fz_drop_buffer(ctx, buf);
- pdf_drop_obj(obj);
+ pdf_drop_obj(ctx, obj);
}
static int is_image_filter(char *s)
@@ -1637,33 +1625,32 @@ static int is_image_filter(char *s)
return 0;
}
-static int filter_implies_image(pdf_document *doc, pdf_obj *o)
+static int filter_implies_image(fz_context *ctx, pdf_document *doc, pdf_obj *o)
{
if (!o)
return 0;
- if (pdf_is_name(o))
- return is_image_filter(pdf_to_name(o));
- if (pdf_is_array(o))
+ if (pdf_is_name(ctx, o))
+ return is_image_filter(pdf_to_name(ctx, o));
+ if (pdf_is_array(ctx, o))
{
int i, len;
- len = pdf_array_len(o);
+ len = pdf_array_len(ctx, o);
for (i = 0; i < len; i++)
- if (is_image_filter(pdf_to_name(pdf_array_get(o, i))))
+ if (is_image_filter(pdf_to_name(ctx, pdf_array_get(ctx, o, i))))
return 1;
}
return 0;
}
-static void writeobject(pdf_document *doc, pdf_write_options *opts, int num, int gen, int skip_xrefs)
+static void writeobject(fz_context *ctx, pdf_document *doc, pdf_write_options *opts, int num, int gen, int skip_xrefs)
{
pdf_xref_entry *entry;
pdf_obj *obj;
pdf_obj *type;
- fz_context *ctx = doc->ctx;
fz_try(ctx)
{
- obj = pdf_load_object(doc, num, gen);
+ obj = pdf_load_object(ctx, doc, num, gen);
}
fz_catch(ctx)
{
@@ -1681,34 +1668,34 @@ static void writeobject(pdf_document *doc, pdf_write_options *opts, int num, int
}
/* skip ObjStm and XRef objects */
- if (pdf_is_dict(obj))
+ if (pdf_is_dict(ctx, obj))
{
- type = pdf_dict_gets(obj, "Type");
- if (pdf_is_name(type) && !strcmp(pdf_to_name(type), "ObjStm"))
+ type = pdf_dict_gets(ctx, obj, "Type");
+ if (pdf_is_name(ctx, type) && !strcmp(pdf_to_name(ctx, type), "ObjStm"))
{
opts->use_list[num] = 0;
- pdf_drop_obj(obj);
+ pdf_drop_obj(ctx, obj);
return;
}
- if (skip_xrefs && pdf_is_name(type) && !strcmp(pdf_to_name(type), "XRef"))
+ if (skip_xrefs && pdf_is_name(ctx, type) && !strcmp(pdf_to_name(ctx, type), "XRef"))
{
opts->use_list[num] = 0;
- pdf_drop_obj(obj);
+ pdf_drop_obj(ctx, obj);
return;
}
}
- entry = pdf_get_xref_entry(doc, num);
- if (!pdf_is_stream(doc, num, gen))
+ entry = pdf_get_xref_entry(ctx, doc, num);
+ if (!pdf_is_stream(ctx, doc, num, gen))
{
fprintf(opts->out, "%d %d obj\n", num, gen);
- pdf_fprint_obj(opts->out, obj, opts->do_expand == 0);
+ pdf_fprint_obj(ctx, opts->out, obj, opts->do_expand == 0);
fprintf(opts->out, "endobj\n\n");
}
else if (entry->stm_ofs < 0 && entry->stm_buf == NULL)
{
fprintf(opts->out, "%d %d obj\n", num, gen);
- pdf_fprint_obj(opts->out, obj, opts->do_expand == 0);
+ pdf_fprint_obj(ctx, opts->out, obj, opts->do_expand == 0);
fprintf(opts->out, "stream\nendstream\nendobj\n\n");
}
else
@@ -1718,34 +1705,34 @@ static void writeobject(pdf_document *doc, pdf_write_options *opts, int num, int
{
pdf_obj *o;
- if ((o = pdf_dict_gets(obj, "Type"), !strcmp(pdf_to_name(o), "XObject")) &&
- (o = pdf_dict_gets(obj, "Subtype"), !strcmp(pdf_to_name(o), "Image")))
+ if ((o = pdf_dict_gets(ctx, obj, "Type"), !strcmp(pdf_to_name(ctx, o), "XObject")) &&
+ (o = pdf_dict_gets(ctx, obj, "Subtype"), !strcmp(pdf_to_name(ctx, o), "Image")))
dontexpand = !(opts->do_expand & fz_expand_images);
- if (o = pdf_dict_gets(obj, "Type"), !strcmp(pdf_to_name(o), "Font"))
+ if (o = pdf_dict_gets(ctx, obj, "Type"), !strcmp(pdf_to_name(ctx, o), "Font"))
dontexpand = !(opts->do_expand & fz_expand_fonts);
- if (o = pdf_dict_gets(obj, "Type"), !strcmp(pdf_to_name(o), "FontDescriptor"))
+ if (o = pdf_dict_gets(ctx, obj, "Type"), !strcmp(pdf_to_name(ctx, o), "FontDescriptor"))
dontexpand = !(opts->do_expand & fz_expand_fonts);
- if (pdf_dict_gets(obj, "Length1") != NULL)
+ if (pdf_dict_gets(ctx, obj, "Length1") != NULL)
dontexpand = !(opts->do_expand & fz_expand_fonts);
- if (pdf_dict_gets(obj, "Length2") != NULL)
+ if (pdf_dict_gets(ctx, obj, "Length2") != NULL)
dontexpand = !(opts->do_expand & fz_expand_fonts);
- if (pdf_dict_gets(obj, "Length3") != NULL)
+ if (pdf_dict_gets(ctx, obj, "Length3") != NULL)
dontexpand = !(opts->do_expand & fz_expand_fonts);
- if (o = pdf_dict_gets(obj, "Subtype"), !strcmp(pdf_to_name(o), "Type1C"))
+ if (o = pdf_dict_gets(ctx, obj, "Subtype"), !strcmp(pdf_to_name(ctx, o), "Type1C"))
dontexpand = !(opts->do_expand & fz_expand_fonts);
- if (o = pdf_dict_gets(obj, "Subtype"), !strcmp(pdf_to_name(o), "CIDFontType0C"))
+ if (o = pdf_dict_gets(ctx, obj, "Subtype"), !strcmp(pdf_to_name(ctx, o), "CIDFontType0C"))
dontexpand = !(opts->do_expand & fz_expand_fonts);
- if (o = pdf_dict_gets(obj, "Filter"), filter_implies_image(doc, o))
+ if (o = pdf_dict_gets(ctx, obj, "Filter"), filter_implies_image(ctx, doc, o))
dontexpand = !(opts->do_expand & fz_expand_images);
- if (pdf_dict_gets(obj, "Width") != NULL && pdf_dict_gets(obj, "Height") != NULL)
+ if (pdf_dict_gets(ctx, obj, "Width") != NULL && pdf_dict_gets(ctx, obj, "Height") != NULL)
dontexpand = !(opts->do_expand & fz_expand_images);
}
fz_try(ctx)
{
if (opts->do_expand && !dontexpand && !pdf_is_jpx_image(ctx, obj))
- expandstream(doc, opts, obj, num, gen);
+ expandstream(ctx, doc, opts, obj, num, gen);
else
- copystream(doc, opts, obj, num, gen);
+ copystream(ctx, doc, opts, obj, num, gen);
}
fz_catch(ctx)
{
@@ -1759,13 +1746,13 @@ static void writeobject(pdf_document *doc, pdf_write_options *opts, int num, int
}
else
{
- pdf_drop_obj(obj);
+ pdf_drop_obj(ctx, obj);
fz_rethrow(ctx);
}
}
}
- pdf_drop_obj(obj);
+ pdf_drop_obj(ctx, obj);
}
static void writexrefsubsect(pdf_write_options *opts, int from, int to)
@@ -1782,12 +1769,11 @@ static void writexrefsubsect(pdf_write_options *opts, int from, int to)
}
}
-static void writexref(pdf_document *doc, pdf_write_options *opts, int from, int to, int first, int main_xref_offset, int startxref)
+static void writexref(fz_context *ctx, pdf_document *doc, pdf_write_options *opts, int from, int to, int first, int main_xref_offset, int startxref)
{
pdf_obj *trailer = NULL;
pdf_obj *obj;
pdf_obj *nobj = NULL;
- fz_context *ctx = doc->ctx;
fprintf(opts->out, "xref\n");
opts->first_xref_entry_offset = ftell(opts->out);
@@ -1799,11 +1785,11 @@ static void writexref(pdf_document *doc, pdf_write_options *opts, int from, int
while (subfrom < to)
{
- while (subfrom < to && !pdf_xref_is_incremental(doc, subfrom))
+ while (subfrom < to && !pdf_xref_is_incremental(ctx, doc, subfrom))
subfrom++;
subto = subfrom;
- while (subto < to && pdf_xref_is_incremental(doc, subto))
+ while (subto < to && pdf_xref_is_incremental(ctx, doc, subto))
subto++;
if (subfrom < subto)
@@ -1826,46 +1812,46 @@ static void writexref(pdf_document *doc, pdf_write_options *opts, int from, int
{
if (opts->do_incremental)
{
- trailer = pdf_keep_obj(pdf_trailer(doc));
- pdf_dict_puts_drop(trailer, "Size", pdf_new_int(doc, pdf_xref_len(doc)));
- pdf_dict_puts_drop(trailer, "Prev", pdf_new_int(doc, doc->startxref));
+ trailer = pdf_keep_obj(ctx, pdf_trailer(ctx, doc));
+ pdf_dict_puts_drop(ctx, trailer, "Size", pdf_new_int(ctx, doc, pdf_xref_len(ctx, doc)));
+ pdf_dict_puts_drop(ctx, trailer, "Prev", pdf_new_int(ctx, doc, doc->startxref));
doc->startxref = startxref;
}
else
{
- trailer = pdf_new_dict(doc, 5);
+ trailer = pdf_new_dict(ctx, doc, 5);
- nobj = pdf_new_int(doc, to);
- pdf_dict_puts(trailer, "Size", nobj);
- pdf_drop_obj(nobj);
+ nobj = pdf_new_int(ctx, doc, to);
+ pdf_dict_puts(ctx, trailer, "Size", nobj);
+ pdf_drop_obj(ctx, nobj);
nobj = NULL;
if (first)
{
- obj = pdf_dict_gets(pdf_trailer(doc), "Info");
+ obj = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Info");
if (obj)
- pdf_dict_puts(trailer, "Info", obj);
+ pdf_dict_puts(ctx, trailer, "Info", obj);
- obj = pdf_dict_gets(pdf_trailer(doc), "Root");
+ obj = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Root");
if (obj)
- pdf_dict_puts(trailer, "Root", obj);
+ pdf_dict_puts(ctx, trailer, "Root", obj);
- obj = pdf_dict_gets(pdf_trailer(doc), "ID");
+ obj = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "ID");
if (obj)
- pdf_dict_puts(trailer, "ID", obj);
+ pdf_dict_puts(ctx, trailer, "ID", obj);
}
if (main_xref_offset != 0)
{
- nobj = pdf_new_int(doc, main_xref_offset);
- pdf_dict_puts(trailer, "Prev", nobj);
- pdf_drop_obj(nobj);
+ nobj = pdf_new_int(ctx, doc, main_xref_offset);
+ pdf_dict_puts(ctx, trailer, "Prev", nobj);
+ pdf_drop_obj(ctx, nobj);
nobj = NULL;
}
}
}
fz_always(ctx)
{
- pdf_drop_obj(nobj);
+ pdf_drop_obj(ctx, nobj);
}
fz_catch(ctx)
{
@@ -1873,36 +1859,35 @@ static void writexref(pdf_document *doc, pdf_write_options *opts, int from, int
}
fprintf(opts->out, "trailer\n");
- pdf_fprint_obj(opts->out, trailer, opts->do_expand == 0);
+ pdf_fprint_obj(ctx, opts->out, trailer, opts->do_expand == 0);
fprintf(opts->out, "\n");
- pdf_drop_obj(trailer);
+ pdf_drop_obj(ctx, trailer);
fprintf(opts->out, "startxref\n%d\n%%%%EOF\n", startxref);
doc->has_xref_streams = 0;
}
-static void writexrefstreamsubsect(pdf_document *doc, pdf_write_options *opts, pdf_obj *index, fz_buffer *fzbuf, int from, int to)
+static void writexrefstreamsubsect(fz_context *ctx, pdf_document *doc, pdf_write_options *opts, pdf_obj *index, fz_buffer *fzbuf, int from, int to)
{
int num;
- pdf_array_push_drop(index, pdf_new_int(doc, from));
- pdf_array_push_drop(index, pdf_new_int(doc, to - from));
+ pdf_array_push_drop(ctx, index, pdf_new_int(ctx, doc, from));
+ pdf_array_push_drop(ctx, index, pdf_new_int(ctx, doc, to - from));
for (num = from; num < to; num++)
{
- fz_write_buffer_byte(doc->ctx, fzbuf, opts->use_list[num] ? 1 : 0);
- fz_write_buffer_byte(doc->ctx, fzbuf, opts->ofs_list[num]>>24);
- fz_write_buffer_byte(doc->ctx, fzbuf, opts->ofs_list[num]>>16);
- fz_write_buffer_byte(doc->ctx, fzbuf, opts->ofs_list[num]>>8);
- fz_write_buffer_byte(doc->ctx, fzbuf, opts->ofs_list[num]);
- fz_write_buffer_byte(doc->ctx, fzbuf, opts->gen_list[num]);
+ fz_write_buffer_byte(ctx, fzbuf, opts->use_list[num] ? 1 : 0);
+ fz_write_buffer_byte(ctx, fzbuf, opts->ofs_list[num]>>24);
+ fz_write_buffer_byte(ctx, fzbuf, opts->ofs_list[num]>>16);
+ fz_write_buffer_byte(ctx, fzbuf, opts->ofs_list[num]>>8);
+ fz_write_buffer_byte(ctx, fzbuf, opts->ofs_list[num]);
+ fz_write_buffer_byte(ctx, fzbuf, opts->gen_list[num]);
}
}
-static void writexrefstream(pdf_document *doc, pdf_write_options *opts, int from, int to, int first, int main_xref_offset, int startxref)
+static void writexrefstream(fz_context *ctx, pdf_document *doc, pdf_write_options *opts, int from, int to, int first, int main_xref_offset, int startxref)
{
- fz_context *ctx = doc->ctx;
int num;
pdf_obj *dict = NULL;
pdf_obj *obj;
@@ -1915,9 +1900,9 @@ static void writexrefstream(pdf_document *doc, pdf_write_options *opts, int from
fz_var(fzbuf);
fz_try(ctx)
{
- num = pdf_create_object(doc);
- dict = pdf_new_dict(doc, 6);
- pdf_update_object(doc, num, dict);
+ num = pdf_create_object(ctx, doc);
+ dict = pdf_new_dict(ctx, doc, 6);
+ pdf_update_object(ctx, doc, num, dict);
opts->first_xref_entry_offset = ftell(opts->out);
@@ -1925,49 +1910,49 @@ static void writexrefstream(pdf_document *doc, pdf_write_options *opts, int from
if (first)
{
- obj = pdf_dict_gets(pdf_trailer(doc), "Info");
+ obj = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Info");
if (obj)
- pdf_dict_puts(dict, "Info", obj);
+ pdf_dict_puts(ctx, dict, "Info", obj);
- obj = pdf_dict_gets(pdf_trailer(doc), "Root");
+ obj = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Root");
if (obj)
- pdf_dict_puts(dict, "Root", obj);
+ pdf_dict_puts(ctx, dict, "Root", obj);
- obj = pdf_dict_gets(pdf_trailer(doc), "ID");
+ obj = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "ID");
if (obj)
- pdf_dict_puts(dict, "ID", obj);
+ pdf_dict_puts(ctx, dict, "ID", obj);
if (opts->do_incremental)
{
- obj = pdf_dict_gets(pdf_trailer(doc), "Encrypt");
+ obj = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Encrypt");
if (obj)
- pdf_dict_puts(dict, "Encrypt", obj);
+ pdf_dict_puts(ctx, dict, "Encrypt", obj);
}
}
- pdf_dict_puts_drop(dict, "Size", pdf_new_int(doc, to));
+ pdf_dict_puts_drop(ctx, dict, "Size", pdf_new_int(ctx, doc, to));
if (opts->do_incremental)
{
- pdf_dict_puts_drop(dict, "Prev", pdf_new_int(doc, doc->startxref));
+ pdf_dict_puts_drop(ctx, dict, "Prev", pdf_new_int(ctx, doc, doc->startxref));
doc->startxref = startxref;
}
else
{
if (main_xref_offset != 0)
- pdf_dict_puts_drop(dict, "Prev", pdf_new_int(doc, main_xref_offset));
+ pdf_dict_puts_drop(ctx, dict, "Prev", pdf_new_int(ctx, doc, main_xref_offset));
}
- pdf_dict_puts_drop(dict, "Type", pdf_new_name(doc, "XRef"));
+ pdf_dict_puts_drop(ctx, dict, "Type", pdf_new_name(ctx, doc, "XRef"));
- w = pdf_new_array(doc, 3);
- pdf_dict_puts(dict, "W", w);
- pdf_array_push_drop(w, pdf_new_int(doc, 1));
- pdf_array_push_drop(w, pdf_new_int(doc, 4));
- pdf_array_push_drop(w, pdf_new_int(doc, 1));
+ w = pdf_new_array(ctx, doc, 3);
+ pdf_dict_puts(ctx, dict, "W", w);
+ pdf_array_push_drop(ctx, w, pdf_new_int(ctx, doc, 1));
+ pdf_array_push_drop(ctx, w, pdf_new_int(ctx, doc, 4));
+ pdf_array_push_drop(ctx, w, pdf_new_int(ctx, doc, 1));
- index = pdf_new_array(doc, 2);
- pdf_dict_puts_drop(dict, "Index", index);
+ index = pdf_new_array(ctx, doc, 2);
+ pdf_dict_puts_drop(ctx, dict, "Index", index);
opts->ofs_list[num] = opts->first_xref_entry_offset;
@@ -1980,34 +1965,34 @@ static void writexrefstream(pdf_document *doc, pdf_write_options *opts, int from
while (subfrom < to)
{
- while (subfrom < to && !pdf_xref_is_incremental(doc, subfrom))
+ while (subfrom < to && !pdf_xref_is_incremental(ctx, doc, subfrom))
subfrom++;
subto = subfrom;
- while (subto < to && pdf_xref_is_incremental(doc, subto))
+ while (subto < to && pdf_xref_is_incremental(ctx, doc, subto))
subto++;
if (subfrom < subto)
- writexrefstreamsubsect(doc, opts, index, fzbuf, subfrom, subto);
+ writexrefstreamsubsect(ctx, doc, opts, index, fzbuf, subfrom, subto);
subfrom = subto;
}
}
else
{
- writexrefstreamsubsect(doc, opts, index, fzbuf, from, to);
+ writexrefstreamsubsect(ctx, doc, opts, index, fzbuf, from, to);
}
- pdf_update_stream(doc, num, fzbuf);
- pdf_dict_puts_drop(dict, "Length", pdf_new_int(doc, fz_buffer_storage(ctx, fzbuf, NULL)));
+ pdf_update_stream(ctx, doc, num, fzbuf);
+ pdf_dict_puts_drop(ctx, dict, "Length", pdf_new_int(ctx, doc, fz_buffer_storage(ctx, fzbuf, NULL)));
- writeobject(doc, opts, num, 0, 0);
+ writeobject(ctx, doc, opts, num, 0, 0);
fprintf(opts->out, "startxref\n%d\n%%%%EOF\n", startxref);
}
fz_always(ctx)
{
- pdf_drop_obj(dict);
- pdf_drop_obj(w);
+ pdf_drop_obj(ctx, dict);
+ pdf_drop_obj(ctx, w);
fz_drop_buffer(ctx, fzbuf);
}
fz_catch(ctx)
@@ -2030,9 +2015,9 @@ padto(FILE *file, int target)
}
static void
-dowriteobject(pdf_document *doc, pdf_write_options *opts, int num, int pass)
+dowriteobject(fz_context *ctx, pdf_document *doc, pdf_write_options *opts, int num, int pass)
{
- pdf_xref_entry *entry = pdf_get_xref_entry(doc, num);
+ pdf_xref_entry *entry = pdf_get_xref_entry(ctx, doc, num);
if (entry->type == 'f')
opts->gen_list[num] = entry->gen;
if (entry->type == 'n')
@@ -2056,18 +2041,18 @@ dowriteobject(pdf_document *doc, pdf_write_options *opts, int num, int pass)
if (pass > 0)
padto(opts->out, opts->ofs_list[num]);
opts->ofs_list[num] = ftell(opts->out);
- if (!opts->do_incremental || pdf_xref_is_incremental(doc, num))
- writeobject(doc, opts, num, opts->gen_list[num], 1);
+ if (!opts->do_incremental || pdf_xref_is_incremental(ctx, doc, num))
+ writeobject(ctx, doc, opts, num, opts->gen_list[num], 1);
}
else
opts->use_list[num] = 0;
}
static void
-writeobjects(pdf_document *doc, pdf_write_options *opts, int pass)
+writeobjects(fz_context *ctx, pdf_document *doc, pdf_write_options *opts, int pass)
{
int num;
- int xref_len = pdf_xref_len(doc);
+ int xref_len = pdf_xref_len(ctx, doc);
if (!opts->do_incremental)
{
@@ -2075,7 +2060,7 @@ writeobjects(pdf_document *doc, pdf_write_options *opts, int pass)
fprintf(opts->out, "%%\316\274\341\277\246\n\n");
}
- dowriteobject(doc, opts, opts->start, pass);
+ dowriteobject(ctx, doc, opts, opts->start, pass);
if (opts->do_linear)
{
@@ -2084,11 +2069,11 @@ writeobjects(pdf_document *doc, pdf_write_options *opts, int pass)
opts->first_xref_offset = ftell(opts->out);
else
padto(opts->out, opts->first_xref_offset);
- writexref(doc, opts, opts->start, pdf_xref_len(doc), 1, opts->main_xref_offset, 0);
+ writexref(ctx, doc, opts, opts->start, pdf_xref_len(ctx, doc), 1, opts->main_xref_offset, 0);
}
for (num = opts->start+1; num < xref_len; num++)
- dowriteobject(doc, opts, num, pass);
+ dowriteobject(ctx, doc, opts, num, pass);
if (opts->do_linear && pass == 1)
{
int offset = (opts->start == 1 ? opts->main_xref_offset : opts->ofs_list[1] + opts->hintstream_len);
@@ -2098,7 +2083,7 @@ writeobjects(pdf_document *doc, pdf_write_options *opts, int pass)
{
if (pass == 1)
opts->ofs_list[num] += opts->hintstream_len;
- dowriteobject(doc, opts, num, pass);
+ dowriteobject(ctx, doc, opts, num, pass);
}
}
@@ -2120,9 +2105,8 @@ my_log2(int x)
}
static void
-make_page_offset_hints(pdf_document *doc, pdf_write_options *opts, fz_buffer *buf)
+make_page_offset_hints(fz_context *ctx, pdf_document *doc, pdf_write_options *opts, fz_buffer *buf)
{
- fz_context *ctx = doc->ctx;
int i, j;
int min_objs_per_page, max_objs_per_page;
int min_page_length, max_page_length;
@@ -2133,9 +2117,9 @@ make_page_offset_hints(pdf_document *doc, pdf_write_options *opts, fz_buffer *bu
page_objects **pop = &opts->page_object_lists->page[0];
int page_len_bits, shared_object_bits, shared_object_id_bits;
int shared_length_bits;
- int xref_len = pdf_xref_len(doc);
+ int xref_len = pdf_xref_len(ctx, doc);
- min_shared_object = pdf_xref_len(doc);
+ min_shared_object = pdf_xref_len(ctx, doc);
max_shared_object = 1;
min_shared_length = opts->file_len;
max_shared_length = 0;
@@ -2391,15 +2375,14 @@ make_page_offset_hints(pdf_document *doc, pdf_write_options *opts, fz_buffer *bu
}
static void
-make_hint_stream(pdf_document *doc, pdf_write_options *opts)
+make_hint_stream(fz_context *ctx, pdf_document *doc, pdf_write_options *opts)
{
- fz_context *ctx = doc->ctx;
fz_buffer *buf = fz_new_buffer(ctx, 100);
fz_try(ctx)
{
- make_page_offset_hints(doc, opts, buf);
- pdf_update_stream(doc, pdf_xref_len(doc)-1, buf);
+ make_page_offset_hints(ctx, doc, opts, buf);
+ pdf_update_stream(ctx, doc, pdf_xref_len(ctx, doc)-1, buf);
opts->hintstream_len = buf->len;
fz_drop_buffer(ctx, buf);
}
@@ -2411,18 +2394,18 @@ make_hint_stream(pdf_document *doc, pdf_write_options *opts)
}
#ifdef DEBUG_WRITING
-static void dump_object_details(pdf_document *doc, pdf_write_options *opts)
+static void dump_object_details(fz_context *ctx, pdf_document *doc, pdf_write_options *opts)
{
int i;
- for (i = 0; i < pdf_xref_len(doc); i++)
+ for (i = 0; i < pdf_xref_len(ctx, doc); i++)
{
fprintf(stderr, "%d@%d: use=%d\n", i, opts->ofs_list[i], opts->use_list[i]);
}
}
#endif
-static void presize_unsaved_signature_byteranges(pdf_document *doc)
+static void presize_unsaved_signature_byteranges(fz_context *ctx, pdf_document *doc)
{
if (doc->unsaved_sigs)
{
@@ -2441,20 +2424,19 @@ static void presize_unsaved_signature_byteranges(pdf_document *doc)
* the end and between each consecutive pair of signatures,
* hence n + 1 */
int i;
- pdf_obj *byte_range = pdf_dict_getp(usig->field, "V/ByteRange");
+ pdf_obj *byte_range = pdf_dict_getp(ctx, usig->field, "V/ByteRange");
for (i = 0; i < n+1; i++)
{
- pdf_array_push_drop(byte_range, pdf_new_int(doc, INT_MAX));
- pdf_array_push_drop(byte_range, pdf_new_int(doc, INT_MAX));
+ pdf_array_push_drop(ctx, byte_range, pdf_new_int(ctx, doc, INT_MAX));
+ pdf_array_push_drop(ctx, byte_range, pdf_new_int(ctx, doc, INT_MAX));
}
}
}
}
-static void complete_signatures(pdf_document *doc, pdf_write_options *opts, char *filename)
+static void complete_signatures(fz_context *ctx, pdf_document *doc, pdf_write_options *opts, char *filename)
{
- fz_context *ctx = doc->ctx;
pdf_unsaved_sig *usig;
FILE *f;
char buf[5120];
@@ -2477,7 +2459,7 @@ static void complete_signatures(pdf_document *doc, pdf_write_options *opts, char
for (usig = doc->unsaved_sigs; usig; usig = usig->next)
{
char *bstr, *cstr, *fstr;
- int pnum = pdf_obj_parent_num(pdf_dict_getp(usig->field, "V/ByteRange"));
+ int pnum = pdf_obj_parent_num(ctx, pdf_dict_getp(ctx, usig->field, "V/ByteRange"));
fseek(f, opts->ofs_list[pnum], SEEK_SET);
(void)fread(buf, 1, sizeof(buf), f);
buf[sizeof(buf)-1] = 0;
@@ -2497,25 +2479,25 @@ static void complete_signatures(pdf_document *doc, pdf_write_options *opts, char
/* Recreate ByteRange with correct values. Initially store the
* recreated object in the first of the unsaved signatures */
- byte_range = pdf_new_array(doc, 4);
- pdf_dict_putp_drop(doc->unsaved_sigs->field, "V/ByteRange", byte_range);
+ byte_range = pdf_new_array(ctx, doc, 4);
+ pdf_dict_putp_drop(ctx, doc->unsaved_sigs->field, "V/ByteRange", byte_range);
last_end = 0;
for (usig = doc->unsaved_sigs; usig; usig = usig->next)
{
- pdf_array_push_drop(byte_range, pdf_new_int(doc, last_end));
- pdf_array_push_drop(byte_range, pdf_new_int(doc, usig->contents_start - last_end));
+ pdf_array_push_drop(ctx, byte_range, pdf_new_int(ctx, doc, last_end));
+ pdf_array_push_drop(ctx, byte_range, pdf_new_int(ctx, doc, usig->contents_start - last_end));
last_end = usig->contents_end;
}
- pdf_array_push_drop(byte_range, pdf_new_int(doc, last_end));
- pdf_array_push_drop(byte_range, pdf_new_int(doc, flen - last_end));
+ pdf_array_push_drop(ctx, byte_range, pdf_new_int(ctx, doc, last_end));
+ pdf_array_push_drop(ctx, byte_range, pdf_new_int(ctx, doc, flen - last_end));
/* Copy the new ByteRange to the other unsaved signatures */
for (usig = doc->unsaved_sigs->next; usig; usig = usig->next)
- pdf_dict_putp_drop(usig->field, "V/ByteRange", pdf_copy_array(byte_range));
+ pdf_dict_putp_drop(ctx, usig->field, "V/ByteRange", pdf_copy_array(ctx, byte_range));
/* Write the byte range into buf, padding with spaces*/
- i = pdf_sprint_obj(buf, sizeof(buf), byte_range, 1);
+ i = pdf_sprint_obj(ctx, buf, sizeof(buf), byte_range, 1);
memset(buf+i, ' ', sizeof(buf)-i);
/* Write the byte range to the file */
@@ -2529,60 +2511,59 @@ static void complete_signatures(pdf_document *doc, pdf_write_options *opts, char
/* Write the digests into the file */
for (usig = doc->unsaved_sigs; usig; usig = usig->next)
- pdf_write_digest(doc, filename, byte_range, usig->contents_start, usig->contents_end - usig->contents_start, usig->signer);
+ pdf_write_digest(ctx, doc, filename, byte_range, usig->contents_start, usig->contents_end - usig->contents_start, usig->signer);
/* delete the unsaved_sigs records */
while ((usig = doc->unsaved_sigs) != NULL)
{
doc->unsaved_sigs = usig->next;
- pdf_drop_obj(usig->field);
- pdf_drop_signer(usig->signer);
+ pdf_drop_obj(ctx, usig->field);
+ pdf_drop_signer(ctx, usig->signer);
fz_free(ctx, usig);
}
}
}
-static void sanitise(pdf_document *doc)
+static void sanitise(fz_context *ctx, pdf_document *doc)
{
- int n = pdf_count_pages(doc);
+ int n = pdf_count_pages(ctx, doc);
int i;
for (i = 0; i < n; i++)
{
- pdf_page *page = pdf_load_page(doc, i);
+ pdf_page *page = pdf_load_page(ctx, doc, i);
- pdf_clean_page_contents(doc, page, NULL);
+ pdf_clean_page_contents(ctx, doc, page, NULL);
- pdf_drop_page(doc, page);
+ fz_drop_page(ctx, &page->super);
}
}
-void pdf_write_document(pdf_document *doc, char *filename, fz_write_options *fz_opts)
+void pdf_write_document(fz_context *ctx, pdf_document *doc, char *filename, fz_write_options *fz_opts)
{
+ fz_write_options opts_defaults = { 0 };
+ pdf_write_options opts = { 0 };
+
int lastfree;
int num;
- pdf_write_options opts = { 0 };
- fz_context *ctx;
int xref_len;
- fz_write_options fz_opts_defaults = { 0 };
if (!doc)
return;
if (!fz_opts)
- fz_opts = &fz_opts_defaults;
+ fz_opts = &opts_defaults;
doc->freeze_updates = 1;
- ctx = doc->ctx;
/* Sanitise the operator streams */
if (fz_opts->do_clean)
- sanitise(doc);
+ sanitise(ctx, doc);
- pdf_finish_edit(doc);
- presize_unsaved_signature_byteranges(doc);
+ pdf_finish_edit(ctx, doc);
+ presize_unsaved_signature_byteranges(ctx, doc);
- xref_len = pdf_xref_len(doc);
+ xref_len = pdf_xref_len(ctx, doc);
if (fz_opts->do_incremental)
{
@@ -2614,12 +2595,12 @@ void pdf_write_document(pdf_document *doc, char *filename, fz_write_options *fz_
/* We deliberately make these arrays long enough to cope with
* 1 to n access rather than 0..n-1, and add space for 2 new
* extra entries that may be required for linearization. */
- opts.use_list = fz_malloc_array(ctx, pdf_xref_len(doc) + 3, sizeof(int));
- opts.ofs_list = fz_malloc_array(ctx, pdf_xref_len(doc) + 3, sizeof(int));
- opts.gen_list = fz_calloc(ctx, pdf_xref_len(doc) + 3, sizeof(int));
- opts.renumber_map = fz_malloc_array(ctx, pdf_xref_len(doc) + 3, sizeof(int));
- opts.rev_renumber_map = fz_malloc_array(ctx, pdf_xref_len(doc) + 3, sizeof(int));
- opts.rev_gen_list = fz_malloc_array(ctx, pdf_xref_len(doc) + 3, sizeof(int));
+ opts.use_list = fz_malloc_array(ctx, pdf_xref_len(ctx, doc) + 3, sizeof(int));
+ opts.ofs_list = fz_malloc_array(ctx, pdf_xref_len(ctx, doc) + 3, sizeof(int));
+ opts.gen_list = fz_calloc(ctx, pdf_xref_len(ctx, doc) + 3, sizeof(int));
+ opts.renumber_map = fz_malloc_array(ctx, pdf_xref_len(ctx, doc) + 3, sizeof(int));
+ opts.rev_renumber_map = fz_malloc_array(ctx, pdf_xref_len(ctx, doc) + 3, sizeof(int));
+ opts.rev_gen_list = fz_malloc_array(ctx, pdf_xref_len(ctx, doc) + 3, sizeof(int));
opts.continue_on_error = fz_opts->continue_on_error;
opts.errors = fz_opts->errors;
@@ -2629,7 +2610,7 @@ void pdf_write_document(pdf_document *doc, char *filename, fz_write_options *fz_
opts.ofs_list[num] = 0;
opts.renumber_map[num] = num;
opts.rev_renumber_map[num] = num;
- opts.rev_gen_list[num] = pdf_get_xref_entry(doc, num)->gen;
+ opts.rev_gen_list[num] = pdf_get_xref_entry(ctx, doc, num)->gen;
}
if (opts.do_incremental && opts.do_garbage)
@@ -2640,28 +2621,28 @@ void pdf_write_document(pdf_document *doc, char *filename, fz_write_options *fz_
/* Make sure any objects hidden in compressed streams have been loaded */
if (!opts.do_incremental)
{
- pdf_ensure_solid_xref(doc, xref_len);
- preloadobjstms(doc);
+ pdf_ensure_solid_xref(ctx, doc, xref_len);
+ preloadobjstms(ctx, doc);
}
/* Sweep & mark objects from the trailer */
if (opts.do_garbage >= 1)
- sweepobj(doc, &opts, pdf_trailer(doc));
+ sweepobj(ctx, doc, &opts, pdf_trailer(ctx, doc));
else
for (num = 0; num < xref_len; num++)
opts.use_list[num] = 1;
/* Coalesce and renumber duplicate objects */
if (opts.do_garbage >= 3)
- removeduplicateobjs(doc, &opts);
+ removeduplicateobjs(ctx, doc, &opts);
/* Compact xref by renumbering and removing unused objects */
if (opts.do_garbage >= 2 || opts.do_linear)
- compactxref(doc, &opts);
+ compactxref(ctx, doc, &opts);
/* Make renumbering affect all indirect references and update xref */
if (opts.do_garbage >= 2 || opts.do_linear)
- renumberobjs(doc, &opts);
+ renumberobjs(ctx, doc, &opts);
/* Truncate the xref after compacting and renumbering */
if (opts.do_garbage >= 2 && !opts.do_incremental)
@@ -2670,20 +2651,20 @@ void pdf_write_document(pdf_document *doc, char *filename, fz_write_options *fz_
if (opts.do_linear)
{
- linearize(doc, &opts);
+ linearize(ctx, doc, &opts);
}
- writeobjects(doc, &opts, 0);
+ writeobjects(ctx, doc, &opts, 0);
#ifdef DEBUG_WRITING
- dump_object_details(doc, &opts);
+ dump_object_details(ctx, doc, &opts);
#endif
if (opts.do_incremental)
{
for (num = 0; num < xref_len; num++)
{
- if (!opts.use_list[num] && pdf_xref_is_incremental(doc, num))
+ if (!opts.use_list[num] && pdf_xref_is_incremental(ctx, doc, num))
{
/* Make unreusable. FIXME: would be better to link to existing free list */
opts.gen_list[num] = 65535;
@@ -2709,31 +2690,31 @@ void pdf_write_document(pdf_document *doc, char *filename, fz_write_options *fz_
if (opts.do_linear)
{
opts.main_xref_offset = ftell(opts.out);
- writexref(doc, &opts, 0, opts.start, 0, 0, opts.first_xref_offset);
+ writexref(ctx, doc, &opts, 0, opts.start, 0, 0, opts.first_xref_offset);
opts.file_len = ftell(opts.out);
- make_hint_stream(doc, &opts);
+ make_hint_stream(ctx, doc, &opts);
opts.file_len += opts.hintstream_len;
opts.main_xref_offset += opts.hintstream_len;
- update_linearization_params(doc, &opts);
+ update_linearization_params(ctx, doc, &opts);
fseek(opts.out, 0, 0);
- writeobjects(doc, &opts, 1);
+ writeobjects(ctx, doc, &opts, 1);
padto(opts.out, opts.main_xref_offset);
- writexref(doc, &opts, 0, opts.start, 0, 0, opts.first_xref_offset);
+ writexref(ctx, doc, &opts, 0, opts.start, 0, 0, opts.first_xref_offset);
}
else
{
opts.first_xref_offset = ftell(opts.out);
if (opts.do_incremental && doc->has_xref_streams)
- writexrefstream(doc, &opts, 0, xref_len, 1, 0, opts.first_xref_offset);
+ writexrefstream(ctx, doc, &opts, 0, xref_len, 1, 0, opts.first_xref_offset);
else
- writexref(doc, &opts, 0, xref_len, 1, 0, opts.first_xref_offset);
+ writexref(ctx, doc, &opts, 0, xref_len, 1, 0, opts.first_xref_offset);
}
fclose(opts.out);
opts.out = NULL;
- complete_signatures(doc, &opts, filename);
+ complete_signatures(ctx, doc, &opts, filename);
doc->dirty = 0;
}
@@ -2741,7 +2722,7 @@ void pdf_write_document(pdf_document *doc, char *filename, fz_write_options *fz_
{
#ifdef DEBUG_LINEARIZATION
page_objects_dump(&opts);
- objects_dump(doc, &opts);
+ objects_dump(ctx, doc, &opts);
#endif
fz_free(ctx, opts.use_list);
fz_free(ctx, opts.ofs_list);
@@ -2749,15 +2730,15 @@ void pdf_write_document(pdf_document *doc, char *filename, fz_write_options *fz_
fz_free(ctx, opts.renumber_map);
fz_free(ctx, opts.rev_renumber_map);
fz_free(ctx, opts.rev_gen_list);
- pdf_drop_obj(opts.linear_l);
- pdf_drop_obj(opts.linear_h0);
- pdf_drop_obj(opts.linear_h1);
- pdf_drop_obj(opts.linear_o);
- pdf_drop_obj(opts.linear_e);
- pdf_drop_obj(opts.linear_n);
- pdf_drop_obj(opts.linear_t);
- pdf_drop_obj(opts.hints_s);
- pdf_drop_obj(opts.hints_length);
+ pdf_drop_obj(ctx, opts.linear_l);
+ pdf_drop_obj(ctx, opts.linear_h0);
+ pdf_drop_obj(ctx, opts.linear_h1);
+ pdf_drop_obj(ctx, opts.linear_o);
+ pdf_drop_obj(ctx, opts.linear_e);
+ pdf_drop_obj(ctx, opts.linear_n);
+ pdf_drop_obj(ctx, opts.linear_t);
+ pdf_drop_obj(ctx, opts.hints_s);
+ pdf_drop_obj(ctx, opts.hints_length);
page_objects_list_destroy(ctx, opts.page_object_lists);
if (opts.out)
fclose(opts.out);
@@ -2773,12 +2754,11 @@ void pdf_write_document(pdf_document *doc, char *filename, fz_write_options *fz_
#if 0
-// TODO: pdf_rebalance_page_tree(doc);
+// TODO: pdf_rebalance_page_tree(ctx, doc);
static pdf_obj *
-make_page_tree_node(pdf_document *doc, int l, int r, pdf_obj *parent_ref, int root)
+make_page_tree_node(fz_context *ctx, pdf_document *doc, int l, int r, pdf_obj *parent_ref, int root)
{
- fz_context *ctx = doc->ctx;
int count_per_kid, spaces;
pdf_obj *a = NULL;
pdf_obj *me = NULL;
@@ -2796,52 +2776,52 @@ make_page_tree_node(pdf_document *doc, int l, int r, pdf_obj *parent_ref, int ro
fz_try(ctx)
{
- me = pdf_new_dict(doc, 2);
- pdf_dict_puts_drop(me, "Type", pdf_new_name(doc, "Pages"));
- pdf_dict_puts_drop(me, "Count", pdf_new_int(doc, r-l));
+ me = pdf_new_dict(ctx, doc, 2);
+ pdf_dict_puts_drop(ctx, me, "Type", pdf_new_name(ctx, doc, "Pages"));
+ pdf_dict_puts_drop(ctx, me, "Count", pdf_new_int(ctx, doc, r-l));
if (!root)
- pdf_dict_puts(me, "Parent", parent_ref);
- a = pdf_new_array(doc, KIDS_PER_LEVEL);
- me_ref = pdf_new_ref(doc, me);
+ pdf_dict_puts(ctx, me, "Parent", parent_ref);
+ a = pdf_new_array(ctx, doc, KIDS_PER_LEVEL);
+ me_ref = pdf_new_ref(ctx, doc, me);
for (spaces = KIDS_PER_LEVEL; l < r; spaces--)
{
if (spaces >= r-l)
{
- o = pdf_keep_obj(doc->page_refs[l++]);
- pdf_dict_puts(o, "Parent", me_ref);
+ o = pdf_keep_obj(ctx, doc->page_refs[l++]);
+ pdf_dict_puts(ctx, o, "Parent", me_ref);
}
else
{
int j = l+count_per_kid;
if (j > r)
j = r;
- o = make_page_tree_node(doc, l, j, me_ref, 0);
+ o = make_page_tree_node(ctx, doc, l, j, me_ref, 0);
l = j;
}
- pdf_array_push(a, o);
- pdf_drop_obj(o);
+ pdf_array_push(ctx, a, o);
+ pdf_drop_obj(ctx, o);
o = NULL;
}
- pdf_dict_puts_drop(me, "Kids", a);
+ pdf_dict_puts_drop(ctx, me, "Kids", a);
a = NULL;
}
fz_always(ctx)
{
- pdf_drop_obj(me);
+ pdf_drop_obj(ctx, me);
}
fz_catch(ctx)
{
- pdf_drop_obj(a);
- pdf_drop_obj(o);
- pdf_drop_obj(me);
+ pdf_drop_obj(ctx, a);
+ pdf_drop_obj(ctx, o);
+ pdf_drop_obj(ctx, me);
fz_rethrow_message(ctx, "Failed to synthesize new page tree");
}
return me_ref;
}
static void
-pdf_rebalance_page_tree(pdf_document *doc)
+pdf_rebalance_page_tree(fz_context *ctx, pdf_document *doc)
{
pdf_obj *catalog;
pdf_obj *pages;
@@ -2849,9 +2829,9 @@ pdf_rebalance_page_tree(pdf_document *doc)
if (!doc || !doc->needs_page_tree_rebuild)
return;
- catalog = pdf_dict_gets(pdf_trailer(doc), "Root");
- pages = make_page_tree_node(doc, 0, doc->page_len, catalog, 1);
- pdf_dict_puts_drop(catalog, "Pages", pages);
+ catalog = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Root");
+ pages = make_page_tree_node(ctx, doc, 0, doc->page_len, catalog, 1);
+ pdf_dict_puts_drop(ctx, catalog, "Pages", pages);
doc->needs_page_tree_rebuild = 0;
}
@@ -2859,13 +2839,13 @@ pdf_rebalance_page_tree(pdf_document *doc)
#endif
static void
-pdf_rebalance_page_tree(pdf_document *doc)
+pdf_rebalance_page_tree(fz_context *ctx, pdf_document *doc)
{
}
-void pdf_finish_edit(pdf_document *doc)
+void pdf_finish_edit(fz_context *ctx, pdf_document *doc)
{
if (!doc)
return;
- pdf_rebalance_page_tree(doc);
+ pdf_rebalance_page_tree(ctx, doc);
}
diff --git a/source/pdf/pdf-xobject.c b/source/pdf/pdf-xobject.c
index c350eb0a..e169a27a 100644
--- a/source/pdf/pdf-xobject.c
+++ b/source/pdf/pdf-xobject.c
@@ -19,9 +19,9 @@ pdf_drop_xobject_imp(fz_context *ctx, fz_storable *xobj_)
if (xobj->colorspace)
fz_drop_colorspace(ctx, xobj->colorspace);
- pdf_drop_obj(xobj->resources);
- pdf_drop_obj(xobj->contents);
- pdf_drop_obj(xobj->me);
+ pdf_drop_obj(ctx, xobj->resources);
+ pdf_drop_obj(ctx, xobj->contents);
+ pdf_drop_obj(ctx, xobj->me);
fz_free(ctx, xobj);
}
@@ -34,11 +34,10 @@ pdf_xobject_size(pdf_xobject *xobj)
}
pdf_xobject *
-pdf_load_xobject(pdf_document *doc, pdf_obj *dict)
+pdf_load_xobject(fz_context *ctx, pdf_document *doc, pdf_obj *dict)
{
pdf_xobject *form;
pdf_obj *obj;
- fz_context *ctx = doc->ctx;
if ((form = pdf_find_item(ctx, pdf_drop_xobject_imp, dict)) != NULL)
{
@@ -58,10 +57,10 @@ pdf_load_xobject(pdf_document *doc, pdf_obj *dict)
fz_try(ctx)
{
- obj = pdf_dict_gets(dict, "BBox");
+ obj = pdf_dict_gets(ctx, dict, "BBox");
pdf_to_rect(ctx, obj, &form->bbox);
- obj = pdf_dict_gets(dict, "Matrix");
+ obj = pdf_dict_gets(ctx, dict, "Matrix");
if (obj)
pdf_to_matrix(ctx, obj, &form->matrix);
else
@@ -71,24 +70,24 @@ pdf_load_xobject(pdf_document *doc, pdf_obj *dict)
form->knockout = 0;
form->transparency = 0;
- obj = pdf_dict_gets(dict, "Group");
+ obj = pdf_dict_gets(ctx, dict, "Group");
if (obj)
{
pdf_obj *attrs = obj;
- form->isolated = pdf_to_bool(pdf_dict_gets(attrs, "I"));
- form->knockout = pdf_to_bool(pdf_dict_gets(attrs, "K"));
+ form->isolated = pdf_to_bool(ctx, pdf_dict_gets(ctx, attrs, "I"));
+ form->knockout = pdf_to_bool(ctx, pdf_dict_gets(ctx, attrs, "K"));
- obj = pdf_dict_gets(attrs, "S");
- if (pdf_is_name(obj) && !strcmp(pdf_to_name(obj), "Transparency"))
+ obj = pdf_dict_gets(ctx, attrs, "S");
+ if (pdf_is_name(ctx, obj) && !strcmp(pdf_to_name(ctx, obj), "Transparency"))
form->transparency = 1;
- obj = pdf_dict_gets(attrs, "CS");
+ obj = pdf_dict_gets(ctx, attrs, "CS");
if (obj)
{
fz_try(ctx)
{
- form->colorspace = pdf_load_colorspace(doc, obj);
+ form->colorspace = pdf_load_colorspace(ctx, doc, obj);
}
fz_catch(ctx)
{
@@ -97,25 +96,25 @@ pdf_load_xobject(pdf_document *doc, pdf_obj *dict)
}
}
- form->resources = pdf_dict_gets(dict, "Resources");
+ form->resources = pdf_dict_gets(ctx, dict, "Resources");
if (form->resources)
- pdf_keep_obj(form->resources);
+ pdf_keep_obj(ctx, form->resources);
- form->contents = pdf_keep_obj(dict);
+ form->contents = pdf_keep_obj(ctx, dict);
}
fz_catch(ctx)
{
pdf_remove_item(ctx, pdf_drop_xobject_imp, dict);
pdf_drop_xobject(ctx, form);
- fz_rethrow_message(ctx, "cannot load xobject content stream (%d %d R)", pdf_to_num(dict), pdf_to_gen(dict));
+ fz_rethrow_message(ctx, "cannot load xobject content stream (%d %d R)", pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict));
}
- form->me = pdf_keep_obj(dict);
+ form->me = pdf_keep_obj(ctx, dict);
return form;
}
pdf_obj *
-pdf_new_xobject(pdf_document *doc, const fz_rect *bbox, const fz_matrix *mat)
+pdf_new_xobject(fz_context *ctx, pdf_document *doc, const fz_rect *bbox, const fz_matrix *mat)
{
int idict_num;
pdf_obj *idict = NULL;
@@ -124,7 +123,6 @@ pdf_new_xobject(pdf_document *doc, const fz_rect *bbox, const fz_matrix *mat)
pdf_obj *obj = NULL;
pdf_obj *res = NULL;
pdf_obj *procset = NULL;
- fz_context *ctx = doc->ctx;
fz_var(idict);
fz_var(dict);
@@ -134,51 +132,51 @@ pdf_new_xobject(pdf_document *doc, const fz_rect *bbox, const fz_matrix *mat)
fz_var(procset);
fz_try(ctx)
{
- dict = pdf_new_dict(doc, 0);
+ dict = pdf_new_dict(ctx, doc, 0);
- obj = pdf_new_rect(doc, bbox);
- pdf_dict_puts(dict, "BBox", obj);
- pdf_drop_obj(obj);
+ obj = pdf_new_rect(ctx, doc, bbox);
+ pdf_dict_puts(ctx, dict, "BBox", obj);
+ pdf_drop_obj(ctx, obj);
obj = NULL;
- obj = pdf_new_int(doc, 1);
- pdf_dict_puts(dict, "FormType", obj);
- pdf_drop_obj(obj);
+ obj = pdf_new_int(ctx, doc, 1);
+ pdf_dict_puts(ctx, dict, "FormType", obj);
+ pdf_drop_obj(ctx, obj);
obj = NULL;
- obj = pdf_new_int(doc, 0);
- pdf_dict_puts(dict, "Length", obj);
- pdf_drop_obj(obj);
+ obj = pdf_new_int(ctx, doc, 0);
+ pdf_dict_puts(ctx, dict, "Length", obj);
+ pdf_drop_obj(ctx, obj);
obj = NULL;
- obj = pdf_new_matrix(doc, mat);
- pdf_dict_puts(dict, "Matrix", obj);
- pdf_drop_obj(obj);
+ obj = pdf_new_matrix(ctx, doc, mat);
+ pdf_dict_puts(ctx, dict, "Matrix", obj);
+ pdf_drop_obj(ctx, obj);
obj = NULL;
- res = pdf_new_dict(doc, 0);
- procset = pdf_new_array(doc, 2);
- obj = pdf_new_name(doc, "PDF");
- pdf_array_push(procset, obj);
- pdf_drop_obj(obj);
+ res = pdf_new_dict(ctx, doc, 0);
+ procset = pdf_new_array(ctx, doc, 2);
+ obj = pdf_new_name(ctx, doc, "PDF");
+ pdf_array_push(ctx, procset, obj);
+ pdf_drop_obj(ctx, obj);
obj = NULL;
- obj = pdf_new_name(doc, "Text");
- pdf_array_push(procset, obj);
- pdf_drop_obj(obj);
+ obj = pdf_new_name(ctx, doc, "Text");
+ pdf_array_push(ctx, procset, obj);
+ pdf_drop_obj(ctx, obj);
obj = NULL;
- pdf_dict_puts(res, "ProcSet", procset);
- pdf_drop_obj(procset);
+ pdf_dict_puts(ctx, res, "ProcSet", procset);
+ pdf_drop_obj(ctx, procset);
procset = NULL;
- pdf_dict_puts(dict, "Resources", res);
+ pdf_dict_puts(ctx, dict, "Resources", res);
- obj = pdf_new_name(doc, "Form");
- pdf_dict_puts(dict, "Subtype", obj);
- pdf_drop_obj(obj);
+ obj = pdf_new_name(ctx, doc, "Form");
+ pdf_dict_puts(ctx, dict, "Subtype", obj);
+ pdf_drop_obj(ctx, obj);
obj = NULL;
- obj = pdf_new_name(doc, "XObject");
- pdf_dict_puts(dict, "Type", obj);
- pdf_drop_obj(obj);
+ obj = pdf_new_name(ctx, doc, "XObject");
+ pdf_dict_puts(ctx, dict, "Type", obj);
+ pdf_drop_obj(ctx, obj);
obj = NULL;
form = fz_malloc_struct(ctx, pdf_xobject);
@@ -200,27 +198,27 @@ pdf_new_xobject(pdf_document *doc, const fz_rect *bbox, const fz_matrix *mat)
form->resources = res;
res = NULL;
- idict_num = pdf_create_object(doc);
- pdf_update_object(doc, idict_num, dict);
- idict = pdf_new_indirect(doc, idict_num, 0);
- pdf_drop_obj(dict);
+ idict_num = pdf_create_object(ctx, doc);
+ pdf_update_object(ctx, doc, idict_num, dict);
+ idict = pdf_new_indirect(ctx, doc, idict_num, 0);
+ pdf_drop_obj(ctx, dict);
dict = NULL;
pdf_store_item(ctx, idict, form, pdf_xobject_size(form));
- form->contents = pdf_keep_obj(idict);
- form->me = pdf_keep_obj(idict);
+ form->contents = pdf_keep_obj(ctx, idict);
+ form->me = pdf_keep_obj(ctx, idict);
pdf_drop_xobject(ctx, form);
form = NULL;
}
fz_catch(ctx)
{
- pdf_drop_obj(procset);
- pdf_drop_obj(res);
- pdf_drop_obj(obj);
- pdf_drop_obj(dict);
- pdf_drop_obj(idict);
+ pdf_drop_obj(ctx, procset);
+ pdf_drop_obj(ctx, res);
+ pdf_drop_obj(ctx, obj);
+ pdf_drop_obj(ctx, dict);
+ pdf_drop_obj(ctx, idict);
pdf_drop_xobject(ctx, form);
fz_rethrow_message(ctx, "failed to create xobject)");
}
@@ -228,10 +226,10 @@ pdf_new_xobject(pdf_document *doc, const fz_rect *bbox, const fz_matrix *mat)
return idict;
}
-void pdf_update_xobject_contents(pdf_document *doc, pdf_xobject *form, fz_buffer *buffer)
+void pdf_update_xobject_contents(fz_context *ctx, pdf_document *doc, pdf_xobject *form, fz_buffer *buffer)
{
- pdf_dict_dels(form->contents, "Filter");
- pdf_dict_puts_drop(form->contents, "Length", pdf_new_int(doc, buffer->len));
- pdf_update_stream(doc, pdf_to_num(form->contents), buffer);
+ pdf_dict_dels(ctx, form->contents, "Filter");
+ pdf_dict_puts_drop(ctx, form->contents, "Length", pdf_new_int(ctx, doc, buffer->len));
+ pdf_update_stream(ctx, doc, pdf_to_num(ctx, form->contents), buffer);
form->iteration ++;
}
diff --git a/source/pdf/pdf-xref-aux.c b/source/pdf/pdf-xref-aux.c
index aac323de..d257fa60 100644
--- a/source/pdf/pdf-xref-aux.c
+++ b/source/pdf/pdf-xref-aux.c
@@ -12,8 +12,7 @@ pdf_document *
pdf_open_document_with_stream(fz_context *ctx, fz_stream *file)
{
pdf_document *doc = pdf_open_document_no_run_with_stream(ctx, file);
- doc->super.run_page_contents = (fz_document_run_page_contents_fn *)pdf_run_page_contents;
- doc->super.run_annot = (fz_document_run_annot_fn *)pdf_run_annot;
+ doc->super.load_page = (fz_document_load_page_fn*)pdf_load_page;
doc->update_appearance = pdf_update_appearance;
return doc;
}
@@ -22,8 +21,7 @@ pdf_document *
pdf_open_document(fz_context *ctx, const char *filename)
{
pdf_document *doc = pdf_open_document_no_run(ctx, filename);
- doc->super.run_page_contents = (fz_document_run_page_contents_fn *)pdf_run_page_contents;
- doc->super.run_annot = (fz_document_run_annot_fn *)pdf_run_annot;
+ doc->super.load_page = (fz_document_load_page_fn*)pdf_load_page;
doc->update_appearance = pdf_update_appearance;
return doc;
}
diff --git a/source/pdf/pdf-xref.c b/source/pdf/pdf-xref.c
index ef82cc2f..586aab2d 100644
--- a/source/pdf/pdf-xref.c
+++ b/source/pdf/pdf-xref.c
@@ -20,9 +20,8 @@ static inline int iswhite(int ch)
* xref tables
*/
-static void pdf_drop_xref_sections(pdf_document *doc)
+static void pdf_drop_xref_sections(fz_context *ctx, pdf_document *doc)
{
- fz_context *ctx = doc->ctx;
int x, e;
for (x = 0; x < doc->num_xref_sections; x++)
@@ -39,7 +38,7 @@ static void pdf_drop_xref_sections(pdf_document *doc)
if (entry->obj)
{
- pdf_drop_obj(entry->obj);
+ pdf_drop_obj(ctx, entry->obj);
fz_drop_buffer(ctx, entry->stm_buf);
}
}
@@ -48,8 +47,8 @@ static void pdf_drop_xref_sections(pdf_document *doc)
sub = next_sub;
}
- pdf_drop_obj(xref->pre_repair_trailer);
- pdf_drop_obj(xref->trailer);
+ pdf_drop_obj(ctx, xref->pre_repair_trailer);
+ pdf_drop_obj(ctx, xref->trailer);
}
fz_free(ctx, doc->xref_sections);
@@ -100,10 +99,10 @@ static void pdf_resize_xref(fz_context *ctx, pdf_document *doc, int newlen)
extend_xref_index(ctx, doc, newlen);
}
-static void pdf_populate_next_xref_level(pdf_document *doc)
+static void pdf_populate_next_xref_level(fz_context *ctx, pdf_document *doc)
{
pdf_xref *xref;
- doc->xref_sections = fz_resize_array(doc->ctx, doc->xref_sections, doc->num_xref_sections + 1, sizeof(pdf_xref));
+ doc->xref_sections = fz_resize_array(ctx, doc->xref_sections, doc->num_xref_sections + 1, sizeof(pdf_xref));
doc->num_xref_sections++;
xref = &doc->xref_sections[doc->num_xref_sections - 1];
@@ -113,7 +112,7 @@ static void pdf_populate_next_xref_level(pdf_document *doc)
xref->pre_repair_trailer = NULL;
}
-pdf_obj *pdf_trailer(pdf_document *doc)
+pdf_obj *pdf_trailer(fz_context *ctx, pdf_document *doc)
{
/* Return the document's final trailer */
pdf_xref *xref = &doc->xref_sections[0];
@@ -121,19 +120,19 @@ pdf_obj *pdf_trailer(pdf_document *doc)
return xref->trailer;
}
-void pdf_set_populating_xref_trailer(pdf_document *doc, pdf_obj *trailer)
+void pdf_set_populating_xref_trailer(fz_context *ctx, pdf_document *doc, pdf_obj *trailer)
{
/* Update the trailer of the xref section being populated */
pdf_xref *xref = &doc->xref_sections[doc->num_xref_sections - 1];
if (xref->trailer)
{
- pdf_drop_obj(xref->pre_repair_trailer);
+ pdf_drop_obj(ctx, xref->pre_repair_trailer);
xref->pre_repair_trailer = xref->trailer;
}
- xref->trailer = pdf_keep_obj(trailer);
+ xref->trailer = pdf_keep_obj(ctx, trailer);
}
-int pdf_xref_len(pdf_document *doc)
+int pdf_xref_len(fz_context *ctx, pdf_document *doc)
{
return doc->max_xref_len;
}
@@ -141,9 +140,8 @@ int pdf_xref_len(pdf_document *doc)
/* Ensure that the given xref has a single subsection
* that covers the entire range. */
static void
-ensure_solid_xref(pdf_document *doc, int num, int which)
+ensure_solid_xref(fz_context *ctx, pdf_document *doc, int num, int which)
{
- fz_context *ctx = doc->ctx;
pdf_xref *xref = &doc->xref_sections[which];
pdf_xref_subsec *sub = xref->subsec;
pdf_xref_subsec *new_sub;
@@ -191,7 +189,7 @@ ensure_solid_xref(pdf_document *doc, int num, int which)
}
/* Used while reading the individual xref sections from a file */
-pdf_xref_entry *pdf_get_populating_xref_entry(pdf_document *doc, int num)
+pdf_xref_entry *pdf_get_populating_xref_entry(fz_context *ctx, pdf_document *doc, int num)
{
/* Return an entry within the xref currently being populated */
pdf_xref *xref;
@@ -199,13 +197,13 @@ pdf_xref_entry *pdf_get_populating_xref_entry(pdf_document *doc, int num)
if (doc->num_xref_sections == 0)
{
- doc->xref_sections = fz_calloc(doc->ctx, 1, sizeof(pdf_xref));
+ doc->xref_sections = fz_calloc(ctx, 1, sizeof(pdf_xref));
doc->num_xref_sections = 1;
}
/* Prevent accidental heap underflow */
if (num < 0)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "object number must not be negative (%d)", num);
+ fz_throw(ctx, FZ_ERROR_GENERIC, "object number must not be negative (%d)", num);
/* Return the pointer to the entry in the last section. */
xref = &doc->xref_sections[doc->num_xref_sections-1];
@@ -217,7 +215,7 @@ pdf_xref_entry *pdf_get_populating_xref_entry(pdf_document *doc, int num)
}
/* We've been asked for an object that's not in a subsec. */
- ensure_solid_xref(doc, num+1, doc->num_xref_sections-1);
+ ensure_solid_xref(ctx, doc, num+1, doc->num_xref_sections-1);
xref = &doc->xref_sections[doc->num_xref_sections-1];
sub = xref->subsec;
@@ -228,9 +226,8 @@ pdf_xref_entry *pdf_get_populating_xref_entry(pdf_document *doc, int num)
/* This will never throw anything, or return NULL if it is
* only asked to return objects in range within a 'solid'
* xref. */
-pdf_xref_entry *pdf_get_xref_entry(pdf_document *doc, int i)
+pdf_xref_entry *pdf_get_xref_entry(fz_context *ctx, pdf_document *doc, int i)
{
- fz_context *ctx = doc->ctx;
pdf_xref *xref;
pdf_xref_subsec *sub;
int j;
@@ -284,7 +281,7 @@ pdf_xref_entry *pdf_get_xref_entry(pdf_document *doc, int i)
* can return a pointer. This is the only case where this function
* might throw an exception, and it will never happen when we are
* working within a 'solid' xref. */
- ensure_solid_xref(doc, i+1, 0);
+ ensure_solid_xref(ctx, doc, i+1, 0);
xref = &doc->xref_sections[0];
sub = xref->subsec;
return &sub->table[i - sub->start];
@@ -295,9 +292,8 @@ pdf_xref_entry *pdf_get_xref_entry(pdf_document *doc, int i)
updated versions of indirect objects. This is a new xref section
consisting of a single xref subsection.
*/
-static void ensure_incremental_xref(pdf_document *doc)
+static void ensure_incremental_xref(fz_context *ctx, pdf_document *doc)
{
- fz_context *ctx = doc->ctx;
if (!doc->xref_altered)
{
@@ -312,7 +308,7 @@ static void ensure_incremental_xref(pdf_document *doc)
fz_try(ctx)
{
sub = fz_malloc_struct(ctx, pdf_xref_subsec);
- trailer = pdf_copy_dict(xref->trailer);
+ trailer = pdf_copy_dict(ctx, xref->trailer);
doc->xref_sections = fz_resize_array(ctx, doc->xref_sections, doc->num_xref_sections + 1, sizeof(pdf_xref));
xref = &doc->xref_sections[0];
pxref = &doc->xref_sections[1];
@@ -331,7 +327,7 @@ static void ensure_incremental_xref(pdf_document *doc)
fz_catch(ctx)
{
fz_free(ctx, new_table);
- pdf_drop_obj(trailer);
+ pdf_drop_obj(ctx, trailer);
fz_rethrow(ctx);
}
@@ -344,14 +340,13 @@ static void ensure_incremental_xref(pdf_document *doc)
}
/* Used when altering a document */
-static pdf_xref_entry *pdf_get_incremental_xref_entry(pdf_document *doc, int i)
+static pdf_xref_entry *pdf_get_incremental_xref_entry(fz_context *ctx, pdf_document *doc, int i)
{
- fz_context *ctx = doc->ctx;
pdf_xref *xref;
pdf_xref_subsec *sub;
/* Make a new final xref section if we haven't already */
- ensure_incremental_xref(doc);
+ ensure_incremental_xref(ctx, doc);
xref = &doc->xref_sections[0];
if (i >= xref->num_objects)
@@ -364,7 +359,7 @@ static pdf_xref_entry *pdf_get_incremental_xref_entry(pdf_document *doc, int i)
return &sub->table[i - sub->start];
}
-int pdf_xref_is_incremental(pdf_document *doc, int num)
+int pdf_xref_is_incremental(fz_context *ctx, pdf_document *doc, int num)
{
pdf_xref *xref = &doc->xref_sections[0];
pdf_xref_subsec *sub = xref->subsec;
@@ -376,23 +371,23 @@ int pdf_xref_is_incremental(pdf_document *doc, int num)
/* Ensure that the current populating xref has a single subsection
* that covers the entire range. */
-void pdf_ensure_solid_xref(pdf_document *doc, int num)
+void pdf_ensure_solid_xref(fz_context *ctx, pdf_document *doc, int num)
{
if (doc->num_xref_sections == 0)
- pdf_populate_next_xref_level(doc);
+ pdf_populate_next_xref_level(ctx, doc);
- ensure_solid_xref(doc, num, doc->num_xref_sections-1);
+ ensure_solid_xref(ctx, doc, num, doc->num_xref_sections-1);
}
/* Ensure that an object has been cloned into the incremental xref section */
-void pdf_xref_ensure_incremental_object(pdf_document *doc, int num)
+void pdf_xref_ensure_incremental_object(fz_context *ctx, pdf_document *doc, int num)
{
pdf_xref_entry *new_entry, *old_entry;
pdf_xref_subsec *sub = NULL;
int i;
/* Make sure we have created an xref section for incremental updates */
- ensure_incremental_xref(doc);
+ ensure_incremental_xref(ctx, doc);
/* Search for the section that contains this object */
for (i = doc->xref_index[num]; i < doc->num_xref_sections; i++)
@@ -418,18 +413,17 @@ void pdf_xref_ensure_incremental_object(pdf_document *doc, int num)
/* Move the object to the incremental section */
doc->xref_index[num] = 0;
old_entry = &sub->table[num - sub->start];
- new_entry = pdf_get_incremental_xref_entry(doc, num);
+ new_entry = pdf_get_incremental_xref_entry(ctx, doc, num);
*new_entry = *old_entry;
old_entry->obj = NULL;
old_entry->stm_buf = NULL;
}
-void pdf_replace_xref(pdf_document *doc, pdf_xref_entry *entries, int n)
+void pdf_replace_xref(fz_context *ctx, pdf_document *doc, pdf_xref_entry *entries, int n)
{
- fz_context *ctx = doc->ctx;
pdf_xref *xref = NULL;
pdf_xref_subsec *sub;
- pdf_obj *trailer = pdf_keep_obj(pdf_trailer(doc));
+ pdf_obj *trailer = pdf_keep_obj(ctx, pdf_trailer(ctx, doc));
fz_var(xref);
fz_try(ctx)
@@ -439,7 +433,7 @@ void pdf_replace_xref(pdf_document *doc, pdf_xref_entry *entries, int n)
sub = fz_malloc_struct(ctx, pdf_xref_subsec);
/* The new table completely replaces the previous separate sections */
- pdf_drop_xref_sections(doc);
+ pdf_drop_xref_sections(ctx, doc);
sub->table = entries;
sub->start = 0;
@@ -458,7 +452,7 @@ void pdf_replace_xref(pdf_document *doc, pdf_xref_entry *entries, int n)
fz_catch(ctx)
{
fz_free(ctx, xref);
- pdf_drop_obj(trailer);
+ pdf_drop_obj(ctx, trailer);
fz_rethrow(ctx);
}
}
@@ -468,33 +462,33 @@ void pdf_replace_xref(pdf_document *doc, pdf_xref_entry *entries, int n)
*/
static void
-pdf_load_version(pdf_document *doc)
+pdf_load_version(fz_context *ctx, pdf_document *doc)
{
char buf[20];
- fz_seek(doc->file, 0, SEEK_SET);
- fz_read_line(doc->file, buf, sizeof buf);
+ fz_seek(ctx, doc->file, 0, SEEK_SET);
+ fz_read_line(ctx, doc->file, buf, sizeof buf);
if (memcmp(buf, "%PDF-", 5) != 0)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "cannot recognize version marker");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "cannot recognize version marker");
doc->version = 10 * (fz_atof(buf+5) + 0.05);
}
static void
-pdf_read_start_xref(pdf_document *doc)
+pdf_read_start_xref(fz_context *ctx, pdf_document *doc)
{
unsigned char buf[1024];
int t, n;
int i;
- fz_seek(doc->file, 0, SEEK_END);
+ fz_seek(ctx, doc->file, 0, SEEK_END);
- doc->file_size = fz_tell(doc->file);
+ doc->file_size = fz_tell(ctx, doc->file);
t = fz_maxi(0, doc->file_size - (int)sizeof buf);
- fz_seek(doc->file, t, SEEK_SET);
+ fz_seek(ctx, doc->file, t, SEEK_SET);
- n = fz_read(doc->file, buf, sizeof buf);
+ n = fz_read(ctx, doc->file, buf, sizeof buf);
for (i = n - 9; i >= 0; i--)
{
@@ -512,7 +506,7 @@ pdf_read_start_xref(pdf_document *doc)
}
}
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "cannot find startxref");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find startxref");
}
/*
@@ -520,7 +514,7 @@ pdf_read_start_xref(pdf_document *doc)
*/
static int
-pdf_xref_size_from_old_trailer(pdf_document *doc, pdf_lexbuf *buf)
+pdf_xref_size_from_old_trailer(fz_context *ctx, pdf_document *doc, pdf_lexbuf *buf)
{
int len;
char *s;
@@ -534,82 +528,81 @@ pdf_xref_size_from_old_trailer(pdf_document *doc, pdf_lexbuf *buf)
fz_var(trailer);
/* Record the current file read offset so that we can reinstate it */
- ofs = fz_tell(doc->file);
+ ofs = fz_tell(ctx, doc->file);
- fz_read_line(doc->file, buf->scratch, buf->size);
+ fz_read_line(ctx, doc->file, buf->scratch, buf->size);
if (strncmp(buf->scratch, "xref", 4) != 0)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "cannot find xref marker");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find xref marker");
while (1)
{
- c = fz_peek_byte(doc->file);
+ c = fz_peek_byte(ctx, doc->file);
if (!(c >= '0' && c <= '9'))
break;
- fz_read_line(doc->file, buf->scratch, buf->size);
+ fz_read_line(ctx, doc->file, buf->scratch, buf->size);
s = buf->scratch;
fz_strsep(&s, " "); /* ignore ofs */
if (!s)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "invalid range marker in xref");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "invalid range marker in xref");
len = fz_atoi(fz_strsep(&s, " "));
if (len < 0)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "xref range marker must be positive");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "xref range marker must be positive");
/* broken pdfs where the section is not on a separate line */
if (s && *s != '\0')
- fz_seek(doc->file, -(2 + (int)strlen(s)), SEEK_CUR);
+ fz_seek(ctx, doc->file, -(2 + (int)strlen(s)), SEEK_CUR);
- t = fz_tell(doc->file);
+ t = fz_tell(ctx, doc->file);
if (t < 0)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "cannot tell in file");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "cannot tell in file");
if (len > (INT_MAX - t) / 20)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "xref has too many entries");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "xref has too many entries");
- fz_seek(doc->file, t + 20 * len, SEEK_SET);
+ fz_seek(ctx, doc->file, t + 20 * len, SEEK_SET);
}
- fz_try(doc->ctx)
+ fz_try(ctx)
{
- tok = pdf_lex(doc->file, buf);
+ tok = pdf_lex(ctx, doc->file, buf);
if (tok != PDF_TOK_TRAILER)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "expected trailer marker");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "expected trailer marker");
- tok = pdf_lex(doc->file, buf);
+ tok = pdf_lex(ctx, doc->file, buf);
if (tok != PDF_TOK_OPEN_DICT)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "expected trailer dictionary");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "expected trailer dictionary");
- trailer = pdf_parse_dict(doc, doc->file, buf);
+ trailer = pdf_parse_dict(ctx, doc, doc->file, buf);
- size = pdf_to_int(pdf_dict_gets(trailer, "Size"));
+ size = pdf_to_int(ctx, pdf_dict_gets(ctx, trailer, "Size"));
if (!size)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "trailer missing Size entry");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "trailer missing Size entry");
}
- fz_always(doc->ctx)
+ fz_always(ctx)
{
- pdf_drop_obj(trailer);
+ pdf_drop_obj(ctx, trailer);
}
- fz_catch(doc->ctx)
+ fz_catch(ctx)
{
- fz_rethrow_message(doc->ctx, "cannot parse trailer");
+ fz_rethrow_message(ctx, "cannot parse trailer");
}
- fz_seek(doc->file, ofs, SEEK_SET);
+ fz_seek(ctx, doc->file, ofs, SEEK_SET);
return size;
}
pdf_obj *
-pdf_new_ref(pdf_document *doc, pdf_obj *obj)
+pdf_new_ref(fz_context *ctx, pdf_document *doc, pdf_obj *obj)
{
- int num = pdf_create_object(doc);
- pdf_update_object(doc, num, obj);
- return pdf_new_indirect(doc, num, 0);
+ int num = pdf_create_object(ctx, doc);
+ pdf_update_object(ctx, doc, num, obj);
+ return pdf_new_indirect(ctx, doc, num, 0);
}
static pdf_xref_entry *
-pdf_xref_find_subsection(pdf_document *doc, int ofs, int len)
+pdf_xref_find_subsection(fz_context *ctx, pdf_document *doc, int ofs, int len)
{
- fz_context *ctx = doc->ctx;
pdf_xref *xref = &doc->xref_sections[doc->num_xref_sections-1];
pdf_xref_subsec *sub;
int new_max;
@@ -658,7 +651,7 @@ pdf_xref_find_subsection(pdf_document *doc, int ofs, int len)
else
{
/* Case 3 */
- ensure_solid_xref(doc, new_max, doc->num_xref_sections-1);
+ ensure_solid_xref(ctx, doc, new_max, doc->num_xref_sections-1);
xref = &doc->xref_sections[doc->num_xref_sections-1];
sub = xref->subsec;
}
@@ -666,8 +659,10 @@ pdf_xref_find_subsection(pdf_document *doc, int ofs, int len)
}
static pdf_obj *
-pdf_read_old_xref(pdf_document *doc, pdf_lexbuf *buf)
+pdf_read_old_xref(fz_context *ctx, pdf_document *doc, pdf_lexbuf *buf)
{
+ fz_stream *file = doc->file;
+
int ofs, len;
char *s;
int n;
@@ -675,20 +670,20 @@ pdf_read_old_xref(pdf_document *doc, pdf_lexbuf *buf)
int i;
int c;
pdf_obj *trailer;
- int xref_len = pdf_xref_size_from_old_trailer(doc, buf);
+ int xref_len = pdf_xref_size_from_old_trailer(ctx, doc, buf);
pdf_xref_entry *table;
- fz_read_line(doc->file, buf->scratch, buf->size);
+ fz_read_line(ctx, file, buf->scratch, buf->size);
if (strncmp(buf->scratch, "xref", 4) != 0)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "cannot find xref marker");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find xref marker");
while (1)
{
- c = fz_peek_byte(doc->file);
+ c = fz_peek_byte(ctx, file);
if (!(c >= '0' && c <= '9'))
break;
- fz_read_line(doc->file, buf->scratch, buf->size);
+ fz_read_line(ctx, file, buf->scratch, buf->size);
s = buf->scratch;
ofs = fz_atoi(fz_strsep(&s, " "));
len = fz_atoi(fz_strsep(&s, " "));
@@ -696,27 +691,27 @@ pdf_read_old_xref(pdf_document *doc, pdf_lexbuf *buf)
/* broken pdfs where the section is not on a separate line */
if (s && *s != '\0')
{
- fz_warn(doc->ctx, "broken xref section. proceeding anyway.");
- fz_seek(doc->file, -(2 + (int)strlen(s)), SEEK_CUR);
+ fz_warn(ctx, "broken xref section. proceeding anyway.");
+ fz_seek(ctx, file, -(2 + (int)strlen(s)), SEEK_CUR);
}
if (ofs < 0)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "out of range object num in xref: %d", ofs);
+ fz_throw(ctx, FZ_ERROR_GENERIC, "out of range object num in xref: %d", ofs);
/* broken pdfs where size in trailer undershoots entries in xref sections */
if (ofs + len > xref_len)
{
- fz_warn(doc->ctx, "broken xref section, proceeding anyway.");
+ fz_warn(ctx, "broken xref section, proceeding anyway.");
}
- table = pdf_xref_find_subsection(doc, ofs, len);
+ table = pdf_xref_find_subsection(ctx, doc, ofs, len);
for (i = ofs; i < ofs + len; i++)
{
pdf_xref_entry *entry = &table[i-ofs];
- n = fz_read(doc->file, (unsigned char *) buf->scratch, 20);
+ n = fz_read(ctx, file, (unsigned char *) buf->scratch, 20);
if (n != 20)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "unexpected EOF in xref table");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "unexpected EOF in xref table");
if (!entry->type)
{
s = buf->scratch;
@@ -729,42 +724,42 @@ pdf_read_old_xref(pdf_document *doc, pdf_lexbuf *buf)
entry->gen = atoi(s + 11);
entry->type = s[17];
if (s[17] != 'f' && s[17] != 'n' && s[17] != 'o')
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "unexpected xref type: %#x (%d %d R)", s[17], i, entry->gen);
+ fz_throw(ctx, FZ_ERROR_GENERIC, "unexpected xref type: %#x (%d %d R)", s[17], i, entry->gen);
}
}
}
- fz_try(doc->ctx)
+ fz_try(ctx)
{
- tok = pdf_lex(doc->file, buf);
+ tok = pdf_lex(ctx, file, buf);
if (tok != PDF_TOK_TRAILER)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "expected trailer marker");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "expected trailer marker");
- tok = pdf_lex(doc->file, buf);
+ tok = pdf_lex(ctx, file, buf);
if (tok != PDF_TOK_OPEN_DICT)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "expected trailer dictionary");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "expected trailer dictionary");
- trailer = pdf_parse_dict(doc, doc->file, buf);
+ trailer = pdf_parse_dict(ctx, doc, file, buf);
}
- fz_catch(doc->ctx)
+ fz_catch(ctx)
{
- fz_rethrow_message(doc->ctx, "cannot parse trailer");
+ fz_rethrow_message(ctx, "cannot parse trailer");
}
return trailer;
}
static void
-pdf_read_new_xref_section(pdf_document *doc, fz_stream *stm, int i0, int i1, int w0, int w1, int w2)
+pdf_read_new_xref_section(fz_context *ctx, pdf_document *doc, fz_stream *stm, int i0, int i1, int w0, int w1, int w2)
{
- int i, n;
pdf_xref_entry *table;
+ int i, n;
if (i0 < 0 || i1 < 0)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "negative xref stream entry index");
- //if (i0 + i1 > pdf_xref_len(doc))
- // fz_throw(doc->ctx, FZ_ERROR_GENERIC, "xref stream has too many entries");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "negative xref stream entry index");
+ //if (i0 + i1 > pdf_xref_len(ctx, doc))
+ // fz_throw(ctx, FZ_ERROR_GENERIC, "xref stream has too many entries");
- table = pdf_xref_find_subsection(doc, i0, i1);
+ table = pdf_xref_find_subsection(ctx, doc, i0, i1);
for (i = i0; i < i0 + i1; i++)
{
pdf_xref_entry *entry = &table[i-i0];
@@ -772,15 +767,15 @@ pdf_read_new_xref_section(pdf_document *doc, fz_stream *stm, int i0, int i1, int
int b = 0;
int c = 0;
- if (fz_is_eof(stm))
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "truncated xref stream");
+ if (fz_is_eof(ctx, stm))
+ fz_throw(ctx, FZ_ERROR_GENERIC, "truncated xref stream");
for (n = 0; n < w0; n++)
- a = (a << 8) + fz_read_byte(stm);
+ a = (a << 8) + fz_read_byte(ctx, stm);
for (n = 0; n < w1; n++)
- b = (b << 8) + fz_read_byte(stm);
+ b = (b << 8) + fz_read_byte(ctx, stm);
for (n = 0; n < w2; n++)
- c = (c << 8) + fz_read_byte(stm);
+ c = (c << 8) + fz_read_byte(ctx, stm);
if (!entry->type)
{
@@ -796,7 +791,7 @@ pdf_read_new_xref_section(pdf_document *doc, fz_stream *stm, int i0, int i1, int
/* Entered with file locked, remains locked throughout. */
static pdf_obj *
-pdf_read_new_xref(pdf_document *doc, pdf_lexbuf *buf)
+pdf_read_new_xref(fz_context *ctx, pdf_document *doc, pdf_lexbuf *buf)
{
fz_stream *stm = NULL;
pdf_obj *trailer = NULL;
@@ -805,19 +800,18 @@ pdf_read_new_xref(pdf_document *doc, pdf_lexbuf *buf)
int num, gen, ofs, stm_ofs;
int size, w0, w1, w2;
int t;
- fz_context *ctx = doc->ctx;
fz_var(trailer);
fz_var(stm);
fz_try(ctx)
{
- ofs = fz_tell(doc->file);
- trailer = pdf_parse_ind_obj(doc, doc->file, buf, &num, &gen, &stm_ofs, NULL);
+ ofs = fz_tell(ctx, doc->file);
+ trailer = pdf_parse_ind_obj(ctx, doc, doc->file, buf, &num, &gen, &stm_ofs, NULL);
}
fz_catch(ctx)
{
- pdf_drop_obj(trailer);
+ pdf_drop_obj(ctx, trailer);
fz_rethrow_message(ctx, "cannot parse compressed xref stream object");
}
@@ -825,18 +819,18 @@ pdf_read_new_xref(pdf_document *doc, pdf_lexbuf *buf)
{
pdf_xref_entry *entry;
- obj = pdf_dict_gets(trailer, "Size");
+ obj = pdf_dict_gets(ctx, trailer, "Size");
if (!obj)
fz_throw(ctx, FZ_ERROR_GENERIC, "xref stream missing Size entry (%d %d R)", num, gen);
- size = pdf_to_int(obj);
+ size = pdf_to_int(ctx, obj);
- obj = pdf_dict_gets(trailer, "W");
+ obj = pdf_dict_gets(ctx, trailer, "W");
if (!obj)
fz_throw(ctx, FZ_ERROR_GENERIC, "xref stream missing W entry (%d %d R)", num, gen);
- w0 = pdf_to_int(pdf_array_get(obj, 0));
- w1 = pdf_to_int(pdf_array_get(obj, 1));
- w2 = pdf_to_int(pdf_array_get(obj, 2));
+ w0 = pdf_to_int(ctx, pdf_array_get(ctx, obj, 0));
+ w1 = pdf_to_int(ctx, pdf_array_get(ctx, obj, 1));
+ w2 = pdf_to_int(ctx, pdf_array_get(ctx, obj, 2));
if (w0 < 0)
fz_warn(ctx, "xref stream objects have corrupt type");
@@ -849,39 +843,39 @@ pdf_read_new_xref(pdf_document *doc, pdf_lexbuf *buf)
w1 = w1 < 0 ? 0 : w1;
w2 = w2 < 0 ? 0 : w2;
- index = pdf_dict_gets(trailer, "Index");
+ index = pdf_dict_gets(ctx, trailer, "Index");
- stm = pdf_open_stream_with_offset(doc, num, gen, trailer, stm_ofs);
+ stm = pdf_open_stream_with_offset(ctx, doc, num, gen, trailer, stm_ofs);
if (!index)
{
- pdf_read_new_xref_section(doc, stm, 0, size, w0, w1, w2);
+ pdf_read_new_xref_section(ctx, doc, stm, 0, size, w0, w1, w2);
}
else
{
- int n = pdf_array_len(index);
+ int n = pdf_array_len(ctx, index);
for (t = 0; t < n; t += 2)
{
- int i0 = pdf_to_int(pdf_array_get(index, t + 0));
- int i1 = pdf_to_int(pdf_array_get(index, t + 1));
- pdf_read_new_xref_section(doc, stm, i0, i1, w0, w1, w2);
+ int i0 = pdf_to_int(ctx, pdf_array_get(ctx, index, t + 0));
+ int i1 = pdf_to_int(ctx, pdf_array_get(ctx, index, t + 1));
+ pdf_read_new_xref_section(ctx, doc, stm, i0, i1, w0, w1, w2);
}
}
- entry = pdf_get_populating_xref_entry(doc, num);
+ entry = pdf_get_populating_xref_entry(ctx, doc, num);
entry->ofs = ofs;
entry->gen = gen;
entry->stm_ofs = stm_ofs;
- pdf_drop_obj(entry->obj);
- entry->obj = pdf_keep_obj(trailer);
+ pdf_drop_obj(ctx, entry->obj);
+ entry->obj = pdf_keep_obj(ctx, trailer);
entry->type = 'n';
}
fz_always(ctx)
{
- fz_drop_stream(stm);
+ fz_drop_stream(ctx, stm);
}
fz_catch(ctx)
{
- pdf_drop_obj(trailer);
+ pdf_drop_obj(ctx, trailer);
fz_rethrow(ctx);
}
@@ -889,24 +883,23 @@ pdf_read_new_xref(pdf_document *doc, pdf_lexbuf *buf)
}
static pdf_obj *
-pdf_read_xref(pdf_document *doc, int ofs, pdf_lexbuf *buf)
+pdf_read_xref(fz_context *ctx, pdf_document *doc, int ofs, pdf_lexbuf *buf)
{
- int c;
- fz_context *ctx = doc->ctx;
pdf_obj *trailer;
+ int c;
- fz_seek(doc->file, ofs, SEEK_SET);
+ fz_seek(ctx, doc->file, ofs, SEEK_SET);
- while (iswhite(fz_peek_byte(doc->file)))
- fz_read_byte(doc->file);
+ while (iswhite(fz_peek_byte(ctx, doc->file)))
+ fz_read_byte(ctx, doc->file);
fz_try(ctx)
{
- c = fz_peek_byte(doc->file);
+ c = fz_peek_byte(ctx, doc->file);
if (c == 'x')
- trailer = pdf_read_old_xref(doc, buf);
+ trailer = pdf_read_old_xref(ctx, doc, buf);
else if (c >= '0' && c <= '9')
- trailer = pdf_read_new_xref(doc, buf);
+ trailer = pdf_read_new_xref(ctx, doc, buf);
else
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot recognize xref format");
}
@@ -927,10 +920,9 @@ struct ofs_list_s
};
static int
-read_xref_section(pdf_document *doc, int ofs, pdf_lexbuf *buf, ofs_list *offsets)
+read_xref_section(fz_context *ctx, pdf_document *doc, int ofs, pdf_lexbuf *buf, ofs_list *offsets)
{
pdf_obj *trailer = NULL;
- fz_context *ctx = doc->ctx;
int xrefstmofs = 0;
int prevofs = 0;
@@ -957,13 +949,13 @@ read_xref_section(pdf_document *doc, int ofs, pdf_lexbuf *buf, ofs_list *offsets
}
offsets->list[offsets->len++] = ofs;
- trailer = pdf_read_xref(doc, ofs, buf);
+ trailer = pdf_read_xref(ctx, doc, ofs, buf);
- pdf_set_populating_xref_trailer(doc, trailer);
+ pdf_set_populating_xref_trailer(ctx, doc, trailer);
/* FIXME: do we overwrite free entries properly? */
/* FIXME: Does this work properly with progression? */
- xrefstmofs = pdf_to_int(pdf_dict_gets(trailer, "XRefStm"));
+ xrefstmofs = pdf_to_int(ctx, pdf_dict_gets(ctx, trailer, "XRefStm"));
if (xrefstmofs)
{
if (xrefstmofs < 0)
@@ -974,16 +966,16 @@ read_xref_section(pdf_document *doc, int ofs, pdf_lexbuf *buf, ofs_list *offsets
follow any Prev tag therein, as specified on Page 108 of the PDF reference
1.7
*/
- pdf_drop_obj(pdf_read_xref(doc, xrefstmofs, buf));
+ pdf_drop_obj(ctx, pdf_read_xref(ctx, doc, xrefstmofs, buf));
}
- prevofs = pdf_to_int(pdf_dict_gets(trailer, "Prev"));
+ prevofs = pdf_to_int(ctx, pdf_dict_gets(ctx, trailer, "Prev"));
if (prevofs < 0)
fz_throw(ctx, FZ_ERROR_GENERIC, "negative xref stream offset for previous xref stream");
}
fz_always(ctx)
{
- pdf_drop_obj(trailer);
+ pdf_drop_obj(ctx, trailer);
}
fz_catch(ctx)
{
@@ -994,9 +986,8 @@ read_xref_section(pdf_document *doc, int ofs, pdf_lexbuf *buf, ofs_list *offsets
}
static void
-pdf_read_xref_sections(pdf_document *doc, int ofs, pdf_lexbuf *buf, int read_previous)
+pdf_read_xref_sections(fz_context *ctx, pdf_document *doc, int ofs, pdf_lexbuf *buf, int read_previous)
{
- fz_context *ctx = doc->ctx;
ofs_list list;
list.len = 0;
@@ -1006,8 +997,8 @@ pdf_read_xref_sections(pdf_document *doc, int ofs, pdf_lexbuf *buf, int read_pre
{
while(ofs)
{
- pdf_populate_next_xref_level(doc);
- ofs = read_xref_section(doc, ofs, buf, &list);
+ pdf_populate_next_xref_level(ctx, doc);
+ ofs = read_xref_section(ctx, doc, ofs, buf, &list);
if (!read_previous)
break;
}
@@ -1023,7 +1014,7 @@ pdf_read_xref_sections(pdf_document *doc, int ofs, pdf_lexbuf *buf, int read_pre
}
static void
-pdf_prime_xref_index(pdf_document *doc)
+pdf_prime_xref_index(fz_context *ctx, pdf_document *doc)
{
int i, j;
int *idx = doc->xref_index;
@@ -1055,23 +1046,22 @@ pdf_prime_xref_index(pdf_document *doc)
*/
static void
-pdf_load_xref(pdf_document *doc, pdf_lexbuf *buf)
+pdf_load_xref(fz_context *ctx, pdf_document *doc, pdf_lexbuf *buf)
{
int i;
int xref_len;
pdf_xref_entry *entry;
- fz_context *ctx = doc->ctx;
- pdf_read_start_xref(doc);
+ pdf_read_start_xref(ctx, doc);
- pdf_read_xref_sections(doc, doc->startxref, buf, 1);
+ pdf_read_xref_sections(ctx, doc, doc->startxref, buf, 1);
- if (pdf_xref_len(doc) == 0)
+ if (pdf_xref_len(ctx, doc) == 0)
fz_throw(ctx, FZ_ERROR_GENERIC, "found xref was empty");
- pdf_prime_xref_index(doc);
+ pdf_prime_xref_index(ctx, doc);
- entry = pdf_get_xref_entry(doc, 0);
+ entry = pdf_get_xref_entry(ctx, doc, 0);
/* broken pdfs where first object is missing */
if (!entry->type)
{
@@ -1083,10 +1073,10 @@ pdf_load_xref(pdf_document *doc, pdf_lexbuf *buf)
fz_throw(ctx, FZ_ERROR_GENERIC, "first object in xref is not free");
/* broken pdfs where object offsets are out of range */
- xref_len = pdf_xref_len(doc);
+ xref_len = pdf_xref_len(ctx, doc);
for (i = 0; i < xref_len; i++)
{
- pdf_xref_entry *entry = pdf_get_xref_entry(doc, i);
+ pdf_xref_entry *entry = pdf_get_xref_entry(ctx, doc, i);
if (entry->type == 'n')
{
/* Special case code: "0000000000 * n" means free,
@@ -1097,19 +1087,18 @@ pdf_load_xref(pdf_document *doc, pdf_lexbuf *buf)
fz_throw(ctx, FZ_ERROR_GENERIC, "object offset out of range: %d (%d 0 R)", entry->ofs, i);
}
if (entry->type == 'o')
- if (entry->ofs <= 0 || entry->ofs >= xref_len || pdf_get_xref_entry(doc, entry->ofs)->type != 'n')
+ if (entry->ofs <= 0 || entry->ofs >= xref_len || pdf_get_xref_entry(ctx, doc, entry->ofs)->type != 'n')
fz_throw(ctx, FZ_ERROR_GENERIC, "invalid reference to an objstm that does not exist: %d (%d 0 R)", entry->ofs, i);
}
}
static void
-pdf_load_linear(pdf_document *doc)
+pdf_load_linear(fz_context *ctx, pdf_document *doc)
{
pdf_obj *dict = NULL;
pdf_obj *hint = NULL;
pdf_obj *o;
int num, gen, stmofs, lin, len;
- fz_context *ctx = doc->ctx;
fz_var(dict);
fz_var(hint);
@@ -1118,39 +1107,39 @@ pdf_load_linear(pdf_document *doc)
{
pdf_xref_entry *entry;
- dict = pdf_parse_ind_obj(doc, doc->file, &doc->lexbuf.base, &num, &gen, &stmofs, NULL);
- if (!pdf_is_dict(dict))
+ dict = pdf_parse_ind_obj(ctx, doc, doc->file, &doc->lexbuf.base, &num, &gen, &stmofs, NULL);
+ if (!pdf_is_dict(ctx, dict))
fz_throw(ctx, FZ_ERROR_GENERIC, "Failed to read linearized dictionary");
- o = pdf_dict_gets(dict, "Linearized");
+ o = pdf_dict_gets(ctx, dict, "Linearized");
if (o == NULL)
fz_throw(ctx, FZ_ERROR_GENERIC, "Failed to read linearized dictionary");
- lin = pdf_to_int(o);
+ lin = pdf_to_int(ctx, o);
if (lin != 1)
fz_throw(ctx, FZ_ERROR_GENERIC, "Unexpected version of Linearized tag (%d)", lin);
- len = pdf_to_int(pdf_dict_gets(dict, "L"));
+ len = pdf_to_int(ctx, pdf_dict_gets(ctx, dict, "L"));
if (len != doc->file_length)
fz_throw(ctx, FZ_ERROR_GENERIC, "File has been updated since linearization");
- pdf_read_xref_sections(doc, fz_tell(doc->file), &doc->lexbuf.base, 0);
+ pdf_read_xref_sections(ctx, doc, fz_tell(ctx, doc->file), &doc->lexbuf.base, 0);
- doc->page_count = pdf_to_int(pdf_dict_gets(dict, "N"));
+ doc->page_count = pdf_to_int(ctx, pdf_dict_gets(ctx, dict, "N"));
doc->linear_page_refs = fz_resize_array(ctx, doc->linear_page_refs, doc->page_count, sizeof(pdf_obj *));
memset(doc->linear_page_refs, 0, doc->page_count * sizeof(pdf_obj*));
doc->linear_obj = dict;
- doc->linear_pos = fz_tell(doc->file);
- doc->linear_page1_obj_num = pdf_to_int(pdf_dict_gets(dict, "O"));
- doc->linear_page_refs[0] = pdf_new_indirect(doc, doc->linear_page1_obj_num, 0);
+ doc->linear_pos = fz_tell(ctx, doc->file);
+ doc->linear_page1_obj_num = pdf_to_int(ctx, pdf_dict_gets(ctx, dict, "O"));
+ doc->linear_page_refs[0] = pdf_new_indirect(ctx, doc, doc->linear_page1_obj_num, 0);
doc->linear_page_num = 0;
- hint = pdf_dict_gets(dict, "H");
- doc->hint_object_offset = pdf_to_int(pdf_array_get(hint, 0));
- doc->hint_object_length = pdf_to_int(pdf_array_get(hint, 1));
+ hint = pdf_dict_gets(ctx, dict, "H");
+ doc->hint_object_offset = pdf_to_int(ctx, pdf_array_get(ctx, hint, 0));
+ doc->hint_object_length = pdf_to_int(ctx, pdf_array_get(ctx, hint, 1));
- entry = pdf_get_populating_xref_entry(doc, 0);
+ entry = pdf_get_populating_xref_entry(ctx, doc, 0);
entry->type = 'f';
}
fz_catch(ctx)
{
- pdf_drop_obj(dict);
+ pdf_drop_obj(ctx, dict);
fz_rethrow_if(ctx, FZ_ERROR_TRYLATER);
/* Drop back to non linearized reading mode */
doc->file_reading_linearly = 0;
@@ -1158,41 +1147,41 @@ pdf_load_linear(pdf_document *doc)
}
void
-pdf_ocg_set_config(pdf_document *doc, int config)
+pdf_ocg_set_config(fz_context *ctx, pdf_document *doc, int config)
{
int i, j, len, len2;
pdf_ocg_descriptor *desc = doc->ocg;
pdf_obj *obj, *cobj;
char *name;
- obj = pdf_dict_gets(pdf_dict_gets(pdf_trailer(doc), "Root"), "OCProperties");
+ obj = pdf_dict_gets(ctx, pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Root"), "OCProperties");
if (!obj)
{
if (config == 0)
return;
else
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "Unknown OCG config (None known!)");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "Unknown OCG config (None known!)");
}
if (config == 0)
{
- cobj = pdf_dict_gets(obj, "D");
+ cobj = pdf_dict_gets(ctx, obj, "D");
if (!cobj)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "No default OCG config");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "No default OCG config");
}
else
{
- cobj = pdf_array_get(pdf_dict_gets(obj, "Configs"), config);
+ cobj = pdf_array_get(ctx, pdf_dict_gets(ctx, obj, "Configs"), config);
if (!cobj)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "Illegal OCG config");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "Illegal OCG config");
}
- pdf_drop_obj(desc->intent);
- desc->intent = pdf_dict_gets(cobj, "Intent");
+ pdf_drop_obj(ctx, desc->intent);
+ desc->intent = pdf_dict_gets(ctx, cobj, "Intent");
if (desc->intent)
- pdf_keep_obj(desc->intent);
+ pdf_keep_obj(ctx, desc->intent);
len = desc->len;
- name = pdf_to_name(pdf_dict_gets(cobj, "BaseState"));
+ name = pdf_to_name(ctx, pdf_dict_gets(ctx, cobj, "BaseState"));
if (strcmp(name, "Unchanged") == 0)
{
/* Do nothing */
@@ -1212,13 +1201,13 @@ pdf_ocg_set_config(pdf_document *doc, int config)
}
}
- obj = pdf_dict_gets(cobj, "ON");
- len2 = pdf_array_len(obj);
+ obj = pdf_dict_gets(ctx, cobj, "ON");
+ len2 = pdf_array_len(ctx, obj);
for (i = 0; i < len2; i++)
{
- pdf_obj *o = pdf_array_get(obj, i);
- int n = pdf_to_num(o);
- int g = pdf_to_gen(o);
+ pdf_obj *o = pdf_array_get(ctx, obj, i);
+ int n = pdf_to_num(ctx, o);
+ int g = pdf_to_gen(ctx, o);
for (j=0; j < len; j++)
{
if (desc->ocgs[j].num == n && desc->ocgs[j].gen == g)
@@ -1229,13 +1218,13 @@ pdf_ocg_set_config(pdf_document *doc, int config)
}
}
- obj = pdf_dict_gets(cobj, "OFF");
- len2 = pdf_array_len(obj);
+ obj = pdf_dict_gets(ctx, cobj, "OFF");
+ len2 = pdf_array_len(ctx, obj);
for (i = 0; i < len2; i++)
{
- pdf_obj *o = pdf_array_get(obj, i);
- int n = pdf_to_num(o);
- int g = pdf_to_gen(o);
+ pdf_obj *o = pdf_array_get(ctx, obj, i);
+ int n = pdf_to_num(ctx, o);
+ int g = pdf_to_gen(ctx, o);
for (j=0; j < len; j++)
{
if (desc->ocgs[j].num == n && desc->ocgs[j].gen == g)
@@ -1262,23 +1251,22 @@ pdf_ocg_set_config(pdf_document *doc, int config)
}
static void
-pdf_read_ocg(pdf_document *doc)
+pdf_read_ocg(fz_context *ctx, pdf_document *doc)
{
pdf_obj *obj, *ocg;
int len, i;
pdf_ocg_descriptor *desc;
- fz_context *ctx = doc->ctx;
fz_var(desc);
- obj = pdf_dict_gets(pdf_dict_gets(pdf_trailer(doc), "Root"), "OCProperties");
+ obj = pdf_dict_gets(ctx, pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Root"), "OCProperties");
if (!obj)
return;
- ocg = pdf_dict_gets(obj, "OCGs");
- if (!ocg || !pdf_is_array(ocg))
+ ocg = pdf_dict_gets(ctx, obj, "OCGs");
+ if (!ocg || !pdf_is_array(ctx, ocg))
/* Not ever supposed to happen, but live with it. */
return;
- len = pdf_array_len(ocg);
+ len = pdf_array_len(ctx, ocg);
fz_try(ctx)
{
desc = fz_calloc(ctx, 1, sizeof(*desc));
@@ -1287,9 +1275,9 @@ pdf_read_ocg(pdf_document *doc)
desc->intent = NULL;
for (i=0; i < len; i++)
{
- pdf_obj *o = pdf_array_get(ocg, i);
- desc->ocgs[i].num = pdf_to_num(o);
- desc->ocgs[i].gen = pdf_to_gen(o);
+ pdf_obj *o = pdf_array_get(ctx, ocg, i);
+ desc->ocgs[i].num = pdf_to_num(ctx, o);
+ desc->ocgs[i].gen = pdf_to_gen(ctx, o);
desc->ocgs[i].state = 1;
}
doc->ocg = desc;
@@ -1302,7 +1290,7 @@ pdf_read_ocg(pdf_document *doc)
fz_rethrow(ctx);
}
- pdf_ocg_set_config(doc, 0);
+ pdf_ocg_set_config(ctx, doc, 0);
}
static void
@@ -1311,7 +1299,7 @@ pdf_drop_ocg(fz_context *ctx, pdf_ocg_descriptor *desc)
if (!desc)
return;
- pdf_drop_obj(desc->intent);
+ pdf_drop_obj(ctx, desc->intent);
fz_free(ctx, desc->ocgs);
fz_free(ctx, desc);
}
@@ -1322,9 +1310,8 @@ pdf_drop_ocg(fz_context *ctx, pdf_ocg_descriptor *desc)
*/
static void
-pdf_init_document(pdf_document *doc)
+pdf_init_document(fz_context *ctx, pdf_document *doc)
{
- fz_context *ctx = doc->ctx;
pdf_obj *encrypt, *id;
pdf_obj *dict = NULL;
pdf_obj *obj;
@@ -1336,30 +1323,30 @@ pdf_init_document(pdf_document *doc)
fz_try(ctx)
{
- pdf_load_version(doc);
+ pdf_load_version(ctx, doc);
- doc->file_length = fz_stream_meta(doc->file, FZ_STREAM_META_LENGTH, 0, NULL);
+ doc->file_length = fz_stream_meta(ctx, doc->file, FZ_STREAM_META_LENGTH, 0, NULL);
if (doc->file_length < 0)
doc->file_length = 0;
/* Check to see if we should work in progressive mode */
- if (fz_stream_meta(doc->file, FZ_STREAM_META_PROGRESSIVE, 0, NULL) > 0)
+ if (fz_stream_meta(ctx, doc->file, FZ_STREAM_META_PROGRESSIVE, 0, NULL) > 0)
doc->file_reading_linearly = 1;
/* Try to load the linearized file if we are in progressive
* mode. */
if (doc->file_reading_linearly)
- pdf_load_linear(doc);
+ pdf_load_linear(ctx, doc);
/* If we aren't in progressive mode (or the linear load failed
* and has set us back to non-progressive mode), load normally.
*/
if (!doc->file_reading_linearly)
- pdf_load_xref(doc, &doc->lexbuf.base);
+ pdf_load_xref(ctx, doc, &doc->lexbuf.base);
}
fz_catch(ctx)
{
- pdf_drop_xref_sections(doc);
+ pdf_drop_xref_sections(ctx, doc);
fz_rethrow_if(ctx, FZ_ERROR_TRYLATER);
fz_warn(ctx, "trying to repair broken xref");
repaired = 1;
@@ -1373,35 +1360,35 @@ pdf_init_document(pdf_document *doc)
{
/* pdf_repair_xref may access xref_index, so reset it properly */
memset(doc->xref_index, 0, sizeof(int) * doc->max_xref_len);
- pdf_repair_xref(doc);
- pdf_prime_xref_index(doc);
+ pdf_repair_xref(ctx, doc);
+ pdf_prime_xref_index(ctx, doc);
}
- encrypt = pdf_dict_gets(pdf_trailer(doc), "Encrypt");
- id = pdf_dict_gets(pdf_trailer(doc), "ID");
- if (pdf_is_dict(encrypt))
+ encrypt = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Encrypt");
+ id = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "ID");
+ if (pdf_is_dict(ctx, encrypt))
doc->crypt = pdf_new_crypt(ctx, encrypt, id);
/* Allow lazy clients to read encrypted files with a blank password */
- pdf_authenticate_password(doc, "");
+ pdf_authenticate_password(ctx, doc, "");
if (repaired)
{
- int xref_len = pdf_xref_len(doc);
- pdf_repair_obj_stms(doc);
+ int xref_len = pdf_xref_len(ctx, doc);
+ pdf_repair_obj_stms(ctx, doc);
- hasroot = (pdf_dict_gets(pdf_trailer(doc), "Root") != NULL);
- hasinfo = (pdf_dict_gets(pdf_trailer(doc), "Info") != NULL);
+ hasroot = (pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Root") != NULL);
+ hasinfo = (pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Info") != NULL);
for (i = 1; i < xref_len; i++)
{
- pdf_xref_entry *entry = pdf_get_xref_entry(doc, i);
+ pdf_xref_entry *entry = pdf_get_xref_entry(ctx, doc, i);
if (entry->type == 0 || entry->type == 'f')
continue;
fz_try(ctx)
{
- dict = pdf_load_object(doc, i, 0);
+ dict = pdf_load_object(ctx, doc, i, 0);
}
fz_catch(ctx)
{
@@ -1412,46 +1399,46 @@ pdf_init_document(pdf_document *doc)
if (!hasroot)
{
- obj = pdf_dict_gets(dict, "Type");
- if (pdf_is_name(obj) && !strcmp(pdf_to_name(obj), "Catalog"))
+ obj = pdf_dict_gets(ctx, dict, "Type");
+ if (pdf_is_name(ctx, obj) && !strcmp(pdf_to_name(ctx, obj), "Catalog"))
{
- nobj = pdf_new_indirect(doc, i, 0);
- pdf_dict_puts(pdf_trailer(doc), "Root", nobj);
- pdf_drop_obj(nobj);
+ nobj = pdf_new_indirect(ctx, doc, i, 0);
+ pdf_dict_puts(ctx, pdf_trailer(ctx, doc), "Root", nobj);
+ pdf_drop_obj(ctx, nobj);
nobj = NULL;
}
}
if (!hasinfo)
{
- if (pdf_dict_gets(dict, "Creator") || pdf_dict_gets(dict, "Producer"))
+ if (pdf_dict_gets(ctx, dict, "Creator") || pdf_dict_gets(ctx, dict, "Producer"))
{
- nobj = pdf_new_indirect(doc, i, 0);
- pdf_dict_puts(pdf_trailer(doc), "Info", nobj);
- pdf_drop_obj(nobj);
+ nobj = pdf_new_indirect(ctx, doc, i, 0);
+ pdf_dict_puts(ctx, pdf_trailer(ctx, doc), "Info", nobj);
+ pdf_drop_obj(ctx, nobj);
nobj = NULL;
}
}
- pdf_drop_obj(dict);
+ pdf_drop_obj(ctx, dict);
dict = NULL;
}
/* ensure that strings are not used in their repaired, non-decrypted form */
if (doc->crypt)
- pdf_clear_xref(doc);
+ pdf_clear_xref(ctx, doc);
}
}
fz_catch(ctx)
{
- pdf_drop_obj(dict);
- pdf_drop_obj(nobj);
+ pdf_drop_obj(ctx, dict);
+ pdf_drop_obj(ctx, nobj);
fz_rethrow_message(ctx, "cannot open document");
}
fz_try(ctx)
{
- pdf_read_ocg(doc);
+ pdf_read_ocg(ctx, doc);
}
fz_catch(ctx)
{
@@ -1461,8 +1448,8 @@ pdf_init_document(pdf_document *doc)
fz_try(ctx)
{
char *version_str;
- obj = pdf_dict_getp(pdf_trailer(doc), "Root/Version");
- version_str = pdf_to_name(obj);
+ obj = pdf_dict_getp(ctx, pdf_trailer(ctx, doc), "Root/Version");
+ version_str = pdf_to_name(ctx, obj);
if (*version_str)
{
int version = 10 * (fz_atof(version_str) + 0.05);
@@ -1474,15 +1461,13 @@ pdf_init_document(pdf_document *doc)
}
void
-pdf_close_document(pdf_document *doc)
+pdf_close_document(fz_context *ctx, pdf_document *doc)
{
- fz_context *ctx;
pdf_unsaved_sig *usig;
int i;
if (!doc)
return;
- ctx = doc->ctx;
/* Type3 glyphs in the glyph cache can contain pdf_obj pointers
* that we are about to destroy. Simplest solution is to bin the
@@ -1492,22 +1477,22 @@ pdf_close_document(pdf_document *doc)
if (doc->js)
doc->drop_js(doc->js);
- pdf_drop_xref_sections(doc);
+ pdf_drop_xref_sections(ctx, doc);
fz_free(ctx, doc->xref_index);
if (doc->focus_obj)
- pdf_drop_obj(doc->focus_obj);
+ pdf_drop_obj(ctx, doc->focus_obj);
if (doc->file)
- fz_drop_stream(doc->file);
+ fz_drop_stream(ctx, doc->file);
if (doc->crypt)
pdf_drop_crypt(ctx, doc->crypt);
- pdf_drop_obj(doc->linear_obj);
+ pdf_drop_obj(ctx, doc->linear_obj);
if (doc->linear_page_refs)
{
for (i=0; i < doc->page_count; i++)
{
- pdf_drop_obj(doc->linear_page_refs[i]);
+ pdf_drop_obj(ctx, doc->linear_page_refs[i]);
}
fz_free(ctx, doc->linear_page_refs);
}
@@ -1519,8 +1504,8 @@ pdf_close_document(pdf_document *doc)
while ((usig = doc->unsaved_sigs) != NULL)
{
doc->unsaved_sigs = usig->next;
- pdf_drop_obj(usig->field);
- pdf_drop_signer(usig->signer);
+ pdf_drop_obj(ctx, usig->field);
+ pdf_drop_signer(ctx, usig->signer);
fz_free(ctx, usig);
}
@@ -1535,20 +1520,20 @@ pdf_close_document(pdf_document *doc)
fz_empty_store(ctx);
- pdf_lexbuf_fin(&doc->lexbuf.base);
+ pdf_lexbuf_fin(ctx, &doc->lexbuf.base);
fz_free(ctx, doc);
}
void
-pdf_print_xref(pdf_document *doc)
+pdf_print_xref(fz_context *ctx, pdf_document *doc)
{
int i;
- int xref_len = pdf_xref_len(doc);
+ int xref_len = pdf_xref_len(ctx, doc);
printf("xref\n0 %d\n", xref_len);
for (i = 0; i < xref_len; i++)
{
- pdf_xref_entry *entry = pdf_get_xref_entry(doc, i);
+ pdf_xref_entry *entry = pdf_get_xref_entry(ctx, doc, i);
printf("%05d: %010d %05d %c (stm_ofs=%d; stm_buf=%p)\n", i,
entry->ofs,
entry->gen,
@@ -1563,7 +1548,7 @@ pdf_print_xref(pdf_document *doc)
*/
static pdf_xref_entry *
-pdf_load_obj_stm(pdf_document *doc, int num, int gen, pdf_lexbuf *buf, int target)
+pdf_load_obj_stm(fz_context *ctx, pdf_document *doc, int num, int gen, pdf_lexbuf *buf, int target)
{
fz_stream *stm = NULL;
pdf_obj *objstm = NULL;
@@ -1575,7 +1560,6 @@ pdf_load_obj_stm(pdf_document *doc, int num, int gen, pdf_lexbuf *buf, int targe
int count;
int i;
pdf_token tok;
- fz_context *ctx = doc->ctx;
pdf_xref_entry *ret_entry = NULL;
fz_var(numbuf);
@@ -1585,10 +1569,10 @@ pdf_load_obj_stm(pdf_document *doc, int num, int gen, pdf_lexbuf *buf, int targe
fz_try(ctx)
{
- objstm = pdf_load_object(doc, num, gen);
+ objstm = pdf_load_object(ctx, doc, num, gen);
- count = pdf_to_int(pdf_dict_gets(objstm, "N"));
- first = pdf_to_int(pdf_dict_gets(objstm, "First"));
+ count = pdf_to_int(ctx, pdf_dict_gets(ctx, objstm, "N"));
+ first = pdf_to_int(ctx, pdf_dict_gets(ctx, objstm, "First"));
if (count < 0)
fz_throw(ctx, FZ_ERROR_GENERIC, "negative number of objects in object stream");
@@ -1598,39 +1582,39 @@ pdf_load_obj_stm(pdf_document *doc, int num, int gen, pdf_lexbuf *buf, int targe
numbuf = fz_calloc(ctx, count, sizeof(int));
ofsbuf = fz_calloc(ctx, count, sizeof(int));
- stm = pdf_open_stream(doc, num, gen);
+ stm = pdf_open_stream(ctx, doc, num, gen);
for (i = 0; i < count; i++)
{
- tok = pdf_lex(stm, buf);
+ tok = pdf_lex(ctx, stm, buf);
if (tok != PDF_TOK_INT)
fz_throw(ctx, FZ_ERROR_GENERIC, "corrupt object stream (%d %d R)", num, gen);
numbuf[i] = buf->i;
- tok = pdf_lex(stm, buf);
+ tok = pdf_lex(ctx, stm, buf);
if (tok != PDF_TOK_INT)
fz_throw(ctx, FZ_ERROR_GENERIC, "corrupt object stream (%d %d R)", num, gen);
ofsbuf[i] = buf->i;
}
- fz_seek(stm, first, SEEK_SET);
+ fz_seek(ctx, stm, first, SEEK_SET);
for (i = 0; i < count; i++)
{
- int xref_len = pdf_xref_len(doc);
+ int xref_len = pdf_xref_len(ctx, doc);
pdf_xref_entry *entry;
- fz_seek(stm, first + ofsbuf[i], SEEK_SET);
+ fz_seek(ctx, stm, first + ofsbuf[i], SEEK_SET);
- obj = pdf_parse_stm_obj(doc, stm, buf);
+ obj = pdf_parse_stm_obj(ctx, doc, stm, buf);
if (numbuf[i] <= 0 || numbuf[i] >= xref_len)
{
- pdf_drop_obj(obj);
+ pdf_drop_obj(ctx, obj);
fz_throw(ctx, FZ_ERROR_GENERIC, "object id (%d 0 R) out of range (0..%d)", numbuf[i], xref_len - 1);
}
- entry = pdf_get_xref_entry(doc, numbuf[i]);
+ entry = pdf_get_xref_entry(ctx, doc, numbuf[i]);
- pdf_set_obj_parent(obj, numbuf[i]);
+ pdf_set_obj_parent(ctx, obj, numbuf[i]);
if (entry->type == 'o' && entry->ofs == num)
{
@@ -1642,9 +1626,9 @@ pdf_load_obj_stm(pdf_document *doc, int num, int gen, pdf_lexbuf *buf, int targe
* and trust that the old one is correct. */
if (entry->obj)
{
- if (pdf_objcmp(entry->obj, obj))
+ if (pdf_objcmp(ctx, entry->obj, obj))
fz_warn(ctx, "Encountered new definition for object %d - keeping the original one", numbuf[i]);
- pdf_drop_obj(obj);
+ pdf_drop_obj(ctx, obj);
}
else
entry->obj = obj;
@@ -1653,16 +1637,16 @@ pdf_load_obj_stm(pdf_document *doc, int num, int gen, pdf_lexbuf *buf, int targe
}
else
{
- pdf_drop_obj(obj);
+ pdf_drop_obj(ctx, obj);
}
}
}
fz_always(ctx)
{
- fz_drop_stream(stm);
+ fz_drop_stream(ctx, stm);
fz_free(ctx, ofsbuf);
fz_free(ctx, numbuf);
- pdf_drop_obj(objstm);
+ pdf_drop_obj(ctx, objstm);
}
fz_catch(ctx)
{
@@ -1675,21 +1659,20 @@ pdf_load_obj_stm(pdf_document *doc, int num, int gen, pdf_lexbuf *buf, int targe
* object loading
*/
static int
-pdf_obj_read(pdf_document *doc, int *offset, int *nump, pdf_obj **page)
+pdf_obj_read(fz_context *ctx, pdf_document *doc, int *offset, int *nump, pdf_obj **page)
{
- int num, numofs, gen, genofs, stmofs, tmpofs, tok;
pdf_lexbuf *buf = &doc->lexbuf.base;
- fz_context *ctx = doc->ctx;
+ int num, numofs, gen, genofs, stmofs, tmpofs, tok;
int xref_len;
pdf_xref_entry *entry;
int newtmpofs;
numofs = *offset;
- fz_seek(doc->file, numofs, SEEK_SET);
+ fz_seek(ctx, doc->file, numofs, SEEK_SET);
/* We expect to read 'num' here */
- tok = pdf_lex(doc->file, buf);
- genofs = fz_tell(doc->file);
+ tok = pdf_lex(ctx, doc->file, buf);
+ genofs = fz_tell(ctx, doc->file);
if (tok != PDF_TOK_INT)
{
/* Failed! */
@@ -1700,8 +1683,8 @@ pdf_obj_read(pdf_document *doc, int *offset, int *nump, pdf_obj **page)
*nump = num = buf->i;
/* We expect to read 'gen' here */
- tok = pdf_lex(doc->file, buf);
- tmpofs = fz_tell(doc->file);
+ tok = pdf_lex(ctx, doc->file, buf);
+ tmpofs = fz_tell(ctx, doc->file);
if (tok != PDF_TOK_INT)
{
/* Failed! */
@@ -1714,14 +1697,14 @@ pdf_obj_read(pdf_document *doc, int *offset, int *nump, pdf_obj **page)
/* We expect to read 'obj' here */
do
{
- tmpofs = fz_tell(doc->file);
- tok = pdf_lex(doc->file, buf);
+ tmpofs = fz_tell(ctx, doc->file);
+ tok = pdf_lex(ctx, doc->file, buf);
if (tok == PDF_TOK_OBJ)
break;
if (tok != PDF_TOK_INT)
{
DEBUGMESS((ctx, "skipping unexpected data (tok=%d) at %d", tok, tmpofs));
- *offset = fz_tell(doc->file);
+ *offset = fz_tell(ctx, doc->file);
return tok == PDF_TOK_EOF;
}
DEBUGMESS((ctx, "skipping unexpected int %d at %d", num, numofs));
@@ -1733,7 +1716,7 @@ pdf_obj_read(pdf_document *doc, int *offset, int *nump, pdf_obj **page)
while (1);
/* Now we read the actual object */
- xref_len = pdf_xref_len(doc);
+ xref_len = pdf_xref_len(ctx, doc);
/* When we are reading a progressive file, we typically see:
* File Header
@@ -1751,7 +1734,7 @@ pdf_obj_read(pdf_document *doc, int *offset, int *nump, pdf_obj **page)
* whenever we read an object it should just go into the
* previous xref.
*/
- tok = pdf_repair_obj(doc, buf, &stmofs, NULL, NULL, NULL, page, &newtmpofs);
+ tok = pdf_repair_obj(ctx, doc, buf, &stmofs, NULL, NULL, NULL, page, &newtmpofs);
do /* So we can break out of it */
{
@@ -1764,7 +1747,7 @@ pdf_obj_read(pdf_document *doc, int *offset, int *nump, pdf_obj **page)
{
fz_warn(ctx, "Unexpected non zero generation number in linearized file");
}
- entry = pdf_get_populating_xref_entry(doc, num);
+ entry = pdf_get_populating_xref_entry(ctx, doc, num);
if (entry->type != 0)
{
DEBUGMESS((ctx, "Duplicate object found (%d %d obj)", num, gen));
@@ -1774,10 +1757,10 @@ pdf_obj_read(pdf_document *doc, int *offset, int *nump, pdf_obj **page)
{
DEBUGMESS((ctx, "Successfully read object %d @ %d - and found page %d!", num, numofs, doc->linear_page_num));
if (!entry->obj)
- entry->obj = pdf_keep_obj(*page);
+ entry->obj = pdf_keep_obj(ctx, *page);
if (doc->linear_page_refs[doc->linear_page_num] == NULL)
- doc->linear_page_refs[doc->linear_page_num] = pdf_new_indirect(doc, num, gen);
+ doc->linear_page_refs[doc->linear_page_num] = pdf_new_indirect(ctx, doc, num, gen);
}
else
{
@@ -1794,7 +1777,7 @@ pdf_obj_read(pdf_document *doc, int *offset, int *nump, pdf_obj **page)
if (tok == PDF_TOK_ENDOBJ)
{
- *offset = fz_tell(doc->file);
+ *offset = fz_tell(ctx, doc->file);
}
else
{
@@ -1804,9 +1787,8 @@ pdf_obj_read(pdf_document *doc, int *offset, int *nump, pdf_obj **page)
}
static void
-pdf_load_hinted_page(pdf_document *doc, int pagenum)
+pdf_load_hinted_page(fz_context *ctx, pdf_document *doc, int pagenum)
{
- fz_context *ctx = doc->ctx;
if (!doc->hints_loaded || !doc->linear_page_refs)
return;
@@ -1817,14 +1799,14 @@ pdf_load_hinted_page(pdf_document *doc, int pagenum)
fz_try(ctx)
{
int num = doc->hint_page[pagenum].number;
- pdf_obj *page = pdf_load_object(doc, num, 0);
- if (!strcmp("Page", pdf_to_name(pdf_dict_gets(page, "Type"))))
+ pdf_obj *page = pdf_load_object(ctx, doc, num, 0);
+ if (!strcmp("Page", pdf_to_name(ctx, pdf_dict_gets(ctx, page, "Type"))))
{
/* We have found the page object! */
DEBUGMESS((ctx, "LoadHintedPage pagenum=%d num=%d", pagenum, num));
- doc->linear_page_refs[pagenum] = pdf_new_indirect(doc, num, 0);
+ doc->linear_page_refs[pagenum] = pdf_new_indirect(ctx, doc, num, 0);
}
- pdf_drop_obj(page);
+ pdf_drop_obj(ctx, page);
}
fz_catch(ctx)
{
@@ -1835,12 +1817,11 @@ pdf_load_hinted_page(pdf_document *doc, int pagenum)
}
static int
-read_hinted_object(pdf_document *doc, int num)
+read_hinted_object(fz_context *ctx, pdf_document *doc, int num)
{
/* Try to find the object using our hint table. Find the closest
* object <= the one we want that has a hint and read forward from
* there. */
- fz_context *ctx = doc->ctx;
int expected = num;
int curr_pos;
int start, offset;
@@ -1852,7 +1833,7 @@ read_hinted_object(pdf_document *doc, int num)
if (expected == 0) /* No hints found, just bale */
return 0;
- curr_pos = fz_tell(doc->file);
+ curr_pos = fz_tell(ctx, doc->file);
offset = doc->hint_obj_offsets[expected];
fz_var(expected);
@@ -1866,7 +1847,7 @@ read_hinted_object(pdf_document *doc, int num)
{
start = offset;
DEBUGMESS((ctx, "Searching for object %d @ %d", expected, offset));
- pdf_obj_read(doc, &offset, &found, 0);
+ pdf_obj_read(ctx, doc, &offset, &found, 0);
DEBUGMESS((ctx, "Found object %d - next will be @ %d", found, offset));
if (found <= expected)
{
@@ -1894,7 +1875,7 @@ read_hinted_object(pdf_document *doc, int num)
}
fz_always(ctx)
{
- fz_seek(doc->file, curr_pos, SEEK_SET);
+ fz_seek(ctx, doc->file, curr_pos, SEEK_SET);
}
fz_catch(ctx)
{
@@ -1908,37 +1889,36 @@ read_hinted_object(pdf_document *doc, int num)
}
pdf_xref_entry *
-pdf_cache_object(pdf_document *doc, int num, int gen)
+pdf_cache_object(fz_context *ctx, pdf_document *doc, int num, int gen)
{
pdf_xref_entry *x;
int rnum, rgen, try_repair;
- fz_context *ctx = doc->ctx;
fz_var(try_repair);
- if (num <= 0 || num >= pdf_xref_len(doc))
- fz_throw(ctx, FZ_ERROR_GENERIC, "object out of range (%d %d R); xref size %d", num, gen, pdf_xref_len(doc));
+ if (num <= 0 || num >= pdf_xref_len(ctx, doc))
+ fz_throw(ctx, FZ_ERROR_GENERIC, "object out of range (%d %d R); xref size %d", num, gen, pdf_xref_len(ctx, doc));
object_updated:
try_repair = 0;
rnum = num;
- x = pdf_get_xref_entry(doc, num);
+ x = pdf_get_xref_entry(ctx, doc, num);
if (x->obj != NULL)
return x;
if (x->type == 'f')
{
- x->obj = pdf_new_null(doc);
+ x->obj = pdf_new_null(ctx, doc);
}
else if (x->type == 'n')
{
- fz_seek(doc->file, x->ofs, SEEK_SET);
+ fz_seek(ctx, doc->file, x->ofs, SEEK_SET);
fz_try(ctx)
{
- x->obj = pdf_parse_ind_obj(doc, doc->file, &doc->lexbuf.base,
+ x->obj = pdf_parse_ind_obj(ctx, doc, doc->file, &doc->lexbuf.base,
&rnum, &rgen, &x->stm_ofs, &try_repair);
}
fz_catch(ctx)
@@ -1949,7 +1929,7 @@ object_updated:
if (!try_repair && rnum != num)
{
- pdf_drop_obj(x->obj);
+ pdf_drop_obj(ctx, x->obj);
x->obj = NULL;
try_repair = 1;
}
@@ -1958,8 +1938,8 @@ object_updated:
{
fz_try(ctx)
{
- pdf_repair_xref(doc);
- pdf_prime_xref_index(doc);
+ pdf_repair_xref(ctx, doc);
+ pdf_prime_xref_index(ctx, doc);
}
fz_catch(ctx)
{
@@ -1980,7 +1960,7 @@ object_updated:
{
fz_try(ctx)
{
- x = pdf_load_obj_stm(doc, x->ofs, 0, &doc->lexbuf.base, num);
+ x = pdf_load_obj_stm(ctx, doc, x->ofs, 0, &doc->lexbuf.base, num);
}
fz_catch(ctx)
{
@@ -1992,7 +1972,7 @@ object_updated:
fz_throw(ctx, FZ_ERROR_GENERIC, "object (%d %d R) was not found in its object stream", num, gen);
}
}
- else if (doc->hint_obj_offsets && read_hinted_object(doc, num))
+ else if (doc->hint_obj_offsets && read_hinted_object(ctx, doc, num))
{
goto object_updated;
}
@@ -2005,19 +1985,18 @@ object_updated:
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find object in xref (%d %d R)", num, gen);
}
- pdf_set_obj_parent(x->obj, num);
+ pdf_set_obj_parent(ctx, x->obj, num);
return x;
}
pdf_obj *
-pdf_load_object(pdf_document *doc, int num, int gen)
+pdf_load_object(fz_context *ctx, pdf_document *doc, int num, int gen)
{
- fz_context *ctx = doc->ctx;
pdf_xref_entry *entry;
fz_try(ctx)
{
- entry = pdf_cache_object(doc, num, gen);
+ entry = pdf_cache_object(ctx, doc, num, gen);
}
fz_catch(ctx)
{
@@ -2026,32 +2005,32 @@ pdf_load_object(pdf_document *doc, int num, int gen)
assert(entry->obj != NULL);
- return pdf_keep_obj(entry->obj);
+ return pdf_keep_obj(ctx, entry->obj);
}
pdf_obj *
-pdf_resolve_indirect(pdf_obj *ref)
+pdf_resolve_indirect(fz_context *ctx, pdf_obj *ref)
{
int sanity = 10;
int num;
int gen;
- fz_context *ctx = NULL; /* Avoid warning for stupid compilers */
- pdf_document *doc;
pdf_xref_entry *entry;
- while (pdf_is_indirect(ref))
+ while (pdf_is_indirect(ctx, ref))
{
+ pdf_document *doc;
+
if (--sanity == 0)
{
fz_warn(ctx, "too many indirections (possible indirection cycle involving %d %d R)", num, gen);
return NULL;
}
- doc = pdf_get_indirect_document(ref);
+
+ doc = pdf_get_indirect_document(ctx, ref);
if (!doc)
return NULL;
- ctx = doc->ctx;
- num = pdf_to_num(ref);
- gen = pdf_to_gen(ref);
+ num = pdf_to_num(ctx, ref);
+ gen = pdf_to_gen(ctx, ref);
if (num <= 0 || gen < 0)
{
@@ -2061,7 +2040,7 @@ pdf_resolve_indirect(pdf_obj *ref)
fz_try(ctx)
{
- entry = pdf_cache_object(doc, num, gen);
+ entry = pdf_cache_object(ctx, doc, num, gen);
}
fz_catch(ctx)
{
@@ -2079,18 +2058,18 @@ pdf_resolve_indirect(pdf_obj *ref)
}
int
-pdf_count_objects(pdf_document *doc)
+pdf_count_objects(fz_context *ctx, pdf_document *doc)
{
- return pdf_xref_len(doc);
+ return pdf_xref_len(ctx, doc);
}
int
-pdf_create_object(pdf_document *doc)
+pdf_create_object(fz_context *ctx, pdf_document *doc)
{
/* TODO: reuse free object slots by properly linking free object chains in the ofs field */
pdf_xref_entry *entry;
- int num = pdf_xref_len(doc);
- entry = pdf_get_incremental_xref_entry(doc, num);
+ int num = pdf_xref_len(ctx, doc);
+ entry = pdf_get_incremental_xref_entry(ctx, doc, num);
entry->type = 'f';
entry->ofs = -1;
entry->gen = 0;
@@ -2101,20 +2080,20 @@ pdf_create_object(pdf_document *doc)
}
void
-pdf_delete_object(pdf_document *doc, int num)
+pdf_delete_object(fz_context *ctx, pdf_document *doc, int num)
{
pdf_xref_entry *x;
- if (num <= 0 || num >= pdf_xref_len(doc))
+ if (num <= 0 || num >= pdf_xref_len(ctx, doc))
{
- fz_warn(doc->ctx, "object out of range (%d 0 R); xref size %d", num, pdf_xref_len(doc));
+ fz_warn(ctx, "object out of range (%d 0 R); xref size %d", num, pdf_xref_len(ctx, doc));
return;
}
- x = pdf_get_incremental_xref_entry(doc, num);
+ x = pdf_get_incremental_xref_entry(ctx, doc, num);
- fz_drop_buffer(doc->ctx, x->stm_buf);
- pdf_drop_obj(x->obj);
+ fz_drop_buffer(ctx, x->stm_buf);
+ pdf_drop_obj(ctx, x->obj);
x->type = 'f';
x->ofs = 0;
@@ -2125,46 +2104,46 @@ pdf_delete_object(pdf_document *doc, int num)
}
void
-pdf_update_object(pdf_document *doc, int num, pdf_obj *newobj)
+pdf_update_object(fz_context *ctx, pdf_document *doc, int num, pdf_obj *newobj)
{
pdf_xref_entry *x;
- if (num <= 0 || num >= pdf_xref_len(doc))
+ if (num <= 0 || num >= pdf_xref_len(ctx, doc))
{
- fz_warn(doc->ctx, "object out of range (%d 0 R); xref size %d", num, pdf_xref_len(doc));
+ fz_warn(ctx, "object out of range (%d 0 R); xref size %d", num, pdf_xref_len(ctx, doc));
return;
}
- x = pdf_get_incremental_xref_entry(doc, num);
+ x = pdf_get_incremental_xref_entry(ctx, doc, num);
- pdf_drop_obj(x->obj);
+ pdf_drop_obj(ctx, x->obj);
x->type = 'n';
x->ofs = 0;
- x->obj = pdf_keep_obj(newobj);
+ x->obj = pdf_keep_obj(ctx, newobj);
- pdf_set_obj_parent(newobj, num);
+ pdf_set_obj_parent(ctx, newobj, num);
}
void
-pdf_update_stream(pdf_document *doc, int num, fz_buffer *newbuf)
+pdf_update_stream(fz_context *ctx, pdf_document *doc, int num, fz_buffer *newbuf)
{
pdf_xref_entry *x;
- if (num <= 0 || num >= pdf_xref_len(doc))
+ if (num <= 0 || num >= pdf_xref_len(ctx, doc))
{
- fz_warn(doc->ctx, "object out of range (%d 0 R); xref size %d", num, pdf_xref_len(doc));
+ fz_warn(ctx, "object out of range (%d 0 R); xref size %d", num, pdf_xref_len(ctx, doc));
return;
}
- x = pdf_get_xref_entry(doc, num);
+ x = pdf_get_xref_entry(ctx, doc, num);
- fz_drop_buffer(doc->ctx, x->stm_buf);
- x->stm_buf = fz_keep_buffer(doc->ctx, newbuf);
+ fz_drop_buffer(ctx, x->stm_buf);
+ x->stm_buf = fz_keep_buffer(ctx, newbuf);
}
int
-pdf_meta(pdf_document *doc, int key, void *ptr, int size)
+pdf_meta(fz_context *ctx, pdf_document *doc, int key, void *ptr, int size)
{
switch (key)
{
@@ -2179,10 +2158,10 @@ pdf_meta(pdf_document *doc, int key, void *ptr, int size)
case FZ_META_CRYPT_INFO:
if (doc->crypt)
sprintf((char *)ptr, "Standard V%d R%d %d-bit %s",
- pdf_crypt_version(doc),
- pdf_crypt_revision(doc),
- pdf_crypt_length(doc),
- pdf_crypt_method(doc));
+ pdf_crypt_version(ctx, doc),
+ pdf_crypt_revision(ctx, doc),
+ pdf_crypt_length(ctx, doc),
+ pdf_crypt_method(ctx, doc));
else
sprintf((char *)ptr, "None");
return FZ_META_OK;
@@ -2206,18 +2185,18 @@ pdf_meta(pdf_document *doc, int key, void *ptr, int size)
default:
return 0;
}
- return pdf_has_permission(doc, i);
+ return pdf_has_permission(ctx, doc, i);
}
case FZ_META_INFO:
{
- pdf_obj *info = pdf_dict_gets(pdf_trailer(doc), "Info");
+ pdf_obj *info = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Info");
if (!info)
{
if (ptr)
*(char *)ptr = 0;
return 0;
}
- info = pdf_dict_gets(info, *(char **)ptr);
+ info = pdf_dict_gets(ctx, info, *(char **)ptr);
if (!info)
{
if (ptr)
@@ -2226,9 +2205,9 @@ pdf_meta(pdf_document *doc, int key, void *ptr, int size)
}
if (info && ptr && size)
{
- char *utf8 = pdf_to_utf8(doc, info);
+ char *utf8 = pdf_to_utf8(ctx, doc, info);
fz_strlcpy(ptr, utf8, size);
- fz_free(doc->ctx, utf8);
+ fz_free(ctx, utf8);
}
return 1;
}
@@ -2238,7 +2217,7 @@ pdf_meta(pdf_document *doc, int key, void *ptr, int size)
}
fz_transition *
-pdf_page_presentation(pdf_document *doc, pdf_page *page, float *duration)
+pdf_page_presentation(fz_context *ctx, pdf_page *page, float *duration)
{
*duration = page->duration;
if (!page->transition_present)
@@ -2246,13 +2225,6 @@ pdf_page_presentation(pdf_document *doc, pdf_page *page, float *duration)
return &page->transition;
}
-static void
-pdf_rebind(pdf_document *doc, fz_context *ctx)
-{
- doc->ctx = ctx;
- fz_rebind_stream(doc->file, ctx);
-}
-
/*
Initializers for the fz_document interface.
@@ -2275,22 +2247,11 @@ pdf_new_document(fz_context *ctx, fz_stream *file)
doc->super.load_outline = (fz_document_load_outline_fn *)pdf_load_outline;
doc->super.count_pages = (fz_document_count_pages_fn *)pdf_count_pages;
doc->super.load_page = (fz_document_load_page_fn *)pdf_load_page;
- doc->super.load_links = (fz_document_load_links_fn *)pdf_load_links;
- doc->super.bound_page = (fz_document_bound_page_fn *)pdf_bound_page;
- doc->super.first_annot = (fz_document_first_annot_fn *)pdf_first_annot;
- doc->super.next_annot = (fz_document_next_annot_fn *)pdf_next_annot;
- doc->super.bound_annot = (fz_document_bound_annot_fn *)pdf_bound_annot;
- doc->super.run_page_contents = NULL; /* see pdf_xref_aux.c */
- doc->super.run_annot = NULL; /* see pdf_xref_aux.c */
- doc->super.free_page = (fz_document_free_page_fn *)pdf_drop_page;
doc->super.meta = (fz_document_meta_fn *)pdf_meta;
- doc->super.page_presentation = (fz_document_page_presentation_fn *)pdf_page_presentation;
doc->super.write = (fz_document_write_fn *)pdf_write_document;
- doc->super.rebind = (fz_document_rebind_fn *)pdf_rebind;
pdf_lexbuf_init(ctx, &doc->lexbuf.base, PDF_LEXBUF_LARGE);
- doc->file = fz_keep_stream(file);
- doc->ctx = ctx;
+ doc->file = fz_keep_stream(ctx, file);
return doc;
}
@@ -2299,16 +2260,13 @@ pdf_document *
pdf_open_document_no_run_with_stream(fz_context *ctx, fz_stream *file)
{
pdf_document *doc = pdf_new_document(ctx, file);
-
- fz_var(doc);
-
fz_try(ctx)
{
- pdf_init_document(doc);
+ pdf_init_document(ctx, doc);
}
fz_catch(ctx)
{
- pdf_close_document(doc);
+ pdf_close_document(ctx, doc);
fz_rethrow_message(ctx, "cannot load document from stream");
}
return doc;
@@ -2327,26 +2285,25 @@ pdf_open_document_no_run(fz_context *ctx, const char *filename)
{
file = fz_open_file(ctx, filename);
doc = pdf_new_document(ctx, file);
- pdf_init_document(doc);
+ pdf_init_document(ctx, doc);
}
fz_always(ctx)
{
- fz_drop_stream(file);
+ fz_drop_stream(ctx, file);
}
fz_catch(ctx)
{
- pdf_close_document(doc);
+ pdf_close_document(ctx, doc);
fz_rethrow_message(ctx, "cannot load document '%s'", filename);
}
return doc;
}
static void
-pdf_load_hints(pdf_document *doc, int objnum, int gennum)
+pdf_load_hints(fz_context *ctx, pdf_document *doc, int objnum, int gennum)
{
fz_stream *stream = NULL;
pdf_obj *dict;
- fz_context *ctx = doc->ctx;
fz_var(stream);
fz_var(dict);
@@ -2363,14 +2320,14 @@ pdf_load_hints(pdf_document *doc, int objnum, int gennum)
int shared_obj_num, shared_obj_offset, shared_obj_count_page1;
int shared_obj_count_total;
int least_shared_group_len, shared_group_len_num_bits;
- int max_object_num = pdf_xref_len(doc);
+ int max_object_num = pdf_xref_len(ctx, doc);
- stream = pdf_open_stream(doc, objnum, gennum);
- dict = pdf_get_xref_entry(doc, objnum)->obj;
- if (dict == NULL || !pdf_is_dict(dict))
+ stream = pdf_open_stream(ctx, doc, objnum, gennum);
+ dict = pdf_get_xref_entry(ctx, doc, objnum)->obj;
+ if (dict == NULL || !pdf_is_dict(ctx, dict))
fz_throw(ctx, FZ_ERROR_GENERIC, "malformed hint object");
- shared_hint_offset = pdf_to_int(pdf_dict_gets(dict, "S"));
+ shared_hint_offset = pdf_to_int(ctx, pdf_dict_gets(ctx, dict, "S"));
/* Malloc the structures (use realloc to cope with the fact we
* may try this several times before enough data is loaded) */
@@ -2381,45 +2338,45 @@ pdf_load_hints(pdf_document *doc, int objnum, int gennum)
doc->hint_obj_offsets_max = max_object_num;
/* Read the page object hints table: Header first */
- least_num_page_objs = fz_read_bits(stream, 32);
+ least_num_page_objs = fz_read_bits(ctx, stream, 32);
/* The following is sometimes a lie, but we read this version,
* as other table values are built from it. In
* pdf_reference17.pdf, this points to 2 objects before the
* first pages page object. */
- doc->hint_page[0].offset = fz_read_bits(stream, 32);
+ doc->hint_page[0].offset = fz_read_bits(ctx, stream, 32);
if (doc->hint_page[0].offset > doc->hint_object_offset)
doc->hint_page[0].offset += doc->hint_object_length;
- page_obj_num_bits = fz_read_bits(stream, 16);
- least_page_len = fz_read_bits(stream, 32);
- page_len_num_bits = fz_read_bits(stream, 16);
- /* least_page_offset = */ (void) fz_read_bits(stream, 32);
- /* page_offset_num_bits = */ (void) fz_read_bits(stream, 16);
- /* least_content_stream_len = */ (void) fz_read_bits(stream, 32);
- /* content_stream_len_num_bits = */ (void) fz_read_bits(stream, 16);
- num_shared_obj_num_bits = fz_read_bits(stream, 16);
- shared_obj_num_bits = fz_read_bits(stream, 16);
- /* numerator_bits = */ (void) fz_read_bits(stream, 16);
- /* denominator_bits = */ (void) fz_read_bits(stream, 16);
+ page_obj_num_bits = fz_read_bits(ctx, stream, 16);
+ least_page_len = fz_read_bits(ctx, stream, 32);
+ page_len_num_bits = fz_read_bits(ctx, stream, 16);
+ /* least_page_offset = */ (void) fz_read_bits(ctx, stream, 32);
+ /* page_offset_num_bits = */ (void) fz_read_bits(ctx, stream, 16);
+ /* least_content_stream_len = */ (void) fz_read_bits(ctx, stream, 32);
+ /* content_stream_len_num_bits = */ (void) fz_read_bits(ctx, stream, 16);
+ num_shared_obj_num_bits = fz_read_bits(ctx, stream, 16);
+ shared_obj_num_bits = fz_read_bits(ctx, stream, 16);
+ /* numerator_bits = */ (void) fz_read_bits(ctx, stream, 16);
+ /* denominator_bits = */ (void) fz_read_bits(ctx, stream, 16);
/* Item 1: Page object numbers */
doc->hint_page[0].number = doc->linear_page1_obj_num;
/* We don't care about the number of objects in the first page */
- (void)fz_read_bits(stream, page_obj_num_bits);
+ (void)fz_read_bits(ctx, stream, page_obj_num_bits);
j = 1;
for (i = 1; i < doc->page_count; i++)
{
- int delta_page_objs = fz_read_bits(stream, page_obj_num_bits);
+ int delta_page_objs = fz_read_bits(ctx, stream, page_obj_num_bits);
doc->hint_page[i].number = j;
j += least_num_page_objs + delta_page_objs;
}
doc->hint_page[i].number = j; /* Not a real page object */
- fz_sync_bits(stream);
+ fz_sync_bits(ctx, stream);
/* Item 2: Page lengths */
j = doc->hint_page[0].offset;
for (i = 0; i < doc->page_count; i++)
{
- int delta_page_len = fz_read_bits(stream, page_len_num_bits);
+ int delta_page_len = fz_read_bits(ctx, stream, page_len_num_bits);
int old = j;
doc->hint_page[i].offset = j;
@@ -2428,39 +2385,39 @@ pdf_load_hints(pdf_document *doc, int objnum, int gennum)
j += doc->hint_object_length;
}
doc->hint_page[i].offset = j;
- fz_sync_bits(stream);
+ fz_sync_bits(ctx, stream);
/* Item 3: Shared references */
shared = 0;
for (i = 0; i < doc->page_count; i++)
{
- int num_shared_objs = fz_read_bits(stream, num_shared_obj_num_bits);
+ int num_shared_objs = fz_read_bits(ctx, stream, num_shared_obj_num_bits);
doc->hint_page[i].index = shared;
shared += num_shared_objs;
}
doc->hint_page[i].index = shared;
doc->hint_shared_ref = fz_resize_array(ctx, doc->hint_shared_ref, shared, sizeof(*doc->hint_shared_ref));
memset(doc->hint_shared_ref, 0, sizeof(*doc->hint_shared_ref) * shared);
- fz_sync_bits(stream);
+ fz_sync_bits(ctx, stream);
/* Item 4: Shared references */
for (i = 0; i < shared; i++)
{
- int ref = fz_read_bits(stream, shared_obj_num_bits);
+ int ref = fz_read_bits(ctx, stream, shared_obj_num_bits);
doc->hint_shared_ref[i] = ref;
}
/* Skip items 5,6,7 as we don't use them */
- fz_seek(stream, shared_hint_offset, SEEK_SET);
+ fz_seek(ctx, stream, shared_hint_offset, SEEK_SET);
/* Read the shared object hints table: Header first */
- shared_obj_num = fz_read_bits(stream, 32);
- shared_obj_offset = fz_read_bits(stream, 32);
+ shared_obj_num = fz_read_bits(ctx, stream, 32);
+ shared_obj_offset = fz_read_bits(ctx, stream, 32);
if (shared_obj_offset > doc->hint_object_offset)
shared_obj_offset += doc->hint_object_length;
- shared_obj_count_page1 = fz_read_bits(stream, 32);
- shared_obj_count_total = fz_read_bits(stream, 32);
- shared_obj_num_bits = fz_read_bits(stream, 16);
- least_shared_group_len = fz_read_bits(stream, 32);
- shared_group_len_num_bits = fz_read_bits(stream, 16);
+ shared_obj_count_page1 = fz_read_bits(ctx, stream, 32);
+ shared_obj_count_total = fz_read_bits(ctx, stream, 32);
+ shared_obj_num_bits = fz_read_bits(ctx, stream, 16);
+ least_shared_group_len = fz_read_bits(ctx, stream, 32);
+ shared_group_len_num_bits = fz_read_bits(ctx, stream, 16);
/* Sanity check the references in Item 4 above to ensure we
* don't access out of range with malicious files. */
@@ -2479,7 +2436,7 @@ pdf_load_hints(pdf_document *doc, int objnum, int gennum)
j = doc->hint_page[0].offset;
for (i = 0; i < shared_obj_count_page1; i++)
{
- int off = fz_read_bits(stream, shared_group_len_num_bits);
+ int off = fz_read_bits(ctx, stream, shared_group_len_num_bits);
int old = j;
doc->hint_shared[i].offset = j;
j += off + least_shared_group_len;
@@ -2492,7 +2449,7 @@ pdf_load_hints(pdf_document *doc, int objnum, int gennum)
j = shared_obj_offset;
for (; i < shared_obj_count_total; i++)
{
- int off = fz_read_bits(stream, shared_group_len_num_bits);
+ int off = fz_read_bits(ctx, stream, shared_group_len_num_bits);
int old = j;
doc->hint_shared[i].offset = j;
j += off + least_shared_group_len;
@@ -2500,34 +2457,34 @@ pdf_load_hints(pdf_document *doc, int objnum, int gennum)
j += doc->hint_object_length;
}
doc->hint_shared[i].offset = j;
- fz_sync_bits(stream);
+ fz_sync_bits(ctx, stream);
/* Item 2: Signature flags: read these just so we can skip */
for (i = 0; i < shared_obj_count_total; i++)
{
- doc->hint_shared[i].number = fz_read_bits(stream, 1);
+ doc->hint_shared[i].number = fz_read_bits(ctx, stream, 1);
}
- fz_sync_bits(stream);
+ fz_sync_bits(ctx, stream);
/* Item 3: Signatures: just skip */
for (i = 0; i < shared_obj_count_total; i++)
{
if (doc->hint_shared[i].number)
{
- (void) fz_read_bits(stream, 128);
+ (void) fz_read_bits(ctx, stream, 128);
}
}
- fz_sync_bits(stream);
+ fz_sync_bits(ctx, stream);
/* Item 4: Shared object object numbers */
j = doc->linear_page1_obj_num; /* FIXME: This is a lie! */
for (i = 0; i < shared_obj_count_page1; i++)
{
doc->hint_shared[i].number = j;
- j += fz_read_bits(stream, shared_obj_num_bits) + 1;
+ j += fz_read_bits(ctx, stream, shared_obj_num_bits) + 1;
}
j = shared_obj_num;
for (; i < shared_obj_count_total; i++)
{
doc->hint_shared[i].number = j;
- j += fz_read_bits(stream, shared_obj_num_bits) + 1;
+ j += fz_read_bits(ctx, stream, shared_obj_num_bits) + 1;
}
doc->hint_shared[i].number = j;
@@ -2543,7 +2500,7 @@ pdf_load_hints(pdf_document *doc, int objnum, int gennum)
}
fz_always(ctx)
{
- fz_drop_stream(stream);
+ fz_drop_stream(ctx, stream);
}
fz_catch(ctx)
{
@@ -2559,14 +2516,13 @@ pdf_load_hints(pdf_document *doc, int objnum, int gennum)
}
static void
-pdf_load_hint_object(pdf_document *doc)
+pdf_load_hint_object(fz_context *ctx, pdf_document *doc)
{
- fz_context *ctx = doc->ctx;
pdf_lexbuf *buf = &doc->lexbuf.base;
int curr_pos;
- curr_pos = fz_tell(doc->file);
- fz_seek(doc->file, doc->hint_object_offset, SEEK_SET);
+ curr_pos = fz_tell(ctx, doc->file);
+ fz_seek(ctx, doc->file, doc->hint_object_offset, SEEK_SET);
fz_try(ctx)
{
while (1)
@@ -2574,24 +2530,24 @@ pdf_load_hint_object(pdf_document *doc)
pdf_obj *page = NULL;
int tmpofs, num, gen, tok;
- tok = pdf_lex(doc->file, buf);
+ tok = pdf_lex(ctx, doc->file, buf);
if (tok != PDF_TOK_INT)
break;
num = buf->i;
- tok = pdf_lex(doc->file, buf);
+ tok = pdf_lex(ctx, doc->file, buf);
if (tok != PDF_TOK_INT)
break;
gen = buf->i;
- tok = pdf_lex(doc->file, buf);
+ tok = pdf_lex(ctx, doc->file, buf);
if (tok != PDF_TOK_OBJ)
break;
- (void)pdf_repair_obj(doc, buf, &tmpofs, NULL, NULL, NULL, &page, &tmpofs);
- pdf_load_hints(doc, num, gen);
+ (void)pdf_repair_obj(ctx, doc, buf, &tmpofs, NULL, NULL, NULL, &page, &tmpofs);
+ pdf_load_hints(ctx, doc, num, gen);
}
}
fz_always(ctx)
{
- fz_seek(doc->file, curr_pos, SEEK_SET);
+ fz_seek(ctx, doc->file, curr_pos, SEEK_SET);
}
fz_catch(ctx)
{
@@ -2599,17 +2555,16 @@ pdf_load_hint_object(pdf_document *doc)
}
}
-pdf_obj *pdf_progressive_advance(pdf_document *doc, int pagenum)
+pdf_obj *pdf_progressive_advance(fz_context *ctx, pdf_document *doc, int pagenum)
{
- fz_context *ctx = doc->ctx;
pdf_lexbuf *buf = &doc->lexbuf.base;
int curr_pos;
pdf_obj *page;
- pdf_load_hinted_page(doc, pagenum);
+ pdf_load_hinted_page(ctx, doc, pagenum);
if (pagenum < 0 || pagenum >= doc->page_count)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "page load out of range (%d of %d)", pagenum, doc->page_count);
+ fz_throw(ctx, FZ_ERROR_GENERIC, "page load out of range (%d of %d)", pagenum, doc->page_count);
if (doc->linear_pos == doc->file_length)
return doc->linear_page_refs[pagenum];
@@ -2618,11 +2573,11 @@ pdf_obj *pdf_progressive_advance(pdf_document *doc, int pagenum)
if (pagenum > 0 && !doc->hints_loaded && doc->hint_object_offset > 0 && doc->linear_pos >= doc->hint_object_offset)
{
/* Found hint object */
- pdf_load_hint_object(doc);
+ pdf_load_hint_object(ctx, doc);
}
DEBUGMESS((ctx, "continuing to try to advance from %d", doc->linear_pos));
- curr_pos = fz_tell(doc->file);
+ curr_pos = fz_tell(ctx, doc->file);
fz_var(page);
@@ -2633,8 +2588,8 @@ pdf_obj *pdf_progressive_advance(pdf_document *doc, int pagenum)
{
int num;
page = NULL;
- eof = pdf_obj_read(doc, &doc->linear_pos, &num, &page);
- pdf_drop_obj(page);
+ eof = pdf_obj_read(ctx, doc, &doc->linear_pos, &num, &page);
+ pdf_drop_obj(ctx, page);
page = NULL;
}
while (!eof);
@@ -2643,22 +2598,22 @@ pdf_obj *pdf_progressive_advance(pdf_document *doc, int pagenum)
pdf_obj *catalog;
pdf_obj *pages;
doc->linear_pos = doc->file_length;
- pdf_load_xref(doc, buf);
- catalog = pdf_dict_gets(pdf_trailer(doc), "Root");
- pages = pdf_dict_gets(catalog, "Pages");
+ pdf_load_xref(ctx, doc, buf);
+ catalog = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Root");
+ pages = pdf_dict_gets(ctx, catalog, "Pages");
- if (!pdf_is_dict(pages))
+ if (!pdf_is_dict(ctx, pages))
fz_throw(ctx, FZ_ERROR_GENERIC, "missing page tree");
break;
}
}
fz_always(ctx)
{
- fz_seek(doc->file, curr_pos, SEEK_SET);
+ fz_seek(ctx, doc->file, curr_pos, SEEK_SET);
}
fz_catch(ctx)
{
- pdf_drop_obj(page);
+ pdf_drop_obj(ctx, page);
if (fz_caught(ctx) == FZ_ERROR_TRYLATER)
{
if (doc->linear_page_refs[pagenum] == NULL)
@@ -2674,7 +2629,7 @@ pdf_obj *pdf_progressive_advance(pdf_document *doc, int pagenum)
return doc->linear_page_refs[pagenum];
}
-pdf_document *pdf_specifics(fz_document *doc)
+pdf_document *pdf_specifics(fz_context *ctx, fz_document *doc)
{
return (pdf_document *)((doc && doc->close == (fz_document_close_fn *)pdf_close_document) ? doc : NULL);
}
@@ -2697,29 +2652,29 @@ pdf_document *pdf_create_document(fz_context *ctx)
doc->file_size = 0;
doc->startxref = 0;
doc->num_xref_sections = 0;
- pdf_get_populating_xref_entry(doc, 0);
+ pdf_get_populating_xref_entry(ctx, doc, 0);
doc->xref_altered = 1;
- trailer = pdf_new_dict(doc, 2);
- pdf_dict_puts_drop(trailer, "Size", pdf_new_int(doc, 3));
- o = root = pdf_new_dict(doc, 2);
- pdf_dict_puts_drop(trailer, "Root", pdf_new_ref(doc, o));
- pdf_drop_obj(o);
+ trailer = pdf_new_dict(ctx, doc, 2);
+ pdf_dict_puts_drop(ctx, trailer, "Size", pdf_new_int(ctx, doc, 3));
+ o = root = pdf_new_dict(ctx, doc, 2);
+ pdf_dict_puts_drop(ctx, trailer, "Root", pdf_new_ref(ctx, doc, o));
+ pdf_drop_obj(ctx, o);
o = NULL;
- pdf_dict_puts_drop(root, "Type", pdf_new_name(doc, "Catalog"));
- o = pages = pdf_new_dict(doc, 3);
- pdf_dict_puts_drop(root, "Pages", pdf_new_ref(doc, o));
- pdf_drop_obj(o);
+ pdf_dict_puts_drop(ctx, root, "Type", pdf_new_name(ctx, doc, "Catalog"));
+ o = pages = pdf_new_dict(ctx, doc, 3);
+ pdf_dict_puts_drop(ctx, root, "Pages", pdf_new_ref(ctx, doc, o));
+ pdf_drop_obj(ctx, o);
o = NULL;
- pdf_dict_puts_drop(pages, "Type", pdf_new_name(doc, "Pages"));
- pdf_dict_puts_drop(pages, "Count", pdf_new_int(doc, 0));
- pdf_dict_puts_drop(pages, "Kids", pdf_new_array(doc, 1));
- pdf_set_populating_xref_trailer(doc, trailer);
- pdf_drop_obj(trailer);
+ pdf_dict_puts_drop(ctx, pages, "Type", pdf_new_name(ctx, doc, "Pages"));
+ pdf_dict_puts_drop(ctx, pages, "Count", pdf_new_int(ctx, doc, 0));
+ pdf_dict_puts_drop(ctx, pages, "Kids", pdf_new_array(ctx, doc, 1));
+ pdf_set_populating_xref_trailer(ctx, doc, trailer);
+ pdf_drop_obj(ctx, trailer);
}
fz_catch(ctx)
{
- pdf_drop_obj(trailer);
- pdf_drop_obj(o);
+ pdf_drop_obj(ctx, trailer);
+ pdf_drop_obj(ctx, o);
fz_rethrow_message(ctx, "Failed to create empty document");
}
return doc;
@@ -2748,7 +2703,7 @@ fz_document_handler pdf_no_run_document_handler =
(fz_document_open_with_stream_fn *)&pdf_open_document_no_run_with_stream
};
-void pdf_mark_xref(pdf_document *doc)
+void pdf_mark_xref(fz_context *ctx, pdf_document *doc)
{
int x, e;
@@ -2771,7 +2726,7 @@ void pdf_mark_xref(pdf_document *doc)
}
}
-void pdf_clear_xref(pdf_document *doc)
+void pdf_clear_xref(fz_context *ctx, pdf_document *doc)
{
int x, e;
@@ -2789,9 +2744,9 @@ void pdf_clear_xref(pdf_document *doc)
* buffer has been updated */
if (entry->obj != NULL && entry->stm_buf == NULL)
{
- if (pdf_obj_refs(entry->obj) == 1)
+ if (pdf_obj_refs(ctx, entry->obj) == 1)
{
- pdf_drop_obj(entry->obj);
+ pdf_drop_obj(ctx, entry->obj);
entry->obj = NULL;
}
}
@@ -2800,7 +2755,7 @@ void pdf_clear_xref(pdf_document *doc)
}
}
-void pdf_clear_xref_to_mark(pdf_document *doc)
+void pdf_clear_xref_to_mark(fz_context *ctx, pdf_document *doc)
{
int x, e;
@@ -2819,9 +2774,9 @@ void pdf_clear_xref_to_mark(pdf_document *doc)
* been updated */
if (entry->obj != NULL && entry->stm_buf == NULL)
{
- if ((entry->flags & PDF_OBJ_FLAG_MARK) == 0 && pdf_obj_refs(entry->obj) == 1)
+ if ((entry->flags & PDF_OBJ_FLAG_MARK) == 0 && pdf_obj_refs(ctx, entry->obj) == 1)
{
- pdf_drop_obj(entry->obj);
+ pdf_drop_obj(ctx, entry->obj);
entry->obj = NULL;
}
}