aboutsummaryrefslogtreecommitdiffstats
path: root/glcd/glcd.c
diff options
context:
space:
mode:
authorTectu <joel@unormal.org>2012-07-24 03:24:50 +0200
committerTectu <joel@unormal.org>2012-07-24 03:24:50 +0200
commitfd65a3c5b5a43b8c10d5edcceeb5e5f5730cd23b (patch)
tree6e613a0172213887638960d077bed8b999c96758 /glcd/glcd.c
parent5f268adaaa2687e8e33f55890565d14c0ae83dfc (diff)
downloaduGFX-fd65a3c5b5a43b8c10d5edcceeb5e5f5730cd23b.tar.gz
uGFX-fd65a3c5b5a43b8c10d5edcceeb5e5f5730cd23b.tar.bz2
uGFX-fd65a3c5b5a43b8c10d5edcceeb5e5f5730cd23b.zip
lcdDrawLine() speed improvement
Diffstat (limited to 'glcd/glcd.c')
-rw-r--r--glcd/glcd.c92
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;
+ }
}
}
}