diff --git a/radio/src/thirdparty/libopenui/src/bitmapbuffer.cpp b/radio/src/thirdparty/libopenui/src/bitmapbuffer.cpp index b178dfe04..44d823a8a 100755 --- a/radio/src/thirdparty/libopenui/src/bitmapbuffer.cpp +++ b/radio/src/thirdparty/libopenui/src/bitmapbuffer.cpp @@ -45,15 +45,10 @@ void BitmapBuffer::drawHorizontalLine(coord_t x, coord_t y, coord_t w, uint8_t p { APPLY_OFFSET(); - // line is off-screen - if (y >= _height || y >= ymax || y < ymin) + coord_t h = 1; + if (!applyClippingRect(x, y, w, h)) return; - // clip width - if (x + w > _width) { - w = _width - x; - } - drawHorizontalLineAbs(x, y, w, pat, flags); } @@ -87,24 +82,8 @@ void BitmapBuffer::drawVerticalLine(coord_t x, coord_t y, coord_t h, uint8_t pat { APPLY_OFFSET(); - if (x < xmin || x >= xmax) - return; - - if (h < 0) { - y += h; - h = -h; - } - - if (y < ymin) { - h += y - ymin; - y = ymin; - } - - if (y + h > ymax) { - h = ymax - y; - } - - if (h <= 0) + coord_t w = 1; + if (!applyClippingRect(x, y, w, h)) return; pixel_t color = lcdColorTable[COLOR_IDX(flags)]; @@ -198,27 +177,7 @@ void BitmapBuffer::drawSolidFilledRect(coord_t x, coord_t y, coord_t w, coord_t { APPLY_OFFSET(); - if (x >= xmax || y >= ymax) - return; - - if (h < 0) { - y += h; - h = -h; - } - if (y < ymin) { - h += y-ymin; - y = ymin; - } - if (x < xmin) { - w += x - xmin; - x = xmin; - } - if (y + h > ymax) - h = ymax - y; - if (x + w > xmax) - w = xmax - x; - - if (!data || h<=0 || w<=0) + if (!applyClippingRect(x, y, w, h)) return; DMAFillRect(data, _width, _height, x, y, w, h, lcdColorTable[COLOR_IDX(flags)]); @@ -228,34 +187,9 @@ void BitmapBuffer::drawFilledRect(coord_t x, coord_t y, coord_t w, coord_t h, ui { APPLY_OFFSET(); - // start is off-screen - if (x >= xmax || y >= ymax) + if (!applyClippingRect(x, y, w, h)) return; - // make height positive - if (h < 0) { - y += h; - h = -h; - } - - // clip y - if (y < ymin) { - h += y-ymin; - y = ymin; - } - - if (y + h > ymax) - h = ymax - y; - - // clip x - if (x < xmin) { - w += x - xmin; - x = xmin; - } - - if (x + w > xmax) - w = xmax - x; - for (coord_t i = y; i < y + h; i++) { drawHorizontalLineAbs(x, i, w, pat, flags); } diff --git a/radio/src/thirdparty/libopenui/src/bitmapbuffer.h b/radio/src/thirdparty/libopenui/src/bitmapbuffer.h index 1c0c161d0..e2440c526 100755 --- a/radio/src/thirdparty/libopenui/src/bitmapbuffer.h +++ b/radio/src/thirdparty/libopenui/src/bitmapbuffer.h @@ -515,6 +515,41 @@ class BitmapBuffer: public BitmapBufferBase protected: static BitmapBuffer * load_bmp(const char * filename); static BitmapBuffer * load_stb(const char * filename); + + inline bool applyClippingRect(coord_t & x, coord_t & y, coord_t & w, coord_t & h) + { + if (h < 0) { + y += h; + h = -h; + } + + if (w < 0) { + x += w; + w = -w; + } + + if (x >= xmax || y >= ymax) + return false; + + if (y < ymin) { + h += y - ymin; + y = ymin; + } + + if (x < xmin) { + w += x - xmin; + x = xmin; + } + + if (y + h > ymax) + h = ymax - y; + + if (x + w > xmax) + w = xmax - x; + + return data && h > 0 && w > 0; + } + uint8_t drawChar(coord_t x, coord_t y, const uint8_t * font, const uint16_t * spec, unsigned int index, LcdFlags flags); void drawHorizontalLineAbs(coord_t x, coord_t y, coord_t w, uint8_t pat, LcdFlags flags); };