diff options
author | Tor Andersson <tor.andersson@artifex.com> | 2018-02-27 18:15:58 +0100 |
---|---|---|
committer | Tor Andersson <tor.andersson@artifex.com> | 2018-06-02 02:08:18 +0200 |
commit | f2c1f0ce45cc7f84a2d81e2f1948549fb9b7659a (patch) | |
tree | 4098ac7f587270b3c22c0da6a316f0840d7fd4e5 | |
parent | 9f7f99a2aafb5d0d5f7cdb311a72a3fb563ec8fe (diff) | |
download | mupdf-f2c1f0ce45cc7f84a2d81e2f1948549fb9b7659a.tar.xz |
Rework XObject form creation/updating.
-rw-r--r-- | include/mupdf/pdf/resource.h | 4 | ||||
-rw-r--r-- | source/pdf/pdf-appearance.c | 14 | ||||
-rw-r--r-- | source/pdf/pdf-xobject.c | 61 |
3 files changed, 34 insertions, 45 deletions
diff --git a/include/mupdf/pdf/resource.h b/include/mupdf/pdf/resource.h index c98ba9df..2febc8b7 100644 --- a/include/mupdf/pdf/resource.h +++ b/include/mupdf/pdf/resource.h @@ -79,8 +79,8 @@ void pdf_drop_pattern(fz_context *ctx, pdf_pattern *pat); * XObject */ -pdf_obj *pdf_new_xobject(fz_context *ctx, pdf_document *doc, const fz_rect *bbox, const fz_matrix *mat); -void pdf_update_xobject_contents(fz_context *ctx, pdf_document *doc, pdf_obj *form, fz_buffer *buffer); +pdf_obj *pdf_new_xobject(fz_context *ctx, pdf_document *doc, const fz_rect *bbox, const fz_matrix *mat, pdf_obj *res, fz_buffer *buffer); +void pdf_update_xobject(fz_context *ctx, pdf_document *doc, pdf_obj *xobj, const fz_rect *bbox, const fz_matrix *mat, pdf_obj *res, fz_buffer *buffer); pdf_obj *pdf_xobject_resources(fz_context *ctx, pdf_obj *xobj); fz_rect *pdf_xobject_bbox(fz_context *ctx, pdf_obj *xobj, fz_rect *bbox); diff --git a/source/pdf/pdf-appearance.c b/source/pdf/pdf-appearance.c index b7f8f31b..2bb025aa 100644 --- a/source/pdf/pdf-appearance.c +++ b/source/pdf/pdf-appearance.c @@ -1007,7 +1007,7 @@ static pdf_obj *load_or_create_form(fz_context *ctx, pdf_document *doc, pdf_obj formobj = pdf_dict_get(ctx, ap, PDF_NAME(N)); if (formobj == NULL) { - formobj = pdf_new_xobject(ctx, doc, rect, &mat); + formobj = pdf_new_xobject(ctx, doc, rect, &mat, NULL, NULL); pdf_dict_put_drop(ctx, ap, PDF_NAME(N), formobj); create_form = 1; } @@ -1104,7 +1104,7 @@ static void update_marked_content(fz_context *ctx, pdf_document *doc, pdf_obj *f } /* Use newbuf in place of the existing appearance stream */ - pdf_update_xobject_contents(ctx, doc, form, newbuf); + pdf_update_stream(ctx, doc, form, newbuf, 0); } fz_always(ctx) { @@ -1523,7 +1523,7 @@ void pdf_update_pushbutton_appearance(fz_context *ctx, pdf_document *doc, pdf_ob fzbuf_print_text(ctx, fzbuf, &clip, NULL, &font_rec, &mat, text); } - pdf_update_xobject_contents(ctx, doc, form, fzbuf); + pdf_update_stream(ctx, doc, form, fzbuf, 0); } fz_always(ctx) { @@ -1613,7 +1613,7 @@ void pdf_set_annot_appearance(fz_context *ctx, pdf_document *doc, pdf_annot *ann if (ap_obj == NULL) { - ap_obj = pdf_new_xobject(ctx, doc, &trect, &fz_identity); + ap_obj = pdf_new_xobject(ctx, doc, &trect, &fz_identity, NULL, NULL); pdf_dict_putl_drop(ctx, obj, ap_obj, PDF_NAME(AP), PDF_NAME(N), NULL); } else @@ -2307,9 +2307,9 @@ static void insert_signature_appearance_layers(fz_context *ctx, pdf_document *do fz_var(fzbuf); fz_try(ctx) { - 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); + main_ap = pdf_new_xobject(ctx, doc, &bbox, &fz_identity, NULL, NULL); + frm = pdf_new_xobject(ctx, doc, &bbox, &fz_identity, NULL, NULL); + n0 = pdf_new_xobject(ctx, doc, &bbox, &fz_identity, NULL, NULL); pdf_dict_putl(ctx, main_ap, frm, PDF_NAME(Resources), PDF_NAME(XObject), PDF_NAME(FRM), NULL); fzbuf = fz_new_buffer(ctx, 8); diff --git a/source/pdf/pdf-xobject.c b/source/pdf/pdf-xobject.c index 9ee8f12c..6afe3d06 100644 --- a/source/pdf/pdf-xobject.c +++ b/source/pdf/pdf-xobject.c @@ -65,51 +65,40 @@ pdf_xobject_colorspace(fz_context *ctx, pdf_obj *xobj) } pdf_obj * -pdf_new_xobject(fz_context *ctx, 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, pdf_obj *res, fz_buffer *contents) { - pdf_obj *form = NULL; - pdf_obj *dict = NULL; - pdf_obj *res = NULL; - pdf_obj *procset; - - fz_var(dict); - fz_var(res); - + pdf_obj *ind = NULL; + pdf_obj *form = pdf_new_dict(ctx, doc, 5); fz_try(ctx) { - dict = pdf_new_dict(ctx, doc, 0); - pdf_dict_put_rect(ctx, dict, PDF_NAME(BBox), bbox); - pdf_dict_put_int(ctx, dict, PDF_NAME(FormType), 1); - pdf_dict_put_int(ctx, dict, PDF_NAME(Length), 0); - pdf_dict_put_matrix(ctx, dict, PDF_NAME(Matrix), mat); - - res = pdf_new_dict(ctx, doc, 0); - pdf_dict_put(ctx, dict, PDF_NAME(Resources), res); - - procset = pdf_new_array(ctx, doc, 2); - pdf_dict_put_drop(ctx, res, PDF_NAME(ProcSet), procset); - pdf_array_push(ctx, procset, PDF_NAME(PDF)); - pdf_array_push(ctx, procset, PDF_NAME(Text)); - - pdf_dict_put(ctx, dict, PDF_NAME(Subtype), PDF_NAME(Form)); - pdf_dict_put(ctx, dict, PDF_NAME(Type), PDF_NAME(XObject)); - - form = pdf_add_object(ctx, doc, dict); - } - fz_always(ctx) - { - pdf_drop_obj(ctx, dict); - pdf_drop_obj(ctx, res); + pdf_dict_put(ctx, form, PDF_NAME(Type), PDF_NAME(XObject)); + pdf_dict_put(ctx, form, PDF_NAME(Subtype), PDF_NAME(Form)); + pdf_dict_put_rect(ctx, form, PDF_NAME(BBox), bbox); + if (mat) + pdf_dict_put_matrix(ctx, form, PDF_NAME(Matrix), mat); + if (res) + pdf_dict_put(ctx, form, PDF_NAME(Resources), res); + ind = pdf_add_stream(ctx, doc, contents, form, 0); } fz_catch(ctx) { + pdf_drop_obj(ctx, form); fz_rethrow(ctx); } - - return form; + return ind; } -void pdf_update_xobject_contents(fz_context *ctx, pdf_document *doc, pdf_obj *form, fz_buffer *buffer) +void +pdf_update_xobject(fz_context *ctx, pdf_document *doc, pdf_obj *form, const fz_rect *bbox, const fz_matrix *mat, pdf_obj *res, fz_buffer *contents) { - pdf_update_stream(ctx, doc, form, buffer, 0); + pdf_dict_put_rect(ctx, form, PDF_NAME(BBox), bbox); + if (mat) + pdf_dict_put_matrix(ctx, form, PDF_NAME(Matrix), mat); + else + pdf_dict_del(ctx, form, PDF_NAME(Matrix)); + if (res) + pdf_dict_put(ctx, form, PDF_NAME(Resources), res); + else + pdf_dict_del(ctx, form, PDF_NAME(Resources)); + pdf_update_stream(ctx, doc, form, contents, 0); } |