summaryrefslogtreecommitdiff
path: root/source/fitz/output-pwg.c
diff options
context:
space:
mode:
Diffstat (limited to 'source/fitz/output-pwg.c')
-rw-r--r--source/fitz/output-pwg.c100
1 files changed, 100 insertions, 0 deletions
diff --git a/source/fitz/output-pwg.c b/source/fitz/output-pwg.c
index 2cd79afe..7e2a4178 100644
--- a/source/fitz/output-pwg.c
+++ b/source/fitz/output-pwg.c
@@ -379,3 +379,103 @@ fz_band_writer *fz_new_pwg_band_writer(fz_context *ctx, fz_output *out, const fz
return &writer->super;
}
+
+/* High-level document writer interface */
+
+const char *fz_pwg_write_options_usage =
+ "PWG output options:\n"
+ "\tcolorspace=mono: render 1-bit black and white bitmap\n"
+ "\n";
+
+fz_pwg_options *
+fz_parse_pwg_options(fz_context *ctx, fz_pwg_options *opts, const char *args)
+{
+ memset(opts, 0, sizeof *opts);
+
+ return opts;
+}
+
+typedef struct fz_pwg_writer_s fz_pwg_writer;
+
+struct fz_pwg_writer_s
+{
+ fz_document_writer super;
+ fz_draw_options draw;
+ fz_pwg_options pwg;
+ int mono;
+ fz_pixmap *pixmap;
+ fz_output *out;
+};
+
+static fz_device *
+pwg_begin_page(fz_context *ctx, fz_document_writer *wri_, const fz_rect *mediabox)
+{
+ fz_pwg_writer *wri = (fz_pwg_writer*)wri_;
+ return fz_new_draw_device_with_options(ctx, &wri->draw, mediabox, &wri->pixmap);
+}
+
+static void
+pwg_end_page(fz_context *ctx, fz_document_writer *wri_, fz_device *dev)
+{
+ fz_pwg_writer *wri = (fz_pwg_writer*)wri_;
+
+ fz_close_device(ctx, dev);
+ fz_drop_device(ctx, dev);
+
+ if (wri->mono)
+ {
+ fz_bitmap *bitmap = fz_new_bitmap_from_pixmap(ctx, wri->pixmap, NULL);
+ fz_try(ctx)
+ fz_write_bitmap_as_pwg_page(ctx, wri->out, bitmap, &wri->pwg);
+ fz_always(ctx)
+ fz_drop_bitmap(ctx, bitmap);
+ fz_catch(ctx)
+ fz_rethrow(ctx);
+ }
+ else
+ {
+ fz_write_pixmap_as_pwg_page(ctx, wri->out, wri->pixmap, &wri->pwg);
+ }
+
+ fz_drop_pixmap(ctx, wri->pixmap);
+ wri->pixmap = NULL;
+}
+
+static void
+pwg_close_writer(fz_context *ctx, fz_document_writer *wri_)
+{
+}
+
+static void
+pwg_drop_writer(fz_context *ctx, fz_document_writer *wri_)
+{
+ fz_pwg_writer *wri = (fz_pwg_writer*)wri_;
+ fz_drop_pixmap(ctx, wri->pixmap);
+ fz_drop_output(ctx, wri->out);
+}
+
+fz_document_writer *
+fz_new_pwg_writer(fz_context *ctx, const char *path, 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;
+
+ fz_try(ctx)
+ {
+ fz_parse_draw_options(ctx, &wri->draw, options);
+ fz_parse_pwg_options(ctx, &wri->pwg, 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);
+ 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;
+}