Merge pull request #2 from EdgeTX/draw-routines-added
Added drawFilledTriangle()
This commit is contained in:
@@ -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
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user