diff options
Diffstat (limited to 'source/fitz/output-pwg.c')
-rw-r--r-- | source/fitz/output-pwg.c | 100 |
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; +} |