summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorRobin Watts <Robin.Watts@artifex.com>2017-03-09 12:41:57 -0600
committerRobin Watts <Robin.Watts@artifex.com>2017-03-11 10:16:56 -0600
commit49b6c0f132ec4624e50cd79660143624dd1fcd35 (patch)
tree9097dbd64ef08fd0fd409457107f8b92f5d91e93 /source
parent49242fd05eda83cdef704a33cc67fd542036d11f (diff)
downloadmupdf-49b6c0f132ec4624e50cd79660143624dd1fcd35.tar.xz
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?
Diffstat (limited to 'source')
-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
8 files changed, 40 insertions, 51 deletions
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);