mirror of
https://github.com/lvgl/lvgl.git
synced 2025-01-28 07:03:00 +08:00
improve arc invalidation
This commit is contained in:
parent
11b2f53c06
commit
f5d20f5e30
@ -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 0
|
#define MASK_AREA_DEBUG 1
|
||||||
|
|
||||||
/**********************
|
/**********************
|
||||||
* TYPEDEFS
|
* TYPEDEFS
|
||||||
|
@ -28,6 +28,7 @@
|
|||||||
**********************/
|
**********************/
|
||||||
static lv_design_res_t lv_arc_design(lv_obj_t * arc, const lv_area_t * clip_area, lv_design_mode_t mode);
|
static lv_design_res_t lv_arc_design(lv_obj_t * arc, const lv_area_t * clip_area, lv_design_mode_t mode);
|
||||||
static lv_res_t lv_arc_signal(lv_obj_t * arc, lv_signal_t sign, void * param);
|
static lv_res_t lv_arc_signal(lv_obj_t * arc, lv_signal_t sign, void * param);
|
||||||
|
static void inv_arc_area(lv_obj_t * arc, uint16_t start_angle, uint16_t end_angle);
|
||||||
|
|
||||||
/**********************
|
/**********************
|
||||||
* STATIC VARIABLES
|
* STATIC VARIABLES
|
||||||
@ -166,13 +167,14 @@ void lv_arc_set_angles(lv_obj_t * arc, uint16_t start, uint16_t end)
|
|||||||
lv_arc_ext_t * ext = lv_obj_get_ext_attr(arc);
|
lv_arc_ext_t * ext = lv_obj_get_ext_attr(arc);
|
||||||
|
|
||||||
if(end > 360) end -= 360;
|
if(end > 360) end -= 360;
|
||||||
|
|
||||||
if(start > 360) start -= 360;
|
if(start > 360) start -= 360;
|
||||||
|
|
||||||
|
inv_arc_area(arc, ext->angle_start, ext->angle_end);
|
||||||
|
|
||||||
ext->angle_start = start;
|
ext->angle_start = start;
|
||||||
ext->angle_end = end;
|
ext->angle_end = end;
|
||||||
|
|
||||||
lv_obj_invalidate(arc);
|
inv_arc_area(arc, ext->angle_start, ext->angle_end);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -317,27 +319,80 @@ static void inv_arc_area(lv_obj_t * arc, uint16_t start_angle, uint16_t end_angl
|
|||||||
{
|
{
|
||||||
uint8_t start_quarter = start_angle / 90;
|
uint8_t start_quarter = start_angle / 90;
|
||||||
uint8_t end_quarter = end_angle / 90;
|
uint8_t end_quarter = end_angle / 90;
|
||||||
lv_coord_t r = (LV_MATH_MIN(lv_obj_get_width(arc), lv_obj_get_height(arc))) / 2;
|
|
||||||
lv_coord_t x = arc->coords.x1 + lv_obj_get_width(arc) / 2;
|
lv_coord_t x = arc->coords.x1 + lv_obj_get_width(arc) / 2;
|
||||||
lv_coord_t y = arc->coords.y1 + lv_obj_get_height(arc) / 2;
|
lv_coord_t y = arc->coords.y1 + lv_obj_get_height(arc) / 2;
|
||||||
const lv_style_t style = lv_arc_get_style(arc, LV_ARC_STYLE_MAIN);
|
lv_coord_t rout = (LV_MATH_MIN(lv_obj_get_width(arc), lv_obj_get_height(arc))) / 2;
|
||||||
lv_coord_t w = style->line.width;
|
const lv_style_t * style = lv_arc_get_style(arc, LV_ARC_STYLE_MAIN);
|
||||||
|
lv_coord_t rin = rout - style->line.width;
|
||||||
|
|
||||||
lv_area_t inv_area;
|
lv_area_t inv_area;
|
||||||
|
|
||||||
if(start_quarter == end_quarter) {
|
if(start_quarter == end_quarter) {
|
||||||
if(start_quarter == 3) {
|
if(start_quarter == 0) {
|
||||||
/*Small arc here*/
|
inv_area.y1 = y + ((lv_trigo_sin(start_angle) * rin) >> LV_TRIGO_SHIFT);
|
||||||
inv_area.x1 = x + ((lv_trigo_sin(start_angle + 90) * (r - q->width)) >> LV_TRIGO_SHIFT);
|
inv_area.x2 = x + ((lv_trigo_sin(start_angle + 90) * rout) >> LV_TRIGO_SHIFT);
|
||||||
inv_area.y1 = y + ((lv_trigo_sin(start_angle) * (r)) >> LV_TRIGO_SHIFT);
|
|
||||||
|
|
||||||
inv_area.x2 = x + ((lv_trigo_sin(end_angle + 90) * (r)) >> LV_TRIGO_SHIFT);
|
inv_area.y2 = y + ((lv_trigo_sin(end_angle) * rout) >> LV_TRIGO_SHIFT);
|
||||||
inv_area.y2 = y + ((lv_trigo_sin(end_angle) * (r - q->width)) >> LV_TRIGO_SHIFT);
|
inv_area.x1 = x + ((lv_trigo_sin(end_angle + 90) * rin) >> LV_TRIGO_SHIFT);
|
||||||
|
|
||||||
bool ok = lv_area_intersect(&quarter_area, &quarter_area, q->clip_area);
|
lv_obj_invalidate_area(arc, &inv_area);
|
||||||
if(ok) lv_draw_rect(q->draw_area, &quarter_area, q->style, q->opa_scale);
|
|
||||||
}
|
}
|
||||||
|
else if(start_quarter == 1) {
|
||||||
|
inv_area.y2 = y + ((lv_trigo_sin(start_angle) * rout) >> LV_TRIGO_SHIFT);
|
||||||
|
inv_area.x2 = x + ((lv_trigo_sin(start_angle + 90) * rin) >> LV_TRIGO_SHIFT);
|
||||||
|
|
||||||
|
inv_area.y1 = y + ((lv_trigo_sin(end_angle) * rin) >> LV_TRIGO_SHIFT);
|
||||||
|
inv_area.x1 = x + ((lv_trigo_sin(end_angle + 90) * rout) >> LV_TRIGO_SHIFT);
|
||||||
|
|
||||||
|
lv_obj_invalidate_area(arc, &inv_area);
|
||||||
|
}
|
||||||
|
else if(start_quarter == 2) {
|
||||||
|
inv_area.x1 = x + ((lv_trigo_sin(start_angle + 90) * rout) >> LV_TRIGO_SHIFT);
|
||||||
|
inv_area.y2 = y + ((lv_trigo_sin(start_angle) * rin) >> LV_TRIGO_SHIFT);
|
||||||
|
|
||||||
|
inv_area.y1 = y + ((lv_trigo_sin(end_angle) * rout) >> LV_TRIGO_SHIFT);
|
||||||
|
inv_area.x2 = x + ((lv_trigo_sin(end_angle + 90) * rin) >> LV_TRIGO_SHIFT);
|
||||||
|
|
||||||
|
lv_obj_invalidate_area(arc, &inv_area);
|
||||||
|
}
|
||||||
|
else if(start_quarter == 3) {
|
||||||
|
/*Small arc here*/
|
||||||
|
inv_area.x1 = x + ((lv_trigo_sin(start_angle + 90) * rin) >> LV_TRIGO_SHIFT);
|
||||||
|
inv_area.y1 = y + ((lv_trigo_sin(start_angle) * rout) >> LV_TRIGO_SHIFT);
|
||||||
|
|
||||||
|
inv_area.x2 = x + ((lv_trigo_sin(end_angle + 90) * rout) >> LV_TRIGO_SHIFT);
|
||||||
|
inv_area.y2 = y + ((lv_trigo_sin(end_angle) * rin) >> LV_TRIGO_SHIFT);
|
||||||
|
|
||||||
|
lv_obj_invalidate_area(arc, &inv_area);
|
||||||
|
}
|
||||||
|
|
||||||
|
} else if(start_quarter == 0 && end_quarter == 1) {
|
||||||
|
inv_area.x1 = x + ((lv_trigo_sin(end_angle + 90) * rout) >> LV_TRIGO_SHIFT);
|
||||||
|
inv_area.y1 = y + ((LV_MATH_MIN(lv_trigo_sin(end_angle), 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.y2 = y + rout;
|
||||||
|
lv_obj_invalidate_area(arc, &inv_area);
|
||||||
|
} else if(start_quarter == 1 && end_quarter == 2) {
|
||||||
|
inv_area.x1 = x - rout;
|
||||||
|
inv_area.y1 = y + ((lv_trigo_sin(end_angle) * rout) >> LV_TRIGO_SHIFT);
|
||||||
|
inv_area.x2 = x + ((LV_MATH_MAX(lv_trigo_sin(start_angle + 90) , lv_trigo_sin(end_angle + 90)) * rin) >> LV_TRIGO_SHIFT);
|
||||||
|
inv_area.y2 = y + ((lv_trigo_sin(start_angle) * rout) >> LV_TRIGO_SHIFT);
|
||||||
|
lv_obj_invalidate_area(arc, &inv_area);
|
||||||
|
} else if(start_quarter == 2 && end_quarter == 3) {
|
||||||
|
inv_area.x1 = x + ((lv_trigo_sin(start_angle + 90) * rout) >> LV_TRIGO_SHIFT);
|
||||||
|
inv_area.y1 = y - rout;
|
||||||
|
inv_area.x2 = x + ((lv_trigo_sin(end_angle + 90) * rout) >> LV_TRIGO_SHIFT);
|
||||||
|
inv_area.y2 = y + (LV_MATH_MAX(lv_trigo_sin(end_angle) * rin, lv_trigo_sin(start_angle) * rin) >> LV_TRIGO_SHIFT);
|
||||||
|
lv_obj_invalidate_area(arc, &inv_area);
|
||||||
|
} else if(start_quarter == 3 && end_quarter == 0) {
|
||||||
|
inv_area.x1 = x + ((LV_MATH_MIN(lv_trigo_sin(end_angle + 90), lv_trigo_sin(start_angle + 90)) * rin) >> LV_TRIGO_SHIFT);
|
||||||
|
inv_area.y1 = y + ((lv_trigo_sin(start_angle) * rout) >> LV_TRIGO_SHIFT);
|
||||||
|
inv_area.x2 = x + rout;
|
||||||
|
inv_area.y2 = y + ((lv_trigo_sin(end_angle) * rout) >> LV_TRIGO_SHIFT);
|
||||||
|
|
||||||
|
lv_obj_invalidate_area(arc, &inv_area);
|
||||||
|
} else {
|
||||||
|
lv_obj_invalidate(arc);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -87,7 +87,7 @@ lv_obj_t * lv_preload_create(lv_obj_t * par, const lv_obj_t * copy)
|
|||||||
ext->arc_length = LV_PRELOAD_DEF_ARC_LENGTH;
|
ext->arc_length = LV_PRELOAD_DEF_ARC_LENGTH;
|
||||||
ext->anim_type = LV_PRELOAD_DEF_ANIM;
|
ext->anim_type = LV_PRELOAD_DEF_ANIM;
|
||||||
ext->anim_dir = LV_PRELOAD_DIR_FORWARD;
|
ext->anim_dir = LV_PRELOAD_DIR_FORWARD;
|
||||||
ext->time = LV_PRELOAD_DEF_SPIN_TIME * 5;
|
ext->time = LV_PRELOAD_DEF_SPIN_TIME * 10;
|
||||||
|
|
||||||
/*The signal and design functions are not copied so set them here*/
|
/*The signal and design functions are not copied so set them here*/
|
||||||
lv_obj_set_signal_cb(new_preload, lv_preload_signal);
|
lv_obj_set_signal_cb(new_preload, lv_preload_signal);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user