diff options
-rw-r--r-- | include/mupdf/fitz/output.h | 37 | ||||
-rw-r--r-- | source/fitz/bitmap.c | 10 | ||||
-rw-r--r-- | source/fitz/output-pcl.c | 8 | ||||
-rw-r--r-- | source/fitz/output-png.c | 10 | ||||
-rw-r--r-- | source/fitz/output-pnm.c | 20 | ||||
-rw-r--r-- | source/fitz/output-ps.c | 5 | ||||
-rw-r--r-- | source/fitz/output.c | 25 | ||||
-rw-r--r-- | source/tools/mudraw.c | 11 | ||||
-rw-r--r-- | source/tools/muraster.c | 2 |
9 files changed, 75 insertions, 53 deletions
diff --git a/include/mupdf/fitz/output.h b/include/mupdf/fitz/output.h index aae56528..ed4d47fa 100644 --- a/include/mupdf/fitz/output.h +++ b/include/mupdf/fitz/output.h @@ -339,13 +339,46 @@ struct fz_band_writer_s int xres; int yres; int pagenum; + int line; }; fz_band_writer *fz_new_band_writer_of_size(fz_context *ctx, size_t size, fz_output *out); #define fz_new_band_writer(C,M,O) ((M *)Memento_label(fz_new_band_writer_of_size(ctx, sizeof(M), O), #M)) + +/* + fz_write_header: Cause a band writer to write the header for + a banded image with the given properties/dimensions etc. This + also configures the bandwriter for the format of the data to be + passed in future calls. + + w, h: Width and Height of the entire page. + + n: Number of components (including alphas). + + alpha: Number of alpha components. + + xres, yres: X and Y resolutions in dpi. + + pagenum: Page number + + Throws exception if incompatible data format. +*/ void fz_write_header(fz_context *ctx, fz_band_writer *writer, int w, int h, int n, int alpha, int xres, int yres, int pagenum); -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_trailer(fz_context *ctx, fz_band_writer *writer); + +/* + fz_write_band: Cause a band writer to write the next band + of data for an image. + + stride: The byte offset from the first byte of the data + for a pixel to the first byte of the data for the same pixel + on the row below. + + band_height: The number of lines in this band. + + samples: Pointer to first byte of the data. +*/ +void fz_write_band(fz_context *ctx, fz_band_writer *writer, int stride, int band_height, const unsigned char *samples); + void fz_drop_band_writer(fz_context *ctx, fz_band_writer *writer); #endif 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); |