group farbfeld code in the single farbfeld tool around - ploot - simple plottin… | |
git clone git://bitreich.org/ploot git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65… | |
Log | |
Files | |
Refs | |
Tags | |
README | |
LICENSE | |
--- | |
commit b525323a1383dfb008a8941753702e2b05d14eee | |
parent f5bdc6b7ddfd050efc31f5cc89a6fba87e58819f | |
Author: Josuah Demangeon <[email protected]> | |
Date: Wed, 23 Jun 2021 23:39:40 +0200 | |
group farbfeld code in the single farbfeld tool around | |
Diffstat: | |
M Makefile | 4 ++-- | |
D ffplot.c | 148 -----------------------------… | |
D ffplot.h | 34 -----------------------------… | |
M ploot-farbfeld.c | 166 +++++++++++++++++++++++++++++… | |
4 files changed, 159 insertions(+), 193 deletions(-) | |
--- | |
diff --git a/Makefile b/Makefile | |
@@ -7,8 +7,8 @@ LFLAGS = -static -lm | |
PREFIX = /usr/local | |
MANOREFIX = $(PREFIX)/share/man | |
-SRC = csv.c drawille.c ffplot.c font.c font13.c font8.c scale.c util.c | |
-INC = csv.h drawille.h ffplot.h font.h scale.h util.h | |
+SRC = csv.c drawille.c font.c font13.c font8.c scale.c util.c | |
+INC = csv.h drawille.h font.h scale.h util.h | |
BIN = ploot-farbfeld ploot-feed ploot-braille ploot-text | |
OBJ = ${SRC:.c=.o} | |
diff --git a/ffplot.c b/ffplot.c | |
@@ -1,148 +0,0 @@ | |
-#include "ffplot.h" | |
- | |
-#include <arpa/inet.h> | |
-#include <stddef.h> | |
-#include <string.h> | |
-#include <stdio.h> | |
-#include <stdint.h> | |
- | |
-#include "font.h" | |
-#include "util.h" | |
- | |
-/* | |
- * Convert (x,y) coordinates to (row,col) for printing into the buffer. | |
- * The buffer only contain one number, so the coordinate is a single integer: | |
- * width * y + y. | |
- * The coordinates are shifted by offx and offy to permit relative coordinates. | |
- * | |
- * The convention used: y | |
- * - (0,0) is at the lower left corner of the plotvas. | | |
- * - (0,1) is above it. +--x | |
- */ | |
-void | |
-ffplot_pixel(struct ffplot *plot, struct ffcolor *color, | |
- int x, int y) | |
-{ | |
- x += plot->x; | |
- y += plot->y; | |
- if (x < 0 || x >= plot->w || y < 0 || y >= plot->h) | |
- return; | |
- memcpy(plot->buf + plot->w * (plot->h - 1 - y) + x, color, sizeof(*plo… | |
-} | |
- | |
-void | |
-ffplot_rectangle(struct ffplot *plot, struct ffcolor *color, | |
- int y1, int x1, | |
- int y2, int x2) | |
-{ | |
- int x, y, ymin, xmin, ymax, xmax; | |
- | |
- ymin = MIN(y1, y2); ymax = MAX(y1, y2); | |
- xmin = MIN(x1, x2); xmax = MAX(x1, x2); | |
- | |
- for (y = ymin; y <= ymax; y++) | |
- for (x = xmin; x <= xmax; x++) | |
- ffplot_pixel(plot, color, x, y); | |
-} | |
- | |
-/* | |
- * From Bresenham's line algorithm and dcat's tplot. | |
- */ | |
-void | |
-ffplot_line(struct ffplot *plot, struct ffcolor *color, | |
- int x0, int y0, | |
- int x1, int y1) | |
-{ | |
- int dy, dx, sy, sx, err, e; | |
- | |
- sx = x0 < x1 ? 1 : -1; | |
- sy = y0 < y1 ? 1 : -1; | |
- dx = ABS(x1 - x0); | |
- dy = ABS(y1 - y0); | |
- err = (dy > dx ? dy : -dx) / 2; | |
- | |
- for (;;) { | |
- ffplot_pixel(plot, color, x0, y0); | |
- | |
- if (y0 == y1 && x0 == x1) | |
- break; | |
- | |
- e = err; | |
- if (e > -dy) { | |
- y0 += sy; | |
- err -= dx; | |
- } | |
- if (e < dx) { | |
- x0 += sx; | |
- err += dy; | |
- } | |
- } | |
-} | |
- | |
-/* | |
- * Draw a coloured glyph from font f centered on y. | |
- */ | |
-int | |
-ffplot_char(struct ffplot *plot, struct ffcolor *color, struct font *ft, char … | |
- int x, int y) | |
-{ | |
- int yf, xf, wf; | |
- | |
- if (c & 0x80) | |
- c = '\0'; | |
- y -= ft->height / 2; | |
- wf = font_width(ft, c); | |
- for (xf = 0; xf < wf; xf++) | |
- for (yf = 0; yf < ft->height; yf++) | |
- if (ft->glyph[(int)c][wf * (ft->height - yf) + xf] == … | |
- ffplot_pixel(plot, color, x + xf, y + yf); | |
- return wf + 1; | |
-} | |
- | |
-/* | |
- * Draw a left aligned string without wrapping it. | |
- */ | |
-size_t | |
-ffplot_text_left(struct ffplot *plot, struct ffcolor *color, struct font *ft, | |
- char *s, int x, int y) | |
-{ | |
- for (; *s != '\0'; s++) | |
- x += ffplot_char(plot, color, ft, *s, x, y); | |
- return x; | |
-} | |
- | |
-/* | |
- * Draw a center aligned string without wrapping it. | |
- */ | |
-size_t | |
-ffplot_text_center(struct ffplot *plot, struct ffcolor *color, struct font *ft, | |
- char *s, int x, int y) | |
-{ | |
- x -= font_strlen(ft, s) / 2; | |
- return ffplot_text_left(plot, color, ft, s, x, y); | |
-} | |
- | |
-/* | |
- * Draw a right aligned string without wrapping it. | |
- */ | |
-size_t | |
-ffplot_text_right(struct ffplot *plot, struct ffcolor *color, struct font *ft, | |
- char *s, int x, int y) | |
-{ | |
- x -= font_strlen(ft, s); | |
- return ffplot_text_left(plot, color, ft, s, x, y); | |
-} | |
- | |
-void | |
-ffplot_print(FILE *fp, struct ffplot *plot) | |
-{ | |
- uint32_t w, h; | |
- | |
- w = htonl(plot->w); | |
- h = htonl(plot->h); | |
- | |
- fprintf(stdout, "ffplot"); | |
- fwrite(&w, sizeof(w), 1, fp); | |
- fwrite(&h, sizeof(h), 1, fp); | |
- fwrite(plot->buf, plot->w * plot->h, sizeof(*plot->buf), fp); | |
-} | |
diff --git a/ffplot.h b/ffplot.h | |
@@ -1,34 +0,0 @@ | |
-#ifndef FFPLOT_H | |
-#define FFPLOT_H | |
- | |
-#include <stdio.h> | |
-#include <stddef.h> | |
-#include <stdint.h> | |
- | |
-#include "font.h" | |
- | |
-struct ffcolor { | |
- uint16_t red; | |
- uint16_t green; | |
- uint16_t blue; | |
- uint16_t alpha; | |
-}; | |
- | |
-struct ffplot { | |
- int w; /* width */ | |
- int h; /* height */ | |
- int x; /* x offset */ | |
- int y; /* y offset */ | |
- struct ffcolor *buf; | |
-}; | |
- | |
-void ffplot_pixel(struct ffplot *, struct ffcolor *, int, int); | |
-void ffplot_rectangle(struct ffplot *, struct ffcolor *, int, int, int,… | |
-void ffplot_line(struct ffplot *, struct ffcolor *, int, int, int, int); | |
-int ffplot_char(struct ffplot *, struct ffcolor *, struct font *, char,… | |
-size_t ffplot_text_left(struct ffplot *, struct ffcolor *, struct font … | |
-size_t ffplot_text_center(struct ffplot *, struct ffcolor *, struct fon… | |
-size_t ffplot_text_right(struct ffplot *, struct ffcolor *, struct font… | |
-void ffplot_print(FILE *, struct ffplot *); | |
- | |
-#endif | |
diff --git a/ploot-farbfeld.c b/ploot-farbfeld.c | |
@@ -4,6 +4,7 @@ | |
#include <fcntl.h> | |
#include <limits.h> | |
#include <math.h> | |
+#include <stddef.h> | |
#include <stdint.h> | |
#include <stdio.h> | |
#include <stdlib.h> | |
@@ -11,10 +12,9 @@ | |
#include <time.h> | |
#include <unistd.h> | |
#include "csv.h" | |
-#include "ffplot.h" | |
#include "font.h" | |
-#include "util.h" | |
#include "scale.h" | |
+#include "util.h" | |
#ifndef __OpenBSD__ | |
#define pledge(...) 0 | |
@@ -50,16 +50,22 @@ | |
#define LEGEND_W (100) | |
#define LEGEND_H (PLOT_H) | |
-struct colorname { | |
- char *name; | |
- struct ffcolor color; | |
+struct ffcolor { | |
+ uint16_t red; | |
+ uint16_t green; | |
+ uint16_t blue; | |
+ uint16_t alpha; | |
}; | |
-static char *tflag = ""; | |
-static char *uflag = ""; | |
-static struct font *font = &font13; | |
+struct ffplot { | |
+ int w, h, x, y; /* width, height and coordinamtes */ | |
+ struct ffcolor *buf; | |
+}; | |
-static struct colorname colorname[] = { | |
+static struct colorname { | |
+ char *name; | |
+ struct ffcolor color; | |
+} colorname[] = { | |
/* name red green blue alpha */ | |
{ "red", { 0xffff, 0x4444, 0x4444, 0xffff } }, | |
{ "orange", { 0xffff, 0x9999, 0x4444, 0xffff } }, | |
@@ -70,6 +76,148 @@ static struct colorname colorname[] = { | |
{ NULL, { 0, 0, 0, 0 } } | |
}; | |
+static char *tflag = ""; | |
+static char *uflag = ""; | |
+static struct font *font = &font13; | |
+ | |
+/* | |
+ * Convert (x,y) coordinates to (row,col) for printing into the buffer. | |
+ * The buffer only contain one number, so the coordinate is a single integer: | |
+ * width * y + y. | |
+ * The coordinates are shifted by offx and offy to permit relative coordinates. | |
+ * | |
+ * The convention used: y | |
+ * - (0,0) is at the lower left corner of the plotvas. | | |
+ * - (0,1) is above it. +--x | |
+ */ | |
+static void | |
+ffplot_pixel(struct ffplot *plot, struct ffcolor *color, | |
+ int x, int y) | |
+{ | |
+ x += plot->x; | |
+ y += plot->y; | |
+ if (x < 0 || x >= plot->w || y < 0 || y >= plot->h) | |
+ return; | |
+ memcpy(plot->buf + plot->w * (plot->h - 1 - y) + x, color, sizeof(*plo… | |
+} | |
+ | |
+static void | |
+ffplot_rectangle(struct ffplot *plot, struct ffcolor *color, | |
+ int y1, int x1, | |
+ int y2, int x2) | |
+{ | |
+ int x, y, ymin, xmin, ymax, xmax; | |
+ | |
+ ymin = MIN(y1, y2); ymax = MAX(y1, y2); | |
+ xmin = MIN(x1, x2); xmax = MAX(x1, x2); | |
+ | |
+ for (y = ymin; y <= ymax; y++) | |
+ for (x = xmin; x <= xmax; x++) | |
+ ffplot_pixel(plot, color, x, y); | |
+} | |
+ | |
+/* | |
+ * From Bresenham's line algorithm and dcat's tplot. | |
+ */ | |
+static void | |
+ffplot_line(struct ffplot *plot, struct ffcolor *color, | |
+ int x0, int y0, | |
+ int x1, int y1) | |
+{ | |
+ int dy, dx, sy, sx, err, e; | |
+ | |
+ sx = x0 < x1 ? 1 : -1; | |
+ sy = y0 < y1 ? 1 : -1; | |
+ dx = ABS(x1 - x0); | |
+ dy = ABS(y1 - y0); | |
+ err = (dy > dx ? dy : -dx) / 2; | |
+ | |
+ for (;;) { | |
+ ffplot_pixel(plot, color, x0, y0); | |
+ | |
+ if (y0 == y1 && x0 == x1) | |
+ break; | |
+ | |
+ e = err; | |
+ if (e > -dy) { | |
+ y0 += sy; | |
+ err -= dx; | |
+ } | |
+ if (e < dx) { | |
+ x0 += sx; | |
+ err += dy; | |
+ } | |
+ } | |
+} | |
+ | |
+/* | |
+ * Draw a coloured glyph from font f centered on y. | |
+ */ | |
+static int | |
+ffplot_char(struct ffplot *plot, struct ffcolor *color, struct font *ft, char … | |
+ int x, int y) | |
+{ | |
+ int yf, xf, wf; | |
+ | |
+ if (c & 0x80) | |
+ c = '\0'; | |
+ y -= ft->height / 2; | |
+ wf = font_width(ft, c); | |
+ for (xf = 0; xf < wf; xf++) | |
+ for (yf = 0; yf < ft->height; yf++) | |
+ if (ft->glyph[(int)c][wf * (ft->height - yf) + xf] == … | |
+ ffplot_pixel(plot, color, x + xf, y + yf); | |
+ return wf + 1; | |
+} | |
+ | |
+/* | |
+ * Draw a left aligned string without wrapping it. | |
+ */ | |
+static size_t | |
+ffplot_text_left(struct ffplot *plot, struct ffcolor *color, struct font *ft, | |
+ char *s, int x, int y) | |
+{ | |
+ for (; *s != '\0'; s++) | |
+ x += ffplot_char(plot, color, ft, *s, x, y); | |
+ return x; | |
+} | |
+ | |
+/* | |
+ * Draw a center aligned string without wrapping it. | |
+ */ | |
+static size_t | |
+ffplot_text_center(struct ffplot *plot, struct ffcolor *color, struct font *ft, | |
+ char *s, int x, int y) | |
+{ | |
+ x -= font_strlen(ft, s) / 2; | |
+ return ffplot_text_left(plot, color, ft, s, x, y); | |
+} | |
+ | |
+/* | |
+ * Draw a right aligned string without wrapping it. | |
+ */ | |
+static size_t | |
+ffplot_text_right(struct ffplot *plot, struct ffcolor *color, struct font *ft, | |
+ char *s, int x, int y) | |
+{ | |
+ x -= font_strlen(ft, s); | |
+ return ffplot_text_left(plot, color, ft, s, x, y); | |
+} | |
+ | |
+static void | |
+ffplot_print(FILE *fp, struct ffplot *plot) | |
+{ | |
+ uint32_t w, h; | |
+ | |
+ w = htonl(plot->w); | |
+ h = htonl(plot->h); | |
+ | |
+ fprintf(stdout, "ffplot"); | |
+ fwrite(&w, sizeof(w), 1, fp); | |
+ fwrite(&h, sizeof(h), 1, fp); | |
+ fwrite(plot->buf, plot->w * plot->h, sizeof(*plot->buf), fp); | |
+} | |
+ | |
static int | |
ffplot_t2x(time_t t, time_t tmin, time_t tmax) | |
{ |