drawing bitmapped font - 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 b46882e628eb24be3bd67c724a50edceb6687030 DIR parent bb9f77683b2a4c23a519b71baaea8bec6eb5be90 HTML Author: Josuah Demangeon <mail@josuah.net> Date: Mon, 30 Apr 2018 15:38:45 +0200 drawing bitmapped font Diffstat: M Makefile | 3 +-- D config.h | 2 -- A ffdraw.c | 103 +++++++++++++++++++++++++++++++ A ffdraw.h | 23 +++++++++++++++++++++++ A font-14x6.c | 551 +++++++++++++++++++++++++++++++ A font-14x6.h | 1 + D font-14x7.h | 548 ------------------------------- D font.c | 137 ------------------------------- M font.h | 32 ++++++++++++++++---------------- A main.c | 44 +++++++++++++++++++++++++++++++ 10 files changed, 739 insertions(+), 705 deletions(-) --- DIR diff --git a/Makefile b/Makefile @@ -1,12 +1,11 @@ CFLAGS = -Wall -Wextra -Werror -std=c89 -pedantic -D_POSIX_C_SOURCE=200809L -SRC = font.c +SRC = main.c ffdraw.c font-14x6.c OBJ = $(SRC:.c=.o) all:x ploot -ploot.o: config.h arg.h ploot: $(OBJ) ${CC} -static -o $@ $(OBJ) DIR diff --git a/config.h b/config.h @@ -1,2 +0,0 @@ -#define MAX_WIDTH 80 -#define MAX_HEIGHT 20 DIR diff --git a/ffdraw.c b/ffdraw.c @@ -0,0 +1,103 @@ +/* + * Render bitmapped font as a farbfeld image + * + * The convention used: y + * - (0,0) is at the lower left corner of the canvas. | + * - (0,1) is above it. +--x + */ + +#include <stdint.h> +#include <string.h> +#include <stdlib.h> + +#include "ffdraw.h" +#include "font-14x6.h" + +#define WIDTH 100 +#define HEIGHT 100 + +Color buffer[WIDTH * HEIGHT]; + +void +ffdraw_pixel(Canvas *can, Color col, + int x, int y) +{ +/* Make it segfault early. * / + x = MIN(can->w - 1, x); + y = MIN(can->h - 1, y); +/ **/ + memcpy(can->b + x + (can->h - 1 - y) * can->w, col, sizeof(*can->b)); +} + +void +ffdraw_rectangle(Canvas *can, Color col, + int x1, int y1, + int x2, int y2) +{ + int x, y, xmin, ymin, xmax, ymax; + + xmin = MIN(x1, x2); xmax = MAX(x1, x2); + ymin = MIN(y1, y2); ymax = MAX(y1, y2); + + for (x = xmin; x <= xmax; x++) + for (y = ymin; y <= ymax; y++) + ffdraw_pixel(can, col, x, y); +} + +/* + * Adapted from Bresenham's line algorithm and dcat's tplot. + */ +void +ffdraw_line(Canvas *can, Color col, + int x0, int y0, + int x1, int y1) +{ + int dx, dy, sx, sy, err, e; + + sx = x0 < x1 ? 1 : -1; + sy = y0 < y1 ? 1 : -1; + dx = abs(x1 - x0); + dy = abs(y1 - y0); + err = (dx > dy ? dx : -dy) / 2; + + for (;;) { + ffdraw_pixel(can, col, x0, y0); + + if (x0 == x1 && y0 == y1) + break; + + e = err; + if (e > -dx) { + x0 += sx; + err -= dy; + } + if (e < dy) { + y0 += sy; + err += dx; + } + } +} + +/* + * Draw a coloured glyph from font f centerd on x, y + */ +void +ffdraw_char(Canvas *can, Color col, char c, Font *f, + int x, int y) +{ + int xf, yf; + + x -= f->w / 2; + y -= f->h / 2; + + for (xf = 0; xf < f->w; xf++) + for (yf = 0; yf < f->h; yf++) + if (f->b[(int)c][(f->h - yf - 1) * f->w + xf] > 0) + ffdraw_pixel(can, col, x + xf, y + yf); +} + +void +ffdraw_fill(Canvas *can, Color col) +{ + ffdraw_rectangle(can, col, 0, 0, can->w - 1, can->h - 1); +} DIR diff --git a/ffdraw.h b/ffdraw.h @@ -0,0 +1,23 @@ +#define MIN(x, y) ((x) < (y) ? (x) : (y)) +#define MAX(x, y) ((x) > (y) ? (x) : (y)) + +typedef uint16_t Color[4]; + +typedef struct { + int w; /* width */ + int h; /* height */ + Color *b; /* buffer */ +} Canvas; + +typedef struct { + int w; /* width */ + int h; /* height */ + char *b[255]; /* buffer */ +} Font; + +/* ffdraw.c */ +void ffdraw_pixel (Canvas *, Color, int, int); +void ffdraw_rectangle(Canvas *, Color, int, int, int, int); +void ffdraw_line (Canvas *, Color, int, int, int, int); +void ffdraw_char (Canvas *, Color, char, Font *, int, int); +void ffdraw_fill (Canvas *, Color); DIR diff --git a/font-14x6.c b/font-14x6.c @@ -0,0 +1,551 @@ +#include "font.h" +#include "font-14x6.h" + +#define FONT_HEIGHT 14 +#define FONT_WIDTH 6 + +C(space) = { +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_ +}; + +C(bang) = { +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,_,_,_,_, +_ ,_,_,X,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_ +}; + +C(double) = { +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,X,_,X,_, +_ ,_,X,_,X,_, +_ ,_,X,_,X,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_ +}; + +C(hash) = { +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,X,_,X,_, +_ ,_,X,_,X,_, +_ ,X,X,X,X,X, +_ ,_,X,_,X,_, +_ ,_,X,_,X,_, +_ ,X,X,X,X,X, +_ ,_,X,_,X,_, +_ ,_,X,_,X,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_ +}; + +C(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,_,_, +_ ,_,_,_,_,_, +}; + +C(percent) = { +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,X,X,_,_,X, +_ ,X,X,_,X,_, +_ ,_,_,_,X,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,X,_,_,_, +_ ,_,X,_,X,X, +_ ,X,_,_,X,X, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_ +}; + +C(ampersand) = { +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,X,_,_, +_ ,_,X,_,X,_, +_ ,_,X,_,X,_, +_ ,_,_,X,_,_, +_ ,_,X,X,_,X, +_ ,X,_,_,X,_, +_ ,X,_,_,X,_, +_ ,X,_,_,X,_, +_ ,_,X,X,_,X, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_ +}; + +C(single) = { +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_ +}; + +C(l_round) = { +_ ,_,_,_,_,_, +_ ,_,_,_,X,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,X,_,_,_, +_ ,_,X,_,_,_, +_ ,_,X,_,_,_, +_ ,_,X,_,_,_, +_ ,_,X,_,_,_, +_ ,_,X,_,_,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,_,_,X,_, +_ ,_,_,_,_,_ +}; + +C(r_round) = { +_ ,_,_,_,_,_, +_ ,_,X,_,_,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,_,_,X,_, +_ ,_,_,_,X,_, +_ ,_,_,_,X,_, +_ ,_,_,_,X,_, +_ ,_,_,_,X,_, +_ ,_,_,_,X,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,X,_,_,_, +_ ,_,_,_,_,_ +}; + +C(asterisk) = { +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,X,_,_, +_ ,X,_,X,_,X, +_ ,_,X,X,X,_, +_ ,_,_,X,_,_, +_ ,_,X,X,X,_, +_ ,X,_,X,_,X, +_ ,_,_,X,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_ +}; + +C(plus) = { +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,X,X,X,X,X, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_ +}; + +C(coma) = { +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,X,_,_,_, +_ ,_,_,_,_,_ +}; + +C(minus) = { +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,X,X,X,X,X, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_ +}; + +C(dot) = { +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_ +}; + +C(slash) = { +_ ,_,_,_,_,_, +_ ,_,_,_,_,X, +_ ,_,_,_,_,X, +_ ,_,_,_,X,_, +_ ,_,_,_,X,_, +_ ,_,_,_,X,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,X,_,_,_, +_ ,_,X,_,_,_, +_ ,_,X,_,_,_, +_ ,X,_,_,_,_, +_ ,X,_,_,_,_, +_ ,_,_,_,_,_ +}; + +C(0) = { +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,X,X,X,_, +_ ,X,_,_,_,X, +_ ,X,_,_,_,X, +_ ,X,_,X,_,X, +_ ,X,_,X,_,X, +_ ,X,_,X,_,X, +_ ,X,_,_,_,X, +_ ,X,_,_,_,X, +_ ,_,X,X,X,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_ +}; + +C(1) = { +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,X,X,_,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,X,X,X,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_ +}; + +C(2) = { +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,X,X,X,_, +_ ,X,_,_,_,X, +_ ,X,_,_,_,X, +_ ,_,_,_,_,X, +_ ,_,_,_,X,_, +_ ,_,_,X,_,_, +_ ,_,X,_,_,_, +_ ,X,_,_,_,_, +_ ,X,X,X,X,X, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_ +}; + +C(3) = { +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,X,X,X,_, +_ ,X,_,_,_,X, +_ ,_,_,_,_,X, +_ ,_,_,_,_,X, +_ ,_,X,X,X,_, +_ ,_,_,_,_,X, +_ ,_,_,_,_,X, +_ ,X,_,_,_,X, +_ ,_,X,X,X,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_ +}; + +C(4) = { +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,X, +_ ,_,_,_,X,X, +_ ,_,_,X,_,X, +_ ,_,X,_,_,X, +_ ,X,_,_,_,X, +_ ,X,X,X,X,X, +_ ,_,_,_,_,X, +_ ,_,_,_,_,X, +_ ,_,_,_,_,X, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_ +}; + +C(5) = { +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,X,X,X,X,X, +_ ,X,_,_,_,_, +_ ,X,_,_,_,_, +_ ,X,_,_,_,_, +_ ,X,X,X,X,_, +_ ,_,_,_,_,X, +_ ,_,_,_,_,X, +_ ,X,_,_,_,X, +_ ,_,X,X,X,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_ +}; + +C(6) = { +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,X,X,X,_, +_ ,X,_,_,_,X, +_ ,X,_,_,_,_, +_ ,X,_,_,_,_, +_ ,X,X,X,X,_, +_ ,X,_,_,_,X, +_ ,X,_,_,_,X, +_ ,X,_,_,_,X, +_ ,_,X,X,X,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_ +}; + +C(7) = { +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,X,X,X,X,X, +_ ,_,_,_,_,X, +_ ,_,_,_,_,X, +_ ,_,_,_,X,_, +_ ,_,_,_,X,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,X,_,_,_, +_ ,_,X,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_ +}; + +C(8) = { +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,X,X,X,_, +_ ,X,_,_,_,X, +_ ,X,_,_,_,X, +_ ,X,_,_,_,X, +_ ,_,X,X,X,_, +_ ,X,_,_,_,X, +_ ,X,_,_,_,X, +_ ,X,_,_,_,X, +_ ,_,X,X,X,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_ +}; + +C(9) = { +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,X,X,X,_, +_ ,X,_,_,_,X, +_ ,X,_,_,_,X, +_ ,X,_,_,_,X, +_ ,_,X,X,X,X, +_ ,_,_,_,_,X, +_ ,_,_,_,_,X, +_ ,X,_,_,_,X, +_ ,_,X,X,X,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_ +}; + +C(column) = { +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_ +}; + +C(semicolumn) = { +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,X,_,_,_, +_ ,_,_,_,_,_ +}; + +C(l_angle) = { +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,X, +_ ,_,_,_,X,_, +_ ,_,_,X,_,_, +_ ,_,X,_,_,_, +_ ,X,_,_,_,_, +_ ,_,X,_,_,_, +_ ,_,_,X,_,_, +_ ,_,_,_,X,_, +_ ,_,_,_,_,X, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_ +}; + +C(equal) = { +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,X,X,X,X,X, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,X,X,X,X,X, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_ +}; + +C(r_angle) = { +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,X,_,_,_,_, +_ ,_,X,_,_,_, +_ ,_,_,X,_,_, +_ ,_,_,_,X,_, +_ ,_,_,_,_,X, +_ ,_,_,_,X,_, +_ ,_,_,X,_,_, +_ ,_,X,_,_,_, +_ ,X,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_ +}; + +C(question) = { +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,X,X,X,_, +_ ,X,_,_,_,X, +_ ,X,_,_,_,X, +_ ,_,_,_,_,X, +_ ,_,_,_,X,_, +_ ,_,_,X,_,_, +_ ,_,_,_,_,_, +_ ,_,_,X,_,_, +_ ,_,_,X,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_, +_ ,_,_,_,_,_ +}; + +FONT(font_14x6); DIR diff --git a/font-14x6.h b/font-14x6.h @@ -0,0 +1 @@ +extern Font font_14x6; DIR diff --git a/font-14x7.h b/font-14x7.h @@ -1,548 +0,0 @@ -#define FONT_WIDTH 14 -#define FONT_HEIGHT 6 - -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, -_ ,_,_,_,_,_, -_ ,_,_,_,_,_, -_ ,_,_,_,_,_ -}; - -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,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,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 @@ -1,137 +0,0 @@ -/* - * Render bitmapped font as a farbfeld image - * - * The convention used: y - * - (0,0) is at the lower left corner of the canvas. | - * - (0,1) is above it. +--x - */ - -#include <arpa/inet.h> - -#include <stdint.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "font.h" -#include "font-14x7.h" - -#define WIDTH 100 -#define HEIGHT 100 - -#define MIN(x, y) ((x) < (y) ? (x) : (y)) -#define MAX(x, y) ((x) > (y) ? (x) : (y)) - -typedef uint16_t Color[4]; - -typedef struct { - Color *b; /* buffer */ - int w; /* width */ - int h; /* height */ -} Canvas; - -Color buffer[WIDTH * HEIGHT]; - -void -ffdraw_pixel(Canvas *can, Color c, - int x, int y) -{ -/* Make it segfault early. - x = MIN(can->w - 1, x); - y = MIN(can->h - 1, y); -*/ - memcpy(can->b + x + (can->h - 1 - y) * can->w, c, sizeof(*can->b)); -} - -void -ffdraw_rectangle(Canvas *can, Color c, - int x1, int y1, - int x2, int y2) -{ - int x, y, xmin, ymin, xmax, ymax; - - xmin = MIN(x1, x2); xmax = MAX(x1, x2); - ymin = MIN(y1, y2); ymax = MAX(y1, y2); - - for (x = xmin; x <= xmax; x++) - for (y = ymin; y <= ymax; y++) - ffdraw_pixel(can, c, x, y); -} - -/* - * Adapted from Bresenham's line algorithm and dcat's tplot. - */ -static void -ffdraw_line(Canvas *can, Color c, - int x0, int y0, - int x1, int y1) -{ - int dx, dy, sx, sy, err, e; - - sx = x0 < x1 ? 1 : -1; - sy = y0 < y1 ? 1 : -1; - dx = abs(x1 - x0); - dy = abs(y1 - y0); - err = (dx > dy ? dx : -dy) / 2; - - for (;;) { - ffdraw_pixel(can, c, x0, y0); - - if (x0 == x1 && y0 == y1) - break; - - e = err; - if (e > -dx) { - x0 += sx; - err -= dy; - } - if (e < dy) { - y0 += sy; - err += dx; - } - } -} - -void -ffdraw_fill(Canvas *can, Color c) -{ - ffdraw_rectangle(can, c, 0, 0, can->w - 1, can->h - 1); -} - -void -ffdraw(Canvas *can) -{ - Color c1 = { 0x2222, 0x2222, 0x2222, 0xffff }; - Color c2 = { 0x3333, 0xffff, 0x8888, 0xffff }; - - ffdraw_fill(can, c1); - ffdraw_line(can, c2, - 0, 0, - 50 - 1, 80 - 1); -} - -void -usage(void) -{ - fprintf(stderr, "ploot <data.csv >image.ff\n"); - exit(1); -} - -int -main(void) -{ - uint32_t w, h; - Canvas can; - - can.b = buffer; - can.w = WIDTH; - can.h = HEIGHT; - w = htonl(WIDTH); - h = htonl(HEIGHT); - fputs("farbfeld", stdout); - fwrite(&w, sizeof(w), 1, stdout); - fwrite(&h, sizeof(h), 1, stdout); - ffdraw(&can); - fwrite(can.b, WIDTH * HEIGHT, sizeof(*can.b), stdout); - return 0; -} DIR diff --git a/font.h b/font.h @@ -1,29 +1,29 @@ #include <stddef.h> +#include <stdint.h> +#include "ffdraw.h" /* * Macros to make the fonts header file more readable. */ #define _ 0 #define X 1 -#define B(x) char glyph_ ## x[FONT_WIDTH * FONT_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[] = { \ +#define C(x) char glyph_ ## x[FONT_WIDTH * FONT_HEIGHT] + +#define FONT(x) Font x = { FONT_WIDTH, FONT_HEIGHT, { \ 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) \ -} + glyph_space, glyph_bang, glyph_double, glyph_hash, \ + glyph_dollar, glyph_percent, glyph_ampersand, glyph_single, \ + glyph_l_round, glyph_r_round, glyph_asterisk, glyph_plus, \ + glyph_coma, glyph_minus, glyph_dot, glyph_slash, \ + glyph_0, glyph_1, glyph_2, glyph_3, \ + glyph_4, glyph_5, glyph_6, glyph_7, \ + glyph_8, glyph_9, glyph_column, glyph_semicolumn, \ + glyph_l_angle, glyph_equal, glyph_r_angle, glyph_question, \ + glyph_column, glyph_semicolumn, glyph_l_angle, glyph_equal, \ + glyph_r_angle, glyph_question \ +} } DIR diff --git a/main.c b/main.c @@ -0,0 +1,44 @@ +#include <arpa/inet.h> + +#include <stdlib.h> +#include <stdio.h> + +#include "ffdraw.h" +#include "font-14x6.h" + +#define WIDTH 100 +#define HEIGHT 100 + +Color buffer[WIDTH * HEIGHT]; + +static void +ffdraw(Canvas *can) +{ + Color col1 = { 0x2222, 0x2222, 0x2222, 0xffff }; + Color col2 = { 0x3333, 0xffff, 0x8888, 0xffff }; + + ffdraw_fill(can, col1); + ffdraw_line(can, col2, 49,1,9,79); + ffdraw_char(can, col2, '0' - 1, &font_14x6, 44, 50); + ffdraw_char(can, col2, '0' + 0, &font_14x6, 50, 50); + ffdraw_char(can, col2, '0' + 1, &font_14x6, 56, 50); +} + +int +main(void) +{ + uint32_t w, h; + Canvas can; + + can.b = buffer; + can.w = WIDTH; + can.h = HEIGHT; + w = htonl(WIDTH); + h = htonl(HEIGHT); + fputs("farbfeld", stdout); + fwrite(&w, sizeof(w), 1, stdout); + fwrite(&h, sizeof(h), 1, stdout); + ffdraw(&can); + fwrite(can.b, WIDTH * HEIGHT, sizeof(*can.b), stdout); + return 0; +}