Draw continuous lines
So that the application is actually usable in shitty terminals.
This commit is contained in:
parent
a47ed4fe84
commit
08a2d53eb4
62
autistdraw.c
62
autistdraw.c
|
@ -497,6 +497,14 @@ make_place_for_point (app_context_t *app, int x, int y)
|
|||
static void
|
||||
draw_point (app_context_t *app, int x, int y, uint8_t color)
|
||||
{
|
||||
// We don't actually draw anything immediately in client mode,
|
||||
// instead we wait for confirmation from the server
|
||||
if (app->mode == NETWORK_MODE_CLIENT)
|
||||
{
|
||||
send_draw_point_request (app, x, y, color);
|
||||
return;
|
||||
}
|
||||
|
||||
make_place_for_point (app, x, y);
|
||||
BITMAP_PIXEL (app, x - app->bitmap_x, y - app->bitmap_y) = color;
|
||||
|
||||
|
@ -516,6 +524,50 @@ draw_point (app_context_t *app, int x, int y, uint8_t color)
|
|||
send_draw_point_response (iter, x, y, color);
|
||||
}
|
||||
|
||||
static void
|
||||
draw_line (app_context_t *app, int x0, int x1, int y0, int y1, uint8_t color)
|
||||
{
|
||||
// Integer version of Bresenham's line drawing algorithm,
|
||||
// loosely based on code from libcaca because screw math
|
||||
int dx = abs (x1 - x0);
|
||||
int dy = abs (y1 - y0);
|
||||
|
||||
bool steep = dx < dy;
|
||||
if (steep)
|
||||
{
|
||||
// Flip the coordinate system on input
|
||||
int tmp;
|
||||
tmp = x0; x0 = y0; y0 = tmp;
|
||||
tmp = x1; x1 = y1; y1 = tmp;
|
||||
tmp = dx; dx = dy; dy = tmp;
|
||||
}
|
||||
|
||||
int step_x = x0 > x1 ? -1 : 1;
|
||||
int step_y = y0 > y1 ? -1 : 1;
|
||||
|
||||
int dpr = dy * 2;
|
||||
int delta = dpr - dx;
|
||||
int dpru = delta - dx;
|
||||
|
||||
while (dx-- >= 0)
|
||||
{
|
||||
// Unflip the coordinate system on output
|
||||
if (steep)
|
||||
draw_point (app, y0, x0, color);
|
||||
else
|
||||
draw_point (app, x0, y0, color);
|
||||
|
||||
x0 += step_x;
|
||||
if (delta > 0)
|
||||
{
|
||||
y0 += step_y;
|
||||
delta += dpru;
|
||||
}
|
||||
else
|
||||
delta += dpr;
|
||||
}
|
||||
}
|
||||
|
||||
// --- Exports -----------------------------------------------------------------
|
||||
|
||||
static bool
|
||||
|
@ -854,10 +906,16 @@ on_mouse (app_context_t *app, termo_key_t *key)
|
|||
|
||||
if (screen_y >= TOP_BAR_CUTOFF)
|
||||
{
|
||||
if (app->mode == NETWORK_MODE_CLIENT)
|
||||
send_draw_point_request (app, canvas_x, canvas_y, *color);
|
||||
if (event == TERMO_MOUSE_DRAG)
|
||||
draw_line (app,
|
||||
app->move_saved_x, canvas_x,
|
||||
app->move_saved_y, canvas_y,
|
||||
*color);
|
||||
else
|
||||
draw_point (app, canvas_x, canvas_y, *color);
|
||||
|
||||
app->move_saved_x = canvas_x;
|
||||
app->move_saved_y = canvas_y;
|
||||
}
|
||||
else if (screen_y > 0 && event != TERMO_MOUSE_DRAG)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue