diff --git a/src/lv_core/lv_refr.c b/src/lv_core/lv_refr.c index c0932aefa..c017491d6 100644 --- a/src/lv_core/lv_refr.c +++ b/src/lv_core/lv_refr.c @@ -24,7 +24,7 @@ * DEFINES *********************/ /* Draw translucent random colored areas on the invalidated (redrawn) areas*/ -#define MASK_AREA_DEBUG 1 +#define MASK_AREA_DEBUG 0 /********************** * TYPEDEFS diff --git a/src/lv_draw/lv_draw_arc.c b/src/lv_draw/lv_draw_arc.c index 2708bb3c8..496bca259 100644 --- a/src/lv_draw/lv_draw_arc.c +++ b/src/lv_draw/lv_draw_arc.c @@ -298,7 +298,7 @@ static void draw_quarter_2(quarter_draw_dsc_t * q) else if((q->start_quarter == q->end_quarter && q->start_quarter != 2 && q->end_angle < q->start_angle) || (q->start_quarter == 0 && q->end_quarter == 3) || (q->start_quarter == 1 && q->end_quarter == 3) || - (q->start_quarter == 3 && q->end_quarter == 1)) { + (q->start_quarter == 1 && q->end_quarter == 0)) { /*Arc crosses here*/ quarter_area.x1 = q->center_x - q->radius; quarter_area.y1 = q->center_y - q->radius; @@ -365,8 +365,6 @@ static void draw_quarter_3(quarter_draw_dsc_t * q) } - - static void get_rounded_area(int16_t angle, lv_coord_t radius, uint8_t tickness, lv_area_t * res_area) { const uint8_t ps = 8; diff --git a/src/lv_objx/lv_arc.c b/src/lv_objx/lv_arc.c index 5ba4758de..5a9123a70 100644 --- a/src/lv_objx/lv_arc.c +++ b/src/lv_objx/lv_arc.c @@ -130,9 +130,24 @@ void lv_arc_set_start_angle(lv_obj_t * arc, int16_t start) if(start > 360) start -= 360; - ext->angle_start = start; + /*Too large move, the whole arc need to be invalidated anyway*/ + if(LV_MATH_ABS(start - ext->angle_start) >= 180) { + lv_obj_invalidate(arc); + } + /*Only a smaller incremental move*/ + else if(ext->angle_start > ext->angle_end && start > ext->angle_end) { + inv_arc_area(arc, LV_MATH_MIN(ext->angle_start, start), LV_MATH_MAX(ext->angle_start, start)); + } + /*Only a smaller incremental move*/ + else if(ext->angle_start < ext->angle_end && start < ext->angle_end) { + inv_arc_area(arc, LV_MATH_MIN(ext->angle_start, start), LV_MATH_MAX(ext->angle_start, start)); + } + /*Crossing the start angle makes the whole arc change*/ + else { + lv_obj_invalidate(arc); + } - lv_obj_invalidate(arc); + ext->angle_start = start; } /** @@ -148,9 +163,24 @@ void lv_arc_set_end_angle(lv_obj_t * arc, int16_t end) if(end > 360) end -= 360; - ext->angle_end= end; + /*Too large move, the whole arc need to be invalidated anyway*/ + if(LV_MATH_ABS(end - ext->angle_end) >= 180) { + lv_obj_invalidate(arc); + } + /*Only a smaller incremental move*/ + else if(ext->angle_end > ext->angle_start && end > ext->angle_start ) { + inv_arc_area(arc, LV_MATH_MIN(ext->angle_end, end), LV_MATH_MAX(ext->angle_end, end)); + } + /*Only a smaller incremental move*/ + else if(ext->angle_end < ext->angle_start && end < ext->angle_start ) { + inv_arc_area(arc, LV_MATH_MIN(ext->angle_end, end), LV_MATH_MAX(ext->angle_end, end)); + } + /*Crossing the end angle makes the whole arc change*/ + else { + lv_obj_invalidate(arc); + } - lv_obj_invalidate(arc); + ext->angle_end= end; } @@ -327,7 +357,7 @@ static void inv_arc_area(lv_obj_t * arc, uint16_t start_angle, uint16_t end_angl lv_area_t inv_area; - if(start_quarter == end_quarter) { + if(start_quarter == end_quarter && start_angle <= end_angle) { if(start_quarter == 0) { inv_area.y1 = y + ((lv_trigo_sin(start_angle) * rin) >> LV_TRIGO_SHIFT); inv_area.x2 = x + ((lv_trigo_sin(start_angle + 90) * rout) >> LV_TRIGO_SHIFT);