summaryrefslogtreecommitdiff
path: root/source/fitz/output-cbz.c
diff options
context:
space:
mode:
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;
+}