summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBertrik Sikken <bertrik@sikken.nl>2008-08-01 19:33:55 +0000
committerBertrik Sikken <bertrik@sikken.nl>2008-08-01 19:33:55 +0000
commit7c3f98f58c69a0b382b69ca546a273d20ebf2d5f (patch)
tree3d04f79148736141b17eb833fa0edd55505109dd
parent84d8d83c50cab91962a1bf683156f4c7c5b30f64 (diff)
downloadrockbox-7c3f98f58c69a0b382b69ca546a273d20ebf2d5f.tar.gz
rockbox-7c3f98f58c69a0b382b69ca546a273d20ebf2d5f.zip
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
-rw-r--r--apps/plugins/rockpaint.c100
1 files changed, 47 insertions, 53 deletions
diff --git a/apps/plugins/rockpaint.c b/apps/plugins/rockpaint.c
index 82fb2ea29b..c4e6328923 100644
--- a/apps/plugins/rockpaint.c
+++ b/apps/plugins/rockpaint.c
@@ -1610,64 +1610,58 @@ static void draw_brush( int x, int y )
1610 } 1610 }
1611} 1611}
1612 1612
1613/* This is an implementation of Bresenham's line algorithm.
1614 * See http://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm.
1615 */
1613static void draw_line( int x1, int y1, int x2, int y2 ) 1616static void draw_line( int x1, int y1, int x2, int y2 )
1614{ 1617{
1615 x1 = x1<<1; 1618 int x = x1;
1616 y1 = y1<<1; 1619 int y = y1;
1617 x2 = x2<<1; 1620 int deltax = x2 - x1;
1618 y2 = y2<<1; 1621 int deltay = y2 - y1;
1619 int w = x1 - x2; 1622 int i;
1620 int h = y1 - y2; 1623
1621 1624 int xerr = abs(deltax);
1622 int x, y; 1625 int yerr = abs(deltay);
1623 1626 int xstep = deltax > 0 ? 1 : -1;
1624 if( w == 0 && h == 0 ) 1627 int ystep = deltay > 0 ? 1 : -1;
1625 { 1628 int err;
1626 draw_pixel( x1>>1, y1>>1 ); 1629
1627 return; 1630 if (yerr > xerr)
1628 } 1631 {
1629 1632 /* more vertical */
1630 if( w < 0 ) w *= -1; 1633 err = yerr;
1631 if( h < 0 ) h *= -1; 1634 xerr <<= 1;
1632 1635 yerr <<= 1;
1633 if( w > h ) 1636
1634 { 1637 /* to leave off the last pixel of the line, leave off the "+ 1" */
1635 if( x1 > x2 ) 1638 for (i = abs(deltay) + 1; i; --i)
1636 { 1639 {
1637 x = x2; 1640 draw_pixel(x, y);
1638 y = y2; 1641 y += ystep;
1639 x2 = x1; 1642 err -= xerr;
1640 y2 = y1; 1643 if (err < 0) {
1641 x1 = x; 1644 x += xstep;
1642 y1 = y; 1645 err += yerr;
1643 } 1646 }
1644 w = x1 - x2;
1645 h = y1 - y2;
1646 while( x1 <= x2 )
1647 {
1648 draw_pixel( (x1+1)>>1, (y1+1)>>1 );
1649 x1+=2;
1650 y1 = y2 - ( x2 - x1 ) * h / w;
1651 } 1647 }
1652 } 1648 }
1653 else /* h > w */ 1649 else
1654 { 1650 {
1655 if( y1 > y2 ) 1651 /* more horizontal */
1656 { 1652 err = xerr;
1657 x = x2; 1653 xerr <<= 1;
1658 y = y2; 1654 yerr <<= 1;
1659 x2 = x1; 1655
1660 y2 = y1; 1656 for (i = abs(deltax) + 1; i; --i)
1661 x1 = x; 1657 {
1662 y1 = y; 1658 draw_pixel(x, y);
1663 } 1659 x += xstep;
1664 w = x1 - x2; 1660 err -= yerr;
1665 h = y1 - y2; 1661 if (err < 0) {
1666 while( y1 <= y2 ) 1662 y += ystep;
1667 { 1663 err += xerr;
1668 draw_pixel( (x1+1)>>1, (y1+1)>>1 ); 1664 }
1669 y1+=2;
1670 x1 = x2 - ( y2 - y1 ) * w / h;
1671 } 1665 }
1672 } 1666 }
1673} 1667}