[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.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.