From fe27bbedc5636c5c20fa932a1cd61b19d3afe34f Mon Sep 17 00:00:00 2001 From: Lars Brinkhoff Date: Mon, 29 Mar 2021 08:43:29 +0200 Subject: [PATCH] display: Add display_line API for vector strokes. --- display/display.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++ display/display.h | 7 +++++ 2 files changed, 73 insertions(+) diff --git a/display/display.c b/display/display.c index 01c1b4d1..b31ee5bf 100644 --- a/display/display.c +++ b/display/display.c @@ -809,6 +809,72 @@ display_point(int x, /* 0..xpixels (unscaled) */ return lx*lx + ly*ly <= scaled_pen_radius_squared; } /* display_point */ +#define ABS(_X) ((_X) >= 0 ? (_X) : -(_X)) +#define SIGN(_X) ((_X) >= 0 ? 1 : -1) + +static void +xline (int x, int y, int x2, int dx, int dy, int level) +{ + int ix = SIGN(dx); + int iy = SIGN(dy); + int ay; + + dx = ABS(dx); + dy = ABS(dy); + + ay = dy/2; + for (;;) { + display_point (x, y, level, 0); + if (x == x2) + break; + if (ay > 0) { + y += iy; + ay -= dx; + } + ay += dy; + x += ix; + } +} + +static void +yline (int x, int y, int y2, int dx, int dy, int level) +{ + int ix = SIGN(dx); + int iy = SIGN(dy); + int ax; + + dx = ABS(dx); + dy = ABS(dy); + + ax = dx/2; + for (;;) { + display_point (x, y, level, 0); + if (y == y2) + break; + if (ax > 0) { + x += ix; + ax -= dy; + } + ax += dx; + y += iy; + } +} + +void +display_line(int x1, /* 0..xpixels (unscaled) */ + int y1, /* 0..ypixels (unscaled) */ + int x2, /* 0..xpixels (unscaled) */ + int y2, /* 0..ypixels (unscaled) */ + int level) /* DISPLAY_INT_xxx */ +{ + int dx = x2 - x1; + int dy = y2 - y1; + if (ABS (dx) > ABS(dy)) + xline (x1, y1, x2, dx, dy, level); + else + yline (x1, y1, y2, dx, dy, level); +} /* display_line */ + /* * calculate decay color table for a phosphor mixture * must be called AFTER refresh_rate initialized! diff --git a/display/display.h b/display/display.h index 94fb3a47..cce79f9f 100644 --- a/display/display.h +++ b/display/display.h @@ -112,6 +112,13 @@ extern int display_is_blank(void); */ extern int display_point(int,int,int,int); +/* + * plot a line; arguments are start and end x, y, intensity + * + * Display initialized on first call. + */ +extern void display_line(int,int,int,int,int); + /* * force window system to output bits to screen; * call after adding points, or aging the screen