diff options
author | Tectu <joel@unormal.org> | 2012-07-24 03:24:50 +0200 |
---|---|---|
committer | Tectu <joel@unormal.org> | 2012-07-24 03:24:50 +0200 |
commit | fd65a3c5b5a43b8c10d5edcceeb5e5f5730cd23b (patch) | |
tree | 6e613a0172213887638960d077bed8b999c96758 /glcd/glcd.c | |
parent | 5f268adaaa2687e8e33f55890565d14c0ae83dfc (diff) | |
download | uGFX-fd65a3c5b5a43b8c10d5edcceeb5e5f5730cd23b.tar.gz uGFX-fd65a3c5b5a43b8c10d5edcceeb5e5f5730cd23b.tar.bz2 uGFX-fd65a3c5b5a43b8c10d5edcceeb5e5f5730cd23b.zip |
lcdDrawLine() speed improvement
Diffstat (limited to 'glcd/glcd.c')
-rw-r--r-- | glcd/glcd.c | 92 |
1 files changed, 50 insertions, 42 deletions
diff --git a/glcd/glcd.c b/glcd/glcd.c index b7b3b7e0..8f3e0ccd 100644 --- a/glcd/glcd.c +++ b/glcd/glcd.c @@ -267,49 +267,57 @@ void lcdVerticalScroll(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint1 } void lcdDrawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t color) { - int16_t dy, dx; - int16_t addx = 1, addy = 1; - int16_t P, diff; - - int16_t i = 0; - dx = abs((int16_t)(x1 - x0)); - dy = abs((int16_t)(y1 - y0)); - - if(x0 > x1) - addx = -1; - if(y0 > y1) - addy = -1; - - if(dx >= dy) { - dy *= 2; - P = dy - dx; - diff = P - dx; - - for(; i<=dx; ++i) { - lcdDrawPixel(x0, y0, color); - if(P < 0) { - P += dy; - x0 += addx; - } else { - P += diff; - x0 += addx; - y0 += addy; - } - } + // speed improvement if vertical or horizontal + if(x0 == x1) { + lcdFillArea(x0, y0, x0+1, y1, color); + } else if (y0 == y1) { + lcdFillArea(x0, y0, x1, y0+1, color); + } else { - dx *= 2; - P = dx - dy; - diff = P - dy; - - for(; i<=dy; ++i) { - lcdDrawPixel(x0, y0, color); - if(P < 0) { - P += dx; - y0 += addy; - } else { - P += diff; - x0 += addx; - y0 += addy; + int16_t dy, dx; + int16_t addx = 1, addy = 1; + int16_t P, diff; + + int16_t i = 0; + dx = abs((int16_t)(x1 - x0)); + dy = abs((int16_t)(y1 - y0)); + + if(x0 > x1) + addx = -1; + if(y0 > y1) + addy = -1; + + if(dx >= dy) { + dy *= 2; + P = dy - dx; + diff = P - dx; + + for(; i<=dx; ++i) { + lcdDrawPixel(x0, y0, color); + if(P < 0) { + P += dy; + x0 += addx; + } else { + P += diff; + x0 += addx; + y0 += addy; + } + } + } else { + dx *= 2; + P = dx - dy; + diff = P - dy; + + for(; i<=dy; ++i) { + lcdDrawPixel(x0, y0, color); + if(P < 0) { + P += dx; + y0 += addy; + } else { + P += diff; + x0 += addx; + y0 += addy; + } } } } |