summaryrefslogtreecommitdiff
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
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?
-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);