Merge pull request #2 from EdgeTX/draw-routines-added

Added drawFilledTriangle()
This commit is contained in:
Raphael Coeffic
2021-06-05 21:28:02 +02:00
committed by GitHub
2 changed files with 53 additions and 1 deletions
+51
View File
@@ -551,6 +551,57 @@ void BitmapBuffer::invertRect(coord_t x, coord_t y, coord_t w, coord_t h, LcdFla
}
}
void BitmapBuffer::drawFilledTriangle(coord_t x0, coord_t y0, coord_t x1, coord_t y1, coord_t x2, coord_t y2, LcdFlags flags, uint8_t opacity)
{
coord_t a, b;
#define SWAP(a, b) {coord_t tmp = b; b = a; a = tmp;}
if (y0 > y1) { SWAP(y0, y1); SWAP(x0, x1); }
if (y1 > y2) { SWAP(y2, y1); SWAP(x2, x1); }
if (y0 > y1) { SWAP(y0, y1); SWAP(x0, x1); }
if (y0 == y2) { // Handle awkward all-on-same-line case as its own thing
a = b = x0;
if (x1 < a)
a = x1;
else if (x1 > b)
b = x1;
if (x2 < a)
a = x2;
else if (x2 > b)
b = x2;
drawHorizontalLine(a, y0, b - a + 1, SOLID, flags, opacity);
return;
}
coord_t dx01 = x1 - x0, dy01 = y1 - y0, dx02 = x2 - x0, dy02 = y2 - y0, dx12 = x2 - x1, dy12 = y2 - y1;
coord_t sa = 0, sb = 0;
coord_t last = (y1 == y2) ? y1 : y1 - 1;
coord_t y;
for (y = y0; y <= last; y++) {
a = x0 + sa / dy01;
b = x0 + sb / dy02;
sa += dx01;
sb += dx02;
if (a > b) SWAP(a, b);
drawHorizontalLine(a, y, b - a + 1, SOLID, flags, opacity);
}
sa = dx12 * (y - y1);
sb = dx02 * (y - y0);
for (; y <= y2; y++) {
a = x1 + sa / dy12;
b = x0 + sb / dy02;
sa += dx12;
sb += dx02;
if (a > b) SWAP(a, b);
drawHorizontalLine(a, y, b - a + 1, SOLID, flags, opacity);
}
}
void BitmapBuffer::drawCircle(coord_t x, coord_t y, coord_t radius, LcdFlags flags)
{
int x1 = radius;
+2 -1
View File
@@ -280,6 +280,8 @@ class BitmapBuffer: public BitmapBufferBase<pixel_t>
void invertRect(coord_t x, coord_t y, coord_t w, coord_t h, LcdFlags flags = 0);
void drawFilledTriangle(coord_t x1, coord_t y1, coord_t x2, coord_t y2, coord_t x3, coord_t y3, LcdFlags flags = 0, uint8_t opacity = 0);
void drawCircle(coord_t x, coord_t y, coord_t radius, LcdFlags flags = 0);
void drawFilledCircle(coord_t x, coord_t y, coord_t radius, LcdFlags flags = 0);
@@ -413,7 +415,6 @@ class BitmapBuffer: public BitmapBufferBase<pixel_t>
return &data[y * _width + x];
}
inline void drawPixelAbs(coord_t x, coord_t y, pixel_t value)
{
pixel_t * p = getPixelPtrAbs(x, y);