Apply FS#9217 - Rockpaint line-drawing function, replace line-drawing algorithm by better looking bresenham algorithm

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@18176 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Bertrik Sikken 2008-08-01 19:33:55 +00:00
parent 84d8d83c50
commit 7c3f98f58c

View file

@ -1610,64 +1610,58 @@ static void draw_brush( int x, int y )
} }
} }
/* This is an implementation of Bresenham's line algorithm.
* See http://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm.
*/
static void draw_line( int x1, int y1, int x2, int y2 ) static void draw_line( int x1, int y1, int x2, int y2 )
{ {
x1 = x1<<1; int x = x1;
y1 = y1<<1; int y = y1;
x2 = x2<<1; int deltax = x2 - x1;
y2 = y2<<1; int deltay = y2 - y1;
int w = x1 - x2; int i;
int h = y1 - y2;
int xerr = abs(deltax);
int x, y; int yerr = abs(deltay);
int xstep = deltax > 0 ? 1 : -1;
if( w == 0 && h == 0 ) int ystep = deltay > 0 ? 1 : -1;
int err;
if (yerr > xerr)
{ {
draw_pixel( x1>>1, y1>>1 ); /* more vertical */
return; err = yerr;
} xerr <<= 1;
yerr <<= 1;
if( w < 0 ) w *= -1;
if( h < 0 ) h *= -1; /* to leave off the last pixel of the line, leave off the "+ 1" */
for (i = abs(deltay) + 1; i; --i)
if( w > h )
{
if( x1 > x2 )
{ {
x = x2; draw_pixel(x, y);
y = y2; y += ystep;
x2 = x1; err -= xerr;
y2 = y1; if (err < 0) {
x1 = x; x += xstep;
y1 = y; err += yerr;
} }
w = x1 - x2;
h = y1 - y2;
while( x1 <= x2 )
{
draw_pixel( (x1+1)>>1, (y1+1)>>1 );
x1+=2;
y1 = y2 - ( x2 - x1 ) * h / w;
} }
} }
else /* h > w */ else
{ {
if( y1 > y2 ) /* more horizontal */
err = xerr;
xerr <<= 1;
yerr <<= 1;
for (i = abs(deltax) + 1; i; --i)
{ {
x = x2; draw_pixel(x, y);
y = y2; x += xstep;
x2 = x1; err -= yerr;
y2 = y1; if (err < 0) {
x1 = x; y += ystep;
y1 = y; err += xerr;
} }
w = x1 - x2;
h = y1 - y2;
while( y1 <= y2 )
{
draw_pixel( (x1+1)>>1, (y1+1)>>1 );
y1+=2;
x1 = x2 - ( y2 - y1 ) * w / h;
} }
} }
} }