From 49b6c0f132ec4624e50cd79660143624dd1fcd35 Mon Sep 17 00:00:00 2001 From: Robin Watts Date: Thu, 9 Mar 2017 12:41:57 -0600 Subject: Simplify fz_band_writer API. Remove needless parameter passing in fz_band_writer API. We always know the bandstart, so why make the caller keep track of it and pass it in? Similarly, we know when we hit the end of the page, so why require us to trigger the trailer writing manually? --- source/fitz/bitmap.c | 10 ++++------ source/fitz/output-pcl.c | 8 +++----- source/fitz/output-png.c | 10 ++++------ source/fitz/output-pnm.c | 20 ++++++++------------ source/fitz/output-ps.c | 5 ++--- source/fitz/output.c | 25 ++++++++++++++++--------- source/tools/mudraw.c | 11 ++--------- source/tools/muraster.c | 2 +- 8 files changed, 40 insertions(+), 51 deletions(-) (limited to 'source') diff --git a/source/fitz/bitmap.c b/source/fitz/bitmap.c index 7003a894..2a7a9142 100644 --- a/source/fitz/bitmap.c +++ b/source/fitz/bitmap.c @@ -328,9 +328,8 @@ fz_write_bitmap_as_pbm(fz_context *ctx, fz_output *out, fz_bitmap *bitmap) { fz_band_writer *writer = fz_new_pbm_band_writer(ctx, out); - fz_write_header(ctx, writer, bitmap->w, bitmap->h, 1, 0, 0, 0, 1); - fz_write_band(ctx, writer, bitmap->stride, 0, bitmap->h, bitmap->samples); - fz_write_trailer(ctx, writer); + fz_write_header(ctx, writer, bitmap->w, bitmap->h, 1, 0, 0, 0, 0); + fz_write_band(ctx, writer, bitmap->stride, bitmap->h, bitmap->samples); fz_drop_band_writer(ctx, writer); } @@ -339,9 +338,8 @@ fz_write_bitmap_as_pkm(fz_context *ctx, fz_output *out, fz_bitmap *bitmap) { fz_band_writer *writer = fz_new_pkm_band_writer(ctx, out); - fz_write_header(ctx, writer, bitmap->w, bitmap->h, 1, 0, 0, 0, 1); - fz_write_band(ctx, writer, bitmap->stride, 0, bitmap->h, bitmap->samples); - fz_write_trailer(ctx, writer); + fz_write_header(ctx, writer, bitmap->w, bitmap->h, 1, 0, 0, 0, 0); + fz_write_band(ctx, writer, bitmap->stride, bitmap->h, bitmap->samples); fz_drop_band_writer(ctx, writer); } diff --git a/source/fitz/output-pcl.c b/source/fitz/output-pcl.c index 1040ddd3..4bc36fd8 100644 --- a/source/fitz/output-pcl.c +++ b/source/fitz/output-pcl.c @@ -688,9 +688,8 @@ fz_write_pixmap_as_pcl(fz_context *ctx, fz_output *out, const fz_pixmap *pixmap, writer = fz_new_color_pcl_band_writer(ctx, out, pcl); fz_try(ctx) { - fz_write_header(ctx, writer, pixmap->w, pixmap->h, pixmap->n, pixmap->alpha, pixmap->xres, pixmap->yres, 1); - fz_write_band(ctx, writer, pixmap->stride, 0, 0, pixmap->samples); - fz_write_trailer(ctx, writer); + fz_write_header(ctx, writer, pixmap->w, pixmap->h, pixmap->n, pixmap->alpha, pixmap->xres, pixmap->yres, 0); + fz_write_band(ctx, writer, pixmap->stride, pixmap->h, pixmap->samples); } fz_always(ctx) fz_drop_band_writer(ctx, writer); @@ -1080,8 +1079,7 @@ fz_write_bitmap_as_pcl(fz_context *ctx, fz_output *out, const fz_bitmap *bitmap, fz_try(ctx) { fz_write_header(ctx, writer, bitmap->w, bitmap->h, 1, 0, bitmap->xres, bitmap->yres, 0); - fz_write_band(ctx, writer, bitmap->stride, 0, bitmap->h, bitmap->samples); - fz_write_trailer(ctx, writer); + fz_write_band(ctx, writer, bitmap->stride, bitmap->h, bitmap->samples); } fz_always(ctx) fz_drop_band_writer(ctx, writer); diff --git a/source/fitz/output-png.c b/source/fitz/output-png.c index 524e48bf..62be417b 100644 --- a/source/fitz/output-png.c +++ b/source/fitz/output-png.c @@ -33,9 +33,8 @@ fz_save_pixmap_as_png(fz_context *ctx, fz_pixmap *pixmap, const char *filename) fz_try(ctx) { writer = fz_new_png_band_writer(ctx, out); - fz_write_header(ctx, writer, pixmap->w, pixmap->h, pixmap->n, pixmap->alpha, pixmap->xres, pixmap->yres, 1); - fz_write_band(ctx, writer, pixmap->stride, 0, pixmap->h, pixmap->samples); - fz_write_trailer(ctx, writer); + fz_write_header(ctx, writer, pixmap->w, pixmap->h, pixmap->n, pixmap->alpha, pixmap->xres, pixmap->yres, 0); + fz_write_band(ctx, writer, pixmap->stride, pixmap->h, pixmap->samples); } fz_always(ctx) { @@ -60,9 +59,8 @@ fz_write_pixmap_as_png(fz_context *ctx, fz_output *out, const fz_pixmap *pixmap) fz_try(ctx) { - fz_write_header(ctx, writer, pixmap->w, pixmap->h, pixmap->n, pixmap->alpha, pixmap->xres, pixmap->yres, 1); - fz_write_band(ctx, writer, pixmap->stride, 0, pixmap->h, pixmap->samples); - fz_write_trailer(ctx, writer); + fz_write_header(ctx, writer, pixmap->w, pixmap->h, pixmap->n, pixmap->alpha, pixmap->xres, pixmap->yres, 0); + fz_write_band(ctx, writer, pixmap->stride, pixmap->h, pixmap->samples); } fz_always(ctx) { diff --git a/source/fitz/output-pnm.c b/source/fitz/output-pnm.c index 68f25bcb..299c9e47 100644 --- a/source/fitz/output-pnm.c +++ b/source/fitz/output-pnm.c @@ -123,9 +123,8 @@ void fz_write_pixmap_as_pnm(fz_context *ctx, fz_output *out, fz_pixmap *pixmap) { fz_band_writer *writer = fz_new_pnm_band_writer(ctx, out); - fz_write_header(ctx, writer, pixmap->w, pixmap->h, pixmap->n, pixmap->alpha, 0, 0, 1); - fz_write_band(ctx, writer, pixmap->stride, 0, pixmap->h, pixmap->samples); - fz_write_trailer(ctx, writer); + fz_write_header(ctx, writer, pixmap->w, pixmap->h, pixmap->n, pixmap->alpha, 0, 0, 0); + fz_write_band(ctx, writer, pixmap->stride, pixmap->h, pixmap->samples); fz_drop_band_writer(ctx, writer); } @@ -140,9 +139,8 @@ fz_save_pixmap_as_pnm(fz_context *ctx, fz_pixmap *pixmap, char *filename) fz_try(ctx) { writer = fz_new_pnm_band_writer(ctx, out); - fz_write_header(ctx, writer, pixmap->w, pixmap->h, pixmap->n, pixmap->alpha, 0, 0, 1); - fz_write_band(ctx, writer, pixmap->stride, 0, pixmap->h, pixmap->samples); - fz_write_trailer(ctx, writer); + fz_write_header(ctx, writer, pixmap->w, pixmap->h, pixmap->n, pixmap->alpha, 0, 0, 0); + fz_write_band(ctx, writer, pixmap->stride, pixmap->h, pixmap->samples); } fz_always(ctx) { @@ -222,9 +220,8 @@ void fz_write_pixmap_as_pam(fz_context *ctx, fz_output *out, fz_pixmap *pixmap) { fz_band_writer *writer = fz_new_pam_band_writer(ctx, out); - fz_write_header(ctx, writer, pixmap->w, pixmap->h, pixmap->n, pixmap->alpha, 0, 0, 1); - fz_write_band(ctx, writer, pixmap->stride, 0, pixmap->h, pixmap->samples); - fz_write_trailer(ctx, writer); + fz_write_header(ctx, writer, pixmap->w, pixmap->h, pixmap->n, pixmap->alpha, 0, 0, 0); + fz_write_band(ctx, writer, pixmap->stride, pixmap->h, pixmap->samples); fz_drop_band_writer(ctx, writer); } @@ -239,9 +236,8 @@ fz_save_pixmap_as_pam(fz_context *ctx, fz_pixmap *pixmap, char *filename) fz_try(ctx) { writer = fz_new_pam_band_writer(ctx, out); - fz_write_header(ctx, writer, pixmap->w, pixmap->h, pixmap->n, pixmap->alpha, 0, 0, 1); - fz_write_band(ctx, writer, pixmap->stride, 0, pixmap->h, pixmap->samples); - fz_write_trailer(ctx, writer); + fz_write_header(ctx, writer, pixmap->w, pixmap->h, pixmap->n, pixmap->alpha, 0, 0, 0); + fz_write_band(ctx, writer, pixmap->stride, pixmap->h, pixmap->samples); } fz_always(ctx) { diff --git a/source/fitz/output-ps.c b/source/fitz/output-ps.c index b5338955..daf0804c 100644 --- a/source/fitz/output-ps.c +++ b/source/fitz/output-ps.c @@ -147,9 +147,8 @@ void fz_write_pixmap_as_ps(fz_context *ctx, fz_output *out, const fz_pixmap *pix fz_try(ctx) { - fz_write_header(ctx, writer, pixmap->w, pixmap->h, pixmap->n, pixmap->alpha, pixmap->xres, pixmap->yres, 1); - fz_write_band(ctx, writer, pixmap->stride, 0, pixmap->h, pixmap->samples); - fz_write_trailer(ctx, writer); + fz_write_header(ctx, writer, pixmap->w, pixmap->h, pixmap->n, pixmap->alpha, pixmap->xres, pixmap->yres, 0); + fz_write_band(ctx, writer, pixmap->stride, pixmap->h, pixmap->samples); } fz_always(ctx) { diff --git a/source/fitz/output.c b/source/fitz/output.c index 27495b34..7ca6fa4e 100644 --- a/source/fitz/output.c +++ b/source/fitz/output.c @@ -342,21 +342,28 @@ void fz_write_header(fz_context *ctx, fz_band_writer *writer, int w, int h, int writer->xres = xres; writer->yres = yres; writer->pagenum = pagenum; + writer->line = 0; writer->header(ctx, writer); } -void fz_write_band(fz_context *ctx, fz_band_writer *writer, int stride, int band_start, int band_height, const unsigned char *samples) +void fz_write_band(fz_context *ctx, fz_band_writer *writer, int stride, int band_height, const unsigned char *samples) { if (writer == NULL || writer->band == NULL) return; - writer->band(ctx, writer, stride, band_start, band_height, samples); -} - -void fz_write_trailer(fz_context *ctx, fz_band_writer *writer) -{ - if (writer == NULL || writer->trailer == NULL) - return; - writer->trailer(ctx, writer); + if (writer->line + band_height > writer->h) + band_height = writer->h - writer->line; + if (band_height < 0) { + fz_throw(ctx, FZ_ERROR_GENERIC, "Too much band data!"); + } + if (band_height > 0) { + writer->band(ctx, writer, stride, writer->line, band_height, samples); + writer->line += band_height; + } + if (writer->line == writer->h && writer->trailer) { + writer->trailer(ctx, writer); + /* Protect against more band_height == 0 calls */ + writer->line++; + } } void fz_drop_band_writer(fz_context *ctx, fz_band_writer *writer) diff --git a/source/tools/mudraw.c b/source/tools/mudraw.c index 3b9911c5..74d7c3e2 100644 --- a/source/tools/mudraw.c +++ b/source/tools/mudraw.c @@ -757,7 +757,7 @@ static void dodrawpage(fz_context *ctx, fz_page *page, fz_display_list *list, in bander = fz_new_color_pcl_band_writer(ctx, out, NULL); } if (bander) - fz_write_header(ctx, bander, pix->w, totalheight, pix->n, pix->alpha, pix->xres, pix->yres, ++output_pagenum); + fz_write_header(ctx, bander, pix->w, totalheight, pix->n, pix->alpha, pix->xres, pix->yres, output_pagenum++); } for (band = 0; band < bands; band++) @@ -778,7 +778,7 @@ static void dodrawpage(fz_context *ctx, fz_page *page, fz_display_list *list, in if (output) { if (bander) - fz_write_band(ctx, bander, bit ? bit->stride : pix->stride, band * band_height, drawheight, bit ? bit->samples : pix->samples); + fz_write_band(ctx, bander, bit ? bit->stride : pix->stride, drawheight, bit ? bit->samples : pix->samples); else if (output_format == OUT_PWG) fz_write_pixmap_as_pwg(ctx, out, pix, NULL); else if (output_format == OUT_TGA) @@ -811,13 +811,6 @@ static void dodrawpage(fz_context *ctx, fz_page *page, fz_display_list *list, in for (i = 0; i < 16; i++) fprintf(stderr, "%02x", digest[i]); } - - /* Any page level trailers go here */ - if (output) - { - if (bander) - fz_write_trailer(ctx, bander); - } } fz_always(ctx) { diff --git a/source/tools/muraster.c b/source/tools/muraster.c index 22227bf2..468bb212 100644 --- a/source/tools/muraster.c +++ b/source/tools/muraster.c @@ -635,7 +635,7 @@ static int dodrawpage(fz_context *ctx, int pagenum, fz_cookie *cookie, render_de { /* If we get any errors while outputting the bands, retrying won't help. */ errors_are_fatal = 1; - fz_write_band(ctx, render->bander, bit ? bit->stride : pix->stride, band_start, draw_height, bit ? bit->samples : pix->samples); + fz_write_band(ctx, render->bander, bit ? bit->stride : pix->stride, draw_height, bit ? bit->samples : pix->samples); errors_are_fatal = 0; } fz_drop_bitmap(ctx, bit); -- cgit v1.2.3