diff options
| -rw-r--r-- | autistdraw.c | 62 | 
1 files changed, 60 insertions, 2 deletions
diff --git a/autistdraw.c b/autistdraw.c index 77094a0..0a7ad62 100644 --- a/autistdraw.c +++ b/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)  	{  | 
