aboutsummaryrefslogtreecommitdiff
path: root/lpg/libqr/qr-bitmap-pbm.c
diff options
context:
space:
mode:
Diffstat (limited to 'lpg/libqr/qr-bitmap-pbm.c')
-rw-r--r--lpg/libqr/qr-bitmap-pbm.c47
1 files changed, 47 insertions, 0 deletions
diff --git a/lpg/libqr/qr-bitmap-pbm.c b/lpg/libqr/qr-bitmap-pbm.c
new file mode 100644
index 0000000..3bcddb2
--- /dev/null
+++ b/lpg/libqr/qr-bitmap-pbm.c
@@ -0,0 +1,47 @@
+#include <limits.h>
+#include <stdio.h>
+#include "qr-bitmap.h"
+
+int qr_bitmap_write_pbm(const char * path,
+ const char * comment,
+ const struct qr_bitmap * bmp)
+{
+ FILE * out;
+ size_t count, x, y;
+
+ out = fopen(path, "w");
+ if (!out)
+ return -1;
+
+ count = 0;
+
+ count += fputs("P1\n", out);
+
+ if (comment)
+ count += fprintf(out, "# %s\n", comment);
+
+ count += fprintf(out, "%u %u\n",
+ (unsigned)bmp->width,
+ (unsigned)bmp->height);
+
+ for (y = 0; y < bmp->height; ++y) {
+ unsigned char * row = bmp->bits + y * bmp->stride;
+
+ for (x = 0; x < bmp->width; ++x) {
+ int bit = row[x / CHAR_BIT] & (1 << x % CHAR_BIT);
+
+ if (x > 0)
+ fputc(' ', out);
+ fputc(bit ? '1' : '0', out);
+ }
+ count += fputc('\n', out);
+ }
+
+ if (ferror(out))
+ count = -1;
+
+ fclose(out);
+
+ return count;
+}
+