[gs-commits] mupdf 1.16.1.10 Bug 701368: Provide fz_document_writer co
[email protected] (Tor Andersson)
| Newsgroups | gmane.comp.printing.ghostscript.cvs |
|---|---|
| Message-ID | <[email protected]> |
commit 76c3d089a9b3a5ffb05a064f8992eb6d662d4d44 Author: Tor Andersson <[email protected]> Date: Tue Jul 30 13:57:13 2019 +0200 Bug 701368: Provide fz_document_writer constructors writing to any output. diff --git a/docs/api/io.html b/docs/api/io.html index 461c31b..b413d01 100644 --- a/docs/api/io.html +++ b/docs/api/io.html @@ -331,6 +331,7 @@ We can also create new Zip archives. typedef struct { <i>internal</i> } fz_zip_writer; fz_zip_writer *fz_new_zip_writer(fz_context *ctx, const char *filename); +fz_zip_writer *fz_new_zip_writer_with_output(fz_context *ctx, fz_output *out); void fz_write_zip_entry(fz_context *ctx, fz_zip_writer *zip, const char *name, fz_buffer *buf, int compress); void fz_close_zip_writer(fz_context *ctx, fz_zip_writer *zip); void fz_drop_zip_writer(fz_context *ctx, fz_zip_writer *zip); diff --git a/include/mupdf/fitz/archive.h b/include/mupdf/fitz/archive.h index 52df6d9..f405738 100644 --- a/include/mupdf/fitz/archive.h +++ b/include/mupdf/fitz/archive.h @@ -62,6 +62,7 @@ fz_archive *fz_open_zip_archive_with_stream(fz_context *ctx, fz_stream *file); typedef struct fz_zip_writer_s fz_zip_writer; fz_zip_writer *fz_new_zip_writer(fz_context *ctx, const char *filename); +fz_zip_writer *fz_new_zip_writer_with_output(fz_context *ctx, fz_output *out); void fz_write_zip_entry(fz_context *ctx, fz_zip_writer *zip, const char *name, fz_buffer *buf, int compress); void fz_close_zip_writer(fz_context *ctx, fz_zip_writer *zip); void fz_drop_zip_writer(fz_context *ctx, fz_zip_writer *zip); diff --git a/include/mupdf/fitz/write-pixmap.h b/include/mupdf/fitz/write-pixmap.h index 310f3dd..50e06e0 100644 --- a/include/mupdf/fitz/write-pixmap.h +++ b/include/mupdf/fitz/write-pixmap.h @@ -66,7 +66,6 @@ struct fz_pclm_options_s fz_pclm_options *fz_parse_pclm_options(fz_context *ctx, fz_pclm_options *opts, const char *args); fz_band_writer *fz_new_pclm_band_writer(fz_context *ctx, fz_output *out, const fz_pclm_options *options); -fz_document_writer *fz_new_pclm_writer(fz_context *ctx, const char *path, const char *options); void fz_write_pixmap_as_pclm(fz_context *ctx, fz_output *out, const fz_pixmap *pixmap, const fz_pclm_options *options); void fz_save_pixmap_as_pclm(fz_context *ctx, fz_pixmap *pixmap, char *filename, int append, const fz_pclm_options *options); diff --git a/include/mupdf/fitz/writer.h b/include/mupdf/fitz/writer.h index 29221aa..a2b9e46 100644 --- a/include/mupdf/fitz/writer.h +++ b/include/mupdf/fitz/writer.h @@ -80,15 +80,24 @@ int fz_copy_option(fz_context *ctx, const char *val, char *dest, size_t maxlen); fz_document_writer *fz_new_document_writer(fz_context *ctx, const char *path, const char *format, const char *options); fz_document_writer *fz_new_pdf_writer(fz_context *ctx, const char *path, const char *options); +fz_document_writer *fz_new_pdf_writer_with_output(fz_context *ctx, fz_output *out, const char *options); fz_document_writer *fz_new_svg_writer(fz_context *ctx, const char *path, const char *options); fz_document_writer *fz_new_text_writer(fz_context *ctx, const char *format, const char *path, const char *options); +fz_document_writer *fz_new_text_writer_with_output(fz_context *ctx, const char *format, fz_output *out, const char *options); fz_document_writer *fz_new_ps_writer(fz_context *ctx, const char *path, const char *options); +fz_document_writer *fz_new_ps_writer_with_output(fz_context *ctx, fz_output *out, const char *options); fz_document_writer *fz_new_pcl_writer(fz_context *ctx, const char *path, const char *options); +fz_document_writer *fz_new_pcl_writer_with_output(fz_context *ctx, fz_output *out, const char *options); +fz_document_writer *fz_new_pclm_writer(fz_context *ctx, const char *path, const char *options); +fz_document_writer *fz_new_pclm_writer_with_output(fz_context *ctx, fz_output *out, const char *options); fz_document_writer *fz_new_pwg_writer(fz_context *ctx, const char *path, const char *options); +fz_document_writer *fz_new_pwg_writer_with_output(fz_context *ctx, fz_output *out, const char *options); fz_document_writer *fz_new_cbz_writer(fz_context *ctx, const char *path, const char *options); +fz_document_writer *fz_new_cbz_writer_with_output(fz_context *ctx, fz_output *out, const char *options); + fz_document_writer *fz_new_png_pixmap_writer(fz_context *ctx, const char *path, const char *options); fz_document_writer *fz_new_pam_pixmap_writer(fz_context *ctx, const char *path, const char *options); fz_document_writer *fz_new_pnm_pixmap_writer(fz_context *ctx, const char *path, const char *options); diff --git a/source/fitz/output-cbz.c b/source/fitz/output-cbz.c index 67888bd..96ee18f 100644 --- a/source/fitz/output-cbz.c +++ b/source/fitz/output-cbz.c @@ -70,24 +70,37 @@ cbz_drop_writer(fz_context *ctx, fz_document_writer *wri_) } fz_document_writer * -fz_new_cbz_writer(fz_context *ctx, const char *path, const char *options) +fz_new_cbz_writer_with_output(fz_context *ctx, fz_output *out, const char *options) { fz_cbz_writer *wri = fz_new_derived_document_writer(ctx, fz_cbz_writer, cbz_begin_page, cbz_end_page, cbz_close_writer, cbz_drop_writer); - fz_try(ctx) { fz_parse_draw_options(ctx, &wri->options, options); - wri->zip = fz_new_zip_writer(ctx, path ? path : "out.cbz"); + wri->zip = fz_new_zip_writer_with_output(ctx, out); } fz_catch(ctx) { fz_free(ctx, wri); fz_rethrow(ctx); } - return (fz_document_writer*)wri; } +fz_document_writer * +fz_new_cbz_writer(fz_context *ctx, const char *path, const char *options) +{ + fz_output *out = fz_new_output_with_path(ctx, path ? path : "out.cbz", 0); + fz_document_writer *wri = NULL; + fz_try(ctx) + wri = fz_new_cbz_writer_with_output(ctx, out, options); + fz_catch(ctx) + { + fz_drop_output(ctx, out); + fz_rethrow(ctx); + } + return wri; +} + /* generic image file output writer */ typedef struct fz_pixmap_writer_s fz_pixmap_writer; diff --git a/source/fitz/output-pcl.c b/source/fitz/output-pcl.c index 9bc69b0..03c2af3 100644 --- a/source/fitz/output-pcl.c +++ b/source/fitz/output-pcl.c @@ -1526,7 +1526,7 @@ pcl_drop_writer(fz_context *ctx, fz_document_writer *wri_) } fz_document_writer * -fz_new_pcl_writer(fz_context *ctx, const char *path, const char *options) +fz_new_pcl_writer_with_output(fz_context *ctx, fz_output *out, const char *options) { fz_pcl_writer *wri = fz_new_derived_document_writer(ctx, fz_pcl_writer, pcl_begin_page, pcl_end_page, pcl_close_writer, pcl_drop_writer); const char *val; @@ -1538,14 +1538,28 @@ fz_new_pcl_writer(fz_context *ctx, const char *path, const char *options) if (fz_has_option(ctx, options, "colorspace", &val)) if (fz_option_eq(val, "mono")) wri->mono = 1; - wri->out = fz_new_output_with_path(ctx, path ? path : "out.pcl", 0); + wri->out = out; } fz_catch(ctx) { - fz_drop_output(ctx, wri->out); fz_free(ctx, wri); fz_rethrow(ctx); } return (fz_document_writer*)wri; } + +fz_document_writer * +fz_new_pcl_writer(fz_context *ctx, const char *path, const char *options) +{ + fz_output *out = fz_new_output_with_path(ctx, path ? path : "out.pcl", 0); + fz_document_writer *wri = NULL; + fz_try(ctx) + wri = fz_new_pcl_writer_with_output(ctx, out, options); + fz_catch(ctx) + { + fz_drop_output(ctx, out); + fz_rethrow(ctx); + } + return wri; +} diff --git a/source/fitz/output-pclm.c b/source/fitz/output-pclm.c index 11461f3..b8c918a 100644 --- a/source/fitz/output-pclm.c +++ b/source/fitz/output-pclm.c @@ -383,7 +383,7 @@ pclm_drop_writer(fz_context *ctx, fz_document_writer *wri_) } fz_document_writer * -fz_new_pclm_writer(fz_context *ctx, const char *path, const char *options) +fz_new_pclm_writer_with_output(fz_context *ctx, fz_output *out, const char *options) { fz_pclm_writer *wri = fz_new_derived_document_writer(ctx, fz_pclm_writer, pclm_begin_page, pclm_end_page, pclm_close_writer, pclm_drop_writer); @@ -391,15 +391,29 @@ fz_new_pclm_writer(fz_context *ctx, const char *path, const char *options) { fz_parse_draw_options(ctx, &wri->draw, options); fz_parse_pclm_options(ctx, &wri->pclm, options); - wri->out = fz_new_output_with_path(ctx, path ? path : "out.pclm", 0); + wri->out = out; wri->bander = fz_new_pclm_band_writer(ctx, wri->out, &wri->pclm); } fz_catch(ctx) { - fz_drop_output(ctx, wri->out); fz_free(ctx, wri); fz_rethrow(ctx); } return (fz_document_writer*)wri; } + +fz_document_writer * +fz_new_pclm_writer(fz_context *ctx, const char *path, const char *options) +{ + fz_output *out = fz_new_output_with_path(ctx, path ? path : "out.pclm", 0); + fz_document_writer *wri = NULL; + fz_try(ctx) + wri = fz_new_pclm_writer_with_output(ctx, out, options); + fz_catch(ctx) + { + fz_drop_output(ctx, out); + fz_rethrow(ctx); + } + return wri; +} diff --git a/source/fitz/output-ps.c b/source/fitz/output-ps.c index c4c677f..cd04a73 100644 --- a/source/fitz/output-ps.c +++ b/source/fitz/output-ps.c @@ -329,22 +329,36 @@ ps_drop_writer(fz_context *ctx, fz_document_writer *wri_) } fz_document_writer * -fz_new_ps_writer(fz_context *ctx, const char *path, const char *options) +fz_new_ps_writer_with_output(fz_context *ctx, fz_output *out, const char *options) { fz_ps_writer *wri = fz_new_derived_document_writer(ctx, fz_ps_writer, ps_begin_page, ps_end_page, ps_close_writer, ps_drop_writer); fz_try(ctx) { fz_parse_draw_options(ctx, &wri->draw, options); - wri->out = fz_new_output_with_path(ctx, path ? path : "out.ps", 0); + wri->out = out; fz_write_ps_file_header(ctx, wri->out); } fz_catch(ctx) { - fz_drop_output(ctx, wri->out); fz_free(ctx, wri); fz_rethrow(ctx); } return (fz_document_writer*)wri; } + +fz_document_writer * +fz_new_ps_writer(fz_context *ctx, const char *path, const char *options) +{ + fz_output *out = fz_new_output_with_path(ctx, path ? path : "out.ps", 0); + fz_document_writer *wri = NULL; + fz_try(ctx) + wri = fz_new_ps_writer_with_output(ctx, out, options); + fz_catch(ctx) + { + fz_drop_output(ctx, out); + fz_rethrow(ctx); + } + return wri; +} diff --git a/source/fitz/output-pwg.c b/source/fitz/output-pwg.c index 1491370..77c7c69 100644 --- a/source/fitz/output-pwg.c +++ b/source/fitz/output-pwg.c @@ -608,7 +608,7 @@ pwg_drop_writer(fz_context *ctx, fz_document_writer *wri_) } fz_document_writer * -fz_new_pwg_writer(fz_context *ctx, const char *path, const char *options) +fz_new_pwg_writer_with_output(fz_context *ctx, fz_output *out, const char *options) { fz_pwg_writer *wri = fz_new_derived_document_writer(ctx, fz_pwg_writer, pwg_begin_page, pwg_end_page, pwg_close_writer, pwg_drop_writer); const char *val; @@ -620,15 +620,29 @@ fz_new_pwg_writer(fz_context *ctx, const char *path, const char *options) if (fz_has_option(ctx, options, "colorspace", &val)) if (fz_option_eq(val, "mono")) wri->mono = 1; - wri->out = fz_new_output_with_path(ctx, path ? path : "out.pwg", 0); + wri->out = out; fz_write_pwg_file_header(ctx, wri->out); } fz_catch(ctx) { - fz_drop_output(ctx, wri->out); fz_free(ctx, wri); fz_rethrow(ctx); } return (fz_document_writer*)wri; } + +fz_document_writer * +fz_new_pwg_writer(fz_context *ctx, const char *path, const char *options) +{ + fz_output *out = fz_new_output_with_path(ctx, path ? path : "out.pwg", 0); + fz_document_writer *wri = NULL; + fz_try(ctx) + wri = fz_new_pwg_writer_with_output(ctx, out, options); + fz_catch(ctx) + { + fz_drop_output(ctx, out); + fz_rethrow(ctx); + } + return wri; +} diff --git a/source/fitz/stext-output.c b/source/fitz/stext-output.c index 694f74a..e3b6fe2 100644 --- a/source/fitz/stext-output.c +++ b/source/fitz/stext-output.c @@ -590,14 +590,14 @@ text_drop_writer(fz_context *ctx, fz_document_writer *wri_) } fz_document_writer * -fz_new_text_writer(fz_context *ctx, const char *format, const char *path, const char *args) +fz_new_text_writer_with_output(fz_context *ctx, const char *format, fz_output *out, const char *options) { fz_text_writer *wri; wri = fz_new_derived_document_writer(ctx, fz_text_writer, text_begin_page, text_end_page, text_close_writer, text_drop_writer); fz_try(ctx) { - fz_parse_stext_options(ctx, &wri->opts, args); + fz_parse_stext_options(ctx, &wri->opts, options); wri->format = FZ_FORMAT_TEXT; if (!strcmp(format, "text")) @@ -609,7 +609,7 @@ fz_new_text_writer(fz_context *ctx, const char *format, const char *path, const else if (!strcmp(format, "stext")) wri->format = FZ_FORMAT_STEXT; - wri->out = fz_new_output_with_path(ctx, path ? path : "out.txt", 0); + wri->out = out; switch (wri->format) { @@ -627,10 +627,24 @@ fz_new_text_writer(fz_context *ctx, const char *format, const char *path, const } fz_catch(ctx) { - fz_drop_output(ctx, wri->out); fz_free(ctx, wri); fz_rethrow(ctx); } return (fz_document_writer*)wri; } + +fz_document_writer * +fz_new_text_writer(fz_context *ctx, const char *format, const char *path, const char *options) +{ + fz_output *out = fz_new_output_with_path(ctx, path ? path : "out.txt", 0); + fz_document_writer *wri = NULL; + fz_try(ctx) + wri = fz_new_text_writer_with_output(ctx, format, out, options); + fz_catch(ctx) + { + fz_drop_output(ctx, out); + fz_rethrow(ctx); + } + return wri; +} diff --git a/source/fitz/writer.c b/source/fitz/writer.c index b6476a5..5881008 100644 --- a/source/fitz/writer.c +++ b/source/fitz/writer.c @@ -199,6 +199,41 @@ fz_new_document_writer(fz_context *ctx, const char *path, const char *format, co } /* + * Like fz_new_document_writer but takes a fz_output for writing the result. + * Only works for multi-page formats. + */ +fz_document_writer * +fz_new_document_writer_with_output(fz_context *ctx, fz_output *out, const char *format, const char *options) +{ + if (!fz_strcasecmp(format, "cbz")) + return fz_new_cbz_writer_with_output(ctx, out, options); +#if FZ_ENABLE_PDF + if (!fz_strcasecmp(format, "pdf")) + return fz_new_pdf_writer_with_output(ctx, out, options); +#endif + + if (!fz_strcasecmp(format, "pcl")) + return fz_new_pcl_writer_with_output(ctx, out, options); + if (!fz_strcasecmp(format, "pclm")) + return fz_new_pclm_writer_with_output(ctx, out, options); + if (!fz_strcasecmp(format, "ps")) + return fz_new_ps_writer_with_output(ctx, out, options); + if (!fz_strcasecmp(format, "pwg")) + return fz_new_pwg_writer_with_output(ctx, out, options); + + if (!fz_strcasecmp(format, "txt") || !fz_strcasecmp(format, "text")) + return fz_new_text_writer_with_output(ctx, "text", out, options); + if (!fz_strcasecmp(format, "html")) + return fz_new_text_writer_with_output(ctx, format, out, options); + if (!fz_strcasecmp(format, "xhtml")) + return fz_new_text_writer_with_output(ctx, format, out, options); + if (!fz_strcasecmp(format, "stext")) + return fz_new_text_writer_with_output(ctx, format, out, options); + + fz_throw(ctx, FZ_ERROR_GENERIC, "unknown output document format: %s", format); +} + +/* Called to end the process of writing pages to a document. diff --git a/source/fitz/zip.c b/source/fitz/zip.c index c7625a2..3c7244e 100644 --- a/source/fitz/zip.c +++ b/source/fitz/zip.c @@ -102,20 +102,34 @@ fz_drop_zip_writer(fz_context *ctx, fz_zip_writer *zip) } fz_zip_writer * -fz_new_zip_writer(fz_context *ctx, const char *filename) +fz_new_zip_writer_with_output(fz_context *ctx, fz_output *out) { fz_zip_writer *zip = fz_malloc_struct(ctx, fz_zip_writer); fz_try(ctx) { - zip->output = fz_new_output_with_path(ctx, filename, 0); + zip->output = out; zip->central = fz_new_buffer(ctx, 0); } fz_catch(ctx) { - fz_drop_output(ctx, zip->output); fz_drop_buffer(ctx, zip->central); fz_free(ctx, zip); fz_rethrow(ctx); } return zip; } + +fz_zip_writer * +fz_new_zip_writer(fz_context *ctx, const char *filename) +{ + fz_output *out = fz_new_output_with_path(ctx, filename, 0); + fz_zip_writer *zip = NULL; + fz_try(ctx) + zip = fz_new_zip_writer_with_output(ctx, out); + fz_catch(ctx) + { + fz_drop_output(ctx, out); + fz_rethrow(ctx); + } + return zip; +} diff --git a/source/pdf/pdf-write.c b/source/pdf/pdf-write.c index af8ac65..129b00f 100644 --- a/source/pdf/pdf-write.c +++ b/source/pdf/pdf-write.c @@ -3553,7 +3553,7 @@ struct pdf_writer_s fz_document_writer super; pdf_document *pdf; pdf_write_options opts; - char *filename; + fz_output *out; fz_rect mediabox; pdf_obj *resources; @@ -3599,7 +3599,8 @@ static void pdf_writer_close_writer(fz_context *ctx, fz_document_writer *wri_) { pdf_writer *wri = (pdf_writer*)wri_; - pdf_save_document(ctx, wri->pdf, wri->filename, &wri->opts); + pdf_write_document(ctx, wri->pdf, wri->out, &wri->opts); + fz_close_output(ctx, wri->out); } static void @@ -3609,27 +3610,41 @@ pdf_writer_drop_writer(fz_context *ctx, fz_document_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_drop_output(ctx, wri->out); } fz_document_writer * -fz_new_pdf_writer(fz_context *ctx, const char *path, const char *options) +fz_new_pdf_writer_with_output(fz_context *ctx, fz_output *out, const char *options) { pdf_writer *wri = fz_new_derived_document_writer(ctx, pdf_writer, pdf_writer_begin_page, pdf_writer_end_page, pdf_writer_close_writer, pdf_writer_drop_writer); fz_try(ctx) { pdf_parse_write_options(ctx, &wri->opts, options); - wri->filename = fz_strdup(ctx, path ? path : "out.pdf"); + wri->out = out; wri->pdf = pdf_create_document(ctx); } fz_catch(ctx) { pdf_drop_document(ctx, wri->pdf); - fz_free(ctx, wri->filename); fz_free(ctx, wri); fz_rethrow(ctx); } return (fz_document_writer*)wri; } + +fz_document_writer * +fz_new_pdf_writer(fz_context *ctx, const char *path, const char *options) +{ + fz_output *out = fz_new_output_with_path(ctx, path ? path : "out.pdf", 0); + fz_document_writer *wri = NULL; + fz_try(ctx) + wri = fz_new_pdf_writer_with_output(ctx, out, options); + fz_catch(ctx) + { + fz_drop_output(ctx, out); + fz_rethrow(ctx); + } + return wri; +} http://git.ghostscript.com/?p=mupdf.git;a=commit;h=76c3d089a9b3a5ffb05a064f8992eb6d662d4d44 -- MuPDF library Artifex Software, Inc.