diff options
Diffstat (limited to 'source/pdf')
41 files changed, 4633 insertions, 4858 deletions
diff --git a/source/pdf/js/pdf-js.c b/source/pdf/js/pdf-js.c index 8364fc95..008cebfb 100644 --- a/source/pdf/js/pdf-js.c +++ b/source/pdf/js/pdf-js.c @@ -1,7 +1,11 @@ #include "mupdf/pdf.h" +/* TODO: js->doc -> doc */ +/* TODO: js->ctx -> ctx */ + struct pdf_js_s { + fz_context *ctx; pdf_document *doc; pdf_obj *form; pdf_js_event event; @@ -15,7 +19,7 @@ struct pdf_js_s static pdf_jsimp_obj *app_alert(void *jsctx, void *obj, int argc, pdf_jsimp_obj *args[]) { pdf_js *js = (pdf_js *)jsctx; - fz_context *ctx = js->doc->ctx; + fz_context *ctx = js->ctx; pdf_jsimp_obj *cMsg_obj = NULL; pdf_jsimp_obj *nIcon_obj = NULL; pdf_jsimp_obj *nType_obj = NULL; @@ -77,7 +81,7 @@ static pdf_jsimp_obj *app_alert(void *jsctx, void *obj, int argc, pdf_jsimp_obj if (cTitle_obj) event.title = pdf_jsimp_to_string(js->imp, cTitle_obj); - pdf_event_issue_alert(js->doc, &event); + pdf_event_issue_alert(ctx, js->doc, &event); nButton_obj = pdf_jsimp_from_number(js->imp, (double)event.button_pressed); } fz_always(ctx) @@ -102,7 +106,7 @@ static pdf_jsimp_obj *app_execDialog(void *jsctx, void *obj, int argc, pdf_jsimp { pdf_js *js = (pdf_js *)jsctx; - pdf_event_issue_exec_dialog(js->doc); + pdf_event_issue_exec_dialog(js->ctx, js->doc); return NULL; } @@ -112,7 +116,7 @@ static pdf_jsimp_obj *app_execMenuItem(void *jsctx, void *obj, int argc, pdf_jsi pdf_js *js = (pdf_js *)jsctx; if (argc == 1) - pdf_event_issue_exec_menu_item(js->doc, pdf_jsimp_to_string(js->imp, args[0])); + pdf_event_issue_exec_menu_item(js->ctx, js->doc, pdf_jsimp_to_string(js->imp, args[0])); return NULL; } @@ -133,19 +137,18 @@ static pdf_jsimp_obj *app_launchURL(void *jsctx, void *obj, int argc, pdf_jsimp_ cUrl = pdf_jsimp_to_string(js->imp, args[0]); } - pdf_event_issue_launch_url(js->doc, cUrl, bNewFrame); + pdf_event_issue_launch_url(js->ctx, js->doc, cUrl, bNewFrame); return NULL; } -static pdf_obj *load_color(pdf_document *doc, pdf_jsimp *imp, pdf_jsimp_obj *val) +static pdf_obj *load_color(fz_context *ctx, pdf_document *doc, pdf_jsimp *imp, pdf_jsimp_obj *val) { pdf_obj *col = NULL; pdf_obj *comp = NULL; pdf_jsimp_obj *jscomp = NULL; int i; int n; - fz_context *ctx = doc->ctx; n = pdf_jsimp_array_len(imp, val); @@ -155,7 +158,7 @@ static pdf_obj *load_color(pdf_document *doc, pdf_jsimp *imp, pdf_jsimp_obj *val if (n <= 1) return NULL; - col = pdf_new_array(doc, n-1); + col = pdf_new_array(ctx, doc, n-1); fz_var(comp); fz_var(jscomp); @@ -164,19 +167,19 @@ static pdf_obj *load_color(pdf_document *doc, pdf_jsimp *imp, pdf_jsimp_obj *val for (i = 0; i < n-1; i++) { jscomp = pdf_jsimp_array_item(imp, val, i+1); - comp = pdf_new_real(doc, pdf_jsimp_to_number(imp, jscomp)); - pdf_array_push(col, comp); + comp = pdf_new_real(ctx, doc, pdf_jsimp_to_number(imp, jscomp)); + pdf_array_push(ctx, col, comp); pdf_jsimp_drop_obj(imp, jscomp); jscomp = NULL; - pdf_drop_obj(comp); + pdf_drop_obj(ctx, comp); comp = NULL; } } fz_catch(ctx) { pdf_jsimp_drop_obj(imp, jscomp); - pdf_drop_obj(comp); - pdf_drop_obj(col); + pdf_drop_obj(ctx, comp); + pdf_drop_obj(ctx, col); fz_rethrow(ctx); } @@ -193,7 +196,7 @@ static pdf_jsimp_obj *field_buttonSetCaption(void *jsctx, void *obj, int argc, p return NULL; name = pdf_jsimp_to_string(js->imp, args[0]); - pdf_field_set_button_caption(js->doc, field, name); + pdf_field_set_button_caption(js->ctx, js->doc, field, name); return NULL; } @@ -201,7 +204,7 @@ static pdf_jsimp_obj *field_buttonSetCaption(void *jsctx, void *obj, int argc, p static pdf_jsimp_obj *field_getName(void *jsctx, void *obj) { pdf_js *js = (pdf_js *)jsctx; - fz_context *ctx = js->doc->ctx; + fz_context *ctx = js->ctx; pdf_obj *field = (pdf_obj *)obj; char *name; pdf_jsimp_obj *oname = NULL; @@ -209,7 +212,7 @@ static pdf_jsimp_obj *field_getName(void *jsctx, void *obj) if (field == NULL) return NULL; - name = pdf_field_name(js->doc, field); + name = pdf_field_name(ctx, js->doc, field); fz_try(ctx) { oname = pdf_jsimp_from_string(js->imp, name); @@ -229,7 +232,7 @@ static pdf_jsimp_obj *field_getName(void *jsctx, void *obj) static void field_setName(void *jsctx, void *obj, pdf_jsimp_obj *val) { pdf_js *js = (pdf_js *)jsctx; - fz_warn(js->doc->ctx, "Unexpected call to field_setName"); + fz_warn(js->ctx, "Unexpected call to field_setName"); } static pdf_jsimp_obj *field_getDisplay(void *jsctx, void *obj) @@ -237,7 +240,7 @@ static pdf_jsimp_obj *field_getDisplay(void *jsctx, void *obj) pdf_js *js = (pdf_js *)jsctx; pdf_obj *field = (pdf_obj *)obj; - return field ? pdf_jsimp_from_number(js->imp, (double)pdf_field_display(js->doc, field)) : NULL; + return field ? pdf_jsimp_from_number(js->imp, (double)pdf_field_display(js->ctx, js->doc, field)) : NULL; } static void field_setDisplay(void *jsctx, void *obj, pdf_jsimp_obj *val) @@ -245,7 +248,7 @@ static void field_setDisplay(void *jsctx, void *obj, pdf_jsimp_obj *val) pdf_js *js = (pdf_js *)jsctx; pdf_obj *field = (pdf_obj *)obj; if (field) - pdf_field_set_display(js->doc, field, (int)pdf_jsimp_to_number(js->imp, val)); + pdf_field_set_display(js->ctx, js->doc, field, (int)pdf_jsimp_to_number(js->imp, val)); } static pdf_jsimp_obj *field_getFillColor(void *jsctx, void *obj) @@ -256,21 +259,21 @@ static pdf_jsimp_obj *field_getFillColor(void *jsctx, void *obj) static void field_setFillColor(void *jsctx, void *obj, pdf_jsimp_obj *val) { pdf_js *js = (pdf_js *)jsctx; - fz_context *ctx = js->doc->ctx; + fz_context *ctx = js->ctx; pdf_obj *field = (pdf_obj *)obj; pdf_obj *col; if (!field) return; - col = load_color(js->doc, js->imp, val); + col = load_color(ctx, js->doc, js->imp, val); fz_try(ctx) { - pdf_field_set_fill_color(js->doc, field, col); + pdf_field_set_fill_color(ctx, js->doc, field, col); } fz_always(ctx) { - pdf_drop_obj(col); + pdf_drop_obj(ctx, col); } fz_catch(ctx) { @@ -286,21 +289,21 @@ static pdf_jsimp_obj *field_getTextColor(void *jsctx, void *obj) static void field_setTextColor(void *jsctx, void *obj, pdf_jsimp_obj *val) { pdf_js *js = (pdf_js *)jsctx; - fz_context *ctx = js->doc->ctx; + fz_context *ctx = js->ctx; pdf_obj *field = (pdf_obj *)obj; pdf_obj *col; if (!field) return; - col = load_color(js->doc, js->imp, val); + col = load_color(ctx, js->doc, js->imp, val); fz_try(ctx) { - pdf_field_set_text_color(js->doc, field, col); + pdf_field_set_text_color(ctx, js->doc, field, col); } fz_always(ctx) { - pdf_drop_obj(col); + pdf_drop_obj(ctx, col); } fz_catch(ctx) { @@ -313,7 +316,7 @@ static pdf_jsimp_obj *field_getBorderStyle(void *jsctx, void *obj) pdf_js *js = (pdf_js *)jsctx; pdf_obj *field = (pdf_obj *)obj; - return field ? pdf_jsimp_from_string(js->imp, pdf_field_border_style(js->doc, field)) : NULL; + return field ? pdf_jsimp_from_string(js->imp, pdf_field_border_style(js->ctx, js->doc, field)) : NULL; } static void field_setBorderStyle(void *jsctx, void *obj, pdf_jsimp_obj *val) @@ -322,7 +325,7 @@ static void field_setBorderStyle(void *jsctx, void *obj, pdf_jsimp_obj *val) pdf_obj *field = (pdf_obj *)obj; if (field) - pdf_field_set_border_style(js->doc, field, pdf_jsimp_to_string(js->imp, val)); + pdf_field_set_border_style(js->ctx, js->doc, field, pdf_jsimp_to_string(js->imp, val)); } static pdf_jsimp_obj *field_getValue(void *jsctx, void *obj) @@ -334,7 +337,7 @@ static pdf_jsimp_obj *field_getValue(void *jsctx, void *obj) if (!field) return NULL; - fval = pdf_field_value(js->doc, field); + fval = pdf_field_value(js->ctx, js->doc, field); return pdf_jsimp_from_string(js->imp, fval?fval:""); } @@ -344,7 +347,7 @@ static void field_setValue(void *jsctx, void *obj, pdf_jsimp_obj *val) pdf_obj *field = (pdf_obj *)obj; if (field) - (void)pdf_field_set_value(js->doc, field, pdf_jsimp_to_string(js->imp, val)); + (void)pdf_field_set_value(js->ctx, js->doc, field, pdf_jsimp_to_string(js->imp, val)); } static pdf_jsimp_obj *event_getTarget(void *jsctx, void *obj) @@ -357,7 +360,7 @@ static pdf_jsimp_obj *event_getTarget(void *jsctx, void *obj) static void event_setTarget(void *jsctx, void *obj, pdf_jsimp_obj *val) { pdf_js *js = (pdf_js *)jsctx; - fz_warn(js->doc->ctx, "Unexpected call to event_setTarget"); + fz_warn(js->ctx, "Unexpected call to event_setTarget"); } static pdf_jsimp_obj *event_getValue(void *jsctx, void *obj) @@ -371,7 +374,7 @@ static pdf_jsimp_obj *event_getValue(void *jsctx, void *obj) static void event_setValue(void *jsctx, void *obj, pdf_jsimp_obj *val) { pdf_js *js = (pdf_js *)jsctx; - fz_context *ctx = js->doc->ctx; + fz_context *ctx = js->ctx; fz_free(ctx, js->event.value); js->event.value = NULL; js->event.value = fz_strdup(ctx, pdf_jsimp_to_string(js->imp, val)); @@ -387,7 +390,7 @@ static pdf_jsimp_obj *event_getWillCommit(void *jsctx, void *obj) static void event_setWillCommit(void *jsctx, void *obj, pdf_jsimp_obj *val) { pdf_js *js = (pdf_js *)jsctx; - fz_warn(js->doc->ctx, "Unexpected call to event_setWillCommit"); + fz_warn(js->ctx, "Unexpected call to event_setWillCommit"); } static pdf_jsimp_obj *event_getRC(void *jsctx, void *obj) @@ -414,7 +417,7 @@ static pdf_jsimp_obj *doc_getEvent(void *jsctx, void *obj) static void doc_setEvent(void *jsctx, void *obj, pdf_jsimp_obj *val) { pdf_js *js = (pdf_js *)jsctx; - fz_warn(js->doc->ctx, "Unexpected call to doc_setEvent"); + fz_warn(js->ctx, "Unexpected call to doc_setEvent"); } static pdf_jsimp_obj *doc_getApp(void *jsctx, void *obj) @@ -427,7 +430,7 @@ static pdf_jsimp_obj *doc_getApp(void *jsctx, void *obj) static void doc_setApp(void *jsctx, void *obj, pdf_jsimp_obj *val) { pdf_js *js = (pdf_js *)jsctx; - fz_warn(js->doc->ctx, "Unexpected call to doc_setApp"); + fz_warn(js->ctx, "Unexpected call to doc_setApp"); } static char *utf8_to_pdf(fz_context *ctx, char *utf8) @@ -466,7 +469,7 @@ static char *utf8_to_pdf(fz_context *ctx, char *utf8) static pdf_jsimp_obj *doc_getField(void *jsctx, void *obj, int argc, pdf_jsimp_obj *args[]) { pdf_js *js = (pdf_js *)jsctx; - fz_context *ctx = js->doc->ctx; + fz_context *ctx = js->ctx; pdf_obj *dict = NULL; char *utf8; char *name = NULL; @@ -483,7 +486,7 @@ static pdf_jsimp_obj *doc_getField(void *jsctx, void *obj, int argc, pdf_jsimp_o if (utf8) { name = utf8_to_pdf(ctx, utf8); - dict = pdf_lookup_field(js->form, name); + dict = pdf_lookup_field(js->ctx, js->form, name); } } fz_always(ctx) @@ -502,7 +505,7 @@ static pdf_jsimp_obj *doc_getField(void *jsctx, void *obj, int argc, pdf_jsimp_o static void reset_field(pdf_js *js, pdf_jsimp_obj *item) { - fz_context *ctx = js->doc->ctx; + fz_context *ctx = js->ctx; char *name = NULL; char *utf8 = pdf_jsimp_to_string(js->imp, item); @@ -514,9 +517,9 @@ static void reset_field(pdf_js *js, pdf_jsimp_obj *item) fz_try(ctx) { name = utf8_to_pdf(ctx, utf8); - field = pdf_lookup_field(js->form, name); + field = pdf_lookup_field(js->ctx, js->form, name); if (field) - pdf_field_reset(js->doc, field); + pdf_field_reset(js->ctx, js->doc, field); } fz_always(ctx) { @@ -532,7 +535,7 @@ static void reset_field(pdf_js *js, pdf_jsimp_obj *item) static pdf_jsimp_obj *doc_resetForm(void *jsctx, void *obj, int argc, pdf_jsimp_obj *args[]) { pdf_js *js = (pdf_js *)jsctx; - fz_context *ctx = js->doc->ctx; + fz_context *ctx = js->ctx; pdf_jsimp_obj *arr = NULL; pdf_jsimp_obj *elem = NULL; @@ -583,10 +586,10 @@ static pdf_jsimp_obj *doc_resetForm(void *jsctx, void *obj, int argc, pdf_jsimp_ else { /* No argument or null passed in means reset all. */ - int i, n = pdf_array_len(js->form); + int i, n = pdf_array_len(ctx, js->form); for (i = 0; i < n; i++) - pdf_field_reset(js->doc, pdf_array_get(js->form, i)); + pdf_field_reset(js->ctx, js->doc, pdf_array_get(ctx, js->form, i)); } } fz_catch(ctx) @@ -601,7 +604,7 @@ static pdf_jsimp_obj *doc_print(void *jsctx, void *obj, int argc, pdf_jsimp_obj { pdf_js *js = (pdf_js *)jsctx; - pdf_event_issue_print(js->doc); + pdf_event_issue_print(js->ctx, js->doc); return NULL; } @@ -609,7 +612,7 @@ static pdf_jsimp_obj *doc_print(void *jsctx, void *obj, int argc, pdf_jsimp_obj static pdf_jsimp_obj *doc_mailDoc(void *jsctx, void *obj, int argc, pdf_jsimp_obj *args[]) { pdf_js *js = (pdf_js *)jsctx; - fz_context *ctx = js->doc->ctx; + fz_context *ctx = js->ctx; pdf_jsimp_obj *bUI_obj = NULL; pdf_jsimp_obj *cTo_obj = NULL; pdf_jsimp_obj *cCc_obj = NULL; @@ -684,7 +687,7 @@ static pdf_jsimp_obj *doc_mailDoc(void *jsctx, void *obj, int argc, pdf_jsimp_ob if (cMessage_obj) event.message = pdf_jsimp_to_string(js->imp, cMessage_obj); - pdf_event_issue_mail_doc(js->doc, &event); + pdf_event_issue_mail_doc(js->ctx, js->doc, &event); } fz_always(ctx) { @@ -774,7 +777,7 @@ static void pdf_drop_js(pdf_js *js) { if (js) { - fz_context *ctx = js->doc->ctx; + fz_context *ctx = js->ctx; fz_free(ctx, js->event.value); pdf_jsimp_drop_type(js->imp, js->apptype); pdf_jsimp_drop_type(js->imp, js->eventtype); @@ -785,9 +788,8 @@ static void pdf_drop_js(pdf_js *js) } } -static pdf_js *pdf_new_js(pdf_document *doc) +static pdf_js *pdf_new_js(fz_context *ctx, pdf_document *doc) { - fz_context *ctx = doc->ctx; pdf_js *js = NULL; fz_var(js); @@ -796,12 +798,13 @@ static pdf_js *pdf_new_js(pdf_document *doc) pdf_obj *root, *acroform; js = fz_malloc_struct(ctx, pdf_js); + js->ctx = ctx; js->doc = doc; /* Find the form array */ - root = pdf_dict_gets(pdf_trailer(doc), "Root"); - acroform = pdf_dict_gets(root, "AcroForm"); - js->form = pdf_dict_gets(acroform, "Fields"); + root = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Root"); + acroform = pdf_dict_gets(ctx, root, "AcroForm"); + js->form = pdf_dict_gets(ctx, acroform, "Fields"); /* Initialise the javascript engine, passing the main context * for use in memory allocation and exception handling. Also @@ -823,7 +826,7 @@ static pdf_js *pdf_new_js(pdf_document *doc) static void pdf_js_load_document_level(pdf_js *js) { pdf_document *doc = js->doc; - fz_context *ctx = doc->ctx; + fz_context *ctx = js->ctx; pdf_obj *javascript = NULL; char *codebuf = NULL; @@ -833,18 +836,18 @@ static void pdf_js_load_document_level(pdf_js *js) { int len, i; - javascript = pdf_load_name_tree(doc, "JavaScript"); - len = pdf_dict_len(javascript); + javascript = pdf_load_name_tree(ctx, doc, "JavaScript"); + len = pdf_dict_len(ctx, javascript); for (i = 0; i < len; i++) { - pdf_obj *fragment = pdf_dict_get_val(javascript, i); - pdf_obj *code = pdf_dict_gets(fragment, "JS"); + pdf_obj *fragment = pdf_dict_get_val(ctx, javascript, i); + pdf_obj *code = pdf_dict_gets(ctx, fragment, "JS"); fz_var(codebuf); fz_try(ctx) { - codebuf = pdf_to_utf8(doc, code); + codebuf = pdf_to_utf8(ctx, doc, code); pdf_jsimp_execute(js->imp, codebuf); } fz_always(ctx) @@ -861,7 +864,7 @@ static void pdf_js_load_document_level(pdf_js *js) } fz_always(ctx) { - pdf_drop_obj(javascript); + pdf_drop_obj(ctx, javascript); } fz_catch(ctx) { @@ -873,7 +876,7 @@ void pdf_js_setup_event(pdf_js *js, pdf_js_event *e) { if (js) { - fz_context *ctx = js->doc->ctx; + fz_context *ctx = js->ctx; char *ev = e->value ? e->value : ""; char *v = fz_strdup(ctx, ev); @@ -894,7 +897,7 @@ void pdf_js_execute(pdf_js *js, char *code) { if (js) { - fz_context *ctx = js->doc->ctx; + fz_context *ctx = js->ctx; fz_try(ctx) { pdf_jsimp_execute(js->imp, code); @@ -909,7 +912,7 @@ void pdf_js_execute_count(pdf_js *js, char *code, int count) { if (js) { - fz_context *ctx = js->doc->ctx; + fz_context *ctx = js->ctx; fz_try(ctx) { pdf_jsimp_execute_count(js->imp, code, count); @@ -920,23 +923,23 @@ void pdf_js_execute_count(pdf_js *js, char *code, int count) } } -void pdf_enable_js(pdf_document *doc) +void pdf_enable_js(fz_context *ctx, pdf_document *doc) { if (!doc->js) { - doc->js = pdf_new_js(doc); + doc->js = pdf_new_js(ctx, doc); doc->drop_js = pdf_drop_js; pdf_js_load_document_level(doc->js); } } -void pdf_disable_js(pdf_document *doc) +void pdf_disable_js(fz_context *ctx, pdf_document *doc) { if (doc->js) doc->drop_js(doc->js); doc->js = NULL; } -int pdf_js_supported(pdf_document *doc) +int pdf_js_supported(fz_context *ctx, pdf_document *doc) { return doc->js != NULL; } diff --git a/source/pdf/pdf-annot-edit.c b/source/pdf/pdf-annot-edit.c index 719f92bd..565e3171 100644 --- a/source/pdf/pdf-annot-edit.c +++ b/source/pdf/pdf-annot-edit.c @@ -36,48 +36,47 @@ static const char *annot_type_str(fz_annot_type type) } void -pdf_update_annot(pdf_document *doc, pdf_annot *annot) +pdf_update_annot(fz_context *ctx, pdf_document *doc, pdf_annot *annot) { pdf_obj *obj, *ap, *as, *n; - fz_context *ctx = doc->ctx; if (doc->update_appearance) - doc->update_appearance(doc, annot); + doc->update_appearance(ctx, doc, annot); obj = annot->obj; - ap = pdf_dict_gets(obj, "AP"); - as = pdf_dict_gets(obj, "AS"); + ap = pdf_dict_gets(ctx, obj, "AP"); + as = pdf_dict_gets(ctx, obj, "AS"); - if (pdf_is_dict(ap)) + if (pdf_is_dict(ctx, ap)) { pdf_hotspot *hp = &doc->hotspot; n = NULL; - if (hp->num == pdf_to_num(obj) - && hp->gen == pdf_to_gen(obj) + if (hp->num == pdf_to_num(ctx, obj) + && hp->gen == pdf_to_gen(ctx, obj) && (hp->state & HOTSPOT_POINTER_DOWN)) { - n = pdf_dict_gets(ap, "D"); /* down state */ + n = pdf_dict_gets(ctx, ap, "D"); /* down state */ } if (n == NULL) - n = pdf_dict_gets(ap, "N"); /* normal state */ + n = pdf_dict_gets(ctx, ap, "N"); /* normal state */ /* lookup current state in sub-dictionary */ - if (!pdf_is_stream(doc, pdf_to_num(n), pdf_to_gen(n))) - n = pdf_dict_get(n, as); + if (!pdf_is_stream(ctx, doc, pdf_to_num(ctx, n), pdf_to_gen(ctx, n))) + n = pdf_dict_get(ctx, n, as); pdf_drop_xobject(ctx, annot->ap); annot->ap = NULL; - if (pdf_is_stream(doc, pdf_to_num(n), pdf_to_gen(n))) + if (pdf_is_stream(ctx, doc, pdf_to_num(ctx, n), pdf_to_gen(ctx, n))) { fz_try(ctx) { - annot->ap = pdf_load_xobject(doc, n); - pdf_transform_annot(annot); + annot->ap = pdf_load_xobject(ctx, doc, n); + pdf_transform_annot(ctx, annot); annot->ap_iteration = annot->ap->iteration; } fz_catch(ctx) @@ -90,11 +89,10 @@ pdf_update_annot(pdf_document *doc, pdf_annot *annot) } pdf_annot * -pdf_create_annot(pdf_document *doc, pdf_page *page, fz_annot_type type) +pdf_create_annot(fz_context *ctx, pdf_document *doc, pdf_page *page, fz_annot_type type) { - fz_context *ctx = doc->ctx; pdf_annot *annot = NULL; - pdf_obj *annot_obj = pdf_new_dict(doc, 0); + pdf_obj *annot_obj = pdf_new_dict(ctx, doc, 0); pdf_obj *ind_obj = NULL; fz_var(annot); @@ -104,20 +102,20 @@ pdf_create_annot(pdf_document *doc, pdf_page *page, fz_annot_type type) int ind_obj_num; fz_rect rect = {0.0, 0.0, 0.0, 0.0}; const char *type_str = annot_type_str(type); - pdf_obj *annot_arr = pdf_dict_gets(page->me, "Annots"); + pdf_obj *annot_arr = pdf_dict_gets(ctx, page->me, "Annots"); if (annot_arr == NULL) { - annot_arr = pdf_new_array(doc, 0); - pdf_dict_puts_drop(page->me, "Annots", annot_arr); + annot_arr = pdf_new_array(ctx, doc, 0); + pdf_dict_puts_drop(ctx, page->me, "Annots", annot_arr); } - pdf_dict_puts_drop(annot_obj, "Type", pdf_new_name(doc, "Annot")); + pdf_dict_puts_drop(ctx, annot_obj, "Type", pdf_new_name(ctx, doc, "Annot")); - pdf_dict_puts_drop(annot_obj, "Subtype", pdf_new_name(doc, type_str)); - pdf_dict_puts_drop(annot_obj, "Rect", pdf_new_rect(doc, &rect)); + pdf_dict_puts_drop(ctx, annot_obj, "Subtype", pdf_new_name(ctx, doc, type_str)); + pdf_dict_puts_drop(ctx, annot_obj, "Rect", pdf_new_rect(ctx, doc, &rect)); /* Make printable as default */ - pdf_dict_puts_drop(annot_obj, "F", pdf_new_int(doc, F_Print)); + pdf_dict_puts_drop(ctx, annot_obj, "F", pdf_new_int(ctx, doc, F_Print)); annot = fz_malloc_struct(ctx, pdf_annot); annot->page = page; @@ -132,11 +130,11 @@ pdf_create_annot(pdf_document *doc, pdf_page *page, fz_annot_type type) Insert the object in the hierarchy and the structure in the page's array. */ - ind_obj_num = pdf_create_object(doc); - pdf_update_object(doc, ind_obj_num, annot_obj); - ind_obj = pdf_new_indirect(doc, ind_obj_num, 0); - pdf_array_push(annot_arr, ind_obj); - annot->obj = pdf_keep_obj(ind_obj); + ind_obj_num = pdf_create_object(ctx, doc); + pdf_update_object(ctx, doc, ind_obj_num, annot_obj); + ind_obj = pdf_new_indirect(ctx, doc, ind_obj_num, 0); + pdf_array_push(ctx, annot_arr, ind_obj); + annot->obj = pdf_keep_obj(ctx, ind_obj); /* Linking must be done after any call that might throw because @@ -150,8 +148,8 @@ pdf_create_annot(pdf_document *doc, pdf_page *page, fz_annot_type type) } fz_always(ctx) { - pdf_drop_obj(annot_obj); - pdf_drop_obj(ind_obj); + pdf_drop_obj(ctx, annot_obj); + pdf_drop_obj(ctx, ind_obj); } fz_catch(ctx) { @@ -163,9 +161,8 @@ pdf_create_annot(pdf_document *doc, pdf_page *page, fz_annot_type type) } void -pdf_delete_annot(pdf_document *doc, pdf_page *page, pdf_annot *annot) +pdf_delete_annot(fz_context *ctx, pdf_document *doc, pdf_page *page, pdf_annot *annot) { - fz_context *ctx = doc->ctx; pdf_annot **annotptr; pdf_obj *old_annot_arr; pdf_obj *annot_arr; @@ -197,34 +194,34 @@ pdf_delete_annot(pdf_document *doc, pdf_page *page, pdf_annot *annot) annot->ap = NULL; /* Recreate the "Annots" array with this annot removed */ - old_annot_arr = pdf_dict_gets(page->me, "Annots"); + old_annot_arr = pdf_dict_gets(ctx, page->me, "Annots"); if (old_annot_arr) { - int i, n = pdf_array_len(old_annot_arr); - annot_arr = pdf_new_array(doc, n?(n-1):0); + int i, n = pdf_array_len(ctx, old_annot_arr); + annot_arr = pdf_new_array(ctx, doc, n?(n-1):0); fz_try(ctx) { for (i = 0; i < n; i++) { - pdf_obj *obj = pdf_array_get(old_annot_arr, i); + pdf_obj *obj = pdf_array_get(ctx, old_annot_arr, i); if (obj != annot->obj) - pdf_array_push(annot_arr, obj); + pdf_array_push(ctx, annot_arr, obj); } - if (pdf_is_indirect(old_annot_arr)) - pdf_update_object(doc, pdf_to_num(old_annot_arr), annot_arr); + if (pdf_is_indirect(ctx, old_annot_arr)) + pdf_update_object(ctx, doc, pdf_to_num(ctx, old_annot_arr), annot_arr); else - pdf_dict_puts(page->me, "Annots", annot_arr); + pdf_dict_puts(ctx, page->me, "Annots", annot_arr); - if (pdf_is_indirect(annot->obj)) - pdf_delete_object(doc, pdf_to_num(annot->obj)); + if (pdf_is_indirect(ctx, annot->obj)) + pdf_delete_object(ctx, doc, pdf_to_num(ctx, annot->obj)); } fz_always(ctx) { - pdf_drop_obj(annot_arr); + pdf_drop_obj(ctx, annot_arr); } fz_catch(ctx) { @@ -232,21 +229,21 @@ pdf_delete_annot(pdf_document *doc, pdf_page *page, pdf_annot *annot) } } - pdf_drop_obj(annot->obj); + pdf_drop_obj(ctx, annot->obj); annot->obj = NULL; doc->dirty = 1; } void -pdf_set_markup_annot_quadpoints(pdf_document *doc, pdf_annot *annot, fz_point *qp, int n) +pdf_set_markup_annot_quadpoints(fz_context *ctx, pdf_document *doc, pdf_annot *annot, fz_point *qp, int n) { fz_matrix ctm; - pdf_obj *arr = pdf_new_array(doc, n*2); + pdf_obj *arr = pdf_new_array(ctx, doc, n*2); int i; fz_invert_matrix(&ctm, &annot->page->ctm); - pdf_dict_puts_drop(annot->obj, "QuadPoints", arr); + pdf_dict_puts_drop(ctx, annot->obj, "QuadPoints", arr); for (i = 0; i < n; i++) { @@ -254,40 +251,39 @@ pdf_set_markup_annot_quadpoints(pdf_document *doc, pdf_annot *annot, fz_point *q pdf_obj *r; fz_transform_point(&pt, &ctm); - r = pdf_new_real(doc, pt.x); - pdf_array_push_drop(arr, r); - r = pdf_new_real(doc, pt.y); - pdf_array_push_drop(arr, r); + r = pdf_new_real(ctx, doc, pt.x); + pdf_array_push_drop(ctx, arr, r); + r = pdf_new_real(ctx, doc, pt.y); + pdf_array_push_drop(ctx, arr, r); } } static void update_rect(fz_context *ctx, pdf_annot *annot) { - pdf_to_rect(ctx, pdf_dict_gets(annot->obj, "Rect"), &annot->rect); + pdf_to_rect(ctx, pdf_dict_gets(ctx, annot->obj, "Rect"), &annot->rect); annot->pagerect = annot->rect; fz_transform_rect(&annot->pagerect, &annot->page->ctm); } void -pdf_set_ink_annot_list(pdf_document *doc, pdf_annot *annot, fz_point *pts, int *counts, int ncount, float color[3], float thickness) +pdf_set_ink_annot_list(fz_context *ctx, pdf_document *doc, pdf_annot *annot, fz_point *pts, int *counts, int ncount, float color[3], float thickness) { - fz_context *ctx = doc->ctx; fz_matrix ctm; - pdf_obj *list = pdf_new_array(doc, ncount); + pdf_obj *list = pdf_new_array(ctx, doc, ncount); pdf_obj *bs, *col; fz_rect rect; int i, k = 0; fz_invert_matrix(&ctm, &annot->page->ctm); - pdf_dict_puts_drop(annot->obj, "InkList", list); + pdf_dict_puts_drop(ctx, annot->obj, "InkList", list); for (i = 0; i < ncount; i++) { int j; - pdf_obj *arc = pdf_new_array(doc, counts[i]); + pdf_obj *arc = pdf_new_array(ctx, doc, counts[i]); - pdf_array_push_drop(list, arc); + pdf_array_push_drop(ctx, list, arc); for (j = 0; j < counts[i]; j++) { @@ -305,8 +301,8 @@ pdf_set_ink_annot_list(pdf_document *doc, pdf_annot *annot, fz_point *pts, int * fz_include_point_in_rect(&rect, &pt); } - pdf_array_push_drop(arc, pdf_new_real(doc, pt.x)); - pdf_array_push_drop(arc, pdf_new_real(doc, pt.y)); + pdf_array_push_drop(ctx, arc, pdf_new_real(ctx, doc, pt.x)); + pdf_array_push_drop(ctx, arc, pdf_new_real(ctx, doc, pt.y)); k++; } } @@ -324,20 +320,20 @@ pdf_set_ink_annot_list(pdf_document *doc, pdf_annot *annot, fz_point *pts, int * rect.y1 += thickness; } - pdf_dict_puts_drop(annot->obj, "Rect", pdf_new_rect(doc, &rect)); + pdf_dict_puts_drop(ctx, annot->obj, "Rect", pdf_new_rect(ctx, doc, &rect)); update_rect(ctx, annot); - bs = pdf_new_dict(doc, 1); - pdf_dict_puts_drop(annot->obj, "BS", bs); - pdf_dict_puts_drop(bs, "W", pdf_new_real(doc, thickness)); + bs = pdf_new_dict(ctx, doc, 1); + pdf_dict_puts_drop(ctx, annot->obj, "BS", bs); + pdf_dict_puts_drop(ctx, bs, "W", pdf_new_real(ctx, doc, thickness)); - col = pdf_new_array(doc, 3); - pdf_dict_puts_drop(annot->obj, "C", col); + col = pdf_new_array(ctx, doc, 3); + pdf_dict_puts_drop(ctx, annot->obj, "C", col); for (i = 0; i < 3; i++) - pdf_array_push_drop(col, pdf_new_real(doc, color[i])); + pdf_array_push_drop(ctx, col, pdf_new_real(ctx, doc, color[i])); } -static void find_free_font_name(pdf_obj *fdict, char *buf, int buf_size) +static void find_free_font_name(fz_context *ctx, pdf_obj *fdict, char *buf, int buf_size) { int i; @@ -346,12 +342,12 @@ static void find_free_font_name(pdf_obj *fdict, char *buf, int buf_size) { snprintf(buf, buf_size, "F%d", i); - if (!pdf_dict_gets(fdict, buf)) + if (!pdf_dict_gets(ctx, fdict, buf)) break; } } -void pdf_set_text_annot_position(pdf_document *doc, pdf_annot *annot, fz_point pt) +void pdf_set_text_annot_position(fz_context *ctx, pdf_document *doc, pdf_annot *annot, fz_point pt) { fz_matrix ctm; fz_rect rect; @@ -364,28 +360,27 @@ void pdf_set_text_annot_position(pdf_document *doc, pdf_annot *annot, fz_point p rect.y1 = pt.y + TEXT_ANNOT_SIZE; fz_transform_rect(&rect, &ctm); - pdf_dict_puts_drop(annot->obj, "Rect", pdf_new_rect(doc, &rect)); + pdf_dict_puts_drop(ctx, annot->obj, "Rect", pdf_new_rect(ctx, doc, &rect)); - flags = pdf_to_int(pdf_dict_gets(annot->obj, "F")); + flags = pdf_to_int(ctx, pdf_dict_gets(ctx, annot->obj, "F")); flags |= (F_NoZoom|F_NoRotate); - pdf_dict_puts_drop(annot->obj, "F", pdf_new_int(doc, flags)); + pdf_dict_puts_drop(ctx, annot->obj, "F", pdf_new_int(ctx, doc, flags)); - update_rect(doc->ctx, annot); + update_rect(ctx, annot); } -void pdf_set_annot_contents(pdf_document *doc, pdf_annot *annot, char *text) +void pdf_set_annot_contents(fz_context *ctx, pdf_document *doc, pdf_annot *annot, char *text) { - pdf_dict_puts_drop(annot->obj, "Contents", pdf_new_string(doc, text, strlen(text))); + pdf_dict_puts_drop(ctx, annot->obj, "Contents", pdf_new_string(ctx, doc, text, strlen(text))); } -char *pdf_annot_contents(pdf_document *doc, pdf_annot *annot) +char *pdf_annot_contents(fz_context *ctx, pdf_document *doc, pdf_annot *annot) { - return pdf_to_str_buf(pdf_dict_getp(annot->obj, "Contents")); + return pdf_to_str_buf(ctx, pdf_dict_getp(ctx, annot->obj, "Contents")); } -void pdf_set_free_text_details(pdf_document *doc, pdf_annot *annot, fz_point *pos, char *text, char *font_name, float font_size, float color[3]) +void pdf_set_free_text_details(fz_context *ctx, pdf_document *doc, pdf_annot *annot, fz_point *pos, char *text, char *font_name, float font_size, float color[3]) { - fz_context *ctx = doc->ctx; char nbuf[32]; pdf_obj *dr; pdf_obj *form_fonts; @@ -399,19 +394,19 @@ void pdf_set_free_text_details(pdf_document *doc, pdf_annot *annot, fz_point *po fz_invert_matrix(&ctm, &annot->page->ctm); - dr = pdf_dict_gets(annot->page->me, "Resources"); + dr = pdf_dict_gets(ctx, annot->page->me, "Resources"); if (!dr) { - dr = pdf_new_dict(doc, 1); - pdf_dict_putp_drop(annot->page->me, "Resources", dr); + dr = pdf_new_dict(ctx, doc, 1); + pdf_dict_putp_drop(ctx, annot->page->me, "Resources", dr); } /* Ensure the resource dictionary includes a font dict */ - form_fonts = pdf_dict_gets(dr, "Font"); + form_fonts = pdf_dict_gets(ctx, dr, "Font"); if (!form_fonts) { - form_fonts = pdf_new_dict(doc, 1); - pdf_dict_puts_drop(dr, "Font", form_fonts); + form_fonts = pdf_new_dict(ctx, doc, 1); + pdf_dict_puts_drop(ctx, dr, "Font", form_fonts); /* form_fonts is still valid if execution continues past the above call */ } @@ -423,16 +418,16 @@ void pdf_set_free_text_details(pdf_document *doc, pdf_annot *annot, fz_point *po int da_len; fz_rect bounds; - find_free_font_name(form_fonts, nbuf, sizeof(nbuf)); + find_free_font_name(ctx, form_fonts, nbuf, sizeof(nbuf)); - font = pdf_new_dict(doc, 5); - ref = pdf_new_ref(doc, font); - pdf_dict_puts_drop(form_fonts, nbuf, ref); + font = pdf_new_dict(ctx, doc, 5); + ref = pdf_new_ref(ctx, doc, font); + pdf_dict_puts_drop(ctx, form_fonts, nbuf, ref); - pdf_dict_puts_drop(font, "Type", pdf_new_name(doc, "Font")); - pdf_dict_puts_drop(font, "Subtype", pdf_new_name(doc, "Type1")); - pdf_dict_puts_drop(font, "BaseFont", pdf_new_name(doc, font_name)); - pdf_dict_puts_drop(font, "Encoding", pdf_new_name(doc, "WinAnsiEncoding")); + pdf_dict_puts_drop(ctx, font, "Type", pdf_new_name(ctx, doc, "Font")); + pdf_dict_puts_drop(ctx, font, "Subtype", pdf_new_name(ctx, doc, "Type1")); + pdf_dict_puts_drop(ctx, font, "BaseFont", pdf_new_name(ctx, doc, font_name)); + pdf_dict_puts_drop(ctx, font, "Encoding", pdf_new_name(ctx, doc, "WinAnsiEncoding")); memcpy(da_info.col, color, sizeof(float)*3); da_info.col_size = 3; @@ -443,12 +438,12 @@ void pdf_set_free_text_details(pdf_document *doc, pdf_annot *annot, fz_point *po pdf_fzbuf_print_da(ctx, fzbuf, &da_info); da_len = fz_buffer_storage(ctx, fzbuf, &da_str); - pdf_dict_puts_drop(annot->obj, "DA", pdf_new_string(doc, (char *)da_str, da_len)); + pdf_dict_puts_drop(ctx, annot->obj, "DA", pdf_new_string(ctx, doc, (char *)da_str, da_len)); /* FIXME: should convert to WinAnsiEncoding */ - pdf_dict_puts_drop(annot->obj, "Contents", pdf_new_string(doc, text, strlen(text))); + pdf_dict_puts_drop(ctx, annot->obj, "Contents", pdf_new_string(ctx, doc, text, strlen(text))); - font_desc = pdf_load_font(doc, NULL, font, 0); + font_desc = pdf_load_font(ctx, doc, NULL, font, 0); pdf_measure_text(ctx, font_desc, (unsigned char *)text, strlen(text), &bounds); page_pos = *pos; @@ -464,12 +459,12 @@ void pdf_set_free_text_details(pdf_document *doc, pdf_annot *annot, fz_point *po bounds.y0 += page_pos.y; bounds.y1 += page_pos.y; - pdf_dict_puts_drop(annot->obj, "Rect", pdf_new_rect(doc, &bounds)); + pdf_dict_puts_drop(ctx, annot->obj, "Rect", pdf_new_rect(ctx, doc, &bounds)); update_rect(ctx, annot); } fz_always(ctx) { - pdf_drop_obj(font); + pdf_drop_obj(ctx, font); fz_drop_buffer(ctx, fzbuf); pdf_drop_font(ctx, font_desc); } diff --git a/source/pdf/pdf-annot.c b/source/pdf/pdf-annot.c index 72f5cd8e..b25c24df 100644 --- a/source/pdf/pdf-annot.c +++ b/source/pdf/pdf-annot.c @@ -1,47 +1,47 @@ #include "mupdf/pdf.h" static pdf_obj * -resolve_dest_rec(pdf_document *doc, pdf_obj *dest, fz_link_kind kind, int depth) +resolve_dest_rec(fz_context *ctx, pdf_document *doc, pdf_obj *dest, fz_link_kind kind, int depth) { if (depth > 10) /* Arbitrary to avoid infinite recursion */ return NULL; - if (pdf_is_name(dest) || pdf_is_string(dest)) + if (pdf_is_name(ctx, dest) || pdf_is_string(ctx, dest)) { if (kind == FZ_LINK_GOTO) { - dest = pdf_lookup_dest(doc, dest); - dest = resolve_dest_rec(doc, dest, kind, depth+1); + dest = pdf_lookup_dest(ctx, doc, dest); + dest = resolve_dest_rec(ctx, doc, dest, kind, depth+1); } return dest; } - else if (pdf_is_array(dest)) + else if (pdf_is_array(ctx, dest)) { return dest; } - else if (pdf_is_dict(dest)) + else if (pdf_is_dict(ctx, dest)) { - dest = pdf_dict_gets(dest, "D"); - return resolve_dest_rec(doc, dest, kind, depth+1); + dest = pdf_dict_gets(ctx, dest, "D"); + return resolve_dest_rec(ctx, doc, dest, kind, depth+1); } - else if (pdf_is_indirect(dest)) + else if (pdf_is_indirect(ctx, dest)) return dest; return NULL; } static pdf_obj * -resolve_dest(pdf_document *doc, pdf_obj *dest, fz_link_kind kind) +resolve_dest(fz_context *ctx, pdf_document *doc, pdf_obj *dest, fz_link_kind kind) { - return resolve_dest_rec(doc, dest, kind, 0); + return resolve_dest_rec(ctx, doc, dest, kind, 0); } fz_link_dest -pdf_parse_link_dest(pdf_document *doc, fz_link_kind kind, pdf_obj *dest) +pdf_parse_link_dest(fz_context *ctx, pdf_document *doc, fz_link_kind kind, pdf_obj *dest) { fz_link_dest ld; pdf_obj *obj; @@ -63,65 +63,65 @@ pdf_parse_link_dest(pdf_document *doc, fz_link_kind kind, pdf_obj *dest) ld.ld.gotor.page = -1; ld.ld.gotor.dest = NULL; - dest = resolve_dest(doc, dest, kind); + dest = resolve_dest(ctx, doc, dest, kind); if (dest == NULL) { - fz_warn(doc->ctx, "undefined link destination"); + fz_warn(ctx, "undefined link destination"); return ld; } - if (pdf_is_name(dest)) + if (pdf_is_name(ctx, dest)) { - ld.ld.gotor.dest = pdf_to_name(dest); + ld.ld.gotor.dest = pdf_to_name(ctx, dest); return ld; } - else if (pdf_is_string(dest)) + else if (pdf_is_string(ctx, dest)) { - ld.ld.gotor.dest = pdf_to_str_buf(dest); + ld.ld.gotor.dest = pdf_to_str_buf(ctx, dest); return ld; } - obj = pdf_array_get(dest, 0); - if (pdf_is_int(obj)) - ld.ld.gotor.page = pdf_to_int(obj); + obj = pdf_array_get(ctx, dest, 0); + if (pdf_is_int(ctx, obj)) + ld.ld.gotor.page = pdf_to_int(ctx, obj); else { - fz_try(doc->ctx) + fz_try(ctx) { - ld.ld.gotor.page = pdf_lookup_page_number(doc, obj); + ld.ld.gotor.page = pdf_lookup_page_number(ctx, doc, obj); } - fz_catch(doc->ctx) + fz_catch(ctx) { ld.kind = FZ_LINK_NONE; return ld; } } - obj = pdf_array_get(dest, 1); - if (!pdf_is_name(obj)) + obj = pdf_array_get(ctx, dest, 1); + if (!pdf_is_name(ctx, obj)) return ld; - if (!strcmp("XYZ", pdf_to_name(obj))) + if (!strcmp("XYZ", pdf_to_name(ctx, obj))) { l_from_2 = t_from_3 = z_from_4 = 1; ld.ld.gotor.flags |= fz_link_flag_r_is_zoom; } - else if ((!strcmp("Fit", pdf_to_name(obj))) || (!strcmp("FitB", pdf_to_name(obj)))) + else if ((!strcmp("Fit", pdf_to_name(ctx, obj))) || (!strcmp("FitB", pdf_to_name(ctx, obj)))) { ld.ld.gotor.flags |= fz_link_flag_fit_h; ld.ld.gotor.flags |= fz_link_flag_fit_v; } - else if ((!strcmp("FitH", pdf_to_name(obj))) || (!strcmp("FitBH", pdf_to_name(obj)))) + else if ((!strcmp("FitH", pdf_to_name(ctx, obj))) || (!strcmp("FitBH", pdf_to_name(ctx, obj)))) { t_from_2 = 1; ld.ld.gotor.flags |= fz_link_flag_fit_h; } - else if ((!strcmp("FitV", pdf_to_name(obj))) || (!strcmp("FitBV", pdf_to_name(obj)))) + else if ((!strcmp("FitV", pdf_to_name(ctx, obj))) || (!strcmp("FitBV", pdf_to_name(ctx, obj)))) { l_from_2 = 1; ld.ld.gotor.flags |= fz_link_flag_fit_v; } - else if (!strcmp("FitR", pdf_to_name(obj))) + else if (!strcmp("FitR", pdf_to_name(ctx, obj))) { l_from_2 = b_from_3 = r_from_4 = t_from_5 = 1; ld.ld.gotor.flags |= fz_link_flag_fit_h; @@ -130,77 +130,77 @@ pdf_parse_link_dest(pdf_document *doc, fz_link_kind kind, pdf_obj *dest) if (l_from_2) { - obj = pdf_array_get(dest, 2); - if (pdf_is_int(obj)) + obj = pdf_array_get(ctx, dest, 2); + if (pdf_is_int(ctx, obj)) { ld.ld.gotor.flags |= fz_link_flag_l_valid; - ld.ld.gotor.lt.x = pdf_to_int(obj); + ld.ld.gotor.lt.x = pdf_to_int(ctx, obj); } - else if (pdf_is_real(obj)) + else if (pdf_is_real(ctx, obj)) { ld.ld.gotor.flags |= fz_link_flag_l_valid; - ld.ld.gotor.lt.x = pdf_to_real(obj); + ld.ld.gotor.lt.x = pdf_to_real(ctx, obj); } } if (b_from_3) { - obj = pdf_array_get(dest, 3); - if (pdf_is_int(obj)) + obj = pdf_array_get(ctx, dest, 3); + if (pdf_is_int(ctx, obj)) { ld.ld.gotor.flags |= fz_link_flag_b_valid; - ld.ld.gotor.rb.y = pdf_to_int(obj); + ld.ld.gotor.rb.y = pdf_to_int(ctx, obj); } - else if (pdf_is_real(obj)) + else if (pdf_is_real(ctx, obj)) { ld.ld.gotor.flags |= fz_link_flag_b_valid; - ld.ld.gotor.rb.y = pdf_to_real(obj); + ld.ld.gotor.rb.y = pdf_to_real(ctx, obj); } } if (r_from_4) { - obj = pdf_array_get(dest, 4); - if (pdf_is_int(obj)) + obj = pdf_array_get(ctx, dest, 4); + if (pdf_is_int(ctx, obj)) { ld.ld.gotor.flags |= fz_link_flag_r_valid; - ld.ld.gotor.rb.x = pdf_to_int(obj); + ld.ld.gotor.rb.x = pdf_to_int(ctx, obj); } - else if (pdf_is_real(obj)) + else if (pdf_is_real(ctx, obj)) { ld.ld.gotor.flags |= fz_link_flag_r_valid; - ld.ld.gotor.rb.x = pdf_to_real(obj); + ld.ld.gotor.rb.x = pdf_to_real(ctx, obj); } } if (t_from_5 || t_from_3 || t_from_2) { if (t_from_5) - obj = pdf_array_get(dest, 5); + obj = pdf_array_get(ctx, dest, 5); else if (t_from_3) - obj = pdf_array_get(dest, 3); + obj = pdf_array_get(ctx, dest, 3); else - obj = pdf_array_get(dest, 2); - if (pdf_is_int(obj)) + obj = pdf_array_get(ctx, dest, 2); + if (pdf_is_int(ctx, obj)) { ld.ld.gotor.flags |= fz_link_flag_t_valid; - ld.ld.gotor.lt.y = pdf_to_int(obj); + ld.ld.gotor.lt.y = pdf_to_int(ctx, obj); } - else if (pdf_is_real(obj)) + else if (pdf_is_real(ctx, obj)) { ld.ld.gotor.flags |= fz_link_flag_t_valid; - ld.ld.gotor.lt.y = pdf_to_real(obj); + ld.ld.gotor.lt.y = pdf_to_real(ctx, obj); } } if (z_from_4) { - obj = pdf_array_get(dest, 4); - if (pdf_is_int(obj)) + obj = pdf_array_get(ctx, dest, 4); + if (pdf_is_int(ctx, obj)) { ld.ld.gotor.flags |= fz_link_flag_r_valid; - ld.ld.gotor.rb.x = pdf_to_int(obj); + ld.ld.gotor.rb.x = pdf_to_int(ctx, obj); } - else if (pdf_is_real(obj)) + else if (pdf_is_real(ctx, obj)) { ld.ld.gotor.flags |= fz_link_flag_r_valid; - ld.ld.gotor.rb.x = pdf_to_real(obj); + ld.ld.gotor.rb.x = pdf_to_real(ctx, obj); } } @@ -218,26 +218,25 @@ pdf_parse_link_dest(pdf_document *doc, fz_link_kind kind, pdf_obj *dest) } static char * -pdf_parse_file_spec(pdf_document *doc, pdf_obj *file_spec) +pdf_parse_file_spec(fz_context *ctx, pdf_document *doc, pdf_obj *file_spec) { - fz_context *ctx = doc->ctx; pdf_obj *filename; - if (pdf_is_string(file_spec)) - return pdf_to_utf8(doc, file_spec); + if (pdf_is_string(ctx, file_spec)) + return pdf_to_utf8(ctx, doc, file_spec); - if (pdf_is_dict(file_spec)) { - filename = pdf_dict_gets(file_spec, "UF"); + if (pdf_is_dict(ctx, file_spec)) { + filename = pdf_dict_gets(ctx, file_spec, "UF"); if (!filename) - filename = pdf_dict_gets(file_spec, "F"); + filename = pdf_dict_gets(ctx, file_spec, "F"); if (!filename) - filename = pdf_dict_gets(file_spec, "Unix"); + filename = pdf_dict_gets(ctx, file_spec, "Unix"); if (!filename) - filename = pdf_dict_gets(file_spec, "Mac"); + filename = pdf_dict_gets(ctx, file_spec, "Mac"); if (!filename) - filename = pdf_dict_gets(file_spec, "DOS"); + filename = pdf_dict_gets(ctx, file_spec, "DOS"); - return pdf_to_utf8(doc, filename); + return pdf_to_utf8(ctx, doc, filename); } fz_warn(ctx, "cannot parse file specification"); @@ -245,65 +244,61 @@ pdf_parse_file_spec(pdf_document *doc, pdf_obj *file_spec) } fz_link_dest -pdf_parse_action(pdf_document *doc, pdf_obj *action) +pdf_parse_action(fz_context *ctx, pdf_document *doc, pdf_obj *action) { fz_link_dest ld; pdf_obj *obj, *dest, *file_spec; - fz_context *ctx = doc->ctx; - - UNUSED(ctx); ld.kind = FZ_LINK_NONE; if (!action) return ld; - obj = pdf_dict_gets(action, "S"); - if (!strcmp(pdf_to_name(obj), "GoTo")) + obj = pdf_dict_gets(ctx, action, "S"); + if (!strcmp(pdf_to_name(ctx, obj), "GoTo")) { - dest = pdf_dict_gets(action, "D"); - ld = pdf_parse_link_dest(doc, FZ_LINK_GOTO, dest); + dest = pdf_dict_gets(ctx, action, "D"); + ld = pdf_parse_link_dest(ctx, doc, FZ_LINK_GOTO, dest); } - else if (!strcmp(pdf_to_name(obj), "URI")) + else if (!strcmp(pdf_to_name(ctx, obj), "URI")) { ld.kind = FZ_LINK_URI; - ld.ld.uri.is_map = pdf_to_bool(pdf_dict_gets(action, "IsMap")); - ld.ld.uri.uri = pdf_to_utf8(doc, pdf_dict_gets(action, "URI")); + ld.ld.uri.is_map = pdf_to_bool(ctx, pdf_dict_gets(ctx, action, "IsMap")); + ld.ld.uri.uri = pdf_to_utf8(ctx, doc, pdf_dict_gets(ctx, action, "URI")); } - else if (!strcmp(pdf_to_name(obj), "Launch")) + else if (!strcmp(pdf_to_name(ctx, obj), "Launch")) { ld.kind = FZ_LINK_LAUNCH; - file_spec = pdf_dict_gets(action, "F"); - ld.ld.launch.file_spec = pdf_parse_file_spec(doc, file_spec); - ld.ld.launch.new_window = pdf_to_int(pdf_dict_gets(action, "NewWindow")); - ld.ld.launch.is_uri = !strcmp(pdf_to_name(pdf_dict_gets(file_spec, "FS")), "URL"); + file_spec = pdf_dict_gets(ctx, action, "F"); + ld.ld.launch.file_spec = pdf_parse_file_spec(ctx, doc, file_spec); + ld.ld.launch.new_window = pdf_to_int(ctx, pdf_dict_gets(ctx, action, "NewWindow")); + ld.ld.launch.is_uri = !strcmp(pdf_to_name(ctx, pdf_dict_gets(ctx, file_spec, "FS")), "URL"); } - else if (!strcmp(pdf_to_name(obj), "Named")) + else if (!strcmp(pdf_to_name(ctx, obj), "Named")) { ld.kind = FZ_LINK_NAMED; - ld.ld.named.named = fz_strdup(ctx, pdf_to_name(pdf_dict_gets(action, "N"))); + ld.ld.named.named = fz_strdup(ctx, pdf_to_name(ctx, pdf_dict_gets(ctx, action, "N"))); } - else if (!strcmp(pdf_to_name(obj), "GoToR")) + else if (!strcmp(pdf_to_name(ctx, obj), "GoToR")) { - dest = pdf_dict_gets(action, "D"); - file_spec = pdf_dict_gets(action, "F"); - ld = pdf_parse_link_dest(doc, FZ_LINK_GOTOR, dest); - ld.ld.gotor.file_spec = pdf_parse_file_spec(doc, file_spec); - ld.ld.gotor.new_window = pdf_to_int(pdf_dict_gets(action, "NewWindow")); + dest = pdf_dict_gets(ctx, action, "D"); + file_spec = pdf_dict_gets(ctx, action, "F"); + ld = pdf_parse_link_dest(ctx, doc, FZ_LINK_GOTOR, dest); + ld.ld.gotor.file_spec = pdf_parse_file_spec(ctx, doc, file_spec); + ld.ld.gotor.new_window = pdf_to_int(ctx, pdf_dict_gets(ctx, action, "NewWindow")); } return ld; } static fz_link * -pdf_load_link(pdf_document *doc, pdf_obj *dict, const fz_matrix *page_ctm) +pdf_load_link(fz_context *ctx, pdf_document *doc, pdf_obj *dict, const fz_matrix *page_ctm) { pdf_obj *action; pdf_obj *obj; fz_rect bbox; - fz_context *ctx = doc->ctx; fz_link_dest ld; - obj = pdf_dict_gets(dict, "Rect"); + obj = pdf_dict_gets(ctx, dict, "Rect"); if (obj) pdf_to_rect(ctx, obj, &bbox); else @@ -311,17 +306,17 @@ pdf_load_link(pdf_document *doc, pdf_obj *dict, const fz_matrix *page_ctm) fz_transform_rect(&bbox, page_ctm); - obj = pdf_dict_gets(dict, "Dest"); + obj = pdf_dict_gets(ctx, dict, "Dest"); if (obj) - ld = pdf_parse_link_dest(doc, FZ_LINK_GOTO, obj); + ld = pdf_parse_link_dest(ctx, doc, FZ_LINK_GOTO, obj); else { - action = pdf_dict_gets(dict, "A"); + action = pdf_dict_gets(ctx, dict, "A"); /* fall back to additional action button's down/up action */ if (!action) - action = pdf_dict_getsa(pdf_dict_gets(dict, "AA"), "U", "D"); + action = pdf_dict_getsa(ctx, pdf_dict_gets(ctx, dict, "AA"), "U", "D"); - ld = pdf_parse_action(doc, action); + ld = pdf_parse_action(ctx, doc, action); } if (ld.kind == FZ_LINK_NONE) return NULL; @@ -329,7 +324,7 @@ pdf_load_link(pdf_document *doc, pdf_obj *dict, const fz_matrix *page_ctm) } fz_link * -pdf_load_link_annots(pdf_document *doc, pdf_obj *annots, const fz_matrix *page_ctm) +pdf_load_link_annots(fz_context *ctx, pdf_document *doc, pdf_obj *annots, const fz_matrix *page_ctm) { fz_link *link, *head, *tail; pdf_obj *obj; @@ -338,18 +333,18 @@ pdf_load_link_annots(pdf_document *doc, pdf_obj *annots, const fz_matrix *page_c head = tail = NULL; link = NULL; - n = pdf_array_len(annots); + n = pdf_array_len(ctx, annots); for (i = 0; i < n; i++) { /* FIXME: Move the try/catch out of the loop for performance? */ - fz_try(doc->ctx) + fz_try(ctx) { - obj = pdf_array_get(annots, i); - link = pdf_load_link(doc, obj, page_ctm); + obj = pdf_array_get(ctx, annots, i); + link = pdf_load_link(ctx, doc, obj, page_ctm); } - fz_catch(doc->ctx) + fz_catch(ctx) { - fz_rethrow_if(doc->ctx, FZ_ERROR_TRYLATER); + fz_rethrow_if(ctx, FZ_ERROR_TRYLATER); link = NULL; } @@ -378,14 +373,14 @@ pdf_drop_annot(fz_context *ctx, pdf_annot *annot) next = annot->next; if (annot->ap) pdf_drop_xobject(ctx, annot->ap); - pdf_drop_obj(annot->obj); + pdf_drop_obj(ctx, annot->obj); fz_free(ctx, annot); annot = next; } } void -pdf_transform_annot(pdf_annot *annot) +pdf_transform_annot(fz_context *ctx, pdf_annot *annot) { fz_rect bbox = annot->ap->bbox; fz_rect rect = annot->rect; @@ -406,9 +401,9 @@ pdf_transform_annot(pdf_annot *annot) fz_pre_scale(fz_translate(&annot->matrix, x, y), w, h); } -fz_annot_type pdf_annot_obj_type(pdf_obj *obj) +fz_annot_type pdf_annot_obj_type(fz_context *ctx, pdf_obj *obj) { - char *subtype = pdf_to_name(pdf_dict_gets(obj, "Subtype")); + char *subtype = pdf_to_name(ctx, pdf_dict_gets(ctx, obj, "Subtype")); if (!strcmp(subtype, "Text")) return FZ_ANNOT_TEXT; else if (!strcmp(subtype, "Link")) @@ -464,12 +459,11 @@ fz_annot_type pdf_annot_obj_type(pdf_obj *obj) } void -pdf_load_annots(pdf_document *doc, pdf_page *page, pdf_obj *annots) +pdf_load_annots(fz_context *ctx, pdf_document *doc, pdf_page *page, pdf_obj *annots) { pdf_annot *annot, **itr; pdf_obj *obj, *ap, *as, *n, *rect; int i, len, keep_annot; - fz_context *ctx = doc->ctx; fz_var(annot); fz_var(itr); @@ -477,7 +471,7 @@ pdf_load_annots(pdf_document *doc, pdf_page *page, pdf_obj *annots) itr = &page->annots; - len = pdf_array_len(annots); + len = pdf_array_len(ctx, annots); /* Create an initial linked list of pdf_annot structures with only the obj field filled in. We do this because update_appearance has the potential to change @@ -488,9 +482,9 @@ pdf_load_annots(pdf_document *doc, pdf_page *page, pdf_obj *annots) { for (i = 0; i < len; i++) { - obj = pdf_array_get(annots, i); + obj = pdf_array_get(ctx, annots, i); annot = fz_malloc_struct(ctx, pdf_annot); - annot->obj = pdf_keep_obj(obj); + annot->obj = pdf_keep_obj(ctx, obj); annot->page = page; annot->next = NULL; @@ -521,45 +515,45 @@ pdf_load_annots(pdf_document *doc, pdf_page *page, pdf_obj *annots) n = NULL; if (doc->update_appearance) - doc->update_appearance(doc, annot); + doc->update_appearance(ctx, doc, annot); obj = annot->obj; - rect = pdf_dict_gets(obj, "Rect"); - ap = pdf_dict_gets(obj, "AP"); - as = pdf_dict_gets(obj, "AS"); + rect = pdf_dict_gets(ctx, obj, "Rect"); + ap = pdf_dict_gets(ctx, obj, "AP"); + as = pdf_dict_gets(ctx, obj, "AS"); /* We only collect annotations with an appearance * stream into this list, so remove any that don't * (such as links) and continue. */ - keep_annot = pdf_is_dict(ap); + keep_annot = pdf_is_dict(ctx, ap); if (!keep_annot) break; - if (hp->num == pdf_to_num(obj) - && hp->gen == pdf_to_gen(obj) + if (hp->num == pdf_to_num(ctx, obj) + && hp->gen == pdf_to_gen(ctx, obj) && (hp->state & HOTSPOT_POINTER_DOWN)) { - n = pdf_dict_gets(ap, "D"); /* down state */ + n = pdf_dict_gets(ctx, ap, "D"); /* down state */ } if (n == NULL) - n = pdf_dict_gets(ap, "N"); /* normal state */ + n = pdf_dict_gets(ctx, ap, "N"); /* normal state */ /* lookup current state in sub-dictionary */ - if (!pdf_is_stream(doc, pdf_to_num(n), pdf_to_gen(n))) - n = pdf_dict_get(n, as); + if (!pdf_is_stream(ctx, doc, pdf_to_num(ctx, n), pdf_to_gen(ctx, n))) + n = pdf_dict_get(ctx, n, as); pdf_to_rect(ctx, rect, &annot->rect); annot->pagerect = annot->rect; fz_transform_rect(&annot->pagerect, &page->ctm); annot->ap = NULL; - annot->annot_type = pdf_annot_obj_type(obj); - annot->widget_type = annot->annot_type == FZ_ANNOT_WIDGET ? pdf_field_type(doc, obj) : PDF_WIDGET_TYPE_NOT_WIDGET; + annot->annot_type = pdf_annot_obj_type(ctx, obj); + annot->widget_type = annot->annot_type == FZ_ANNOT_WIDGET ? pdf_field_type(ctx, doc, obj) : PDF_WIDGET_TYPE_NOT_WIDGET; - if (pdf_is_stream(doc, pdf_to_num(n), pdf_to_gen(n))) + if (pdf_is_stream(ctx, doc, pdf_to_num(ctx, n), pdf_to_gen(ctx, n))) { - annot->ap = pdf_load_xobject(doc, n); - pdf_transform_annot(annot); + annot->ap = pdf_load_xobject(ctx, doc, n); + pdf_transform_annot(ctx, annot); annot->ap_iteration = annot->ap->iteration; } @@ -593,19 +587,19 @@ pdf_load_annots(pdf_document *doc, pdf_page *page, pdf_obj *annots) } pdf_annot * -pdf_first_annot(pdf_document *doc, pdf_page *page) +pdf_first_annot(fz_context *ctx, pdf_page *page) { return page ? page->annots : NULL; } pdf_annot * -pdf_next_annot(pdf_document *doc, pdf_annot *annot) +pdf_next_annot(fz_context *ctx, pdf_page *page, pdf_annot *annot) { return annot ? annot->next : NULL; } fz_rect * -pdf_bound_annot(pdf_document *doc, pdf_annot *annot, fz_rect *rect) +pdf_bound_annot(fz_context *ctx, pdf_page *page, pdf_annot *annot, fz_rect *rect) { if (rect == NULL) return NULL; @@ -618,7 +612,7 @@ pdf_bound_annot(pdf_document *doc, pdf_annot *annot, fz_rect *rect) } fz_annot_type -pdf_annot_type(pdf_annot *annot) +pdf_annot_type(fz_context *ctx, pdf_annot *annot) { return annot->annot_type; } diff --git a/source/pdf/pdf-appearance.c b/source/pdf/pdf-appearance.c index a8d8d6ef..ce9bdb1f 100644 --- a/source/pdf/pdf-appearance.c +++ b/source/pdf/pdf-appearance.c @@ -93,7 +93,7 @@ void pdf_parse_da(fz_context *ctx, char *da, pdf_da_info *di) fz_var(name); fz_try(ctx) { - for (tok = pdf_lex(str, &lbuf); tok != PDF_TOK_EOF; tok = pdf_lex(str, &lbuf)) + for (tok = pdf_lex(ctx, str, &lbuf); tok != PDF_TOK_EOF; tok = pdf_lex(ctx, str, &lbuf)) { switch (tok) { @@ -147,8 +147,8 @@ void pdf_parse_da(fz_context *ctx, char *da, pdf_da_info *di) fz_always(ctx) { fz_free(ctx, name); - fz_drop_stream(str); - pdf_lexbuf_fin(&lbuf); + fz_drop_stream(ctx, str); + pdf_lexbuf_fin(ctx, &lbuf); } fz_catch(ctx) { @@ -156,16 +156,15 @@ void pdf_parse_da(fz_context *ctx, char *da, pdf_da_info *di) } } -static void get_font_info(pdf_document *doc, pdf_obj *dr, char *da, font_info *font_rec) +static void get_font_info(fz_context *ctx, pdf_document *doc, pdf_obj *dr, char *da, font_info *font_rec) { - fz_context *ctx = doc->ctx; pdf_font_desc *font; pdf_parse_da(ctx, da, &font_rec->da_rec); if (font_rec->da_rec.font_name == NULL) fz_throw(ctx, FZ_ERROR_GENERIC, "No font name in default appearance"); - font_rec->font = font = pdf_load_font(doc, dr, pdf_dict_gets(pdf_dict_gets(dr, "Font"), font_rec->da_rec.font_name), 0); + font_rec->font = font = pdf_load_font(ctx, doc, dr, pdf_dict_gets(ctx, pdf_dict_gets(ctx, dr, "Font"), font_rec->da_rec.font_name), 0); font_rec->lineheight = 1.0; if (font && font->ascent != 0.0f && font->descent != 0.0f) font_rec->lineheight = (font->ascent - font->descent) / 1000.0; @@ -178,24 +177,24 @@ static void font_info_fin(fz_context *ctx, font_info *font_rec) pdf_da_info_fin(ctx, &font_rec->da_rec); } -static void get_text_widget_info(pdf_document *doc, pdf_obj *widget, text_widget_info *info) +static void get_text_widget_info(fz_context *ctx, pdf_document *doc, pdf_obj *widget, text_widget_info *info) { - char *da = pdf_to_str_buf(pdf_get_inheritable(doc, widget, "DA")); - int ff = pdf_get_field_flags(doc, widget); - pdf_obj *ml = pdf_get_inheritable(doc, widget, "MaxLen"); + char *da = pdf_to_str_buf(ctx, pdf_get_inheritable(ctx, doc, widget, "DA")); + int ff = pdf_get_field_flags(ctx, doc, widget); + pdf_obj *ml = pdf_get_inheritable(ctx, doc, widget, "MaxLen"); - info->dr = pdf_get_inheritable(doc, widget, "DR"); - info->col = pdf_dict_getp(widget, "MK/BG"); - info->q = pdf_to_int(pdf_get_inheritable(doc, widget, "Q")); + info->dr = pdf_get_inheritable(ctx, doc, widget, "DR"); + info->col = pdf_dict_getp(ctx, widget, "MK/BG"); + info->q = pdf_to_int(ctx, pdf_get_inheritable(ctx, doc, widget, "Q")); info->multiline = (ff & Ff_Multiline) != 0; info->comb = (ff & (Ff_Multiline|Ff_Password|Ff_FileSelect|Ff_Comb)) == Ff_Comb; if (ml == NULL) info->comb = 0; else - info->max_len = pdf_to_int(ml); + info->max_len = pdf_to_int(ctx, ml); - get_font_info(doc, info->dr, da, &info->font_rec); + get_font_info(ctx, doc, info->dr, da, &info->font_rec); } void pdf_fzbuf_print_da(fz_context *ctx, fz_buffer *fzbuf, pdf_da_info *di) @@ -223,9 +222,9 @@ void pdf_fzbuf_print_da(fz_context *ctx, fz_buffer *fzbuf, pdf_da_info *di) } } -static fz_rect *measure_text(pdf_document *doc, font_info *font_rec, const fz_matrix *tm, char *text, fz_rect *bbox) +static fz_rect *measure_text(fz_context *ctx, pdf_document *doc, font_info *font_rec, const fz_matrix *tm, char *text, fz_rect *bbox) { - pdf_measure_text(doc->ctx, font_rec->font, (unsigned char *)text, strlen(text), bbox); + pdf_measure_text(ctx, font_rec->font, (unsigned char *)text, strlen(text), bbox); bbox->x0 *= font_rec->da_rec.font_size * tm->a; bbox->y0 *= font_rec->da_rec.font_size * tm->d; @@ -237,24 +236,24 @@ static fz_rect *measure_text(pdf_document *doc, font_info *font_rec, const fz_ma static void fzbuf_print_color(fz_context *ctx, fz_buffer *fzbuf, pdf_obj *arr, int stroke, float adj) { - switch (pdf_array_len(arr)) + switch (pdf_array_len(ctx, arr)) { case 1: fz_buffer_printf(ctx, fzbuf, stroke?"%f G\n":"%f g\n", - pdf_to_real(pdf_array_get(arr, 0)) + adj); + pdf_to_real(ctx, pdf_array_get(ctx, arr, 0)) + adj); break; case 3: fz_buffer_printf(ctx, fzbuf, stroke?"%f %f %f RG\n":"%f %f %f rg\n", - pdf_to_real(pdf_array_get(arr, 0)) + adj, - pdf_to_real(pdf_array_get(arr, 1)) + adj, - pdf_to_real(pdf_array_get(arr, 2)) + adj); + pdf_to_real(ctx, pdf_array_get(ctx, arr, 0)) + adj, + pdf_to_real(ctx, pdf_array_get(ctx, arr, 1)) + adj, + pdf_to_real(ctx, pdf_array_get(ctx, arr, 2)) + adj); break; case 4: fz_buffer_printf(ctx, fzbuf, stroke?"%f %f %f %f K\n":"%f %f %f %f k\n", - pdf_to_real(pdf_array_get(arr, 0)), - pdf_to_real(pdf_array_get(arr, 1)), - pdf_to_real(pdf_array_get(arr, 2)), - pdf_to_real(pdf_array_get(arr, 3))); + pdf_to_real(ctx, pdf_array_get(ctx, arr, 0)), + pdf_to_real(ctx, pdf_array_get(ctx, arr, 1)), + pdf_to_real(ctx, pdf_array_get(ctx, arr, 2)), + pdf_to_real(ctx, pdf_array_get(ctx, arr, 3))); break; } } @@ -310,25 +309,23 @@ static fz_buffer *create_text_buffer(fz_context *ctx, const fz_rect *clip, text_ return fzbuf; } -static fz_buffer *create_aligned_text_buffer(pdf_document *doc, const fz_rect *clip, text_widget_info *info, const fz_matrix *tm, char *text) +static fz_buffer *create_aligned_text_buffer(fz_context *ctx, pdf_document *doc, const fz_rect *clip, text_widget_info *info, const fz_matrix *tm, char *text) { - fz_context *ctx = doc->ctx; fz_matrix atm = *tm; if (info->q != Q_Left) { fz_rect rect; - measure_text(doc, &info->font_rec, tm, text, &rect); + measure_text(ctx, doc, &info->font_rec, tm, text, &rect); atm.e -= info->q == Q_Right ? rect.x1 : (rect.x1 - rect.x0) / 2; } return create_text_buffer(ctx, clip, info, &atm, text); } -static void measure_ascent_descent(pdf_document *doc, font_info *finf, char *text, float *ascent, float *descent) +static void measure_ascent_descent(fz_context *ctx, pdf_document *doc, font_info *finf, char *text, float *ascent, float *descent) { - fz_context *ctx = doc->ctx; char *testtext = NULL; fz_rect bbox; font_info tinf = *finf; @@ -342,7 +339,7 @@ static void measure_ascent_descent(pdf_document *doc, font_info *finf, char *tex strcpy(testtext, "My"); strcat(testtext, text); tinf.da_rec.font_size = 1; - measure_text(doc, &tinf, &fz_identity, testtext, &bbox); + measure_text(ctx, doc, &tinf, &fz_identity, testtext, &bbox); *descent = -bbox.y0; *ascent = bbox.y1; } @@ -572,9 +569,8 @@ static void fzbuf_print_text_word(fz_context *ctx, fz_buffer *fzbuf, float x, fl fz_buffer_printf(ctx, fzbuf, ") Tj\n"); } -static fz_buffer *create_text_appearance(pdf_document *doc, const fz_rect *bbox, const fz_matrix *oldtm, text_widget_info *info, char *text) +static fz_buffer *create_text_appearance(fz_context *ctx, pdf_document *doc, const fz_rect *bbox, const fz_matrix *oldtm, text_widget_info *info, char *text) { - fz_context *ctx = doc->ctx; int fontsize; int variable; float height, width, full_width; @@ -610,7 +606,7 @@ static fz_buffer *create_text_appearance(pdf_document *doc, const fz_rect *bbox, info->font_rec.da_rec.font_size = fontsize; - measure_ascent_descent(doc, &info->font_rec, text, &ascent, &descent); + measure_ascent_descent(ctx, doc, &info->font_rec, text, &ascent, &descent); if (info->multiline) { @@ -709,7 +705,7 @@ static fz_buffer *create_text_appearance(pdf_document *doc, const fz_rect *bbox, if (variable) { - measure_text(doc, &info->font_rec, &tm, text, &tbox); + measure_text(ctx, doc, &info->font_rec, &tm, text, &tbox); if (tbox.x1 - tbox.x0 > width) { @@ -720,7 +716,7 @@ static fz_buffer *create_text_appearance(pdf_document *doc, const fz_rect *bbox, } } - fzbuf = create_aligned_text_buffer(doc, &rect, info, &tm, text); + fzbuf = create_aligned_text_buffer(ctx, doc, &rect, info, &tm, text); } } fz_always(ctx) @@ -736,14 +732,13 @@ static fz_buffer *create_text_appearance(pdf_document *doc, const fz_rect *bbox, return fzbuf; } -static int get_matrix(pdf_document *doc, pdf_xobject *form, int q, fz_matrix *mt) +static int get_matrix(fz_context *ctx, pdf_document *doc, pdf_xobject *form, int q, fz_matrix *mt) { - fz_context *ctx = doc->ctx; int found = 0; pdf_lexbuf lbuf; fz_stream *str; - str = pdf_open_stream(doc, pdf_to_num(form->contents), pdf_to_gen(form->contents)); + str = pdf_open_stream(ctx, doc, pdf_to_num(ctx, form->contents), pdf_to_gen(ctx, form->contents)); pdf_lexbuf_init(ctx, &lbuf, PDF_LEXBUF_SMALL); @@ -754,7 +749,7 @@ static int get_matrix(pdf_document *doc, pdf_xobject *form, int q, fz_matrix *mt int coef_i = 0; /* Look for the text matrix Tm in the stream */ - for (tok = pdf_lex(str, &lbuf); tok != PDF_TOK_EOF; tok = pdf_lex(str, &lbuf)) + for (tok = pdf_lex(ctx, str, &lbuf); tok != PDF_TOK_EOF; tok = pdf_lex(ctx, str, &lbuf)) { if (tok == PDF_TOK_INT || tok == PDF_TOK_REAL) { @@ -789,7 +784,7 @@ static int get_matrix(pdf_document *doc, pdf_xobject *form, int q, fz_matrix *mt if (found) { fz_rect bbox; - pdf_to_rect(ctx, pdf_dict_gets(form->contents, "BBox"), &bbox); + pdf_to_rect(ctx, pdf_dict_gets(ctx, form->contents, "BBox"), &bbox); switch (q) { @@ -809,8 +804,8 @@ static int get_matrix(pdf_document *doc, pdf_xobject *form, int q, fz_matrix *mt } fz_always(ctx) { - fz_drop_stream(str); - pdf_lexbuf_fin(&lbuf); + fz_drop_stream(ctx, str); + pdf_lexbuf_fin(ctx, &lbuf); } fz_catch(ctx) { @@ -912,23 +907,22 @@ static void account_for_rot(fz_rect *rect, fz_matrix *mat, int rot) } } -static void copy_resources(pdf_obj *dst, pdf_obj *src) +static void copy_resources(fz_context *ctx, pdf_obj *dst, pdf_obj *src) { int i, len; - len = pdf_dict_len(src); + len = pdf_dict_len(ctx, src); for (i = 0; i < len; i++) { - pdf_obj *key = pdf_dict_get_key(src, i); + pdf_obj *key = pdf_dict_get_key(ctx, src, i); - if (!pdf_dict_get(dst, key)) - pdf_dict_put(dst, key, pdf_dict_get_val(src, i)); + if (!pdf_dict_get(ctx, dst, key)) + pdf_dict_put(ctx, dst, key, pdf_dict_get_val(ctx, src, i)); } } -static pdf_xobject *load_or_create_form(pdf_document *doc, pdf_obj *obj, fz_rect *rect) +static pdf_xobject *load_or_create_form(fz_context *ctx, pdf_document *doc, pdf_obj *obj, fz_rect *rect) { - fz_context *ctx = doc->ctx; pdf_obj *ap = NULL; fz_matrix mat; int rot; @@ -943,36 +937,36 @@ static pdf_xobject *load_or_create_form(pdf_document *doc, pdf_obj *obj, fz_rect fz_var(fzbuf); fz_try(ctx) { - rot = pdf_to_int(pdf_dict_getp(obj, "MK/R")); - pdf_to_rect(ctx, pdf_dict_gets(obj, "Rect"), rect); + rot = pdf_to_int(ctx, pdf_dict_getp(ctx, obj, "MK/R")); + pdf_to_rect(ctx, pdf_dict_gets(ctx, obj, "Rect"), rect); rect->x1 -= rect->x0; rect->y1 -= rect->y0; rect->x0 = rect->y0 = 0; account_for_rot(rect, &mat, rot); - ap = pdf_dict_gets(obj, "AP"); + ap = pdf_dict_gets(ctx, obj, "AP"); if (ap == NULL) { - ap = pdf_new_dict(doc, 1); - pdf_dict_puts_drop(obj, "AP", ap); + ap = pdf_new_dict(ctx, doc, 1); + pdf_dict_puts_drop(ctx, obj, "AP", ap); } - formobj = pdf_dict_gets(ap, dn); + formobj = pdf_dict_gets(ctx, ap, dn); if (formobj == NULL) { - formobj = pdf_new_xobject(doc, rect, &mat); - pdf_dict_puts_drop(ap, dn, formobj); + formobj = pdf_new_xobject(ctx, doc, rect, &mat); + pdf_dict_puts_drop(ctx, ap, dn, formobj); create_form = 1; } - form = pdf_load_xobject(doc, formobj); + form = pdf_load_xobject(ctx, doc, formobj); if (create_form) { fzbuf = fz_new_buffer(ctx, 1); - pdf_update_xobject_contents(doc, form, fzbuf); + pdf_update_xobject_contents(ctx, doc, form, fzbuf); } - copy_resources(form->resources, pdf_get_inheritable(doc, obj, "DR")); + copy_resources(ctx, form->resources, pdf_get_inheritable(ctx, doc, obj, "DR")); } fz_always(ctx) { @@ -987,9 +981,8 @@ static pdf_xobject *load_or_create_form(pdf_document *doc, pdf_obj *obj, fz_rect return form; } -static void update_marked_content(pdf_document *doc, pdf_xobject *form, fz_buffer *fzbuf) +static void update_marked_content(fz_context *ctx, pdf_document *doc, pdf_xobject *form, fz_buffer *fzbuf) { - fz_context *ctx = doc->ctx; pdf_token tok; pdf_lexbuf lbuf; fz_stream *str_outer = NULL; @@ -1009,12 +1002,12 @@ static void update_marked_content(pdf_document *doc, pdf_xobject *form, fz_buffe int first = 1; newbuf = fz_new_buffer(ctx, 0); - str_outer = pdf_open_stream(doc, pdf_to_num(form->contents), pdf_to_gen(form->contents)); + str_outer = pdf_open_stream(ctx, doc, pdf_to_num(ctx, form->contents), pdf_to_gen(ctx, form->contents)); len = fz_buffer_storage(ctx, fzbuf, &buf); str_inner = fz_open_memory(ctx, buf, len); /* Copy the existing appearance stream to newbuf while looking for BMC */ - for (tok = pdf_lex(str_outer, &lbuf); tok != PDF_TOK_EOF; tok = pdf_lex(str_outer, &lbuf)) + for (tok = pdf_lex(ctx, str_outer, &lbuf); tok != PDF_TOK_EOF; tok = pdf_lex(ctx, str_outer, &lbuf)) { if (first) first = 0; @@ -1031,12 +1024,12 @@ static void update_marked_content(pdf_document *doc, pdf_xobject *form, fz_buffe if (bmc_found) { /* Drop Tx BMC from the replacement appearance stream */ - (void)pdf_lex(str_inner, &lbuf); - (void)pdf_lex(str_inner, &lbuf); + (void)pdf_lex(ctx, str_inner, &lbuf); + (void)pdf_lex(ctx, str_inner, &lbuf); } /* Copy the replacement appearance stream to newbuf */ - for (tok = pdf_lex(str_inner, &lbuf); tok != PDF_TOK_EOF; tok = pdf_lex(str_inner, &lbuf)) + for (tok = pdf_lex(ctx, str_inner, &lbuf); tok != PDF_TOK_EOF; tok = pdf_lex(ctx, str_inner, &lbuf)) { fz_buffer_printf(ctx, newbuf, " "); pdf_print_token(ctx, newbuf, tok, &lbuf); @@ -1045,14 +1038,14 @@ static void update_marked_content(pdf_document *doc, pdf_xobject *form, fz_buffe if (bmc_found) { /* Drop the rest of the existing appearance stream until EMC found */ - for (tok = pdf_lex(str_outer, &lbuf); tok != PDF_TOK_EOF; tok = pdf_lex(str_outer, &lbuf)) + for (tok = pdf_lex(ctx, str_outer, &lbuf); tok != PDF_TOK_EOF; tok = pdf_lex(ctx, str_outer, &lbuf)) { if (tok == PDF_TOK_KEYWORD && !strcmp(lbuf.scratch, "EMC")) break; } /* Copy the rest of the existing appearance stream to newbuf */ - for (tok = pdf_lex(str_outer, &lbuf); tok != PDF_TOK_EOF; tok = pdf_lex(str_outer, &lbuf)) + for (tok = pdf_lex(ctx, str_outer, &lbuf); tok != PDF_TOK_EOF; tok = pdf_lex(ctx, str_outer, &lbuf)) { fz_buffer_printf(ctx, newbuf, " "); pdf_print_token(ctx, newbuf, tok, &lbuf); @@ -1060,14 +1053,14 @@ static void update_marked_content(pdf_document *doc, pdf_xobject *form, fz_buffe } /* Use newbuf in place of the existing appearance stream */ - pdf_update_xobject_contents(doc, form, newbuf); + pdf_update_xobject_contents(ctx, doc, form, newbuf); } fz_always(ctx) { - fz_drop_stream(str_outer); - fz_drop_stream(str_inner); + fz_drop_stream(ctx, str_outer); + fz_drop_stream(ctx, str_inner); fz_drop_buffer(ctx, newbuf); - pdf_lexbuf_fin(&lbuf); + pdf_lexbuf_fin(ctx, &lbuf); } fz_catch(ctx) { @@ -1075,9 +1068,9 @@ static void update_marked_content(pdf_document *doc, pdf_xobject *form, fz_buffe } } -static int get_border_style(pdf_obj *obj) +static int get_border_style(fz_context *ctx, pdf_obj *obj) { - char *sname = pdf_to_name(pdf_dict_getp(obj, "BS/S")); + char *sname = pdf_to_name(ctx, pdf_dict_getp(ctx, obj, "BS/S")); if (!strcmp(sname, "D")) return BS_Dashed; @@ -1091,15 +1084,14 @@ static int get_border_style(pdf_obj *obj) return BS_Solid; } -static float get_border_width(pdf_obj *obj) +static float get_border_width(fz_context *ctx, pdf_obj *obj) { - float w = pdf_to_real(pdf_dict_getp(obj, "BS/W")); + float w = pdf_to_real(ctx, pdf_dict_getp(ctx, obj, "BS/W")); return w == 0.0 ? 1.0 : w; } -void pdf_update_text_appearance(pdf_document *doc, pdf_obj *obj, char *eventValue) +void pdf_update_text_appearance(fz_context *ctx, pdf_document *doc, pdf_obj *obj, char *eventValue) { - fz_context *ctx = doc->ctx; text_widget_info info; pdf_xobject *form = NULL; fz_buffer *fzbuf = NULL; @@ -1116,19 +1108,19 @@ void pdf_update_text_appearance(pdf_document *doc, pdf_obj *obj, char *eventValu fz_var(text); fz_try(ctx) { - get_text_widget_info(doc, obj, &info); + get_text_widget_info(ctx, doc, obj, &info); if (eventValue) text = to_font_encoding(ctx, info.font_rec.font, eventValue); else - text = pdf_field_value(doc, obj); + text = pdf_field_value(ctx, doc, obj); - form = load_or_create_form(doc, obj, &rect); + form = load_or_create_form(ctx, doc, obj, &rect); - has_tm = get_matrix(doc, form, info.q, &tm); - fzbuf = create_text_appearance(doc, &form->bbox, has_tm ? &tm : NULL, &info, + has_tm = get_matrix(ctx, doc, form, info.q, &tm); + fzbuf = create_text_appearance(ctx, doc, &form->bbox, has_tm ? &tm : NULL, &info, text?text:""); - update_marked_content(doc, form, fzbuf); + update_marked_content(ctx, doc, form, fzbuf); } fz_always(ctx) { @@ -1143,9 +1135,8 @@ void pdf_update_text_appearance(pdf_document *doc, pdf_obj *obj, char *eventValu } } -void pdf_update_combobox_appearance(pdf_document *doc, pdf_obj *obj) +void pdf_update_combobox_appearance(fz_context *ctx, pdf_document *doc, pdf_obj *obj) { - fz_context *ctx = doc->ctx; text_widget_info info; pdf_xobject *form = NULL; fz_buffer *fzbuf = NULL; @@ -1162,24 +1153,24 @@ void pdf_update_combobox_appearance(pdf_document *doc, pdf_obj *obj) fz_var(fzbuf); fz_try(ctx) { - get_text_widget_info(doc, obj, &info); + get_text_widget_info(ctx, doc, obj, &info); - val = pdf_get_inheritable(doc, obj, "V"); + val = pdf_get_inheritable(ctx, doc, obj, "V"); - if (pdf_is_array(val)) - val = pdf_array_get(val, 0); + if (pdf_is_array(ctx, val)) + val = pdf_array_get(ctx, val, 0); - text = pdf_to_str_buf(val); + text = pdf_to_str_buf(ctx, val); if (!text) text = ""; - form = load_or_create_form(doc, obj, &rect); + form = load_or_create_form(ctx, doc, obj, &rect); - has_tm = get_matrix(doc, form, info.q, &tm); - fzbuf = create_text_appearance(doc, &form->bbox, has_tm ? &tm : NULL, &info, + has_tm = get_matrix(ctx, doc, form, info.q, &tm); + fzbuf = create_text_appearance(ctx, doc, &form->bbox, has_tm ? &tm : NULL, &info, text?text:""); - update_marked_content(doc, form, fzbuf); + update_marked_content(ctx, doc, form, fzbuf); } fz_always(ctx) { @@ -1193,9 +1184,8 @@ void pdf_update_combobox_appearance(pdf_document *doc, pdf_obj *obj) } } -void pdf_update_pushbutton_appearance(pdf_document *doc, pdf_obj *obj) +void pdf_update_pushbutton_appearance(fz_context *ctx, pdf_document *doc, pdf_obj *obj) { - fz_context *ctx = doc->ctx; fz_rect rect; pdf_xobject *form = NULL; fz_buffer *fzbuf = NULL; @@ -1212,18 +1202,18 @@ void pdf_update_pushbutton_appearance(pdf_document *doc, pdf_obj *obj) fz_var(fzbuf); fz_try(ctx) { - form = load_or_create_form(doc, obj, &rect); + form = load_or_create_form(ctx, doc, obj, &rect); fzbuf = fz_new_buffer(ctx, 0); - tobj = pdf_dict_getp(obj, "MK/BG"); - if (pdf_is_array(tobj)) + tobj = pdf_dict_getp(ctx, obj, "MK/BG"); + if (pdf_is_array(ctx, tobj)) { fzbuf_print_color(ctx, fzbuf, tobj, 0, 0.0); fz_buffer_printf(ctx, fzbuf, fmt_re, rect.x0, rect.y0, rect.x1, rect.y1); fz_buffer_printf(ctx, fzbuf, fmt_f); } - bstyle = get_border_style(obj); - bwidth = get_border_width(obj); + bstyle = get_border_style(ctx, obj); + bwidth = get_border_width(ctx, obj); btotal = bwidth; if (bstyle == BS_Beveled || bstyle == BS_Inset) { @@ -1253,7 +1243,7 @@ void pdf_update_pushbutton_appearance(pdf_document *doc, pdf_obj *obj) fz_buffer_printf(ctx, fzbuf, fmt_f); } - tobj = pdf_dict_getp(obj, "MK/BC"); + tobj = pdf_dict_getp(ctx, obj, "MK/BC"); if (tobj) { fzbuf_print_color(ctx, fzbuf, tobj, 1, 0.0); @@ -1264,27 +1254,27 @@ void pdf_update_pushbutton_appearance(pdf_document *doc, pdf_obj *obj) fz_buffer_printf(ctx, fzbuf, fmt_s); } - tobj = pdf_dict_getp(obj, "MK/CA"); + tobj = pdf_dict_getp(ctx, obj, "MK/CA"); if (tobj) { fz_rect clip = rect; fz_rect bounds; fz_matrix mat; - char *da = pdf_to_str_buf(pdf_get_inheritable(doc, obj, "DA")); - char *text = pdf_to_str_buf(tobj); + char *da = pdf_to_str_buf(ctx, pdf_get_inheritable(ctx, doc, obj, "DA")); + char *text = pdf_to_str_buf(ctx, tobj); clip.x0 += btotal; clip.y0 += btotal; clip.x1 -= btotal; clip.y1 -= btotal; - get_font_info(doc, form->resources, da, &font_rec); - measure_text(doc, &font_rec, &fz_identity, text, &bounds); + get_font_info(ctx, doc, form->resources, da, &font_rec); + measure_text(ctx, doc, &font_rec, &fz_identity, text, &bounds); fz_translate(&mat, (rect.x1 - bounds.x1)/2, (rect.y1 - bounds.y1)/2); fzbuf_print_text(ctx, fzbuf, &clip, NULL, &font_rec, &mat, text); } - pdf_update_xobject_contents(doc, form, fzbuf); + pdf_update_xobject_contents(ctx, doc, form, fzbuf); } fz_always(ctx) { @@ -1298,7 +1288,7 @@ void pdf_update_pushbutton_appearance(pdf_document *doc, pdf_obj *obj) } } -void pdf_update_text_markup_appearance(pdf_document *doc, pdf_annot *annot, fz_annot_type type) +void pdf_update_text_markup_appearance(fz_context *ctx, pdf_document *doc, pdf_annot *annot, fz_annot_type type) { float color[3]; float alpha; @@ -1335,19 +1325,18 @@ void pdf_update_text_markup_appearance(pdf_document *doc, pdf_annot *annot, fz_a return; } - pdf_set_markup_appearance(doc, annot, color, alpha, line_thickness, line_height); + pdf_set_markup_appearance(ctx, doc, annot, color, alpha, line_thickness, line_height); } static void update_rect(fz_context *ctx, pdf_annot *annot) { - pdf_to_rect(ctx, pdf_dict_gets(annot->obj, "Rect"), &annot->rect); + pdf_to_rect(ctx, pdf_dict_gets(ctx, annot->obj, "Rect"), &annot->rect); annot->pagerect = annot->rect; fz_transform_rect(&annot->pagerect, &annot->page->ctm); } -void pdf_set_annot_appearance(pdf_document *doc, pdf_annot *annot, fz_rect *rect, fz_display_list *disp_list) +void pdf_set_annot_appearance(fz_context *ctx, pdf_document *doc, pdf_annot *annot, fz_rect *rect, fz_display_list *disp_list) { - fz_context *ctx = doc->ctx; pdf_obj *obj = annot->obj; const fz_matrix *page_ctm = &annot->page->ctm; fz_matrix ctm; @@ -1365,32 +1354,32 @@ void pdf_set_annot_appearance(pdf_document *doc, pdf_annot *annot, fz_rect *rect fz_transform_rect(&trect, &ctm); - pdf_dict_puts_drop(obj, "Rect", pdf_new_rect(doc, &trect)); + pdf_dict_puts_drop(ctx, obj, "Rect", pdf_new_rect(ctx, doc, &trect)); /* See if there is a current normal appearance */ - ap_obj = pdf_dict_getp(obj, "AP/N"); - if (!pdf_is_stream(doc, pdf_to_num(ap_obj), pdf_to_gen(ap_obj))) + ap_obj = pdf_dict_getp(ctx, obj, "AP/N"); + if (!pdf_is_stream(ctx, doc, pdf_to_num(ctx, ap_obj), pdf_to_gen(ctx, ap_obj))) ap_obj = NULL; if (ap_obj == NULL) { - ap_obj = pdf_new_xobject(doc, &trect, &mat); - pdf_dict_putp_drop(obj, "AP/N", ap_obj); + ap_obj = pdf_new_xobject(ctx, doc, &trect, &mat); + pdf_dict_putp_drop(ctx, obj, "AP/N", ap_obj); } else { - pdf_xref_ensure_incremental_object(doc, pdf_to_num(ap_obj)); + pdf_xref_ensure_incremental_object(ctx, doc, pdf_to_num(ctx, ap_obj)); /* Update bounding box and matrix in reused xobject obj */ - pdf_dict_puts_drop(ap_obj, "BBox", pdf_new_rect(doc, &trect)); - pdf_dict_puts_drop(ap_obj, "Matrix", pdf_new_matrix(doc, &mat)); + pdf_dict_puts_drop(ctx, ap_obj, "BBox", pdf_new_rect(ctx, doc, &trect)); + pdf_dict_puts_drop(ctx, ap_obj, "Matrix", pdf_new_matrix(ctx, doc, &mat)); } - dev = pdf_new_pdf_device(doc, ap_obj, pdf_dict_gets(ap_obj, "Resources"), &mat); - fz_run_display_list(disp_list, dev, &ctm, &fz_infinite_rect, NULL); - fz_drop_device(dev); + dev = pdf_new_pdf_device(ctx, doc, ap_obj, pdf_dict_gets(ctx, ap_obj, "Resources"), &mat); + fz_run_display_list(ctx, disp_list, dev, &ctm, &fz_infinite_rect, NULL); + fz_drop_device(ctx, dev); /* Mark the appearance as changed - required for partial update */ - xobj = pdf_load_xobject(doc, ap_obj); + xobj = pdf_load_xobject(ctx, doc, ap_obj); if (xobj) { /* Update bounding box and matrix also in the xobject structure */ @@ -1406,23 +1395,22 @@ void pdf_set_annot_appearance(pdf_document *doc, pdf_annot *annot, fz_rect *rect } fz_catch(ctx) { - fz_drop_device(dev); + fz_drop_device(ctx, dev); fz_rethrow(ctx); } } static fz_point * -quadpoints(pdf_document *doc, pdf_obj *annot, int *nout) +quadpoints(fz_context *ctx, pdf_document *doc, pdf_obj *annot, int *nout) { - fz_context *ctx = doc->ctx; - pdf_obj *quad = pdf_dict_gets(annot, "QuadPoints"); + pdf_obj *quad = pdf_dict_gets(ctx, annot, "QuadPoints"); fz_point *qp = NULL; int i, n; if (!quad) return NULL; - n = pdf_array_len(quad); + n = pdf_array_len(ctx, quad); if (n%8 != 0) return NULL; @@ -1434,8 +1422,8 @@ quadpoints(pdf_document *doc, pdf_obj *annot, int *nout) for (i = 0; i < n; i += 2) { - qp[i/2].x = pdf_to_real(pdf_array_get(quad, i)); - qp[i/2].y = pdf_to_real(pdf_array_get(quad, i+1)); + qp[i/2].x = pdf_to_real(ctx, pdf_array_get(ctx, quad, i)); + qp[i/2].y = pdf_to_real(ctx, pdf_array_get(ctx, quad, i+1)); } } fz_catch(ctx) @@ -1449,16 +1437,15 @@ quadpoints(pdf_document *doc, pdf_obj *annot, int *nout) return qp; } -void pdf_set_markup_appearance(pdf_document *doc, pdf_annot *annot, float color[3], float alpha, float line_thickness, float line_height) +void pdf_set_markup_appearance(fz_context *ctx, pdf_document *doc, pdf_annot *annot, float color[3], float alpha, float line_thickness, float line_height) { - fz_context *ctx = doc->ctx; const fz_matrix *page_ctm = &annot->page->ctm; fz_path *path = NULL; fz_stroke_state *stroke = NULL; fz_device *dev = NULL; fz_display_list *strike_list = NULL; int i, n; - fz_point *qp = quadpoints(doc, annot->obj, &n); + fz_point *qp = quadpoints(ctx, doc, annot->obj, &n); if (!qp || n <= 0) return; @@ -1501,7 +1488,7 @@ void pdf_set_markup_appearance(pdf_document *doc, pdf_annot *annot, float color[ if (stroke) { // assert(path) - fz_stroke_path(dev, path, stroke, page_ctm, fz_device_rgb(ctx), color, alpha); + fz_stroke_path(ctx, dev, path, stroke, page_ctm, fz_device_rgb(ctx), color, alpha); fz_drop_stroke_state(ctx, stroke); stroke = NULL; fz_drop_path(ctx, path); @@ -1519,16 +1506,16 @@ void pdf_set_markup_appearance(pdf_document *doc, pdf_annot *annot, float color[ if (stroke) { - fz_stroke_path(dev, path, stroke, page_ctm, fz_device_rgb(ctx), color, alpha); + fz_stroke_path(ctx, dev, path, stroke, page_ctm, fz_device_rgb(ctx), color, alpha); } fz_transform_rect(&rect, page_ctm); - pdf_set_annot_appearance(doc, annot, &rect, strike_list); + pdf_set_annot_appearance(ctx, doc, annot, &rect, strike_list); } fz_always(ctx) { fz_free(ctx, qp); - fz_drop_device(dev); + fz_drop_device(ctx, dev); fz_drop_stroke_state(ctx, stroke); fz_drop_path(ctx, path); fz_drop_display_list(ctx, strike_list); @@ -1539,28 +1526,27 @@ void pdf_set_markup_appearance(pdf_document *doc, pdf_annot *annot, float color[ } } -static fz_colorspace *pdf_to_color(pdf_document *doc, pdf_obj *col, float color[4]) +static fz_colorspace *pdf_to_color(fz_context *ctx, pdf_document *doc, pdf_obj *col, float color[4]) { fz_colorspace *cs; - int i, ncol = pdf_array_len(col); + int i, ncol = pdf_array_len(ctx, col); switch (ncol) { - case 1: cs = fz_device_gray(doc->ctx); break; - case 3: cs = fz_device_rgb(doc->ctx); break; - case 4: cs = fz_device_cmyk(doc->ctx); break; + case 1: cs = fz_device_gray(ctx); break; + case 3: cs = fz_device_rgb(ctx); break; + case 4: cs = fz_device_cmyk(ctx); break; default: return NULL; } for (i = 0; i < ncol; i++) - color[i] = pdf_to_real(pdf_array_get(col, i)); + color[i] = pdf_to_real(ctx, pdf_array_get(ctx, col, i)); return cs; } -void pdf_update_ink_appearance(pdf_document *doc, pdf_annot *annot) +void pdf_update_ink_appearance(fz_context *ctx, pdf_document *doc, pdf_annot *annot) { - fz_context *ctx = doc->ctx; const fz_matrix *page_ctm = &annot->page->ctm; fz_path *path = NULL; fz_stroke_state *stroke = NULL; @@ -1582,7 +1568,7 @@ void pdf_update_ink_appearance(pdf_document *doc, pdf_annot *annot) int n, m, i, j; int empty = 1; - cs = pdf_to_color(doc, pdf_dict_gets(annot->obj, "C"), color); + cs = pdf_to_color(ctx, doc, pdf_dict_gets(ctx, annot->obj, "C"), color); if (!cs) { cs = fz_device_rgb(ctx); @@ -1591,13 +1577,13 @@ void pdf_update_ink_appearance(pdf_document *doc, pdf_annot *annot) color[2] = 0.0f; } - width = pdf_to_real(pdf_dict_gets(pdf_dict_gets(annot->obj, "BS"), "W")); + width = pdf_to_real(ctx, pdf_dict_gets(ctx, pdf_dict_gets(ctx, annot->obj, "BS"), "W")); if (width == 0.0f) width = 1.0f; - list = pdf_dict_gets(annot->obj, "InkList"); + list = pdf_dict_gets(ctx, annot->obj, "InkList"); - n = pdf_array_len(list); + n = pdf_array_len(ctx, list); strike_list = fz_new_display_list(ctx); dev = fz_new_list_device(ctx, strike_list); @@ -1610,14 +1596,14 @@ void pdf_update_ink_appearance(pdf_document *doc, pdf_annot *annot) for (i = 0; i < n; i ++) { fz_point pt_last; - pdf_obj *arc = pdf_array_get(list, i); - m = pdf_array_len(arc); + pdf_obj *arc = pdf_array_get(ctx, list, i); + m = pdf_array_len(ctx, arc); for (j = 0; j < m-1; j += 2) { fz_point pt; - pt.x = pdf_to_real(pdf_array_get(arc, j)); - pt.y = pdf_to_real(pdf_array_get(arc, j+1)); + pt.x = pdf_to_real(ctx, pdf_array_get(ctx, arc, j)); + pt.y = pdf_to_real(ctx, pdf_array_get(ctx, arc, j+1)); if (i == 0 && j == 0) { @@ -1639,7 +1625,7 @@ void pdf_update_ink_appearance(pdf_document *doc, pdf_annot *annot) fz_lineto(ctx, path, pt_last.x, pt_last.y); } - fz_stroke_path(dev, path, stroke, page_ctm, cs, color, 1.0f); + fz_stroke_path(ctx, dev, path, stroke, page_ctm, cs, color, 1.0f); fz_expand_rect(&rect, width); /* @@ -1657,12 +1643,12 @@ void pdf_update_ink_appearance(pdf_document *doc, pdf_annot *annot) fz_transform_rect(&rect, page_ctm); - pdf_set_annot_appearance(doc, annot, &rect, strike_list); + pdf_set_annot_appearance(ctx, doc, annot, &rect, strike_list); } fz_always(ctx) { fz_drop_colorspace(ctx, cs); - fz_drop_device(dev); + fz_drop_device(ctx, dev); fz_drop_stroke_state(ctx, stroke); fz_drop_path(ctx, path); fz_drop_display_list(ctx, strike_list); @@ -1847,12 +1833,12 @@ static void draw_speech_bubble(fz_context *ctx, fz_path *path) fz_closepath(ctx, path); } -void pdf_update_text_annot_appearance(pdf_document *doc, pdf_annot *annot) +void pdf_update_text_annot_appearance(fz_context *ctx, pdf_document *doc, pdf_annot *annot) { static float white[3] = {1.0, 1.0, 1.0}; static float yellow[3] = {1.0, 1.0, 0.0}; static float black[3] = {0.0, 0.0, 0.0}; - fz_context *ctx = doc->ctx; + const fz_matrix *page_ctm = &annot->page->ctm; fz_display_list *dlist = NULL; fz_device *dev = NULL; @@ -1871,7 +1857,7 @@ void pdf_update_text_annot_appearance(pdf_document *doc, pdf_annot *annot) fz_rect bounds; fz_matrix tm; - pdf_to_rect(ctx, pdf_dict_gets(annot->obj, "Rect"), &rect); + pdf_to_rect(ctx, pdf_dict_gets(ctx, annot->obj, "Rect"), &rect); dlist = fz_new_display_list(ctx); dev = fz_new_list_device(ctx, dlist); stroke = fz_new_stroke_state(ctx); @@ -1885,18 +1871,18 @@ void pdf_update_text_annot_appearance(pdf_document *doc, pdf_annot *annot) center_rect_within_rect(&bounds, &rect, &tm); fz_concat(&tm, &tm, page_ctm); cs = fz_device_rgb(ctx); - fz_fill_path(dev, path, 0, &tm, cs, yellow, 1.0f); - fz_stroke_path(dev, path, stroke, &tm, cs, black, 1.0f); + fz_fill_path(ctx, dev, path, 0, &tm, cs, yellow, 1.0f); + fz_stroke_path(ctx, dev, path, stroke, &tm, cs, black, 1.0f); fz_drop_path(ctx, path); path = NULL; path = fz_new_path(ctx); draw_speech_bubble(ctx, path); - fz_fill_path(dev, path, 0, &tm, cs, white, 1.0f); - fz_stroke_path(dev, path, stroke, &tm, cs, black, 1.0f); + fz_fill_path(ctx, dev, path, 0, &tm, cs, white, 1.0f); + fz_stroke_path(ctx, dev, path, stroke, &tm, cs, black, 1.0f); fz_transform_rect(&rect, page_ctm); - pdf_set_annot_appearance(doc, annot, &rect, dlist); + pdf_set_annot_appearance(ctx, doc, annot, &rect, dlist); /* Drop the cached xobject from the annotation structure to * force a redraw on next pdf_update_page call */ @@ -1905,7 +1891,7 @@ void pdf_update_text_annot_appearance(pdf_document *doc, pdf_annot *annot) } fz_always(ctx) { - fz_drop_device(dev); + fz_drop_device(ctx, dev); fz_drop_display_list(ctx, dlist); fz_drop_stroke_state(ctx, stroke); fz_drop_path(ctx, path); @@ -1917,12 +1903,11 @@ void pdf_update_text_annot_appearance(pdf_document *doc, pdf_annot *annot) } } -void pdf_update_free_text_annot_appearance(pdf_document *doc, pdf_annot *annot) +void pdf_update_free_text_annot_appearance(fz_context *ctx, pdf_document *doc, pdf_annot *annot) { - fz_context *ctx = doc->ctx; const fz_matrix *page_ctm = &annot->page->ctm; pdf_obj *obj = annot->obj; - pdf_obj *dr = pdf_dict_getp(annot->page->me, "Resources"); + pdf_obj *dr = pdf_dict_getp(ctx, annot->page->me, "Resources"); fz_display_list *dlist = NULL; fz_device *dev = NULL; font_info font_rec; @@ -1941,18 +1926,18 @@ void pdf_update_free_text_annot_appearance(pdf_document *doc, pdf_annot *annot) fz_var(cs); fz_try(ctx) { - char *contents = pdf_to_str_buf(pdf_dict_gets(obj, "Contents")); - char *da = pdf_to_str_buf(pdf_dict_gets(obj, "DA")); + char *contents = pdf_to_str_buf(ctx, pdf_dict_gets(ctx, obj, "Contents")); + char *da = pdf_to_str_buf(ctx, pdf_dict_gets(ctx, obj, "DA")); fz_rect rect = annot->rect; fz_point pos; - get_font_info(doc, dr, da, &font_rec); + get_font_info(ctx, doc, dr, da, &font_rec); switch (font_rec.da_rec.col_size) { - default: cs = fz_device_gray(doc->ctx); break; - case 3: cs = fz_device_rgb(doc->ctx); break; - case 4: cs = fz_device_cmyk(doc->ctx); break; + default: cs = fz_device_gray(ctx); break; + case 3: cs = fz_device_rgb(ctx); break; + case 4: cs = fz_device_cmyk(ctx); break; } /* Adjust for the descender */ @@ -1963,14 +1948,14 @@ void pdf_update_free_text_annot_appearance(pdf_document *doc, pdf_annot *annot) dlist = fz_new_display_list(ctx); dev = fz_new_list_device(ctx, dlist); - fz_fill_text(dev, text, page_ctm, cs, font_rec.da_rec.col, 1.0f); + fz_fill_text(ctx, dev, text, page_ctm, cs, font_rec.da_rec.col, 1.0f); fz_transform_rect(&rect, page_ctm); - pdf_set_annot_appearance(doc, annot, &rect, dlist); + pdf_set_annot_appearance(ctx, doc, annot, &rect, dlist); } fz_always(ctx) { - fz_drop_device(dev); + fz_drop_device(ctx, dev); fz_drop_display_list(ctx, dlist); font_info_fin(ctx, &font_rec); fz_drop_text(ctx, text); @@ -2042,17 +2027,16 @@ static void draw_logo(fz_context *ctx, fz_path *path) fz_closepath(ctx, path); }; -static void insert_signature_appearance_layers(pdf_document *doc, pdf_annot *annot) +static void insert_signature_appearance_layers(fz_context *ctx, pdf_document *doc, pdf_annot *annot) { - fz_context *ctx = doc->ctx; - pdf_obj *ap = pdf_dict_getp(annot->obj, "AP/N"); + pdf_obj *ap = pdf_dict_getp(ctx, annot->obj, "AP/N"); pdf_obj *main_ap = NULL; pdf_obj *frm = NULL; pdf_obj *n0 = NULL; fz_rect bbox; fz_buffer *fzbuf = NULL; - pdf_to_rect(ctx, pdf_dict_gets(ap, "BBox"), &bbox); + pdf_to_rect(ctx, pdf_dict_gets(ctx, ap, "BBox"), &bbox); fz_var(main_ap); fz_var(frm); @@ -2060,41 +2044,41 @@ static void insert_signature_appearance_layers(pdf_document *doc, pdf_annot *ann fz_var(fzbuf); fz_try(ctx) { - main_ap = pdf_new_xobject(doc, &bbox, &fz_identity); - frm = pdf_new_xobject(doc, &bbox, &fz_identity); - n0 = pdf_new_xobject(doc, &bbox, &fz_identity); + main_ap = pdf_new_xobject(ctx, doc, &bbox, &fz_identity); + frm = pdf_new_xobject(ctx, doc, &bbox, &fz_identity); + n0 = pdf_new_xobject(ctx, doc, &bbox, &fz_identity); - pdf_dict_putp(main_ap, "Resources/XObject/FRM", frm); + pdf_dict_putp(ctx, main_ap, "Resources/XObject/FRM", frm); fzbuf = fz_new_buffer(ctx, 8); fz_buffer_printf(ctx, fzbuf, "/FRM Do"); - pdf_update_stream(doc, pdf_to_num(main_ap), fzbuf); - pdf_dict_puts_drop(main_ap, "Length", pdf_new_int(doc, fzbuf->len)); + pdf_update_stream(ctx, doc, pdf_to_num(ctx, main_ap), fzbuf); + pdf_dict_puts_drop(ctx, main_ap, "Length", pdf_new_int(ctx, doc, fzbuf->len)); fz_drop_buffer(ctx, fzbuf); fzbuf = NULL; - pdf_dict_putp(frm, "Resources/XObject/n0", n0); - pdf_dict_putp(frm, "Resources/XObject/n2", ap); + pdf_dict_putp(ctx, frm, "Resources/XObject/n0", n0); + pdf_dict_putp(ctx, frm, "Resources/XObject/n2", ap); fzbuf = fz_new_buffer(ctx, 8); fz_buffer_printf(ctx, fzbuf, "q 1 0 0 1 0 0 cm /n0 Do Q q 1 0 0 1 0 0 cm /n2 Do Q"); - pdf_update_stream(doc, pdf_to_num(frm), fzbuf); - pdf_dict_puts_drop(frm, "Length", pdf_new_int(doc, fzbuf->len)); + pdf_update_stream(ctx, doc, pdf_to_num(ctx, frm), fzbuf); + pdf_dict_puts_drop(ctx, frm, "Length", pdf_new_int(ctx, doc, fzbuf->len)); fz_drop_buffer(ctx, fzbuf); fzbuf = NULL; fzbuf = fz_new_buffer(ctx, 8); fz_buffer_printf(ctx, fzbuf, "%% DSBlank"); - pdf_update_stream(doc, pdf_to_num(n0), fzbuf); - pdf_dict_puts_drop(n0, "Length", pdf_new_int(doc, fzbuf->len)); + pdf_update_stream(ctx, doc, pdf_to_num(ctx, n0), fzbuf); + pdf_dict_puts_drop(ctx, n0, "Length", pdf_new_int(ctx, doc, fzbuf->len)); fz_drop_buffer(ctx, fzbuf); fzbuf = NULL; - pdf_dict_putp(annot->obj, "AP/N", main_ap); + pdf_dict_putp(ctx, annot->obj, "AP/N", main_ap); } fz_always(ctx) { - pdf_drop_obj(main_ap); - pdf_drop_obj(frm); - pdf_drop_obj(n0); + pdf_drop_obj(ctx, main_ap); + pdf_drop_obj(ctx, frm); + pdf_drop_obj(ctx, n0); } fz_catch(ctx) { @@ -2106,12 +2090,11 @@ static void insert_signature_appearance_layers(pdf_document *doc, pdf_annot *ann /* MuPDF blue */ static float logo_color[3] = {(float)0x25/(float)0xFF, (float)0x72/(float)0xFF, (float)0xAC/(float)0xFF}; -void pdf_set_signature_appearance(pdf_document *doc, pdf_annot *annot, char *name, char *dn, char *date) +void pdf_set_signature_appearance(fz_context *ctx, pdf_document *doc, pdf_annot *annot, char *name, char *dn, char *date) { - fz_context *ctx = doc->ctx; const fz_matrix *page_ctm = &annot->page->ctm; pdf_obj *obj = annot->obj; - pdf_obj *dr = pdf_dict_getp(pdf_trailer(doc), "Root/AcroForm/DR"); + pdf_obj *dr = pdf_dict_getp(ctx, pdf_trailer(ctx, doc), "Root/AcroForm/DR"); fz_display_list *dlist = NULL; fz_device *dev = NULL; font_info font_rec; @@ -2121,7 +2104,7 @@ void pdf_set_signature_appearance(pdf_document *doc, pdf_annot *annot, char *nam fz_buffer *fzbuf = NULL; if (!dr) - pdf_dict_putp_drop(pdf_trailer(doc), "Root/AcroForm/DR", pdf_new_dict(doc, 1)); + pdf_dict_putp_drop(ctx, pdf_trailer(ctx, doc), "Root/AcroForm/DR", pdf_new_dict(ctx, doc, 1)); memset(&font_rec, 0, sizeof(font_rec)); @@ -2133,7 +2116,7 @@ void pdf_set_signature_appearance(pdf_document *doc, pdf_annot *annot, char *nam fz_var(fzbuf); fz_try(ctx) { - char *da = pdf_to_str_buf(pdf_dict_gets(obj, "DA")); + char *da = pdf_to_str_buf(ctx, pdf_dict_gets(ctx, obj, "DA")); fz_rect rect = annot->rect; fz_rect logo_bounds; fz_matrix logo_tm; @@ -2148,11 +2131,11 @@ void pdf_set_signature_appearance(pdf_document *doc, pdf_annot *annot, char *nam center_rect_within_rect(&logo_bounds, &rect, &logo_tm); fz_concat(&logo_tm, &logo_tm, page_ctm); cs = fz_device_rgb(ctx); - fz_fill_path(dev, path, 0, &logo_tm, cs, logo_color, 1.0f); + fz_fill_path(ctx, dev, path, 0, &logo_tm, cs, logo_color, 1.0f); fz_drop_colorspace(ctx, cs); cs = NULL; - get_font_info(doc, dr, da, &font_rec); + get_font_info(ctx, doc, dr, da, &font_rec); switch (font_rec.da_rec.col_size) { @@ -2164,7 +2147,7 @@ void pdf_set_signature_appearance(pdf_document *doc, pdf_annot *annot, char *nam /* Display the name in the left-hand half of the form field */ rect.x1 = (rect.x0 + rect.x1)/2.0f; text = fit_text(ctx, &font_rec, name, &rect); - fz_fill_text(dev, text, page_ctm, cs, font_rec.da_rec.col, 1.0f); + fz_fill_text(ctx, dev, text, page_ctm, cs, font_rec.da_rec.col, 1.0f); fz_drop_text(ctx, text); text = NULL; @@ -2178,22 +2161,22 @@ void pdf_set_signature_appearance(pdf_document *doc, pdf_annot *annot, char *nam rect = annot->rect; rect.x0 = (rect.x0 + rect.x1)/2.0f; text = fit_text(ctx, &font_rec, (char *)bufstr, &rect); - fz_fill_text(dev, text, page_ctm, cs, font_rec.da_rec.col, 1.0f); + fz_fill_text(ctx, dev, text, page_ctm, cs, font_rec.da_rec.col, 1.0f); rect = annot->rect; fz_transform_rect(&rect, page_ctm); - pdf_set_annot_appearance(doc, annot, &rect, dlist); + pdf_set_annot_appearance(ctx, doc, annot, &rect, dlist); /* Drop the cached xobject from the annotation structure to * force a redraw on next pdf_update_page call */ pdf_drop_xobject(ctx, annot->ap); annot->ap = NULL; - insert_signature_appearance_layers(doc, annot); + insert_signature_appearance_layers(ctx, doc, annot); } fz_always(ctx) { - fz_drop_device(dev); + fz_drop_device(ctx, dev); fz_drop_display_list(ctx, dlist); font_info_fin(ctx, &font_rec); fz_drop_path(ctx, path); @@ -2207,29 +2190,27 @@ void pdf_set_signature_appearance(pdf_document *doc, pdf_annot *annot, char *nam } } -void pdf_update_appearance(pdf_document *doc, pdf_annot *annot) +void pdf_update_appearance(fz_context *ctx, pdf_document *doc, pdf_annot *annot) { pdf_obj *obj = annot->obj; - if (!pdf_dict_gets(obj, "AP") || pdf_obj_is_dirty(obj)) + if (!pdf_dict_gets(ctx, obj, "AP") || pdf_obj_is_dirty(ctx, obj)) { - fz_annot_type type = pdf_annot_obj_type(obj); + fz_annot_type type = pdf_annot_obj_type(ctx, obj); switch (type) { case FZ_ANNOT_WIDGET: - switch (pdf_field_type(doc, obj)) + switch (pdf_field_type(ctx, doc, obj)) { case PDF_WIDGET_TYPE_TEXT: { #if 0 - pdf_obj *formatting = pdf_dict_getp(obj, "AA/F"); + pdf_obj *formatting = pdf_dict_getp(ctx, obj, "AA/F"); if (formatting && doc->js) { /* Apply formatting */ pdf_js_event e; - fz_context *ctx = doc->ctx; - e.target = obj; - e.value = pdf_field_value(doc, obj); + e.value = pdf_field_value(ctx, doc, obj); fz_try(ctx) { pdf_js_setup_event(doc->js, &e); @@ -2242,47 +2223,47 @@ void pdf_update_appearance(pdf_document *doc, pdf_annot *annot) { fz_rethrow(ctx); } - execute_action(doc, obj, formatting); + execute_action(ctx, doc, obj, formatting); /* Update appearance from JS event.value */ - pdf_update_text_appearance(doc, obj, pdf_js_get_event(doc->js)->value); + pdf_update_text_appearance(ctx, doc, obj, pdf_js_get_event(doc->js)->value); } else #endif { /* Update appearance from field value */ - pdf_update_text_appearance(doc, obj, NULL); + pdf_update_text_appearance(ctx, doc, obj, NULL); } } break; case PDF_WIDGET_TYPE_PUSHBUTTON: - pdf_update_pushbutton_appearance(doc, obj); + pdf_update_pushbutton_appearance(ctx, doc, obj); break; case PDF_WIDGET_TYPE_LISTBOX: case PDF_WIDGET_TYPE_COMBOBOX: /* Treating listbox and combobox identically for now, * and the behaviour is most appropriate for a combobox */ - pdf_update_combobox_appearance(doc, obj); + pdf_update_combobox_appearance(ctx, doc, obj); break; } break; case FZ_ANNOT_TEXT: - pdf_update_text_annot_appearance(doc, annot); + pdf_update_text_annot_appearance(ctx, doc, annot); break; case FZ_ANNOT_FREETEXT: - pdf_update_free_text_annot_appearance(doc, annot); + pdf_update_free_text_annot_appearance(ctx, doc, annot); break; case FZ_ANNOT_STRIKEOUT: case FZ_ANNOT_UNDERLINE: case FZ_ANNOT_HIGHLIGHT: - pdf_update_text_markup_appearance(doc, annot, type); + pdf_update_text_markup_appearance(ctx, doc, annot, type); break; case FZ_ANNOT_INK: - pdf_update_ink_appearance(doc, annot); + pdf_update_ink_appearance(ctx, doc, annot); break; default: break; } - pdf_clean_obj(obj); + pdf_clean_obj(ctx, obj); } } diff --git a/source/pdf/pdf-clean.c b/source/pdf/pdf-clean.c index 51a8b6de..89926832 100644 --- a/source/pdf/pdf-clean.c +++ b/source/pdf/pdf-clean.c @@ -1,9 +1,8 @@ #include "pdf-interpret-imp.h" static void -pdf_clean_stream_object(pdf_document *doc, pdf_obj *obj, pdf_obj *orig_res, fz_cookie *cookie, int own_res) +pdf_clean_stream_object(fz_context *ctx, pdf_document *doc, pdf_obj *obj, pdf_obj *orig_res, fz_cookie *cookie, int own_res) { - fz_context *ctx = doc->ctx; pdf_process process, process2; fz_buffer *buffer; int num; @@ -22,33 +21,33 @@ pdf_clean_stream_object(pdf_document *doc, pdf_obj *obj, pdf_obj *orig_res, fz_c { if (own_res) { - pdf_obj *r = pdf_dict_gets(obj, "Resources"); + pdf_obj *r = pdf_dict_gets(ctx, obj, "Resources"); if (r) orig_res = r; } - res = pdf_new_dict(doc, 1); + res = pdf_new_dict(ctx, doc, 1); - pdf_process_buffer(&process2, ctx, buffer); - pdf_process_filter(&process, ctx, &process2, res); + pdf_init_process_buffer(ctx, &process2, buffer); + pdf_init_process_filter(ctx, &process, &process2, res); - pdf_process_stream_object(doc, obj, &process, orig_res, cookie); + pdf_process_stream_object(ctx, doc, obj, &process, orig_res, cookie); - num = pdf_to_num(obj); - pdf_dict_dels(obj, "Filter"); - pdf_update_stream(doc, num, buffer); + num = pdf_to_num(ctx, obj); + pdf_dict_dels(ctx, obj, "Filter"); + pdf_update_stream(ctx, doc, num, buffer); if (own_res) { - ref = pdf_new_ref(doc, res); - pdf_dict_puts(obj, "Resources", ref); + ref = pdf_new_ref(ctx, doc, res); + pdf_dict_puts(ctx, obj, "Resources", ref); } } fz_always(ctx) { fz_drop_buffer(ctx, buffer); - pdf_drop_obj(res); - pdf_drop_obj(ref); + pdf_drop_obj(ctx, res); + pdf_drop_obj(ctx, ref); } fz_catch(ctx) { @@ -57,9 +56,8 @@ pdf_clean_stream_object(pdf_document *doc, pdf_obj *obj, pdf_obj *orig_res, fz_c } static void -pdf_clean_type3(pdf_document *doc, pdf_obj *obj, pdf_obj *orig_res, fz_cookie *cookie) +pdf_clean_type3(fz_context *ctx, pdf_document *doc, pdf_obj *obj, pdf_obj *orig_res, fz_cookie *cookie) { - fz_context *ctx = doc->ctx; pdf_process process, process2; fz_buffer *buffer; int num, i, l; @@ -72,46 +70,46 @@ pdf_clean_type3(pdf_document *doc, pdf_obj *obj, pdf_obj *orig_res, fz_cookie *c fz_try(ctx) { - res = pdf_dict_gets(obj, "Resources"); + res = pdf_dict_gets(ctx, obj, "Resources"); if (res) orig_res = res; res = NULL; - res = pdf_new_dict(doc, 1); + res = pdf_new_dict(ctx, doc, 1); - charprocs = pdf_dict_gets(obj, "CharProcs"); - l = pdf_dict_len(charprocs); + charprocs = pdf_dict_gets(ctx, obj, "CharProcs"); + l = pdf_dict_len(ctx, charprocs); for (i = 0; i < l; i++) { - pdf_obj *key = pdf_dict_get_key(charprocs, i); - pdf_obj *val = pdf_dict_get_val(charprocs, i); + pdf_obj *key = pdf_dict_get_key(ctx, charprocs, i); + pdf_obj *val = pdf_dict_get_val(ctx, charprocs, i); buffer = fz_new_buffer(ctx, 1024); - pdf_process_buffer(&process2, ctx, buffer); - pdf_process_filter(&process, ctx, &process2, res); + pdf_init_process_buffer(ctx, &process2, buffer); + pdf_init_process_filter(ctx, &process, &process2, res); - pdf_process_stream_object(doc, val, &process, orig_res, cookie); + pdf_process_stream_object(ctx, doc, val, &process, orig_res, cookie); - num = pdf_to_num(val); - pdf_dict_dels(val, "Filter"); - pdf_update_stream(doc, num, buffer); - pdf_dict_put(charprocs, key, val); + num = pdf_to_num(ctx, val); + pdf_dict_dels(ctx, val, "Filter"); + pdf_update_stream(ctx, doc, num, buffer); + pdf_dict_put(ctx, charprocs, key, val); fz_drop_buffer(ctx, buffer); buffer = NULL; } /* ProcSet - no cleaning possible. Inherit this from the old dict. */ - pdf_dict_puts(res, "ProcSet", pdf_dict_gets(orig_res, "ProcSet")); + pdf_dict_puts(ctx, res, "ProcSet", pdf_dict_gets(ctx, orig_res, "ProcSet")); - ref = pdf_new_ref(doc, res); - pdf_dict_puts(obj, "Resources", ref); + ref = pdf_new_ref(ctx, doc, res); + pdf_dict_puts(ctx, obj, "Resources", ref); } fz_always(ctx) { fz_drop_buffer(ctx, buffer); - pdf_drop_obj(res); - pdf_drop_obj(ref); + pdf_drop_obj(ctx, res); + pdf_drop_obj(ctx, ref); } fz_catch(ctx) { @@ -119,9 +117,8 @@ pdf_clean_type3(pdf_document *doc, pdf_obj *obj, pdf_obj *orig_res, fz_cookie *c } } -void pdf_clean_page_contents(pdf_document *doc, pdf_page *page, fz_cookie *cookie) +void pdf_clean_page_contents(fz_context *ctx, pdf_document *doc, pdf_page *page, fz_cookie *cookie) { - fz_context *ctx = doc->ctx; pdf_process process, process2; fz_buffer *buffer = fz_new_buffer(ctx, 1024); int num; @@ -139,37 +136,37 @@ void pdf_clean_page_contents(pdf_document *doc, pdf_page *page, fz_cookie *cooki fz_try(ctx) { - res = pdf_new_dict(doc, 1); + res = pdf_new_dict(ctx, doc, 1); - pdf_process_buffer(&process2, ctx, buffer); - pdf_process_filter(&process, ctx, &process2, res); + pdf_init_process_buffer(ctx, &process2, buffer); + pdf_init_process_filter(ctx, &process, &process2, res); - pdf_process_stream_object(doc, page->contents, &process, page->resources, cookie); + pdf_process_stream_object(ctx, doc, page->contents, &process, page->resources, cookie); contents = page->contents; - if (pdf_is_array(contents)) + if (pdf_is_array(ctx, contents)) { - int n = pdf_array_len(contents); + int n = pdf_array_len(ctx, contents); int i; for (i = n-1; i > 0; i--) - pdf_array_delete(contents, i); + pdf_array_delete(ctx, contents, i); /* We cannot rewrite the 0th entry of contents * directly as it may occur in other pages content * dictionaries too. We therefore clone it and make * a new object reference. */ - new_obj = pdf_copy_dict(pdf_array_get(contents, 0)); - new_ref = pdf_new_ref(doc, new_obj); - num = pdf_to_num(new_ref); - pdf_array_put(contents, 0, new_ref); - pdf_dict_dels(new_obj, "Filter"); + new_obj = pdf_copy_dict(ctx, pdf_array_get(ctx, contents, 0)); + new_ref = pdf_new_ref(ctx, doc, new_obj); + num = pdf_to_num(ctx, new_ref); + pdf_array_put(ctx, contents, 0, new_ref); + pdf_dict_dels(ctx, new_obj, "Filter"); } else { - num = pdf_to_num(contents); - pdf_dict_dels(contents, "Filter"); + num = pdf_to_num(ctx, contents); + pdf_dict_dels(ctx, contents, "Filter"); } - pdf_update_stream(doc, num, buffer); + pdf_update_stream(ctx, doc, num, buffer); /* Now deal with resources. The spec allows for Type3 fonts and form * XObjects to omit a resource dictionary and look in the parent. @@ -177,104 +174,104 @@ void pdf_clean_page_contents(pdf_document *doc, pdf_page *page, fz_cookie *cooki * conceivably cause changes in rendering, but we don't care. */ /* ExtGState */ - obj = pdf_dict_gets(res, "ExtGState"); + obj = pdf_dict_gets(ctx, res, "ExtGState"); if (obj) { int i, l; - l = pdf_dict_len(obj); + l = pdf_dict_len(ctx, obj); for (i = 0; i < l; i++) { - pdf_obj *o = pdf_dict_gets(pdf_dict_get_val(obj, i), "SMask"); + pdf_obj *o = pdf_dict_gets(ctx, pdf_dict_get_val(ctx, obj, i), "SMask"); if (!o) continue; - o = pdf_dict_gets(o, "G"); + o = pdf_dict_gets(ctx, o, "G"); if (!o) continue; /* Transparency group XObject */ - pdf_clean_stream_object(doc, o, page->resources, cookie, 1); + pdf_clean_stream_object(ctx, doc, o, page->resources, cookie, 1); } } /* ColorSpace - no cleaning possible */ /* Pattern */ - obj = pdf_dict_gets(res, "Pattern"); + obj = pdf_dict_gets(ctx, res, "Pattern"); if (obj) { int i, l; - l = pdf_dict_len(obj); + l = pdf_dict_len(ctx, obj); for (i = 0; i < l; i++) { - pdf_obj *pat = pdf_dict_get_val(obj, i); + pdf_obj *pat = pdf_dict_get_val(ctx, obj, i); if (!pat) continue; - if (pdf_to_int(pdf_dict_gets(pat, "PatternType")) == 1) - pdf_clean_stream_object(doc, pat, page->resources, cookie, 0); + if (pdf_to_int(ctx, pdf_dict_gets(ctx, pat, "PatternType")) == 1) + pdf_clean_stream_object(ctx, doc, pat, page->resources, cookie, 0); } } /* Shading - no cleaning possible */ /* XObject */ - obj = pdf_dict_gets(res, "XObject"); + obj = pdf_dict_gets(ctx, res, "XObject"); if (obj) { int i, l; - l = pdf_dict_len(obj); + l = pdf_dict_len(ctx, obj); for (i = 0; i < l; i++) { - pdf_obj *xobj = pdf_dict_get_val(obj, i); + pdf_obj *xobj = pdf_dict_get_val(ctx, obj, i); - if (strcmp(pdf_to_name(pdf_dict_gets(xobj, "Subtype")), "Form")) + if (strcmp(pdf_to_name(ctx, pdf_dict_gets(ctx, xobj, "Subtype")), "Form")) continue; - pdf_clean_stream_object(doc, xobj, page->resources, cookie, 1); + pdf_clean_stream_object(ctx, doc, xobj, page->resources, cookie, 1); } } /* Font */ - obj = pdf_dict_gets(res, "Font"); + obj = pdf_dict_gets(ctx, res, "Font"); if (obj) { int i, l; - l = pdf_dict_len(obj); + l = pdf_dict_len(ctx, obj); for (i = 0; i < l; i++) { - pdf_obj *o = pdf_dict_get_val(obj, i); + pdf_obj *o = pdf_dict_get_val(ctx, obj, i); - if (!strcmp(pdf_to_name(pdf_dict_gets(o, "Subtype")), "Type3")) + if (!strcmp(pdf_to_name(ctx, pdf_dict_gets(ctx, o, "Subtype")), "Type3")) { - pdf_clean_type3(doc, o, page->resources, cookie); + pdf_clean_type3(ctx, doc, o, page->resources, cookie); } } } /* ProcSet - no cleaning possible. Inherit this from the old dict. */ - obj = pdf_dict_gets(page->resources, "ProcSet"); + obj = pdf_dict_gets(ctx, page->resources, "ProcSet"); if (obj) - pdf_dict_puts(res, "ProcSet", obj); + pdf_dict_puts(ctx, res, "ProcSet", obj); /* Properties - no cleaning possible. */ - pdf_drop_obj(page->resources); - ref = pdf_new_ref(doc, res); - page->resources = pdf_keep_obj(ref); - pdf_dict_puts(page->me, "Resources", ref); + pdf_drop_obj(ctx, page->resources); + ref = pdf_new_ref(ctx, doc, res); + page->resources = pdf_keep_obj(ctx, ref); + pdf_dict_puts(ctx, page->me, "Resources", ref); } fz_always(ctx) { fz_drop_buffer(ctx, buffer); - pdf_drop_obj(new_obj); - pdf_drop_obj(new_ref); - pdf_drop_obj(res); - pdf_drop_obj(ref); + pdf_drop_obj(ctx, new_obj); + pdf_drop_obj(ctx, new_ref); + pdf_drop_obj(ctx, res); + pdf_drop_obj(ctx, ref); } fz_catch(ctx) { diff --git a/source/pdf/pdf-cmap-load.c b/source/pdf/pdf-cmap-load.c index e3bf943d..46338539 100644 --- a/source/pdf/pdf-cmap-load.c +++ b/source/pdf/pdf-cmap-load.c @@ -18,14 +18,13 @@ pdf_cmap_size(fz_context *ctx, pdf_cmap *cmap) * Load CMap stream in PDF file */ pdf_cmap * -pdf_load_embedded_cmap(pdf_document *doc, pdf_obj *stmobj) +pdf_load_embedded_cmap(fz_context *ctx, pdf_document *doc, pdf_obj *stmobj) { fz_stream *file = NULL; pdf_cmap *cmap = NULL; pdf_cmap *usecmap; pdf_obj *wmode; pdf_obj *obj = NULL; - fz_context *ctx = doc->ctx; int phase = 0; fz_var(phase); @@ -33,7 +32,7 @@ pdf_load_embedded_cmap(pdf_document *doc, pdf_obj *stmobj) fz_var(file); fz_var(cmap); - if (pdf_obj_marked(stmobj)) + if (pdf_obj_marked(ctx, stmobj)) fz_throw(ctx, FZ_ERROR_GENERIC, "Recursion in embedded cmap"); if ((cmap = pdf_find_item(ctx, pdf_drop_cmap_imp, stmobj)) != NULL) @@ -43,29 +42,29 @@ pdf_load_embedded_cmap(pdf_document *doc, pdf_obj *stmobj) fz_try(ctx) { - file = pdf_open_stream(doc, pdf_to_num(stmobj), pdf_to_gen(stmobj)); + file = pdf_open_stream(ctx, doc, pdf_to_num(ctx, stmobj), pdf_to_gen(ctx, stmobj)); phase = 1; cmap = pdf_load_cmap(ctx, file); phase = 2; - fz_drop_stream(file); + fz_drop_stream(ctx, file); file = NULL; - wmode = pdf_dict_gets(stmobj, "WMode"); - if (pdf_is_int(wmode)) - pdf_set_cmap_wmode(ctx, cmap, pdf_to_int(wmode)); - obj = pdf_dict_gets(stmobj, "UseCMap"); - if (pdf_is_name(obj)) + wmode = pdf_dict_gets(ctx, stmobj, "WMode"); + if (pdf_is_int(ctx, wmode)) + pdf_set_cmap_wmode(ctx, cmap, pdf_to_int(ctx, wmode)); + obj = pdf_dict_gets(ctx, stmobj, "UseCMap"); + if (pdf_is_name(ctx, obj)) { - usecmap = pdf_load_system_cmap(ctx, pdf_to_name(obj)); + usecmap = pdf_load_system_cmap(ctx, pdf_to_name(ctx, obj)); pdf_set_usecmap(ctx, cmap, usecmap); pdf_drop_cmap(ctx, usecmap); } - else if (pdf_is_indirect(obj)) + else if (pdf_is_indirect(ctx, obj)) { phase = 3; - pdf_mark_obj(obj); - usecmap = pdf_load_embedded_cmap(doc, obj); - pdf_unmark_obj(obj); + pdf_mark_obj(ctx, obj); + usecmap = pdf_load_embedded_cmap(ctx, doc, obj); + pdf_unmark_obj(ctx, obj); phase = 4; pdf_set_usecmap(ctx, cmap, usecmap); pdf_drop_cmap(ctx, usecmap); @@ -76,20 +75,20 @@ pdf_load_embedded_cmap(pdf_document *doc, pdf_obj *stmobj) fz_catch(ctx) { if (file) - fz_drop_stream(file); + fz_drop_stream(ctx, file); if (cmap) pdf_drop_cmap(ctx, cmap); if (phase < 1) - fz_rethrow_message(ctx, "cannot open cmap stream (%d %d R)", pdf_to_num(stmobj), pdf_to_gen(stmobj)); + fz_rethrow_message(ctx, "cannot open cmap stream (%d %d R)", pdf_to_num(ctx, stmobj), pdf_to_gen(ctx, stmobj)); else if (phase < 2) - fz_rethrow_message(ctx, "cannot parse cmap stream (%d %d R)", pdf_to_num(stmobj), pdf_to_gen(stmobj)); + fz_rethrow_message(ctx, "cannot parse cmap stream (%d %d R)", pdf_to_num(ctx, stmobj), pdf_to_gen(ctx, stmobj)); else if (phase < 3) - fz_rethrow_message(ctx, "cannot load system usecmap '%s'", pdf_to_name(obj)); + fz_rethrow_message(ctx, "cannot load system usecmap '%s'", pdf_to_name(ctx, obj)); else { if (phase == 3) - pdf_unmark_obj(obj); - fz_rethrow_message(ctx, "cannot load embedded usecmap (%d %d R)", pdf_to_num(obj), pdf_to_gen(obj)); + pdf_unmark_obj(ctx, obj); + fz_rethrow_message(ctx, "cannot load embedded usecmap (%d %d R)", pdf_to_num(ctx, obj), pdf_to_gen(ctx, obj)); } } diff --git a/source/pdf/pdf-cmap-parse.c b/source/pdf/pdf-cmap-parse.c index 361c512f..c502ffe5 100644 --- a/source/pdf/pdf-cmap-parse.c +++ b/source/pdf/pdf-cmap-parse.c @@ -18,7 +18,7 @@ pdf_parse_cmap_name(fz_context *ctx, pdf_cmap *cmap, fz_stream *file, pdf_lexbuf { pdf_token tok; - tok = pdf_lex(file, buf); + tok = pdf_lex(ctx, file, buf); if (tok == PDF_TOK_NAME) fz_strlcpy(cmap->cmap_name, buf->scratch, sizeof(cmap->cmap_name)); @@ -31,7 +31,7 @@ pdf_parse_wmode(fz_context *ctx, pdf_cmap *cmap, fz_stream *file, pdf_lexbuf *bu { pdf_token tok; - tok = pdf_lex(file, buf); + tok = pdf_lex(ctx, file, buf); if (tok == PDF_TOK_INT) pdf_set_cmap_wmode(ctx, cmap, buf->i); @@ -47,7 +47,7 @@ pdf_parse_codespace_range(fz_context *ctx, pdf_cmap *cmap, fz_stream *file, pdf_ while (1) { - tok = pdf_lex(file, buf); + tok = pdf_lex(ctx, file, buf); if (tok == PDF_TOK_KEYWORD && !strcmp(buf->scratch, "endcodespacerange")) return; @@ -55,7 +55,7 @@ pdf_parse_codespace_range(fz_context *ctx, pdf_cmap *cmap, fz_stream *file, pdf_ else if (tok == PDF_TOK_STRING) { lo = pdf_code_from_string(buf->scratch, buf->len); - tok = pdf_lex(file, buf); + tok = pdf_lex(ctx, file, buf); if (tok == PDF_TOK_STRING) { hi = pdf_code_from_string(buf->scratch, buf->len); @@ -78,7 +78,7 @@ pdf_parse_cid_range(fz_context *ctx, pdf_cmap *cmap, fz_stream *file, pdf_lexbuf while (1) { - tok = pdf_lex(file, buf); + tok = pdf_lex(ctx, file, buf); if (tok == PDF_TOK_KEYWORD && !strcmp(buf->scratch, "endcidrange")) return; @@ -88,13 +88,13 @@ pdf_parse_cid_range(fz_context *ctx, pdf_cmap *cmap, fz_stream *file, pdf_lexbuf lo = pdf_code_from_string(buf->scratch, buf->len); - tok = pdf_lex(file, buf); + tok = pdf_lex(ctx, file, buf); if (tok != PDF_TOK_STRING) fz_throw(ctx, FZ_ERROR_GENERIC, "expected string"); hi = pdf_code_from_string(buf->scratch, buf->len); - tok = pdf_lex(file, buf); + tok = pdf_lex(ctx, file, buf); if (tok != PDF_TOK_INT) fz_throw(ctx, FZ_ERROR_GENERIC, "expected integer"); @@ -112,7 +112,7 @@ pdf_parse_cid_char(fz_context *ctx, pdf_cmap *cmap, fz_stream *file, pdf_lexbuf while (1) { - tok = pdf_lex(file, buf); + tok = pdf_lex(ctx, file, buf); if (tok == PDF_TOK_KEYWORD && !strcmp(buf->scratch, "endcidchar")) return; @@ -122,7 +122,7 @@ pdf_parse_cid_char(fz_context *ctx, pdf_cmap *cmap, fz_stream *file, pdf_lexbuf src = pdf_code_from_string(buf->scratch, buf->len); - tok = pdf_lex(file, buf); + tok = pdf_lex(ctx, file, buf); if (tok != PDF_TOK_INT) fz_throw(ctx, FZ_ERROR_GENERIC, "expected integer"); @@ -141,7 +141,7 @@ pdf_parse_bf_range_array(fz_context *ctx, pdf_cmap *cmap, fz_stream *file, pdf_l while (1) { - tok = pdf_lex(file, buf); + tok = pdf_lex(ctx, file, buf); if (tok == PDF_TOK_CLOSE_ARRAY) return; @@ -171,7 +171,7 @@ pdf_parse_bf_range(fz_context *ctx, pdf_cmap *cmap, fz_stream *file, pdf_lexbuf while (1) { - tok = pdf_lex(file, buf); + tok = pdf_lex(ctx, file, buf); if (tok == PDF_TOK_KEYWORD && !strcmp(buf->scratch, "endbfrange")) return; @@ -181,7 +181,7 @@ pdf_parse_bf_range(fz_context *ctx, pdf_cmap *cmap, fz_stream *file, pdf_lexbuf lo = pdf_code_from_string(buf->scratch, buf->len); - tok = pdf_lex(file, buf); + tok = pdf_lex(ctx, file, buf); if (tok != PDF_TOK_STRING) fz_throw(ctx, FZ_ERROR_GENERIC, "expected string"); @@ -192,7 +192,7 @@ pdf_parse_bf_range(fz_context *ctx, pdf_cmap *cmap, fz_stream *file, pdf_lexbuf return; } - tok = pdf_lex(file, buf); + tok = pdf_lex(ctx, file, buf); if (tok == PDF_TOK_STRING) { @@ -244,7 +244,7 @@ pdf_parse_bf_char(fz_context *ctx, pdf_cmap *cmap, fz_stream *file, pdf_lexbuf * while (1) { - tok = pdf_lex(file, buf); + tok = pdf_lex(ctx, file, buf); if (tok == PDF_TOK_KEYWORD && !strcmp(buf->scratch, "endbfchar")) return; @@ -254,7 +254,7 @@ pdf_parse_bf_char(fz_context *ctx, pdf_cmap *cmap, fz_stream *file, pdf_lexbuf * src = pdf_code_from_string(buf->scratch, buf->len); - tok = pdf_lex(file, buf); + tok = pdf_lex(ctx, file, buf); /* Note: does not handle /dstName */ if (tok != PDF_TOK_STRING) fz_throw(ctx, FZ_ERROR_GENERIC, "expected string"); @@ -286,7 +286,7 @@ pdf_load_cmap(fz_context *ctx, fz_stream *file) { while (1) { - tok = pdf_lex(file, &buf); + tok = pdf_lex(ctx, file, &buf); if (tok == PDF_TOK_EOF) break; @@ -332,7 +332,7 @@ pdf_load_cmap(fz_context *ctx, fz_stream *file) } fz_always(ctx) { - pdf_lexbuf_fin(&buf); + pdf_lexbuf_fin(ctx, &buf); } fz_catch(ctx) { diff --git a/source/pdf/pdf-colorspace.c b/source/pdf/pdf-colorspace.c index 50a6f9d1..a58dc961 100644 --- a/source/pdf/pdf-colorspace.c +++ b/source/pdf/pdf-colorspace.c @@ -3,14 +3,13 @@ /* ICCBased */ static fz_colorspace * -load_icc_based(pdf_document *doc, pdf_obj *dict) +load_icc_based(fz_context *ctx, pdf_document *doc, pdf_obj *dict) { int n; pdf_obj *obj; - fz_context *ctx = doc->ctx; - n = pdf_to_int(pdf_dict_gets(dict, "N")); - obj = pdf_dict_gets(dict, "Alternate"); + n = pdf_to_int(ctx, pdf_dict_gets(ctx, dict, "N")); + obj = pdf_dict_gets(ctx, dict, "Alternate"); if (obj) { @@ -18,7 +17,7 @@ load_icc_based(pdf_document *doc, pdf_obj *dict) fz_try(ctx) { - cs_alt = pdf_load_colorspace(doc, obj); + cs_alt = pdf_load_colorspace(ctx, doc, obj); if (cs_alt->n != n) { fz_drop_colorspace(ctx, cs_alt); @@ -114,14 +113,13 @@ free_separation(fz_context *ctx, fz_colorspace *cs) } static fz_colorspace * -load_separation(pdf_document *doc, pdf_obj *array) +load_separation(fz_context *ctx, pdf_document *doc, pdf_obj *array) { fz_colorspace *cs; struct separation *sep = NULL; - fz_context *ctx = doc->ctx; - pdf_obj *nameobj = pdf_array_get(array, 1); - pdf_obj *baseobj = pdf_array_get(array, 2); - pdf_obj *tintobj = pdf_array_get(array, 3); + pdf_obj *nameobj = pdf_array_get(ctx, array, 1); + pdf_obj *baseobj = pdf_array_get(ctx, array, 2); + pdf_obj *tintobj = pdf_array_get(ctx, array, 3); fz_colorspace *base; fz_function *tint = NULL; int n; @@ -129,21 +127,21 @@ load_separation(pdf_document *doc, pdf_obj *array) fz_var(tint); fz_var(sep); - if (pdf_is_array(nameobj)) - n = pdf_array_len(nameobj); + if (pdf_is_array(ctx, nameobj)) + n = pdf_array_len(ctx, nameobj); else n = 1; if (n > FZ_MAX_COLORS) fz_throw(ctx, FZ_ERROR_GENERIC, "too many components in colorspace"); - base = pdf_load_colorspace(doc, baseobj); + base = pdf_load_colorspace(ctx, doc, baseobj); fz_try(ctx) { - tint = pdf_load_function(doc, tintobj, n, base->n); + tint = pdf_load_function(ctx, doc, tintobj, n, base->n); /* RJW: fz_drop_colorspace(ctx, base); - * "cannot load tint function (%d %d R)", pdf_to_num(tintobj), pdf_to_gen(tintobj) */ + * "cannot load tint function (%d %d R)", pdf_to_num(ctx, tintobj), pdf_to_gen(ctx, tintobj) */ sep = fz_malloc_struct(ctx, struct separation); sep->base = base; @@ -153,7 +151,7 @@ load_separation(pdf_document *doc, pdf_obj *array) cs->to_rgb = separation_to_rgb; cs->free_data = free_separation; cs->data = sep; - cs->size += sizeof(struct separation) + (base ? base->size : 0) + fz_function_size(tint); + cs->size += sizeof(struct separation) + (base ? base->size : 0) + fz_function_size(ctx, tint); } fz_catch(ctx) { @@ -167,7 +165,7 @@ load_separation(pdf_document *doc, pdf_obj *array) } int -pdf_is_tint_colorspace(fz_colorspace *cs) +pdf_is_tint_colorspace(fz_context *ctx, fz_colorspace *cs) { return cs && cs->to_rgb == separation_to_rgb; } @@ -175,12 +173,11 @@ pdf_is_tint_colorspace(fz_colorspace *cs) /* Indexed */ static fz_colorspace * -load_indexed(pdf_document *doc, pdf_obj *array) +load_indexed(fz_context *ctx, pdf_document *doc, pdf_obj *array) { - fz_context *ctx = doc->ctx; - pdf_obj *baseobj = pdf_array_get(array, 1); - pdf_obj *highobj = pdf_array_get(array, 2); - pdf_obj *lookupobj = pdf_array_get(array, 3); + pdf_obj *baseobj = pdf_array_get(ctx, array, 1); + pdf_obj *highobj = pdf_array_get(ctx, array, 2); + pdf_obj *lookupobj = pdf_array_get(ctx, array, 3); fz_colorspace *base = NULL; fz_colorspace *cs; int i, n, high; @@ -191,20 +188,20 @@ load_indexed(pdf_document *doc, pdf_obj *array) fz_try(ctx) { - base = pdf_load_colorspace(doc, baseobj); + base = pdf_load_colorspace(ctx, doc, baseobj); - high = pdf_to_int(highobj); + high = pdf_to_int(ctx, highobj); high = fz_clampi(high, 0, 255); n = base->n * (high + 1); lookup = fz_malloc_array(ctx, 1, n); - if (pdf_is_string(lookupobj) && pdf_to_str_len(lookupobj) >= n) + if (pdf_is_string(ctx, lookupobj) && pdf_to_str_len(ctx, lookupobj) >= n) { - unsigned char *buf = (unsigned char *) pdf_to_str_buf(lookupobj); + unsigned char *buf = (unsigned char *) pdf_to_str_buf(ctx, lookupobj); for (i = 0; i < n; i++) lookup[i] = buf[i]; } - else if (pdf_is_indirect(lookupobj)) + else if (pdf_is_indirect(ctx, lookupobj)) { fz_stream *file = NULL; @@ -212,18 +209,18 @@ load_indexed(pdf_document *doc, pdf_obj *array) fz_try(ctx) { - file = pdf_open_stream(doc, pdf_to_num(lookupobj), pdf_to_gen(lookupobj)); - i = fz_read(file, lookup, n); + file = pdf_open_stream(ctx, doc, pdf_to_num(ctx, lookupobj), pdf_to_gen(ctx, lookupobj)); + i = fz_read(ctx, file, lookup, n); if (i < n) memset(lookup+i, 0, n-i); } fz_always(ctx) { - fz_drop_stream(file); + fz_drop_stream(ctx, file); } fz_catch(ctx) { - fz_rethrow_message(ctx, "cannot open colorspace lookup table (%d 0 R)", pdf_to_num(lookupobj)); + fz_rethrow_message(ctx, "cannot open colorspace lookup table (%d 0 R)", pdf_to_num(ctx, lookupobj)); } } else @@ -246,16 +243,15 @@ load_indexed(pdf_document *doc, pdf_obj *array) /* Parse and create colorspace from PDF object */ static fz_colorspace * -pdf_load_colorspace_imp(pdf_document *doc, pdf_obj *obj) +pdf_load_colorspace_imp(fz_context *ctx, pdf_document *doc, pdf_obj *obj) { - fz_context *ctx = doc->ctx; - if (pdf_obj_marked(obj)) + if (pdf_obj_marked(ctx, obj)) fz_throw(ctx, FZ_ERROR_GENERIC, "Recursion in colorspace definition"); - if (pdf_is_name(obj)) + if (pdf_is_name(ctx, obj)) { - const char *str = pdf_to_name(obj); + const char *str = pdf_to_name(ctx, obj); if (!strcmp(str, "Pattern")) return fz_device_gray(ctx); else if (!strcmp(str, "G")) @@ -271,15 +267,15 @@ pdf_load_colorspace_imp(pdf_document *doc, pdf_obj *obj) else if (!strcmp(str, "DeviceCMYK")) return fz_device_cmyk(ctx); else - fz_throw(ctx, FZ_ERROR_GENERIC, "unknown colorspace: %s", pdf_to_name(obj)); + fz_throw(ctx, FZ_ERROR_GENERIC, "unknown colorspace: %s", pdf_to_name(ctx, obj)); } - else if (pdf_is_array(obj)) + else if (pdf_is_array(ctx, obj)) { - pdf_obj *name = pdf_array_get(obj, 0); - const char *str = pdf_to_name(name); + pdf_obj *name = pdf_array_get(ctx, obj, 0); + const char *str = pdf_to_name(ctx, name); - if (pdf_is_name(name)) + if (pdf_is_name(ctx, name)) { /* load base colorspace instead */ if (!strcmp(str, "G")) @@ -307,39 +303,39 @@ pdf_load_colorspace_imp(pdf_document *doc, pdf_obj *obj) fz_colorspace *cs; fz_try(ctx) { - pdf_mark_obj(obj); + pdf_mark_obj(ctx, obj); if (!strcmp(str, "ICCBased")) - cs = load_icc_based(doc, pdf_array_get(obj, 1)); + cs = load_icc_based(ctx, doc, pdf_array_get(ctx, obj, 1)); else if (!strcmp(str, "Indexed")) - cs = load_indexed(doc, obj); + cs = load_indexed(ctx, doc, obj); else if (!strcmp(str, "I")) - cs = load_indexed(doc, obj); + cs = load_indexed(ctx, doc, obj); else if (!strcmp(str, "Separation")) - cs = load_separation(doc, obj); + cs = load_separation(ctx, doc, obj); else if (!strcmp(str, "DeviceN")) - cs = load_separation(doc, obj); + cs = load_separation(ctx, doc, obj); else if (!strcmp(str, "Pattern")) { pdf_obj *pobj; - pobj = pdf_array_get(obj, 1); + pobj = pdf_array_get(ctx, obj, 1); if (!pobj) { cs = fz_device_gray(ctx); break; } - cs = pdf_load_colorspace(doc, pobj); + cs = pdf_load_colorspace(ctx, doc, pobj); } else fz_throw(ctx, FZ_ERROR_GENERIC, "syntaxerror: unknown colorspace %s", str); } fz_always(ctx) { - pdf_unmark_obj(obj); + pdf_unmark_obj(ctx, obj); } fz_catch(ctx) { @@ -350,13 +346,12 @@ pdf_load_colorspace_imp(pdf_document *doc, pdf_obj *obj) } } - fz_throw(doc->ctx, FZ_ERROR_GENERIC, "syntaxerror: could not parse color space (%d %d R)", pdf_to_num(obj), pdf_to_gen(obj)); + fz_throw(ctx, FZ_ERROR_GENERIC, "syntaxerror: could not parse color space (%d %d R)", pdf_to_num(ctx, obj), pdf_to_gen(ctx, obj)); } fz_colorspace * -pdf_load_colorspace(pdf_document *doc, pdf_obj *obj) +pdf_load_colorspace(fz_context *ctx, pdf_document *doc, pdf_obj *obj) { - fz_context *ctx = doc->ctx; fz_colorspace *cs; if ((cs = pdf_find_item(ctx, fz_drop_colorspace_imp, obj)) != NULL) @@ -364,7 +359,7 @@ pdf_load_colorspace(pdf_document *doc, pdf_obj *obj) return cs; } - cs = pdf_load_colorspace_imp(doc, obj); + cs = pdf_load_colorspace_imp(ctx, doc, obj); pdf_store_item(ctx, obj, cs, cs->size); diff --git a/source/pdf/pdf-crypt.c b/source/pdf/pdf-crypt.c index 621885d0..4519657f 100644 --- a/source/pdf/pdf-crypt.c +++ b/source/pdf/pdf-crypt.c @@ -55,22 +55,22 @@ pdf_new_crypt(fz_context *ctx, pdf_obj *dict, pdf_obj *id) /* Common to all security handlers (PDF 1.7 table 3.18) */ - obj = pdf_dict_gets(dict, "Filter"); - if (!pdf_is_name(obj)) + obj = pdf_dict_gets(ctx, dict, "Filter"); + if (!pdf_is_name(ctx, obj)) { pdf_drop_crypt(ctx, crypt); fz_throw(ctx, FZ_ERROR_GENERIC, "unspecified encryption handler"); } - if (strcmp(pdf_to_name(obj), "Standard") != 0) + if (strcmp(pdf_to_name(ctx, obj), "Standard") != 0) { pdf_drop_crypt(ctx, crypt); - fz_throw(ctx, FZ_ERROR_GENERIC, "unknown encryption handler: '%s'", pdf_to_name(obj)); + fz_throw(ctx, FZ_ERROR_GENERIC, "unknown encryption handler: '%s'", pdf_to_name(ctx, obj)); } crypt->v = 0; - obj = pdf_dict_gets(dict, "V"); - if (pdf_is_int(obj)) - crypt->v = pdf_to_int(obj); + obj = pdf_dict_gets(ctx, dict, "V"); + if (pdf_is_int(ctx, obj)) + crypt->v = pdf_to_int(ctx, obj); if (crypt->v != 1 && crypt->v != 2 && crypt->v != 4 && crypt->v != 5) { pdf_drop_crypt(ctx, crypt); @@ -79,9 +79,9 @@ pdf_new_crypt(fz_context *ctx, pdf_obj *dict, pdf_obj *id) /* Standard security handler (PDF 1.7 table 3.19) */ - obj = pdf_dict_gets(dict, "R"); - if (pdf_is_int(obj)) - crypt->r = pdf_to_int(obj); + obj = pdf_dict_gets(ctx, dict, "R"); + if (pdf_is_int(ctx, obj)) + crypt->r = pdf_to_int(ctx, obj); else if (crypt->v <= 4) { fz_warn(ctx, "encryption dictionary missing revision value, guessing..."); @@ -104,28 +104,28 @@ pdf_new_crypt(fz_context *ctx, pdf_obj *dict, pdf_obj *id) fz_throw(ctx, FZ_ERROR_GENERIC, "unknown crypt revision %d", r); } - obj = pdf_dict_gets(dict, "O"); - if (pdf_is_string(obj) && pdf_to_str_len(obj) == 32) - memcpy(crypt->o, pdf_to_str_buf(obj), 32); + obj = pdf_dict_gets(ctx, dict, "O"); + if (pdf_is_string(ctx, obj) && pdf_to_str_len(ctx, obj) == 32) + memcpy(crypt->o, pdf_to_str_buf(ctx, obj), 32); /* /O and /U are supposed to be 48 bytes long for revision 5 and 6, they're often longer, though */ - else if (crypt->r >= 5 && pdf_is_string(obj) && pdf_to_str_len(obj) >= 48) - memcpy(crypt->o, pdf_to_str_buf(obj), 48); + else if (crypt->r >= 5 && pdf_is_string(ctx, obj) && pdf_to_str_len(ctx, obj) >= 48) + memcpy(crypt->o, pdf_to_str_buf(ctx, obj), 48); else { pdf_drop_crypt(ctx, crypt); fz_throw(ctx, FZ_ERROR_GENERIC, "encryption dictionary missing owner password"); } - obj = pdf_dict_gets(dict, "U"); - if (pdf_is_string(obj) && pdf_to_str_len(obj) == 32) - memcpy(crypt->u, pdf_to_str_buf(obj), 32); + obj = pdf_dict_gets(ctx, dict, "U"); + if (pdf_is_string(ctx, obj) && pdf_to_str_len(ctx, obj) == 32) + memcpy(crypt->u, pdf_to_str_buf(ctx, obj), 32); /* /O and /U are supposed to be 48 bytes long for revision 5 and 6, they're often longer, though */ - else if (crypt->r >= 5 && pdf_is_string(obj) && pdf_to_str_len(obj) >= 48) - memcpy(crypt->u, pdf_to_str_buf(obj), 48); - else if (pdf_is_string(obj) && pdf_to_str_len(obj) < 32) + else if (crypt->r >= 5 && pdf_is_string(ctx, obj) && pdf_to_str_len(ctx, obj) >= 48) + memcpy(crypt->u, pdf_to_str_buf(ctx, obj), 48); + else if (pdf_is_string(ctx, obj) && pdf_to_str_len(ctx, obj) < 32) { - fz_warn(ctx, "encryption password key too short (%d)", pdf_to_str_len(obj)); - memcpy(crypt->u, pdf_to_str_buf(obj), pdf_to_str_len(obj)); + fz_warn(ctx, "encryption password key too short (%d)", pdf_to_str_len(ctx, obj)); + memcpy(crypt->u, pdf_to_str_buf(ctx, obj), pdf_to_str_len(ctx, obj)); } else { @@ -133,9 +133,9 @@ pdf_new_crypt(fz_context *ctx, pdf_obj *dict, pdf_obj *id) fz_throw(ctx, FZ_ERROR_GENERIC, "encryption dictionary missing user password"); } - obj = pdf_dict_gets(dict, "P"); - if (pdf_is_int(obj)) - crypt->p = pdf_to_int(obj); + obj = pdf_dict_gets(ctx, dict, "P"); + if (pdf_is_int(ctx, obj)) + crypt->p = pdf_to_int(ctx, obj); else { fz_warn(ctx, "encryption dictionary missing permissions"); @@ -144,35 +144,35 @@ pdf_new_crypt(fz_context *ctx, pdf_obj *dict, pdf_obj *id) if (crypt->r == 5 || crypt->r == 6) { - obj = pdf_dict_gets(dict, "OE"); - if (!pdf_is_string(obj) || pdf_to_str_len(obj) != 32) + obj = pdf_dict_gets(ctx, dict, "OE"); + if (!pdf_is_string(ctx, obj) || pdf_to_str_len(ctx, obj) != 32) { pdf_drop_crypt(ctx, crypt); fz_throw(ctx, FZ_ERROR_GENERIC, "encryption dictionary missing owner encryption key"); } - memcpy(crypt->oe, pdf_to_str_buf(obj), 32); + memcpy(crypt->oe, pdf_to_str_buf(ctx, obj), 32); - obj = pdf_dict_gets(dict, "UE"); - if (!pdf_is_string(obj) || pdf_to_str_len(obj) != 32) + obj = pdf_dict_gets(ctx, dict, "UE"); + if (!pdf_is_string(ctx, obj) || pdf_to_str_len(ctx, obj) != 32) { pdf_drop_crypt(ctx, crypt); fz_throw(ctx, FZ_ERROR_GENERIC, "encryption dictionary missing user encryption key"); } - memcpy(crypt->ue, pdf_to_str_buf(obj), 32); + memcpy(crypt->ue, pdf_to_str_buf(ctx, obj), 32); } crypt->encrypt_metadata = 1; - obj = pdf_dict_gets(dict, "EncryptMetadata"); - if (pdf_is_bool(obj)) - crypt->encrypt_metadata = pdf_to_bool(obj); + obj = pdf_dict_gets(ctx, dict, "EncryptMetadata"); + if (pdf_is_bool(ctx, obj)) + crypt->encrypt_metadata = pdf_to_bool(ctx, obj); /* Extract file identifier string */ - if (pdf_is_array(id) && pdf_array_len(id) == 2) + if (pdf_is_array(ctx, id) && pdf_array_len(ctx, id) == 2) { - obj = pdf_array_get(id, 0); - if (pdf_is_string(obj)) - crypt->id = pdf_keep_obj(obj); + obj = pdf_array_get(ctx, id, 0); + if (pdf_is_string(ctx, obj)) + crypt->id = pdf_keep_obj(ctx, obj); } else fz_warn(ctx, "missing file identifier, may not be able to do decryption"); @@ -182,9 +182,9 @@ pdf_new_crypt(fz_context *ctx, pdf_obj *dict, pdf_obj *id) crypt->length = 40; if (crypt->v == 2 || crypt->v == 4) { - obj = pdf_dict_gets(dict, "Length"); - if (pdf_is_int(obj)) - crypt->length = pdf_to_int(obj); + obj = pdf_dict_gets(ctx, dict, "Length"); + if (pdf_is_int(ctx, obj)) + crypt->length = pdf_to_int(ctx, obj); /* work-around for pdf generators that assume length is in bytes */ if (crypt->length < 40) @@ -222,10 +222,10 @@ pdf_new_crypt(fz_context *ctx, pdf_obj *dict, pdf_obj *id) crypt->strf.method = PDF_CRYPT_NONE; crypt->strf.length = crypt->length; - obj = pdf_dict_gets(dict, "CF"); - if (pdf_is_dict(obj)) + obj = pdf_dict_gets(ctx, dict, "CF"); + if (pdf_is_dict(ctx, obj)) { - crypt->cf = pdf_keep_obj(obj); + crypt->cf = pdf_keep_obj(ctx, obj); } else { @@ -234,18 +234,18 @@ pdf_new_crypt(fz_context *ctx, pdf_obj *dict, pdf_obj *id) fz_try(ctx) { - obj = pdf_dict_gets(dict, "StmF"); - if (pdf_is_name(obj)) - pdf_parse_crypt_filter(ctx, &crypt->stmf, crypt, pdf_to_name(obj)); + obj = pdf_dict_gets(ctx, dict, "StmF"); + if (pdf_is_name(ctx, obj)) + pdf_parse_crypt_filter(ctx, &crypt->stmf, crypt, pdf_to_name(ctx, obj)); - obj = pdf_dict_gets(dict, "StrF"); - if (pdf_is_name(obj)) - pdf_parse_crypt_filter(ctx, &crypt->strf, crypt, pdf_to_name(obj)); + obj = pdf_dict_gets(ctx, dict, "StrF"); + if (pdf_is_name(ctx, obj)) + pdf_parse_crypt_filter(ctx, &crypt->strf, crypt, pdf_to_name(ctx, obj)); } fz_catch(ctx) { pdf_drop_crypt(ctx, crypt); - fz_rethrow_message(ctx, "cannot parse string crypt filter (%d %d R)", pdf_to_num(obj), pdf_to_gen(obj)); + fz_rethrow_message(ctx, "cannot parse string crypt filter (%d %d R)", pdf_to_num(ctx, obj), pdf_to_gen(ctx, obj)); } /* in crypt revision 4, the crypt filter determines the key length */ @@ -259,8 +259,8 @@ pdf_new_crypt(fz_context *ctx, pdf_obj *dict, pdf_obj *id) void pdf_drop_crypt(fz_context *ctx, pdf_crypt *crypt) { - pdf_drop_obj(crypt->id); - pdf_drop_obj(crypt->cf); + pdf_drop_obj(ctx, crypt->id); + pdf_drop_obj(ctx, crypt->cf); fz_free(ctx, crypt); } @@ -277,7 +277,7 @@ pdf_parse_crypt_filter(fz_context *ctx, pdf_crypt_filter *cf, pdf_crypt *crypt, int is_stdcf = (!is_identity && (strcmp(name, "StdCF") == 0)); if (!is_identity && !is_stdcf) - fz_throw(ctx, FZ_ERROR_GENERIC, "Crypt Filter not Identity or StdCF (%d %d R)", pdf_to_num(crypt->cf), pdf_to_gen(crypt->cf)); + fz_throw(ctx, FZ_ERROR_GENERIC, "Crypt Filter not Identity or StdCF (%d %d R)", pdf_to_num(ctx, crypt->cf), pdf_to_gen(ctx, crypt->cf)); cf->method = PDF_CRYPT_NONE; cf->length = crypt->length; @@ -288,28 +288,28 @@ pdf_parse_crypt_filter(fz_context *ctx, pdf_crypt_filter *cf, pdf_crypt *crypt, return; } - dict = pdf_dict_gets(crypt->cf, name); - if (!pdf_is_dict(dict)) - fz_throw(ctx, FZ_ERROR_GENERIC, "cannot parse crypt filter (%d %d R)", pdf_to_num(crypt->cf), pdf_to_gen(crypt->cf)); + dict = pdf_dict_gets(ctx, crypt->cf, name); + if (!pdf_is_dict(ctx, dict)) + fz_throw(ctx, FZ_ERROR_GENERIC, "cannot parse crypt filter (%d %d R)", pdf_to_num(ctx, crypt->cf), pdf_to_gen(ctx, crypt->cf)); - obj = pdf_dict_gets(dict, "CFM"); - if (pdf_is_name(obj)) + obj = pdf_dict_gets(ctx, dict, "CFM"); + if (pdf_is_name(ctx, obj)) { - if (!strcmp(pdf_to_name(obj), "None")) + if (!strcmp(pdf_to_name(ctx, obj), "None")) cf->method = PDF_CRYPT_NONE; - else if (!strcmp(pdf_to_name(obj), "V2")) + else if (!strcmp(pdf_to_name(ctx, obj), "V2")) cf->method = PDF_CRYPT_RC4; - else if (!strcmp(pdf_to_name(obj), "AESV2")) + else if (!strcmp(pdf_to_name(ctx, obj), "AESV2")) cf->method = PDF_CRYPT_AESV2; - else if (!strcmp(pdf_to_name(obj), "AESV3")) + else if (!strcmp(pdf_to_name(ctx, obj), "AESV3")) cf->method = PDF_CRYPT_AESV3; else - fz_warn(ctx, "unknown encryption method: %s", pdf_to_name(obj)); + fz_warn(ctx, "unknown encryption method: %s", pdf_to_name(ctx, obj)); } - obj = pdf_dict_gets(dict, "Length"); - if (pdf_is_int(obj)) - cf->length = pdf_to_int(obj); + obj = pdf_dict_gets(ctx, dict, "Length"); + if (pdf_is_int(ctx, obj)) + cf->length = pdf_to_int(ctx, obj); /* the length for crypt filters is supposed to be in bytes not bits */ if (cf->length < 40) @@ -338,7 +338,7 @@ static const unsigned char padding[32] = }; static void -pdf_compute_encryption_key(pdf_crypt *crypt, unsigned char *password, int pwlen, unsigned char *key) +pdf_compute_encryption_key(fz_context *ctx, pdf_crypt *crypt, unsigned char *password, int pwlen, unsigned char *key) { unsigned char buf[32]; unsigned int p; @@ -369,7 +369,7 @@ pdf_compute_encryption_key(pdf_crypt *crypt, unsigned char *password, int pwlen, fz_md5_update(&md5, buf, 4); /* Step 5 - pass first element of ID array */ - fz_md5_update(&md5, (unsigned char *)pdf_to_str_buf(crypt->id), pdf_to_str_len(crypt->id)); + fz_md5_update(&md5, (unsigned char *)pdf_to_str_buf(ctx, crypt->id), pdf_to_str_len(ctx, crypt->id)); /* Step 6 (revision 4 or greater) - if metadata is not encrypted pass 0xFFFFFFFF */ if (crypt->r >= 4) @@ -558,7 +558,7 @@ pdf_compute_user_password(fz_context *ctx, pdf_crypt *crypt, unsigned char *pass { fz_arc4 arc4; - pdf_compute_encryption_key(crypt, password, pwlen, crypt->key); + pdf_compute_encryption_key(ctx, crypt, password, pwlen, crypt->key); fz_arc4_init(&arc4, crypt->key, crypt->length / 8); fz_arc4_encrypt(&arc4, output, padding, 32); } @@ -573,11 +573,11 @@ pdf_compute_user_password(fz_context *ctx, pdf_crypt *crypt, unsigned char *pass n = crypt->length / 8; - pdf_compute_encryption_key(crypt, password, pwlen, crypt->key); + pdf_compute_encryption_key(ctx, crypt, password, pwlen, crypt->key); fz_md5_init(&md5); fz_md5_update(&md5, padding, 32); - fz_md5_update(&md5, (unsigned char*)pdf_to_str_buf(crypt->id), pdf_to_str_len(crypt->id)); + fz_md5_update(&md5, (unsigned char*)pdf_to_str_buf(ctx, crypt->id), pdf_to_str_len(ctx, crypt->id)); fz_md5_final(&md5, digest); fz_arc4_init(&arc4, crypt->key, n); @@ -730,7 +730,7 @@ static void pdf_saslprep_from_utf8(char *password, const char *utf8, int n) } int -pdf_authenticate_password(pdf_document *doc, const char *pwd_utf8) +pdf_authenticate_password(fz_context *ctx, pdf_document *doc, const char *pwd_utf8) { char password[2048]; @@ -745,9 +745,9 @@ pdf_authenticate_password(pdf_document *doc, const char *pwd_utf8) pdf_saslprep_from_utf8(password, pwd_utf8, sizeof password); } - if (pdf_authenticate_user_password(doc->ctx, doc->crypt, (unsigned char *)password, strlen(password))) + if (pdf_authenticate_user_password(ctx, doc->crypt, (unsigned char *)password, strlen(password))) return 1; - if (pdf_authenticate_owner_password(doc->ctx, doc->crypt, (unsigned char *)password, strlen(password))) + if (pdf_authenticate_owner_password(ctx, doc->crypt, (unsigned char *)password, strlen(password))) return 1; return 0; } @@ -755,17 +755,17 @@ pdf_authenticate_password(pdf_document *doc, const char *pwd_utf8) } int -pdf_needs_password(pdf_document *doc) +pdf_needs_password(fz_context *ctx, pdf_document *doc) { if (!doc->crypt) return 0; - if (pdf_authenticate_password(doc, "")) + if (pdf_authenticate_password(ctx, doc, "")) return 0; return 1; } int -pdf_has_permission(pdf_document *doc, int p) +pdf_has_permission(fz_context *ctx, pdf_document *doc, int p) { if (!doc->crypt) return 1; @@ -773,7 +773,7 @@ pdf_has_permission(pdf_document *doc, int p) } unsigned char * -pdf_crypt_key(pdf_document *doc) +pdf_crypt_key(fz_context *ctx, pdf_document *doc) { if (doc->crypt) return doc->crypt->key; @@ -781,14 +781,14 @@ pdf_crypt_key(pdf_document *doc) } int -pdf_crypt_version(pdf_document *doc) +pdf_crypt_version(fz_context *ctx, pdf_document *doc) { if (doc->crypt) return doc->crypt->v; return 0; } -int pdf_crypt_revision(pdf_document *doc) +int pdf_crypt_revision(fz_context *ctx, pdf_document *doc) { if (doc->crypt) return doc->crypt->r; @@ -796,7 +796,7 @@ int pdf_crypt_revision(pdf_document *doc) } char * -pdf_crypt_method(pdf_document *doc) +pdf_crypt_method(fz_context *ctx, pdf_document *doc) { if (doc->crypt) { @@ -813,7 +813,7 @@ pdf_crypt_method(pdf_document *doc) } int -pdf_crypt_length(pdf_document *doc) +pdf_crypt_length(fz_context *ctx, pdf_document *doc) { if (doc->crypt) return doc->crypt->length; @@ -878,13 +878,13 @@ pdf_crypt_obj_imp(fz_context *ctx, pdf_crypt *crypt, pdf_obj *obj, unsigned char unsigned char *s; int i, n; - if (pdf_is_indirect(obj)) + if (pdf_is_indirect(ctx, obj)) return; - if (pdf_is_string(obj)) + if (pdf_is_string(ctx, obj)) { - s = (unsigned char *)pdf_to_str_buf(obj); - n = pdf_to_str_len(obj); + s = (unsigned char *)pdf_to_str_buf(ctx, obj); + n = pdf_to_str_len(ctx, obj); if (crypt->strf.method == PDF_CRYPT_RC4) { @@ -913,26 +913,26 @@ pdf_crypt_obj_imp(fz_context *ctx, pdf_crypt *crypt, pdf_obj *obj, unsigned char if (s[n - 17] < 1 || s[n - 17] > 16) fz_warn(ctx, "aes padding out of range"); else - pdf_set_str_len(obj, n - 16 - s[n - 17]); + pdf_set_str_len(ctx, obj, n - 16 - s[n - 17]); } } } - else if (pdf_is_array(obj)) + else if (pdf_is_array(ctx, obj)) { - n = pdf_array_len(obj); + n = pdf_array_len(ctx, obj); for (i = 0; i < n; i++) { - pdf_crypt_obj_imp(ctx, crypt, pdf_array_get(obj, i), key, keylen); + pdf_crypt_obj_imp(ctx, crypt, pdf_array_get(ctx, obj, i), key, keylen); } } - else if (pdf_is_dict(obj)) + else if (pdf_is_dict(ctx, obj)) { - n = pdf_dict_len(obj); + n = pdf_dict_len(ctx, obj); for (i = 0; i < n; i++) { - pdf_crypt_obj_imp(ctx, crypt, pdf_dict_get_val(obj, i), key, keylen); + pdf_crypt_obj_imp(ctx, crypt, pdf_dict_get_val(ctx, obj, i), key, keylen); } } } @@ -954,7 +954,7 @@ pdf_crypt_obj(fz_context *ctx, pdf_crypt *crypt, pdf_obj *obj, int num, int gen) * Create filter suitable for de/encrypting a stream. */ static fz_stream * -pdf_open_crypt_imp(fz_stream *chain, pdf_crypt *crypt, pdf_crypt_filter *stmf, int num, int gen) +pdf_open_crypt_imp(fz_context *ctx, fz_stream *chain, pdf_crypt *crypt, pdf_crypt_filter *stmf, int num, int gen) { unsigned char key[32]; int len; @@ -962,34 +962,34 @@ pdf_open_crypt_imp(fz_stream *chain, pdf_crypt *crypt, pdf_crypt_filter *stmf, i len = pdf_compute_object_key(crypt, stmf, num, gen, key, 32); if (stmf->method == PDF_CRYPT_RC4) - return fz_open_arc4(chain, key, len); + return fz_open_arc4(ctx, chain, key, len); if (stmf->method == PDF_CRYPT_AESV2 || stmf->method == PDF_CRYPT_AESV3) - return fz_open_aesd(chain, key, len); + return fz_open_aesd(ctx, chain, key, len); - return fz_open_copy(chain); + return fz_open_copy(ctx, chain); } fz_stream * -pdf_open_crypt(fz_stream *chain, pdf_crypt *crypt, int num, int gen) +pdf_open_crypt(fz_context *ctx, fz_stream *chain, pdf_crypt *crypt, int num, int gen) { - return pdf_open_crypt_imp(chain, crypt, &crypt->stmf, num, gen); + return pdf_open_crypt_imp(ctx, chain, crypt, &crypt->stmf, num, gen); } fz_stream * -pdf_open_crypt_with_filter(fz_stream *chain, pdf_crypt *crypt, char *name, int num, int gen) +pdf_open_crypt_with_filter(fz_context *ctx, fz_stream *chain, pdf_crypt *crypt, char *name, int num, int gen) { if (strcmp(name, "Identity")) { pdf_crypt_filter cf; - pdf_parse_crypt_filter(chain->ctx, &cf, crypt, name); - return pdf_open_crypt_imp(chain, crypt, &cf, num, gen); + pdf_parse_crypt_filter(ctx, &cf, crypt, name); + return pdf_open_crypt_imp(ctx, chain, crypt, &cf, num, gen); } return chain; } #ifndef NDEBUG -void pdf_print_crypt(pdf_crypt *crypt) +void pdf_print_crypt(fz_context *ctx, pdf_crypt *crypt) { int i; diff --git a/source/pdf/pdf-device.c b/source/pdf/pdf-device.c index 0d8974be..471aaced 100644 --- a/source/pdf/pdf-device.c +++ b/source/pdf/pdf-device.c @@ -16,7 +16,7 @@ struct gstate_s * they are recorded here as they are fundamentally intertwined with * the push/pulling of the gstates. */ fz_buffer *buf; - void (*on_pop)(pdf_device*,void *); + void (*on_pop)(fz_context*,pdf_device*,void *); void *on_pop_arg; /* The graphics state proper */ fz_colorspace *colorspace[2]; @@ -72,7 +72,6 @@ struct group_entry_s struct pdf_device_s { - fz_context *ctx; pdf_document *doc; pdf_obj *contents; pdf_obj *resources; @@ -108,9 +107,8 @@ struct pdf_device_s /* Helper functions */ static int -send_image(pdf_device *pdev, fz_image *image, int mask, int smask) +send_image(fz_context *ctx, pdf_device *pdev, fz_image *image, int mask, int smask) { - fz_context *ctx = pdev->ctx; fz_pixmap *pixmap = NULL; pdf_obj *imobj = NULL; pdf_obj *imref = NULL; @@ -197,21 +195,21 @@ send_image(pdf_device *pdev, fz_image *image, int mask, int smask) memcpy(pdev->images[num].digest,digest,16); pdev->images[num].ref = NULL; /* Will be filled in later */ - imobj = pdf_new_dict(doc, 3); - pdf_dict_puts_drop(imobj, "Type", pdf_new_name(doc, "XObject")); - pdf_dict_puts_drop(imobj, "Subtype", pdf_new_name(doc, "Image")); - pdf_dict_puts_drop(imobj, "Width", pdf_new_int(doc, image->w)); - pdf_dict_puts_drop(imobj, "Height", pdf_new_int(doc, image->h)); + imobj = pdf_new_dict(ctx, doc, 3); + pdf_dict_puts_drop(ctx, imobj, "Type", pdf_new_name(ctx, doc, "XObject")); + pdf_dict_puts_drop(ctx, imobj, "Subtype", pdf_new_name(ctx, doc, "Image")); + pdf_dict_puts_drop(ctx, imobj, "Width", pdf_new_int(ctx, doc, image->w)); + pdf_dict_puts_drop(ctx, imobj, "Height", pdf_new_int(ctx, doc, image->h)); if (mask) {} else if (!colorspace || colorspace->n == 1) - pdf_dict_puts_drop(imobj, "ColorSpace", pdf_new_name(doc, "DeviceGray")); + pdf_dict_puts_drop(ctx, imobj, "ColorSpace", pdf_new_name(ctx, doc, "DeviceGray")); else if (colorspace->n == 3) - pdf_dict_puts_drop(imobj, "ColorSpace", pdf_new_name(doc, "DeviceRGB")); + pdf_dict_puts_drop(ctx, imobj, "ColorSpace", pdf_new_name(ctx, doc, "DeviceRGB")); else if (colorspace->n == 4) - pdf_dict_puts_drop(imobj, "ColorSpace", pdf_new_name(doc, "DeviceCMYK")); + pdf_dict_puts_drop(ctx, imobj, "ColorSpace", pdf_new_name(ctx, doc, "DeviceCMYK")); if (!mask) - pdf_dict_puts_drop(imobj, "BitsPerComponent", pdf_new_int(doc, image->bpc)); + pdf_dict_puts_drop(ctx, imobj, "BitsPerComponent", pdf_new_int(ctx, doc, image->bpc)); switch (cp ? cp->type : FZ_IMAGE_UNKNOWN) { case FZ_IMAGE_UNKNOWN: /* Unknown also means raw */ @@ -219,32 +217,32 @@ send_image(pdf_device *pdev, fz_image *image, int mask, int smask) break; case FZ_IMAGE_JPEG: if (cp->u.jpeg.color_transform != -1) - pdf_dict_puts_drop(imobj, "ColorTransform", pdf_new_int(doc, cp->u.jpeg.color_transform)); - pdf_dict_puts_drop(imobj, "Filter", pdf_new_name(doc, "DCTDecode")); + pdf_dict_puts_drop(ctx, imobj, "ColorTransform", pdf_new_int(ctx, doc, cp->u.jpeg.color_transform)); + pdf_dict_puts_drop(ctx, imobj, "Filter", pdf_new_name(ctx, doc, "DCTDecode")); break; case FZ_IMAGE_JPX: if (cp->u.jpx.smask_in_data) - pdf_dict_puts_drop(imobj, "SMaskInData", pdf_new_int(doc, cp->u.jpx.smask_in_data)); - pdf_dict_puts_drop(imobj, "Filter", pdf_new_name(doc, "JPXDecode")); + pdf_dict_puts_drop(ctx, imobj, "SMaskInData", pdf_new_int(ctx, doc, cp->u.jpx.smask_in_data)); + pdf_dict_puts_drop(ctx, imobj, "Filter", pdf_new_name(ctx, doc, "JPXDecode")); break; case FZ_IMAGE_FAX: if (cp->u.fax.columns) - pdf_dict_puts_drop(imobj, "Columns", pdf_new_int(doc, cp->u.fax.columns)); + pdf_dict_puts_drop(ctx, imobj, "Columns", pdf_new_int(ctx, doc, cp->u.fax.columns)); if (cp->u.fax.rows) - pdf_dict_puts_drop(imobj, "Rows", pdf_new_int(doc, cp->u.fax.rows)); + pdf_dict_puts_drop(ctx, imobj, "Rows", pdf_new_int(ctx, doc, cp->u.fax.rows)); if (cp->u.fax.k) - pdf_dict_puts_drop(imobj, "K", pdf_new_int(doc, cp->u.fax.k)); + pdf_dict_puts_drop(ctx, imobj, "K", pdf_new_int(ctx, doc, cp->u.fax.k)); if (cp->u.fax.end_of_line) - pdf_dict_puts_drop(imobj, "EndOfLine", pdf_new_int(doc, cp->u.fax.end_of_line)); + pdf_dict_puts_drop(ctx, imobj, "EndOfLine", pdf_new_int(ctx, doc, cp->u.fax.end_of_line)); if (cp->u.fax.encoded_byte_align) - pdf_dict_puts_drop(imobj, "EncodedByteAlign", pdf_new_int(doc, cp->u.fax.encoded_byte_align)); + pdf_dict_puts_drop(ctx, imobj, "EncodedByteAlign", pdf_new_int(ctx, doc, cp->u.fax.encoded_byte_align)); if (cp->u.fax.end_of_block) - pdf_dict_puts_drop(imobj, "EndOfBlock", pdf_new_int(doc, cp->u.fax.end_of_block)); + pdf_dict_puts_drop(ctx, imobj, "EndOfBlock", pdf_new_int(ctx, doc, cp->u.fax.end_of_block)); if (cp->u.fax.black_is_1) - pdf_dict_puts_drop(imobj, "BlackIs1", pdf_new_int(doc, cp->u.fax.black_is_1)); + pdf_dict_puts_drop(ctx, imobj, "BlackIs1", pdf_new_int(ctx, doc, cp->u.fax.black_is_1)); if (cp->u.fax.damaged_rows_before_error) - pdf_dict_puts_drop(imobj, "DamagedRowsBeforeError", pdf_new_int(doc, cp->u.fax.damaged_rows_before_error)); - pdf_dict_puts_drop(imobj, "Filter", pdf_new_name(doc, "CCITTFaxDecode")); + pdf_dict_puts_drop(ctx, imobj, "DamagedRowsBeforeError", pdf_new_int(ctx, doc, cp->u.fax.damaged_rows_before_error)); + pdf_dict_puts_drop(ctx, imobj, "Filter", pdf_new_name(ctx, doc, "CCITTFaxDecode")); break; case FZ_IMAGE_JBIG2: /* FIXME - jbig2globals */ @@ -252,68 +250,67 @@ send_image(pdf_device *pdev, fz_image *image, int mask, int smask) break; case FZ_IMAGE_FLATE: if (cp->u.flate.columns) - pdf_dict_puts_drop(imobj, "Columns", pdf_new_int(doc, cp->u.flate.columns)); + pdf_dict_puts_drop(ctx, imobj, "Columns", pdf_new_int(ctx, doc, cp->u.flate.columns)); if (cp->u.flate.colors) - pdf_dict_puts_drop(imobj, "Colors", pdf_new_int(doc, cp->u.flate.colors)); + pdf_dict_puts_drop(ctx, imobj, "Colors", pdf_new_int(ctx, doc, cp->u.flate.colors)); if (cp->u.flate.predictor) - pdf_dict_puts_drop(imobj, "Predictor", pdf_new_int(doc, cp->u.flate.predictor)); - pdf_dict_puts_drop(imobj, "Filter", pdf_new_name(doc, "FlateDecode")); - pdf_dict_puts_drop(imobj, "BitsPerComponent", pdf_new_int(doc, image->bpc)); + pdf_dict_puts_drop(ctx, imobj, "Predictor", pdf_new_int(ctx, doc, cp->u.flate.predictor)); + pdf_dict_puts_drop(ctx, imobj, "Filter", pdf_new_name(ctx, doc, "FlateDecode")); + pdf_dict_puts_drop(ctx, imobj, "BitsPerComponent", pdf_new_int(ctx, doc, image->bpc)); break; case FZ_IMAGE_LZW: if (cp->u.lzw.columns) - pdf_dict_puts_drop(imobj, "Columns", pdf_new_int(doc, cp->u.lzw.columns)); + pdf_dict_puts_drop(ctx, imobj, "Columns", pdf_new_int(ctx, doc, cp->u.lzw.columns)); if (cp->u.lzw.colors) - pdf_dict_puts_drop(imobj, "Colors", pdf_new_int(doc, cp->u.lzw.colors)); + pdf_dict_puts_drop(ctx, imobj, "Colors", pdf_new_int(ctx, doc, cp->u.lzw.colors)); if (cp->u.lzw.predictor) - pdf_dict_puts_drop(imobj, "Predictor", pdf_new_int(doc, cp->u.lzw.predictor)); + pdf_dict_puts_drop(ctx, imobj, "Predictor", pdf_new_int(ctx, doc, cp->u.lzw.predictor)); if (cp->u.lzw.early_change) - pdf_dict_puts_drop(imobj, "EarlyChange", pdf_new_int(doc, cp->u.lzw.early_change)); - pdf_dict_puts_drop(imobj, "Filter", pdf_new_name(doc, "LZWDecode")); + pdf_dict_puts_drop(ctx, imobj, "EarlyChange", pdf_new_int(ctx, doc, cp->u.lzw.early_change)); + pdf_dict_puts_drop(ctx, imobj, "Filter", pdf_new_name(ctx, doc, "LZWDecode")); break; case FZ_IMAGE_RLD: - pdf_dict_puts_drop(imobj, "Filter", pdf_new_name(doc, "RunLengthDecode")); + pdf_dict_puts_drop(ctx, imobj, "Filter", pdf_new_name(ctx, doc, "RunLengthDecode")); break; } if (mask) { - pdf_dict_puts_drop(imobj, "ImageMask", pdf_new_bool(doc, 1)); + pdf_dict_puts_drop(ctx, imobj, "ImageMask", pdf_new_bool(ctx, doc, 1)); } if (image->mask) { - int smasknum = send_image(pdev, image->mask, 0, 1); - pdf_dict_puts(imobj, "SMask", pdev->images[smasknum].ref); + int smasknum = send_image(ctx, pdev, image->mask, 0, 1); + pdf_dict_puts(ctx, imobj, "SMask", pdev->images[smasknum].ref); } - imref = pdf_new_ref(doc, imobj); - pdf_update_stream(doc, pdf_to_num(imref), buffer); - pdf_dict_puts_drop(imobj, "Length", pdf_new_int(doc, buffer->len)); + imref = pdf_new_ref(ctx, doc, imobj); + pdf_update_stream(ctx, doc, pdf_to_num(ctx, imref), buffer); + pdf_dict_puts_drop(ctx, imobj, "Length", pdf_new_int(ctx, doc, buffer->len)); { char text[32]; snprintf(text, sizeof(text), "XObject/Img%d", num); - pdf_dict_putp(pdev->resources, text, imref); + pdf_dict_putp(ctx, pdev->resources, text, imref); } pdev->images[num].ref = imref; } fz_always(ctx) { fz_drop_buffer(ctx, buffer); - pdf_drop_obj(imobj); + pdf_drop_obj(ctx, imobj); fz_drop_pixmap(ctx, pixmap); } fz_catch(ctx) { - pdf_drop_obj(imref); + pdf_drop_obj(ctx, imref); fz_rethrow(ctx); } return num; } static void -pdf_dev_stroke_state(pdf_device *pdev, fz_stroke_state *stroke_state) +pdf_dev_stroke_state(fz_context *ctx, pdf_device *pdev, fz_stroke_state *stroke_state) { - fz_context *ctx = pdev->ctx; gstate *gs = CURRENT_GSTATE(pdev); if (stroke_state == gs->stroke_state) @@ -361,9 +358,8 @@ pdf_dev_stroke_state(pdf_device *pdev, fz_stroke_state *stroke_state) } static void -pdf_dev_path(pdf_device *pdev, fz_path *path) +pdf_dev_path(fz_context *ctx, pdf_device *pdev, fz_path *path) { - fz_context *ctx = pdev->ctx; gstate *gs = CURRENT_GSTATE(pdev); float x, y; int i = 0, k = 0; @@ -400,7 +396,7 @@ pdf_dev_path(pdf_device *pdev, fz_path *path) } static void -pdf_dev_ctm(pdf_device *pdev, const fz_matrix *ctm) +pdf_dev_ctm(fz_context *ctx, pdf_device *pdev, const fz_matrix *ctm) { fz_matrix inverse; gstate *gs = CURRENT_GSTATE(pdev); @@ -410,16 +406,15 @@ pdf_dev_ctm(pdf_device *pdev, const fz_matrix *ctm) fz_invert_matrix(&inverse, &gs->ctm); fz_concat(&inverse, ctm, &inverse); memcpy(&gs->ctm, ctm, sizeof(*ctm)); - fz_buffer_printf(pdev->ctx, gs->buf, "%f %f %f %f %f %f cm\n", inverse.a, inverse.b, inverse.c, inverse.d, inverse.e, inverse.f); + fz_buffer_printf(ctx, gs->buf, "%f %f %f %f %f %f cm\n", inverse.a, inverse.b, inverse.c, inverse.d, inverse.e, inverse.f); } static void -pdf_dev_color(pdf_device *pdev, fz_colorspace *colorspace, float *color, int stroke) +pdf_dev_color(fz_context *ctx, pdf_device *pdev, fz_colorspace *colorspace, float *color, int stroke) { int diff = 0; int i; int cspace = 0; - fz_context *ctx = pdev->ctx; float rgb[FZ_MAX_COLORS]; gstate *gs = CURRENT_GSTATE(pdev); @@ -478,10 +473,9 @@ pdf_dev_color(pdf_device *pdev, fz_colorspace *colorspace, float *color, int str } static void -pdf_dev_alpha(pdf_device *pdev, float alpha, int stroke) +pdf_dev_alpha(fz_context *ctx, pdf_device *pdev, float alpha, int stroke) { int i; - fz_context *ctx = pdev->ctx; pdf_document *doc = pdev->doc; gstate *gs = CURRENT_GSTATE(pdev); @@ -513,19 +507,19 @@ pdf_dev_alpha(pdf_device *pdev, float alpha, int stroke) pdev->alphas[i].alpha = alpha; pdev->alphas[i].stroke = stroke; - o = pdf_new_dict(doc, 1); + o = pdf_new_dict(ctx, doc, 1); fz_try(ctx) { char text[32]; - pdf_dict_puts_drop(o, (stroke ? "CA" : "ca"), pdf_new_real(doc, alpha)); - ref = pdf_new_ref(doc, o); + pdf_dict_puts_drop(ctx, o, (stroke ? "CA" : "ca"), pdf_new_real(ctx, doc, alpha)); + ref = pdf_new_ref(ctx, doc, o); snprintf(text, sizeof(text), "ExtGState/Alp%d", i); - pdf_dict_putp(pdev->resources, text, ref); + pdf_dict_putp(ctx, pdev->resources, text, ref); } fz_always(ctx) { - pdf_drop_obj(o); - pdf_drop_obj(ref); + pdf_drop_obj(ctx, o); + pdf_drop_obj(ctx, ref); } fz_catch(ctx) { @@ -537,11 +531,10 @@ pdf_dev_alpha(pdf_device *pdev, float alpha, int stroke) } static void -pdf_dev_font(pdf_device *pdev, fz_font *font, float size) +pdf_dev_font(fz_context *ctx, pdf_device *pdev, fz_font *font, float size) { int i; pdf_document *doc = pdev->doc; - fz_context *ctx = pdev->ctx; gstate *gs = CURRENT_GSTATE(pdev); /* If the font is unchanged, nothing to do */ @@ -549,7 +542,7 @@ pdf_dev_font(pdf_device *pdev, fz_font *font, float size) return; if (font->ft_buffer != NULL || font->ft_substitute) - fz_throw(pdev->ctx, FZ_ERROR_GENERIC, "pdf device supports only base 14 fonts currently"); + fz_throw(ctx, FZ_ERROR_GENERIC, "pdf device supports only base 14 fonts currently"); /* Have we sent such a font before? */ for (i = 0; i < pdev->num_fonts; i++) @@ -574,22 +567,22 @@ pdf_dev_font(pdf_device *pdev, fz_font *font, float size) } pdev->fonts[i].font = fz_keep_font(ctx, font); - o = pdf_new_dict(doc, 3); + o = pdf_new_dict(ctx, doc, 3); fz_try(ctx) { char text[32]; - pdf_dict_puts_drop(o, "Type", pdf_new_name(doc, "Font")); - pdf_dict_puts_drop(o, "Subtype", pdf_new_name(doc, "Type1")); - pdf_dict_puts_drop(o, "BaseFont", pdf_new_name(doc, font->name)); - pdf_dict_puts_drop(o, "Encoding", pdf_new_name(doc, "WinAnsiEncoding")); - ref = pdf_new_ref(doc, o); + pdf_dict_puts_drop(ctx, o, "Type", pdf_new_name(ctx, doc, "Font")); + pdf_dict_puts_drop(ctx, o, "Subtype", pdf_new_name(ctx, doc, "Type1")); + pdf_dict_puts_drop(ctx, o, "BaseFont", pdf_new_name(ctx, doc, font->name)); + pdf_dict_puts_drop(ctx, o, "Encoding", pdf_new_name(ctx, doc, "WinAnsiEncoding")); + ref = pdf_new_ref(ctx, doc, o); snprintf(text, sizeof(text), "Font/F%d", i); - pdf_dict_putp(pdev->resources, text, ref); + pdf_dict_putp(ctx, pdev->resources, text, ref); } fz_always(ctx) { - pdf_drop_obj(o); - pdf_drop_obj(ref); + pdf_drop_obj(ctx, o); + pdf_drop_obj(ctx, ref); } fz_catch(ctx) { @@ -601,21 +594,19 @@ pdf_dev_font(pdf_device *pdev, fz_font *font, float size) } static void -pdf_dev_tm(pdf_device *pdev, const fz_matrix *tm) +pdf_dev_tm(fz_context *ctx, pdf_device *pdev, const fz_matrix *tm) { gstate *gs = CURRENT_GSTATE(pdev); if (memcmp(&gs->tm, tm, sizeof(*tm)) == 0) return; - fz_buffer_printf(pdev->ctx, gs->buf, "%f %f %f %f %f %f Tm\n", tm->a, tm->b, tm->c, tm->d, tm->e, tm->f); + fz_buffer_printf(ctx, gs->buf, "%f %f %f %f %f %f Tm\n", tm->a, tm->b, tm->c, tm->d, tm->e, tm->f); gs->tm = *tm; } static void -pdf_dev_push_new_buf(pdf_device *pdev, fz_buffer *buf, void (*on_pop)(pdf_device*,void *), void *on_pop_arg) +pdf_dev_push_new_buf(fz_context *ctx, pdf_device *pdev, fz_buffer *buf, void (*on_pop)(fz_context*,pdf_device*,void*), void *on_pop_arg) { - fz_context *ctx = pdev->ctx; - if (pdev->num_gstates == pdev->max_gstates) { int newmax = pdev->max_gstates*2; @@ -636,21 +627,20 @@ pdf_dev_push_new_buf(pdf_device *pdev, fz_buffer *buf, void (*on_pop)(pdf_device } static void -pdf_dev_push(pdf_device *pdev) +pdf_dev_push(fz_context *ctx, pdf_device *pdev) { - pdf_dev_push_new_buf(pdev, NULL, NULL, NULL); + pdf_dev_push_new_buf(ctx, pdev, NULL, NULL, NULL); } static void * -pdf_dev_pop(pdf_device *pdev) +pdf_dev_pop(fz_context *ctx, pdf_device *pdev) { - fz_context *ctx = pdev->ctx; gstate *gs = CURRENT_GSTATE(pdev); void *arg = gs->on_pop_arg; - fz_buffer_printf(pdev->ctx, gs->buf, "Q\n"); + fz_buffer_printf(ctx, gs->buf, "Q\n"); if (gs->on_pop) - gs->on_pop(pdev, arg); + gs->on_pop(ctx, pdev, arg); pdev->num_gstates--; fz_drop_stroke_state(ctx, pdev->gstates[pdev->num_gstates].stroke_state); fz_drop_buffer(ctx, pdev->gstates[pdev->num_gstates].buf); @@ -658,7 +648,7 @@ pdf_dev_pop(pdf_device *pdev) } static void -pdf_dev_text(pdf_device *pdev, fz_text *text, float size) +pdf_dev_text(fz_context *ctx, pdf_device *pdev, fz_text *text, float size) { int mask = FT_LOAD_NO_SCALE | FT_LOAD_IGNORE_TRANSFORM; int i; @@ -689,7 +679,7 @@ pdf_dev_text(pdf_device *pdev, fz_text *text, float size) fz_transform_point(&delta, &inverse); if (delta.x != 0 || delta.y != 0) { - fz_buffer_printf(pdev->ctx, gs->buf, "%f %f Td ", delta.x, delta.y); + fz_buffer_printf(ctx, gs->buf, "%f %f Td ", delta.x, delta.y); trm.e = it->x; trm.f = it->y; } @@ -711,38 +701,38 @@ pdf_dev_text(pdf_device *pdev, fz_text *text, float size) } } - fz_buffer_printf(pdev->ctx, gs->buf, "<"); + fz_buffer_printf(ctx, gs->buf, "<"); for (/* i from its current value */; i < j; i++) { /* FIXME: should use it->gid, rather than it->ucs, and convert * to the correct encoding */ - fz_buffer_printf(pdev->ctx, gs->buf, "%02x", text->items[i].ucs); + fz_buffer_printf(ctx, gs->buf, "%02x", text->items[i].ucs); } - fz_buffer_printf(pdev->ctx, gs->buf, "> Tj\n"); + fz_buffer_printf(ctx, gs->buf, "> Tj\n"); } gs->tm.e = trm.e; gs->tm.f = trm.f; } static void -pdf_dev_trm(pdf_device *pdev, int trm) +pdf_dev_trm(fz_context *ctx, pdf_device *pdev, int trm) { gstate *gs = CURRENT_GSTATE(pdev); if (gs->text_rendering_mode == trm) return; gs->text_rendering_mode = trm; - fz_buffer_printf(pdev->ctx, gs->buf, "%d Tr\n", trm); + fz_buffer_printf(ctx, gs->buf, "%d Tr\n", trm); } static void -pdf_dev_begin_text(pdf_device *pdev, const fz_matrix *tm, int trm) +pdf_dev_begin_text(fz_context *ctx, pdf_device *pdev, const fz_matrix *tm, int trm) { - pdf_dev_trm(pdev, trm); + pdf_dev_trm(ctx, pdev, trm); if (!pdev->in_text) { gstate *gs = CURRENT_GSTATE(pdev); - fz_buffer_printf(pdev->ctx, gs->buf, "BT\n"); + fz_buffer_printf(ctx, gs->buf, "BT\n"); gs->tm.a = 1; gs->tm.b = 0; gs->tm.c = 0; @@ -751,24 +741,23 @@ pdf_dev_begin_text(pdf_device *pdev, const fz_matrix *tm, int trm) gs->tm.f = 0; pdev->in_text = 1; } - pdf_dev_tm(pdev, tm); + pdf_dev_tm(ctx, pdev, tm); } static void -pdf_dev_end_text(pdf_device *pdev) +pdf_dev_end_text(fz_context *ctx, pdf_device *pdev) { gstate *gs = CURRENT_GSTATE(pdev); if (!pdev->in_text) return; pdev->in_text = 0; - fz_buffer_printf(pdev->ctx, gs->buf, "ET\n"); + fz_buffer_printf(ctx, gs->buf, "ET\n"); } static int -pdf_dev_new_form(pdf_obj **form_ref, pdf_device *pdev, const fz_rect *bbox, int isolated, int knockout, float alpha, fz_colorspace *colorspace) +pdf_dev_new_form(fz_context *ctx, pdf_obj **form_ref, pdf_device *pdev, const fz_rect *bbox, int isolated, int knockout, float alpha, fz_colorspace *colorspace) { - fz_context *ctx = pdev->ctx; pdf_document *doc = pdev->doc; int num; pdf_obj *group_ref; @@ -805,26 +794,26 @@ pdf_dev_new_form(pdf_obj **form_ref, pdf_device *pdev, const fz_rect *bbox, int pdev->groups[num].alpha = alpha; pdev->groups[num].colorspace = fz_keep_colorspace(ctx, colorspace); pdev->groups[num].ref = NULL; - group = pdf_new_dict(doc, 5); + group = pdf_new_dict(ctx, doc, 5); fz_try(ctx) { - pdf_dict_puts_drop(group, "Type", pdf_new_name(doc, "Group")); - pdf_dict_puts_drop(group, "S", pdf_new_name(doc, "Transparency")); - pdf_dict_puts_drop(group, "K", pdf_new_bool(doc, knockout)); - pdf_dict_puts_drop(group, "I", pdf_new_bool(doc, isolated)); + pdf_dict_puts_drop(ctx, group, "Type", pdf_new_name(ctx, doc, "Group")); + pdf_dict_puts_drop(ctx, group, "S", pdf_new_name(ctx, doc, "Transparency")); + pdf_dict_puts_drop(ctx, group, "K", pdf_new_bool(ctx, doc, knockout)); + pdf_dict_puts_drop(ctx, group, "I", pdf_new_bool(ctx, doc, isolated)); if (!colorspace) {} else if (colorspace->n == 1) - pdf_dict_puts_drop(group, "CS", pdf_new_name(doc, "DeviceGray")); + pdf_dict_puts_drop(ctx, group, "CS", pdf_new_name(ctx, doc, "DeviceGray")); else if (colorspace->n == 4) - pdf_dict_puts_drop(group, "CS", pdf_new_name(doc, "DeviceCMYK")); + pdf_dict_puts_drop(ctx, group, "CS", pdf_new_name(ctx, doc, "DeviceCMYK")); else - pdf_dict_puts_drop(group, "CS", pdf_new_name(doc, "DeviceRGB")); - group_ref = pdev->groups[num].ref = pdf_new_ref(doc, group); + pdf_dict_puts_drop(ctx, group, "CS", pdf_new_name(ctx, doc, "DeviceRGB")); + group_ref = pdev->groups[num].ref = pdf_new_ref(ctx, doc, group); } fz_always(ctx) { - pdf_drop_obj(group); + pdf_drop_obj(ctx, group); } fz_catch(ctx) { @@ -834,18 +823,18 @@ pdf_dev_new_form(pdf_obj **form_ref, pdf_device *pdev, const fz_rect *bbox, int /* Make us a new Forms object that points to that group, and change * to writing into the buffer for that Forms object. */ - form = pdf_new_dict(doc, 4); + form = pdf_new_dict(ctx, doc, 4); fz_try(ctx) { - pdf_dict_puts_drop(form, "Subtype", pdf_new_name(doc, "Form")); - pdf_dict_puts(form, "Group", group_ref); - pdf_dict_puts_drop(form, "FormType", pdf_new_int(doc, 1)); - pdf_dict_puts_drop(form, "BBox", pdf_new_rect(doc, bbox)); - *form_ref = pdf_new_ref(doc, form); + pdf_dict_puts_drop(ctx, form, "Subtype", pdf_new_name(ctx, doc, "Form")); + pdf_dict_puts(ctx, form, "Group", group_ref); + pdf_dict_puts_drop(ctx, form, "FormType", pdf_new_int(ctx, doc, 1)); + pdf_dict_puts_drop(ctx, form, "BBox", pdf_new_rect(ctx, doc, bbox)); + *form_ref = pdf_new_ref(ctx, doc, form); } fz_catch(ctx) { - pdf_drop_obj(form); + pdf_drop_obj(ctx, form); fz_rethrow(ctx); } @@ -854,7 +843,7 @@ pdf_dev_new_form(pdf_obj **form_ref, pdf_device *pdev, const fz_rect *bbox, int char text[32]; num = pdev->num_forms++; snprintf(text, sizeof(text), "XObject/Fm%d", num); - pdf_dict_putp(pdev->resources, text, *form_ref); + pdf_dict_putp(ctx, pdev->resources, text, *form_ref); } return num; @@ -863,70 +852,70 @@ pdf_dev_new_form(pdf_obj **form_ref, pdf_device *pdev, const fz_rect *bbox, int /* Entry points */ static void -pdf_dev_fill_path(fz_device *dev, fz_path *path, int even_odd, const fz_matrix *ctm, +pdf_dev_fill_path(fz_context *ctx, fz_device *dev, fz_path *path, int even_odd, const fz_matrix *ctm, fz_colorspace *colorspace, float *color, float alpha) { pdf_device *pdev = dev->user; gstate *gs = CURRENT_GSTATE(pdev); - pdf_dev_end_text(pdev); - pdf_dev_alpha(pdev, alpha, 0); - pdf_dev_color(pdev, colorspace, color, 0); - pdf_dev_ctm(pdev, ctm); - pdf_dev_path(pdev, path); - fz_buffer_printf(dev->ctx, gs->buf, (even_odd ? "f*\n" : "f\n")); + pdf_dev_end_text(ctx, pdev); + pdf_dev_alpha(ctx, pdev, alpha, 0); + pdf_dev_color(ctx, pdev, colorspace, color, 0); + pdf_dev_ctm(ctx, pdev, ctm); + pdf_dev_path(ctx, pdev, path); + fz_buffer_printf(ctx, gs->buf, (even_odd ? "f*\n" : "f\n")); } static void -pdf_dev_stroke_path(fz_device *dev, fz_path *path, fz_stroke_state *stroke, const fz_matrix *ctm, +pdf_dev_stroke_path(fz_context *ctx, fz_device *dev, fz_path *path, fz_stroke_state *stroke, const fz_matrix *ctm, fz_colorspace *colorspace, float *color, float alpha) { pdf_device *pdev = dev->user; gstate *gs = CURRENT_GSTATE(pdev); - pdf_dev_end_text(pdev); - pdf_dev_alpha(pdev, alpha, 1); - pdf_dev_color(pdev, colorspace, color, 1); - pdf_dev_ctm(pdev, ctm); - pdf_dev_stroke_state(pdev, stroke); - pdf_dev_path(pdev, path); - fz_buffer_printf(dev->ctx, gs->buf, "S\n"); + pdf_dev_end_text(ctx, pdev); + pdf_dev_alpha(ctx, pdev, alpha, 1); + pdf_dev_color(ctx, pdev, colorspace, color, 1); + pdf_dev_ctm(ctx, pdev, ctm); + pdf_dev_stroke_state(ctx, pdev, stroke); + pdf_dev_path(ctx, pdev, path); + fz_buffer_printf(ctx, gs->buf, "S\n"); } static void -pdf_dev_clip_path(fz_device *dev, fz_path *path, const fz_rect *rect, int even_odd, const fz_matrix *ctm) +pdf_dev_clip_path(fz_context *ctx, fz_device *dev, fz_path *path, const fz_rect *rect, int even_odd, const fz_matrix *ctm) { pdf_device *pdev = dev->user; gstate *gs; - pdf_dev_end_text(pdev); - pdf_dev_push(pdev); - pdf_dev_ctm(pdev, ctm); - pdf_dev_path(pdev, path); + pdf_dev_end_text(ctx, pdev); + pdf_dev_push(ctx, pdev); + pdf_dev_ctm(ctx, pdev, ctm); + pdf_dev_path(ctx, pdev, path); gs = CURRENT_GSTATE(pdev); - fz_buffer_printf(dev->ctx, gs->buf, (even_odd ? "W* n\n" : "W n\n")); + fz_buffer_printf(ctx, gs->buf, (even_odd ? "W* n\n" : "W n\n")); } static void -pdf_dev_clip_stroke_path(fz_device *dev, fz_path *path, const fz_rect *rect, fz_stroke_state *stroke, const fz_matrix *ctm) +pdf_dev_clip_stroke_path(fz_context *ctx, fz_device *dev, fz_path *path, const fz_rect *rect, fz_stroke_state *stroke, const fz_matrix *ctm) { pdf_device *pdev = dev->user; gstate *gs; - pdf_dev_end_text(pdev); - pdf_dev_push(pdev); + pdf_dev_end_text(ctx, pdev); + pdf_dev_push(ctx, pdev); /* FIXME: Need to push a group, select a pattern (or shading) here, * stroke with the pattern/shading. Then move to defining that pattern * with the next calls to the device interface until the next pop * when we pop the group. */ - pdf_dev_ctm(pdev, ctm); - pdf_dev_path(pdev, path); + pdf_dev_ctm(ctx, pdev, ctm); + pdf_dev_path(ctx, pdev, path); gs = CURRENT_GSTATE(pdev); - fz_buffer_printf(dev->ctx, gs->buf, "W n\n"); + fz_buffer_printf(ctx, gs->buf, "W n\n"); } static void -pdf_dev_fill_text(fz_device *dev, fz_text *text, const fz_matrix *ctm, +pdf_dev_fill_text(fz_context *ctx, fz_device *dev, fz_text *text, const fz_matrix *ctm, fz_colorspace *colorspace, float *color, float alpha) { pdf_device *pdev = dev->user; @@ -935,16 +924,16 @@ pdf_dev_fill_text(fz_device *dev, fz_text *text, const fz_matrix *ctm, fz_pre_scale(&trm, 1/size, 1/size); - pdf_dev_begin_text(pdev, &trm, 0); - pdf_dev_font(pdev, text->font, size); - pdf_dev_ctm(pdev, ctm); - pdf_dev_alpha(pdev, alpha, 0); - pdf_dev_color(pdev, colorspace, color, 0); - pdf_dev_text(pdev, text, size); + pdf_dev_begin_text(ctx, pdev, &trm, 0); + pdf_dev_font(ctx, pdev, text->font, size); + pdf_dev_ctm(ctx, pdev, ctm); + pdf_dev_alpha(ctx, pdev, alpha, 0); + pdf_dev_color(ctx, pdev, colorspace, color, 0); + pdf_dev_text(ctx, pdev, text, size); } static void -pdf_dev_stroke_text(fz_device *dev, fz_text *text, fz_stroke_state *stroke, const fz_matrix *ctm, +pdf_dev_stroke_text(fz_context *ctx, fz_device *dev, fz_text *text, fz_stroke_state *stroke, const fz_matrix *ctm, fz_colorspace *colorspace, float *color, float alpha) { pdf_device *pdev = dev->user; @@ -953,16 +942,16 @@ pdf_dev_stroke_text(fz_device *dev, fz_text *text, fz_stroke_state *stroke, cons fz_pre_scale(&trm, 1/size, 1/size); - pdf_dev_begin_text(pdev, &text->trm, 1); - pdf_dev_font(pdev, text->font, 1); - pdf_dev_ctm(pdev, ctm); - pdf_dev_alpha(pdev, alpha, 1); - pdf_dev_color(pdev, colorspace, color, 1); - pdf_dev_text(pdev, text, size); + pdf_dev_begin_text(ctx, pdev, &text->trm, 1); + pdf_dev_font(ctx, pdev, text->font, 1); + pdf_dev_ctm(ctx, pdev, ctm); + pdf_dev_alpha(ctx, pdev, alpha, 1); + pdf_dev_color(ctx, pdev, colorspace, color, 1); + pdf_dev_text(ctx, pdev, text, size); } static void -pdf_dev_clip_text(fz_device *dev, fz_text *text, const fz_matrix *ctm, int accumulate) +pdf_dev_clip_text(fz_context *ctx, fz_device *dev, fz_text *text, const fz_matrix *ctm, int accumulate) { pdf_device *pdev = dev->user; fz_matrix trm = text->trm; @@ -970,14 +959,14 @@ pdf_dev_clip_text(fz_device *dev, fz_text *text, const fz_matrix *ctm, int accum fz_pre_scale(&trm, 1/size, 1/size); - pdf_dev_begin_text(pdev, &text->trm, 0); - pdf_dev_ctm(pdev, ctm); - pdf_dev_font(pdev, text->font, 7); - pdf_dev_text(pdev, text, size); + pdf_dev_begin_text(ctx, pdev, &text->trm, 0); + pdf_dev_ctm(ctx, pdev, ctm); + pdf_dev_font(ctx, pdev, text->font, 7); + pdf_dev_text(ctx, pdev, text, size); } static void -pdf_dev_clip_stroke_text(fz_device *dev, fz_text *text, fz_stroke_state *stroke, const fz_matrix *ctm) +pdf_dev_clip_stroke_text(fz_context *ctx, fz_device *dev, fz_text *text, fz_stroke_state *stroke, const fz_matrix *ctm) { pdf_device *pdev = dev->user; fz_matrix trm = text->trm; @@ -985,14 +974,14 @@ pdf_dev_clip_stroke_text(fz_device *dev, fz_text *text, fz_stroke_state *stroke, fz_pre_scale(&trm, 1/size, 1/size); - pdf_dev_begin_text(pdev, &text->trm, 0); - pdf_dev_font(pdev, text->font, 5); - pdf_dev_ctm(pdev, ctm); - pdf_dev_text(pdev, text, size); + pdf_dev_begin_text(ctx, pdev, &text->trm, 0); + pdf_dev_font(ctx, pdev, text->font, 5); + pdf_dev_ctm(ctx, pdev, ctm); + pdf_dev_text(ctx, pdev, text, size); } static void -pdf_dev_ignore_text(fz_device *dev, fz_text *text, const fz_matrix *ctm) +pdf_dev_ignore_text(fz_context *ctx, fz_device *dev, fz_text *text, const fz_matrix *ctm) { pdf_device *pdev = dev->user; fz_matrix trm = text->trm; @@ -1000,86 +989,85 @@ pdf_dev_ignore_text(fz_device *dev, fz_text *text, const fz_matrix *ctm) fz_pre_scale(&trm, 1/size, 1/size); - pdf_dev_begin_text(pdev, &text->trm, 0); - pdf_dev_ctm(pdev, ctm); - pdf_dev_font(pdev, text->font, 3); - pdf_dev_text(pdev, text, size); + pdf_dev_begin_text(ctx, pdev, &text->trm, 0); + pdf_dev_ctm(ctx, pdev, ctm); + pdf_dev_font(ctx, pdev, text->font, 3); + pdf_dev_text(ctx, pdev, text, size); } static void -pdf_dev_fill_image(fz_device *dev, fz_image *image, const fz_matrix *ctm, float alpha) +pdf_dev_fill_image(fz_context *ctx, fz_device *dev, fz_image *image, const fz_matrix *ctm, float alpha) { - pdf_device *pdev = (pdf_device *)dev->user; + pdf_device *pdev = dev->user; int num; gstate *gs = CURRENT_GSTATE(pdev); fz_matrix local_ctm = *ctm; - pdf_dev_end_text(pdev); - num = send_image(pdev, image, 0, 0); - pdf_dev_alpha(pdev, alpha, 0); + pdf_dev_end_text(ctx, pdev); + num = send_image(ctx, pdev, image, 0, 0); + pdf_dev_alpha(ctx, pdev, alpha, 0); /* PDF images are upside down, so fiddle the ctm */ fz_pre_scale(&local_ctm, 1, -1); fz_pre_translate(&local_ctm, 0, -1); - pdf_dev_ctm(pdev, &local_ctm); - fz_buffer_printf(dev->ctx, gs->buf, "/Img%d Do\n", num); + pdf_dev_ctm(ctx, pdev, &local_ctm); + fz_buffer_printf(ctx, gs->buf, "/Img%d Do\n", num); } static void -pdf_dev_fill_shade(fz_device *dev, fz_shade *shade, const fz_matrix *ctm, float alpha) +pdf_dev_fill_shade(fz_context *ctx, fz_device *dev, fz_shade *shade, const fz_matrix *ctm, float alpha) { - pdf_device *pdev = (pdf_device *)dev->user; + pdf_device *pdev = dev->user; /* FIXME */ - pdf_dev_end_text(pdev); + pdf_dev_end_text(ctx, pdev); } static void -pdf_dev_fill_image_mask(fz_device *dev, fz_image *image, const fz_matrix *ctm, +pdf_dev_fill_image_mask(fz_context *ctx, fz_device *dev, fz_image *image, const fz_matrix *ctm, fz_colorspace *colorspace, float *color, float alpha) { - pdf_device *pdev = (pdf_device *)dev->user; + pdf_device *pdev = dev->user; gstate *gs = CURRENT_GSTATE(pdev); int num; fz_matrix local_ctm = *ctm; - pdf_dev_end_text(pdev); - num = send_image(pdev, image, 1, 0); - fz_buffer_printf(dev->ctx, gs->buf, "q\n"); - pdf_dev_alpha(pdev, alpha, 0); - pdf_dev_color(pdev, colorspace, color, 0); + pdf_dev_end_text(ctx, pdev); + num = send_image(ctx, pdev, image, 1, 0); + fz_buffer_printf(ctx, gs->buf, "q\n"); + pdf_dev_alpha(ctx, pdev, alpha, 0); + pdf_dev_color(ctx, pdev, colorspace, color, 0); /* PDF images are upside down, so fiddle the ctm */ fz_pre_scale(&local_ctm, 1, -1); fz_pre_translate(&local_ctm, 0, -1); - pdf_dev_ctm(pdev, &local_ctm); - fz_buffer_printf(dev->ctx, gs->buf, "/Img%d Do Q\n", num); + pdf_dev_ctm(ctx, pdev, &local_ctm); + fz_buffer_printf(ctx, gs->buf, "/Img%d Do Q\n", num); } static void -pdf_dev_clip_image_mask(fz_device *dev, fz_image *image, const fz_rect *rect, const fz_matrix *ctm) +pdf_dev_clip_image_mask(fz_context *ctx, fz_device *dev, fz_image *image, const fz_rect *rect, const fz_matrix *ctm) { - pdf_device *pdev = (pdf_device *)dev->user; + pdf_device *pdev = dev->user; /* FIXME */ - pdf_dev_end_text(pdev); - pdf_dev_push(pdev); + pdf_dev_end_text(ctx, pdev); + pdf_dev_push(ctx, pdev); } static void -pdf_dev_pop_clip(fz_device *dev) +pdf_dev_pop_clip(fz_context *ctx, fz_device *dev) { - pdf_device *pdev = (pdf_device *)dev->user; + pdf_device *pdev = dev->user; /* FIXME */ - pdf_dev_end_text(pdev); - pdf_dev_pop(pdev); + pdf_dev_end_text(ctx, pdev); + pdf_dev_pop(ctx, pdev); } static void -pdf_dev_begin_mask(fz_device *dev, const fz_rect *bbox, int luminosity, fz_colorspace *colorspace, float *color) +pdf_dev_begin_mask(fz_context *ctx, fz_device *dev, const fz_rect *bbox, int luminosity, fz_colorspace *colorspace, float *color) { - pdf_device *pdev = (pdf_device *)dev->user; + pdf_device *pdev = dev->user; pdf_document *doc = pdev->doc; - fz_context *ctx = pdev->ctx; gstate *gs; pdf_obj *smask = NULL; pdf_obj *egs = NULL; @@ -1092,163 +1080,159 @@ pdf_dev_begin_mask(fz_device *dev, const fz_rect *bbox, int luminosity, fz_color fz_var(egs); fz_var(color_obj); - pdf_dev_end_text(pdev); + pdf_dev_end_text(ctx, pdev); /* Make a new form to contain the contents of the softmask */ - pdf_dev_new_form(&form_ref, pdev, bbox, 0, 0, 1, colorspace); + pdf_dev_new_form(ctx, &form_ref, pdev, bbox, 0, 0, 1, colorspace); fz_try(ctx) { - smask = pdf_new_dict(doc, 4); - pdf_dict_puts_drop(smask, "Type", pdf_new_name(doc, "Mask")); - pdf_dict_puts_drop(smask, "S", pdf_new_name(doc, (luminosity ? "Luminosity" : "Alpha"))); - pdf_dict_puts(smask, "G", form_ref); - color_obj = pdf_new_array(doc, colorspace->n); + smask = pdf_new_dict(ctx, doc, 4); + pdf_dict_puts_drop(ctx, smask, "Type", pdf_new_name(ctx, doc, "Mask")); + pdf_dict_puts_drop(ctx, smask, "S", pdf_new_name(ctx, doc, (luminosity ? "Luminosity" : "Alpha"))); + pdf_dict_puts(ctx, smask, "G", form_ref); + color_obj = pdf_new_array(ctx, doc, colorspace->n); for (i = 0; i < colorspace->n; i++) - pdf_array_push(color_obj, pdf_new_real(doc, color[i])); - pdf_dict_puts_drop(smask, "BC", color_obj); + pdf_array_push(ctx, color_obj, pdf_new_real(ctx, doc, color[i])); + pdf_dict_puts_drop(ctx, smask, "BC", color_obj); color_obj = NULL; - egs = pdf_new_dict(doc, 5); - pdf_dict_puts_drop(egs, "Type", pdf_new_name(doc, "ExtGState")); - pdf_dict_puts_drop(egs, "SMask", pdf_new_ref(doc, smask)); - egs_ref = pdf_new_ref(doc, egs); + egs = pdf_new_dict(ctx, doc, 5); + pdf_dict_puts_drop(ctx, egs, "Type", pdf_new_name(ctx, doc, "ExtGState")); + pdf_dict_puts_drop(ctx, egs, "SMask", pdf_new_ref(ctx, doc, smask)); + egs_ref = pdf_new_ref(ctx, doc, egs); { char text[32]; snprintf(text, sizeof(text), "ExtGState/SM%d", pdev->num_smasks++); - pdf_dict_putp(pdev->resources, text, egs_ref); - pdf_drop_obj(egs_ref); + pdf_dict_putp(ctx, pdev->resources, text, egs_ref); + pdf_drop_obj(ctx, egs_ref); } gs = CURRENT_GSTATE(pdev); - fz_buffer_printf(dev->ctx, gs->buf, "/SM%d gs\n", pdev->num_smasks-1); + fz_buffer_printf(ctx, gs->buf, "/SM%d gs\n", pdev->num_smasks-1); } fz_always(ctx) { - pdf_drop_obj(smask); + pdf_drop_obj(ctx, smask); } fz_catch(ctx) { - pdf_drop_obj(form_ref); - pdf_drop_obj(color_obj); + pdf_drop_obj(ctx, form_ref); + pdf_drop_obj(ctx, color_obj); fz_rethrow(ctx); } /* Now, everything we get until the end_mask needs to go into a * new buffer, which will be the stream contents for the form. */ - pdf_dev_push_new_buf(pdev, fz_new_buffer(ctx, 1024), NULL, form_ref); + pdf_dev_push_new_buf(ctx, pdev, fz_new_buffer(ctx, 1024), NULL, form_ref); } static void -pdf_dev_end_mask(fz_device *dev) +pdf_dev_end_mask(fz_context *ctx, fz_device *dev) { - pdf_device *pdev = (pdf_device *)dev->user; + pdf_device *pdev = dev->user; pdf_document *doc = pdev->doc; - fz_context *ctx = pdev->ctx; gstate *gs = CURRENT_GSTATE(pdev); fz_buffer *buf = fz_keep_buffer(ctx, gs->buf); pdf_obj *form_ref = (pdf_obj *)gs->on_pop_arg; /* Here we do part of the pop, but not all of it. */ - pdf_dev_end_text(pdev); + pdf_dev_end_text(ctx, pdev); fz_buffer_printf(ctx, buf, "Q\n"); - pdf_dict_puts_drop(form_ref, "Length", pdf_new_int(doc, buf->len)); - pdf_update_stream(doc, pdf_to_num(form_ref), buf); + pdf_dict_puts_drop(ctx, form_ref, "Length", pdf_new_int(ctx, doc, buf->len)); + pdf_update_stream(ctx, doc, pdf_to_num(ctx, form_ref), buf); fz_drop_buffer(ctx, buf); gs->buf = fz_keep_buffer(ctx, gs[-1].buf); gs->on_pop_arg = NULL; - pdf_drop_obj(form_ref); + pdf_drop_obj(ctx, form_ref); fz_buffer_printf(ctx, gs->buf, "q\n"); } static void -pdf_dev_begin_group(fz_device *dev, const fz_rect *bbox, int isolated, int knockout, int blendmode, float alpha) +pdf_dev_begin_group(fz_context *ctx, fz_device *dev, const fz_rect *bbox, int isolated, int knockout, int blendmode, float alpha) { - pdf_device *pdev = (pdf_device *)dev->user; - fz_context *ctx = pdev->ctx; + pdf_device *pdev = dev->user; pdf_document *doc = pdev->doc; int num; pdf_obj *form_ref; gstate *gs; - pdf_dev_end_text(pdev); + pdf_dev_end_text(ctx, pdev); - num = pdf_dev_new_form(&form_ref, pdev, bbox, isolated, knockout, alpha, NULL); + num = pdf_dev_new_form(ctx, &form_ref, pdev, bbox, isolated, knockout, alpha, NULL); /* Do we have an appropriate blending extgstate already? */ { char text[32]; pdf_obj *obj; snprintf(text, sizeof(text), "ExtGState/BlendMode%d", blendmode); - obj = pdf_dict_getp(pdev->resources, text); + obj = pdf_dict_getp(ctx, pdev->resources, text); if (obj == NULL) { /* No, better make one */ - obj = pdf_new_dict(pdev->doc, 2); - pdf_dict_puts_drop(obj, "Type", pdf_new_name(doc, "ExtGState")); - pdf_dict_puts_drop(obj, "BM", pdf_new_name(doc, fz_blendmode_name(blendmode))); - pdf_dict_putp_drop(pdev->resources, text, obj); + obj = pdf_new_dict(ctx, doc, 2); + pdf_dict_puts_drop(ctx, obj, "Type", pdf_new_name(ctx, doc, "ExtGState")); + pdf_dict_puts_drop(ctx, obj, "BM", pdf_new_name(ctx, doc, fz_blendmode_name(blendmode))); + pdf_dict_putp_drop(ctx, pdev->resources, text, obj); } } /* Add the call to this group */ gs = CURRENT_GSTATE(pdev); - fz_buffer_printf(dev->ctx, gs->buf, "/BlendMode%d gs /Fm%d Do\n", blendmode, num); + fz_buffer_printf(ctx, gs->buf, "/BlendMode%d gs /Fm%d Do\n", blendmode, num); /* Now, everything we get until the end of group needs to go into a * new buffer, which will be the stream contents for the form. */ - pdf_dev_push_new_buf(pdev, fz_new_buffer(ctx, 1024), NULL, form_ref); + pdf_dev_push_new_buf(ctx, pdev, fz_new_buffer(ctx, 1024), NULL, form_ref); } static void -pdf_dev_end_group(fz_device *dev) +pdf_dev_end_group(fz_context *ctx, fz_device *dev) { - pdf_device *pdev = (pdf_device *)dev->user; + pdf_device *pdev = dev->user; pdf_document *doc = pdev->doc; gstate *gs = CURRENT_GSTATE(pdev); - fz_context *ctx = pdev->ctx; fz_buffer *buf = fz_keep_buffer(ctx, gs->buf); pdf_obj *form_ref; - pdf_dev_end_text(pdev); - form_ref = (pdf_obj *)pdf_dev_pop(pdev); - pdf_dict_puts_drop(form_ref, "Length", pdf_new_int(doc, gs->buf->len)); - pdf_update_stream(doc, pdf_to_num(form_ref), buf); + pdf_dev_end_text(ctx, pdev); + form_ref = (pdf_obj *)pdf_dev_pop(ctx, pdev); + pdf_dict_puts_drop(ctx, form_ref, "Length", pdf_new_int(ctx, doc, gs->buf->len)); + pdf_update_stream(ctx, doc, pdf_to_num(ctx, form_ref), buf); fz_drop_buffer(ctx, buf); - pdf_drop_obj(form_ref); + pdf_drop_obj(ctx, form_ref); } static int -pdf_dev_begin_tile(fz_device *dev, const fz_rect *area, const fz_rect *view, float xstep, float ystep, const fz_matrix *ctm, int id) +pdf_dev_begin_tile(fz_context *ctx, fz_device *dev, const fz_rect *area, const fz_rect *view, float xstep, float ystep, const fz_matrix *ctm, int id) { - pdf_device *pdev = (pdf_device *)dev->user; + pdf_device *pdev = dev->user; /* FIXME */ - pdf_dev_end_text(pdev); + pdf_dev_end_text(ctx, pdev); return 0; } static void -pdf_dev_end_tile(fz_device *dev) +pdf_dev_end_tile(fz_context *ctx, fz_device *dev) { - pdf_device *pdev = (pdf_device *)dev->user; + pdf_device *pdev = dev->user; /* FIXME */ - pdf_dev_end_text(pdev); + pdf_dev_end_text(ctx, pdev); } static void -pdf_dev_drop_user(fz_device *dev) +pdf_dev_drop_user(fz_context *ctx, fz_device *dev) { pdf_device *pdev = dev->user; pdf_document *doc = pdev->doc; - fz_context *ctx = pdev->ctx; gstate *gs = CURRENT_GSTATE(pdev); int i; - pdf_dev_end_text(pdev); + pdf_dev_end_text(ctx, pdev); - pdf_dict_puts_drop(pdev->contents, "Length", pdf_new_int(doc, gs->buf->len)); + pdf_dict_puts_drop(ctx, pdev->contents, "Length", pdf_new_int(ctx, doc, gs->buf->len)); for (i = pdev->num_gstates-1; i >= 0; i--) { @@ -1262,14 +1246,14 @@ pdf_dev_drop_user(fz_device *dev) for (i = pdev->num_imgs-1; i >= 0; i--) { - pdf_drop_obj(pdev->images[i].ref); + pdf_drop_obj(ctx, pdev->images[i].ref); } - pdf_update_stream(doc, pdf_to_num(pdev->contents), pdev->gstates[0].buf); + pdf_update_stream(ctx, doc, pdf_to_num(ctx, pdev->contents), pdev->gstates[0].buf); fz_drop_buffer(ctx, pdev->gstates[0].buf); - pdf_drop_obj(pdev->contents); - pdf_drop_obj(pdev->resources); + pdf_drop_obj(ctx, pdev->contents); + pdf_drop_obj(ctx, pdev->resources); fz_free(ctx, pdev->images); fz_free(ctx, pdev->alphas); @@ -1277,26 +1261,16 @@ pdf_dev_drop_user(fz_device *dev) fz_free(ctx, pdev); } -static void -pdf_dev_rebind(fz_device *dev) -{ - pdf_device *pdev = dev->user; - - fz_rebind_document((fz_document *)pdev->doc, dev->ctx); -} - -fz_device *pdf_new_pdf_device(pdf_document *doc, pdf_obj *contents, pdf_obj *resources, const fz_matrix *ctm) +fz_device *pdf_new_pdf_device(fz_context *ctx, pdf_document *doc, pdf_obj *contents, pdf_obj *resources, const fz_matrix *ctm) { - fz_context *ctx = doc->ctx; pdf_device *pdev = fz_malloc_struct(ctx, pdf_device); fz_device *dev; fz_try(ctx) { - pdev->ctx = ctx; pdev->doc = doc; - pdev->contents = pdf_keep_obj(contents); - pdev->resources = pdf_keep_obj(resources); + pdev->contents = pdf_keep_obj(ctx, contents); + pdev->resources = pdf_keep_obj(ctx, resources); pdev->gstates = fz_malloc_struct(ctx, gstate); pdev->gstates[0].buf = fz_new_buffer(ctx, 256); pdev->gstates[0].ctm = *ctm; @@ -1321,7 +1295,6 @@ fz_device *pdf_new_pdf_device(pdf_document *doc, pdf_obj *contents, pdf_obj *res fz_rethrow(ctx); } - dev->rebind = pdf_dev_rebind; dev->drop_user = pdf_dev_drop_user; dev->fill_path = pdf_dev_fill_path; @@ -1353,30 +1326,29 @@ fz_device *pdf_new_pdf_device(pdf_document *doc, pdf_obj *contents, pdf_obj *res return dev; } -fz_device *pdf_page_write(pdf_document *doc, pdf_page *page) +fz_device *pdf_page_write(fz_context *ctx, pdf_document *doc, pdf_page *page) { - fz_context *ctx = doc->ctx; - pdf_obj *resources = pdf_dict_gets(page->me, "Resources"); + pdf_obj *resources = pdf_dict_gets(ctx, page->me, "Resources"); fz_matrix ctm; fz_pre_translate(fz_scale(&ctm, 1, -1), 0, page->mediabox.y0-page->mediabox.y1); if (resources == NULL) { - resources = pdf_new_dict(doc, 0); - pdf_dict_puts_drop(page->me, "Resources", resources); + resources = pdf_new_dict(ctx, doc, 0); + pdf_dict_puts_drop(ctx, page->me, "Resources", resources); } if (page->contents == NULL) { - pdf_obj *obj = pdf_new_dict(doc, 0); + pdf_obj *obj = pdf_new_dict(ctx, doc, 0); fz_try(ctx) { - page->contents = pdf_new_ref(doc, obj); - pdf_dict_puts(page->me, "Contents", page->contents); + page->contents = pdf_new_ref(ctx, doc, obj); + pdf_dict_puts(ctx, page->me, "Contents", page->contents); } fz_always(ctx) { - pdf_drop_obj(obj); + pdf_drop_obj(ctx, obj); } fz_catch(ctx) { @@ -1384,5 +1356,5 @@ fz_device *pdf_page_write(pdf_document *doc, pdf_page *page) } } - return pdf_new_pdf_device(doc, page->contents, resources, &ctm); + return pdf_new_pdf_device(ctx, doc, page->contents, resources, &ctm); } diff --git a/source/pdf/pdf-event.c b/source/pdf/pdf-event.c index dc908985..b031dd72 100644 --- a/source/pdf/pdf-event.c +++ b/source/pdf/pdf-event.c @@ -7,7 +7,7 @@ typedef struct pdf_alert_event alert; } pdf_alert_event_internal; -pdf_alert_event *pdf_access_alert_event(pdf_doc_event *event) +pdf_alert_event *pdf_access_alert_event(fz_context *ctx, pdf_doc_event *event) { pdf_alert_event *alert = NULL; @@ -17,7 +17,7 @@ pdf_alert_event *pdf_access_alert_event(pdf_doc_event *event) return alert; } -void pdf_event_issue_alert(pdf_document *doc, pdf_alert_event *alert) +void pdf_event_issue_alert(fz_context *ctx, pdf_document *doc, pdf_alert_event *alert) { if (doc->event_cb) { @@ -25,20 +25,20 @@ void pdf_event_issue_alert(pdf_document *doc, pdf_alert_event *alert) ievent.base.type = PDF_DOCUMENT_EVENT_ALERT; ievent.alert = *alert; - doc->event_cb((pdf_doc_event *)&ievent, doc->event_cb_data); + doc->event_cb(ctx, doc, (pdf_doc_event *)&ievent, doc->event_cb_data); *alert = ievent.alert; } } -void pdf_event_issue_print(pdf_document *doc) +void pdf_event_issue_print(fz_context *ctx, pdf_document *doc) { pdf_doc_event e; e.type = PDF_DOCUMENT_EVENT_PRINT; if (doc->event_cb) - doc->event_cb(&e, doc->event_cb_data); + doc->event_cb(ctx, doc, &e, doc->event_cb_data); } typedef struct @@ -47,7 +47,7 @@ typedef struct char *item; } pdf_exec_menu_item_event_internal; -char *pdf_access_exec_menu_item_event(pdf_doc_event *event) +char *pdf_access_exec_menu_item_event(fz_context *ctx, pdf_doc_event *event) { char *item = NULL; @@ -57,7 +57,7 @@ char *pdf_access_exec_menu_item_event(pdf_doc_event *event) return item; } -void pdf_event_issue_exec_menu_item(pdf_document *doc, char *item) +void pdf_event_issue_exec_menu_item(fz_context *ctx, pdf_document *doc, char *item) { if (doc->event_cb) { @@ -65,18 +65,18 @@ void pdf_event_issue_exec_menu_item(pdf_document *doc, char *item) ievent.base.type = PDF_DOCUMENT_EVENT_EXEC_MENU_ITEM; ievent.item = item; - doc->event_cb((pdf_doc_event *)&ievent, doc->event_cb_data); + doc->event_cb(ctx, doc, (pdf_doc_event *)&ievent, doc->event_cb_data); } } -void pdf_event_issue_exec_dialog(pdf_document *doc) +void pdf_event_issue_exec_dialog(fz_context *ctx, pdf_document *doc) { pdf_doc_event e; e.type = PDF_DOCUMENT_EVENT_EXEC_DIALOG; if (doc->event_cb) - doc->event_cb(&e, doc->event_cb_data); + doc->event_cb(ctx, doc, &e, doc->event_cb_data); } typedef struct @@ -85,7 +85,7 @@ typedef struct pdf_launch_url_event launch_url; } pdf_launch_url_event_internal; -pdf_launch_url_event *pdf_access_launch_url_event(pdf_doc_event *event) +pdf_launch_url_event *pdf_access_launch_url_event(fz_context *ctx, pdf_doc_event *event) { pdf_launch_url_event *launch_url = NULL; @@ -95,7 +95,7 @@ pdf_launch_url_event *pdf_access_launch_url_event(pdf_doc_event *event) return launch_url; } -void pdf_event_issue_launch_url(pdf_document *doc, char *url, int new_frame) +void pdf_event_issue_launch_url(fz_context *ctx, pdf_document *doc, char *url, int new_frame) { if (doc->event_cb) { @@ -104,7 +104,7 @@ void pdf_event_issue_launch_url(pdf_document *doc, char *url, int new_frame) e.base.type = PDF_DOCUMENT_EVENT_LAUNCH_URL; e.launch_url.url = url; e.launch_url.new_frame = new_frame; - doc->event_cb((pdf_doc_event *)&e, doc->event_cb_data); + doc->event_cb(ctx, doc, (pdf_doc_event *)&e, doc->event_cb_data); } } @@ -114,7 +114,7 @@ typedef struct pdf_mail_doc_event mail_doc; } pdf_mail_doc_event_internal; -pdf_mail_doc_event *pdf_access_mail_doc_event(pdf_doc_event *event) +pdf_mail_doc_event *pdf_access_mail_doc_event(fz_context *ctx, pdf_doc_event *event) { pdf_mail_doc_event *mail_doc = NULL; @@ -124,7 +124,7 @@ pdf_mail_doc_event *pdf_access_mail_doc_event(pdf_doc_event *event) return mail_doc; } -void pdf_event_issue_mail_doc(pdf_document *doc, pdf_mail_doc_event *event) +void pdf_event_issue_mail_doc(fz_context *ctx, pdf_document *doc, pdf_mail_doc_event *event) { if (doc->event_cb) { @@ -133,11 +133,11 @@ void pdf_event_issue_mail_doc(pdf_document *doc, pdf_mail_doc_event *event) e.base.type = PDF_DOCUMENT_EVENT_MAIL_DOC; e.mail_doc = *event; - doc->event_cb((pdf_doc_event *)&e, doc->event_cb_data); + doc->event_cb(ctx, doc, (pdf_doc_event *)&e, doc->event_cb_data); } } -void pdf_set_doc_event_callback(pdf_document *doc, pdf_doc_event_cb *fn, void *data) +void pdf_set_doc_event_callback(fz_context *ctx, pdf_document *doc, pdf_doc_event_cb *fn, void *data) { doc->event_cb = fn; doc->event_cb_data = data; diff --git a/source/pdf/pdf-field.c b/source/pdf/pdf-field.c index e8f2508f..5105125a 100644 --- a/source/pdf/pdf-field.c +++ b/source/pdf/pdf-field.c @@ -1,23 +1,22 @@ #include "mupdf/pdf.h" -pdf_obj *pdf_get_inheritable(pdf_document *doc, pdf_obj *obj, char *key) +pdf_obj *pdf_get_inheritable(fz_context *ctx, pdf_document *doc, pdf_obj *obj, char *key) { pdf_obj *fobj = NULL; while (!fobj && obj) { - fobj = pdf_dict_gets(obj, key); + fobj = pdf_dict_gets(ctx, obj, key); if (!fobj) - obj = pdf_dict_gets(obj, "Parent"); + obj = pdf_dict_gets(ctx, obj, "Parent"); } - return fobj ? fobj : pdf_dict_gets(pdf_dict_gets(pdf_dict_gets(pdf_trailer(doc), "Root"), "AcroForm"), key); + return fobj ? fobj : pdf_dict_gets(ctx, pdf_dict_gets(ctx, pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Root"), "AcroForm"), key); } -char *pdf_get_string_or_stream(pdf_document *doc, pdf_obj *obj) +char *pdf_get_string_or_stream(fz_context *ctx, pdf_document *doc, pdf_obj *obj) { - fz_context *ctx = doc->ctx; int len = 0; char *buf = NULL; fz_buffer *strmbuf = NULL; @@ -27,14 +26,14 @@ char *pdf_get_string_or_stream(pdf_document *doc, pdf_obj *obj) fz_var(text); fz_try(ctx) { - if (pdf_is_string(obj)) + if (pdf_is_string(ctx, obj)) { - len = pdf_to_str_len(obj); - buf = pdf_to_str_buf(obj); + len = pdf_to_str_len(ctx, obj); + buf = pdf_to_str_buf(ctx, obj); } - else if (pdf_is_stream(doc, pdf_to_num(obj), pdf_to_gen(obj))) + else if (pdf_is_stream(ctx, doc, pdf_to_num(ctx, obj), pdf_to_gen(ctx, obj))) { - strmbuf = pdf_load_stream(doc, pdf_to_num(obj), pdf_to_gen(obj)); + strmbuf = pdf_load_stream(ctx, doc, pdf_to_num(ctx, obj), pdf_to_gen(ctx, obj)); len = fz_buffer_storage(ctx, strmbuf, (unsigned char **)&buf); } @@ -58,25 +57,25 @@ char *pdf_get_string_or_stream(pdf_document *doc, pdf_obj *obj) return text; } -char *pdf_field_value(pdf_document *doc, pdf_obj *field) +char *pdf_field_value(fz_context *ctx, pdf_document *doc, pdf_obj *field) { - return pdf_get_string_or_stream(doc, pdf_get_inheritable(doc, field, "V")); + return pdf_get_string_or_stream(ctx, doc, pdf_get_inheritable(ctx, doc, field, "V")); } -int pdf_get_field_flags(pdf_document *doc, pdf_obj *obj) +int pdf_get_field_flags(fz_context *ctx, pdf_document *doc, pdf_obj *obj) { - return pdf_to_int(pdf_get_inheritable(doc, obj, "Ff")); + return pdf_to_int(ctx, pdf_get_inheritable(ctx, doc, obj, "Ff")); } -static char *get_field_type_name(pdf_document *doc, pdf_obj *obj) +static char *get_field_type_name(fz_context *ctx, pdf_document *doc, pdf_obj *obj) { - return pdf_to_name(pdf_get_inheritable(doc, obj, "FT")); + return pdf_to_name(ctx, pdf_get_inheritable(ctx, doc, obj, "FT")); } -int pdf_field_type(pdf_document *doc, pdf_obj *obj) +int pdf_field_type(fz_context *ctx, pdf_document *doc, pdf_obj *obj) { - char *type = get_field_type_name(doc, obj); - int flags = pdf_get_field_flags(doc, obj); + char *type = get_field_type_name(ctx, doc, obj); + int flags = pdf_get_field_flags(ctx, doc, obj); if (!strcmp(type, "Btn")) { @@ -102,7 +101,7 @@ int pdf_field_type(pdf_document *doc, pdf_obj *obj) return PDF_WIDGET_TYPE_NOT_WIDGET; } -void pdf_set_field_type(pdf_document *doc, pdf_obj *obj, int type) +void pdf_set_field_type(fz_context *ctx, pdf_document *doc, pdf_obj *obj, int type) { int setbits = 0; int clearbits = 0; @@ -140,13 +139,13 @@ void pdf_set_field_type(pdf_document *doc, pdf_obj *obj, int type) } if (typename) - pdf_dict_puts_drop(obj, "FT", pdf_new_name(doc, typename)); + pdf_dict_puts_drop(ctx, obj, "FT", pdf_new_name(ctx, doc, typename)); if (setbits != 0 || clearbits != 0) { - int bits = pdf_to_int(pdf_dict_gets(obj, "Ff")); + int bits = pdf_to_int(ctx, pdf_dict_gets(ctx, obj, "Ff")); bits &= ~clearbits; bits |= setbits; - pdf_dict_puts_drop(obj, "Ff", pdf_new_int(doc, bits)); + pdf_dict_puts_drop(ctx, obj, "Ff", pdf_new_int(ctx, doc, bits)); } } diff --git a/source/pdf/pdf-font.c b/source/pdf/pdf-font.c index a0ee8bee..5e3f1e19 100644 --- a/source/pdf/pdf-font.c +++ b/source/pdf/pdf-font.c @@ -4,7 +4,7 @@ #include FT_FREETYPE_H #include FT_XFREE86_H -static void pdf_load_font_descriptor(pdf_font_desc *fontdesc, pdf_document *doc, pdf_obj *dict, char *collection, char *basefont, int iscidfont); +static void pdf_load_font_descriptor(fz_context *ctx, pdf_document *doc, pdf_font_desc *fontdesc, pdf_obj *dict, char *collection, char *basefont, int iscidfont); static const char *base_font_names[][10] = { @@ -184,7 +184,7 @@ pdf_load_builtin_font(fz_context *ctx, pdf_font_desc *fontdesc, char *fontname, unsigned char *data; unsigned int len; - data = pdf_lookup_builtin_font(clean_name, &len); + data = pdf_lookup_builtin_font(ctx, clean_name, &len); if (!data) fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find builtin font: '%s'", fontname); @@ -208,7 +208,7 @@ pdf_load_substitute_font(fz_context *ctx, pdf_font_desc *fontdesc, char *fontnam unsigned char *data; unsigned int len; - data = pdf_lookup_substitute_font(mono, serif, bold, italic, &len); + data = pdf_lookup_substitute_font(ctx, mono, serif, bold, italic, &len); if (!data) fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find substitute font"); @@ -230,7 +230,7 @@ pdf_load_substitute_cjk_font(fz_context *ctx, pdf_font_desc *fontdesc, char *fon unsigned int len; int index; - data = pdf_lookup_substitute_cjk_font(ros, serif, fontdesc->wmode, &len, &index); + data = pdf_lookup_substitute_cjk_font(ctx, ros, serif, fontdesc->wmode, &len, &index); if (!data) fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find builtin CJK font"); @@ -289,18 +289,17 @@ pdf_load_system_font(fz_context *ctx, pdf_font_desc *fontdesc, char *fontname, c } static void -pdf_load_embedded_font(pdf_document *doc, pdf_font_desc *fontdesc, char *fontname, pdf_obj *stmref) +pdf_load_embedded_font(fz_context *ctx, pdf_document *doc, pdf_font_desc *fontdesc, char *fontname, pdf_obj *stmref) { fz_buffer *buf; - fz_context *ctx = doc->ctx; fz_try(ctx) { - buf = pdf_load_stream(doc, pdf_to_num(stmref), pdf_to_gen(stmref)); + buf = pdf_load_stream(ctx, doc, pdf_to_num(ctx, stmref), pdf_to_gen(ctx, stmref)); } fz_catch(ctx) { - fz_rethrow_message(ctx, "cannot load font stream (%d %d R)", pdf_to_num(stmref), pdf_to_gen(stmref)); + fz_rethrow_message(ctx, "cannot load font stream (%d %d R)", pdf_to_num(ctx, stmref), pdf_to_gen(ctx, stmref)); } fz_try(ctx) @@ -313,7 +312,7 @@ pdf_load_embedded_font(pdf_document *doc, pdf_font_desc *fontdesc, char *fontnam } fz_catch(ctx) { - fz_rethrow_message(ctx, "cannot load embedded font (%d %d R)", pdf_to_num(stmref), pdf_to_gen(stmref)); + fz_rethrow_message(ctx, "cannot load embedded font (%d %d R)", pdf_to_num(ctx, stmref), pdf_to_gen(ctx, stmref)); } fontdesc->size += buf->len; @@ -413,7 +412,7 @@ pdf_new_font_desc(fz_context *ctx) */ static pdf_font_desc * -pdf_load_simple_font_by_name(pdf_document *doc, pdf_obj *dict, char *basefont) +pdf_load_simple_font_by_name(fz_context *ctx, pdf_document *doc, pdf_obj *dict, char *basefont) { pdf_obj *descriptor; pdf_obj *encoding; @@ -431,7 +430,6 @@ pdf_load_simple_font_by_name(pdf_document *doc, pdf_obj *dict, char *basefont) int i, k, n; int fterr; int has_lock = 0; - fz_context *ctx = doc->ctx; fz_var(fontdesc); fz_var(etable); @@ -442,17 +440,17 @@ pdf_load_simple_font_by_name(pdf_document *doc, pdf_obj *dict, char *basefont) { fontdesc = pdf_new_font_desc(ctx); - descriptor = pdf_dict_gets(dict, "FontDescriptor"); + descriptor = pdf_dict_gets(ctx, dict, "FontDescriptor"); if (descriptor) - pdf_load_font_descriptor(fontdesc, doc, descriptor, NULL, basefont, 0); + pdf_load_font_descriptor(ctx, doc, fontdesc, descriptor, NULL, basefont, 0); else pdf_load_builtin_font(ctx, fontdesc, basefont, 0); /* Some chinese documents mistakenly consider WinAnsiEncoding to be codepage 936 */ - if (descriptor && pdf_is_string(pdf_dict_gets(descriptor, "FontName")) && - !pdf_dict_gets(dict, "ToUnicode") && - !strcmp(pdf_to_name(pdf_dict_gets(dict, "Encoding")), "WinAnsiEncoding") && - pdf_to_int(pdf_dict_gets(descriptor, "Flags")) == 4) + if (descriptor && pdf_is_string(ctx, pdf_dict_gets(ctx, descriptor, "FontName")) && + !pdf_dict_gets(ctx, dict, "ToUnicode") && + !strcmp(pdf_to_name(ctx, pdf_dict_gets(ctx, dict, "Encoding")), "WinAnsiEncoding") && + pdf_to_int(ctx, pdf_dict_gets(ctx, descriptor, "Flags")) == 4) { char *cp936fonts[] = { "\xCB\xCE\xCC\xE5", "SimSun,Regular", @@ -471,7 +469,7 @@ pdf_load_simple_font_by_name(pdf_document *doc, pdf_obj *dict, char *basefont) pdf_drop_font(ctx, fontdesc); fontdesc = NULL; fontdesc = pdf_new_font_desc(ctx); - pdf_load_font_descriptor(fontdesc, doc, descriptor, "Adobe-GB1", cp936fonts[i+1], 0); + pdf_load_font_descriptor(ctx, doc, fontdesc, descriptor, "Adobe-GB1", cp936fonts[i+1], 0); fontdesc->encoding = pdf_load_system_cmap(ctx, "GBK-EUC-H"); fontdesc->to_unicode = pdf_load_system_cmap(ctx, "Adobe-GB1-UCS2"); fontdesc->to_ttf_cmap = pdf_load_system_cmap(ctx, "Adobe-GB1-UCS2"); @@ -532,34 +530,34 @@ pdf_load_simple_font_by_name(pdf_document *doc, pdf_obj *dict, char *basefont) etable[i] = 0; } - encoding = pdf_dict_gets(dict, "Encoding"); + encoding = pdf_dict_gets(ctx, dict, "Encoding"); if (encoding) { - if (pdf_is_name(encoding)) - pdf_load_encoding(estrings, pdf_to_name(encoding)); + if (pdf_is_name(ctx, encoding)) + pdf_load_encoding(estrings, pdf_to_name(ctx, encoding)); - if (pdf_is_dict(encoding)) + if (pdf_is_dict(ctx, encoding)) { pdf_obj *base, *diff, *item; - base = pdf_dict_gets(encoding, "BaseEncoding"); - if (pdf_is_name(base)) - pdf_load_encoding(estrings, pdf_to_name(base)); + base = pdf_dict_gets(ctx, encoding, "BaseEncoding"); + if (pdf_is_name(ctx, base)) + pdf_load_encoding(estrings, pdf_to_name(ctx, base)); else if (!fontdesc->is_embedded && !symbolic) pdf_load_encoding(estrings, "StandardEncoding"); - diff = pdf_dict_gets(encoding, "Differences"); - if (pdf_is_array(diff)) + diff = pdf_dict_gets(ctx, encoding, "Differences"); + if (pdf_is_array(ctx, diff)) { - n = pdf_array_len(diff); + n = pdf_array_len(ctx, diff); k = 0; for (i = 0; i < n; i++) { - item = pdf_array_get(diff, i); - if (pdf_is_int(item)) - k = pdf_to_int(item); - if (pdf_is_name(item) && k >= 0 && k < nelem(estrings)) - estrings[k++] = pdf_to_name(item); + item = pdf_array_get(ctx, diff, i); + if (pdf_is_int(ctx, item)) + k = pdf_to_int(ctx, item); + if (pdf_is_name(ctx, item) && k >= 0 && k < nelem(estrings)) + estrings[k++] = pdf_to_name(ctx, item); } } } @@ -575,7 +573,7 @@ pdf_load_simple_font_by_name(pdf_document *doc, pdf_obj *dict, char *basefont) has_lock = 1; /* built-in and substitute fonts may be a different type than what the document expects */ - subtype = pdf_to_name(pdf_dict_gets(dict, "Subtype")); + subtype = pdf_to_name(ctx, pdf_dict_gets(ctx, dict, "Subtype")); if (!strcmp(subtype, "Type1")) kind = TYPE1; else if (!strcmp(subtype, "MMType1")) @@ -705,7 +703,7 @@ pdf_load_simple_font_by_name(pdf_document *doc, pdf_obj *dict, char *basefont) fz_try(ctx) { - pdf_load_to_unicode(doc, fontdesc, estrings, NULL, pdf_dict_gets(dict, "ToUnicode")); + pdf_load_to_unicode(ctx, doc, fontdesc, estrings, NULL, pdf_dict_gets(ctx, dict, "ToUnicode")); } fz_catch(ctx) { @@ -719,20 +717,20 @@ pdf_load_simple_font_by_name(pdf_document *doc, pdf_obj *dict, char *basefont) pdf_set_default_hmtx(ctx, fontdesc, fontdesc->missing_width); - widths = pdf_dict_gets(dict, "Widths"); + widths = pdf_dict_gets(ctx, dict, "Widths"); if (widths) { int first, last; - first = pdf_to_int(pdf_dict_gets(dict, "FirstChar")); - last = pdf_to_int(pdf_dict_gets(dict, "LastChar")); + first = pdf_to_int(ctx, pdf_dict_gets(ctx, dict, "FirstChar")); + last = pdf_to_int(ctx, pdf_dict_gets(ctx, dict, "LastChar")); if (first < 0 || last > 255 || first > last) first = last = 0; for (i = 0; i < last - first + 1; i++) { - int wid = pdf_to_int(pdf_array_get(widths, i)); + int wid = pdf_to_int(ctx, pdf_array_get(ctx, widths, i)); pdf_add_hmtx(ctx, fontdesc, i + first, i + first, wid); } } @@ -760,21 +758,21 @@ pdf_load_simple_font_by_name(pdf_document *doc, pdf_obj *dict, char *basefont) if (fontdesc && etable != fontdesc->cid_to_gid) fz_free(ctx, etable); pdf_drop_font(ctx, fontdesc); - fz_rethrow_message(ctx, "cannot load simple font (%d %d R)", pdf_to_num(dict), pdf_to_gen(dict)); + fz_rethrow_message(ctx, "cannot load simple font (%d %d R)", pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict)); } return fontdesc; } static pdf_font_desc * -pdf_load_simple_font(pdf_document *doc, pdf_obj *dict) +pdf_load_simple_font(fz_context *ctx, pdf_document *doc, pdf_obj *dict) { - char *basefont = pdf_to_name(pdf_dict_gets(dict, "BaseFont")); + char *basefont = pdf_to_name(ctx, pdf_dict_gets(ctx, dict, "BaseFont")); - return pdf_load_simple_font_by_name(doc, dict, basefont); + return pdf_load_simple_font_by_name(ctx, doc, dict, basefont); } static int -hail_mary_make_hash_key(fz_store_hash *hash, void *key_) +hail_mary_make_hash_key(fz_context *ctx, fz_store_hash *hash, void *key_) { hash->u.i.i0 = 0; hash->u.i.i1 = 0; @@ -794,14 +792,14 @@ hail_mary_drop_key(fz_context *ctx, void *key) } static int -hail_mary_cmp_key(void *k0, void *k1) +hail_mary_cmp_key(fz_context *ctx, void *k0, void *k1) { return k0 == k1; } #ifndef NDEBUG static void -hail_mary_debug_key(FILE *out, void *key_) +hail_mary_debug_key(fz_context *ctx, FILE *out, void *key_) { fprintf(out, "hail mary "); } @@ -819,9 +817,8 @@ static fz_store_type hail_mary_store_type = }; pdf_font_desc * -pdf_load_hail_mary_font(pdf_document *doc) +pdf_load_hail_mary_font(fz_context *ctx, pdf_document *doc) { - fz_context *ctx = doc->ctx; pdf_font_desc *fontdesc; pdf_font_desc *existing; @@ -831,7 +828,7 @@ pdf_load_hail_mary_font(pdf_document *doc) } /* FIXME: Get someone with a clue about fonts to fix this */ - fontdesc = pdf_load_simple_font_by_name(doc, NULL, "Helvetica"); + fontdesc = pdf_load_simple_font_by_name(ctx, doc, NULL, "Helvetica"); existing = fz_store_item(ctx, &hail_mary_store_type, fontdesc, fontdesc->size, &hail_mary_store_type); assert(existing == NULL); @@ -844,7 +841,7 @@ pdf_load_hail_mary_font(pdf_document *doc) */ static pdf_font_desc * -load_cid_font(pdf_document *doc, pdf_obj *dict, pdf_obj *encoding, pdf_obj *to_unicode) +load_cid_font(fz_context *ctx, pdf_document *doc, pdf_obj *dict, pdf_obj *encoding, pdf_obj *to_unicode) { pdf_obj *widths; pdf_obj *descriptor; @@ -857,7 +854,6 @@ load_cid_font(pdf_document *doc, pdf_obj *dict, pdf_obj *encoding, pdf_obj *to_u pdf_obj *cidtogidmap; pdf_obj *obj; int dw; - fz_context *ctx = doc->ctx; fz_var(fontdesc); @@ -865,46 +861,46 @@ load_cid_font(pdf_document *doc, pdf_obj *dict, pdf_obj *encoding, pdf_obj *to_u { /* Get font name and CID collection */ - basefont = pdf_to_name(pdf_dict_gets(dict, "BaseFont")); + basefont = pdf_to_name(ctx, pdf_dict_gets(ctx, dict, "BaseFont")); { pdf_obj *cidinfo; char tmpstr[64]; int tmplen; - cidinfo = pdf_dict_gets(dict, "CIDSystemInfo"); + cidinfo = pdf_dict_gets(ctx, dict, "CIDSystemInfo"); if (!cidinfo) fz_throw(ctx, FZ_ERROR_GENERIC, "cid font is missing info"); - obj = pdf_dict_gets(cidinfo, "Registry"); - tmplen = fz_mini(sizeof tmpstr - 1, pdf_to_str_len(obj)); - memcpy(tmpstr, pdf_to_str_buf(obj), tmplen); + obj = pdf_dict_gets(ctx, cidinfo, "Registry"); + tmplen = fz_mini(sizeof tmpstr - 1, pdf_to_str_len(ctx, obj)); + memcpy(tmpstr, pdf_to_str_buf(ctx, obj), tmplen); tmpstr[tmplen] = '\0'; fz_strlcpy(collection, tmpstr, sizeof collection); fz_strlcat(collection, "-", sizeof collection); - obj = pdf_dict_gets(cidinfo, "Ordering"); - tmplen = fz_mini(sizeof tmpstr - 1, pdf_to_str_len(obj)); - memcpy(tmpstr, pdf_to_str_buf(obj), tmplen); + obj = pdf_dict_gets(ctx, cidinfo, "Ordering"); + tmplen = fz_mini(sizeof tmpstr - 1, pdf_to_str_len(ctx, obj)); + memcpy(tmpstr, pdf_to_str_buf(ctx, obj), tmplen); tmpstr[tmplen] = '\0'; fz_strlcat(collection, tmpstr, sizeof collection); } /* Encoding */ - if (pdf_is_name(encoding)) + if (pdf_is_name(ctx, encoding)) { - if (!strcmp(pdf_to_name(encoding), "Identity-H")) + if (!strcmp(pdf_to_name(ctx, encoding), "Identity-H")) cmap = pdf_new_identity_cmap(ctx, 0, 2); - else if (!strcmp(pdf_to_name(encoding), "Identity-V")) + else if (!strcmp(pdf_to_name(ctx, encoding), "Identity-V")) cmap = pdf_new_identity_cmap(ctx, 1, 2); else - cmap = pdf_load_system_cmap(ctx, pdf_to_name(encoding)); + cmap = pdf_load_system_cmap(ctx, pdf_to_name(ctx, encoding)); } - else if (pdf_is_indirect(encoding)) + else if (pdf_is_indirect(ctx, encoding)) { - cmap = pdf_load_embedded_cmap(doc, encoding); + cmap = pdf_load_embedded_cmap(ctx, doc, encoding); } else { @@ -920,21 +916,21 @@ load_cid_font(pdf_document *doc, pdf_obj *dict, pdf_obj *encoding, pdf_obj *to_u pdf_set_font_wmode(ctx, fontdesc, pdf_cmap_wmode(ctx, fontdesc->encoding)); - descriptor = pdf_dict_gets(dict, "FontDescriptor"); + descriptor = pdf_dict_gets(ctx, dict, "FontDescriptor"); if (!descriptor) fz_throw(ctx, FZ_ERROR_GENERIC, "syntaxerror: missing font descriptor"); - pdf_load_font_descriptor(fontdesc, doc, descriptor, collection, basefont, 1); + pdf_load_font_descriptor(ctx, doc, fontdesc, descriptor, collection, basefont, 1); face = fontdesc->font->ft_face; /* Apply encoding */ - cidtogidmap = pdf_dict_gets(dict, "CIDToGIDMap"); - if (pdf_is_indirect(cidtogidmap)) + cidtogidmap = pdf_dict_gets(ctx, dict, "CIDToGIDMap"); + if (pdf_is_indirect(ctx, cidtogidmap)) { fz_buffer *buf; - buf = pdf_load_stream(doc, pdf_to_num(cidtogidmap), pdf_to_gen(cidtogidmap)); + buf = pdf_load_stream(ctx, doc, pdf_to_num(ctx, cidtogidmap), pdf_to_gen(ctx, cidtogidmap)); fontdesc->cid_to_gid_len = (buf->len) / 2; fontdesc->cid_to_gid = fz_malloc_array(ctx, fontdesc->cid_to_gid_len, sizeof(unsigned short)); @@ -968,7 +964,7 @@ load_cid_font(pdf_document *doc, pdf_obj *dict, pdf_obj *encoding, pdf_obj *to_u fontdesc->to_ttf_cmap = pdf_load_system_cmap(ctx, "Adobe-Korea1-UCS2"); } - pdf_load_to_unicode(doc, fontdesc, NULL, collection, to_unicode); + pdf_load_to_unicode(ctx, doc, fontdesc, NULL, collection, to_unicode); /* If we have an identity encoding, we're supposed to use the glyph ids directly. * If we only have a substitute font, that won't work. @@ -984,35 +980,35 @@ load_cid_font(pdf_document *doc, pdf_obj *dict, pdf_obj *encoding, pdf_obj *to_u /* Horizontal */ dw = 1000; - obj = pdf_dict_gets(dict, "DW"); + obj = pdf_dict_gets(ctx, dict, "DW"); if (obj) - dw = pdf_to_int(obj); + dw = pdf_to_int(ctx, obj); pdf_set_default_hmtx(ctx, fontdesc, dw); - widths = pdf_dict_gets(dict, "W"); + widths = pdf_dict_gets(ctx, dict, "W"); if (widths) { int c0, c1, w, n, m; - n = pdf_array_len(widths); + n = pdf_array_len(ctx, widths); for (i = 0; i < n; ) { - c0 = pdf_to_int(pdf_array_get(widths, i)); - obj = pdf_array_get(widths, i + 1); - if (pdf_is_array(obj)) + c0 = pdf_to_int(ctx, pdf_array_get(ctx, widths, i)); + obj = pdf_array_get(ctx, widths, i + 1); + if (pdf_is_array(ctx, obj)) { - m = pdf_array_len(obj); + m = pdf_array_len(ctx, obj); for (k = 0; k < m; k++) { - w = pdf_to_int(pdf_array_get(obj, k)); + w = pdf_to_int(ctx, pdf_array_get(ctx, obj, k)); pdf_add_hmtx(ctx, fontdesc, c0 + k, c0 + k, w); } i += 2; } else { - c1 = pdf_to_int(obj); - w = pdf_to_int(pdf_array_get(widths, i + 2)); + c1 = pdf_to_int(ctx, obj); + w = pdf_to_int(ctx, pdf_array_get(ctx, widths, i + 2)); pdf_add_hmtx(ctx, fontdesc, c0, c1, w); i += 3; } @@ -1028,43 +1024,43 @@ load_cid_font(pdf_document *doc, pdf_obj *dict, pdf_obj *encoding, pdf_obj *to_u int dw2y = 880; int dw2w = -1000; - obj = pdf_dict_gets(dict, "DW2"); + obj = pdf_dict_gets(ctx, dict, "DW2"); if (obj) { - dw2y = pdf_to_int(pdf_array_get(obj, 0)); - dw2w = pdf_to_int(pdf_array_get(obj, 1)); + dw2y = pdf_to_int(ctx, pdf_array_get(ctx, obj, 0)); + dw2w = pdf_to_int(ctx, pdf_array_get(ctx, obj, 1)); } pdf_set_default_vmtx(ctx, fontdesc, dw2y, dw2w); - widths = pdf_dict_gets(dict, "W2"); + widths = pdf_dict_gets(ctx, dict, "W2"); if (widths) { int c0, c1, w, x, y, n; - n = pdf_array_len(widths); + n = pdf_array_len(ctx, widths); for (i = 0; i < n; ) { - c0 = pdf_to_int(pdf_array_get(widths, i)); - obj = pdf_array_get(widths, i + 1); - if (pdf_is_array(obj)) + c0 = pdf_to_int(ctx, pdf_array_get(ctx, widths, i)); + obj = pdf_array_get(ctx, widths, i + 1); + if (pdf_is_array(ctx, obj)) { - int m = pdf_array_len(obj); + int m = pdf_array_len(ctx, obj); for (k = 0; k * 3 < m; k ++) { - w = pdf_to_int(pdf_array_get(obj, k * 3 + 0)); - x = pdf_to_int(pdf_array_get(obj, k * 3 + 1)); - y = pdf_to_int(pdf_array_get(obj, k * 3 + 2)); + w = pdf_to_int(ctx, pdf_array_get(ctx, obj, k * 3 + 0)); + x = pdf_to_int(ctx, pdf_array_get(ctx, obj, k * 3 + 1)); + y = pdf_to_int(ctx, pdf_array_get(ctx, obj, k * 3 + 2)); pdf_add_vmtx(ctx, fontdesc, c0 + k, c0 + k, x, y, w); } i += 2; } else { - c1 = pdf_to_int(obj); - w = pdf_to_int(pdf_array_get(widths, i + 2)); - x = pdf_to_int(pdf_array_get(widths, i + 3)); - y = pdf_to_int(pdf_array_get(widths, i + 4)); + c1 = pdf_to_int(ctx, obj); + w = pdf_to_int(ctx, pdf_array_get(ctx, widths, i + 2)); + x = pdf_to_int(ctx, pdf_array_get(ctx, widths, i + 3)); + y = pdf_to_int(ctx, pdf_array_get(ctx, widths, i + 4)); pdf_add_vmtx(ctx, fontdesc, c0, c1, x, y, w); i += 5; } @@ -1077,14 +1073,14 @@ load_cid_font(pdf_document *doc, pdf_obj *dict, pdf_obj *encoding, pdf_obj *to_u fz_catch(ctx) { pdf_drop_font(ctx, fontdesc); - fz_rethrow_message(ctx, "cannot load cid font (%d %d R)", pdf_to_num(dict), pdf_to_gen(dict)); + fz_rethrow_message(ctx, "cannot load cid font (%d %d R)", pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict)); } return fontdesc; } static pdf_font_desc * -pdf_load_type0_font(pdf_document *doc, pdf_obj *dict) +pdf_load_type0_font(fz_context *ctx, pdf_document *doc, pdf_obj *dict) { pdf_obj *dfonts; pdf_obj *dfont; @@ -1092,21 +1088,21 @@ pdf_load_type0_font(pdf_document *doc, pdf_obj *dict) pdf_obj *encoding; pdf_obj *to_unicode; - dfonts = pdf_dict_gets(dict, "DescendantFonts"); + dfonts = pdf_dict_gets(ctx, dict, "DescendantFonts"); if (!dfonts) - fz_throw(doc->ctx, FZ_ERROR_GENERIC, "cid font is missing descendant fonts"); + fz_throw(ctx, FZ_ERROR_GENERIC, "cid font is missing descendant fonts"); - dfont = pdf_array_get(dfonts, 0); + dfont = pdf_array_get(ctx, dfonts, 0); - subtype = pdf_dict_gets(dfont, "Subtype"); - encoding = pdf_dict_gets(dict, "Encoding"); - to_unicode = pdf_dict_gets(dict, "ToUnicode"); + subtype = pdf_dict_gets(ctx, dfont, "Subtype"); + encoding = pdf_dict_gets(ctx, dict, "Encoding"); + to_unicode = pdf_dict_gets(ctx, dict, "ToUnicode"); - if (pdf_is_name(subtype) && !strcmp(pdf_to_name(subtype), "CIDFontType0")) - return load_cid_font(doc, dfont, encoding, to_unicode); - if (pdf_is_name(subtype) && !strcmp(pdf_to_name(subtype), "CIDFontType2")) - return load_cid_font(doc, dfont, encoding, to_unicode); - fz_throw(doc->ctx, FZ_ERROR_GENERIC, "syntaxerror: unknown cid font type"); + if (pdf_is_name(ctx, subtype) && !strcmp(pdf_to_name(ctx, subtype), "CIDFontType0")) + return load_cid_font(ctx, doc, dfont, encoding, to_unicode); + if (pdf_is_name(ctx, subtype) && !strcmp(pdf_to_name(ctx, subtype), "CIDFontType2")) + return load_cid_font(ctx, doc, dfont, encoding, to_unicode); + fz_throw(ctx, FZ_ERROR_GENERIC, "syntaxerror: unknown cid font type"); } /* @@ -1114,34 +1110,33 @@ pdf_load_type0_font(pdf_document *doc, pdf_obj *dict) */ static void -pdf_load_font_descriptor(pdf_font_desc *fontdesc, pdf_document *doc, pdf_obj *dict, char *collection, char *basefont, int iscidfont) +pdf_load_font_descriptor(fz_context *ctx, pdf_document *doc, pdf_font_desc *fontdesc, pdf_obj *dict, char *collection, char *basefont, int iscidfont) { pdf_obj *obj1, *obj2, *obj3, *obj; char *fontname; FT_Face face; - fz_context *ctx = doc->ctx; /* Prefer BaseFont; don't bother with FontName */ fontname = basefont; - fontdesc->flags = pdf_to_int(pdf_dict_gets(dict, "Flags")); - fontdesc->italic_angle = pdf_to_real(pdf_dict_gets(dict, "ItalicAngle")); - fontdesc->ascent = pdf_to_real(pdf_dict_gets(dict, "Ascent")); - fontdesc->descent = pdf_to_real(pdf_dict_gets(dict, "Descent")); - fontdesc->cap_height = pdf_to_real(pdf_dict_gets(dict, "CapHeight")); - fontdesc->x_height = pdf_to_real(pdf_dict_gets(dict, "XHeight")); - fontdesc->missing_width = pdf_to_real(pdf_dict_gets(dict, "MissingWidth")); - - obj1 = pdf_dict_gets(dict, "FontFile"); - obj2 = pdf_dict_gets(dict, "FontFile2"); - obj3 = pdf_dict_gets(dict, "FontFile3"); + fontdesc->flags = pdf_to_int(ctx, pdf_dict_gets(ctx, dict, "Flags")); + fontdesc->italic_angle = pdf_to_real(ctx, pdf_dict_gets(ctx, dict, "ItalicAngle")); + fontdesc->ascent = pdf_to_real(ctx, pdf_dict_gets(ctx, dict, "Ascent")); + fontdesc->descent = pdf_to_real(ctx, pdf_dict_gets(ctx, dict, "Descent")); + fontdesc->cap_height = pdf_to_real(ctx, pdf_dict_gets(ctx, dict, "CapHeight")); + fontdesc->x_height = pdf_to_real(ctx, pdf_dict_gets(ctx, dict, "XHeight")); + fontdesc->missing_width = pdf_to_real(ctx, pdf_dict_gets(ctx, dict, "MissingWidth")); + + obj1 = pdf_dict_gets(ctx, dict, "FontFile"); + obj2 = pdf_dict_gets(ctx, dict, "FontFile2"); + obj3 = pdf_dict_gets(ctx, dict, "FontFile3"); obj = obj1 ? obj1 : obj2 ? obj2 : obj3; - if (pdf_is_indirect(obj)) + if (pdf_is_indirect(ctx, obj)) { fz_try(ctx) { - pdf_load_embedded_font(doc, fontdesc, fontname, obj); + pdf_load_embedded_font(ctx, doc, fontdesc, fontname, obj); } fz_catch(ctx) { @@ -1212,12 +1207,11 @@ pdf_make_width_table(fz_context *ctx, pdf_font_desc *fontdesc) } pdf_font_desc * -pdf_load_font(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, int nested_depth) +pdf_load_font(fz_context *ctx, pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, int nested_depth) { char *subtype; pdf_obj *dfonts; pdf_obj *charprocs; - fz_context *ctx = doc->ctx; pdf_font_desc *fontdesc; int type3 = 0; @@ -1226,38 +1220,38 @@ pdf_load_font(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, int nested_depth) return fontdesc; } - subtype = pdf_to_name(pdf_dict_gets(dict, "Subtype")); - dfonts = pdf_dict_gets(dict, "DescendantFonts"); - charprocs = pdf_dict_gets(dict, "CharProcs"); + subtype = pdf_to_name(ctx, pdf_dict_gets(ctx, dict, "Subtype")); + dfonts = pdf_dict_gets(ctx, dict, "DescendantFonts"); + charprocs = pdf_dict_gets(ctx, dict, "CharProcs"); if (subtype && !strcmp(subtype, "Type0")) - fontdesc = pdf_load_type0_font(doc, dict); + fontdesc = pdf_load_type0_font(ctx, doc, dict); else if (subtype && !strcmp(subtype, "Type1")) - fontdesc = pdf_load_simple_font(doc, dict); + fontdesc = pdf_load_simple_font(ctx, doc, dict); else if (subtype && !strcmp(subtype, "MMType1")) - fontdesc = pdf_load_simple_font(doc, dict); + fontdesc = pdf_load_simple_font(ctx, doc, dict); else if (subtype && !strcmp(subtype, "TrueType")) - fontdesc = pdf_load_simple_font(doc, dict); + fontdesc = pdf_load_simple_font(ctx, doc, dict); else if (subtype && !strcmp(subtype, "Type3")) { - fontdesc = pdf_load_type3_font(doc, rdb, dict); + fontdesc = pdf_load_type3_font(ctx, doc, rdb, dict); type3 = 1; } else if (charprocs) { fz_warn(ctx, "unknown font format, guessing type3."); - fontdesc = pdf_load_type3_font(doc, rdb, dict); + fontdesc = pdf_load_type3_font(ctx, doc, rdb, dict); type3 = 1; } else if (dfonts) { fz_warn(ctx, "unknown font format, guessing type0."); - fontdesc = pdf_load_type0_font(doc, dict); + fontdesc = pdf_load_type0_font(ctx, doc, dict); } else { fz_warn(ctx, "unknown font format, guessing type1 or truetype."); - fontdesc = pdf_load_simple_font(doc, dict); + fontdesc = pdf_load_simple_font(ctx, doc, dict); } /* Save the widths to stretch non-CJK substitute fonts */ @@ -1267,7 +1261,7 @@ pdf_load_font(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, int nested_depth) pdf_store_item(ctx, dict, fontdesc, fontdesc->size); if (type3) - pdf_load_type3_glyphs(doc, fontdesc, nested_depth); + pdf_load_type3_glyphs(ctx, doc, fontdesc, nested_depth); return fontdesc; } diff --git a/source/pdf/pdf-fontfile.c b/source/pdf/pdf-fontfile.c index cf62108b..86b6682b 100644 --- a/source/pdf/pdf-fontfile.c +++ b/source/pdf/pdf-fontfile.c @@ -26,7 +26,7 @@ #endif unsigned char * -pdf_lookup_builtin_font(const char *name, unsigned int *len) +pdf_lookup_builtin_font(fz_context *ctx, const char *name, unsigned int *len) { if (!strcmp("Courier", name)) { *len = sizeof pdf_font_NimbusMono_Regular; @@ -89,37 +89,37 @@ pdf_lookup_builtin_font(const char *name, unsigned int *len) } unsigned char * -pdf_lookup_substitute_font(int mono, int serif, int bold, int italic, unsigned int *len) +pdf_lookup_substitute_font(fz_context *ctx, int mono, int serif, int bold, int italic, unsigned int *len) { if (mono) { if (bold) { - if (italic) return pdf_lookup_builtin_font("Courier-BoldOblique", len); - else return pdf_lookup_builtin_font("Courier-Bold", len); + if (italic) return pdf_lookup_builtin_font(ctx, "Courier-BoldOblique", len); + else return pdf_lookup_builtin_font(ctx, "Courier-Bold", len); } else { - if (italic) return pdf_lookup_builtin_font("Courier-Oblique", len); - else return pdf_lookup_builtin_font("Courier", len); + if (italic) return pdf_lookup_builtin_font(ctx, "Courier-Oblique", len); + else return pdf_lookup_builtin_font(ctx, "Courier", len); } } else if (serif) { if (bold) { - if (italic) return pdf_lookup_builtin_font("Times-BoldItalic", len); - else return pdf_lookup_builtin_font("Times-Bold", len); + if (italic) return pdf_lookup_builtin_font(ctx, "Times-BoldItalic", len); + else return pdf_lookup_builtin_font(ctx, "Times-Bold", len); } else { - if (italic) return pdf_lookup_builtin_font("Times-Italic", len); - else return pdf_lookup_builtin_font("Times-Roman", len); + if (italic) return pdf_lookup_builtin_font(ctx, "Times-Italic", len); + else return pdf_lookup_builtin_font(ctx, "Times-Roman", len); } } else { if (bold) { - if (italic) return pdf_lookup_builtin_font("Helvetica-BoldOblique", len); - else return pdf_lookup_builtin_font("Helvetica-Bold", len); + if (italic) return pdf_lookup_builtin_font(ctx, "Helvetica-BoldOblique", len); + else return pdf_lookup_builtin_font(ctx, "Helvetica-Bold", len); } else { - if (italic) return pdf_lookup_builtin_font("Helvetica-Oblique", len); - else return pdf_lookup_builtin_font("Helvetica", len); + if (italic) return pdf_lookup_builtin_font(ctx, "Helvetica-Oblique", len); + else return pdf_lookup_builtin_font(ctx, "Helvetica", len); } } } unsigned char * -pdf_lookup_substitute_cjk_font(int ros, int serif, int wmode, unsigned int *len, int *index) +pdf_lookup_substitute_cjk_font(fz_context *ctx, int ros, int serif, int wmode, unsigned int *len, int *index) { #ifndef NOCJKFONT #ifndef NOCJKFULL diff --git a/source/pdf/pdf-form.c b/source/pdf/pdf-form.c index 62e635ca..4caadd25 100644 --- a/source/pdf/pdf-form.c +++ b/source/pdf/pdf-form.c @@ -15,9 +15,9 @@ enum SigFlag_AppendOnly = 2 }; -static int pdf_field_dirties_document(pdf_document *doc, pdf_obj *field) +static int pdf_field_dirties_document(fz_context *ctx, pdf_document *doc, pdf_obj *field) { - int ff = pdf_get_field_flags(doc, field); + int ff = pdf_get_field_flags(ctx, doc, field); if (ff & Ff_NoExport) return 0; if (ff & Ff_ReadOnly) return 0; return 1; @@ -25,33 +25,32 @@ static int pdf_field_dirties_document(pdf_document *doc, pdf_obj *field) /* Find the point in a field hierarchy where all descendents * share the same name */ -static pdf_obj *find_head_of_field_group(pdf_obj *obj) +static pdf_obj *find_head_of_field_group(fz_context *ctx, pdf_obj *obj) { - if (obj == NULL || pdf_dict_gets(obj, "T")) + if (obj == NULL || pdf_dict_gets(ctx, obj, "T")) return obj; else - return find_head_of_field_group(pdf_dict_gets(obj, "Parent")); + return find_head_of_field_group(ctx, pdf_dict_gets(ctx, obj, "Parent")); } -static void pdf_field_mark_dirty(pdf_document *doc, pdf_obj *field) +static void pdf_field_mark_dirty(fz_context *ctx, pdf_document *doc, pdf_obj *field) { - pdf_obj *kids = pdf_dict_gets(field, "Kids"); + pdf_obj *kids = pdf_dict_gets(ctx, field, "Kids"); if (kids) { - int i, n = pdf_array_len(kids); + int i, n = pdf_array_len(ctx, kids); for (i = 0; i < n; i++) - pdf_field_mark_dirty(doc, pdf_array_get(kids, i)); + pdf_field_mark_dirty(ctx, doc, pdf_array_get(ctx, kids, i)); } else { - pdf_dirty_obj(field); + pdf_dirty_obj(ctx, field); } } -static void update_field_value(pdf_document *doc, pdf_obj *obj, char *text) +static void update_field_value(fz_context *ctx, pdf_document *doc, pdf_obj *obj, char *text) { - fz_context *ctx = doc->ctx; pdf_obj *sobj = NULL; pdf_obj *grp; @@ -60,40 +59,40 @@ static void update_field_value(pdf_document *doc, pdf_obj *obj, char *text) /* All fields of the same name should be updated, so * set the value at the head of the group */ - grp = find_head_of_field_group(obj); + grp = find_head_of_field_group(ctx, obj); if (grp) obj = grp; fz_var(sobj); fz_try(ctx) { - sobj = pdf_new_string(doc, text, strlen(text)); - pdf_dict_puts(obj, "V", sobj); + sobj = pdf_new_string(ctx, doc, text, strlen(text)); + pdf_dict_puts(ctx, obj, "V", sobj); } fz_always(ctx) { - pdf_drop_obj(sobj); + pdf_drop_obj(ctx, sobj); } fz_catch(ctx) { fz_rethrow(ctx); } - pdf_field_mark_dirty(doc, obj); + pdf_field_mark_dirty(ctx, doc, obj); } -static pdf_obj *find_field(pdf_obj *dict, char *name, int len) +static pdf_obj *find_field(fz_context *ctx, pdf_obj *dict, char *name, int len) { pdf_obj *field; - int i, n = pdf_array_len(dict); + int i, n = pdf_array_len(ctx, dict); for (i = 0; i < n; i++) { char *part; - field = pdf_array_get(dict, i); - part = pdf_to_str_buf(pdf_dict_gets(field, "T")); + field = pdf_array_get(ctx, dict, i); + part = pdf_to_str_buf(ctx, pdf_dict_gets(ctx, field, "T")); if (strlen(part) == (size_t)len && !memcmp(part, name, len)) return field; } @@ -101,7 +100,7 @@ static pdf_obj *find_field(pdf_obj *dict, char *name, int len) return NULL; } -pdf_obj *pdf_lookup_field(pdf_obj *form, char *name) +pdf_obj *pdf_lookup_field(fz_context *ctx, pdf_obj *form, char *name) { char *dot; char *namep; @@ -118,17 +117,16 @@ pdf_obj *pdf_lookup_field(pdf_obj *form, char *name) namep = dot + 1; dot = strchr(namep, '.'); len = dot ? dot - namep : strlen(namep); - dict = find_field(form, namep, len); + dict = find_field(ctx, form, namep, len); if (dot) - form = pdf_dict_gets(dict, "Kids"); + form = pdf_dict_gets(ctx, dict, "Kids"); } return dict; } -static void reset_field(pdf_document *doc, pdf_obj *field) +static void reset_field(fz_context *ctx, pdf_document *doc, pdf_obj *field) { - fz_context *ctx = doc->ctx; /* Set V to DV whereever DV is present, and delete V where DV is not. * FIXME: we assume for now that V has not been set unequal * to DV higher in the hierarchy than "field". @@ -136,13 +134,13 @@ static void reset_field(pdf_document *doc, pdf_obj *field) * At the bottom of the hierarchy we may find widget annotations * that aren't also fields, but DV and V will not be present in their * dictionaries, and attempts to remove V will be harmless. */ - pdf_obj *dv = pdf_dict_gets(field, "DV"); - pdf_obj *kids = pdf_dict_gets(field, "Kids"); + pdf_obj *dv = pdf_dict_gets(ctx, field, "DV"); + pdf_obj *kids = pdf_dict_gets(ctx, field, "Kids"); if (dv) - pdf_dict_puts(field, "V", dv); + pdf_dict_puts(ctx, field, "V", dv); else - pdf_dict_dels(field, "V"); + pdf_dict_dels(ctx, field, "V"); if (kids == NULL) { @@ -150,25 +148,25 @@ static void reset_field(pdf_document *doc, pdf_obj *field) * In some cases we need to update the appearance state; * in others we need to mark the field as dirty so that * the appearance stream will be regenerated. */ - switch (pdf_field_type(doc, field)) + switch (pdf_field_type(ctx, doc, field)) { case PDF_WIDGET_TYPE_RADIOBUTTON: case PDF_WIDGET_TYPE_CHECKBOX: { - pdf_obj *leafv = pdf_get_inheritable(doc, field, "V"); + pdf_obj *leafv = pdf_get_inheritable(ctx, doc, field, "V"); if (leafv) - pdf_keep_obj(leafv); + pdf_keep_obj(ctx, leafv); else - leafv = pdf_new_name(doc, "Off"); + leafv = pdf_new_name(ctx, doc, "Off"); fz_try(ctx) { - pdf_dict_puts(field, "AS", leafv); + pdf_dict_puts(ctx, field, "AS", leafv); } fz_always(ctx) { - pdf_drop_obj(leafv); + pdf_drop_obj(ctx, leafv); } fz_catch(ctx) { @@ -181,46 +179,46 @@ static void reset_field(pdf_document *doc, pdf_obj *field) break; default: - pdf_field_mark_dirty(doc, field); + pdf_field_mark_dirty(ctx, doc, field); break; } } - if (pdf_field_dirties_document(doc, field)) + if (pdf_field_dirties_document(ctx, doc, field)) doc->dirty = 1; } -void pdf_field_reset(pdf_document *doc, pdf_obj *field) +void pdf_field_reset(fz_context *ctx, pdf_document *doc, pdf_obj *field) { - pdf_obj *kids = pdf_dict_gets(field, "Kids"); + pdf_obj *kids = pdf_dict_gets(ctx, field, "Kids"); - reset_field(doc, field); + reset_field(ctx, doc, field); if (kids) { - int i, n = pdf_array_len(kids); + int i, n = pdf_array_len(ctx, kids); for (i = 0; i < n; i++) - pdf_field_reset(doc, pdf_array_get(kids, i)); + pdf_field_reset(ctx, doc, pdf_array_get(ctx, kids, i)); } } -static void add_field_hierarchy_to_array(pdf_obj *array, pdf_obj *field) +static void add_field_hierarchy_to_array(fz_context *ctx, pdf_obj *array, pdf_obj *field) { - pdf_obj *kids = pdf_dict_gets(field, "Kids"); - pdf_obj *exclude = pdf_dict_gets(field, "Exclude"); + pdf_obj *kids = pdf_dict_gets(ctx, field, "Kids"); + pdf_obj *exclude = pdf_dict_gets(ctx, field, "Exclude"); if (exclude) return; - pdf_array_push(array, field); + pdf_array_push(ctx, array, field); if (kids) { - int i, n = pdf_array_len(kids); + int i, n = pdf_array_len(ctx, kids); for (i = 0; i < n; i++) - add_field_hierarchy_to_array(array, pdf_array_get(kids, i)); + add_field_hierarchy_to_array(ctx, array, pdf_array_get(ctx, kids, i)); } } @@ -231,12 +229,11 @@ static void add_field_hierarchy_to_array(pdf_obj *array, pdf_obj *field) the array. specified_fields interprets this information and produces the array of fields to be acted upon. */ -static pdf_obj *specified_fields(pdf_document *doc, pdf_obj *fields, int exclude) +static pdf_obj *specified_fields(fz_context *ctx, pdf_document *doc, pdf_obj *fields, int exclude) { - fz_context *ctx = doc->ctx; - pdf_obj *form = pdf_dict_getp(pdf_trailer(doc), "Root/AcroForm/Fields"); + pdf_obj *form = pdf_dict_getp(ctx, pdf_trailer(ctx, doc), "Root/AcroForm/Fields"); int i, n; - pdf_obj *result = pdf_new_array(doc, 0); + pdf_obj *result = pdf_new_array(ctx, doc, 0); pdf_obj *nil = NULL; fz_var(nil); @@ -247,85 +244,84 @@ static pdf_obj *specified_fields(pdf_document *doc, pdf_obj *fields, int exclude if (exclude || !fields) { /* mark the fields we don't want to act upon */ - nil = pdf_new_null(doc); + nil = pdf_new_null(ctx, doc); - n = pdf_array_len(fields); + n = pdf_array_len(ctx, fields); for (i = 0; i < n; i++) { - pdf_obj *field = pdf_array_get(fields, i); + pdf_obj *field = pdf_array_get(ctx, fields, i); - if (pdf_is_string(field)) - field = pdf_lookup_field(form, pdf_to_str_buf(field)); + if (pdf_is_string(ctx, field)) + field = pdf_lookup_field(ctx, form, pdf_to_str_buf(ctx, field)); if (field) - pdf_dict_puts(field, "Exclude", nil); + pdf_dict_puts(ctx, field, "Exclude", nil); } /* Act upon all unmarked fields */ - n = pdf_array_len(form); + n = pdf_array_len(ctx, form); for (i = 0; i < n; i++) - add_field_hierarchy_to_array(result, pdf_array_get(form, i)); + add_field_hierarchy_to_array(ctx, result, pdf_array_get(ctx, form, i)); /* Unmark the marked fields */ - n = pdf_array_len(fields); + n = pdf_array_len(ctx, fields); for (i = 0; i < n; i++) { - pdf_obj *field = pdf_array_get(fields, i); + pdf_obj *field = pdf_array_get(ctx, fields, i); - if (pdf_is_string(field)) - field = pdf_lookup_field(form, pdf_to_str_buf(field)); + if (pdf_is_string(ctx, field)) + field = pdf_lookup_field(ctx, form, pdf_to_str_buf(ctx, field)); if (field) - pdf_dict_dels(field, "Exclude"); + pdf_dict_dels(ctx, field, "Exclude"); } } else { - n = pdf_array_len(fields); + n = pdf_array_len(ctx, fields); for (i = 0; i < n; i++) { - pdf_obj *field = pdf_array_get(fields, i); + pdf_obj *field = pdf_array_get(ctx, fields, i); - if (pdf_is_string(field)) - field = pdf_lookup_field(form, pdf_to_str_buf(field)); + if (pdf_is_string(ctx, field)) + field = pdf_lookup_field(ctx, form, pdf_to_str_buf(ctx, field)); if (field) - add_field_hierarchy_to_array(result, field); + add_field_hierarchy_to_array(ctx, result, field); } } } fz_always(ctx) { - pdf_drop_obj(nil); + pdf_drop_obj(ctx, nil); } fz_catch(ctx) { - pdf_drop_obj(result); + pdf_drop_obj(ctx, result); fz_rethrow(ctx); } return result; } -static void reset_form(pdf_document *doc, pdf_obj *fields, int exclude) +static void reset_form(fz_context *ctx, pdf_document *doc, pdf_obj *fields, int exclude) { - fz_context *ctx = doc->ctx; - pdf_obj *sfields = specified_fields(doc, fields, exclude); + pdf_obj *sfields = specified_fields(ctx, doc, fields, exclude); fz_try(ctx) { - int i, n = pdf_array_len(sfields); + int i, n = pdf_array_len(ctx, sfields); for (i = 0; i < n; i++) - reset_field(doc, pdf_array_get(sfields, i)); + reset_field(ctx, doc, pdf_array_get(ctx, sfields, i)); } fz_always(ctx) { - pdf_drop_obj(sfields); + pdf_drop_obj(ctx, sfields); } fz_catch(ctx) { @@ -333,19 +329,18 @@ static void reset_form(pdf_document *doc, pdf_obj *fields, int exclude) } } -static void execute_action(pdf_document *doc, pdf_obj *obj, pdf_obj *a) +static void execute_action(fz_context *ctx, pdf_document *doc, pdf_obj *obj, pdf_obj *a) { - fz_context *ctx = doc->ctx; if (a) { - char *type = pdf_to_name(pdf_dict_gets(a, "S")); + char *type = pdf_to_name(ctx, pdf_dict_gets(ctx, a, "S")); if (!strcmp(type, "JavaScript")) { - pdf_obj *js = pdf_dict_gets(a, "JS"); + pdf_obj *js = pdf_dict_gets(ctx, a, "JS"); if (js) { - char *code = pdf_to_utf8(doc, js); + char *code = pdf_to_utf8(ctx, doc, js); fz_try(ctx) { pdf_js_execute(doc->js, code); @@ -362,21 +357,21 @@ static void execute_action(pdf_document *doc, pdf_obj *obj, pdf_obj *a) } else if (!strcmp(type, "ResetForm")) { - reset_form(doc, pdf_dict_gets(a, "Fields"), pdf_to_int(pdf_dict_gets(a, "Flags")) & 1); + reset_form(ctx, doc, pdf_dict_gets(ctx, a, "Fields"), pdf_to_int(ctx, pdf_dict_gets(ctx, a, "Flags")) & 1); } else if (!strcmp(type, "Named")) { - char *name = pdf_to_name(pdf_dict_gets(a, "N")); + char *name = pdf_to_name(ctx, pdf_dict_gets(ctx, a, "N")); if (!strcmp(name, "Print")) - pdf_event_issue_print(doc); + pdf_event_issue_print(ctx, doc); } } } -static void execute_action_chain(pdf_document *doc, pdf_obj *obj) +static void execute_action_chain(fz_context *ctx, pdf_document *doc, pdf_obj *obj) { - pdf_obj *a = pdf_dict_gets(obj, "A"); + pdf_obj *a = pdf_dict_gets(ctx, obj, "A"); pdf_js_event e; e.target = obj; @@ -385,14 +380,14 @@ static void execute_action_chain(pdf_document *doc, pdf_obj *obj) while (a) { - execute_action(doc, obj, a); - a = pdf_dict_gets(a, "Next"); + execute_action(ctx, doc, obj, a); + a = pdf_dict_gets(ctx, a, "Next"); } } -static void execute_additional_action(pdf_document *doc, pdf_obj *obj, char *act) +static void execute_additional_action(fz_context *ctx, pdf_document *doc, pdf_obj *obj, char *act) { - pdf_obj *a = pdf_dict_getp(obj, act); + pdf_obj *a = pdf_dict_getp(ctx, obj, act); if (a) { @@ -401,24 +396,23 @@ static void execute_additional_action(pdf_document *doc, pdf_obj *obj, char *act e.target = obj; e.value = ""; pdf_js_setup_event(doc->js, &e); - execute_action(doc, obj, a); + execute_action(ctx, doc, obj, a); } } -static void check_off(pdf_document *doc, pdf_obj *obj) +static void check_off(fz_context *ctx, pdf_document *doc, pdf_obj *obj) { - fz_context *ctx = doc->ctx; pdf_obj *off = NULL; fz_var(off); fz_try(ctx); { - off = pdf_new_name(doc, "Off"); - pdf_dict_puts(obj, "AS", off); + off = pdf_new_name(ctx, doc, "Off"); + pdf_dict_puts(ctx, obj, "AS", off); } fz_always(ctx) { - pdf_drop_obj(off); + pdf_drop_obj(ctx, off); } fz_catch(ctx) { @@ -426,27 +420,26 @@ static void check_off(pdf_document *doc, pdf_obj *obj) } } -static void set_check(pdf_document *doc, pdf_obj *chk, char *name) +static void set_check(fz_context *ctx, pdf_document *doc, pdf_obj *chk, char *name) { - pdf_obj *n = pdf_dict_getp(chk, "AP/N"); + pdf_obj *n = pdf_dict_getp(ctx, chk, "AP/N"); pdf_obj *val = NULL; - fz_context *ctx = doc->ctx; fz_var(val); fz_try(ctx) { /* If name is a possible value of this check * box then use it, otherwise use "Off" */ - if (pdf_dict_gets(n, name)) - val = pdf_new_name(doc, name); + if (pdf_dict_gets(ctx, n, name)) + val = pdf_new_name(ctx, doc, name); else - val = pdf_new_name(doc, "Off"); + val = pdf_new_name(ctx, doc, "Off"); - pdf_dict_puts(chk, "AS", val); + pdf_dict_puts(ctx, chk, "AS", val); } fz_always(ctx) { - pdf_drop_obj(val); + pdf_drop_obj(ctx, val); } fz_catch(ctx) { @@ -456,55 +449,53 @@ static void set_check(pdf_document *doc, pdf_obj *chk, char *name) /* Set the values of all fields in a group defined by a node * in the hierarchy */ -static void set_check_grp(pdf_document *doc, pdf_obj *grp, char *val) +static void set_check_grp(fz_context *ctx, pdf_document *doc, pdf_obj *grp, char *val) { - pdf_obj *kids = pdf_dict_gets(grp, "Kids"); + pdf_obj *kids = pdf_dict_gets(ctx, grp, "Kids"); if (kids == NULL) { - set_check(doc, grp, val); + set_check(ctx, doc, grp, val); } else { - int i, n = pdf_array_len(kids); + int i, n = pdf_array_len(ctx, kids); for (i = 0; i < n; i++) - set_check_grp(doc, pdf_array_get(kids, i), val); + set_check_grp(ctx, doc, pdf_array_get(ctx, kids, i), val); } } -static void recalculate(pdf_document *doc) +static void recalculate(fz_context *ctx, pdf_document *doc) { - fz_context *ctx = doc->ctx; - if (doc->recalculating) return; doc->recalculating = 1; fz_try(ctx) { - pdf_obj *co = pdf_dict_getp(pdf_trailer(doc), "Root/AcroForm/CO"); + pdf_obj *co = pdf_dict_getp(ctx, pdf_trailer(ctx, doc), "Root/AcroForm/CO"); if (co && doc->js) { - int i, n = pdf_array_len(co); + int i, n = pdf_array_len(ctx, co); for (i = 0; i < n; i++) { - pdf_obj *field = pdf_array_get(co, i); - pdf_obj *calc = pdf_dict_getp(field, "AA/C"); + pdf_obj *field = pdf_array_get(ctx, co, i); + pdf_obj *calc = pdf_dict_getp(ctx, field, "AA/C"); if (calc) { pdf_js_event e; e.target = field; - e.value = pdf_field_value(doc, field); + e.value = pdf_field_value(ctx, doc, field); pdf_js_setup_event(doc->js, &e); - execute_action(doc, field, calc); + execute_action(ctx, doc, field, calc); /* A calculate action, updates event.value. We need * to place the value in the field */ - update_field_value(doc, field, pdf_js_get_event(doc->js)->value); + update_field_value(ctx, doc, field, pdf_js_get_event(doc->js)->value); } } } @@ -519,25 +510,24 @@ static void recalculate(pdf_document *doc) } } -static void toggle_check_box(pdf_document *doc, pdf_obj *obj) +static void toggle_check_box(fz_context *ctx, pdf_document *doc, pdf_obj *obj) { - fz_context *ctx = doc->ctx; - pdf_obj *as = pdf_dict_gets(obj, "AS"); - int ff = pdf_get_field_flags(doc, obj); + pdf_obj *as = pdf_dict_gets(ctx, obj, "AS"); + int ff = pdf_get_field_flags(ctx, doc, obj); int radio = ((ff & (Ff_Pushbutton|Ff_Radio)) == Ff_Radio); char *val = NULL; - pdf_obj *grp = radio ? pdf_dict_gets(obj, "Parent") : find_head_of_field_group(obj); + pdf_obj *grp = radio ? pdf_dict_gets(ctx, obj, "Parent") : find_head_of_field_group(ctx, obj); if (!grp) grp = obj; - if (as && strcmp(pdf_to_name(as), "Off")) + if (as && strcmp(pdf_to_name(ctx, as), "Off")) { /* "as" neither missing nor set to Off. Set it to Off, unless * this is a non-toggle-off radio button. */ if ((ff & (Ff_Pushbutton|Ff_NoToggleToOff|Ff_Radio)) != (Ff_NoToggleToOff|Ff_Radio)) { - check_off(doc, obj); + check_off(ctx, doc, obj); val = "Off"; } } @@ -546,14 +536,14 @@ static void toggle_check_box(pdf_document *doc, pdf_obj *obj) pdf_obj *n, *key = NULL; int len, i; - n = pdf_dict_getp(obj, "AP/N"); + n = pdf_dict_getp(ctx, obj, "AP/N"); /* Look for a key that isn't "Off" */ - len = pdf_dict_len(n); + len = pdf_dict_len(ctx, n); for (i = 0; i < len; i++) { - key = pdf_dict_get_key(n, i); - if (pdf_is_name(key) && strcmp(pdf_to_name(key), "Off")) + key = pdf_dict_get_key(ctx, n, i); + if (pdf_is_name(ctx, key) && strcmp(pdf_to_name(ctx, key), "Off")) break; } @@ -561,19 +551,19 @@ static void toggle_check_box(pdf_document *doc, pdf_obj *obj) if (!key) return; - val = pdf_to_name(key); + val = pdf_to_name(ctx, key); if (radio) { /* For radio buttons, first turn off all buttons in the group and * then set the one that was clicked */ - pdf_obj *kids = pdf_dict_gets(grp, "Kids"); + pdf_obj *kids = pdf_dict_gets(ctx, grp, "Kids"); - len = pdf_array_len(kids); + len = pdf_array_len(ctx, kids); for (i = 0; i < len; i++) - check_off(doc, pdf_array_get(kids, i)); + check_off(ctx, doc, pdf_array_get(ctx, kids, i)); - pdf_dict_puts(obj, "AS", key); + pdf_dict_puts(ctx, obj, "AS", key); } else { @@ -582,9 +572,9 @@ static void toggle_check_box(pdf_document *doc, pdf_obj *obj) * all to the same value. This may cause the group to act like * radio buttons, if each have distinct "On" values */ if (grp) - set_check_grp(doc, grp, val); + set_check_grp(ctx, doc, grp, val); else - set_check(doc, obj, val); + set_check(ctx, doc, obj, val); } } @@ -595,28 +585,28 @@ static void toggle_check_box(pdf_document *doc, pdf_obj *obj) fz_var(v); fz_try(ctx) { - v = pdf_new_string(doc, val, strlen(val)); - pdf_dict_puts(grp, "V", v); + v = pdf_new_string(ctx, doc, val, strlen(val)); + pdf_dict_puts(ctx, grp, "V", v); } fz_always(ctx) { - pdf_drop_obj(v); + pdf_drop_obj(ctx, v); } fz_catch(ctx) { fz_rethrow(ctx); } - recalculate(doc); + recalculate(ctx, doc); } } -int pdf_has_unsaved_changes(pdf_document *doc) +int pdf_has_unsaved_changes(fz_context *ctx, pdf_document *doc) { return doc->dirty; } -int pdf_pass_event(pdf_document *doc, pdf_page *page, pdf_ui_event *ui_event) +int pdf_pass_event(fz_context *ctx, pdf_document *doc, pdf_page *page, pdf_ui_event *ui_event) { pdf_annot *annot; pdf_hotspot *hp = &doc->hotspot; @@ -635,7 +625,7 @@ int pdf_pass_event(pdf_document *doc, pdf_page *page, pdf_ui_event *ui_event) if (annot) { - int f = pdf_to_int(pdf_dict_gets(annot->obj, "F")); + int f = pdf_to_int(ctx, pdf_dict_gets(ctx, annot->obj, "F")); if (f & (F_Hidden|F_NoView)) annot = NULL; @@ -651,24 +641,24 @@ int pdf_pass_event(pdf_document *doc, pdf_page *page, pdf_ui_event *ui_event) if (doc->focus_obj) { /* Execute the blur action */ - execute_additional_action(doc, doc->focus_obj, "AA/Bl"); + execute_additional_action(ctx, doc, doc->focus_obj, "AA/Bl"); doc->focus = NULL; - pdf_drop_obj(doc->focus_obj); + pdf_drop_obj(ctx, doc->focus_obj); doc->focus_obj = NULL; } if (annot) { doc->focus = annot; - doc->focus_obj = pdf_keep_obj(annot->obj); + doc->focus_obj = pdf_keep_obj(ctx, annot->obj); - hp->num = pdf_to_num(annot->obj); - hp->gen = pdf_to_gen(annot->obj); + hp->num = pdf_to_num(ctx, annot->obj); + hp->gen = pdf_to_gen(ctx, annot->obj); hp->state = HOTSPOT_POINTER_DOWN; changed = 1; /* Exectute the down and focus actions */ - execute_additional_action(doc, annot->obj, "AA/Fo"); - execute_additional_action(doc, annot->obj, "AA/D"); + execute_additional_action(ctx, doc, annot->obj, "AA/Fo"); + execute_additional_action(ctx, doc, annot->obj, "AA/D"); } break; @@ -687,15 +677,15 @@ int pdf_pass_event(pdf_document *doc, pdf_page *page, pdf_ui_event *ui_event) case PDF_WIDGET_TYPE_RADIOBUTTON: case PDF_WIDGET_TYPE_CHECKBOX: /* FIXME: treating radio buttons like check boxes, for now */ - toggle_check_box(doc, annot->obj); + toggle_check_box(ctx, doc, annot->obj); changed = 1; break; } /* Execute the up action */ - execute_additional_action(doc, annot->obj, "AA/U"); + execute_additional_action(ctx, doc, annot->obj, "AA/U"); /* Execute the main action chain */ - execute_action_chain(doc, annot->obj); + execute_action_chain(ctx, doc, annot->obj); } break; } @@ -706,9 +696,8 @@ int pdf_pass_event(pdf_document *doc, pdf_page *page, pdf_ui_event *ui_event) return changed; } -void pdf_update_page(pdf_document *doc, pdf_page *page) +void pdf_update_page(fz_context *ctx, pdf_document *doc, pdf_page *page) { - fz_context *ctx = doc->ctx; pdf_annot *annot; /* Reset changed_annots to empty */ @@ -732,7 +721,7 @@ void pdf_update_page(pdf_document *doc, pdf_page *page) fz_try(ctx) { - pdf_update_annot(doc, annot); + pdf_update_annot(ctx, doc, annot); if ((ap != annot->ap || ap_iteration != annot->ap_iteration)) { @@ -769,7 +758,7 @@ void pdf_update_page(pdf_document *doc, pdf_page *page) page->deleted_annots = NULL; } -pdf_annot *pdf_poll_changed_annot(pdf_document *idoc, pdf_page *page) +pdf_annot *pdf_poll_changed_annot(fz_context *ctx, pdf_document *idoc, pdf_page *page) { pdf_annot *annot = page->changed_annots; @@ -779,12 +768,12 @@ pdf_annot *pdf_poll_changed_annot(pdf_document *idoc, pdf_page *page) return annot; } -pdf_widget *pdf_focused_widget(pdf_document *doc) +pdf_widget *pdf_focused_widget(fz_context *ctx, pdf_document *doc) { return (pdf_widget *)doc->focus; } -pdf_widget *pdf_first_widget(pdf_document *doc, pdf_page *page) +pdf_widget *pdf_first_widget(fz_context *ctx, pdf_document *doc, pdf_page *page) { pdf_annot *annot = page->annots; @@ -794,7 +783,7 @@ pdf_widget *pdf_first_widget(pdf_document *doc, pdf_page *page) return (pdf_widget *)annot; } -pdf_widget *pdf_next_widget(pdf_widget *previous) +pdf_widget *pdf_next_widget(fz_context *ctx, pdf_widget *previous) { pdf_annot *annot = (pdf_annot *)previous; @@ -807,46 +796,45 @@ pdf_widget *pdf_next_widget(pdf_widget *previous) return (pdf_widget *)annot; } -pdf_widget *pdf_create_widget(pdf_document *doc, pdf_page *page, int type, char *fieldname) +pdf_widget *pdf_create_widget(fz_context *ctx, pdf_document *doc, pdf_page *page, int type, char *fieldname) { - fz_context *ctx = doc->ctx; pdf_obj *form = NULL; - int old_sigflags = pdf_to_int(pdf_dict_getp(pdf_trailer(doc), "Root/AcroForm/SigFlags")); - pdf_annot *annot = pdf_create_annot(doc, page, FZ_ANNOT_WIDGET); + int old_sigflags = pdf_to_int(ctx, pdf_dict_getp(ctx, pdf_trailer(ctx, doc), "Root/AcroForm/SigFlags")); + pdf_annot *annot = pdf_create_annot(ctx, doc, page, FZ_ANNOT_WIDGET); fz_try(ctx) { - pdf_set_field_type(doc, annot->obj, type); - pdf_dict_puts_drop(annot->obj, "T", pdf_new_string(doc, fieldname, strlen(fieldname))); + pdf_set_field_type(ctx, doc, annot->obj, type); + pdf_dict_puts_drop(ctx, annot->obj, "T", pdf_new_string(ctx, doc, fieldname, strlen(fieldname))); annot->widget_type = type; if (type == PDF_WIDGET_TYPE_SIGNATURE) { int sigflags = (old_sigflags | (SigFlag_SignaturesExist|SigFlag_AppendOnly)); - pdf_dict_putp_drop(pdf_trailer(doc), "Root/AcroForm/SigFlags", pdf_new_int(doc, sigflags)); + pdf_dict_putp_drop(ctx, pdf_trailer(ctx, doc), "Root/AcroForm/SigFlags", pdf_new_int(ctx, doc, sigflags)); } /* pdf_create_annot will have linked the new widget into the page's annot array. We also need it linked into the document's form */ - form = pdf_dict_getp(pdf_trailer(doc), "Root/AcroForm/Fields"); + form = pdf_dict_getp(ctx, pdf_trailer(ctx, doc), "Root/AcroForm/Fields"); if (!form) { - form = pdf_new_array(doc, 1); - pdf_dict_putp_drop(pdf_trailer(doc), "Root/AcroForm/Fields", form); + form = pdf_new_array(ctx, doc, 1); + pdf_dict_putp_drop(ctx, pdf_trailer(ctx, doc), "Root/AcroForm/Fields", form); } - pdf_array_push(form, annot->obj); /* Cleanup relies on this statement being last */ + pdf_array_push(ctx, form, annot->obj); /* Cleanup relies on this statement being last */ } fz_catch(ctx) { - pdf_delete_annot(doc, page, annot); + pdf_delete_annot(ctx, doc, page, annot); /* An empty Fields array may have been created, but that is harmless */ if (type == PDF_WIDGET_TYPE_SIGNATURE) - pdf_dict_putp_drop(pdf_trailer(doc), "Root/AcroForm/SigFlags", pdf_new_int(doc, old_sigflags)); + pdf_dict_putp_drop(ctx, pdf_trailer(ctx, doc), "Root/AcroForm/SigFlags", pdf_new_int(ctx, doc, old_sigflags)); fz_rethrow(ctx); } @@ -854,15 +842,15 @@ pdf_widget *pdf_create_widget(pdf_document *doc, pdf_page *page, int type, char return (pdf_widget *)annot; } -int pdf_widget_get_type(pdf_widget *widget) +int pdf_widget_get_type(fz_context *ctx, pdf_widget *widget) { pdf_annot *annot = (pdf_annot *)widget; return annot->widget_type; } -static int set_text_field_value(pdf_document *doc, pdf_obj *field, char *text) +static int set_text_field_value(fz_context *ctx, pdf_document *doc, pdf_obj *field, char *text) { - pdf_obj *v = pdf_dict_getp(field, "AA/V"); + pdf_obj *v = pdf_dict_getp(ctx, field, "AA/V"); if (v && doc->js) { @@ -871,7 +859,7 @@ static int set_text_field_value(pdf_document *doc, pdf_obj *field, char *text) e.target = field; e.value = text; pdf_js_setup_event(doc->js, &e); - execute_action(doc, field, v); + execute_action(ctx, doc, field, v); if (!pdf_js_get_event(doc->js)->rc) return 0; @@ -879,43 +867,42 @@ static int set_text_field_value(pdf_document *doc, pdf_obj *field, char *text) text = pdf_js_get_event(doc->js)->value; } - if (pdf_field_dirties_document(doc, field)) + if (pdf_field_dirties_document(ctx, doc, field)) doc->dirty = 1; - update_field_value(doc, field, text); + update_field_value(ctx, doc, field, text); return 1; } -static void update_checkbox_selector(pdf_document *doc, pdf_obj *field, char *val) +static void update_checkbox_selector(fz_context *ctx, pdf_document *doc, pdf_obj *field, char *val) { - fz_context *ctx = doc->ctx; - pdf_obj *kids = pdf_dict_gets(field, "Kids"); + pdf_obj *kids = pdf_dict_gets(ctx, field, "Kids"); if (kids) { - int i, n = pdf_array_len(kids); + int i, n = pdf_array_len(ctx, kids); for (i = 0; i < n; i++) - update_checkbox_selector(doc, pdf_array_get(kids, i), val); + update_checkbox_selector(ctx, doc, pdf_array_get(ctx, kids, i), val); } else { - pdf_obj *n = pdf_dict_getp(field, "AP/N"); + pdf_obj *n = pdf_dict_getp(ctx, field, "AP/N"); pdf_obj *oval = NULL; fz_var(oval); fz_try(ctx) { - if (pdf_dict_gets(n, val)) - oval = pdf_new_name(doc, val); + if (pdf_dict_gets(ctx, n, val)) + oval = pdf_new_name(ctx, doc, val); else - oval = pdf_new_name(doc, "Off"); + oval = pdf_new_name(ctx, doc, "Off"); - pdf_dict_puts(field, "AS", oval); + pdf_dict_puts(ctx, field, "AS", oval); } fz_always(ctx) { - pdf_drop_obj(oval); + pdf_drop_obj(ctx, oval); } fz_catch(ctx) { @@ -924,43 +911,43 @@ static void update_checkbox_selector(pdf_document *doc, pdf_obj *field, char *va } } -static int set_checkbox_value(pdf_document *doc, pdf_obj *field, char *val) +static int set_checkbox_value(fz_context *ctx, pdf_document *doc, pdf_obj *field, char *val) { - update_checkbox_selector(doc, field, val); - update_field_value(doc, field, val); + update_checkbox_selector(ctx, doc, field, val); + update_field_value(ctx, doc, field, val); return 1; } -int pdf_field_set_value(pdf_document *doc, pdf_obj *field, char *text) +int pdf_field_set_value(fz_context *ctx, pdf_document *doc, pdf_obj *field, char *text) { int res = 0; - switch (pdf_field_type(doc, field)) + switch (pdf_field_type(ctx, doc, field)) { case PDF_WIDGET_TYPE_TEXT: - res = set_text_field_value(doc, field, text); + res = set_text_field_value(ctx, doc, field, text); break; case PDF_WIDGET_TYPE_CHECKBOX: case PDF_WIDGET_TYPE_RADIOBUTTON: - res = set_checkbox_value(doc, field, text); + res = set_checkbox_value(ctx, doc, field, text); break; default: /* text updater will do in most cases */ - update_field_value(doc, field, text); + update_field_value(ctx, doc, field, text); res = 1; break; } - recalculate(doc); + recalculate(ctx, doc); return res; } -char *pdf_field_border_style(pdf_document *doc, pdf_obj *field) +char *pdf_field_border_style(fz_context *ctx, pdf_document *doc, pdf_obj *field) { - char *bs = pdf_to_name(pdf_dict_getp(field, "BS/S")); + char *bs = pdf_to_name(ctx, pdf_dict_getp(ctx, field, "BS/S")); switch (*bs) { @@ -974,32 +961,31 @@ char *pdf_field_border_style(pdf_document *doc, pdf_obj *field) return "Solid"; } -void pdf_field_set_border_style(pdf_document *doc, pdf_obj *field, char *text) +void pdf_field_set_border_style(fz_context *ctx, pdf_document *doc, pdf_obj *field, char *text) { - fz_context *ctx = doc->ctx; pdf_obj *val = NULL; if (!strcmp(text, "Solid")) - val = pdf_new_name(doc, "S"); + val = pdf_new_name(ctx, doc, "S"); else if (!strcmp(text, "Dashed")) - val = pdf_new_name(doc, "D"); + val = pdf_new_name(ctx, doc, "D"); else if (!strcmp(text, "Beveled")) - val = pdf_new_name(doc, "B"); + val = pdf_new_name(ctx, doc, "B"); else if (!strcmp(text, "Inset")) - val = pdf_new_name(doc, "I"); + val = pdf_new_name(ctx, doc, "I"); else if (!strcmp(text, "Underline")) - val = pdf_new_name(doc, "U"); + val = pdf_new_name(ctx, doc, "U"); else return; fz_try(ctx); { - pdf_dict_putp(field, "BS/S", val); - pdf_field_mark_dirty(doc, field); + pdf_dict_putp(ctx, field, "BS/S", val); + pdf_field_mark_dirty(ctx, doc, field); } fz_always(ctx) { - pdf_drop_obj(val); + pdf_drop_obj(ctx, val); } fz_catch(ctx) { @@ -1007,22 +993,21 @@ void pdf_field_set_border_style(pdf_document *doc, pdf_obj *field, char *text) } } -void pdf_field_set_button_caption(pdf_document *doc, pdf_obj *field, char *text) +void pdf_field_set_button_caption(fz_context *ctx, pdf_document *doc, pdf_obj *field, char *text) { - fz_context *ctx = doc->ctx; - pdf_obj *val = pdf_new_string(doc, text, strlen(text)); + pdf_obj *val = pdf_new_string(ctx, doc, text, strlen(text)); fz_try(ctx); { - if (pdf_field_type(doc, field) == PDF_WIDGET_TYPE_PUSHBUTTON) + if (pdf_field_type(ctx, doc, field) == PDF_WIDGET_TYPE_PUSHBUTTON) { - pdf_dict_putp(field, "MK/CA", val); - pdf_field_mark_dirty(doc, field); + pdf_dict_putp(ctx, field, "MK/CA", val); + pdf_field_mark_dirty(ctx, doc, field); } } fz_always(ctx) { - pdf_drop_obj(val); + pdf_drop_obj(ctx, val); } fz_catch(ctx) { @@ -1030,7 +1015,7 @@ void pdf_field_set_button_caption(pdf_document *doc, pdf_obj *field, char *text) } } -int pdf_field_display(pdf_document *doc, pdf_obj *field) +int pdf_field_display(fz_context *ctx, pdf_document *doc, pdf_obj *field) { pdf_obj *kids; int f, res = Display_Visible; @@ -1038,10 +1023,10 @@ int pdf_field_display(pdf_document *doc, pdf_obj *field) /* Base response on first of children. Not ideal, * but not clear how to handle children with * differing values */ - while ((kids = pdf_dict_gets(field, "Kids")) != NULL) - field = pdf_array_get(kids, 0); + while ((kids = pdf_dict_gets(ctx, field, "Kids")) != NULL) + field = pdf_array_get(ctx, kids, 0); - f = pdf_to_int(pdf_dict_gets(field, "F")); + f = pdf_to_int(ctx, pdf_dict_gets(ctx, field, "F")); if (f & F_Hidden) { @@ -1067,12 +1052,11 @@ int pdf_field_display(pdf_document *doc, pdf_obj *field) * get the field name in a char buffer that has spare room to * add more characters at the end. */ -static char *get_field_name(pdf_document *doc, pdf_obj *field, int spare) +static char *get_field_name(fz_context *ctx, pdf_document *doc, pdf_obj *field, int spare) { - fz_context *ctx = doc->ctx; char *res = NULL; - pdf_obj *parent = pdf_dict_gets(field, "Parent"); - char *lname = pdf_to_str_buf(pdf_dict_gets(field, "T")); + pdf_obj *parent = pdf_dict_gets(ctx, field, "Parent"); + char *lname = pdf_to_str_buf(ctx, pdf_dict_gets(ctx, field, "T")); int llen = strlen(lname); /* @@ -1084,7 +1068,7 @@ static char *get_field_name(pdf_document *doc, pdf_obj *field, int spare) if (parent) { - res = get_field_name(doc, parent, spare); + res = get_field_name(ctx, doc, parent, spare); } else { @@ -1103,20 +1087,19 @@ static char *get_field_name(pdf_document *doc, pdf_obj *field, int spare) return res; } -char *pdf_field_name(pdf_document *doc, pdf_obj *field) +char *pdf_field_name(fz_context *ctx, pdf_document *doc, pdf_obj *field) { - return get_field_name(doc, field, 0); + return get_field_name(ctx, doc, field, 0); } -void pdf_field_set_display(pdf_document *doc, pdf_obj *field, int d) +void pdf_field_set_display(fz_context *ctx, pdf_document *doc, pdf_obj *field, int d) { - fz_context *ctx = doc->ctx; - pdf_obj *kids = pdf_dict_gets(field, "Kids"); + pdf_obj *kids = pdf_dict_gets(ctx, field, "Kids"); if (!kids) { int mask = (F_Hidden|F_Print|F_NoView); - int f = pdf_to_int(pdf_dict_gets(field, "F")) & ~mask; + int f = pdf_to_int(ctx, pdf_dict_gets(ctx, field, "F")) & ~mask; pdf_obj *fo = NULL; switch (d) @@ -1137,12 +1120,12 @@ void pdf_field_set_display(pdf_document *doc, pdf_obj *field, int d) fz_var(fo); fz_try(ctx) { - fo = pdf_new_int(doc, f); - pdf_dict_puts(field, "F", fo); + fo = pdf_new_int(ctx, doc, f); + pdf_dict_puts(ctx, field, "F", fo); } fz_always(ctx) { - pdf_drop_obj(fo); + pdf_drop_obj(ctx, fo); } fz_catch(ctx) { @@ -1151,28 +1134,27 @@ void pdf_field_set_display(pdf_document *doc, pdf_obj *field, int d) } else { - int i, n = pdf_array_len(kids); + int i, n = pdf_array_len(ctx, kids); for (i = 0; i < n; i++) - pdf_field_set_display(doc, pdf_array_get(kids, i), d); + pdf_field_set_display(ctx, doc, pdf_array_get(ctx, kids, i), d); } } -void pdf_field_set_fill_color(pdf_document *doc, pdf_obj *field, pdf_obj *col) +void pdf_field_set_fill_color(fz_context *ctx, pdf_document *doc, pdf_obj *field, pdf_obj *col) { /* col == NULL mean transparent, but we can simply pass it on as with * non-NULL values because pdf_dict_putp interprets a NULL value as * delete */ - pdf_dict_putp(field, "MK/BG", col); - pdf_field_mark_dirty(doc, field); + pdf_dict_putp(ctx, field, "MK/BG", col); + pdf_field_mark_dirty(ctx, doc, field); } -void pdf_field_set_text_color(pdf_document *doc, pdf_obj *field, pdf_obj *col) +void pdf_field_set_text_color(fz_context *ctx, pdf_document *doc, pdf_obj *field, pdf_obj *col) { - fz_context *ctx = doc->ctx; pdf_da_info di; fz_buffer *fzbuf = NULL; - char *da = pdf_to_str_buf(pdf_get_inheritable(doc, field, "DA")); + char *da = pdf_to_str_buf(ctx, pdf_get_inheritable(ctx, doc, field, "DA")); unsigned char *buf; int len; pdf_obj *daobj = NULL; @@ -1187,24 +1169,24 @@ void pdf_field_set_text_color(pdf_document *doc, pdf_obj *field, pdf_obj *col) int i; pdf_parse_da(ctx, da, &di); - di.col_size = pdf_array_len(col); + di.col_size = pdf_array_len(ctx, col); len = fz_mini(di.col_size, nelem(di.col)); for (i = 0; i < len; i++) - di.col[i] = pdf_to_real(pdf_array_get(col, i)); + di.col[i] = pdf_to_real(ctx, pdf_array_get(ctx, col, i)); fzbuf = fz_new_buffer(ctx, 0); pdf_fzbuf_print_da(ctx, fzbuf, &di); len = fz_buffer_storage(ctx, fzbuf, &buf); - daobj = pdf_new_string(doc, (char *)buf, len); - pdf_dict_puts(field, "DA", daobj); - pdf_field_mark_dirty(doc, field); + daobj = pdf_new_string(ctx, doc, (char *)buf, len); + pdf_dict_puts(ctx, field, "DA", daobj); + pdf_field_mark_dirty(ctx, doc, field); } fz_always(ctx) { pdf_da_info_fin(ctx, &di); fz_drop_buffer(ctx, fzbuf); - pdf_drop_obj(daobj); + pdf_drop_obj(ctx, daobj); } fz_catch(ctx) { @@ -1212,7 +1194,7 @@ void pdf_field_set_text_color(pdf_document *doc, pdf_obj *field, pdf_obj *col) } } -fz_rect *pdf_bound_widget(pdf_widget *widget, fz_rect *rect) +fz_rect *pdf_bound_widget(fz_context *ctx, pdf_widget *widget, fz_rect *rect) { pdf_annot *annot = (pdf_annot *)widget; @@ -1223,16 +1205,15 @@ fz_rect *pdf_bound_widget(pdf_widget *widget, fz_rect *rect) return rect; } -char *pdf_text_widget_text(pdf_document *doc, pdf_widget *tw) +char *pdf_text_widget_text(fz_context *ctx, pdf_document *doc, pdf_widget *tw) { pdf_annot *annot = (pdf_annot *)tw; - fz_context *ctx = doc->ctx; char *text = NULL; fz_var(text); fz_try(ctx) { - text = pdf_field_value(doc, annot->obj); + text = pdf_field_value(ctx, doc, annot->obj); } fz_catch(ctx) { @@ -1242,24 +1223,23 @@ char *pdf_text_widget_text(pdf_document *doc, pdf_widget *tw) return text; } -int pdf_text_widget_max_len(pdf_document *doc, pdf_widget *tw) +int pdf_text_widget_max_len(fz_context *ctx, pdf_document *doc, pdf_widget *tw) { pdf_annot *annot = (pdf_annot *)tw; - return pdf_to_int(pdf_get_inheritable(doc, annot->obj, "MaxLen")); + return pdf_to_int(ctx, pdf_get_inheritable(ctx, doc, annot->obj, "MaxLen")); } -int pdf_text_widget_content_type(pdf_document *doc, pdf_widget *tw) +int pdf_text_widget_content_type(fz_context *ctx, pdf_document *doc, pdf_widget *tw) { pdf_annot *annot = (pdf_annot *)tw; - fz_context *ctx = doc->ctx; char *code = NULL; int type = PDF_WIDGET_CONTENT_UNRESTRAINED; fz_var(code); fz_try(ctx) { - code = pdf_get_string_or_stream(doc, pdf_dict_getp(annot->obj, "AA/F/JS")); + code = pdf_get_string_or_stream(ctx, doc, pdf_dict_getp(ctx, annot->obj, "AA/F/JS")); if (code) { if (strstr(code, "AFNumber_Format")) @@ -1284,9 +1264,9 @@ int pdf_text_widget_content_type(pdf_document *doc, pdf_widget *tw) return type; } -static int run_keystroke(pdf_document *doc, pdf_obj *field, char **text) +static int run_keystroke(fz_context *ctx, pdf_document *doc, pdf_obj *field, char **text) { - pdf_obj *k = pdf_dict_getp(field, "AA/K"); + pdf_obj *k = pdf_dict_getp(ctx, field, "AA/K"); if (k && doc->js) { @@ -1295,7 +1275,7 @@ static int run_keystroke(pdf_document *doc, pdf_obj *field, char **text) e.target = field; e.value = *text; pdf_js_setup_event(doc->js, &e); - execute_action(doc, field, k); + execute_action(ctx, doc, field, k); if (!pdf_js_get_event(doc->js)->rc) return 0; @@ -1306,17 +1286,16 @@ static int run_keystroke(pdf_document *doc, pdf_obj *field, char **text) return 1; } -int pdf_text_widget_set_text(pdf_document *doc, pdf_widget *tw, char *text) +int pdf_text_widget_set_text(fz_context *ctx, pdf_document *doc, pdf_widget *tw, char *text) { pdf_annot *annot = (pdf_annot *)tw; - fz_context *ctx = doc->ctx; int accepted = 0; fz_try(ctx) { - accepted = run_keystroke(doc, annot->obj, &text); + accepted = run_keystroke(ctx, doc, annot->obj, &text); if (accepted) - accepted = pdf_field_set_value(doc, annot->obj, text); + accepted = pdf_field_set_value(ctx, doc, annot->obj, text); } fz_catch(ctx) { @@ -1326,7 +1305,7 @@ int pdf_text_widget_set_text(pdf_document *doc, pdf_widget *tw, char *text) return accepted; } -int pdf_choice_widget_options(pdf_document *doc, pdf_widget *tw, char *opts[]) +int pdf_choice_widget_options(fz_context *ctx, pdf_document *doc, pdf_widget *tw, char *opts[]) { pdf_annot *annot = (pdf_annot *)tw; pdf_obj *optarr; @@ -1335,37 +1314,37 @@ int pdf_choice_widget_options(pdf_document *doc, pdf_widget *tw, char *opts[]) if (!annot) return 0; - optarr = pdf_dict_gets(annot->obj, "Opt"); - n = pdf_array_len(optarr); + optarr = pdf_dict_gets(ctx, annot->obj, "Opt"); + n = pdf_array_len(ctx, optarr); if (opts) { for (i = 0; i < n; i++) { - opts[i] = pdf_to_str_buf(pdf_array_get(optarr, i)); + opts[i] = pdf_to_str_buf(ctx, pdf_array_get(ctx, optarr, i)); } } return n; } -int pdf_choice_widget_is_multiselect(pdf_document *doc, pdf_widget *tw) +int pdf_choice_widget_is_multiselect(fz_context *ctx, pdf_document *doc, pdf_widget *tw) { pdf_annot *annot = (pdf_annot *)tw; if (!annot) return 0; - switch (pdf_field_type(doc, annot->obj)) + switch (pdf_field_type(ctx, doc, annot->obj)) { case PDF_WIDGET_TYPE_LISTBOX: case PDF_WIDGET_TYPE_COMBOBOX: - return (pdf_get_field_flags(doc, annot->obj) & Ff_MultiSelect) != 0; + return (pdf_get_field_flags(ctx, doc, annot->obj) & Ff_MultiSelect) != 0; default: return 0; } } -int pdf_choice_widget_value(pdf_document *doc, pdf_widget *tw, char *opts[]) +int pdf_choice_widget_value(fz_context *ctx, pdf_document *doc, pdf_widget *tw, char *opts[]) { pdf_annot *annot = (pdf_annot *)tw; pdf_obj *optarr; @@ -1374,29 +1353,29 @@ int pdf_choice_widget_value(pdf_document *doc, pdf_widget *tw, char *opts[]) if (!annot) return 0; - optarr = pdf_dict_gets(annot->obj, "V"); + optarr = pdf_dict_gets(ctx, annot->obj, "V"); - if (pdf_is_string(optarr)) + if (pdf_is_string(ctx, optarr)) { if (opts) - opts[0] = pdf_to_str_buf(optarr); + opts[0] = pdf_to_str_buf(ctx, optarr); return 1; } else { - n = pdf_array_len(optarr); + n = pdf_array_len(ctx, optarr); if (opts) { for (i = 0; i < n; i++) { - pdf_obj *elem = pdf_array_get(optarr, i); + pdf_obj *elem = pdf_array_get(ctx, optarr, i); - if (pdf_is_array(elem)) - elem = pdf_array_get(elem, 1); + if (pdf_is_array(ctx, elem)) + elem = pdf_array_get(ctx, elem, 1); - opts[i] = pdf_to_str_buf(elem); + opts[i] = pdf_to_str_buf(ctx, elem); } } @@ -1404,9 +1383,8 @@ int pdf_choice_widget_value(pdf_document *doc, pdf_widget *tw, char *opts[]) } } -void pdf_choice_widget_set_value(pdf_document *doc, pdf_widget *tw, int n, char *opts[]) +void pdf_choice_widget_set_value(fz_context *ctx, pdf_document *doc, pdf_widget *tw, int n, char *opts[]) { - fz_context *ctx = doc->ctx; pdf_annot *annot = (pdf_annot *)tw; pdf_obj *optarr = NULL, *opt = NULL; int i; @@ -1420,71 +1398,70 @@ void pdf_choice_widget_set_value(pdf_document *doc, pdf_widget *tw, int n, char { if (n != 1) { - optarr = pdf_new_array(doc, n); + optarr = pdf_new_array(ctx, doc, n); for (i = 0; i < n; i++) { - opt = pdf_new_string(doc, opts[i], strlen(opts[i])); - pdf_array_push(optarr, opt); - pdf_drop_obj(opt); + opt = pdf_new_string(ctx, doc, opts[i], strlen(opts[i])); + pdf_array_push(ctx, optarr, opt); + pdf_drop_obj(ctx, opt); opt = NULL; } - pdf_dict_puts(annot->obj, "V", optarr); - pdf_drop_obj(optarr); + pdf_dict_puts(ctx, annot->obj, "V", optarr); + pdf_drop_obj(ctx, optarr); } else { - opt = pdf_new_string(doc, opts[0], strlen(opts[0])); - pdf_dict_puts(annot->obj, "V", opt); - pdf_drop_obj(opt); + opt = pdf_new_string(ctx, doc, opts[0], strlen(opts[0])); + pdf_dict_puts(ctx, annot->obj, "V", opt); + pdf_drop_obj(ctx, opt); } /* FIXME: when n > 1, we should be regenerating the indexes */ - pdf_dict_dels(annot->obj, "I"); + pdf_dict_dels(ctx, annot->obj, "I"); - pdf_field_mark_dirty(doc, annot->obj); - if (pdf_field_dirties_document(doc, annot->obj)) + pdf_field_mark_dirty(ctx, doc, annot->obj); + if (pdf_field_dirties_document(ctx, doc, annot->obj)) doc->dirty = 1; } fz_catch(ctx) { - pdf_drop_obj(optarr); - pdf_drop_obj(opt); + pdf_drop_obj(ctx, optarr); + pdf_drop_obj(ctx, opt); fz_rethrow(ctx); } } -int pdf_signature_widget_byte_range(pdf_document *doc, pdf_widget *widget, int (*byte_range)[2]) +int pdf_signature_widget_byte_range(fz_context *ctx, pdf_document *doc, pdf_widget *widget, int (*byte_range)[2]) { pdf_annot *annot = (pdf_annot *)widget; - pdf_obj *br = pdf_dict_getp(annot->obj, "V/ByteRange"); - int i, n = pdf_array_len(br)/2; + pdf_obj *br = pdf_dict_getp(ctx, annot->obj, "V/ByteRange"); + int i, n = pdf_array_len(ctx, br)/2; if (byte_range) { for (i = 0; i < n; i++) { - byte_range[i][0] = pdf_to_int(pdf_array_get(br, 2*i)); - byte_range[i][1] = pdf_to_int(pdf_array_get(br, 2*i+1)); + byte_range[i][0] = pdf_to_int(ctx, pdf_array_get(ctx, br, 2*i)); + byte_range[i][1] = pdf_to_int(ctx, pdf_array_get(ctx, br, 2*i+1)); } } return n; } -int pdf_signature_widget_contents(pdf_document *doc, pdf_widget *widget, char **contents) +int pdf_signature_widget_contents(fz_context *ctx, pdf_document *doc, pdf_widget *widget, char **contents) { pdf_annot *annot = (pdf_annot *)widget; - pdf_obj *c = pdf_dict_getp(annot->obj, "V/Contents"); + pdf_obj *c = pdf_dict_getp(ctx, annot->obj, "V/Contents"); if (contents) - *contents = pdf_to_str_buf(c); - return pdf_to_str_len(c); + *contents = pdf_to_str_buf(ctx, c); + return pdf_to_str_len(ctx, c); } -void pdf_signature_set_value(pdf_document *doc, pdf_obj *field, pdf_signer *signer) +void pdf_signature_set_value(fz_context *ctx, pdf_document *doc, pdf_obj *field, pdf_signer *signer) { - fz_context *ctx = doc->ctx; pdf_obj *v; pdf_obj *indv; int vnum; @@ -1495,40 +1472,40 @@ void pdf_signature_set_value(pdf_document *doc, pdf_obj *field, pdf_signer *sign memset(buf, 0, sizeof(buf)); - vnum = pdf_create_object(doc); - indv = pdf_new_indirect(doc, vnum, 0); - pdf_dict_puts_drop(field, "V", indv); + vnum = pdf_create_object(ctx, doc); + indv = pdf_new_indirect(ctx, doc, vnum, 0); + pdf_dict_puts_drop(ctx, field, "V", indv); fz_var(v); fz_try(ctx) { - v = pdf_new_dict(doc, 4); - pdf_update_object(doc, vnum, v); + v = pdf_new_dict(ctx, doc, 4); + pdf_update_object(ctx, doc, vnum, v); } fz_always(ctx) { - pdf_drop_obj(v); + pdf_drop_obj(ctx, v); } fz_catch(ctx) { fz_rethrow(ctx); } - byte_range = pdf_new_array(doc, 4); - pdf_dict_puts_drop(v, "ByteRange", byte_range); + byte_range = pdf_new_array(ctx, doc, 4); + pdf_dict_puts_drop(ctx, v, "ByteRange", byte_range); - contents = pdf_new_string(doc, buf, sizeof(buf)); - pdf_dict_puts_drop(v, "Contents", contents); + contents = pdf_new_string(ctx, doc, buf, sizeof(buf)); + pdf_dict_puts_drop(ctx, v, "Contents", contents); - pdf_dict_puts_drop(v, "Filter", pdf_new_name(doc, "Adobe.PPKLite")); - pdf_dict_puts_drop(v, "SubFilter", pdf_new_name(doc, "adbe.pkcs7.detached")); + pdf_dict_puts_drop(ctx, v, "Filter", pdf_new_name(ctx, doc, "Adobe.PPKLite")); + pdf_dict_puts_drop(ctx, v, "SubFilter", pdf_new_name(ctx, doc, "adbe.pkcs7.detached")); /* Record details within the document structure so that contents * and byte_range can be updated with their correct values at * saving time */ - unsaved_sig = fz_malloc_struct(doc->ctx, pdf_unsaved_sig); - unsaved_sig->field = pdf_keep_obj(field); - unsaved_sig->signer = pdf_keep_signer(signer); + unsaved_sig = fz_malloc_struct(ctx, pdf_unsaved_sig); + unsaved_sig->field = pdf_keep_obj(ctx, field); + unsaved_sig->signer = pdf_keep_signer(ctx, signer); unsaved_sig->next = doc->unsaved_sigs; doc->unsaved_sigs = unsaved_sig; } diff --git a/source/pdf/pdf-function.c b/source/pdf/pdf-function.c index c8986e32..7ead09ca 100644 --- a/source/pdf/pdf-function.c +++ b/source/pdf/pdf-function.c @@ -111,7 +111,7 @@ struct ps_stack_s #ifndef NDEBUG void -pdf_debug_ps_stack(ps_stack *st) +pdf_debug_ps_stack(fz_context *ctx, ps_stack *st) { int i; @@ -693,16 +693,15 @@ resize_code(fz_context *ctx, pdf_function *func, int newsize) } static void -parse_code(pdf_function *func, fz_stream *stream, int *codeptr, pdf_lexbuf *buf) +parse_code(fz_context *ctx, pdf_function *func, fz_stream *stream, int *codeptr, pdf_lexbuf *buf) { pdf_token tok; int opptr, elseptr, ifptr; int a, b, mid, cmp; - fz_context *ctx = stream->ctx; while (1) { - tok = pdf_lex(stream, buf); + tok = pdf_lex(ctx, stream, buf); switch (tok) { @@ -744,16 +743,16 @@ parse_code(pdf_function *func, fz_stream *stream, int *codeptr, pdf_lexbuf *buf) resize_code(ctx, func, *codeptr); ifptr = *codeptr; - parse_code(func, stream, codeptr, buf); + parse_code(ctx, func, stream, codeptr, buf); - tok = pdf_lex(stream, buf); + tok = pdf_lex(ctx, stream, buf); if (tok == PDF_TOK_OPEN_BRACE) { elseptr = *codeptr; - parse_code(func, stream, codeptr, buf); + parse_code(ctx, func, stream, codeptr, buf); - tok = pdf_lex(stream, buf); + tok = pdf_lex(ctx, stream, buf); } else { @@ -835,13 +834,12 @@ parse_code(pdf_function *func, fz_stream *stream, int *codeptr, pdf_lexbuf *buf) } static void -load_postscript_func(pdf_function *func, pdf_document *doc, pdf_obj *dict, int num, int gen) +load_postscript_func(fz_context *ctx, pdf_document *doc, pdf_function *func, pdf_obj *dict, int num, int gen) { fz_stream *stream = NULL; int codeptr; pdf_lexbuf buf; pdf_token tok; - fz_context *ctx = doc->ctx; int locked = 0; pdf_lexbuf_init(ctx, &buf, PDF_LEXBUF_SMALL); @@ -851,9 +849,9 @@ load_postscript_func(pdf_function *func, pdf_document *doc, pdf_obj *dict, int n fz_try(ctx) { - stream = pdf_open_stream(doc, num, gen); + stream = pdf_open_stream(ctx, doc, num, gen); - tok = pdf_lex(stream, &buf); + tok = pdf_lex(ctx, stream, &buf); if (tok != PDF_TOK_OPEN_BRACE) { fz_throw(ctx, FZ_ERROR_GENERIC, "stream is not a calculator function"); @@ -863,12 +861,12 @@ load_postscript_func(pdf_function *func, pdf_document *doc, pdf_obj *dict, int n func->u.p.cap = 0; codeptr = 0; - parse_code(func, stream, &codeptr, &buf); + parse_code(ctx, func, stream, &codeptr, &buf); } fz_always(ctx) { - fz_drop_stream(stream); - pdf_lexbuf_fin(&buf); + fz_drop_stream(ctx, stream); + pdf_lexbuf_fin(ctx, &buf); } fz_catch(ctx) { @@ -909,9 +907,8 @@ eval_postscript_func(fz_context *ctx, pdf_function *func, const float *in, float #define MAX_SAMPLE_FUNCTION_SIZE (100 << 20) static void -load_sample_func(pdf_function *func, pdf_document *doc, pdf_obj *dict, int num, int gen) +load_sample_func(fz_context *ctx, pdf_document *doc, pdf_function *func, pdf_obj *dict, int num, int gen) { - fz_context *ctx = doc->ctx; fz_stream *stream; pdf_obj *obj; int samplecount; @@ -922,14 +919,14 @@ load_sample_func(pdf_function *func, pdf_document *doc, pdf_obj *dict, int num, func->u.sa.samples = NULL; - obj = pdf_dict_gets(dict, "Size"); - if (pdf_array_len(obj) < func->base.m) + obj = pdf_dict_gets(ctx, dict, "Size"); + if (pdf_array_len(ctx, obj) < func->base.m) fz_throw(ctx, FZ_ERROR_GENERIC, "too few sample function dimension sizes"); - if (pdf_array_len(obj) > func->base.m) + if (pdf_array_len(ctx, obj) > func->base.m) fz_warn(ctx, "too many sample function dimension sizes"); for (i = 0; i < func->base.m; i++) { - func->u.sa.size[i] = pdf_to_int(pdf_array_get(obj, i)); + func->u.sa.size[i] = pdf_to_int(ctx, pdf_array_get(ctx, obj, i)); if (func->u.sa.size[i] <= 0) { fz_warn(ctx, "non-positive sample function dimension size"); @@ -937,25 +934,25 @@ load_sample_func(pdf_function *func, pdf_document *doc, pdf_obj *dict, int num, } } - obj = pdf_dict_gets(dict, "BitsPerSample"); - func->u.sa.bps = bps = pdf_to_int(obj); + obj = pdf_dict_gets(ctx, dict, "BitsPerSample"); + func->u.sa.bps = bps = pdf_to_int(ctx, obj); for (i = 0; i < func->base.m; i++) { func->u.sa.encode[i][0] = 0; func->u.sa.encode[i][1] = func->u.sa.size[i] - 1; } - obj = pdf_dict_gets(dict, "Encode"); - if (pdf_is_array(obj)) + obj = pdf_dict_gets(ctx, dict, "Encode"); + if (pdf_is_array(ctx, obj)) { - int ranges = fz_mini(func->base.m, pdf_array_len(obj) / 2); + int ranges = fz_mini(func->base.m, pdf_array_len(ctx, obj) / 2); if (ranges != func->base.m) fz_warn(ctx, "wrong number of sample function input mappings"); for (i = 0; i < ranges; i++) { - func->u.sa.encode[i][0] = pdf_to_real(pdf_array_get(obj, i * 2 + 0)); - func->u.sa.encode[i][1] = pdf_to_real(pdf_array_get(obj, i * 2 + 1)); + func->u.sa.encode[i][0] = pdf_to_real(ctx, pdf_array_get(ctx, obj, i * 2 + 0)); + func->u.sa.encode[i][1] = pdf_to_real(ctx, pdf_array_get(ctx, obj, i * 2 + 1)); } } @@ -965,17 +962,17 @@ load_sample_func(pdf_function *func, pdf_document *doc, pdf_obj *dict, int num, func->u.sa.decode[i][1] = func->range[i][1]; } - obj = pdf_dict_gets(dict, "Decode"); - if (pdf_is_array(obj)) + obj = pdf_dict_gets(ctx, dict, "Decode"); + if (pdf_is_array(ctx, obj)) { - int ranges = fz_mini(func->base.n, pdf_array_len(obj) / 2); + int ranges = fz_mini(func->base.n, pdf_array_len(ctx, obj) / 2); if (ranges != func->base.n) fz_warn(ctx, "wrong number of sample function output mappings"); for (i = 0; i < ranges; i++) { - func->u.sa.decode[i][0] = pdf_to_real(pdf_array_get(obj, i * 2 + 0)); - func->u.sa.decode[i][1] = pdf_to_real(pdf_array_get(obj, i * 2 + 1)); + func->u.sa.decode[i][0] = pdf_to_real(ctx, pdf_array_get(ctx, obj, i * 2 + 0)); + func->u.sa.decode[i][1] = pdf_to_real(ctx, pdf_array_get(ctx, obj, i * 2 + 1)); } } @@ -988,7 +985,7 @@ load_sample_func(pdf_function *func, pdf_document *doc, pdf_obj *dict, int num, func->u.sa.samples = fz_malloc_array(ctx, samplecount, sizeof(float)); func->base.size += samplecount * sizeof(float); - stream = pdf_open_stream(doc, num, gen); + stream = pdf_open_stream(ctx, doc, num, gen); fz_try(ctx) { @@ -998,32 +995,32 @@ load_sample_func(pdf_function *func, pdf_document *doc, pdf_obj *dict, int num, unsigned int x; float s; - if (fz_is_eof_bits(stream)) + if (fz_is_eof_bits(ctx, stream)) fz_throw(ctx, FZ_ERROR_GENERIC, "truncated sample function stream"); switch (bps) { - case 1: s = fz_read_bits(stream, 1); break; - case 2: s = fz_read_bits(stream, 2) / 3.0f; break; - case 4: s = fz_read_bits(stream, 4) / 15.0f; break; - case 8: s = fz_read_byte(stream) / 255.0f; break; - case 12: s = fz_read_bits(stream, 12) / 4095.0f; break; + case 1: s = fz_read_bits(ctx, stream, 1); break; + case 2: s = fz_read_bits(ctx, stream, 2) / 3.0f; break; + case 4: s = fz_read_bits(ctx, stream, 4) / 15.0f; break; + case 8: s = fz_read_byte(ctx, stream) / 255.0f; break; + case 12: s = fz_read_bits(ctx, stream, 12) / 4095.0f; break; case 16: - x = fz_read_byte(stream) << 8; - x |= fz_read_byte(stream); + x = fz_read_byte(ctx, stream) << 8; + x |= fz_read_byte(ctx, stream); s = x / 65535.0f; break; case 24: - x = fz_read_byte(stream) << 16; - x |= fz_read_byte(stream) << 8; - x |= fz_read_byte(stream); + x = fz_read_byte(ctx, stream) << 16; + x |= fz_read_byte(ctx, stream) << 8; + x |= fz_read_byte(ctx, stream); s = x / 16777215.0f; break; case 32: - x = fz_read_byte(stream) << 24; - x |= fz_read_byte(stream) << 16; - x |= fz_read_byte(stream) << 8; - x |= fz_read_byte(stream); + x = fz_read_byte(ctx, stream) << 24; + x |= fz_read_byte(ctx, stream) << 16; + x |= fz_read_byte(ctx, stream) << 8; + x |= fz_read_byte(ctx, stream); s = x / 4294967295.0f; break; default: @@ -1035,7 +1032,7 @@ load_sample_func(pdf_function *func, pdf_document *doc, pdf_obj *dict, int num, } fz_always(ctx) { - fz_drop_stream(stream); + fz_drop_stream(ctx, stream); } fz_catch(ctx) { @@ -1135,7 +1132,7 @@ eval_sample_func(fz_context *ctx, pdf_function *func, const float *in, float *ou */ static void -load_exponential_func(fz_context *ctx, pdf_function *func, pdf_obj *dict) +load_exponential_func(fz_context *ctx, pdf_document *doc, pdf_function *func, pdf_obj *dict) { pdf_obj *obj; int i; @@ -1144,8 +1141,8 @@ load_exponential_func(fz_context *ctx, pdf_function *func, pdf_obj *dict) fz_warn(ctx, "exponential functions have at most one input"); func->base.m = 1; - obj = pdf_dict_gets(dict, "N"); - func->u.e.n = pdf_to_real(obj); + obj = pdf_dict_gets(ctx, dict, "N"); + func->u.e.n = pdf_to_real(ctx, obj); /* See exponential functions (PDF 1.7 section 3.9.2) */ if (func->u.e.n != (int) func->u.e.n) @@ -1170,26 +1167,26 @@ load_exponential_func(fz_context *ctx, pdf_function *func, pdf_obj *dict) func->u.e.c1[i] = 1; } - obj = pdf_dict_gets(dict, "C0"); - if (pdf_is_array(obj)) + obj = pdf_dict_gets(ctx, dict, "C0"); + if (pdf_is_array(ctx, obj)) { - int ranges = fz_mini(func->base.n, pdf_array_len(obj)); + int ranges = fz_mini(func->base.n, pdf_array_len(ctx, obj)); if (ranges != func->base.n) fz_warn(ctx, "wrong number of C0 constants for exponential function"); for (i = 0; i < ranges; i++) - func->u.e.c0[i] = pdf_to_real(pdf_array_get(obj, i)); + func->u.e.c0[i] = pdf_to_real(ctx, pdf_array_get(ctx, obj, i)); } - obj = pdf_dict_gets(dict, "C1"); - if (pdf_is_array(obj)) + obj = pdf_dict_gets(ctx, dict, "C1"); + if (pdf_is_array(ctx, obj)) { - int ranges = fz_mini(func->base.n, pdf_array_len(obj)); + int ranges = fz_mini(func->base.n, pdf_array_len(ctx, obj)); if (ranges != func->base.n) fz_warn(ctx, "wrong number of C1 constants for exponential function"); for (i = 0; i < ranges; i++) - func->u.e.c1[i] = pdf_to_real(pdf_array_get(obj, i)); + func->u.e.c1[i] = pdf_to_real(ctx, pdf_array_get(ctx, obj, i)); } } @@ -1220,9 +1217,8 @@ eval_exponential_func(fz_context *ctx, pdf_function *func, float in, float *out) */ static void -load_stitching_func(pdf_function *func, pdf_document *doc, pdf_obj *dict) +load_stitching_func(fz_context *ctx, pdf_document *doc, pdf_function *func, pdf_obj *dict) { - fz_context *ctx = doc->ctx; fz_function **funcs; pdf_obj *obj; pdf_obj *sub; @@ -1236,14 +1232,14 @@ load_stitching_func(pdf_function *func, pdf_document *doc, pdf_obj *dict) fz_warn(ctx, "stitching functions have at most one input"); func->base.m = 1; - obj = pdf_dict_gets(dict, "Functions"); - if (!pdf_is_array(obj)) + obj = pdf_dict_gets(ctx, dict, "Functions"); + if (!pdf_is_array(ctx, obj)) fz_throw(ctx, FZ_ERROR_GENERIC, "stitching function has no input functions"); fz_try(ctx) { - pdf_mark_obj(obj); - k = pdf_array_len(obj); + pdf_mark_obj(ctx, obj); + k = pdf_array_len(ctx, obj); func->u.st.funcs = fz_malloc_array(ctx, k, sizeof(fz_function*)); func->u.st.bounds = fz_malloc_array(ctx, k - 1, sizeof(float)); @@ -1252,10 +1248,10 @@ load_stitching_func(pdf_function *func, pdf_document *doc, pdf_obj *dict) for (i = 0; i < k; i++) { - sub = pdf_array_get(obj, i); - funcs[i] = pdf_load_function(doc, sub, 1, func->base.n); + sub = pdf_array_get(ctx, obj, i); + funcs[i] = pdf_load_function(ctx, doc, sub, 1, func->base.n); - func->base.size += fz_function_size(funcs[i]); + func->base.size += fz_function_size(ctx, funcs[i]); func->u.st.k ++; if (funcs[i]->m != func->base.m) @@ -1266,26 +1262,26 @@ load_stitching_func(pdf_function *func, pdf_document *doc, pdf_obj *dict) } fz_always(ctx) { - pdf_unmark_obj(obj); + pdf_unmark_obj(ctx, obj); } fz_catch(ctx) { fz_rethrow(ctx); } - obj = pdf_dict_gets(dict, "Bounds"); - if (!pdf_is_array(obj)) + obj = pdf_dict_gets(ctx, dict, "Bounds"); + if (!pdf_is_array(ctx, obj)) fz_throw(ctx, FZ_ERROR_GENERIC, "stitching function has no bounds"); { - if (pdf_array_len(obj) < k - 1) + if (pdf_array_len(ctx, obj) < k - 1) fz_throw(ctx, FZ_ERROR_GENERIC, "too few subfunction boundaries"); - if (pdf_array_len(obj) > k) + if (pdf_array_len(ctx, obj) > k) fz_warn(ctx, "too many subfunction boundaries"); for (i = 0; i < k - 1; i++) { - num = pdf_array_get(obj, i); - func->u.st.bounds[i] = pdf_to_real(num); + num = pdf_array_get(ctx, obj, i); + func->u.st.bounds[i] = pdf_to_real(ctx, num); if (i && func->u.st.bounds[i - 1] > func->u.st.bounds[i]) fz_throw(ctx, FZ_ERROR_GENERIC, "subfunction %d boundary out of range", i); } @@ -1301,17 +1297,17 @@ load_stitching_func(pdf_function *func, pdf_document *doc, pdf_obj *dict) func->u.st.encode[i * 2 + 1] = 0; } - obj = pdf_dict_gets(dict, "Encode"); - if (pdf_is_array(obj)) + obj = pdf_dict_gets(ctx, dict, "Encode"); + if (pdf_is_array(ctx, obj)) { - int ranges = fz_mini(k, pdf_array_len(obj) / 2); + int ranges = fz_mini(k, pdf_array_len(ctx, obj) / 2); if (ranges != k) fz_warn(ctx, "wrong number of stitching function input mappings"); for (i = 0; i < ranges; i++) { - func->u.st.encode[i * 2 + 0] = pdf_to_real(pdf_array_get(obj, i * 2 + 0)); - func->u.st.encode[i * 2 + 1] = pdf_to_real(pdf_array_get(obj, i * 2 + 1)); + func->u.st.encode[i * 2 + 0] = pdf_to_real(ctx, pdf_array_get(ctx, obj, i * 2 + 0)); + func->u.st.encode[i * 2 + 1] = pdf_to_real(ctx, pdf_array_get(ctx, obj, i * 2 + 1)); } } } @@ -1620,21 +1616,20 @@ pdf_debug_function_imp(fz_function *func_, int level) } void -pdf_debug_function(fz_function *func) +pdf_debug_function(fz_context *ctx, fz_function *func) { pdf_debug_function_imp(func, 0); } #endif fz_function * -pdf_load_function(pdf_document *doc, pdf_obj *dict, int in, int out) +pdf_load_function(fz_context *ctx, pdf_document *doc, pdf_obj *dict, int in, int out) { - fz_context *ctx = doc->ctx; pdf_function *func; pdf_obj *obj; int i; - if (pdf_obj_marked(dict)) + if (pdf_obj_marked(ctx, dict)) fz_throw(ctx, FZ_ERROR_GENERIC, "Recursion in function definition"); if ((func = pdf_find_item(ctx, pdf_drop_function_imp, dict)) != NULL) @@ -1650,28 +1645,28 @@ pdf_load_function(pdf_document *doc, pdf_obj *dict, int in, int out) func->base.debug = pdf_debug_function; #endif - obj = pdf_dict_gets(dict, "FunctionType"); - func->type = pdf_to_int(obj); + obj = pdf_dict_gets(ctx, dict, "FunctionType"); + func->type = pdf_to_int(ctx, obj); /* required for all */ - obj = pdf_dict_gets(dict, "Domain"); - func->base.m = fz_clampi(pdf_array_len(obj) / 2, 1, FZ_FN_MAXM); + obj = pdf_dict_gets(ctx, dict, "Domain"); + func->base.m = fz_clampi(pdf_array_len(ctx, obj) / 2, 1, FZ_FN_MAXM); for (i = 0; i < func->base.m; i++) { - func->domain[i][0] = pdf_to_real(pdf_array_get(obj, i * 2 + 0)); - func->domain[i][1] = pdf_to_real(pdf_array_get(obj, i * 2 + 1)); + func->domain[i][0] = pdf_to_real(ctx, pdf_array_get(ctx, obj, i * 2 + 0)); + func->domain[i][1] = pdf_to_real(ctx, pdf_array_get(ctx, obj, i * 2 + 1)); } /* required for type0 and type4, optional otherwise */ - obj = pdf_dict_gets(dict, "Range"); - if (pdf_is_array(obj)) + obj = pdf_dict_gets(ctx, dict, "Range"); + if (pdf_is_array(ctx, obj)) { func->has_range = 1; - func->base.n = fz_clampi(pdf_array_len(obj) / 2, 1, FZ_FN_MAXN); + func->base.n = fz_clampi(pdf_array_len(ctx, obj) / 2, 1, FZ_FN_MAXN); for (i = 0; i < func->base.n; i++) { - func->range[i][0] = pdf_to_real(pdf_array_get(obj, i * 2 + 0)); - func->range[i][1] = pdf_to_real(pdf_array_get(obj, i * 2 + 1)); + func->range[i][0] = pdf_to_real(ctx, pdf_array_get(ctx, obj, i * 2 + 0)); + func->range[i][1] = pdf_to_real(ctx, pdf_array_get(ctx, obj, i * 2 + 1)); } } else @@ -1690,23 +1685,23 @@ pdf_load_function(pdf_document *doc, pdf_obj *dict, int in, int out) switch (func->type) { case SAMPLE: - load_sample_func(func, doc, dict, pdf_to_num(dict), pdf_to_gen(dict)); + load_sample_func(ctx, doc, func, dict, pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict)); break; case EXPONENTIAL: - load_exponential_func(ctx, func, dict); + load_exponential_func(ctx, doc, func, dict); break; case STITCHING: - load_stitching_func(func, doc, dict); + load_stitching_func(ctx, doc, func, dict); break; case POSTSCRIPT: - load_postscript_func(func, doc, dict, pdf_to_num(dict), pdf_to_gen(dict)); + load_postscript_func(ctx, doc, func, dict, pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict)); break; default: - fz_throw(ctx, FZ_ERROR_GENERIC, "unknown function type (%d %d R)", pdf_to_num(dict), pdf_to_gen(dict)); + fz_throw(ctx, FZ_ERROR_GENERIC, "unknown function type (%d %d R)", pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict)); } pdf_store_item(ctx, dict, func, func->base.size); @@ -1721,7 +1716,7 @@ pdf_load_function(pdf_document *doc, pdf_obj *dict, int in, int out) type == STITCHING ? "stitching" : type == POSTSCRIPT ? "calculator" : "unknown", - pdf_to_num(dict), pdf_to_gen(dict)); + pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict)); } return (fz_function *)func; diff --git a/source/pdf/pdf-image.c b/source/pdf/pdf-image.c index dd96f4fb..30f96dc8 100644 --- a/source/pdf/pdf-image.c +++ b/source/pdf/pdf-image.c @@ -1,9 +1,9 @@ #include "mupdf/pdf.h" -static fz_image *pdf_load_jpx(pdf_document *doc, pdf_obj *dict, int forcemask); +static fz_image *pdf_load_jpx(fz_context *ctx, pdf_document *doc, pdf_obj *dict, int forcemask); static fz_image * -pdf_load_image_imp(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *cstm, int forcemask) +pdf_load_image_imp(fz_context *ctx, pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *cstm, int forcemask) { fz_stream *stm = NULL; fz_image *image = NULL; @@ -21,7 +21,6 @@ pdf_load_image_imp(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *cs int stride; int i; - fz_context *ctx = doc->ctx; fz_compressed_buffer *buffer; fz_var(stm); @@ -34,7 +33,7 @@ pdf_load_image_imp(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *cs /* special case for JPEG2000 images */ if (pdf_is_jpx_image(ctx, dict)) { - image = pdf_load_jpx(doc, dict, forcemask); + image = pdf_load_jpx(ctx, doc, dict, forcemask); if (forcemask) { @@ -56,13 +55,13 @@ pdf_load_image_imp(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *cs break; /* Out of fz_try */ } - w = pdf_to_int(pdf_dict_getsa(dict, "Width", "W")); - h = pdf_to_int(pdf_dict_getsa(dict, "Height", "H")); - bpc = pdf_to_int(pdf_dict_getsa(dict, "BitsPerComponent", "BPC")); + w = pdf_to_int(ctx, pdf_dict_getsa(ctx, dict, "Width", "W")); + h = pdf_to_int(ctx, pdf_dict_getsa(ctx, dict, "Height", "H")); + bpc = pdf_to_int(ctx, pdf_dict_getsa(ctx, dict, "BitsPerComponent", "BPC")); if (bpc == 0) bpc = 8; - imagemask = pdf_to_bool(pdf_dict_getsa(dict, "ImageMask", "IM")); - interpolate = pdf_to_bool(pdf_dict_getsa(dict, "Interpolate", "I")); + imagemask = pdf_to_bool(ctx, pdf_dict_getsa(ctx, dict, "ImageMask", "IM")); + interpolate = pdf_to_bool(ctx, pdf_dict_getsa(ctx, dict, "Interpolate", "I")); indexed = 0; usecolorkey = 0; @@ -83,19 +82,19 @@ pdf_load_image_imp(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *cs if (h > (1 << 16)) fz_throw(ctx, FZ_ERROR_GENERIC, "image is too high"); - obj = pdf_dict_getsa(dict, "ColorSpace", "CS"); + obj = pdf_dict_getsa(ctx, dict, "ColorSpace", "CS"); if (obj && !imagemask && !forcemask) { /* colorspace resource lookup is only done for inline images */ - if (pdf_is_name(obj)) + if (pdf_is_name(ctx, obj)) { - res = pdf_dict_get(pdf_dict_gets(rdb, "ColorSpace"), obj); + res = pdf_dict_get(ctx, pdf_dict_gets(ctx, rdb, "ColorSpace"), obj); if (res) obj = res; } - colorspace = pdf_load_colorspace(doc, obj); - indexed = fz_colorspace_is_indexed(colorspace); + colorspace = pdf_load_colorspace(ctx, doc, obj); + indexed = fz_colorspace_is_indexed(ctx, colorspace); n = colorspace->n; } @@ -104,11 +103,11 @@ pdf_load_image_imp(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *cs n = 1; } - obj = pdf_dict_getsa(dict, "Decode", "D"); + obj = pdf_dict_getsa(ctx, dict, "Decode", "D"); if (obj) { for (i = 0; i < n * 2; i++) - decode[i] = pdf_to_real(pdf_array_get(obj, i)); + decode[i] = pdf_to_real(ctx, pdf_array_get(ctx, obj, i)); } else { @@ -117,8 +116,8 @@ pdf_load_image_imp(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *cs decode[i] = i & 1 ? maxval : 0; } - obj = pdf_dict_getsa(dict, "SMask", "Mask"); - if (pdf_is_dict(obj)) + obj = pdf_dict_getsa(ctx, dict, "SMask", "Mask"); + if (pdf_is_dict(ctx, obj)) { /* Not allowed for inline images or soft masks */ if (cstm) @@ -127,27 +126,27 @@ pdf_load_image_imp(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *cs fz_warn(ctx, "Ignoring recursive image soft mask"); else { - mask = pdf_load_image_imp(doc, rdb, obj, NULL, 1); - obj = pdf_dict_gets(obj, "Matte"); - if (pdf_is_array(obj)) + mask = pdf_load_image_imp(ctx, doc, rdb, obj, NULL, 1); + obj = pdf_dict_gets(ctx, obj, "Matte"); + if (pdf_is_array(ctx, obj)) { usecolorkey = 1; for (i = 0; i < n; i++) - colorkey[i] = pdf_to_real(pdf_array_get(obj, i)) * 255; + colorkey[i] = pdf_to_real(ctx, pdf_array_get(ctx, obj, i)) * 255; } } } - else if (pdf_is_array(obj)) + else if (pdf_is_array(ctx, obj)) { usecolorkey = 1; for (i = 0; i < n * 2; i++) { - if (!pdf_is_int(pdf_array_get(obj, i))) + if (!pdf_is_int(ctx, pdf_array_get(ctx, obj, i))) { fz_warn(ctx, "invalid value in color key mask"); usecolorkey = 0; } - colorkey[i] = pdf_to_int(pdf_array_get(obj, i)); + colorkey[i] = pdf_to_int(ctx, pdf_array_get(ctx, obj, i)); } } @@ -156,9 +155,9 @@ pdf_load_image_imp(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *cs { /* Just load the compressed image data now and we can * decode it on demand. */ - int num = pdf_to_num(dict); - int gen = pdf_to_gen(dict); - buffer = pdf_load_compressed_stream(doc, num, gen); + int num = pdf_to_num(ctx, dict); + int gen = pdf_to_gen(ctx, dict); + buffer = pdf_load_compressed_stream(ctx, doc, num, gen); image = fz_new_image(ctx, w, h, bpc, colorspace, 96, 96, interpolate, imagemask, decode, usecolorkey ? colorkey : NULL, buffer, mask); } else @@ -166,7 +165,7 @@ pdf_load_image_imp(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *cs /* Inline stream */ stride = (w * n * bpc + 7) / 8; image = fz_new_image(ctx, w, h, bpc, colorspace, 96, 96, interpolate, imagemask, decode, usecolorkey ? colorkey : NULL, NULL, mask); - pdf_load_compressed_inline_image(doc, dict, stride * h, cstm, indexed, image); + pdf_load_compressed_inline_image(ctx, doc, dict, stride * h, cstm, indexed, image); } } @@ -181,9 +180,9 @@ pdf_load_image_imp(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *cs } fz_image * -pdf_load_inline_image(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *file) +pdf_load_inline_image(fz_context *ctx, pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *file) { - return pdf_load_image_imp(doc, rdb, dict, file, 0); + return pdf_load_image_imp(ctx, doc, rdb, dict, file, 0); } int @@ -192,79 +191,81 @@ pdf_is_jpx_image(fz_context *ctx, pdf_obj *dict) pdf_obj *filter; int i, n; - filter = pdf_dict_gets(dict, "Filter"); - if (!strcmp(pdf_to_name(filter), "JPXDecode")) + filter = pdf_dict_gets(ctx, dict, "Filter"); + if (!strcmp(pdf_to_name(ctx, filter), "JPXDecode")) return 1; - n = pdf_array_len(filter); + n = pdf_array_len(ctx, filter); for (i = 0; i < n; i++) - if (!strcmp(pdf_to_name(pdf_array_get(filter, i)), "JPXDecode")) + if (!strcmp(pdf_to_name(ctx, pdf_array_get(ctx, filter, i)), "JPXDecode")) return 1; return 0; } static fz_image * -pdf_load_jpx(pdf_document *doc, pdf_obj *dict, int forcemask) +pdf_load_jpx(fz_context *ctx, pdf_document *doc, pdf_obj *dict, int forcemask) { fz_buffer *buf = NULL; fz_colorspace *colorspace = NULL; - fz_pixmap *img = NULL; + fz_pixmap *pix = NULL; pdf_obj *obj; - fz_context *ctx = doc->ctx; int indexed = 0; fz_image *mask = NULL; + fz_image *img = NULL; - fz_var(img); + fz_var(pix); fz_var(buf); fz_var(colorspace); fz_var(mask); - buf = pdf_load_stream(doc, pdf_to_num(dict), pdf_to_gen(dict)); + buf = pdf_load_stream(ctx, doc, pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict)); /* FIXME: We can't handle decode arrays for indexed images currently */ fz_try(ctx) { - obj = pdf_dict_gets(dict, "ColorSpace"); + obj = pdf_dict_gets(ctx, dict, "ColorSpace"); if (obj) { - colorspace = pdf_load_colorspace(doc, obj); - indexed = fz_colorspace_is_indexed(colorspace); + colorspace = pdf_load_colorspace(ctx, doc, obj); + indexed = fz_colorspace_is_indexed(ctx, colorspace); } - img = fz_load_jpx(ctx, buf->data, buf->len, colorspace, indexed); + pix = fz_load_jpx(ctx, buf->data, buf->len, colorspace, indexed); - obj = pdf_dict_getsa(dict, "SMask", "Mask"); - if (pdf_is_dict(obj)) + obj = pdf_dict_getsa(ctx, dict, "SMask", "Mask"); + if (pdf_is_dict(ctx, obj)) { if (forcemask) fz_warn(ctx, "Ignoring recursive JPX soft mask"); else - mask = pdf_load_image_imp(doc, NULL, obj, NULL, 1); + mask = pdf_load_image_imp(ctx, doc, NULL, obj, NULL, 1); } - obj = pdf_dict_getsa(dict, "Decode", "D"); + obj = pdf_dict_getsa(ctx, dict, "Decode", "D"); if (obj && !indexed) { float decode[FZ_MAX_COLORS * 2]; int i; - for (i = 0; i < img->n * 2; i++) - decode[i] = pdf_to_real(pdf_array_get(obj, i)); + for (i = 0; i < pix->n * 2; i++) + decode[i] = pdf_to_real(ctx, pdf_array_get(ctx, obj, i)); - fz_decode_tile(img, decode); + fz_decode_tile(ctx, pix, decode); } + + img = fz_new_image_from_pixmap(ctx, pix, mask); } fz_always(ctx) { fz_drop_colorspace(ctx, colorspace); fz_drop_buffer(ctx, buf); + fz_drop_pixmap(ctx, pix); } fz_catch(ctx) { - fz_drop_pixmap(ctx, img); fz_rethrow(ctx); } - return fz_new_image_from_pixmap(ctx, img, mask); + return img; } static int @@ -276,9 +277,8 @@ fz_image_size(fz_context *ctx, fz_image *im) } fz_image * -pdf_load_image(pdf_document *doc, pdf_obj *dict) +pdf_load_image(fz_context *ctx, pdf_document *doc, pdf_obj *dict) { - fz_context *ctx = doc->ctx; fz_image *image; if ((image = pdf_find_item(ctx, fz_drop_image_imp, dict)) != NULL) @@ -286,7 +286,7 @@ pdf_load_image(pdf_document *doc, pdf_obj *dict) return (fz_image *)image; } - image = pdf_load_image_imp(doc, NULL, dict, NULL, 0); + image = pdf_load_image_imp(ctx, doc, NULL, dict, NULL, 0); pdf_store_item(ctx, dict, image, fz_image_size(ctx, image)); diff --git a/source/pdf/pdf-interpret-imp.h b/source/pdf/pdf-interpret-imp.h index 314e6d2b..817a7d2c 100644 --- a/source/pdf/pdf-interpret-imp.h +++ b/source/pdf/pdf-interpret-imp.h @@ -106,6 +106,7 @@ typedef struct pdf_process_s struct pdf_csi_s { + fz_context *ctx; pdf_document *doc; /* Current resource dict and file. These are in here to reduce param @@ -142,14 +143,14 @@ void pdf_process_contents_object(pdf_csi *csi, pdf_obj *rdb, pdf_obj *contents); void pdf_process_stream(pdf_csi *csi, pdf_lexbuf *buf); /* Functions to set up pdf_process structures */ -pdf_process *pdf_process_run(pdf_process *process, fz_device *dev, const fz_matrix *ctm, const char *event, pdf_gstate *gstate, int nested); -pdf_process *pdf_process_buffer(pdf_process *process, fz_context *ctx, fz_buffer *buffer); -pdf_process *pdf_process_filter(pdf_process *process, fz_context *ctx, pdf_process *underlying, pdf_obj *resources); +pdf_process *pdf_init_process_run(fz_context *ctx, pdf_process *process, fz_device *dev, const fz_matrix *ctm, const char *event, pdf_gstate *gstate, int nested); +pdf_process *pdf_init_process_buffer(fz_context *ctx, pdf_process *process, fz_buffer *buffer); +pdf_process *pdf_init_process_filter(fz_context *ctx, pdf_process *process, pdf_process *underlying, pdf_obj *resources); /* Functions to actually use the pdf_process structures to process * annotations, glyphs and general stream objects */ -void pdf_process_annot(pdf_document *doc, pdf_page *page, pdf_annot *annot, const pdf_process *process, fz_cookie *cookie); -void pdf_process_glyph(pdf_document *doc, pdf_obj *resources, fz_buffer *contents, pdf_process *process); -void pdf_process_stream_object(pdf_document *doc, pdf_obj *obj, const pdf_process *process, pdf_obj *res, fz_cookie *cookie); +void pdf_process_annot(fz_context *ctx, pdf_document *doc, pdf_page *page, pdf_annot *annot, const pdf_process *process, fz_cookie *cookie); +void pdf_process_glyph(fz_context *ctx, pdf_document *doc, pdf_obj *resources, fz_buffer *contents, pdf_process *process); +void pdf_process_stream_object(fz_context *ctx, pdf_document *doc, pdf_obj *obj, const pdf_process *process, pdf_obj *res, fz_cookie *cookie); #endif diff --git a/source/pdf/pdf-interpret.c b/source/pdf/pdf-interpret.c index b67de46e..a3df4c77 100644 --- a/source/pdf/pdf-interpret.c +++ b/source/pdf/pdf-interpret.c @@ -1,17 +1,18 @@ #include "pdf-interpret-imp.h" static pdf_csi * -pdf_new_csi(pdf_document *doc, fz_cookie *cookie, const pdf_process *process) +pdf_new_csi(fz_context *ctx, pdf_document *doc, fz_cookie *cookie, const pdf_process *process) { pdf_csi *csi = NULL; - fz_context *ctx = doc->ctx; fz_var(csi); fz_try(ctx) { csi = fz_malloc_struct(ctx, pdf_csi); - csi->doc = doc; + csi->ctx = ctx; /* FIXME */ + csi->doc = doc; /* FIXME */ + csi->in_text = 0; csi->top = 0; @@ -38,12 +39,14 @@ pdf_new_csi(pdf_document *doc, fz_cookie *cookie, const pdf_process *process) static void pdf_clear_stack(pdf_csi *csi) { + fz_context *ctx = csi->ctx; + int i; - fz_drop_image(csi->doc->ctx, csi->img); + fz_drop_image(ctx, csi->img); csi->img = NULL; - pdf_drop_obj(csi->obj); + pdf_drop_obj(ctx, csi->obj); csi->obj = NULL; csi->name[0] = 0; @@ -57,7 +60,7 @@ pdf_clear_stack(pdf_csi *csi) static void pdf_drop_csi(pdf_csi *csi) { - fz_context *ctx = csi->doc->ctx; + fz_context *ctx = csi->ctx; pdf_process_op(csi, PDF_OP_END, &csi->process); fz_free(ctx, csi); @@ -70,27 +73,29 @@ pdf_drop_csi(pdf_csi *csi) static void parse_inline_image(pdf_csi *csi) { - fz_context *ctx = csi->doc->ctx; + fz_context *ctx = csi->ctx; + pdf_document *doc = csi->doc; + pdf_obj *rdb = csi->rdb; fz_stream *file = csi->file; int ch, found; fz_drop_image(ctx, csi->img); csi->img = NULL; - pdf_drop_obj(csi->obj); + pdf_drop_obj(ctx, csi->obj); csi->obj = NULL; - csi->obj = pdf_parse_dict(csi->doc, file, &csi->doc->lexbuf.base); + csi->obj = pdf_parse_dict(ctx, doc, file, &doc->lexbuf.base); /* read whitespace after ID keyword */ - ch = fz_read_byte(file); + ch = fz_read_byte(ctx, file); if (ch == '\r') - if (fz_peek_byte(file) == '\n') - fz_read_byte(file); + if (fz_peek_byte(ctx, file) == '\n') + fz_read_byte(ctx, file); fz_try(ctx) { - csi->img = pdf_load_inline_image(csi->doc, rdb, csi->obj, file); + csi->img = pdf_load_inline_image(ctx, doc, rdb, csi->obj, file); } fz_catch(ctx) { @@ -99,17 +104,17 @@ parse_inline_image(pdf_csi *csi) /* find EI */ found = 0; - ch = fz_read_byte(file); + ch = fz_read_byte(ctx, file); do { while (ch != 'E' && ch != EOF) - ch = fz_read_byte(file); + ch = fz_read_byte(ctx, file); if (ch == 'E') { - ch = fz_read_byte(file); + ch = fz_read_byte(ctx, file); if (ch == 'I') { - ch = fz_peek_byte(file); + ch = fz_peek_byte(ctx, file); if (ch == ' ' || ch <= 32 || ch == EOF || ch == '<' || ch == '/') { found = 1; @@ -125,7 +130,8 @@ parse_inline_image(pdf_csi *csi) static int pdf_run_keyword(pdf_csi *csi, char *buf) { - fz_context *ctx = csi->doc->ctx; + fz_context *ctx = csi->ctx; + int key; PDF_OP op; @@ -278,7 +284,9 @@ pdf_run_keyword(pdf_csi *csi, char *buf) void pdf_process_stream(pdf_csi *csi, pdf_lexbuf *buf) { - fz_context *ctx = csi->doc->ctx; + fz_context *ctx = csi->ctx; + pdf_document *doc = csi->doc; + fz_stream *file = csi->file; pdf_token tok = PDF_TOK_ERROR; int in_text_array = 0; @@ -313,7 +321,7 @@ pdf_process_stream(pdf_csi *csi, pdf_lexbuf *buf) csi->cookie->progress++; } - tok = pdf_lex(file, buf); + tok = pdf_lex(ctx, file, buf); if (in_text_array) { @@ -323,27 +331,27 @@ pdf_process_stream(pdf_csi *csi, pdf_lexbuf *buf) in_text_array = 0; break; case PDF_TOK_REAL: - pdf_array_push_drop(csi->obj, pdf_new_real(csi->doc, buf->f)); + pdf_array_push_drop(ctx, csi->obj, pdf_new_real(ctx, doc, buf->f)); break; case PDF_TOK_INT: - pdf_array_push_drop(csi->obj, pdf_new_int(csi->doc, buf->i)); + pdf_array_push_drop(ctx, csi->obj, pdf_new_int(ctx, doc, buf->i)); break; case PDF_TOK_STRING: - pdf_array_push_drop(csi->obj, pdf_new_string(csi->doc, buf->scratch, buf->len)); + pdf_array_push_drop(ctx, csi->obj, pdf_new_string(ctx, doc, buf->scratch, buf->len)); break; case PDF_TOK_EOF: break; case PDF_TOK_KEYWORD: if (!strcmp(buf->scratch, "Tw") || !strcmp(buf->scratch, "Tc")) { - int l = pdf_array_len(csi->obj); + int l = pdf_array_len(ctx, csi->obj); if (l > 0) { - pdf_obj *o = pdf_array_get(csi->obj, l-1); - if (pdf_is_number(o)) + pdf_obj *o = pdf_array_get(ctx, csi->obj, l-1); + if (pdf_is_number(ctx, o)) { - csi->stack[0] = pdf_to_real(o); - pdf_array_delete(csi->obj, l-1); + csi->stack[0] = pdf_to_real(ctx, o); + pdf_array_delete(ctx, csi->obj, l-1); if (pdf_run_keyword(csi, buf->scratch) == 0) break; } @@ -364,35 +372,35 @@ pdf_process_stream(pdf_csi *csi, pdf_lexbuf *buf) case PDF_TOK_OPEN_ARRAY: if (csi->obj) { - pdf_drop_obj(csi->obj); + pdf_drop_obj(ctx, csi->obj); csi->obj = NULL; } if (csi->in_text) { in_text_array = 1; - csi->obj = pdf_new_array(csi->doc, 4); + csi->obj = pdf_new_array(ctx, doc, 4); } else { - csi->obj = pdf_parse_array(csi->doc, file, buf); + csi->obj = pdf_parse_array(ctx, doc, file, buf); } break; case PDF_TOK_OPEN_DICT: if (csi->obj) { - pdf_drop_obj(csi->obj); + pdf_drop_obj(ctx, csi->obj); csi->obj = NULL; } - csi->obj = pdf_parse_dict(csi->doc, file, buf); + csi->obj = pdf_parse_dict(ctx, doc, file, buf); break; case PDF_TOK_NAME: if (csi->name[0]) { - pdf_drop_obj(csi->obj); + pdf_drop_obj(ctx, csi->obj); csi->obj = NULL; - csi->obj = pdf_new_name(csi->doc, buf->scratch); + csi->obj = pdf_new_name(ctx, doc, buf->scratch); } else fz_strlcpy(csi->name, buf->scratch, sizeof(csi->name)); @@ -426,10 +434,10 @@ pdf_process_stream(pdf_csi *csi, pdf_lexbuf *buf) { if (csi->obj) { - pdf_drop_obj(csi->obj); + pdf_drop_obj(ctx, csi->obj); csi->obj = NULL; } - csi->obj = pdf_new_string(csi->doc, buf->scratch, buf->len); + csi->obj = pdf_new_string(ctx, doc, buf->scratch, buf->len); } break; @@ -494,7 +502,8 @@ pdf_process_stream(pdf_csi *csi, pdf_lexbuf *buf) static void pdf_process_contents_stream(pdf_csi *csi, pdf_obj *rdb, fz_stream *file) { - fz_context *ctx = csi->doc->ctx; + fz_context *ctx = csi->ctx; + pdf_lexbuf *buf; int save_in_text; pdf_obj *save_obj; @@ -521,11 +530,11 @@ pdf_process_contents_stream(pdf_csi *csi, pdf_obj *rdb, fz_stream *file) fz_always(ctx) { csi->in_text = save_in_text; - pdf_drop_obj(csi->obj); + pdf_drop_obj(ctx, csi->obj); csi->obj = save_obj; csi->rdb = save_rdb; csi->file = save_file; - pdf_lexbuf_fin(buf); + pdf_lexbuf_fin(ctx, buf); fz_free(ctx, buf); } fz_catch(ctx) @@ -537,16 +546,15 @@ pdf_process_contents_stream(pdf_csi *csi, pdf_obj *rdb, fz_stream *file) } void -pdf_process_annot(pdf_document *doc, pdf_page *page, pdf_annot *annot, const pdf_process *process, fz_cookie *cookie) +pdf_process_annot(fz_context *ctx, pdf_document *doc, pdf_page *page, pdf_annot *annot, const pdf_process *process, fz_cookie *cookie) { - fz_context *ctx = doc->ctx; pdf_csi *csi; int flags; - csi = pdf_new_csi(doc, cookie, process); + csi = pdf_new_csi(ctx, doc, cookie, process); fz_try(ctx) { - flags = pdf_to_int(pdf_dict_gets(annot->obj, "F")); + flags = pdf_to_int(ctx, pdf_dict_gets(ctx, annot->obj, "F")); /* Check not invisible (bit 0) and hidden (bit 1) */ /* TODO: NoZoom and NoRotate */ @@ -568,20 +576,22 @@ pdf_process_annot(pdf_document *doc, pdf_page *page, pdf_annot *annot, const pdf void pdf_process_contents_object(pdf_csi *csi, pdf_obj *rdb, pdf_obj *contents) { - fz_context *ctx = csi->doc->ctx; + fz_context *ctx = csi->ctx; + pdf_document *doc = csi->doc; + fz_stream *file = NULL; if (contents == NULL) return; - file = pdf_open_contents_stream(csi->doc, contents); + file = pdf_open_contents_stream(ctx, doc, contents); fz_try(ctx) { pdf_process_contents_stream(csi, rdb, file); } fz_always(ctx) { - fz_drop_stream(file); + fz_drop_stream(ctx, file); } fz_catch(ctx) { @@ -592,7 +602,8 @@ pdf_process_contents_object(pdf_csi *csi, pdf_obj *rdb, pdf_obj *contents) static void pdf_process_contents_buffer(pdf_csi *csi, pdf_obj *rdb, fz_buffer *contents) { - fz_context *ctx = csi->doc->ctx; + fz_context *ctx = csi->ctx; + fz_stream *file = NULL; if (contents == NULL) @@ -605,7 +616,7 @@ pdf_process_contents_buffer(pdf_csi *csi, pdf_obj *rdb, fz_buffer *contents) } fz_always(ctx) { - fz_drop_stream(file); + fz_drop_stream(ctx, file); } fz_catch(ctx) { @@ -614,12 +625,11 @@ pdf_process_contents_buffer(pdf_csi *csi, pdf_obj *rdb, fz_buffer *contents) } void -pdf_process_stream_object(pdf_document *doc, pdf_obj *obj, const pdf_process *process, pdf_obj *res, fz_cookie *cookie) +pdf_process_stream_object(fz_context *ctx, pdf_document *doc, pdf_obj *obj, const pdf_process *process, pdf_obj *res, fz_cookie *cookie) { - fz_context *ctx = doc->ctx; pdf_csi *csi; - csi = pdf_new_csi(doc, cookie, process); + csi = pdf_new_csi(ctx, doc, cookie, process); fz_try(ctx) { csi->process.processor->process_contents(csi, csi->process.state, res, obj); @@ -636,12 +646,11 @@ pdf_process_stream_object(pdf_document *doc, pdf_obj *obj, const pdf_process *pr } void -pdf_process_glyph(pdf_document *doc, pdf_obj *resources, fz_buffer *contents, pdf_process *process) +pdf_process_glyph(fz_context *ctx, pdf_document *doc, pdf_obj *resources, fz_buffer *contents, pdf_process *process) { pdf_csi *csi; - fz_context *ctx = doc->ctx; - csi = pdf_new_csi(doc, NULL, process); + csi = pdf_new_csi(ctx, doc, NULL, process); fz_try(ctx) { pdf_process_contents_buffer(csi, resources, contents); diff --git a/source/pdf/pdf-lex.c b/source/pdf/pdf-lex.c index 096cb540..a8dfd916 100644 --- a/source/pdf/pdf-lex.c +++ b/source/pdf/pdf-lex.c @@ -44,27 +44,27 @@ static inline int unhex(int ch) } static void -lex_white(fz_stream *f) +lex_white(fz_context *ctx, fz_stream *f) { int c; do { - c = fz_read_byte(f); + c = fz_read_byte(ctx, f); } while ((c <= 32) && (iswhite(c))); if (c != EOF) - fz_unread_byte(f); + fz_unread_byte(ctx, f); } static void -lex_comment(fz_stream *f) +lex_comment(fz_context *ctx, fz_stream *f) { int c; do { - c = fz_read_byte(f); + c = fz_read_byte(ctx, f); } while ((c != '\012') && (c != '\015') && (c != EOF)); } static int -lex_number(fz_stream *f, pdf_lexbuf *buf, int c) +lex_number(fz_context *ctx, fz_stream *f, pdf_lexbuf *buf, int c) { int neg = 0; int i = 0; @@ -89,7 +89,7 @@ lex_number(fz_stream *f, pdf_lexbuf *buf, int c) while (1) { - c = fz_read_byte(f); + c = fz_read_byte(ctx, f); switch (c) { case '.': @@ -99,7 +99,7 @@ lex_number(fz_stream *f, pdf_lexbuf *buf, int c) /* FIXME: Need overflow check here; do we care? */ break; default: - fz_unread_byte(f); + fz_unread_byte(ctx, f); /* Fallthrough */ case EOF: if (neg) @@ -115,7 +115,7 @@ loop_after_dot: d = 1; while (1) { - c = fz_read_byte(f); + c = fz_read_byte(ctx, f); switch (c) { case RANGE_0_9: @@ -125,7 +125,7 @@ loop_after_dot: d *= 10; break; default: - fz_unread_byte(f); + fz_unread_byte(ctx, f); /* Fallthrough */ case EOF: v = (float)i + ((float)n / (float)d); @@ -140,13 +140,13 @@ underflow: /* Ignore any digits after here, because they are too small */ while (1) { - c = fz_read_byte(f); + c = fz_read_byte(ctx, f); switch (c) { case RANGE_0_9: break; default: - fz_unread_byte(f); + fz_unread_byte(ctx, f); /* Fallthrough */ case EOF: v = (float)i + ((float)n / (float)d); @@ -159,26 +159,26 @@ underflow: } static void -lex_name(fz_stream *f, pdf_lexbuf *buf) +lex_name(fz_context *ctx, fz_stream *f, pdf_lexbuf *buf) { char *s = buf->scratch; int n = buf->size; while (n > 1) { - int c = fz_read_byte(f); + int c = fz_read_byte(ctx, f); switch (c) { case IS_WHITE: case IS_DELIM: - fz_unread_byte(f); + fz_unread_byte(ctx, f); goto end; case EOF: goto end; case '#': { int d; - c = fz_read_byte(f); + c = fz_read_byte(ctx, f); switch (c) { case RANGE_0_9: @@ -191,12 +191,12 @@ lex_name(fz_stream *f, pdf_lexbuf *buf) d = (c - 'A' + 10) << 4; break; default: - fz_unread_byte(f); + fz_unread_byte(ctx, f); /* fallthrough */ case EOF: goto end; } - c = fz_read_byte(f); + c = fz_read_byte(ctx, f); switch (c) { case RANGE_0_9: @@ -209,7 +209,7 @@ lex_name(fz_stream *f, pdf_lexbuf *buf) c -= 'A' - 10; break; default: - fz_unread_byte(f); + fz_unread_byte(ctx, f); /* fallthrough */ case EOF: *s++ = d; @@ -232,7 +232,7 @@ end: } static int -lex_string(fz_stream *f, pdf_lexbuf *lb) +lex_string(fz_context *ctx, fz_stream *f, pdf_lexbuf *lb) { char *s = lb->scratch; char *e = s + lb->size; @@ -244,10 +244,10 @@ lex_string(fz_stream *f, pdf_lexbuf *lb) { if (s == e) { - s += pdf_lexbuf_grow(lb); + s += pdf_lexbuf_grow(ctx, lb); e = lb->scratch + lb->size; } - c = fz_read_byte(f); + c = fz_read_byte(ctx, f); switch (c) { case EOF: @@ -263,7 +263,7 @@ lex_string(fz_stream *f, pdf_lexbuf *lb) *s++ = c; break; case '\\': - c = fz_read_byte(f); + c = fz_read_byte(ctx, f); switch (c) { case EOF: @@ -294,26 +294,26 @@ lex_string(fz_stream *f, pdf_lexbuf *lb) break; case RANGE_0_7: oct = c - '0'; - c = fz_read_byte(f); + c = fz_read_byte(ctx, f); if (c >= '0' && c <= '7') { oct = oct * 8 + (c - '0'); - c = fz_read_byte(f); + c = fz_read_byte(ctx, f); if (c >= '0' && c <= '7') oct = oct * 8 + (c - '0'); else if (c != EOF) - fz_unread_byte(f); + fz_unread_byte(ctx, f); } else if (c != EOF) - fz_unread_byte(f); + fz_unread_byte(ctx, f); *s++ = oct; break; case '\n': break; case '\r': - c = fz_read_byte(f); + c = fz_read_byte(ctx, f); if ((c != '\n') && (c != EOF)) - fz_unread_byte(f); + fz_unread_byte(ctx, f); break; default: *s++ = c; @@ -330,7 +330,7 @@ end: } static int -lex_hex_string(fz_stream *f, pdf_lexbuf *lb) +lex_hex_string(fz_context *ctx, fz_stream *f, pdf_lexbuf *lb) { char *s = lb->scratch; char *e = s + lb->size; @@ -341,10 +341,10 @@ lex_hex_string(fz_stream *f, pdf_lexbuf *lb) { if (s == e) { - s += pdf_lexbuf_grow(lb); + s += pdf_lexbuf_grow(ctx, lb); e = lb->scratch + lb->size; } - c = fz_read_byte(f); + c = fz_read_byte(ctx, f); switch (c) { case IS_WHITE: @@ -365,7 +365,7 @@ lex_hex_string(fz_stream *f, pdf_lexbuf *lb) case EOF: goto end; default: - fz_warn(f->ctx, "ignoring invalid character in hex string"); + fz_warn(ctx, "ignoring invalid character in hex string"); } } end: @@ -416,80 +416,79 @@ void pdf_lexbuf_init(fz_context *ctx, pdf_lexbuf *lb, int size) { lb->size = lb->base_size = size; lb->len = 0; - lb->ctx = ctx; lb->scratch = &lb->buffer[0]; } -void pdf_lexbuf_fin(pdf_lexbuf *lb) +void pdf_lexbuf_fin(fz_context *ctx, pdf_lexbuf *lb) { if (lb && lb->size != lb->base_size) - fz_free(lb->ctx, lb->scratch); + fz_free(ctx, lb->scratch); } -ptrdiff_t pdf_lexbuf_grow(pdf_lexbuf *lb) +ptrdiff_t pdf_lexbuf_grow(fz_context *ctx, pdf_lexbuf *lb) { char *old = lb->scratch; int newsize = lb->size * 2; if (lb->size == lb->base_size) { - lb->scratch = fz_malloc(lb->ctx, newsize); + lb->scratch = fz_malloc(ctx, newsize); memcpy(lb->scratch, lb->buffer, lb->size); } else { - lb->scratch = fz_resize_array(lb->ctx, lb->scratch, newsize, 1); + lb->scratch = fz_resize_array(ctx, lb->scratch, newsize, 1); } lb->size = newsize; return lb->scratch - old; } pdf_token -pdf_lex(fz_stream *f, pdf_lexbuf *buf) +pdf_lex(fz_context *ctx, fz_stream *f, pdf_lexbuf *buf) { while (1) { - int c = fz_read_byte(f); + int c = fz_read_byte(ctx, f); switch (c) { case EOF: return PDF_TOK_EOF; case IS_WHITE: - lex_white(f); + lex_white(ctx, f); break; case '%': - lex_comment(f); + lex_comment(ctx, f); break; case '/': - lex_name(f, buf); + lex_name(ctx, f, buf); return PDF_TOK_NAME; case '(': - return lex_string(f, buf); + return lex_string(ctx, f, buf); case ')': - fz_warn(f->ctx, "lexical error (unexpected ')')"); + fz_warn(ctx, "lexical error (unexpected ')')"); continue; case '<': - c = fz_read_byte(f); + c = fz_read_byte(ctx, f); if (c == '<') { return PDF_TOK_OPEN_DICT; } else { - fz_unread_byte(f); - return lex_hex_string(f, buf); + fz_unread_byte(ctx, f); + return lex_hex_string(ctx, f, buf); } case '>': - c = fz_read_byte(f); + c = fz_read_byte(ctx, f); if (c == '>') { return PDF_TOK_CLOSE_DICT; } - fz_warn(f->ctx, "lexical error (unexpected '>')"); + fz_warn(ctx, "lexical error (unexpected '>')"); if (c == EOF) { return PDF_TOK_EOF; } - fz_unread_byte(f); + fz_unread_byte(ctx, f); continue; case '[': return PDF_TOK_OPEN_ARRAY; @@ -500,40 +499,40 @@ pdf_lex(fz_stream *f, pdf_lexbuf *buf) case '}': return PDF_TOK_CLOSE_BRACE; case IS_NUMBER: - return lex_number(f, buf, c); + return lex_number(ctx, f, buf, c); default: /* isregular: !isdelim && !iswhite && c != EOF */ - fz_unread_byte(f); - lex_name(f, buf); + fz_unread_byte(ctx, f); + lex_name(ctx, f, buf); return pdf_token_from_keyword(buf->scratch); } } } pdf_token -pdf_lex_no_string(fz_stream *f, pdf_lexbuf *buf) +pdf_lex_no_string(fz_context *ctx, fz_stream *f, pdf_lexbuf *buf) { while (1) { - int c = fz_read_byte(f); + int c = fz_read_byte(ctx, f); switch (c) { case EOF: return PDF_TOK_EOF; case IS_WHITE: - lex_white(f); + lex_white(ctx, f); break; case '%': - lex_comment(f); + lex_comment(ctx, f); break; case '/': - lex_name(f, buf); + lex_name(ctx, f, buf); return PDF_TOK_NAME; case '(': continue; case ')': continue; case '<': - c = fz_read_byte(f); + c = fz_read_byte(ctx, f); if (c == '<') { return PDF_TOK_OPEN_DICT; @@ -543,7 +542,7 @@ pdf_lex_no_string(fz_stream *f, pdf_lexbuf *buf) continue; } case '>': - c = fz_read_byte(f); + c = fz_read_byte(ctx, f); if (c == '>') { return PDF_TOK_CLOSE_DICT; @@ -552,7 +551,7 @@ pdf_lex_no_string(fz_stream *f, pdf_lexbuf *buf) { return PDF_TOK_EOF; } - fz_unread_byte(f); + fz_unread_byte(ctx, f); continue; case '[': return PDF_TOK_OPEN_ARRAY; @@ -563,10 +562,10 @@ pdf_lex_no_string(fz_stream *f, pdf_lexbuf *buf) case '}': return PDF_TOK_CLOSE_BRACE; case IS_NUMBER: - return lex_number(f, buf, c); + return lex_number(ctx, f, buf, c); default: /* isregular: !isdelim && !iswhite && c != EOF */ - fz_unread_byte(f); - lex_name(f, buf); + fz_unread_byte(ctx, f); + lex_name(ctx, f, buf); return pdf_token_from_keyword(buf->scratch); } } @@ -581,7 +580,7 @@ void pdf_print_token(fz_context *ctx, fz_buffer *fzbuf, int tok, pdf_lexbuf *buf break; case PDF_TOK_STRING: if (buf->len >= buf->size) - pdf_lexbuf_grow(buf); + pdf_lexbuf_grow(ctx, buf); buf->scratch[buf->len] = 0; fz_buffer_cat_pdf_string(ctx, fzbuf, buf->scratch); break; diff --git a/source/pdf/pdf-nametree.c b/source/pdf/pdf-nametree.c index bcbe8002..eecbb320 100644 --- a/source/pdf/pdf-nametree.c +++ b/source/pdf/pdf-nametree.c @@ -3,52 +3,52 @@ static pdf_obj * pdf_lookup_name_imp(fz_context *ctx, pdf_obj *node, pdf_obj *needle) { - pdf_obj *kids = pdf_dict_gets(node, "Kids"); - pdf_obj *names = pdf_dict_gets(node, "Names"); + pdf_obj *kids = pdf_dict_gets(ctx, node, "Kids"); + pdf_obj *names = pdf_dict_gets(ctx, node, "Names"); - if (pdf_is_array(kids)) + if (pdf_is_array(ctx, kids)) { int l = 0; - int r = pdf_array_len(kids) - 1; + int r = pdf_array_len(ctx, kids) - 1; while (l <= r) { int m = (l + r) >> 1; - pdf_obj *kid = pdf_array_get(kids, m); - pdf_obj *limits = pdf_dict_gets(kid, "Limits"); - pdf_obj *first = pdf_array_get(limits, 0); - pdf_obj *last = pdf_array_get(limits, 1); + pdf_obj *kid = pdf_array_get(ctx, kids, m); + pdf_obj *limits = pdf_dict_gets(ctx, kid, "Limits"); + pdf_obj *first = pdf_array_get(ctx, limits, 0); + pdf_obj *last = pdf_array_get(ctx, limits, 1); - if (pdf_objcmp(needle, first) < 0) + if (pdf_objcmp(ctx, needle, first) < 0) r = m - 1; - else if (pdf_objcmp(needle, last) > 0) + else if (pdf_objcmp(ctx, needle, last) > 0) l = m + 1; else { pdf_obj *obj; - if (pdf_mark_obj(node)) + if (pdf_mark_obj(ctx, node)) break; obj = pdf_lookup_name_imp(ctx, kid, needle); - pdf_unmark_obj(node); + pdf_unmark_obj(ctx, node); return obj; } } } - if (pdf_is_array(names)) + if (pdf_is_array(ctx, names)) { int l = 0; - int r = (pdf_array_len(names) / 2) - 1; + int r = (pdf_array_len(ctx, names) / 2) - 1; while (l <= r) { int m = (l + r) >> 1; int c; - pdf_obj *key = pdf_array_get(names, m * 2); - pdf_obj *val = pdf_array_get(names, m * 2 + 1); + pdf_obj *key = pdf_array_get(ctx, names, m * 2); + pdf_obj *val = pdf_array_get(ctx, names, m * 2 + 1); - c = pdf_objcmp(needle, key); + c = pdf_objcmp(ctx, needle, key); if (c < 0) r = m - 1; else if (c > 0) @@ -60,49 +60,45 @@ pdf_lookup_name_imp(fz_context *ctx, pdf_obj *node, pdf_obj *needle) /* Spec says names should be sorted (hence the binary search, * above), but Acrobat copes with non-sorted. Drop back to a * simple search if the binary search fails. */ - r = pdf_array_len(names)/2; + r = pdf_array_len(ctx, names)/2; for (l = 0; l < r; l++) - if (!pdf_objcmp(needle, pdf_array_get(names, l * 2))) - return pdf_array_get(names, l * 2 + 1); + if (!pdf_objcmp(ctx, needle, pdf_array_get(ctx, names, l * 2))) + return pdf_array_get(ctx, names, l * 2 + 1); } return NULL; } pdf_obj * -pdf_lookup_name(pdf_document *doc, char *which, pdf_obj *needle) +pdf_lookup_name(fz_context *ctx, pdf_document *doc, char *which, pdf_obj *needle) { - fz_context *ctx = doc->ctx; - - pdf_obj *root = pdf_dict_gets(pdf_trailer(doc), "Root"); - pdf_obj *names = pdf_dict_gets(root, "Names"); - pdf_obj *tree = pdf_dict_gets(names, which); + pdf_obj *root = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Root"); + pdf_obj *names = pdf_dict_gets(ctx, root, "Names"); + pdf_obj *tree = pdf_dict_gets(ctx, names, which); return pdf_lookup_name_imp(ctx, tree, needle); } pdf_obj * -pdf_lookup_dest(pdf_document *doc, pdf_obj *needle) +pdf_lookup_dest(fz_context *ctx, pdf_document *doc, pdf_obj *needle) { - fz_context *ctx = doc->ctx; - - pdf_obj *root = pdf_dict_gets(pdf_trailer(doc), "Root"); - pdf_obj *dests = pdf_dict_gets(root, "Dests"); - pdf_obj *names = pdf_dict_gets(root, "Names"); + pdf_obj *root = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Root"); + pdf_obj *dests = pdf_dict_gets(ctx, root, "Dests"); + pdf_obj *names = pdf_dict_gets(ctx, root, "Names"); pdf_obj *dest = NULL; /* PDF 1.1 has destinations in a dictionary */ if (dests) { - if (pdf_is_name(needle)) - return pdf_dict_get(dests, needle); + if (pdf_is_name(ctx, needle)) + return pdf_dict_get(ctx, dests, needle); else - return pdf_dict_gets(dests, pdf_to_str_buf(needle)); + return pdf_dict_gets(ctx, dests, pdf_to_str_buf(ctx, needle)); } /* PDF 1.2 has destinations in a name tree */ if (names && !dest) { - pdf_obj *tree = pdf_dict_gets(names, "Dests"); + pdf_obj *tree = pdf_dict_gets(ctx, names, "Dests"); return pdf_lookup_name_imp(ctx, tree, needle); } @@ -110,54 +106,53 @@ pdf_lookup_dest(pdf_document *doc, pdf_obj *needle) } static void -pdf_load_name_tree_imp(pdf_obj *dict, pdf_document *doc, pdf_obj *node) +pdf_load_name_tree_imp(fz_context *ctx, pdf_obj *dict, pdf_document *doc, pdf_obj *node) { - fz_context *ctx = doc->ctx; - pdf_obj *kids = pdf_dict_gets(node, "Kids"); - pdf_obj *names = pdf_dict_gets(node, "Names"); + pdf_obj *kids = pdf_dict_gets(ctx, node, "Kids"); + pdf_obj *names = pdf_dict_gets(ctx, node, "Names"); int i; UNUSED(ctx); - if (kids && !pdf_mark_obj(node)) + if (kids && !pdf_mark_obj(ctx, node)) { - int len = pdf_array_len(kids); + int len = pdf_array_len(ctx, kids); for (i = 0; i < len; i++) - pdf_load_name_tree_imp(dict, doc, pdf_array_get(kids, i)); - pdf_unmark_obj(node); + pdf_load_name_tree_imp(ctx, dict, doc, pdf_array_get(ctx, kids, i)); + pdf_unmark_obj(ctx, node); } if (names) { - int len = pdf_array_len(names); + int len = pdf_array_len(ctx, names); for (i = 0; i + 1 < len; i += 2) { - pdf_obj *key = pdf_array_get(names, i); - pdf_obj *val = pdf_array_get(names, i + 1); - if (pdf_is_string(key)) + pdf_obj *key = pdf_array_get(ctx, names, i); + pdf_obj *val = pdf_array_get(ctx, names, i + 1); + if (pdf_is_string(ctx, key)) { - key = pdf_to_utf8_name(doc, key); - pdf_dict_put(dict, key, val); - pdf_drop_obj(key); + key = pdf_to_utf8_name(ctx, doc, key); + pdf_dict_put(ctx, dict, key, val); + pdf_drop_obj(ctx, key); } - else if (pdf_is_name(key)) + else if (pdf_is_name(ctx, key)) { - pdf_dict_put(dict, key, val); + pdf_dict_put(ctx, dict, key, val); } } } } pdf_obj * -pdf_load_name_tree(pdf_document *doc, char *which) +pdf_load_name_tree(fz_context *ctx, pdf_document *doc, char *which) { - pdf_obj *root = pdf_dict_gets(pdf_trailer(doc), "Root"); - pdf_obj *names = pdf_dict_gets(root, "Names"); - pdf_obj *tree = pdf_dict_gets(names, which); - if (pdf_is_dict(tree)) + pdf_obj *root = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Root"); + pdf_obj *names = pdf_dict_gets(ctx, root, "Names"); + pdf_obj *tree = pdf_dict_gets(ctx, names, which); + if (pdf_is_dict(ctx, tree)) { - pdf_obj *dict = pdf_new_dict(doc, 100); - pdf_load_name_tree_imp(dict, doc, tree); + pdf_obj *dict = pdf_new_dict(ctx, doc, 100); + pdf_load_name_tree_imp(ctx, dict, doc, tree); return dict; } return NULL; diff --git a/source/pdf/pdf-object.c b/source/pdf/pdf-object.c index c3ac178a..d4b008fb 100644 --- a/source/pdf/pdf-object.c +++ b/source/pdf/pdf-object.c @@ -33,7 +33,7 @@ struct pdf_obj_s int refs; unsigned char kind; unsigned char flags; - pdf_document *doc; + pdf_document *doc; /* KEEP */ int parent_num; union { @@ -63,10 +63,9 @@ struct pdf_obj_s }; pdf_obj * -pdf_new_null(pdf_document *doc) +pdf_new_null(fz_context *ctx, pdf_document *doc) { pdf_obj *obj; - fz_context *ctx = doc->ctx; obj = Memento_label(fz_malloc(ctx, sizeof(pdf_obj)), "pdf_obj(null)"); obj->doc = doc; obj->refs = 1; @@ -77,10 +76,9 @@ pdf_new_null(pdf_document *doc) } pdf_obj * -pdf_new_bool(pdf_document *doc, int b) +pdf_new_bool(fz_context *ctx, pdf_document *doc, int b) { pdf_obj *obj; - fz_context *ctx = doc->ctx; obj = Memento_label(fz_malloc(ctx, sizeof(pdf_obj)), "pdf_obj(bool)"); obj->doc = doc; obj->refs = 1; @@ -92,10 +90,9 @@ pdf_new_bool(pdf_document *doc, int b) } pdf_obj * -pdf_new_int(pdf_document *doc, int i) +pdf_new_int(fz_context *ctx, pdf_document *doc, int i) { pdf_obj *obj; - fz_context *ctx = doc->ctx; obj = Memento_label(fz_malloc(ctx, sizeof(pdf_obj)), "pdf_obj(int)"); obj->doc = doc; obj->refs = 1; @@ -107,10 +104,9 @@ pdf_new_int(pdf_document *doc, int i) } pdf_obj * -pdf_new_real(pdf_document *doc, float f) +pdf_new_real(fz_context *ctx, pdf_document *doc, float f) { pdf_obj *obj; - fz_context *ctx = doc->ctx; obj = Memento_label(fz_malloc(ctx, sizeof(pdf_obj)), "pdf_obj(real)"); obj->doc = doc; obj->refs = 1; @@ -122,10 +118,9 @@ pdf_new_real(pdf_document *doc, float f) } pdf_obj * -pdf_new_string(pdf_document *doc, const char *str, int len) +pdf_new_string(fz_context *ctx, pdf_document *doc, const char *str, int len) { pdf_obj *obj; - fz_context *ctx = doc->ctx; obj = Memento_label(fz_malloc(ctx, offsetof(pdf_obj, u.s.buf) + len + 1), "pdf_obj(string)"); obj->doc = doc; obj->refs = 1; @@ -139,10 +134,9 @@ pdf_new_string(pdf_document *doc, const char *str, int len) } pdf_obj * -pdf_new_name(pdf_document *doc, const char *str) +pdf_new_name(fz_context *ctx, pdf_document *doc, const char *str) { pdf_obj *obj; - fz_context *ctx = doc->ctx; obj = Memento_label(fz_malloc(ctx, offsetof(pdf_obj, u.n) + strlen(str) + 1), "pdf_obj(name)"); obj->doc = doc; obj->refs = 1; @@ -154,10 +148,9 @@ pdf_new_name(pdf_document *doc, const char *str) } pdf_obj * -pdf_new_indirect(pdf_document *doc, int num, int gen) +pdf_new_indirect(fz_context *ctx, pdf_document *doc, int num, int gen) { pdf_obj *obj; - fz_context *ctx = doc->ctx; obj = Memento_label(fz_malloc(ctx, sizeof(pdf_obj)), "pdf_obj(indirect)"); obj->doc = doc; obj->refs = 1; @@ -170,81 +163,77 @@ pdf_new_indirect(pdf_document *doc, int num, int gen) } pdf_obj * -pdf_keep_obj(pdf_obj *obj) +pdf_keep_obj(fz_context *ctx, pdf_obj *obj) { if (obj) obj->refs ++; return obj; } -int pdf_is_indirect(pdf_obj *obj) +int pdf_is_indirect(fz_context *ctx, pdf_obj *obj) { return obj ? obj->kind == PDF_INDIRECT : 0; } #define RESOLVE(obj) \ - do { \ - if (obj && obj->kind == PDF_INDIRECT) \ - {\ - obj = pdf_resolve_indirect(obj); \ - } \ - } while (0) + if (obj && obj->kind == PDF_INDIRECT) \ + obj = pdf_resolve_indirect(ctx, obj); \ -int pdf_is_null(pdf_obj *obj) +int pdf_is_null(fz_context *ctx, pdf_obj *obj) { RESOLVE(obj); return obj ? obj->kind == PDF_NULL : 0; } -int pdf_is_bool(pdf_obj *obj) +int pdf_is_bool(fz_context *ctx, pdf_obj *obj) { RESOLVE(obj); return obj ? obj->kind == PDF_BOOL : 0; } -int pdf_is_int(pdf_obj *obj) +int pdf_is_int(fz_context *ctx, pdf_obj *obj) { RESOLVE(obj); return obj ? obj->kind == PDF_INT : 0; } -int pdf_is_real(pdf_obj *obj) +int pdf_is_real(fz_context *ctx, pdf_obj *obj) { RESOLVE(obj); return obj ? obj->kind == PDF_REAL : 0; } -int pdf_is_number(pdf_obj *obj) +int pdf_is_number(fz_context *ctx, pdf_obj *obj) { RESOLVE(obj); return obj ? (obj->kind == PDF_REAL || obj->kind == PDF_INT) : 0; } -int pdf_is_string(pdf_obj *obj) +int pdf_is_string(fz_context *ctx, pdf_obj *obj) { RESOLVE(obj); return obj ? obj->kind == PDF_STRING : 0; } -int pdf_is_name(pdf_obj *obj) +int pdf_is_name(fz_context *ctx, pdf_obj *obj) { RESOLVE(obj); return obj ? obj->kind == PDF_NAME : 0; } -int pdf_is_array(pdf_obj *obj) +int pdf_is_array(fz_context *ctx, pdf_obj *obj) { RESOLVE(obj); return obj ? obj->kind == PDF_ARRAY : 0; } -int pdf_is_dict(pdf_obj *obj) +int pdf_is_dict(fz_context *ctx, pdf_obj *obj) { RESOLVE(obj); return obj ? obj->kind == PDF_DICT : 0; } -int pdf_to_bool(pdf_obj *obj) +int pdf_to_bool(fz_context *ctx, pdf_obj *obj) { RESOLVE(obj); if (!obj) @@ -252,7 +241,7 @@ int pdf_to_bool(pdf_obj *obj) return obj->kind == PDF_BOOL ? obj->u.b : 0; } -int pdf_to_int(pdf_obj *obj) +int pdf_to_int(fz_context *ctx, pdf_obj *obj) { RESOLVE(obj); if (!obj) @@ -264,7 +253,7 @@ int pdf_to_int(pdf_obj *obj) return 0; } -float pdf_to_real(pdf_obj *obj) +float pdf_to_real(fz_context *ctx, pdf_obj *obj) { RESOLVE(obj); if (!obj) @@ -276,7 +265,7 @@ float pdf_to_real(pdf_obj *obj) return 0; } -char *pdf_to_name(pdf_obj *obj) +char *pdf_to_name(fz_context *ctx, pdf_obj *obj) { RESOLVE(obj); if (!obj || obj->kind != PDF_NAME) @@ -284,7 +273,7 @@ char *pdf_to_name(pdf_obj *obj) return obj->u.n; } -char *pdf_to_str_buf(pdf_obj *obj) +char *pdf_to_str_buf(fz_context *ctx, pdf_obj *obj) { RESOLVE(obj); if (!obj || obj->kind != PDF_STRING) @@ -292,7 +281,7 @@ char *pdf_to_str_buf(pdf_obj *obj) return obj->u.s.buf; } -int pdf_to_str_len(pdf_obj *obj) +int pdf_to_str_len(fz_context *ctx, pdf_obj *obj) { RESOLVE(obj); if (!obj || obj->kind != PDF_STRING) @@ -300,7 +289,7 @@ int pdf_to_str_len(pdf_obj *obj) return obj->u.s.len; } -void pdf_set_int(pdf_obj *obj, int i) +void pdf_set_int(fz_context *ctx, pdf_obj *obj, int i) { if (!obj || obj->kind != PDF_INT) return; @@ -308,7 +297,7 @@ void pdf_set_int(pdf_obj *obj, int i) } /* for use by pdf_crypt_obj_imp to decrypt AES string in place */ -void pdf_set_str_len(pdf_obj *obj, int newlen) +void pdf_set_str_len(fz_context *ctx, pdf_obj *obj, int newlen) { RESOLVE(obj); if (!obj || obj->kind != PDF_STRING) @@ -318,27 +307,27 @@ void pdf_set_str_len(pdf_obj *obj, int newlen) obj->u.s.len = newlen; } -pdf_obj *pdf_to_dict(pdf_obj *obj) +pdf_obj *pdf_to_dict(fz_context *ctx, pdf_obj *obj) { RESOLVE(obj); return (obj && obj->kind == PDF_DICT ? obj : NULL); } -int pdf_to_num(pdf_obj *obj) +int pdf_to_num(fz_context *ctx, pdf_obj *obj) { if (!obj || obj->kind != PDF_INDIRECT) return 0; return obj->u.r.num; } -int pdf_to_gen(pdf_obj *obj) +int pdf_to_gen(fz_context *ctx, pdf_obj *obj) { if (!obj || obj->kind != PDF_INDIRECT) return 0; return obj->u.r.gen; } -pdf_document *pdf_get_indirect_document(pdf_obj *obj) +pdf_document *pdf_get_indirect_document(fz_context *ctx, pdf_obj *obj) { if (!obj || obj->kind != PDF_INDIRECT) return NULL; @@ -346,7 +335,7 @@ pdf_document *pdf_get_indirect_document(pdf_obj *obj) } int -pdf_objcmp(pdf_obj *a, pdf_obj *b) +pdf_objcmp(fz_context *ctx, pdf_obj *a, pdf_obj *b) { int i; @@ -404,7 +393,7 @@ pdf_objcmp(pdf_obj *a, pdf_obj *b) if (a->u.a.len != b->u.a.len) return a->u.a.len - b->u.a.len; for (i = 0; i < a->u.a.len; i++) - if (pdf_objcmp(a->u.a.items[i], b->u.a.items[i])) + if (pdf_objcmp(ctx, a->u.a.items[i], b->u.a.items[i])) return 1; return 0; @@ -413,9 +402,9 @@ pdf_objcmp(pdf_obj *a, pdf_obj *b) return a->u.d.len - b->u.d.len; for (i = 0; i < a->u.d.len; i++) { - if (pdf_objcmp(a->u.d.items[i].k, b->u.d.items[i].k)) + if (pdf_objcmp(ctx, a->u.d.items[i].k, b->u.d.items[i].k)) return 1; - if (pdf_objcmp(a->u.d.items[i].v, b->u.d.items[i].v)) + if (pdf_objcmp(ctx, a->u.d.items[i].v, b->u.d.items[i].v)) return 1; } return 0; @@ -445,11 +434,10 @@ pdf_objkindstr(pdf_obj *obj) } pdf_obj * -pdf_new_array(pdf_document *doc, int initialcap) +pdf_new_array(fz_context *ctx, pdf_document *doc, int initialcap) { pdf_obj *obj; int i; - fz_context *ctx = doc->ctx; obj = Memento_label(fz_malloc(ctx, sizeof(pdf_obj)), "pdf_obj(array)"); obj->doc = doc; @@ -477,12 +465,12 @@ pdf_new_array(pdf_document *doc, int initialcap) } static void -pdf_array_grow(pdf_obj *obj) +pdf_array_grow(fz_context *ctx, pdf_obj *obj) { int i; int new_cap = (obj->u.a.cap * 3) / 2; - obj->u.a.items = fz_resize_array(obj->doc->ctx, obj->u.a.items, new_cap, sizeof(pdf_obj*)); + obj->u.a.items = fz_resize_array(ctx, obj->u.a.items, new_cap, sizeof(pdf_obj*)); obj->u.a.cap = new_cap; for (i = obj->u.a.len ; i < obj->u.a.cap; i++) @@ -490,29 +478,32 @@ pdf_array_grow(pdf_obj *obj) } pdf_obj * -pdf_copy_array(pdf_obj *obj) +pdf_copy_array(fz_context *ctx, pdf_obj *obj) { - pdf_obj *arr; - int i; - int n; - fz_context *ctx = obj->doc->ctx; - RESOLVE(obj); - if (!obj) - return NULL; /* Can't warn :( */ - if (obj->kind != PDF_ARRAY) - fz_warn(ctx, "assert: not an array (%s)", pdf_objkindstr(obj)); + if (obj) + { + pdf_document *doc = obj->doc; - arr = pdf_new_array(obj->doc, pdf_array_len(obj)); - n = pdf_array_len(obj); - for (i = 0; i < n; i++) - pdf_array_push(arr, pdf_array_get(obj, i)); + pdf_obj *arr; + int i; + int n; - return arr; + if (obj->kind != PDF_ARRAY) + fz_warn(ctx, "assert: not an array (%s)", pdf_objkindstr(obj)); + + arr = pdf_new_array(ctx, doc, pdf_array_len(ctx, obj)); + n = pdf_array_len(ctx, obj); + for (i = 0; i < n; i++) + pdf_array_push(ctx, arr, pdf_array_get(ctx, obj, i)); + + return arr; + } + return NULL; /* Can't warn :( */ } int -pdf_array_len(pdf_obj *obj) +pdf_array_len(fz_context *ctx, pdf_obj *obj) { RESOLVE(obj); if (!obj || obj->kind != PDF_ARRAY) @@ -521,258 +512,252 @@ pdf_array_len(pdf_obj *obj) } pdf_obj * -pdf_array_get(pdf_obj *obj, int i) +pdf_array_get(fz_context *ctx, pdf_obj *obj, int i) { RESOLVE(obj); - if (!obj || obj->kind != PDF_ARRAY) return NULL; - if (i < 0 || i >= obj->u.a.len) return NULL; - return obj->u.a.items[i]; } -static void object_altered(pdf_obj *obj, pdf_obj *val) +static void object_altered(fz_context *ctx, pdf_obj *obj, pdf_obj *val) { + pdf_document *doc = obj->doc; + /* - parent_num = 0 while an object is being parsed from the file. - No further action is necessary. + parent_num = 0 while an object is being parsed from the file. + No further action is necessary. */ - if (obj->parent_num == 0 || obj->doc->freeze_updates) + if (obj->parent_num == 0 || doc->freeze_updates) return; /* - Otherwise we need to ensure that the containing hierarchy of objects - has been moved to the incremental xref section and the newly linked - object needs to record the parent_num + Otherwise we need to ensure that the containing hierarchy of objects + has been moved to the incremental xref section and the newly linked + object needs to record the parent_num */ - pdf_xref_ensure_incremental_object(obj->doc, obj->parent_num); - pdf_set_obj_parent(val, obj->parent_num); + pdf_xref_ensure_incremental_object(ctx, doc, obj->parent_num); + pdf_set_obj_parent(ctx, val, obj->parent_num); } void -pdf_array_put(pdf_obj *obj, int i, pdf_obj *item) +pdf_array_put(fz_context *ctx, pdf_obj *obj, int i, pdf_obj *item) { RESOLVE(obj); - - if (!obj) - return; /* Can't warn :( */ - if (obj->kind != PDF_ARRAY) - fz_warn(obj->doc->ctx, "assert: not an array (%s)", pdf_objkindstr(obj)); - else if (i < 0) - fz_warn(obj->doc->ctx, "assert: index %d < 0", i); - else if (i >= obj->u.a.len) - fz_warn(obj->doc->ctx, "assert: index %d > length %d", i, obj->u.a.len); - else + if (obj) { - pdf_drop_obj(obj->u.a.items[i]); - obj->u.a.items[i] = pdf_keep_obj(item); - } + if (obj->kind != PDF_ARRAY) + fz_warn(ctx, "assert: not an array (%s)", pdf_objkindstr(obj)); + else if (i < 0) + fz_warn(ctx, "assert: index %d < 0", i); + else if (i >= obj->u.a.len) + fz_warn(ctx, "assert: index %d > length %d", i, obj->u.a.len); + else + { + pdf_drop_obj(ctx, obj->u.a.items[i]); + obj->u.a.items[i] = pdf_keep_obj(ctx, item); + } - object_altered(obj, item); + object_altered(ctx, obj, item); + } + return; /* Can't warn :( */ } void -pdf_array_push(pdf_obj *obj, pdf_obj *item) +pdf_array_push(fz_context *ctx, pdf_obj *obj, pdf_obj *item) { RESOLVE(obj); - - if (!obj) - return; /* Can't warn :( */ - if (obj->kind != PDF_ARRAY) - fz_warn(obj->doc->ctx, "assert: not an array (%s)", pdf_objkindstr(obj)); - else + if (obj) { - if (obj->u.a.len + 1 > obj->u.a.cap) - pdf_array_grow(obj); - obj->u.a.items[obj->u.a.len] = pdf_keep_obj(item); - obj->u.a.len++; - } + if (obj->kind != PDF_ARRAY) + fz_warn(ctx, "assert: not an array (%s)", pdf_objkindstr(obj)); + else + { + if (obj->u.a.len + 1 > obj->u.a.cap) + pdf_array_grow(ctx, obj); + obj->u.a.items[obj->u.a.len] = pdf_keep_obj(ctx, item); + obj->u.a.len++; + } - object_altered(obj, item); + object_altered(ctx, obj, item); + } + return; /* Can't warn :( */ } void -pdf_array_push_drop(pdf_obj *obj, pdf_obj *item) +pdf_array_push_drop(fz_context *ctx, pdf_obj *obj, pdf_obj *item) { - fz_context *ctx = obj->doc->ctx; - - fz_try(ctx) - { - pdf_array_push(obj, item); - } - fz_always(ctx) - { - pdf_drop_obj(item); - } - fz_catch(ctx) + RESOLVE(obj); + if (obj) { - fz_rethrow(ctx); + fz_try(ctx) + pdf_array_push(ctx, obj, item); + fz_always(ctx) + pdf_drop_obj(ctx, item); + fz_catch(ctx) + fz_rethrow(ctx); } } void -pdf_array_insert(pdf_obj *obj, pdf_obj *item, int i) +pdf_array_insert(fz_context *ctx, pdf_obj *obj, pdf_obj *item, int i) { RESOLVE(obj); - - if (!obj) - return; /* Can't warn :( */ - if (obj->kind != PDF_ARRAY) - fz_warn(obj->doc->ctx, "assert: not an array (%s)", pdf_objkindstr(obj)); - else + if (obj) { - if (i < 0 || i > obj->u.a.len) - fz_throw(obj->doc->ctx, FZ_ERROR_GENERIC, "attempt to insert object %d in array of length %d", i, obj->u.a.len); - if (obj->u.a.len + 1 > obj->u.a.cap) - pdf_array_grow(obj); - memmove(obj->u.a.items + i + 1, obj->u.a.items + i, (obj->u.a.len - i) * sizeof(pdf_obj*)); - obj->u.a.items[i] = pdf_keep_obj(item); - obj->u.a.len++; - } + if (obj->kind != PDF_ARRAY) + fz_warn(ctx, "assert: not an array (%s)", pdf_objkindstr(obj)); + else + { + if (i < 0 || i > obj->u.a.len) + fz_throw(ctx, FZ_ERROR_GENERIC, "attempt to insert object %d in array of length %d", i, obj->u.a.len); + if (obj->u.a.len + 1 > obj->u.a.cap) + pdf_array_grow(ctx, obj); + memmove(obj->u.a.items + i + 1, obj->u.a.items + i, (obj->u.a.len - i) * sizeof(pdf_obj*)); + obj->u.a.items[i] = pdf_keep_obj(ctx, item); + obj->u.a.len++; + } - object_altered(obj, item); + object_altered(ctx, obj, item); + } + return; /* Can't warn :( */ } void -pdf_array_insert_drop(pdf_obj *obj, pdf_obj *item, int i) +pdf_array_insert_drop(fz_context *ctx, pdf_obj *obj, pdf_obj *item, int i) { - fz_context *ctx = obj->doc->ctx; - fz_try(ctx) - { - pdf_array_insert(obj, item, i); - } - fz_always(ctx) + RESOLVE(obj); + if (obj) { - pdf_drop_obj(item); - } - fz_catch(ctx) - { - fz_rethrow(ctx); + fz_try(ctx) + pdf_array_insert(ctx, obj, item, i); + fz_always(ctx) + pdf_drop_obj(ctx, item); + fz_catch(ctx) + fz_rethrow(ctx); } } void -pdf_array_delete(pdf_obj *obj, int i) +pdf_array_delete(fz_context *ctx, pdf_obj *obj, int i) { RESOLVE(obj); - - if (!obj) - return; /* Can't warn :( */ - if (obj->kind != PDF_ARRAY) - fz_warn(obj->doc->ctx, "assert: not an array (%s)", pdf_objkindstr(obj)); - else + if (obj) { - pdf_drop_obj(obj->u.a.items[i]); - obj->u.a.items[i] = 0; - obj->u.a.len--; - memmove(obj->u.a.items + i, obj->u.a.items + i + 1, (obj->u.a.len - i) * sizeof(pdf_obj*)); + if (obj->kind != PDF_ARRAY) + fz_warn(ctx, "assert: not an array (%s)", pdf_objkindstr(obj)); + else + { + pdf_drop_obj(ctx, obj->u.a.items[i]); + obj->u.a.items[i] = 0; + obj->u.a.len--; + memmove(obj->u.a.items + i, obj->u.a.items + i + 1, (obj->u.a.len - i) * sizeof(pdf_obj*)); + } } + return; /* Can't warn :( */ } int -pdf_array_contains(pdf_obj *arr, pdf_obj *obj) +pdf_array_contains(fz_context *ctx, pdf_obj *arr, pdf_obj *obj) { int i, len; - len = pdf_array_len(arr); + len = pdf_array_len(ctx, arr); for (i = 0; i < len; i++) - if (!pdf_objcmp(pdf_array_get(arr, i), obj)) + if (!pdf_objcmp(ctx, pdf_array_get(ctx, arr, i), obj)) return 1; return 0; } -pdf_obj *pdf_new_rect(pdf_document *doc, const fz_rect *rect) +pdf_obj *pdf_new_rect(fz_context *ctx, pdf_document *doc, const fz_rect *rect) { pdf_obj *arr = NULL; pdf_obj *item = NULL; - fz_context *ctx = doc->ctx; fz_var(arr); fz_var(item); fz_try(ctx) { - arr = pdf_new_array(doc, 4); + arr = pdf_new_array(ctx, doc, 4); - item = pdf_new_real(doc, rect->x0); - pdf_array_push(arr, item); - pdf_drop_obj(item); + item = pdf_new_real(ctx, doc, rect->x0); + pdf_array_push(ctx, arr, item); + pdf_drop_obj(ctx, item); item = NULL; - item = pdf_new_real(doc, rect->y0); - pdf_array_push(arr, item); - pdf_drop_obj(item); + item = pdf_new_real(ctx, doc, rect->y0); + pdf_array_push(ctx, arr, item); + pdf_drop_obj(ctx, item); item = NULL; - item = pdf_new_real(doc, rect->x1); - pdf_array_push(arr, item); - pdf_drop_obj(item); + item = pdf_new_real(ctx, doc, rect->x1); + pdf_array_push(ctx, arr, item); + pdf_drop_obj(ctx, item); item = NULL; - item = pdf_new_real(doc, rect->y1); - pdf_array_push(arr, item); - pdf_drop_obj(item); + item = pdf_new_real(ctx, doc, rect->y1); + pdf_array_push(ctx, arr, item); + pdf_drop_obj(ctx, item); item = NULL; } fz_catch(ctx) { - pdf_drop_obj(item); - pdf_drop_obj(arr); + pdf_drop_obj(ctx, item); + pdf_drop_obj(ctx, arr); fz_rethrow(ctx); } return arr; } -pdf_obj *pdf_new_matrix(pdf_document *doc, const fz_matrix *mtx) +pdf_obj *pdf_new_matrix(fz_context *ctx, pdf_document *doc, const fz_matrix *mtx) { pdf_obj *arr = NULL; pdf_obj *item = NULL; - fz_context *ctx = doc->ctx; fz_var(arr); fz_var(item); fz_try(ctx) { - arr = pdf_new_array(doc, 6); + arr = pdf_new_array(ctx, doc, 6); - item = pdf_new_real(doc, mtx->a); - pdf_array_push(arr, item); - pdf_drop_obj(item); + item = pdf_new_real(ctx, doc, mtx->a); + pdf_array_push(ctx, arr, item); + pdf_drop_obj(ctx, item); item = NULL; - item = pdf_new_real(doc, mtx->b); - pdf_array_push(arr, item); - pdf_drop_obj(item); + item = pdf_new_real(ctx, doc, mtx->b); + pdf_array_push(ctx, arr, item); + pdf_drop_obj(ctx, item); item = NULL; - item = pdf_new_real(doc, mtx->c); - pdf_array_push(arr, item); - pdf_drop_obj(item); + item = pdf_new_real(ctx, doc, mtx->c); + pdf_array_push(ctx, arr, item); + pdf_drop_obj(ctx, item); item = NULL; - item = pdf_new_real(doc, mtx->d); - pdf_array_push(arr, item); - pdf_drop_obj(item); + item = pdf_new_real(ctx, doc, mtx->d); + pdf_array_push(ctx, arr, item); + pdf_drop_obj(ctx, item); item = NULL; - item = pdf_new_real(doc, mtx->e); - pdf_array_push(arr, item); - pdf_drop_obj(item); + item = pdf_new_real(ctx, doc, mtx->e); + pdf_array_push(ctx, arr, item); + pdf_drop_obj(ctx, item); item = NULL; - item = pdf_new_real(doc, mtx->f); - pdf_array_push(arr, item); - pdf_drop_obj(item); + item = pdf_new_real(ctx, doc, mtx->f); + pdf_array_push(ctx, arr, item); + pdf_drop_obj(ctx, item); item = NULL; } fz_catch(ctx) { - pdf_drop_obj(item); - pdf_drop_obj(arr); + pdf_drop_obj(ctx, item); + pdf_drop_obj(ctx, arr); fz_rethrow(ctx); } @@ -785,15 +770,16 @@ static int keyvalcmp(const void *ap, const void *bp) { const struct keyval *a = ap; const struct keyval *b = bp; - return strcmp(pdf_to_name(a->k), pdf_to_name(b->k)); + if (a->k->kind == PDF_NAME && b->k->kind == PDF_NAME) + return strcmp(a->k->u.n, b->k->u.n); + return 0; } pdf_obj * -pdf_new_dict(pdf_document *doc, int initialcap) +pdf_new_dict(fz_context *ctx, pdf_document *doc, int initialcap) { pdf_obj *obj; int i; - fz_context *ctx = doc->ctx; obj = Memento_label(fz_malloc(ctx, sizeof(pdf_obj)), "pdf_obj(dict)"); obj->doc = doc; @@ -824,12 +810,12 @@ pdf_new_dict(pdf_document *doc, int initialcap) } static void -pdf_dict_grow(pdf_obj *obj) +pdf_dict_grow(fz_context *ctx, pdf_obj *obj) { int i; int new_cap = (obj->u.d.cap * 3) / 2; - obj->u.d.items = fz_resize_array(obj->doc->ctx, obj->u.d.items, new_cap, sizeof(struct keyval)); + obj->u.d.items = fz_resize_array(ctx, obj->u.d.items, new_cap, sizeof(struct keyval)); obj->u.d.cap = new_cap; for (i = obj->u.d.len; i < obj->u.d.cap; i++) @@ -840,29 +826,31 @@ pdf_dict_grow(pdf_obj *obj) } pdf_obj * -pdf_copy_dict(pdf_obj *obj) +pdf_copy_dict(fz_context *ctx, pdf_obj *obj) { pdf_obj *dict; int i, n; - pdf_document *doc; RESOLVE(obj); - if (!obj) - return NULL; /* Can't warn :( */ - doc = obj->doc; - if (obj->kind != PDF_DICT) - fz_warn(doc->ctx, "assert: not a dict (%s)", pdf_objkindstr(obj)); + if (obj) + { + pdf_document *doc = obj->doc; - n = pdf_dict_len(obj); - dict = pdf_new_dict(doc, n); - for (i = 0; i < n; i++) - pdf_dict_put(dict, pdf_dict_get_key(obj, i), pdf_dict_get_val(obj, i)); + if (obj->kind != PDF_DICT) + fz_warn(ctx, "assert: not a dict (%s)", pdf_objkindstr(obj)); + + n = pdf_dict_len(ctx, obj); + dict = pdf_new_dict(ctx, doc, n); + for (i = 0; i < n; i++) + pdf_dict_put(ctx, dict, pdf_dict_get_key(ctx, obj, i), pdf_dict_get_val(ctx, obj, i)); - return dict; + return dict; + } + return NULL; /* Can't warn :( */ } int -pdf_dict_len(pdf_obj *obj) +pdf_dict_len(fz_context *ctx, pdf_obj *obj) { RESOLVE(obj); if (!obj || obj->kind != PDF_DICT) @@ -871,40 +859,36 @@ pdf_dict_len(pdf_obj *obj) } pdf_obj * -pdf_dict_get_key(pdf_obj *obj, int i) +pdf_dict_get_key(fz_context *ctx, pdf_obj *obj, int i) { RESOLVE(obj); if (!obj || obj->kind != PDF_DICT) return NULL; - if (i < 0 || i >= obj->u.d.len) return NULL; - return obj->u.d.items[i].k; } pdf_obj * -pdf_dict_get_val(pdf_obj *obj, int i) +pdf_dict_get_val(fz_context *ctx, pdf_obj *obj, int i) { RESOLVE(obj); if (!obj || obj->kind != PDF_DICT) return NULL; - if (i < 0 || i >= obj->u.d.len) return NULL; - return obj->u.d.items[i].v; } static int -pdf_dict_finds(pdf_obj *obj, const char *key, int *location) +pdf_dict_finds(fz_context *ctx, pdf_obj *obj, const char *key, int *location) { if ((obj->flags & PDF_FLAGS_SORTED) && obj->u.d.len > 0) { int l = 0; int r = obj->u.d.len - 1; - if (strcmp(pdf_to_name(obj->u.d.items[r].k), key) < 0) + if (strcmp(pdf_to_name(ctx, obj->u.d.items[r].k), key) < 0) { if (location) *location = r + 1; @@ -914,7 +898,7 @@ pdf_dict_finds(pdf_obj *obj, const char *key, int *location) while (l <= r) { int m = (l + r) >> 1; - int c = -strcmp(pdf_to_name(obj->u.d.items[m].k), key); + int c = -strcmp(pdf_to_name(ctx, obj->u.d.items[m].k), key); if (c < 0) r = m - 1; else if (c > 0) @@ -931,7 +915,7 @@ pdf_dict_finds(pdf_obj *obj, const char *key, int *location) { int i; for (i = 0; i < obj->u.d.len; i++) - if (strcmp(pdf_to_name(obj->u.d.items[i].k), key) == 0) + if (strcmp(pdf_to_name(ctx, obj->u.d.items[i].k), key) == 0) return i; if (location) @@ -942,7 +926,7 @@ pdf_dict_finds(pdf_obj *obj, const char *key, int *location) } pdf_obj * -pdf_dict_gets(pdf_obj *obj, const char *key) +pdf_dict_gets(fz_context *ctx, pdf_obj *obj, const char *key) { int i; @@ -950,7 +934,7 @@ pdf_dict_gets(pdf_obj *obj, const char *key) if (!obj || obj->kind != PDF_DICT) return NULL; - i = pdf_dict_finds(obj, key, NULL); + i = pdf_dict_finds(ctx, obj, key, NULL); if (i >= 0) return obj->u.d.items[i].v; @@ -958,155 +942,154 @@ pdf_dict_gets(pdf_obj *obj, const char *key) } pdf_obj * -pdf_dict_getp(pdf_obj *obj, const char *keys) +pdf_dict_getp(fz_context *ctx, pdf_obj *obj, const char *keys) { - char buf[256]; - char *k, *e; - - if (strlen(keys)+1 > 256) - fz_throw(obj->doc->ctx, FZ_ERROR_GENERIC, "buffer overflow in pdf_dict_getp"); + RESOLVE(obj); + if (obj) + { + char buf[256]; + char *k, *e; - strcpy(buf, keys); + if (strlen(keys)+1 > 256) + fz_throw(ctx, FZ_ERROR_GENERIC, "buffer overflow in pdf_dict_getp"); - e = buf; - while (*e && obj) - { - k = e; - while (*e != '/' && *e != '\0') - e++; + strcpy(buf, keys); - if (*e == '/') + e = buf; + while (*e && obj) { - *e = '\0'; - e++; + k = e; + while (*e != '/' && *e != '\0') + e++; + + if (*e == '/') + { + *e = '\0'; + e++; + } + + obj = pdf_dict_gets(ctx, obj, k); } - obj = pdf_dict_gets(obj, k); + return obj; } - - return obj; + return NULL; /* Can't warn */ } pdf_obj * -pdf_dict_get(pdf_obj *obj, pdf_obj *key) +pdf_dict_get(fz_context *ctx, pdf_obj *obj, pdf_obj *key) { if (!key || key->kind != PDF_NAME) return NULL; - return pdf_dict_gets(obj, pdf_to_name(key)); + return pdf_dict_gets(ctx, obj, pdf_to_name(ctx, key)); } pdf_obj * -pdf_dict_getsa(pdf_obj *obj, const char *key, const char *abbrev) +pdf_dict_getsa(fz_context *ctx, pdf_obj *obj, const char *key, const char *abbrev) { pdf_obj *v; - v = pdf_dict_gets(obj, key); + v = pdf_dict_gets(ctx, obj, key); if (v) return v; - return pdf_dict_gets(obj, abbrev); + return pdf_dict_gets(ctx, obj, abbrev); } void -pdf_dict_put(pdf_obj *obj, pdf_obj *key, pdf_obj *val) +pdf_dict_put(fz_context *ctx, pdf_obj *obj, pdf_obj *key, pdf_obj *val) { - int location; - char *s; - int i; - RESOLVE(obj); - if (!obj) - return; /* Can't warn :( */ - if (obj->kind != PDF_DICT) + if (obj) { - fz_warn(obj->doc->ctx, "assert: not a dict (%s)", pdf_objkindstr(obj)); - return; - } + int location; + char *s; + int i; - RESOLVE(key); - if (!key || key->kind != PDF_NAME) - { - fz_warn(obj->doc->ctx, "assert: key is not a name (%s)", pdf_objkindstr(obj)); - return; - } - else - s = pdf_to_name(key); + if (obj->kind != PDF_DICT) + { + fz_warn(ctx, "assert: not a dict (%s)", pdf_objkindstr(obj)); + return; + } - if (!val) - { - fz_warn(obj->doc->ctx, "assert: val does not exist for key (%s)", s); - return; - } + RESOLVE(key); + if (!key || key->kind != PDF_NAME) + { + fz_warn(ctx, "assert: key is not a name (%s)", pdf_objkindstr(obj)); + return; + } + else + s = pdf_to_name(ctx, key); + + if (!val) + { + fz_warn(ctx, "assert: val does not exist for key (%s)", s); + return; + } - if (obj->u.d.len > 100 && !(obj->flags & PDF_FLAGS_SORTED)) - pdf_sort_dict(obj); + if (obj->u.d.len > 100 && !(obj->flags & PDF_FLAGS_SORTED)) + pdf_sort_dict(ctx, obj); - i = pdf_dict_finds(obj, s, &location); - if (i >= 0 && i < obj->u.d.len) - { - if (obj->u.d.items[i].v != val) + i = pdf_dict_finds(ctx, obj, s, &location); + if (i >= 0 && i < obj->u.d.len) { - pdf_obj *d = obj->u.d.items[i].v; - obj->u.d.items[i].v = pdf_keep_obj(val); - pdf_drop_obj(d); + if (obj->u.d.items[i].v != val) + { + pdf_obj *d = obj->u.d.items[i].v; + obj->u.d.items[i].v = pdf_keep_obj(ctx, val); + pdf_drop_obj(ctx, d); + } + } + else + { + if (obj->u.d.len + 1 > obj->u.d.cap) + pdf_dict_grow(ctx, obj); + + i = location; + if ((obj->flags & PDF_FLAGS_SORTED) && obj->u.d.len > 0) + memmove(&obj->u.d.items[i + 1], + &obj->u.d.items[i], + (obj->u.d.len - i) * sizeof(struct keyval)); + + obj->u.d.items[i].k = pdf_keep_obj(ctx, key); + obj->u.d.items[i].v = pdf_keep_obj(ctx, val); + obj->u.d.len ++; } - } - else - { - if (obj->u.d.len + 1 > obj->u.d.cap) - pdf_dict_grow(obj); - - i = location; - if ((obj->flags & PDF_FLAGS_SORTED) && obj->u.d.len > 0) - memmove(&obj->u.d.items[i + 1], - &obj->u.d.items[i], - (obj->u.d.len - i) * sizeof(struct keyval)); - - obj->u.d.items[i].k = pdf_keep_obj(key); - obj->u.d.items[i].v = pdf_keep_obj(val); - obj->u.d.len ++; - } - object_altered(obj, val); + object_altered(ctx, obj, val); + } + return; /* Can't warn :( */ } void -pdf_dict_puts(pdf_obj *obj, const char *key, pdf_obj *val) +pdf_dict_puts(fz_context *ctx, pdf_obj *obj, const char *key, pdf_obj *val) { pdf_document *doc = obj->doc; - fz_context *ctx = doc->ctx; - pdf_obj *keyobj = pdf_new_name(doc, key); + pdf_obj *keyobj = pdf_new_name(ctx, doc, key); fz_try(ctx) - { - pdf_dict_put(obj, keyobj, val); - } + pdf_dict_put(ctx, obj, keyobj, val); fz_always(ctx) - { - pdf_drop_obj(keyobj); - } + pdf_drop_obj(ctx, keyobj); fz_catch(ctx) - { fz_rethrow(ctx); - } } void -pdf_dict_puts_drop(pdf_obj *obj, const char *key, pdf_obj *val) +pdf_dict_puts_drop(fz_context *ctx, pdf_obj *obj, const char *key, pdf_obj *val) { pdf_document *doc = obj->doc; - fz_context *ctx = doc->ctx; pdf_obj *keyobj = NULL; fz_var(keyobj); fz_try(ctx) { - keyobj = pdf_new_name(doc, key); - pdf_dict_put(obj, keyobj, val); + keyobj = pdf_new_name(ctx, doc, key); + pdf_dict_put(ctx, obj, keyobj, val); } fz_always(ctx) { - pdf_drop_obj(keyobj); - pdf_drop_obj(val); + pdf_drop_obj(ctx, keyobj); + pdf_drop_obj(ctx, val); } fz_catch(ctx) { @@ -1115,122 +1098,113 @@ pdf_dict_puts_drop(pdf_obj *obj, const char *key, pdf_obj *val) } void -pdf_dict_putp(pdf_obj *obj, const char *keys, pdf_obj *val) +pdf_dict_putp(fz_context *ctx, pdf_obj *obj, const char *keys, pdf_obj *val) { - fz_context *ctx = obj->doc->ctx; - char buf[256]; - char *k, *e; - pdf_obj *cobj = NULL; + RESOLVE(obj); + if (obj) + { + pdf_document *doc = obj->doc; - if (strlen(keys)+1 > 256) - fz_throw(ctx, FZ_ERROR_GENERIC, "buffer overflow in pdf_dict_putp"); + char buf[256]; + char *k, *e; + pdf_obj *cobj = NULL; - strcpy(buf, keys); + if (strlen(keys)+1 > 256) + fz_throw(ctx, FZ_ERROR_GENERIC, "buffer overflow in pdf_dict_putp"); - e = buf; - while (*e) - { - k = e; - while (*e != '/' && *e != '\0') - e++; + strcpy(buf, keys); - if (*e == '/') + e = buf; + while (*e) { - *e = '\0'; - e++; - } + k = e; + while (*e != '/' && *e != '\0') + e++; - if (*e) - { - /* Not the last key in the key path. Create subdict if not already there. */ - cobj = pdf_dict_gets(obj, k); - if (cobj == NULL) + if (*e == '/') { - cobj = pdf_new_dict(obj->doc, 1); - fz_try(ctx) - { - pdf_dict_puts(obj, k, cobj); - } - fz_always(ctx) - { - pdf_drop_obj(cobj); - } - fz_catch(ctx) + *e = '\0'; + e++; + } + + if (*e) + { + /* Not the last key in the key path. Create subdict if not already there. */ + cobj = pdf_dict_gets(ctx, obj, k); + if (cobj == NULL) { - fz_rethrow(ctx); + cobj = pdf_new_dict(ctx, doc, 1); + fz_try(ctx) + pdf_dict_puts(ctx, obj, k, cobj); + fz_always(ctx) + pdf_drop_obj(ctx, cobj); + fz_catch(ctx) + fz_rethrow(ctx); } + /* Move to subdict */ + obj = cobj; } - /* Move to subdict */ - obj = cobj; - } - else - { - /* Last key. Use it to store the value */ - /* Use val = NULL to request delete */ - if (val) - pdf_dict_puts(obj, k, val); else - pdf_dict_dels(obj, k); + { + /* Last key. Use it to store the value */ + /* Use val = NULL to request delete */ + if (val) + pdf_dict_puts(ctx, obj, k, val); + else + pdf_dict_dels(ctx, obj, k); + } } } } void -pdf_dict_putp_drop(pdf_obj *obj, const char *keys, pdf_obj *val) +pdf_dict_putp_drop(fz_context *ctx, pdf_obj *obj, const char *keys, pdf_obj *val) { - fz_context *ctx = obj->doc->ctx; - fz_try(ctx) - { - pdf_dict_putp(obj, keys, val); - } + pdf_dict_putp(ctx, obj, keys, val); fz_always(ctx) - { - pdf_drop_obj(val); - } + pdf_drop_obj(ctx, val); fz_catch(ctx) - { fz_rethrow(ctx); - } } void -pdf_dict_dels(pdf_obj *obj, const char *key) +pdf_dict_dels(fz_context *ctx, pdf_obj *obj, const char *key) { RESOLVE(obj); - - if (!obj) - return; /* Can't warn :( */ - if (obj->kind != PDF_DICT) - fz_warn(obj->doc->ctx, "assert: not a dict (%s)", pdf_objkindstr(obj)); - else + if (obj) { - int i = pdf_dict_finds(obj, key, NULL); - if (i >= 0) + if (obj->kind != PDF_DICT) + fz_warn(ctx, "assert: not a dict (%s)", pdf_objkindstr(obj)); + else { - pdf_drop_obj(obj->u.d.items[i].k); - pdf_drop_obj(obj->u.d.items[i].v); - obj->flags &= ~PDF_FLAGS_SORTED; - obj->u.d.items[i] = obj->u.d.items[obj->u.d.len-1]; - obj->u.d.len --; + int i = pdf_dict_finds(ctx, obj, key, NULL); + if (i >= 0) + { + pdf_drop_obj(ctx, obj->u.d.items[i].k); + pdf_drop_obj(ctx, obj->u.d.items[i].v); + obj->flags &= ~PDF_FLAGS_SORTED; + obj->u.d.items[i] = obj->u.d.items[obj->u.d.len-1]; + obj->u.d.len --; + } } - } - object_altered(obj, NULL); + object_altered(ctx, obj, NULL); + } + return; /* Can't warn :( */ } void -pdf_dict_del(pdf_obj *obj, pdf_obj *key) +pdf_dict_del(fz_context *ctx, pdf_obj *obj, pdf_obj *key) { RESOLVE(key); - if (!key || key->kind != PDF_NAME) - fz_warn(obj->doc->ctx, "assert: key is not a name (%s)", pdf_objkindstr(obj)); - else - pdf_dict_dels(obj, key->u.n); + if (key && key->kind == PDF_NAME) + pdf_dict_dels(ctx, obj, key->u.n); + /* else Can't warn */ } void -pdf_sort_dict(pdf_obj *obj) +pdf_sort_dict(fz_context *ctx, pdf_obj *obj) { RESOLVE(obj); if (!obj || obj->kind != PDF_DICT) @@ -1243,7 +1217,7 @@ pdf_sort_dict(pdf_obj *obj) } int -pdf_obj_marked(pdf_obj *obj) +pdf_obj_marked(fz_context *ctx, pdf_obj *obj) { RESOLVE(obj); if (!obj) @@ -1252,7 +1226,7 @@ pdf_obj_marked(pdf_obj *obj) } int -pdf_mark_obj(pdf_obj *obj) +pdf_mark_obj(fz_context *ctx, pdf_obj *obj) { int marked; RESOLVE(obj); @@ -1264,7 +1238,7 @@ pdf_mark_obj(pdf_obj *obj) } void -pdf_unmark_obj(pdf_obj *obj) +pdf_unmark_obj(fz_context *ctx, pdf_obj *obj) { RESOLVE(obj); if (!obj) @@ -1273,7 +1247,7 @@ pdf_unmark_obj(pdf_obj *obj) } void -pdf_set_obj_memo(pdf_obj *obj, int memo) +pdf_set_obj_memo(fz_context *ctx, pdf_obj *obj, int memo) { obj->flags |= PDF_FLAGS_MEMO; if (memo) @@ -1283,7 +1257,7 @@ pdf_set_obj_memo(pdf_obj *obj, int memo) } int -pdf_obj_memo(pdf_obj *obj, int *memo) +pdf_obj_memo(fz_context *ctx, pdf_obj *obj, int *memo) { if (!(obj->flags & PDF_FLAGS_MEMO)) return 0; @@ -1291,7 +1265,7 @@ pdf_obj_memo(pdf_obj *obj, int *memo) return 1; } -int pdf_obj_is_dirty(pdf_obj *obj) +int pdf_obj_is_dirty(fz_context *ctx, pdf_obj *obj) { RESOLVE(obj); if (!obj) @@ -1299,7 +1273,7 @@ int pdf_obj_is_dirty(pdf_obj *obj) return !!(obj->flags & PDF_FLAGS_DIRTY); } -void pdf_dirty_obj(pdf_obj *obj) +void pdf_dirty_obj(fz_context *ctx, pdf_obj *obj) { RESOLVE(obj); if (!obj) @@ -1307,7 +1281,7 @@ void pdf_dirty_obj(pdf_obj *obj) obj->flags |= PDF_FLAGS_DIRTY; } -void pdf_clean_obj(pdf_obj *obj) +void pdf_clean_obj(fz_context *ctx, pdf_obj *obj) { if (!obj) return; @@ -1315,27 +1289,25 @@ void pdf_clean_obj(pdf_obj *obj) } static void -pdf_drop_array(pdf_obj *obj) +pdf_drop_array(fz_context *ctx, pdf_obj *obj) { - fz_context *ctx = obj->doc->ctx; int i; for (i = 0; i < obj->u.a.len; i++) - pdf_drop_obj(obj->u.a.items[i]); + pdf_drop_obj(ctx, obj->u.a.items[i]); fz_free(ctx, obj->u.a.items); fz_free(ctx, obj); } static void -pdf_drop_dict(pdf_obj *obj) +pdf_drop_dict(fz_context *ctx, pdf_obj *obj) { int i; - fz_context *ctx = obj->doc->ctx; for (i = 0; i < obj->u.d.len; i++) { - pdf_drop_obj(obj->u.d.items[i].k); - pdf_drop_obj(obj->u.d.items[i].v); + pdf_drop_obj(ctx, obj->u.d.items[i].k); + pdf_drop_obj(ctx, obj->u.d.items[i].v); } fz_free(ctx, obj->u.d.items); @@ -1343,22 +1315,23 @@ pdf_drop_dict(pdf_obj *obj) } void -pdf_drop_obj(pdf_obj *obj) +pdf_drop_obj(fz_context *ctx, pdf_obj *obj) { - if (!obj) - return; - if (--obj->refs) - return; - if (obj->kind == PDF_ARRAY) - pdf_drop_array(obj); - else if (obj->kind == PDF_DICT) - pdf_drop_dict(obj); - else - fz_free(obj->doc->ctx, obj); + if (obj) + { + if (--obj->refs) + return; + if (obj->kind == PDF_ARRAY) + pdf_drop_array(ctx, obj); + else if (obj->kind == PDF_DICT) + pdf_drop_dict(ctx, obj); + else + fz_free(ctx, obj); + } } void -pdf_set_obj_parent(pdf_obj *obj, int num) +pdf_set_obj_parent(fz_context *ctx, pdf_obj *obj, int num) { int n, i; @@ -1370,39 +1343,38 @@ pdf_set_obj_parent(pdf_obj *obj, int num) switch(obj->kind) { case PDF_ARRAY: - n = pdf_array_len(obj); + n = pdf_array_len(ctx, obj); for (i = 0; i < n; i++) - pdf_set_obj_parent(pdf_array_get(obj, i), num); + pdf_set_obj_parent(ctx, pdf_array_get(ctx, obj, i), num); break; case PDF_DICT: - n = pdf_dict_len(obj); + n = pdf_dict_len(ctx, obj); for (i = 0; i < n; i++) - pdf_set_obj_parent(pdf_dict_get_val(obj, i), num); + pdf_set_obj_parent(ctx, pdf_dict_get_val(ctx, obj, i), num); break; } } -int pdf_obj_parent_num(pdf_obj *obj) +int pdf_obj_parent_num(fz_context *ctx, pdf_obj *obj) { return obj->parent_num; } -pdf_obj *pdf_new_obj_from_str(pdf_document *doc, const char *src) +pdf_obj *pdf_new_obj_from_str(fz_context *ctx, pdf_document *doc, const char *src) { pdf_obj *result; pdf_lexbuf lexbuf; - fz_context *ctx = doc->ctx; fz_stream *stream = fz_open_memory(ctx, (unsigned char *)src, strlen(src)); pdf_lexbuf_init(ctx, &lexbuf, PDF_LEXBUF_SMALL); fz_try(ctx) { - result = pdf_parse_stm_obj(doc, stream, &lexbuf); + result = pdf_parse_stm_obj(ctx, doc, stream, &lexbuf); } fz_always(ctx) { - pdf_lexbuf_fin(&lexbuf); - fz_drop_stream(stream); + pdf_lexbuf_fin(ctx, &lexbuf); + fz_drop_stream(ctx, stream); } fz_catch(ctx) { @@ -1426,7 +1398,7 @@ struct fmt int last; }; -static void fmt_obj(struct fmt *fmt, pdf_obj *obj); +static void fmt_obj(fz_context *ctx, struct fmt *fmt, pdf_obj *obj); static inline int iswhite(int ch) { @@ -1450,11 +1422,11 @@ static inline int isdelim(int ch) ch == '%'; } -static inline void fmt_putc(struct fmt *fmt, int c) +static inline void fmt_putc(fz_context *ctx, struct fmt *fmt, int c) { if (fmt->sep && !isdelim(fmt->last) && !isdelim(c)) { fmt->sep = 0; - fmt_putc(fmt, ' '); + fmt_putc(ctx, fmt, ' '); } fmt->sep = 0; @@ -1471,201 +1443,201 @@ static inline void fmt_putc(struct fmt *fmt, int c) fmt->last = c; } -static inline void fmt_indent(struct fmt *fmt) +static inline void fmt_indent(fz_context *ctx, struct fmt *fmt) { int i = fmt->indent; while (i--) { - fmt_putc(fmt, ' '); - fmt_putc(fmt, ' '); + fmt_putc(ctx, fmt, ' '); + fmt_putc(ctx, fmt, ' '); } } -static inline void fmt_puts(struct fmt *fmt, char *s) +static inline void fmt_puts(fz_context *ctx, struct fmt *fmt, char *s) { while (*s) - fmt_putc(fmt, *s++); + fmt_putc(ctx, fmt, *s++); } -static inline void fmt_sep(struct fmt *fmt) +static inline void fmt_sep(fz_context *ctx, struct fmt *fmt) { fmt->sep = 1; } -static void fmt_str(struct fmt *fmt, pdf_obj *obj) +static void fmt_str(fz_context *ctx, struct fmt *fmt, pdf_obj *obj) { - char *s = pdf_to_str_buf(obj); - int n = pdf_to_str_len(obj); + char *s = pdf_to_str_buf(ctx, obj); + int n = pdf_to_str_len(ctx, obj); int i, c; - fmt_putc(fmt, '('); + fmt_putc(ctx, fmt, '('); for (i = 0; i < n; i++) { c = (unsigned char)s[i]; if (c == '\n') - fmt_puts(fmt, "\\n"); + fmt_puts(ctx, fmt, "\\n"); else if (c == '\r') - fmt_puts(fmt, "\\r"); + fmt_puts(ctx, fmt, "\\r"); else if (c == '\t') - fmt_puts(fmt, "\\t"); + fmt_puts(ctx, fmt, "\\t"); else if (c == '\b') - fmt_puts(fmt, "\\b"); + fmt_puts(ctx, fmt, "\\b"); else if (c == '\f') - fmt_puts(fmt, "\\f"); + fmt_puts(ctx, fmt, "\\f"); else if (c == '(') - fmt_puts(fmt, "\\("); + fmt_puts(ctx, fmt, "\\("); else if (c == ')') - fmt_puts(fmt, "\\)"); + fmt_puts(ctx, fmt, "\\)"); else if (c == '\\') - fmt_puts(fmt, "\\\\"); + fmt_puts(ctx, fmt, "\\\\"); else if (c < 32 || c >= 127) { - fmt_putc(fmt, '\\'); - fmt_putc(fmt, '0' + ((c / 64) & 7)); - fmt_putc(fmt, '0' + ((c / 8) & 7)); - fmt_putc(fmt, '0' + ((c) & 7)); + fmt_putc(ctx, fmt, '\\'); + fmt_putc(ctx, fmt, '0' + ((c / 64) & 7)); + fmt_putc(ctx, fmt, '0' + ((c / 8) & 7)); + fmt_putc(ctx, fmt, '0' + ((c) & 7)); } else - fmt_putc(fmt, c); + fmt_putc(ctx, fmt, c); } - fmt_putc(fmt, ')'); + fmt_putc(ctx, fmt, ')'); } -static void fmt_hex(struct fmt *fmt, pdf_obj *obj) +static void fmt_hex(fz_context *ctx, struct fmt *fmt, pdf_obj *obj) { - char *s = pdf_to_str_buf(obj); - int n = pdf_to_str_len(obj); + char *s = pdf_to_str_buf(ctx, obj); + int n = pdf_to_str_len(ctx, obj); int i, b, c; - fmt_putc(fmt, '<'); + fmt_putc(ctx, fmt, '<'); for (i = 0; i < n; i++) { b = (unsigned char) s[i]; c = (b >> 4) & 0x0f; - fmt_putc(fmt, c < 0xA ? c + '0' : c + 'A' - 0xA); + fmt_putc(ctx, fmt, c < 0xA ? c + '0' : c + 'A' - 0xA); c = (b) & 0x0f; - fmt_putc(fmt, c < 0xA ? c + '0' : c + 'A' - 0xA); + fmt_putc(ctx, fmt, c < 0xA ? c + '0' : c + 'A' - 0xA); } - fmt_putc(fmt, '>'); + fmt_putc(ctx, fmt, '>'); } -static void fmt_name(struct fmt *fmt, pdf_obj *obj) +static void fmt_name(fz_context *ctx, struct fmt *fmt, pdf_obj *obj) { - unsigned char *s = (unsigned char *) pdf_to_name(obj); + unsigned char *s = (unsigned char *) pdf_to_name(ctx, obj); int i, c; - fmt_putc(fmt, '/'); + fmt_putc(ctx, fmt, '/'); for (i = 0; s[i]; i++) { if (isdelim(s[i]) || iswhite(s[i]) || s[i] == '#' || s[i] < 32 || s[i] >= 127) { - fmt_putc(fmt, '#'); + fmt_putc(ctx, fmt, '#'); c = (s[i] >> 4) & 0xf; - fmt_putc(fmt, c < 0xA ? c + '0' : c + 'A' - 0xA); + fmt_putc(ctx, fmt, c < 0xA ? c + '0' : c + 'A' - 0xA); c = s[i] & 0xf; - fmt_putc(fmt, c < 0xA ? c + '0' : c + 'A' - 0xA); + fmt_putc(ctx, fmt, c < 0xA ? c + '0' : c + 'A' - 0xA); } else { - fmt_putc(fmt, s[i]); + fmt_putc(ctx, fmt, s[i]); } } } -static void fmt_array(struct fmt *fmt, pdf_obj *obj) +static void fmt_array(fz_context *ctx, struct fmt *fmt, pdf_obj *obj) { int i, n; - n = pdf_array_len(obj); + n = pdf_array_len(ctx, obj); if (fmt->tight) { - fmt_putc(fmt, '['); + fmt_putc(ctx, fmt, '['); for (i = 0; i < n; i++) { - fmt_obj(fmt, pdf_array_get(obj, i)); - fmt_sep(fmt); + fmt_obj(ctx, fmt, pdf_array_get(ctx, obj, i)); + fmt_sep(ctx, fmt); } - fmt_putc(fmt, ']'); + fmt_putc(ctx, fmt, ']'); } else { - fmt_puts(fmt, "[ "); + fmt_puts(ctx, fmt, "[ "); for (i = 0; i < n; i++) { if (fmt->col > 60) { - fmt_putc(fmt, '\n'); - fmt_indent(fmt); + fmt_putc(ctx, fmt, '\n'); + fmt_indent(ctx, fmt); } - fmt_obj(fmt, pdf_array_get(obj, i)); - fmt_putc(fmt, ' '); + fmt_obj(ctx, fmt, pdf_array_get(ctx, obj, i)); + fmt_putc(ctx, fmt, ' '); } - fmt_putc(fmt, ']'); - fmt_sep(fmt); + fmt_putc(ctx, fmt, ']'); + fmt_sep(ctx, fmt); } } -static void fmt_dict(struct fmt *fmt, pdf_obj *obj) +static void fmt_dict(fz_context *ctx, struct fmt *fmt, pdf_obj *obj) { int i, n; pdf_obj *key, *val; - n = pdf_dict_len(obj); + n = pdf_dict_len(ctx, obj); if (fmt->tight) { - fmt_puts(fmt, "<<"); + fmt_puts(ctx, fmt, "<<"); for (i = 0; i < n; i++) { - fmt_obj(fmt, pdf_dict_get_key(obj, i)); - fmt_sep(fmt); - fmt_obj(fmt, pdf_dict_get_val(obj, i)); - fmt_sep(fmt); + fmt_obj(ctx, fmt, pdf_dict_get_key(ctx, obj, i)); + fmt_sep(ctx, fmt); + fmt_obj(ctx, fmt, pdf_dict_get_val(ctx, obj, i)); + fmt_sep(ctx, fmt); } - fmt_puts(fmt, ">>"); + fmt_puts(ctx, fmt, ">>"); } else { - fmt_puts(fmt, "<<\n"); + fmt_puts(ctx, fmt, "<<\n"); fmt->indent ++; for (i = 0; i < n; i++) { - key = pdf_dict_get_key(obj, i); - val = pdf_dict_get_val(obj, i); - fmt_indent(fmt); - fmt_obj(fmt, key); - fmt_putc(fmt, ' '); - if (!pdf_is_indirect(val) && pdf_is_array(val)) + key = pdf_dict_get_key(ctx, obj, i); + val = pdf_dict_get_val(ctx, obj, i); + fmt_indent(ctx, fmt); + fmt_obj(ctx, fmt, key); + fmt_putc(ctx, fmt, ' '); + if (!pdf_is_indirect(ctx, val) && pdf_is_array(ctx, val)) fmt->indent ++; - fmt_obj(fmt, val); - fmt_putc(fmt, '\n'); - if (!pdf_is_indirect(val) && pdf_is_array(val)) + fmt_obj(ctx, fmt, val); + fmt_putc(ctx, fmt, '\n'); + if (!pdf_is_indirect(ctx, val) && pdf_is_array(ctx, val)) fmt->indent --; } fmt->indent --; - fmt_indent(fmt); - fmt_puts(fmt, ">>"); + fmt_indent(ctx, fmt); + fmt_puts(ctx, fmt, ">>"); } } -static void fmt_obj(struct fmt *fmt, pdf_obj *obj) +static void fmt_obj(fz_context *ctx, struct fmt *fmt, pdf_obj *obj) { char buf[256]; if (!obj) - fmt_puts(fmt, "<NULL>"); - else if (pdf_is_indirect(obj)) + fmt_puts(ctx, fmt, "<NULL>"); + else if (pdf_is_indirect(ctx, obj)) { - fz_snprintf(buf, sizeof buf, "%d %d R", pdf_to_num(obj), pdf_to_gen(obj)); - fmt_puts(fmt, buf); - } - else if (pdf_is_null(obj)) - fmt_puts(fmt, "null"); - else if (pdf_is_bool(obj)) - fmt_puts(fmt, pdf_to_bool(obj) ? "true" : "false"); - else if (pdf_is_int(obj)) + fz_snprintf(buf, sizeof buf, "%d %d R", pdf_to_num(ctx, obj), pdf_to_gen(ctx, obj)); + fmt_puts(ctx, fmt, buf); + } + else if (pdf_is_null(ctx, obj)) + fmt_puts(ctx, fmt, "null"); + else if (pdf_is_bool(ctx, obj)) + fmt_puts(ctx, fmt, pdf_to_bool(ctx, obj) ? "true" : "false"); + else if (pdf_is_int(ctx, obj)) { - fz_snprintf(buf, sizeof buf, "%d", pdf_to_int(obj)); - fmt_puts(fmt, buf); + fz_snprintf(buf, sizeof buf, "%d", pdf_to_int(ctx, obj)); + fmt_puts(ctx, fmt, buf); } - else if (pdf_is_real(obj)) + else if (pdf_is_real(ctx, obj)) { - fz_snprintf(buf, sizeof buf, "%g", pdf_to_real(obj)); - fmt_puts(fmt, buf); + fz_snprintf(buf, sizeof buf, "%g", pdf_to_real(ctx, obj)); + fmt_puts(ctx, fmt, buf); } - else if (pdf_is_string(obj)) + else if (pdf_is_string(ctx, obj)) { - char *str = pdf_to_str_buf(obj); - int len = pdf_to_str_len(obj); + char *str = pdf_to_str_buf(ctx, obj); + int len = pdf_to_str_len(ctx, obj); int added = 0; int i, c; for (i = 0; i < len; i++) { @@ -1676,22 +1648,22 @@ static void fmt_obj(struct fmt *fmt, pdf_obj *obj) added += 3; } if (added < len) - fmt_str(fmt, obj); + fmt_str(ctx, fmt, obj); else - fmt_hex(fmt, obj); - } - else if (pdf_is_name(obj)) - fmt_name(fmt, obj); - else if (pdf_is_array(obj)) - fmt_array(fmt, obj); - else if (pdf_is_dict(obj)) - fmt_dict(fmt, obj); + fmt_hex(ctx, fmt, obj); + } + else if (pdf_is_name(ctx, obj)) + fmt_name(ctx, fmt, obj); + else if (pdf_is_array(ctx, obj)) + fmt_array(ctx, fmt, obj); + else if (pdf_is_dict(ctx, obj)) + fmt_dict(ctx, fmt, obj); else - fmt_puts(fmt, "<unknown object>"); + fmt_puts(ctx, fmt, "<unknown object>"); } int -pdf_sprint_obj(char *s, int n, pdf_obj *obj, int tight) +pdf_sprint_obj(fz_context *ctx, char *s, int n, pdf_obj *obj, int tight) { struct fmt fmt; @@ -1704,7 +1676,7 @@ pdf_sprint_obj(char *s, int n, pdf_obj *obj, int tight) fmt.buf = s; fmt.cap = n; fmt.len = 0; - fmt_obj(&fmt, obj); + fmt_obj(ctx, &fmt, obj); if (fmt.buf && fmt.len < fmt.cap) fmt.buf[fmt.len] = '\0'; @@ -1713,67 +1685,67 @@ pdf_sprint_obj(char *s, int n, pdf_obj *obj, int tight) } int -pdf_fprint_obj(FILE *fp, pdf_obj *obj, int tight) +pdf_fprint_obj(fz_context *ctx, FILE *fp, pdf_obj *obj, int tight) { char buf[1024]; char *ptr; int n; - n = pdf_sprint_obj(NULL, 0, obj, tight); + n = pdf_sprint_obj(ctx, NULL, 0, obj, tight); if ((n + 1) < sizeof buf) { - pdf_sprint_obj(buf, sizeof buf, obj, tight); + pdf_sprint_obj(ctx, buf, sizeof buf, obj, tight); fputs(buf, fp); fputc('\n', fp); } else { - ptr = fz_malloc(obj->doc->ctx, n + 1); - pdf_sprint_obj(ptr, n + 1, obj, tight); + ptr = fz_malloc(ctx, n + 1); + pdf_sprint_obj(ctx, ptr, n + 1, obj, tight); fputs(ptr, fp); fputc('\n', fp); - fz_free(obj->doc->ctx, ptr); + fz_free(ctx, ptr); } return n; } -int pdf_output_obj(fz_output *out, pdf_obj *obj, int tight) +int pdf_output_obj(fz_context *ctx, fz_output *out, pdf_obj *obj, int tight) { char buf[1024]; char *ptr; int n; - n = pdf_sprint_obj(NULL, 0, obj, tight); + n = pdf_sprint_obj(ctx, NULL, 0, obj, tight); if ((n + 1) < sizeof buf) { - pdf_sprint_obj(buf, sizeof buf, obj, tight); - fz_printf(out, "%s\n", buf); + pdf_sprint_obj(ctx, buf, sizeof buf, obj, tight); + fz_printf(ctx, out, "%s\n", buf); } else { - ptr = fz_malloc(obj->doc->ctx, n + 1); - pdf_sprint_obj(ptr, n + 1, obj, tight); - fz_printf(out, "%s\n", ptr); - fz_free(obj->doc->ctx, ptr); + ptr = fz_malloc(ctx, n + 1); + pdf_sprint_obj(ctx, ptr, n + 1, obj, tight); + fz_printf(ctx, out, "%s\n", ptr); + fz_free(ctx, ptr); } return n; } #ifndef NDEBUG void -pdf_print_obj(pdf_obj *obj) +pdf_print_obj(fz_context *ctx, pdf_obj *obj) { - pdf_fprint_obj(stdout, obj, 0); + pdf_fprint_obj(ctx, stdout, obj, 0); } void -pdf_print_ref(pdf_obj *ref) +pdf_print_ref(fz_context *ctx, pdf_obj *ref) { - pdf_print_obj(pdf_resolve_indirect(ref)); + pdf_print_obj(ctx, pdf_resolve_indirect(ctx, ref)); } #endif -int pdf_obj_refs(pdf_obj *ref) +int pdf_obj_refs(fz_context *ctx, pdf_obj *ref) { return (ref ? ref->refs : 0); } diff --git a/source/pdf/pdf-op-buffer.c b/source/pdf/pdf-op-buffer.c index 6142620c..e2bbd343 100644 --- a/source/pdf/pdf-op-buffer.c +++ b/source/pdf/pdf-op-buffer.c @@ -9,18 +9,18 @@ typedef struct pdf_buffer_state_s pdf_buffer_state; static void -put_hexstring(pdf_csi *csi, fz_output *out) +put_hexstring(fz_context *ctx, fz_output *out, pdf_csi *csi) { int i; - fz_printf(out, "<"); + fz_printf(ctx, out, "<"); for (i = 0; i < csi->string_len; i++) - fz_printf(out, "%02x", csi->string[i]); - fz_printf(out, ">"); + fz_printf(ctx, out, "%02x", csi->string[i]); + fz_printf(ctx, out, ">"); } static void -put_string(pdf_csi *csi, fz_output *out) +put_string(fz_context *ctx, fz_output *out, pdf_csi *csi) { int i; @@ -28,40 +28,40 @@ put_string(pdf_csi *csi, fz_output *out) if (csi->string[i] < 32 || csi->string[i] >= 127) break; if (i < csi->string_len) - put_hexstring(csi, out); + put_hexstring(ctx, out, csi); else { - fz_printf(out, "("); + fz_printf(ctx, out, "("); for (i = 0; i < csi->string_len; i++) { char c = csi->string[i]; switch (c) { case '(': - fz_printf(out, "\\("); + fz_printf(ctx, out, "\\("); break; case ')': - fz_printf(out, "\\)"); + fz_printf(ctx, out, "\\)"); break; case '\\': - fz_printf(out, "\\\\"); + fz_printf(ctx, out, "\\\\"); break; default: - fz_printf(out, "%c", csi->string[i]); + fz_printf(ctx, out, "%c", csi->string[i]); break; } } - fz_printf(out, ")"); + fz_printf(ctx, out, ")"); } } static void -put_string_or_obj(pdf_csi *csi, fz_output *out) +put_string_or_obj(fz_context *ctx, fz_output *out, pdf_csi *csi) { if (csi->string_len) - put_string(csi, out); + put_string(ctx, out, csi); else - pdf_output_obj(out, csi->obj, 1); + pdf_output_obj(ctx, out, csi->obj, 1); } static void @@ -69,9 +69,9 @@ pdf_buffer_dquote(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "%f %f ", csi->stack[0], csi->stack[1]); - put_string_or_obj(csi, state->out); - fz_printf(state->out, " \"\n"); + fz_printf(state->ctx, state->out, "%f %f ", csi->stack[0], csi->stack[1]); + put_string_or_obj(state->ctx, state->out, csi); + fz_printf(state->ctx, state->out, " \"\n"); } static void @@ -79,8 +79,8 @@ pdf_buffer_squote(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - put_string_or_obj(csi, state->out); - fz_printf(state->out, " \'\n"); + put_string_or_obj(state->ctx, state->out, csi); + fz_printf(state->ctx, state->out, " \'\n"); } static void @@ -88,7 +88,7 @@ pdf_buffer_B(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "B\n"); + fz_printf(state->ctx, state->out, "B\n"); } static void @@ -96,7 +96,7 @@ pdf_buffer_Bstar(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "B*\n"); + fz_printf(state->ctx, state->out, "B*\n"); } static void @@ -104,9 +104,9 @@ pdf_buffer_BDC(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "/%s ", csi->name); - pdf_output_obj(state->out, csi->obj, 1); - fz_printf(state->out, " BDC\n"); + fz_printf(state->ctx, state->out, "/%s ", csi->name); + pdf_output_obj(state->ctx, state->out, csi->obj, 1); + fz_printf(state->ctx, state->out, " BDC\n"); } static void @@ -120,7 +120,7 @@ pdf_buffer_BI(pdf_csi *csi, void *state_) const char *match; const char *match2; pdf_obj *filter; - fz_context *ctx = csi->doc->ctx; + fz_context *ctx = csi->ctx; if (csi->img == NULL) return; @@ -163,44 +163,44 @@ pdf_buffer_BI(pdf_csi *csi, void *state_) return; } - filter = pdf_dict_gets(csi->obj, "Filter"); + filter = pdf_dict_gets(ctx, csi->obj, "Filter"); if (filter == NULL) - filter = pdf_dict_gets(csi->obj, "F"); + filter = pdf_dict_gets(ctx, csi->obj, "F"); if (match == NULL) { /* Remove any filter entry (e.g. Ascii85Decode) */ if (filter) { - pdf_dict_dels(csi->obj, "Filter"); - pdf_dict_dels(csi->obj, "F"); + pdf_dict_dels(ctx, csi->obj, "Filter"); + pdf_dict_dels(ctx, csi->obj, "F"); } - pdf_dict_dels(csi->obj, "DecodeParms"); - pdf_dict_dels(csi->obj, "DP"); + pdf_dict_dels(ctx, csi->obj, "DecodeParms"); + pdf_dict_dels(ctx, csi->obj, "DP"); } - else if (pdf_is_array(filter)) + else if (pdf_is_array(ctx, filter)) { - int l = pdf_array_len(filter); - pdf_obj *o = (l == 0 ? NULL : pdf_array_get(filter, l-1)); - const char *fil = pdf_to_name(o); + int l = pdf_array_len(ctx, filter); + pdf_obj *o = (l == 0 ? NULL : pdf_array_get(ctx, filter, l-1)); + const char *fil = pdf_to_name(ctx, o); if (l == 0 || (strcmp(fil, match) && strcmp(fil, match2))) { fz_warn(ctx, "Unexpected Filter configuration in inline image"); return; } - pdf_dict_puts(csi->obj, "F", o); + pdf_dict_puts(ctx, csi->obj, "F", o); - o = pdf_dict_gets(csi->obj, "DecodeParms"); + o = pdf_dict_gets(ctx, csi->obj, "DecodeParms"); if (o == NULL) - o = pdf_dict_gets(csi->obj, "DP"); + o = pdf_dict_gets(ctx, csi->obj, "DP"); if (o) { - o = pdf_array_get(o, l-1); + o = pdf_array_get(ctx, o, l-1); if (o) - pdf_dict_puts(csi->obj, "DP", o); + pdf_dict_puts(ctx, csi->obj, "DP", o); else - pdf_dict_dels(csi->obj, "DP"); - pdf_dict_dels(csi->obj, "DecodeParms"); + pdf_dict_dels(ctx, csi->obj, "DP"); + pdf_dict_dels(ctx, csi->obj, "DecodeParms"); } } else @@ -208,25 +208,25 @@ pdf_buffer_BI(pdf_csi *csi, void *state_) /* It's a singleton. It must be correct */ } - fz_printf(state->out, "BI\n"); + fz_printf(state->ctx, state->out, "BI\n"); - len = pdf_dict_len(csi->obj); + len = pdf_dict_len(ctx, csi->obj); for (i = 0; i < len; i++) { - pdf_output_obj(state->out, pdf_dict_get_key(csi->obj, i), 1); - pdf_output_obj(state->out, pdf_dict_get_val(csi->obj, i), 1); + pdf_output_obj(state->ctx, state->out, pdf_dict_get_key(ctx, csi->obj, i), 1); + pdf_output_obj(state->ctx, state->out, pdf_dict_get_val(ctx, csi->obj, i), 1); } - fz_printf(state->out, "ID\n"); + fz_printf(state->ctx, state->out, "ID\n"); buffer = csi->img->buffer->buffer; len = buffer->len; data = buffer->data; for (i = 0; i < len; i++) { - fz_printf(state->out, "%c", data[i]); + fz_printf(state->ctx, state->out, "%c", data[i]); } - fz_printf(state->out, "\nEI\n"); + fz_printf(state->ctx, state->out, "\nEI\n"); } static void @@ -234,7 +234,7 @@ pdf_buffer_BMC(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "/%s BMC\n", csi->name); + fz_printf(state->ctx, state->out, "/%s BMC\n", csi->name); } static void @@ -242,7 +242,7 @@ pdf_buffer_BT(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "BT\n"); + fz_printf(state->ctx, state->out, "BT\n"); } static void @@ -250,7 +250,7 @@ pdf_buffer_BX(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "BX\n"); + fz_printf(state->ctx, state->out, "BX\n"); } static void @@ -258,7 +258,7 @@ pdf_buffer_CS(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "/%s CS\n", csi->name); + fz_printf(state->ctx, state->out, "/%s CS\n", csi->name); } static void @@ -266,9 +266,9 @@ pdf_buffer_DP(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "/%s ", csi->name); - pdf_output_obj(state->out, csi->obj, 1); - fz_printf(state->out, " DP\n"); + fz_printf(state->ctx, state->out, "/%s ", csi->name); + pdf_output_obj(state->ctx, state->out, csi->obj, 1); + fz_printf(state->ctx, state->out, " DP\n"); } static void @@ -276,7 +276,7 @@ pdf_buffer_EMC(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "EMC\n"); + fz_printf(state->ctx, state->out, "EMC\n"); } static void @@ -284,7 +284,7 @@ pdf_buffer_ET(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "ET\n"); + fz_printf(state->ctx, state->out, "ET\n"); } static void @@ -292,7 +292,7 @@ pdf_buffer_EX(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "EX\n"); + fz_printf(state->ctx, state->out, "EX\n"); } static void @@ -300,7 +300,7 @@ pdf_buffer_F(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "F\n"); + fz_printf(state->ctx, state->out, "F\n"); } static void @@ -308,7 +308,7 @@ pdf_buffer_G(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "%f G\n", csi->stack[0]); + fz_printf(state->ctx, state->out, "%f G\n", csi->stack[0]); } static void @@ -316,7 +316,7 @@ pdf_buffer_J(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "%d J\n", (int)csi->stack[0]); + fz_printf(state->ctx, state->out, "%d J\n", (int)csi->stack[0]); } static void @@ -324,7 +324,7 @@ pdf_buffer_K(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "%f %f %f %f K\n", csi->stack[0], + fz_printf(state->ctx, state->out, "%f %f %f %f K\n", csi->stack[0], csi->stack[1], csi->stack[2], csi->stack[3]); } @@ -333,7 +333,7 @@ pdf_buffer_M(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "%f M\n", csi->stack[0]); + fz_printf(state->ctx, state->out, "%f M\n", csi->stack[0]); } static void @@ -341,7 +341,7 @@ pdf_buffer_MP(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "/%s MP\n", csi->name); + fz_printf(state->ctx, state->out, "/%s MP\n", csi->name); } static void @@ -349,7 +349,7 @@ pdf_buffer_Q(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "Q\n"); + fz_printf(state->ctx, state->out, "Q\n"); } static void @@ -357,7 +357,7 @@ pdf_buffer_RG(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "%f %f %f RG\n", csi->stack[0], csi->stack[1], csi->stack[2]); + fz_printf(state->ctx, state->out, "%f %f %f RG\n", csi->stack[0], csi->stack[1], csi->stack[2]); } static void @@ -365,7 +365,7 @@ pdf_buffer_S(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "S\n"); + fz_printf(state->ctx, state->out, "S\n"); } static void @@ -375,8 +375,8 @@ pdf_buffer_SC(pdf_csi *csi, void *state_) int i; for (i = 0; i < csi->top; i++) - fz_printf(state->out, "%f ", csi->stack[i]); - fz_printf(state->out, "SC\n"); + fz_printf(state->ctx, state->out, "%f ", csi->stack[i]); + fz_printf(state->ctx, state->out, "SC\n"); } static void @@ -386,10 +386,10 @@ pdf_buffer_SCN(pdf_csi *csi, void *state_) int i; for (i = 0; i < csi->top; i++) - fz_printf(state->out, "%f ", csi->stack[i]); + fz_printf(state->ctx, state->out, "%f ", csi->stack[i]); if (csi->name[0]) - fz_printf(state->out, "/%s ", csi->name); - fz_printf(state->out, "SCN\n"); + fz_printf(state->ctx, state->out, "/%s ", csi->name); + fz_printf(state->ctx, state->out, "SCN\n"); } static void @@ -397,7 +397,7 @@ pdf_buffer_Tstar(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "T*\n"); + fz_printf(state->ctx, state->out, "T*\n"); } static void @@ -405,7 +405,7 @@ pdf_buffer_TD(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "%f %f TD\n", csi->stack[0], csi->stack[1]); + fz_printf(state->ctx, state->out, "%f %f TD\n", csi->stack[0], csi->stack[1]); } static void @@ -413,8 +413,8 @@ pdf_buffer_TJ(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - pdf_output_obj(state->out, csi->obj, 1); - fz_printf(state->out, " TJ\n"); + pdf_output_obj(state->ctx, state->out, csi->obj, 1); + fz_printf(state->ctx, state->out, " TJ\n"); } static void @@ -422,7 +422,7 @@ pdf_buffer_TL(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "%f TL\n", csi->stack[0]); + fz_printf(state->ctx, state->out, "%f TL\n", csi->stack[0]); } static void @@ -430,7 +430,7 @@ pdf_buffer_Tc(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "%f Tc\n", csi->stack[0]); + fz_printf(state->ctx, state->out, "%f Tc\n", csi->stack[0]); } static void @@ -438,7 +438,7 @@ pdf_buffer_Td(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "%f %f Td\n", csi->stack[0], csi->stack[1]); + fz_printf(state->ctx, state->out, "%f %f Td\n", csi->stack[0], csi->stack[1]); } static void @@ -446,8 +446,8 @@ pdf_buffer_Tj(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - put_string_or_obj(csi, state->out); - fz_printf(state->out, " Tj\n"); + put_string_or_obj(state->ctx, state->out, csi); + fz_printf(state->ctx, state->out, " Tj\n"); } static void @@ -455,7 +455,7 @@ pdf_buffer_Tm(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "%f %f %f %f %f %f Tm\n", + fz_printf(state->ctx, state->out, "%f %f %f %f %f %f Tm\n", csi->stack[0], csi->stack[1], csi->stack[2], csi->stack[3], csi->stack[4], csi->stack[5]); } @@ -465,7 +465,7 @@ pdf_buffer_Tr(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "%f Tr\n", csi->stack[0]); + fz_printf(state->ctx, state->out, "%f Tr\n", csi->stack[0]); } static void @@ -473,7 +473,7 @@ pdf_buffer_Ts(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "%f Ts\n", csi->stack[0]); + fz_printf(state->ctx, state->out, "%f Ts\n", csi->stack[0]); } static void @@ -481,7 +481,7 @@ pdf_buffer_Tw(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "%f Tw\n", csi->stack[0]); + fz_printf(state->ctx, state->out, "%f Tw\n", csi->stack[0]); } static void @@ -489,7 +489,7 @@ pdf_buffer_Tz(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "%f Tz\n", csi->stack[0]); + fz_printf(state->ctx, state->out, "%f Tz\n", csi->stack[0]); } static void @@ -497,7 +497,7 @@ pdf_buffer_W(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "W\n"); + fz_printf(state->ctx, state->out, "W\n"); } static void @@ -505,7 +505,7 @@ pdf_buffer_Wstar(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "W*\n"); + fz_printf(state->ctx, state->out, "W*\n"); } static void @@ -513,7 +513,7 @@ pdf_buffer_b(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "b\n"); + fz_printf(state->ctx, state->out, "b\n"); } static void @@ -521,7 +521,7 @@ pdf_buffer_bstar(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "b*\n"); + fz_printf(state->ctx, state->out, "b*\n"); } static void @@ -529,7 +529,7 @@ pdf_buffer_c(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "%f %f %f %f %f %f c\n", + fz_printf(state->ctx, state->out, "%f %f %f %f %f %f c\n", csi->stack[0], csi->stack[1], csi->stack[2], csi->stack[3], csi->stack[4], csi->stack[5]); } @@ -539,7 +539,7 @@ pdf_buffer_cm(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "%f %f %f %f %f %f cm\n", + fz_printf(state->ctx, state->out, "%f %f %f %f %f %f cm\n", csi->stack[0], csi->stack[1], csi->stack[2], csi->stack[3], csi->stack[4], csi->stack[5]); } @@ -549,7 +549,7 @@ pdf_buffer_cs(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "/%s cs\n", csi->name); + fz_printf(state->ctx, state->out, "/%s cs\n", csi->name); } static void @@ -557,8 +557,8 @@ pdf_buffer_d(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - pdf_output_obj(state->out, csi->obj, 1); - fz_printf(state->out, " %f d\n", csi->stack[0]); + pdf_output_obj(state->ctx, state->out, csi->obj, 1); + fz_printf(state->ctx, state->out, " %f d\n", csi->stack[0]); } static void @@ -566,7 +566,7 @@ pdf_buffer_d0(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "%f %f d0\n", csi->stack[0], csi->stack[1]); + fz_printf(state->ctx, state->out, "%f %f d0\n", csi->stack[0], csi->stack[1]); } static void @@ -574,7 +574,7 @@ pdf_buffer_d1(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "%f %f %f %f %f %f d1\n", + fz_printf(state->ctx, state->out, "%f %f %f %f %f %f d1\n", csi->stack[0], csi->stack[1], csi->stack[2], csi->stack[3], csi->stack[4], csi->stack[5]); } @@ -584,7 +584,7 @@ pdf_buffer_f(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "f\n"); + fz_printf(state->ctx, state->out, "f\n"); } static void @@ -592,7 +592,7 @@ pdf_buffer_fstar(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "f*\n"); + fz_printf(state->ctx, state->out, "f*\n"); } static void @@ -600,7 +600,7 @@ pdf_buffer_g(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "%f g\n", csi->stack[0]); + fz_printf(state->ctx, state->out, "%f g\n", csi->stack[0]); } static void @@ -608,7 +608,7 @@ pdf_buffer_h(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "h\n"); + fz_printf(state->ctx, state->out, "h\n"); } static void @@ -616,7 +616,7 @@ pdf_buffer_i(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "%f i\n", csi->stack[0]); + fz_printf(state->ctx, state->out, "%f i\n", csi->stack[0]); } static void @@ -624,7 +624,7 @@ pdf_buffer_j(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "%d j\n", (int)csi->stack[0]); + fz_printf(state->ctx, state->out, "%d j\n", (int)csi->stack[0]); } static void @@ -632,7 +632,7 @@ pdf_buffer_k(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "%f %f %f %f k\n", csi->stack[0], + fz_printf(state->ctx, state->out, "%f %f %f %f k\n", csi->stack[0], csi->stack[1], csi->stack[2], csi->stack[3]); } @@ -641,7 +641,7 @@ pdf_buffer_l(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "%f %f l\n", csi->stack[0], csi->stack[1]); + fz_printf(state->ctx, state->out, "%f %f l\n", csi->stack[0], csi->stack[1]); } static void @@ -649,7 +649,7 @@ pdf_buffer_m(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "%f %f m\n", csi->stack[0], csi->stack[1]); + fz_printf(state->ctx, state->out, "%f %f m\n", csi->stack[0], csi->stack[1]); } static void @@ -657,7 +657,7 @@ pdf_buffer_n(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "n\n"); + fz_printf(state->ctx, state->out, "n\n"); } static void @@ -665,7 +665,7 @@ pdf_buffer_q(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "q\n"); + fz_printf(state->ctx, state->out, "q\n"); } static void @@ -673,7 +673,7 @@ pdf_buffer_re(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "%f %f %f %f re\n", csi->stack[0], + fz_printf(state->ctx, state->out, "%f %f %f %f re\n", csi->stack[0], csi->stack[1], csi->stack[2], csi->stack[3]); } @@ -682,7 +682,7 @@ pdf_buffer_rg(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "%f %f %f rg\n", + fz_printf(state->ctx, state->out, "%f %f %f rg\n", csi->stack[0], csi->stack[1], csi->stack[2]); } @@ -691,7 +691,7 @@ pdf_buffer_ri(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "/%s ri\n", csi->name); + fz_printf(state->ctx, state->out, "/%s ri\n", csi->name); } static void @@ -699,7 +699,7 @@ pdf_buffer_s(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "s\n"); + fz_printf(state->ctx, state->out, "s\n"); } static void @@ -709,8 +709,8 @@ pdf_buffer_sc(pdf_csi *csi, void *state_) int i; for (i = 0; i < csi->top; i++) - fz_printf(state->out, "%f ", csi->stack[i]); - fz_printf(state->out, "sc\n"); + fz_printf(state->ctx, state->out, "%f ", csi->stack[i]); + fz_printf(state->ctx, state->out, "sc\n"); } static void @@ -720,10 +720,10 @@ pdf_buffer_scn(pdf_csi *csi, void *state_) int i; for (i = 0; i < csi->top; i++) - fz_printf(state->out, "%f ", csi->stack[i]); + fz_printf(state->ctx, state->out, "%f ", csi->stack[i]); if (csi->name[0]) - fz_printf(state->out, "/%s ", csi->name); - fz_printf(state->out, "scn\n"); + fz_printf(state->ctx, state->out, "/%s ", csi->name); + fz_printf(state->ctx, state->out, "scn\n"); } static void @@ -731,7 +731,7 @@ pdf_buffer_v(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "%f %f %f %f v\n", csi->stack[0], + fz_printf(state->ctx, state->out, "%f %f %f %f v\n", csi->stack[0], csi->stack[1], csi->stack[2], csi->stack[3]); } @@ -740,7 +740,7 @@ pdf_buffer_w(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "%f w\n", csi->stack[0]); + fz_printf(state->ctx, state->out, "%f w\n", csi->stack[0]); } static void @@ -748,7 +748,7 @@ pdf_buffer_y(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "%f %f %f %f y\n", csi->stack[0], + fz_printf(state->ctx, state->out, "%f %f %f %f y\n", csi->stack[0], csi->stack[1], csi->stack[2], csi->stack[3]); } @@ -757,7 +757,7 @@ pdf_buffer_Do(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "/%s Do\n", csi->name); + fz_printf(state->ctx, state->out, "/%s Do\n", csi->name); } static void @@ -765,7 +765,7 @@ pdf_buffer_Tf(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "/%s %f Tf\n", csi->name, csi->stack[0]); + fz_printf(state->ctx, state->out, "/%s %f Tf\n", csi->name, csi->stack[0]); } static void @@ -773,7 +773,7 @@ pdf_buffer_gs(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "/%s gs\n", csi->name); + fz_printf(state->ctx, state->out, "/%s gs\n", csi->name); } static void @@ -781,27 +781,26 @@ pdf_buffer_sh(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_printf(state->out, "/%s sh\n", csi->name); + fz_printf(state->ctx, state->out, "/%s sh\n", csi->name); } static void free_processor_buffer(pdf_csi *csi, void *state_) { pdf_buffer_state *state = (pdf_buffer_state *)state_; - fz_context *ctx = state->ctx; - fz_drop_output(state->out); - fz_free(ctx, state); + fz_drop_output(state->ctx, state->out); + fz_free(state->ctx, state); } static void process_annot(pdf_csi *csi, void *state, pdf_obj *resources, pdf_annot *annot) { - fz_context *ctx = csi->doc->ctx; + fz_context *ctx = csi->ctx; pdf_xobject *xobj = annot->ap; /* Avoid infinite recursion */ - if (xobj == NULL || pdf_mark_obj(xobj->me)) + if (xobj == NULL || pdf_mark_obj(ctx, xobj->me)) return; fz_try(ctx) @@ -813,7 +812,7 @@ process_annot(pdf_csi *csi, void *state, pdf_obj *resources, pdf_annot *annot) } fz_always(ctx) { - pdf_unmark_obj(xobj->me); + pdf_unmark_obj(ctx, xobj->me); } fz_catch(ctx) { @@ -914,7 +913,7 @@ static const pdf_processor pdf_processor_buffer = process_contents }; -pdf_process *pdf_process_buffer(pdf_process *process, fz_context *ctx, fz_buffer *buffer) +pdf_process *pdf_init_process_buffer(fz_context *ctx, pdf_process *process, fz_buffer *buffer) { fz_output *out = fz_new_output_with_buffer(ctx, buffer); pdf_buffer_state *p = NULL; @@ -930,7 +929,7 @@ pdf_process *pdf_process_buffer(pdf_process *process, fz_context *ctx, fz_buffer } fz_catch(ctx) { - fz_drop_output(out); + fz_drop_output(ctx, out); fz_rethrow(ctx); } diff --git a/source/pdf/pdf-op-filter.c b/source/pdf/pdf-op-filter.c index 17bd3af0..ec08b305 100644 --- a/source/pdf/pdf-op-filter.c +++ b/source/pdf/pdf-op-filter.c @@ -47,21 +47,22 @@ typedef struct pdf_filter_state_s static void insert_resource_name(pdf_csi *csi, pdf_filter_state *state, const char *key, const char *name) { + fz_context *ctx = csi->ctx; pdf_obj *xobj; pdf_obj *obj; if (!state->resources || !name || name[0] == 0) return; - xobj = pdf_dict_gets(csi->rdb, key); - obj = pdf_dict_gets(xobj, name); + xobj = pdf_dict_gets(ctx, csi->rdb, key); + obj = pdf_dict_gets(ctx, xobj, name); - xobj = pdf_dict_gets(state->resources, key); + xobj = pdf_dict_gets(ctx, state->resources, key); if (xobj == NULL) { - xobj = pdf_new_dict(csi->doc, 1); - pdf_dict_puts_drop(state->resources, key, xobj); + xobj = pdf_new_dict(csi->ctx, csi->doc, 1); + pdf_dict_puts_drop(ctx, state->resources, key, xobj); } - pdf_dict_putp(xobj, name, obj); + pdf_dict_putp(ctx, xobj, name, obj); } static void insert_resource(pdf_csi *csi, pdf_filter_state *state, const char *key) @@ -408,7 +409,7 @@ pdf_filter_BDC(pdf_csi *csi, void *state_) { pdf_filter_state *state = (pdf_filter_state *)state_; - insert_resource_name(csi, state, "Properties", pdf_to_name(csi->obj)); + insert_resource_name(csi, state, "Properties", pdf_to_name(csi->ctx, csi->obj)); filter_flush(csi, state, 0); call_op(csi, state, PDF_OP_BDC); @@ -467,7 +468,7 @@ pdf_filter_DP(pdf_csi *csi, void *state_) { pdf_filter_state *state = (pdf_filter_state *)state_; - insert_resource_name(csi, state, "Properties", pdf_to_name(csi->obj)); + insert_resource_name(csi, state, "Properties", pdf_to_name(csi->ctx, csi->obj)); filter_flush(csi, state, 0); call_op(csi, state, PDF_OP_DP); @@ -1085,11 +1086,11 @@ free_processor_filter(pdf_csi *csi, void *state_) static void process_annot(pdf_csi *csi, void *state, pdf_obj *resources, pdf_annot *annot) { - fz_context *ctx = csi->doc->ctx; + fz_context *ctx = csi->ctx; pdf_xobject *xobj = annot->ap; /* Avoid infinite recursion */ - if (xobj == NULL || pdf_mark_obj(xobj->me)) + if (xobj == NULL || pdf_mark_obj(ctx, xobj->me)) return; fz_try(ctx) @@ -1101,7 +1102,7 @@ process_annot(pdf_csi *csi, void *state, pdf_obj *resources, pdf_annot *annot) } fz_always(ctx) { - pdf_unmark_obj(xobj->me); + pdf_unmark_obj(ctx, xobj->me); } fz_catch(ctx) { @@ -1203,7 +1204,7 @@ static const pdf_processor pdf_processor_filter = }; pdf_process * -pdf_process_filter(pdf_process *process, fz_context *ctx, pdf_process *underlying, pdf_obj *resources) +pdf_init_process_filter(fz_context *ctx, pdf_process *process, pdf_process *underlying, pdf_obj *resources) { pdf_filter_state *p = NULL; diff --git a/source/pdf/pdf-op-run.c b/source/pdf/pdf-op-run.c index 52000b40..139f7e50 100644 --- a/source/pdf/pdf-op-run.c +++ b/source/pdf/pdf-op-run.c @@ -107,7 +107,7 @@ static void run_xobject(pdf_csi *csi, void *state, pdf_obj *resources, pdf_xobject *xobj, const fz_matrix *transform); static int -ocg_intents_include(pdf_ocg_descriptor *desc, char *name) +ocg_intents_include(fz_context *ctx, pdf_ocg_descriptor *desc, char *name) { int i, len; @@ -118,20 +118,20 @@ ocg_intents_include(pdf_ocg_descriptor *desc, char *name) if (!desc->intent) return (strcmp(name, "View") == 0); - if (pdf_is_name(desc->intent)) + if (pdf_is_name(ctx, desc->intent)) { - char *intent = pdf_to_name(desc->intent); + char *intent = pdf_to_name(ctx, desc->intent); if (strcmp(intent, "All") == 0) return 1; return (strcmp(intent, name) == 0); } - if (!pdf_is_array(desc->intent)) + if (!pdf_is_array(ctx, desc->intent)) return 0; - len = pdf_array_len(desc->intent); + len = pdf_array_len(ctx, desc->intent); for (i=0; i < len; i++) { - char *intent = pdf_to_name(pdf_array_get(desc->intent, i)); + char *intent = pdf_to_name(ctx, pdf_array_get(ctx, desc->intent, i)); if (strcmp(intent, "All") == 0) return 1; if (strcmp(intent, name) == 0) @@ -147,10 +147,10 @@ pdf_is_hidden_ocg(pdf_obj *ocg, pdf_csi *csi, pdf_run_state *pr, pdf_obj *rdb) pdf_obj *obj, *obj2; char *type; pdf_ocg_descriptor *desc = csi->doc->ocg; - fz_context *ctx = csi->doc->ctx; + fz_context *ctx = csi->ctx; /* Avoid infinite recursions */ - if (pdf_obj_marked(ocg)) + if (pdf_obj_marked(ctx, ocg)) return 0; /* If no ocg descriptor, everything is visible */ @@ -158,9 +158,9 @@ pdf_is_hidden_ocg(pdf_obj *ocg, pdf_csi *csi, pdf_run_state *pr, pdf_obj *rdb) return 0; /* If we've been handed a name, look it up in the properties. */ - if (pdf_is_name(ocg)) + if (pdf_is_name(ctx, ocg)) { - ocg = pdf_dict_gets(pdf_dict_gets(rdb, "Properties"), pdf_to_name(ocg)); + ocg = pdf_dict_gets(ctx, pdf_dict_gets(ctx, rdb, "Properties"), pdf_to_name(ctx, ocg)); } /* If we haven't been given an ocg at all, then we're visible */ if (!ocg) @@ -169,14 +169,14 @@ pdf_is_hidden_ocg(pdf_obj *ocg, pdf_csi *csi, pdf_run_state *pr, pdf_obj *rdb) fz_strlcpy(event_state, pr->event, sizeof event_state); fz_strlcat(event_state, "State", sizeof event_state); - type = pdf_to_name(pdf_dict_gets(ocg, "Type")); + type = pdf_to_name(ctx, pdf_dict_gets(ctx, ocg, "Type")); if (strcmp(type, "OCG") == 0) { /* An Optional Content Group */ int default_value = 0; - int num = pdf_to_num(ocg); - int gen = pdf_to_gen(ocg); + int num = pdf_to_num(ctx, ocg); + int gen = pdf_to_gen(ctx, ocg); int len = desc->len; int i; @@ -192,19 +192,19 @@ pdf_is_hidden_ocg(pdf_obj *ocg, pdf_csi *csi, pdf_run_state *pr, pdf_obj *rdb) /* Check Intents; if our intent is not part of the set given * by the current config, we should ignore it. */ - obj = pdf_dict_gets(ocg, "Intent"); - if (pdf_is_name(obj)) + obj = pdf_dict_gets(ctx, ocg, "Intent"); + if (pdf_is_name(ctx, obj)) { /* If it doesn't match, it's hidden */ - if (ocg_intents_include(desc, pdf_to_name(obj)) == 0) + if (ocg_intents_include(ctx, desc, pdf_to_name(ctx, obj)) == 0) return 1; } - else if (pdf_is_array(obj)) + else if (pdf_is_array(ctx, obj)) { int match = 0; - len = pdf_array_len(obj); + len = pdf_array_len(ctx, obj); for (i=0; i<len; i++) { - match |= ocg_intents_include(desc, pdf_to_name(pdf_array_get(obj, i))); + match |= ocg_intents_include(ctx, desc, pdf_to_name(ctx, pdf_array_get(ctx, obj, i))); if (match) break; } @@ -215,7 +215,7 @@ pdf_is_hidden_ocg(pdf_obj *ocg, pdf_csi *csi, pdf_run_state *pr, pdf_obj *rdb) else { /* If it doesn't match, it's hidden */ - if (ocg_intents_include(desc, "View") == 0) + if (ocg_intents_include(ctx, desc, "View") == 0) return 1; } @@ -228,19 +228,19 @@ pdf_is_hidden_ocg(pdf_obj *ocg, pdf_csi *csi, pdf_run_state *pr, pdf_obj *rdb) * correspond to entries in the AS list in the OCG config. * Given that we don't handle Zoom or User, or Language * dicts, this is not really a problem. */ - obj = pdf_dict_gets(ocg, "Usage"); - if (!pdf_is_dict(obj)) + obj = pdf_dict_gets(ctx, ocg, "Usage"); + if (!pdf_is_dict(ctx, obj)) return default_value; /* FIXME: Should look at Zoom (and return hidden if out of * max/min range) */ /* FIXME: Could provide hooks to the caller to check if * User is appropriate - if not return hidden. */ - obj2 = pdf_dict_gets(obj, pr->event); - if (strcmp(pdf_to_name(pdf_dict_gets(obj2, event_state)), "OFF") == 0) + obj2 = pdf_dict_gets(ctx, obj, pr->event); + if (strcmp(pdf_to_name(ctx, pdf_dict_gets(ctx, obj2, event_state)), "OFF") == 0) { return 1; } - if (strcmp(pdf_to_name(pdf_dict_gets(obj2, event_state)), "ON") == 0) + if (strcmp(pdf_to_name(ctx, pdf_dict_gets(ctx, obj2, event_state)), "ON") == 0) { return 0; } @@ -252,12 +252,12 @@ pdf_is_hidden_ocg(pdf_obj *ocg, pdf_csi *csi, pdf_run_state *pr, pdf_obj *rdb) char *name; int combine, on; - obj = pdf_dict_gets(ocg, "VE"); - if (pdf_is_array(obj)) { + obj = pdf_dict_gets(ctx, ocg, "VE"); + if (pdf_is_array(ctx, obj)) { /* FIXME: Calculate visibility from array */ return 0; } - name = pdf_to_name(pdf_dict_gets(ocg, "P")); + name = pdf_to_name(ctx, pdf_dict_gets(ctx, ocg, "P")); /* Set combine; Bit 0 set => AND, Bit 1 set => true means * Off, otherwise true means On */ if (strcmp(name, "AllOn") == 0) @@ -277,19 +277,19 @@ pdf_is_hidden_ocg(pdf_obj *ocg, pdf_csi *csi, pdf_run_state *pr, pdf_obj *rdb) combine = 0; } - if (pdf_mark_obj(ocg)) + if (pdf_mark_obj(ctx, ocg)) return 0; /* Should never happen */ fz_try(ctx) { - obj = pdf_dict_gets(ocg, "OCGs"); + obj = pdf_dict_gets(ctx, ocg, "OCGs"); on = combine & 1; - if (pdf_is_array(obj)) { + if (pdf_is_array(ctx, obj)) { int i, len; - len = pdf_array_len(obj); + len = pdf_array_len(ctx, obj); for (i = 0; i < len; i++) { int hidden; - hidden = pdf_is_hidden_ocg(pdf_array_get(obj, i), csi, pr, rdb); + hidden = pdf_is_hidden_ocg(pdf_array_get(ctx, obj, i), csi, pr, rdb); if ((combine & 1) == 0) hidden = !hidden; if (combine & 2) @@ -307,7 +307,7 @@ pdf_is_hidden_ocg(pdf_obj *ocg, pdf_csi *csi, pdf_run_state *pr, pdf_obj *rdb) } fz_always(ctx) { - pdf_unmark_obj(ocg); + pdf_unmark_obj(ctx, ocg); } fz_catch(ctx) { @@ -349,7 +349,7 @@ begin_softmask(pdf_csi *csi, pdf_run_state *pr, softmask_save *save) gstate->softmask = NULL; gstate->ctm = gstate->softmask_ctm; - fz_begin_mask(pr->dev, &mask_bbox, gstate->luminosity, + fz_begin_mask(ctx, pr->dev, &mask_bbox, gstate->luminosity, softmask->colorspace, gstate->softmask_bc); fz_try(ctx) { @@ -364,7 +364,7 @@ begin_softmask(pdf_csi *csi, pdf_run_state *pr, softmask_save *save) csi->cookie->errors++; } - fz_end_mask(pr->dev); + fz_end_mask(ctx, pr->dev); pr->tm = save_tm; pr->tlm = save_tlm; @@ -378,6 +378,7 @@ begin_softmask(pdf_csi *csi, pdf_run_state *pr, softmask_save *save) static void end_softmask(pdf_csi *csi, pdf_run_state *pr, softmask_save *save) { + fz_context *ctx = pr->ctx; pdf_gstate *gstate = pr->gstate + pr->gtop; if (save->softmask == NULL) @@ -385,7 +386,7 @@ end_softmask(pdf_csi *csi, pdf_run_state *pr, softmask_save *save) gstate->softmask = save->softmask; gstate->softmask_ctm = save->ctm; - fz_pop_clip(pr->dev); + fz_pop_clip(ctx, pr->dev); } static pdf_gstate * @@ -394,7 +395,7 @@ pdf_begin_group(pdf_csi *csi, pdf_run_state *pr, const fz_rect *bbox, softmask_s pdf_gstate *gstate = begin_softmask(csi, pr, softmask); if (gstate->blendmode) - fz_begin_group(pr->dev, bbox, 1, 0, gstate->blendmode, 1); + fz_begin_group(pr->ctx, pr->dev, bbox, 1, 0, gstate->blendmode, 1); return pr->gstate + pr->gtop; } @@ -405,7 +406,7 @@ pdf_end_group(pdf_csi *csi, pdf_run_state *pr, softmask_save *softmask) pdf_gstate *gstate = pr->gstate + pr->gtop; if (gstate->blendmode) - fz_end_group(pr->dev); + fz_end_group(pr->ctx, pr->dev); end_softmask(csi, pr, softmask); } @@ -427,7 +428,7 @@ pdf_show_shade(pdf_csi *csi, pdf_run_state *pr, fz_shade *shd) /* FIXME: The gstate->ctm in the next line may be wrong; maybe * it should be the parent gstates ctm? */ - fz_fill_shade(pr->dev, shd, &gstate->ctm, gstate->fill.alpha); + fz_fill_shade(ctx, pr->dev, shd, &gstate->ctm, gstate->fill.alpha); pdf_end_group(csi, pr, &softmask); } @@ -549,7 +550,7 @@ pdf_grestore(pdf_run_state *pr) { fz_try(ctx) { - fz_pop_clip(pr->dev); + fz_pop_clip(ctx, pr->dev); } fz_catch(ctx) { @@ -649,14 +650,14 @@ pdf_show_pattern(pdf_csi *csi, pdf_run_state *pr, pdf_pattern *pat, pdf_gstate * if (0) #endif { - fz_begin_tile(pr->dev, &local_area, &pat->bbox, pat->xstep, pat->ystep, &ptm); + fz_begin_tile(ctx, pr->dev, &local_area, &pat->bbox, pat->xstep, pat->ystep, &ptm); gstate->ctm = ptm; pdf_gsave(pr); pdf_process_contents_object(csi, pat->resources, pat->contents); pdf_grestore(pr); while (oldtop < pr->gtop) pdf_grestore(pr); - fz_end_tile(pr->dev); + fz_end_tile(ctx, pr->dev); } else { @@ -720,6 +721,7 @@ pdf_show_pattern(pdf_csi *csi, pdf_run_state *pr, pdf_pattern *pat, pdf_gstate * static void pdf_show_image(pdf_csi *csi, pdf_run_state *pr, fz_image *image) { + fz_context *ctx = pr->ctx; pdf_gstate *gstate = pr->gstate + pr->gtop; fz_matrix image_ctm; fz_rect bbox; @@ -739,8 +741,8 @@ pdf_show_image(pdf_csi *csi, pdf_run_state *pr, fz_image *image) { /* apply blend group even though we skip the soft mask */ if (gstate->blendmode) - fz_begin_group(pr->dev, &bbox, 0, 0, gstate->blendmode, 1); - fz_clip_image_mask(pr->dev, image->mask, &bbox, &image_ctm); + fz_begin_group(ctx, pr->dev, &bbox, 0, 0, gstate->blendmode, 1); + fz_clip_image_mask(ctx, pr->dev, image->mask, &bbox, &image_ctm); } else gstate = pdf_begin_group(csi, pr, &bbox, &softmask); @@ -753,37 +755,37 @@ pdf_show_image(pdf_csi *csi, pdf_run_state *pr, fz_image *image) case PDF_MAT_NONE: break; case PDF_MAT_COLOR: - fz_fill_image_mask(pr->dev, image, &image_ctm, + fz_fill_image_mask(ctx, pr->dev, image, &image_ctm, gstate->fill.colorspace, gstate->fill.v, gstate->fill.alpha); break; case PDF_MAT_PATTERN: if (gstate->fill.pattern) { - fz_clip_image_mask(pr->dev, image, &bbox, &image_ctm); + fz_clip_image_mask(ctx, pr->dev, image, &bbox, &image_ctm); pdf_show_pattern(csi, pr, gstate->fill.pattern, &pr->gstate[gstate->fill.gstate_num], &bbox, PDF_FILL); - fz_pop_clip(pr->dev); + fz_pop_clip(ctx, pr->dev); } break; case PDF_MAT_SHADE: if (gstate->fill.shade) { - fz_clip_image_mask(pr->dev, image, &bbox, &image_ctm); - fz_fill_shade(pr->dev, gstate->fill.shade, &pr->gstate[gstate->fill.gstate_num].ctm, gstate->fill.alpha); - fz_pop_clip(pr->dev); + fz_clip_image_mask(ctx, pr->dev, image, &bbox, &image_ctm); + fz_fill_shade(ctx, pr->dev, gstate->fill.shade, &pr->gstate[gstate->fill.gstate_num].ctm, gstate->fill.alpha); + fz_pop_clip(ctx, pr->dev); } break; } } else { - fz_fill_image(pr->dev, image, &image_ctm, gstate->fill.alpha); + fz_fill_image(ctx, pr->dev, image, &image_ctm, gstate->fill.alpha); } if (image->mask) { - fz_pop_clip(pr->dev); + fz_pop_clip(ctx, pr->dev); if (gstate->blendmode) - fz_end_group(pr->dev); + fz_end_group(ctx, pr->dev); } else pdf_end_group(csi, pr, &softmask); @@ -825,7 +827,7 @@ pdf_show_path(pdf_csi *csi, pdf_run_state *pr, int doclose, int dofill, int dost if (pr->clip) { gstate->clip_depth++; - fz_clip_path(pr->dev, path, &bbox, pr->clip_even_odd, &gstate->ctm); + fz_clip_path(ctx, pr->dev, path, &bbox, pr->clip_even_odd, &gstate->ctm); pr->clip = 0; } @@ -849,7 +851,7 @@ pdf_show_path(pdf_csi *csi, pdf_run_state *pr, int doclose, int dofill, int dost else { knockout_group = 1; - fz_begin_group(pr->dev, &bbox, 0, 1, FZ_BLEND_NORMAL, 1); + fz_begin_group(ctx, pr->dev, &bbox, 0, 1, FZ_BLEND_NORMAL, 1); } } @@ -860,24 +862,24 @@ pdf_show_path(pdf_csi *csi, pdf_run_state *pr, int doclose, int dofill, int dost case PDF_MAT_NONE: break; case PDF_MAT_COLOR: - fz_fill_path(pr->dev, path, even_odd, &gstate->ctm, + fz_fill_path(ctx, pr->dev, path, even_odd, &gstate->ctm, gstate->fill.colorspace, gstate->fill.v, gstate->fill.alpha); break; case PDF_MAT_PATTERN: if (gstate->fill.pattern) { - fz_clip_path(pr->dev, path, &bbox, even_odd, &gstate->ctm); + fz_clip_path(ctx, pr->dev, path, &bbox, even_odd, &gstate->ctm); pdf_show_pattern(csi, pr, gstate->fill.pattern, &pr->gstate[gstate->fill.gstate_num], &bbox, PDF_FILL); - fz_pop_clip(pr->dev); + fz_pop_clip(ctx, pr->dev); } break; case PDF_MAT_SHADE: if (gstate->fill.shade) { - fz_clip_path(pr->dev, path, &bbox, even_odd, &gstate->ctm); + fz_clip_path(ctx, pr->dev, path, &bbox, even_odd, &gstate->ctm); /* The cluster and page 2 of patterns.pdf shows that fz_fill_shade should NOT be called with gstate->ctm. */ - fz_fill_shade(pr->dev, gstate->fill.shade, &pr->gstate[gstate->fill.gstate_num].ctm, gstate->fill.alpha); - fz_pop_clip(pr->dev); + fz_fill_shade(ctx, pr->dev, gstate->fill.shade, &pr->gstate[gstate->fill.gstate_num].ctm, gstate->fill.alpha); + fz_pop_clip(ctx, pr->dev); } break; } @@ -890,30 +892,30 @@ pdf_show_path(pdf_csi *csi, pdf_run_state *pr, int doclose, int dofill, int dost case PDF_MAT_NONE: break; case PDF_MAT_COLOR: - fz_stroke_path(pr->dev, path, gstate->stroke_state, &gstate->ctm, + fz_stroke_path(ctx, pr->dev, path, gstate->stroke_state, &gstate->ctm, gstate->stroke.colorspace, gstate->stroke.v, gstate->stroke.alpha); break; case PDF_MAT_PATTERN: if (gstate->stroke.pattern) { - fz_clip_stroke_path(pr->dev, path, &bbox, gstate->stroke_state, &gstate->ctm); + fz_clip_stroke_path(ctx, pr->dev, path, &bbox, gstate->stroke_state, &gstate->ctm); pdf_show_pattern(csi, pr, gstate->stroke.pattern, &pr->gstate[gstate->stroke.gstate_num], &bbox, PDF_STROKE); - fz_pop_clip(pr->dev); + fz_pop_clip(ctx, pr->dev); } break; case PDF_MAT_SHADE: if (gstate->stroke.shade) { - fz_clip_stroke_path(pr->dev, path, &bbox, gstate->stroke_state, &gstate->ctm); - fz_fill_shade(pr->dev, gstate->stroke.shade, &pr->gstate[gstate->stroke.gstate_num].ctm, gstate->stroke.alpha); - fz_pop_clip(pr->dev); + fz_clip_stroke_path(ctx, pr->dev, path, &bbox, gstate->stroke_state, &gstate->ctm); + fz_fill_shade(ctx, pr->dev, gstate->stroke.shade, &pr->gstate[gstate->stroke.gstate_num].ctm, gstate->stroke.alpha); + fz_pop_clip(ctx, pr->dev); } break; } } if (knockout_group) - fz_end_group(pr->dev); + fz_end_group(ctx, pr->dev); if (dofill || dostroke) pdf_end_group(csi, pr, &softmask); @@ -978,7 +980,7 @@ pdf_flush_text(pdf_csi *csi, pdf_run_state *pr) gstate = pdf_begin_group(csi, pr, &tb, &softmask); if (doinvisible) - fz_ignore_text(pr->dev, text, &gstate->ctm); + fz_ignore_text(ctx, pr->dev, text, &gstate->ctm); if (dofill) { @@ -987,24 +989,24 @@ pdf_flush_text(pdf_csi *csi, pdf_run_state *pr) case PDF_MAT_NONE: break; case PDF_MAT_COLOR: - fz_fill_text(pr->dev, text, &gstate->ctm, + fz_fill_text(ctx, pr->dev, text, &gstate->ctm, gstate->fill.colorspace, gstate->fill.v, gstate->fill.alpha); break; case PDF_MAT_PATTERN: if (gstate->fill.pattern) { - fz_clip_text(pr->dev, text, &gstate->ctm, 0); + fz_clip_text(ctx, pr->dev, text, &gstate->ctm, 0); pdf_show_pattern(csi, pr, gstate->fill.pattern, &pr->gstate[gstate->fill.gstate_num], &tb, PDF_FILL); - fz_pop_clip(pr->dev); + fz_pop_clip(ctx, pr->dev); } break; case PDF_MAT_SHADE: if (gstate->fill.shade) { - fz_clip_text(pr->dev, text, &gstate->ctm, 0); + fz_clip_text(ctx, pr->dev, text, &gstate->ctm, 0); /* Page 2 of patterns.pdf shows that fz_fill_shade should NOT be called with gstate->ctm */ - fz_fill_shade(pr->dev, gstate->fill.shade, &pr->gstate[gstate->fill.gstate_num].ctm, gstate->fill.alpha); - fz_pop_clip(pr->dev); + fz_fill_shade(ctx, pr->dev, gstate->fill.shade, &pr->gstate[gstate->fill.gstate_num].ctm, gstate->fill.alpha); + fz_pop_clip(ctx, pr->dev); } break; } @@ -1017,23 +1019,23 @@ pdf_flush_text(pdf_csi *csi, pdf_run_state *pr) case PDF_MAT_NONE: break; case PDF_MAT_COLOR: - fz_stroke_text(pr->dev, text, gstate->stroke_state, &gstate->ctm, + fz_stroke_text(ctx, pr->dev, text, gstate->stroke_state, &gstate->ctm, gstate->stroke.colorspace, gstate->stroke.v, gstate->stroke.alpha); break; case PDF_MAT_PATTERN: if (gstate->stroke.pattern) { - fz_clip_stroke_text(pr->dev, text, gstate->stroke_state, &gstate->ctm); + fz_clip_stroke_text(ctx, pr->dev, text, gstate->stroke_state, &gstate->ctm); pdf_show_pattern(csi, pr, gstate->stroke.pattern, &pr->gstate[gstate->stroke.gstate_num], &tb, PDF_STROKE); - fz_pop_clip(pr->dev); + fz_pop_clip(ctx, pr->dev); } break; case PDF_MAT_SHADE: if (gstate->stroke.shade) { - fz_clip_stroke_text(pr->dev, text, gstate->stroke_state, &gstate->ctm); - fz_fill_shade(pr->dev, gstate->stroke.shade, &pr->gstate[gstate->stroke.gstate_num].ctm, gstate->stroke.alpha); - fz_pop_clip(pr->dev); + fz_clip_stroke_text(ctx, pr->dev, text, gstate->stroke_state, &gstate->ctm); + fz_fill_shade(ctx, pr->dev, gstate->stroke.shade, &pr->gstate[gstate->stroke.gstate_num].ctm, gstate->stroke.alpha); + fz_pop_clip(ctx, pr->dev); } break; } @@ -1043,7 +1045,7 @@ pdf_flush_text(pdf_csi *csi, pdf_run_state *pr) { if (pr->accumulate < 2) gstate->clip_depth++; - fz_clip_text(pr->dev, text, &gstate->ctm, pr->accumulate); + fz_clip_text(ctx, pr->dev, text, &gstate->ctm, pr->accumulate); pr->accumulate = 2; } @@ -1231,24 +1233,25 @@ pdf_show_string(pdf_csi *csi, pdf_run_state *pr, unsigned char *buf, int len) static void pdf_show_text(pdf_csi *csi, pdf_run_state *pr, pdf_obj *text) { + fz_context *ctx = csi->ctx; pdf_gstate *gstate = pr->gstate + pr->gtop; int i; - if (pdf_is_array(text)) + if (pdf_is_array(ctx, text)) { - int n = pdf_array_len(text); + int n = pdf_array_len(ctx, text); for (i = 0; i < n; i++) { - pdf_obj *item = pdf_array_get(text, i); - if (pdf_is_string(item)) - pdf_show_string(csi, pr, (unsigned char *)pdf_to_str_buf(item), pdf_to_str_len(item)); + pdf_obj *item = pdf_array_get(ctx, text, i); + if (pdf_is_string(ctx, item)) + pdf_show_string(csi, pr, (unsigned char *)pdf_to_str_buf(ctx, item), pdf_to_str_len(ctx, item)); else - pdf_show_space(pr, - pdf_to_real(item) * gstate->size * 0.001f); + pdf_show_space(pr, - pdf_to_real(ctx, item) * gstate->size * 0.001f); } } - else if (pdf_is_string(text)) + else if (pdf_is_string(ctx, text)) { - pdf_show_string(csi, pr, (unsigned char *)pdf_to_str_buf(text), pdf_to_str_len(text)); + pdf_show_string(csi, pr, (unsigned char *)pdf_to_str_buf(ctx, text), pdf_to_str_len(ctx, text)); } } @@ -1328,7 +1331,7 @@ pdf_set_colorspace(pdf_csi *csi, pdf_run_state *pr, int what, fz_colorspace *col mat->v[2] = 0; mat->v[3] = 1; - if (pdf_is_tint_colorspace(colorspace)) + if (pdf_is_tint_colorspace(ctx, colorspace)) { int i; for (i = 0; i < colorspace->n; i++) @@ -1352,7 +1355,7 @@ pdf_set_color(pdf_csi *csi, pdf_run_state *pr, int what, float *v) { case PDF_MAT_PATTERN: case PDF_MAT_COLOR: - if (fz_colorspace_is_indexed(mat->colorspace)) + if (fz_colorspace_is_indexed(ctx, mat->colorspace)) { mat->v[0] = v[0] / 255; break; @@ -1411,13 +1414,13 @@ pdf_set_pattern(pdf_csi *csi, pdf_run_state *pr, int what, pdf_pattern *pat, flo static pdf_font_desc * load_font_or_hail_mary(pdf_csi *csi, pdf_obj *rdb, pdf_obj *font, int depth) { + fz_context *ctx = csi->ctx; pdf_document *doc = csi->doc; - fz_context *ctx = doc->ctx; pdf_font_desc *desc; fz_try(ctx) { - desc = pdf_load_font(doc, rdb, font, depth); + desc = pdf_load_font(ctx, doc, rdb, font, depth); } fz_catch(ctx) { @@ -1429,7 +1432,7 @@ load_font_or_hail_mary(pdf_csi *csi, pdf_obj *rdb, pdf_obj *font, int depth) csi->cookie->incomplete++; } if (desc == NULL) - desc = pdf_load_hail_mary_font(doc); + desc = pdf_load_hail_mary_font(ctx, doc); return desc; } @@ -1443,18 +1446,18 @@ pdf_run_extgstate(pdf_csi *csi, pdf_run_state *pr, pdf_obj *rdb, pdf_obj *extgst gstate = pdf_flush_text(csi, pr); - n = pdf_dict_len(extgstate); + n = pdf_dict_len(ctx, extgstate); for (i = 0; i < n; i++) { - pdf_obj *key = pdf_dict_get_key(extgstate, i); - pdf_obj *val = pdf_dict_get_val(extgstate, i); - char *s = pdf_to_name(key); + pdf_obj *key = pdf_dict_get_key(ctx, extgstate, i); + pdf_obj *val = pdf_dict_get_val(ctx, extgstate, i); + char *s = pdf_to_name(ctx, key); if (!strcmp(s, "Font")) { - if (pdf_is_array(val) && pdf_array_len(val) == 2) + if (pdf_is_array(ctx, val) && pdf_array_len(ctx, val) == 2) { - pdf_obj *font = pdf_array_get(val, 0); + pdf_obj *font = pdf_array_get(ctx, val, 0); if (gstate->font) { @@ -1465,7 +1468,7 @@ pdf_run_extgstate(pdf_csi *csi, pdf_run_state *pr, pdf_obj *rdb, pdf_obj *extgst gstate->font = load_font_or_hail_mary(csi, rdb, font, pr->nested_depth); if (!gstate->font) fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find font in store"); - gstate->size = pdf_to_real(pdf_array_get(val, 1)); + gstate->size = pdf_to_real(ctx, pdf_array_get(ctx, val, 1)); } else fz_throw(ctx, FZ_ERROR_GENERIC, "malformed /Font dictionary"); @@ -1475,61 +1478,61 @@ pdf_run_extgstate(pdf_csi *csi, pdf_run_state *pr, pdf_obj *rdb, pdf_obj *extgst { pr->dev->flags &= ~(FZ_DEVFLAG_STARTCAP_UNDEFINED | FZ_DEVFLAG_DASHCAP_UNDEFINED | FZ_DEVFLAG_ENDCAP_UNDEFINED); gstate->stroke_state = fz_unshare_stroke_state(ctx, gstate->stroke_state); - gstate->stroke_state->start_cap = pdf_to_int(val); - gstate->stroke_state->dash_cap = pdf_to_int(val); - gstate->stroke_state->end_cap = pdf_to_int(val); + gstate->stroke_state->start_cap = pdf_to_int(ctx, val); + gstate->stroke_state->dash_cap = pdf_to_int(ctx, val); + gstate->stroke_state->end_cap = pdf_to_int(ctx, val); } else if (!strcmp(s, "LW")) { pr->dev->flags &= ~FZ_DEVFLAG_LINEWIDTH_UNDEFINED; gstate->stroke_state = fz_unshare_stroke_state(ctx, gstate->stroke_state); - gstate->stroke_state->linewidth = pdf_to_real(val); + gstate->stroke_state->linewidth = pdf_to_real(ctx, val); } else if (!strcmp(s, "LJ")) { pr->dev->flags &= ~FZ_DEVFLAG_LINEJOIN_UNDEFINED; gstate->stroke_state = fz_unshare_stroke_state(ctx, gstate->stroke_state); - gstate->stroke_state->linejoin = pdf_to_int(val); + gstate->stroke_state->linejoin = pdf_to_int(ctx, val); } else if (!strcmp(s, "ML")) { pr->dev->flags &= ~FZ_DEVFLAG_MITERLIMIT_UNDEFINED; gstate->stroke_state = fz_unshare_stroke_state(ctx, gstate->stroke_state); - gstate->stroke_state->miterlimit = pdf_to_real(val); + gstate->stroke_state->miterlimit = pdf_to_real(ctx, val); } else if (!strcmp(s, "D")) { - if (pdf_is_array(val) && pdf_array_len(val) == 2) + if (pdf_is_array(ctx, val) && pdf_array_len(ctx, val) == 2) { - pdf_obj *dashes = pdf_array_get(val, 0); - int len = pdf_array_len(dashes); + pdf_obj *dashes = pdf_array_get(ctx, val, 0); + int len = pdf_array_len(ctx, dashes); gstate->stroke_state = fz_unshare_stroke_state_with_dash_len(ctx, gstate->stroke_state, len); gstate->stroke_state->dash_len = len; for (k = 0; k < len; k++) - gstate->stroke_state->dash_list[k] = pdf_to_real(pdf_array_get(dashes, k)); - gstate->stroke_state->dash_phase = pdf_to_real(pdf_array_get(val, 1)); + gstate->stroke_state->dash_list[k] = pdf_to_real(ctx, pdf_array_get(ctx, dashes, k)); + gstate->stroke_state->dash_phase = pdf_to_real(ctx, pdf_array_get(ctx, val, 1)); } else fz_throw(ctx, FZ_ERROR_GENERIC, "malformed /D"); } else if (!strcmp(s, "CA")) - gstate->stroke.alpha = fz_clamp(pdf_to_real(val), 0, 1); + gstate->stroke.alpha = fz_clamp(pdf_to_real(ctx, val), 0, 1); else if (!strcmp(s, "ca")) - gstate->fill.alpha = fz_clamp(pdf_to_real(val), 0, 1); + gstate->fill.alpha = fz_clamp(pdf_to_real(ctx, val), 0, 1); else if (!strcmp(s, "BM")) { - if (pdf_is_array(val)) - val = pdf_array_get(val, 0); - gstate->blendmode = fz_lookup_blendmode(pdf_to_name(val)); + if (pdf_is_array(ctx, val)) + val = pdf_array_get(ctx, val, 0); + gstate->blendmode = fz_lookup_blendmode(pdf_to_name(ctx, val)); } else if (!strcmp(s, "SMask")) { - if (pdf_is_dict(val)) + if (pdf_is_dict(ctx, val)) { pdf_xobject *xobj; pdf_obj *group, *luminosity, *bc, *tr; @@ -1540,10 +1543,10 @@ pdf_run_extgstate(pdf_csi *csi, pdf_run_state *pr, pdf_obj *rdb, pdf_obj *extgst gstate->softmask = NULL; } - group = pdf_dict_gets(val, "G"); + group = pdf_dict_gets(ctx, val, "G"); if (!group) - fz_throw(ctx, FZ_ERROR_GENERIC, "cannot load softmask xobject (%d %d R)", pdf_to_num(val), pdf_to_gen(val)); - xobj = pdf_load_xobject(csi->doc, group); + fz_throw(ctx, FZ_ERROR_GENERIC, "cannot load softmask xobject (%d %d R)", pdf_to_num(ctx, val), pdf_to_gen(ctx, val)); + xobj = pdf_load_xobject(ctx, csi->doc, group); colorspace = xobj->colorspace; if (!colorspace) @@ -1556,24 +1559,24 @@ pdf_run_extgstate(pdf_csi *csi, pdf_run_state *pr, pdf_obj *rdb, pdf_obj *extgst for (k = 0; k < colorspace->n; k++) gstate->softmask_bc[k] = 0; - bc = pdf_dict_gets(val, "BC"); - if (pdf_is_array(bc)) + bc = pdf_dict_gets(ctx, val, "BC"); + if (pdf_is_array(ctx, bc)) { for (k = 0; k < colorspace->n; k++) - gstate->softmask_bc[k] = pdf_to_real(pdf_array_get(bc, k)); + gstate->softmask_bc[k] = pdf_to_real(ctx, pdf_array_get(ctx, bc, k)); } - luminosity = pdf_dict_gets(val, "S"); - if (pdf_is_name(luminosity) && !strcmp(pdf_to_name(luminosity), "Luminosity")) + luminosity = pdf_dict_gets(ctx, val, "S"); + if (pdf_is_name(ctx, luminosity) && !strcmp(pdf_to_name(ctx, luminosity), "Luminosity")) gstate->luminosity = 1; else gstate->luminosity = 0; - tr = pdf_dict_gets(val, "TR"); - if (tr && strcmp(pdf_to_name(tr), "Identity")) + tr = pdf_dict_gets(ctx, val, "TR"); + if (tr && strcmp(pdf_to_name(ctx, tr), "Identity")) fz_warn(ctx, "ignoring transfer function"); } - else if (pdf_is_name(val) && !strcmp(pdf_to_name(val), "None")) + else if (pdf_is_name(ctx, val) && !strcmp(pdf_to_name(ctx, val), "None")) { if (gstate->softmask) { @@ -1585,15 +1588,15 @@ pdf_run_extgstate(pdf_csi *csi, pdf_run_state *pr, pdf_obj *rdb, pdf_obj *extgst else if (!strcmp(s, "TR2")) { - if (strcmp(pdf_to_name(val), "Identity") && strcmp(pdf_to_name(val), "Default")) + if (strcmp(pdf_to_name(ctx, val), "Identity") && strcmp(pdf_to_name(ctx, val), "Default")) fz_warn(ctx, "ignoring transfer function"); } else if (!strcmp(s, "TR")) { /* TR is ignored in the presence of TR2 */ - pdf_obj *tr2 = pdf_dict_gets(extgstate, "TR2"); - if (tr2 && strcmp(pdf_to_name(val), "Identity")) + pdf_obj *tr2 = pdf_dict_gets(ctx, extgstate, "TR2"); + if (tr2 && strcmp(pdf_to_name(ctx, val), "Identity")) fz_warn(ctx, "ignoring transfer function"); } } @@ -1602,7 +1605,7 @@ pdf_run_extgstate(pdf_csi *csi, pdf_run_state *pr, pdf_obj *rdb, pdf_obj *extgst static void run_xobject(pdf_csi *csi, void *state, pdf_obj *resources, pdf_xobject *xobj, const fz_matrix *transform) { - fz_context *ctx = csi->doc->ctx; + fz_context *ctx = csi->ctx; pdf_gstate *gstate = NULL; int oldtop = 0; fz_matrix local_transform = *transform; @@ -1614,7 +1617,7 @@ run_xobject(pdf_csi *csi, void *state, pdf_obj *resources, pdf_xobject *xobj, co char errmess[256] = ""; /* Avoid infinite recursion */ - if (xobj == NULL || pdf_mark_obj(xobj->me)) + if (xobj == NULL || pdf_mark_obj(ctx, xobj->me)) return; fz_var(cleanup_state); @@ -1653,7 +1656,7 @@ run_xobject(pdf_csi *csi, void *state, pdf_obj *resources, pdf_xobject *xobj, co /* Remember that we tried to call fz_begin_group. Even * if it throws an error, we must call fz_end_group. */ cleanup_state = 2; - fz_begin_group(pr->dev, &bbox, + fz_begin_group(ctx, pr->dev, &bbox, xobj->isolated, xobj->knockout, gstate->blendmode, gstate->fill.alpha); gstate->blendmode = 0; @@ -1694,7 +1697,7 @@ run_xobject(pdf_csi *csi, void *state, pdf_obj *resources, pdf_xobject *xobj, co { fz_try(ctx) { - fz_end_group(pr->dev); + fz_end_group(ctx, pr->dev); } fz_catch(ctx) { @@ -1727,7 +1730,7 @@ run_xobject(pdf_csi *csi, void *state, pdf_obj *resources, pdf_xobject *xobj, co pdf_grestore(pr); } - pdf_unmark_obj(xobj->me); + pdf_unmark_obj(ctx, xobj->me); } fz_catch(ctx) { @@ -1741,6 +1744,7 @@ run_xobject(pdf_csi *csi, void *state, pdf_obj *resources, pdf_xobject *xobj, co static void pdf_run_BDC(pdf_csi *csi, void *state) { + fz_context *ctx = csi->ctx; pdf_run_state *pr = (pdf_run_state *)state; pdf_obj *ocg; pdf_obj *rdb = csi->rdb; @@ -1758,9 +1762,9 @@ static void pdf_run_BDC(pdf_csi *csi, void *state) return; } - if (pdf_is_name(csi->obj)) + if (pdf_is_name(ctx, csi->obj)) { - ocg = pdf_dict_gets(pdf_dict_gets(rdb, "Properties"), pdf_to_name(csi->obj)); + ocg = pdf_dict_gets(ctx, pdf_dict_gets(ctx, rdb, "Properties"), pdf_to_name(ctx, csi->obj)); } else ocg = csi->obj; @@ -1771,7 +1775,7 @@ static void pdf_run_BDC(pdf_csi *csi, void *state) * means visible. */ return; } - if (strcmp(pdf_to_name(pdf_dict_gets(ocg, "Type")), "OCG") != 0) + if (strcmp(pdf_to_name(ctx, pdf_dict_gets(ctx, ocg, "Type")), "OCG") != 0) { /* Wrong type of property */ return; @@ -1847,13 +1851,13 @@ static void pdf_run_cs_imp(pdf_csi *csi, pdf_run_state *pr, int what) colorspace = fz_device_cmyk(ctx); /* No fz_keep_colorspace as static */ else { - dict = pdf_dict_gets(rdb, "ColorSpace"); + dict = pdf_dict_gets(ctx, rdb, "ColorSpace"); if (!dict) fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find ColorSpace dictionary"); - obj = pdf_dict_gets(dict, csi->name); + obj = pdf_dict_gets(ctx, dict, csi->name); if (!obj) fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find colorspace resource '%s'", csi->name); - colorspace = pdf_load_colorspace(csi->doc, obj); + colorspace = pdf_load_colorspace(ctx, csi->doc, obj); } pdf_set_colorspace(csi, pr, what, colorspace); @@ -1887,39 +1891,39 @@ static void pdf_run_DP(pdf_csi *csi, void *state) static void pdf_run_Do(pdf_csi *csi, void *state) { pdf_run_state *pr = (pdf_run_state *)state; - fz_context *ctx = csi->doc->ctx; + fz_context *ctx = csi->ctx; pdf_obj *dict; pdf_obj *obj; pdf_obj *subtype; pdf_obj *rdb = csi->rdb; - dict = pdf_dict_gets(rdb, "XObject"); + dict = pdf_dict_gets(ctx, rdb, "XObject"); if (!dict) fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find XObject dictionary when looking for: '%s'", csi->name); - obj = pdf_dict_gets(dict, csi->name); + obj = pdf_dict_gets(ctx, dict, csi->name); if (!obj) fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find xobject resource: '%s'", csi->name); - subtype = pdf_dict_gets(obj, "Subtype"); - if (!pdf_is_name(subtype)) + subtype = pdf_dict_gets(ctx, obj, "Subtype"); + if (!pdf_is_name(ctx, subtype)) fz_throw(ctx, FZ_ERROR_GENERIC, "no XObject subtype specified"); - if (pdf_is_hidden_ocg(pdf_dict_gets(obj, "OC"), csi, pr, rdb)) + if (pdf_is_hidden_ocg(pdf_dict_gets(ctx, obj, "OC"), csi, pr, rdb)) return; - if (!strcmp(pdf_to_name(subtype), "Form") && pdf_dict_gets(obj, "Subtype2")) - subtype = pdf_dict_gets(obj, "Subtype2"); + if (!strcmp(pdf_to_name(ctx, subtype), "Form") && pdf_dict_gets(ctx, obj, "Subtype2")) + subtype = pdf_dict_gets(ctx, obj, "Subtype2"); - if (!strcmp(pdf_to_name(subtype), "Form")) + if (!strcmp(pdf_to_name(ctx, subtype), "Form")) { pdf_xobject *xobj; - xobj = pdf_load_xobject(csi->doc, obj); + xobj = pdf_load_xobject(ctx, csi->doc, obj); /* Inherit parent resources, in case this one was empty XXX check where it's loaded */ if (!xobj->resources) - xobj->resources = pdf_keep_obj(rdb); + xobj->resources = pdf_keep_obj(ctx, rdb); fz_try(ctx) { @@ -1931,15 +1935,15 @@ static void pdf_run_Do(pdf_csi *csi, void *state) } fz_catch(ctx) { - fz_rethrow_message(ctx, "cannot draw xobject (%d %d R)", pdf_to_num(obj), pdf_to_gen(obj)); + fz_rethrow_message(ctx, "cannot draw xobject (%d %d R)", pdf_to_num(ctx, obj), pdf_to_gen(ctx, obj)); } } - else if (!strcmp(pdf_to_name(subtype), "Image")) + else if (!strcmp(pdf_to_name(ctx, subtype), "Image")) { if ((pr->dev->hints & FZ_IGNORE_IMAGE) == 0) { - fz_image *img = pdf_load_image(csi->doc, obj); + fz_image *img = pdf_load_image(ctx, csi->doc, obj); fz_try(ctx) { @@ -1956,14 +1960,14 @@ static void pdf_run_Do(pdf_csi *csi, void *state) } } - else if (!strcmp(pdf_to_name(subtype), "PS")) + else if (!strcmp(pdf_to_name(ctx, subtype), "PS")) { fz_warn(ctx, "ignoring XObject with subtype PS"); } else { - fz_throw(ctx, FZ_ERROR_GENERIC, "unknown XObject subtype: '%s'", pdf_to_name(subtype)); + fz_throw(ctx, FZ_ERROR_GENERIC, "unknown XObject subtype: '%s'", pdf_to_name(ctx, subtype)); } } @@ -1999,7 +2003,7 @@ static void pdf_run_G(pdf_csi *csi, void *state) pdf_run_state *pr = (pdf_run_state *)state; pr->dev->flags &= ~FZ_DEVFLAG_STROKECOLOR_UNDEFINED; - pdf_set_colorspace(csi, pr, PDF_STROKE, fz_device_gray(csi->doc->ctx)); + pdf_set_colorspace(csi, pr, PDF_STROKE, fz_device_gray(csi->ctx)); pdf_set_color(csi, pr, PDF_STROKE, csi->stack); } @@ -2009,7 +2013,7 @@ static void pdf_run_J(pdf_csi *csi, void *state) pdf_gstate *gstate = pr->gstate + pr->gtop; pr->dev->flags &= ~(FZ_DEVFLAG_STARTCAP_UNDEFINED | FZ_DEVFLAG_DASHCAP_UNDEFINED | FZ_DEVFLAG_ENDCAP_UNDEFINED); - gstate->stroke_state = fz_unshare_stroke_state(csi->doc->ctx, gstate->stroke_state); + gstate->stroke_state = fz_unshare_stroke_state(csi->ctx, gstate->stroke_state); gstate->stroke_state->start_cap = csi->stack[0]; gstate->stroke_state->dash_cap = csi->stack[0]; gstate->stroke_state->end_cap = csi->stack[0]; @@ -2020,7 +2024,7 @@ static void pdf_run_K(pdf_csi *csi, void *state) pdf_run_state *pr = (pdf_run_state *)state; pr->dev->flags &= ~FZ_DEVFLAG_STROKECOLOR_UNDEFINED; - pdf_set_colorspace(csi, pr, PDF_STROKE, fz_device_cmyk(csi->doc->ctx)); + pdf_set_colorspace(csi, pr, PDF_STROKE, fz_device_cmyk(csi->ctx)); pdf_set_color(csi, pr, PDF_STROKE, csi->stack); } @@ -2030,7 +2034,7 @@ static void pdf_run_M(pdf_csi *csi, void *state) pdf_gstate *gstate = pr->gstate + pr->gtop; pr->dev->flags &= ~FZ_DEVFLAG_MITERLIMIT_UNDEFINED; - gstate->stroke_state = fz_unshare_stroke_state(csi->doc->ctx, gstate->stroke_state); + gstate->stroke_state = fz_unshare_stroke_state(csi->ctx, gstate->stroke_state); gstate->stroke_state->miterlimit = csi->stack[0]; } @@ -2050,7 +2054,7 @@ static void pdf_run_RG(pdf_csi *csi, void *state) pdf_run_state *pr = (pdf_run_state *)state; pr->dev->flags &= ~FZ_DEVFLAG_STROKECOLOR_UNDEFINED; - pdf_set_colorspace(csi, pr, PDF_STROKE, fz_device_rgb(csi->doc->ctx)); + pdf_set_colorspace(csi, pr, PDF_STROKE, fz_device_rgb(csi->ctx)); pdf_set_color(csi, pr, PDF_STROKE, csi->stack); } @@ -2084,33 +2088,33 @@ static void pdf_run_SC_imp(pdf_csi *csi, pdf_run_state *pr, int what, pdf_materi break; case PDF_MAT_PATTERN: - dict = pdf_dict_gets(rdb, "Pattern"); + dict = pdf_dict_gets(ctx, rdb, "Pattern"); if (!dict) fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find Pattern dictionary"); - obj = pdf_dict_gets(dict, csi->name); + obj = pdf_dict_gets(ctx, dict, csi->name); if (!obj) fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find pattern resource '%s'", csi->name); - patterntype = pdf_dict_gets(obj, "PatternType"); + patterntype = pdf_dict_gets(ctx, obj, "PatternType"); - if (pdf_to_int(patterntype) == 1) + if (pdf_to_int(ctx, patterntype) == 1) { pdf_pattern *pat; - pat = pdf_load_pattern(csi->doc, obj); + pat = pdf_load_pattern(ctx, csi->doc, obj); pdf_set_pattern(csi, pr, what, pat, csi->top > 0 ? csi->stack : NULL); pdf_drop_pattern(ctx, pat); } - else if (pdf_to_int(patterntype) == 2) + else if (pdf_to_int(ctx, patterntype) == 2) { fz_shade *shd; - shd = pdf_load_shading(csi->doc, obj); + shd = pdf_load_shading(ctx, csi->doc, obj); pdf_set_shade(csi, pr, what, shd); fz_drop_shade(ctx, shd); } else { - fz_throw(ctx, FZ_ERROR_GENERIC, "unknown pattern type: %d", pdf_to_int(patterntype)); + fz_throw(ctx, FZ_ERROR_GENERIC, "unknown pattern type: %d", pdf_to_int(ctx, patterntype)); } break; @@ -2175,7 +2179,7 @@ static void pdf_run_TL(pdf_csi *csi, void *state) static void pdf_run_Tf(pdf_csi *csi, void *state) { pdf_run_state *pr = (pdf_run_state *)state; - fz_context *ctx = csi->doc->ctx; + fz_context *ctx = csi->ctx; pdf_obj *rdb = csi->rdb; pdf_gstate *gstate = pr->gstate + pr->gtop; pdf_obj *dict; @@ -2186,11 +2190,11 @@ static void pdf_run_Tf(pdf_csi *csi, void *state) pdf_drop_font(ctx, gstate->font); gstate->font = NULL; - dict = pdf_dict_gets(rdb, "Font"); + dict = pdf_dict_gets(ctx, rdb, "Font"); if (!dict) fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find Font dictionary"); - obj = pdf_dict_gets(dict, csi->name); + obj = pdf_dict_gets(ctx, dict, csi->name); if (!obj) fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find font resource: '%s'", csi->name); @@ -2314,7 +2318,7 @@ static void pdf_run_c(pdf_csi *csi, void *state) d = csi->stack[3]; e = csi->stack[4]; f = csi->stack[5]; - fz_curveto(csi->doc->ctx, pr->path, a, b, c, d, e, f); + fz_curveto(csi->ctx, pr->path, a, b, c, d, e, f); } static void pdf_run_cm(pdf_csi *csi, void *state) @@ -2336,6 +2340,7 @@ static void pdf_run_cm(pdf_csi *csi, void *state) static void pdf_run_d(pdf_csi *csi, void *state) { + fz_context *ctx = csi->ctx; pdf_run_state *pr = (pdf_run_state *)state; pdf_gstate *gstate = pr->gstate + pr->gtop; pdf_obj *array; @@ -2343,11 +2348,11 @@ static void pdf_run_d(pdf_csi *csi, void *state) int len; array = csi->obj; - len = pdf_array_len(array); - gstate->stroke_state = fz_unshare_stroke_state_with_dash_len(csi->doc->ctx, gstate->stroke_state, len); + len = pdf_array_len(ctx, array); + gstate->stroke_state = fz_unshare_stroke_state_with_dash_len(csi->ctx, gstate->stroke_state, len); gstate->stroke_state->dash_len = len; for (i = 0; i < len; i++) - gstate->stroke_state->dash_list[i] = pdf_to_real(pdf_array_get(array, i)); + gstate->stroke_state->dash_list[i] = pdf_to_real(ctx, pdf_array_get(ctx, array, i)); gstate->stroke_state->dash_phase = csi->stack[0]; } @@ -2396,7 +2401,7 @@ static void pdf_run_g(pdf_csi *csi, void *state) pdf_run_state *pr = (pdf_run_state *)state; pr->dev->flags &= ~FZ_DEVFLAG_FILLCOLOR_UNDEFINED; - pdf_set_colorspace(csi, pr, PDF_FILL, fz_device_gray(csi->doc->ctx)); + pdf_set_colorspace(csi, pr, PDF_FILL, fz_device_gray(csi->ctx)); pdf_set_color(csi, pr, PDF_FILL, csi->stack); } @@ -2405,14 +2410,14 @@ static void pdf_run_gs(pdf_csi *csi, void *state) pdf_run_state *pr = (pdf_run_state *)state; pdf_obj *dict; pdf_obj *obj; - fz_context *ctx = csi->doc->ctx; + fz_context *ctx = csi->ctx; pdf_obj *rdb = csi->rdb; - dict = pdf_dict_gets(rdb, "ExtGState"); + dict = pdf_dict_gets(ctx, rdb, "ExtGState"); if (!dict) fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find ExtGState dictionary"); - obj = pdf_dict_gets(dict, csi->name); + obj = pdf_dict_gets(ctx, dict, csi->name); if (!obj) fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find extgstate resource '%s'", csi->name); @@ -2423,7 +2428,7 @@ static void pdf_run_h(pdf_csi *csi, void *state) { pdf_run_state *pr = (pdf_run_state *)state; - fz_closepath(csi->doc->ctx, pr->path); + fz_closepath(csi->ctx, pr->path); } static void pdf_run_i(pdf_csi *csi, void *state) @@ -2436,7 +2441,7 @@ static void pdf_run_j(pdf_csi *csi, void *state) pdf_gstate *gstate = pr->gstate + pr->gtop; pr->dev->flags &= ~FZ_DEVFLAG_LINEJOIN_UNDEFINED; - gstate->stroke_state = fz_unshare_stroke_state(csi->doc->ctx, gstate->stroke_state); + gstate->stroke_state = fz_unshare_stroke_state(csi->ctx, gstate->stroke_state); gstate->stroke_state->linejoin = csi->stack[0]; } @@ -2445,7 +2450,7 @@ static void pdf_run_k(pdf_csi *csi, void *state) pdf_run_state *pr = (pdf_run_state *)state; pr->dev->flags &= ~FZ_DEVFLAG_FILLCOLOR_UNDEFINED; - pdf_set_colorspace(csi, pr, PDF_FILL, fz_device_cmyk(csi->doc->ctx)); + pdf_set_colorspace(csi, pr, PDF_FILL, fz_device_cmyk(csi->ctx)); pdf_set_color(csi, pr, PDF_FILL, csi->stack); } @@ -2456,7 +2461,7 @@ static void pdf_run_l(pdf_csi *csi, void *state) a = csi->stack[0]; b = csi->stack[1]; - fz_lineto(csi->doc->ctx, pr->path, a, b); + fz_lineto(csi->ctx, pr->path, a, b); } static void pdf_run_m(pdf_csi *csi, void *state) @@ -2466,7 +2471,7 @@ static void pdf_run_m(pdf_csi *csi, void *state) a = csi->stack[0]; b = csi->stack[1]; - fz_moveto(csi->doc->ctx, pr->path, a, b); + fz_moveto(csi->ctx, pr->path, a, b); } static void pdf_run_n(pdf_csi *csi, void *state) @@ -2486,7 +2491,7 @@ static void pdf_run_q(pdf_csi *csi, void *state) static void pdf_run_re(pdf_csi *csi, void *state) { pdf_run_state *pr = (pdf_run_state *)state; - fz_context *ctx = csi->doc->ctx; + fz_context *ctx = csi->ctx; float x, y, w, h; x = csi->stack[0]; @@ -2506,7 +2511,7 @@ static void pdf_run_rg(pdf_csi *csi, void *state) pdf_run_state *pr = (pdf_run_state *)state; pr->dev->flags &= ~FZ_DEVFLAG_FILLCOLOR_UNDEFINED; - pdf_set_colorspace(csi, pr, PDF_FILL, fz_device_rgb(csi->doc->ctx)); + pdf_set_colorspace(csi, pr, PDF_FILL, fz_device_rgb(csi->ctx)); pdf_set_color(csi, pr, PDF_FILL, csi->stack); } @@ -2524,23 +2529,23 @@ static void pdf_run_s(pdf_csi *csi, void *state) static void pdf_run_sh(pdf_csi *csi, void *state) { pdf_run_state *pr = (pdf_run_state *)state; - fz_context *ctx = csi->doc->ctx; + fz_context *ctx = csi->ctx; pdf_obj *rdb = csi->rdb; pdf_obj *dict; pdf_obj *obj; fz_shade *shd; - dict = pdf_dict_gets(rdb, "Shading"); + dict = pdf_dict_gets(ctx, rdb, "Shading"); if (!dict) fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find shading dictionary"); - obj = pdf_dict_gets(dict, csi->name); + obj = pdf_dict_gets(ctx, dict, csi->name); if (!obj) fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find shading resource: '%s'", csi->name); if ((pr->dev->hints & FZ_IGNORE_SHADE) == 0) { - shd = pdf_load_shading(csi->doc, obj); + shd = pdf_load_shading(ctx, csi->doc, obj); fz_try(ctx) { @@ -2566,7 +2571,7 @@ static void pdf_run_v(pdf_csi *csi, void *state) b = csi->stack[1]; c = csi->stack[2]; d = csi->stack[3]; - fz_curvetov(csi->doc->ctx, pr->path, a, b, c, d); + fz_curvetov(csi->ctx, pr->path, a, b, c, d); } static void pdf_run_w(pdf_csi *csi, void *state) @@ -2576,7 +2581,7 @@ static void pdf_run_w(pdf_csi *csi, void *state) gstate = pdf_flush_text(csi, pr); /* linewidth affects stroked text rendering mode */ pr->dev->flags &= ~FZ_DEVFLAG_LINEWIDTH_UNDEFINED; - gstate->stroke_state = fz_unshare_stroke_state(csi->doc->ctx, gstate->stroke_state); + gstate->stroke_state = fz_unshare_stroke_state(csi->ctx, gstate->stroke_state); gstate->stroke_state->linewidth = csi->stack[0]; } @@ -2589,7 +2594,7 @@ static void pdf_run_y(pdf_csi *csi, void *state) b = csi->stack[1]; c = csi->stack[2]; d = csi->stack[3]; - fz_curvetoy(csi->doc->ctx, pr->path, a, b, c, d); + fz_curvetoy(csi->ctx, pr->path, a, b, c, d); } static void pdf_run_squote(pdf_csi *csi, void *state) @@ -2625,7 +2630,7 @@ static void pdf_run_dquote(pdf_csi *csi, void *state) static void free_processor_normal(pdf_csi *csi, void *state) { - fz_context *ctx = csi->doc->ctx; + fz_context *ctx = csi->ctx; pdf_run_state *pr = (pdf_run_state *)state; while (pr->gtop) @@ -2640,7 +2645,7 @@ static void free_processor_normal(pdf_csi *csi, void *state) fz_drop_stroke_state(ctx, pr->gstate[0].stroke_state); while (pr->gstate[0].clip_depth--) - fz_pop_clip(pr->dev); + fz_pop_clip(ctx, pr->dev); if (pr->path) fz_drop_path(ctx, pr->path); if (pr->text) fz_drop_text(ctx, pr->text); @@ -2656,10 +2661,10 @@ process_annot(pdf_csi *csi, void *state, pdf_obj *resources, pdf_annot *annot) fz_context *ctx = pr->ctx; int flags; - if (pdf_is_hidden_ocg(pdf_dict_gets(annot->obj, "OC"), csi, pr, resources)) + if (pdf_is_hidden_ocg(pdf_dict_gets(ctx, annot->obj, "OC"), csi, pr, resources)) return; - flags = pdf_to_int(pdf_dict_gets(annot->obj, "F")); + flags = pdf_to_int(ctx, pdf_dict_gets(ctx, annot->obj, "F")); if (!strcmp(pr->event, "Print") && !(flags & (1 << 2))) /* Print */ return; if (!strcmp(pr->event, "View") && (flags & (1 << 5))) /* NoView */ @@ -2810,9 +2815,8 @@ const pdf_processor pdf_processor_normal = process_contents }; -pdf_process *pdf_process_run(pdf_process *process, fz_device *dev, const fz_matrix *ctm, const char *event, pdf_gstate *gstate, int nested) +pdf_process *pdf_init_process_run(fz_context *ctx, pdf_process *process, fz_device *dev, const fz_matrix *ctm, const char *event, pdf_gstate *gstate, int nested) { - fz_context *ctx = dev->ctx; pdf_run_state *pr; pr = fz_malloc_struct(ctx, pdf_run_state); diff --git a/source/pdf/pdf-outline.c b/source/pdf/pdf-outline.c index 4e4ad642..34bb79ed 100644 --- a/source/pdf/pdf-outline.c +++ b/source/pdf/pdf-outline.c @@ -1,9 +1,8 @@ #include "mupdf/pdf.h" static fz_outline * -pdf_load_outline_imp(pdf_document *doc, pdf_obj *dict) +pdf_load_outline_imp(fz_context *ctx, pdf_document *doc, pdf_obj *dict) { - fz_context *ctx = doc->ctx; fz_outline *node, **prev, *first; pdf_obj *obj; pdf_obj *odict = dict; @@ -15,9 +14,9 @@ pdf_load_outline_imp(pdf_document *doc, pdf_obj *dict) { first = NULL; prev = &first; - while (dict && pdf_is_dict(dict)) + while (dict && pdf_is_dict(ctx, dict)) { - if (pdf_mark_obj(dict)) + if (pdf_mark_obj(ctx, dict)) break; node = fz_malloc_struct(ctx, fz_outline); node->title = NULL; @@ -27,26 +26,26 @@ pdf_load_outline_imp(pdf_document *doc, pdf_obj *dict) *prev = node; prev = &node->next; - obj = pdf_dict_gets(dict, "Title"); + obj = pdf_dict_gets(ctx, dict, "Title"); if (obj) - node->title = pdf_to_utf8(doc, obj); + node->title = pdf_to_utf8(ctx, doc, obj); - if ((obj = pdf_dict_gets(dict, "Dest")) != NULL) - node->dest = pdf_parse_link_dest(doc, FZ_LINK_GOTO, obj); - else if ((obj = pdf_dict_gets(dict, "A")) != NULL) - node->dest = pdf_parse_action(doc, obj); + if ((obj = pdf_dict_gets(ctx, dict, "Dest")) != NULL) + node->dest = pdf_parse_link_dest(ctx, doc, FZ_LINK_GOTO, obj); + else if ((obj = pdf_dict_gets(ctx, dict, "A")) != NULL) + node->dest = pdf_parse_action(ctx, doc, obj); - obj = pdf_dict_gets(dict, "First"); + obj = pdf_dict_gets(ctx, dict, "First"); if (obj) - node->down = pdf_load_outline_imp(doc, obj); + node->down = pdf_load_outline_imp(ctx, doc, obj); - dict = pdf_dict_gets(dict, "Next"); + dict = pdf_dict_gets(ctx, dict, "Next"); } } fz_always(ctx) { - for (dict = odict; dict && pdf_obj_marked(dict); dict = pdf_dict_gets(dict, "Next")) - pdf_unmark_obj(dict); + for (dict = odict; dict && pdf_obj_marked(ctx, dict); dict = pdf_dict_gets(ctx, dict, "Next")) + pdf_unmark_obj(ctx, dict); } fz_catch(ctx) { @@ -58,15 +57,15 @@ pdf_load_outline_imp(pdf_document *doc, pdf_obj *dict) } fz_outline * -pdf_load_outline(pdf_document *doc) +pdf_load_outline(fz_context *ctx, pdf_document *doc) { pdf_obj *root, *obj, *first; - root = pdf_dict_gets(pdf_trailer(doc), "Root"); - obj = pdf_dict_gets(root, "Outlines"); - first = pdf_dict_gets(obj, "First"); + root = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Root"); + obj = pdf_dict_gets(ctx, root, "Outlines"); + first = pdf_dict_gets(ctx, obj, "First"); if (first) - return pdf_load_outline_imp(doc, first); + return pdf_load_outline_imp(ctx, doc, first); return NULL; } diff --git a/source/pdf/pdf-page.c b/source/pdf/pdf-page.c index cf4d1803..c9c92307 100644 --- a/source/pdf/pdf-page.c +++ b/source/pdf/pdf-page.c @@ -1,12 +1,12 @@ #include "mupdf/pdf.h" int -pdf_count_pages(pdf_document *doc) +pdf_count_pages(fz_context *ctx, pdf_document *doc) { if (doc->page_count == 0) { - pdf_obj *count = pdf_dict_getp(pdf_trailer(doc), "Root/Pages/Count"); - doc->page_count = pdf_to_int(count); + pdf_obj *count = pdf_dict_getp(ctx, pdf_trailer(ctx, doc), "Root/Pages/Count"); + doc->page_count = pdf_to_int(ctx, count); } return doc->page_count; } @@ -17,9 +17,8 @@ enum }; static pdf_obj * -pdf_lookup_page_loc_imp(pdf_document *doc, pdf_obj *node, int *skip, pdf_obj **parentp, int *indexp) +pdf_lookup_page_loc_imp(fz_context *ctx, pdf_document *doc, pdf_obj *node, int *skip, pdf_obj **parentp, int *indexp) { - fz_context *ctx = doc->ctx; pdf_obj *kids; pdf_obj *hit = NULL; int i, len; @@ -37,8 +36,8 @@ pdf_lookup_page_loc_imp(pdf_document *doc, pdf_obj *node, int *skip, pdf_obj **p { do { - kids = pdf_dict_gets(node, "Kids"); - len = pdf_array_len(kids); + kids = pdf_dict_gets(ctx, node, "Kids"); + len = pdf_array_len(ctx, kids); if (len == 0) fz_throw(ctx, FZ_ERROR_GENERIC, "Malformed pages tree"); @@ -57,16 +56,16 @@ pdf_lookup_page_loc_imp(pdf_document *doc, pdf_obj *node, int *skip, pdf_obj **p } stack[stack_len++] = node; - if (pdf_mark_obj(node)) + if (pdf_mark_obj(ctx, node)) fz_throw(ctx, FZ_ERROR_GENERIC, "cycle in page tree"); for (i = 0; i < len; i++) { - pdf_obj *kid = pdf_array_get(kids, i); - char *type = pdf_to_name(pdf_dict_gets(kid, "Type")); - if (*type ? !strcmp(type, "Pages") : pdf_dict_gets(kid, "Kids") && !pdf_dict_gets(kid, "MediaBox")) + pdf_obj *kid = pdf_array_get(ctx, kids, i); + char *type = pdf_to_name(ctx, pdf_dict_gets(ctx, kid, "Type")); + if (*type ? !strcmp(type, "Pages") : pdf_dict_gets(ctx, kid, "Kids") && !pdf_dict_gets(ctx, kid, "MediaBox")) { - int count = pdf_to_int(pdf_dict_gets(kid, "Count")); + int count = pdf_to_int(ctx, pdf_dict_gets(ctx, kid, "Count")); if (*skip < count) { node = kid; @@ -79,7 +78,7 @@ pdf_lookup_page_loc_imp(pdf_document *doc, pdf_obj *node, int *skip, pdf_obj **p } else { - if (*type ? strcmp(type, "Page") != 0 : !pdf_dict_gets(kid, "MediaBox")) + if (*type ? strcmp(type, "Page") != 0 : !pdf_dict_gets(ctx, kid, "MediaBox")) fz_warn(ctx, "non-page object in page tree (%s)", type); if (*skip == 0) { @@ -100,7 +99,7 @@ pdf_lookup_page_loc_imp(pdf_document *doc, pdf_obj *node, int *skip, pdf_obj **p fz_always(ctx) { for (i = stack_len; i > 0; i--) - pdf_unmark_obj(stack[i-1]); + pdf_unmark_obj(ctx, stack[i-1]); if (stack != &local_stack[0]) fz_free(ctx, stack); } @@ -113,74 +112,73 @@ pdf_lookup_page_loc_imp(pdf_document *doc, pdf_obj *node, int *skip, pdf_obj **p } pdf_obj * -pdf_lookup_page_loc(pdf_document *doc, int needle, pdf_obj **parentp, int *indexp) +pdf_lookup_page_loc(fz_context *ctx, pdf_document *doc, int needle, pdf_obj **parentp, int *indexp) { - pdf_obj *root = pdf_dict_gets(pdf_trailer(doc), "Root"); - pdf_obj *node = pdf_dict_gets(root, "Pages"); + pdf_obj *root = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Root"); + pdf_obj *node = pdf_dict_gets(ctx, root, "Pages"); int skip = needle; pdf_obj *hit; if (!node) - fz_throw(doc->ctx, FZ_ERROR_GENERIC, "cannot find page tree"); + fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find page tree"); - hit = pdf_lookup_page_loc_imp(doc, node, &skip, parentp, indexp); + hit = pdf_lookup_page_loc_imp(ctx, doc, node, &skip, parentp, indexp); if (!hit) - fz_throw(doc->ctx, FZ_ERROR_GENERIC, "cannot find page %d in page tree", needle); + fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find page %d in page tree", needle); return hit; } pdf_obj * -pdf_lookup_page_obj(pdf_document *doc, int needle) +pdf_lookup_page_obj(fz_context *ctx, pdf_document *doc, int needle) { - return pdf_lookup_page_loc(doc, needle, NULL, NULL); + return pdf_lookup_page_loc(ctx, doc, needle, NULL, NULL); } static int -pdf_count_pages_before_kid(pdf_document *doc, pdf_obj *parent, int kid_num) +pdf_count_pages_before_kid(fz_context *ctx, pdf_document *doc, pdf_obj *parent, int kid_num) { - pdf_obj *kids = pdf_dict_gets(parent, "Kids"); - int i, total = 0, len = pdf_array_len(kids); + pdf_obj *kids = pdf_dict_gets(ctx, parent, "Kids"); + int i, total = 0, len = pdf_array_len(ctx, kids); for (i = 0; i < len; i++) { - pdf_obj *kid = pdf_array_get(kids, i); - if (pdf_to_num(kid) == kid_num) + pdf_obj *kid = pdf_array_get(ctx, kids, i); + if (pdf_to_num(ctx, kid) == kid_num) return total; - if (!strcmp(pdf_to_name(pdf_dict_gets(kid, "Type")), "Pages")) + if (!strcmp(pdf_to_name(ctx, pdf_dict_gets(ctx, kid, "Type")), "Pages")) { - pdf_obj *count = pdf_dict_gets(kid, "Count"); - int n = pdf_to_int(count); - if (!pdf_is_int(count) || n < 0) - fz_throw(doc->ctx, FZ_ERROR_GENERIC, "illegal or missing count in pages tree"); + pdf_obj *count = pdf_dict_gets(ctx, kid, "Count"); + int n = pdf_to_int(ctx, count); + if (!pdf_is_int(ctx, count) || n < 0) + fz_throw(ctx, FZ_ERROR_GENERIC, "illegal or missing count in pages tree"); total += n; } else total++; } - fz_throw(doc->ctx, FZ_ERROR_GENERIC, "kid not found in parent's kids array"); + fz_throw(ctx, FZ_ERROR_GENERIC, "kid not found in parent's kids array"); } int -pdf_lookup_page_number(pdf_document *doc, pdf_obj *node) +pdf_lookup_page_number(fz_context *ctx, pdf_document *doc, pdf_obj *node) { - fz_context *ctx = doc->ctx; - int needle = pdf_to_num(node); + int needle = pdf_to_num(ctx, node); int total = 0; pdf_obj *parent, *parent2; - if (strcmp(pdf_to_name(pdf_dict_gets(node, "Type")), "Page") != 0) + if (strcmp(pdf_to_name(ctx, pdf_dict_gets(ctx, node, "Type")), "Page") != 0) fz_throw(ctx, FZ_ERROR_GENERIC, "invalid page object"); - parent2 = parent = pdf_dict_gets(node, "Parent"); + parent2 = parent = pdf_dict_gets(ctx, node, "Parent"); fz_var(parent); fz_try(ctx) { - while (pdf_is_dict(parent)) + while (pdf_is_dict(ctx, parent)) { - if (pdf_mark_obj(parent)) + if (pdf_mark_obj(ctx, parent)) fz_throw(ctx, FZ_ERROR_GENERIC, "cycle in page tree (parents)"); - total += pdf_count_pages_before_kid(doc, parent, needle); - needle = pdf_to_num(parent); - parent = pdf_dict_gets(parent, "Parent"); + total += pdf_count_pages_before_kid(ctx, doc, parent, needle); + needle = pdf_to_num(ctx, parent); + parent = pdf_dict_gets(ctx, parent, "Parent"); } } fz_always(ctx) @@ -188,10 +186,10 @@ pdf_lookup_page_number(pdf_document *doc, pdf_obj *node) /* Run back and unmark */ while (parent2) { - pdf_unmark_obj(parent2); + pdf_unmark_obj(ctx, parent2); if (parent2 == parent) break; - parent2 = pdf_dict_gets(parent2, "Parent"); + parent2 = pdf_dict_gets(ctx, parent2, "Parent"); } } fz_catch(ctx) @@ -203,9 +201,8 @@ pdf_lookup_page_number(pdf_document *doc, pdf_obj *node) } static pdf_obj * -pdf_lookup_inherited_page_item(pdf_document *doc, pdf_obj *node, const char *key) +pdf_lookup_inherited_page_item(fz_context *ctx, pdf_document *doc, pdf_obj *node, const char *key) { - fz_context *ctx = doc->ctx; pdf_obj *node2 = node; pdf_obj *val; @@ -215,12 +212,12 @@ pdf_lookup_inherited_page_item(pdf_document *doc, pdf_obj *node, const char *key { do { - val = pdf_dict_gets(node, key); + val = pdf_dict_gets(ctx, node, key); if (val) break; - if (pdf_mark_obj(node)) + if (pdf_mark_obj(ctx, node)) fz_throw(ctx, FZ_ERROR_GENERIC, "cycle in page tree (parents)"); - node = pdf_dict_gets(node, "Parent"); + node = pdf_dict_gets(ctx, node, "Parent"); } while (node); } @@ -228,10 +225,10 @@ pdf_lookup_inherited_page_item(pdf_document *doc, pdf_obj *node, const char *key { do { - pdf_unmark_obj(node2); + pdf_unmark_obj(ctx, node2); if (node2 == node) break; - node2 = pdf_dict_gets(node2, "Parent"); + node2 = pdf_dict_gets(ctx, node2, "Parent"); } while (node2); } @@ -245,41 +242,40 @@ pdf_lookup_inherited_page_item(pdf_document *doc, pdf_obj *node, const char *key /* We need to know whether to install a page-level transparency group */ -static int pdf_resources_use_blending(pdf_document *doc, pdf_obj *rdb); +static int pdf_resources_use_blending(fz_context *ctx, pdf_document *doc, pdf_obj *rdb); static int -pdf_extgstate_uses_blending(pdf_document *doc, pdf_obj *dict) +pdf_extgstate_uses_blending(fz_context *ctx, pdf_document *doc, pdf_obj *dict) { - pdf_obj *obj = pdf_dict_gets(dict, "BM"); - if (pdf_is_name(obj) && strcmp(pdf_to_name(obj), "Normal")) + pdf_obj *obj = pdf_dict_gets(ctx, dict, "BM"); + if (pdf_is_name(ctx, obj) && strcmp(pdf_to_name(ctx, obj), "Normal")) return 1; return 0; } static int -pdf_pattern_uses_blending(pdf_document *doc, pdf_obj *dict) +pdf_pattern_uses_blending(fz_context *ctx, pdf_document *doc, pdf_obj *dict) { pdf_obj *obj; - obj = pdf_dict_gets(dict, "Resources"); - if (pdf_resources_use_blending(doc, obj)) + obj = pdf_dict_gets(ctx, dict, "Resources"); + if (pdf_resources_use_blending(ctx, doc, obj)) return 1; - obj = pdf_dict_gets(dict, "ExtGState"); - return pdf_extgstate_uses_blending(doc, obj); + obj = pdf_dict_gets(ctx, dict, "ExtGState"); + return pdf_extgstate_uses_blending(ctx, doc, obj); } static int -pdf_xobject_uses_blending(pdf_document *doc, pdf_obj *dict) +pdf_xobject_uses_blending(fz_context *ctx, pdf_document *doc, pdf_obj *dict) { - pdf_obj *obj = pdf_dict_gets(dict, "Resources"); - if (!strcmp(pdf_to_name(pdf_dict_getp(dict, "Group/S")), "Transparency")) + pdf_obj *obj = pdf_dict_gets(ctx, dict, "Resources"); + if (!strcmp(pdf_to_name(ctx, pdf_dict_getp(ctx, dict, "Group/S")), "Transparency")) return 1; - return pdf_resources_use_blending(doc, obj); + return pdf_resources_use_blending(ctx, doc, obj); } static int -pdf_resources_use_blending(pdf_document *doc, pdf_obj *rdb) +pdf_resources_use_blending(fz_context *ctx, pdf_document *doc, pdf_obj *rdb) { - fz_context *ctx = doc->ctx; pdf_obj *obj; int i, n, useBM = 0; @@ -287,31 +283,31 @@ pdf_resources_use_blending(pdf_document *doc, pdf_obj *rdb) return 0; /* Have we been here before and remembered an answer? */ - if (pdf_obj_memo(rdb, &useBM)) + if (pdf_obj_memo(ctx, rdb, &useBM)) return useBM; /* stop on cyclic resource dependencies */ - if (pdf_mark_obj(rdb)) + if (pdf_mark_obj(ctx, rdb)) return 0; fz_try(ctx) { - obj = pdf_dict_gets(rdb, "ExtGState"); - n = pdf_dict_len(obj); + obj = pdf_dict_gets(ctx, rdb, "ExtGState"); + n = pdf_dict_len(ctx, obj); for (i = 0; i < n; i++) - if (pdf_extgstate_uses_blending(doc, pdf_dict_get_val(obj, i))) + if (pdf_extgstate_uses_blending(ctx, doc, pdf_dict_get_val(ctx, obj, i))) goto found; - obj = pdf_dict_gets(rdb, "Pattern"); - n = pdf_dict_len(obj); + obj = pdf_dict_gets(ctx, rdb, "Pattern"); + n = pdf_dict_len(ctx, obj); for (i = 0; i < n; i++) - if (pdf_pattern_uses_blending(doc, pdf_dict_get_val(obj, i))) + if (pdf_pattern_uses_blending(ctx, doc, pdf_dict_get_val(ctx, obj, i))) goto found; - obj = pdf_dict_gets(rdb, "XObject"); - n = pdf_dict_len(obj); + obj = pdf_dict_gets(ctx, rdb, "XObject"); + n = pdf_dict_len(ctx, obj); for (i = 0; i < n; i++) - if (pdf_xobject_uses_blending(doc, pdf_dict_get_val(obj, i))) + if (pdf_xobject_uses_blending(ctx, doc, pdf_dict_get_val(ctx, obj, i))) goto found; if (0) { @@ -321,36 +317,36 @@ found: } fz_always(ctx) { - pdf_unmark_obj(rdb); + pdf_unmark_obj(ctx, rdb); } fz_catch(ctx) { fz_rethrow(ctx); } - pdf_set_obj_memo(rdb, useBM); + pdf_set_obj_memo(ctx, rdb, useBM); return useBM; } static void -pdf_load_transition(pdf_document *doc, pdf_page *page, pdf_obj *transdict) +pdf_load_transition(fz_context *ctx, pdf_document *doc, pdf_page *page, pdf_obj *transdict) { char *name; pdf_obj *obj; int type; - obj = pdf_dict_gets(transdict, "D"); - page->transition.duration = (obj ? pdf_to_real(obj) : 1); + obj = pdf_dict_gets(ctx, transdict, "D"); + page->transition.duration = (obj ? pdf_to_real(ctx, obj) : 1); - page->transition.vertical = (pdf_to_name(pdf_dict_gets(transdict, "Dm"))[0] != 'H'); - page->transition.outwards = (pdf_to_name(pdf_dict_gets(transdict, "M"))[0] != 'I'); + page->transition.vertical = (pdf_to_name(ctx, pdf_dict_gets(ctx, transdict, "Dm"))[0] != 'H'); + page->transition.outwards = (pdf_to_name(ctx, pdf_dict_gets(ctx, transdict, "M"))[0] != 'I'); /* FIXME: If 'Di' is None, it should be handled differently, but * this only affects Fly, and we don't implement that currently. */ - page->transition.direction = (pdf_to_int(pdf_dict_gets(transdict, "Di"))); + page->transition.direction = (pdf_to_int(ctx, pdf_dict_gets(ctx, transdict, "Di"))); /* FIXME: Read SS for Fly when we implement it */ /* FIXME: Read B for Fly when we implement it */ - name = pdf_to_name(pdf_dict_gets(transdict, "S")); + name = pdf_to_name(ctx, pdf_dict_gets(ctx, transdict, "S")); if (!strcmp(name, "Split")) type = FZ_TRANSITION_SPLIT; else if (!strcmp(name, "Blinds")) @@ -378,10 +374,55 @@ pdf_load_transition(pdf_document *doc, pdf_page *page, pdf_obj *transdict) page->transition.type = type; } +fz_rect * +pdf_bound_page(fz_context *ctx, pdf_page *page, fz_rect *bounds) +{ + fz_matrix mtx; + fz_rect mediabox = page->mediabox; + fz_transform_rect(&mediabox, fz_rotate(&mtx, page->rotate)); + bounds->x0 = bounds->y0 = 0; + bounds->x1 = mediabox.x1 - mediabox.x0; + bounds->y1 = mediabox.y1 - mediabox.y0; + return bounds; +} + +fz_link * +pdf_load_links(fz_context *ctx, pdf_page *page) +{ + return fz_keep_link(ctx, page->links); +} + +static void +pdf_drop_page_imp(fz_context *ctx, pdf_page *page) +{ + pdf_document *doc = page->doc; + + if (page == NULL) + return; + + pdf_drop_obj(ctx, page->resources); + pdf_drop_obj(ctx, page->contents); + if (page->links) + fz_drop_link(ctx, page->links); + if (page->annots) + pdf_drop_annot(ctx, page->annots); + if (page->deleted_annots) + pdf_drop_annot(ctx, page->deleted_annots); + if (page->tmp_annots) + pdf_drop_annot(ctx, page->tmp_annots); + /* doc->focus, when not NULL, refers to one of + * the annotations and must be NULLed when the + * annotations are destroyed. doc->focus_obj + * keeps track of the actual annotation object. */ + doc->focus = NULL; + pdf_drop_obj(ctx, page->me); + + fz_drop_document(ctx, &page->doc->super); +} + pdf_page * -pdf_load_page(pdf_document *doc, int number) +pdf_load_page(fz_context *ctx, pdf_document *doc, int number) { - fz_context *ctx = doc->ctx; pdf_page *page; pdf_annot *annot; pdf_obj *pageobj, *pageref, *obj; @@ -391,15 +432,27 @@ pdf_load_page(pdf_document *doc, int number) if (doc->file_reading_linearly) { - pageref = pdf_progressive_advance(doc, number); + pageref = pdf_progressive_advance(ctx, doc, number); if (pageref == NULL) - fz_throw(doc->ctx, FZ_ERROR_TRYLATER, "page %d not available yet", number); + fz_throw(ctx, FZ_ERROR_TRYLATER, "page %d not available yet", number); } else - pageref = pdf_lookup_page_obj(doc, number); - pageobj = pdf_resolve_indirect(pageref); + pageref = pdf_lookup_page_obj(ctx, doc, number); + pageobj = pdf_resolve_indirect(ctx, pageref); page = fz_malloc_struct(ctx, pdf_page); + page->doc = (pdf_document*) fz_keep_document(ctx, &doc->super); + + page->super.drop_page_imp = (fz_page_drop_page_imp_fn *)pdf_drop_page_imp; + page->super.load_links = (fz_page_load_links_fn *)pdf_load_links; + page->super.bound_page = (fz_page_bound_page_fn *)pdf_bound_page; + page->super.first_annot = (fz_page_first_annot_fn *)pdf_first_annot; + page->super.next_annot = (fz_page_next_annot_fn *)pdf_next_annot; + page->super.bound_annot = (fz_page_bound_annot_fn *)pdf_bound_annot; + page->super.run_page_contents = (fz_page_run_page_contents_fn *)pdf_run_page_contents; + page->super.run_annot = (fz_page_run_annot_fn *)pdf_run_annot; + page->super.page_presentation = (fz_page_page_presentation_fn *)pdf_page_presentation; + page->resources = NULL; page->contents = NULL; page->transparency = 0; @@ -408,16 +461,16 @@ pdf_load_page(pdf_document *doc, int number) page->annot_tailp = &page->annots; page->deleted_annots = NULL; page->tmp_annots = NULL; - page->me = pdf_keep_obj(pageobj); + page->me = pdf_keep_obj(ctx, pageobj); page->incomplete = 0; - obj = pdf_dict_gets(pageobj, "UserUnit"); - if (pdf_is_real(obj)) - userunit = pdf_to_real(obj); + obj = pdf_dict_gets(ctx, pageobj, "UserUnit"); + if (pdf_is_real(ctx, obj)) + userunit = pdf_to_real(ctx, obj); else userunit = 1; - pdf_to_rect(ctx, pdf_lookup_inherited_page_item(doc, pageobj, "MediaBox"), &mediabox); + pdf_to_rect(ctx, pdf_lookup_inherited_page_item(ctx, doc, pageobj, "MediaBox"), &mediabox); if (fz_is_empty_rect(&mediabox)) { fz_warn(ctx, "cannot find page size for page %d", number + 1); @@ -427,7 +480,7 @@ pdf_load_page(pdf_document *doc, int number) mediabox.y1 = 792; } - pdf_to_rect(ctx, pdf_lookup_inherited_page_item(doc, pageobj, "CropBox"), &cropbox); + pdf_to_rect(ctx, pdf_lookup_inherited_page_item(ctx, doc, pageobj, "CropBox"), &cropbox); if (!fz_is_empty_rect(&cropbox)) fz_intersect_rect(&mediabox, &cropbox); @@ -442,7 +495,7 @@ pdf_load_page(pdf_document *doc, int number) page->mediabox = fz_unit_rect; } - page->rotate = pdf_to_int(pdf_lookup_inherited_page_item(doc, pageobj, "Rotate")); + page->rotate = pdf_to_int(ctx, pdf_lookup_inherited_page_item(ctx, doc, pageobj, "Rotate")); /* Snap page->rotate to 0, 90, 180 or 270 */ if (page->rotate < 0) page->rotate = 360 - ((-page->rotate) % 360); @@ -460,11 +513,11 @@ pdf_load_page(pdf_document *doc, int number) fz_try(ctx) { - obj = pdf_dict_gets(pageobj, "Annots"); + obj = pdf_dict_gets(ctx, pageobj, "Annots"); if (obj) { - page->links = pdf_load_link_annots(doc, obj, &page->ctm); - pdf_load_annots(doc, page, obj); + page->links = pdf_load_link_annots(ctx, doc, obj, &page->ctm); + pdf_load_annots(ctx, doc, page, obj); } } fz_catch(ctx) @@ -476,40 +529,40 @@ pdf_load_page(pdf_document *doc, int number) page->links = NULL; } - page->duration = pdf_to_real(pdf_dict_gets(pageobj, "Dur")); + page->duration = pdf_to_real(ctx, pdf_dict_gets(ctx, pageobj, "Dur")); - obj = pdf_dict_gets(pageobj, "Trans"); + obj = pdf_dict_gets(ctx, pageobj, "Trans"); page->transition_present = (obj != NULL); if (obj) { - pdf_load_transition(doc, page, obj); + pdf_load_transition(ctx, doc, page, obj); } // TODO: inherit - page->resources = pdf_lookup_inherited_page_item(doc, pageobj, "Resources"); + page->resources = pdf_lookup_inherited_page_item(ctx, doc, pageobj, "Resources"); if (page->resources) - pdf_keep_obj(page->resources); + pdf_keep_obj(ctx, page->resources); - obj = pdf_dict_gets(pageobj, "Contents"); + obj = pdf_dict_gets(ctx, pageobj, "Contents"); fz_try(ctx) { - page->contents = pdf_keep_obj(obj); + page->contents = pdf_keep_obj(ctx, obj); - if (pdf_resources_use_blending(doc, page->resources)) + if (pdf_resources_use_blending(ctx, doc, page->resources)) page->transparency = 1; - else if (!strcmp(pdf_to_name(pdf_dict_getp(pageobj, "Group/S")), "Transparency")) + else if (!strcmp(pdf_to_name(ctx, pdf_dict_getp(ctx, pageobj, "Group/S")), "Transparency")) page->transparency = 1; for (annot = page->annots; annot && !page->transparency; annot = annot->next) - if (annot->ap && pdf_resources_use_blending(doc, annot->ap->resources)) + if (annot->ap && pdf_resources_use_blending(ctx, doc, annot->ap->resources)) page->transparency = 1; } fz_catch(ctx) { if (fz_caught(ctx) != FZ_ERROR_TRYLATER) { - pdf_drop_page(doc, page); - fz_rethrow_message(ctx, "cannot load page %d contents (%d 0 R)", number + 1, pdf_to_num(pageref)); + fz_drop_page(ctx, &page->super); + fz_rethrow_message(ctx, "cannot load page %d contents (%d 0 R)", number + 1, pdf_to_num(ctx, pageref)); } page->incomplete |= PDF_PAGE_INCOMPLETE_CONTENTS; } @@ -517,93 +570,50 @@ pdf_load_page(pdf_document *doc, int number) return page; } -fz_rect * -pdf_bound_page(pdf_document *doc, pdf_page *page, fz_rect *bounds) -{ - fz_matrix mtx; - fz_rect mediabox = page->mediabox; - fz_transform_rect(&mediabox, fz_rotate(&mtx, page->rotate)); - bounds->x0 = bounds->y0 = 0; - bounds->x1 = mediabox.x1 - mediabox.x0; - bounds->y1 = mediabox.y1 - mediabox.y0; - return bounds; -} - -fz_link * -pdf_load_links(pdf_document *doc, pdf_page *page) -{ - return fz_keep_link(doc->ctx, page->links); -} - -void -pdf_drop_page(pdf_document *doc, pdf_page *page) -{ - if (page == NULL) - return; - pdf_drop_obj(page->resources); - pdf_drop_obj(page->contents); - if (page->links) - fz_drop_link(doc->ctx, page->links); - if (page->annots) - pdf_drop_annot(doc->ctx, page->annots); - if (page->deleted_annots) - pdf_drop_annot(doc->ctx, page->deleted_annots); - if (page->tmp_annots) - pdf_drop_annot(doc->ctx, page->tmp_annots); - /* doc->focus, when not NULL, refers to one of - * the annotations and must be NULLed when the - * annotations are destroyed. doc->focus_obj - * keeps track of the actual annotation object. */ - doc->focus = NULL; - pdf_drop_obj(page->me); - fz_free(doc->ctx, page); -} - void -pdf_delete_page(pdf_document *doc, int at) +pdf_delete_page(fz_context *ctx, pdf_document *doc, int at) { pdf_obj *parent, *kids; int i; - pdf_lookup_page_loc(doc, at, &parent, &i); - kids = pdf_dict_gets(parent, "Kids"); - pdf_array_delete(kids, i); + pdf_lookup_page_loc(ctx, doc, at, &parent, &i); + kids = pdf_dict_gets(ctx, parent, "Kids"); + pdf_array_delete(ctx, kids, i); while (parent) { - int count = pdf_to_int(pdf_dict_gets(parent, "Count")); - pdf_dict_puts_drop(parent, "Count", pdf_new_int(doc, count - 1)); - parent = pdf_dict_gets(parent, "Parent"); + int count = pdf_to_int(ctx, pdf_dict_gets(ctx, parent, "Count")); + pdf_dict_puts_drop(ctx, parent, "Count", pdf_new_int(ctx, doc, count - 1)); + parent = pdf_dict_gets(ctx, parent, "Parent"); } doc->page_count = 0; /* invalidate cached value */ } void -pdf_insert_page(pdf_document *doc, pdf_page *page, int at) +pdf_insert_page(fz_context *ctx, pdf_document *doc, pdf_page *page, int at) { - fz_context *ctx = doc->ctx; - int count = pdf_count_pages(doc); + int count = pdf_count_pages(ctx, doc); pdf_obj *parent, *kids; pdf_obj *page_ref; int i; - page_ref = pdf_new_ref(doc, page->me); + page_ref = pdf_new_ref(ctx, doc, page->me); fz_try(ctx) { if (count == 0) { - pdf_obj *root = pdf_dict_gets(pdf_trailer(doc), "Root"); - parent = pdf_dict_gets(root, "Pages"); + pdf_obj *root = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Root"); + parent = pdf_dict_gets(ctx, root, "Pages"); if (!parent) - fz_throw(doc->ctx, FZ_ERROR_GENERIC, "cannot find page tree"); + fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find page tree"); - kids = pdf_dict_gets(parent, "Kids"); + kids = pdf_dict_gets(ctx, parent, "Kids"); if (!kids) - fz_throw(doc->ctx, FZ_ERROR_GENERIC, "malformed page tree"); + fz_throw(ctx, FZ_ERROR_GENERIC, "malformed page tree"); - pdf_array_insert(kids, page_ref, 0); + pdf_array_insert(ctx, kids, page_ref, 0); } else if (at >= count) { @@ -614,32 +624,32 @@ pdf_insert_page(pdf_document *doc, pdf_page *page, int at) fz_throw(ctx, FZ_ERROR_GENERIC, "cannot insert page beyond end of page tree"); /* append after last page */ - pdf_lookup_page_loc(doc, count - 1, &parent, &i); - kids = pdf_dict_gets(parent, "Kids"); - pdf_array_insert(kids, page_ref, i + 1); + pdf_lookup_page_loc(ctx, doc, count - 1, &parent, &i); + kids = pdf_dict_gets(ctx, parent, "Kids"); + pdf_array_insert(ctx, kids, page_ref, i + 1); } else { /* insert before found page */ - pdf_lookup_page_loc(doc, at, &parent, &i); - kids = pdf_dict_gets(parent, "Kids"); - pdf_array_insert(kids, page_ref, i); + pdf_lookup_page_loc(ctx, doc, at, &parent, &i); + kids = pdf_dict_gets(ctx, parent, "Kids"); + pdf_array_insert(ctx, kids, page_ref, i); } - pdf_dict_puts(page->me, "Parent", parent); + pdf_dict_puts(ctx, page->me, "Parent", parent); /* Adjust page counts */ while (parent) { - int count = pdf_to_int(pdf_dict_gets(parent, "Count")); - pdf_dict_puts_drop(parent, "Count", pdf_new_int(doc, count + 1)); - parent = pdf_dict_gets(parent, "Parent"); + int count = pdf_to_int(ctx, pdf_dict_gets(ctx, parent, "Count")); + pdf_dict_puts_drop(ctx, parent, "Count", pdf_new_int(ctx, doc, count + 1)); + parent = pdf_dict_gets(ctx, parent, "Parent"); } } fz_always(ctx) { - pdf_drop_obj(page_ref); + pdf_drop_obj(ctx, page_ref); } fz_catch(ctx) { @@ -650,19 +660,18 @@ pdf_insert_page(pdf_document *doc, pdf_page *page, int at) } void -pdf_delete_page_range(pdf_document *doc, int start, int end) +pdf_delete_page_range(fz_context *ctx, pdf_document *doc, int start, int end) { while (start < end) - pdf_delete_page(doc, start++); + pdf_delete_page(ctx, doc, start++); } pdf_page * -pdf_create_page(pdf_document *doc, fz_rect mediabox, int res, int rotate) +pdf_create_page(fz_context *ctx, pdf_document *doc, fz_rect mediabox, int res, int rotate) { pdf_page *page = NULL; pdf_obj *pageobj; float userunit = 1; - fz_context *ctx = doc->ctx; fz_matrix ctm, tmp; fz_rect realbox; @@ -675,15 +684,15 @@ pdf_create_page(pdf_document *doc, fz_rect mediabox, int res, int rotate) page->transparency = 0; page->links = NULL; page->annots = NULL; - page->me = pageobj = pdf_new_dict(doc, 4); + page->me = pageobj = pdf_new_dict(ctx, doc, 4); - pdf_dict_puts_drop(pageobj, "Type", pdf_new_name(doc, "Page")); + pdf_dict_puts_drop(ctx, pageobj, "Type", pdf_new_name(ctx, doc, "Page")); page->mediabox.x0 = fz_min(mediabox.x0, mediabox.x1) * userunit; page->mediabox.y0 = fz_min(mediabox.y0, mediabox.y1) * userunit; page->mediabox.x1 = fz_max(mediabox.x0, mediabox.x1) * userunit; page->mediabox.y1 = fz_max(mediabox.y0, mediabox.y1) * userunit; - pdf_dict_puts_drop(pageobj, "MediaBox", pdf_new_rect(doc, &page->mediabox)); + pdf_dict_puts_drop(ctx, pageobj, "MediaBox", pdf_new_rect(ctx, doc, &page->mediabox)); /* Snap page->rotate to 0, 90, 180 or 270 */ if (page->rotate < 0) @@ -693,7 +702,7 @@ pdf_create_page(pdf_document *doc, fz_rect mediabox, int res, int rotate) page->rotate = 90*((page->rotate + 45)/90); if (page->rotate > 360) page->rotate = 0; - pdf_dict_puts_drop(pageobj, "Rotate", pdf_new_int(doc, page->rotate)); + pdf_dict_puts_drop(ctx, pageobj, "Rotate", pdf_new_int(ctx, doc, page->rotate)); fz_pre_rotate(fz_scale(&ctm, 1, -1), -page->rotate); realbox = page->mediabox; @@ -706,7 +715,7 @@ pdf_create_page(pdf_document *doc, fz_rect mediabox, int res, int rotate) } fz_catch(ctx) { - pdf_drop_obj(page->me); + pdf_drop_obj(ctx, page->me); fz_free(ctx, page); fz_rethrow_message(ctx, "Failed to create page"); } diff --git a/source/pdf/pdf-parse.c b/source/pdf/pdf-parse.c index a2fd09db..48761374 100644 --- a/source/pdf/pdf-parse.c +++ b/source/pdf/pdf-parse.c @@ -3,10 +3,10 @@ fz_rect * pdf_to_rect(fz_context *ctx, pdf_obj *array, fz_rect *r) { - float a = pdf_to_real(pdf_array_get(array, 0)); - float b = pdf_to_real(pdf_array_get(array, 1)); - float c = pdf_to_real(pdf_array_get(array, 2)); - float d = pdf_to_real(pdf_array_get(array, 3)); + float a = pdf_to_real(ctx, pdf_array_get(ctx, array, 0)); + float b = pdf_to_real(ctx, pdf_array_get(ctx, array, 1)); + float c = pdf_to_real(ctx, pdf_array_get(ctx, array, 2)); + float d = pdf_to_real(ctx, pdf_array_get(ctx, array, 3)); r->x0 = fz_min(a, c); r->y0 = fz_min(b, d); r->x1 = fz_max(a, c); @@ -17,20 +17,19 @@ pdf_to_rect(fz_context *ctx, pdf_obj *array, fz_rect *r) fz_matrix * pdf_to_matrix(fz_context *ctx, pdf_obj *array, fz_matrix *m) { - m->a = pdf_to_real(pdf_array_get(array, 0)); - m->b = pdf_to_real(pdf_array_get(array, 1)); - m->c = pdf_to_real(pdf_array_get(array, 2)); - m->d = pdf_to_real(pdf_array_get(array, 3)); - m->e = pdf_to_real(pdf_array_get(array, 4)); - m->f = pdf_to_real(pdf_array_get(array, 5)); + m->a = pdf_to_real(ctx, pdf_array_get(ctx, array, 0)); + m->b = pdf_to_real(ctx, pdf_array_get(ctx, array, 1)); + m->c = pdf_to_real(ctx, pdf_array_get(ctx, array, 2)); + m->d = pdf_to_real(ctx, pdf_array_get(ctx, array, 3)); + m->e = pdf_to_real(ctx, pdf_array_get(ctx, array, 4)); + m->f = pdf_to_real(ctx, pdf_array_get(ctx, array, 5)); return m; } /* Convert Unicode/PdfDocEncoding string into utf-8 */ char * -pdf_to_utf8(pdf_document *doc, pdf_obj *src) +pdf_to_utf8(fz_context *ctx, pdf_document *doc, pdf_obj *src) { - fz_context *ctx = doc->ctx; fz_buffer *strmbuf = NULL; unsigned char *srcptr; char *dstptr, *dst; @@ -42,14 +41,14 @@ pdf_to_utf8(pdf_document *doc, pdf_obj *src) fz_var(strmbuf); fz_try(ctx) { - if (pdf_is_string(src)) + if (pdf_is_string(ctx, src)) { - srcptr = (unsigned char *) pdf_to_str_buf(src); - srclen = pdf_to_str_len(src); + srcptr = (unsigned char *) pdf_to_str_buf(ctx, src); + srclen = pdf_to_str_len(ctx, src); } - else if (pdf_is_stream(doc, pdf_to_num(src), pdf_to_gen(src))) + else if (pdf_is_stream(ctx, doc, pdf_to_num(ctx, src), pdf_to_gen(ctx, src))) { - strmbuf = pdf_load_stream(doc, pdf_to_num(src), pdf_to_gen(src)); + strmbuf = pdf_load_stream(ctx, doc, pdf_to_num(ctx, src), pdf_to_gen(ctx, src)); srclen = fz_buffer_storage(ctx, strmbuf, (unsigned char **)&srcptr); } else @@ -118,12 +117,11 @@ pdf_to_utf8(pdf_document *doc, pdf_obj *src) /* Convert Unicode/PdfDocEncoding string into ucs-2 */ unsigned short * -pdf_to_ucs2(pdf_document *doc, pdf_obj *src) +pdf_to_ucs2(fz_context *ctx, pdf_document *doc, pdf_obj *src) { - fz_context *ctx = doc->ctx; - unsigned char *srcptr = (unsigned char *) pdf_to_str_buf(src); + unsigned char *srcptr = (unsigned char *) pdf_to_str_buf(ctx, src); unsigned short *dstptr, *dst; - int srclen = pdf_to_str_len(src); + int srclen = pdf_to_str_len(ctx, src); int i; if (srclen >= 2 && srcptr[0] == 254 && srcptr[1] == 255) @@ -152,11 +150,11 @@ pdf_to_ucs2(pdf_document *doc, pdf_obj *src) /* allow to convert to UCS-2 without the need for an fz_context */ /* (buffer must be at least (fz_to_str_len(src) + 1) * 2 bytes in size) */ void -pdf_to_ucs2_buf(unsigned short *buffer, pdf_obj *src) +pdf_to_ucs2_buf(fz_context *ctx, unsigned short *buffer, pdf_obj *src) { - unsigned char *srcptr = (unsigned char *) pdf_to_str_buf(src); + unsigned char *srcptr = (unsigned char *) pdf_to_str_buf(ctx, src); unsigned short *dstptr = buffer; - int srclen = pdf_to_str_len(src); + int srclen = pdf_to_str_len(ctx, src); int i; if (srclen >= 2 && srcptr[0] == 254 && srcptr[1] == 255) @@ -180,9 +178,8 @@ pdf_to_ucs2_buf(unsigned short *buffer, pdf_obj *src) /* Convert UCS-2 string into PdfDocEncoding for authentication */ char * -pdf_from_ucs2(pdf_document *doc, unsigned short *src) +pdf_from_ucs2(fz_context *ctx, pdf_document *doc, unsigned short *src) { - fz_context *ctx = doc->ctx; int i, j, len; char *docstr; @@ -219,48 +216,47 @@ pdf_from_ucs2(pdf_document *doc, unsigned short *src) } pdf_obj * -pdf_to_utf8_name(pdf_document *doc, pdf_obj *src) +pdf_to_utf8_name(fz_context *ctx, pdf_document *doc, pdf_obj *src) { - char *buf = pdf_to_utf8(doc, src); - pdf_obj *dst = pdf_new_name(doc, buf); - fz_free(doc->ctx, buf); + char *buf = pdf_to_utf8(ctx, doc, src); + pdf_obj *dst = pdf_new_name(ctx, doc, buf); + fz_free(ctx, buf); return dst; } pdf_obj * -pdf_parse_array(pdf_document *doc, fz_stream *file, pdf_lexbuf *buf) +pdf_parse_array(fz_context *ctx, pdf_document *doc, fz_stream *file, pdf_lexbuf *buf) { pdf_obj *ary = NULL; pdf_obj *obj = NULL; int a = 0, b = 0, n = 0; pdf_token tok; - fz_context *ctx = file->ctx; pdf_obj *op = NULL; fz_var(obj); - ary = pdf_new_array(doc, 4); + ary = pdf_new_array(ctx, doc, 4); fz_try(ctx) { while (1) { - tok = pdf_lex(file, buf); + tok = pdf_lex(ctx, file, buf); if (tok != PDF_TOK_INT && tok != PDF_TOK_R) { if (n > 0) { - obj = pdf_new_int(doc, a); - pdf_array_push(ary, obj); - pdf_drop_obj(obj); + obj = pdf_new_int(ctx, doc, a); + pdf_array_push(ctx, ary, obj); + pdf_drop_obj(ctx, obj); obj = NULL; } if (n > 1) { - obj = pdf_new_int(doc, b); - pdf_array_push(ary, obj); - pdf_drop_obj(obj); + obj = pdf_new_int(ctx, doc, b); + pdf_array_push(ctx, ary, obj); + pdf_drop_obj(ctx, obj); obj = NULL; } n = 0; @@ -268,9 +264,9 @@ pdf_parse_array(pdf_document *doc, fz_stream *file, pdf_lexbuf *buf) if (tok == PDF_TOK_INT && n == 2) { - obj = pdf_new_int(doc, a); - pdf_array_push(ary, obj); - pdf_drop_obj(obj); + obj = pdf_new_int(ctx, doc, a); + pdf_array_push(ctx, ary, obj); + pdf_drop_obj(ctx, obj); obj = NULL; a = b; n --; @@ -293,61 +289,61 @@ pdf_parse_array(pdf_document *doc, fz_stream *file, pdf_lexbuf *buf) case PDF_TOK_R: if (n != 2) fz_throw(ctx, FZ_ERROR_GENERIC, "cannot parse indirect reference in array"); - obj = pdf_new_indirect(doc, a, b); - pdf_array_push(ary, obj); - pdf_drop_obj(obj); + obj = pdf_new_indirect(ctx, doc, a, b); + pdf_array_push(ctx, ary, obj); + pdf_drop_obj(ctx, obj); obj = NULL; n = 0; break; case PDF_TOK_OPEN_ARRAY: - obj = pdf_parse_array(doc, file, buf); - pdf_array_push(ary, obj); - pdf_drop_obj(obj); + obj = pdf_parse_array(ctx, doc, file, buf); + pdf_array_push(ctx, ary, obj); + pdf_drop_obj(ctx, obj); obj = NULL; break; case PDF_TOK_OPEN_DICT: - obj = pdf_parse_dict(doc, file, buf); - pdf_array_push(ary, obj); - pdf_drop_obj(obj); + obj = pdf_parse_dict(ctx, doc, file, buf); + pdf_array_push(ctx, ary, obj); + pdf_drop_obj(ctx, obj); obj = NULL; break; case PDF_TOK_NAME: - obj = pdf_new_name(doc, buf->scratch); - pdf_array_push(ary, obj); - pdf_drop_obj(obj); + obj = pdf_new_name(ctx, doc, buf->scratch); + pdf_array_push(ctx, ary, obj); + pdf_drop_obj(ctx, obj); obj = NULL; break; case PDF_TOK_REAL: - obj = pdf_new_real(doc, buf->f); - pdf_array_push(ary, obj); - pdf_drop_obj(obj); + obj = pdf_new_real(ctx, doc, buf->f); + pdf_array_push(ctx, ary, obj); + pdf_drop_obj(ctx, obj); obj = NULL; break; case PDF_TOK_STRING: - obj = pdf_new_string(doc, buf->scratch, buf->len); - pdf_array_push(ary, obj); - pdf_drop_obj(obj); + obj = pdf_new_string(ctx, doc, buf->scratch, buf->len); + pdf_array_push(ctx, ary, obj); + pdf_drop_obj(ctx, obj); obj = NULL; break; case PDF_TOK_TRUE: - obj = pdf_new_bool(doc, 1); - pdf_array_push(ary, obj); - pdf_drop_obj(obj); + obj = pdf_new_bool(ctx, doc, 1); + pdf_array_push(ctx, ary, obj); + pdf_drop_obj(ctx, obj); obj = NULL; break; case PDF_TOK_FALSE: - obj = pdf_new_bool(doc, 0); - pdf_array_push(ary, obj); - pdf_drop_obj(obj); + obj = pdf_new_bool(ctx, doc, 0); + pdf_array_push(ctx, ary, obj); + pdf_drop_obj(ctx, obj); obj = NULL; break; case PDF_TOK_NULL: - obj = pdf_new_null(doc); - pdf_array_push(ary, obj); - pdf_drop_obj(obj); + obj = pdf_new_null(ctx, doc); + pdf_array_push(ctx, ary, obj); + pdf_drop_obj(ctx, obj); obj = NULL; break; @@ -360,24 +356,23 @@ end: } fz_catch(ctx) { - pdf_drop_obj(obj); - pdf_drop_obj(ary); + pdf_drop_obj(ctx, obj); + pdf_drop_obj(ctx, ary); fz_rethrow_message(ctx, "cannot parse array"); } return op; } pdf_obj * -pdf_parse_dict(pdf_document *doc, fz_stream *file, pdf_lexbuf *buf) +pdf_parse_dict(fz_context *ctx, pdf_document *doc, fz_stream *file, pdf_lexbuf *buf) { pdf_obj *dict; pdf_obj *key = NULL; pdf_obj *val = NULL; pdf_token tok; int a, b; - fz_context *ctx = file->ctx; - dict = pdf_new_dict(doc, 8); + dict = pdf_new_dict(ctx, doc, 8); fz_var(key); fz_var(val); @@ -386,7 +381,7 @@ pdf_parse_dict(pdf_document *doc, fz_stream *file, pdf_lexbuf *buf) { while (1) { - tok = pdf_lex(file, buf); + tok = pdf_lex(ctx, file, buf); skip: if (tok == PDF_TOK_CLOSE_DICT) break; @@ -398,49 +393,49 @@ pdf_parse_dict(pdf_document *doc, fz_stream *file, pdf_lexbuf *buf) if (tok != PDF_TOK_NAME) fz_throw(ctx, FZ_ERROR_GENERIC, "invalid key in dict"); - key = pdf_new_name(doc, buf->scratch); + key = pdf_new_name(ctx, doc, buf->scratch); - tok = pdf_lex(file, buf); + tok = pdf_lex(ctx, file, buf); switch (tok) { case PDF_TOK_OPEN_ARRAY: - val = pdf_parse_array(doc, file, buf); + val = pdf_parse_array(ctx, doc, file, buf); break; case PDF_TOK_OPEN_DICT: - val = pdf_parse_dict(doc, file, buf); + val = pdf_parse_dict(ctx, doc, file, buf); break; - case PDF_TOK_NAME: val = pdf_new_name(doc, buf->scratch); break; - case PDF_TOK_REAL: val = pdf_new_real(doc, buf->f); break; - case PDF_TOK_STRING: val = pdf_new_string(doc, buf->scratch, buf->len); break; - case PDF_TOK_TRUE: val = pdf_new_bool(doc, 1); break; - case PDF_TOK_FALSE: val = pdf_new_bool(doc, 0); break; - case PDF_TOK_NULL: val = pdf_new_null(doc); break; + case PDF_TOK_NAME: val = pdf_new_name(ctx, doc, buf->scratch); break; + case PDF_TOK_REAL: val = pdf_new_real(ctx, doc, buf->f); break; + case PDF_TOK_STRING: val = pdf_new_string(ctx, doc, buf->scratch, buf->len); break; + case PDF_TOK_TRUE: val = pdf_new_bool(ctx, doc, 1); break; + case PDF_TOK_FALSE: val = pdf_new_bool(ctx, doc, 0); break; + case PDF_TOK_NULL: val = pdf_new_null(ctx, doc); break; case PDF_TOK_INT: /* 64-bit to allow for numbers > INT_MAX and overflow */ a = buf->i; - tok = pdf_lex(file, buf); + tok = pdf_lex(ctx, file, buf); if (tok == PDF_TOK_CLOSE_DICT || tok == PDF_TOK_NAME || (tok == PDF_TOK_KEYWORD && !strcmp(buf->scratch, "ID"))) { - val = pdf_new_int(doc, a); - pdf_dict_put(dict, key, val); - pdf_drop_obj(val); + val = pdf_new_int(ctx, doc, a); + pdf_dict_put(ctx, dict, key, val); + pdf_drop_obj(ctx, val); val = NULL; - pdf_drop_obj(key); + pdf_drop_obj(ctx, key); key = NULL; goto skip; } if (tok == PDF_TOK_INT) { b = buf->i; - tok = pdf_lex(file, buf); + tok = pdf_lex(ctx, file, buf); if (tok == PDF_TOK_R) { - val = pdf_new_indirect(doc, a, b); + val = pdf_new_indirect(ctx, doc, a, b); break; } } @@ -450,50 +445,49 @@ pdf_parse_dict(pdf_document *doc, fz_stream *file, pdf_lexbuf *buf) fz_throw(ctx, FZ_ERROR_GENERIC, "unknown token in dict"); } - pdf_dict_put(dict, key, val); - pdf_drop_obj(val); + pdf_dict_put(ctx, dict, key, val); + pdf_drop_obj(ctx, val); val = NULL; - pdf_drop_obj(key); + pdf_drop_obj(ctx, key); key = NULL; } } fz_catch(ctx) { - pdf_drop_obj(dict); - pdf_drop_obj(key); - pdf_drop_obj(val); + pdf_drop_obj(ctx, dict); + pdf_drop_obj(ctx, key); + pdf_drop_obj(ctx, val); fz_rethrow_message(ctx, "cannot parse dict"); } return dict; } pdf_obj * -pdf_parse_stm_obj(pdf_document *doc, fz_stream *file, pdf_lexbuf *buf) +pdf_parse_stm_obj(fz_context *ctx, pdf_document *doc, fz_stream *file, pdf_lexbuf *buf) { pdf_token tok; - fz_context *ctx = file->ctx; - tok = pdf_lex(file, buf); + tok = pdf_lex(ctx, file, buf); switch (tok) { case PDF_TOK_OPEN_ARRAY: - return pdf_parse_array(doc, file, buf); + return pdf_parse_array(ctx, doc, file, buf); case PDF_TOK_OPEN_DICT: - return pdf_parse_dict(doc, file, buf); - case PDF_TOK_NAME: return pdf_new_name(doc, buf->scratch); break; - case PDF_TOK_REAL: return pdf_new_real(doc, buf->f); break; - case PDF_TOK_STRING: return pdf_new_string(doc, buf->scratch, buf->len); break; - case PDF_TOK_TRUE: return pdf_new_bool(doc, 1); break; - case PDF_TOK_FALSE: return pdf_new_bool(doc, 0); break; - case PDF_TOK_NULL: return pdf_new_null(doc); break; - case PDF_TOK_INT: return pdf_new_int(doc, buf->i); break; + return pdf_parse_dict(ctx, doc, file, buf); + case PDF_TOK_NAME: return pdf_new_name(ctx, doc, buf->scratch); break; + case PDF_TOK_REAL: return pdf_new_real(ctx, doc, buf->f); break; + case PDF_TOK_STRING: return pdf_new_string(ctx, doc, buf->scratch, buf->len); break; + case PDF_TOK_TRUE: return pdf_new_bool(ctx, doc, 1); break; + case PDF_TOK_FALSE: return pdf_new_bool(ctx, doc, 0); break; + case PDF_TOK_NULL: return pdf_new_null(ctx, doc); break; + case PDF_TOK_INT: return pdf_new_int(ctx, doc, buf->i); break; default: fz_throw(ctx, FZ_ERROR_GENERIC, "unknown token in object stream"); } } pdf_obj * -pdf_parse_ind_obj(pdf_document *doc, +pdf_parse_ind_obj(fz_context *ctx, pdf_document *doc, fz_stream *file, pdf_lexbuf *buf, int *onum, int *ogen, int *ostmofs, int *try_repair) { @@ -501,11 +495,10 @@ pdf_parse_ind_obj(pdf_document *doc, int num = 0, gen = 0, stm_ofs; pdf_token tok; int a, b; - fz_context *ctx = file->ctx; fz_var(obj); - tok = pdf_lex(file, buf); + tok = pdf_lex(ctx, file, buf); if (tok != PDF_TOK_INT) { if (try_repair) @@ -514,7 +507,7 @@ pdf_parse_ind_obj(pdf_document *doc, } num = buf->i; - tok = pdf_lex(file, buf); + tok = pdf_lex(ctx, file, buf); if (tok != PDF_TOK_INT) { if (try_repair) @@ -523,7 +516,7 @@ pdf_parse_ind_obj(pdf_document *doc, } gen = buf->i; - tok = pdf_lex(file, buf); + tok = pdf_lex(ctx, file, buf); if (tok != PDF_TOK_OBJ) { if (try_repair) @@ -531,48 +524,48 @@ pdf_parse_ind_obj(pdf_document *doc, fz_throw(ctx, FZ_ERROR_GENERIC, "expected 'obj' keyword (%d %d ?)", num, gen); } - tok = pdf_lex(file, buf); + tok = pdf_lex(ctx, file, buf); switch (tok) { case PDF_TOK_OPEN_ARRAY: - obj = pdf_parse_array(doc, file, buf); + obj = pdf_parse_array(ctx, doc, file, buf); break; case PDF_TOK_OPEN_DICT: - obj = pdf_parse_dict(doc, file, buf); + obj = pdf_parse_dict(ctx, doc, file, buf); break; - case PDF_TOK_NAME: obj = pdf_new_name(doc, buf->scratch); break; - case PDF_TOK_REAL: obj = pdf_new_real(doc, buf->f); break; - case PDF_TOK_STRING: obj = pdf_new_string(doc, buf->scratch, buf->len); break; - case PDF_TOK_TRUE: obj = pdf_new_bool(doc, 1); break; - case PDF_TOK_FALSE: obj = pdf_new_bool(doc, 0); break; - case PDF_TOK_NULL: obj = pdf_new_null(doc); break; + case PDF_TOK_NAME: obj = pdf_new_name(ctx, doc, buf->scratch); break; + case PDF_TOK_REAL: obj = pdf_new_real(ctx, doc, buf->f); break; + case PDF_TOK_STRING: obj = pdf_new_string(ctx, doc, buf->scratch, buf->len); break; + case PDF_TOK_TRUE: obj = pdf_new_bool(ctx, doc, 1); break; + case PDF_TOK_FALSE: obj = pdf_new_bool(ctx, doc, 0); break; + case PDF_TOK_NULL: obj = pdf_new_null(ctx, doc); break; case PDF_TOK_INT: a = buf->i; - tok = pdf_lex(file, buf); + tok = pdf_lex(ctx, file, buf); if (tok == PDF_TOK_STREAM || tok == PDF_TOK_ENDOBJ) { - obj = pdf_new_int(doc, a); + obj = pdf_new_int(ctx, doc, a); goto skip; } if (tok == PDF_TOK_INT) { b = buf->i; - tok = pdf_lex(file, buf); + tok = pdf_lex(ctx, file, buf); if (tok == PDF_TOK_R) { - obj = pdf_new_indirect(doc, a, b); + obj = pdf_new_indirect(ctx, doc, a, b); break; } } fz_throw(ctx, FZ_ERROR_GENERIC, "expected 'R' keyword (%d %d R)", num, gen); case PDF_TOK_ENDOBJ: - obj = pdf_new_null(doc); + obj = pdf_new_null(ctx, doc); goto skip; default: @@ -581,29 +574,29 @@ pdf_parse_ind_obj(pdf_document *doc, fz_try(ctx) { - tok = pdf_lex(file, buf); + tok = pdf_lex(ctx, file, buf); } fz_catch(ctx) { - pdf_drop_obj(obj); + pdf_drop_obj(ctx, obj); fz_rethrow_message(ctx, "cannot parse indirect object (%d %d R)", num, gen); } skip: if (tok == PDF_TOK_STREAM) { - int c = fz_read_byte(file); + int c = fz_read_byte(ctx, file); while (c == ' ') - c = fz_read_byte(file); + c = fz_read_byte(ctx, file); if (c == '\r') { - c = fz_peek_byte(file); + c = fz_peek_byte(ctx, file); if (c != '\n') fz_warn(ctx, "line feed missing after stream begin marker (%d %d R)", num, gen); else - fz_read_byte(file); + fz_read_byte(ctx, file); } - stm_ofs = fz_tell(file); + stm_ofs = fz_tell(ctx, file); } else if (tok == PDF_TOK_ENDOBJ) { diff --git a/source/pdf/pdf-pattern.c b/source/pdf/pdf-pattern.c index 785acfe5..93fbdd3e 100644 --- a/source/pdf/pdf-pattern.c +++ b/source/pdf/pdf-pattern.c @@ -18,9 +18,9 @@ pdf_drop_pattern_imp(fz_context *ctx, fz_storable *pat_) pdf_pattern *pat = (pdf_pattern *)pat_; if (pat->resources) - pdf_drop_obj(pat->resources); + pdf_drop_obj(ctx, pat->resources); if (pat->contents) - pdf_drop_obj(pat->contents); + pdf_drop_obj(ctx, pat->contents); fz_free(ctx, pat); } @@ -33,11 +33,10 @@ pdf_pattern_size(pdf_pattern *pat) } pdf_pattern * -pdf_load_pattern(pdf_document *doc, pdf_obj *dict) +pdf_load_pattern(fz_context *ctx, pdf_document *doc, pdf_obj *dict) { pdf_pattern *pat; pdf_obj *obj; - fz_context *ctx = doc->ctx; if ((pat = pdf_find_item(ctx, pdf_drop_pattern_imp, dict)) != NULL) { @@ -52,32 +51,32 @@ pdf_load_pattern(pdf_document *doc, pdf_obj *dict) /* Store pattern now, to avoid possible recursion if objects refer back to this one */ pdf_store_item(ctx, dict, pat, pdf_pattern_size(pat)); - pat->ismask = pdf_to_int(pdf_dict_gets(dict, "PaintType")) == 2; - pat->xstep = pdf_to_real(pdf_dict_gets(dict, "XStep")); - pat->ystep = pdf_to_real(pdf_dict_gets(dict, "YStep")); + pat->ismask = pdf_to_int(ctx, pdf_dict_gets(ctx, dict, "PaintType")) == 2; + pat->xstep = pdf_to_real(ctx, pdf_dict_gets(ctx, dict, "XStep")); + pat->ystep = pdf_to_real(ctx, pdf_dict_gets(ctx, dict, "YStep")); - obj = pdf_dict_gets(dict, "BBox"); + obj = pdf_dict_gets(ctx, dict, "BBox"); pdf_to_rect(ctx, obj, &pat->bbox); - obj = pdf_dict_gets(dict, "Matrix"); + obj = pdf_dict_gets(ctx, dict, "Matrix"); if (obj) pdf_to_matrix(ctx, obj, &pat->matrix); else pat->matrix = fz_identity; - pat->resources = pdf_dict_gets(dict, "Resources"); + pat->resources = pdf_dict_gets(ctx, dict, "Resources"); if (pat->resources) - pdf_keep_obj(pat->resources); + pdf_keep_obj(ctx, pat->resources); fz_try(ctx) { - pat->contents = pdf_keep_obj(dict); + pat->contents = pdf_keep_obj(ctx, dict); } fz_catch(ctx) { pdf_remove_item(ctx, pdf_drop_pattern_imp, dict); pdf_drop_pattern(ctx, pat); - fz_rethrow_message(ctx, "cannot load pattern stream (%d %d R)", pdf_to_num(dict), pdf_to_gen(dict)); + fz_rethrow_message(ctx, "cannot load pattern stream (%d %d R)", pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict)); } return pat; } diff --git a/source/pdf/pdf-pkcs7.c b/source/pdf/pdf-pkcs7.c index 7af97a6d..c1a97599 100644 --- a/source/pdf/pdf-pkcs7.c +++ b/source/pdf/pdf-pkcs7.c @@ -345,22 +345,20 @@ exit: typedef struct pdf_designated_name_openssl_s { pdf_designated_name base; - fz_context *ctx; char buf[8192]; } pdf_designated_name_openssl; struct pdf_signer_s { - fz_context *ctx; int refs; X509 *x509; EVP_PKEY *pkey; }; -void pdf_drop_designated_name(pdf_designated_name *dn) +void pdf_drop_designated_name(fz_context *ctx, pdf_designated_name *dn) { if (dn) - fz_free(((pdf_designated_name_openssl *)dn)->ctx, dn); + fz_free(ctx, dn); } @@ -436,7 +434,6 @@ pdf_signer *pdf_read_pfx(fz_context *ctx, const char *pfile, const char *pw) fz_try(ctx) { signer = fz_malloc_struct(ctx, pdf_signer); - signer->ctx = ctx; signer->refs = 1; OpenSSL_add_all_algorithms(); @@ -502,22 +499,21 @@ pdf_signer *pdf_read_pfx(fz_context *ctx, const char *pfile, const char *pw) } fz_catch(ctx) { - pdf_drop_signer(signer); + pdf_drop_signer(ctx, signer); fz_rethrow(ctx); } return signer; } -pdf_signer *pdf_keep_signer(pdf_signer *signer) +pdf_signer *pdf_keep_signer(fz_context *ctx, pdf_signer *signer) { if (signer) signer->refs++; - return signer; } -void pdf_drop_signer(pdf_signer *signer) +void pdf_drop_signer(fz_context *ctx, pdf_signer *signer) { if (signer) { @@ -525,18 +521,16 @@ void pdf_drop_signer(pdf_signer *signer) { X509_free(signer->x509); EVP_PKEY_free(signer->pkey); - fz_free(signer->ctx, signer); + fz_free(ctx, signer); } } } -pdf_designated_name *pdf_signer_designated_name(pdf_signer *signer) +pdf_designated_name *pdf_signer_designated_name(fz_context *ctx, pdf_signer *signer) { - fz_context *ctx = signer->ctx; pdf_designated_name_openssl *dn = fz_malloc_struct(ctx, pdf_designated_name_openssl); char *p; - dn->ctx = ctx; X509_NAME_oneline(X509_get_subject_name(signer->x509), dn->buf, sizeof(dn->buf)); p = strstr(dn->buf, "/CN="); if (p) dn->base.cn = p+4; @@ -556,9 +550,8 @@ pdf_designated_name *pdf_signer_designated_name(pdf_signer *signer) return (pdf_designated_name *)dn; } -void pdf_write_digest(pdf_document *doc, char *filename, pdf_obj *byte_range, int digest_offset, int digest_length, pdf_signer *signer) +void pdf_write_digest(fz_context *ctx, pdf_document *doc, char *filename, pdf_obj *byte_range, int digest_offset, int digest_length, pdf_signer *signer) { - fz_context *ctx = doc->ctx; BIO *bdata = NULL; BIO *bsegs = NULL; BIO *bp7in = NULL; @@ -568,7 +561,7 @@ void pdf_write_digest(pdf_document *doc, char *filename, pdf_obj *byte_range, in FILE *f = NULL; int (*brange)[2] = NULL; - int brange_len = pdf_array_len(byte_range)/2; + int brange_len = pdf_array_len(ctx, byte_range)/2; fz_var(bdata); fz_var(bsegs); @@ -586,8 +579,8 @@ void pdf_write_digest(pdf_document *doc, char *filename, pdf_obj *byte_range, in brange = fz_calloc(ctx, brange_len, sizeof(*brange)); for (i = 0; i < brange_len; i++) { - brange[i][0] = pdf_to_int(pdf_array_get(byte_range, 2*i)); - brange[i][1] = pdf_to_int(pdf_array_get(byte_range, 2*i+1)); + brange[i][0] = pdf_to_int(ctx, pdf_array_get(ctx, byte_range, 2*i)); + brange[i][1] = pdf_to_int(ctx, pdf_array_get(ctx, byte_range, 2*i+1)); } bdata = BIO_new(BIO_s_file()); @@ -671,9 +664,8 @@ void pdf_write_digest(pdf_document *doc, char *filename, pdf_obj *byte_range, in } } -int pdf_check_signature(pdf_document *doc, pdf_widget *widget, char *file, char *ebuf, int ebufsize) +int pdf_check_signature(fz_context *ctx, pdf_document *doc, pdf_widget *widget, char *file, char *ebuf, int ebufsize) { - fz_context *ctx = doc->ctx; int (*byte_range)[2] = NULL; int byte_range_len; char *contents = NULL; @@ -696,14 +688,14 @@ int pdf_check_signature(pdf_document *doc, pdf_widget *widget, char *file, char fz_var(res); fz_try(ctx); { - byte_range_len = pdf_signature_widget_byte_range(doc, widget, NULL); + byte_range_len = pdf_signature_widget_byte_range(ctx, doc, widget, NULL); if (byte_range_len) { byte_range = fz_calloc(ctx, byte_range_len, sizeof(*byte_range)); - pdf_signature_widget_byte_range(doc, widget, byte_range); + pdf_signature_widget_byte_range(ctx, doc, widget, byte_range); } - contents_len = pdf_signature_widget_contents(doc, widget, &contents); + contents_len = pdf_signature_widget_contents(ctx, doc, widget, &contents); if (byte_range && contents) { res = verify_sig(contents, contents_len, file, byte_range, byte_range_len, ebuf, ebufsize); @@ -731,9 +723,8 @@ int pdf_check_signature(pdf_document *doc, pdf_widget *widget, char *file, char return res; } -void pdf_sign_signature(pdf_document *doc, pdf_widget *widget, const char *sigfile, const char *password) +void pdf_sign_signature(fz_context *ctx, pdf_document *doc, pdf_widget *widget, const char *sigfile, const char *password) { - fz_context *ctx = doc->ctx; pdf_signer *signer = pdf_read_pfx(ctx, sigfile, password); pdf_designated_name *dn = NULL; fz_buffer *fzbuf = NULL; @@ -744,13 +735,13 @@ void pdf_sign_signature(pdf_document *doc, pdf_widget *widget, const char *sigfi pdf_obj *wobj = ((pdf_annot *)widget)->obj; fz_rect rect = fz_empty_rect; - pdf_signature_set_value(doc, wobj, signer); + pdf_signature_set_value(ctx, doc, wobj, signer); - pdf_to_rect(ctx, pdf_dict_gets(wobj, "Rect"), &rect); + pdf_to_rect(ctx, pdf_dict_gets(ctx, wobj, "Rect"), &rect); /* Create an appearance stream only if the signature is intended to be visible */ if (!fz_is_empty_rect(&rect)) { - dn = pdf_signer_designated_name(signer); + dn = pdf_signer_designated_name(ctx, signer); fzbuf = fz_new_buffer(ctx, 256); if (!dn->cn) fz_throw(ctx, FZ_ERROR_GENERIC, "Certificate has no common name"); @@ -770,13 +761,13 @@ void pdf_sign_signature(pdf_document *doc, pdf_widget *widget, const char *sigfi fz_buffer_printf(ctx, fzbuf, ", c=%s", dn->c); (void)fz_buffer_storage(ctx, fzbuf, (unsigned char **) &dn_str); - pdf_set_signature_appearance(doc, (pdf_annot *)widget, dn->cn, dn_str, NULL); + pdf_set_signature_appearance(ctx, doc, (pdf_annot *)widget, dn->cn, dn_str, NULL); } } fz_always(ctx) { - pdf_drop_signer(signer); - pdf_drop_designated_name(dn); + pdf_drop_signer(ctx, signer); + pdf_drop_designated_name(ctx, dn); fz_drop_buffer(ctx, fzbuf); } fz_catch(ctx) @@ -785,37 +776,37 @@ void pdf_sign_signature(pdf_document *doc, pdf_widget *widget, const char *sigfi } } -int pdf_signatures_supported(void) +int pdf_signatures_supported(fz_context *ctx) { return 1; } #else /* HAVE_OPENSSL */ -int pdf_check_signature(pdf_document *doc, pdf_widget *widget, char *file, char *ebuf, int ebufsize) +int pdf_check_signature(fz_context *ctx, pdf_document *doc, pdf_widget *widget, char *file, char *ebuf, int ebufsize) { fz_strlcpy(ebuf, "This version of MuPDF was built without signature support", ebufsize); return 0; } -void pdf_sign_signature(pdf_document *doc, pdf_widget *widget, const char *sigfile, const char *password) +void pdf_sign_signature(fz_context *ctx, pdf_document *doc, pdf_widget *widget, const char *sigfile, const char *password) { } -pdf_signer *pdf_keep_signer(pdf_signer *signer) +pdf_signer *pdf_keep_signer(fz_context *ctx, pdf_signer *signer) { return NULL; } -void pdf_drop_signer(pdf_signer *signer) +void pdf_drop_signer(fz_context *ctx, pdf_signer *signer) { } -void pdf_write_digest(pdf_document *doc, char *filename, pdf_obj *byte_range, int digest_offset, int digest_length, pdf_signer *signer) +void pdf_write_digest(fz_context *ctx, pdf_document *doc, char *filename, pdf_obj *byte_range, int digest_offset, int digest_length, pdf_signer *signer) { } -int pdf_signatures_supported(void) +int pdf_signatures_supported(fz_context *ctx) { return 0; } diff --git a/source/pdf/pdf-repair.c b/source/pdf/pdf-repair.c index 3cc05fc5..0c1c504c 100644 --- a/source/pdf/pdf-repair.c +++ b/source/pdf/pdf-repair.c @@ -15,12 +15,11 @@ struct entry }; int -pdf_repair_obj(pdf_document *doc, pdf_lexbuf *buf, int *stmofsp, int *stmlenp, pdf_obj **encrypt, pdf_obj **id, pdf_obj **page, int *tmpofs) +pdf_repair_obj(fz_context *ctx, pdf_document *doc, pdf_lexbuf *buf, int *stmofsp, int *stmlenp, pdf_obj **encrypt, pdf_obj **id, pdf_obj **page, int *tmpofs) { + fz_stream *file = doc->file; pdf_token tok; int stm_len; - fz_stream *file = doc->file; - fz_context *ctx = file->ctx; *stmofsp = 0; if (stmlenp) @@ -32,7 +31,7 @@ pdf_repair_obj(pdf_document *doc, pdf_lexbuf *buf, int *stmofsp, int *stmlenp, p * '<int> <int> obj'. We expect the next thing we see to be a * pdf object. Regardless of the type of thing we meet next * we only need to fully parse it if it is a dictionary. */ - tok = pdf_lex(file, buf); + tok = pdf_lex(ctx, file, buf); if (tok == PDF_TOK_OPEN_DICT) { @@ -41,7 +40,7 @@ pdf_repair_obj(pdf_document *doc, pdf_lexbuf *buf, int *stmofsp, int *stmlenp, p /* Send NULL xref so we don't try to resolve references */ fz_try(ctx) { - dict = pdf_parse_dict(doc, file, buf); + dict = pdf_parse_dict(ctx, doc, file, buf); } fz_catch(ctx) { @@ -50,45 +49,45 @@ pdf_repair_obj(pdf_document *doc, pdf_lexbuf *buf, int *stmofsp, int *stmlenp, p if (file->eof) fz_rethrow_message(ctx, "broken object at EOF ignored"); /* Silently swallow the error */ - dict = pdf_new_dict(doc, 2); + dict = pdf_new_dict(ctx, doc, 2); } if (encrypt && id) { - obj = pdf_dict_gets(dict, "Type"); - if (pdf_is_name(obj) && !strcmp(pdf_to_name(obj), "XRef")) + obj = pdf_dict_gets(ctx, dict, "Type"); + if (pdf_is_name(ctx, obj) && !strcmp(pdf_to_name(ctx, obj), "XRef")) { - obj = pdf_dict_gets(dict, "Encrypt"); + obj = pdf_dict_gets(ctx, dict, "Encrypt"); if (obj) { - pdf_drop_obj(*encrypt); - *encrypt = pdf_keep_obj(obj); + pdf_drop_obj(ctx, *encrypt); + *encrypt = pdf_keep_obj(ctx, obj); } - obj = pdf_dict_gets(dict, "ID"); + obj = pdf_dict_gets(ctx, dict, "ID"); if (obj) { - pdf_drop_obj(*id); - *id = pdf_keep_obj(obj); + pdf_drop_obj(ctx, *id); + *id = pdf_keep_obj(ctx, obj); } } } - obj = pdf_dict_gets(dict, "Length"); - if (!pdf_is_indirect(obj) && pdf_is_int(obj)) - stm_len = pdf_to_int(obj); + obj = pdf_dict_gets(ctx, dict, "Length"); + if (!pdf_is_indirect(ctx, obj) && pdf_is_int(ctx, obj)) + stm_len = pdf_to_int(ctx, obj); if (doc->file_reading_linearly && page) { - obj = pdf_dict_gets(dict, "Type"); - if (!strcmp(pdf_to_name(obj), "Page")) + obj = pdf_dict_gets(ctx, dict, "Type"); + if (!strcmp(pdf_to_name(ctx, obj), "Page")) { - pdf_drop_obj(*page); - *page = pdf_keep_obj(dict); + pdf_drop_obj(ctx, *page); + *page = pdf_keep_obj(ctx, dict); } } - pdf_drop_obj(dict); + pdf_drop_obj(ctx, dict); } while ( tok != PDF_TOK_STREAM && @@ -97,31 +96,31 @@ pdf_repair_obj(pdf_document *doc, pdf_lexbuf *buf, int *stmofsp, int *stmlenp, p tok != PDF_TOK_EOF && tok != PDF_TOK_INT ) { - *tmpofs = fz_tell(file); + *tmpofs = fz_tell(ctx, file); if (*tmpofs < 0) fz_throw(ctx, FZ_ERROR_GENERIC, "cannot tell in file"); - tok = pdf_lex(file, buf); + tok = pdf_lex(ctx, file, buf); } if (tok == PDF_TOK_STREAM) { - int c = fz_read_byte(file); + int c = fz_read_byte(ctx, file); if (c == '\r') { - c = fz_peek_byte(file); + c = fz_peek_byte(ctx, file); if (c == '\n') - fz_read_byte(file); + fz_read_byte(ctx, file); } - *stmofsp = fz_tell(file); + *stmofsp = fz_tell(ctx, file); if (*stmofsp < 0) fz_throw(ctx, FZ_ERROR_GENERIC, "cannot seek in file"); if (stm_len > 0) { - fz_seek(file, *stmofsp + stm_len, 0); + fz_seek(ctx, file, *stmofsp + stm_len, 0); fz_try(ctx) { - tok = pdf_lex(file, buf); + tok = pdf_lex(ctx, file, buf); } fz_catch(ctx) { @@ -130,14 +129,14 @@ pdf_repair_obj(pdf_document *doc, pdf_lexbuf *buf, int *stmofsp, int *stmlenp, p } if (tok == PDF_TOK_ENDSTREAM) goto atobjend; - fz_seek(file, *stmofsp, 0); + fz_seek(ctx, file, *stmofsp, 0); } - (void)fz_read(file, (unsigned char *) buf->scratch, 9); + (void)fz_read(ctx, file, (unsigned char *) buf->scratch, 9); while (memcmp(buf->scratch, "endstream", 9) != 0) { - c = fz_read_byte(file); + c = fz_read_byte(ctx, file); if (c == EOF) break; memmove(&buf->scratch[0], &buf->scratch[1], 8); @@ -145,35 +144,34 @@ pdf_repair_obj(pdf_document *doc, pdf_lexbuf *buf, int *stmofsp, int *stmlenp, p } if (stmlenp) - *stmlenp = fz_tell(file) - *stmofsp - 9; + *stmlenp = fz_tell(ctx, file) - *stmofsp - 9; atobjend: - *tmpofs = fz_tell(file); + *tmpofs = fz_tell(ctx, file); if (*tmpofs < 0) fz_throw(ctx, FZ_ERROR_GENERIC, "cannot tell in file"); - tok = pdf_lex(file, buf); + tok = pdf_lex(ctx, file, buf); if (tok != PDF_TOK_ENDOBJ) fz_warn(ctx, "object missing 'endobj' token"); else { /* Read another token as we always return the next one */ - *tmpofs = fz_tell(file); + *tmpofs = fz_tell(ctx, file); if (*tmpofs < 0) fz_throw(ctx, FZ_ERROR_GENERIC, "cannot tell in file"); - tok = pdf_lex(file, buf); + tok = pdf_lex(ctx, file, buf); } } return tok; } static void -pdf_repair_obj_stm(pdf_document *doc, int num, int gen) +pdf_repair_obj_stm(fz_context *ctx, pdf_document *doc, int num, int gen) { pdf_obj *obj; fz_stream *stm = NULL; pdf_token tok; int i, n, count; - fz_context *ctx = doc->ctx; pdf_lexbuf buf; fz_var(stm); @@ -182,19 +180,19 @@ pdf_repair_obj_stm(pdf_document *doc, int num, int gen) fz_try(ctx) { - obj = pdf_load_object(doc, num, gen); + obj = pdf_load_object(ctx, doc, num, gen); - count = pdf_to_int(pdf_dict_gets(obj, "N")); + count = pdf_to_int(ctx, pdf_dict_gets(ctx, obj, "N")); - pdf_drop_obj(obj); + pdf_drop_obj(ctx, obj); - stm = pdf_open_stream(doc, num, gen); + stm = pdf_open_stream(ctx, doc, num, gen); for (i = 0; i < count; i++) { pdf_xref_entry *entry; - tok = pdf_lex(stm, &buf); + tok = pdf_lex(ctx, stm, &buf); if (tok != PDF_TOK_INT) fz_throw(ctx, FZ_ERROR_GENERIC, "corrupt object stream (%d %d R)", num, gen); @@ -204,29 +202,29 @@ pdf_repair_obj_stm(pdf_document *doc, int num, int gen) fz_warn(ctx, "ignoring object with invalid object number (%d %d R)", n, i); continue; } - else if (n >= pdf_xref_len(doc)) + else if (n >= pdf_xref_len(ctx, doc)) { fz_warn(ctx, "ignoring object with invalid object number (%d %d R)", n, i); continue; } - entry = pdf_get_populating_xref_entry(doc, n); + entry = pdf_get_populating_xref_entry(ctx, doc, n); entry->ofs = num; entry->gen = i; entry->stm_ofs = 0; - pdf_drop_obj(entry->obj); + pdf_drop_obj(ctx, entry->obj); entry->obj = NULL; entry->type = 'o'; - tok = pdf_lex(stm, &buf); + tok = pdf_lex(ctx, stm, &buf); if (tok != PDF_TOK_INT) fz_throw(ctx, FZ_ERROR_GENERIC, "corrupt object stream (%d %d R)", num, gen); } } fz_always(ctx) { - fz_drop_stream(stm); - pdf_lexbuf_fin(&buf); + fz_drop_stream(ctx, stm); + pdf_lexbuf_fin(ctx, &buf); } fz_catch(ctx) { @@ -235,7 +233,7 @@ pdf_repair_obj_stm(pdf_document *doc, int num, int gen) } void -pdf_repair_xref(pdf_document *doc) +pdf_repair_xref(fz_context *ctx, pdf_document *doc) { pdf_obj *dict, *obj = NULL; pdf_obj *length; @@ -257,7 +255,6 @@ pdf_repair_xref(pdf_document *doc) pdf_token tok; int next; int i, n, c; - fz_context *ctx = doc->ctx; pdf_lexbuf *buf = &doc->lexbuf.base; fz_var(encrypt); @@ -268,14 +265,14 @@ pdf_repair_xref(pdf_document *doc) fz_var(obj); if (doc->repair_attempted) - fz_throw(doc->ctx, FZ_ERROR_GENERIC, "Repair failed already - not trying again"); + fz_throw(ctx, FZ_ERROR_GENERIC, "Repair failed already - not trying again"); doc->repair_attempted = 1; doc->dirty = 1; /* Can't support incremental update after repair */ doc->freeze_updates = 1; - fz_seek(doc->file, 0, 0); + fz_seek(ctx, doc->file, 0, 0); fz_try(ctx) { @@ -285,34 +282,34 @@ pdf_repair_xref(pdf_document *doc) list = fz_malloc_array(ctx, listcap, sizeof(struct entry)); /* look for '%PDF' version marker within first kilobyte of file */ - n = fz_read(doc->file, (unsigned char *)buf->scratch, fz_mini(buf->size, 1024)); + n = fz_read(ctx, doc->file, (unsigned char *)buf->scratch, fz_mini(buf->size, 1024)); - fz_seek(doc->file, 0, 0); + fz_seek(ctx, doc->file, 0, 0); for (i = 0; i < n - 4; i++) { if (memcmp(&buf->scratch[i], "%PDF", 4) == 0) { - fz_seek(doc->file, i + 8, 0); /* skip "%PDF-X.Y" */ + fz_seek(ctx, doc->file, i + 8, 0); /* skip "%PDF-X.Y" */ break; } } /* skip comment line after version marker since some generators * forget to terminate the comment with a newline */ - c = fz_read_byte(doc->file); + c = fz_read_byte(ctx, doc->file); while (c >= 0 && (c == ' ' || c == '%')) - c = fz_read_byte(doc->file); - fz_unread_byte(doc->file); + c = fz_read_byte(ctx, doc->file); + fz_unread_byte(ctx, doc->file); while (1) { - tmpofs = fz_tell(doc->file); + tmpofs = fz_tell(ctx, doc->file); if (tmpofs < 0) fz_throw(ctx, FZ_ERROR_GENERIC, "cannot tell in file"); fz_try(ctx) { - tok = pdf_lex_no_string(doc->file, buf); + tok = pdf_lex_no_string(ctx, doc->file, buf); } fz_catch(ctx) { @@ -346,7 +343,7 @@ pdf_repair_xref(pdf_document *doc) { stm_len = 0; stm_ofs = 0; - tok = pdf_repair_obj(doc, buf, &stm_ofs, &stm_len, &encrypt, &id, NULL, &tmpofs); + tok = pdf_repair_obj(ctx, doc, buf, &stm_ofs, &stm_len, &encrypt, &id, NULL, &tmpofs); } fz_catch(ctx) { @@ -394,7 +391,7 @@ pdf_repair_xref(pdf_document *doc) { fz_try(ctx) { - dict = pdf_parse_dict(doc, doc->file, buf); + dict = pdf_parse_dict(ctx, doc, doc->file, buf); } fz_catch(ctx) { @@ -406,35 +403,35 @@ pdf_repair_xref(pdf_document *doc) continue; } - obj = pdf_dict_gets(dict, "Encrypt"); + obj = pdf_dict_gets(ctx, dict, "Encrypt"); if (obj) { - pdf_drop_obj(encrypt); - encrypt = pdf_keep_obj(obj); + pdf_drop_obj(ctx, encrypt); + encrypt = pdf_keep_obj(ctx, obj); } - obj = pdf_dict_gets(dict, "ID"); - if (obj && (!id || !encrypt || pdf_dict_gets(dict, "Encrypt"))) + obj = pdf_dict_gets(ctx, dict, "ID"); + if (obj && (!id || !encrypt || pdf_dict_gets(ctx, dict, "Encrypt"))) { - pdf_drop_obj(id); - id = pdf_keep_obj(obj); + pdf_drop_obj(ctx, id); + id = pdf_keep_obj(ctx, obj); } - obj = pdf_dict_gets(dict, "Root"); + obj = pdf_dict_gets(ctx, dict, "Root"); if (obj) { - pdf_drop_obj(root); - root = pdf_keep_obj(obj); + pdf_drop_obj(ctx, root); + root = pdf_keep_obj(ctx, obj); } - obj = pdf_dict_gets(dict, "Info"); + obj = pdf_dict_gets(ctx, dict, "Info"); if (obj) { - pdf_drop_obj(info); - info = pdf_keep_obj(obj); + pdf_drop_obj(ctx, info); + info = pdf_keep_obj(ctx, obj); } - pdf_drop_obj(dict); + pdf_drop_obj(ctx, dict); obj = NULL; } @@ -443,7 +440,7 @@ pdf_repair_xref(pdf_document *doc) else { if (tok == PDF_TOK_ERROR) - fz_read_byte(doc->file); + fz_read_byte(ctx, doc->file); num = 0; gen = 0; } @@ -458,11 +455,11 @@ pdf_repair_xref(pdf_document *doc) */ /* Ensure that the first xref table is a 'solid' one from * 0 to maxnum. */ - pdf_ensure_solid_xref(doc, maxnum); + pdf_ensure_solid_xref(ctx, doc, maxnum); for (i = 0; i < listlen; i++) { - entry = pdf_get_populating_xref_entry(doc, list[i].num); + entry = pdf_get_populating_xref_entry(ctx, doc, list[i].num); entry->type = 'n'; entry->ofs = list[i].ofs; entry->gen = list[i].gen; @@ -472,26 +469,26 @@ pdf_repair_xref(pdf_document *doc) /* correct stream length for unencrypted documents */ if (!encrypt && list[i].stm_len >= 0) { - dict = pdf_load_object(doc, list[i].num, list[i].gen); + dict = pdf_load_object(ctx, doc, list[i].num, list[i].gen); - length = pdf_new_int(doc, list[i].stm_len); - pdf_dict_puts(dict, "Length", length); - pdf_drop_obj(length); + length = pdf_new_int(ctx, doc, list[i].stm_len); + pdf_dict_puts(ctx, dict, "Length", length); + pdf_drop_obj(ctx, length); - pdf_drop_obj(dict); + pdf_drop_obj(ctx, dict); } } - entry = pdf_get_populating_xref_entry(doc, 0); + entry = pdf_get_populating_xref_entry(ctx, doc, 0); entry->type = 'f'; entry->ofs = 0; entry->gen = 65535; entry->stm_ofs = 0; next = 0; - for (i = pdf_xref_len(doc) - 1; i >= 0; i--) + for (i = pdf_xref_len(ctx, doc) - 1; i >= 0; i--) { - entry = pdf_get_populating_xref_entry(doc, i); + entry = pdf_get_populating_xref_entry(ctx, doc, i); if (entry->type == 'f') { entry->ofs = next; @@ -503,57 +500,57 @@ pdf_repair_xref(pdf_document *doc) /* create a repaired trailer, Root will be added later */ - obj = pdf_new_dict(doc, 5); + obj = pdf_new_dict(ctx, doc, 5); /* During repair there is only a single xref section */ - pdf_set_populating_xref_trailer(doc, obj); - pdf_drop_obj(obj); + pdf_set_populating_xref_trailer(ctx, doc, obj); + pdf_drop_obj(ctx, obj); obj = NULL; - obj = pdf_new_int(doc, maxnum + 1); - pdf_dict_puts(pdf_trailer(doc), "Size", obj); - pdf_drop_obj(obj); + obj = pdf_new_int(ctx, doc, maxnum + 1); + pdf_dict_puts(ctx, pdf_trailer(ctx, doc), "Size", obj); + pdf_drop_obj(ctx, obj); obj = NULL; if (root) { - pdf_dict_puts(pdf_trailer(doc), "Root", root); - pdf_drop_obj(root); + pdf_dict_puts(ctx, pdf_trailer(ctx, doc), "Root", root); + pdf_drop_obj(ctx, root); root = NULL; } if (info) { - pdf_dict_puts(pdf_trailer(doc), "Info", info); - pdf_drop_obj(info); + pdf_dict_puts(ctx, pdf_trailer(ctx, doc), "Info", info); + pdf_drop_obj(ctx, info); info = NULL; } if (encrypt) { - if (pdf_is_indirect(encrypt)) + if (pdf_is_indirect(ctx, encrypt)) { /* create new reference with non-NULL xref pointer */ - obj = pdf_new_indirect(doc, pdf_to_num(encrypt), pdf_to_gen(encrypt)); - pdf_drop_obj(encrypt); + obj = pdf_new_indirect(ctx, doc, pdf_to_num(ctx, encrypt), pdf_to_gen(ctx, encrypt)); + pdf_drop_obj(ctx, encrypt); encrypt = obj; obj = NULL; } - pdf_dict_puts(pdf_trailer(doc), "Encrypt", encrypt); - pdf_drop_obj(encrypt); + pdf_dict_puts(ctx, pdf_trailer(ctx, doc), "Encrypt", encrypt); + pdf_drop_obj(ctx, encrypt); encrypt = NULL; } if (id) { - if (pdf_is_indirect(id)) + if (pdf_is_indirect(ctx, id)) { /* create new reference with non-NULL xref pointer */ - obj = pdf_new_indirect(doc, pdf_to_num(id), pdf_to_gen(id)); - pdf_drop_obj(id); + obj = pdf_new_indirect(ctx, doc, pdf_to_num(ctx, id), pdf_to_gen(ctx, id)); + pdf_drop_obj(ctx, id); id = obj; obj = NULL; } - pdf_dict_puts(pdf_trailer(doc), "ID", id); - pdf_drop_obj(id); + pdf_dict_puts(ctx, pdf_trailer(ctx, doc), "ID", id); + pdf_drop_obj(ctx, id); id = NULL; } @@ -561,50 +558,49 @@ pdf_repair_xref(pdf_document *doc) } fz_catch(ctx) { - pdf_drop_obj(encrypt); - pdf_drop_obj(id); - pdf_drop_obj(root); - pdf_drop_obj(obj); - pdf_drop_obj(info); + pdf_drop_obj(ctx, encrypt); + pdf_drop_obj(ctx, id); + pdf_drop_obj(ctx, root); + pdf_drop_obj(ctx, obj); + pdf_drop_obj(ctx, info); fz_free(ctx, list); fz_rethrow(ctx); } } void -pdf_repair_obj_stms(pdf_document *doc) +pdf_repair_obj_stms(fz_context *ctx, pdf_document *doc) { - fz_context *ctx = doc->ctx; pdf_obj *dict; int i; - int xref_len = pdf_xref_len(doc); + int xref_len = pdf_xref_len(ctx, doc); for (i = 0; i < xref_len; i++) { - pdf_xref_entry *entry = pdf_get_populating_xref_entry(doc, i); + pdf_xref_entry *entry = pdf_get_populating_xref_entry(ctx, doc, i); if (entry->stm_ofs) { - dict = pdf_load_object(doc, i, 0); + dict = pdf_load_object(ctx, doc, i, 0); fz_try(ctx) { - if (!strcmp(pdf_to_name(pdf_dict_gets(dict, "Type")), "ObjStm")) - pdf_repair_obj_stm(doc, i, 0); + if (!strcmp(pdf_to_name(ctx, pdf_dict_gets(ctx, dict, "Type")), "ObjStm")) + pdf_repair_obj_stm(ctx, doc, i, 0); } fz_catch(ctx) { fz_warn(ctx, "ignoring broken object stream (%d 0 R)", i); } - pdf_drop_obj(dict); + pdf_drop_obj(ctx, dict); } } /* Ensure that streamed objects reside inside a known non-streamed object */ for (i = 0; i < xref_len; i++) { - pdf_xref_entry *entry = pdf_get_populating_xref_entry(doc, i); + pdf_xref_entry *entry = pdf_get_populating_xref_entry(ctx, doc, i); - if (entry->type == 'o' && pdf_get_populating_xref_entry(doc, entry->ofs)->type != 'n') - fz_throw(doc->ctx, FZ_ERROR_GENERIC, "invalid reference to non-object-stream: %d (%d 0 R)", entry->ofs, i); + if (entry->type == 'o' && pdf_get_populating_xref_entry(ctx, doc, entry->ofs)->type != 'n') + fz_throw(ctx, FZ_ERROR_GENERIC, "invalid reference to non-object-stream: %d (%d 0 R)", entry->ofs, i); } } diff --git a/source/pdf/pdf-run.c b/source/pdf/pdf-run.c index d52d8282..e6f3d5b9 100644 --- a/source/pdf/pdf-run.c +++ b/source/pdf/pdf-run.c @@ -1,19 +1,19 @@ #include "pdf-interpret-imp.h" static void -pdf_run_annot_with_usage(pdf_document *doc, pdf_page *page, pdf_annot *annot, fz_device *dev, const fz_matrix *ctm, char *event, fz_cookie *cookie) +pdf_run_annot_with_usage(fz_context *ctx, pdf_document *doc, pdf_page *page, pdf_annot *annot, fz_device *dev, const fz_matrix *ctm, char *event, fz_cookie *cookie) { fz_matrix local_ctm; pdf_process process; fz_concat(&local_ctm, &page->ctm, ctm); - pdf_process_run(&process, dev, &local_ctm, event, NULL, 0); + pdf_init_process_run(ctx, &process, dev, &local_ctm, event, NULL, 0); - pdf_process_annot(doc, page, annot, &process, cookie); + pdf_process_annot(ctx, doc, page, annot, &process, cookie); } -static void pdf_run_page_contents_with_usage(pdf_document *doc, pdf_page *page, fz_device *dev, const fz_matrix *ctm, char *event, fz_cookie *cookie) +static void pdf_run_page_contents_with_usage(fz_context *ctx, pdf_document *doc, pdf_page *page, fz_device *dev, const fz_matrix *ctm, char *event, fz_cookie *cookie) { fz_matrix local_ctm; pdf_process process; @@ -23,67 +23,70 @@ static void pdf_run_page_contents_with_usage(pdf_document *doc, pdf_page *page, if (page->transparency) { fz_rect mediabox = page->mediabox; - fz_begin_group(dev, fz_transform_rect(&mediabox, &local_ctm), 1, 0, 0, 1); + fz_begin_group(ctx, dev, fz_transform_rect(&mediabox, &local_ctm), 1, 0, 0, 1); } - pdf_process_run(&process, dev, &local_ctm, event, NULL, 0); + pdf_init_process_run(ctx, &process, dev, &local_ctm, event, NULL, 0); - pdf_process_stream_object(doc, page->contents, &process, page->resources, cookie); + pdf_process_stream_object(ctx, doc, page->contents, &process, page->resources, cookie); if (page->transparency) - fz_end_group(dev); + fz_end_group(ctx, dev); } -void pdf_run_page_contents(pdf_document *doc, pdf_page *page, fz_device *dev, const fz_matrix *ctm, fz_cookie *cookie) +void pdf_run_page_contents(fz_context *ctx, pdf_page *page, fz_device *dev, const fz_matrix *ctm, fz_cookie *cookie) { - fz_context *ctx = doc->ctx; - int nocache = !!(dev->hints & FZ_NO_CACHE); + pdf_document *doc = page->doc; + int nocache; + nocache = !!(dev->hints & FZ_NO_CACHE); if (nocache) - pdf_mark_xref(doc); + pdf_mark_xref(ctx, doc); + fz_try(ctx) { - pdf_run_page_contents_with_usage(doc, page, dev, ctm, "View", cookie); + pdf_run_page_contents_with_usage(ctx, doc, page, dev, ctm, "View", cookie); } fz_always(ctx) { if (nocache) - pdf_clear_xref_to_mark(doc); + pdf_clear_xref_to_mark(ctx, doc); } fz_catch(ctx) { fz_rethrow(ctx); } if (page->incomplete & PDF_PAGE_INCOMPLETE_CONTENTS) - fz_throw(doc->ctx, FZ_ERROR_TRYLATER, "incomplete rendering"); + fz_throw(ctx, FZ_ERROR_TRYLATER, "incomplete rendering"); } -void pdf_run_annot(pdf_document *doc, pdf_page *page, pdf_annot *annot, fz_device *dev, const fz_matrix *ctm, fz_cookie *cookie) +void pdf_run_annot(fz_context *ctx, pdf_page *page, pdf_annot *annot, fz_device *dev, const fz_matrix *ctm, fz_cookie *cookie) { - fz_context *ctx = doc->ctx; - int nocache = !!(dev->hints & FZ_NO_CACHE); + pdf_document *doc = page->doc; + int nocache; + nocache = !!(dev->hints & FZ_NO_CACHE); if (nocache) - pdf_mark_xref(doc); + pdf_mark_xref(ctx, doc); fz_try(ctx) { - pdf_run_annot_with_usage(doc, page, annot, dev, ctm, "View", cookie); + pdf_run_annot_with_usage(ctx, doc, page, annot, dev, ctm, "View", cookie); } fz_always(ctx) { if (nocache) - pdf_clear_xref_to_mark(doc); + pdf_clear_xref_to_mark(ctx, doc); } fz_catch(ctx) { fz_rethrow(ctx); } if (page->incomplete & PDF_PAGE_INCOMPLETE_ANNOTS) - fz_throw(doc->ctx, FZ_ERROR_TRYLATER, "incomplete rendering"); + fz_throw(ctx, FZ_ERROR_TRYLATER, "incomplete rendering"); } -static void pdf_run_page_annots_with_usage(pdf_document *doc, pdf_page *page, fz_device *dev, const fz_matrix *ctm, char *event, fz_cookie *cookie) +static void pdf_run_page_annots_with_usage(fz_context *ctx, pdf_document *doc, pdf_page *page, fz_device *dev, const fz_matrix *ctm, char *event, fz_cookie *cookie) { pdf_annot *annot; @@ -105,52 +108,51 @@ static void pdf_run_page_annots_with_usage(pdf_document *doc, pdf_page *page, fz cookie->progress++; } - pdf_run_annot_with_usage(doc, page, annot, dev, ctm, event, cookie); + pdf_run_annot_with_usage(ctx, doc, page, annot, dev, ctm, event, cookie); } } void -pdf_run_page_with_usage(pdf_document *doc, pdf_page *page, fz_device *dev, const fz_matrix *ctm, char *event, fz_cookie *cookie) +pdf_run_page_with_usage(fz_context *ctx, pdf_document *doc, pdf_page *page, fz_device *dev, const fz_matrix *ctm, char *event, fz_cookie *cookie) { - fz_context *ctx = doc->ctx; int nocache = !!(dev->hints & FZ_NO_CACHE); if (nocache) - pdf_mark_xref(doc); + pdf_mark_xref(ctx, doc); fz_try(ctx) { - pdf_run_page_contents_with_usage(doc, page, dev, ctm, event, cookie); - pdf_run_page_annots_with_usage(doc, page, dev, ctm, event, cookie); + pdf_run_page_contents_with_usage(ctx, doc, page, dev, ctm, event, cookie); + pdf_run_page_annots_with_usage(ctx, doc, page, dev, ctm, event, cookie); } fz_always(ctx) { if (nocache) - pdf_clear_xref_to_mark(doc); + pdf_clear_xref_to_mark(ctx, doc); } fz_catch(ctx) { fz_rethrow(ctx); } if (page->incomplete) - fz_throw(doc->ctx, FZ_ERROR_TRYLATER, "incomplete rendering"); + fz_throw(ctx, FZ_ERROR_TRYLATER, "incomplete rendering"); } void -pdf_run_page(pdf_document *doc, pdf_page *page, fz_device *dev, const fz_matrix *ctm, fz_cookie *cookie) +pdf_run_page(fz_context *ctx, pdf_page *page, fz_device *dev, const fz_matrix *ctm, fz_cookie *cookie) { - pdf_run_page_with_usage(doc, page, dev, ctm, "View", cookie); + pdf_document *doc = page->doc; + pdf_run_page_with_usage(ctx, doc, page, dev, ctm, "View", cookie); } void -pdf_run_glyph(pdf_document *doc, pdf_obj *resources, fz_buffer *contents, fz_device *dev, const fz_matrix *ctm, void *gstate, int nested_depth) +pdf_run_glyph(fz_context *ctx, pdf_document *doc, pdf_obj *resources, fz_buffer *contents, fz_device *dev, const fz_matrix *ctm, void *gstate, int nested_depth) { - fz_context *ctx = doc->ctx; pdf_process process; if (nested_depth > 10) fz_throw(ctx, FZ_ERROR_GENERIC, "Too many nestings of Type3 glyphs"); - pdf_process_run(&process, dev, ctm, "View", gstate, nested_depth+1); + pdf_init_process_run(ctx, &process, dev, ctm, "View", gstate, nested_depth+1); - pdf_process_glyph(doc, resources, contents, &process); + pdf_process_glyph(ctx, doc, resources, contents, &process); } diff --git a/source/pdf/pdf-shade.c b/source/pdf/pdf-shade.c index c5009059..4203d1b0 100644 --- a/source/pdf/pdf-shade.c +++ b/source/pdf/pdf-shade.c @@ -47,28 +47,27 @@ pdf_sample_shade_function(fz_context *ctx, fz_shade *shade, int funcs, fz_functi /* Type 1-3 -- Function-based, linear and radial shadings */ static void -pdf_load_function_based_shading(fz_shade *shade, pdf_document *doc, pdf_obj *dict, fz_function *func) +pdf_load_function_based_shading(fz_context *ctx, pdf_document *doc, fz_shade *shade, pdf_obj *dict, fz_function *func) { pdf_obj *obj; float x0, y0, x1, y1; float fv[2]; fz_matrix matrix; int xx, yy; - fz_context *ctx = doc->ctx; float *p; x0 = y0 = 0; x1 = y1 = 1; - obj = pdf_dict_gets(dict, "Domain"); + obj = pdf_dict_gets(ctx, dict, "Domain"); if (obj) { - x0 = pdf_to_real(pdf_array_get(obj, 0)); - x1 = pdf_to_real(pdf_array_get(obj, 1)); - y0 = pdf_to_real(pdf_array_get(obj, 2)); - y1 = pdf_to_real(pdf_array_get(obj, 3)); + x0 = pdf_to_real(ctx, pdf_array_get(ctx, obj, 0)); + x1 = pdf_to_real(ctx, pdf_array_get(ctx, obj, 1)); + y0 = pdf_to_real(ctx, pdf_array_get(ctx, obj, 2)); + y1 = pdf_to_real(ctx, pdf_array_get(ctx, obj, 3)); } - obj = pdf_dict_gets(dict, "Matrix"); + obj = pdf_dict_gets(ctx, dict, "Matrix"); if (obj) pdf_to_matrix(ctx, obj, &matrix); else @@ -98,34 +97,33 @@ pdf_load_function_based_shading(fz_shade *shade, pdf_document *doc, pdf_obj *dic } static void -pdf_load_linear_shading(fz_shade *shade, pdf_document *doc, pdf_obj *dict, int funcs, fz_function **func) +pdf_load_linear_shading(fz_context *ctx, pdf_document *doc, fz_shade *shade, pdf_obj *dict, int funcs, fz_function **func) { pdf_obj *obj; float d0, d1; int e0, e1; - fz_context *ctx = doc->ctx; - obj = pdf_dict_gets(dict, "Coords"); - shade->u.l_or_r.coords[0][0] = pdf_to_real(pdf_array_get(obj, 0)); - shade->u.l_or_r.coords[0][1] = pdf_to_real(pdf_array_get(obj, 1)); - shade->u.l_or_r.coords[1][0] = pdf_to_real(pdf_array_get(obj, 2)); - shade->u.l_or_r.coords[1][1] = pdf_to_real(pdf_array_get(obj, 3)); + obj = pdf_dict_gets(ctx, dict, "Coords"); + shade->u.l_or_r.coords[0][0] = pdf_to_real(ctx, pdf_array_get(ctx, obj, 0)); + shade->u.l_or_r.coords[0][1] = pdf_to_real(ctx, pdf_array_get(ctx, obj, 1)); + shade->u.l_or_r.coords[1][0] = pdf_to_real(ctx, pdf_array_get(ctx, obj, 2)); + shade->u.l_or_r.coords[1][1] = pdf_to_real(ctx, pdf_array_get(ctx, obj, 3)); d0 = 0; d1 = 1; - obj = pdf_dict_gets(dict, "Domain"); + obj = pdf_dict_gets(ctx, dict, "Domain"); if (obj) { - d0 = pdf_to_real(pdf_array_get(obj, 0)); - d1 = pdf_to_real(pdf_array_get(obj, 1)); + d0 = pdf_to_real(ctx, pdf_array_get(ctx, obj, 0)); + d1 = pdf_to_real(ctx, pdf_array_get(ctx, obj, 1)); } e0 = e1 = 0; - obj = pdf_dict_gets(dict, "Extend"); + obj = pdf_dict_gets(ctx, dict, "Extend"); if (obj) { - e0 = pdf_to_bool(pdf_array_get(obj, 0)); - e1 = pdf_to_bool(pdf_array_get(obj, 1)); + e0 = pdf_to_bool(ctx, pdf_array_get(ctx, obj, 0)); + e1 = pdf_to_bool(ctx, pdf_array_get(ctx, obj, 1)); } pdf_sample_shade_function(ctx, shade, funcs, func, d0, d1); @@ -135,36 +133,35 @@ pdf_load_linear_shading(fz_shade *shade, pdf_document *doc, pdf_obj *dict, int f } static void -pdf_load_radial_shading(fz_shade *shade, pdf_document *doc, pdf_obj *dict, int funcs, fz_function **func) +pdf_load_radial_shading(fz_context *ctx, pdf_document *doc, fz_shade *shade, pdf_obj *dict, int funcs, fz_function **func) { pdf_obj *obj; float d0, d1; int e0, e1; - fz_context *ctx = doc->ctx; - obj = pdf_dict_gets(dict, "Coords"); - shade->u.l_or_r.coords[0][0] = pdf_to_real(pdf_array_get(obj, 0)); - shade->u.l_or_r.coords[0][1] = pdf_to_real(pdf_array_get(obj, 1)); - shade->u.l_or_r.coords[0][2] = pdf_to_real(pdf_array_get(obj, 2)); - shade->u.l_or_r.coords[1][0] = pdf_to_real(pdf_array_get(obj, 3)); - shade->u.l_or_r.coords[1][1] = pdf_to_real(pdf_array_get(obj, 4)); - shade->u.l_or_r.coords[1][2] = pdf_to_real(pdf_array_get(obj, 5)); + obj = pdf_dict_gets(ctx, dict, "Coords"); + shade->u.l_or_r.coords[0][0] = pdf_to_real(ctx, pdf_array_get(ctx, obj, 0)); + shade->u.l_or_r.coords[0][1] = pdf_to_real(ctx, pdf_array_get(ctx, obj, 1)); + shade->u.l_or_r.coords[0][2] = pdf_to_real(ctx, pdf_array_get(ctx, obj, 2)); + shade->u.l_or_r.coords[1][0] = pdf_to_real(ctx, pdf_array_get(ctx, obj, 3)); + shade->u.l_or_r.coords[1][1] = pdf_to_real(ctx, pdf_array_get(ctx, obj, 4)); + shade->u.l_or_r.coords[1][2] = pdf_to_real(ctx, pdf_array_get(ctx, obj, 5)); d0 = 0; d1 = 1; - obj = pdf_dict_gets(dict, "Domain"); + obj = pdf_dict_gets(ctx, dict, "Domain"); if (obj) { - d0 = pdf_to_real(pdf_array_get(obj, 0)); - d1 = pdf_to_real(pdf_array_get(obj, 1)); + d0 = pdf_to_real(ctx, pdf_array_get(ctx, obj, 0)); + d1 = pdf_to_real(ctx, pdf_array_get(ctx, obj, 1)); } e0 = e1 = 0; - obj = pdf_dict_gets(dict, "Extend"); + obj = pdf_dict_gets(ctx, dict, "Extend"); if (obj) { - e0 = pdf_to_bool(pdf_array_get(obj, 0)); - e1 = pdf_to_bool(pdf_array_get(obj, 1)); + e0 = pdf_to_bool(ctx, pdf_array_get(ctx, obj, 0)); + e1 = pdf_to_bool(ctx, pdf_array_get(ctx, obj, 1)); } pdf_sample_shade_function(ctx, shade, funcs, func, d0, d1); @@ -188,9 +185,8 @@ struct mesh_params }; static void -pdf_load_mesh_params(fz_shade *shade, pdf_document *doc, pdf_obj *dict) +pdf_load_mesh_params(fz_context *ctx, pdf_document *doc, fz_shade *shade, pdf_obj *dict) { - fz_context *ctx = doc->ctx; pdf_obj *obj; int i, n; @@ -202,23 +198,23 @@ pdf_load_mesh_params(fz_shade *shade, pdf_document *doc, pdf_obj *dict) shade->u.m.c1[i] = 1; } - shade->u.m.vprow = pdf_to_int(pdf_dict_gets(dict, "VerticesPerRow")); - shade->u.m.bpflag = pdf_to_int(pdf_dict_gets(dict, "BitsPerFlag")); - shade->u.m.bpcoord = pdf_to_int(pdf_dict_gets(dict, "BitsPerCoordinate")); - shade->u.m.bpcomp = pdf_to_int(pdf_dict_gets(dict, "BitsPerComponent")); + shade->u.m.vprow = pdf_to_int(ctx, pdf_dict_gets(ctx, dict, "VerticesPerRow")); + shade->u.m.bpflag = pdf_to_int(ctx, pdf_dict_gets(ctx, dict, "BitsPerFlag")); + shade->u.m.bpcoord = pdf_to_int(ctx, pdf_dict_gets(ctx, dict, "BitsPerCoordinate")); + shade->u.m.bpcomp = pdf_to_int(ctx, pdf_dict_gets(ctx, dict, "BitsPerComponent")); - obj = pdf_dict_gets(dict, "Decode"); - if (pdf_array_len(obj) >= 6) + obj = pdf_dict_gets(ctx, dict, "Decode"); + if (pdf_array_len(ctx, obj) >= 6) { - n = (pdf_array_len(obj) - 4) / 2; - shade->u.m.x0 = pdf_to_real(pdf_array_get(obj, 0)); - shade->u.m.x1 = pdf_to_real(pdf_array_get(obj, 1)); - shade->u.m.y0 = pdf_to_real(pdf_array_get(obj, 2)); - shade->u.m.y1 = pdf_to_real(pdf_array_get(obj, 3)); + n = (pdf_array_len(ctx, obj) - 4) / 2; + shade->u.m.x0 = pdf_to_real(ctx, pdf_array_get(ctx, obj, 0)); + shade->u.m.x1 = pdf_to_real(ctx, pdf_array_get(ctx, obj, 1)); + shade->u.m.y0 = pdf_to_real(ctx, pdf_array_get(ctx, obj, 2)); + shade->u.m.y1 = pdf_to_real(ctx, pdf_array_get(ctx, obj, 3)); for (i = 0; i < n; i++) { - shade->u.m.c0[i] = pdf_to_real(pdf_array_get(obj, 4 + i * 2)); - shade->u.m.c1[i] = pdf_to_real(pdf_array_get(obj, 5 + i * 2)); + shade->u.m.c0[i] = pdf_to_real(ctx, pdf_array_get(ctx, obj, 4 + i * 2)); + shade->u.m.c1[i] = pdf_to_real(ctx, pdf_array_get(ctx, obj, 5 + i * 2)); } } @@ -252,67 +248,59 @@ pdf_load_mesh_params(fz_shade *shade, pdf_document *doc, pdf_obj *dict) } static void -pdf_load_type4_shade(fz_shade *shade, pdf_document *doc, pdf_obj *dict, - int funcs, fz_function **func) +pdf_load_type4_shade(fz_context *ctx, pdf_document *doc, fz_shade *shade, pdf_obj *dict, int funcs, fz_function **func) { - fz_context *ctx = doc->ctx; - pdf_load_mesh_params(shade, doc, dict); + pdf_load_mesh_params(ctx, doc, shade, dict); if (funcs > 0) pdf_sample_shade_function(ctx, shade, funcs, func, shade->u.m.c0[0], shade->u.m.c1[0]); - shade->buffer = pdf_load_compressed_stream(doc, pdf_to_num(dict), pdf_to_gen(dict)); + shade->buffer = pdf_load_compressed_stream(ctx, doc, pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict)); } static void -pdf_load_type5_shade(fz_shade *shade, pdf_document *doc, pdf_obj *dict, - int funcs, fz_function **func) +pdf_load_type5_shade(fz_context *ctx, pdf_document *doc, fz_shade *shade, pdf_obj *dict, int funcs, fz_function **func) { - fz_context *ctx = doc->ctx; - pdf_load_mesh_params(shade, doc, dict); + pdf_load_mesh_params(ctx, doc, shade, dict); if (funcs > 0) pdf_sample_shade_function(ctx, shade, funcs, func, shade->u.m.c0[0], shade->u.m.c1[0]); - shade->buffer = pdf_load_compressed_stream(doc, pdf_to_num(dict), pdf_to_gen(dict)); + shade->buffer = pdf_load_compressed_stream(ctx, doc, pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict)); } /* Type 6 & 7 -- Patch mesh shadings */ static void -pdf_load_type6_shade(fz_shade *shade, pdf_document *doc, pdf_obj *dict, - int funcs, fz_function **func) +pdf_load_type6_shade(fz_context *ctx, pdf_document *doc, fz_shade *shade, pdf_obj *dict, int funcs, fz_function **func) { - fz_context *ctx = doc->ctx; - pdf_load_mesh_params(shade, doc, dict); + pdf_load_mesh_params(ctx, doc, shade, dict); if (funcs > 0) pdf_sample_shade_function(ctx, shade, funcs, func, shade->u.m.c0[0], shade->u.m.c1[0]); - shade->buffer = pdf_load_compressed_stream(doc, pdf_to_num(dict), pdf_to_gen(dict)); + shade->buffer = pdf_load_compressed_stream(ctx, doc, pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict)); } static void -pdf_load_type7_shade(fz_shade *shade, pdf_document *doc, pdf_obj *dict, - int funcs, fz_function **func) +pdf_load_type7_shade(fz_context *ctx, pdf_document *doc, fz_shade *shade, pdf_obj *dict, int funcs, fz_function **func) { - fz_context *ctx = doc->ctx; - pdf_load_mesh_params(shade, doc, dict); + pdf_load_mesh_params(ctx, doc, shade, dict); if (funcs > 0) pdf_sample_shade_function(ctx, shade, funcs, func, shade->u.m.c0[0], shade->u.m.c1[0]); - shade->buffer = pdf_load_compressed_stream(doc, pdf_to_num(dict), pdf_to_gen(dict)); + shade->buffer = pdf_load_compressed_stream(ctx, doc, pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict)); } /* Load all of the shading dictionary parameters, then switch on the shading type. */ static fz_shade * -pdf_load_shading_dict(pdf_document *doc, pdf_obj *dict, const fz_matrix *transform) +pdf_load_shading_dict(fz_context *ctx, pdf_document *doc, pdf_obj *dict, const fz_matrix *transform) { fz_shade *shade = NULL; fz_function *func[FZ_MAX_COLORS] = { NULL }; @@ -320,7 +308,6 @@ pdf_load_shading_dict(pdf_document *doc, pdf_obj *dict, const fz_matrix *transfo int funcs = 0; int type = 0; int i, in, out; - fz_context *ctx = doc->ctx; fz_var(shade); fz_var(func); @@ -341,28 +328,28 @@ pdf_load_shading_dict(pdf_document *doc, pdf_obj *dict, const fz_matrix *transfo funcs = 0; - obj = pdf_dict_gets(dict, "ShadingType"); - type = pdf_to_int(obj); + obj = pdf_dict_gets(ctx, dict, "ShadingType"); + type = pdf_to_int(ctx, obj); - obj = pdf_dict_gets(dict, "ColorSpace"); + obj = pdf_dict_gets(ctx, dict, "ColorSpace"); if (!obj) fz_throw(ctx, FZ_ERROR_GENERIC, "shading colorspace is missing"); - shade->colorspace = pdf_load_colorspace(doc, obj); + shade->colorspace = pdf_load_colorspace(ctx, doc, obj); - obj = pdf_dict_gets(dict, "Background"); + obj = pdf_dict_gets(ctx, dict, "Background"); if (obj) { shade->use_background = 1; for (i = 0; i < shade->colorspace->n; i++) - shade->background[i] = pdf_to_real(pdf_array_get(obj, i)); + shade->background[i] = pdf_to_real(ctx, pdf_array_get(ctx, obj, i)); } - obj = pdf_dict_gets(dict, "BBox"); - if (pdf_is_array(obj)) + obj = pdf_dict_gets(ctx, dict, "BBox"); + if (pdf_is_array(ctx, obj)) pdf_to_rect(ctx, obj, &shade->bbox); - obj = pdf_dict_gets(dict, "Function"); - if (pdf_is_dict(obj)) + obj = pdf_dict_gets(ctx, dict, "Function"); + if (pdf_is_dict(ctx, obj)) { funcs = 1; @@ -372,13 +359,13 @@ pdf_load_shading_dict(pdf_document *doc, pdf_obj *dict, const fz_matrix *transfo in = 1; out = shade->colorspace->n; - func[0] = pdf_load_function(doc, obj, in, out); + func[0] = pdf_load_function(ctx, doc, obj, in, out); if (!func[0]) - fz_throw(ctx, FZ_ERROR_GENERIC, "cannot load shading function (%d %d R)", pdf_to_num(obj), pdf_to_gen(obj)); + fz_throw(ctx, FZ_ERROR_GENERIC, "cannot load shading function (%d %d R)", pdf_to_num(ctx, obj), pdf_to_gen(ctx, obj)); } - else if (pdf_is_array(obj)) + else if (pdf_is_array(ctx, obj)) { - funcs = pdf_array_len(obj); + funcs = pdf_array_len(ctx, obj); if (funcs != 1 && funcs != shade->colorspace->n) { funcs = 0; @@ -398,27 +385,27 @@ pdf_load_shading_dict(pdf_document *doc, pdf_obj *dict, const fz_matrix *transfo for (i = 0; i < funcs; i++) { - func[i] = pdf_load_function(doc, pdf_array_get(obj, i), in, out); + func[i] = pdf_load_function(ctx, doc, pdf_array_get(ctx, obj, i), in, out); if (!func[i]) - fz_throw(ctx, FZ_ERROR_GENERIC, "cannot load shading function (%d %d R)", pdf_to_num(obj), pdf_to_gen(obj)); + fz_throw(ctx, FZ_ERROR_GENERIC, "cannot load shading function (%d %d R)", pdf_to_num(ctx, obj), pdf_to_gen(ctx, obj)); } } else if (type < 4) { /* Functions are compulsory for types 1,2,3 */ - fz_throw(ctx, FZ_ERROR_GENERIC, "cannot load shading function (%d %d R)", pdf_to_num(obj), pdf_to_gen(obj)); + fz_throw(ctx, FZ_ERROR_GENERIC, "cannot load shading function (%d %d R)", pdf_to_num(ctx, obj), pdf_to_gen(ctx, obj)); } shade->type = type; switch (type) { - case 1: pdf_load_function_based_shading(shade, doc, dict, func[0]); break; - case 2: pdf_load_linear_shading(shade, doc, dict, funcs, func); break; - case 3: pdf_load_radial_shading(shade, doc, dict, funcs, func); break; - case 4: pdf_load_type4_shade(shade, doc, dict, funcs, func); break; - case 5: pdf_load_type5_shade(shade, doc, dict, funcs, func); break; - case 6: pdf_load_type6_shade(shade, doc, dict, funcs, func); break; - case 7: pdf_load_type7_shade(shade, doc, dict, funcs, func); break; + case 1: pdf_load_function_based_shading(ctx, doc, shade, dict, func[0]); break; + case 2: pdf_load_linear_shading(ctx, doc, shade, dict, funcs, func); break; + case 3: pdf_load_radial_shading(ctx, doc, shade, dict, funcs, func); break; + case 4: pdf_load_type4_shade(ctx, doc, shade, dict, funcs, func); break; + case 5: pdf_load_type5_shade(ctx, doc, shade, dict, funcs, func); break; + case 6: pdf_load_type6_shade(ctx, doc, shade, dict, funcs, func); break; + case 7: pdf_load_type7_shade(ctx, doc, shade, dict, funcs, func); break; default: fz_throw(ctx, FZ_ERROR_GENERIC, "unknown shading type: %d", type); } @@ -433,7 +420,7 @@ pdf_load_shading_dict(pdf_document *doc, pdf_obj *dict, const fz_matrix *transfo { fz_drop_shade(ctx, shade); - fz_rethrow_message(ctx, "cannot load shading type %d (%d %d R)", type, pdf_to_num(dict), pdf_to_gen(dict)); + fz_rethrow_message(ctx, "cannot load shading type %d (%d %d R)", type, pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict)); } return shade; } @@ -449,11 +436,10 @@ fz_shade_size(fz_shade *s) } fz_shade * -pdf_load_shading(pdf_document *doc, pdf_obj *dict) +pdf_load_shading(fz_context *ctx, pdf_document *doc, pdf_obj *dict) { fz_matrix mat; pdf_obj *obj; - fz_context *ctx = doc->ctx; fz_shade *shade; if ((shade = pdf_find_item(ctx, fz_drop_shade_imp, dict)) != NULL) @@ -462,34 +448,34 @@ pdf_load_shading(pdf_document *doc, pdf_obj *dict) } /* Type 2 pattern dictionary */ - if (pdf_dict_gets(dict, "PatternType")) + if (pdf_dict_gets(ctx, dict, "PatternType")) { - obj = pdf_dict_gets(dict, "Matrix"); + obj = pdf_dict_gets(ctx, dict, "Matrix"); if (obj) pdf_to_matrix(ctx, obj, &mat); else mat = fz_identity; - obj = pdf_dict_gets(dict, "ExtGState"); + obj = pdf_dict_gets(ctx, dict, "ExtGState"); if (obj) { - if (pdf_dict_gets(obj, "CA") || pdf_dict_gets(obj, "ca")) + if (pdf_dict_gets(ctx, obj, "CA") || pdf_dict_gets(ctx, obj, "ca")) { fz_warn(ctx, "shading with alpha not supported"); } } - obj = pdf_dict_gets(dict, "Shading"); + obj = pdf_dict_gets(ctx, dict, "Shading"); if (!obj) fz_throw(ctx, FZ_ERROR_GENERIC, "syntaxerror: missing shading dictionary"); - shade = pdf_load_shading_dict(doc, obj, &mat); + shade = pdf_load_shading_dict(ctx, doc, obj, &mat); } /* Naked shading dictionary */ else { - shade = pdf_load_shading_dict(doc, dict, &fz_identity); + shade = pdf_load_shading_dict(ctx, doc, dict, &fz_identity); } pdf_store_item(ctx, dict, shade, fz_shade_size(shade)); diff --git a/source/pdf/pdf-store.c b/source/pdf/pdf-store.c index 7349e9d4..51255414 100644 --- a/source/pdf/pdf-store.c +++ b/source/pdf/pdf-store.c @@ -1,48 +1,48 @@ #include "mupdf/pdf.h" static int -pdf_make_hash_key(fz_store_hash *hash, void *key_) +pdf_make_hash_key(fz_context *ctx, fz_store_hash *hash, void *key_) { pdf_obj *key = (pdf_obj *)key_; - if (!pdf_is_indirect(key)) + if (!pdf_is_indirect(ctx, key)) return 0; - hash->u.i.i0 = pdf_to_num(key); - hash->u.i.i1 = pdf_to_gen(key); - hash->u.i.ptr = pdf_get_indirect_document(key); + hash->u.i.i0 = pdf_to_num(ctx, key); + hash->u.i.i1 = pdf_to_gen(ctx, key); + hash->u.i.ptr = pdf_get_indirect_document(ctx, key); return 1; } static void * pdf_keep_key(fz_context *ctx, void *key) { - return (void *)pdf_keep_obj((pdf_obj *)key); + return (void *)pdf_keep_obj(ctx, (pdf_obj *)key); } static void pdf_drop_key(fz_context *ctx, void *key) { - pdf_drop_obj((pdf_obj *)key); + pdf_drop_obj(ctx, (pdf_obj *)key); } static int -pdf_cmp_key(void *k0, void *k1) +pdf_cmp_key(fz_context *ctx, void *k0, void *k1) { - return pdf_objcmp((pdf_obj *)k0, (pdf_obj *)k1); + return pdf_objcmp(ctx, (pdf_obj *)k0, (pdf_obj *)k1); } #ifndef NDEBUG static void -pdf_debug_key(FILE *out, void *key_) +pdf_debug_key(fz_context *ctx, FILE *out, void *key_) { pdf_obj *key = (pdf_obj *)key_; - if (pdf_is_indirect(key)) + if (pdf_is_indirect(ctx, key)) { - fprintf(out, "(%d %d R) ", pdf_to_num(key), pdf_to_gen(key)); + fprintf(out, "(%d %d R) ", pdf_to_num(ctx, key), pdf_to_gen(ctx, key)); } else - pdf_fprint_obj(out, key, 0); + pdf_fprint_obj(ctx, out, key, 0); } #endif diff --git a/source/pdf/pdf-stream.c b/source/pdf/pdf-stream.c index 9efd1887..2335e67a 100644 --- a/source/pdf/pdf-stream.c +++ b/source/pdf/pdf-stream.c @@ -4,14 +4,14 @@ * Check if an object is a stream or not. */ int -pdf_is_stream(pdf_document *doc, int num, int gen) +pdf_is_stream(fz_context *ctx, pdf_document *doc, int num, int gen) { pdf_xref_entry *entry; - if (num <= 0 || num >= pdf_xref_len(doc)) + if (num <= 0 || num >= pdf_xref_len(ctx, doc)) return 0; - entry = pdf_cache_object(doc, num, gen); + entry = pdf_cache_object(ctx, doc, num, gen); return entry->stm_ofs != 0 || entry->stm_buf; } @@ -26,18 +26,18 @@ pdf_stream_has_crypt(fz_context *ctx, pdf_obj *stm) pdf_obj *obj; int i; - filters = pdf_dict_getsa(stm, "Filter", "F"); + filters = pdf_dict_getsa(ctx, stm, "Filter", "F"); if (filters) { - if (!strcmp(pdf_to_name(filters), "Crypt")) + if (!strcmp(pdf_to_name(ctx, filters), "Crypt")) return 1; - if (pdf_is_array(filters)) + if (pdf_is_array(ctx, filters)) { - int n = pdf_array_len(filters); + int n = pdf_array_len(ctx, filters); for (i = 0; i < n; i++) { - obj = pdf_array_get(filters, i); - if (!strcmp(pdf_to_name(obj), "Crypt")) + obj = pdf_array_get(ctx, filters, i); + if (!strcmp(pdf_to_name(ctx, obj), "Crypt")) return 1; } } @@ -46,10 +46,9 @@ pdf_stream_has_crypt(fz_context *ctx, pdf_obj *stm) } static fz_jbig2_globals * -pdf_load_jbig2_globals(pdf_document *doc, pdf_obj *dict) +pdf_load_jbig2_globals(fz_context *ctx, pdf_document *doc, pdf_obj *dict) { fz_jbig2_globals *globals; - fz_context *ctx = doc->ctx; fz_buffer *buf = NULL; fz_var(buf); @@ -61,7 +60,7 @@ pdf_load_jbig2_globals(pdf_document *doc, pdf_obj *dict) fz_try(ctx) { - buf = pdf_load_stream(doc, pdf_to_num(dict), pdf_to_gen(dict)); + buf = pdf_load_stream(ctx, doc, pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict)); globals = fz_load_jbig2_globals(ctx, buf->data, buf->len); pdf_store_item(ctx, dict, globals, buf->len); } @@ -81,68 +80,67 @@ pdf_load_jbig2_globals(pdf_document *doc, pdf_obj *dict) * Create a filter given a name and param dictionary. */ static fz_stream * -build_filter(fz_stream *chain, pdf_document *doc, pdf_obj *f, pdf_obj *p, int num, int gen, fz_compression_params *params) +build_filter(fz_context *ctx, fz_stream *chain, pdf_document *doc, pdf_obj *f, pdf_obj *p, int num, int gen, fz_compression_params *params) { - fz_context *ctx = chain->ctx; - char *s = pdf_to_name(f); + char *s = pdf_to_name(ctx, f); - int predictor = pdf_to_int(pdf_dict_gets(p, "Predictor")); - pdf_obj *columns_obj = pdf_dict_gets(p, "Columns"); - int columns = pdf_to_int(columns_obj); - int colors = pdf_to_int(pdf_dict_gets(p, "Colors")); - int bpc = pdf_to_int(pdf_dict_gets(p, "BitsPerComponent")); + int predictor = pdf_to_int(ctx, pdf_dict_gets(ctx, p, "Predictor")); + pdf_obj *columns_obj = pdf_dict_gets(ctx, p, "Columns"); + int columns = pdf_to_int(ctx, columns_obj); + int colors = pdf_to_int(ctx, pdf_dict_gets(ctx, p, "Colors")); + int bpc = pdf_to_int(ctx, pdf_dict_gets(ctx, p, "BitsPerComponent")); if (params) params->type = FZ_IMAGE_RAW; if (!strcmp(s, "ASCIIHexDecode") || !strcmp(s, "AHx")) - return fz_open_ahxd(chain); + return fz_open_ahxd(ctx, chain); else if (!strcmp(s, "ASCII85Decode") || !strcmp(s, "A85")) - return fz_open_a85d(chain); + return fz_open_a85d(ctx, chain); else if (!strcmp(s, "CCITTFaxDecode") || !strcmp(s, "CCF")) { - pdf_obj *k = pdf_dict_gets(p, "K"); - pdf_obj *eol = pdf_dict_gets(p, "EndOfLine"); - pdf_obj *eba = pdf_dict_gets(p, "EncodedByteAlign"); - pdf_obj *rows = pdf_dict_gets(p, "Rows"); - pdf_obj *eob = pdf_dict_gets(p, "EndOfBlock"); - pdf_obj *bi1 = pdf_dict_gets(p, "BlackIs1"); + pdf_obj *k = pdf_dict_gets(ctx, p, "K"); + pdf_obj *eol = pdf_dict_gets(ctx, p, "EndOfLine"); + pdf_obj *eba = pdf_dict_gets(ctx, p, "EncodedByteAlign"); + pdf_obj *rows = pdf_dict_gets(ctx, p, "Rows"); + pdf_obj *eob = pdf_dict_gets(ctx, p, "EndOfBlock"); + pdf_obj *bi1 = pdf_dict_gets(ctx, p, "BlackIs1"); if (params) { /* We will shortstop here */ params->type = FZ_IMAGE_FAX; - params->u.fax.k = (k ? pdf_to_int(k) : 0); - params->u.fax.end_of_line = (eol ? pdf_to_bool(eol) : 0); - params->u.fax.encoded_byte_align = (eba ? pdf_to_bool(eba) : 0); + params->u.fax.k = (k ? pdf_to_int(ctx, k) : 0); + params->u.fax.end_of_line = (eol ? pdf_to_bool(ctx, eol) : 0); + params->u.fax.encoded_byte_align = (eba ? pdf_to_bool(ctx, eba) : 0); params->u.fax.columns = (columns_obj ? columns : 1728); - params->u.fax.rows = (rows ? pdf_to_int(rows) : 0); - params->u.fax.end_of_block = (eob ? pdf_to_bool(eob) : 1); - params->u.fax.black_is_1 = (bi1 ? pdf_to_bool(bi1) : 0); + params->u.fax.rows = (rows ? pdf_to_int(ctx, rows) : 0); + params->u.fax.end_of_block = (eob ? pdf_to_bool(ctx, eob) : 1); + params->u.fax.black_is_1 = (bi1 ? pdf_to_bool(ctx, bi1) : 0); return chain; } - return fz_open_faxd(chain, - k ? pdf_to_int(k) : 0, - eol ? pdf_to_bool(eol) : 0, - eba ? pdf_to_bool(eba) : 0, + return fz_open_faxd(ctx, chain, + k ? pdf_to_int(ctx, k) : 0, + eol ? pdf_to_bool(ctx, eol) : 0, + eba ? pdf_to_bool(ctx, eba) : 0, columns_obj ? columns : 1728, - rows ? pdf_to_int(rows) : 0, - eob ? pdf_to_bool(eob) : 1, - bi1 ? pdf_to_bool(bi1) : 0); + rows ? pdf_to_int(ctx, rows) : 0, + eob ? pdf_to_bool(ctx, eob) : 1, + bi1 ? pdf_to_bool(ctx, bi1) : 0); } else if (!strcmp(s, "DCTDecode") || !strcmp(s, "DCT")) { - pdf_obj *ct = pdf_dict_gets(p, "ColorTransform"); + pdf_obj *ct = pdf_dict_gets(ctx, p, "ColorTransform"); if (params) { /* We will shortstop here */ params->type = FZ_IMAGE_JPEG; - params->u.jpeg.color_transform = (ct ? pdf_to_int(ct) : -1); + params->u.jpeg.color_transform = (ct ? pdf_to_int(ctx, ct) : -1); return chain; } - return fz_open_dctd(chain, ct ? pdf_to_int(ct) : -1, 0, NULL); + return fz_open_dctd(ctx, chain, ct ? pdf_to_int(ctx, ct) : -1, 0, NULL); } else if (!strcmp(s, "RunLengthDecode") || !strcmp(s, "RL")) @@ -153,7 +151,7 @@ build_filter(fz_stream *chain, pdf_document *doc, pdf_obj *f, pdf_obj *p, int nu params->type = FZ_IMAGE_RLD; return chain; } - return fz_open_rld(chain); + return fz_open_rld(ctx, chain); } else if (!strcmp(s, "FlateDecode") || !strcmp(s, "Fl")) { @@ -167,15 +165,15 @@ build_filter(fz_stream *chain, pdf_document *doc, pdf_obj *f, pdf_obj *p, int nu params->u.flate.bpc = bpc; return chain; } - chain = fz_open_flated(chain, 15); + chain = fz_open_flated(ctx, chain, 15); if (predictor > 1) - chain = fz_open_predict(chain, predictor, columns, colors, bpc); + chain = fz_open_predict(ctx, chain, predictor, columns, colors, bpc); return chain; } else if (!strcmp(s, "LZWDecode") || !strcmp(s, "LZW")) { - pdf_obj *ec = pdf_dict_gets(p, "EarlyChange"); + pdf_obj *ec = pdf_dict_gets(ctx, p, "EarlyChange"); if (params) { /* We will shortstop here */ @@ -184,23 +182,23 @@ build_filter(fz_stream *chain, pdf_document *doc, pdf_obj *f, pdf_obj *p, int nu params->u.lzw.columns = columns; params->u.lzw.colors = colors; params->u.lzw.bpc = bpc; - params->u.lzw.early_change = (ec ? pdf_to_int(ec) : 1); + params->u.lzw.early_change = (ec ? pdf_to_int(ctx, ec) : 1); return chain; } - chain = fz_open_lzwd(chain, ec ? pdf_to_int(ec) : 1); + chain = fz_open_lzwd(ctx, chain, ec ? pdf_to_int(ctx, ec) : 1); if (predictor > 1) - chain = fz_open_predict(chain, predictor, columns, colors, bpc); + chain = fz_open_predict(ctx, chain, predictor, columns, colors, bpc); return chain; } else if (!strcmp(s, "JBIG2Decode")) { fz_jbig2_globals *globals = NULL; - pdf_obj *obj = pdf_dict_gets(p, "JBIG2Globals"); - if (pdf_is_indirect(obj)) - globals = pdf_load_jbig2_globals(doc, obj); + pdf_obj *obj = pdf_dict_gets(ctx, p, "JBIG2Globals"); + if (pdf_is_indirect(ctx, obj)) + globals = pdf_load_jbig2_globals(ctx, doc, obj); /* fz_open_jbig2d takes possession of globals */ - return fz_open_jbig2d(chain, globals); + return fz_open_jbig2d(ctx, chain, globals); } else if (!strcmp(s, "JPXDecode")) @@ -216,9 +214,9 @@ build_filter(fz_stream *chain, pdf_document *doc, pdf_obj *f, pdf_obj *p, int nu return chain; } - name = pdf_dict_gets(p, "Name"); - if (pdf_is_name(name)) - return pdf_open_crypt_with_filter(chain, doc->crypt, pdf_to_name(name), num, gen); + name = pdf_dict_gets(ctx, p, "Name"); + if (pdf_is_name(ctx, name)) + return pdf_open_crypt_with_filter(ctx, chain, doc->crypt, pdf_to_name(ctx, name), num, gen); return chain; } @@ -233,30 +231,29 @@ build_filter(fz_stream *chain, pdf_document *doc, pdf_obj *f, pdf_obj *p, int nu * Assume ownership of head. */ static fz_stream * -build_filter_chain(fz_stream *chain, pdf_document *doc, pdf_obj *fs, pdf_obj *ps, int num, int gen, fz_compression_params *params) +build_filter_chain(fz_context *ctx, fz_stream *chain, pdf_document *doc, pdf_obj *fs, pdf_obj *ps, int num, int gen, fz_compression_params *params) { pdf_obj *f; pdf_obj *p; int i, n; - fz_context *ctx = chain->ctx; fz_try(ctx) { - n = pdf_array_len(fs); + n = pdf_array_len(ctx, fs); for (i = 0; i < n; i++) { fz_stream *chain2; - f = pdf_array_get(fs, i); - p = pdf_array_get(ps, i); + f = pdf_array_get(ctx, fs, i); + p = pdf_array_get(ctx, ps, i); chain2 = chain; chain = NULL; - chain = build_filter(chain2, doc, f, p, num, gen, (i == n-1 ? params : NULL)); + chain = build_filter(ctx, chain2, doc, f, p, num, gen, (i == n-1 ? params : NULL)); } } fz_catch(ctx) { - fz_drop_stream(chain); + fz_drop_stream(ctx, chain); fz_rethrow(ctx); } @@ -272,28 +269,27 @@ build_filter_chain(fz_stream *chain, pdf_document *doc, pdf_obj *fs, pdf_obj *ps * orig_num and orig_gen are used purely to seed the encryption. */ static fz_stream * -pdf_open_raw_filter(fz_stream *chain, pdf_document *doc, pdf_obj *stmobj, int num, int orig_num, int orig_gen, int offset) +pdf_open_raw_filter(fz_context *ctx, fz_stream *chain, pdf_document *doc, pdf_obj *stmobj, int num, int orig_num, int orig_gen, int offset) { - fz_context *ctx = chain->ctx; int hascrypt; int len; - if (num > 0 && num < pdf_xref_len(doc)) + if (num > 0 && num < pdf_xref_len(ctx, doc)) { - pdf_xref_entry *entry = pdf_get_xref_entry(doc, num); + pdf_xref_entry *entry = pdf_get_xref_entry(ctx, doc, num); if (entry->stm_buf) return fz_open_buffer(ctx, entry->stm_buf); } /* don't close chain when we close this filter */ - fz_keep_stream(chain); + fz_keep_stream(ctx, chain); - len = pdf_to_int(pdf_dict_gets(stmobj, "Length")); - chain = fz_open_null(chain, len, offset); + len = pdf_to_int(ctx, pdf_dict_gets(ctx, stmobj, "Length")); + chain = fz_open_null(ctx, chain, len, offset); hascrypt = pdf_stream_has_crypt(ctx, stmobj); if (doc->crypt && !hascrypt) - chain = pdf_open_crypt(chain, doc->crypt, orig_num, orig_gen); + chain = pdf_open_crypt(ctx, chain, doc->crypt, orig_num, orig_gen); return chain; } @@ -303,37 +299,37 @@ pdf_open_raw_filter(fz_stream *chain, pdf_document *doc, pdf_obj *stmobj, int nu * to stream length and decrypting. */ static fz_stream * -pdf_open_filter(fz_stream *chain, pdf_document *doc, pdf_obj *stmobj, int num, int gen, int offset, fz_compression_params *imparams) +pdf_open_filter(fz_context *ctx, pdf_document *doc, fz_stream *chain, pdf_obj *stmobj, int num, int gen, int offset, fz_compression_params *imparams) { pdf_obj *filters; pdf_obj *params; - filters = pdf_dict_getsa(stmobj, "Filter", "F"); - params = pdf_dict_getsa(stmobj, "DecodeParms", "DP"); + filters = pdf_dict_getsa(ctx, stmobj, "Filter", "F"); + params = pdf_dict_getsa(ctx, stmobj, "DecodeParms", "DP"); - chain = pdf_open_raw_filter(chain, doc, stmobj, num, num, gen, offset); + chain = pdf_open_raw_filter(ctx, chain, doc, stmobj, num, num, gen, offset); fz_var(chain); - fz_try(doc->ctx) + fz_try(ctx) { - if (pdf_is_name(filters)) + if (pdf_is_name(ctx, filters)) { fz_stream *chain2 = chain; chain = NULL; - chain = build_filter(chain2, doc, filters, params, num, gen, imparams); + chain = build_filter(ctx, chain2, doc, filters, params, num, gen, imparams); } - else if (pdf_array_len(filters) > 0) + else if (pdf_array_len(ctx, filters) > 0) { fz_stream *chain2 = chain; chain = NULL; - chain = build_filter_chain(chain2, doc, filters, params, num, gen, imparams); + chain = build_filter_chain(ctx, chain2, doc, filters, params, num, gen, imparams); } } - fz_catch(doc->ctx) + fz_catch(ctx) { - fz_drop_stream(chain); - fz_rethrow(doc->ctx); + fz_drop_stream(ctx, chain); + fz_rethrow(ctx); } return chain; @@ -344,31 +340,30 @@ pdf_open_filter(fz_stream *chain, pdf_document *doc, pdf_obj *stmobj, int num, i * constraining to stream length, and without decryption. */ fz_stream * -pdf_open_inline_stream(pdf_document *doc, pdf_obj *stmobj, int length, fz_stream *chain, fz_compression_params *imparams) +pdf_open_inline_stream(fz_context *ctx, pdf_document *doc, pdf_obj *stmobj, int length, fz_stream *chain, fz_compression_params *imparams) { pdf_obj *filters; pdf_obj *params; - filters = pdf_dict_getsa(stmobj, "Filter", "F"); - params = pdf_dict_getsa(stmobj, "DecodeParms", "DP"); + filters = pdf_dict_getsa(ctx, stmobj, "Filter", "F"); + params = pdf_dict_getsa(ctx, stmobj, "DecodeParms", "DP"); /* don't close chain when we close this filter */ - fz_keep_stream(chain); + fz_keep_stream(ctx, chain); - if (pdf_is_name(filters)) - return build_filter(chain, doc, filters, params, 0, 0, imparams); - if (pdf_array_len(filters) > 0) - return build_filter_chain(chain, doc, filters, params, 0, 0, imparams); + if (pdf_is_name(ctx, filters)) + return build_filter(ctx, chain, doc, filters, params, 0, 0, imparams); + if (pdf_array_len(ctx, filters) > 0) + return build_filter_chain(ctx, chain, doc, filters, params, 0, 0, imparams); if (imparams) imparams->type = FZ_IMAGE_RAW; - return fz_open_null(chain, length, fz_tell(chain)); + return fz_open_null(ctx, chain, length, fz_tell(ctx, chain)); } void -pdf_load_compressed_inline_image(pdf_document *doc, pdf_obj *dict, int length, fz_stream *stm, int indexed, fz_image *image) +pdf_load_compressed_inline_image(fz_context *ctx, pdf_document *doc, pdf_obj *dict, int length, fz_stream *stm, int indexed, fz_image *image) { - fz_context *ctx = doc->ctx; fz_compressed_buffer *bc = fz_malloc_struct(ctx, fz_compressed_buffer); fz_try(ctx) @@ -376,8 +371,8 @@ pdf_load_compressed_inline_image(pdf_document *doc, pdf_obj *dict, int length, f int dummy_l2factor = 0; bc->buffer = fz_new_buffer(ctx, 1024); - stm = pdf_open_inline_stream(doc, dict, length, stm, &bc->params); - stm = fz_open_leecher(stm, bc->buffer); + stm = pdf_open_inline_stream(ctx, doc, dict, length, stm, &bc->params); + stm = fz_open_leecher(ctx, stm, bc->buffer); stm = fz_open_image_decomp_stream(ctx, stm, &bc->params, &dummy_l2factor); image->tile = fz_decomp_image_from_stream(ctx, stm, image, indexed, 0, 0); @@ -394,39 +389,39 @@ pdf_load_compressed_inline_image(pdf_document *doc, pdf_obj *dict, int length, f * Open a stream for reading the raw (compressed but decrypted) data. */ fz_stream * -pdf_open_raw_stream(pdf_document *doc, int num, int gen) +pdf_open_raw_stream(fz_context *ctx, pdf_document *doc, int num, int gen) { - return pdf_open_raw_renumbered_stream(doc, num, gen, num, gen); + return pdf_open_raw_renumbered_stream(ctx, doc, num, gen, num, gen); } fz_stream * -pdf_open_raw_renumbered_stream(pdf_document *doc, int num, int gen, int orig_num, int orig_gen) +pdf_open_raw_renumbered_stream(fz_context *ctx, pdf_document *doc, int num, int gen, int orig_num, int orig_gen) { pdf_xref_entry *x; - if (num <= 0 || num >= pdf_xref_len(doc)) - fz_throw(doc->ctx, FZ_ERROR_GENERIC, "object id out of range (%d %d R)", num, gen); + if (num <= 0 || num >= pdf_xref_len(ctx, doc)) + fz_throw(ctx, FZ_ERROR_GENERIC, "object id out of range (%d %d R)", num, gen); - x = pdf_cache_object(doc, num, gen); + x = pdf_cache_object(ctx, doc, num, gen); if (x->stm_ofs == 0) - fz_throw(doc->ctx, FZ_ERROR_GENERIC, "object is not a stream"); + fz_throw(ctx, FZ_ERROR_GENERIC, "object is not a stream"); - return pdf_open_raw_filter(doc->file, doc, x->obj, num, orig_num, orig_gen, x->stm_ofs); + return pdf_open_raw_filter(ctx, doc->file, doc, x->obj, num, orig_num, orig_gen, x->stm_ofs); } static fz_stream * -pdf_open_image_stream(pdf_document *doc, int num, int gen, int orig_num, int orig_gen, fz_compression_params *params) +pdf_open_image_stream(fz_context *ctx, pdf_document *doc, int num, int gen, int orig_num, int orig_gen, fz_compression_params *params) { pdf_xref_entry *x; - if (num <= 0 || num >= pdf_xref_len(doc)) - fz_throw(doc->ctx, FZ_ERROR_GENERIC, "object id out of range (%d %d R)", num, gen); + if (num <= 0 || num >= pdf_xref_len(ctx, doc)) + fz_throw(ctx, FZ_ERROR_GENERIC, "object id out of range (%d %d R)", num, gen); - x = pdf_cache_object(doc, num, gen); + x = pdf_cache_object(ctx, doc, num, gen); if (x->stm_ofs == 0 && x->stm_buf == NULL) - fz_throw(doc->ctx, FZ_ERROR_GENERIC, "object is not a stream"); + fz_throw(ctx, FZ_ERROR_GENERIC, "object is not a stream"); - return pdf_open_filter(doc->file, doc, x->obj, orig_num, orig_gen, x->stm_ofs, params); + return pdf_open_filter(ctx, doc, doc->file, x->obj, orig_num, orig_gen, x->stm_ofs, params); } /* @@ -435,55 +430,55 @@ pdf_open_image_stream(pdf_document *doc, int num, int gen, int orig_num, int ori * Using doc->file while a stream is open is a Bad idea. */ fz_stream * -pdf_open_stream(pdf_document *doc, int num, int gen) +pdf_open_stream(fz_context *ctx, pdf_document *doc, int num, int gen) { - return pdf_open_image_stream(doc, num, gen, num, gen, NULL); + return pdf_open_image_stream(ctx, doc, num, gen, num, gen, NULL); } fz_stream * -pdf_open_stream_with_offset(pdf_document *doc, int num, int gen, pdf_obj *dict, int stm_ofs) +pdf_open_stream_with_offset(fz_context *ctx, pdf_document *doc, int num, int gen, pdf_obj *dict, int stm_ofs) { if (stm_ofs == 0) - fz_throw(doc->ctx, FZ_ERROR_GENERIC, "object is not a stream"); + fz_throw(ctx, FZ_ERROR_GENERIC, "object is not a stream"); - return pdf_open_filter(doc->file, doc, dict, num, gen, stm_ofs, NULL); + return pdf_open_filter(ctx, doc, doc->file, dict, num, gen, stm_ofs, NULL); } /* * Load raw (compressed but decrypted) contents of a stream into buf. */ fz_buffer * -pdf_load_raw_stream(pdf_document *doc, int num, int gen) +pdf_load_raw_stream(fz_context *ctx, pdf_document *doc, int num, int gen) { - return pdf_load_raw_renumbered_stream(doc, num, gen, num, gen); + return pdf_load_raw_renumbered_stream(ctx, doc, num, gen, num, gen); } fz_buffer * -pdf_load_raw_renumbered_stream(pdf_document *doc, int num, int gen, int orig_num, int orig_gen) +pdf_load_raw_renumbered_stream(fz_context *ctx, pdf_document *doc, int num, int gen, int orig_num, int orig_gen) { fz_stream *stm; pdf_obj *dict; int len; fz_buffer *buf; - if (num > 0 && num < pdf_xref_len(doc)) + if (num > 0 && num < pdf_xref_len(ctx, doc)) { - pdf_xref_entry *entry = pdf_get_xref_entry(doc, num); + pdf_xref_entry *entry = pdf_get_xref_entry(ctx, doc, num); if (entry->stm_buf) - return fz_keep_buffer(doc->ctx, entry->stm_buf); + return fz_keep_buffer(ctx, entry->stm_buf); } - dict = pdf_load_object(doc, num, gen); + dict = pdf_load_object(ctx, doc, num, gen); - len = pdf_to_int(pdf_dict_gets(dict, "Length")); + len = pdf_to_int(ctx, pdf_dict_gets(ctx, dict, "Length")); - pdf_drop_obj(dict); + pdf_drop_obj(ctx, dict); - stm = pdf_open_raw_renumbered_stream(doc, num, gen, orig_num, orig_gen); + stm = pdf_open_raw_renumbered_stream(ctx, doc, num, gen, orig_num, orig_gen); - buf = fz_read_all(stm, len); + buf = fz_read_all(ctx, stm, len); - fz_drop_stream(stm); + fz_drop_stream(ctx, stm); return buf; } @@ -504,9 +499,8 @@ pdf_guess_filter_length(int len, char *filter) } static fz_buffer * -pdf_load_image_stream(pdf_document *doc, int num, int gen, int orig_num, int orig_gen, fz_compression_params *params, int *truncated) +pdf_load_image_stream(fz_context *ctx, pdf_document *doc, int num, int gen, int orig_num, int orig_gen, fz_compression_params *params, int *truncated) { - fz_context *ctx = doc->ctx; fz_stream *stm = NULL; pdf_obj *dict, *obj; int i, len, n; @@ -514,36 +508,36 @@ pdf_load_image_stream(pdf_document *doc, int num, int gen, int orig_num, int ori fz_var(buf); - if (num > 0 && num < pdf_xref_len(doc)) + if (num > 0 && num < pdf_xref_len(ctx, doc)) { - pdf_xref_entry *entry = pdf_get_xref_entry(doc, num); + pdf_xref_entry *entry = pdf_get_xref_entry(ctx, doc, num); if (entry->stm_buf) - return fz_keep_buffer(doc->ctx, entry->stm_buf); + return fz_keep_buffer(ctx, entry->stm_buf); } - dict = pdf_load_object(doc, num, gen); + dict = pdf_load_object(ctx, doc, num, gen); - len = pdf_to_int(pdf_dict_gets(dict, "Length")); - obj = pdf_dict_gets(dict, "Filter"); - len = pdf_guess_filter_length(len, pdf_to_name(obj)); - n = pdf_array_len(obj); + len = pdf_to_int(ctx, pdf_dict_gets(ctx, dict, "Length")); + obj = pdf_dict_gets(ctx, dict, "Filter"); + len = pdf_guess_filter_length(len, pdf_to_name(ctx, obj)); + n = pdf_array_len(ctx, obj); for (i = 0; i < n; i++) - len = pdf_guess_filter_length(len, pdf_to_name(pdf_array_get(obj, i))); + len = pdf_guess_filter_length(len, pdf_to_name(ctx, pdf_array_get(ctx, obj, i))); - pdf_drop_obj(dict); + pdf_drop_obj(ctx, dict); - stm = pdf_open_image_stream(doc, num, gen, orig_num, orig_gen, params); + stm = pdf_open_image_stream(ctx, doc, num, gen, orig_num, orig_gen, params); fz_try(ctx) { if (truncated) - buf = fz_read_best(stm, len, truncated); + buf = fz_read_best(ctx, stm, len, truncated); else - buf = fz_read_all(stm, len); + buf = fz_read_all(ctx, stm, len); } fz_always(ctx) { - fz_drop_stream(stm); + fz_drop_stream(ctx, stm); } fz_catch(ctx) { @@ -557,26 +551,25 @@ pdf_load_image_stream(pdf_document *doc, int num, int gen, int orig_num, int ori * Load uncompressed contents of a stream into buf. */ fz_buffer * -pdf_load_stream(pdf_document *doc, int num, int gen) +pdf_load_stream(fz_context *ctx, pdf_document *doc, int num, int gen) { - return pdf_load_image_stream(doc, num, gen, num, gen, NULL, NULL); + return pdf_load_image_stream(ctx, doc, num, gen, num, gen, NULL, NULL); } fz_buffer * -pdf_load_renumbered_stream(pdf_document *doc, int num, int gen, int orig_num, int orig_gen, int *truncated) +pdf_load_renumbered_stream(fz_context *ctx, pdf_document *doc, int num, int gen, int orig_num, int orig_gen, int *truncated) { - return pdf_load_image_stream(doc, num, gen, orig_num, orig_gen, NULL, truncated); + return pdf_load_image_stream(ctx, doc, num, gen, orig_num, orig_gen, NULL, truncated); } fz_compressed_buffer * -pdf_load_compressed_stream(pdf_document *doc, int num, int gen) +pdf_load_compressed_stream(fz_context *ctx, pdf_document *doc, int num, int gen) { - fz_context *ctx = doc->ctx; fz_compressed_buffer *bc = fz_malloc_struct(ctx, fz_compressed_buffer); fz_try(ctx) { - bc->buffer = pdf_load_image_stream(doc, num, gen, num, gen, &bc->params, NULL); + bc->buffer = pdf_load_image_stream(ctx, doc, num, gen, num, gen, &bc->params, NULL); } fz_catch(ctx) { @@ -587,22 +580,21 @@ pdf_load_compressed_stream(pdf_document *doc, int num, int gen) } static fz_stream * -pdf_open_object_array(pdf_document *doc, pdf_obj *list) +pdf_open_object_array(fz_context *ctx, pdf_document *doc, pdf_obj *list) { - int i, n; - fz_context *ctx = doc->ctx; fz_stream *stm; + int i, n; - n = pdf_array_len(list); + n = pdf_array_len(ctx, list); stm = fz_open_concat(ctx, n, 1); fz_var(i); /* Workaround Mac compiler bug */ for (i = 0; i < n; i++) { - pdf_obj *obj = pdf_array_get(list, i); + pdf_obj *obj = pdf_array_get(ctx, list, i); fz_try(ctx) { - fz_concat_push(stm, pdf_open_stream(doc, pdf_to_num(obj), pdf_to_gen(obj))); + fz_concat_push(ctx, stm, pdf_open_stream(ctx, doc, pdf_to_num(ctx, obj), pdf_to_gen(ctx, obj))); } fz_catch(ctx) { @@ -616,18 +608,17 @@ pdf_open_object_array(pdf_document *doc, pdf_obj *list) } fz_stream * -pdf_open_contents_stream(pdf_document *doc, pdf_obj *obj) +pdf_open_contents_stream(fz_context *ctx, pdf_document *doc, pdf_obj *obj) { - fz_context *ctx = doc->ctx; int num, gen; - if (pdf_is_array(obj)) - return pdf_open_object_array(doc, obj); + if (pdf_is_array(ctx, obj)) + return pdf_open_object_array(ctx, doc, obj); - num = pdf_to_num(obj); - gen = pdf_to_gen(obj); - if (pdf_is_stream(doc, num, gen)) - return pdf_open_image_stream(doc, num, gen, num, gen, NULL); + num = pdf_to_num(ctx, obj); + gen = pdf_to_gen(ctx, obj); + if (pdf_is_stream(ctx, doc, num, gen)) + return pdf_open_image_stream(ctx, doc, num, gen, num, gen, NULL); fz_warn(ctx, "pdf object stream missing (%d %d R)", num, gen); return NULL; diff --git a/source/pdf/pdf-type3.c b/source/pdf/pdf-type3.c index 3bb01a1c..3da74806 100644 --- a/source/pdf/pdf-type3.c +++ b/source/pdf/pdf-type3.c @@ -1,20 +1,20 @@ #include "mupdf/pdf.h" static void -pdf_run_glyph_func(void *doc, void *rdb, fz_buffer *contents, fz_device *dev, const fz_matrix *ctm, void *gstate, int nested_depth) +pdf_run_glyph_func(fz_context *ctx, void *doc, void *rdb, fz_buffer *contents, fz_device *dev, const fz_matrix *ctm, void *gstate, int nested_depth) { - pdf_run_glyph(doc, (pdf_obj *)rdb, contents, dev, ctm, gstate, nested_depth); + pdf_run_glyph(ctx, doc, (pdf_obj *)rdb, contents, dev, ctm, gstate, nested_depth); } static void -pdf_t3_free_resources(void *doc, void *rdb_) +pdf_t3_free_resources(fz_context *ctx, void *doc, void *rdb_) { pdf_obj *rdb = (pdf_obj *)rdb_; - pdf_drop_obj(rdb); + pdf_drop_obj(ctx, rdb); } pdf_font_desc * -pdf_load_type3_font(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict) +pdf_load_type3_font(fz_context *ctx, pdf_document *doc, pdf_obj *rdb, pdf_obj *dict) { char buf[256]; char *estrings[256]; @@ -27,7 +27,6 @@ pdf_load_type3_font(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict) int i, k, n; fz_rect bbox; fz_matrix matrix; - fz_context *ctx = doc->ctx; fz_var(fontdesc); @@ -38,24 +37,24 @@ pdf_load_type3_font(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict) if (new_max == 0) new_max = 4; - doc->type3_fonts = fz_resize_array(doc->ctx, doc->type3_fonts, new_max, sizeof(*doc->type3_fonts)); + doc->type3_fonts = fz_resize_array(ctx, doc->type3_fonts, new_max, sizeof(*doc->type3_fonts)); doc->max_type3_fonts = new_max; } fz_try(ctx) { - obj = pdf_dict_gets(dict, "Name"); - if (pdf_is_name(obj)) - fz_strlcpy(buf, pdf_to_name(obj), sizeof buf); + obj = pdf_dict_gets(ctx, dict, "Name"); + if (pdf_is_name(ctx, obj)) + fz_strlcpy(buf, pdf_to_name(ctx, obj), sizeof buf); else fz_strlcpy(buf, "Unnamed-T3", sizeof buf); fontdesc = pdf_new_font_desc(ctx); - obj = pdf_dict_gets(dict, "FontMatrix"); + obj = pdf_dict_gets(ctx, dict, "FontMatrix"); pdf_to_matrix(ctx, obj, &matrix); - obj = pdf_dict_gets(dict, "FontBBox"); + obj = pdf_dict_gets(ctx, dict, "FontBBox"); fz_transform_rect(pdf_to_rect(ctx, obj, &bbox), &matrix); fontdesc->font = fz_new_type3_font(ctx, buf, &matrix); @@ -68,35 +67,35 @@ pdf_load_type3_font(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict) for (i = 0; i < 256; i++) estrings[i] = NULL; - encoding = pdf_dict_gets(dict, "Encoding"); + encoding = pdf_dict_gets(ctx, dict, "Encoding"); if (!encoding) { fz_throw(ctx, FZ_ERROR_GENERIC, "syntaxerror: Type3 font missing Encoding"); } - if (pdf_is_name(encoding)) - pdf_load_encoding(estrings, pdf_to_name(encoding)); + if (pdf_is_name(ctx, encoding)) + pdf_load_encoding(estrings, pdf_to_name(ctx, encoding)); - if (pdf_is_dict(encoding)) + if (pdf_is_dict(ctx, encoding)) { pdf_obj *base, *diff, *item; - base = pdf_dict_gets(encoding, "BaseEncoding"); - if (pdf_is_name(base)) - pdf_load_encoding(estrings, pdf_to_name(base)); + base = pdf_dict_gets(ctx, encoding, "BaseEncoding"); + if (pdf_is_name(ctx, base)) + pdf_load_encoding(estrings, pdf_to_name(ctx, base)); - diff = pdf_dict_gets(encoding, "Differences"); - if (pdf_is_array(diff)) + diff = pdf_dict_gets(ctx, encoding, "Differences"); + if (pdf_is_array(ctx, diff)) { - n = pdf_array_len(diff); + n = pdf_array_len(ctx, diff); k = 0; for (i = 0; i < n; i++) { - item = pdf_array_get(diff, i); - if (pdf_is_int(item)) - k = pdf_to_int(item); - if (pdf_is_name(item) && k >= 0 && k < nelem(estrings)) - estrings[k++] = pdf_to_name(item); + item = pdf_array_get(ctx, diff, i); + if (pdf_is_int(ctx, item)) + k = pdf_to_int(ctx, item); + if (pdf_is_name(ctx, item) && k >= 0 && k < nelem(estrings)) + estrings[k++] = pdf_to_name(ctx, item); } } } @@ -104,19 +103,19 @@ pdf_load_type3_font(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict) fontdesc->encoding = pdf_new_identity_cmap(ctx, 0, 1); fontdesc->size += pdf_cmap_size(ctx, fontdesc->encoding); - pdf_load_to_unicode(doc, fontdesc, estrings, NULL, pdf_dict_gets(dict, "ToUnicode")); + pdf_load_to_unicode(ctx, doc, fontdesc, estrings, NULL, pdf_dict_gets(ctx, dict, "ToUnicode")); /* Widths */ pdf_set_default_hmtx(ctx, fontdesc, 0); - first = pdf_to_int(pdf_dict_gets(dict, "FirstChar")); - last = pdf_to_int(pdf_dict_gets(dict, "LastChar")); + first = pdf_to_int(ctx, pdf_dict_gets(ctx, dict, "FirstChar")); + last = pdf_to_int(ctx, pdf_dict_gets(ctx, dict, "LastChar")); if (first < 0 || last > 255 || first > last) first = last = 0; - widths = pdf_dict_gets(dict, "Widths"); + widths = pdf_dict_gets(ctx, dict, "Widths"); if (!widths) { fz_throw(ctx, FZ_ERROR_GENERIC, "syntaxerror: Type3 font missing Widths"); @@ -124,7 +123,7 @@ pdf_load_type3_font(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict) for (i = first; i <= last; i++) { - float w = pdf_to_real(pdf_array_get(widths, i - first)); + float w = pdf_to_real(ctx, pdf_array_get(ctx, widths, i - first)); w = fontdesc->font->t3matrix.a * w * 1000; fontdesc->font->t3widths[i] = w * 0.001f; pdf_add_hmtx(ctx, fontdesc, i, i, w); @@ -135,11 +134,11 @@ pdf_load_type3_font(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict) /* Resources -- inherit page resources if the font doesn't have its own */ fontdesc->font->t3freeres = pdf_t3_free_resources; - fontdesc->font->t3resources = pdf_dict_gets(dict, "Resources"); + fontdesc->font->t3resources = pdf_dict_gets(ctx, dict, "Resources"); if (!fontdesc->font->t3resources) fontdesc->font->t3resources = rdb; if (fontdesc->font->t3resources) - pdf_keep_obj(fontdesc->font->t3resources); + pdf_keep_obj(ctx, fontdesc->font->t3resources); if (!fontdesc->font->t3resources) fz_warn(ctx, "no resource dictionary for type 3 font!"); @@ -148,7 +147,7 @@ pdf_load_type3_font(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict) /* CharProcs */ - charprocs = pdf_dict_gets(dict, "CharProcs"); + charprocs = pdf_dict_gets(ctx, dict, "CharProcs"); if (!charprocs) { fz_throw(ctx, FZ_ERROR_GENERIC, "syntaxerror: Type3 font missing CharProcs"); @@ -158,10 +157,10 @@ pdf_load_type3_font(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict) { if (estrings[i]) { - obj = pdf_dict_gets(charprocs, estrings[i]); - if (pdf_is_stream(doc, pdf_to_num(obj), pdf_to_gen(obj))) + obj = pdf_dict_gets(ctx, charprocs, estrings[i]); + if (pdf_is_stream(ctx, doc, pdf_to_num(ctx, obj), pdf_to_gen(ctx, obj))) { - fontdesc->font->t3procs[i] = pdf_load_stream(doc, pdf_to_num(obj), pdf_to_gen(obj)); + fontdesc->font->t3procs[i] = pdf_load_stream(ctx, doc, pdf_to_num(ctx, obj), pdf_to_gen(ctx, obj)); fontdesc->size += fontdesc->font->t3procs[i]->cap; fontdesc->size += 0; // TODO: display list size calculation } @@ -172,7 +171,7 @@ pdf_load_type3_font(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict) { if (fontdesc) pdf_drop_font(ctx, fontdesc); - fz_rethrow_message(ctx, "cannot load type3 font (%d %d R)", pdf_to_num(dict), pdf_to_gen(dict)); + fz_rethrow_message(ctx, "cannot load type3 font (%d %d R)", pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict)); } doc->type3_fonts[doc->num_type3_fonts++] = fz_keep_font(ctx, fontdesc->font); @@ -180,10 +179,9 @@ pdf_load_type3_font(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict) return fontdesc; } -void pdf_load_type3_glyphs(pdf_document *doc, pdf_font_desc *fontdesc, int nested_depth) +void pdf_load_type3_glyphs(fz_context *ctx, pdf_document *doc, pdf_font_desc *fontdesc, int nested_depth) { int i; - fz_context *ctx = doc->ctx; fz_try(ctx) { diff --git a/source/pdf/pdf-unicode.c b/source/pdf/pdf-unicode.c index d51d580b..7b04c02c 100644 --- a/source/pdf/pdf-unicode.c +++ b/source/pdf/pdf-unicode.c @@ -56,15 +56,14 @@ pdf_remap_cmap(fz_context *ctx, pdf_cmap *gid_from_cpt, pdf_cmap *ucs_from_cpt) } void -pdf_load_to_unicode(pdf_document *doc, pdf_font_desc *font, +pdf_load_to_unicode(fz_context *ctx, pdf_document *doc, pdf_font_desc *font, char **strings, char *collection, pdf_obj *cmapstm) { - fz_context *ctx = doc->ctx; unsigned int cpt; - if (pdf_is_stream(doc, pdf_to_num(cmapstm), pdf_to_gen(cmapstm))) + if (pdf_is_stream(ctx, doc, pdf_to_num(ctx, cmapstm), pdf_to_gen(ctx, cmapstm))) { - pdf_cmap *ucs_from_cpt = pdf_load_embedded_cmap(doc, cmapstm); + pdf_cmap *ucs_from_cpt = pdf_load_embedded_cmap(ctx, doc, cmapstm); font->to_unicode = pdf_remap_cmap(ctx, font->encoding, ucs_from_cpt); pdf_drop_cmap(ctx, ucs_from_cpt); font->size += pdf_cmap_size(ctx, font->to_unicode); diff --git a/source/pdf/pdf-write.c b/source/pdf/pdf-write.c index 32143c10..1016e8af 100644 --- a/source/pdf/pdf-write.c +++ b/source/pdf/pdf-write.c @@ -489,11 +489,11 @@ page_objects_dump(pdf_write_options *opts) } static void -objects_dump(pdf_document *doc, pdf_write_options *opts) +objects_dump(fz_context *ctx, pdf_document *doc, pdf_write_options *opts) { int i; - for (i=0; i < pdf_xref_len(doc); i++) + for (i=0; i < pdf_xref_len(ctx, doc); i++) { fprintf(stderr, "Object %d use=%x offset=%d\n", i, opts->use_list[i], opts->ofs_list[i]); } @@ -504,13 +504,12 @@ objects_dump(pdf_document *doc, pdf_write_options *opts) * Garbage collect objects not reachable from the trailer. */ -static pdf_obj *sweepref(pdf_document *doc, pdf_write_options *opts, pdf_obj *obj) +static pdf_obj *sweepref(fz_context *ctx, pdf_document *doc, pdf_write_options *opts, pdf_obj *obj) { - int num = pdf_to_num(obj); - int gen = pdf_to_gen(obj); - fz_context *ctx = doc->ctx; + int num = pdf_to_num(ctx, obj); + int gen = pdf_to_gen(ctx, obj); - if (num <= 0 || num >= pdf_xref_len(doc)) + if (num <= 0 || num >= pdf_xref_len(ctx, doc)) return NULL; if (opts->use_list[num]) return NULL; @@ -520,14 +519,14 @@ static pdf_obj *sweepref(pdf_document *doc, pdf_write_options *opts, pdf_obj *ob /* Bake in /Length in stream objects */ fz_try(ctx) { - if (pdf_is_stream(doc, num, gen)) + if (pdf_is_stream(ctx, doc, num, gen)) { - pdf_obj *len = pdf_dict_gets(obj, "Length"); - if (pdf_is_indirect(len)) + pdf_obj *len = pdf_dict_gets(ctx, obj, "Length"); + if (pdf_is_indirect(ctx, len)) { - opts->use_list[pdf_to_num(len)] = 0; - len = pdf_resolve_indirect(len); - pdf_dict_puts(obj, "Length", len); + opts->use_list[pdf_to_num(ctx, len)] = 0; + len = pdf_resolve_indirect(ctx, len); + pdf_dict_puts(ctx, obj, "Length", len); } } } @@ -537,28 +536,28 @@ static pdf_obj *sweepref(pdf_document *doc, pdf_write_options *opts, pdf_obj *ob /* Leave broken */ } - return pdf_resolve_indirect(obj); + return pdf_resolve_indirect(ctx, obj); } -static void sweepobj(pdf_document *doc, pdf_write_options *opts, pdf_obj *obj) +static void sweepobj(fz_context *ctx, pdf_document *doc, pdf_write_options *opts, pdf_obj *obj) { int i; - if (pdf_is_indirect(obj)) - obj = sweepref(doc, opts, obj); + if (pdf_is_indirect(ctx, obj)) + obj = sweepref(ctx, doc, opts, obj); - if (pdf_is_dict(obj)) + if (pdf_is_dict(ctx, obj)) { - int n = pdf_dict_len(obj); + int n = pdf_dict_len(ctx, obj); for (i = 0; i < n; i++) - sweepobj(doc, opts, pdf_dict_get_val(obj, i)); + sweepobj(ctx, doc, opts, pdf_dict_get_val(ctx, obj, i)); } - else if (pdf_is_array(obj)) + else if (pdf_is_array(ctx, obj)) { - int n = pdf_array_len(obj); + int n = pdf_array_len(ctx, obj); for (i = 0; i < n; i++) - sweepobj(doc, opts, pdf_array_get(obj, i)); + sweepobj(ctx, doc, opts, pdf_array_get(ctx, obj, i)); } } @@ -566,11 +565,10 @@ static void sweepobj(pdf_document *doc, pdf_write_options *opts, pdf_obj *obj) * Scan for and remove duplicate objects (slow) */ -static void removeduplicateobjs(pdf_document *doc, pdf_write_options *opts) +static void removeduplicateobjs(fz_context *ctx, pdf_document *doc, pdf_write_options *opts) { int num, other; - fz_context *ctx = doc->ctx; - int xref_len = pdf_xref_len(doc); + int xref_len = pdf_xref_len(ctx, doc); for (num = 1; num < xref_len; num++) { @@ -591,8 +589,8 @@ static void removeduplicateobjs(pdf_document *doc, pdf_write_options *opts) */ fz_try(ctx) { - streama = pdf_is_stream(doc, num, 0); - streamb = pdf_is_stream(doc, other, 0); + streama = pdf_is_stream(ctx, doc, num, 0); + streamb = pdf_is_stream(ctx, doc, other, 0); differ = streama || streamb; if (streama && streamb && opts->do_garbage >= 4) differ = 0; @@ -605,13 +603,13 @@ static void removeduplicateobjs(pdf_document *doc, pdf_write_options *opts) if (differ) continue; - a = pdf_get_xref_entry(doc, num)->obj; - b = pdf_get_xref_entry(doc, other)->obj; + a = pdf_get_xref_entry(ctx, doc, num)->obj; + b = pdf_get_xref_entry(ctx, doc, other)->obj; - a = pdf_resolve_indirect(a); - b = pdf_resolve_indirect(b); + a = pdf_resolve_indirect(ctx, a); + b = pdf_resolve_indirect(ctx, b); - if (pdf_objcmp(a, b)) + if (pdf_objcmp(ctx, a, b)) continue; if (streama && streamb) @@ -628,8 +626,8 @@ static void removeduplicateobjs(pdf_document *doc, pdf_write_options *opts) { unsigned char *dataa, *datab; int lena, lenb; - sa = pdf_load_raw_renumbered_stream(doc, num, 0, num, 0); - sb = pdf_load_raw_renumbered_stream(doc, other, 0, other, 0); + sa = pdf_load_raw_renumbered_stream(ctx, doc, num, 0, num, 0); + sb = pdf_load_raw_renumbered_stream(ctx, doc, other, 0, other, 0); lena = fz_buffer_storage(ctx, sa, &dataa); lenb = fz_buffer_storage(ctx, sb, &datab); if (lena == lenb && memcmp(dataa, datab, lena) == 0) @@ -667,10 +665,10 @@ static void removeduplicateobjs(pdf_document *doc, pdf_write_options *opts) * This code assumes that any opts->renumber_map[n] <= n for all n. */ -static void compactxref(pdf_document *doc, pdf_write_options *opts) +static void compactxref(fz_context *ctx, pdf_document *doc, pdf_write_options *opts) { int num, newnum; - int xref_len = pdf_xref_len(doc); + int xref_len = pdf_xref_len(ctx, doc); /* * Update renumber_map in-place, clustering all used @@ -709,75 +707,74 @@ static void compactxref(pdf_document *doc, pdf_write_options *opts) * removing duplicate objects and compacting the xref. */ -static void renumberobj(pdf_document *doc, pdf_write_options *opts, pdf_obj *obj) +static void renumberobj(fz_context *ctx, pdf_document *doc, pdf_write_options *opts, pdf_obj *obj) { int i; - int xref_len = pdf_xref_len(doc); + int xref_len = pdf_xref_len(ctx, doc); - if (pdf_is_dict(obj)) + if (pdf_is_dict(ctx, obj)) { - int n = pdf_dict_len(obj); + int n = pdf_dict_len(ctx, obj); for (i = 0; i < n; i++) { - pdf_obj *key = pdf_dict_get_key(obj, i); - pdf_obj *val = pdf_dict_get_val(obj, i); - if (pdf_is_indirect(val)) + pdf_obj *key = pdf_dict_get_key(ctx, obj, i); + pdf_obj *val = pdf_dict_get_val(ctx, obj, i); + if (pdf_is_indirect(ctx, val)) { - int o = pdf_to_num(val); + int o = pdf_to_num(ctx, val); if (o >= xref_len || o <= 0 || opts->renumber_map[o] == 0) - val = pdf_new_null(doc); + val = pdf_new_null(ctx, doc); else - val = pdf_new_indirect(doc, opts->renumber_map[o], 0); - pdf_dict_put(obj, key, val); - pdf_drop_obj(val); + val = pdf_new_indirect(ctx, doc, opts->renumber_map[o], 0); + pdf_dict_put(ctx, obj, key, val); + pdf_drop_obj(ctx, val); } else { - renumberobj(doc, opts, val); + renumberobj(ctx, doc, opts, val); } } } - else if (pdf_is_array(obj)) + else if (pdf_is_array(ctx, obj)) { - int n = pdf_array_len(obj); + int n = pdf_array_len(ctx, obj); for (i = 0; i < n; i++) { - pdf_obj *val = pdf_array_get(obj, i); - if (pdf_is_indirect(val)) + pdf_obj *val = pdf_array_get(ctx, obj, i); + if (pdf_is_indirect(ctx, val)) { - int o = pdf_to_num(val); + int o = pdf_to_num(ctx, val); if (o >= xref_len || o <= 0 || opts->renumber_map[o] == 0) - val = pdf_new_null(doc); + val = pdf_new_null(ctx, doc); else - val = pdf_new_indirect(doc, opts->renumber_map[o], 0); - pdf_array_put(obj, i, val); - pdf_drop_obj(val); + val = pdf_new_indirect(ctx, doc, opts->renumber_map[o], 0); + pdf_array_put(ctx, obj, i, val); + pdf_drop_obj(ctx, val); } else { - renumberobj(doc, opts, val); + renumberobj(ctx, doc, opts, val); } } } } -static void renumberobjs(pdf_document *doc, pdf_write_options *opts) +static void renumberobjs(fz_context *ctx, pdf_document *doc, pdf_write_options *opts) { pdf_xref_entry *newxref = NULL; int newlen; int num; - fz_context *ctx = doc->ctx; int *new_use_list; - int xref_len = pdf_xref_len(doc); + int xref_len = pdf_xref_len(ctx, doc); - new_use_list = fz_calloc(ctx, pdf_xref_len(doc)+3, sizeof(int)); + new_use_list = fz_calloc(ctx, pdf_xref_len(ctx, doc)+3, sizeof(int)); fz_var(newxref); fz_try(ctx) { /* Apply renumber map to indirect references in all objects in xref */ - renumberobj(doc, opts, pdf_trailer(doc)); + renumberobj(ctx, doc, opts, pdf_trailer(ctx, doc)); for (num = 0; num < xref_len; num++) { pdf_obj *obj; @@ -787,23 +784,23 @@ static void renumberobjs(pdf_document *doc, pdf_write_options *opts) if (to == 0) continue; - obj = pdf_get_xref_entry(doc, num)->obj; + obj = pdf_get_xref_entry(ctx, doc, num)->obj; - if (pdf_is_indirect(obj)) + if (pdf_is_indirect(ctx, obj)) { - obj = pdf_new_indirect(doc, to, 0); - pdf_update_object(doc, num, obj); - pdf_drop_obj(obj); + obj = pdf_new_indirect(ctx, doc, to, 0); + pdf_update_object(ctx, doc, num, obj); + pdf_drop_obj(ctx, obj); } else { - renumberobj(doc, opts, obj); + renumberobj(ctx, doc, opts, obj); } } /* Create new table for the reordered, compacted xref */ newxref = fz_malloc_array(ctx, xref_len + 3, sizeof(pdf_xref_entry)); - newxref[0] = *pdf_get_xref_entry(doc, 0); + newxref[0] = *pdf_get_xref_entry(ctx, doc, 0); /* Move used objects into the new compacted xref */ newlen = 0; @@ -814,24 +811,24 @@ static void renumberobjs(pdf_document *doc, pdf_write_options *opts) pdf_xref_entry *e; if (newlen < opts->renumber_map[num]) newlen = opts->renumber_map[num]; - e = pdf_get_xref_entry(doc, num); + e = pdf_get_xref_entry(ctx, doc, num); newxref[opts->renumber_map[num]] = *e; if (e->obj) { - pdf_set_obj_parent(e->obj, opts->renumber_map[num]); + pdf_set_obj_parent(ctx, e->obj, opts->renumber_map[num]); e->obj = NULL; } new_use_list[opts->renumber_map[num]] = opts->use_list[num]; } else { - pdf_xref_entry *e = pdf_get_xref_entry(doc, num); - pdf_drop_obj(e->obj); + pdf_xref_entry *e = pdf_get_xref_entry(ctx, doc, num); + pdf_drop_obj(ctx, e->obj); e->obj = NULL; } } - pdf_replace_xref(doc, newxref, newlen + 1); + pdf_replace_xref(ctx, doc, newxref, newlen + 1); newxref = NULL; } fz_catch(ctx) @@ -865,18 +862,17 @@ static void page_objects_list_renumber(pdf_write_options *opts) } static void -mark_all(pdf_document *doc, pdf_write_options *opts, pdf_obj *val, int flag, int page) +mark_all(fz_context *ctx, pdf_document *doc, pdf_write_options *opts, pdf_obj *val, int flag, int page) { - fz_context *ctx = doc->ctx; - if (pdf_mark_obj(val)) + if (pdf_mark_obj(ctx, val)) return; fz_try(ctx) { - if (pdf_is_indirect(val)) + if (pdf_is_indirect(ctx, val)) { - int num = pdf_to_num(val); + int num = pdf_to_num(ctx, val); if (opts->use_list[num] & USE_PAGE_MASK) /* Already used */ opts->use_list[num] |= USE_SHARED; @@ -886,28 +882,28 @@ mark_all(pdf_document *doc, pdf_write_options *opts, pdf_obj *val, int flag, int page_objects_list_insert(ctx, opts, page, num); } - if (pdf_is_dict(val)) + if (pdf_is_dict(ctx, val)) { - int i, n = pdf_dict_len(val); + int i, n = pdf_dict_len(ctx, val); for (i = 0; i < n; i++) { - mark_all(doc, opts, pdf_dict_get_val(val, i), flag, page); + mark_all(ctx, doc, opts, pdf_dict_get_val(ctx, val, i), flag, page); } } - else if (pdf_is_array(val)) + else if (pdf_is_array(ctx, val)) { - int i, n = pdf_array_len(val); + int i, n = pdf_array_len(ctx, val); for (i = 0; i < n; i++) { - mark_all(doc, opts, pdf_array_get(val, i), flag, page); + mark_all(ctx, doc, opts, pdf_array_get(ctx, val, i), flag, page); } } } fz_always(ctx) { - pdf_unmark_obj(val); + pdf_unmark_obj(ctx, val); } fz_catch(ctx) { @@ -916,66 +912,65 @@ mark_all(pdf_document *doc, pdf_write_options *opts, pdf_obj *val, int flag, int } static int -mark_pages(pdf_document *doc, pdf_write_options *opts, pdf_obj *val, int pagenum) +mark_pages(fz_context *ctx, pdf_document *doc, pdf_write_options *opts, pdf_obj *val, int pagenum) { - fz_context *ctx = doc->ctx; - if (pdf_mark_obj(val)) + if (pdf_mark_obj(ctx, val)) return pagenum; fz_try(ctx) { - if (pdf_is_dict(val)) + if (pdf_is_dict(ctx, val)) { - if (!strcmp("Page", pdf_to_name(pdf_dict_gets(val, "Type")))) + if (!strcmp("Page", pdf_to_name(ctx, pdf_dict_gets(ctx, val, "Type")))) { - int num = pdf_to_num(val); - pdf_unmark_obj(val); - mark_all(doc, opts, val, pagenum == 0 ? USE_PAGE1 : (pagenum<<USE_PAGE_SHIFT), pagenum); + int num = pdf_to_num(ctx, val); + pdf_unmark_obj(ctx, val); + mark_all(ctx, doc, opts, val, pagenum == 0 ? USE_PAGE1 : (pagenum<<USE_PAGE_SHIFT), pagenum); page_objects_list_set_page_object(ctx, opts, pagenum, num); pagenum++; opts->use_list[num] |= USE_PAGE_OBJECT; } else { - int i, n = pdf_dict_len(val); + int i, n = pdf_dict_len(ctx, val); for (i = 0; i < n; i++) { - pdf_obj *key = pdf_dict_get_key(val, i); - pdf_obj *obj = pdf_dict_get_val(val, i); + pdf_obj *key = pdf_dict_get_key(ctx, val, i); + pdf_obj *obj = pdf_dict_get_val(ctx, val, i); - if (!strcmp("Kids", pdf_to_name(key))) - pagenum = mark_pages(doc, opts, obj, pagenum); + if (!strcmp("Kids", pdf_to_name(ctx, key))) + pagenum = mark_pages(ctx, doc, opts, obj, pagenum); else - mark_all(doc, opts, obj, USE_CATALOGUE, -1); + mark_all(ctx, doc, opts, obj, USE_CATALOGUE, -1); } - if (pdf_is_indirect(val)) + if (pdf_is_indirect(ctx, val)) { - int num = pdf_to_num(val); + int num = pdf_to_num(ctx, val); opts->use_list[num] |= USE_CATALOGUE; } } } - else if (pdf_is_array(val)) + else if (pdf_is_array(ctx, val)) { - int i, n = pdf_array_len(val); + int i, n = pdf_array_len(ctx, val); for (i = 0; i < n; i++) { - pagenum = mark_pages(doc, opts, pdf_array_get(val, i), pagenum); + pagenum = mark_pages(ctx, doc, opts, pdf_array_get(ctx, val, i), pagenum); } - if (pdf_is_indirect(val)) + if (pdf_is_indirect(ctx, val)) { - int num = pdf_to_num(val); + int num = pdf_to_num(ctx, val); opts->use_list[num] |= USE_CATALOGUE; } } } fz_always(ctx) { - pdf_unmark_obj(val); + pdf_unmark_obj(ctx, val); } fz_catch(ctx) { @@ -985,51 +980,50 @@ mark_pages(pdf_document *doc, pdf_write_options *opts, pdf_obj *val, int pagenum } static void -mark_root(pdf_document *doc, pdf_write_options *opts, pdf_obj *dict) +mark_root(fz_context *ctx, pdf_document *doc, pdf_write_options *opts, pdf_obj *dict) { - fz_context *ctx = doc->ctx; - int i, n = pdf_dict_len(dict); + int i, n = pdf_dict_len(ctx, dict); - if (pdf_mark_obj(dict)) + if (pdf_mark_obj(ctx, dict)) return; fz_try(ctx) { - if (pdf_is_indirect(dict)) + if (pdf_is_indirect(ctx, dict)) { - int num = pdf_to_num(dict); + int num = pdf_to_num(ctx, dict); opts->use_list[num] |= USE_CATALOGUE; } for (i = 0; i < n; i++) { - char *key = pdf_to_name(pdf_dict_get_key(dict, i)); - pdf_obj *val = pdf_dict_get_val(dict, i); + char *key = pdf_to_name(ctx, pdf_dict_get_key(ctx, dict, i)); + pdf_obj *val = pdf_dict_get_val(ctx, dict, i); if (!strcmp("Pages", key)) - opts->page_count = mark_pages(doc, opts, val, 0); + opts->page_count = mark_pages(ctx, doc, opts, val, 0); else if (!strcmp("Names", key)) - mark_all(doc, opts, val, USE_OTHER_OBJECTS, -1); + mark_all(ctx, doc, opts, val, USE_OTHER_OBJECTS, -1); else if (!strcmp("Dests", key)) - mark_all(doc, opts, val, USE_OTHER_OBJECTS, -1); + mark_all(ctx, doc, opts, val, USE_OTHER_OBJECTS, -1); else if (!strcmp("Outlines", key)) { int section; /* Look at PageMode to decide whether to * USE_OTHER_OBJECTS or USE_PAGE1 here. */ - if (strcmp(pdf_to_name(pdf_dict_gets(dict, "PageMode")), "UseOutlines") == 0) + if (strcmp(pdf_to_name(ctx, pdf_dict_gets(ctx, dict, "PageMode")), "UseOutlines") == 0) section = USE_PAGE1; else section = USE_OTHER_OBJECTS; - mark_all(doc, opts, val, section, -1); + mark_all(ctx, doc, opts, val, section, -1); } else - mark_all(doc, opts, val, USE_CATALOGUE, -1); + mark_all(ctx, doc, opts, val, USE_CATALOGUE, -1); } } fz_always(ctx) { - pdf_unmark_obj(dict); + pdf_unmark_obj(ctx, dict); } fz_catch(ctx) { @@ -1038,30 +1032,29 @@ mark_root(pdf_document *doc, pdf_write_options *opts, pdf_obj *dict) } static void -mark_trailer(pdf_document *doc, pdf_write_options *opts, pdf_obj *dict) +mark_trailer(fz_context *ctx, pdf_document *doc, pdf_write_options *opts, pdf_obj *dict) { - fz_context *ctx = doc->ctx; - int i, n = pdf_dict_len(dict); + int i, n = pdf_dict_len(ctx, dict); - if (pdf_mark_obj(dict)) + if (pdf_mark_obj(ctx, dict)) return; fz_try(ctx) { for (i = 0; i < n; i++) { - char *key = pdf_to_name(pdf_dict_get_key(dict, i)); - pdf_obj *val = pdf_dict_get_val(dict, i); + char *key = pdf_to_name(ctx, pdf_dict_get_key(ctx, dict, i)); + pdf_obj *val = pdf_dict_get_val(ctx, dict, i); if (!strcmp("Root", key)) - mark_root(doc, opts, val); + mark_root(ctx, doc, opts, val); else - mark_all(doc, opts, val, USE_CATALOGUE, -1); + mark_all(ctx, doc, opts, val, USE_CATALOGUE, -1); } } fz_always(ctx) { - pdf_unmark_obj(dict); + pdf_unmark_obj(ctx, dict); } fz_catch(ctx) { @@ -1070,7 +1063,7 @@ mark_trailer(pdf_document *doc, pdf_write_options *opts, pdf_obj *dict) } static void -add_linearization_objs(pdf_document *doc, pdf_write_options *opts) +add_linearization_objs(fz_context *ctx, pdf_document *doc, pdf_write_options *opts) { pdf_obj *params_obj = NULL; pdf_obj *params_ref = NULL; @@ -1078,7 +1071,6 @@ add_linearization_objs(pdf_document *doc, pdf_write_options *opts) pdf_obj *hint_ref = NULL; pdf_obj *o = NULL; int params_num, hint_num; - fz_context *ctx = doc->ctx; fz_var(params_obj); fz_var(params_ref); @@ -1089,47 +1081,47 @@ add_linearization_objs(pdf_document *doc, pdf_write_options *opts) fz_try(ctx) { /* Linearization params */ - params_obj = pdf_new_dict(doc, 10); - params_ref = pdf_new_ref(doc, params_obj); - params_num = pdf_to_num(params_ref); + params_obj = pdf_new_dict(ctx, doc, 10); + params_ref = pdf_new_ref(ctx, doc, params_obj); + params_num = pdf_to_num(ctx, params_ref); opts->use_list[params_num] = USE_PARAMS; opts->renumber_map[params_num] = params_num; opts->rev_renumber_map[params_num] = params_num; opts->gen_list[params_num] = 0; opts->rev_gen_list[params_num] = 0; - pdf_dict_puts_drop(params_obj, "Linearized", pdf_new_real(doc, 1.0)); - opts->linear_l = pdf_new_int(doc, INT_MIN); - pdf_dict_puts(params_obj, "L", opts->linear_l); - opts->linear_h0 = pdf_new_int(doc, INT_MIN); - o = pdf_new_array(doc, 2); - pdf_array_push(o, opts->linear_h0); - opts->linear_h1 = pdf_new_int(doc, INT_MIN); - pdf_array_push(o, opts->linear_h1); - pdf_dict_puts_drop(params_obj, "H", o); + pdf_dict_puts_drop(ctx, params_obj, "Linearized", pdf_new_real(ctx, doc, 1.0)); + opts->linear_l = pdf_new_int(ctx, doc, INT_MIN); + pdf_dict_puts(ctx, params_obj, "L", opts->linear_l); + opts->linear_h0 = pdf_new_int(ctx, doc, INT_MIN); + o = pdf_new_array(ctx, doc, 2); + pdf_array_push(ctx, o, opts->linear_h0); + opts->linear_h1 = pdf_new_int(ctx, doc, INT_MIN); + pdf_array_push(ctx, o, opts->linear_h1); + pdf_dict_puts_drop(ctx, params_obj, "H", o); o = NULL; - opts->linear_o = pdf_new_int(doc, INT_MIN); - pdf_dict_puts(params_obj, "O", opts->linear_o); - opts->linear_e = pdf_new_int(doc, INT_MIN); - pdf_dict_puts(params_obj, "E", opts->linear_e); - opts->linear_n = pdf_new_int(doc, INT_MIN); - pdf_dict_puts(params_obj, "N", opts->linear_n); - opts->linear_t = pdf_new_int(doc, INT_MIN); - pdf_dict_puts(params_obj, "T", opts->linear_t); + opts->linear_o = pdf_new_int(ctx, doc, INT_MIN); + pdf_dict_puts(ctx, params_obj, "O", opts->linear_o); + opts->linear_e = pdf_new_int(ctx, doc, INT_MIN); + pdf_dict_puts(ctx, params_obj, "E", opts->linear_e); + opts->linear_n = pdf_new_int(ctx, doc, INT_MIN); + pdf_dict_puts(ctx, params_obj, "N", opts->linear_n); + opts->linear_t = pdf_new_int(ctx, doc, INT_MIN); + pdf_dict_puts(ctx, params_obj, "T", opts->linear_t); /* Primary hint stream */ - hint_obj = pdf_new_dict(doc, 10); - hint_ref = pdf_new_ref(doc, hint_obj); - hint_num = pdf_to_num(hint_ref); + hint_obj = pdf_new_dict(ctx, doc, 10); + hint_ref = pdf_new_ref(ctx, doc, hint_obj); + hint_num = pdf_to_num(ctx, hint_ref); opts->use_list[hint_num] = USE_HINTS; opts->renumber_map[hint_num] = hint_num; opts->rev_renumber_map[hint_num] = hint_num; opts->gen_list[hint_num] = 0; opts->rev_gen_list[hint_num] = 0; - pdf_dict_puts_drop(hint_obj, "P", pdf_new_int(doc, 0)); - opts->hints_s = pdf_new_int(doc, INT_MIN); - pdf_dict_puts(hint_obj, "S", opts->hints_s); + pdf_dict_puts_drop(ctx, hint_obj, "P", pdf_new_int(ctx, doc, 0)); + opts->hints_s = pdf_new_int(ctx, doc, INT_MIN); + pdf_dict_puts(ctx, hint_obj, "S", opts->hints_s); /* FIXME: Do we have thumbnails? Do a T entry */ /* FIXME: Do we have outlines? Do an O entry */ /* FIXME: Do we have article threads? Do an A entry */ @@ -1138,18 +1130,18 @@ add_linearization_objs(pdf_document *doc, pdf_write_options *opts) /* FIXME: Do we have document information? Do an I entry */ /* FIXME: Do we have logical structure heirarchy? Do a C entry */ /* FIXME: Do L, Page Label hint table */ - pdf_dict_puts_drop(hint_obj, "Filter", pdf_new_name(doc, "FlateDecode")); - opts->hints_length = pdf_new_int(doc, INT_MIN); - pdf_dict_puts(hint_obj, "Length", opts->hints_length); - pdf_get_xref_entry(doc, hint_num)->stm_ofs = -1; + pdf_dict_puts_drop(ctx, hint_obj, "Filter", pdf_new_name(ctx, doc, "FlateDecode")); + opts->hints_length = pdf_new_int(ctx, doc, INT_MIN); + pdf_dict_puts(ctx, hint_obj, "Length", opts->hints_length); + pdf_get_xref_entry(ctx, doc, hint_num)->stm_ofs = -1; } fz_always(ctx) { - pdf_drop_obj(params_obj); - pdf_drop_obj(params_ref); - pdf_drop_obj(hint_ref); - pdf_drop_obj(hint_obj); - pdf_drop_obj(o); + pdf_drop_obj(ctx, params_obj); + pdf_drop_obj(ctx, params_ref); + pdf_drop_obj(ctx, hint_ref); + pdf_drop_obj(ctx, hint_obj); + pdf_drop_obj(ctx, o); } fz_catch(ctx) { @@ -1164,39 +1156,39 @@ lpr_inherit_res_contents(fz_context *ctx, pdf_obj *res, pdf_obj *dict, char *tex int i, n; /* If the parent node doesn't have an entry of this type, give up. */ - o = pdf_dict_gets(dict, text); + o = pdf_dict_gets(ctx, dict, text); if (!o) return; /* If the resources dict we are building doesn't have an entry of this * type yet, then just copy it (ensuring it's not a reference) */ - r = pdf_dict_gets(res, text); + r = pdf_dict_gets(ctx, res, text); if (r == NULL) { - o = pdf_resolve_indirect(o); - if (pdf_is_dict(o)) - o = pdf_copy_dict(o); - else if (pdf_is_array(o)) - o = pdf_copy_array(o); + o = pdf_resolve_indirect(ctx, o); + if (pdf_is_dict(ctx, o)) + o = pdf_copy_dict(ctx, o); + else if (pdf_is_array(ctx, o)) + o = pdf_copy_array(ctx, o); else o = NULL; if (o) - pdf_dict_puts(res, text, o); + pdf_dict_puts(ctx, res, text, o); return; } /* Otherwise we need to merge o into r */ - if (pdf_is_dict(o)) + if (pdf_is_dict(ctx, o)) { - n = pdf_dict_len(o); + n = pdf_dict_len(ctx, o); for (i = 0; i < n; i++) { - pdf_obj *key = pdf_dict_get_key(o, i); - pdf_obj *val = pdf_dict_get_val(o, i); + pdf_obj *key = pdf_dict_get_key(ctx, o, i); + pdf_obj *val = pdf_dict_get_val(ctx, o, i); - if (pdf_dict_gets(res, pdf_to_name(key))) + if (pdf_dict_gets(ctx, res, pdf_to_name(ctx, key))) continue; - pdf_dict_puts(res, pdf_to_name(key), val); + pdf_dict_puts(ctx, res, pdf_to_name(ctx, key), val); } } } @@ -1208,12 +1200,12 @@ lpr_inherit_res(fz_context *ctx, pdf_obj *node, int depth, pdf_obj *dict) { pdf_obj *o; - node = pdf_dict_gets(node, "Parent"); + node = pdf_dict_gets(ctx, node, "Parent"); depth--; if (!node || depth < 0) break; - o = pdf_dict_gets(node, "Resources"); + o = pdf_dict_gets(ctx, node, "Resources"); if (o) { lpr_inherit_res_contents(ctx, dict, o, "ExtGState"); @@ -1233,11 +1225,11 @@ lpr_inherit(fz_context *ctx, pdf_obj *node, char *text, int depth) { do { - pdf_obj *o = pdf_dict_gets(node, text); + pdf_obj *o = pdf_dict_gets(ctx, node, text); if (o) - return pdf_resolve_indirect(o); - node = pdf_dict_gets(node, "Parent"); + return pdf_resolve_indirect(ctx, o); + node = pdf_dict_gets(ctx, node, "Parent"); depth--; } while (depth >= 0 && node); @@ -1246,103 +1238,101 @@ lpr_inherit(fz_context *ctx, pdf_obj *node, char *text, int depth) } static int -lpr(pdf_document *doc, pdf_obj *node, int depth, int page) +lpr(fz_context *ctx, pdf_document *doc, pdf_obj *node, int depth, int page) { pdf_obj *kids; pdf_obj *o = NULL; int i, n; - fz_context *ctx = doc->ctx; - if (pdf_mark_obj(node)) + if (pdf_mark_obj(ctx, node)) return page; fz_var(o); fz_try(ctx) { - if (!strcmp("Page", pdf_to_name(pdf_dict_gets(node, "Type")))) + if (!strcmp("Page", pdf_to_name(ctx, pdf_dict_gets(ctx, node, "Type")))) { pdf_obj *r; /* r is deliberately not cleaned up */ /* Copy resources down to the child */ - o = pdf_keep_obj(pdf_dict_gets(node, "Resources")); + o = pdf_keep_obj(ctx, pdf_dict_gets(ctx, node, "Resources")); if (!o) { - o = pdf_keep_obj(pdf_new_dict(doc, 2)); - pdf_dict_puts(node, "Resources", o); + o = pdf_keep_obj(ctx, pdf_new_dict(ctx, doc, 2)); + pdf_dict_puts(ctx, node, "Resources", o); } lpr_inherit_res(ctx, node, depth, o); r = lpr_inherit(ctx, node, "MediaBox", depth); if (r) - pdf_dict_puts(node, "MediaBox", r); + pdf_dict_puts(ctx, node, "MediaBox", r); r = lpr_inherit(ctx, node, "CropBox", depth); if (r) - pdf_dict_puts(node, "CropBox", r); + pdf_dict_puts(ctx, node, "CropBox", r); r = lpr_inherit(ctx, node, "BleedBox", depth); if (r) - pdf_dict_puts(node, "BleedBox", r); + pdf_dict_puts(ctx, node, "BleedBox", r); r = lpr_inherit(ctx, node, "TrimBox", depth); if (r) - pdf_dict_puts(node, "TrimBox", r); + pdf_dict_puts(ctx, node, "TrimBox", r); r = lpr_inherit(ctx, node, "ArtBox", depth); if (r) - pdf_dict_puts(node, "ArtBox", r); + pdf_dict_puts(ctx, node, "ArtBox", r); r = lpr_inherit(ctx, node, "Rotate", depth); if (r) - pdf_dict_puts(node, "Rotate", r); + pdf_dict_puts(ctx, node, "Rotate", r); page++; } else { - kids = pdf_dict_gets(node, "Kids"); - n = pdf_array_len(kids); + kids = pdf_dict_gets(ctx, node, "Kids"); + n = pdf_array_len(ctx, kids); for(i = 0; i < n; i++) { - page = lpr(doc, pdf_array_get(kids, i), depth+1, page); + page = lpr(ctx, doc, pdf_array_get(ctx, kids, i), depth+1, page); } - pdf_dict_dels(node, "Resources"); - pdf_dict_dels(node, "MediaBox"); - pdf_dict_dels(node, "CropBox"); - pdf_dict_dels(node, "BleedBox"); - pdf_dict_dels(node, "TrimBox"); - pdf_dict_dels(node, "ArtBox"); - pdf_dict_dels(node, "Rotate"); + pdf_dict_dels(ctx, node, "Resources"); + pdf_dict_dels(ctx, node, "MediaBox"); + pdf_dict_dels(ctx, node, "CropBox"); + pdf_dict_dels(ctx, node, "BleedBox"); + pdf_dict_dels(ctx, node, "TrimBox"); + pdf_dict_dels(ctx, node, "ArtBox"); + pdf_dict_dels(ctx, node, "Rotate"); } } fz_always(ctx) { - pdf_drop_obj(o); + pdf_drop_obj(ctx, o); } fz_catch(ctx) { fz_rethrow(ctx); } - pdf_unmark_obj(node); + pdf_unmark_obj(ctx, node); return page; } void -pdf_localise_page_resources(pdf_document *doc) +pdf_localise_page_resources(fz_context *ctx, pdf_document *doc) { if (doc->resources_localised) return; - lpr(doc, pdf_dict_getp(pdf_trailer(doc), "Root/Pages"), 0, 0); + lpr(ctx, doc, pdf_dict_getp(ctx, pdf_trailer(ctx, doc), "Root/Pages"), 0, 0); doc->resources_localised = 1; } static void -linearize(pdf_document *doc, pdf_write_options *opts) +linearize(fz_context *ctx, pdf_document *doc, pdf_write_options *opts) { int i; - int n = pdf_xref_len(doc) + 2; + int n = pdf_xref_len(ctx, doc) + 2; int *reorder; int *rev_renumber_map; int *rev_gen_list; - fz_context *ctx = doc->ctx; opts->page_object_lists = page_objects_list_create(ctx); @@ -1350,18 +1340,18 @@ linearize(pdf_document *doc, pdf_write_options *opts) /* FIXME: We could 'thin' the resources according to what is actually * required for each page, but this would require us to run the page * content streams. */ - pdf_localise_page_resources(doc); + pdf_localise_page_resources(ctx, doc); /* Walk the objects for each page, marking which ones are used, where */ memset(opts->use_list, 0, n * sizeof(int)); - mark_trailer(doc, opts, pdf_trailer(doc)); + mark_trailer(ctx, doc, opts, pdf_trailer(ctx, doc)); /* Add new objects required for linearization */ - add_linearization_objs(doc, opts); + add_linearization_objs(ctx, doc, opts); #ifdef DEBUG_WRITING fprintf(stderr, "Usage calculated:\n"); - for (i=0; i < pdf_xref_len(doc); i++) + for (i=0; i < pdf_xref_len(ctx, doc); i++) { fprintf(stderr, "%d: use=%d\n", i, opts->use_list[i]); } @@ -1381,7 +1371,7 @@ linearize(pdf_document *doc, pdf_write_options *opts) #ifdef DEBUG_WRITING fprintf(stderr, "Reordered:\n"); - for (i=1; i < pdf_xref_len(doc); i++) + for (i=1; i < pdf_xref_len(ctx, doc); i++) { fprintf(stderr, "%d: use=%d\n", i, opts->use_list[reorder[i]]); } @@ -1406,55 +1396,55 @@ linearize(pdf_document *doc, pdf_write_options *opts) /* Apply the renumber_map */ page_objects_list_renumber(opts); - renumberobjs(doc, opts); + renumberobjs(ctx, doc, opts); page_objects_list_sort_and_dedupe(ctx, opts->page_object_lists); } static void -update_linearization_params(pdf_document *doc, pdf_write_options *opts) +update_linearization_params(fz_context *ctx, pdf_document *doc, pdf_write_options *opts) { int offset; - pdf_set_int(opts->linear_l, opts->file_len); + pdf_set_int(ctx, opts->linear_l, opts->file_len); /* Primary hint stream offset (of object, not stream!) */ - pdf_set_int(opts->linear_h0, opts->ofs_list[pdf_xref_len(doc)-1]); + pdf_set_int(ctx, opts->linear_h0, opts->ofs_list[pdf_xref_len(ctx, doc)-1]); /* Primary hint stream length (of object, not stream!) */ offset = (opts->start == 1 ? opts->main_xref_offset : opts->ofs_list[1] + opts->hintstream_len); - pdf_set_int(opts->linear_h1, offset - opts->ofs_list[pdf_xref_len(doc)-1]); + pdf_set_int(ctx, opts->linear_h1, offset - opts->ofs_list[pdf_xref_len(ctx, doc)-1]); /* Object number of first pages page object (the first object of page 0) */ - pdf_set_int(opts->linear_o, opts->page_object_lists->page[0]->object[0]); + pdf_set_int(ctx, opts->linear_o, opts->page_object_lists->page[0]->object[0]); /* Offset of end of first page (first page is followed by primary * hint stream (object n-1) then remaining pages (object 1...). The * primary hint stream counts as part of the first pages data, I think. */ offset = (opts->start == 1 ? opts->main_xref_offset : opts->ofs_list[1] + opts->hintstream_len); - pdf_set_int(opts->linear_e, offset); + pdf_set_int(ctx, opts->linear_e, offset); /* Number of pages in document */ - pdf_set_int(opts->linear_n, opts->page_count); + pdf_set_int(ctx, opts->linear_n, opts->page_count); /* Offset of first entry in main xref table */ - pdf_set_int(opts->linear_t, opts->first_xref_entry_offset + opts->hintstream_len); + pdf_set_int(ctx, opts->linear_t, opts->first_xref_entry_offset + opts->hintstream_len); /* Offset of shared objects hint table in the primary hint stream */ - pdf_set_int(opts->hints_s, opts->hints_shared_offset); + pdf_set_int(ctx, opts->hints_s, opts->hints_shared_offset); /* Primary hint stream length */ - pdf_set_int(opts->hints_length, opts->hintstream_len); + pdf_set_int(ctx, opts->hints_length, opts->hintstream_len); } /* * Make sure we have loaded objects from object streams. */ -static void preloadobjstms(pdf_document *doc) +static void preloadobjstms(fz_context *ctx, pdf_document *doc) { pdf_obj *obj; int num; - int xref_len = pdf_xref_len(doc); + int xref_len = pdf_xref_len(ctx, doc); for (num = 0; num < xref_len; num++) { - if (pdf_get_xref_entry(doc, num)->type == 'o') + if (pdf_get_xref_entry(ctx, doc, num)->type == 'o') { - obj = pdf_load_object(doc, num, 0); - pdf_drop_obj(obj); + obj = pdf_load_object(ctx, doc, num, 0); + pdf_drop_obj(ctx, obj); } } } @@ -1505,103 +1495,101 @@ static fz_buffer *hexbuf(fz_context *ctx, unsigned char *p, int n) return buf; } -static void addhexfilter(pdf_document *doc, pdf_obj *dict) +static void addhexfilter(fz_context *ctx, pdf_document *doc, pdf_obj *dict) { pdf_obj *f, *dp, *newf, *newdp; pdf_obj *ahx, *nullobj; - ahx = pdf_new_name(doc, "ASCIIHexDecode"); - nullobj = pdf_new_null(doc); + ahx = pdf_new_name(ctx, doc, "ASCIIHexDecode"); + nullobj = pdf_new_null(ctx, doc); newf = newdp = NULL; - f = pdf_dict_gets(dict, "Filter"); - dp = pdf_dict_gets(dict, "DecodeParms"); + f = pdf_dict_gets(ctx, dict, "Filter"); + dp = pdf_dict_gets(ctx, dict, "DecodeParms"); - if (pdf_is_name(f)) + if (pdf_is_name(ctx, f)) { - newf = pdf_new_array(doc, 2); - pdf_array_push(newf, ahx); - pdf_array_push(newf, f); + newf = pdf_new_array(ctx, doc, 2); + pdf_array_push(ctx, newf, ahx); + pdf_array_push(ctx, newf, f); f = newf; - if (pdf_is_dict(dp)) + if (pdf_is_dict(ctx, dp)) { - newdp = pdf_new_array(doc, 2); - pdf_array_push(newdp, nullobj); - pdf_array_push(newdp, dp); + newdp = pdf_new_array(ctx, doc, 2); + pdf_array_push(ctx, newdp, nullobj); + pdf_array_push(ctx, newdp, dp); dp = newdp; } } - else if (pdf_is_array(f)) + else if (pdf_is_array(ctx, f)) { - pdf_array_insert(f, ahx, 0); - if (pdf_is_array(dp)) - pdf_array_insert(dp, nullobj, 0); + pdf_array_insert(ctx, f, ahx, 0); + if (pdf_is_array(ctx, dp)) + pdf_array_insert(ctx, dp, nullobj, 0); } else f = ahx; - pdf_dict_puts(dict, "Filter", f); + pdf_dict_puts(ctx, dict, "Filter", f); if (dp) - pdf_dict_puts(dict, "DecodeParms", dp); + pdf_dict_puts(ctx, dict, "DecodeParms", dp); - pdf_drop_obj(ahx); - pdf_drop_obj(nullobj); - pdf_drop_obj(newf); - pdf_drop_obj(newdp); + pdf_drop_obj(ctx, ahx); + pdf_drop_obj(ctx, nullobj); + pdf_drop_obj(ctx, newf); + pdf_drop_obj(ctx, newdp); } -static void copystream(pdf_document *doc, pdf_write_options *opts, pdf_obj *obj_orig, int num, int gen) +static void copystream(fz_context *ctx, pdf_document *doc, pdf_write_options *opts, pdf_obj *obj_orig, int num, int gen) { fz_buffer *buf, *tmp; pdf_obj *newlen; pdf_obj *obj; - fz_context *ctx = doc->ctx; int orig_num = opts->rev_renumber_map[num]; int orig_gen = opts->rev_gen_list[num]; - buf = pdf_load_raw_renumbered_stream(doc, num, gen, orig_num, orig_gen); + buf = pdf_load_raw_renumbered_stream(ctx, doc, num, gen, orig_num, orig_gen); - obj = pdf_copy_dict(obj_orig); + obj = pdf_copy_dict(ctx, obj_orig); if (opts->do_ascii && isbinarystream(buf)) { tmp = hexbuf(ctx, buf->data, buf->len); fz_drop_buffer(ctx, buf); buf = tmp; - addhexfilter(doc, obj); + addhexfilter(ctx, doc, obj); - newlen = pdf_new_int(doc, buf->len); - pdf_dict_puts(obj, "Length", newlen); - pdf_drop_obj(newlen); + newlen = pdf_new_int(ctx, doc, buf->len); + pdf_dict_puts(ctx, obj, "Length", newlen); + pdf_drop_obj(ctx, newlen); } fprintf(opts->out, "%d %d obj\n", num, gen); - pdf_fprint_obj(opts->out, obj, opts->do_expand == 0); + pdf_fprint_obj(ctx, opts->out, obj, opts->do_expand == 0); fprintf(opts->out, "stream\n"); fwrite(buf->data, 1, buf->len, opts->out); fprintf(opts->out, "endstream\nendobj\n\n"); fz_drop_buffer(ctx, buf); - pdf_drop_obj(obj); + pdf_drop_obj(ctx, obj); } -static void expandstream(pdf_document *doc, pdf_write_options *opts, pdf_obj *obj_orig, int num, int gen) +static void expandstream(fz_context *ctx, pdf_document *doc, pdf_write_options *opts, pdf_obj *obj_orig, int num, int gen) { fz_buffer *buf, *tmp; pdf_obj *newlen; pdf_obj *obj; - fz_context *ctx = doc->ctx; int orig_num = opts->rev_renumber_map[num]; int orig_gen = opts->rev_gen_list[num]; int truncated = 0; - buf = pdf_load_renumbered_stream(doc, num, gen, orig_num, orig_gen, (opts->continue_on_error ? &truncated : NULL)); + buf = pdf_load_renumbered_stream(ctx, doc, num, gen, orig_num, orig_gen, (opts->continue_on_error ? &truncated : NULL)); if (truncated && opts->errors) (*opts->errors)++; - obj = pdf_copy_dict(obj_orig); - pdf_dict_dels(obj, "Filter"); - pdf_dict_dels(obj, "DecodeParms"); + obj = pdf_copy_dict(ctx, obj_orig); + pdf_dict_dels(ctx, obj, "Filter"); + pdf_dict_dels(ctx, obj, "DecodeParms"); if (opts->do_ascii && isbinarystream(buf)) { @@ -1609,21 +1597,21 @@ static void expandstream(pdf_document *doc, pdf_write_options *opts, pdf_obj *ob fz_drop_buffer(ctx, buf); buf = tmp; - addhexfilter(doc, obj); + addhexfilter(ctx, doc, obj); } - newlen = pdf_new_int(doc, buf->len); - pdf_dict_puts(obj, "Length", newlen); - pdf_drop_obj(newlen); + newlen = pdf_new_int(ctx, doc, buf->len); + pdf_dict_puts(ctx, obj, "Length", newlen); + pdf_drop_obj(ctx, newlen); fprintf(opts->out, "%d %d obj\n", num, gen); - pdf_fprint_obj(opts->out, obj, opts->do_expand == 0); + pdf_fprint_obj(ctx, opts->out, obj, opts->do_expand == 0); fprintf(opts->out, "stream\n"); fwrite(buf->data, 1, buf->len, opts->out); fprintf(opts->out, "endstream\nendobj\n\n"); fz_drop_buffer(ctx, buf); - pdf_drop_obj(obj); + pdf_drop_obj(ctx, obj); } static int is_image_filter(char *s) @@ -1637,33 +1625,32 @@ static int is_image_filter(char *s) return 0; } -static int filter_implies_image(pdf_document *doc, pdf_obj *o) +static int filter_implies_image(fz_context *ctx, pdf_document *doc, pdf_obj *o) { if (!o) return 0; - if (pdf_is_name(o)) - return is_image_filter(pdf_to_name(o)); - if (pdf_is_array(o)) + if (pdf_is_name(ctx, o)) + return is_image_filter(pdf_to_name(ctx, o)); + if (pdf_is_array(ctx, o)) { int i, len; - len = pdf_array_len(o); + len = pdf_array_len(ctx, o); for (i = 0; i < len; i++) - if (is_image_filter(pdf_to_name(pdf_array_get(o, i)))) + if (is_image_filter(pdf_to_name(ctx, pdf_array_get(ctx, o, i)))) return 1; } return 0; } -static void writeobject(pdf_document *doc, pdf_write_options *opts, int num, int gen, int skip_xrefs) +static void writeobject(fz_context *ctx, pdf_document *doc, pdf_write_options *opts, int num, int gen, int skip_xrefs) { pdf_xref_entry *entry; pdf_obj *obj; pdf_obj *type; - fz_context *ctx = doc->ctx; fz_try(ctx) { - obj = pdf_load_object(doc, num, gen); + obj = pdf_load_object(ctx, doc, num, gen); } fz_catch(ctx) { @@ -1681,34 +1668,34 @@ static void writeobject(pdf_document *doc, pdf_write_options *opts, int num, int } /* skip ObjStm and XRef objects */ - if (pdf_is_dict(obj)) + if (pdf_is_dict(ctx, obj)) { - type = pdf_dict_gets(obj, "Type"); - if (pdf_is_name(type) && !strcmp(pdf_to_name(type), "ObjStm")) + type = pdf_dict_gets(ctx, obj, "Type"); + if (pdf_is_name(ctx, type) && !strcmp(pdf_to_name(ctx, type), "ObjStm")) { opts->use_list[num] = 0; - pdf_drop_obj(obj); + pdf_drop_obj(ctx, obj); return; } - if (skip_xrefs && pdf_is_name(type) && !strcmp(pdf_to_name(type), "XRef")) + if (skip_xrefs && pdf_is_name(ctx, type) && !strcmp(pdf_to_name(ctx, type), "XRef")) { opts->use_list[num] = 0; - pdf_drop_obj(obj); + pdf_drop_obj(ctx, obj); return; } } - entry = pdf_get_xref_entry(doc, num); - if (!pdf_is_stream(doc, num, gen)) + entry = pdf_get_xref_entry(ctx, doc, num); + if (!pdf_is_stream(ctx, doc, num, gen)) { fprintf(opts->out, "%d %d obj\n", num, gen); - pdf_fprint_obj(opts->out, obj, opts->do_expand == 0); + pdf_fprint_obj(ctx, opts->out, obj, opts->do_expand == 0); fprintf(opts->out, "endobj\n\n"); } else if (entry->stm_ofs < 0 && entry->stm_buf == NULL) { fprintf(opts->out, "%d %d obj\n", num, gen); - pdf_fprint_obj(opts->out, obj, opts->do_expand == 0); + pdf_fprint_obj(ctx, opts->out, obj, opts->do_expand == 0); fprintf(opts->out, "stream\nendstream\nendobj\n\n"); } else @@ -1718,34 +1705,34 @@ static void writeobject(pdf_document *doc, pdf_write_options *opts, int num, int { pdf_obj *o; - if ((o = pdf_dict_gets(obj, "Type"), !strcmp(pdf_to_name(o), "XObject")) && - (o = pdf_dict_gets(obj, "Subtype"), !strcmp(pdf_to_name(o), "Image"))) + if ((o = pdf_dict_gets(ctx, obj, "Type"), !strcmp(pdf_to_name(ctx, o), "XObject")) && + (o = pdf_dict_gets(ctx, obj, "Subtype"), !strcmp(pdf_to_name(ctx, o), "Image"))) dontexpand = !(opts->do_expand & fz_expand_images); - if (o = pdf_dict_gets(obj, "Type"), !strcmp(pdf_to_name(o), "Font")) + if (o = pdf_dict_gets(ctx, obj, "Type"), !strcmp(pdf_to_name(ctx, o), "Font")) dontexpand = !(opts->do_expand & fz_expand_fonts); - if (o = pdf_dict_gets(obj, "Type"), !strcmp(pdf_to_name(o), "FontDescriptor")) + if (o = pdf_dict_gets(ctx, obj, "Type"), !strcmp(pdf_to_name(ctx, o), "FontDescriptor")) dontexpand = !(opts->do_expand & fz_expand_fonts); - if (pdf_dict_gets(obj, "Length1") != NULL) + if (pdf_dict_gets(ctx, obj, "Length1") != NULL) dontexpand = !(opts->do_expand & fz_expand_fonts); - if (pdf_dict_gets(obj, "Length2") != NULL) + if (pdf_dict_gets(ctx, obj, "Length2") != NULL) dontexpand = !(opts->do_expand & fz_expand_fonts); - if (pdf_dict_gets(obj, "Length3") != NULL) + if (pdf_dict_gets(ctx, obj, "Length3") != NULL) dontexpand = !(opts->do_expand & fz_expand_fonts); - if (o = pdf_dict_gets(obj, "Subtype"), !strcmp(pdf_to_name(o), "Type1C")) + if (o = pdf_dict_gets(ctx, obj, "Subtype"), !strcmp(pdf_to_name(ctx, o), "Type1C")) dontexpand = !(opts->do_expand & fz_expand_fonts); - if (o = pdf_dict_gets(obj, "Subtype"), !strcmp(pdf_to_name(o), "CIDFontType0C")) + if (o = pdf_dict_gets(ctx, obj, "Subtype"), !strcmp(pdf_to_name(ctx, o), "CIDFontType0C")) dontexpand = !(opts->do_expand & fz_expand_fonts); - if (o = pdf_dict_gets(obj, "Filter"), filter_implies_image(doc, o)) + if (o = pdf_dict_gets(ctx, obj, "Filter"), filter_implies_image(ctx, doc, o)) dontexpand = !(opts->do_expand & fz_expand_images); - if (pdf_dict_gets(obj, "Width") != NULL && pdf_dict_gets(obj, "Height") != NULL) + if (pdf_dict_gets(ctx, obj, "Width") != NULL && pdf_dict_gets(ctx, obj, "Height") != NULL) dontexpand = !(opts->do_expand & fz_expand_images); } fz_try(ctx) { if (opts->do_expand && !dontexpand && !pdf_is_jpx_image(ctx, obj)) - expandstream(doc, opts, obj, num, gen); + expandstream(ctx, doc, opts, obj, num, gen); else - copystream(doc, opts, obj, num, gen); + copystream(ctx, doc, opts, obj, num, gen); } fz_catch(ctx) { @@ -1759,13 +1746,13 @@ static void writeobject(pdf_document *doc, pdf_write_options *opts, int num, int } else { - pdf_drop_obj(obj); + pdf_drop_obj(ctx, obj); fz_rethrow(ctx); } } } - pdf_drop_obj(obj); + pdf_drop_obj(ctx, obj); } static void writexrefsubsect(pdf_write_options *opts, int from, int to) @@ -1782,12 +1769,11 @@ static void writexrefsubsect(pdf_write_options *opts, int from, int to) } } -static void writexref(pdf_document *doc, pdf_write_options *opts, int from, int to, int first, int main_xref_offset, int startxref) +static void writexref(fz_context *ctx, pdf_document *doc, pdf_write_options *opts, int from, int to, int first, int main_xref_offset, int startxref) { pdf_obj *trailer = NULL; pdf_obj *obj; pdf_obj *nobj = NULL; - fz_context *ctx = doc->ctx; fprintf(opts->out, "xref\n"); opts->first_xref_entry_offset = ftell(opts->out); @@ -1799,11 +1785,11 @@ static void writexref(pdf_document *doc, pdf_write_options *opts, int from, int while (subfrom < to) { - while (subfrom < to && !pdf_xref_is_incremental(doc, subfrom)) + while (subfrom < to && !pdf_xref_is_incremental(ctx, doc, subfrom)) subfrom++; subto = subfrom; - while (subto < to && pdf_xref_is_incremental(doc, subto)) + while (subto < to && pdf_xref_is_incremental(ctx, doc, subto)) subto++; if (subfrom < subto) @@ -1826,46 +1812,46 @@ static void writexref(pdf_document *doc, pdf_write_options *opts, int from, int { if (opts->do_incremental) { - trailer = pdf_keep_obj(pdf_trailer(doc)); - pdf_dict_puts_drop(trailer, "Size", pdf_new_int(doc, pdf_xref_len(doc))); - pdf_dict_puts_drop(trailer, "Prev", pdf_new_int(doc, doc->startxref)); + trailer = pdf_keep_obj(ctx, pdf_trailer(ctx, doc)); + pdf_dict_puts_drop(ctx, trailer, "Size", pdf_new_int(ctx, doc, pdf_xref_len(ctx, doc))); + pdf_dict_puts_drop(ctx, trailer, "Prev", pdf_new_int(ctx, doc, doc->startxref)); doc->startxref = startxref; } else { - trailer = pdf_new_dict(doc, 5); + trailer = pdf_new_dict(ctx, doc, 5); - nobj = pdf_new_int(doc, to); - pdf_dict_puts(trailer, "Size", nobj); - pdf_drop_obj(nobj); + nobj = pdf_new_int(ctx, doc, to); + pdf_dict_puts(ctx, trailer, "Size", nobj); + pdf_drop_obj(ctx, nobj); nobj = NULL; if (first) { - obj = pdf_dict_gets(pdf_trailer(doc), "Info"); + obj = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Info"); if (obj) - pdf_dict_puts(trailer, "Info", obj); + pdf_dict_puts(ctx, trailer, "Info", obj); - obj = pdf_dict_gets(pdf_trailer(doc), "Root"); + obj = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Root"); if (obj) - pdf_dict_puts(trailer, "Root", obj); + pdf_dict_puts(ctx, trailer, "Root", obj); - obj = pdf_dict_gets(pdf_trailer(doc), "ID"); + obj = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "ID"); if (obj) - pdf_dict_puts(trailer, "ID", obj); + pdf_dict_puts(ctx, trailer, "ID", obj); } if (main_xref_offset != 0) { - nobj = pdf_new_int(doc, main_xref_offset); - pdf_dict_puts(trailer, "Prev", nobj); - pdf_drop_obj(nobj); + nobj = pdf_new_int(ctx, doc, main_xref_offset); + pdf_dict_puts(ctx, trailer, "Prev", nobj); + pdf_drop_obj(ctx, nobj); nobj = NULL; } } } fz_always(ctx) { - pdf_drop_obj(nobj); + pdf_drop_obj(ctx, nobj); } fz_catch(ctx) { @@ -1873,36 +1859,35 @@ static void writexref(pdf_document *doc, pdf_write_options *opts, int from, int } fprintf(opts->out, "trailer\n"); - pdf_fprint_obj(opts->out, trailer, opts->do_expand == 0); + pdf_fprint_obj(ctx, opts->out, trailer, opts->do_expand == 0); fprintf(opts->out, "\n"); - pdf_drop_obj(trailer); + pdf_drop_obj(ctx, trailer); fprintf(opts->out, "startxref\n%d\n%%%%EOF\n", startxref); doc->has_xref_streams = 0; } -static void writexrefstreamsubsect(pdf_document *doc, pdf_write_options *opts, pdf_obj *index, fz_buffer *fzbuf, int from, int to) +static void writexrefstreamsubsect(fz_context *ctx, pdf_document *doc, pdf_write_options *opts, pdf_obj *index, fz_buffer *fzbuf, int from, int to) { int num; - pdf_array_push_drop(index, pdf_new_int(doc, from)); - pdf_array_push_drop(index, pdf_new_int(doc, to - from)); + pdf_array_push_drop(ctx, index, pdf_new_int(ctx, doc, from)); + pdf_array_push_drop(ctx, index, pdf_new_int(ctx, doc, to - from)); for (num = from; num < to; num++) { - fz_write_buffer_byte(doc->ctx, fzbuf, opts->use_list[num] ? 1 : 0); - fz_write_buffer_byte(doc->ctx, fzbuf, opts->ofs_list[num]>>24); - fz_write_buffer_byte(doc->ctx, fzbuf, opts->ofs_list[num]>>16); - fz_write_buffer_byte(doc->ctx, fzbuf, opts->ofs_list[num]>>8); - fz_write_buffer_byte(doc->ctx, fzbuf, opts->ofs_list[num]); - fz_write_buffer_byte(doc->ctx, fzbuf, opts->gen_list[num]); + fz_write_buffer_byte(ctx, fzbuf, opts->use_list[num] ? 1 : 0); + fz_write_buffer_byte(ctx, fzbuf, opts->ofs_list[num]>>24); + fz_write_buffer_byte(ctx, fzbuf, opts->ofs_list[num]>>16); + fz_write_buffer_byte(ctx, fzbuf, opts->ofs_list[num]>>8); + fz_write_buffer_byte(ctx, fzbuf, opts->ofs_list[num]); + fz_write_buffer_byte(ctx, fzbuf, opts->gen_list[num]); } } -static void writexrefstream(pdf_document *doc, pdf_write_options *opts, int from, int to, int first, int main_xref_offset, int startxref) +static void writexrefstream(fz_context *ctx, pdf_document *doc, pdf_write_options *opts, int from, int to, int first, int main_xref_offset, int startxref) { - fz_context *ctx = doc->ctx; int num; pdf_obj *dict = NULL; pdf_obj *obj; @@ -1915,9 +1900,9 @@ static void writexrefstream(pdf_document *doc, pdf_write_options *opts, int from fz_var(fzbuf); fz_try(ctx) { - num = pdf_create_object(doc); - dict = pdf_new_dict(doc, 6); - pdf_update_object(doc, num, dict); + num = pdf_create_object(ctx, doc); + dict = pdf_new_dict(ctx, doc, 6); + pdf_update_object(ctx, doc, num, dict); opts->first_xref_entry_offset = ftell(opts->out); @@ -1925,49 +1910,49 @@ static void writexrefstream(pdf_document *doc, pdf_write_options *opts, int from if (first) { - obj = pdf_dict_gets(pdf_trailer(doc), "Info"); + obj = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Info"); if (obj) - pdf_dict_puts(dict, "Info", obj); + pdf_dict_puts(ctx, dict, "Info", obj); - obj = pdf_dict_gets(pdf_trailer(doc), "Root"); + obj = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Root"); if (obj) - pdf_dict_puts(dict, "Root", obj); + pdf_dict_puts(ctx, dict, "Root", obj); - obj = pdf_dict_gets(pdf_trailer(doc), "ID"); + obj = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "ID"); if (obj) - pdf_dict_puts(dict, "ID", obj); + pdf_dict_puts(ctx, dict, "ID", obj); if (opts->do_incremental) { - obj = pdf_dict_gets(pdf_trailer(doc), "Encrypt"); + obj = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Encrypt"); if (obj) - pdf_dict_puts(dict, "Encrypt", obj); + pdf_dict_puts(ctx, dict, "Encrypt", obj); } } - pdf_dict_puts_drop(dict, "Size", pdf_new_int(doc, to)); + pdf_dict_puts_drop(ctx, dict, "Size", pdf_new_int(ctx, doc, to)); if (opts->do_incremental) { - pdf_dict_puts_drop(dict, "Prev", pdf_new_int(doc, doc->startxref)); + pdf_dict_puts_drop(ctx, dict, "Prev", pdf_new_int(ctx, doc, doc->startxref)); doc->startxref = startxref; } else { if (main_xref_offset != 0) - pdf_dict_puts_drop(dict, "Prev", pdf_new_int(doc, main_xref_offset)); + pdf_dict_puts_drop(ctx, dict, "Prev", pdf_new_int(ctx, doc, main_xref_offset)); } - pdf_dict_puts_drop(dict, "Type", pdf_new_name(doc, "XRef")); + pdf_dict_puts_drop(ctx, dict, "Type", pdf_new_name(ctx, doc, "XRef")); - w = pdf_new_array(doc, 3); - pdf_dict_puts(dict, "W", w); - pdf_array_push_drop(w, pdf_new_int(doc, 1)); - pdf_array_push_drop(w, pdf_new_int(doc, 4)); - pdf_array_push_drop(w, pdf_new_int(doc, 1)); + w = pdf_new_array(ctx, doc, 3); + pdf_dict_puts(ctx, dict, "W", w); + pdf_array_push_drop(ctx, w, pdf_new_int(ctx, doc, 1)); + pdf_array_push_drop(ctx, w, pdf_new_int(ctx, doc, 4)); + pdf_array_push_drop(ctx, w, pdf_new_int(ctx, doc, 1)); - index = pdf_new_array(doc, 2); - pdf_dict_puts_drop(dict, "Index", index); + index = pdf_new_array(ctx, doc, 2); + pdf_dict_puts_drop(ctx, dict, "Index", index); opts->ofs_list[num] = opts->first_xref_entry_offset; @@ -1980,34 +1965,34 @@ static void writexrefstream(pdf_document *doc, pdf_write_options *opts, int from while (subfrom < to) { - while (subfrom < to && !pdf_xref_is_incremental(doc, subfrom)) + while (subfrom < to && !pdf_xref_is_incremental(ctx, doc, subfrom)) subfrom++; subto = subfrom; - while (subto < to && pdf_xref_is_incremental(doc, subto)) + while (subto < to && pdf_xref_is_incremental(ctx, doc, subto)) subto++; if (subfrom < subto) - writexrefstreamsubsect(doc, opts, index, fzbuf, subfrom, subto); + writexrefstreamsubsect(ctx, doc, opts, index, fzbuf, subfrom, subto); subfrom = subto; } } else { - writexrefstreamsubsect(doc, opts, index, fzbuf, from, to); + writexrefstreamsubsect(ctx, doc, opts, index, fzbuf, from, to); } - pdf_update_stream(doc, num, fzbuf); - pdf_dict_puts_drop(dict, "Length", pdf_new_int(doc, fz_buffer_storage(ctx, fzbuf, NULL))); + pdf_update_stream(ctx, doc, num, fzbuf); + pdf_dict_puts_drop(ctx, dict, "Length", pdf_new_int(ctx, doc, fz_buffer_storage(ctx, fzbuf, NULL))); - writeobject(doc, opts, num, 0, 0); + writeobject(ctx, doc, opts, num, 0, 0); fprintf(opts->out, "startxref\n%d\n%%%%EOF\n", startxref); } fz_always(ctx) { - pdf_drop_obj(dict); - pdf_drop_obj(w); + pdf_drop_obj(ctx, dict); + pdf_drop_obj(ctx, w); fz_drop_buffer(ctx, fzbuf); } fz_catch(ctx) @@ -2030,9 +2015,9 @@ padto(FILE *file, int target) } static void -dowriteobject(pdf_document *doc, pdf_write_options *opts, int num, int pass) +dowriteobject(fz_context *ctx, pdf_document *doc, pdf_write_options *opts, int num, int pass) { - pdf_xref_entry *entry = pdf_get_xref_entry(doc, num); + pdf_xref_entry *entry = pdf_get_xref_entry(ctx, doc, num); if (entry->type == 'f') opts->gen_list[num] = entry->gen; if (entry->type == 'n') @@ -2056,18 +2041,18 @@ dowriteobject(pdf_document *doc, pdf_write_options *opts, int num, int pass) if (pass > 0) padto(opts->out, opts->ofs_list[num]); opts->ofs_list[num] = ftell(opts->out); - if (!opts->do_incremental || pdf_xref_is_incremental(doc, num)) - writeobject(doc, opts, num, opts->gen_list[num], 1); + if (!opts->do_incremental || pdf_xref_is_incremental(ctx, doc, num)) + writeobject(ctx, doc, opts, num, opts->gen_list[num], 1); } else opts->use_list[num] = 0; } static void -writeobjects(pdf_document *doc, pdf_write_options *opts, int pass) +writeobjects(fz_context *ctx, pdf_document *doc, pdf_write_options *opts, int pass) { int num; - int xref_len = pdf_xref_len(doc); + int xref_len = pdf_xref_len(ctx, doc); if (!opts->do_incremental) { @@ -2075,7 +2060,7 @@ writeobjects(pdf_document *doc, pdf_write_options *opts, int pass) fprintf(opts->out, "%%\316\274\341\277\246\n\n"); } - dowriteobject(doc, opts, opts->start, pass); + dowriteobject(ctx, doc, opts, opts->start, pass); if (opts->do_linear) { @@ -2084,11 +2069,11 @@ writeobjects(pdf_document *doc, pdf_write_options *opts, int pass) opts->first_xref_offset = ftell(opts->out); else padto(opts->out, opts->first_xref_offset); - writexref(doc, opts, opts->start, pdf_xref_len(doc), 1, opts->main_xref_offset, 0); + writexref(ctx, doc, opts, opts->start, pdf_xref_len(ctx, doc), 1, opts->main_xref_offset, 0); } for (num = opts->start+1; num < xref_len; num++) - dowriteobject(doc, opts, num, pass); + dowriteobject(ctx, doc, opts, num, pass); if (opts->do_linear && pass == 1) { int offset = (opts->start == 1 ? opts->main_xref_offset : opts->ofs_list[1] + opts->hintstream_len); @@ -2098,7 +2083,7 @@ writeobjects(pdf_document *doc, pdf_write_options *opts, int pass) { if (pass == 1) opts->ofs_list[num] += opts->hintstream_len; - dowriteobject(doc, opts, num, pass); + dowriteobject(ctx, doc, opts, num, pass); } } @@ -2120,9 +2105,8 @@ my_log2(int x) } static void -make_page_offset_hints(pdf_document *doc, pdf_write_options *opts, fz_buffer *buf) +make_page_offset_hints(fz_context *ctx, pdf_document *doc, pdf_write_options *opts, fz_buffer *buf) { - fz_context *ctx = doc->ctx; int i, j; int min_objs_per_page, max_objs_per_page; int min_page_length, max_page_length; @@ -2133,9 +2117,9 @@ make_page_offset_hints(pdf_document *doc, pdf_write_options *opts, fz_buffer *bu page_objects **pop = &opts->page_object_lists->page[0]; int page_len_bits, shared_object_bits, shared_object_id_bits; int shared_length_bits; - int xref_len = pdf_xref_len(doc); + int xref_len = pdf_xref_len(ctx, doc); - min_shared_object = pdf_xref_len(doc); + min_shared_object = pdf_xref_len(ctx, doc); max_shared_object = 1; min_shared_length = opts->file_len; max_shared_length = 0; @@ -2391,15 +2375,14 @@ make_page_offset_hints(pdf_document *doc, pdf_write_options *opts, fz_buffer *bu } static void -make_hint_stream(pdf_document *doc, pdf_write_options *opts) +make_hint_stream(fz_context *ctx, pdf_document *doc, pdf_write_options *opts) { - fz_context *ctx = doc->ctx; fz_buffer *buf = fz_new_buffer(ctx, 100); fz_try(ctx) { - make_page_offset_hints(doc, opts, buf); - pdf_update_stream(doc, pdf_xref_len(doc)-1, buf); + make_page_offset_hints(ctx, doc, opts, buf); + pdf_update_stream(ctx, doc, pdf_xref_len(ctx, doc)-1, buf); opts->hintstream_len = buf->len; fz_drop_buffer(ctx, buf); } @@ -2411,18 +2394,18 @@ make_hint_stream(pdf_document *doc, pdf_write_options *opts) } #ifdef DEBUG_WRITING -static void dump_object_details(pdf_document *doc, pdf_write_options *opts) +static void dump_object_details(fz_context *ctx, pdf_document *doc, pdf_write_options *opts) { int i; - for (i = 0; i < pdf_xref_len(doc); i++) + for (i = 0; i < pdf_xref_len(ctx, doc); i++) { fprintf(stderr, "%d@%d: use=%d\n", i, opts->ofs_list[i], opts->use_list[i]); } } #endif -static void presize_unsaved_signature_byteranges(pdf_document *doc) +static void presize_unsaved_signature_byteranges(fz_context *ctx, pdf_document *doc) { if (doc->unsaved_sigs) { @@ -2441,20 +2424,19 @@ static void presize_unsaved_signature_byteranges(pdf_document *doc) * the end and between each consecutive pair of signatures, * hence n + 1 */ int i; - pdf_obj *byte_range = pdf_dict_getp(usig->field, "V/ByteRange"); + pdf_obj *byte_range = pdf_dict_getp(ctx, usig->field, "V/ByteRange"); for (i = 0; i < n+1; i++) { - pdf_array_push_drop(byte_range, pdf_new_int(doc, INT_MAX)); - pdf_array_push_drop(byte_range, pdf_new_int(doc, INT_MAX)); + pdf_array_push_drop(ctx, byte_range, pdf_new_int(ctx, doc, INT_MAX)); + pdf_array_push_drop(ctx, byte_range, pdf_new_int(ctx, doc, INT_MAX)); } } } } -static void complete_signatures(pdf_document *doc, pdf_write_options *opts, char *filename) +static void complete_signatures(fz_context *ctx, pdf_document *doc, pdf_write_options *opts, char *filename) { - fz_context *ctx = doc->ctx; pdf_unsaved_sig *usig; FILE *f; char buf[5120]; @@ -2477,7 +2459,7 @@ static void complete_signatures(pdf_document *doc, pdf_write_options *opts, char for (usig = doc->unsaved_sigs; usig; usig = usig->next) { char *bstr, *cstr, *fstr; - int pnum = pdf_obj_parent_num(pdf_dict_getp(usig->field, "V/ByteRange")); + int pnum = pdf_obj_parent_num(ctx, pdf_dict_getp(ctx, usig->field, "V/ByteRange")); fseek(f, opts->ofs_list[pnum], SEEK_SET); (void)fread(buf, 1, sizeof(buf), f); buf[sizeof(buf)-1] = 0; @@ -2497,25 +2479,25 @@ static void complete_signatures(pdf_document *doc, pdf_write_options *opts, char /* Recreate ByteRange with correct values. Initially store the * recreated object in the first of the unsaved signatures */ - byte_range = pdf_new_array(doc, 4); - pdf_dict_putp_drop(doc->unsaved_sigs->field, "V/ByteRange", byte_range); + byte_range = pdf_new_array(ctx, doc, 4); + pdf_dict_putp_drop(ctx, doc->unsaved_sigs->field, "V/ByteRange", byte_range); last_end = 0; for (usig = doc->unsaved_sigs; usig; usig = usig->next) { - pdf_array_push_drop(byte_range, pdf_new_int(doc, last_end)); - pdf_array_push_drop(byte_range, pdf_new_int(doc, usig->contents_start - last_end)); + pdf_array_push_drop(ctx, byte_range, pdf_new_int(ctx, doc, last_end)); + pdf_array_push_drop(ctx, byte_range, pdf_new_int(ctx, doc, usig->contents_start - last_end)); last_end = usig->contents_end; } - pdf_array_push_drop(byte_range, pdf_new_int(doc, last_end)); - pdf_array_push_drop(byte_range, pdf_new_int(doc, flen - last_end)); + pdf_array_push_drop(ctx, byte_range, pdf_new_int(ctx, doc, last_end)); + pdf_array_push_drop(ctx, byte_range, pdf_new_int(ctx, doc, flen - last_end)); /* Copy the new ByteRange to the other unsaved signatures */ for (usig = doc->unsaved_sigs->next; usig; usig = usig->next) - pdf_dict_putp_drop(usig->field, "V/ByteRange", pdf_copy_array(byte_range)); + pdf_dict_putp_drop(ctx, usig->field, "V/ByteRange", pdf_copy_array(ctx, byte_range)); /* Write the byte range into buf, padding with spaces*/ - i = pdf_sprint_obj(buf, sizeof(buf), byte_range, 1); + i = pdf_sprint_obj(ctx, buf, sizeof(buf), byte_range, 1); memset(buf+i, ' ', sizeof(buf)-i); /* Write the byte range to the file */ @@ -2529,60 +2511,59 @@ static void complete_signatures(pdf_document *doc, pdf_write_options *opts, char /* Write the digests into the file */ for (usig = doc->unsaved_sigs; usig; usig = usig->next) - pdf_write_digest(doc, filename, byte_range, usig->contents_start, usig->contents_end - usig->contents_start, usig->signer); + pdf_write_digest(ctx, doc, filename, byte_range, usig->contents_start, usig->contents_end - usig->contents_start, usig->signer); /* delete the unsaved_sigs records */ while ((usig = doc->unsaved_sigs) != NULL) { doc->unsaved_sigs = usig->next; - pdf_drop_obj(usig->field); - pdf_drop_signer(usig->signer); + pdf_drop_obj(ctx, usig->field); + pdf_drop_signer(ctx, usig->signer); fz_free(ctx, usig); } } } -static void sanitise(pdf_document *doc) +static void sanitise(fz_context *ctx, pdf_document *doc) { - int n = pdf_count_pages(doc); + int n = pdf_count_pages(ctx, doc); int i; for (i = 0; i < n; i++) { - pdf_page *page = pdf_load_page(doc, i); + pdf_page *page = pdf_load_page(ctx, doc, i); - pdf_clean_page_contents(doc, page, NULL); + pdf_clean_page_contents(ctx, doc, page, NULL); - pdf_drop_page(doc, page); + fz_drop_page(ctx, &page->super); } } -void pdf_write_document(pdf_document *doc, char *filename, fz_write_options *fz_opts) +void pdf_write_document(fz_context *ctx, pdf_document *doc, char *filename, fz_write_options *fz_opts) { + fz_write_options opts_defaults = { 0 }; + pdf_write_options opts = { 0 }; + int lastfree; int num; - pdf_write_options opts = { 0 }; - fz_context *ctx; int xref_len; - fz_write_options fz_opts_defaults = { 0 }; if (!doc) return; if (!fz_opts) - fz_opts = &fz_opts_defaults; + fz_opts = &opts_defaults; doc->freeze_updates = 1; - ctx = doc->ctx; /* Sanitise the operator streams */ if (fz_opts->do_clean) - sanitise(doc); + sanitise(ctx, doc); - pdf_finish_edit(doc); - presize_unsaved_signature_byteranges(doc); + pdf_finish_edit(ctx, doc); + presize_unsaved_signature_byteranges(ctx, doc); - xref_len = pdf_xref_len(doc); + xref_len = pdf_xref_len(ctx, doc); if (fz_opts->do_incremental) { @@ -2614,12 +2595,12 @@ void pdf_write_document(pdf_document *doc, char *filename, fz_write_options *fz_ /* We deliberately make these arrays long enough to cope with * 1 to n access rather than 0..n-1, and add space for 2 new * extra entries that may be required for linearization. */ - opts.use_list = fz_malloc_array(ctx, pdf_xref_len(doc) + 3, sizeof(int)); - opts.ofs_list = fz_malloc_array(ctx, pdf_xref_len(doc) + 3, sizeof(int)); - opts.gen_list = fz_calloc(ctx, pdf_xref_len(doc) + 3, sizeof(int)); - opts.renumber_map = fz_malloc_array(ctx, pdf_xref_len(doc) + 3, sizeof(int)); - opts.rev_renumber_map = fz_malloc_array(ctx, pdf_xref_len(doc) + 3, sizeof(int)); - opts.rev_gen_list = fz_malloc_array(ctx, pdf_xref_len(doc) + 3, sizeof(int)); + opts.use_list = fz_malloc_array(ctx, pdf_xref_len(ctx, doc) + 3, sizeof(int)); + opts.ofs_list = fz_malloc_array(ctx, pdf_xref_len(ctx, doc) + 3, sizeof(int)); + opts.gen_list = fz_calloc(ctx, pdf_xref_len(ctx, doc) + 3, sizeof(int)); + opts.renumber_map = fz_malloc_array(ctx, pdf_xref_len(ctx, doc) + 3, sizeof(int)); + opts.rev_renumber_map = fz_malloc_array(ctx, pdf_xref_len(ctx, doc) + 3, sizeof(int)); + opts.rev_gen_list = fz_malloc_array(ctx, pdf_xref_len(ctx, doc) + 3, sizeof(int)); opts.continue_on_error = fz_opts->continue_on_error; opts.errors = fz_opts->errors; @@ -2629,7 +2610,7 @@ void pdf_write_document(pdf_document *doc, char *filename, fz_write_options *fz_ opts.ofs_list[num] = 0; opts.renumber_map[num] = num; opts.rev_renumber_map[num] = num; - opts.rev_gen_list[num] = pdf_get_xref_entry(doc, num)->gen; + opts.rev_gen_list[num] = pdf_get_xref_entry(ctx, doc, num)->gen; } if (opts.do_incremental && opts.do_garbage) @@ -2640,28 +2621,28 @@ void pdf_write_document(pdf_document *doc, char *filename, fz_write_options *fz_ /* Make sure any objects hidden in compressed streams have been loaded */ if (!opts.do_incremental) { - pdf_ensure_solid_xref(doc, xref_len); - preloadobjstms(doc); + pdf_ensure_solid_xref(ctx, doc, xref_len); + preloadobjstms(ctx, doc); } /* Sweep & mark objects from the trailer */ if (opts.do_garbage >= 1) - sweepobj(doc, &opts, pdf_trailer(doc)); + sweepobj(ctx, doc, &opts, pdf_trailer(ctx, doc)); else for (num = 0; num < xref_len; num++) opts.use_list[num] = 1; /* Coalesce and renumber duplicate objects */ if (opts.do_garbage >= 3) - removeduplicateobjs(doc, &opts); + removeduplicateobjs(ctx, doc, &opts); /* Compact xref by renumbering and removing unused objects */ if (opts.do_garbage >= 2 || opts.do_linear) - compactxref(doc, &opts); + compactxref(ctx, doc, &opts); /* Make renumbering affect all indirect references and update xref */ if (opts.do_garbage >= 2 || opts.do_linear) - renumberobjs(doc, &opts); + renumberobjs(ctx, doc, &opts); /* Truncate the xref after compacting and renumbering */ if (opts.do_garbage >= 2 && !opts.do_incremental) @@ -2670,20 +2651,20 @@ void pdf_write_document(pdf_document *doc, char *filename, fz_write_options *fz_ if (opts.do_linear) { - linearize(doc, &opts); + linearize(ctx, doc, &opts); } - writeobjects(doc, &opts, 0); + writeobjects(ctx, doc, &opts, 0); #ifdef DEBUG_WRITING - dump_object_details(doc, &opts); + dump_object_details(ctx, doc, &opts); #endif if (opts.do_incremental) { for (num = 0; num < xref_len; num++) { - if (!opts.use_list[num] && pdf_xref_is_incremental(doc, num)) + if (!opts.use_list[num] && pdf_xref_is_incremental(ctx, doc, num)) { /* Make unreusable. FIXME: would be better to link to existing free list */ opts.gen_list[num] = 65535; @@ -2709,31 +2690,31 @@ void pdf_write_document(pdf_document *doc, char *filename, fz_write_options *fz_ if (opts.do_linear) { opts.main_xref_offset = ftell(opts.out); - writexref(doc, &opts, 0, opts.start, 0, 0, opts.first_xref_offset); + writexref(ctx, doc, &opts, 0, opts.start, 0, 0, opts.first_xref_offset); opts.file_len = ftell(opts.out); - make_hint_stream(doc, &opts); + make_hint_stream(ctx, doc, &opts); opts.file_len += opts.hintstream_len; opts.main_xref_offset += opts.hintstream_len; - update_linearization_params(doc, &opts); + update_linearization_params(ctx, doc, &opts); fseek(opts.out, 0, 0); - writeobjects(doc, &opts, 1); + writeobjects(ctx, doc, &opts, 1); padto(opts.out, opts.main_xref_offset); - writexref(doc, &opts, 0, opts.start, 0, 0, opts.first_xref_offset); + writexref(ctx, doc, &opts, 0, opts.start, 0, 0, opts.first_xref_offset); } else { opts.first_xref_offset = ftell(opts.out); if (opts.do_incremental && doc->has_xref_streams) - writexrefstream(doc, &opts, 0, xref_len, 1, 0, opts.first_xref_offset); + writexrefstream(ctx, doc, &opts, 0, xref_len, 1, 0, opts.first_xref_offset); else - writexref(doc, &opts, 0, xref_len, 1, 0, opts.first_xref_offset); + writexref(ctx, doc, &opts, 0, xref_len, 1, 0, opts.first_xref_offset); } fclose(opts.out); opts.out = NULL; - complete_signatures(doc, &opts, filename); + complete_signatures(ctx, doc, &opts, filename); doc->dirty = 0; } @@ -2741,7 +2722,7 @@ void pdf_write_document(pdf_document *doc, char *filename, fz_write_options *fz_ { #ifdef DEBUG_LINEARIZATION page_objects_dump(&opts); - objects_dump(doc, &opts); + objects_dump(ctx, doc, &opts); #endif fz_free(ctx, opts.use_list); fz_free(ctx, opts.ofs_list); @@ -2749,15 +2730,15 @@ void pdf_write_document(pdf_document *doc, char *filename, fz_write_options *fz_ fz_free(ctx, opts.renumber_map); fz_free(ctx, opts.rev_renumber_map); fz_free(ctx, opts.rev_gen_list); - pdf_drop_obj(opts.linear_l); - pdf_drop_obj(opts.linear_h0); - pdf_drop_obj(opts.linear_h1); - pdf_drop_obj(opts.linear_o); - pdf_drop_obj(opts.linear_e); - pdf_drop_obj(opts.linear_n); - pdf_drop_obj(opts.linear_t); - pdf_drop_obj(opts.hints_s); - pdf_drop_obj(opts.hints_length); + pdf_drop_obj(ctx, opts.linear_l); + pdf_drop_obj(ctx, opts.linear_h0); + pdf_drop_obj(ctx, opts.linear_h1); + pdf_drop_obj(ctx, opts.linear_o); + pdf_drop_obj(ctx, opts.linear_e); + pdf_drop_obj(ctx, opts.linear_n); + pdf_drop_obj(ctx, opts.linear_t); + pdf_drop_obj(ctx, opts.hints_s); + pdf_drop_obj(ctx, opts.hints_length); page_objects_list_destroy(ctx, opts.page_object_lists); if (opts.out) fclose(opts.out); @@ -2773,12 +2754,11 @@ void pdf_write_document(pdf_document *doc, char *filename, fz_write_options *fz_ #if 0 -// TODO: pdf_rebalance_page_tree(doc); +// TODO: pdf_rebalance_page_tree(ctx, doc); static pdf_obj * -make_page_tree_node(pdf_document *doc, int l, int r, pdf_obj *parent_ref, int root) +make_page_tree_node(fz_context *ctx, pdf_document *doc, int l, int r, pdf_obj *parent_ref, int root) { - fz_context *ctx = doc->ctx; int count_per_kid, spaces; pdf_obj *a = NULL; pdf_obj *me = NULL; @@ -2796,52 +2776,52 @@ make_page_tree_node(pdf_document *doc, int l, int r, pdf_obj *parent_ref, int ro fz_try(ctx) { - me = pdf_new_dict(doc, 2); - pdf_dict_puts_drop(me, "Type", pdf_new_name(doc, "Pages")); - pdf_dict_puts_drop(me, "Count", pdf_new_int(doc, r-l)); + me = pdf_new_dict(ctx, doc, 2); + pdf_dict_puts_drop(ctx, me, "Type", pdf_new_name(ctx, doc, "Pages")); + pdf_dict_puts_drop(ctx, me, "Count", pdf_new_int(ctx, doc, r-l)); if (!root) - pdf_dict_puts(me, "Parent", parent_ref); - a = pdf_new_array(doc, KIDS_PER_LEVEL); - me_ref = pdf_new_ref(doc, me); + pdf_dict_puts(ctx, me, "Parent", parent_ref); + a = pdf_new_array(ctx, doc, KIDS_PER_LEVEL); + me_ref = pdf_new_ref(ctx, doc, me); for (spaces = KIDS_PER_LEVEL; l < r; spaces--) { if (spaces >= r-l) { - o = pdf_keep_obj(doc->page_refs[l++]); - pdf_dict_puts(o, "Parent", me_ref); + o = pdf_keep_obj(ctx, doc->page_refs[l++]); + pdf_dict_puts(ctx, o, "Parent", me_ref); } else { int j = l+count_per_kid; if (j > r) j = r; - o = make_page_tree_node(doc, l, j, me_ref, 0); + o = make_page_tree_node(ctx, doc, l, j, me_ref, 0); l = j; } - pdf_array_push(a, o); - pdf_drop_obj(o); + pdf_array_push(ctx, a, o); + pdf_drop_obj(ctx, o); o = NULL; } - pdf_dict_puts_drop(me, "Kids", a); + pdf_dict_puts_drop(ctx, me, "Kids", a); a = NULL; } fz_always(ctx) { - pdf_drop_obj(me); + pdf_drop_obj(ctx, me); } fz_catch(ctx) { - pdf_drop_obj(a); - pdf_drop_obj(o); - pdf_drop_obj(me); + pdf_drop_obj(ctx, a); + pdf_drop_obj(ctx, o); + pdf_drop_obj(ctx, me); fz_rethrow_message(ctx, "Failed to synthesize new page tree"); } return me_ref; } static void -pdf_rebalance_page_tree(pdf_document *doc) +pdf_rebalance_page_tree(fz_context *ctx, pdf_document *doc) { pdf_obj *catalog; pdf_obj *pages; @@ -2849,9 +2829,9 @@ pdf_rebalance_page_tree(pdf_document *doc) if (!doc || !doc->needs_page_tree_rebuild) return; - catalog = pdf_dict_gets(pdf_trailer(doc), "Root"); - pages = make_page_tree_node(doc, 0, doc->page_len, catalog, 1); - pdf_dict_puts_drop(catalog, "Pages", pages); + catalog = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Root"); + pages = make_page_tree_node(ctx, doc, 0, doc->page_len, catalog, 1); + pdf_dict_puts_drop(ctx, catalog, "Pages", pages); doc->needs_page_tree_rebuild = 0; } @@ -2859,13 +2839,13 @@ pdf_rebalance_page_tree(pdf_document *doc) #endif static void -pdf_rebalance_page_tree(pdf_document *doc) +pdf_rebalance_page_tree(fz_context *ctx, pdf_document *doc) { } -void pdf_finish_edit(pdf_document *doc) +void pdf_finish_edit(fz_context *ctx, pdf_document *doc) { if (!doc) return; - pdf_rebalance_page_tree(doc); + pdf_rebalance_page_tree(ctx, doc); } diff --git a/source/pdf/pdf-xobject.c b/source/pdf/pdf-xobject.c index c350eb0a..e169a27a 100644 --- a/source/pdf/pdf-xobject.c +++ b/source/pdf/pdf-xobject.c @@ -19,9 +19,9 @@ pdf_drop_xobject_imp(fz_context *ctx, fz_storable *xobj_) if (xobj->colorspace) fz_drop_colorspace(ctx, xobj->colorspace); - pdf_drop_obj(xobj->resources); - pdf_drop_obj(xobj->contents); - pdf_drop_obj(xobj->me); + pdf_drop_obj(ctx, xobj->resources); + pdf_drop_obj(ctx, xobj->contents); + pdf_drop_obj(ctx, xobj->me); fz_free(ctx, xobj); } @@ -34,11 +34,10 @@ pdf_xobject_size(pdf_xobject *xobj) } pdf_xobject * -pdf_load_xobject(pdf_document *doc, pdf_obj *dict) +pdf_load_xobject(fz_context *ctx, pdf_document *doc, pdf_obj *dict) { pdf_xobject *form; pdf_obj *obj; - fz_context *ctx = doc->ctx; if ((form = pdf_find_item(ctx, pdf_drop_xobject_imp, dict)) != NULL) { @@ -58,10 +57,10 @@ pdf_load_xobject(pdf_document *doc, pdf_obj *dict) fz_try(ctx) { - obj = pdf_dict_gets(dict, "BBox"); + obj = pdf_dict_gets(ctx, dict, "BBox"); pdf_to_rect(ctx, obj, &form->bbox); - obj = pdf_dict_gets(dict, "Matrix"); + obj = pdf_dict_gets(ctx, dict, "Matrix"); if (obj) pdf_to_matrix(ctx, obj, &form->matrix); else @@ -71,24 +70,24 @@ pdf_load_xobject(pdf_document *doc, pdf_obj *dict) form->knockout = 0; form->transparency = 0; - obj = pdf_dict_gets(dict, "Group"); + obj = pdf_dict_gets(ctx, dict, "Group"); if (obj) { pdf_obj *attrs = obj; - form->isolated = pdf_to_bool(pdf_dict_gets(attrs, "I")); - form->knockout = pdf_to_bool(pdf_dict_gets(attrs, "K")); + form->isolated = pdf_to_bool(ctx, pdf_dict_gets(ctx, attrs, "I")); + form->knockout = pdf_to_bool(ctx, pdf_dict_gets(ctx, attrs, "K")); - obj = pdf_dict_gets(attrs, "S"); - if (pdf_is_name(obj) && !strcmp(pdf_to_name(obj), "Transparency")) + obj = pdf_dict_gets(ctx, attrs, "S"); + if (pdf_is_name(ctx, obj) && !strcmp(pdf_to_name(ctx, obj), "Transparency")) form->transparency = 1; - obj = pdf_dict_gets(attrs, "CS"); + obj = pdf_dict_gets(ctx, attrs, "CS"); if (obj) { fz_try(ctx) { - form->colorspace = pdf_load_colorspace(doc, obj); + form->colorspace = pdf_load_colorspace(ctx, doc, obj); } fz_catch(ctx) { @@ -97,25 +96,25 @@ pdf_load_xobject(pdf_document *doc, pdf_obj *dict) } } - form->resources = pdf_dict_gets(dict, "Resources"); + form->resources = pdf_dict_gets(ctx, dict, "Resources"); if (form->resources) - pdf_keep_obj(form->resources); + pdf_keep_obj(ctx, form->resources); - form->contents = pdf_keep_obj(dict); + form->contents = pdf_keep_obj(ctx, dict); } fz_catch(ctx) { pdf_remove_item(ctx, pdf_drop_xobject_imp, dict); pdf_drop_xobject(ctx, form); - fz_rethrow_message(ctx, "cannot load xobject content stream (%d %d R)", pdf_to_num(dict), pdf_to_gen(dict)); + fz_rethrow_message(ctx, "cannot load xobject content stream (%d %d R)", pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict)); } - form->me = pdf_keep_obj(dict); + form->me = pdf_keep_obj(ctx, dict); return form; } pdf_obj * -pdf_new_xobject(pdf_document *doc, const fz_rect *bbox, const fz_matrix *mat) +pdf_new_xobject(fz_context *ctx, pdf_document *doc, const fz_rect *bbox, const fz_matrix *mat) { int idict_num; pdf_obj *idict = NULL; @@ -124,7 +123,6 @@ pdf_new_xobject(pdf_document *doc, const fz_rect *bbox, const fz_matrix *mat) pdf_obj *obj = NULL; pdf_obj *res = NULL; pdf_obj *procset = NULL; - fz_context *ctx = doc->ctx; fz_var(idict); fz_var(dict); @@ -134,51 +132,51 @@ pdf_new_xobject(pdf_document *doc, const fz_rect *bbox, const fz_matrix *mat) fz_var(procset); fz_try(ctx) { - dict = pdf_new_dict(doc, 0); + dict = pdf_new_dict(ctx, doc, 0); - obj = pdf_new_rect(doc, bbox); - pdf_dict_puts(dict, "BBox", obj); - pdf_drop_obj(obj); + obj = pdf_new_rect(ctx, doc, bbox); + pdf_dict_puts(ctx, dict, "BBox", obj); + pdf_drop_obj(ctx, obj); obj = NULL; - obj = pdf_new_int(doc, 1); - pdf_dict_puts(dict, "FormType", obj); - pdf_drop_obj(obj); + obj = pdf_new_int(ctx, doc, 1); + pdf_dict_puts(ctx, dict, "FormType", obj); + pdf_drop_obj(ctx, obj); obj = NULL; - obj = pdf_new_int(doc, 0); - pdf_dict_puts(dict, "Length", obj); - pdf_drop_obj(obj); + obj = pdf_new_int(ctx, doc, 0); + pdf_dict_puts(ctx, dict, "Length", obj); + pdf_drop_obj(ctx, obj); obj = NULL; - obj = pdf_new_matrix(doc, mat); - pdf_dict_puts(dict, "Matrix", obj); - pdf_drop_obj(obj); + obj = pdf_new_matrix(ctx, doc, mat); + pdf_dict_puts(ctx, dict, "Matrix", obj); + pdf_drop_obj(ctx, obj); obj = NULL; - res = pdf_new_dict(doc, 0); - procset = pdf_new_array(doc, 2); - obj = pdf_new_name(doc, "PDF"); - pdf_array_push(procset, obj); - pdf_drop_obj(obj); + res = pdf_new_dict(ctx, doc, 0); + procset = pdf_new_array(ctx, doc, 2); + obj = pdf_new_name(ctx, doc, "PDF"); + pdf_array_push(ctx, procset, obj); + pdf_drop_obj(ctx, obj); obj = NULL; - obj = pdf_new_name(doc, "Text"); - pdf_array_push(procset, obj); - pdf_drop_obj(obj); + obj = pdf_new_name(ctx, doc, "Text"); + pdf_array_push(ctx, procset, obj); + pdf_drop_obj(ctx, obj); obj = NULL; - pdf_dict_puts(res, "ProcSet", procset); - pdf_drop_obj(procset); + pdf_dict_puts(ctx, res, "ProcSet", procset); + pdf_drop_obj(ctx, procset); procset = NULL; - pdf_dict_puts(dict, "Resources", res); + pdf_dict_puts(ctx, dict, "Resources", res); - obj = pdf_new_name(doc, "Form"); - pdf_dict_puts(dict, "Subtype", obj); - pdf_drop_obj(obj); + obj = pdf_new_name(ctx, doc, "Form"); + pdf_dict_puts(ctx, dict, "Subtype", obj); + pdf_drop_obj(ctx, obj); obj = NULL; - obj = pdf_new_name(doc, "XObject"); - pdf_dict_puts(dict, "Type", obj); - pdf_drop_obj(obj); + obj = pdf_new_name(ctx, doc, "XObject"); + pdf_dict_puts(ctx, dict, "Type", obj); + pdf_drop_obj(ctx, obj); obj = NULL; form = fz_malloc_struct(ctx, pdf_xobject); @@ -200,27 +198,27 @@ pdf_new_xobject(pdf_document *doc, const fz_rect *bbox, const fz_matrix *mat) form->resources = res; res = NULL; - idict_num = pdf_create_object(doc); - pdf_update_object(doc, idict_num, dict); - idict = pdf_new_indirect(doc, idict_num, 0); - pdf_drop_obj(dict); + idict_num = pdf_create_object(ctx, doc); + pdf_update_object(ctx, doc, idict_num, dict); + idict = pdf_new_indirect(ctx, doc, idict_num, 0); + pdf_drop_obj(ctx, dict); dict = NULL; pdf_store_item(ctx, idict, form, pdf_xobject_size(form)); - form->contents = pdf_keep_obj(idict); - form->me = pdf_keep_obj(idict); + form->contents = pdf_keep_obj(ctx, idict); + form->me = pdf_keep_obj(ctx, idict); pdf_drop_xobject(ctx, form); form = NULL; } fz_catch(ctx) { - pdf_drop_obj(procset); - pdf_drop_obj(res); - pdf_drop_obj(obj); - pdf_drop_obj(dict); - pdf_drop_obj(idict); + pdf_drop_obj(ctx, procset); + pdf_drop_obj(ctx, res); + pdf_drop_obj(ctx, obj); + pdf_drop_obj(ctx, dict); + pdf_drop_obj(ctx, idict); pdf_drop_xobject(ctx, form); fz_rethrow_message(ctx, "failed to create xobject)"); } @@ -228,10 +226,10 @@ pdf_new_xobject(pdf_document *doc, const fz_rect *bbox, const fz_matrix *mat) return idict; } -void pdf_update_xobject_contents(pdf_document *doc, pdf_xobject *form, fz_buffer *buffer) +void pdf_update_xobject_contents(fz_context *ctx, pdf_document *doc, pdf_xobject *form, fz_buffer *buffer) { - pdf_dict_dels(form->contents, "Filter"); - pdf_dict_puts_drop(form->contents, "Length", pdf_new_int(doc, buffer->len)); - pdf_update_stream(doc, pdf_to_num(form->contents), buffer); + pdf_dict_dels(ctx, form->contents, "Filter"); + pdf_dict_puts_drop(ctx, form->contents, "Length", pdf_new_int(ctx, doc, buffer->len)); + pdf_update_stream(ctx, doc, pdf_to_num(ctx, form->contents), buffer); form->iteration ++; } diff --git a/source/pdf/pdf-xref-aux.c b/source/pdf/pdf-xref-aux.c index aac323de..d257fa60 100644 --- a/source/pdf/pdf-xref-aux.c +++ b/source/pdf/pdf-xref-aux.c @@ -12,8 +12,7 @@ pdf_document * pdf_open_document_with_stream(fz_context *ctx, fz_stream *file) { pdf_document *doc = pdf_open_document_no_run_with_stream(ctx, file); - doc->super.run_page_contents = (fz_document_run_page_contents_fn *)pdf_run_page_contents; - doc->super.run_annot = (fz_document_run_annot_fn *)pdf_run_annot; + doc->super.load_page = (fz_document_load_page_fn*)pdf_load_page; doc->update_appearance = pdf_update_appearance; return doc; } @@ -22,8 +21,7 @@ pdf_document * pdf_open_document(fz_context *ctx, const char *filename) { pdf_document *doc = pdf_open_document_no_run(ctx, filename); - doc->super.run_page_contents = (fz_document_run_page_contents_fn *)pdf_run_page_contents; - doc->super.run_annot = (fz_document_run_annot_fn *)pdf_run_annot; + doc->super.load_page = (fz_document_load_page_fn*)pdf_load_page; doc->update_appearance = pdf_update_appearance; return doc; } diff --git a/source/pdf/pdf-xref.c b/source/pdf/pdf-xref.c index ef82cc2f..586aab2d 100644 --- a/source/pdf/pdf-xref.c +++ b/source/pdf/pdf-xref.c @@ -20,9 +20,8 @@ static inline int iswhite(int ch) * xref tables */ -static void pdf_drop_xref_sections(pdf_document *doc) +static void pdf_drop_xref_sections(fz_context *ctx, pdf_document *doc) { - fz_context *ctx = doc->ctx; int x, e; for (x = 0; x < doc->num_xref_sections; x++) @@ -39,7 +38,7 @@ static void pdf_drop_xref_sections(pdf_document *doc) if (entry->obj) { - pdf_drop_obj(entry->obj); + pdf_drop_obj(ctx, entry->obj); fz_drop_buffer(ctx, entry->stm_buf); } } @@ -48,8 +47,8 @@ static void pdf_drop_xref_sections(pdf_document *doc) sub = next_sub; } - pdf_drop_obj(xref->pre_repair_trailer); - pdf_drop_obj(xref->trailer); + pdf_drop_obj(ctx, xref->pre_repair_trailer); + pdf_drop_obj(ctx, xref->trailer); } fz_free(ctx, doc->xref_sections); @@ -100,10 +99,10 @@ static void pdf_resize_xref(fz_context *ctx, pdf_document *doc, int newlen) extend_xref_index(ctx, doc, newlen); } -static void pdf_populate_next_xref_level(pdf_document *doc) +static void pdf_populate_next_xref_level(fz_context *ctx, pdf_document *doc) { pdf_xref *xref; - doc->xref_sections = fz_resize_array(doc->ctx, doc->xref_sections, doc->num_xref_sections + 1, sizeof(pdf_xref)); + doc->xref_sections = fz_resize_array(ctx, doc->xref_sections, doc->num_xref_sections + 1, sizeof(pdf_xref)); doc->num_xref_sections++; xref = &doc->xref_sections[doc->num_xref_sections - 1]; @@ -113,7 +112,7 @@ static void pdf_populate_next_xref_level(pdf_document *doc) xref->pre_repair_trailer = NULL; } -pdf_obj *pdf_trailer(pdf_document *doc) +pdf_obj *pdf_trailer(fz_context *ctx, pdf_document *doc) { /* Return the document's final trailer */ pdf_xref *xref = &doc->xref_sections[0]; @@ -121,19 +120,19 @@ pdf_obj *pdf_trailer(pdf_document *doc) return xref->trailer; } -void pdf_set_populating_xref_trailer(pdf_document *doc, pdf_obj *trailer) +void pdf_set_populating_xref_trailer(fz_context *ctx, pdf_document *doc, pdf_obj *trailer) { /* Update the trailer of the xref section being populated */ pdf_xref *xref = &doc->xref_sections[doc->num_xref_sections - 1]; if (xref->trailer) { - pdf_drop_obj(xref->pre_repair_trailer); + pdf_drop_obj(ctx, xref->pre_repair_trailer); xref->pre_repair_trailer = xref->trailer; } - xref->trailer = pdf_keep_obj(trailer); + xref->trailer = pdf_keep_obj(ctx, trailer); } -int pdf_xref_len(pdf_document *doc) +int pdf_xref_len(fz_context *ctx, pdf_document *doc) { return doc->max_xref_len; } @@ -141,9 +140,8 @@ int pdf_xref_len(pdf_document *doc) /* Ensure that the given xref has a single subsection * that covers the entire range. */ static void -ensure_solid_xref(pdf_document *doc, int num, int which) +ensure_solid_xref(fz_context *ctx, pdf_document *doc, int num, int which) { - fz_context *ctx = doc->ctx; pdf_xref *xref = &doc->xref_sections[which]; pdf_xref_subsec *sub = xref->subsec; pdf_xref_subsec *new_sub; @@ -191,7 +189,7 @@ ensure_solid_xref(pdf_document *doc, int num, int which) } /* Used while reading the individual xref sections from a file */ -pdf_xref_entry *pdf_get_populating_xref_entry(pdf_document *doc, int num) +pdf_xref_entry *pdf_get_populating_xref_entry(fz_context *ctx, pdf_document *doc, int num) { /* Return an entry within the xref currently being populated */ pdf_xref *xref; @@ -199,13 +197,13 @@ pdf_xref_entry *pdf_get_populating_xref_entry(pdf_document *doc, int num) if (doc->num_xref_sections == 0) { - doc->xref_sections = fz_calloc(doc->ctx, 1, sizeof(pdf_xref)); + doc->xref_sections = fz_calloc(ctx, 1, sizeof(pdf_xref)); doc->num_xref_sections = 1; } /* Prevent accidental heap underflow */ if (num < 0) - fz_throw(doc->ctx, FZ_ERROR_GENERIC, "object number must not be negative (%d)", num); + fz_throw(ctx, FZ_ERROR_GENERIC, "object number must not be negative (%d)", num); /* Return the pointer to the entry in the last section. */ xref = &doc->xref_sections[doc->num_xref_sections-1]; @@ -217,7 +215,7 @@ pdf_xref_entry *pdf_get_populating_xref_entry(pdf_document *doc, int num) } /* We've been asked for an object that's not in a subsec. */ - ensure_solid_xref(doc, num+1, doc->num_xref_sections-1); + ensure_solid_xref(ctx, doc, num+1, doc->num_xref_sections-1); xref = &doc->xref_sections[doc->num_xref_sections-1]; sub = xref->subsec; @@ -228,9 +226,8 @@ pdf_xref_entry *pdf_get_populating_xref_entry(pdf_document *doc, int num) /* This will never throw anything, or return NULL if it is * only asked to return objects in range within a 'solid' * xref. */ -pdf_xref_entry *pdf_get_xref_entry(pdf_document *doc, int i) +pdf_xref_entry *pdf_get_xref_entry(fz_context *ctx, pdf_document *doc, int i) { - fz_context *ctx = doc->ctx; pdf_xref *xref; pdf_xref_subsec *sub; int j; @@ -284,7 +281,7 @@ pdf_xref_entry *pdf_get_xref_entry(pdf_document *doc, int i) * can return a pointer. This is the only case where this function * might throw an exception, and it will never happen when we are * working within a 'solid' xref. */ - ensure_solid_xref(doc, i+1, 0); + ensure_solid_xref(ctx, doc, i+1, 0); xref = &doc->xref_sections[0]; sub = xref->subsec; return &sub->table[i - sub->start]; @@ -295,9 +292,8 @@ pdf_xref_entry *pdf_get_xref_entry(pdf_document *doc, int i) updated versions of indirect objects. This is a new xref section consisting of a single xref subsection. */ -static void ensure_incremental_xref(pdf_document *doc) +static void ensure_incremental_xref(fz_context *ctx, pdf_document *doc) { - fz_context *ctx = doc->ctx; if (!doc->xref_altered) { @@ -312,7 +308,7 @@ static void ensure_incremental_xref(pdf_document *doc) fz_try(ctx) { sub = fz_malloc_struct(ctx, pdf_xref_subsec); - trailer = pdf_copy_dict(xref->trailer); + trailer = pdf_copy_dict(ctx, xref->trailer); doc->xref_sections = fz_resize_array(ctx, doc->xref_sections, doc->num_xref_sections + 1, sizeof(pdf_xref)); xref = &doc->xref_sections[0]; pxref = &doc->xref_sections[1]; @@ -331,7 +327,7 @@ static void ensure_incremental_xref(pdf_document *doc) fz_catch(ctx) { fz_free(ctx, new_table); - pdf_drop_obj(trailer); + pdf_drop_obj(ctx, trailer); fz_rethrow(ctx); } @@ -344,14 +340,13 @@ static void ensure_incremental_xref(pdf_document *doc) } /* Used when altering a document */ -static pdf_xref_entry *pdf_get_incremental_xref_entry(pdf_document *doc, int i) +static pdf_xref_entry *pdf_get_incremental_xref_entry(fz_context *ctx, pdf_document *doc, int i) { - fz_context *ctx = doc->ctx; pdf_xref *xref; pdf_xref_subsec *sub; /* Make a new final xref section if we haven't already */ - ensure_incremental_xref(doc); + ensure_incremental_xref(ctx, doc); xref = &doc->xref_sections[0]; if (i >= xref->num_objects) @@ -364,7 +359,7 @@ static pdf_xref_entry *pdf_get_incremental_xref_entry(pdf_document *doc, int i) return &sub->table[i - sub->start]; } -int pdf_xref_is_incremental(pdf_document *doc, int num) +int pdf_xref_is_incremental(fz_context *ctx, pdf_document *doc, int num) { pdf_xref *xref = &doc->xref_sections[0]; pdf_xref_subsec *sub = xref->subsec; @@ -376,23 +371,23 @@ int pdf_xref_is_incremental(pdf_document *doc, int num) /* Ensure that the current populating xref has a single subsection * that covers the entire range. */ -void pdf_ensure_solid_xref(pdf_document *doc, int num) +void pdf_ensure_solid_xref(fz_context *ctx, pdf_document *doc, int num) { if (doc->num_xref_sections == 0) - pdf_populate_next_xref_level(doc); + pdf_populate_next_xref_level(ctx, doc); - ensure_solid_xref(doc, num, doc->num_xref_sections-1); + ensure_solid_xref(ctx, doc, num, doc->num_xref_sections-1); } /* Ensure that an object has been cloned into the incremental xref section */ -void pdf_xref_ensure_incremental_object(pdf_document *doc, int num) +void pdf_xref_ensure_incremental_object(fz_context *ctx, pdf_document *doc, int num) { pdf_xref_entry *new_entry, *old_entry; pdf_xref_subsec *sub = NULL; int i; /* Make sure we have created an xref section for incremental updates */ - ensure_incremental_xref(doc); + ensure_incremental_xref(ctx, doc); /* Search for the section that contains this object */ for (i = doc->xref_index[num]; i < doc->num_xref_sections; i++) @@ -418,18 +413,17 @@ void pdf_xref_ensure_incremental_object(pdf_document *doc, int num) /* Move the object to the incremental section */ doc->xref_index[num] = 0; old_entry = &sub->table[num - sub->start]; - new_entry = pdf_get_incremental_xref_entry(doc, num); + new_entry = pdf_get_incremental_xref_entry(ctx, doc, num); *new_entry = *old_entry; old_entry->obj = NULL; old_entry->stm_buf = NULL; } -void pdf_replace_xref(pdf_document *doc, pdf_xref_entry *entries, int n) +void pdf_replace_xref(fz_context *ctx, pdf_document *doc, pdf_xref_entry *entries, int n) { - fz_context *ctx = doc->ctx; pdf_xref *xref = NULL; pdf_xref_subsec *sub; - pdf_obj *trailer = pdf_keep_obj(pdf_trailer(doc)); + pdf_obj *trailer = pdf_keep_obj(ctx, pdf_trailer(ctx, doc)); fz_var(xref); fz_try(ctx) @@ -439,7 +433,7 @@ void pdf_replace_xref(pdf_document *doc, pdf_xref_entry *entries, int n) sub = fz_malloc_struct(ctx, pdf_xref_subsec); /* The new table completely replaces the previous separate sections */ - pdf_drop_xref_sections(doc); + pdf_drop_xref_sections(ctx, doc); sub->table = entries; sub->start = 0; @@ -458,7 +452,7 @@ void pdf_replace_xref(pdf_document *doc, pdf_xref_entry *entries, int n) fz_catch(ctx) { fz_free(ctx, xref); - pdf_drop_obj(trailer); + pdf_drop_obj(ctx, trailer); fz_rethrow(ctx); } } @@ -468,33 +462,33 @@ void pdf_replace_xref(pdf_document *doc, pdf_xref_entry *entries, int n) */ static void -pdf_load_version(pdf_document *doc) +pdf_load_version(fz_context *ctx, pdf_document *doc) { char buf[20]; - fz_seek(doc->file, 0, SEEK_SET); - fz_read_line(doc->file, buf, sizeof buf); + fz_seek(ctx, doc->file, 0, SEEK_SET); + fz_read_line(ctx, doc->file, buf, sizeof buf); if (memcmp(buf, "%PDF-", 5) != 0) - fz_throw(doc->ctx, FZ_ERROR_GENERIC, "cannot recognize version marker"); + fz_throw(ctx, FZ_ERROR_GENERIC, "cannot recognize version marker"); doc->version = 10 * (fz_atof(buf+5) + 0.05); } static void -pdf_read_start_xref(pdf_document *doc) +pdf_read_start_xref(fz_context *ctx, pdf_document *doc) { unsigned char buf[1024]; int t, n; int i; - fz_seek(doc->file, 0, SEEK_END); + fz_seek(ctx, doc->file, 0, SEEK_END); - doc->file_size = fz_tell(doc->file); + doc->file_size = fz_tell(ctx, doc->file); t = fz_maxi(0, doc->file_size - (int)sizeof buf); - fz_seek(doc->file, t, SEEK_SET); + fz_seek(ctx, doc->file, t, SEEK_SET); - n = fz_read(doc->file, buf, sizeof buf); + n = fz_read(ctx, doc->file, buf, sizeof buf); for (i = n - 9; i >= 0; i--) { @@ -512,7 +506,7 @@ pdf_read_start_xref(pdf_document *doc) } } - fz_throw(doc->ctx, FZ_ERROR_GENERIC, "cannot find startxref"); + fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find startxref"); } /* @@ -520,7 +514,7 @@ pdf_read_start_xref(pdf_document *doc) */ static int -pdf_xref_size_from_old_trailer(pdf_document *doc, pdf_lexbuf *buf) +pdf_xref_size_from_old_trailer(fz_context *ctx, pdf_document *doc, pdf_lexbuf *buf) { int len; char *s; @@ -534,82 +528,81 @@ pdf_xref_size_from_old_trailer(pdf_document *doc, pdf_lexbuf *buf) fz_var(trailer); /* Record the current file read offset so that we can reinstate it */ - ofs = fz_tell(doc->file); + ofs = fz_tell(ctx, doc->file); - fz_read_line(doc->file, buf->scratch, buf->size); + fz_read_line(ctx, doc->file, buf->scratch, buf->size); if (strncmp(buf->scratch, "xref", 4) != 0) - fz_throw(doc->ctx, FZ_ERROR_GENERIC, "cannot find xref marker"); + fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find xref marker"); while (1) { - c = fz_peek_byte(doc->file); + c = fz_peek_byte(ctx, doc->file); if (!(c >= '0' && c <= '9')) break; - fz_read_line(doc->file, buf->scratch, buf->size); + fz_read_line(ctx, doc->file, buf->scratch, buf->size); s = buf->scratch; fz_strsep(&s, " "); /* ignore ofs */ if (!s) - fz_throw(doc->ctx, FZ_ERROR_GENERIC, "invalid range marker in xref"); + fz_throw(ctx, FZ_ERROR_GENERIC, "invalid range marker in xref"); len = fz_atoi(fz_strsep(&s, " ")); if (len < 0) - fz_throw(doc->ctx, FZ_ERROR_GENERIC, "xref range marker must be positive"); + fz_throw(ctx, FZ_ERROR_GENERIC, "xref range marker must be positive"); /* broken pdfs where the section is not on a separate line */ if (s && *s != '\0') - fz_seek(doc->file, -(2 + (int)strlen(s)), SEEK_CUR); + fz_seek(ctx, doc->file, -(2 + (int)strlen(s)), SEEK_CUR); - t = fz_tell(doc->file); + t = fz_tell(ctx, doc->file); if (t < 0) - fz_throw(doc->ctx, FZ_ERROR_GENERIC, "cannot tell in file"); + fz_throw(ctx, FZ_ERROR_GENERIC, "cannot tell in file"); if (len > (INT_MAX - t) / 20) - fz_throw(doc->ctx, FZ_ERROR_GENERIC, "xref has too many entries"); + fz_throw(ctx, FZ_ERROR_GENERIC, "xref has too many entries"); - fz_seek(doc->file, t + 20 * len, SEEK_SET); + fz_seek(ctx, doc->file, t + 20 * len, SEEK_SET); } - fz_try(doc->ctx) + fz_try(ctx) { - tok = pdf_lex(doc->file, buf); + tok = pdf_lex(ctx, doc->file, buf); if (tok != PDF_TOK_TRAILER) - fz_throw(doc->ctx, FZ_ERROR_GENERIC, "expected trailer marker"); + fz_throw(ctx, FZ_ERROR_GENERIC, "expected trailer marker"); - tok = pdf_lex(doc->file, buf); + tok = pdf_lex(ctx, doc->file, buf); if (tok != PDF_TOK_OPEN_DICT) - fz_throw(doc->ctx, FZ_ERROR_GENERIC, "expected trailer dictionary"); + fz_throw(ctx, FZ_ERROR_GENERIC, "expected trailer dictionary"); - trailer = pdf_parse_dict(doc, doc->file, buf); + trailer = pdf_parse_dict(ctx, doc, doc->file, buf); - size = pdf_to_int(pdf_dict_gets(trailer, "Size")); + size = pdf_to_int(ctx, pdf_dict_gets(ctx, trailer, "Size")); if (!size) - fz_throw(doc->ctx, FZ_ERROR_GENERIC, "trailer missing Size entry"); + fz_throw(ctx, FZ_ERROR_GENERIC, "trailer missing Size entry"); } - fz_always(doc->ctx) + fz_always(ctx) { - pdf_drop_obj(trailer); + pdf_drop_obj(ctx, trailer); } - fz_catch(doc->ctx) + fz_catch(ctx) { - fz_rethrow_message(doc->ctx, "cannot parse trailer"); + fz_rethrow_message(ctx, "cannot parse trailer"); } - fz_seek(doc->file, ofs, SEEK_SET); + fz_seek(ctx, doc->file, ofs, SEEK_SET); return size; } pdf_obj * -pdf_new_ref(pdf_document *doc, pdf_obj *obj) +pdf_new_ref(fz_context *ctx, pdf_document *doc, pdf_obj *obj) { - int num = pdf_create_object(doc); - pdf_update_object(doc, num, obj); - return pdf_new_indirect(doc, num, 0); + int num = pdf_create_object(ctx, doc); + pdf_update_object(ctx, doc, num, obj); + return pdf_new_indirect(ctx, doc, num, 0); } static pdf_xref_entry * -pdf_xref_find_subsection(pdf_document *doc, int ofs, int len) +pdf_xref_find_subsection(fz_context *ctx, pdf_document *doc, int ofs, int len) { - fz_context *ctx = doc->ctx; pdf_xref *xref = &doc->xref_sections[doc->num_xref_sections-1]; pdf_xref_subsec *sub; int new_max; @@ -658,7 +651,7 @@ pdf_xref_find_subsection(pdf_document *doc, int ofs, int len) else { /* Case 3 */ - ensure_solid_xref(doc, new_max, doc->num_xref_sections-1); + ensure_solid_xref(ctx, doc, new_max, doc->num_xref_sections-1); xref = &doc->xref_sections[doc->num_xref_sections-1]; sub = xref->subsec; } @@ -666,8 +659,10 @@ pdf_xref_find_subsection(pdf_document *doc, int ofs, int len) } static pdf_obj * -pdf_read_old_xref(pdf_document *doc, pdf_lexbuf *buf) +pdf_read_old_xref(fz_context *ctx, pdf_document *doc, pdf_lexbuf *buf) { + fz_stream *file = doc->file; + int ofs, len; char *s; int n; @@ -675,20 +670,20 @@ pdf_read_old_xref(pdf_document *doc, pdf_lexbuf *buf) int i; int c; pdf_obj *trailer; - int xref_len = pdf_xref_size_from_old_trailer(doc, buf); + int xref_len = pdf_xref_size_from_old_trailer(ctx, doc, buf); pdf_xref_entry *table; - fz_read_line(doc->file, buf->scratch, buf->size); + fz_read_line(ctx, file, buf->scratch, buf->size); if (strncmp(buf->scratch, "xref", 4) != 0) - fz_throw(doc->ctx, FZ_ERROR_GENERIC, "cannot find xref marker"); + fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find xref marker"); while (1) { - c = fz_peek_byte(doc->file); + c = fz_peek_byte(ctx, file); if (!(c >= '0' && c <= '9')) break; - fz_read_line(doc->file, buf->scratch, buf->size); + fz_read_line(ctx, file, buf->scratch, buf->size); s = buf->scratch; ofs = fz_atoi(fz_strsep(&s, " ")); len = fz_atoi(fz_strsep(&s, " ")); @@ -696,27 +691,27 @@ pdf_read_old_xref(pdf_document *doc, pdf_lexbuf *buf) /* broken pdfs where the section is not on a separate line */ if (s && *s != '\0') { - fz_warn(doc->ctx, "broken xref section. proceeding anyway."); - fz_seek(doc->file, -(2 + (int)strlen(s)), SEEK_CUR); + fz_warn(ctx, "broken xref section. proceeding anyway."); + fz_seek(ctx, file, -(2 + (int)strlen(s)), SEEK_CUR); } if (ofs < 0) - fz_throw(doc->ctx, FZ_ERROR_GENERIC, "out of range object num in xref: %d", ofs); + fz_throw(ctx, FZ_ERROR_GENERIC, "out of range object num in xref: %d", ofs); /* broken pdfs where size in trailer undershoots entries in xref sections */ if (ofs + len > xref_len) { - fz_warn(doc->ctx, "broken xref section, proceeding anyway."); + fz_warn(ctx, "broken xref section, proceeding anyway."); } - table = pdf_xref_find_subsection(doc, ofs, len); + table = pdf_xref_find_subsection(ctx, doc, ofs, len); for (i = ofs; i < ofs + len; i++) { pdf_xref_entry *entry = &table[i-ofs]; - n = fz_read(doc->file, (unsigned char *) buf->scratch, 20); + n = fz_read(ctx, file, (unsigned char *) buf->scratch, 20); if (n != 20) - fz_throw(doc->ctx, FZ_ERROR_GENERIC, "unexpected EOF in xref table"); + fz_throw(ctx, FZ_ERROR_GENERIC, "unexpected EOF in xref table"); if (!entry->type) { s = buf->scratch; @@ -729,42 +724,42 @@ pdf_read_old_xref(pdf_document *doc, pdf_lexbuf *buf) entry->gen = atoi(s + 11); entry->type = s[17]; if (s[17] != 'f' && s[17] != 'n' && s[17] != 'o') - fz_throw(doc->ctx, FZ_ERROR_GENERIC, "unexpected xref type: %#x (%d %d R)", s[17], i, entry->gen); + fz_throw(ctx, FZ_ERROR_GENERIC, "unexpected xref type: %#x (%d %d R)", s[17], i, entry->gen); } } } - fz_try(doc->ctx) + fz_try(ctx) { - tok = pdf_lex(doc->file, buf); + tok = pdf_lex(ctx, file, buf); if (tok != PDF_TOK_TRAILER) - fz_throw(doc->ctx, FZ_ERROR_GENERIC, "expected trailer marker"); + fz_throw(ctx, FZ_ERROR_GENERIC, "expected trailer marker"); - tok = pdf_lex(doc->file, buf); + tok = pdf_lex(ctx, file, buf); if (tok != PDF_TOK_OPEN_DICT) - fz_throw(doc->ctx, FZ_ERROR_GENERIC, "expected trailer dictionary"); + fz_throw(ctx, FZ_ERROR_GENERIC, "expected trailer dictionary"); - trailer = pdf_parse_dict(doc, doc->file, buf); + trailer = pdf_parse_dict(ctx, doc, file, buf); } - fz_catch(doc->ctx) + fz_catch(ctx) { - fz_rethrow_message(doc->ctx, "cannot parse trailer"); + fz_rethrow_message(ctx, "cannot parse trailer"); } return trailer; } static void -pdf_read_new_xref_section(pdf_document *doc, fz_stream *stm, int i0, int i1, int w0, int w1, int w2) +pdf_read_new_xref_section(fz_context *ctx, pdf_document *doc, fz_stream *stm, int i0, int i1, int w0, int w1, int w2) { - int i, n; pdf_xref_entry *table; + int i, n; if (i0 < 0 || i1 < 0) - fz_throw(doc->ctx, FZ_ERROR_GENERIC, "negative xref stream entry index"); - //if (i0 + i1 > pdf_xref_len(doc)) - // fz_throw(doc->ctx, FZ_ERROR_GENERIC, "xref stream has too many entries"); + fz_throw(ctx, FZ_ERROR_GENERIC, "negative xref stream entry index"); + //if (i0 + i1 > pdf_xref_len(ctx, doc)) + // fz_throw(ctx, FZ_ERROR_GENERIC, "xref stream has too many entries"); - table = pdf_xref_find_subsection(doc, i0, i1); + table = pdf_xref_find_subsection(ctx, doc, i0, i1); for (i = i0; i < i0 + i1; i++) { pdf_xref_entry *entry = &table[i-i0]; @@ -772,15 +767,15 @@ pdf_read_new_xref_section(pdf_document *doc, fz_stream *stm, int i0, int i1, int int b = 0; int c = 0; - if (fz_is_eof(stm)) - fz_throw(doc->ctx, FZ_ERROR_GENERIC, "truncated xref stream"); + if (fz_is_eof(ctx, stm)) + fz_throw(ctx, FZ_ERROR_GENERIC, "truncated xref stream"); for (n = 0; n < w0; n++) - a = (a << 8) + fz_read_byte(stm); + a = (a << 8) + fz_read_byte(ctx, stm); for (n = 0; n < w1; n++) - b = (b << 8) + fz_read_byte(stm); + b = (b << 8) + fz_read_byte(ctx, stm); for (n = 0; n < w2; n++) - c = (c << 8) + fz_read_byte(stm); + c = (c << 8) + fz_read_byte(ctx, stm); if (!entry->type) { @@ -796,7 +791,7 @@ pdf_read_new_xref_section(pdf_document *doc, fz_stream *stm, int i0, int i1, int /* Entered with file locked, remains locked throughout. */ static pdf_obj * -pdf_read_new_xref(pdf_document *doc, pdf_lexbuf *buf) +pdf_read_new_xref(fz_context *ctx, pdf_document *doc, pdf_lexbuf *buf) { fz_stream *stm = NULL; pdf_obj *trailer = NULL; @@ -805,19 +800,18 @@ pdf_read_new_xref(pdf_document *doc, pdf_lexbuf *buf) int num, gen, ofs, stm_ofs; int size, w0, w1, w2; int t; - fz_context *ctx = doc->ctx; fz_var(trailer); fz_var(stm); fz_try(ctx) { - ofs = fz_tell(doc->file); - trailer = pdf_parse_ind_obj(doc, doc->file, buf, &num, &gen, &stm_ofs, NULL); + ofs = fz_tell(ctx, doc->file); + trailer = pdf_parse_ind_obj(ctx, doc, doc->file, buf, &num, &gen, &stm_ofs, NULL); } fz_catch(ctx) { - pdf_drop_obj(trailer); + pdf_drop_obj(ctx, trailer); fz_rethrow_message(ctx, "cannot parse compressed xref stream object"); } @@ -825,18 +819,18 @@ pdf_read_new_xref(pdf_document *doc, pdf_lexbuf *buf) { pdf_xref_entry *entry; - obj = pdf_dict_gets(trailer, "Size"); + obj = pdf_dict_gets(ctx, trailer, "Size"); if (!obj) fz_throw(ctx, FZ_ERROR_GENERIC, "xref stream missing Size entry (%d %d R)", num, gen); - size = pdf_to_int(obj); + size = pdf_to_int(ctx, obj); - obj = pdf_dict_gets(trailer, "W"); + obj = pdf_dict_gets(ctx, trailer, "W"); if (!obj) fz_throw(ctx, FZ_ERROR_GENERIC, "xref stream missing W entry (%d %d R)", num, gen); - w0 = pdf_to_int(pdf_array_get(obj, 0)); - w1 = pdf_to_int(pdf_array_get(obj, 1)); - w2 = pdf_to_int(pdf_array_get(obj, 2)); + w0 = pdf_to_int(ctx, pdf_array_get(ctx, obj, 0)); + w1 = pdf_to_int(ctx, pdf_array_get(ctx, obj, 1)); + w2 = pdf_to_int(ctx, pdf_array_get(ctx, obj, 2)); if (w0 < 0) fz_warn(ctx, "xref stream objects have corrupt type"); @@ -849,39 +843,39 @@ pdf_read_new_xref(pdf_document *doc, pdf_lexbuf *buf) w1 = w1 < 0 ? 0 : w1; w2 = w2 < 0 ? 0 : w2; - index = pdf_dict_gets(trailer, "Index"); + index = pdf_dict_gets(ctx, trailer, "Index"); - stm = pdf_open_stream_with_offset(doc, num, gen, trailer, stm_ofs); + stm = pdf_open_stream_with_offset(ctx, doc, num, gen, trailer, stm_ofs); if (!index) { - pdf_read_new_xref_section(doc, stm, 0, size, w0, w1, w2); + pdf_read_new_xref_section(ctx, doc, stm, 0, size, w0, w1, w2); } else { - int n = pdf_array_len(index); + int n = pdf_array_len(ctx, index); for (t = 0; t < n; t += 2) { - int i0 = pdf_to_int(pdf_array_get(index, t + 0)); - int i1 = pdf_to_int(pdf_array_get(index, t + 1)); - pdf_read_new_xref_section(doc, stm, i0, i1, w0, w1, w2); + int i0 = pdf_to_int(ctx, pdf_array_get(ctx, index, t + 0)); + int i1 = pdf_to_int(ctx, pdf_array_get(ctx, index, t + 1)); + pdf_read_new_xref_section(ctx, doc, stm, i0, i1, w0, w1, w2); } } - entry = pdf_get_populating_xref_entry(doc, num); + entry = pdf_get_populating_xref_entry(ctx, doc, num); entry->ofs = ofs; entry->gen = gen; entry->stm_ofs = stm_ofs; - pdf_drop_obj(entry->obj); - entry->obj = pdf_keep_obj(trailer); + pdf_drop_obj(ctx, entry->obj); + entry->obj = pdf_keep_obj(ctx, trailer); entry->type = 'n'; } fz_always(ctx) { - fz_drop_stream(stm); + fz_drop_stream(ctx, stm); } fz_catch(ctx) { - pdf_drop_obj(trailer); + pdf_drop_obj(ctx, trailer); fz_rethrow(ctx); } @@ -889,24 +883,23 @@ pdf_read_new_xref(pdf_document *doc, pdf_lexbuf *buf) } static pdf_obj * -pdf_read_xref(pdf_document *doc, int ofs, pdf_lexbuf *buf) +pdf_read_xref(fz_context *ctx, pdf_document *doc, int ofs, pdf_lexbuf *buf) { - int c; - fz_context *ctx = doc->ctx; pdf_obj *trailer; + int c; - fz_seek(doc->file, ofs, SEEK_SET); + fz_seek(ctx, doc->file, ofs, SEEK_SET); - while (iswhite(fz_peek_byte(doc->file))) - fz_read_byte(doc->file); + while (iswhite(fz_peek_byte(ctx, doc->file))) + fz_read_byte(ctx, doc->file); fz_try(ctx) { - c = fz_peek_byte(doc->file); + c = fz_peek_byte(ctx, doc->file); if (c == 'x') - trailer = pdf_read_old_xref(doc, buf); + trailer = pdf_read_old_xref(ctx, doc, buf); else if (c >= '0' && c <= '9') - trailer = pdf_read_new_xref(doc, buf); + trailer = pdf_read_new_xref(ctx, doc, buf); else fz_throw(ctx, FZ_ERROR_GENERIC, "cannot recognize xref format"); } @@ -927,10 +920,9 @@ struct ofs_list_s }; static int -read_xref_section(pdf_document *doc, int ofs, pdf_lexbuf *buf, ofs_list *offsets) +read_xref_section(fz_context *ctx, pdf_document *doc, int ofs, pdf_lexbuf *buf, ofs_list *offsets) { pdf_obj *trailer = NULL; - fz_context *ctx = doc->ctx; int xrefstmofs = 0; int prevofs = 0; @@ -957,13 +949,13 @@ read_xref_section(pdf_document *doc, int ofs, pdf_lexbuf *buf, ofs_list *offsets } offsets->list[offsets->len++] = ofs; - trailer = pdf_read_xref(doc, ofs, buf); + trailer = pdf_read_xref(ctx, doc, ofs, buf); - pdf_set_populating_xref_trailer(doc, trailer); + pdf_set_populating_xref_trailer(ctx, doc, trailer); /* FIXME: do we overwrite free entries properly? */ /* FIXME: Does this work properly with progression? */ - xrefstmofs = pdf_to_int(pdf_dict_gets(trailer, "XRefStm")); + xrefstmofs = pdf_to_int(ctx, pdf_dict_gets(ctx, trailer, "XRefStm")); if (xrefstmofs) { if (xrefstmofs < 0) @@ -974,16 +966,16 @@ read_xref_section(pdf_document *doc, int ofs, pdf_lexbuf *buf, ofs_list *offsets follow any Prev tag therein, as specified on Page 108 of the PDF reference 1.7 */ - pdf_drop_obj(pdf_read_xref(doc, xrefstmofs, buf)); + pdf_drop_obj(ctx, pdf_read_xref(ctx, doc, xrefstmofs, buf)); } - prevofs = pdf_to_int(pdf_dict_gets(trailer, "Prev")); + prevofs = pdf_to_int(ctx, pdf_dict_gets(ctx, trailer, "Prev")); if (prevofs < 0) fz_throw(ctx, FZ_ERROR_GENERIC, "negative xref stream offset for previous xref stream"); } fz_always(ctx) { - pdf_drop_obj(trailer); + pdf_drop_obj(ctx, trailer); } fz_catch(ctx) { @@ -994,9 +986,8 @@ read_xref_section(pdf_document *doc, int ofs, pdf_lexbuf *buf, ofs_list *offsets } static void -pdf_read_xref_sections(pdf_document *doc, int ofs, pdf_lexbuf *buf, int read_previous) +pdf_read_xref_sections(fz_context *ctx, pdf_document *doc, int ofs, pdf_lexbuf *buf, int read_previous) { - fz_context *ctx = doc->ctx; ofs_list list; list.len = 0; @@ -1006,8 +997,8 @@ pdf_read_xref_sections(pdf_document *doc, int ofs, pdf_lexbuf *buf, int read_pre { while(ofs) { - pdf_populate_next_xref_level(doc); - ofs = read_xref_section(doc, ofs, buf, &list); + pdf_populate_next_xref_level(ctx, doc); + ofs = read_xref_section(ctx, doc, ofs, buf, &list); if (!read_previous) break; } @@ -1023,7 +1014,7 @@ pdf_read_xref_sections(pdf_document *doc, int ofs, pdf_lexbuf *buf, int read_pre } static void -pdf_prime_xref_index(pdf_document *doc) +pdf_prime_xref_index(fz_context *ctx, pdf_document *doc) { int i, j; int *idx = doc->xref_index; @@ -1055,23 +1046,22 @@ pdf_prime_xref_index(pdf_document *doc) */ static void -pdf_load_xref(pdf_document *doc, pdf_lexbuf *buf) +pdf_load_xref(fz_context *ctx, pdf_document *doc, pdf_lexbuf *buf) { int i; int xref_len; pdf_xref_entry *entry; - fz_context *ctx = doc->ctx; - pdf_read_start_xref(doc); + pdf_read_start_xref(ctx, doc); - pdf_read_xref_sections(doc, doc->startxref, buf, 1); + pdf_read_xref_sections(ctx, doc, doc->startxref, buf, 1); - if (pdf_xref_len(doc) == 0) + if (pdf_xref_len(ctx, doc) == 0) fz_throw(ctx, FZ_ERROR_GENERIC, "found xref was empty"); - pdf_prime_xref_index(doc); + pdf_prime_xref_index(ctx, doc); - entry = pdf_get_xref_entry(doc, 0); + entry = pdf_get_xref_entry(ctx, doc, 0); /* broken pdfs where first object is missing */ if (!entry->type) { @@ -1083,10 +1073,10 @@ pdf_load_xref(pdf_document *doc, pdf_lexbuf *buf) fz_throw(ctx, FZ_ERROR_GENERIC, "first object in xref is not free"); /* broken pdfs where object offsets are out of range */ - xref_len = pdf_xref_len(doc); + xref_len = pdf_xref_len(ctx, doc); for (i = 0; i < xref_len; i++) { - pdf_xref_entry *entry = pdf_get_xref_entry(doc, i); + pdf_xref_entry *entry = pdf_get_xref_entry(ctx, doc, i); if (entry->type == 'n') { /* Special case code: "0000000000 * n" means free, @@ -1097,19 +1087,18 @@ pdf_load_xref(pdf_document *doc, pdf_lexbuf *buf) fz_throw(ctx, FZ_ERROR_GENERIC, "object offset out of range: %d (%d 0 R)", entry->ofs, i); } if (entry->type == 'o') - if (entry->ofs <= 0 || entry->ofs >= xref_len || pdf_get_xref_entry(doc, entry->ofs)->type != 'n') + if (entry->ofs <= 0 || entry->ofs >= xref_len || pdf_get_xref_entry(ctx, doc, entry->ofs)->type != 'n') fz_throw(ctx, FZ_ERROR_GENERIC, "invalid reference to an objstm that does not exist: %d (%d 0 R)", entry->ofs, i); } } static void -pdf_load_linear(pdf_document *doc) +pdf_load_linear(fz_context *ctx, pdf_document *doc) { pdf_obj *dict = NULL; pdf_obj *hint = NULL; pdf_obj *o; int num, gen, stmofs, lin, len; - fz_context *ctx = doc->ctx; fz_var(dict); fz_var(hint); @@ -1118,39 +1107,39 @@ pdf_load_linear(pdf_document *doc) { pdf_xref_entry *entry; - dict = pdf_parse_ind_obj(doc, doc->file, &doc->lexbuf.base, &num, &gen, &stmofs, NULL); - if (!pdf_is_dict(dict)) + dict = pdf_parse_ind_obj(ctx, doc, doc->file, &doc->lexbuf.base, &num, &gen, &stmofs, NULL); + if (!pdf_is_dict(ctx, dict)) fz_throw(ctx, FZ_ERROR_GENERIC, "Failed to read linearized dictionary"); - o = pdf_dict_gets(dict, "Linearized"); + o = pdf_dict_gets(ctx, dict, "Linearized"); if (o == NULL) fz_throw(ctx, FZ_ERROR_GENERIC, "Failed to read linearized dictionary"); - lin = pdf_to_int(o); + lin = pdf_to_int(ctx, o); if (lin != 1) fz_throw(ctx, FZ_ERROR_GENERIC, "Unexpected version of Linearized tag (%d)", lin); - len = pdf_to_int(pdf_dict_gets(dict, "L")); + len = pdf_to_int(ctx, pdf_dict_gets(ctx, dict, "L")); if (len != doc->file_length) fz_throw(ctx, FZ_ERROR_GENERIC, "File has been updated since linearization"); - pdf_read_xref_sections(doc, fz_tell(doc->file), &doc->lexbuf.base, 0); + pdf_read_xref_sections(ctx, doc, fz_tell(ctx, doc->file), &doc->lexbuf.base, 0); - doc->page_count = pdf_to_int(pdf_dict_gets(dict, "N")); + doc->page_count = pdf_to_int(ctx, pdf_dict_gets(ctx, dict, "N")); doc->linear_page_refs = fz_resize_array(ctx, doc->linear_page_refs, doc->page_count, sizeof(pdf_obj *)); memset(doc->linear_page_refs, 0, doc->page_count * sizeof(pdf_obj*)); doc->linear_obj = dict; - doc->linear_pos = fz_tell(doc->file); - doc->linear_page1_obj_num = pdf_to_int(pdf_dict_gets(dict, "O")); - doc->linear_page_refs[0] = pdf_new_indirect(doc, doc->linear_page1_obj_num, 0); + doc->linear_pos = fz_tell(ctx, doc->file); + doc->linear_page1_obj_num = pdf_to_int(ctx, pdf_dict_gets(ctx, dict, "O")); + doc->linear_page_refs[0] = pdf_new_indirect(ctx, doc, doc->linear_page1_obj_num, 0); doc->linear_page_num = 0; - hint = pdf_dict_gets(dict, "H"); - doc->hint_object_offset = pdf_to_int(pdf_array_get(hint, 0)); - doc->hint_object_length = pdf_to_int(pdf_array_get(hint, 1)); + hint = pdf_dict_gets(ctx, dict, "H"); + doc->hint_object_offset = pdf_to_int(ctx, pdf_array_get(ctx, hint, 0)); + doc->hint_object_length = pdf_to_int(ctx, pdf_array_get(ctx, hint, 1)); - entry = pdf_get_populating_xref_entry(doc, 0); + entry = pdf_get_populating_xref_entry(ctx, doc, 0); entry->type = 'f'; } fz_catch(ctx) { - pdf_drop_obj(dict); + pdf_drop_obj(ctx, dict); fz_rethrow_if(ctx, FZ_ERROR_TRYLATER); /* Drop back to non linearized reading mode */ doc->file_reading_linearly = 0; @@ -1158,41 +1147,41 @@ pdf_load_linear(pdf_document *doc) } void -pdf_ocg_set_config(pdf_document *doc, int config) +pdf_ocg_set_config(fz_context *ctx, pdf_document *doc, int config) { int i, j, len, len2; pdf_ocg_descriptor *desc = doc->ocg; pdf_obj *obj, *cobj; char *name; - obj = pdf_dict_gets(pdf_dict_gets(pdf_trailer(doc), "Root"), "OCProperties"); + obj = pdf_dict_gets(ctx, pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Root"), "OCProperties"); if (!obj) { if (config == 0) return; else - fz_throw(doc->ctx, FZ_ERROR_GENERIC, "Unknown OCG config (None known!)"); + fz_throw(ctx, FZ_ERROR_GENERIC, "Unknown OCG config (None known!)"); } if (config == 0) { - cobj = pdf_dict_gets(obj, "D"); + cobj = pdf_dict_gets(ctx, obj, "D"); if (!cobj) - fz_throw(doc->ctx, FZ_ERROR_GENERIC, "No default OCG config"); + fz_throw(ctx, FZ_ERROR_GENERIC, "No default OCG config"); } else { - cobj = pdf_array_get(pdf_dict_gets(obj, "Configs"), config); + cobj = pdf_array_get(ctx, pdf_dict_gets(ctx, obj, "Configs"), config); if (!cobj) - fz_throw(doc->ctx, FZ_ERROR_GENERIC, "Illegal OCG config"); + fz_throw(ctx, FZ_ERROR_GENERIC, "Illegal OCG config"); } - pdf_drop_obj(desc->intent); - desc->intent = pdf_dict_gets(cobj, "Intent"); + pdf_drop_obj(ctx, desc->intent); + desc->intent = pdf_dict_gets(ctx, cobj, "Intent"); if (desc->intent) - pdf_keep_obj(desc->intent); + pdf_keep_obj(ctx, desc->intent); len = desc->len; - name = pdf_to_name(pdf_dict_gets(cobj, "BaseState")); + name = pdf_to_name(ctx, pdf_dict_gets(ctx, cobj, "BaseState")); if (strcmp(name, "Unchanged") == 0) { /* Do nothing */ @@ -1212,13 +1201,13 @@ pdf_ocg_set_config(pdf_document *doc, int config) } } - obj = pdf_dict_gets(cobj, "ON"); - len2 = pdf_array_len(obj); + obj = pdf_dict_gets(ctx, cobj, "ON"); + len2 = pdf_array_len(ctx, obj); for (i = 0; i < len2; i++) { - pdf_obj *o = pdf_array_get(obj, i); - int n = pdf_to_num(o); - int g = pdf_to_gen(o); + pdf_obj *o = pdf_array_get(ctx, obj, i); + int n = pdf_to_num(ctx, o); + int g = pdf_to_gen(ctx, o); for (j=0; j < len; j++) { if (desc->ocgs[j].num == n && desc->ocgs[j].gen == g) @@ -1229,13 +1218,13 @@ pdf_ocg_set_config(pdf_document *doc, int config) } } - obj = pdf_dict_gets(cobj, "OFF"); - len2 = pdf_array_len(obj); + obj = pdf_dict_gets(ctx, cobj, "OFF"); + len2 = pdf_array_len(ctx, obj); for (i = 0; i < len2; i++) { - pdf_obj *o = pdf_array_get(obj, i); - int n = pdf_to_num(o); - int g = pdf_to_gen(o); + pdf_obj *o = pdf_array_get(ctx, obj, i); + int n = pdf_to_num(ctx, o); + int g = pdf_to_gen(ctx, o); for (j=0; j < len; j++) { if (desc->ocgs[j].num == n && desc->ocgs[j].gen == g) @@ -1262,23 +1251,22 @@ pdf_ocg_set_config(pdf_document *doc, int config) } static void -pdf_read_ocg(pdf_document *doc) +pdf_read_ocg(fz_context *ctx, pdf_document *doc) { pdf_obj *obj, *ocg; int len, i; pdf_ocg_descriptor *desc; - fz_context *ctx = doc->ctx; fz_var(desc); - obj = pdf_dict_gets(pdf_dict_gets(pdf_trailer(doc), "Root"), "OCProperties"); + obj = pdf_dict_gets(ctx, pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Root"), "OCProperties"); if (!obj) return; - ocg = pdf_dict_gets(obj, "OCGs"); - if (!ocg || !pdf_is_array(ocg)) + ocg = pdf_dict_gets(ctx, obj, "OCGs"); + if (!ocg || !pdf_is_array(ctx, ocg)) /* Not ever supposed to happen, but live with it. */ return; - len = pdf_array_len(ocg); + len = pdf_array_len(ctx, ocg); fz_try(ctx) { desc = fz_calloc(ctx, 1, sizeof(*desc)); @@ -1287,9 +1275,9 @@ pdf_read_ocg(pdf_document *doc) desc->intent = NULL; for (i=0; i < len; i++) { - pdf_obj *o = pdf_array_get(ocg, i); - desc->ocgs[i].num = pdf_to_num(o); - desc->ocgs[i].gen = pdf_to_gen(o); + pdf_obj *o = pdf_array_get(ctx, ocg, i); + desc->ocgs[i].num = pdf_to_num(ctx, o); + desc->ocgs[i].gen = pdf_to_gen(ctx, o); desc->ocgs[i].state = 1; } doc->ocg = desc; @@ -1302,7 +1290,7 @@ pdf_read_ocg(pdf_document *doc) fz_rethrow(ctx); } - pdf_ocg_set_config(doc, 0); + pdf_ocg_set_config(ctx, doc, 0); } static void @@ -1311,7 +1299,7 @@ pdf_drop_ocg(fz_context *ctx, pdf_ocg_descriptor *desc) if (!desc) return; - pdf_drop_obj(desc->intent); + pdf_drop_obj(ctx, desc->intent); fz_free(ctx, desc->ocgs); fz_free(ctx, desc); } @@ -1322,9 +1310,8 @@ pdf_drop_ocg(fz_context *ctx, pdf_ocg_descriptor *desc) */ static void -pdf_init_document(pdf_document *doc) +pdf_init_document(fz_context *ctx, pdf_document *doc) { - fz_context *ctx = doc->ctx; pdf_obj *encrypt, *id; pdf_obj *dict = NULL; pdf_obj *obj; @@ -1336,30 +1323,30 @@ pdf_init_document(pdf_document *doc) fz_try(ctx) { - pdf_load_version(doc); + pdf_load_version(ctx, doc); - doc->file_length = fz_stream_meta(doc->file, FZ_STREAM_META_LENGTH, 0, NULL); + doc->file_length = fz_stream_meta(ctx, doc->file, FZ_STREAM_META_LENGTH, 0, NULL); if (doc->file_length < 0) doc->file_length = 0; /* Check to see if we should work in progressive mode */ - if (fz_stream_meta(doc->file, FZ_STREAM_META_PROGRESSIVE, 0, NULL) > 0) + if (fz_stream_meta(ctx, doc->file, FZ_STREAM_META_PROGRESSIVE, 0, NULL) > 0) doc->file_reading_linearly = 1; /* Try to load the linearized file if we are in progressive * mode. */ if (doc->file_reading_linearly) - pdf_load_linear(doc); + pdf_load_linear(ctx, doc); /* If we aren't in progressive mode (or the linear load failed * and has set us back to non-progressive mode), load normally. */ if (!doc->file_reading_linearly) - pdf_load_xref(doc, &doc->lexbuf.base); + pdf_load_xref(ctx, doc, &doc->lexbuf.base); } fz_catch(ctx) { - pdf_drop_xref_sections(doc); + pdf_drop_xref_sections(ctx, doc); fz_rethrow_if(ctx, FZ_ERROR_TRYLATER); fz_warn(ctx, "trying to repair broken xref"); repaired = 1; @@ -1373,35 +1360,35 @@ pdf_init_document(pdf_document *doc) { /* pdf_repair_xref may access xref_index, so reset it properly */ memset(doc->xref_index, 0, sizeof(int) * doc->max_xref_len); - pdf_repair_xref(doc); - pdf_prime_xref_index(doc); + pdf_repair_xref(ctx, doc); + pdf_prime_xref_index(ctx, doc); } - encrypt = pdf_dict_gets(pdf_trailer(doc), "Encrypt"); - id = pdf_dict_gets(pdf_trailer(doc), "ID"); - if (pdf_is_dict(encrypt)) + encrypt = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Encrypt"); + id = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "ID"); + if (pdf_is_dict(ctx, encrypt)) doc->crypt = pdf_new_crypt(ctx, encrypt, id); /* Allow lazy clients to read encrypted files with a blank password */ - pdf_authenticate_password(doc, ""); + pdf_authenticate_password(ctx, doc, ""); if (repaired) { - int xref_len = pdf_xref_len(doc); - pdf_repair_obj_stms(doc); + int xref_len = pdf_xref_len(ctx, doc); + pdf_repair_obj_stms(ctx, doc); - hasroot = (pdf_dict_gets(pdf_trailer(doc), "Root") != NULL); - hasinfo = (pdf_dict_gets(pdf_trailer(doc), "Info") != NULL); + hasroot = (pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Root") != NULL); + hasinfo = (pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Info") != NULL); for (i = 1; i < xref_len; i++) { - pdf_xref_entry *entry = pdf_get_xref_entry(doc, i); + pdf_xref_entry *entry = pdf_get_xref_entry(ctx, doc, i); if (entry->type == 0 || entry->type == 'f') continue; fz_try(ctx) { - dict = pdf_load_object(doc, i, 0); + dict = pdf_load_object(ctx, doc, i, 0); } fz_catch(ctx) { @@ -1412,46 +1399,46 @@ pdf_init_document(pdf_document *doc) if (!hasroot) { - obj = pdf_dict_gets(dict, "Type"); - if (pdf_is_name(obj) && !strcmp(pdf_to_name(obj), "Catalog")) + obj = pdf_dict_gets(ctx, dict, "Type"); + if (pdf_is_name(ctx, obj) && !strcmp(pdf_to_name(ctx, obj), "Catalog")) { - nobj = pdf_new_indirect(doc, i, 0); - pdf_dict_puts(pdf_trailer(doc), "Root", nobj); - pdf_drop_obj(nobj); + nobj = pdf_new_indirect(ctx, doc, i, 0); + pdf_dict_puts(ctx, pdf_trailer(ctx, doc), "Root", nobj); + pdf_drop_obj(ctx, nobj); nobj = NULL; } } if (!hasinfo) { - if (pdf_dict_gets(dict, "Creator") || pdf_dict_gets(dict, "Producer")) + if (pdf_dict_gets(ctx, dict, "Creator") || pdf_dict_gets(ctx, dict, "Producer")) { - nobj = pdf_new_indirect(doc, i, 0); - pdf_dict_puts(pdf_trailer(doc), "Info", nobj); - pdf_drop_obj(nobj); + nobj = pdf_new_indirect(ctx, doc, i, 0); + pdf_dict_puts(ctx, pdf_trailer(ctx, doc), "Info", nobj); + pdf_drop_obj(ctx, nobj); nobj = NULL; } } - pdf_drop_obj(dict); + pdf_drop_obj(ctx, dict); dict = NULL; } /* ensure that strings are not used in their repaired, non-decrypted form */ if (doc->crypt) - pdf_clear_xref(doc); + pdf_clear_xref(ctx, doc); } } fz_catch(ctx) { - pdf_drop_obj(dict); - pdf_drop_obj(nobj); + pdf_drop_obj(ctx, dict); + pdf_drop_obj(ctx, nobj); fz_rethrow_message(ctx, "cannot open document"); } fz_try(ctx) { - pdf_read_ocg(doc); + pdf_read_ocg(ctx, doc); } fz_catch(ctx) { @@ -1461,8 +1448,8 @@ pdf_init_document(pdf_document *doc) fz_try(ctx) { char *version_str; - obj = pdf_dict_getp(pdf_trailer(doc), "Root/Version"); - version_str = pdf_to_name(obj); + obj = pdf_dict_getp(ctx, pdf_trailer(ctx, doc), "Root/Version"); + version_str = pdf_to_name(ctx, obj); if (*version_str) { int version = 10 * (fz_atof(version_str) + 0.05); @@ -1474,15 +1461,13 @@ pdf_init_document(pdf_document *doc) } void -pdf_close_document(pdf_document *doc) +pdf_close_document(fz_context *ctx, pdf_document *doc) { - fz_context *ctx; pdf_unsaved_sig *usig; int i; if (!doc) return; - ctx = doc->ctx; /* Type3 glyphs in the glyph cache can contain pdf_obj pointers * that we are about to destroy. Simplest solution is to bin the @@ -1492,22 +1477,22 @@ pdf_close_document(pdf_document *doc) if (doc->js) doc->drop_js(doc->js); - pdf_drop_xref_sections(doc); + pdf_drop_xref_sections(ctx, doc); fz_free(ctx, doc->xref_index); if (doc->focus_obj) - pdf_drop_obj(doc->focus_obj); + pdf_drop_obj(ctx, doc->focus_obj); if (doc->file) - fz_drop_stream(doc->file); + fz_drop_stream(ctx, doc->file); if (doc->crypt) pdf_drop_crypt(ctx, doc->crypt); - pdf_drop_obj(doc->linear_obj); + pdf_drop_obj(ctx, doc->linear_obj); if (doc->linear_page_refs) { for (i=0; i < doc->page_count; i++) { - pdf_drop_obj(doc->linear_page_refs[i]); + pdf_drop_obj(ctx, doc->linear_page_refs[i]); } fz_free(ctx, doc->linear_page_refs); } @@ -1519,8 +1504,8 @@ pdf_close_document(pdf_document *doc) while ((usig = doc->unsaved_sigs) != NULL) { doc->unsaved_sigs = usig->next; - pdf_drop_obj(usig->field); - pdf_drop_signer(usig->signer); + pdf_drop_obj(ctx, usig->field); + pdf_drop_signer(ctx, usig->signer); fz_free(ctx, usig); } @@ -1535,20 +1520,20 @@ pdf_close_document(pdf_document *doc) fz_empty_store(ctx); - pdf_lexbuf_fin(&doc->lexbuf.base); + pdf_lexbuf_fin(ctx, &doc->lexbuf.base); fz_free(ctx, doc); } void -pdf_print_xref(pdf_document *doc) +pdf_print_xref(fz_context *ctx, pdf_document *doc) { int i; - int xref_len = pdf_xref_len(doc); + int xref_len = pdf_xref_len(ctx, doc); printf("xref\n0 %d\n", xref_len); for (i = 0; i < xref_len; i++) { - pdf_xref_entry *entry = pdf_get_xref_entry(doc, i); + pdf_xref_entry *entry = pdf_get_xref_entry(ctx, doc, i); printf("%05d: %010d %05d %c (stm_ofs=%d; stm_buf=%p)\n", i, entry->ofs, entry->gen, @@ -1563,7 +1548,7 @@ pdf_print_xref(pdf_document *doc) */ static pdf_xref_entry * -pdf_load_obj_stm(pdf_document *doc, int num, int gen, pdf_lexbuf *buf, int target) +pdf_load_obj_stm(fz_context *ctx, pdf_document *doc, int num, int gen, pdf_lexbuf *buf, int target) { fz_stream *stm = NULL; pdf_obj *objstm = NULL; @@ -1575,7 +1560,6 @@ pdf_load_obj_stm(pdf_document *doc, int num, int gen, pdf_lexbuf *buf, int targe int count; int i; pdf_token tok; - fz_context *ctx = doc->ctx; pdf_xref_entry *ret_entry = NULL; fz_var(numbuf); @@ -1585,10 +1569,10 @@ pdf_load_obj_stm(pdf_document *doc, int num, int gen, pdf_lexbuf *buf, int targe fz_try(ctx) { - objstm = pdf_load_object(doc, num, gen); + objstm = pdf_load_object(ctx, doc, num, gen); - count = pdf_to_int(pdf_dict_gets(objstm, "N")); - first = pdf_to_int(pdf_dict_gets(objstm, "First")); + count = pdf_to_int(ctx, pdf_dict_gets(ctx, objstm, "N")); + first = pdf_to_int(ctx, pdf_dict_gets(ctx, objstm, "First")); if (count < 0) fz_throw(ctx, FZ_ERROR_GENERIC, "negative number of objects in object stream"); @@ -1598,39 +1582,39 @@ pdf_load_obj_stm(pdf_document *doc, int num, int gen, pdf_lexbuf *buf, int targe numbuf = fz_calloc(ctx, count, sizeof(int)); ofsbuf = fz_calloc(ctx, count, sizeof(int)); - stm = pdf_open_stream(doc, num, gen); + stm = pdf_open_stream(ctx, doc, num, gen); for (i = 0; i < count; i++) { - tok = pdf_lex(stm, buf); + tok = pdf_lex(ctx, stm, buf); if (tok != PDF_TOK_INT) fz_throw(ctx, FZ_ERROR_GENERIC, "corrupt object stream (%d %d R)", num, gen); numbuf[i] = buf->i; - tok = pdf_lex(stm, buf); + tok = pdf_lex(ctx, stm, buf); if (tok != PDF_TOK_INT) fz_throw(ctx, FZ_ERROR_GENERIC, "corrupt object stream (%d %d R)", num, gen); ofsbuf[i] = buf->i; } - fz_seek(stm, first, SEEK_SET); + fz_seek(ctx, stm, first, SEEK_SET); for (i = 0; i < count; i++) { - int xref_len = pdf_xref_len(doc); + int xref_len = pdf_xref_len(ctx, doc); pdf_xref_entry *entry; - fz_seek(stm, first + ofsbuf[i], SEEK_SET); + fz_seek(ctx, stm, first + ofsbuf[i], SEEK_SET); - obj = pdf_parse_stm_obj(doc, stm, buf); + obj = pdf_parse_stm_obj(ctx, doc, stm, buf); if (numbuf[i] <= 0 || numbuf[i] >= xref_len) { - pdf_drop_obj(obj); + pdf_drop_obj(ctx, obj); fz_throw(ctx, FZ_ERROR_GENERIC, "object id (%d 0 R) out of range (0..%d)", numbuf[i], xref_len - 1); } - entry = pdf_get_xref_entry(doc, numbuf[i]); + entry = pdf_get_xref_entry(ctx, doc, numbuf[i]); - pdf_set_obj_parent(obj, numbuf[i]); + pdf_set_obj_parent(ctx, obj, numbuf[i]); if (entry->type == 'o' && entry->ofs == num) { @@ -1642,9 +1626,9 @@ pdf_load_obj_stm(pdf_document *doc, int num, int gen, pdf_lexbuf *buf, int targe * and trust that the old one is correct. */ if (entry->obj) { - if (pdf_objcmp(entry->obj, obj)) + if (pdf_objcmp(ctx, entry->obj, obj)) fz_warn(ctx, "Encountered new definition for object %d - keeping the original one", numbuf[i]); - pdf_drop_obj(obj); + pdf_drop_obj(ctx, obj); } else entry->obj = obj; @@ -1653,16 +1637,16 @@ pdf_load_obj_stm(pdf_document *doc, int num, int gen, pdf_lexbuf *buf, int targe } else { - pdf_drop_obj(obj); + pdf_drop_obj(ctx, obj); } } } fz_always(ctx) { - fz_drop_stream(stm); + fz_drop_stream(ctx, stm); fz_free(ctx, ofsbuf); fz_free(ctx, numbuf); - pdf_drop_obj(objstm); + pdf_drop_obj(ctx, objstm); } fz_catch(ctx) { @@ -1675,21 +1659,20 @@ pdf_load_obj_stm(pdf_document *doc, int num, int gen, pdf_lexbuf *buf, int targe * object loading */ static int -pdf_obj_read(pdf_document *doc, int *offset, int *nump, pdf_obj **page) +pdf_obj_read(fz_context *ctx, pdf_document *doc, int *offset, int *nump, pdf_obj **page) { - int num, numofs, gen, genofs, stmofs, tmpofs, tok; pdf_lexbuf *buf = &doc->lexbuf.base; - fz_context *ctx = doc->ctx; + int num, numofs, gen, genofs, stmofs, tmpofs, tok; int xref_len; pdf_xref_entry *entry; int newtmpofs; numofs = *offset; - fz_seek(doc->file, numofs, SEEK_SET); + fz_seek(ctx, doc->file, numofs, SEEK_SET); /* We expect to read 'num' here */ - tok = pdf_lex(doc->file, buf); - genofs = fz_tell(doc->file); + tok = pdf_lex(ctx, doc->file, buf); + genofs = fz_tell(ctx, doc->file); if (tok != PDF_TOK_INT) { /* Failed! */ @@ -1700,8 +1683,8 @@ pdf_obj_read(pdf_document *doc, int *offset, int *nump, pdf_obj **page) *nump = num = buf->i; /* We expect to read 'gen' here */ - tok = pdf_lex(doc->file, buf); - tmpofs = fz_tell(doc->file); + tok = pdf_lex(ctx, doc->file, buf); + tmpofs = fz_tell(ctx, doc->file); if (tok != PDF_TOK_INT) { /* Failed! */ @@ -1714,14 +1697,14 @@ pdf_obj_read(pdf_document *doc, int *offset, int *nump, pdf_obj **page) /* We expect to read 'obj' here */ do { - tmpofs = fz_tell(doc->file); - tok = pdf_lex(doc->file, buf); + tmpofs = fz_tell(ctx, doc->file); + tok = pdf_lex(ctx, doc->file, buf); if (tok == PDF_TOK_OBJ) break; if (tok != PDF_TOK_INT) { DEBUGMESS((ctx, "skipping unexpected data (tok=%d) at %d", tok, tmpofs)); - *offset = fz_tell(doc->file); + *offset = fz_tell(ctx, doc->file); return tok == PDF_TOK_EOF; } DEBUGMESS((ctx, "skipping unexpected int %d at %d", num, numofs)); @@ -1733,7 +1716,7 @@ pdf_obj_read(pdf_document *doc, int *offset, int *nump, pdf_obj **page) while (1); /* Now we read the actual object */ - xref_len = pdf_xref_len(doc); + xref_len = pdf_xref_len(ctx, doc); /* When we are reading a progressive file, we typically see: * File Header @@ -1751,7 +1734,7 @@ pdf_obj_read(pdf_document *doc, int *offset, int *nump, pdf_obj **page) * whenever we read an object it should just go into the * previous xref. */ - tok = pdf_repair_obj(doc, buf, &stmofs, NULL, NULL, NULL, page, &newtmpofs); + tok = pdf_repair_obj(ctx, doc, buf, &stmofs, NULL, NULL, NULL, page, &newtmpofs); do /* So we can break out of it */ { @@ -1764,7 +1747,7 @@ pdf_obj_read(pdf_document *doc, int *offset, int *nump, pdf_obj **page) { fz_warn(ctx, "Unexpected non zero generation number in linearized file"); } - entry = pdf_get_populating_xref_entry(doc, num); + entry = pdf_get_populating_xref_entry(ctx, doc, num); if (entry->type != 0) { DEBUGMESS((ctx, "Duplicate object found (%d %d obj)", num, gen)); @@ -1774,10 +1757,10 @@ pdf_obj_read(pdf_document *doc, int *offset, int *nump, pdf_obj **page) { DEBUGMESS((ctx, "Successfully read object %d @ %d - and found page %d!", num, numofs, doc->linear_page_num)); if (!entry->obj) - entry->obj = pdf_keep_obj(*page); + entry->obj = pdf_keep_obj(ctx, *page); if (doc->linear_page_refs[doc->linear_page_num] == NULL) - doc->linear_page_refs[doc->linear_page_num] = pdf_new_indirect(doc, num, gen); + doc->linear_page_refs[doc->linear_page_num] = pdf_new_indirect(ctx, doc, num, gen); } else { @@ -1794,7 +1777,7 @@ pdf_obj_read(pdf_document *doc, int *offset, int *nump, pdf_obj **page) if (tok == PDF_TOK_ENDOBJ) { - *offset = fz_tell(doc->file); + *offset = fz_tell(ctx, doc->file); } else { @@ -1804,9 +1787,8 @@ pdf_obj_read(pdf_document *doc, int *offset, int *nump, pdf_obj **page) } static void -pdf_load_hinted_page(pdf_document *doc, int pagenum) +pdf_load_hinted_page(fz_context *ctx, pdf_document *doc, int pagenum) { - fz_context *ctx = doc->ctx; if (!doc->hints_loaded || !doc->linear_page_refs) return; @@ -1817,14 +1799,14 @@ pdf_load_hinted_page(pdf_document *doc, int pagenum) fz_try(ctx) { int num = doc->hint_page[pagenum].number; - pdf_obj *page = pdf_load_object(doc, num, 0); - if (!strcmp("Page", pdf_to_name(pdf_dict_gets(page, "Type")))) + pdf_obj *page = pdf_load_object(ctx, doc, num, 0); + if (!strcmp("Page", pdf_to_name(ctx, pdf_dict_gets(ctx, page, "Type")))) { /* We have found the page object! */ DEBUGMESS((ctx, "LoadHintedPage pagenum=%d num=%d", pagenum, num)); - doc->linear_page_refs[pagenum] = pdf_new_indirect(doc, num, 0); + doc->linear_page_refs[pagenum] = pdf_new_indirect(ctx, doc, num, 0); } - pdf_drop_obj(page); + pdf_drop_obj(ctx, page); } fz_catch(ctx) { @@ -1835,12 +1817,11 @@ pdf_load_hinted_page(pdf_document *doc, int pagenum) } static int -read_hinted_object(pdf_document *doc, int num) +read_hinted_object(fz_context *ctx, pdf_document *doc, int num) { /* Try to find the object using our hint table. Find the closest * object <= the one we want that has a hint and read forward from * there. */ - fz_context *ctx = doc->ctx; int expected = num; int curr_pos; int start, offset; @@ -1852,7 +1833,7 @@ read_hinted_object(pdf_document *doc, int num) if (expected == 0) /* No hints found, just bale */ return 0; - curr_pos = fz_tell(doc->file); + curr_pos = fz_tell(ctx, doc->file); offset = doc->hint_obj_offsets[expected]; fz_var(expected); @@ -1866,7 +1847,7 @@ read_hinted_object(pdf_document *doc, int num) { start = offset; DEBUGMESS((ctx, "Searching for object %d @ %d", expected, offset)); - pdf_obj_read(doc, &offset, &found, 0); + pdf_obj_read(ctx, doc, &offset, &found, 0); DEBUGMESS((ctx, "Found object %d - next will be @ %d", found, offset)); if (found <= expected) { @@ -1894,7 +1875,7 @@ read_hinted_object(pdf_document *doc, int num) } fz_always(ctx) { - fz_seek(doc->file, curr_pos, SEEK_SET); + fz_seek(ctx, doc->file, curr_pos, SEEK_SET); } fz_catch(ctx) { @@ -1908,37 +1889,36 @@ read_hinted_object(pdf_document *doc, int num) } pdf_xref_entry * -pdf_cache_object(pdf_document *doc, int num, int gen) +pdf_cache_object(fz_context *ctx, pdf_document *doc, int num, int gen) { pdf_xref_entry *x; int rnum, rgen, try_repair; - fz_context *ctx = doc->ctx; fz_var(try_repair); - if (num <= 0 || num >= pdf_xref_len(doc)) - fz_throw(ctx, FZ_ERROR_GENERIC, "object out of range (%d %d R); xref size %d", num, gen, pdf_xref_len(doc)); + if (num <= 0 || num >= pdf_xref_len(ctx, doc)) + fz_throw(ctx, FZ_ERROR_GENERIC, "object out of range (%d %d R); xref size %d", num, gen, pdf_xref_len(ctx, doc)); object_updated: try_repair = 0; rnum = num; - x = pdf_get_xref_entry(doc, num); + x = pdf_get_xref_entry(ctx, doc, num); if (x->obj != NULL) return x; if (x->type == 'f') { - x->obj = pdf_new_null(doc); + x->obj = pdf_new_null(ctx, doc); } else if (x->type == 'n') { - fz_seek(doc->file, x->ofs, SEEK_SET); + fz_seek(ctx, doc->file, x->ofs, SEEK_SET); fz_try(ctx) { - x->obj = pdf_parse_ind_obj(doc, doc->file, &doc->lexbuf.base, + x->obj = pdf_parse_ind_obj(ctx, doc, doc->file, &doc->lexbuf.base, &rnum, &rgen, &x->stm_ofs, &try_repair); } fz_catch(ctx) @@ -1949,7 +1929,7 @@ object_updated: if (!try_repair && rnum != num) { - pdf_drop_obj(x->obj); + pdf_drop_obj(ctx, x->obj); x->obj = NULL; try_repair = 1; } @@ -1958,8 +1938,8 @@ object_updated: { fz_try(ctx) { - pdf_repair_xref(doc); - pdf_prime_xref_index(doc); + pdf_repair_xref(ctx, doc); + pdf_prime_xref_index(ctx, doc); } fz_catch(ctx) { @@ -1980,7 +1960,7 @@ object_updated: { fz_try(ctx) { - x = pdf_load_obj_stm(doc, x->ofs, 0, &doc->lexbuf.base, num); + x = pdf_load_obj_stm(ctx, doc, x->ofs, 0, &doc->lexbuf.base, num); } fz_catch(ctx) { @@ -1992,7 +1972,7 @@ object_updated: fz_throw(ctx, FZ_ERROR_GENERIC, "object (%d %d R) was not found in its object stream", num, gen); } } - else if (doc->hint_obj_offsets && read_hinted_object(doc, num)) + else if (doc->hint_obj_offsets && read_hinted_object(ctx, doc, num)) { goto object_updated; } @@ -2005,19 +1985,18 @@ object_updated: fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find object in xref (%d %d R)", num, gen); } - pdf_set_obj_parent(x->obj, num); + pdf_set_obj_parent(ctx, x->obj, num); return x; } pdf_obj * -pdf_load_object(pdf_document *doc, int num, int gen) +pdf_load_object(fz_context *ctx, pdf_document *doc, int num, int gen) { - fz_context *ctx = doc->ctx; pdf_xref_entry *entry; fz_try(ctx) { - entry = pdf_cache_object(doc, num, gen); + entry = pdf_cache_object(ctx, doc, num, gen); } fz_catch(ctx) { @@ -2026,32 +2005,32 @@ pdf_load_object(pdf_document *doc, int num, int gen) assert(entry->obj != NULL); - return pdf_keep_obj(entry->obj); + return pdf_keep_obj(ctx, entry->obj); } pdf_obj * -pdf_resolve_indirect(pdf_obj *ref) +pdf_resolve_indirect(fz_context *ctx, pdf_obj *ref) { int sanity = 10; int num; int gen; - fz_context *ctx = NULL; /* Avoid warning for stupid compilers */ - pdf_document *doc; pdf_xref_entry *entry; - while (pdf_is_indirect(ref)) + while (pdf_is_indirect(ctx, ref)) { + pdf_document *doc; + if (--sanity == 0) { fz_warn(ctx, "too many indirections (possible indirection cycle involving %d %d R)", num, gen); return NULL; } - doc = pdf_get_indirect_document(ref); + + doc = pdf_get_indirect_document(ctx, ref); if (!doc) return NULL; - ctx = doc->ctx; - num = pdf_to_num(ref); - gen = pdf_to_gen(ref); + num = pdf_to_num(ctx, ref); + gen = pdf_to_gen(ctx, ref); if (num <= 0 || gen < 0) { @@ -2061,7 +2040,7 @@ pdf_resolve_indirect(pdf_obj *ref) fz_try(ctx) { - entry = pdf_cache_object(doc, num, gen); + entry = pdf_cache_object(ctx, doc, num, gen); } fz_catch(ctx) { @@ -2079,18 +2058,18 @@ pdf_resolve_indirect(pdf_obj *ref) } int -pdf_count_objects(pdf_document *doc) +pdf_count_objects(fz_context *ctx, pdf_document *doc) { - return pdf_xref_len(doc); + return pdf_xref_len(ctx, doc); } int -pdf_create_object(pdf_document *doc) +pdf_create_object(fz_context *ctx, pdf_document *doc) { /* TODO: reuse free object slots by properly linking free object chains in the ofs field */ pdf_xref_entry *entry; - int num = pdf_xref_len(doc); - entry = pdf_get_incremental_xref_entry(doc, num); + int num = pdf_xref_len(ctx, doc); + entry = pdf_get_incremental_xref_entry(ctx, doc, num); entry->type = 'f'; entry->ofs = -1; entry->gen = 0; @@ -2101,20 +2080,20 @@ pdf_create_object(pdf_document *doc) } void -pdf_delete_object(pdf_document *doc, int num) +pdf_delete_object(fz_context *ctx, pdf_document *doc, int num) { pdf_xref_entry *x; - if (num <= 0 || num >= pdf_xref_len(doc)) + if (num <= 0 || num >= pdf_xref_len(ctx, doc)) { - fz_warn(doc->ctx, "object out of range (%d 0 R); xref size %d", num, pdf_xref_len(doc)); + fz_warn(ctx, "object out of range (%d 0 R); xref size %d", num, pdf_xref_len(ctx, doc)); return; } - x = pdf_get_incremental_xref_entry(doc, num); + x = pdf_get_incremental_xref_entry(ctx, doc, num); - fz_drop_buffer(doc->ctx, x->stm_buf); - pdf_drop_obj(x->obj); + fz_drop_buffer(ctx, x->stm_buf); + pdf_drop_obj(ctx, x->obj); x->type = 'f'; x->ofs = 0; @@ -2125,46 +2104,46 @@ pdf_delete_object(pdf_document *doc, int num) } void -pdf_update_object(pdf_document *doc, int num, pdf_obj *newobj) +pdf_update_object(fz_context *ctx, pdf_document *doc, int num, pdf_obj *newobj) { pdf_xref_entry *x; - if (num <= 0 || num >= pdf_xref_len(doc)) + if (num <= 0 || num >= pdf_xref_len(ctx, doc)) { - fz_warn(doc->ctx, "object out of range (%d 0 R); xref size %d", num, pdf_xref_len(doc)); + fz_warn(ctx, "object out of range (%d 0 R); xref size %d", num, pdf_xref_len(ctx, doc)); return; } - x = pdf_get_incremental_xref_entry(doc, num); + x = pdf_get_incremental_xref_entry(ctx, doc, num); - pdf_drop_obj(x->obj); + pdf_drop_obj(ctx, x->obj); x->type = 'n'; x->ofs = 0; - x->obj = pdf_keep_obj(newobj); + x->obj = pdf_keep_obj(ctx, newobj); - pdf_set_obj_parent(newobj, num); + pdf_set_obj_parent(ctx, newobj, num); } void -pdf_update_stream(pdf_document *doc, int num, fz_buffer *newbuf) +pdf_update_stream(fz_context *ctx, pdf_document *doc, int num, fz_buffer *newbuf) { pdf_xref_entry *x; - if (num <= 0 || num >= pdf_xref_len(doc)) + if (num <= 0 || num >= pdf_xref_len(ctx, doc)) { - fz_warn(doc->ctx, "object out of range (%d 0 R); xref size %d", num, pdf_xref_len(doc)); + fz_warn(ctx, "object out of range (%d 0 R); xref size %d", num, pdf_xref_len(ctx, doc)); return; } - x = pdf_get_xref_entry(doc, num); + x = pdf_get_xref_entry(ctx, doc, num); - fz_drop_buffer(doc->ctx, x->stm_buf); - x->stm_buf = fz_keep_buffer(doc->ctx, newbuf); + fz_drop_buffer(ctx, x->stm_buf); + x->stm_buf = fz_keep_buffer(ctx, newbuf); } int -pdf_meta(pdf_document *doc, int key, void *ptr, int size) +pdf_meta(fz_context *ctx, pdf_document *doc, int key, void *ptr, int size) { switch (key) { @@ -2179,10 +2158,10 @@ pdf_meta(pdf_document *doc, int key, void *ptr, int size) case FZ_META_CRYPT_INFO: if (doc->crypt) sprintf((char *)ptr, "Standard V%d R%d %d-bit %s", - pdf_crypt_version(doc), - pdf_crypt_revision(doc), - pdf_crypt_length(doc), - pdf_crypt_method(doc)); + pdf_crypt_version(ctx, doc), + pdf_crypt_revision(ctx, doc), + pdf_crypt_length(ctx, doc), + pdf_crypt_method(ctx, doc)); else sprintf((char *)ptr, "None"); return FZ_META_OK; @@ -2206,18 +2185,18 @@ pdf_meta(pdf_document *doc, int key, void *ptr, int size) default: return 0; } - return pdf_has_permission(doc, i); + return pdf_has_permission(ctx, doc, i); } case FZ_META_INFO: { - pdf_obj *info = pdf_dict_gets(pdf_trailer(doc), "Info"); + pdf_obj *info = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Info"); if (!info) { if (ptr) *(char *)ptr = 0; return 0; } - info = pdf_dict_gets(info, *(char **)ptr); + info = pdf_dict_gets(ctx, info, *(char **)ptr); if (!info) { if (ptr) @@ -2226,9 +2205,9 @@ pdf_meta(pdf_document *doc, int key, void *ptr, int size) } if (info && ptr && size) { - char *utf8 = pdf_to_utf8(doc, info); + char *utf8 = pdf_to_utf8(ctx, doc, info); fz_strlcpy(ptr, utf8, size); - fz_free(doc->ctx, utf8); + fz_free(ctx, utf8); } return 1; } @@ -2238,7 +2217,7 @@ pdf_meta(pdf_document *doc, int key, void *ptr, int size) } fz_transition * -pdf_page_presentation(pdf_document *doc, pdf_page *page, float *duration) +pdf_page_presentation(fz_context *ctx, pdf_page *page, float *duration) { *duration = page->duration; if (!page->transition_present) @@ -2246,13 +2225,6 @@ pdf_page_presentation(pdf_document *doc, pdf_page *page, float *duration) return &page->transition; } -static void -pdf_rebind(pdf_document *doc, fz_context *ctx) -{ - doc->ctx = ctx; - fz_rebind_stream(doc->file, ctx); -} - /* Initializers for the fz_document interface. @@ -2275,22 +2247,11 @@ pdf_new_document(fz_context *ctx, fz_stream *file) doc->super.load_outline = (fz_document_load_outline_fn *)pdf_load_outline; doc->super.count_pages = (fz_document_count_pages_fn *)pdf_count_pages; doc->super.load_page = (fz_document_load_page_fn *)pdf_load_page; - doc->super.load_links = (fz_document_load_links_fn *)pdf_load_links; - doc->super.bound_page = (fz_document_bound_page_fn *)pdf_bound_page; - doc->super.first_annot = (fz_document_first_annot_fn *)pdf_first_annot; - doc->super.next_annot = (fz_document_next_annot_fn *)pdf_next_annot; - doc->super.bound_annot = (fz_document_bound_annot_fn *)pdf_bound_annot; - doc->super.run_page_contents = NULL; /* see pdf_xref_aux.c */ - doc->super.run_annot = NULL; /* see pdf_xref_aux.c */ - doc->super.free_page = (fz_document_free_page_fn *)pdf_drop_page; doc->super.meta = (fz_document_meta_fn *)pdf_meta; - doc->super.page_presentation = (fz_document_page_presentation_fn *)pdf_page_presentation; doc->super.write = (fz_document_write_fn *)pdf_write_document; - doc->super.rebind = (fz_document_rebind_fn *)pdf_rebind; pdf_lexbuf_init(ctx, &doc->lexbuf.base, PDF_LEXBUF_LARGE); - doc->file = fz_keep_stream(file); - doc->ctx = ctx; + doc->file = fz_keep_stream(ctx, file); return doc; } @@ -2299,16 +2260,13 @@ pdf_document * pdf_open_document_no_run_with_stream(fz_context *ctx, fz_stream *file) { pdf_document *doc = pdf_new_document(ctx, file); - - fz_var(doc); - fz_try(ctx) { - pdf_init_document(doc); + pdf_init_document(ctx, doc); } fz_catch(ctx) { - pdf_close_document(doc); + pdf_close_document(ctx, doc); fz_rethrow_message(ctx, "cannot load document from stream"); } return doc; @@ -2327,26 +2285,25 @@ pdf_open_document_no_run(fz_context *ctx, const char *filename) { file = fz_open_file(ctx, filename); doc = pdf_new_document(ctx, file); - pdf_init_document(doc); + pdf_init_document(ctx, doc); } fz_always(ctx) { - fz_drop_stream(file); + fz_drop_stream(ctx, file); } fz_catch(ctx) { - pdf_close_document(doc); + pdf_close_document(ctx, doc); fz_rethrow_message(ctx, "cannot load document '%s'", filename); } return doc; } static void -pdf_load_hints(pdf_document *doc, int objnum, int gennum) +pdf_load_hints(fz_context *ctx, pdf_document *doc, int objnum, int gennum) { fz_stream *stream = NULL; pdf_obj *dict; - fz_context *ctx = doc->ctx; fz_var(stream); fz_var(dict); @@ -2363,14 +2320,14 @@ pdf_load_hints(pdf_document *doc, int objnum, int gennum) int shared_obj_num, shared_obj_offset, shared_obj_count_page1; int shared_obj_count_total; int least_shared_group_len, shared_group_len_num_bits; - int max_object_num = pdf_xref_len(doc); + int max_object_num = pdf_xref_len(ctx, doc); - stream = pdf_open_stream(doc, objnum, gennum); - dict = pdf_get_xref_entry(doc, objnum)->obj; - if (dict == NULL || !pdf_is_dict(dict)) + stream = pdf_open_stream(ctx, doc, objnum, gennum); + dict = pdf_get_xref_entry(ctx, doc, objnum)->obj; + if (dict == NULL || !pdf_is_dict(ctx, dict)) fz_throw(ctx, FZ_ERROR_GENERIC, "malformed hint object"); - shared_hint_offset = pdf_to_int(pdf_dict_gets(dict, "S")); + shared_hint_offset = pdf_to_int(ctx, pdf_dict_gets(ctx, dict, "S")); /* Malloc the structures (use realloc to cope with the fact we * may try this several times before enough data is loaded) */ @@ -2381,45 +2338,45 @@ pdf_load_hints(pdf_document *doc, int objnum, int gennum) doc->hint_obj_offsets_max = max_object_num; /* Read the page object hints table: Header first */ - least_num_page_objs = fz_read_bits(stream, 32); + least_num_page_objs = fz_read_bits(ctx, stream, 32); /* The following is sometimes a lie, but we read this version, * as other table values are built from it. In * pdf_reference17.pdf, this points to 2 objects before the * first pages page object. */ - doc->hint_page[0].offset = fz_read_bits(stream, 32); + doc->hint_page[0].offset = fz_read_bits(ctx, stream, 32); if (doc->hint_page[0].offset > doc->hint_object_offset) doc->hint_page[0].offset += doc->hint_object_length; - page_obj_num_bits = fz_read_bits(stream, 16); - least_page_len = fz_read_bits(stream, 32); - page_len_num_bits = fz_read_bits(stream, 16); - /* least_page_offset = */ (void) fz_read_bits(stream, 32); - /* page_offset_num_bits = */ (void) fz_read_bits(stream, 16); - /* least_content_stream_len = */ (void) fz_read_bits(stream, 32); - /* content_stream_len_num_bits = */ (void) fz_read_bits(stream, 16); - num_shared_obj_num_bits = fz_read_bits(stream, 16); - shared_obj_num_bits = fz_read_bits(stream, 16); - /* numerator_bits = */ (void) fz_read_bits(stream, 16); - /* denominator_bits = */ (void) fz_read_bits(stream, 16); + page_obj_num_bits = fz_read_bits(ctx, stream, 16); + least_page_len = fz_read_bits(ctx, stream, 32); + page_len_num_bits = fz_read_bits(ctx, stream, 16); + /* least_page_offset = */ (void) fz_read_bits(ctx, stream, 32); + /* page_offset_num_bits = */ (void) fz_read_bits(ctx, stream, 16); + /* least_content_stream_len = */ (void) fz_read_bits(ctx, stream, 32); + /* content_stream_len_num_bits = */ (void) fz_read_bits(ctx, stream, 16); + num_shared_obj_num_bits = fz_read_bits(ctx, stream, 16); + shared_obj_num_bits = fz_read_bits(ctx, stream, 16); + /* numerator_bits = */ (void) fz_read_bits(ctx, stream, 16); + /* denominator_bits = */ (void) fz_read_bits(ctx, stream, 16); /* Item 1: Page object numbers */ doc->hint_page[0].number = doc->linear_page1_obj_num; /* We don't care about the number of objects in the first page */ - (void)fz_read_bits(stream, page_obj_num_bits); + (void)fz_read_bits(ctx, stream, page_obj_num_bits); j = 1; for (i = 1; i < doc->page_count; i++) { - int delta_page_objs = fz_read_bits(stream, page_obj_num_bits); + int delta_page_objs = fz_read_bits(ctx, stream, page_obj_num_bits); doc->hint_page[i].number = j; j += least_num_page_objs + delta_page_objs; } doc->hint_page[i].number = j; /* Not a real page object */ - fz_sync_bits(stream); + fz_sync_bits(ctx, stream); /* Item 2: Page lengths */ j = doc->hint_page[0].offset; for (i = 0; i < doc->page_count; i++) { - int delta_page_len = fz_read_bits(stream, page_len_num_bits); + int delta_page_len = fz_read_bits(ctx, stream, page_len_num_bits); int old = j; doc->hint_page[i].offset = j; @@ -2428,39 +2385,39 @@ pdf_load_hints(pdf_document *doc, int objnum, int gennum) j += doc->hint_object_length; } doc->hint_page[i].offset = j; - fz_sync_bits(stream); + fz_sync_bits(ctx, stream); /* Item 3: Shared references */ shared = 0; for (i = 0; i < doc->page_count; i++) { - int num_shared_objs = fz_read_bits(stream, num_shared_obj_num_bits); + int num_shared_objs = fz_read_bits(ctx, stream, num_shared_obj_num_bits); doc->hint_page[i].index = shared; shared += num_shared_objs; } doc->hint_page[i].index = shared; doc->hint_shared_ref = fz_resize_array(ctx, doc->hint_shared_ref, shared, sizeof(*doc->hint_shared_ref)); memset(doc->hint_shared_ref, 0, sizeof(*doc->hint_shared_ref) * shared); - fz_sync_bits(stream); + fz_sync_bits(ctx, stream); /* Item 4: Shared references */ for (i = 0; i < shared; i++) { - int ref = fz_read_bits(stream, shared_obj_num_bits); + int ref = fz_read_bits(ctx, stream, shared_obj_num_bits); doc->hint_shared_ref[i] = ref; } /* Skip items 5,6,7 as we don't use them */ - fz_seek(stream, shared_hint_offset, SEEK_SET); + fz_seek(ctx, stream, shared_hint_offset, SEEK_SET); /* Read the shared object hints table: Header first */ - shared_obj_num = fz_read_bits(stream, 32); - shared_obj_offset = fz_read_bits(stream, 32); + shared_obj_num = fz_read_bits(ctx, stream, 32); + shared_obj_offset = fz_read_bits(ctx, stream, 32); if (shared_obj_offset > doc->hint_object_offset) shared_obj_offset += doc->hint_object_length; - shared_obj_count_page1 = fz_read_bits(stream, 32); - shared_obj_count_total = fz_read_bits(stream, 32); - shared_obj_num_bits = fz_read_bits(stream, 16); - least_shared_group_len = fz_read_bits(stream, 32); - shared_group_len_num_bits = fz_read_bits(stream, 16); + shared_obj_count_page1 = fz_read_bits(ctx, stream, 32); + shared_obj_count_total = fz_read_bits(ctx, stream, 32); + shared_obj_num_bits = fz_read_bits(ctx, stream, 16); + least_shared_group_len = fz_read_bits(ctx, stream, 32); + shared_group_len_num_bits = fz_read_bits(ctx, stream, 16); /* Sanity check the references in Item 4 above to ensure we * don't access out of range with malicious files. */ @@ -2479,7 +2436,7 @@ pdf_load_hints(pdf_document *doc, int objnum, int gennum) j = doc->hint_page[0].offset; for (i = 0; i < shared_obj_count_page1; i++) { - int off = fz_read_bits(stream, shared_group_len_num_bits); + int off = fz_read_bits(ctx, stream, shared_group_len_num_bits); int old = j; doc->hint_shared[i].offset = j; j += off + least_shared_group_len; @@ -2492,7 +2449,7 @@ pdf_load_hints(pdf_document *doc, int objnum, int gennum) j = shared_obj_offset; for (; i < shared_obj_count_total; i++) { - int off = fz_read_bits(stream, shared_group_len_num_bits); + int off = fz_read_bits(ctx, stream, shared_group_len_num_bits); int old = j; doc->hint_shared[i].offset = j; j += off + least_shared_group_len; @@ -2500,34 +2457,34 @@ pdf_load_hints(pdf_document *doc, int objnum, int gennum) j += doc->hint_object_length; } doc->hint_shared[i].offset = j; - fz_sync_bits(stream); + fz_sync_bits(ctx, stream); /* Item 2: Signature flags: read these just so we can skip */ for (i = 0; i < shared_obj_count_total; i++) { - doc->hint_shared[i].number = fz_read_bits(stream, 1); + doc->hint_shared[i].number = fz_read_bits(ctx, stream, 1); } - fz_sync_bits(stream); + fz_sync_bits(ctx, stream); /* Item 3: Signatures: just skip */ for (i = 0; i < shared_obj_count_total; i++) { if (doc->hint_shared[i].number) { - (void) fz_read_bits(stream, 128); + (void) fz_read_bits(ctx, stream, 128); } } - fz_sync_bits(stream); + fz_sync_bits(ctx, stream); /* Item 4: Shared object object numbers */ j = doc->linear_page1_obj_num; /* FIXME: This is a lie! */ for (i = 0; i < shared_obj_count_page1; i++) { doc->hint_shared[i].number = j; - j += fz_read_bits(stream, shared_obj_num_bits) + 1; + j += fz_read_bits(ctx, stream, shared_obj_num_bits) + 1; } j = shared_obj_num; for (; i < shared_obj_count_total; i++) { doc->hint_shared[i].number = j; - j += fz_read_bits(stream, shared_obj_num_bits) + 1; + j += fz_read_bits(ctx, stream, shared_obj_num_bits) + 1; } doc->hint_shared[i].number = j; @@ -2543,7 +2500,7 @@ pdf_load_hints(pdf_document *doc, int objnum, int gennum) } fz_always(ctx) { - fz_drop_stream(stream); + fz_drop_stream(ctx, stream); } fz_catch(ctx) { @@ -2559,14 +2516,13 @@ pdf_load_hints(pdf_document *doc, int objnum, int gennum) } static void -pdf_load_hint_object(pdf_document *doc) +pdf_load_hint_object(fz_context *ctx, pdf_document *doc) { - fz_context *ctx = doc->ctx; pdf_lexbuf *buf = &doc->lexbuf.base; int curr_pos; - curr_pos = fz_tell(doc->file); - fz_seek(doc->file, doc->hint_object_offset, SEEK_SET); + curr_pos = fz_tell(ctx, doc->file); + fz_seek(ctx, doc->file, doc->hint_object_offset, SEEK_SET); fz_try(ctx) { while (1) @@ -2574,24 +2530,24 @@ pdf_load_hint_object(pdf_document *doc) pdf_obj *page = NULL; int tmpofs, num, gen, tok; - tok = pdf_lex(doc->file, buf); + tok = pdf_lex(ctx, doc->file, buf); if (tok != PDF_TOK_INT) break; num = buf->i; - tok = pdf_lex(doc->file, buf); + tok = pdf_lex(ctx, doc->file, buf); if (tok != PDF_TOK_INT) break; gen = buf->i; - tok = pdf_lex(doc->file, buf); + tok = pdf_lex(ctx, doc->file, buf); if (tok != PDF_TOK_OBJ) break; - (void)pdf_repair_obj(doc, buf, &tmpofs, NULL, NULL, NULL, &page, &tmpofs); - pdf_load_hints(doc, num, gen); + (void)pdf_repair_obj(ctx, doc, buf, &tmpofs, NULL, NULL, NULL, &page, &tmpofs); + pdf_load_hints(ctx, doc, num, gen); } } fz_always(ctx) { - fz_seek(doc->file, curr_pos, SEEK_SET); + fz_seek(ctx, doc->file, curr_pos, SEEK_SET); } fz_catch(ctx) { @@ -2599,17 +2555,16 @@ pdf_load_hint_object(pdf_document *doc) } } -pdf_obj *pdf_progressive_advance(pdf_document *doc, int pagenum) +pdf_obj *pdf_progressive_advance(fz_context *ctx, pdf_document *doc, int pagenum) { - fz_context *ctx = doc->ctx; pdf_lexbuf *buf = &doc->lexbuf.base; int curr_pos; pdf_obj *page; - pdf_load_hinted_page(doc, pagenum); + pdf_load_hinted_page(ctx, doc, pagenum); if (pagenum < 0 || pagenum >= doc->page_count) - fz_throw(doc->ctx, FZ_ERROR_GENERIC, "page load out of range (%d of %d)", pagenum, doc->page_count); + fz_throw(ctx, FZ_ERROR_GENERIC, "page load out of range (%d of %d)", pagenum, doc->page_count); if (doc->linear_pos == doc->file_length) return doc->linear_page_refs[pagenum]; @@ -2618,11 +2573,11 @@ pdf_obj *pdf_progressive_advance(pdf_document *doc, int pagenum) if (pagenum > 0 && !doc->hints_loaded && doc->hint_object_offset > 0 && doc->linear_pos >= doc->hint_object_offset) { /* Found hint object */ - pdf_load_hint_object(doc); + pdf_load_hint_object(ctx, doc); } DEBUGMESS((ctx, "continuing to try to advance from %d", doc->linear_pos)); - curr_pos = fz_tell(doc->file); + curr_pos = fz_tell(ctx, doc->file); fz_var(page); @@ -2633,8 +2588,8 @@ pdf_obj *pdf_progressive_advance(pdf_document *doc, int pagenum) { int num; page = NULL; - eof = pdf_obj_read(doc, &doc->linear_pos, &num, &page); - pdf_drop_obj(page); + eof = pdf_obj_read(ctx, doc, &doc->linear_pos, &num, &page); + pdf_drop_obj(ctx, page); page = NULL; } while (!eof); @@ -2643,22 +2598,22 @@ pdf_obj *pdf_progressive_advance(pdf_document *doc, int pagenum) pdf_obj *catalog; pdf_obj *pages; doc->linear_pos = doc->file_length; - pdf_load_xref(doc, buf); - catalog = pdf_dict_gets(pdf_trailer(doc), "Root"); - pages = pdf_dict_gets(catalog, "Pages"); + pdf_load_xref(ctx, doc, buf); + catalog = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Root"); + pages = pdf_dict_gets(ctx, catalog, "Pages"); - if (!pdf_is_dict(pages)) + if (!pdf_is_dict(ctx, pages)) fz_throw(ctx, FZ_ERROR_GENERIC, "missing page tree"); break; } } fz_always(ctx) { - fz_seek(doc->file, curr_pos, SEEK_SET); + fz_seek(ctx, doc->file, curr_pos, SEEK_SET); } fz_catch(ctx) { - pdf_drop_obj(page); + pdf_drop_obj(ctx, page); if (fz_caught(ctx) == FZ_ERROR_TRYLATER) { if (doc->linear_page_refs[pagenum] == NULL) @@ -2674,7 +2629,7 @@ pdf_obj *pdf_progressive_advance(pdf_document *doc, int pagenum) return doc->linear_page_refs[pagenum]; } -pdf_document *pdf_specifics(fz_document *doc) +pdf_document *pdf_specifics(fz_context *ctx, fz_document *doc) { return (pdf_document *)((doc && doc->close == (fz_document_close_fn *)pdf_close_document) ? doc : NULL); } @@ -2697,29 +2652,29 @@ pdf_document *pdf_create_document(fz_context *ctx) doc->file_size = 0; doc->startxref = 0; doc->num_xref_sections = 0; - pdf_get_populating_xref_entry(doc, 0); + pdf_get_populating_xref_entry(ctx, doc, 0); doc->xref_altered = 1; - trailer = pdf_new_dict(doc, 2); - pdf_dict_puts_drop(trailer, "Size", pdf_new_int(doc, 3)); - o = root = pdf_new_dict(doc, 2); - pdf_dict_puts_drop(trailer, "Root", pdf_new_ref(doc, o)); - pdf_drop_obj(o); + trailer = pdf_new_dict(ctx, doc, 2); + pdf_dict_puts_drop(ctx, trailer, "Size", pdf_new_int(ctx, doc, 3)); + o = root = pdf_new_dict(ctx, doc, 2); + pdf_dict_puts_drop(ctx, trailer, "Root", pdf_new_ref(ctx, doc, o)); + pdf_drop_obj(ctx, o); o = NULL; - pdf_dict_puts_drop(root, "Type", pdf_new_name(doc, "Catalog")); - o = pages = pdf_new_dict(doc, 3); - pdf_dict_puts_drop(root, "Pages", pdf_new_ref(doc, o)); - pdf_drop_obj(o); + pdf_dict_puts_drop(ctx, root, "Type", pdf_new_name(ctx, doc, "Catalog")); + o = pages = pdf_new_dict(ctx, doc, 3); + pdf_dict_puts_drop(ctx, root, "Pages", pdf_new_ref(ctx, doc, o)); + pdf_drop_obj(ctx, o); o = NULL; - pdf_dict_puts_drop(pages, "Type", pdf_new_name(doc, "Pages")); - pdf_dict_puts_drop(pages, "Count", pdf_new_int(doc, 0)); - pdf_dict_puts_drop(pages, "Kids", pdf_new_array(doc, 1)); - pdf_set_populating_xref_trailer(doc, trailer); - pdf_drop_obj(trailer); + pdf_dict_puts_drop(ctx, pages, "Type", pdf_new_name(ctx, doc, "Pages")); + pdf_dict_puts_drop(ctx, pages, "Count", pdf_new_int(ctx, doc, 0)); + pdf_dict_puts_drop(ctx, pages, "Kids", pdf_new_array(ctx, doc, 1)); + pdf_set_populating_xref_trailer(ctx, doc, trailer); + pdf_drop_obj(ctx, trailer); } fz_catch(ctx) { - pdf_drop_obj(trailer); - pdf_drop_obj(o); + pdf_drop_obj(ctx, trailer); + pdf_drop_obj(ctx, o); fz_rethrow_message(ctx, "Failed to create empty document"); } return doc; @@ -2748,7 +2703,7 @@ fz_document_handler pdf_no_run_document_handler = (fz_document_open_with_stream_fn *)&pdf_open_document_no_run_with_stream }; -void pdf_mark_xref(pdf_document *doc) +void pdf_mark_xref(fz_context *ctx, pdf_document *doc) { int x, e; @@ -2771,7 +2726,7 @@ void pdf_mark_xref(pdf_document *doc) } } -void pdf_clear_xref(pdf_document *doc) +void pdf_clear_xref(fz_context *ctx, pdf_document *doc) { int x, e; @@ -2789,9 +2744,9 @@ void pdf_clear_xref(pdf_document *doc) * buffer has been updated */ if (entry->obj != NULL && entry->stm_buf == NULL) { - if (pdf_obj_refs(entry->obj) == 1) + if (pdf_obj_refs(ctx, entry->obj) == 1) { - pdf_drop_obj(entry->obj); + pdf_drop_obj(ctx, entry->obj); entry->obj = NULL; } } @@ -2800,7 +2755,7 @@ void pdf_clear_xref(pdf_document *doc) } } -void pdf_clear_xref_to_mark(pdf_document *doc) +void pdf_clear_xref_to_mark(fz_context *ctx, pdf_document *doc) { int x, e; @@ -2819,9 +2774,9 @@ void pdf_clear_xref_to_mark(pdf_document *doc) * been updated */ if (entry->obj != NULL && entry->stm_buf == NULL) { - if ((entry->flags & PDF_OBJ_FLAG_MARK) == 0 && pdf_obj_refs(entry->obj) == 1) + if ((entry->flags & PDF_OBJ_FLAG_MARK) == 0 && pdf_obj_refs(ctx, entry->obj) == 1) { - pdf_drop_obj(entry->obj); + pdf_drop_obj(ctx, entry->obj); entry->obj = NULL; } } |