diff options
Diffstat (limited to 'source/fitz')
-rw-r--r-- | source/fitz/draw-device.c | 4 | ||||
-rw-r--r-- | source/fitz/output-cbz.c | 2 | ||||
-rw-r--r-- | source/fitz/output-pwg.c | 100 | ||||
-rw-r--r-- | source/fitz/stext-device.c | 6 | ||||
-rw-r--r-- | source/fitz/writer.c | 3 |
5 files changed, 108 insertions, 7 deletions
diff --git a/source/fitz/draw-device.c b/source/fitz/draw-device.c index ac6752bd..ce825eca 100644 --- a/source/fitz/draw-device.c +++ b/source/fitz/draw-device.c @@ -2507,7 +2507,7 @@ fz_bound_path_accurate(fz_context *ctx, fz_irect *bbox, const fz_irect *scissor, } const char *fz_draw_options_usage = - "Common raster format output options:\n" + "Raster output options:\n" "\trotate=N: rotate rendered pages N degrees counterclockwise\n" "\tresolution=N: set both X and Y resolution in pixels per inch\n" "\tx-resolution=N: X resolution of rendered pages in pixels per inch\n" @@ -2565,7 +2565,7 @@ fz_parse_draw_options(fz_context *ctx, fz_draw_options *opts, const char *args) opts->height = fz_atoi(val); if (fz_has_option(ctx, args, "colorspace", &val)) { - if (fz_option_eq(val, "gray") || fz_option_eq(val, "grey")) + if (fz_option_eq(val, "gray") || fz_option_eq(val, "grey") || fz_option_eq(val, "mono")) opts->colorspace = fz_device_gray(ctx); else if (fz_option_eq(val, "rgb")) opts->colorspace = fz_device_rgb(ctx); diff --git a/source/fitz/output-cbz.c b/source/fitz/output-cbz.c index 55c28e77..68a71fed 100644 --- a/source/fitz/output-cbz.c +++ b/source/fitz/output-cbz.c @@ -17,8 +17,6 @@ struct fz_cbz_writer_s fz_zip_writer *zip; }; -const char *fz_cbz_write_options_usage = ""; - static fz_device * cbz_begin_page(fz_context *ctx, fz_document_writer *wri_, const fz_rect *mediabox) { 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; +} diff --git a/source/fitz/stext-device.c b/source/fitz/stext-device.c index 87009f03..d4d502b1 100644 --- a/source/fitz/stext-device.c +++ b/source/fitz/stext-device.c @@ -28,9 +28,9 @@ struct fz_stext_device_s }; const char *fz_stext_options_usage = - "Structured text output options:\n" - "\tpreserve-ligatures: do not expand all ligatures into constituent characters\n" - "\tpreserve-whitespace: do not convert all whitespace characters into spaces\n" + "Text output options:\n" + "\tpreserve-ligatures: do not expand ligatures into constituent characters\n" + "\tpreserve-whitespace: do not convert all whitespace into space characters\n" "\tpreserve-images: keep images in output\n" "\n"; diff --git a/source/fitz/writer.c b/source/fitz/writer.c index 4e436e08..f0e00256 100644 --- a/source/fitz/writer.c +++ b/source/fitz/writer.c @@ -140,6 +140,9 @@ fz_new_document_writer(fz_context *ctx, const char *path, const char *format, co if (!fz_strcasecmp(format, "pkm")) return fz_new_pkm_pixmap_writer(ctx, path, options); + if (!fz_strcasecmp(format, "pwg")) + return fz_new_pwg_writer(ctx, path, options); + if (!fz_strcasecmp(format, "txt") || !fz_strcasecmp(format, "text")) return fz_new_text_writer(ctx, "text", path, options); if (!fz_strcasecmp(format, "html")) |