summaryrefslogtreecommitdiff
path: root/source/fitz
diff options
context:
space:
mode:
authorTor Andersson <tor.andersson@artifex.com>2017-10-17 16:41:59 +0200
committerTor Andersson <tor.andersson@artifex.com>2017-11-01 13:08:56 +0100
commit1dc763159b03cbd4387713f353f26c890d2c0e52 (patch)
treed43c18deeacd70e23d7e353c8f0c074c87419a34 /source/fitz
parentf595e889b91a674eb94db7ca4d832da54f5194cd (diff)
downloadmupdf-1dc763159b03cbd4387713f353f26c890d2c0e52.tar.xz
Add separate fz_close_output step.
Closing flushes output and may throw exceptions. Dropping frees the state and never throws exceptions.
Diffstat (limited to 'source/fitz')
-rw-r--r--source/fitz/bitmap.c6
-rw-r--r--source/fitz/output-pcl.c8
-rw-r--r--source/fitz/output-pclm.c5
-rw-r--r--source/fitz/output-png.c2
-rw-r--r--source/fitz/output-pnm.c2
-rw-r--r--source/fitz/output-ps.c4
-rw-r--r--source/fitz/output-psd.c1
-rw-r--r--source/fitz/output-pwg.c4
-rw-r--r--source/fitz/output-svg.c10
-rw-r--r--source/fitz/output-tga.c3
-rw-r--r--source/fitz/output.c33
-rw-r--r--source/fitz/stext-output.c1
-rw-r--r--source/fitz/zip.c2
13 files changed, 69 insertions, 12 deletions
diff --git a/source/fitz/bitmap.c b/source/fitz/bitmap.c
index cee3a3fa..fe16759c 100644
--- a/source/fitz/bitmap.c
+++ b/source/fitz/bitmap.c
@@ -453,7 +453,10 @@ fz_save_bitmap_as_pbm(fz_context *ctx, fz_bitmap *bitmap, const char *filename)
{
fz_output *out = fz_new_output_with_path(ctx, filename, 0);
fz_try(ctx)
+ {
fz_write_bitmap_as_pbm(ctx, out, bitmap);
+ fz_close_output(ctx, out);
+ }
fz_always(ctx)
fz_drop_output(ctx, out);
fz_catch(ctx)
@@ -465,7 +468,10 @@ fz_save_bitmap_as_pkm(fz_context *ctx, fz_bitmap *bitmap, const char *filename)
{
fz_output *out = fz_new_output_with_path(ctx, filename, 0);
fz_try(ctx)
+ {
fz_write_bitmap_as_pkm(ctx, out, bitmap);
+ fz_close_output(ctx, out);
+ }
fz_always(ctx)
fz_drop_output(ctx, out);
fz_catch(ctx)
diff --git a/source/fitz/output-pcl.c b/source/fitz/output-pcl.c
index 3898ac9c..4b885fe3 100644
--- a/source/fitz/output-pcl.c
+++ b/source/fitz/output-pcl.c
@@ -1379,7 +1379,10 @@ fz_save_pixmap_as_pcl(fz_context *ctx, fz_pixmap *pixmap, char *filename, int ap
{
fz_output *out = fz_new_output_with_path(ctx, filename, append);
fz_try(ctx)
+ {
fz_write_pixmap_as_pcl(ctx, out, pixmap, pcl);
+ fz_close_output(ctx, out);
+ }
fz_always(ctx)
fz_drop_output(ctx, out);
fz_catch(ctx)
@@ -1391,7 +1394,10 @@ fz_save_bitmap_as_pcl(fz_context *ctx, fz_bitmap *bitmap, char *filename, int ap
{
fz_output *out = fz_new_output_with_path(ctx, filename, append);
fz_try(ctx)
+ {
fz_write_bitmap_as_pcl(ctx, out, bitmap, pcl);
+ fz_close_output(ctx, out);
+ }
fz_always(ctx)
fz_drop_output(ctx, out);
fz_catch(ctx)
@@ -1453,6 +1459,8 @@ pcl_end_page(fz_context *ctx, fz_document_writer *wri_, fz_device *dev)
static void
pcl_close_writer(fz_context *ctx, fz_document_writer *wri_)
{
+ fz_pcl_writer *wri = (fz_pcl_writer*)wri_;
+ fz_close_output(ctx, wri->out);
}
static void
diff --git a/source/fitz/output-pclm.c b/source/fitz/output-pclm.c
index 8f05f3bf..f3aa2ec2 100644
--- a/source/fitz/output-pclm.c
+++ b/source/fitz/output-pclm.c
@@ -298,7 +298,10 @@ fz_save_pixmap_as_pclm(fz_context *ctx, fz_pixmap *pixmap, char *filename, int a
{
fz_output *out = fz_new_output_with_path(ctx, filename, append);
fz_try(ctx)
+ {
fz_write_pixmap_as_pclm(ctx, out, pixmap, pclm);
+ fz_close_output(ctx, out);
+ }
fz_always(ctx)
fz_drop_output(ctx, out);
fz_catch(ctx)
@@ -354,6 +357,8 @@ pclm_close_writer(fz_context *ctx, fz_document_writer *wri_)
fz_drop_band_writer(ctx, wri->bander);
wri->bander = NULL;
+
+ fz_close_output(ctx, wri->out);
}
static void
diff --git a/source/fitz/output-png.c b/source/fitz/output-png.c
index 709d65f0..59dbba94 100644
--- a/source/fitz/output-png.c
+++ b/source/fitz/output-png.c
@@ -37,6 +37,7 @@ fz_save_pixmap_as_png(fz_context *ctx, fz_pixmap *pixmap, const char *filename)
writer = fz_new_png_band_writer(ctx, out);
fz_write_header(ctx, writer, pixmap->w, pixmap->h, pixmap->n, pixmap->alpha, pixmap->xres, pixmap->yres, 0, pixmap->colorspace, pixmap->seps);
fz_write_band(ctx, writer, pixmap->stride, pixmap->h, pixmap->samples);
+ fz_close_output(ctx, out);
}
fz_always(ctx)
{
@@ -357,6 +358,7 @@ png_from_pixmap(fz_context *ctx, fz_pixmap *pix, const fz_color_params *color_pa
buf = fz_new_buffer(ctx, 1024);
out = fz_new_output_with_buffer(ctx, buf);
fz_write_pixmap_as_png(ctx, out, pix);
+ fz_close_output(ctx, out);
}
fz_always(ctx)
{
diff --git a/source/fitz/output-pnm.c b/source/fitz/output-pnm.c
index 2c4d4d30..9bc5e6aa 100644
--- a/source/fitz/output-pnm.c
+++ b/source/fitz/output-pnm.c
@@ -150,6 +150,7 @@ fz_save_pixmap_as_pnm(fz_context *ctx, fz_pixmap *pixmap, const char *filename)
writer = fz_new_pnm_band_writer(ctx, out);
fz_write_header(ctx, writer, pixmap->w, pixmap->h, pixmap->n, pixmap->alpha, 0, 0, 0, pixmap->colorspace, pixmap->seps);
fz_write_band(ctx, writer, pixmap->stride, pixmap->h, pixmap->samples);
+ fz_close_output(ctx, out);
}
fz_always(ctx)
{
@@ -256,6 +257,7 @@ fz_save_pixmap_as_pam(fz_context *ctx, fz_pixmap *pixmap, const char *filename)
writer = fz_new_pam_band_writer(ctx, out);
fz_write_header(ctx, writer, pixmap->w, pixmap->h, pixmap->n, pixmap->alpha, 0, 0, 0, pixmap->colorspace, pixmap->seps);
fz_write_band(ctx, writer, pixmap->stride, pixmap->h, pixmap->samples);
+ fz_close_output(ctx, out);
}
fz_always(ctx)
{
diff --git a/source/fitz/output-ps.c b/source/fitz/output-ps.c
index f0af6ff0..2d9ccf1f 100644
--- a/source/fitz/output-ps.c
+++ b/source/fitz/output-ps.c
@@ -179,7 +179,10 @@ void fz_save_pixmap_as_ps(fz_context *ctx, fz_pixmap *pixmap, char *filename, in
{
fz_output *out = fz_new_output_with_path(ctx, filename, append);
fz_try(ctx)
+ {
fz_write_pixmap_as_ps(ctx, out, pixmap);
+ fz_close_output(ctx, out);
+ }
fz_always(ctx)
fz_drop_output(ctx, out);
fz_catch(ctx)
@@ -314,6 +317,7 @@ ps_close_writer(fz_context *ctx, fz_document_writer *wri_)
{
fz_ps_writer *wri = (fz_ps_writer*)wri_;
fz_write_ps_file_trailer(ctx, wri->out, wri->count);
+ fz_close_output(ctx, wri->out);
}
static void
diff --git a/source/fitz/output-psd.c b/source/fitz/output-psd.c
index 37d51bc8..223a591e 100644
--- a/source/fitz/output-psd.c
+++ b/source/fitz/output-psd.c
@@ -15,6 +15,7 @@ fz_save_pixmap_as_psd(fz_context *ctx, fz_pixmap *pixmap, const char *filename)
writer = fz_new_psd_band_writer(ctx, out);
fz_write_header(ctx, writer, pixmap->w, pixmap->h, pixmap->n, pixmap->alpha, pixmap->xres, pixmap->yres, 0, pixmap->colorspace, pixmap->seps);
fz_write_band(ctx, writer, pixmap->stride, pixmap->h, pixmap->samples);
+ fz_close_output(ctx, out);
}
fz_always(ctx)
{
diff --git a/source/fitz/output-pwg.c b/source/fitz/output-pwg.c
index 8abcbb6d..42ad4a1f 100644
--- a/source/fitz/output-pwg.c
+++ b/source/fitz/output-pwg.c
@@ -150,6 +150,7 @@ fz_save_pixmap_as_pwg(fz_context *ctx, fz_pixmap *pixmap, char *filename, int ap
if (!append)
fz_write_pwg_file_header(ctx, out);
fz_write_pixmap_as_pwg_page(ctx, out, pixmap, pwg);
+ fz_close_output(ctx, out);
}
fz_always(ctx)
fz_drop_output(ctx, out);
@@ -166,6 +167,7 @@ fz_save_bitmap_as_pwg(fz_context *ctx, fz_bitmap *bitmap, char *filename, int ap
if (!append)
fz_write_pwg_file_header(ctx, out);
fz_write_bitmap_as_pwg_page(ctx, out, bitmap, pwg);
+ fz_close_output(ctx, out);
}
fz_always(ctx)
fz_drop_output(ctx, out);
@@ -448,6 +450,8 @@ pwg_end_page(fz_context *ctx, fz_document_writer *wri_, fz_device *dev)
static void
pwg_close_writer(fz_context *ctx, fz_document_writer *wri_)
{
+ fz_pwg_writer *wri = (fz_pwg_writer*)wri_;
+ fz_close_output(ctx, wri->out);
}
static void
diff --git a/source/fitz/output-svg.c b/source/fitz/output-svg.c
index 7bae9d4f..8895960a 100644
--- a/source/fitz/output-svg.c
+++ b/source/fitz/output-svg.c
@@ -46,14 +46,18 @@ svg_end_page(fz_context *ctx, fz_document_writer *wri_, fz_device *dev)
fz_svg_writer *wri = (fz_svg_writer*)wri_;
fz_try(ctx)
+ {
fz_close_device(ctx, dev);
+ fz_close_output(ctx, wri->out);
+ }
fz_always(ctx)
+ {
fz_drop_device(ctx, dev);
+ fz_drop_output(ctx, wri->out);
+ wri->out = NULL;
+ }
fz_catch(ctx)
fz_rethrow(ctx);
-
- fz_drop_output(ctx, wri->out);
- wri->out = NULL;
}
static void
diff --git a/source/fitz/output-tga.c b/source/fitz/output-tga.c
index 4206154a..3bee3640 100644
--- a/source/fitz/output-tga.c
+++ b/source/fitz/output-tga.c
@@ -55,7 +55,10 @@ fz_save_pixmap_as_tga(fz_context *ctx, fz_pixmap *pixmap, const char *filename)
{
fz_output *out = fz_new_output_with_path(ctx, filename, 0);
fz_try(ctx)
+ {
fz_write_pixmap_as_tga(ctx, out, pixmap);
+ fz_close_output(ctx, out);
+ }
fz_always(ctx)
fz_drop_output(ctx, out);
fz_catch(ctx)
diff --git a/source/fitz/output.c b/source/fitz/output.c
index 06b25be5..a06a81b6 100644
--- a/source/fitz/output.c
+++ b/source/fitz/output.c
@@ -150,16 +150,16 @@ file_tell(fz_context *ctx, void *opaque)
}
static void
-file_close(fz_context *ctx, void *opaque)
+file_drop(fz_context *ctx, void *opaque)
{
FILE *file = opaque;
int n = fclose(file);
if (n < 0)
- fz_throw(ctx, FZ_ERROR_GENERIC, "cannot fclose: %s", strerror(errno));
+ fz_warn(ctx, "cannot fclose: %s", strerror(errno));
}
fz_output *
-fz_new_output(fz_context *ctx, void *state, fz_output_write_fn *write, fz_output_close_fn *close)
+fz_new_output(fz_context *ctx, void *state, fz_output_write_fn *write, fz_output_close_fn *close, fz_output_drop_fn *drop)
{
fz_output *out = NULL;
@@ -169,11 +169,12 @@ fz_new_output(fz_context *ctx, void *state, fz_output_write_fn *write, fz_output
out->state = state;
out->write = write;
out->close = close;
+ out->drop = drop;
}
fz_catch(ctx)
{
- if (close)
- close(ctx, state);
+ if (drop)
+ drop(ctx, state);
fz_rethrow(ctx);
}
return out;
@@ -210,7 +211,7 @@ fz_new_output_with_path(fz_context *ctx, const char *filename, int append)
if (!file)
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot open file '%s': %s", filename, strerror(errno));
- out = fz_new_output(ctx, file, file_write, file_close);
+ out = fz_new_output(ctx, file, file_write, NULL, file_drop);
out->seek = file_seek;
out->tell = file_tell;
@@ -238,7 +239,7 @@ buffer_tell(fz_context *ctx, void *opaque)
}
static void
-buffer_close(fz_context *ctx, void *opaque)
+buffer_drop(fz_context *ctx, void *opaque)
{
fz_buffer *buffer = opaque;
fz_drop_buffer(ctx, buffer);
@@ -247,18 +248,29 @@ buffer_close(fz_context *ctx, void *opaque)
fz_output *
fz_new_output_with_buffer(fz_context *ctx, fz_buffer *buf)
{
- fz_output *out = fz_new_output(ctx, fz_keep_buffer(ctx, buf), buffer_write, buffer_close);
+ fz_output *out = fz_new_output(ctx, fz_keep_buffer(ctx, buf), buffer_write, NULL, buffer_drop);
out->seek = buffer_seek;
out->tell = buffer_tell;
return out;
}
void
-fz_drop_output(fz_context *ctx, fz_output *out)
+fz_close_output(fz_context *ctx, fz_output *out)
{
if (!out) return;
if (out->close)
out->close(ctx, out->state);
+ out->close = NULL;
+}
+
+void
+fz_drop_output(fz_context *ctx, fz_output *out)
+{
+ if (!out) return;
+ if (out->close)
+ fz_warn(ctx, "dropping unclosed output");
+ if (out->drop)
+ out->drop(ctx, out->state);
if (out->state != &fz_stdout_global && out->state != &fz_stderr_global)
fz_free(ctx, out);
}
@@ -434,7 +446,10 @@ fz_save_buffer(fz_context *ctx, fz_buffer *buf, const char *filename)
{
fz_output *out = fz_new_output_with_path(ctx, filename, 0);
fz_try(ctx)
+ {
fz_write_data(ctx, out, buf->data, buf->len);
+ fz_close_output(ctx, out);
+ }
fz_always(ctx)
fz_drop_output(ctx, out);
fz_catch(ctx)
diff --git a/source/fitz/stext-output.c b/source/fitz/stext-output.c
index c2218357..6a23cc6d 100644
--- a/source/fitz/stext-output.c
+++ b/source/fitz/stext-output.c
@@ -516,6 +516,7 @@ text_close_writer(fz_context *ctx, fz_document_writer *wri_)
fz_write_string(ctx, wri->out, "</document>\n");
break;
}
+ fz_close_output(ctx, wri->out);
}
static void
diff --git a/source/fitz/zip.c b/source/fitz/zip.c
index fbca0590..c7625a28 100644
--- a/source/fitz/zip.c
+++ b/source/fitz/zip.c
@@ -84,6 +84,8 @@ fz_close_zip_writer(fz_context *ctx, fz_zip_writer *zip)
fz_write_data(ctx, zip->output, "MuPDF", 5);
+ fz_close_output(ctx, zip->output);
+
zip->closed = 1;
}