fix endianess, ignore alpha, add ff2col - ff2txt - farbfeld image to plain text visualization
(HTM) git clone git://bitreich.org/ff2txt git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/ff2txt
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) Tags
(DIR) README
---
(DIR) commit 1b7f84f5eed357743b19d90188c0dcc0736db014
(DIR) parent 0618ea49eedccf14ae19e93f9e8ec1ffd43daa44
(HTM) Author: Josuah Demangeon <mail@josuah.net>
Date: Mon, 29 Jan 2018 12:40:46 +0100
fix endianess, ignore alpha, add ff2col
Diffstat:
M Makefile | 10 +++++++---
D ff2ascii.c | 101 -------------------------------
M ff2braille.c | 2 +-
A ff2col.1 | 34 +++++++++++++++++++++++++++++++
M ff2col.c | 4 ++--
M util.c | 21 +++++++++++++--------
M util.h | 2 +-
7 files changed, 58 insertions(+), 116 deletions(-)
---
(DIR) diff --git a/Makefile b/Makefile
@@ -1,17 +1,21 @@
CFLAGS = -std=c89 -pedantic -Wall -Wextra -Werror
+
all: ff2braille ff2col
+.c.o:
+ ${CC} ${CFLAGS} -c $< -o $@
+
ff2braille: ff2braille.o util.o util.h
- cc -o $@ ff2braille.o util.o $(LDFLAGS)
+ ${CC} -o $@ ff2braille.o util.o $(LDFLAGS)
ff2col: ff2col.o util.o util.h
- cc -o $@ ff2col.o util.o $(LDFLAGS)
+ ${CC} -o $@ ff2col.o util.o $(LDFLAGS)
install:
mkdir -p ${PREFIX}/bin
cp ff2braille ${PREFIX}/bin
clean:
- rm -f *.o ff2braille
+ rm -f *.o ff2braille ff2col
.PHONY: all install clean
(DIR) diff --git a/ff2ascii.c b/ff2ascii.c
@@ -1,101 +0,0 @@
-/*
- * Transforming an image into a braille character text is transforming a
- * matrice this way:
- *
- * farbfeld image braille characters
- *
- * [[a0 a1 a2 a3 a4 a5] [[[a0 a1 [a2 a3 [a4 a5 \
- * [b0 b1 b2 b3 b4 b5] b0 b1 / b2 b3 / b4 b5 |<- One braille
- * [c0 c1 c2 c3 c4 c5] c0 c1 / c2 c3 / c4 c5 | character
- * [d0 d1 d2 d3 d4 d5] => d0 d1] d2 d3] d4 d5]] /
- * [e0 e1 e2 e3 e4 e5] [[e0 e1 [e2 e3 [e4 e5
- * [f0 f1 f2 f3 f4 f5] f0 f1 / f2 f3 / f4 f5
- * [g0 g1 g2 g3 g4 g5] g0 g1 / g2 g3 / g4 g5
- * [h0 h1 h2 h3 h4 h5]] h0 h1] h2 h3] h4 h5]]]
- *
- * braille characters written as a line:
- *
- * [[[a0 a1 b0 b1 c0 c1 d0 d1] <- One braille character
- * [a2 a3 b2 b3 c2 c3 d2 d3]
- * [a4 a5 b4 b5 c4 c5 d4 d5]] <- One row of braille characters
- * [[e0 e1 f0 f1 g0 g1 h0 h1]
- * [e2 e3 f2 f3 g2 g3 h2 h3]
- * [e4 e5 f4 f5 g4 g5 h4 h5]]] <- Two row of braille characters
- *
- * Although the encoding of braille keeps 1 4
- * the characters encoded with only six 2 5
- * dots first, as only these are used for 3 6
- * encoding letters: 7 8
- */
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <stdint.h>
-
-#include "util.h"
-
-void
-print_utf8_3byte(long rune)
-{
- printf("%c%c%c",
- (char)(0xe0 | (0x0f & (rune >> 12))), /* 1110xxxx */
- (char)(0x80 | (0x3f & (rune >> 6))), /* 10xxxxxx */
- (char)(0x80 | (0x3f & (rune)))); /* 10xxxxxx */
-}
-
-int
-is_on(struct col *rows[4], uint32_t width, uint32_t height, uint32_t w,
- uint32_t h)
-{
- uint16_t sum;
-
- if (w >= width || h >= height)
- return 0;
-
- /* divide first to avoid overflow */
- sum = rows[h][w].red / 4;
- sum += rows[h][w].green / 4;
- sum += rows[h][w].blue / 4;
- sum += rows[h][w].alpha / 4;
- return sum >= UINT16_MAX / 2;
-}
-
-void
-print_4_rows(struct col *rows[4], uint32_t width, uint32_t height)
-{
- uint32_t w;
-
- for (w = 0; w < width; w += 2)
- print_utf8_3byte(BRAILLE_START +
- 0x01 * is_on(rows, width, height, w + 0, 0) +
- 0x08 * is_on(rows, width, height, w + 1, 0) +
- 0x02 * is_on(rows, width, height, w + 0, 1) +
- 0x10 * is_on(rows, width, height, w + 1, 1) +
- 0x04 * is_on(rows, width, height, w + 0, 2) +
- 0x20 * is_on(rows, width, height, w + 1, 2) +
- 0x40 * is_on(rows, width, height, w + 0, 3) +
- 0x80 * is_on(rows, width, height, w + 1, 3));
- putchar('\n');
-}
-
-int
-main(void)
-{
- struct col buf[MAX_WIDTH * 4], *rows[4];
- uint32_t width, height, h, r, i;
-
- read_header(&width, &height);
-
- for (i = 0; i < 4; i++)
- rows[i] = buf + width * i;
-
- for (h = 0; h < height; h += 4) {
- r = fread(buf, sizeof(*buf), width * 4, stdin);
- if (r % width != 0)
- err("invalid line width");
- print_4_rows(rows, width, r / width);
- if (ferror(stdin))
- err("fread stdin");
- }
- return 0;
-}
(DIR) diff --git a/ff2braille.c b/ff2braille.c
@@ -51,7 +51,7 @@ is_on(struct col *rows[4], uint32_t width, uint32_t height,
if (w >= width || h >= height)
return 0;
- return is_bright(rows[h][w]);
+ return col_is_bright(rows[h][w]);
}
void
(DIR) diff --git a/ff2col.1 b/ff2col.1
@@ -0,0 +1,34 @@
+.Dt FF2COL 1
+.Dd $Mdocdate: January 22 2018$
+.Os
+.
+.
+.Sh NAME
+.
+.Nm ff2col
+.Nd farbfeld to text column, comma, single-quote image conversion
+.
+.
+.Sh SYNOPSIS
+.
+.Nm
+.
+.
+.Sh DESCRIPTION
+.
+.Nm
+reads a
+.Xr farbfeld 5
+image from stdin and write a text representation of the image using
+.Dq \&'\&.\&:
+characters to stdout.
+.
+.
+.Sh EXIT STATUS
+.
+.Ex -std
+.
+.
+.Sh EXAMPLES
+.
+.Dl pg2ff < image.png | ff2col > file.txt
(DIR) diff --git a/ff2col.c b/ff2col.c
@@ -13,8 +13,8 @@ print_2_rows(struct col *buf, uint32_t width, int height)
char *map = " '.:";
for (w = 0; w < width; w++) {
- up = height > 0 && is_bright(buf[w]) ? 0x1 : 0x0;
- dn = height > 1 && is_bright(buf[w + width]) ? 0x2 : 0x0;
+ up = height > 0 && col_is_bright(buf[w]) ? 0x1 : 0x0;
+ dn = height > 1 && col_is_bright(buf[w + width]) ? 0x2 : 0x0;
putchar(map[up | dn]);
}
putchar('\n');
(DIR) diff --git a/util.c b/util.c
@@ -32,16 +32,21 @@ read_header(uint32_t *width, uint32_t *height)
err("empty image");
}
-int
-is_bright(struct col col)
+static uint16_t
+col_blend(struct col col)
{
- int32_t sum;
+ int16_t sum;
/* divide first to avoid overflow */
- sum = htonl(col.red) / 4;
- sum += htonl(col.green) / 4;
- sum += htonl(col.blue) / 4;
- sum += htonl(col.alpha) / 4;
+ sum = ntohs(col.red) / 3;
+ sum += ntohs(col.green) / 3;
+ sum += ntohs(col.blue) / 3;
+
+ return sum;
+}
- return sum <= UINT16_MAX / 2;
+int
+col_is_bright(struct col col)
+{
+ return col_blend(col) >= UINT16_MAX / 2;
}
(DIR) diff --git a/util.h b/util.h
@@ -13,4 +13,4 @@ struct col {
void err(char *);
void read_header(uint32_t *, uint32_t *);
-int is_bright(struct col);
+int col_is_bright(struct col);