diff options
author | Robin Watts <robin.watts@artifex.com> | 2014-06-05 14:57:37 +0100 |
---|---|---|
committer | Robin Watts <robin.watts@artifex.com> | 2015-02-25 19:12:29 +0000 |
commit | c47220017efa6daccd6e12ebb93b0d82b892dad3 (patch) | |
tree | 4f167fe5582712a032ff5cf0503fd1a328309071 /source | |
parent | d4b742ab61f32abd7b49bb507e69c8d43f400bbc (diff) | |
download | mupdf-c47220017efa6daccd6e12ebb93b0d82b892dad3.tar.xz |
Allow pdf_device to be created with pre-populated buffer.
When watermarking, we may want to use the PDF device on an
existing buffer. In this case, we have no 'contents' object.
Diffstat (limited to 'source')
-rw-r--r-- | source/pdf/pdf-appearance.c | 2 | ||||
-rw-r--r-- | source/pdf/pdf-device.c | 29 |
2 files changed, 22 insertions, 9 deletions
diff --git a/source/pdf/pdf-appearance.c b/source/pdf/pdf-appearance.c index ce9bdb1f..830adeeb 100644 --- a/source/pdf/pdf-appearance.c +++ b/source/pdf/pdf-appearance.c @@ -1374,7 +1374,7 @@ void pdf_set_annot_appearance(fz_context *ctx, pdf_document *doc, pdf_annot *ann pdf_dict_puts_drop(ctx, ap_obj, "Matrix", pdf_new_matrix(ctx, doc, &mat)); } - dev = pdf_new_pdf_device(ctx, doc, ap_obj, pdf_dict_gets(ctx, ap_obj, "Resources"), &mat); + dev = pdf_new_pdf_device(ctx, doc, ap_obj, pdf_dict_gets(ctx, ap_obj, "Resources"), &mat, NULL); fz_run_display_list(ctx, disp_list, dev, &ctm, &fz_infinite_rect, NULL); fz_drop_device(ctx, dev); diff --git a/source/pdf/pdf-device.c b/source/pdf/pdf-device.c index b5db7e3a..39063447 100644 --- a/source/pdf/pdf-device.c +++ b/source/pdf/pdf-device.c @@ -41,6 +41,7 @@ typedef struct image_entry_s image_entry; struct image_entry_s { char digest[16]; + int id; pdf_obj *ref; }; @@ -77,6 +78,7 @@ struct pdf_device_s pdf_document *doc; pdf_obj *contents; pdf_obj *resources; + fz_buffer *buffer; int in_text; @@ -1234,7 +1236,8 @@ pdf_dev_drop_imp(fz_context *ctx, fz_device *dev) pdf_dev_end_text(ctx, pdev); - pdf_dict_puts_drop(ctx, pdev->contents, "Length", pdf_new_int(ctx, doc, gs->buf->len)); + if (pdev->contents) + 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--) { @@ -1251,10 +1254,17 @@ pdf_dev_drop_imp(fz_context *ctx, fz_device *dev) pdf_drop_obj(ctx, pdev->images[i].ref); } - pdf_update_stream(ctx, doc, pdf_to_num(ctx, pdev->contents), pdev->gstates[0].buf); - fz_drop_buffer(ctx, pdev->gstates[0].buf); + if (pdev->contents) + { + pdf_update_stream(ctx, doc, pdf_to_num(ctx, pdev->contents), pdev->gstates[0].buf); + pdf_drop_obj(ctx, pdev->contents); + } + + if (pdev->buffer != pdev->gstates[0].buf) + { + fz_drop_buffer(ctx, pdev->gstates[0].buf); + } - pdf_drop_obj(ctx, pdev->contents); pdf_drop_obj(ctx, pdev->resources); fz_free(ctx, pdev->images); @@ -1262,7 +1272,7 @@ pdf_dev_drop_imp(fz_context *ctx, fz_device *dev) fz_free(ctx, pdev->gstates); } -fz_device *pdf_new_pdf_device(fz_context *ctx, pdf_document *doc, pdf_obj *contents, pdf_obj *resources, const fz_matrix *ctm) +fz_device *pdf_new_pdf_device(fz_context *ctx, pdf_document *doc, pdf_obj *contents, pdf_obj *resources, const fz_matrix *ctm, fz_buffer *buf) { pdf_device *dev = fz_new_device(ctx, sizeof *dev); @@ -1296,11 +1306,14 @@ fz_device *pdf_new_pdf_device(fz_context *ctx, pdf_document *doc, pdf_obj *conte fz_try(ctx) { + dev->buffer = fz_keep_buffer(ctx, buf); + if (!buf) + buf = fz_new_buffer(ctx, 256); 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].buf = buf; dev->gstates[0].ctm = *ctm; dev->gstates[0].colorspace[0] = fz_device_gray(ctx); dev->gstates[0].colorspace[1] = fz_device_gray(ctx); @@ -1315,7 +1328,7 @@ fz_device *pdf_new_pdf_device(fz_context *ctx, pdf_document *doc, pdf_obj *conte } fz_catch(ctx) { - if (dev->gstates) + if (dev->gstates && dev->buffer == NULL) fz_drop_buffer(ctx, dev->gstates[0].buf); fz_free(ctx, dev); fz_rethrow(ctx); @@ -1354,5 +1367,5 @@ fz_device *pdf_page_write(fz_context *ctx, pdf_document *doc, pdf_page *page) } } - return pdf_new_pdf_device(ctx, doc, page->contents, resources, &ctm); + return pdf_new_pdf_device(ctx, doc, page->contents, resources, &ctm, NULL); } |