summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/mupdf/fitz/output.h37
-rw-r--r--source/fitz/bitmap.c10
-rw-r--r--source/fitz/output-pcl.c8
-rw-r--r--source/fitz/output-png.c10
-rw-r--r--source/fitz/output-pnm.c20
-rw-r--r--source/fitz/output-ps.c5
-rw-r--r--source/fitz/output.c25
-rw-r--r--source/tools/mudraw.c11
-rw-r--r--source/tools/muraster.c2
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);