1
0
mirror of https://github.com/lvgl/lvgl.git synced 2025-01-28 07:03:00 +08:00

Added lv_arc_set_rotation, fixed drawing full circle

This commit is contained in:
xennex22 2020-03-30 09:09:13 -07:00 committed by GitHub
parent e805e59e8c
commit 7e8f6368d6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -131,7 +131,7 @@ void lv_arc_set_start_angle(lv_obj_t * arc, uint16_t start)
lv_arc_ext_t * ext = lv_obj_get_ext_attr(arc);
start = start % 360;
if(start > 360) start -= 360;
/*Too large move, the whole arc need to be invalidated anyway*/
if(LV_MATH_ABS(start - ext->arc_angle_start) >= 180) {
@ -164,8 +164,6 @@ void lv_arc_set_end_angle(lv_obj_t * arc, uint16_t end)
lv_arc_ext_t * ext = lv_obj_get_ext_attr(arc);
end = end % 360;
/*Too large move, the whole arc need to be invalidated anyway*/
if(LV_MATH_ABS(end - ext->arc_angle_end) >= 180) {
lv_obj_invalidate(arc);
@ -199,10 +197,12 @@ 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);
if(start > 360) start -= 360;
inv_arc_area(arc, ext->arc_angle_start, ext->arc_angle_end);
ext->arc_angle_start = start % 360;
ext->arc_angle_end = end % 360;
ext->arc_angle_start = start;
ext->arc_angle_end = end;
inv_arc_area(arc, ext->arc_angle_start, ext->arc_angle_end);
}
@ -218,7 +218,7 @@ void lv_arc_set_bg_start_angle(lv_obj_t * arc, uint16_t start)
lv_arc_ext_t * ext = lv_obj_get_ext_attr(arc);
start = start % 360;
if(start > 360) start -= 360;
/*Too large move, the whole arc need to be invalidated anyway*/
if(LV_MATH_ABS(start - ext->bg_angle_start) >= 180) {
@ -251,8 +251,6 @@ void lv_arc_set_bg_end_angle(lv_obj_t * arc, uint16_t end)
lv_arc_ext_t * ext = lv_obj_get_ext_attr(arc);
end = end % 360;
/*Too large move, the whole arc need to be invalidated anyway*/
if(LV_MATH_ABS(end - ext->bg_angle_end) >= 180) {
lv_obj_invalidate(arc);
@ -284,15 +282,32 @@ void lv_arc_set_bg_angles(lv_obj_t * arc, uint16_t start, uint16_t end)
LV_ASSERT_OBJ(arc, LV_OBJX_NAME);
lv_arc_ext_t * ext = lv_obj_get_ext_attr(arc);
if(start > 360) start -= 360;
inv_arc_area(arc, ext->bg_angle_start, ext->bg_angle_end);
ext->bg_angle_start = start % 360;
ext->bg_angle_end = end % 360;
ext->bg_angle_start = start;
ext->bg_angle_end = end;
inv_arc_area(arc, ext->bg_angle_start, ext->bg_angle_end);
}
/**
* Set the rotation for the whole arc
* @param arc pointer to an arc object
* @param rotation_angle rotation angle
*/
void lv_arc_set_rotation(lv_obj_t * arc, uint16_t rotation_angle)
{
LV_ASSERT_OBJ(arc, LV_OBJX_NAME);
lv_arc_ext_t * ext = lv_obj_get_ext_attr(arc);
ext->rotation_angle = rotation_angle;
lv_obj_invalidate(arc);
}
/*=====================
* Getter functions
@ -405,7 +420,7 @@ static lv_design_res_t lv_arc_design(lv_obj_t * arc, const lv_area_t * clip_area
lv_draw_line_dsc_init(&arc_dsc);
lv_obj_init_draw_line_dsc(arc, LV_ARC_PART_BG, &arc_dsc);
lv_draw_arc(x, y, r, ext->bg_angle_start, ext->bg_angle_end, clip_area, &arc_dsc);
lv_draw_arc(x, y, r, ext->bg_angle_start + ext->rotation_angle, ext->bg_angle_end + ext->rotation_angle, clip_area, &arc_dsc);
lv_draw_line_dsc_init(&arc_dsc);
lv_obj_init_draw_line_dsc(arc, LV_ARC_PART_INDIC, &arc_dsc);
@ -417,7 +432,7 @@ static lv_design_res_t lv_arc_design(lv_obj_t * arc, const lv_area_t * clip_area
lv_coord_t bottom_indic = lv_obj_get_style_pad_bottom(arc, LV_ARC_PART_INDIC);
r -= LV_MATH_MAX4(left_indic, right_indic, top_indic, bottom_indic);
lv_draw_arc(x, y, r, ext->arc_angle_start, ext->arc_angle_end, clip_area, &arc_dsc);
lv_draw_arc(x, y, r, ext->arc_angle_start + ext->rotation_angle, ext->arc_angle_end + ext->rotation_angle, clip_area, &arc_dsc);
}
/*Post draw when the children are drawn*/
else if(mode == LV_DESIGN_DRAW_POST) {
@ -486,6 +501,11 @@ static lv_style_list_t * lv_arc_get_style(lv_obj_t * arc, uint8_t part)
static void inv_arc_area(lv_obj_t * arc, uint16_t start_angle, uint16_t end_angle)
{
lv_arc_ext_t * ext = lv_obj_get_ext_attr(arc);
start_angle += ext->rotation_angle;
end_angle += ext->rotation_angle;
if(start_angle >= 360) start_angle -= 360;
if(end_angle >= 360) end_angle -= 360;