From 32cf4739e128555e67a0fadb16dd4067f38c3469 Mon Sep 17 00:00:00 2001 From: olliw42 Date: Mon, 31 May 2021 21:53:37 +0200 Subject: [PATCH] Added drawFilledTriangle() --- .../thirdparty/libopenui/src/bitmapbuffer.cpp | 51 +++++++++++++++++++ .../thirdparty/libopenui/src/bitmapbuffer.h | 3 +- 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/radio/src/thirdparty/libopenui/src/bitmapbuffer.cpp b/radio/src/thirdparty/libopenui/src/bitmapbuffer.cpp index b5b084766..2e29f857e 100755 --- a/radio/src/thirdparty/libopenui/src/bitmapbuffer.cpp +++ b/radio/src/thirdparty/libopenui/src/bitmapbuffer.cpp @@ -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; diff --git a/radio/src/thirdparty/libopenui/src/bitmapbuffer.h b/radio/src/thirdparty/libopenui/src/bitmapbuffer.h index 51d244497..18c7df03a 100755 --- a/radio/src/thirdparty/libopenui/src/bitmapbuffer.h +++ b/radio/src/thirdparty/libopenui/src/bitmapbuffer.h @@ -280,6 +280,8 @@ class BitmapBuffer: public BitmapBufferBase 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 return &data[y * _width + x]; } - inline void drawPixelAbs(coord_t x, coord_t y, pixel_t value) { pixel_t * p = getPixelPtrAbs(x, y);