diff options
Diffstat (limited to 'source/pdf/pdf-appearance.c')
-rw-r--r-- | source/pdf/pdf-appearance.c | 472 |
1 files changed, 226 insertions, 246 deletions
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); } } |