summaryrefslogtreecommitdiff
path: root/source/fitz/output-cbz.c
diff options
context:
space:
mode:
authorTor Andersson <tor.andersson@artifex.com>2017-03-22 14:38:35 +0100
committerRobin Watts <Robin.Watts@artifex.com>2017-03-23 17:09:19 -0400
commit031c7035652d3c967321c9c308dea7cfb1c0e6fa (patch)
tree58e1d638c18e935e7c98f0ec13034376582fc721 /source/fitz/output-cbz.c
parent185d530d3b3a6f8be63dd7cfc3f2b7784066707c (diff)
downloadmupdf-031c7035652d3c967321c9c308dea7cfb1c0e6fa.tar.xz
Add generic pixmap document writer.
Allow mutool convert to output all image formats we can write. Add sanity checks for pbm and pkm writers.
Diffstat (limited to 'source/fitz/output-cbz.c')
-rw-r--r--source/fitz/output-cbz.c79
1 files changed, 79 insertions, 0 deletions
diff --git a/source/fitz/output-cbz.c b/source/fitz/output-cbz.c
index 43be16cb..7268a805 100644
--- a/source/fitz/output-cbz.c
+++ b/source/fitz/output-cbz.c
@@ -87,3 +87,82 @@ fz_new_cbz_writer(fz_context *ctx, const char *path, const char *options)
return (fz_document_writer*)wri;
}
+
+/* generic image file output writer */
+
+typedef struct fz_pixmap_writer_s fz_pixmap_writer;
+
+struct fz_pixmap_writer_s
+{
+ fz_document_writer super;
+ fz_draw_options options;
+ fz_pixmap *pixmap;
+ void (*save)(fz_context *ctx, fz_pixmap *pix, const char *filename);
+ int count;
+ char *path;
+};
+
+static fz_device *
+pixmap_begin_page(fz_context *ctx, fz_document_writer *wri_, const fz_rect *mediabox)
+{
+ fz_pixmap_writer *wri = (fz_pixmap_writer*)wri_;
+ return fz_new_draw_device_with_options(ctx, &wri->options, mediabox, &wri->pixmap);
+}
+
+static void
+pixmap_end_page(fz_context *ctx, fz_document_writer *wri_, fz_device *dev)
+{
+ fz_pixmap_writer *wri = (fz_pixmap_writer*)wri_;
+ char path[PATH_MAX];
+
+ fz_close_device(ctx, dev);
+ fz_drop_device(ctx, dev);
+
+ wri->count += 1;
+
+ fz_format_output_path(ctx, path, sizeof path, wri->path, wri->count);
+ wri->save(ctx, wri->pixmap, path);
+ fz_drop_pixmap(ctx, wri->pixmap);
+ wri->pixmap = NULL;
+}
+
+static void
+pixmap_drop_writer(fz_context *ctx, fz_document_writer *wri_)
+{
+ fz_pixmap_writer *wri = (fz_pixmap_writer*)wri_;
+ fz_drop_pixmap(ctx, wri->pixmap);
+ fz_free(ctx, wri->path);
+}
+
+fz_document_writer *
+fz_new_pixmap_writer(fz_context *ctx, const char *path, const char *options,
+ const char *default_path, int n,
+ void (*save)(fz_context *ctx, fz_pixmap *pix, const char *filename))
+{
+ fz_pixmap_writer *wri;
+
+ wri = fz_malloc_struct(ctx, fz_pixmap_writer);
+ wri->super.begin_page = pixmap_begin_page;
+ wri->super.end_page = pixmap_end_page;
+ wri->super.drop_writer = pixmap_drop_writer;
+
+ fz_try(ctx)
+ {
+ fz_parse_draw_options(ctx, &wri->options, options);
+ wri->path = fz_strdup(ctx, path ? path : default_path);
+ wri->save = save;
+ switch (n)
+ {
+ case 1: wri->options.colorspace = fz_device_gray(ctx); break;
+ case 3: wri->options.colorspace = fz_device_rgb(ctx); break;
+ case 4: wri->options.colorspace = fz_device_cmyk(ctx); break;
+ }
+ }
+ fz_catch(ctx)
+ {
+ fz_free(ctx, wri);
+ fz_rethrow(ctx);
+ }
+
+ return (fz_document_writer*)wri;
+}