lcdDrawLine() speed improvement
This commit is contained in:
parent
5f268adaaa
commit
fd65a3c5b5
1 changed files with 48 additions and 40 deletions
88
glcd/glcd.c
88
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) {
|
void lcdDrawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t color) {
|
||||||
int16_t dy, dx;
|
// speed improvement if vertical or horizontal
|
||||||
int16_t addx = 1, addy = 1;
|
if(x0 == x1) {
|
||||||
int16_t P, diff;
|
lcdFillArea(x0, y0, x0+1, y1, color);
|
||||||
|
} else if (y0 == y1) {
|
||||||
|
lcdFillArea(x0, y0, x1, y0+1, color);
|
||||||
|
|
||||||
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 {
|
} else {
|
||||||
dx *= 2;
|
int16_t dy, dx;
|
||||||
P = dx - dy;
|
int16_t addx = 1, addy = 1;
|
||||||
diff = P - dy;
|
int16_t P, diff;
|
||||||
|
|
||||||
for(; i<=dy; ++i) {
|
int16_t i = 0;
|
||||||
lcdDrawPixel(x0, y0, color);
|
dx = abs((int16_t)(x1 - x0));
|
||||||
if(P < 0) {
|
dy = abs((int16_t)(y1 - y0));
|
||||||
P += dx;
|
|
||||||
y0 += addy;
|
if(x0 > x1)
|
||||||
} else {
|
addx = -1;
|
||||||
P += diff;
|
if(y0 > y1)
|
||||||
x0 += addx;
|
addy = -1;
|
||||||
y0 += addy;
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue