summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorTor Andersson <tor.andersson@artifex.com>2018-02-27 18:15:58 +0100
committerTor Andersson <tor.andersson@artifex.com>2018-06-02 02:08:18 +0200
commitf2c1f0ce45cc7f84a2d81e2f1948549fb9b7659a (patch)
tree4098ac7f587270b3c22c0da6a316f0840d7fd4e5 /source
parent9f7f99a2aafb5d0d5f7cdb311a72a3fb563ec8fe (diff)
downloadmupdf-f2c1f0ce45cc7f84a2d81e2f1948549fb9b7659a.tar.xz
Rework XObject form creation/updating.
Diffstat (limited to 'source')
-rw-r--r--source/pdf/pdf-appearance.c14
-rw-r--r--source/pdf/pdf-xobject.c61
2 files changed, 32 insertions, 43 deletions
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);
}