diff options
author | Tor Andersson <tor.andersson@artifex.com> | 2017-10-17 16:41:59 +0200 |
---|---|---|
committer | Tor Andersson <tor.andersson@artifex.com> | 2017-11-01 13:08:56 +0100 |
commit | 1dc763159b03cbd4387713f353f26c890d2c0e52 (patch) | |
tree | d43c18deeacd70e23d7e353c8f0c074c87419a34 /source/fitz | |
parent | f595e889b91a674eb94db7ca4d832da54f5194cd (diff) | |
download | mupdf-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.c | 6 | ||||
-rw-r--r-- | source/fitz/output-pcl.c | 8 | ||||
-rw-r--r-- | source/fitz/output-pclm.c | 5 | ||||
-rw-r--r-- | source/fitz/output-png.c | 2 | ||||
-rw-r--r-- | source/fitz/output-pnm.c | 2 | ||||
-rw-r--r-- | source/fitz/output-ps.c | 4 | ||||
-rw-r--r-- | source/fitz/output-psd.c | 1 | ||||
-rw-r--r-- | source/fitz/output-pwg.c | 4 | ||||
-rw-r--r-- | source/fitz/output-svg.c | 10 | ||||
-rw-r--r-- | source/fitz/output-tga.c | 3 | ||||
-rw-r--r-- | source/fitz/output.c | 33 | ||||
-rw-r--r-- | source/fitz/stext-output.c | 1 | ||||
-rw-r--r-- | source/fitz/zip.c | 2 |
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; } |