From f84a189d5f94250e46d2cbd1a75aba00130e2dd6 Mon Sep 17 00:00:00 2001 From: Tor Andersson Date: Wed, 21 Jan 2015 16:42:45 +0100 Subject: Add ctx parameter and remove embedded contexts for API regularity. Purge several embedded contexts: Remove embedded context in fz_output. Remove embedded context in fz_stream. Remove embedded context in fz_device. Remove fz_rebind_stream (since it is no longer necessary). Remove embedded context in svg_device. Remove embedded context in XML parser. Add ctx argument to fz_document functions. Remove embedded context in fz_document. Remove embedded context in pdf_document. Remove embedded context in pdf_obj. Make fz_page independent of fz_document in the interface. We shouldn't need to pass the document to all functions handling a page. If a page is tied to the source document, it's redundant; otherwise it's just pointless. Fix reference counting oddity in fz_new_image_from_pixmap. --- source/pdf/js/pdf-js.c | 137 ++--- source/pdf/pdf-annot-edit.c | 197 ++++--- source/pdf/pdf-annot.c | 268 +++++----- source/pdf/pdf-appearance.c | 447 ++++++++-------- source/pdf/pdf-clean.c | 159 +++--- source/pdf/pdf-cmap-load.c | 41 +- source/pdf/pdf-cmap-parse.c | 34 +- source/pdf/pdf-colorspace.c | 103 ++-- source/pdf/pdf-crypt.c | 210 ++++---- source/pdf/pdf-device.c | 550 ++++++++++---------- source/pdf/pdf-event.c | 34 +- source/pdf/pdf-field.c | 47 +- source/pdf/pdf-font.c | 274 +++++----- source/pdf/pdf-fontfile.c | 30 +- source/pdf/pdf-form.c | 633 +++++++++++------------ source/pdf/pdf-function.c | 201 ++++---- source/pdf/pdf-image.c | 112 ++-- source/pdf/pdf-interpret-imp.h | 13 +- source/pdf/pdf-interpret.c | 119 +++-- source/pdf/pdf-lex.c | 133 +++-- source/pdf/pdf-nametree.c | 115 ++--- source/pdf/pdf-object.c | 1098 ++++++++++++++++++++-------------------- source/pdf/pdf-op-buffer.c | 267 +++++----- source/pdf/pdf-op-filter.c | 25 +- source/pdf/pdf-op-run.c | 414 +++++++-------- source/pdf/pdf-outline.c | 39 +- source/pdf/pdf-page.c | 397 ++++++++------- source/pdf/pdf-parse.c | 267 +++++----- source/pdf/pdf-pattern.c | 25 +- source/pdf/pdf-pkcs7.c | 67 ++- source/pdf/pdf-repair.c | 248 +++++---- source/pdf/pdf-run.c | 76 +-- source/pdf/pdf-shade.c | 200 ++++---- source/pdf/pdf-store.c | 26 +- source/pdf/pdf-stream.c | 323 ++++++------ source/pdf/pdf-type3.c | 80 ++- source/pdf/pdf-unicode.c | 7 +- source/pdf/pdf-write.c | 980 ++++++++++++++++++----------------- source/pdf/pdf-xobject.c | 130 +++-- source/pdf/pdf-xref-aux.c | 6 +- source/pdf/pdf-xref.c | 959 +++++++++++++++++------------------ 41 files changed, 4633 insertions(+), 4858 deletions(-) (limited to 'source/pdf') 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, ""); - else if (pdf_is_indirect(obj)) + fmt_puts(ctx, fmt, ""); + 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, ""); + fmt_puts(ctx, fmt, ""); } 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