Window.cpp: Fixed the line drawing code and improved it's speed.
This commit is contained in:
parent
66c0124072
commit
b5343b59e5
@ -29,9 +29,9 @@ public:
|
|||||||
void setSubPixel(accum88 x, accum88 y, CRGB* color, SubpixelRenderingMode m = SUBPIXEL_RENDERING_ADD);
|
void setSubPixel(accum88 x, accum88 y, CRGB* color, SubpixelRenderingMode m = SUBPIXEL_RENDERING_ADD);
|
||||||
void setPixelByIndex(uint16_t index, CRGB* color);
|
void setPixelByIndex(uint16_t index, CRGB* color);
|
||||||
void raisePixel(uint8_t x, uint8_t y, CRGB* color);
|
void raisePixel(uint8_t x, uint8_t y, CRGB* color);
|
||||||
void line(accum88 x1, accum88 y1, accum88 x2, accum88 y2, CRGB* color);
|
void line(saccum78 x1, saccum78 y1, saccum78 x2, saccum78 y2, CRGB* color);
|
||||||
void lineWithAngle(uint8_t x, uint8_t y, uint8_t angle, uint8_t length, CRGB* color);
|
void lineWithAngle(uint8_t x, uint8_t y, uint16_t angle, uint8_t length, CRGB* color);
|
||||||
void lineWithAngle(uint8_t x, uint8_t y, uint8_t angle, uint8_t startdist, uint8_t length, CRGB* color);
|
void lineWithAngle(uint8_t x, uint8_t y, uint16_t angle, uint8_t startdist, uint8_t length, CRGB* color);
|
||||||
void circle(uint8_t x, uint8_t y, uint8_t r, CRGB* color);
|
void circle(uint8_t x, uint8_t y, uint8_t r, CRGB* color);
|
||||||
uint16_t coordsToGlobalIndex(uint8_t x, uint8_t y);
|
uint16_t coordsToGlobalIndex(uint8_t x, uint8_t y);
|
||||||
uint16_t localToGlobalIndex(uint16_t);
|
uint16_t localToGlobalIndex(uint16_t);
|
||||||
|
@ -150,27 +150,29 @@ void Window::fadeToBlackBy(fract8 speed) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Window::line(accum88 x1, accum88 y1, accum88 x2, accum88 y2, CRGB* color) {
|
void Window::line(saccum78 x1, saccum78 y1, saccum78 x2, saccum78 y2, CRGB* color) {
|
||||||
// Bresenham algorithm
|
// Bresenham algorithm
|
||||||
const uint8_t stepsize = 32;
|
const uint8_t stepsize = 64;
|
||||||
saccum78 dx = x2-x1;
|
saccum78 dx = abs(x2 - x1);
|
||||||
saccum78 dy = y2-y1;
|
saccum78 dy = -abs(y2 - y1);
|
||||||
|
int8_t sx = x1<x2 ? 1 : -1;
|
||||||
accum88 x = x1;
|
int8_t sy = y1<y2 ? 1 : -1;
|
||||||
accum88 y = y1;
|
saccum78 err = dx + dy;
|
||||||
|
saccum78 e2;
|
||||||
saccum78 p = 2*dy - dx;
|
uint8_t step = 0;
|
||||||
|
while (1) {
|
||||||
while (x < x2) {
|
if (step == 0) setSubPixel(x1, y1, color, SUBPIXEL_RENDERING_RAISE);
|
||||||
if (p >= 0) {
|
if (++step >= stepsize) step=0;
|
||||||
setSubPixel(x, y, color, SUBPIXEL_RENDERING_RAISE);
|
if (x1>>8==x2>>8 && y1>>8==y2>>8) break;
|
||||||
y+=stepsize;
|
e2 = 2*err;
|
||||||
p = p + 2*dy - 2*dx;
|
if (e2 > dy) {
|
||||||
} else {
|
err += dy;
|
||||||
setSubPixel(x, y, color, SUBPIXEL_RENDERING_RAISE);
|
x1 += sx;
|
||||||
p = p + 2*dy;
|
}
|
||||||
|
if (e2 < dx) {
|
||||||
|
err += dx;
|
||||||
|
y1 += sy;
|
||||||
}
|
}
|
||||||
x+=stepsize;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -202,22 +204,23 @@ void Window::circle(uint8_t x0, uint8_t y0, uint8_t radius, CRGB* color) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Window::lineWithAngle(uint8_t x, uint8_t y, uint8_t angle, uint8_t length, CRGB* color) {
|
void Window::lineWithAngle(uint8_t x, uint8_t y, uint16_t angle, uint8_t length, CRGB* color) {
|
||||||
lineWithAngle(x, y, angle, 0, length, color);
|
lineWithAngle(x, y, angle, 0, length, color);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Window::lineWithAngle(uint8_t x, uint8_t y, uint8_t angle, uint8_t startdist, uint8_t length, CRGB* color) {
|
void Window::lineWithAngle(uint8_t x, uint8_t y, uint16_t angle, uint8_t startdist, uint8_t length, CRGB* color) {
|
||||||
accum88 x1 = x<<8;
|
//LOGln("lineWithAngle called. x: %d.%03d, y: %d.%03d, angle: %d", x>>8, x&0xFF, y>>8, y&0xFF, angle);
|
||||||
accum88 y1 = y<<8;
|
saccum78 x1 = x<<8;
|
||||||
|
saccum78 y1 = y<<8;
|
||||||
|
|
||||||
if (startdist > 0) {
|
if (startdist > 0) {
|
||||||
x1 = (x<<8) + (startdist<<8) * cos8(angle) / 256;
|
x1 = (x<<8) + (startdist<<8) * cos16(angle) / 0x10000;
|
||||||
y1 = (y<<8) + (startdist<<8) * sin8(angle) / 256;
|
y1 = (y<<8) + (startdist<<8) * sin16(angle) / 0x10000;
|
||||||
}
|
}
|
||||||
|
|
||||||
accum88 x2 = (x<<8) + (startdist + length) * cos16(angle);
|
saccum78 x2 = (x<<8) + ((startdist + length)<<8) * cos16(angle) / 0x10000;
|
||||||
accum88 y2 = (y<<8) + (startdist + length) * sin16(angle);
|
saccum78 y2 = (y<<8) + ((startdist + length)<<8) * sin16(angle) / 0x10000;
|
||||||
|
//LOGln("x1: %d.%03d, y1: %d.%03d, x2: %d.%03d, y2: %d.%03d", x1>>8, x1&0xFF, y1>>8, y1&0xFF, x2>>8, x2&0xFF, y2>>8, y2&0xFF);
|
||||||
line(x1, y1, x2, y2, color);
|
line(x1, y1, x2, y2, color);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user