iall common routines to a same util.c - 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 a1eea6f23b8947751165e1909fd387803c7a803e /scm/ff2txt/commit/a1eea6f23b8947751165e1909fd387803c7a803e.gph bitreich.org 70
1parent 2f2583b40975087c6463403508706bcc5138e833 /scm/ff2txt/commit/2f2583b40975087c6463403508706bcc5138e833.gph bitreich.org 70
hAuthor: Josuah Demangeon <mail@josuah.net> URL:mailto:mail@josuah.net bitreich.org 70
iDate: Mon, 29 Jan 2018 08:26:30 +0100 Err bitreich.org 70
i Err bitreich.org 70
iall common routines to a same util.c Err bitreich.org 70
i Err bitreich.org 70
iDiffstat: Err bitreich.org 70
i M .gitignore | 1 + Err bitreich.org 70
i M Makefile | 9 ++++++--- Err bitreich.org 70
i A ascii.txt | 49 +++++++++++++++++++++++++++++++ Err bitreich.org 70
i A ff2ascii.c | 101 +++++++++++++++++++++++++++++++ Err bitreich.org 70
i A ff2braille.1 | 29 +++++++++++++++++++++++++++++ Err bitreich.org 70
i M ff2braille.c | 98 +++++++++++++------------------ Err bitreich.org 70
i A ff2col.c | 40 +++++++++++++++++++++++++++++++ Err bitreich.org 70
i A util.c | 47 +++++++++++++++++++++++++++++++ Err bitreich.org 70
i A util.h | 16 ++++++++++++++++ Err bitreich.org 70
i Err bitreich.org 70
i9 files changed, 330 insertions(+), 60 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@@ -1,3 +1,4 @@ Err bitreich.org 70
i *.o Err bitreich.org 70
i *.core Err bitreich.org 70
i ff2braille Err bitreich.org 70
i+ff2col Err bitreich.org 70
1diff --git a/Makefile b/Makefile /scm/ff2txt/file/Makefile.gph bitreich.org 70
i@@ -1,8 +1,11 @@ Err bitreich.org 70
i CFLAGS = -std=c89 -pedantic -Wall -Wextra -Werror Err bitreich.org 70
i-all: ff2braille Err bitreich.org 70
i+all: ff2braille ff2col 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+ff2braille: ff2braille.o util.o util.h Err bitreich.org 70
i+ cc -o $@ ff2braille.o util.o $(LDFLAGS) Err bitreich.org 70
i+ Err bitreich.org 70
i+ff2col: ff2col.o util.o util.h Err bitreich.org 70
i+ cc -o $@ ff2col.o util.o $(LDFLAGS) Err bitreich.org 70
i Err bitreich.org 70
i install: Err bitreich.org 70
i mkdir -p ${PREFIX}/bin Err bitreich.org 70
1diff --git a/ascii.txt b/ascii.txt /scm/ff2txt/file/ascii.txt.gph bitreich.org 70
i@@ -0,0 +1,49 @@ Err bitreich.org 70
i+ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', Err bitreich.org 70
i+ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', Err bitreich.org 70
i+ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', Err bitreich.org 70
i+ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', Err bitreich.org 70
i+ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', Err bitreich.org 70
i+ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', Err bitreich.org 70
i+ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', Err bitreich.org 70
i+ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', Err bitreich.org 70
i+ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', Err bitreich.org 70
i+ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', Err bitreich.org 70
i+ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', Err bitreich.org 70
i+ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', Err bitreich.org 70
i+ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', Err bitreich.org 70
i+ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', Err bitreich.org 70
i+ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', Err bitreich.org 70
i+ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', Err bitreich.org 70
i+ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', Err bitreich.org 70
i+ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', Err bitreich.org 70
i+ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', Err bitreich.org 70
i+ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', Err bitreich.org 70
i+ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', Err bitreich.org 70
i+ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', Err bitreich.org 70
i+ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', Err bitreich.org 70
i+ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', Err bitreich.org 70
i+ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', Err bitreich.org 70
i+ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', Err bitreich.org 70
i+ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', Err bitreich.org 70
i+ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', Err bitreich.org 70
i+ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', Err bitreich.org 70
i+ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', Err bitreich.org 70
i+ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', Err bitreich.org 70
i+ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', Err bitreich.org 70
i+ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', Err bitreich.org 70
i+ Err bitreich.org 70
i+ Err bitreich.org 70
i+ Err bitreich.org 70
i+! # $ % & ( ) / 0 1 2 3 4 5 6 7 8 9 : ; < > ? Err bitreich.org 70
i+ Err bitreich.org 70
i+@ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] Err bitreich.org 70
i+ Err bitreich.org 70
i+{ | } Err bitreich.org 70
i+ Err bitreich.org 70
i+` ^ ~ " ' Err bitreich.org 70
i+* + - = Err bitreich.org 70
i+b d f l k t Err bitreich.org 70
i+a c e h i m n o r s u v w x z Err bitreich.org 70
i+g j p q y Err bitreich.org 70
i+,. Err bitreich.org 70
i+_ Err bitreich.org 70
1diff --git a/ff2ascii.c b/ff2ascii.c /scm/ff2txt/file/ff2ascii.c.gph bitreich.org 70
i@@ -0,0 +1,101 @@ Err bitreich.org 70
i+/* Err bitreich.org 70
i+ * Transforming an image into a braille character text is transforming a Err bitreich.org 70
i+ * matrice this way: Err bitreich.org 70
i+ * Err bitreich.org 70
i+ * farbfeld image braille characters Err bitreich.org 70
i+ * Err bitreich.org 70
i+ * [[a0 a1 a2 a3 a4 a5] [[[a0 a1 [a2 a3 [a4 a5 \ Err bitreich.org 70
i+ * [b0 b1 b2 b3 b4 b5] b0 b1 / b2 b3 / b4 b5 |<- One braille Err bitreich.org 70
i+ * [c0 c1 c2 c3 c4 c5] c0 c1 / c2 c3 / c4 c5 | character Err bitreich.org 70
i+ * [d0 d1 d2 d3 d4 d5] => d0 d1] d2 d3] d4 d5]] / Err bitreich.org 70
i+ * [e0 e1 e2 e3 e4 e5] [[e0 e1 [e2 e3 [e4 e5 Err bitreich.org 70
i+ * [f0 f1 f2 f3 f4 f5] f0 f1 / f2 f3 / f4 f5 Err bitreich.org 70
i+ * [g0 g1 g2 g3 g4 g5] g0 g1 / g2 g3 / g4 g5 Err bitreich.org 70
i+ * [h0 h1 h2 h3 h4 h5]] h0 h1] h2 h3] h4 h5]]] Err bitreich.org 70
i+ * Err bitreich.org 70
i+ * braille characters written as a line: Err bitreich.org 70
i+ * Err bitreich.org 70
i+ * [[[a0 a1 b0 b1 c0 c1 d0 d1] <- One braille character Err bitreich.org 70
i+ * [a2 a3 b2 b3 c2 c3 d2 d3] Err bitreich.org 70
i+ * [a4 a5 b4 b5 c4 c5 d4 d5]] <- One row of braille characters Err bitreich.org 70
i+ * [[e0 e1 f0 f1 g0 g1 h0 h1] Err bitreich.org 70
i+ * [e2 e3 f2 f3 g2 g3 h2 h3] Err bitreich.org 70
i+ * [e4 e5 f4 f5 g4 g5 h4 h5]]] <- Two row of braille characters Err bitreich.org 70
i+ * Err bitreich.org 70
i+ * Although the encoding of braille keeps 1 4 Err bitreich.org 70
i+ * the characters encoded with only six 2 5 Err bitreich.org 70
i+ * dots first, as only these are used for 3 6 Err bitreich.org 70
i+ * encoding letters: 7 8 Err bitreich.org 70
i+ */ Err bitreich.org 70
i+#include <stdio.h> Err bitreich.org 70
i+#include <string.h> Err bitreich.org 70
i+#include <stdlib.h> Err bitreich.org 70
i+#include <stdint.h> Err bitreich.org 70
i+ Err bitreich.org 70
i+#include "util.h" 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+ 0x01 * is_on(rows, width, height, w + 0, 0) + Err bitreich.org 70
i+ 0x08 * is_on(rows, width, height, w + 1, 0) + Err bitreich.org 70
i+ 0x02 * is_on(rows, width, height, w + 0, 1) + Err bitreich.org 70
i+ 0x10 * is_on(rows, width, height, w + 1, 1) + Err bitreich.org 70
i+ 0x04 * is_on(rows, width, height, w + 0, 2) + Err bitreich.org 70
i+ 0x20 * is_on(rows, width, height, w + 1, 2) + Err bitreich.org 70
i+ 0x40 * is_on(rows, width, height, w + 0, 3) + Err bitreich.org 70
i+ 0x80 * 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, h, r, i; Err bitreich.org 70
i+ Err bitreich.org 70
i+ read_header(&width, &height); 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 (h = 0; h < height; h += 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+ if (ferror(stdin)) Err bitreich.org 70
i+ err("fread stdin"); Err bitreich.org 70
i+ } Err bitreich.org 70
i+ return 0; Err bitreich.org 70
i+} Err bitreich.org 70
1diff --git a/ff2braille.1 b/ff2braille.1 /scm/ff2txt/file/ff2braille.1.gph bitreich.org 70
i@@ -0,0 +1,29 @@ Err bitreich.org 70
i+.Dt FF2BRAILLE 1 Err bitreich.org 70
i+.Dd $Mdocdate: January 22 2018$ Err bitreich.org 70
i+.Os Err bitreich.org 70
i+. Err bitreich.org 70
i+. Err bitreich.org 70
i+.Sh NAME Err bitreich.org 70
i+. Err bitreich.org 70
i+.Nm ff2braille Err bitreich.org 70
i+.Nd farbfeld to text braille pattern image conversion Err bitreich.org 70
i+. Err bitreich.org 70
i+. Err bitreich.org 70
i+.Sh SYNOPSIS Err bitreich.org 70
i+. Err bitreich.org 70
i+.Nm Err bitreich.org 70
i+. Err bitreich.org 70
i+. Err bitreich.org 70
i+.Sh DESCRIPTION Err bitreich.org 70
i+. Err bitreich.org 70
i+.Nm Err bitreich.org 70
i+reads a Err bitreich.org 70
i+.Xr farbfeld 5 Err bitreich.org 70
i+image from stdin and write a text representation of the image using braille Err bitreich.org 70
i+characters to stdout. Err bitreich.org 70
i+. Err bitreich.org 70
i+. Err bitreich.org 70
i+.Sh EXIT STATUS Err bitreich.org 70
i+. Err bitreich.org 70
i+.Ex -std Err bitreich.org 70
i+. Err bitreich.org 70
1diff --git a/ff2braille.c b/ff2braille.c /scm/ff2txt/file/ff2braille.c.gph bitreich.org 70
i@@ -1,4 +1,32 @@ Err bitreich.org 70
i-#include <arpa/inet.h> Err bitreich.org 70
i+/* Err bitreich.org 70
i+ * Transforming an image into a braille character text is transforming a Err bitreich.org 70
i+ * matrice this way: Err bitreich.org 70
i+ * Err bitreich.org 70
i+ * farbfeld image braille characters Err bitreich.org 70
i+ * Err bitreich.org 70
i+ * [[a0 a1 a2 a3 a4 a5] [[[a0 a1 [a2 a3 [a4 a5 \ Err bitreich.org 70
i+ * [b0 b1 b2 b3 b4 b5] b0 b1 / b2 b3 / b4 b5 |<- One braille Err bitreich.org 70
i+ * [c0 c1 c2 c3 c4 c5] c0 c1 / c2 c3 / c4 c5 | character Err bitreich.org 70
i+ * [d0 d1 d2 d3 d4 d5] => d0 d1] d2 d3] d4 d5]] / Err bitreich.org 70
i+ * [e0 e1 e2 e3 e4 e5] [[e0 e1 [e2 e3 [e4 e5 Err bitreich.org 70
i+ * [f0 f1 f2 f3 f4 f5] f0 f1 / f2 f3 / f4 f5 Err bitreich.org 70
i+ * [g0 g1 g2 g3 g4 g5] g0 g1 / g2 g3 / g4 g5 Err bitreich.org 70
i+ * [h0 h1 h2 h3 h4 h5]] h0 h1] h2 h3] h4 h5]]] Err bitreich.org 70
i+ * Err bitreich.org 70
i+ * braille characters written as a line: Err bitreich.org 70
i+ * Err bitreich.org 70
i+ * [[[a0 a1 b0 b1 c0 c1 d0 d1] <- One braille character Err bitreich.org 70
i+ * [a2 a3 b2 b3 c2 c3 d2 d3] Err bitreich.org 70
i+ * [a4 a5 b4 b5 c4 c5 d4 d5]] <- One row of braille characters Err bitreich.org 70
i+ * [[e0 e1 f0 f1 g0 g1 h0 h1] Err bitreich.org 70
i+ * [e2 e3 f2 f3 g2 g3 h2 h3] Err bitreich.org 70
i+ * [e4 e5 f4 f5 g4 g5 h4 h5]]] <- Two row of braille characters Err bitreich.org 70
i+ * Err bitreich.org 70
i+ * Although the encoding of braille keeps 1 4 Err bitreich.org 70
i+ * the characters encoded with only six 2 5 Err bitreich.org 70
i+ * dots first, as only these are used for 3 6 Err bitreich.org 70
i+ * encoding letters: 7 8 Err bitreich.org 70
i+ */ Err bitreich.org 70
i Err bitreich.org 70
i #include <stdio.h> Err bitreich.org 70
i #include <string.h> Err bitreich.org 70
i@@ -7,41 +35,6 @@ 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@@ -52,20 +45,13 @@ print_utf8_3byte(long rune) 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+is_on(struct col *rows[4], uint32_t width, uint32_t height, Err bitreich.org 70
i+ uint32_t w, 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+ return is_bright(rows[h][w]); Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i void Err bitreich.org 70
i@@ -75,14 +61,14 @@ print_4_rows(struct col *rows[4], uint32_t width, uint32_t height) 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+ 0x01 * is_on(rows, width, height, w + 0, 0) + Err bitreich.org 70
i+ 0x08 * is_on(rows, width, height, w + 1, 0) + Err bitreich.org 70
i+ 0x02 * is_on(rows, width, height, w + 0, 1) + Err bitreich.org 70
i+ 0x10 * is_on(rows, width, height, w + 1, 1) + Err bitreich.org 70
i+ 0x04 * is_on(rows, width, height, w + 0, 2) + Err bitreich.org 70
i+ 0x20 * is_on(rows, width, height, w + 1, 2) + Err bitreich.org 70
i+ 0x40 * is_on(rows, width, height, w + 0, 3) + Err bitreich.org 70
i+ 0x80 * 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@@ -93,8 +79,6 @@ main(void) Err bitreich.org 70
i uint32_t width, height, h, 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@@ -103,9 +87,9 @@ main(void) 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 if (ferror(stdin)) Err bitreich.org 70
i err("fread stdin"); Err bitreich.org 70
i+ print_4_rows(rows, width, r / width); Err bitreich.org 70
i } Err bitreich.org 70
i return 0; Err bitreich.org 70
i } Err bitreich.org 70
1diff --git a/ff2col.c b/ff2col.c /scm/ff2txt/file/ff2col.c.gph bitreich.org 70
i@@ -0,0 +1,40 @@ Err bitreich.org 70
i+#include <stdio.h> Err bitreich.org 70
i+#include <string.h> Err bitreich.org 70
i+#include <stdlib.h> Err bitreich.org 70
i+#include <stdint.h> Err bitreich.org 70
i+ Err bitreich.org 70
i+#include "util.h" Err bitreich.org 70
i+ Err bitreich.org 70
i+void Err bitreich.org 70
i+print_2_rows(struct col *buf, uint32_t width, int height) Err bitreich.org 70
i+{ Err bitreich.org 70
i+ size_t w; Err bitreich.org 70
i+ int up, dn; Err bitreich.org 70
i+ char *map = " '.:"; Err bitreich.org 70
i+ Err bitreich.org 70
i+ for (w = 0; w < width; w += 2) { Err bitreich.org 70
i+ up = height > 0 && is_bright(buf[w]) ? 0x1 : 0x0; Err bitreich.org 70
i+ dn = height > 1 && is_bright(buf[w + width]) ? 0x2 : 0x0; Err bitreich.org 70
i+ putchar(map[up & dn]); Err bitreich.org 70
i+ } 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 * 2]; Err bitreich.org 70
i+ uint32_t width, height, h, r; Err bitreich.org 70
i+ Err bitreich.org 70
i+ read_header(&width, &height); Err bitreich.org 70
i+ Err bitreich.org 70
i+ for (h = 0; h < height; h += 2) { Err bitreich.org 70
i+ r = fread(buf, sizeof(*buf), width * 2, stdin); Err bitreich.org 70
i+ if (r % width != 0) Err bitreich.org 70
i+ err("invalid line width"); Err bitreich.org 70
i+ if (ferror(stdin)) Err bitreich.org 70
i+ err("fread stdin"); Err bitreich.org 70
i+ print_2_rows(buf, width, r / width); Err bitreich.org 70
i+ } Err bitreich.org 70
i+ return 0; Err bitreich.org 70
i+} Err bitreich.org 70
1diff --git a/util.c b/util.c /scm/ff2txt/file/util.c.gph bitreich.org 70
i@@ -0,0 +1,47 @@ Err bitreich.org 70
i+#include <arpa/inet.h> Err bitreich.org 70
i+ Err bitreich.org 70
i+#include <stdint.h> Err bitreich.org 70
i+#include <stdlib.h> Err bitreich.org 70
i+#include <stdio.h> Err bitreich.org 70
i+#include <string.h> Err bitreich.org 70
i+ Err bitreich.org 70
i+#include "util.h" 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 *height) 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+ *height = ntohl(header[3]); Err bitreich.org 70
i+ 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+ Err bitreich.org 70
i+int Err bitreich.org 70
i+is_bright(struct col col) Err bitreich.org 70
i+{ Err bitreich.org 70
i+ int32_t sum; Err bitreich.org 70
i+ Err bitreich.org 70
i+ /* divide first to avoid overflow */ Err bitreich.org 70
i+ sum = htonl(col.red) / 4; Err bitreich.org 70
i+ sum += htonl(col.green) / 4; Err bitreich.org 70
i+ sum += htonl(col.blue) / 4; Err bitreich.org 70
i+ sum += htonl(col.alpha) / 4; Err bitreich.org 70
i+ Err bitreich.org 70
i+ return sum <= UINT16_MAX / 2; Err bitreich.org 70
i+} Err bitreich.org 70
1diff --git a/util.h b/util.h /scm/ff2txt/file/util.h.gph bitreich.org 70
i@@ -0,0 +1,16 @@ 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(char *); Err bitreich.org 70
i+void read_header(uint32_t *, uint32_t *); Err bitreich.org 70
i+int is_bright(struct col); Err bitreich.org 70
.
Response:
text/plain