iAdded ff2braille - ff2txt - farbfeld image to plain text visualization Err bitreich.org 70 hgit clone git://bitreich.org/ff2txt git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/ff2txt URL:git://bitreich.org/ff2txt git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/ff2txt bitreich.org 70 1Log /scm/ff2txt/log.gph bitreich.org 70 1Files /scm/ff2txt/files.gph bitreich.org 70 1Refs /scm/ff2txt/refs.gph bitreich.org 70 1Tags /scm/ff2txt/tag bitreich.org 70 1README /scm/ff2txt/file/README.gph bitreich.org 70 i--- Err bitreich.org 70 1commit dc898f91b9f862707348f36a08628a9b08f3525b /scm/ff2txt/commit/dc898f91b9f862707348f36a08628a9b08f3525b.gph bitreich.org 70 hAuthor: Josuah Demangeon URL:mailto:mail@josuah.net bitreich.org 70 iDate: Mon, 22 Jan 2018 05:41:32 +0100 Err bitreich.org 70 i Err bitreich.org 70 iAdded ff2braille Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i A .gitignore | 3 +++ Err bitreich.org 70 i A Makefile | 8 ++++++++ Err bitreich.org 70 i A ff2braille.c | 111 ++++++++++++++++++++++++++++++ Err bitreich.org 70 i Err bitreich.org 70 i3 files changed, 122 insertions(+), 0 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/.gitignore b/.gitignore /scm/ff2txt/file/.gitignore.gph bitreich.org 70 i@@ -0,0 +1,3 @@ Err bitreich.org 70 i+*.o Err bitreich.org 70 i+*.core Err bitreich.org 70 i+ff2braille Err bitreich.org 70 1diff --git a/Makefile b/Makefile /scm/ff2txt/file/Makefile.gph bitreich.org 70 i@@ -0,0 +1,8 @@ Err bitreich.org 70 i+CFLAGS = -std=c89 -pedantic -Wall -Wextra -Werror Err bitreich.org 70 i+all: ff2braille Err bitreich.org 70 i+ Err bitreich.org 70 i+ff2braille: ff2braille.o Err bitreich.org 70 i+ cc -o $@ ff2braille.o $(LDFLAGS) Err bitreich.org 70 i+ Err bitreich.org 70 i+clean: Err bitreich.org 70 i+ rm -f *.o ff2braille Err bitreich.org 70 1diff --git a/ff2braille.c b/ff2braille.c /scm/ff2txt/file/ff2braille.c.gph bitreich.org 70 i@@ -0,0 +1,111 @@ Err bitreich.org 70 i+#include Err bitreich.org 70 i+ Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+ Err bitreich.org 70 i+#include "util.h" Err bitreich.org 70 i+ Err bitreich.org 70 i+#define MAX_WIDTH (1 << 12) Err bitreich.org 70 i+#define BRAILLE_START 10240 Err bitreich.org 70 i+#define COLORS 4 Err bitreich.org 70 i+ Err bitreich.org 70 i+#define LEN(X) (sizeof(X) / sizeof(*X)) Err bitreich.org 70 i+ Err bitreich.org 70 i+struct col { Err bitreich.org 70 i+ uint16_t red; Err bitreich.org 70 i+ uint16_t green; Err bitreich.org 70 i+ uint16_t blue; Err bitreich.org 70 i+ uint16_t alpha; Err bitreich.org 70 i+}; Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+err(char *msg) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ perror(msg); Err bitreich.org 70 i+ exit(1); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+read_header(uint32_t *width, uint32_t *h) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ uint32_t header[4]; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (fread(header, sizeof(*header), LEN(header), stdin) != LEN(header)) Err bitreich.org 70 i+ err("fread"); Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (memcmp("farbfeld", header, sizeof("farbfeld") - 1)) Err bitreich.org 70 i+ err("invalid magic value\n"); Err bitreich.org 70 i+ Err bitreich.org 70 i+ *width = ntohl(header[2]); Err bitreich.org 70 i+ *h = ntohl(header[3]); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+print_utf8_3byte(long rune) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ printf("%c%c%c", Err bitreich.org 70 i+ (char)(0xe0 | (0x0f & (rune >> 12))), /* 1110xxxx */ Err bitreich.org 70 i+ (char)(0x80 | (0x3f & (rune >> 6))), /* 10xxxxxx */ Err bitreich.org 70 i+ (char)(0x80 | (0x3f & (rune)))); /* 10xxxxxx */ Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+int Err bitreich.org 70 i+is_on(struct col *rows[4], uint32_t width, uint32_t height, uint32_t w, Err bitreich.org 70 i+ uint32_t h) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ uint16_t sum; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (w >= width || h >= height) Err bitreich.org 70 i+ return 0; Err bitreich.org 70 i+ Err bitreich.org 70 i+ /* divide first to avoid overflow */ Err bitreich.org 70 i+ sum = rows[h][w].red / 4; Err bitreich.org 70 i+ sum += rows[h][w].green / 4; Err bitreich.org 70 i+ sum += rows[h][w].blue / 4; Err bitreich.org 70 i+ sum += rows[h][w].alpha / 4; Err bitreich.org 70 i+ return sum >= UINT16_MAX / 2; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+print_4_rows(struct col *rows[4], uint32_t width, uint32_t height) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ uint32_t w; Err bitreich.org 70 i+ Err bitreich.org 70 i+ for (w = 0; w < width; w += 2) Err bitreich.org 70 i+ print_utf8_3byte(BRAILLE_START + Err bitreich.org 70 i+ 1 * is_on(rows, width, height, w + 0, 0) + Err bitreich.org 70 i+ 8 * is_on(rows, width, height, w + 1, 0) + Err bitreich.org 70 i+ 2 * is_on(rows, width, height, w + 0, 1) + Err bitreich.org 70 i+ 16 * is_on(rows, width, height, w + 1, 1) + Err bitreich.org 70 i+ 4 * is_on(rows, width, height, w + 0, 2) + Err bitreich.org 70 i+ 32 * is_on(rows, width, height, w + 1, 2) + Err bitreich.org 70 i+ 64 * is_on(rows, width, height, w + 0, 3) + Err bitreich.org 70 i+ 128 * is_on(rows, width, height, w + 1, 3)); Err bitreich.org 70 i+ putchar('\n'); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+int Err bitreich.org 70 i+main(void) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ struct col buf[MAX_WIDTH * 4], *rows[4]; Err bitreich.org 70 i+ uint32_t width, height, r, i; Err bitreich.org 70 i+ Err bitreich.org 70 i+ read_header(&width, &height); Err bitreich.org 70 i+ if (width == 0 || height == 0) Err bitreich.org 70 i+ err("empty image"); Err bitreich.org 70 i+ Err bitreich.org 70 i+ for (i = 0; i < 4; i++) Err bitreich.org 70 i+ rows[i] = buf + width * i; Err bitreich.org 70 i+ Err bitreich.org 70 i+ for (; height > 0; height -= 4) { Err bitreich.org 70 i+ r = fread(buf, sizeof(*buf), width * 4, stdin); Err bitreich.org 70 i+ if (r % width != 0) Err bitreich.org 70 i+ err("invalid line width"); Err bitreich.org 70 i+ print_4_rows(rows, width, r / width); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ if (ferror(stdin)) Err bitreich.org 70 i+ err("fread stdin"); Err bitreich.org 70 i+ return 0; Err bitreich.org 70 i+} Err bitreich.org 70 .