further improve arc invalidation
This commit is contained in:
@@ -24,7 +24,7 @@
|
|||||||
* DEFINES
|
* DEFINES
|
||||||
*********************/
|
*********************/
|
||||||
/* Draw translucent random colored areas on the invalidated (redrawn) areas*/
|
/* Draw translucent random colored areas on the invalidated (redrawn) areas*/
|
||||||
#define MASK_AREA_DEBUG 1
|
#define MASK_AREA_DEBUG 0
|
||||||
|
|
||||||
/**********************
|
/**********************
|
||||||
* TYPEDEFS
|
* TYPEDEFS
|
||||||
|
|||||||
@@ -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) ||
|
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 == 0 && q->end_quarter == 3) ||
|
||||||
(q->start_quarter == 1 && 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*/
|
/*Arc crosses here*/
|
||||||
quarter_area.x1 = q->center_x - q->radius;
|
quarter_area.x1 = q->center_x - q->radius;
|
||||||
quarter_area.y1 = q->center_y - 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)
|
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;
|
const uint8_t ps = 8;
|
||||||
|
|||||||
@@ -130,9 +130,24 @@ void lv_arc_set_start_angle(lv_obj_t * arc, int16_t start)
|
|||||||
|
|
||||||
if(start > 360) start -= 360;
|
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;
|
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;
|
lv_area_t inv_area;
|
||||||
|
|
||||||
if(start_quarter == end_quarter) {
|
if(start_quarter == end_quarter && start_angle <= end_angle) {
|
||||||
if(start_quarter == 0) {
|
if(start_quarter == 0) {
|
||||||
inv_area.y1 = y + ((lv_trigo_sin(start_angle) * rin) >> LV_TRIGO_SHIFT);
|
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);
|
inv_area.x2 = x + ((lv_trigo_sin(start_angle + 90) * rout) >> LV_TRIGO_SHIFT);
|
||||||
|
|||||||
Reference in New Issue
Block a user