summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Watts <robin.watts@artifex.com>2016-03-14 16:56:37 +0000
committerRobin Watts <robin.watts@artifex.com>2016-03-15 10:29:14 +0000
commita0960a7a95e879f08e69bd9face02f0e07ff7662 (patch)
treefcac2de8528dd23ef445baeffe9ae7e4782ec99f
parentd8125a13c05eef69a3fd3b6a9512dc573b23cc05 (diff)
downloadmupdf-a0960a7a95e879f08e69bd9face02f0e07ff7662.tar.xz
Mutool draw: Simplify output handling code.
At the moment we have the output file being opened in several different places, leading to several different places having to cope with the '-' handling. Simplify the code so that files are only opened in 1 place.
-rw-r--r--include/mupdf/fitz/output-tga.h1
-rw-r--r--source/fitz/pixmap.c17
-rw-r--r--source/tools/mudraw.c173
3 files changed, 101 insertions, 90 deletions
diff --git a/include/mupdf/fitz/output-tga.h b/include/mupdf/fitz/output-tga.h
index 4bd9e2ba..3eb39c7d 100644
--- a/include/mupdf/fitz/output-tga.h
+++ b/include/mupdf/fitz/output-tga.h
@@ -6,5 +6,6 @@
#include "mupdf/fitz/pixmap.h"
void fz_save_pixmap_as_tga(fz_context *ctx, fz_pixmap *pixmap, const char *filename, int savealpha);
+void fz_write_pixmap_as_tga(fz_context *ctx, fz_output *out, fz_pixmap *pixmap, int savealpha);
#endif
diff --git a/source/fitz/pixmap.c b/source/fitz/pixmap.c
index b8f1f843..37258b1a 100644
--- a/source/fitz/pixmap.c
+++ b/source/fitz/pixmap.c
@@ -1049,7 +1049,18 @@ static inline void tga_put_pixel(fz_context *ctx, fz_output *out, unsigned char
void
fz_save_pixmap_as_tga(fz_context *ctx, fz_pixmap *pixmap, const char *filename, int savealpha)
{
- fz_output *out;
+ fz_output *out = fz_new_output_with_path(ctx, filename, 0);
+ fz_try(ctx)
+ fz_write_pixmap_as_tga(ctx, out, pixmap, savealpha);
+ fz_always(ctx)
+ fz_drop_output(ctx, out);
+ fz_catch(ctx)
+ fz_rethrow(ctx);
+}
+
+void
+fz_write_pixmap_as_tga(fz_context *ctx, fz_output *out, fz_pixmap *pixmap, int savealpha)
+{
unsigned char head[18];
int n = pixmap->n;
int d = savealpha || n == 1 ? n : n - 1;
@@ -1062,8 +1073,6 @@ fz_save_pixmap_as_tga(fz_context *ctx, fz_pixmap *pixmap, const char *filename,
fz_throw(ctx, FZ_ERROR_GENERIC, "pixmap must be grayscale or rgb to write as tga");
}
- out = fz_new_output_with_path(ctx, filename, 0);
-
memset(head, 0, sizeof(head));
head[2] = n == 4 ? 10 : 11;
head[12] = pixmap->w & 0xFF; head[13] = (pixmap->w >> 8) & 0xFF;
@@ -1098,8 +1107,6 @@ fz_save_pixmap_as_tga(fz_context *ctx, fz_pixmap *pixmap, const char *filename,
}
}
fz_write(ctx, out, "\0\0\0\0\0\0\0\0TRUEVISION-XFILE.\0", 26);
-
- fz_drop_output(ctx, out);
}
unsigned int
diff --git a/source/tools/mudraw.c b/source/tools/mudraw.c
index e00a6d23..74a8724a 100644
--- a/source/tools/mudraw.c
+++ b/source/tools/mudraw.c
@@ -240,6 +240,52 @@ static int has_percent_d(char *s)
return 0;
}
+/* Output file level (as opposed to page level) headers */
+static void
+file_level_headers(fz_context *ctx)
+{
+ if (output_format == OUT_STEXT || output_format == OUT_TRACE)
+ fz_printf(ctx, out, "<?xml version=\"1.0\"?>\n");
+
+ if (output_format == OUT_TEXT || output_format == OUT_HTML || output_format == OUT_STEXT)
+ sheet = fz_new_stext_sheet(ctx);
+
+ if (output_format == OUT_HTML)
+ {
+ fz_printf(ctx, out, "<style>\n");
+ fz_printf(ctx, out, "body{background-color:gray;margin:12pt;}\n");
+ fz_printf(ctx, out, "div.page{background-color:white;margin:6pt;padding:6pt;}\n");
+ fz_printf(ctx, out, "div.block{border:1px solid gray;margin:6pt;padding:6pt;}\n");
+ fz_printf(ctx, out, "div.metaline{display:table;width:100%%}\n");
+ fz_printf(ctx, out, "div.line{display:table-row;padding:6pt}\n");
+ fz_printf(ctx, out, "div.cell{display:table-cell;padding-left:6pt;padding-right:6pt}\n");
+ fz_printf(ctx, out, "p{margin:0pt;padding:0pt;}\n");
+ fz_printf(ctx, out, "</style>\n");
+ fz_printf(ctx, out, "<body>\n");
+ }
+
+ if (output_format == OUT_STEXT || output_format == OUT_TRACE)
+ fz_printf(ctx, out, "<document name=\"%s\">\n", filename);
+}
+
+static void
+file_level_trailers(fz_context *ctx)
+{
+ if (output_format == OUT_STEXT || output_format == OUT_TRACE)
+ fz_printf(ctx, out, "</document>\n");
+
+ if (output_format == OUT_HTML)
+ {
+ fz_printf(ctx, out, "</body>\n");
+ fz_printf(ctx, out, "<style>\n");
+ fz_print_stext_sheet(ctx, out, sheet);
+ fz_printf(ctx, out, "</style>\n");
+ }
+
+ fz_drop_stext_sheet(ctx, sheet);
+}
+
+
static void drawpage(fz_context *ctx, fz_document *doc, int pagenum)
{
fz_page *page;
@@ -248,6 +294,7 @@ static void drawpage(fz_context *ctx, fz_document *doc, int pagenum)
int start;
fz_cookie cookie = { 0 };
fz_rect mediabox;
+ int first_page = !append;
fz_var(list);
fz_var(dev);
@@ -265,6 +312,24 @@ static void drawpage(fz_context *ctx, fz_document *doc, int pagenum)
fz_bound_page(ctx, page, &mediabox);
+ /* Open the output file (using stdout if it's given as '-'), being
+ * careful to append if we're not the first page. */
+ if (output && (output[0] != '-' || output[1] != 0) && *output != 0)
+ {
+ char text_buffer[512];
+
+ fz_drop_output(ctx, out);
+ fz_snprintf(text_buffer, sizeof(text_buffer), output, pagenum);
+ out = fz_new_output_with_path(ctx, text_buffer, append);
+ append = !has_percent_d(output);
+ }
+ else
+ out = fz_new_output_with_file_ptr(ctx, stdout, 0);
+
+ /* Output any file level (as opposed to page level) headers. */
+ if (first_page)
+ file_level_headers(ctx);
+
if (uselist)
{
fz_try(ctx)
@@ -470,7 +535,6 @@ static void drawpage(fz_context *ctx, fz_document *doc, int pagenum)
fz_irect ibounds;
fz_pixmap *pix = NULL;
int w, h;
- fz_output *output_file = NULL;
fz_png_output_context *poc = NULL;
fz_var(pix);
@@ -541,7 +605,6 @@ static void drawpage(fz_context *ctx, fz_document *doc, int pagenum)
int savealpha = (out_cs == CS_GRAY_ALPHA || out_cs == CS_RGB_ALPHA || out_cs == CS_CMYK_ALPHA);
fz_irect band_ibounds = ibounds;
int band, bands = 1;
- char filename_buf[512];
int totalheight = ibounds.y1 - ibounds.y0;
int drawheight = totalheight;
@@ -559,23 +622,15 @@ static void drawpage(fz_context *ctx, fz_document *doc, int pagenum)
pix = fz_new_pixmap_with_bbox(ctx, colorspace, &band_ibounds);
fz_pixmap_set_resolution(pix, resolution);
+ /* Output any page level headers (for banded formats) */
if (output)
{
- if (!strcmp(output, "-"))
- output_file = fz_new_output_with_file_ptr(ctx, stdout, 0);
- else
- {
- sprintf(filename_buf, output, pagenum);
- if (output_format != OUT_PWG && output_format != OUT_PCL)
- output_file = fz_new_output_with_path(ctx, filename_buf, 0);
- }
-
if (output_format == OUT_PGM || output_format == OUT_PPM || output_format == OUT_PNM)
- fz_write_pnm_header(ctx, output_file, pix->w, totalheight, pix->n);
+ fz_write_pnm_header(ctx, out, pix->w, totalheight, pix->n);
else if (output_format == OUT_PAM)
- fz_write_pam_header(ctx, output_file, pix->w, totalheight, pix->n, savealpha);
+ fz_write_pam_header(ctx, out, pix->w, totalheight, pix->n, savealpha);
else if (output_format == OUT_PNG)
- poc = fz_write_png_header(ctx, output_file, pix->w, totalheight, pix->n, savealpha);
+ poc = fz_write_png_header(ctx, out, pix->w, totalheight, pix->n, savealpha);
}
for (band = 0; band < bands; band++)
@@ -606,51 +661,36 @@ static void drawpage(fz_context *ctx, fz_document *doc, int pagenum)
if (output)
{
if (output_format == OUT_PGM || output_format == OUT_PPM || output_format == OUT_PNM)
- fz_write_pnm_band(ctx, output_file, pix->w, totalheight, pix->n, band, drawheight, pix->samples);
+ fz_write_pnm_band(ctx, out, pix->w, totalheight, pix->n, band, drawheight, pix->samples);
else if (output_format == OUT_PAM)
- fz_write_pam_band(ctx, output_file, pix->w, totalheight, pix->n, band, drawheight, pix->samples, savealpha);
+ fz_write_pam_band(ctx, out, pix->w, totalheight, pix->n, band, drawheight, pix->samples, savealpha);
else if (output_format == OUT_PNG)
- fz_write_png_band(ctx, output_file, pix->w, totalheight, pix->n, band, drawheight, pix->samples, savealpha, poc);
+ fz_write_png_band(ctx, out, pix->w, totalheight, pix->n, band, drawheight, pix->samples, savealpha, poc);
else if (output_format == OUT_PWG)
- {
- if (has_percent_d(output))
- append = 0;
- if (out_cs == CS_MONO)
- {
- fz_bitmap *bit = fz_new_bitmap_from_pixmap(ctx, pix, NULL);
- fz_save_bitmap_as_pwg(ctx, bit, filename_buf, append, NULL);
- fz_drop_bitmap(ctx, bit);
- }
- else
- fz_save_pixmap_as_pwg(ctx, pix, filename_buf, append, NULL);
- append = 1;
- }
+ fz_write_pixmap_as_pwg(ctx, out, pix, NULL);
else if (output_format == OUT_PCL)
{
fz_pcl_options options;
fz_pcl_preset(ctx, &options, "ljet4");
- if (has_percent_d(output))
- append = 0;
if (out_cs == CS_MONO)
{
fz_bitmap *bit = fz_new_bitmap_from_pixmap(ctx, pix, NULL);
- fz_save_bitmap_as_pcl(ctx, bit, filename_buf, append, &options);
+ fz_write_bitmap_as_pcl(ctx, out, bit, &options);
fz_drop_bitmap(ctx, bit);
}
else
- fz_save_pixmap_as_pcl(ctx, pix, filename_buf, append, &options);
- append = 1;
+ fz_write_pixmap_as_pcl(ctx, out, pix, &options);
}
else if (output_format == OUT_PBM) {
fz_bitmap *bit = fz_new_bitmap_from_pixmap(ctx, pix, NULL);
- fz_save_bitmap_as_pbm(ctx, bit, filename_buf);
+ fz_write_bitmap_as_pbm(ctx, out, bit);
fz_drop_bitmap(ctx, bit);
}
else if (output_format == OUT_TGA)
{
- fz_save_pixmap_as_tga(ctx, pix, filename_buf, savealpha);
+ fz_write_pixmap_as_tga(ctx, out, pix, savealpha);
}
}
ctm.f -= drawheight;
@@ -666,20 +706,19 @@ static void drawpage(fz_context *ctx, fz_document *doc, int pagenum)
for (i = 0; i < 16; i++)
fprintf(stderr, "%02x", digest[i]);
}
- }
- fz_always(ctx)
- {
+
+ /* Any page level trailers go here */
if (output)
{
if (output_format == OUT_PNG)
- fz_write_png_trailer(ctx, output_file, poc);
+ fz_write_png_trailer(ctx, out, poc);
}
-
+ }
+ fz_always(ctx)
+ {
fz_drop_device(ctx, dev);
dev = NULL;
fz_drop_pixmap(ctx, pix);
- if (output_file)
- fz_drop_output(ctx, output_file);
}
fz_catch(ctx)
{
@@ -692,6 +731,9 @@ static void drawpage(fz_context *ctx, fz_document *doc, int pagenum)
if (list)
fz_drop_display_list(ctx, list);
+ if (!append)
+ file_level_trailers(ctx);
+
fz_drop_page(ctx, page);
if (showtime)
@@ -1037,34 +1079,6 @@ int mudraw_main(int argc, char **argv)
timing.minfilename = "";
timing.maxfilename = "";
- if (output_format == OUT_TEXT || output_format == OUT_HTML || output_format == OUT_STEXT || output_format == OUT_TRACE)
- {
- if (output && output[0] != '-' && *output != 0)
- out = fz_new_output_with_path(ctx, output, 0);
- else
- out = fz_new_output_with_file_ptr(ctx, stdout, 0);
- }
-
- if (output_format == OUT_STEXT || output_format == OUT_TRACE)
- fz_printf(ctx, out, "<?xml version=\"1.0\"?>\n");
-
- if (output_format == OUT_TEXT || output_format == OUT_HTML || output_format == OUT_STEXT)
- sheet = fz_new_stext_sheet(ctx);
-
- if (output_format == OUT_HTML)
- {
- fz_printf(ctx, out, "<style>\n");
- fz_printf(ctx, out, "body{background-color:gray;margin:12pt;}\n");
- fz_printf(ctx, out, "div.page{background-color:white;margin:6pt;padding:6pt;}\n");
- fz_printf(ctx, out, "div.block{border:1px solid gray;margin:6pt;padding:6pt;}\n");
- fz_printf(ctx, out, "div.metaline{display:table;width:100%%}\n");
- fz_printf(ctx, out, "div.line{display:table-row;padding:6pt}\n");
- fz_printf(ctx, out, "div.cell{display:table-cell;padding-left:6pt;padding-right:6pt}\n");
- fz_printf(ctx, out, "p{margin:0pt;padding:0pt;}\n");
- fz_printf(ctx, out, "</style>\n");
- fz_printf(ctx, out, "<body>\n");
- }
-
fz_try(ctx)
{
fz_register_document_handlers(ctx);
@@ -1093,8 +1107,6 @@ int mudraw_main(int argc, char **argv)
fz_layout_document(ctx, doc, layout_w, layout_h, layout_em);
- if (output_format == OUT_STEXT || output_format == OUT_TRACE)
- fz_printf(ctx, out, "<document name=\"%s\">\n", filename);
if (output_format == OUT_GPROOF)
{
fz_save_gproof(ctx, filename, doc, output, resolution, "", "");
@@ -1107,9 +1119,6 @@ int mudraw_main(int argc, char **argv)
drawrange(ctx, doc, argv[fz_optind++]);
}
- if (output_format == OUT_STEXT || output_format == OUT_TRACE)
- fz_printf(ctx, out, "</document>\n");
-
fz_drop_document(ctx, doc);
doc = NULL;
}
@@ -1139,15 +1148,9 @@ int mudraw_main(int argc, char **argv)
pdf_drop_document(ctx, pdfout);
}
- if (output_format == OUT_HTML)
- {
- fz_printf(ctx, out, "</body>\n");
- fz_printf(ctx, out, "<style>\n");
- fz_print_stext_sheet(ctx, out, sheet);
- fz_printf(ctx, out, "</style>\n");
- }
+ if (append)
+ file_level_trailers(ctx);
- fz_drop_stext_sheet(ctx, sheet);
fz_drop_output(ctx, out);
out = NULL;