diff --git a/radio/src/thirdparty/libopenui/src/bitmapbuffer.cpp b/radio/src/thirdparty/libopenui/src/bitmapbuffer.cpp index 859653694..3c74f87fb 100755 --- a/radio/src/thirdparty/libopenui/src/bitmapbuffer.cpp +++ b/radio/src/thirdparty/libopenui/src/bitmapbuffer.cpp @@ -264,86 +264,124 @@ void BitmapBuffer::drawFilledCircle(coord_t x, coord_t y, coord_t radius, LcdFla } class Slope { -public: - explicit Slope(int angle) { - if (angle < 0) - angle += 360; - if (angle > 360) - angle %= 360; - float radians = float(angle) * (M_PI / 180.0f); - if (angle == 0) { - left = false; - value = 100000; + public: + explicit Slope(int angle) { + if (angle < 0) + angle += 360; + if (angle > 360) + angle %= 360; + float radians = float(angle) * (M_PI / 180.0f); + if (angle == 0) { + left = false; + value = 100000; + } + else if (angle == 360) { + left = true; + value = 100000; + } + else if (angle >= 180) { + left = true; + value = -(cosf(radians) * 100 / sinf(radians)); + } + else { + left = false; + value = (cosf(radians) * 100 / sinf(radians)); + } } - else if (angle == 360) { - left = true; - value = 100000; - } - else if (angle >= 180) { - left = true; - value = -(cosf(radians) * 100 / sinf(radians)); - } - else { - left = false; - value = (cosf(radians) * 100 / sinf(radians)); - } - } - Slope(bool left, int value): + Slope(bool left, int value): left(left), value(value) - { - } + { + } - bool isBetween(const Slope & start, const Slope & end) const - { - if (left) { - if (start.left) { - if (end.left) - return end.value > start.value ? (value <= end.value && value >= start.value) : (value <= end.value || value >= start.value); - else - return value >= start.value; + bool isBetween(const Slope & start, const Slope & end) const + { + if (left) { + if (start.left) { + if (end.left) + return end.value > start.value ? (value <= end.value && value >= start.value) : (value <= end.value || value >= start.value); + else + return value >= start.value; + } + else { + if (end.left) + return value <= end.value; + else + return end.value > start.value; + } } else { - if (end.left) - return value <= end.value; - else - return end.value > start.value; + if (start.left) { + if (end.left) + return start.value > end.value; + else + return value >= end.value; + } + else { + if (end.left) + return value <= start.value; + else + return end.value < start.value ? (value >= end.value && value <= start.value) : (value <= start.value || value >= end.value); + } } } - else { - if (start.left) { - if (end.left) - return start.value > end.value; - else - return value >= end.value; - } - else { - if (end.left) - return value <= start.value; - else - return end.value < start.value ? (value >= end.value && value <= start.value) : (value <= start.value || value >= end.value); - } + + Slope & invertVertical() + { + value = -value; + return *this; } - } - Slope & invertVertical() - { - value = -value; - return *this; - } + Slope & invertHorizontal() + { + left = !left; + return *this; + } - Slope & invertHorizontal() - { - left = !left; - return *this; - } - -protected: - bool left; - int value; + protected: + bool left; + int value; }; +void BitmapBuffer::drawBitmapPatternPie(coord_t x, coord_t y, const uint8_t * img, LcdFlags flags, int startAngle, int endAngle) +{ + if (endAngle == startAngle) { + endAngle += 1; + } + + Slope startSlope(startAngle); + Slope endSlope(endAngle); + + pixel_t color = lcdColorTable[COLOR_IDX(flags)]; + APPLY_OFFSET(); + + coord_t width = *((uint16_t *)img); + coord_t height = *(((uint16_t *)img) + 1); + const uint8_t * q = img + 4; + + int w2 = width / 2; + int h2 = height / 2; + + for (int y1 = h2 - 1; y1 >= 0; y1--) { + for (int x1 = w2 - 1; x1 >= 0; x1--) { + Slope slope(false, x1 == 0 ? 99000 : y1 * 100 / x1); + if (slope.isBetween(startSlope, endSlope)) { + drawAlphaPixel(x + w2 + x1, y + h2 - y1, q[(h2 - y1) * width + w2 + x1], color); + } + if (slope.invertVertical().isBetween(startSlope, endSlope)) { + drawAlphaPixel(x + w2 + x1, y + h2 + y1, q[(h2 + y1) * width + w2 + x1], color); + } + if (slope.invertHorizontal().isBetween(startSlope, endSlope)) { + drawAlphaPixel(x + w2 - x1, y + h2 + y1, q[(h2 + y1) * width + w2 - x1], color); + } + if (slope.invertVertical().isBetween(startSlope, endSlope)) { + drawAlphaPixel(x + w2 - x1, y + h2 - y1, q[(h2 - y1) * width + w2 - x1], color); + } + } + } +} + void BitmapBuffer::drawAnnulusSector(coord_t x, coord_t y, coord_t internalRadius, coord_t externalRadius, int startAngle, int endAngle, LcdFlags flags) { if (endAngle == startAngle) { @@ -667,43 +705,6 @@ void drawSolidRect(BitmapBuffer * dc, coord_t x, coord_t y, coord_t w, coord_t h // } //} // -void BitmapBuffer::drawBitmapPatternPie(coord_t x, coord_t y, const uint8_t * img, LcdFlags flags, int startAngle, int endAngle) -{ - if (endAngle == startAngle) { - endAngle += 1; - } - - Slope startSlope(startAngle); - Slope endSlope(endAngle); - - pixel_t color = lcdColorTable[COLOR_IDX(flags)]; - APPLY_OFFSET(); - - coord_t width = *((uint16_t *)img); - coord_t height = *(((uint16_t *)img) + 1); - const uint8_t * q = img + 4; - - int w2 = width / 2; - int h2 = height / 2; - - for (int y1 = h2 - 1; y1 >= 0; y1--) { - for (int x1 = w2 - 1; x1 >= 0; x1--) { - Slope slope(false, x1 == 0 ? 99000 : y1 * 100 / x1); - if (slope.isBetween(startSlope, endSlope)) { - drawAlphaPixel(x + w2 + x1, y + h2 - y1, q[(h2 - y1) * width + w2 + x1], color); - } - if (slope.invertVertical().isBetween(startSlope, endSlope)) { - drawAlphaPixel(x + w2 + x1, y + h2 + y1, q[(h2 + y1) * width + w2 + x1], color); - } - if (slope.invertHorizontal().isBetween(startSlope, endSlope)) { - drawAlphaPixel(x + w2 - x1, y + h2 + y1, q[(h2 + y1) * width + w2 - x1], color); - } - if (slope.invertVertical().isBetween(startSlope, endSlope)) { - drawAlphaPixel(x + w2 - x1, y + h2 - y1, q[(h2 - y1) * width + w2 - x1], color); - } - } - } -} BitmapBuffer * BitmapBuffer::loadBitmap(const char * filename) { @@ -1046,9 +1047,9 @@ int stbc_eof(void *user) // callbacks for stb-image const stbi_io_callbacks stbCallbacks = { - stbc_read, - stbc_skip, - stbc_eof + stbc_read, + stbc_skip, + stbc_eof }; BitmapBuffer * BitmapBuffer::load_stb(const char * filename)