plot lines thanks to dcat - 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 bb9f77683b2a4c23a519b71baaea8bec6eb5be90 DIR parent 6e13cd89684d0129aa13995c3f0e2ba4f0a7aae1 HTML Author: Josuah Demangeon <mail@josuah.net> Date: Mon, 30 Apr 2018 14:25:31 +0200 plot lines thanks to dcat Diffstat: M .gitignore | 1 + M font.c | 55 ++++++++++++++++++++++--------- 2 files changed, 41 insertions(+), 15 deletions(-) --- DIR diff --git a/.gitignore b/.gitignore @@ -1,2 +1,3 @@ *.o +*.core ploot DIR diff --git a/font.c b/font.c @@ -1,5 +1,9 @@ /* * 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> @@ -32,6 +36,10 @@ 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)); } @@ -50,20 +58,37 @@ ffdraw_rectangle(Canvas *can, Color c, ffdraw_pixel(can, c, x, y); } -void +/* + * Adapted from Bresenham's line algorithm and dcat's tplot. + */ +static void ffdraw_line(Canvas *can, Color c, - int x1, int y1, - int x2, int y2) + int x0, int y0, + int x1, int y1) { - int x, y; - - (void)c; - (void)can; - - x = x1; - y = y1; - while (x < x2 && y < y2) { - x++; y++; + 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; + } } } @@ -80,9 +105,9 @@ ffdraw(Canvas *can) Color c2 = { 0x3333, 0xffff, 0x8888, 0xffff }; ffdraw_fill(can, c1); - ffdraw_rectangle(can, c2, - 0, 20, - can->w - 10, 4); + ffdraw_line(can, c2, + 0, 0, + 50 - 1, 80 - 1); } void