diff options
author | Bertrik Sikken <bertrik@sikken.nl> | 2008-08-01 19:33:55 +0000 |
---|---|---|
committer | Bertrik Sikken <bertrik@sikken.nl> | 2008-08-01 19:33:55 +0000 |
commit | 7c3f98f58c69a0b382b69ca546a273d20ebf2d5f (patch) | |
tree | 3d04f79148736141b17eb833fa0edd55505109dd | |
parent | 84d8d83c50cab91962a1bf683156f4c7c5b30f64 (diff) | |
download | rockbox-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.c | 100 |
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 | */ | ||
1613 | static void draw_line( int x1, int y1, int x2, int y2 ) | 1616 | static 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 | } |