@@ -161,6 +161,46 @@ void OLEDDisplay::drawCircle(int16_t x0, int16_t y0, int16_t radius) {
161161 setPixel (x0, y0 - radius);
162162}
163163
164+ void OLEDDisplay::drawCircleQuads (int16_t x0, int16_t y0, int16_t radius, uint8_t quads) {
165+ int16_t x = 0 , y = radius;
166+ int16_t dp = 1 - radius;
167+ while (x < y) {
168+ if (dp < 0 )
169+ dp = dp + 2 * (++x) + 3 ;
170+ else
171+ dp = dp + 2 * (++x) - 2 * (--y) + 5 ;
172+ if (quads & 0x1 ) {
173+ setPixel (x0 + x, y0 - y);
174+ setPixel (x0 + y, y0 - x);
175+ }
176+ if (quads & 0x2 ) {
177+ setPixel (x0 - y, y0 - x);
178+ setPixel (x0 - x, y0 - y);
179+ }
180+ if (quads & 0x4 ) {
181+ setPixel (x0 - y, y0 + x);
182+ setPixel (x0 - x, y0 + y);
183+ }
184+ if (quads & 0x8 ) {
185+ setPixel (x0 + x, y0 + y);
186+ setPixel (x0 + y, y0 + x);
187+ }
188+ }
189+ if (quads & 0x1 && quads & 0x8 ) {
190+ setPixel (x0 + radius, y0);
191+ }
192+ if (quads & 0x4 && quads & 0x8 ) {
193+ setPixel (x0, y0 + radius);
194+ }
195+ if (quads & 0x2 && quads & 0x4 ) {
196+ setPixel (x0 - radius, y0);
197+ }
198+ if (quads & 0x1 && quads & 0x2 ) {
199+ setPixel (x0, y0 - radius);
200+ }
201+ }
202+
203+
164204void OLEDDisplay::fillCircle (int16_t x0, int16_t y0, int16_t radius) {
165205 int16_t x = 0 , y = radius;
166206 int16_t dp = 1 - radius;
@@ -289,19 +329,22 @@ void OLEDDisplay::drawVerticalLine(int16_t x, int16_t y, int16_t length) {
289329
290330void OLEDDisplay::drawProgressBar (uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint8_t progress) {
291331 uint16_t radius = height / 2 ;
292- uint16_t innerRadius = radius - 3 ;
293- setColor (WHITE);
294- drawCircle (x + radius, y + radius, radius);
295- drawRect (x+radius, y, width - 2 *radius, height);
296- drawCircle (x + width - radius, y + radius, radius);
297- setColor (BLACK);
298- fillRect (x+radius, y+1 , width - 2 *radius + 1 , height - 1 );
332+ uint16_t xRadius = x + radius;
333+ uint16_t yRadius = y + radius;
334+ uint16_t doubleRadius = 2 * radius;
335+ uint16_t innerRadius = radius - 2 ;
336+
299337 setColor (WHITE);
300- uint16_t maxProgressWidth = (width - 2 * radius) * progress / 100 ;
301- for (uint16_t i = 0 ; i < maxProgressWidth; i++) {
302- fillCircle (x + radius + i, y + radius, innerRadius);
303- }
338+ drawCircleQuads (xRadius, yRadius, radius, 0b00000110 );
339+ drawHorizontalLine (xRadius, y, width - doubleRadius + 1 );
340+ drawHorizontalLine (xRadius, y + height, width - doubleRadius + 1 );
341+ drawCircleQuads (x + width - radius, yRadius, radius, 0b00001001 );
342+
343+ uint16_t maxProgressWidth = (width - doubleRadius - 1 ) * progress / 100 ;
304344
345+ fillCircle (xRadius, yRadius, innerRadius);
346+ fillRect (xRadius + 1 , y + 2 , maxProgressWidth, height - 3 );
347+ fillCircle (xRadius + maxProgressWidth, yRadius, innerRadius);
305348}
306349
307350void OLEDDisplay::drawFastImage (int16_t xMove, int16_t yMove, int16_t width, int16_t height, const char *image) {
0 commit comments