draw to farbfeld instead of plain text - ploot - simple plotting tools HTML git clone git://bitreich.org/ploot git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/ploot DIR Log DIR Files DIR Refs DIR Tags DIR README DIR LICENSE --- DIR commit 1fc2d491d5051732caac4426d73cb22c2d870f6d DIR parent dd70db86b2270b2a539f863664d2af0c5c7f1040 HTML Author: Josuah Demangeon <mail@josuah.net> Date: Sun, 29 Apr 2018 21:54:47 +0200 draw to farbfeld instead of plain text Diffstat: M Makefile | 19 +++++++++++-------- M arg.h | 30 +++++++++++++++--------------- A deffont.h | 27 +++++++++++++++++++++++++++ A font-14x7.h | 550 +++++++++++++++++++++++++++++++ A font.c | 71 +++++++++++++++++++++++++++++++ 5 files changed, 674 insertions(+), 23 deletions(-) --- DIR diff --git a/Makefile b/Makefile @@ -1,17 +1,20 @@ CFLAGS = -Wall -Wextra -Werror -std=c89 -pedantic -D_POSIX_C_SOURCE=200809L -.PHONY: all -all:ploot +SRC = font.c + +OBJ = $(SRC:.c=.o) + +all:x ploot ploot.o: config.h arg.h -ploot: ploot.o - ${CC} -static -o ploot ploot.o +ploot: $(OBJ) + ${CC} -static -o $@ $(OBJ) -.PHONY: install -install: ploot +install:x ploot mkdir -p ${PREFIX}/bin cp ploot ${PREFIX}/bin/ploot -.PHONY: clean -clean: +clean:x rm -f *.o ploot + +x: DIR diff --git a/arg.h b/arg.h @@ -3,25 +3,25 @@ extern char *argv0; -#define ARGBEGIN(argc, argv) \ - for (argv0 = *argv, argv++, argc--; \ - argv[0] != NULL && argv[0][0] == '-' && argv[0][1] != '\0'; \ - argc--, argv++) { \ - char **_argv, *_a; \ - if (argv[0][1] == '-' && argv[0][2] == '\0') { \ - argv++, argc--; \ - break; \ - } \ - for (_argv = argv, _a = *argv + 1; *_a != '\0'; _a++) { \ +#define ARGBEGIN \ + for (argv0 = *argv, argv++, argc--; \ + argv[0] != NULL && argv[0][0] == '-' && argv[0][1] != '\0'; \ + argc--, argv++) { \ + char **_argv, *_a; \ + if (argv[0][1] == '-' && argv[0][2] == '\0') { \ + argv++, argc--; \ + break; \ + } \ + for (_argv = argv, _a = *argv + 1; *_a != '\0'; _a++) { \ switch (*_a) -#define ARGEND \ - if (_argv != argv) \ - break; \ - } \ +#define ARGEND \ + if (_argv != argv) \ + break; \ + } \ } -#define EARGF(x) \ +#define EARGF(x) \ ((argv[1] == NULL) ? ((x), (char *)0) : (argc--, argv++, argv[0])) #endif DIR diff --git a/deffont.h b/deffont.h @@ -0,0 +1,27 @@ +#include <stddef.h> + +#define _ 0 +#define X 1 +#define B(x) char glyph_ ## x[WIDTH * HEIGHT] +#define b(x) glyph_ ## x +#define NOPR NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL +#define NOPRINT NOPR, NOPR, NOPR, NOPR + +#define FONT(x) char *font_ ## x[] = { \ + NULL, NULL, NULL, NULL, \ + NULL, NULL, NULL, NULL, \ + NULL, NULL, NULL, NULL, \ + NULL, NULL, NULL, NULL, \ + NULL, NULL, NULL, NULL, \ + NULL, NULL, NULL, NULL, \ + b(space), b(bang), b(double), b(hash), \ + b(dollar), b(percent), b(ampersand), b(single), \ + b(l_round), b(r_round), b(asterisk), b(plus), \ + b(coma), b(minus), b(dot), b(slash), \ + b(0), b(1), b(2), b(3), \ + b(4), b(5), b(6), b(7), \ + b(8), b(9), b(column), b(semicolumn), \ + b(l_angle), b(equal), b(r_angle), b(question), \ + b(column), b(semicolumn), b(l_angle), b(equal), \ + b(r_angle), b(question) \ +} DIR diff --git a/font-14x7.h b/font-14x7.h @@ -0,0 +1,550 @@ +#include "deffont.h" + +#define WIDTH 14 +#define HEIGHT 7 + +B(space) = { +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_ +}; + +B(bang) = { +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,_,_,_,_, +_ ,_,_,X,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_ +}; + +B(double) = { +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,X,_,X,_, +_ ,_,X,_,X,_, +_ ,_,X,_,X,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_ +}; + +B(hash) = { +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,X,_,X,_, +_ ,_,X,_,X,_, +_ ,X,X,X,X,X, +_ ,_,X,_,X,_, +_ ,_,X,_,X,_, +_ ,X,X,X,X,X, +_ ,_,X,_,X,_, +_ ,_,X,_,X,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_ +}; + +B(dollar) = { +_ ,_,_,_,_,_, +_ ,_,_,X,_,_, +_ ,_,X,X,X,_, +_ ,X,_,X,_,X, +_ ,X,_,X,_,_, +_ ,X,_,X,_,_, +_ ,_,X,X,X,_, +_ ,_,_,X,_,X, +_ ,_,_,X,_,X, +_ ,X,_,X,_,X, +_ ,_,X,X,X,_, +_ ,_,_,X,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_ +}; + +B(percent) = { +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,X, +_ ,X,X,_,_,X, +_ ,X,X,_,X,_, +_ ,_,_,_,X,_, +_ ,_,_,X,_,_, +_ ,_,X,_,_,_, +_ ,_,X,_,X,X, +_ ,X,_,_,X,X, +_ ,X,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_ +}; + +B(ampersand) = { +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,X,_,_, +_ ,_,X,_,X,_, +_ ,_,X,_,X,_, +_ ,_,_,X,_,_, +_ ,_,X,X,_,X, +_ ,X,_,_,X,_, +_ ,X,_,_,X,_, +_ ,X,_,_,X,_, +_ ,_,X,X,_,X, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_ +}; + +B(single) = { +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_ +}; + +B(l_round) = { +_ ,_,_,_,_,_, +_ ,_,_,_,X,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,X,_,_,_, +_ ,_,X,_,_,_, +_ ,_,X,_,_,_, +_ ,_,X,_,_,_, +_ ,_,X,_,_,_, +_ ,_,X,_,_,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,_,_,X,_, +_ ,_,_,_,_,_ +}; + +B(r_round) = { +_ ,_,_,_,_,_, +_ ,_,X,_,_,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,_,_,X,_, +_ ,_,_,_,X,_, +_ ,_,_,_,X,_, +_ ,_,_,_,X,_, +_ ,_,_,_,X,_, +_ ,_,_,_,X,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,X,_,_,_, +_ ,_,_,_,_,_ +}; + +B(asterisk) = { +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,X,_,_, +_ ,X,_,X,_,X, +_ ,_,X,X,X,_, +_ ,_,_,X,_,_, +_ ,_,X,X,X,_, +_ ,X,_,X,_,X, +_ ,_,_,X,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_ +}; + +B(plus) = { +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,X,X,X,X,X, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_ +}; + +B(coma) = { +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,X,_,_,_, +_ ,_,_,_,_,_ +}; + +B(minus) = { +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,X,X,X,X,X, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_ +}; + +B(dot) = { +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_ +}; + +B(slash) = { +_ ,_,_,_,_,_, +_ ,_,_,_,_,X, +_ ,_,_,_,_,X, +_ ,_,_,_,X,_, +_ ,_,_,_,X,_, +_ ,_,_,_,X,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,X,_,_,_, +_ ,_,X,_,_,_, +_ ,_,X,_,_,_, +_ ,X,_,_,_,_, +_ ,X,_,_,_,_, +_ ,_,_,_,_,_ +}; + +B(0) = { +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,X,X,X,_, +_ ,X,_,_,_,X, +_ ,X,_,_,_,X, +_ ,X,_,X,_,X, +_ ,X,_,X,_,X, +_ ,X,_,X,_,X, +_ ,X,_,_,_,X, +_ ,X,_,_,_,X, +_ ,_,X,X,X,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_ +}; + +B(1) = { +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,X,X,_,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,X,X,X,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_ +}; + +B(2) = { +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,X,X,X,_, +_ ,X,_,_,_,X, +_ ,X,_,_,_,X, +_ ,_,_,_,_,X, +_ ,_,_,_,X,_, +_ ,_,_,X,_,_, +_ ,_,X,_,_,_, +_ ,X,_,_,_,_, +_ ,X,X,X,X,X, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_ +}; + +B(3) = { +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,X,X,X,_, +_ ,X,_,_,_,X, +_ ,_,_,_,_,X, +_ ,_,_,_,_,X, +_ ,_,X,X,X,_, +_ ,_,_,_,_,X, +_ ,_,_,_,_,X, +_ ,X,_,_,_,X, +_ ,_,X,X,X,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_ +}; + +B(4) = { +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,X, +_ ,_,_,_,X,X, +_ ,_,_,X,_,X, +_ ,_,X,_,_,X, +_ ,X,_,_,_,X, +_ ,X,X,X,X,X, +_ ,_,_,_,_,X, +_ ,_,_,_,_,X, +_ ,_,_,_,_,X, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_ +}; + +B(5) = { +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,X,X,X,X,X, +_ ,X,_,_,_,_, +_ ,X,_,_,_,_, +_ ,X,_,_,_,_, +_ ,X,X,X,X,_, +_ ,_,_,_,_,X, +_ ,_,_,_,_,X, +_ ,X,_,_,_,X, +_ ,_,X,X,X,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_ +}; + +B(6) = { +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,X,X,X,_, +_ ,X,_,_,_,_, +_ ,X,_,_,_,_, +_ ,X,_,_,_,_, +_ ,X,X,X,X,_, +_ ,X,_,_,_,X, +_ ,X,_,_,_,X, +_ ,X,_,_,_,X, +_ ,_,X,X,X,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_ +}; + +B(7) = { +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,X,X,X,X,X, +_ ,_,_,_,_,X, +_ ,_,_,_,_,X, +_ ,_,_,_,X,_, +_ ,_,_,_,X,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,X,_,_,_, +_ ,_,X,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_ +}; + +B(8) = { +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,X,X,X,_, +_ ,X,_,_,_,X, +_ ,X,_,_,_,X, +_ ,X,_,_,_,X, +_ ,_,X,X,X,_, +_ ,X,_,_,_,X, +_ ,X,_,_,_,X, +_ ,X,_,_,_,X, +_ ,_,X,X,X,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_ +}; + +B(9) = { +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,X,X,X,_, +_ ,X,_,_,_,X, +_ ,X,_,_,_,X, +_ ,X,_,_,_,X, +_ ,_,X,X,X,X, +_ ,_,_,_,_,X, +_ ,_,_,_,_,X, +_ ,_,_,_,_,X, +_ ,_,X,X,X,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_ +}; + +B(column) = { +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_ +}; + +B(semicolumn) = { +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,X,_,_,_, +_ ,_,_,_,_,_ +}; + +B(l_angle) = { +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,X, +_ ,_,_,_,X,_, +_ ,_,_,X,_,_, +_ ,_,X,_,_,_, +_ ,X,_,_,_,_, +_ ,_,X,_,_,_, +_ ,_,_,X,_,_, +_ ,_,_,_,X,_, +_ ,_,_,_,_,X, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_ +}; + +B(equal) = { +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,X,X,X,X,X, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,X,X,X,X,X, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_ +}; + +B(r_angle) = { +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,X,_,_,_,_, +_ ,_,X,_,_,_, +_ ,_,_,X,_,_, +_ ,_,_,_,X,_, +_ ,_,_,_,_,X, +_ ,_,_,_,X,_, +_ ,_,_,X,_,_, +_ ,_,X,_,_,_, +_ ,X,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_ +}; + +B(question) = { +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,X,X,X,_, +_ ,X,_,_,_,X, +_ ,X,_,_,_,X, +_ ,_,_,_,_,X, +_ ,_,_,_,X,_, +_ ,_,_,X,_,_, +_ ,_,_,_,_,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_ +}; + +FONT(14x7); DIR diff --git a/font.c b/font.c @@ -0,0 +1,71 @@ +/* + * Render bitmapped font as a farbfeld image + */ + +#include <arpa/inet.h> + +#include <stdint.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "arg.h" + +typedef uint16_t Color[4]; + +enum { R, G, B, A }; + +Color *canvas; + +char *argv0; +int wflag = 0; +int hflag = 0; + +void +usage() +{ + fputs("ploot -w width -h height <data.csv >image.ff\n", stderr); + exit(1); +} + +void +ffdraw(Color *canvas, int w, int h) +{ + Color col = { 0xffff, 0xffff, 0x0000, 0xffff }; + size_t n; + + for (n = w * h; n > 0; n--) + memcpy(canvas + n - 1, col, sizeof(col)); +} + +int +main(int argc, char **argv) +{ + uint32_t w, h; + + ARGBEGIN { + case 'w': + wflag = atoi(EARGF(usage())); + break; + case 'h': + hflag = atoi(EARGF(usage())); + break; + } ARGEND; + + if (wflag == 0 || hflag == 0) + usage(); + + if ((canvas = calloc(wflag * hflag, sizeof(*canvas))) == NULL) { + perror("allocating memory for the canvas"); + return 1; + } + + fputs("farbfeld", stdout); + w = htonl(wflag); + h = htonl(hflag); + fwrite(&w, sizeof(w), 1, stdout); + fwrite(&h, sizeof(h), 1, stdout); + ffdraw(canvas, wflag, hflag); + fwrite(canvas, wflag * hflag, sizeof(*canvas), stdout); + return 0; +}