summaryrefslogtreecommitdiff
path: root/source/pdf/pdf-device.c
diff options
context:
space:
mode:
Diffstat (limited to 'source/pdf/pdf-device.c')
-rw-r--r--source/pdf/pdf-device.c33
1 files changed, 18 insertions, 15 deletions
diff --git a/source/pdf/pdf-device.c b/source/pdf/pdf-device.c
index e3b63dc5..8b99c4f0 100644
--- a/source/pdf/pdf-device.c
+++ b/source/pdf/pdf-device.c
@@ -1350,6 +1350,8 @@ fz_device *pdf_page_write(fz_context *ctx, pdf_document *doc, pdf_page *page)
{
pdf_obj *resources = pdf_dict_get(ctx, page->me, PDF_NAME_Resources);
fz_matrix ctm;
+ pdf_obj *obj;
+
fz_pre_translate(fz_scale(&ctm, 1, -1), 0, page->mediabox.y0-page->mediabox.y1);
if (resources == NULL)
@@ -1358,22 +1360,23 @@ fz_device *pdf_page_write(fz_context *ctx, pdf_document *doc, pdf_page *page)
pdf_dict_put_drop(ctx, page->me, PDF_NAME_Resources, resources);
}
- if (page->contents == NULL)
+ /* We always make a new object for page->contents here, in case
+ * the existing one is an array, or is shared. */
+ obj = pdf_new_dict(ctx, doc, 0);
+ fz_try(ctx)
{
- pdf_obj *obj = pdf_new_dict(ctx, doc, 0);
- fz_try(ctx)
- {
- page->contents = pdf_new_ref(ctx, doc, obj);
- pdf_dict_put(ctx, page->me, PDF_NAME_Contents, page->contents);
- }
- fz_always(ctx)
- {
- pdf_drop_obj(ctx, obj);
- }
- fz_catch(ctx)
- {
- fz_rethrow(ctx);
- }
+ pdf_obj *new_contents = pdf_new_ref(ctx, doc, obj);
+ pdf_dict_put(ctx, page->me, PDF_NAME_Contents, new_contents);
+ pdf_drop_obj(ctx, page->contents);
+ page->contents = new_contents;
+ }
+ fz_always(ctx)
+ {
+ pdf_drop_obj(ctx, obj);
+ }
+ fz_catch(ctx)
+ {
+ fz_rethrow(ctx);
}
return pdf_new_pdf_device(ctx, doc, page->contents, resources, &ctm, NULL);