summaryrefslogtreecommitdiff
path: root/source/pdf
diff options
context:
space:
mode:
Diffstat (limited to 'source/pdf')
-rw-r--r--source/pdf/js/pdf-js-none.c6
-rw-r--r--source/pdf/js/pdf-js.c138
-rw-r--r--source/pdf/js/pdf-jsimp-mu.c25
-rw-r--r--source/pdf/pdf-annot-edit.c201
-rw-r--r--source/pdf/pdf-annot.c278
-rw-r--r--source/pdf/pdf-appearance.c472
-rw-r--r--source/pdf/pdf-clean.c159
-rw-r--r--source/pdf/pdf-cmap-load.c43
-rw-r--r--source/pdf/pdf-cmap-parse.c34
-rw-r--r--source/pdf/pdf-cmap.c4
-rw-r--r--source/pdf/pdf-colorspace.c107
-rw-r--r--source/pdf/pdf-crypt.c236
-rw-r--r--source/pdf/pdf-device.c666
-rw-r--r--source/pdf/pdf-event.c34
-rw-r--r--source/pdf/pdf-field.c47
-rw-r--r--source/pdf/pdf-font.c282
-rw-r--r--source/pdf/pdf-fontfile.c95
-rw-r--r--source/pdf/pdf-form.c635
-rw-r--r--source/pdf/pdf-function.c213
-rw-r--r--source/pdf/pdf-image.c114
-rw-r--r--source/pdf/pdf-interpret-imp.h13
-rw-r--r--source/pdf/pdf-interpret.c127
-rw-r--r--source/pdf/pdf-lex.c141
-rw-r--r--source/pdf/pdf-nametree.c115
-rw-r--r--source/pdf/pdf-object.c1098
-rw-r--r--source/pdf/pdf-op-buffer.c267
-rw-r--r--source/pdf/pdf-op-filter.c25
-rw-r--r--source/pdf/pdf-op-run.c431
-rw-r--r--source/pdf/pdf-outline.c41
-rw-r--r--source/pdf/pdf-page.c399
-rw-r--r--source/pdf/pdf-parse.c267
-rw-r--r--source/pdf/pdf-pattern.c33
-rw-r--r--source/pdf/pdf-pkcs7.c67
-rw-r--r--source/pdf/pdf-repair.c249
-rw-r--r--source/pdf/pdf-run.c76
-rw-r--r--source/pdf/pdf-shade.c204
-rw-r--r--source/pdf/pdf-store.c37
-rw-r--r--source/pdf/pdf-stream.c332
-rw-r--r--source/pdf/pdf-type3.c80
-rw-r--r--source/pdf/pdf-unicode.c7
-rw-r--r--source/pdf/pdf-write.c980
-rw-r--r--source/pdf/pdf-xobject.c140
-rw-r--r--source/pdf/pdf-xref-aux.c6
-rw-r--r--source/pdf/pdf-xref.c1072
44 files changed, 4920 insertions, 5076 deletions
diff --git a/source/pdf/js/pdf-js-none.c b/source/pdf/js/pdf-js-none.c
index 37597b53..7cce12be 100644
--- a/source/pdf/js/pdf-js-none.c
+++ b/source/pdf/js/pdf-js-none.c
@@ -1,14 +1,14 @@
#include "mupdf/pdf.h"
-void pdf_enable_js(pdf_document *doc)
+void pdf_enable_js(fz_context *ctx, pdf_document *doc)
{
}
-void pdf_disable_js(pdf_document *doc)
+void pdf_disable_js(fz_context *ctx, pdf_document *doc)
{
}
-int pdf_js_supported(pdf_document *doc)
+int pdf_js_supported(fz_context *ctx, pdf_document *doc)
{
return 0;
}
diff --git a/source/pdf/js/pdf-js.c b/source/pdf/js/pdf-js.c
index 8364fc95..84a14381 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,8 @@ 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);
+ /* TODO: free fval! */
return pdf_jsimp_from_string(js->imp, fval?fval:"");
}
@@ -344,7 +348,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 +361,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 +375,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 +391,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 +418,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 +431,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 +470,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 +487,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 +506,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 +518,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 +536,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 +587,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 +605,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 +613,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 +688,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 +778,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 +789,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 +799,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 +827,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 +837,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 +865,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 +877,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 +898,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 +913,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 +924,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/js/pdf-jsimp-mu.c b/source/pdf/js/pdf-jsimp-mu.c
index 37a5cc76..2fd918cf 100644
--- a/source/pdf/js/pdf-jsimp-mu.c
+++ b/source/pdf/js/pdf-jsimp-mu.c
@@ -32,7 +32,7 @@ pdf_jsimp *pdf_new_jsimp(fz_context *ctx, void *jsctx)
js_State *J;
pdf_jsimp *imp;
- J = js_newstate(alloc, ctx);
+ J = js_newstate(alloc, ctx, 0);
js_setcontext(J, jsctx);
imp = fz_malloc_struct(ctx, pdf_jsimp);
@@ -184,12 +184,12 @@ void pdf_jsimp_addmethod(pdf_jsimp *imp, pdf_jsimp_type *type, char *name, pdf_j
js_newcfunction(J, wrapmethod, name, 0);
{
js_pushnull(J);
- js_newuserdata(J, "method", meth);
+ js_newuserdata(J, "method", meth, NULL);
js_defproperty(J, -2, "__call", JS_READONLY | JS_DONTENUM | JS_DONTCONF);
js_pushstring(J, (const char *)type);
js_defproperty(J, -2, "__type", JS_READONLY | JS_DONTENUM | JS_DONTCONF);
}
- js_defproperty(J, -2, name, JS_READONLY | JS_DONTENUM | JS_DONTCONF);
+ js_defproperty(J, -2, name, JS_READONLY | JS_DONTCONF);
}
js_pop(J, 1);
}
@@ -202,7 +202,7 @@ void pdf_jsimp_addproperty(pdf_jsimp *imp, pdf_jsimp_type *type, char *name, pdf
js_newcfunction(J, wrapgetter, name, 0);
{
js_pushnull(J);
- js_newuserdata(J, "getter", get);
+ js_newuserdata(J, "getter", get, NULL);
js_defproperty(J, -2, "__get", JS_READONLY | JS_DONTENUM | JS_DONTCONF);
js_pushstring(J, (const char *)type);
js_defproperty(J, -2, "__type", JS_READONLY | JS_DONTENUM | JS_DONTCONF);
@@ -210,12 +210,12 @@ void pdf_jsimp_addproperty(pdf_jsimp *imp, pdf_jsimp_type *type, char *name, pdf
js_newcfunction(J, wrapsetter, name, 0);
{
js_pushnull(J);
- js_newuserdata(J, "setter", set);
+ js_newuserdata(J, "setter", set, NULL);
js_defproperty(J, -2, "__set", JS_READONLY | JS_DONTENUM | JS_DONTCONF);
js_pushstring(J, (const char *)type);
js_defproperty(J, -2, "__type", JS_READONLY | JS_DONTENUM | JS_DONTCONF);
}
- js_defaccessor(J, -3, name, JS_READONLY | JS_DONTENUM | JS_DONTCONF);
+ js_defaccessor(J, -3, name, JS_READONLY | JS_DONTCONF);
}
js_pop(J, 1);
}
@@ -223,17 +223,22 @@ void pdf_jsimp_addproperty(pdf_jsimp *imp, pdf_jsimp_type *type, char *name, pdf
void pdf_jsimp_set_global_type(pdf_jsimp *imp, pdf_jsimp_type *type)
{
js_State *J = imp->J;
+ const char *name;
+
js_getregistry(J, (const char *)type);
- js_setglobal(J, "global");
- js_dostring(J, "Object.getOwnPropertyNames(global).forEach(function(k){this[k]=global[k]}, this)", 0);
- js_dostring(J, "delete global", 0);
+ js_pushiterator(J, -1, 1);
+ while ((name = js_nextiterator(J, -1)))
+ {
+ js_getproperty(J, -2, name);
+ js_setglobal(J, name);
+ }
}
pdf_jsimp_obj *pdf_jsimp_new_obj(pdf_jsimp *imp, pdf_jsimp_type *type, void *natobj)
{
js_State *J = imp->J;
js_getregistry(J, (const char *)type);
- js_newuserdata(J, (const char *)type, natobj);
+ js_newuserdata(J, (const char *)type, natobj, NULL);
return NEWOBJ(J, -1);
}
diff --git a/source/pdf/pdf-annot-edit.c b/source/pdf/pdf-annot-edit.c
index 1e82accb..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,15 +130,15 @@ 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
- pdf_free_annot below actually frees a list. Put the new annot
+ pdf_drop_annot below actually frees a list. Put the new annot
at the end of the list, so that it will be drawn last.
*/
*page->annot_tailp = annot;
@@ -150,12 +148,12 @@ 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)
{
- pdf_free_annot(ctx, annot);
+ pdf_drop_annot(ctx, annot);
fz_rethrow(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 6b786985..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;
}
@@ -369,7 +364,7 @@ pdf_load_link_annots(pdf_document *doc, pdf_obj *annots, const fz_matrix *page_c
}
void
-pdf_free_annot(fz_context *ctx, pdf_annot *annot)
+pdf_drop_annot(fz_context *ctx, pdf_annot *annot)
{
pdf_annot *next;
@@ -378,14 +373,14 @@ pdf_free_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;
@@ -500,7 +494,7 @@ pdf_load_annots(pdf_document *doc, pdf_page *page, pdf_obj *annots)
}
fz_catch(ctx)
{
- pdf_free_annot(ctx, page->annots);
+ pdf_drop_annot(ctx, page->annots);
page->annots = NULL;
fz_rethrow(ctx);
}
@@ -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;
}
@@ -573,7 +567,7 @@ pdf_load_annots(pdf_document *doc, pdf_page *page, pdf_obj *annots)
{
if (fz_caught(ctx) == FZ_ERROR_TRYLATER)
{
- pdf_free_annot(ctx, page->annots);
+ pdf_drop_annot(ctx, page->annots);
page->annots = NULL;
fz_rethrow(ctx);
}
@@ -584,8 +578,8 @@ pdf_load_annots(pdf_document *doc, pdf_page *page, pdf_obj *annots)
{
/* Move to next item in the linked list, dropping this one */
*itr = annot->next;
- annot->next = NULL; /* Required because pdf_free_annot follows the "next" chain */
- pdf_free_annot(ctx, annot);
+ annot->next = NULL; /* Required because pdf_drop_annot follows the "next" chain */
+ pdf_drop_annot(ctx, annot);
}
}
@@ -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 db11c32a..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_close(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_close(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_close(str_outer);
- fz_close(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_free_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_free_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,10 +1488,10 @@ 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_free_path(ctx, path);
+ fz_drop_path(ctx, path);
path = NULL;
}
@@ -1519,18 +1506,18 @@ 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_free_device(dev);
+ fz_drop_device(ctx, dev);
fz_drop_stroke_state(ctx, stroke);
- fz_free_path(ctx, path);
+ fz_drop_path(ctx, path);
fz_drop_display_list(ctx, strike_list);
}
fz_catch(ctx)
@@ -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,14 +1643,14 @@ 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_free_device(dev);
+ fz_drop_device(ctx, dev);
fz_drop_stroke_state(ctx, stroke);
- fz_free_path(ctx, path);
+ fz_drop_path(ctx, path);
fz_drop_display_list(ctx, strike_list);
}
fz_catch(ctx)
@@ -1706,7 +1692,7 @@ static fz_text *layout_text(fz_context *ctx, font_info *font_rec, char *str, flo
}
fz_catch(ctx)
{
- fz_free_text(ctx, text);
+ fz_drop_text(ctx, text);
fz_rethrow(ctx);
}
@@ -1739,8 +1725,7 @@ static fz_text *fit_text(fz_context *ctx, font_info *font_rec, char *str, fz_rec
float x = 0.0;
float y = 0.0;
-
- fz_free_text(ctx, text);
+ fz_drop_text(ctx, text);
text = NULL;
font_size = font_rec->da_rec.font_size;
fz_scale(&tm, font_size, font_size);
@@ -1790,7 +1775,7 @@ static fz_text *fit_text(fz_context *ctx, font_info *font_rec, char *str, fz_rec
}
fz_catch(ctx)
{
- fz_free_text(ctx, text);
+ fz_drop_text(ctx, text);
fz_rethrow(ctx);
}
@@ -1848,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;
@@ -1872,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);
@@ -1886,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_free_path(ctx, path);
+ 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 */
@@ -1906,10 +1891,10 @@ void pdf_update_text_annot_appearance(pdf_document *doc, pdf_annot *annot)
}
fz_always(ctx)
{
- fz_free_device(dev);
+ fz_drop_device(ctx, dev);
fz_drop_display_list(ctx, dlist);
fz_drop_stroke_state(ctx, stroke);
- fz_free_path(ctx, path);
+ fz_drop_path(ctx, path);
fz_drop_colorspace(ctx, cs);
}
fz_catch(ctx)
@@ -1918,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;
@@ -1942,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 */
@@ -1964,17 +1948,17 @@ 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_free_device(dev);
+ fz_drop_device(ctx, dev);
fz_drop_display_list(ctx, dlist);
font_info_fin(ctx, &font_rec);
- fz_free_text(ctx, text);
+ fz_drop_text(ctx, text);
fz_drop_colorspace(ctx, cs);
}
fz_catch(ctx)
@@ -2043,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);
@@ -2061,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)
{
@@ -2107,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;
@@ -2122,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));
@@ -2134,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;
@@ -2149,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)
{
@@ -2165,8 +2147,8 @@ 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_free_text(ctx, text);
+ fz_fill_text(ctx, dev, text, page_ctm, cs, font_rec.da_rec.col, 1.0f);
+ fz_drop_text(ctx, text);
text = NULL;
/* Display the distinguished name in the right-hand half */
@@ -2179,26 +2161,26 @@ 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_free_device(dev);
+ fz_drop_device(ctx, dev);
fz_drop_display_list(ctx, dlist);
font_info_fin(ctx, &font_rec);
- fz_free_path(ctx, path);
- fz_free_text(ctx, text);
+ fz_drop_path(ctx, path);
+ fz_drop_text(ctx, text);
fz_drop_colorspace(ctx, cs);
fz_drop_buffer(ctx, fzbuf);
}
@@ -2208,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);
@@ -2243,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 2e431215..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,39 +32,39 @@ 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_free_cmap_imp, stmobj)) != NULL)
+ if ((cmap = pdf_find_item(ctx, pdf_drop_cmap_imp, stmobj)) != NULL)
{
return cmap;
}
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_close(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_close(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-cmap.c b/source/pdf/pdf-cmap.c
index e9eb25b2..16167439 100644
--- a/source/pdf/pdf-cmap.c
+++ b/source/pdf/pdf-cmap.c
@@ -5,7 +5,7 @@
*/
void
-pdf_free_cmap_imp(fz_context *ctx, fz_storable *cmap_)
+pdf_drop_cmap_imp(fz_context *ctx, fz_storable *cmap_)
{
pdf_cmap *cmap = (pdf_cmap *)cmap_;
if (cmap->usecmap)
@@ -20,7 +20,7 @@ pdf_cmap *
pdf_new_cmap(fz_context *ctx)
{
pdf_cmap *cmap = fz_malloc_struct(ctx, pdf_cmap);
- FZ_INIT_STORABLE(cmap, 1, pdf_free_cmap_imp);
+ FZ_INIT_STORABLE(cmap, 1, pdf_drop_cmap_imp);
return cmap;
}
diff --git a/source/pdf/pdf-colorspace.c b/source/pdf/pdf-colorspace.c
index 4b250f6c..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);
@@ -84,7 +83,7 @@ rgb_to_lab(fz_context *ctx, fz_colorspace *cs, const float *rgb, float *lab)
lab[2] = rgb[2];
}
-static fz_colorspace k_device_lab = { {-1, fz_free_colorspace_imp}, 0, "Lab", 3, lab_to_rgb, rgb_to_lab };
+static fz_colorspace k_device_lab = { {-1, fz_drop_colorspace_imp}, 0, "Lab", 3, lab_to_rgb, rgb_to_lab };
static fz_colorspace *fz_device_lab = &k_device_lab;
/* Separation and DeviceN */
@@ -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_close(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,21 +346,20 @@ 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_free_colorspace_imp, obj)) != NULL)
+ if ((cs = pdf_find_item(ctx, fz_drop_colorspace_imp, obj)) != NULL)
{
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 d502c378..4519657f 100644
--- a/source/pdf/pdf-crypt.c
+++ b/source/pdf/pdf-crypt.c
@@ -55,33 +55,33 @@ 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_free_crypt(ctx, crypt);
+ 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_free_crypt(ctx, crypt);
- fz_throw(ctx, FZ_ERROR_GENERIC, "unknown encryption handler: '%s'", pdf_to_name(obj));
+ pdf_drop_crypt(ctx, crypt);
+ 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_free_crypt(ctx, crypt);
+ pdf_drop_crypt(ctx, crypt);
fz_throw(ctx, FZ_ERROR_GENERIC, "unknown encryption version");
}
/* 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...");
@@ -94,48 +94,48 @@ pdf_new_crypt(fz_context *ctx, pdf_obj *dict, pdf_obj *id)
}
else
{
- pdf_free_crypt(ctx, crypt);
+ pdf_drop_crypt(ctx, crypt);
fz_throw(ctx, FZ_ERROR_GENERIC, "encryption dictionary missing version and revision value");
}
if (crypt->r < 1 || crypt->r > 6)
{
int r = crypt->r;
- pdf_free_crypt(ctx, crypt);
+ pdf_drop_crypt(ctx, crypt);
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_free_crypt(ctx, crypt);
+ 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
{
- pdf_free_crypt(ctx, crypt);
+ pdf_drop_crypt(ctx, crypt);
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_free_crypt(ctx, crypt);
+ 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_free_crypt(ctx, crypt);
+ 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)
@@ -192,12 +192,12 @@ pdf_new_crypt(fz_context *ctx, pdf_obj *dict, pdf_obj *id)
if (crypt->length % 8 != 0)
{
- pdf_free_crypt(ctx, crypt);
+ pdf_drop_crypt(ctx, crypt);
fz_throw(ctx, FZ_ERROR_GENERIC, "invalid encryption key length");
}
if (crypt->length < 40 || crypt->length > 128)
{
- pdf_free_crypt(ctx, crypt);
+ pdf_drop_crypt(ctx, crypt);
fz_throw(ctx, FZ_ERROR_GENERIC, "invalid encryption key length");
}
}
@@ -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_free_crypt(ctx, crypt);
- fz_rethrow_message(ctx, "cannot parse string crypt filter (%d %d R)", pdf_to_num(obj), pdf_to_gen(obj));
+ pdf_drop_crypt(ctx, crypt);
+ 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 */
@@ -257,10 +257,10 @@ pdf_new_crypt(fz_context *ctx, pdf_obj *dict, pdf_obj *id)
}
void
-pdf_free_crypt(fz_context *ctx, pdf_crypt *crypt)
+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 139c4363..b5db7e3a 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,8 @@ struct group_entry_s
struct pdf_device_s
{
- fz_context *ctx;
+ fz_device super;
+
pdf_document *doc;
pdf_obj *contents;
pdf_obj *resources;
@@ -108,9 +109,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 +197,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 +219,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 +252,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 +360,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 +398,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 +408,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 +475,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 +509,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 +533,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 +544,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 +569,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 +596,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 +629,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 +650,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 +681,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 +703,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 +743,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 +796,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 +825,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 +845,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,223 +854,222 @@ 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;
+ pdf_device *pdev = (pdf_device*)dev;
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;
+ pdf_device *pdev = (pdf_device*)dev;
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;
+ pdf_device *pdev = (pdf_device*)dev;
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;
+ pdf_device *pdev = (pdf_device*)dev;
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;
+ pdf_device *pdev = (pdf_device*)dev;
fz_matrix trm = text->trm;
float size = fz_matrix_expansion(&trm);
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;
+ pdf_device *pdev = (pdf_device*)dev;
fz_matrix trm = text->trm;
float size = fz_matrix_expansion(&trm);
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;
+ pdf_device *pdev = (pdf_device*)dev;
fz_matrix trm = text->trm;
float size = fz_matrix_expansion(&trm);
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;
+ pdf_device *pdev = (pdf_device*)dev;
fz_matrix trm = text->trm;
float size = fz_matrix_expansion(&trm);
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;
+ pdf_device *pdev = (pdf_device*)dev;
fz_matrix trm = text->trm;
float size = fz_matrix_expansion(&trm);
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 = (pdf_device*)dev;
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 = (pdf_device*)dev;
/* 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 = (pdf_device*)dev;
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 = (pdf_device*)dev;
/* 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 = (pdf_device*)dev;
/* 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 = (pdf_device*)dev;
pdf_document *doc = pdev->doc;
- fz_context *ctx = pdev->ctx;
gstate *gs;
pdf_obj *smask = NULL;
pdf_obj *egs = NULL;
@@ -1092,163 +1082,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 = (pdf_device*)dev;
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 = (pdf_device*)dev;
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 = (pdf_device*)dev;
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 = (pdf_device*)dev;
/* 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 = (pdf_device*)dev;
/* FIXME */
- pdf_dev_end_text(pdev);
+ pdf_dev_end_text(ctx, pdev);
}
static void
-pdf_dev_free_user(fz_device *dev)
+pdf_dev_drop_imp(fz_context *ctx, fz_device *dev)
{
- pdf_device *pdev = dev->user;
+ pdf_device *pdev = (pdf_device*)dev;
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,121 +1248,105 @@ pdf_dev_free_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);
fz_free(ctx, pdev->gstates);
- fz_free(ctx, pdev);
}
-static void
-pdf_dev_rebind(fz_device *dev)
+fz_device *pdf_new_pdf_device(fz_context *ctx, pdf_document *doc, pdf_obj *contents, pdf_obj *resources, const fz_matrix *ctm)
{
- pdf_device *pdev = dev->user;
+ pdf_device *dev = fz_new_device(ctx, sizeof *dev);
- fz_rebind_document((fz_document *)pdev->doc, dev->ctx);
-}
+ dev->super.drop_imp = pdf_dev_drop_imp;
-fz_device *pdf_new_pdf_device(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;
+ dev->super.fill_path = pdf_dev_fill_path;
+ dev->super.stroke_path = pdf_dev_stroke_path;
+ dev->super.clip_path = pdf_dev_clip_path;
+ dev->super.clip_stroke_path = pdf_dev_clip_stroke_path;
+
+ dev->super.fill_text = pdf_dev_fill_text;
+ dev->super.stroke_text = pdf_dev_stroke_text;
+ dev->super.clip_text = pdf_dev_clip_text;
+ dev->super.clip_stroke_text = pdf_dev_clip_stroke_text;
+ dev->super.ignore_text = pdf_dev_ignore_text;
+
+ dev->super.fill_shade = pdf_dev_fill_shade;
+ dev->super.fill_image = pdf_dev_fill_image;
+ dev->super.fill_image_mask = pdf_dev_fill_image_mask;
+ dev->super.clip_image_mask = pdf_dev_clip_image_mask;
+
+ dev->super.pop_clip = pdf_dev_pop_clip;
+
+ dev->super.begin_mask = pdf_dev_begin_mask;
+ dev->super.end_mask = pdf_dev_end_mask;
+ dev->super.begin_group = pdf_dev_begin_group;
+ dev->super.end_group = pdf_dev_end_group;
+
+ dev->super.begin_tile = pdf_dev_begin_tile;
+ dev->super.end_tile = pdf_dev_end_tile;
fz_try(ctx)
{
- pdev->ctx = ctx;
- pdev->doc = doc;
- pdev->contents = pdf_keep_obj(contents);
- pdev->resources = pdf_keep_obj(resources);
- pdev->gstates = fz_malloc_struct(ctx, gstate);
- pdev->gstates[0].buf = fz_new_buffer(ctx, 256);
- pdev->gstates[0].ctm = *ctm;
- pdev->gstates[0].colorspace[0] = fz_device_gray(ctx);
- pdev->gstates[0].colorspace[1] = fz_device_gray(ctx);
- pdev->gstates[0].color[0][0] = 1;
- pdev->gstates[0].color[1][0] = 1;
- pdev->gstates[0].alpha[0] = 1.0;
- pdev->gstates[0].alpha[1] = 1.0;
- pdev->gstates[0].font = -1;
- pdev->gstates[0].horizontal_scaling = 100;
- pdev->num_gstates = 1;
- pdev->max_gstates = 1;
-
- dev = fz_new_device(ctx, pdev);
+ dev->doc = doc;
+ dev->contents = pdf_keep_obj(ctx, contents);
+ dev->resources = pdf_keep_obj(ctx, resources);
+ dev->gstates = fz_malloc_struct(ctx, gstate);
+ dev->gstates[0].buf = fz_new_buffer(ctx, 256);
+ dev->gstates[0].ctm = *ctm;
+ dev->gstates[0].colorspace[0] = fz_device_gray(ctx);
+ dev->gstates[0].colorspace[1] = fz_device_gray(ctx);
+ dev->gstates[0].color[0][0] = 1;
+ dev->gstates[0].color[1][0] = 1;
+ dev->gstates[0].alpha[0] = 1.0;
+ dev->gstates[0].alpha[1] = 1.0;
+ dev->gstates[0].font = -1;
+ dev->gstates[0].horizontal_scaling = 100;
+ dev->num_gstates = 1;
+ dev->max_gstates = 1;
}
fz_catch(ctx)
{
- if (pdev->gstates)
- fz_drop_buffer(ctx, pdev->gstates[0].buf);
- fz_free(ctx, pdev);
+ if (dev->gstates)
+ fz_drop_buffer(ctx, dev->gstates[0].buf);
+ fz_free(ctx, dev);
fz_rethrow(ctx);
}
- dev->rebind = pdf_dev_rebind;
- dev->free_user = pdf_dev_free_user;
-
- dev->fill_path = pdf_dev_fill_path;
- dev->stroke_path = pdf_dev_stroke_path;
- dev->clip_path = pdf_dev_clip_path;
- dev->clip_stroke_path = pdf_dev_clip_stroke_path;
-
- dev->fill_text = pdf_dev_fill_text;
- dev->stroke_text = pdf_dev_stroke_text;
- dev->clip_text = pdf_dev_clip_text;
- dev->clip_stroke_text = pdf_dev_clip_stroke_text;
- dev->ignore_text = pdf_dev_ignore_text;
-
- dev->fill_shade = pdf_dev_fill_shade;
- dev->fill_image = pdf_dev_fill_image;
- dev->fill_image_mask = pdf_dev_fill_image_mask;
- dev->clip_image_mask = pdf_dev_clip_image_mask;
-
- dev->pop_clip = pdf_dev_pop_clip;
-
- dev->begin_mask = pdf_dev_begin_mask;
- dev->end_mask = pdf_dev_end_mask;
- dev->begin_group = pdf_dev_begin_group;
- dev->end_group = pdf_dev_end_group;
-
- dev->begin_tile = pdf_dev_begin_tile;
- dev->end_tile = pdf_dev_end_tile;
-
- return dev;
+ return (fz_device*)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 +1354,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 5ac722f0..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;
@@ -337,7 +336,7 @@ pdf_drop_font(fz_context *ctx, pdf_font_desc *fontdesc)
}
static void
-pdf_free_font_imp(fz_context *ctx, fz_storable *fontdesc_)
+pdf_drop_font_imp(fz_context *ctx, fz_storable *fontdesc_)
{
pdf_font_desc *fontdesc = (pdf_font_desc *)fontdesc_;
@@ -362,7 +361,7 @@ pdf_new_font_desc(fz_context *ctx)
pdf_font_desc *fontdesc;
fontdesc = fz_malloc_struct(ctx, pdf_font_desc);
- FZ_INIT_STORABLE(fontdesc, 1, pdf_free_font_imp);
+ FZ_INIT_STORABLE(fontdesc, 1, pdf_drop_font_imp);
fontdesc->size = sizeof(pdf_font_desc);
fontdesc->font = NULL;
@@ -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,19 +817,18 @@ 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;
- if ((fontdesc = fz_find_item(ctx, pdf_free_font_imp, &hail_mary_store_type, &hail_mary_store_type)) != NULL)
+ if ((fontdesc = fz_find_item(ctx, pdf_drop_font_imp, &hail_mary_store_type, &hail_mary_store_type)) != NULL)
{
return fontdesc;
}
/* 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,52 +1207,51 @@ 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;
- if ((fontdesc = pdf_find_item(ctx, pdf_free_font_imp, dict)) != NULL)
+ if ((fontdesc = pdf_find_item(ctx, pdf_drop_font_imp, dict)) != NULL)
{
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 f0787bc6..86b6682b 100644
--- a/source/pdf/pdf-fontfile.c
+++ b/source/pdf/pdf-fontfile.c
@@ -4,14 +4,11 @@
Which fonts are embedded is based on a few preprocessor definitions.
The base 14 fonts are always embedded.
- For font substitution we embed DroidSans which has good glyph coverage.
For CJK font substitution we embed DroidSansFallback.
Set NOCJK to skip all CJK support (this also omits embedding the CJK CMaps)
Set NOCJKFONT to skip the embedded CJK font.
Set NOCJKFULL to embed a smaller CJK font without CJK Extension A support.
-
- Set NODROIDFONT to use the base 14 fonts as substitute fonts.
*/
#ifdef NOCJK
@@ -20,10 +17,6 @@
#include "gen_font_base14.h"
-#ifndef NODROIDFONT
-#include "gen_font_droid.h"
-#endif
-
#ifndef NOCJKFONT
#ifndef NOCJKFULL
#include "gen_font_cjk_full.h"
@@ -33,55 +26,55 @@
#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_NimbusMon_Reg;
- return (unsigned char*) pdf_font_NimbusMon_Reg;
+ *len = sizeof pdf_font_NimbusMono_Regular;
+ return (unsigned char*) pdf_font_NimbusMono_Regular;
}
if (!strcmp("Courier-Bold", name)) {
- *len = sizeof pdf_font_NimbusMon_Bol;
- return (unsigned char*) pdf_font_NimbusMon_Bol;
+ *len = sizeof pdf_font_NimbusMono_Bold;
+ return (unsigned char*) pdf_font_NimbusMono_Bold;
}
if (!strcmp("Courier-Oblique", name)) {
- *len = sizeof pdf_font_NimbusMon_Obl;
- return (unsigned char*) pdf_font_NimbusMon_Obl;
+ *len = sizeof pdf_font_NimbusMono_Oblique;
+ return (unsigned char*) pdf_font_NimbusMono_Oblique;
}
if (!strcmp("Courier-BoldOblique", name)) {
- *len = sizeof pdf_font_NimbusMon_BolObl;
- return (unsigned char*) pdf_font_NimbusMon_BolObl;
+ *len = sizeof pdf_font_NimbusMono_BoldOblique;
+ return (unsigned char*) pdf_font_NimbusMono_BoldOblique;
}
if (!strcmp("Helvetica", name)) {
- *len = sizeof pdf_font_NimbusSan_Reg;
- return (unsigned char*) pdf_font_NimbusSan_Reg;
+ *len = sizeof pdf_font_NimbusSanL_Reg;
+ return (unsigned char*) pdf_font_NimbusSanL_Reg;
}
if (!strcmp("Helvetica-Bold", name)) {
- *len = sizeof pdf_font_NimbusSan_Bol;
- return (unsigned char*) pdf_font_NimbusSan_Bol;
+ *len = sizeof pdf_font_NimbusSanL_Bol;
+ return (unsigned char*) pdf_font_NimbusSanL_Bol;
}
if (!strcmp("Helvetica-Oblique", name)) {
- *len = sizeof pdf_font_NimbusSan_Ita;
- return (unsigned char*) pdf_font_NimbusSan_Ita;
+ *len = sizeof pdf_font_NimbusSanL_RegIta;
+ return (unsigned char*) pdf_font_NimbusSanL_RegIta;
}
if (!strcmp("Helvetica-BoldOblique", name)) {
- *len = sizeof pdf_font_NimbusSan_BolIta;
- return (unsigned char*) pdf_font_NimbusSan_BolIta;
+ *len = sizeof pdf_font_NimbusSanL_BolIta;
+ return (unsigned char*) pdf_font_NimbusSanL_BolIta;
}
if (!strcmp("Times-Roman", name)) {
- *len = sizeof pdf_font_NimbusRom_Reg;
- return (unsigned char*) pdf_font_NimbusRom_Reg;
+ *len = sizeof pdf_font_NimbusRomNo9L_Reg;
+ return (unsigned char*) pdf_font_NimbusRomNo9L_Reg;
}
if (!strcmp("Times-Bold", name)) {
- *len = sizeof pdf_font_NimbusRom_Med;
- return (unsigned char*) pdf_font_NimbusRom_Med;
+ *len = sizeof pdf_font_NimbusRomNo9L_Med;
+ return (unsigned char*) pdf_font_NimbusRomNo9L_Med;
}
if (!strcmp("Times-Italic", name)) {
- *len = sizeof pdf_font_NimbusRom_Ita;
- return (unsigned char*) pdf_font_NimbusRom_Ita;
+ *len = sizeof pdf_font_NimbusRomNo9L_RegIta;
+ return (unsigned char*) pdf_font_NimbusRomNo9L_RegIta;
}
if (!strcmp("Times-BoldItalic", name)) {
- *len = sizeof pdf_font_NimbusRom_MedIta;
- return (unsigned char*) pdf_font_NimbusRom_MedIta;
+ *len = sizeof pdf_font_NimbusRomNo9L_MedIta;
+ return (unsigned char*) pdf_font_NimbusRomNo9L_MedIta;
}
if (!strcmp("Symbol", name)) {
*len = sizeof pdf_font_StandardSymL;
@@ -96,47 +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)
{
-#ifdef NODROIDFONT
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);
}
}
-#else
- if (mono) {
- *len = sizeof pdf_font_DroidSansMono;
- return (unsigned char*) pdf_font_DroidSansMono;
- } else {
- *len = sizeof pdf_font_DroidSans;
- return (unsigned char*) pdf_font_DroidSans;
- }
-#endif
}
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 c5e2ef78..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 */
@@ -720,7 +709,7 @@ void pdf_update_page(pdf_document *doc, pdf_page *page)
*/
if (page->tmp_annots)
{
- pdf_free_annot(ctx, page->tmp_annots);
+ pdf_drop_annot(ctx, page->tmp_annots);
page->tmp_annots = NULL;
}
@@ -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 b94e508a..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_close(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)
{
@@ -997,45 +994,45 @@ 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:
fz_throw(ctx, FZ_ERROR_GENERIC, "sample stream bit depth %d unsupported", bps);
}
-
+
func->u.sa.samples[i] = s;
}
}
fz_always(ctx)
{
- fz_close(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));
}
}
}
@@ -1363,7 +1359,7 @@ eval_stitching_func(fz_context *ctx, pdf_function *func, float in, float *out)
*/
static void
-pdf_free_function_imp(fz_context *ctx, fz_storable *func_)
+pdf_drop_function_imp(fz_context *ctx, fz_storable *func_)
{
pdf_function *func = (pdf_function *)func_;
int i;
@@ -1620,58 +1616,57 @@ 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_free_function_imp, dict)) != NULL)
+ if ((func = pdf_find_item(ctx, pdf_drop_function_imp, dict)) != NULL)
{
return (fz_function *)func;
}
func = fz_malloc_struct(ctx, pdf_function);
- FZ_INIT_STORABLE(&func->base, 1, pdf_free_function_imp);
+ FZ_INIT_STORABLE(&func->base, 1, pdf_drop_function_imp);
func->base.size = sizeof(*func);
func->base.evaluate = pdf_eval_function;
#ifndef NDEBUG
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 ffd21dd6..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,17 +277,16 @@ 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_free_image, dict)) != NULL)
+ if ((image = pdf_find_item(ctx, fz_drop_image_imp, dict)) != NULL)
{
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 359f6eda..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;
@@ -55,9 +58,9 @@ pdf_clear_stack(pdf_csi *csi)
}
static void
-pdf_free_csi(pdf_csi *csi)
+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_free_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 */
@@ -557,7 +565,7 @@ pdf_process_annot(pdf_document *doc, pdf_page *page, pdf_annot *annot, const pdf
}
fz_always(ctx)
{
- pdf_free_csi(csi);
+ pdf_drop_csi(csi);
}
fz_catch(ctx)
{
@@ -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_close(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_close(file);
+ fz_drop_stream(ctx, file);
}
fz_catch(ctx)
{
@@ -614,19 +625,18 @@ 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);
}
fz_always(ctx)
{
- pdf_free_csi(csi);
+ pdf_drop_csi(csi);
}
fz_catch(ctx)
{
@@ -636,19 +646,18 @@ 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);
}
fz_always(ctx)
{
- pdf_free_csi(csi);
+ pdf_drop_csi(csi);
}
fz_catch(ctx)
{
diff --git a/source/pdf/pdf-lex.c b/source/pdf/pdf-lex.c
index 6a4033f9..a8dfd916 100644
--- a/source/pdf/pdf-lex.c
+++ b/source/pdf/pdf-lex.c
@@ -21,6 +21,8 @@
'a':case'b':case'c':case'd':case'e':case'f'
#define RANGE_A_F \
'A':case'B':case'C':case'D':case'E':case'F'
+#define RANGE_0_7 \
+ '0':case'1':case'2':case'3':case'4':case'5':case'6':case'7'
static inline int iswhite(int ch)
{
@@ -42,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;
@@ -87,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 '.':
@@ -97,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)
@@ -113,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:
@@ -123,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);
@@ -138,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);
@@ -157,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:
@@ -189,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:
@@ -207,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;
@@ -230,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;
@@ -242,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:
@@ -261,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:
@@ -290,28 +292,28 @@ lex_string(fz_stream *f, pdf_lexbuf *lb)
case '\\':
*s++ = '\\';
break;
- case RANGE_0_9:
+ case RANGE_0_7:
oct = c - '0';
- c = fz_read_byte(f);
- if (c >= '0' && c <= '9')
+ c = fz_read_byte(ctx, f);
+ if (c >= '0' && c <= '7')
{
oct = oct * 8 + (c - '0');
- c = fz_read_byte(f);
- if (c >= '0' && c <= '9')
+ 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;
@@ -328,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;
@@ -339,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:
@@ -363,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:
@@ -414,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;
@@ -498,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;
@@ -541,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;
@@ -550,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;
@@ -561,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);
}
}
@@ -579,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 a3c44fe2..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_free_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_free_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_free_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_free_array(obj);
- else if (obj->kind == PDF_DICT)
- pdf_free_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_close(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 22436ce5..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_close_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_close_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 22e6a4be..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
{
@@ -671,6 +672,13 @@ pdf_show_pattern(pdf_csi *csi, pdf_run_state *pr, pdf_pattern *pat, pdf_gstate *
y0 = floorf(fy0 + 0.001);
x1 = ceilf(fx1 - 0.001);
y1 = ceilf(fy1 - 0.001);
+ /* The above adjustments cause problems for sufficiently
+ * large values for xstep/ystep which may be used if the
+ * pattern is expected to be rendered exactly once. */
+ if (fx1 > fx0 && x1 == x0)
+ x1 = x0 + 1;
+ if (fy1 > fy0 && y1 == y0)
+ y1 = y0 + 1;
for (y = y0; y < y1; y++)
{
@@ -713,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;
@@ -732,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);
@@ -746,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);
@@ -818,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;
}
@@ -842,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);
}
}
@@ -853,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;
}
@@ -883,37 +892,37 @@ 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);
}
fz_always(ctx)
{
- fz_free_path(ctx, path);
+ fz_drop_path(ctx, path);
}
fz_catch(ctx)
{
@@ -971,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)
{
@@ -980,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;
}
@@ -1010,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;
}
@@ -1036,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;
}
@@ -1044,7 +1053,7 @@ pdf_flush_text(pdf_csi *csi, pdf_run_state *pr)
}
fz_always(ctx)
{
- fz_free_text(ctx, text);
+ fz_drop_text(ctx, text);
}
fz_catch(ctx)
{
@@ -1224,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));
}
}
@@ -1321,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++)
@@ -1345,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;
@@ -1404,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)
{
@@ -1422,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;
}
@@ -1436,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)
{
@@ -1458,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");
@@ -1468,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;
@@ -1533,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)
@@ -1549,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)
{
@@ -1578,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");
}
}
@@ -1595,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;
@@ -1607,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);
@@ -1646,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;
@@ -1687,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)
{
@@ -1720,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)
{
@@ -1734,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;
@@ -1751,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;
@@ -1764,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;
@@ -1840,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);
@@ -1880,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)
{
@@ -1924,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)
{
@@ -1949,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));
}
}
@@ -1992,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);
}
@@ -2002,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];
@@ -2013,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);
}
@@ -2023,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];
}
@@ -2043,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);
}
@@ -2077,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;
@@ -2168,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;
@@ -2179,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);
@@ -2307,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)
@@ -2329,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;
@@ -2336,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];
}
@@ -2389,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);
}
@@ -2398,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);
@@ -2416,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)
@@ -2429,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];
}
@@ -2438,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);
}
@@ -2449,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)
@@ -2459,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)
@@ -2479,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];
@@ -2499,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);
}
@@ -2517,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)
{
@@ -2559,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)
@@ -2569,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];
}
@@ -2582,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)
@@ -2618,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)
@@ -2633,10 +2645,10 @@ 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_free_path(ctx, pr->path);
- if (pr->text) fz_free_text(ctx, pr->text);
+ if (pr->path) fz_drop_path(ctx, pr->path);
+ if (pr->text) fz_drop_text(ctx, pr->text);
fz_free(ctx, pr->gstate);
fz_free(ctx, pr);
@@ -2649,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 */
@@ -2803,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);
@@ -2842,7 +2853,7 @@ pdf_process *pdf_process_run(pdf_process *process, fz_device *dev, const fz_matr
}
fz_catch(ctx)
{
- fz_free_path(ctx, pr->path);
+ fz_drop_path(ctx, pr->path);
fz_free(ctx, pr);
fz_rethrow(ctx);
}
diff --git a/source/pdf/pdf-outline.c b/source/pdf/pdf-outline.c
index 44273dda..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,30 +26,30 @@ 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)
{
- fz_free_outline(ctx, first);
+ fz_drop_outline(ctx, first);
fz_rethrow(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 6543b7dc..7917afbf 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_new_page(ctx, sizeof *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 = fz_malloc_struct(ctx, pdf_page);
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_free_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_free_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_free_annot(doc->ctx, page->annots);
- if (page->deleted_annots)
- pdf_free_annot(doc->ctx, page->deleted_annots);
- if (page->tmp_annots)
- pdf_free_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 f13a49c9..93fbdd3e 100644
--- a/source/pdf/pdf-pattern.c
+++ b/source/pdf/pdf-pattern.c
@@ -13,14 +13,14 @@ pdf_drop_pattern(fz_context *ctx, pdf_pattern *pat)
}
static void
-pdf_free_pattern_imp(fz_context *ctx, fz_storable *pat_)
+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,51 +33,50 @@ 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_free_pattern_imp, dict)) != NULL)
+ if ((pat = pdf_find_item(ctx, pdf_drop_pattern_imp, dict)) != NULL)
{
return pat;
}
pat = fz_malloc_struct(ctx, pdf_pattern);
- FZ_INIT_STORABLE(pat, 1, pdf_free_pattern_imp);
+ FZ_INIT_STORABLE(pat, 1, pdf_drop_pattern_imp);
pat->resources = NULL;
pat->contents = NULL;
/* 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_free_pattern_imp, dict);
+ 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 a36d1592..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_free_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_free_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 7e35c5fb..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_close(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_lexbuf *buf)
+pdf_repair_xref(fz_context *ctx, pdf_document *doc)
{
pdf_obj *dict, *obj = NULL;
pdf_obj *length;
@@ -257,7 +255,7 @@ pdf_repair_xref(pdf_document *doc, pdf_lexbuf *buf)
pdf_token tok;
int next;
int i, n, c;
- fz_context *ctx = doc->ctx;
+ pdf_lexbuf *buf = &doc->lexbuf.base;
fz_var(encrypt);
fz_var(id);
@@ -267,14 +265,14 @@ pdf_repair_xref(pdf_document *doc, pdf_lexbuf *buf)
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)
{
@@ -284,34 +282,34 @@ pdf_repair_xref(pdf_document *doc, pdf_lexbuf *buf)
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)
{
@@ -345,7 +343,7 @@ pdf_repair_xref(pdf_document *doc, pdf_lexbuf *buf)
{
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)
{
@@ -393,7 +391,7 @@ pdf_repair_xref(pdf_document *doc, pdf_lexbuf *buf)
{
fz_try(ctx)
{
- dict = pdf_parse_dict(doc, doc->file, buf);
+ dict = pdf_parse_dict(ctx, doc, doc->file, buf);
}
fz_catch(ctx)
{
@@ -405,35 +403,35 @@ pdf_repair_xref(pdf_document *doc, pdf_lexbuf *buf)
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;
}
@@ -442,7 +440,7 @@ pdf_repair_xref(pdf_document *doc, pdf_lexbuf *buf)
else
{
if (tok == PDF_TOK_ERROR)
- fz_read_byte(doc->file);
+ fz_read_byte(ctx, doc->file);
num = 0;
gen = 0;
}
@@ -457,11 +455,11 @@ pdf_repair_xref(pdf_document *doc, pdf_lexbuf *buf)
*/
/* 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;
@@ -471,26 +469,26 @@ pdf_repair_xref(pdf_document *doc, pdf_lexbuf *buf)
/* 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;
@@ -502,57 +500,57 @@ pdf_repair_xref(pdf_document *doc, pdf_lexbuf *buf)
/* 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;
}
@@ -560,50 +558,49 @@ pdf_repair_xref(pdf_document *doc, pdf_lexbuf *buf)
}
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 40728dc7..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);
@@ -330,7 +317,7 @@ pdf_load_shading_dict(pdf_document *doc, pdf_obj *dict, const fz_matrix *transfo
fz_try(ctx)
{
shade = fz_malloc_struct(ctx, fz_shade);
- FZ_INIT_STORABLE(shade, 1, fz_free_shade_imp);
+ FZ_INIT_STORABLE(shade, 1, fz_drop_shade_imp);
shade->type = FZ_MESH_TYPE4;
shade->use_background = 0;
shade->use_function = 0;
@@ -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,47 +436,46 @@ 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_free_shade_imp, dict)) != NULL)
+ if ((shade = pdf_find_item(ctx, fz_drop_shade_imp, dict)) != NULL)
{
return shade;
}
/* 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 dfb2f54c..51255414 100644
--- a/source/pdf/pdf-store.c
+++ b/source/pdf/pdf-store.c
@@ -1,47 +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));
- } else
- pdf_fprint_obj(out, key, 0);
+ fprintf(out, "(%d %d R) ", pdf_to_num(ctx, key), pdf_to_gen(ctx, key));
+ }
+ else
+ pdf_fprint_obj(ctx, out, key, 0);
}
#endif
@@ -65,13 +66,13 @@ pdf_store_item(fz_context *ctx, pdf_obj *key, void *val, unsigned int itemsize)
}
void *
-pdf_find_item(fz_context *ctx, fz_store_free_fn *free, pdf_obj *key)
+pdf_find_item(fz_context *ctx, fz_store_drop_fn *drop, pdf_obj *key)
{
- return fz_find_item(ctx, free, key, &pdf_obj_store_type);
+ return fz_find_item(ctx, drop, key, &pdf_obj_store_type);
}
void
-pdf_remove_item(fz_context *ctx, fz_store_free_fn *free, pdf_obj *key)
+pdf_remove_item(fz_context *ctx, fz_store_drop_fn *drop, pdf_obj *key)
{
- fz_remove_item(ctx, free, key, &pdf_obj_store_type);
+ fz_remove_item(ctx, drop, key, &pdf_obj_store_type);
}
diff --git a/source/pdf/pdf-stream.c b/source/pdf/pdf-stream.c
index eb6b616e..2335e67a 100644
--- a/source/pdf/pdf-stream.c
+++ b/source/pdf/pdf-stream.c
@@ -4,16 +4,15 @@
* 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;
- pdf_cache_object(doc, num, gen);
+ entry = pdf_cache_object(ctx, doc, num, gen);
- entry = pdf_get_xref_entry(doc, num);
return entry->stm_ofs != 0 || entry->stm_buf;
}
@@ -27,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;
}
}
@@ -47,22 +46,21 @@ 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);
- if ((globals = pdf_find_item(ctx, fz_free_jbig2_globals_imp, dict)) != NULL)
+ if ((globals = pdf_find_item(ctx, fz_drop_jbig2_globals_imp, dict)) != NULL)
{
return globals;
}
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);
}
@@ -82,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"))
@@ -154,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"))
{
@@ -168,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 */
@@ -185,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"))
@@ -217,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;
}
@@ -234,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_close(chain);
+ fz_drop_stream(ctx, chain);
fz_rethrow(ctx);
}
@@ -273,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;
}
@@ -304,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_close(chain);
- fz_rethrow(doc->ctx);
+ fz_drop_stream(ctx, chain);
+ fz_rethrow(ctx);
}
return chain;
@@ -345,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)
@@ -377,15 +371,15 @@ 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);
}
fz_catch(ctx)
{
- fz_free_compressed_buffer(ctx, bc);
+ fz_drop_compressed_buffer(ctx, bc);
fz_rethrow(ctx);
}
image->buffer = bc;
@@ -395,43 +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);
-
- pdf_cache_object(doc, 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_get_xref_entry(doc, num);
+ 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);
- pdf_cache_object(doc, num, gen);
-
- x = pdf_get_xref_entry(doc, num);
+ 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);
}
/*
@@ -440,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_close(stm);
+ fz_drop_stream(ctx, stm);
return buf;
}
@@ -509,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;
@@ -519,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_close(stm);
+ fz_drop_stream(ctx, stm);
}
fz_catch(ctx)
{
@@ -562,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)
{
@@ -592,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)
{
@@ -621,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 078719a6..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_free_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 c4259466..e169a27a 100644
--- a/source/pdf/pdf-xobject.c
+++ b/source/pdf/pdf-xobject.c
@@ -13,15 +13,15 @@ pdf_drop_xobject(fz_context *ctx, pdf_xobject *xobj)
}
static void
-pdf_free_xobject_imp(fz_context *ctx, fz_storable *xobj_)
+pdf_drop_xobject_imp(fz_context *ctx, fz_storable *xobj_)
{
pdf_xobject *xobj = (pdf_xobject *)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,19 +34,18 @@ 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_free_xobject_imp, dict)) != NULL)
+ if ((form = pdf_find_item(ctx, pdf_drop_xobject_imp, dict)) != NULL)
{
return form;
}
form = fz_malloc_struct(ctx, pdf_xobject);
- FZ_INIT_STORABLE(form, 1, pdf_free_xobject_imp);
+ FZ_INIT_STORABLE(form, 1, pdf_drop_xobject_imp);
form->resources = NULL;
form->contents = NULL;
form->colorspace = 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_free_xobject_imp, dict);
+ 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,55 +132,55 @@ 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);
- FZ_INIT_STORABLE(form, 1, pdf_free_xobject_imp);
+ FZ_INIT_STORABLE(form, 1, pdf_drop_xobject_imp);
form->resources = NULL;
form->contents = NULL;
form->colorspace = NULL;
@@ -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 5308a272..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_free_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_free_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_free_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);
@@ -57,6 +56,19 @@ static void pdf_free_xref_sections(pdf_document *doc)
doc->num_xref_sections = 0;
}
+static void
+extend_xref_index(fz_context *ctx, pdf_document *doc, int newlen)
+{
+ int i;
+
+ doc->xref_index = fz_resize_array(ctx, doc->xref_index, newlen, sizeof(int));
+ for (i = doc->max_xref_len; i < newlen; i++)
+ {
+ doc->xref_index[i] = 0;
+ }
+ doc->max_xref_len = newlen;
+}
+
/* This is only ever called when we already have an incremental
* xref. This means there will only be 1 subsec, and it will be
* a complete subsec. */
@@ -84,13 +96,13 @@ static void pdf_resize_xref(fz_context *ctx, pdf_document *doc, int newlen)
xref->num_objects = newlen;
sub->len = newlen;
if (doc->max_xref_len < newlen)
- doc->max_xref_len = 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];
@@ -100,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];
@@ -108,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;
}
@@ -128,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;
@@ -174,11 +185,11 @@ ensure_solid_xref(pdf_document *doc, int num, int which)
xref->num_objects = num;
xref->subsec = new_sub;
if (doc->max_xref_len < num)
- doc->max_xref_len = num;
+ extend_xref_index(ctx, doc, num);
}
/* 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;
@@ -186,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];
@@ -204,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;
@@ -215,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;
@@ -225,12 +235,17 @@ pdf_xref_entry *pdf_get_xref_entry(pdf_document *doc, int i)
if (i < 0)
fz_throw(ctx, FZ_ERROR_GENERIC, "Negative object number requested");
+ if (i <= doc->max_xref_len)
+ j = doc->xref_index[i];
+ else
+ j = 0;
+
/* Find the first xref section where the entry is defined. */
- for (j = 0; j < doc->num_xref_sections; j++)
+ for (; j < doc->num_xref_sections; j++)
{
xref = &doc->xref_sections[j];
- if (i >= 0 && i < xref->num_objects)
+ if (i < xref->num_objects)
{
for (sub = xref->subsec; sub != NULL; sub = sub->next)
{
@@ -241,13 +256,17 @@ pdf_xref_entry *pdf_get_xref_entry(pdf_document *doc, int i)
entry = &sub->table[i - sub->start];
if (entry->type)
+ {
+ doc->xref_index[i] = j;
return entry;
+ }
}
}
}
/* Didn't find the entry in any section. Return the entry from
* the final section. */
+ doc->xref_index[i] = 0;
if (i < xref->num_objects)
{
xref = &doc->xref_sections[0];
@@ -262,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];
@@ -273,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)
{
@@ -284,12 +302,13 @@ static void ensure_incremental_xref(pdf_document *doc)
pdf_xref_entry *new_table = fz_calloc(ctx, xref->num_objects, sizeof(pdf_xref_entry));
pdf_xref_subsec *sub;
pdf_obj *trailer = NULL;
+ int i;
fz_var(trailer);
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];
@@ -308,21 +327,26 @@ 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);
}
+
+ /* Update the xref_index */
+ for (i = 0; i < doc->max_xref_len; i++)
+ {
+ doc->xref_index[i]++;
+ }
}
}
/* 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)
@@ -331,10 +355,11 @@ static pdf_xref_entry *pdf_get_incremental_xref_entry(pdf_document *doc, int i)
sub = xref->subsec;
assert(sub != NULL && sub->next == NULL);
assert(i >= sub->start && i < sub->start + sub->len);
+ doc->xref_index[i] = 0;
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;
@@ -346,26 +371,26 @@ 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 = 0; i < doc->num_xref_sections; i++)
+ for (i = doc->xref_index[num]; i < doc->num_xref_sections; i++)
{
pdf_xref *xref = &doc->xref_sections[i];
@@ -386,28 +411,29 @@ void pdf_xref_ensure_incremental_object(pdf_document *doc, int num)
return;
/* 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;
+ 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)
{
+ doc->xref_index = fz_calloc(ctx, n, sizeof(int));
xref = fz_malloc_struct(ctx, pdf_xref);
sub = fz_malloc_struct(ctx, pdf_xref_subsec);
/* The new table completely replaces the previous separate sections */
- pdf_free_xref_sections(doc);
+ pdf_drop_xref_sections(ctx, doc);
sub->table = entries;
sub->start = 0;
@@ -420,11 +446,13 @@ void pdf_replace_xref(pdf_document *doc, pdf_xref_entry *entries, int n)
doc->xref_sections = xref;
doc->num_xref_sections = 1;
doc->max_xref_len = n;
+
+ memset(doc->xref_index, 0, sizeof(int)*doc->max_xref_len);
}
fz_catch(ctx)
{
fz_free(ctx, xref);
- pdf_drop_obj(trailer);
+ pdf_drop_obj(ctx, trailer);
fz_rethrow(ctx);
}
}
@@ -434,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--)
{
@@ -478,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");
}
/*
@@ -486,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;
@@ -500,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;
@@ -619,20 +646,23 @@ pdf_xref_find_subsection(pdf_document *doc, int ofs, int len)
}
xref->num_objects = new_max;
if (doc->max_xref_len < new_max)
- doc->max_xref_len = new_max;
+ extend_xref_index(ctx, doc, new_max);
}
else
{
/* Case 3 */
- ensure_solid_xref(doc, new_max, 0);
+ ensure_solid_xref(ctx, doc, new_max, doc->num_xref_sections-1);
+ xref = &doc->xref_sections[doc->num_xref_sections-1];
sub = xref->subsec;
}
return &sub->table[ofs-sub->start];
}
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;
@@ -640,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, " "));
@@ -661,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;
@@ -694,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];
@@ -737,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)
{
@@ -761,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;
@@ -770,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");
}
@@ -790,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");
@@ -814,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_close(stm);
+ fz_drop_stream(ctx, stm);
}
fz_catch(ctx)
{
- pdf_drop_obj(trailer);
+ pdf_drop_obj(ctx, trailer);
fz_rethrow(ctx);
}
@@ -854,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");
}
@@ -892,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;
@@ -922,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)
@@ -939,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)
{
@@ -959,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;
@@ -971,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;
}
@@ -987,6 +1013,32 @@ pdf_read_xref_sections(pdf_document *doc, int ofs, pdf_lexbuf *buf, int read_pre
}
}
+static void
+pdf_prime_xref_index(fz_context *ctx, pdf_document *doc)
+{
+ int i, j;
+ int *idx = doc->xref_index;
+
+ for (i = doc->num_xref_sections-1; i >= 0; i--)
+ {
+ pdf_xref *xref = &doc->xref_sections[i];
+ pdf_xref_subsec *subsec = xref->subsec;
+ while (subsec != NULL)
+ {
+ int start = subsec->start;
+ int end = subsec->start + subsec->len;
+ for (j = start; j < end; j++)
+ {
+ char t = subsec->table[j-start].type;
+ if (t != 0 && t != 'f')
+ idx[j] = i;
+ }
+
+ subsec = subsec->next;
+ }
+ }
+}
+
/*
* load xref tables from pdf
*
@@ -994,21 +1046,22 @@ pdf_read_xref_sections(pdf_document *doc, int ofs, pdf_lexbuf *buf, int read_pre
*/
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");
- entry = pdf_get_xref_entry(doc, 0);
+ pdf_prime_xref_index(ctx, doc);
+
+ entry = pdf_get_xref_entry(ctx, doc, 0);
/* broken pdfs where first object is missing */
if (!entry->type)
{
@@ -1020,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,
@@ -1034,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);
@@ -1055,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;
@@ -1095,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 */
@@ -1149,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)
@@ -1166,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)
@@ -1199,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));
@@ -1224,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;
@@ -1239,16 +1290,16 @@ pdf_read_ocg(pdf_document *doc)
fz_rethrow(ctx);
}
- pdf_ocg_set_config(doc, 0);
+ pdf_ocg_set_config(ctx, doc, 0);
}
static void
-pdf_free_ocg(fz_context *ctx, pdf_ocg_descriptor *desc)
+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);
}
@@ -1259,9 +1310,8 @@ pdf_free_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;
@@ -1273,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_free_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;
@@ -1307,33 +1357,38 @@ pdf_init_document(pdf_document *doc)
int hasroot, hasinfo;
if (repaired)
- pdf_repair_xref(doc, &doc->lexbuf.base);
+ {
+ /* 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(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)
{
@@ -1344,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)
{
@@ -1393,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);
@@ -1406,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
@@ -1424,21 +1477,22 @@ pdf_close_document(pdf_document *doc)
if (doc->js)
doc->drop_js(doc->js);
- pdf_free_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_close(doc->file);
+ fz_drop_stream(ctx, doc->file);
if (doc->crypt)
- pdf_free_crypt(ctx, 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);
}
@@ -1450,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);
}
@@ -1462,24 +1516,24 @@ pdf_close_document(pdf_document *doc)
}
fz_free(ctx, doc->type3_fonts);
- pdf_free_ocg(ctx, doc->ocg);
+ pdf_drop_ocg(ctx, doc->ocg);
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,
@@ -1493,8 +1547,8 @@ pdf_print_xref(pdf_document *doc)
* compressed object streams
*/
-static void
-pdf_load_obj_stm(pdf_document *doc, int num, int gen, pdf_lexbuf *buf)
+static pdf_xref_entry *
+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;
@@ -1506,7 +1560,7 @@ pdf_load_obj_stm(pdf_document *doc, int num, int gen, pdf_lexbuf *buf)
int count;
int i;
pdf_token tok;
- fz_context *ctx = doc->ctx;
+ pdf_xref_entry *ret_entry = NULL;
fz_var(numbuf);
fz_var(ofsbuf);
@@ -1515,10 +1569,10 @@ pdf_load_obj_stm(pdf_document *doc, int num, int gen, pdf_lexbuf *buf)
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");
@@ -1528,39 +1582,39 @@ pdf_load_obj_stm(pdf_document *doc, int num, int gen, pdf_lexbuf *buf)
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)
{
@@ -1570,51 +1624,55 @@ pdf_load_obj_stm(pdf_document *doc, int num, int gen, pdf_lexbuf *buf)
* a pointer to the old one will be left with a
* stale pointer. Instead, we drop the new one
* and trust that the old one is correct. */
- if (entry->obj) {
- if (pdf_objcmp(entry->obj, obj))
+ if (entry->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);
- } else
+ pdf_drop_obj(ctx, obj);
+ }
+ else
entry->obj = obj;
+ if (numbuf[i] == target)
+ ret_entry = entry;
}
else
{
- pdf_drop_obj(obj);
+ pdf_drop_obj(ctx, obj);
}
}
}
fz_always(ctx)
{
- fz_close(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)
{
fz_rethrow_message(ctx, "cannot open object stream (%d %d R)", num, gen);
}
+ return ret_entry;
}
/*
* 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! */
@@ -1625,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! */
@@ -1639,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));
@@ -1658,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
@@ -1676,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 */
{
@@ -1689,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));
@@ -1699,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
{
@@ -1719,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
{
@@ -1729,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;
@@ -1742,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)
{
@@ -1760,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;
@@ -1777,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);
@@ -1791,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)
{
@@ -1819,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)
{
@@ -1832,38 +1888,37 @@ read_hinted_object(pdf_document *doc, int num)
return 1;
}
-void
-pdf_cache_object(pdf_document *doc, int num, int gen)
+pdf_xref_entry *
+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)
- return;
+ 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)
@@ -1874,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;
}
@@ -1883,7 +1938,8 @@ object_updated:
{
fz_try(ctx)
{
- pdf_repair_xref(doc, &doc->lexbuf.base);
+ pdf_repair_xref(ctx, doc);
+ pdf_prime_xref_index(ctx, doc);
}
fz_catch(ctx)
{
@@ -1904,18 +1960,19 @@ object_updated:
{
fz_try(ctx)
{
- pdf_load_obj_stm(doc, x->ofs, 0, &doc->lexbuf.base);
+ x = pdf_load_obj_stm(ctx, doc, x->ofs, 0, &doc->lexbuf.base, num);
}
fz_catch(ctx)
{
fz_rethrow_message(ctx, "cannot load object stream containing object (%d %d R)", num, gen);
}
- x = pdf_get_xref_entry(doc, num);
+ if (x == NULL)
+ fz_throw(ctx, FZ_ERROR_GENERIC, "cannot load object stream containing object (%d %d R)", num, gen);
if (!x->obj)
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;
}
@@ -1928,54 +1985,52 @@ 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)
{
- pdf_cache_object(doc, num, gen);
+ entry = pdf_cache_object(ctx, doc, num, gen);
}
fz_catch(ctx)
{
fz_rethrow_message(ctx, "cannot load object (%d %d R) into cache", num, gen);
}
- entry = pdf_get_xref_entry(doc, num);
+ assert(entry->obj != NULL);
- assert(entry->obj);
-
- 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)
{
@@ -1985,7 +2040,7 @@ pdf_resolve_indirect(pdf_obj *ref)
fz_try(ctx)
{
- pdf_cache_object(doc, num, gen);
+ entry = pdf_cache_object(ctx, doc, num, gen);
}
fz_catch(ctx)
{
@@ -1993,8 +2048,8 @@ pdf_resolve_indirect(pdf_obj *ref)
fz_warn(ctx, "cannot load object (%d %d R) into cache", num, gen);
return NULL;
}
- entry = pdf_get_xref_entry(doc, num);
- if (!entry->obj)
+
+ if (entry->obj == NULL)
return NULL;
ref = entry->obj;
}
@@ -2003,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;
@@ -2025,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;
@@ -2049,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)
{
@@ -2103,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;
@@ -2130,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)
@@ -2150,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;
}
@@ -2162,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)
@@ -2170,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.
@@ -2192,28 +2240,18 @@ pdf_new_document(fz_context *ctx, fz_stream *file)
{
pdf_document *doc = fz_malloc_struct(ctx, pdf_document);
+ doc->super.refs = 1;
doc->super.close = (fz_document_close_fn *)pdf_close_document;
doc->super.needs_password = (fz_document_needs_password_fn *)pdf_needs_password;
doc->super.authenticate_password = (fz_document_authenticate_password_fn *)pdf_authenticate_password;
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_free_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;
}
@@ -2222,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;
@@ -2250,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_close(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);
@@ -2286,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) */
@@ -2304,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;
@@ -2351,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. */
@@ -2402,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;
@@ -2415,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;
@@ -2423,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;
@@ -2466,7 +2500,7 @@ pdf_load_hints(pdf_document *doc, int objnum, int gennum)
}
fz_always(ctx)
{
- fz_close(stream);
+ fz_drop_stream(ctx, stream);
}
fz_catch(ctx)
{
@@ -2482,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)
@@ -2497,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)
{
@@ -2522,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];
@@ -2541,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);
@@ -2556,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);
@@ -2566,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)
@@ -2597,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);
}
@@ -2620,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;
@@ -2671,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;
@@ -2694,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;
@@ -2712,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;
}
}
@@ -2723,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;
@@ -2742,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;
}
}