summaryrefslogtreecommitdiff
path: root/source/fitz/bitmap.c
diff options
context:
space:
mode:
Diffstat (limited to 'source/fitz/bitmap.c')
-rw-r--r--source/fitz/bitmap.c94
1 files changed, 62 insertions, 32 deletions
diff --git a/source/fitz/bitmap.c b/source/fitz/bitmap.c
index dc2645ec..46cfa533 100644
--- a/source/fitz/bitmap.c
+++ b/source/fitz/bitmap.c
@@ -303,72 +303,81 @@ fz_clear_bitmap(fz_context *ctx, fz_bitmap *bit)
memset(bit->samples, 0, bit->stride * bit->h);
}
-void
-fz_write_pbm_header(fz_context *ctx, fz_output *out, int w, int h)
+static void
+pbm_write_header(fz_context *ctx, fz_band_writer *writer)
{
+ fz_output *out = writer->out;
+ int w = writer->w;
+ int h = writer->h;
+
fz_printf(ctx, out, "P4\n%d %d\n", w, h);
}
-void
-fz_write_pkm_header(fz_context *ctx, fz_output *out, int w, int h)
+static void
+pkm_write_header(fz_context *ctx, fz_band_writer *writer)
{
+ fz_output *out = writer->out;
+ int w = writer->w;
+ int h = writer->h;
+
fz_printf(ctx, out, "P7\nWIDTH %d\nHEIGHT %d\nDEPTH 4\nMAXVAL 255\nTUPLTYPE CMYK\nENDHDR\n", w, h);
}
void
fz_write_bitmap_as_pbm(fz_context *ctx, fz_output *out, fz_bitmap *bitmap)
{
- fz_write_pbm_header(ctx, out, bitmap->w, bitmap->h);
+ fz_band_writer *writer = fz_new_pbm_band_writer(ctx, out);
- fz_write_pbm_band(ctx, out, bitmap);
+ 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_drop_band_writer(ctx, writer);
}
void
fz_write_bitmap_as_pkm(fz_context *ctx, fz_output *out, fz_bitmap *bitmap)
{
- fz_write_pkm_header(ctx, out, bitmap->w, bitmap->h);
+ fz_band_writer *writer = fz_new_pkm_band_writer(ctx, out);
- fz_write_pkm_band(ctx, out, bitmap);
+ 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_drop_band_writer(ctx, writer);
}
-void
-fz_write_pbm_band(fz_context *ctx, fz_output *out, fz_bitmap *bitmap)
+static void
+pbm_write_band(fz_context *ctx, fz_band_writer *writer, int stride, int band_start, int bandheight, const unsigned char *p)
{
- unsigned char *p;
- int h, bytestride;
+ fz_output *out = writer->out;
+ int w = writer->w;
+ int h = writer->h;
+ int n = writer->n;
+ int bytestride;
- if (bitmap->n != 1)
+ if (n != 1)
fz_throw(ctx, FZ_ERROR_GENERIC, "too many color components in bitmap");
- if (!out)
- return;
-
- p = bitmap->samples;
- h = bitmap->h;
- bytestride = (bitmap->w + 7) >> 3;
+ bytestride = (w + 7) >> 3;
while (h--)
{
fz_write(ctx, out, p, bytestride);
- p += bitmap->stride;
+ p += stride;
}
}
-void
-fz_write_pkm_band(fz_context *ctx, fz_output *out, fz_bitmap *bitmap)
+static void
+pkm_write_band(fz_context *ctx, fz_band_writer *writer, int stride, int band_start, int bandheight, const unsigned char *p)
{
- unsigned char *p;
- int w, h, bytestride;
+ fz_output *out = writer->out;
+ int w = writer->w;
+ int h = writer->h;
+ int n = writer->n;
+ int bytestride;
- if (bitmap->n != 4)
+ if (n != 4)
fz_throw(ctx, FZ_ERROR_GENERIC, "wrong number of color components in bitmap");
- if (!out)
- return;
-
- p = bitmap->samples;
- h = bitmap->h;
- w = bitmap->w;
- bytestride = bitmap->stride - (w>>1);
+ bytestride = stride - (w>>1);
while (h--)
{
int ww = w-1;
@@ -383,6 +392,27 @@ fz_write_pkm_band(fz_context *ctx, fz_output *out, fz_bitmap *bitmap)
}
}
+fz_band_writer *fz_new_pbm_band_writer(fz_context *ctx, fz_output *out)
+{
+ fz_band_writer *writer = fz_new_band_writer(ctx, fz_band_writer, out);
+
+ writer->header = pbm_write_header;
+ writer->band = pbm_write_band;
+
+ return writer;
+}
+
+
+fz_band_writer *fz_new_pkm_band_writer(fz_context *ctx, fz_output *out)
+{
+ fz_band_writer *writer = fz_new_band_writer(ctx, fz_band_writer, out);
+
+ writer->header = pkm_write_header;
+ writer->band = pkm_write_band;
+
+ return writer;
+}
+
void
fz_save_bitmap_as_pbm(fz_context *ctx, fz_bitmap *bitmap, char *filename)
{