summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorTor Andersson <tor.andersson@artifex.com>2016-07-08 12:04:35 +0200
committerTor Andersson <tor.andersson@artifex.com>2016-07-08 17:21:24 +0200
commit10d6eaa73164b58c91ae8a4537b8a8589038a01d (patch)
tree5b739b0c2202b42a9079ee3ecbd98c3d3b09b124 /source
parentb53e7a42f7cc9756ed9fa1fed313271e3ae67855 (diff)
downloadmupdf-10d6eaa73164b58c91ae8a4537b8a8589038a01d.tar.xz
Separate close and drop functionality for devices and writers.
Closing a device or writer may throw exceptions, but much of the foreign language bindings (JNI and JS) depend on drop to never throw an exception (exceptions in finalizers are bad).
Diffstat (limited to 'source')
-rw-r--r--source/cbz/mucbz.c12
-rw-r--r--source/cbz/muimg.c8
-rw-r--r--source/cbz/mutiff.c10
-rw-r--r--source/fitz/bbox-device.c4
-rw-r--r--source/fitz/device.c12
-rw-r--r--source/fitz/document.c12
-rw-r--r--source/fitz/draw-device.c4
-rw-r--r--source/fitz/font.c3
-rw-r--r--source/fitz/image.c1
-rw-r--r--source/fitz/list-device.c4
-rw-r--r--source/fitz/output-cbz.c23
-rw-r--r--source/fitz/output-png.c7
-rw-r--r--source/fitz/stext-device.c16
-rw-r--r--source/fitz/svg-device.c13
-rw-r--r--source/fitz/util.c9
-rw-r--r--source/fitz/writer.c12
-rw-r--r--source/fitz/zip.c48
-rw-r--r--source/html/epub-doc.c10
-rw-r--r--source/html/html-doc.c10
-rw-r--r--source/pdf/pdf-annot.c2
-rw-r--r--source/pdf/pdf-appearance.c16
-rw-r--r--source/pdf/pdf-device.c14
-rw-r--r--source/pdf/pdf-interpret.c19
-rw-r--r--source/pdf/pdf-op-buffer.c4
-rw-r--r--source/pdf/pdf-op-filter.c4
-rw-r--r--source/pdf/pdf-op-run.c4
-rw-r--r--source/pdf/pdf-page.c2
-rw-r--r--source/pdf/pdf-write.c27
-rw-r--r--source/pdf/pdf-xref.c8
-rw-r--r--source/svg/svg-doc.c8
-rw-r--r--source/tools/muconvert.c2
-rw-r--r--source/tools/mudraw.c11
-rw-r--r--source/tools/muraster.c9
-rw-r--r--source/tools/murun.c18
-rw-r--r--source/xps/xps-doc.c4
-rw-r--r--source/xps/xps-zip.c8
36 files changed, 231 insertions, 147 deletions
diff --git a/source/cbz/mucbz.c b/source/cbz/mucbz.c
index 5a83adc0..0b5de93e 100644
--- a/source/cbz/mucbz.c
+++ b/source/cbz/mucbz.c
@@ -101,7 +101,7 @@ cbz_create_page_list(fz_context *ctx, cbz_document *doc)
}
static void
-cbz_close_document(fz_context *ctx, cbz_document *doc)
+cbz_drop_document(fz_context *ctx, cbz_document *doc)
{
fz_drop_archive(ctx, doc->zip);
fz_free(ctx, (char **)doc->page);
@@ -143,7 +143,7 @@ cbz_run_page(fz_context *ctx, cbz_page *page, fz_device *dev, const fz_matrix *c
}
static void
-cbz_drop_page_imp(fz_context *ctx, cbz_page *page)
+cbz_drop_page(fz_context *ctx, cbz_page *page)
{
if (!page)
return;
@@ -169,7 +169,7 @@ cbz_load_page(fz_context *ctx, cbz_document *doc, int number)
page = fz_new_page(ctx, sizeof *page);
page->super.bound_page = (fz_page_bound_page_fn *)cbz_bound_page;
page->super.run_page_contents = (fz_page_run_page_contents_fn *)cbz_run_page;
- page->super.drop_page_imp = (fz_page_drop_page_imp_fn *)cbz_drop_page_imp;
+ page->super.drop_page = (fz_page_drop_page_fn *)cbz_drop_page;
page->image = fz_new_image_from_buffer(ctx, buf);
}
fz_always(ctx)
@@ -179,7 +179,7 @@ cbz_load_page(fz_context *ctx, cbz_document *doc, int number)
fz_catch(ctx)
{
fz_free(ctx, data);
- cbz_drop_page_imp(ctx, page);
+ cbz_drop_page(ctx, page);
fz_rethrow(ctx);
}
@@ -199,7 +199,7 @@ cbz_open_document_with_stream(fz_context *ctx, fz_stream *file)
{
cbz_document *doc = fz_new_document(ctx, cbz_document);
- doc->super.close = (fz_document_close_fn *)cbz_close_document;
+ doc->super.drop_document = (fz_document_drop_fn *)cbz_drop_document;
doc->super.count_pages = (fz_document_count_pages_fn *)cbz_count_pages;
doc->super.load_page = (fz_document_load_page_fn *)cbz_load_page;
doc->super.lookup_metadata = (fz_document_lookup_metadata_fn *)cbz_lookup_metadata;
@@ -211,7 +211,7 @@ cbz_open_document_with_stream(fz_context *ctx, fz_stream *file)
}
fz_catch(ctx)
{
- cbz_close_document(ctx, doc);
+ cbz_drop_document(ctx, doc);
fz_rethrow(ctx);
}
return doc;
diff --git a/source/cbz/muimg.c b/source/cbz/muimg.c
index de99679f..5292c365 100644
--- a/source/cbz/muimg.c
+++ b/source/cbz/muimg.c
@@ -18,7 +18,7 @@ struct img_document_s
};
static void
-img_close_document(fz_context *ctx, img_document *doc)
+img_drop_document(fz_context *ctx, img_document *doc)
{
fz_drop_image(ctx, doc->image);
fz_free(ctx, doc);
@@ -57,7 +57,7 @@ img_run_page(fz_context *ctx, img_page *page, fz_device *dev, const fz_matrix *c
}
static void
-img_drop_page_imp(fz_context *ctx, img_page *page)
+img_drop_page(fz_context *ctx, img_page *page)
{
fz_drop_image(ctx, page->image);
}
@@ -74,7 +74,7 @@ img_load_page(fz_context *ctx, img_document *doc, int number)
page->super.bound_page = (fz_page_bound_page_fn *)img_bound_page;
page->super.run_page_contents = (fz_page_run_page_contents_fn *)img_run_page;
- page->super.drop_page_imp = (fz_page_drop_page_imp_fn *)img_drop_page_imp;
+ page->super.drop_page = (fz_page_drop_page_fn *)img_drop_page;
page->image = fz_keep_image(ctx, doc->image);
@@ -94,7 +94,7 @@ img_new_document(fz_context *ctx, fz_image *image)
{
img_document *doc = fz_new_document(ctx, img_document);
- doc->super.close = (fz_document_close_fn *)img_close_document;
+ doc->super.drop_document = (fz_document_drop_fn *)img_drop_document;
doc->super.count_pages = (fz_document_count_pages_fn *)img_count_pages;
doc->super.load_page = (fz_document_load_page_fn *)img_load_page;
doc->super.lookup_metadata = (fz_document_lookup_metadata_fn *)img_lookup_metadata;
diff --git a/source/cbz/mutiff.c b/source/cbz/mutiff.c
index ad859987..64da4c5a 100644
--- a/source/cbz/mutiff.c
+++ b/source/cbz/mutiff.c
@@ -47,7 +47,7 @@ tiff_run_page(fz_context *ctx, tiff_page *page, fz_device *dev, const fz_matrix
}
static void
-tiff_drop_page_imp(fz_context *ctx, tiff_page *page)
+tiff_drop_page(fz_context *ctx, tiff_page *page)
{
if (!page)
return;
@@ -76,7 +76,7 @@ tiff_load_page(fz_context *ctx, tiff_document *doc, int number)
page = fz_new_page(ctx, sizeof *page);
page->super.bound_page = (fz_page_bound_page_fn *)tiff_bound_page;
page->super.run_page_contents = (fz_page_run_page_contents_fn *)tiff_run_page;
- page->super.drop_page_imp = (fz_page_drop_page_imp_fn *)tiff_drop_page_imp;
+ page->super.drop_page = (fz_page_drop_page_fn *)tiff_drop_page;
page->image = fz_keep_image(ctx, image);
}
fz_always(ctx)
@@ -108,7 +108,7 @@ tiff_lookup_metadata(fz_context *ctx, tiff_document *doc, const char *key, char
}
static void
-tiff_close_document(fz_context *ctx, tiff_document *doc)
+tiff_drop_document(fz_context *ctx, tiff_document *doc)
{
fz_drop_buffer(ctx, doc->buffer);
fz_free(ctx, doc);
@@ -121,7 +121,7 @@ tiff_open_document_with_stream(fz_context *ctx, fz_stream *file)
doc = fz_new_document(ctx, tiff_document);
- doc->super.close = (fz_document_close_fn *)tiff_close_document;
+ doc->super.drop_document = (fz_document_drop_fn *)tiff_drop_document;
doc->super.count_pages = (fz_document_count_pages_fn *)tiff_count_pages;
doc->super.load_page = (fz_document_load_page_fn *)tiff_load_page;
doc->super.lookup_metadata = (fz_document_lookup_metadata_fn *)tiff_lookup_metadata;
@@ -133,7 +133,7 @@ tiff_open_document_with_stream(fz_context *ctx, fz_stream *file)
}
fz_catch(ctx)
{
- tiff_close_document(ctx, doc);
+ tiff_drop_document(ctx, doc);
fz_rethrow(ctx);
}
diff --git a/source/fitz/bbox-device.c b/source/fitz/bbox-device.c
index 42ca57ad..340eef3c 100644
--- a/source/fitz/bbox-device.c
+++ b/source/fitz/bbox-device.c
@@ -179,7 +179,7 @@ fz_bbox_end_tile(fz_context *ctx, fz_device *dev)
}
static void
-fz_bbox_close(fz_context *ctx, fz_device *dev)
+fz_bbox_drop_device(fz_context *ctx, fz_device *dev)
{
fz_bbox_device *bdev = (fz_bbox_device*)dev;
if (bdev->top > 0)
@@ -191,7 +191,7 @@ fz_new_bbox_device(fz_context *ctx, fz_rect *result)
{
fz_bbox_device *dev = fz_new_device(ctx, sizeof *dev);
- dev->super.close = fz_bbox_close;
+ dev->super.drop_device = fz_bbox_drop_device;
dev->super.fill_path = fz_bbox_fill_path;
dev->super.stroke_path = fz_bbox_stroke_path;
diff --git a/source/fitz/device.c b/source/fitz/device.c
index 4379bb21..88b658a3 100644
--- a/source/fitz/device.c
+++ b/source/fitz/device.c
@@ -13,11 +13,11 @@ fz_close_device(fz_context *ctx, fz_device *dev)
{
if (dev == NULL)
return;
- if (dev->close)
- dev->close(ctx, dev);
+ if (dev->close_device)
+ dev->close_device(ctx, dev);
/* Don't call more than once! */
- dev->close = NULL;
+ dev->close_device = NULL;
/* And disable all further device calls. */
dev->fill_path = NULL;
@@ -53,8 +53,10 @@ fz_drop_device(fz_context *ctx, fz_device *dev)
{
if (fz_drop_imp(ctx, dev, &dev->refs))
{
- if (dev->close)
- dev->close(ctx, dev);
+ if (dev->close_device)
+ fz_warn(ctx, "dropping unclosed device");
+ if (dev->drop_device)
+ dev->drop_device(ctx, dev);
fz_free(ctx, dev->container);
fz_free(ctx, dev);
}
diff --git a/source/fitz/document.c b/source/fitz/document.c
index 02c30459..ad602bc2 100644
--- a/source/fitz/document.c
+++ b/source/fitz/document.c
@@ -150,8 +150,8 @@ fz_keep_document(fz_context *ctx, fz_document *doc)
void
fz_drop_document(fz_context *ctx, fz_document *doc)
{
- if (doc && --doc->refs == 0 && doc->close)
- doc->close(ctx, doc);
+ if (doc && --doc->refs == 0 && doc->drop_document)
+ doc->drop_document(ctx, doc);
}
static void
@@ -362,8 +362,8 @@ fz_drop_annot(fz_context *ctx, fz_annot *annot)
{
if (annot && --annot->refs == 0)
{
- if (annot->drop_annot_imp)
- annot->drop_annot_imp(ctx, annot);
+ if (annot->drop_annot)
+ annot->drop_annot(ctx, annot);
fz_free(ctx, annot);
}
}
@@ -389,9 +389,9 @@ fz_drop_page(fz_context *ctx, fz_page *page)
{
if (page)
{
- if (--page->refs == 0 && page->drop_page_imp)
+ if (--page->refs == 0 && page->drop_page)
{
- page->drop_page_imp(ctx, page);
+ page->drop_page(ctx, page);
fz_free(ctx, page);
}
}
diff --git a/source/fitz/draw-device.c b/source/fitz/draw-device.c
index 9a2cb507..ff746e29 100644
--- a/source/fitz/draw-device.c
+++ b/source/fitz/draw-device.c
@@ -2357,7 +2357,7 @@ fz_draw_end_tile(fz_context *ctx, fz_device *devp)
}
static void
-fz_draw_close(fz_context *ctx, fz_device *devp)
+fz_draw_drop_device(fz_context *ctx, fz_device *devp)
{
fz_draw_device *dev = (fz_draw_device*)devp;
fz_gel *gel = dev->gel;
@@ -2400,7 +2400,7 @@ fz_new_draw_device(fz_context *ctx, const fz_matrix *transform, fz_pixmap *dest)
{
fz_draw_device *dev = fz_new_device(ctx, sizeof *dev);
- dev->super.close = fz_draw_close;
+ dev->super.drop_device = fz_draw_drop_device;
dev->super.fill_path = fz_draw_fill_path;
dev->super.stroke_path = fz_draw_stroke_path;
diff --git a/source/fitz/font.c b/source/fitz/font.c
index b0248bd7..79cd050a 100644
--- a/source/fitz/font.c
+++ b/source/fitz/font.c
@@ -1169,6 +1169,7 @@ fz_prepare_t3_glyph(fz_context *ctx, fz_font *font, int gid, int nested_depth)
font->bbox_table[gid] = dev->d1_rect;
fz_transform_rect(&font->bbox_table[gid], &font->t3matrix);
}
+ fz_close_device(ctx, dev);
fz_drop_device(ctx, dev);
}
@@ -1191,6 +1192,7 @@ fz_bound_t3_glyph(fz_context *ctx, fz_font *font, int gid, fz_rect *bounds)
fz_try(ctx)
{
fz_run_display_list(ctx, list, dev, &font->t3matrix, &fz_infinite_rect, NULL);
+ fz_close_device(ctx, dev);
}
fz_always(ctx)
{
@@ -1270,6 +1272,7 @@ fz_render_t3_glyph_pixmap(fz_context *ctx, fz_font *font, int gid, const fz_matr
fz_try(ctx)
{
fz_run_t3_glyph(ctx, font, gid, trm, dev);
+ fz_close_device(ctx, dev);
}
fz_always(ctx)
{
diff --git a/source/fitz/image.c b/source/fitz/image.c
index 064b03c7..330b65cf 100644
--- a/source/fitz/image.c
+++ b/source/fitz/image.c
@@ -1085,6 +1085,7 @@ display_list_image_get_pixmap(fz_context *ctx, fz_image *image_, fz_irect *subar
fz_clear_pixmap(ctx, pix); /* clear to transparent */
dev = fz_new_draw_device(ctx, &ctm, pix);
fz_run_display_list(ctx, image->list, dev, &fz_identity, NULL, NULL);
+ fz_close_device(ctx, dev);
fz_drop_device(ctx, dev);
/* Never do more subsampling, cos we've already given them the right size */
diff --git a/source/fitz/list-device.c b/source/fitz/list-device.c
index 18af0e20..d5e13375 100644
--- a/source/fitz/list-device.c
+++ b/source/fitz/list-device.c
@@ -1199,7 +1199,7 @@ fz_list_render_flags(fz_context *ctx, fz_device *dev, int set, int clear)
}
static void
-drop_writer(fz_context *ctx, fz_device *dev)
+fz_list_drop_device(fz_context *ctx, fz_device *dev)
{
fz_list_device *writer = (fz_list_device *)dev;
@@ -1243,7 +1243,7 @@ fz_new_list_device(fz_context *ctx, fz_display_list *list)
dev->super.render_flags = fz_list_render_flags;
- dev->super.close = drop_writer;
+ dev->super.drop_device = fz_list_drop_device;
dev->list = list;
dev->path = NULL;
diff --git a/source/fitz/output-cbz.c b/source/fitz/output-cbz.c
index 80ef287c..43be16cb 100644
--- a/source/fitz/output-cbz.c
+++ b/source/fitz/output-cbz.c
@@ -29,6 +29,9 @@ cbz_end_page(fz_context *ctx, fz_document_writer *wri_, fz_device *dev)
fz_buffer *buffer;
char name[40];
+ fz_close_device(ctx, dev);
+ fz_drop_device(ctx, dev);
+
wri->count += 1;
fz_snprintf(name, sizeof name, "p%04d.png", wri->count);
@@ -43,20 +46,21 @@ cbz_end_page(fz_context *ctx, fz_document_writer *wri_, fz_device *dev)
fz_drop_pixmap(ctx, wri->pixmap);
wri->pixmap = NULL;
+}
- fz_drop_device(ctx, dev);
+static void
+cbz_close_writer(fz_context *ctx, fz_document_writer *wri_)
+{
+ fz_cbz_writer *wri = (fz_cbz_writer*)wri_;
+ fz_close_zip_writer(ctx, wri->zip);
}
static void
-cbz_close(fz_context *ctx, fz_document_writer *wri_)
+cbz_drop_writer(fz_context *ctx, fz_document_writer *wri_)
{
fz_cbz_writer *wri = (fz_cbz_writer*)wri_;
- fz_try(ctx)
- fz_drop_zip_writer(ctx, wri->zip);
- fz_always(ctx)
- fz_drop_pixmap(ctx, wri->pixmap);
- fz_catch(ctx)
- fz_rethrow(ctx);
+ fz_drop_zip_writer(ctx, wri->zip);
+ fz_drop_pixmap(ctx, wri->pixmap);
}
fz_document_writer *
@@ -67,7 +71,8 @@ fz_new_cbz_writer(fz_context *ctx, const char *path, const char *options)
wri = fz_malloc_struct(ctx, fz_cbz_writer);
wri->super.begin_page = cbz_begin_page;
wri->super.end_page = cbz_end_page;
- wri->super.close = cbz_close;
+ wri->super.close_writer = cbz_close_writer;
+ wri->super.drop_writer = cbz_drop_writer;
fz_try(ctx)
{
diff --git a/source/fitz/output-png.c b/source/fitz/output-png.c
index 5bd0737e..d710a0cd 100644
--- a/source/fitz/output-png.c
+++ b/source/fitz/output-png.c
@@ -324,6 +324,9 @@ png_end_page(fz_context *ctx, fz_document_writer *wri_, fz_device *dev)
fz_png_writer *wri = (fz_png_writer*)wri_;
char path[PATH_MAX];
+ fz_close_device(ctx, dev);
+ fz_drop_device(ctx, dev);
+
wri->count += 1;
fz_format_output_path(ctx, path, sizeof path, wri->path, wri->count);
@@ -333,7 +336,7 @@ png_end_page(fz_context *ctx, fz_document_writer *wri_, fz_device *dev)
}
static void
-png_close(fz_context *ctx, fz_document_writer *wri_)
+png_drop_writer(fz_context *ctx, fz_document_writer *wri_)
{
fz_png_writer *wri = (fz_png_writer*)wri_;
fz_drop_pixmap(ctx, wri->pixmap);
@@ -348,7 +351,7 @@ fz_new_png_writer(fz_context *ctx, const char *path, const char *options)
wri = fz_malloc_struct(ctx, fz_png_writer);
wri->super.begin_page = png_begin_page;
wri->super.end_page = png_end_page;
- wri->super.close = png_close;
+ wri->super.drop_writer = png_drop_writer;
fz_try(ctx)
{
diff --git a/source/fitz/stext-device.c b/source/fitz/stext-device.c
index f50bbf82..55f2033b 100644
--- a/source/fitz/stext-device.c
+++ b/source/fitz/stext-device.c
@@ -1015,7 +1015,7 @@ fz_bidi_reorder_stext_page(fz_context *ctx, fz_stext_page *page)
}
static void
-fz_stext_close(fz_context *ctx, fz_device *dev)
+fz_stext_close_device(fz_context *ctx, fz_device *dev)
{
fz_stext_device *tdev = (fz_stext_device*)dev;
@@ -1023,8 +1023,6 @@ fz_stext_close(fz_context *ctx, fz_device *dev)
tdev->cur_span = NULL;
strain_soup(ctx, tdev);
- free_span_soup(ctx, tdev->spans);
- tdev->spans = NULL;
/* TODO: smart sorting of blocks in reading order */
/* TODO: unicode NFC normalization */
@@ -1032,6 +1030,14 @@ fz_stext_close(fz_context *ctx, fz_device *dev)
fz_bidi_reorder_stext_page(ctx, tdev->page);
}
+static void
+fz_stext_drop_device(fz_context *ctx, fz_device *dev)
+{
+ fz_stext_device *tdev = (fz_stext_device*)dev;
+ free_span_soup(ctx, tdev->spans);
+ tdev->spans = NULL;
+}
+
fz_device *
fz_new_stext_device(fz_context *ctx, fz_stext_sheet *sheet, fz_stext_page *page)
{
@@ -1039,7 +1045,9 @@ fz_new_stext_device(fz_context *ctx, fz_stext_sheet *sheet, fz_stext_page *page)
dev->super.hints = FZ_IGNORE_IMAGE | FZ_IGNORE_SHADE;
- dev->super.close = fz_stext_close;
+ dev->super.close_device = fz_stext_close_device;
+ dev->super.drop_device = fz_stext_drop_device;
+
dev->super.fill_text = fz_stext_fill_text;
dev->super.stroke_text = fz_stext_stroke_text;
dev->super.clip_text = fz_stext_clip_text;
diff --git a/source/fitz/svg-device.c b/source/fitz/svg-device.c
index 1a486545..8a7f4bf9 100644
--- a/source/fitz/svg-device.c
+++ b/source/fitz/svg-device.c
@@ -1063,23 +1063,28 @@ svg_dev_end_tile(fz_context *ctx, fz_device *dev)
}
static void
-svg_dev_close(fz_context *ctx, fz_device *dev)
+svg_dev_close_device(fz_context *ctx, fz_device *dev)
{
svg_device *sdev = (svg_device*)dev;
fz_output *out = sdev->out;
+ fz_printf(ctx, out, "</svg>\n");
+}
+static void
+svg_dev_drop_device(fz_context *ctx, fz_device *dev)
+{
+ svg_device *sdev = (svg_device*)dev;
fz_free(ctx, sdev->tiles);
fz_drop_buffer(ctx, sdev->defs_buffer);
fz_drop_output(ctx, sdev->defs);
-
- fz_printf(ctx, out, "</svg>\n");
}
fz_device *fz_new_svg_device(fz_context *ctx, fz_output *out, float page_width, float page_height)
{
svg_device *dev = fz_new_device(ctx, sizeof *dev);
- dev->super.close = svg_dev_close;
+ dev->super.close_device = svg_dev_close_device;
+ dev->super.drop_device = svg_dev_drop_device;
dev->super.fill_path = svg_dev_fill_path;
dev->super.stroke_path = svg_dev_stroke_path;
diff --git a/source/fitz/util.c b/source/fitz/util.c
index f76e496a..cefac962 100644
--- a/source/fitz/util.c
+++ b/source/fitz/util.c
@@ -13,6 +13,7 @@ fz_new_display_list_from_page(fz_context *ctx, fz_page *page)
{
dev = fz_new_list_device(ctx, list);
fz_run_page(ctx, page, dev, &fz_identity, NULL);
+ fz_close_device(ctx, dev);
}
fz_always(ctx)
{
@@ -56,6 +57,7 @@ fz_new_display_list_from_page_contents(fz_context *ctx, fz_page *page)
{
dev = fz_new_list_device(ctx, list);
fz_run_page_contents(ctx, page, dev, &fz_identity, NULL);
+ fz_close_device(ctx, dev);
}
fz_always(ctx)
{
@@ -83,6 +85,7 @@ fz_new_display_list_from_annot(fz_context *ctx, fz_annot *annot)
{
dev = fz_new_list_device(ctx, list);
fz_run_annot(ctx, annot, dev, &fz_identity, NULL);
+ fz_close_device(ctx, dev);
}
fz_always(ctx)
{
@@ -119,6 +122,7 @@ fz_new_pixmap_from_display_list(fz_context *ctx, fz_display_list *list, const fz
{
dev = fz_new_draw_device(ctx, ctm, pix);
fz_run_display_list(ctx, list, dev, &fz_identity, NULL, NULL);
+ fz_close_device(ctx, dev);
}
fz_always(ctx)
{
@@ -155,6 +159,7 @@ fz_new_pixmap_from_page_contents(fz_context *ctx, fz_page *page, const fz_matrix
{
dev = fz_new_draw_device(ctx, ctm, pix);
fz_run_page_contents(ctx, page, dev, &fz_identity, NULL);
+ fz_close_device(ctx, dev);
}
fz_always(ctx)
{
@@ -191,6 +196,7 @@ fz_new_pixmap_from_annot(fz_context *ctx, fz_annot *annot, const fz_matrix *ctm,
{
dev = fz_new_draw_device(ctx, ctm, pix);
fz_run_annot(ctx, annot, dev, &fz_identity, NULL);
+ fz_close_device(ctx, dev);
}
fz_always(ctx)
{
@@ -227,6 +233,7 @@ fz_new_pixmap_from_page(fz_context *ctx, fz_page *page, const fz_matrix *ctm, fz
{
dev = fz_new_draw_device(ctx, ctm, pix);
fz_run_page(ctx, page, dev, &fz_identity, NULL);
+ fz_close_device(ctx, dev);
}
fz_always(ctx)
{
@@ -268,6 +275,7 @@ fz_new_stext_page_from_display_list(fz_context *ctx, fz_display_list *list, fz_s
{
dev = fz_new_stext_device(ctx, sheet, text);
fz_run_display_list(ctx, list, dev, &fz_identity, NULL, NULL);
+ fz_close_device(ctx, dev);
}
fz_always(ctx)
{
@@ -293,6 +301,7 @@ fz_new_stext_page_from_page(fz_context *ctx, fz_page *page, fz_stext_sheet *shee
{
dev = fz_new_stext_device(ctx, sheet, text);
fz_run_page(ctx, page, dev, &fz_identity, NULL);
+ fz_close_device(ctx, dev);
}
fz_always(ctx)
{
diff --git a/source/fitz/writer.c b/source/fitz/writer.c
index 556e01a8..c4e95e2a 100644
--- a/source/fitz/writer.c
+++ b/source/fitz/writer.c
@@ -67,16 +67,18 @@ fz_new_document_writer(fz_context *ctx, const char *path, const char *format, co
void
fz_close_document_writer(fz_context *ctx, fz_document_writer *wri)
{
- if (wri->close)
- wri->close(ctx, wri);
- wri->close = NULL;
+ if (wri->close_writer)
+ wri->close_writer(ctx, wri);
+ wri->close_writer = NULL;
}
void
fz_drop_document_writer(fz_context *ctx, fz_document_writer *wri)
{
- if (wri->close)
- wri->close(ctx, wri);
+ if (wri->close_writer)
+ fz_warn(ctx, "dropping unclosed document writer");
+ if (wri->drop_writer)
+ wri->drop_writer(ctx, wri);
fz_free(ctx, wri);
}
diff --git a/source/fitz/zip.c b/source/fitz/zip.c
index dd67e5ac..599d2954 100644
--- a/source/fitz/zip.c
+++ b/source/fitz/zip.c
@@ -15,6 +15,7 @@ struct fz_zip_writer_s
fz_output *output;
fz_buffer *central;
int count;
+ int closed;
};
void
@@ -63,33 +64,34 @@ fz_write_zip_entry(fz_context *ctx, fz_zip_writer *zip, const char *name, fz_buf
}
void
-fz_drop_zip_writer(fz_context *ctx, fz_zip_writer *zip)
+fz_close_zip_writer(fz_context *ctx, fz_zip_writer *zip)
{
- fz_try(ctx)
- {
- fz_off_t offset = fz_tell_output(ctx, zip->output);
+ fz_off_t offset = fz_tell_output(ctx, zip->output);
- fz_write(ctx, zip->output, zip->central->data, zip->central->len);
+ fz_write(ctx, zip->output, zip->central->data, zip->central->len);
- fz_write_int32_le(ctx, zip->output, ZIP_END_OF_CENTRAL_DIRECTORY_SIG);
- fz_write_int16_le(ctx, zip->output, 0); /* number of this disk */
- fz_write_int16_le(ctx, zip->output, 0); /* number of disk where central directory starts */
- fz_write_int16_le(ctx, zip->output, zip->count); /* entries in central directory in this disk */
- fz_write_int16_le(ctx, zip->output, zip->count); /* entries in central directory in total */
- fz_write_int32_le(ctx, zip->output, (int)zip->central->len); /* size of the central directory */
- fz_write_int32_le(ctx, zip->output, (int)offset); /* offset of the central directory */
- fz_write_int16_le(ctx, zip->output, 5); /* zip file comment length */
+ fz_write_int32_le(ctx, zip->output, ZIP_END_OF_CENTRAL_DIRECTORY_SIG);
+ fz_write_int16_le(ctx, zip->output, 0); /* number of this disk */
+ fz_write_int16_le(ctx, zip->output, 0); /* number of disk where central directory starts */
+ fz_write_int16_le(ctx, zip->output, zip->count); /* entries in central directory in this disk */
+ fz_write_int16_le(ctx, zip->output, zip->count); /* entries in central directory in total */
+ fz_write_int32_le(ctx, zip->output, (int)zip->central->len); /* size of the central directory */
+ fz_write_int32_le(ctx, zip->output, (int)offset); /* offset of the central directory */
+ fz_write_int16_le(ctx, zip->output, 5); /* zip file comment length */
- fz_write(ctx, zip->output, "MuPDF", 5);
- }
- fz_always(ctx)
- {
- fz_drop_output(ctx, zip->output);
- fz_drop_buffer(ctx, zip->central);
- fz_free(ctx, zip);
- }
- fz_catch(ctx)
- fz_rethrow(ctx);
+ fz_write(ctx, zip->output, "MuPDF", 5);
+
+ zip->closed = 1;
+}
+
+void
+fz_drop_zip_writer(fz_context *ctx, fz_zip_writer *zip)
+{
+ if (!zip->closed)
+ fz_warn(ctx, "dropping unclosed zip writer");
+ fz_drop_output(ctx, zip->output);
+ fz_drop_buffer(ctx, zip->central);
+ fz_free(ctx, zip);
}
fz_zip_writer *
diff --git a/source/html/epub-doc.c b/source/html/epub-doc.c
index 408c3345..541fb7eb 100644
--- a/source/html/epub-doc.c
+++ b/source/html/epub-doc.c
@@ -93,7 +93,7 @@ epub_count_pages(fz_context *ctx, fz_document *doc_)
}
static void
-epub_drop_page_imp(fz_context *ctx, fz_page *page_)
+epub_drop_page(fz_context *ctx, fz_page *page_)
{
}
@@ -154,14 +154,14 @@ epub_load_page(fz_context *ctx, fz_document *doc_, int number)
epub_page *page = fz_new_page(ctx, sizeof *page);
page->super.bound_page = epub_bound_page;
page->super.run_page_contents = epub_run_page;
- page->super.drop_page_imp = epub_drop_page_imp;
+ page->super.drop_page = epub_drop_page;
page->doc = doc;
page->number = number;
return (fz_page*)page;
}
static void
-epub_close_document(fz_context *ctx, fz_document *doc_)
+epub_drop_document(fz_context *ctx, fz_document *doc_)
{
epub_document *doc = (epub_document*)doc_;
epub_chapter *ch, *next;
@@ -419,7 +419,7 @@ epub_init(fz_context *ctx, fz_archive *zip)
doc->zip = zip;
doc->set = fz_new_html_font_set(ctx);
- doc->super.close = epub_close_document;
+ doc->super.drop_document = epub_drop_document;
doc->super.layout = epub_layout;
doc->super.load_outline = epub_load_outline;
doc->super.count_pages = epub_count_pages;
@@ -432,7 +432,7 @@ epub_init(fz_context *ctx, fz_archive *zip)
}
fz_catch(ctx)
{
- epub_close_document(ctx, (fz_document*)doc);
+ epub_drop_document(ctx, (fz_document*)doc);
fz_rethrow(ctx);
}
diff --git a/source/html/html-doc.c b/source/html/html-doc.c
index 94ceddb4..2e8b8ec4 100644
--- a/source/html/html-doc.c
+++ b/source/html/html-doc.c
@@ -23,7 +23,7 @@ struct html_page_s
};
static void
-htdoc_close_document(fz_context *ctx, fz_document *doc_)
+htdoc_drop_document(fz_context *ctx, fz_document *doc_)
{
html_document *doc = (html_document*)doc_;
fz_drop_archive(ctx, doc->zip);
@@ -61,7 +61,7 @@ htdoc_layout(fz_context *ctx, fz_document *doc_, float w, float h, float em)
}
static void
-htdoc_drop_page_imp(fz_context *ctx, fz_page *page_)
+htdoc_drop_page(fz_context *ctx, fz_page *page_)
{
}
@@ -97,7 +97,7 @@ htdoc_load_page(fz_context *ctx, fz_document *doc_, int number)
html_page *page = fz_new_page(ctx, sizeof *page);
page->super.bound_page = htdoc_bound_page;
page->super.run_page_contents = htdoc_run_page;
- page->super.drop_page_imp = htdoc_drop_page_imp;
+ page->super.drop_page = htdoc_drop_page;
page->doc = doc;
page->number = number;
return (fz_page*)page;
@@ -119,7 +119,7 @@ htdoc_open_document_with_stream(fz_context *ctx, fz_stream *file)
doc = fz_new_document(ctx, html_document);
- doc->super.close = htdoc_close_document;
+ doc->super.drop_document = htdoc_drop_document;
doc->super.layout = htdoc_layout;
doc->super.count_pages = htdoc_count_pages;
doc->super.load_page = htdoc_load_page;
@@ -145,7 +145,7 @@ htdoc_open_document(fz_context *ctx, const char *filename)
fz_dirname(dirname, filename, sizeof dirname);
doc = fz_new_document(ctx, html_document);
- doc->super.close = htdoc_close_document;
+ doc->super.drop_document = htdoc_drop_document;
doc->super.layout = htdoc_layout;
doc->super.count_pages = htdoc_count_pages;
doc->super.load_page = htdoc_load_page;
diff --git a/source/pdf/pdf-annot.c b/source/pdf/pdf-annot.c
index 4a34e945..acf81961 100644
--- a/source/pdf/pdf-annot.c
+++ b/source/pdf/pdf-annot.c
@@ -491,7 +491,7 @@ pdf_annot *pdf_new_annot(fz_context *ctx, pdf_page *page)
{
pdf_annot *annot = fz_new_annot(ctx, sizeof(pdf_annot));
- annot->super.drop_annot_imp = (fz_annot_drop_imp_fn*)pdf_drop_annot_imp;
+ annot->super.drop_annot = (fz_annot_drop_fn*)pdf_drop_annot_imp;
annot->super.bound_annot = (fz_annot_bound_fn*)pdf_bound_annot;
annot->super.run_annot = (fz_annot_run_fn*)pdf_run_annot;
annot->super.next_annot = (fz_annot_next_fn*)pdf_next_annot;
diff --git a/source/pdf/pdf-appearance.c b/source/pdf/pdf-appearance.c
index e275ca56..ed8a6f4a 100644
--- a/source/pdf/pdf-appearance.c
+++ b/source/pdf/pdf-appearance.c
@@ -1612,7 +1612,7 @@ void pdf_set_annot_appearance(fz_context *ctx, pdf_document *doc, pdf_annot *ann
dev = pdf_new_pdf_device(ctx, doc, &fz_identity, &trect, resources, contents);
fz_run_display_list(ctx, disp_list, dev, &inv_page_ctm, &fz_infinite_rect, NULL);
- fz_drop_device(ctx, dev);
+ fz_close_device(ctx, dev);
pdf_update_stream(ctx, doc, ap_obj, contents, 0);
fz_drop_buffer(ctx, contents);
@@ -1627,11 +1627,10 @@ void pdf_set_annot_appearance(fz_context *ctx, pdf_document *doc, pdf_annot *ann
doc->dirty = 1;
}
- fz_catch(ctx)
- {
+ fz_always(ctx)
fz_drop_device(ctx, dev);
+ fz_catch(ctx)
fz_rethrow(ctx);
- }
}
static fz_point *
@@ -1745,6 +1744,8 @@ void pdf_set_markup_appearance(fz_context *ctx, pdf_document *doc, pdf_annot *an
fz_stroke_path(ctx, dev, path, stroke, &page_ctm, fz_device_rgb(ctx), color, alpha);
}
+ fz_close_device(ctx, dev);
+
fz_transform_rect(&rect, &page_ctm);
pdf_set_annot_appearance(ctx, doc, annot, &rect, strike_list);
}
@@ -1879,6 +1880,8 @@ void pdf_update_ink_appearance(fz_context *ctx, pdf_document *doc, pdf_annot *an
rect.y1 += width;
}
+ fz_close_device(ctx, dev);
+
fz_transform_rect(&rect, &page_ctm);
pdf_set_annot_appearance(ctx, doc, annot, &rect, strike_list);
}
@@ -2126,6 +2129,8 @@ void pdf_update_text_annot_appearance(fz_context *ctx, pdf_document *doc, pdf_an
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_close_device(ctx, dev);
+
fz_transform_rect(&rect, &page_ctm);
pdf_set_annot_appearance(ctx, doc, annot, &rect, dlist);
@@ -2198,6 +2203,7 @@ void pdf_update_free_text_annot_appearance(fz_context *ctx, pdf_document *doc, p
dlist = fz_new_display_list(ctx, NULL);
dev = fz_new_list_device(ctx, dlist);
fz_fill_text(ctx, dev, text, &page_ctm, cs, font_rec.da_rec.col, 1.0f);
+ fz_close_device(ctx, dev);
fz_transform_rect(&rect, &page_ctm);
pdf_set_annot_appearance(ctx, doc, annot, &rect, dlist);
@@ -2415,6 +2421,8 @@ void pdf_set_signature_appearance(fz_context *ctx, pdf_document *doc, pdf_annot
text = fit_text(ctx, &font_rec, (char *)bufstr, &rect);
fz_fill_text(ctx, dev, text, &page_ctm, cs, font_rec.da_rec.col, 1.0f);
+ fz_close_device(ctx, dev);
+
rect = annot_rect;
fz_transform_rect(&rect, &page_ctm);
pdf_set_annot_appearance(ctx, doc, annot, &rect, dlist);
diff --git a/source/pdf/pdf-device.c b/source/pdf/pdf-device.c
index 5c243e8f..4af09b0e 100644
--- a/source/pdf/pdf-device.c
+++ b/source/pdf/pdf-device.c
@@ -1037,12 +1037,17 @@ pdf_dev_end_tile(fz_context *ctx, fz_device *dev)
}
static void
-pdf_dev_close(fz_context *ctx, fz_device *dev)
+pdf_dev_close_device(fz_context *ctx, fz_device *dev)
{
pdf_device *pdev = (pdf_device*)dev;
- int i;
-
pdf_dev_end_text(ctx, pdev);
+}
+
+static void
+pdf_dev_drop_device(fz_context *ctx, fz_device *dev)
+{
+ pdf_device *pdev = (pdf_device*)dev;
+ int i;
for (i = pdev->num_gstates-1; i >= 0; i--)
fz_drop_stroke_state(ctx, pdev->gstates[i].stroke_state);
@@ -1066,7 +1071,8 @@ fz_device *pdf_new_pdf_device(fz_context *ctx, pdf_document *doc, const fz_matri
{
pdf_device *dev = fz_new_device(ctx, sizeof *dev);
- dev->super.close = pdf_dev_close;
+ dev->super.close_device = pdf_dev_close_device;
+ dev->super.drop_device = pdf_dev_drop_device;
dev->super.fill_path = pdf_dev_fill_path;
dev->super.stroke_path = pdf_dev_stroke_path;
diff --git a/source/pdf/pdf-interpret.c b/source/pdf/pdf-interpret.c
index c895478f..f3840794 100644
--- a/source/pdf/pdf-interpret.c
+++ b/source/pdf/pdf-interpret.c
@@ -7,10 +7,25 @@ pdf_new_processor(fz_context *ctx, int size)
}
void
+pdf_close_processor(fz_context *ctx, pdf_processor *proc)
+{
+ if (proc && proc->close_processor)
+ {
+ proc->close_processor(ctx, proc);
+ proc->close_processor = NULL;
+ }
+}
+
+void
pdf_drop_processor(fz_context *ctx, pdf_processor *proc)
{
- if (proc && proc->drop_imp)
- proc->drop_imp(ctx, proc);
+ if (proc)
+ {
+ if (proc->close_processor)
+ fz_warn(ctx, "dropping unclosed PDF processor");
+ if (proc->drop_processor)
+ proc->drop_processor(ctx, proc);
+ }
fz_free(ctx, proc);
}
diff --git a/source/pdf/pdf-op-buffer.c b/source/pdf/pdf-op-buffer.c
index 5b37e6a5..2eb4323a 100644
--- a/source/pdf/pdf-op-buffer.c
+++ b/source/pdf/pdf-op-buffer.c
@@ -761,7 +761,7 @@ pdf_out_EX(fz_context *ctx, pdf_processor *proc)
}
static void
-pdf_drop_imp_output_processor(fz_context *ctx, pdf_processor *proc)
+pdf_drop_output_processor(fz_context *ctx, pdf_processor *proc)
{
fz_output *out = ((pdf_output_processor*)proc)->out;
fz_drop_output(ctx, out);
@@ -772,7 +772,7 @@ pdf_new_output_processor(fz_context *ctx, fz_output *out, int ahxencode)
{
pdf_output_processor *proc = pdf_new_processor(ctx, sizeof *proc);
{
- proc->super.drop_imp = pdf_drop_imp_output_processor;
+ proc->super.drop_processor = pdf_drop_output_processor;
/* general graphics state */
proc->super.op_w = pdf_out_w;
diff --git a/source/pdf/pdf-op-filter.c b/source/pdf/pdf-op-filter.c
index 8eebe5cd..f5a0958d 100644
--- a/source/pdf/pdf-op-filter.c
+++ b/source/pdf/pdf-op-filter.c
@@ -1113,7 +1113,7 @@ pdf_filter_END(fz_context *ctx, pdf_processor *proc)
}
static void
-pdf_drop_imp_filter_processor(fz_context *ctx, pdf_processor *proc)
+pdf_drop_filter_processor(fz_context *ctx, pdf_processor *proc)
{
pdf_filter_processor *p = (pdf_filter_processor*)proc;
fz_free(ctx, p->gstate);
@@ -1125,7 +1125,7 @@ pdf_new_filter_processor(fz_context *ctx, pdf_processor *chain, pdf_document *do
pdf_filter_processor *proc = pdf_new_processor(ctx, sizeof *proc);
{
- proc->super.drop_imp = pdf_drop_imp_filter_processor;
+ proc->super.drop_processor = pdf_drop_filter_processor;
/* general graphics state */
proc->super.op_w = pdf_filter_w;
diff --git a/source/pdf/pdf-op-run.c b/source/pdf/pdf-op-run.c
index a0f28008..96084cdf 100644
--- a/source/pdf/pdf-op-run.c
+++ b/source/pdf/pdf-op-run.c
@@ -1999,7 +1999,7 @@ static void pdf_run_END(fz_context *ctx, pdf_processor *proc)
}
static void
-pdf_run_drop_imp(fz_context *ctx, pdf_processor *proc)
+pdf_drop_run_processor(fz_context *ctx, pdf_processor *proc)
{
pdf_run_processor *pr = (pdf_run_processor *)proc;
@@ -2030,7 +2030,7 @@ pdf_new_run_processor(fz_context *ctx, fz_device *dev, const fz_matrix *ctm, con
{
proc->super.event = event;
- proc->super.drop_imp = pdf_run_drop_imp;
+ proc->super.drop_processor = pdf_drop_run_processor;
/* general graphics state */
proc->super.op_w = pdf_run_w;
diff --git a/source/pdf/pdf-page.c b/source/pdf/pdf-page.c
index e3b68378..dae0d49d 100644
--- a/source/pdf/pdf-page.c
+++ b/source/pdf/pdf-page.c
@@ -538,7 +538,7 @@ pdf_new_page(fz_context *ctx, pdf_document *doc)
page->doc = (pdf_document*) fz_keep_document(ctx, &doc->super);
- page->super.drop_page_imp = (fz_page_drop_page_imp_fn *)pdf_drop_page_imp;
+ page->super.drop_page = (fz_page_drop_page_fn *)pdf_drop_page_imp;
page->super.load_links = (fz_page_load_links_fn *)pdf_load_links;
page->super.bound_page = (fz_page_bound_page_fn *)pdf_bound_page;
page->super.first_annot = (fz_page_first_annot_fn *)pdf_first_annot;
diff --git a/source/pdf/pdf-write.c b/source/pdf/pdf-write.c
index 0a7a0f2f..3f2c2cda 100644
--- a/source/pdf/pdf-write.c
+++ b/source/pdf/pdf-write.c
@@ -3221,20 +3221,20 @@ pdf_writer_end_page(fz_context *ctx, fz_document_writer *wri_, fz_device *dev)
}
static void
-pdf_writer_close(fz_context *ctx, fz_document_writer *wri_)
+pdf_writer_close_writer(fz_context *ctx, fz_document_writer *wri_)
{
pdf_writer *wri = (pdf_writer*)wri_;
- fz_try(ctx)
- pdf_save_document(ctx, wri->pdf, wri->filename, &wri->opts);
- fz_always(ctx)
- {
- fz_drop_buffer(ctx, wri->contents);
- pdf_drop_obj(ctx, wri->resources);
- pdf_drop_document(ctx, wri->pdf);
- fz_free(ctx, wri->filename);
- }
- fz_catch(ctx)
- fz_rethrow(ctx);
+ pdf_save_document(ctx, wri->pdf, wri->filename, &wri->opts);
+}
+
+static void
+pdf_writer_drop_writer(fz_context *ctx, fz_document_writer *wri_)
+{
+ pdf_writer *wri = (pdf_writer*)wri_;
+ fz_drop_buffer(ctx, wri->contents);
+ pdf_drop_obj(ctx, wri->resources);
+ pdf_drop_document(ctx, wri->pdf);
+ fz_free(ctx, wri->filename);
}
fz_document_writer *
@@ -3245,7 +3245,8 @@ fz_new_pdf_writer(fz_context *ctx, const char *path, const char *options)
wri = fz_malloc_struct(ctx, pdf_writer);
wri->super.begin_page = pdf_writer_begin_page;
wri->super.end_page = pdf_writer_end_page;
- wri->super.close = pdf_writer_close;
+ wri->super.close_writer = pdf_writer_close_writer;
+ wri->super.drop_writer = pdf_writer_drop_writer;
fz_try(ctx)
{
diff --git a/source/pdf/pdf-xref.c b/source/pdf/pdf-xref.c
index 48a5d316..f9f2f576 100644
--- a/source/pdf/pdf-xref.c
+++ b/source/pdf/pdf-xref.c
@@ -1556,7 +1556,7 @@ pdf_init_document(fz_context *ctx, pdf_document *doc)
}
static void
-pdf_close_document(fz_context *ctx, pdf_document *doc)
+pdf_drop_document_imp(fz_context *ctx, pdf_document *doc)
{
int i;
@@ -2299,7 +2299,7 @@ pdf_new_document(fz_context *ctx, fz_stream *file)
{
pdf_document *doc = fz_new_document(ctx, pdf_document);
- doc->super.close = (fz_document_close_fn *)pdf_close_document;
+ doc->super.drop_document = (fz_document_drop_fn *)pdf_drop_document_imp;
doc->super.needs_password = (fz_document_needs_password_fn *)pdf_needs_password;
doc->super.authenticate_password = (fz_document_authenticate_password_fn *)pdf_authenticate_password;
doc->super.has_permission = (fz_document_has_permission_fn *)pdf_has_permission;
@@ -2325,7 +2325,7 @@ pdf_open_document_with_stream(fz_context *ctx, fz_stream *file)
}
fz_catch(ctx)
{
- pdf_close_document(ctx, doc);
+ pdf_drop_document_imp(ctx, doc);
fz_rethrow(ctx);
}
return doc;
@@ -2352,7 +2352,7 @@ pdf_open_document(fz_context *ctx, const char *filename)
}
fz_catch(ctx)
{
- pdf_close_document(ctx, doc);
+ pdf_drop_document_imp(ctx, doc);
fz_rethrow(ctx);
}
return doc;
diff --git a/source/svg/svg-doc.c b/source/svg/svg-doc.c
index 25f00e62..5404eefa 100644
--- a/source/svg/svg-doc.c
+++ b/source/svg/svg-doc.c
@@ -9,7 +9,7 @@ struct svg_page_s
};
static void
-svg_close_document(fz_context *ctx, fz_document *doc_)
+svg_drop_document(fz_context *ctx, fz_document *doc_)
{
svg_document *doc = (svg_document*)doc_;
fz_drop_tree(ctx, doc->idmap, NULL);
@@ -47,7 +47,7 @@ svg_run_page(fz_context *ctx, fz_page *page_, fz_device *dev, const fz_matrix *c
}
static void
-svg_drop_page_imp(fz_context *ctx, fz_page *page_)
+svg_drop_page(fz_context *ctx, fz_page *page_)
{
/* nothing */
}
@@ -64,7 +64,7 @@ svg_load_page(fz_context *ctx, fz_document *doc_, int number)
page = fz_new_page(ctx, sizeof *page);
page->super.bound_page = svg_bound_page;
page->super.run_page_contents = svg_run_page;
- page->super.drop_page_imp = svg_drop_page_imp;
+ page->super.drop_page = svg_drop_page;
page->doc = doc;
return (fz_page*)page;
@@ -92,7 +92,7 @@ svg_open_document_with_buffer(fz_context *ctx, fz_buffer *buf)
root = fz_parse_xml(ctx, buf->data, buf->len, 0);
doc = fz_new_document(ctx, svg_document);
- doc->super.close = svg_close_document;
+ doc->super.drop_document = svg_drop_document;
doc->super.count_pages = svg_count_pages;
doc->super.load_page = svg_load_page;
diff --git a/source/tools/muconvert.c b/source/tools/muconvert.c
index 95f01c4a..4fb3b071 100644
--- a/source/tools/muconvert.c
+++ b/source/tools/muconvert.c
@@ -162,6 +162,8 @@ int muconvert_main(int argc, char **argv)
fz_drop_document(ctx, doc);
}
+ fz_close_document_writer(ctx, out);
+
fz_drop_document_writer(ctx, out);
fz_drop_context(ctx);
return EXIT_SUCCESS;
diff --git a/source/tools/mudraw.c b/source/tools/mudraw.c
index 0521a9b0..16e12b6b 100644
--- a/source/tools/mudraw.c
+++ b/source/tools/mudraw.c
@@ -554,6 +554,7 @@ static void drawband(fz_context *ctx, fz_page *page, fz_display_list *list, cons
fz_run_display_list(ctx, list, dev, ctm, tbounds, cookie);
else
fz_run_page(ctx, page, dev, ctm, cookie);
+ fz_close_device(ctx, dev);
fz_drop_device(ctx, dev);
dev = NULL;
@@ -596,6 +597,7 @@ static void dodrawpage(fz_context *ctx, fz_page *page, fz_display_list *list, in
else
fz_run_page(ctx, page, dev, &fz_identity, cookie);
fz_printf(ctx, out, "</page>\n");
+ fz_close_device(ctx, dev);
}
fz_always(ctx)
{
@@ -628,6 +630,7 @@ static void dodrawpage(fz_context *ctx, fz_page *page, fz_display_list *list, in
fz_run_display_list(ctx, list, dev, &fz_identity, &fz_infinite_rect, cookie);
else
fz_run_page(ctx, page, dev, &fz_identity, cookie);
+ fz_close_device(ctx, dev);
fz_drop_device(ctx, dev);
dev = NULL;
if (output_format == OUT_STEXT)
@@ -674,6 +677,7 @@ static void dodrawpage(fz_context *ctx, fz_page *page, fz_display_list *list, in
fz_run_display_list(ctx, list, dev, &fz_identity, NULL, cookie);
else
fz_run_page(ctx, page, dev, &fz_identity, cookie);
+ fz_close_device(ctx, dev);
page_obj = pdf_add_page(ctx, pdfout, &mediabox, rotation, resources, contents);
pdf_insert_page(ctx, pdfout, -1, page_obj);
@@ -726,6 +730,7 @@ static void dodrawpage(fz_context *ctx, fz_page *page, fz_display_list *list, in
fz_run_display_list(ctx, list, dev, &ctm, &tbounds, cookie);
else
fz_run_page(ctx, page, dev, &ctm, cookie);
+ fz_close_device(ctx, dev);
fz_drop_device(ctx, dev);
dev = NULL;
}
@@ -754,10 +759,8 @@ static void dodrawpage(fz_context *ctx, fz_page *page, fz_display_list *list, in
fz_ps_output_context *psoc = NULL;
fz_mono_pcl_output_context *pmcoc = NULL;
fz_color_pcl_output_context *pccoc = NULL;
- fz_device *dev = NULL;
fz_bitmap *bit = NULL;
- fz_var(dev);
fz_var(pix);
fz_var(poc);
fz_var(psoc);
@@ -991,8 +994,6 @@ static void dodrawpage(fz_context *ctx, fz_page *page, fz_display_list *list, in
{
fz_drop_bitmap(ctx, bit);
bit = NULL;
- fz_drop_device(ctx, dev);
- dev = NULL;
if (num_workers > 0)
{
int band;
@@ -1121,6 +1122,7 @@ static void drawpage(fz_context *ctx, fz_document *doc, int pagenum)
if (lowmemory)
fz_enable_device_hints(ctx, dev, FZ_NO_CACHE);
fz_run_page(ctx, page, dev, &fz_identity, &cookie);
+ fz_close_device(ctx, dev);
}
fz_always(ctx)
{
@@ -1153,6 +1155,7 @@ static void drawpage(fz_context *ctx, fz_document *doc, int pagenum)
fz_run_display_list(ctx, list, dev, &fz_identity, &fz_infinite_rect, NULL);
else
fz_run_page(ctx, page, dev, &fz_identity, &cookie);
+ fz_close_device(ctx, dev);
}
fz_always(ctx)
{
diff --git a/source/tools/muraster.c b/source/tools/muraster.c
index e5d886f4..6a2cf87e 100644
--- a/source/tools/muraster.c
+++ b/source/tools/muraster.c
@@ -710,6 +710,7 @@ static int drawband(fz_context *ctx, fz_page *page, fz_display_list *list, const
fz_run_display_list(ctx, list, dev, ctm, tbounds, cookie);
else
fz_run_page(ctx, page, dev, ctm, cookie);
+ fz_close_device(ctx, dev);
fz_drop_device(ctx, dev);
dev = NULL;
@@ -726,12 +727,10 @@ static int drawband(fz_context *ctx, fz_page *page, fz_display_list *list, const
static int dodrawpage(fz_context *ctx, int pagenum, fz_cookie *cookie, render_details *render)
{
- fz_device *dev = NULL;
fz_pixmap *pix = NULL;
fz_bitmap *bit = NULL;
int errors_are_fatal = 0;
- fz_var(dev);
fz_var(pix);
fz_var(bit);
fz_var(errors_are_fatal);
@@ -852,8 +851,6 @@ static int dodrawpage(fz_context *ctx, int pagenum, fz_cookie *cookie, render_de
{
fz_drop_bitmap(ctx, bit);
bit = NULL;
- fz_drop_device(ctx, dev);
- dev = NULL;
if (render->num_workers > 0)
{
int band;
@@ -1198,9 +1195,11 @@ static void drawpage(fz_context *ctx, fz_document *doc, int pagenum)
#if GREY_FALLBACK != 0
test_dev = fz_new_test_device(ctx, &is_color, 0.01f, 0, list_dev);
fz_run_page(ctx, page, test_dev, &fz_identity, &cookie);
+ fz_close_device(ctx, test_dev);
#else
fz_run_page(ctx, page, list_dev, &fz_identity, &cookie);
#endif
+ fz_close_device(ctx, list_dev);
}
fz_always(ctx)
{
@@ -1229,6 +1228,7 @@ static void drawpage(fz_context *ctx, fz_document *doc, int pagenum)
{
test_dev = fz_new_test_device(ctx, &is_color, 0.01f, 0, test_dev);
fz_run_page(ctx, page, test_dev, &fz_identity, &cookie);
+ fz_close_device(ctx, test_dev);
}
fz_always(ctx)
{
@@ -1258,6 +1258,7 @@ static void drawpage(fz_context *ctx, fz_document *doc, int pagenum)
fz_run_display_list(ctx, list, test_dev, &fz_identity, &fz_infinite_rect, &cookie);
else
fz_run_page(ctx, page, test_dev, &fz_identity, &cookie);
+ fz_close_device(ctx, test_dev);
}
fz_always(ctx)
{
diff --git a/source/tools/murun.c b/source/tools/murun.c
index a3eacaa8..fb35f0a0 100644
--- a/source/tools/murun.c
+++ b/source/tools/murun.c
@@ -178,7 +178,10 @@ static const char *require_js =
static void ffi_gc_fz_buffer(js_State *J, void *buf)
{
fz_context *ctx = js_getcontext(J);
- fz_drop_buffer(ctx, buf);
+ fz_try(ctx)
+ fz_drop_buffer(ctx, buf);
+ fz_catch(ctx)
+ rethrow(J);
}
static void ffi_gc_fz_document(js_State *J, void *doc)
@@ -1497,11 +1500,13 @@ static void ffi_Page_run(js_State *J)
} else {
device = new_js_device(ctx, J);
js_copy(J, 1); /* put the js device on the top so the callbacks know where to get it */
- fz_try(ctx)
+ fz_try(ctx) {
if (no_annots)
fz_run_page_contents(ctx, page, device, &ctm, NULL);
else
fz_run_page(ctx, page, device, &ctm, NULL);
+ fz_close_device(ctx, device);
+ }
fz_always(ctx)
fz_drop_device(ctx, device);
fz_catch(ctx)
@@ -1650,8 +1655,10 @@ static void ffi_Annotation_run(js_State *J)
} else {
device = new_js_device(ctx, J);
js_copy(J, 1); /* put the js device on the top so the callbacks know where to get it */
- fz_try(ctx)
+ fz_try(ctx) {
fz_run_annot(ctx, annot, device, &ctm, NULL);
+ fz_close_device(ctx, device);
+ }
fz_always(ctx)
fz_drop_device(ctx, device);
fz_catch(ctx)
@@ -2213,8 +2220,10 @@ static void ffi_DisplayList_run(js_State *J)
} else {
device = new_js_device(ctx, J);
js_copy(J, 1);
- fz_try(ctx)
+ fz_try(ctx) {
fz_run_display_list(ctx, list, device, &ctm, NULL, NULL);
+ fz_close_device(ctx, device);
+ }
fz_always(ctx)
fz_drop_device(ctx, device);
fz_catch(ctx)
@@ -2418,7 +2427,6 @@ static void ffi_DocumentWriter_endPage(js_State *J)
rethrow(J);
}
-
static void ffi_DocumentWriter_close(js_State *J)
{
fz_context *ctx = js_getcontext(J);
diff --git a/source/xps/xps-doc.c b/source/xps/xps-doc.c
index 95008e72..fb4511f4 100644
--- a/source/xps/xps-doc.c
+++ b/source/xps/xps-doc.c
@@ -414,7 +414,7 @@ xps_bound_page(fz_context *ctx, xps_page *page, fz_rect *bounds)
return bounds;
}
-void
+static void
xps_drop_page_imp(fz_context *ctx, xps_page *page)
{
if (page == NULL)
@@ -444,7 +444,7 @@ xps_load_page(fz_context *ctx, xps_document *doc, int number)
page->super.load_links = (fz_page_load_links_fn *)xps_load_links;
page->super.bound_page = (fz_page_bound_page_fn *)xps_bound_page;
page->super.run_page_contents = (fz_page_run_page_contents_fn *)xps_run_page;
- page->super.drop_page_imp = (fz_page_drop_page_imp_fn *)xps_drop_page_imp;
+ page->super.drop_page = (fz_page_drop_page_fn *)xps_drop_page_imp;
page->doc = (xps_document*) fz_keep_document(ctx, &doc->super);
page->fix = fix;
diff --git a/source/xps/xps-zip.c b/source/xps/xps-zip.c
index b0c4403a..2bf0391f 100644
--- a/source/xps/xps-zip.c
+++ b/source/xps/xps-zip.c
@@ -134,7 +134,7 @@ xps_open_document_with_directory(fz_context *ctx, const char *directory)
}
fz_catch(ctx)
{
- xps_close_document(ctx, doc);
+ xps_drop_document(ctx, doc);
fz_rethrow(ctx);
}
@@ -156,7 +156,7 @@ xps_open_document_with_stream(fz_context *ctx, fz_stream *file)
}
fz_catch(ctx)
{
- xps_close_document(ctx, doc);
+ xps_drop_document(ctx, doc);
fz_rethrow(ctx);
}
@@ -194,7 +194,7 @@ xps_open_document(fz_context *ctx, const char *filename)
}
void
-xps_close_document(fz_context *ctx, xps_document *doc)
+xps_drop_document(fz_context *ctx, xps_document *doc)
{
xps_font_cache *font, *next;
@@ -232,7 +232,7 @@ static void
xps_init_document(fz_context *ctx, xps_document *doc)
{
doc->super.refs = 1;
- doc->super.close = (fz_document_close_fn *)xps_close_document;
+ doc->super.drop_document = (fz_document_drop_fn *)xps_drop_document;
doc->super.load_outline = (fz_document_load_outline_fn *)xps_load_outline;
doc->super.count_pages = (fz_document_count_pages_fn *)xps_count_pages;
doc->super.load_page = (fz_document_load_page_fn *)xps_load_page;