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

fix overflow and reduce lines direction error

This commit is contained in:
Gabor Kiss-Vamosi 2020-03-04 12:09:29 +01:00
parent f9fa0add86
commit e1b188f705
2 changed files with 37 additions and 15 deletions

View File

@ -367,7 +367,7 @@ static void linemeter_init(void)
lv_style_init(&lmeter);
lv_style_copy(&lmeter, &panel);
lv_style_set_radius(&lmeter, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE);
lv_style_set_border_side(&lmeter, LV_STATE_DEFAULT, LV_BORDER_SIDE_LEFT | LV_BORDER_SIDE_TOP);
lv_style_set_border_side(&lmeter, LV_STATE_DEFAULT, LV_BORDER_SIDE_FULL);
lv_style_set_bg_opa(&lmeter, LV_STATE_DEFAULT, LV_OPA_COVER);
lv_style_set_pad_left(&lmeter, LV_STATE_DEFAULT, LV_DPI / 10);
lv_style_set_pad_right(&lmeter, LV_STATE_DEFAULT, LV_DPI / 10);

View File

@ -296,36 +296,56 @@ void lv_linemeter_draw_scale(lv_obj_t * lmeter, const lv_area_t * clip_area, uin
lv_style_int_t end_line_width = lv_obj_get_style_scale_end_line_width(lmeter, part);
lv_area_t mask_area;
mask_area.x1 = x_ofs - r_in;
mask_area.x2 = x_ofs + r_in-1;
mask_area.y1 = y_ofs - r_in;
mask_area.y2 = y_ofs + r_in-1;
lv_draw_mask_radius_param_t mask_param;
lv_draw_mask_radius_init(&mask_param, &mask_area, LV_RADIUS_CIRCLE, true);
int16_t mask_id = lv_draw_mask_add(&mask_param, 0);
for(i = 0; i < ext->line_cnt; i++) {
/*Calculate the position a scale label*/
int16_t angle = (i * ext->scale_angle) / (ext->line_cnt - 1) + angle_ofs;
lv_coord_t y_out = (int32_t)((int32_t)lv_trigo_sin(angle) * r_out) >> (LV_TRIGO_SHIFT - 8);
lv_coord_t x_out = (int32_t)((int32_t)lv_trigo_sin(angle + 90) * r_out) >> (LV_TRIGO_SHIFT - 8);
lv_coord_t y_in = (int32_t)((int32_t)lv_trigo_sin(angle) * r_in) >> (LV_TRIGO_SHIFT - 8);
lv_coord_t x_in = (int32_t)((int32_t)lv_trigo_sin(angle + 90) * r_in) >> (LV_TRIGO_SHIFT - 8);
int32_t y_out = (int32_t)((int32_t)lv_trigo_sin(angle) * r_out) >> (LV_TRIGO_SHIFT - 8);
int32_t x_out = (int32_t)((int32_t)lv_trigo_sin(angle + 90) * r_out) >> (LV_TRIGO_SHIFT - 8);
/*Rounding*/
if(x_out <= 0) x_out = (x_out + 127) >> 8;
else x_out = (x_out - 127) >> 8;
if(x_in <= 0) x_in = (x_in + 127) >> 8;
else x_in = (x_in - 127) >> 8;
if(y_out <= 0) y_out = (y_out + 127) >> 8;
else y_out = (y_out - 127) >> 8;
if(y_in <= 0) y_in = (y_in + 127) >> 8;
else y_in = (y_in - 127) >> 8;
x_out += x_ofs;
y_out += y_ofs;
int32_t y_in = (int32_t)((int32_t)lv_trigo_sin(angle) * r_in) >> LV_TRIGO_SHIFT;
int32_t x_in = (int32_t)((int32_t)lv_trigo_sin(angle + 90) * r_in) >> LV_TRIGO_SHIFT;
x_in += x_ofs;
y_in += y_ofs;
lv_area_t clip_sub;
clip_sub.x1 = LV_MATH_MIN(x_in, x_out) - line_dsc.width;
clip_sub.x2 = LV_MATH_MAX(x_in, x_out) + line_dsc.width;
clip_sub.y1 = LV_MATH_MIN(y_in, y_out) - line_dsc.width;
clip_sub.y2 = LV_MATH_MAX(y_in, y_out) + line_dsc.width;
if(lv_area_intersect(&clip_sub, &clip_sub, clip_area) == false) continue;
lv_point_t p1;
lv_point_t p2;
p2.x = x_in + x_ofs;
p2.y = y_in + y_ofs;
p2.x = x_ofs;
p2.y = y_ofs;
p1.x = x_out + x_ofs;
p1.y = y_out + y_ofs;
p1.x = x_out;
p1.y = y_out;
if(i >= level) {
line_dsc.color = end_color;
@ -333,9 +353,11 @@ void lv_linemeter_draw_scale(lv_obj_t * lmeter, const lv_area_t * clip_area, uin
}
else line_dsc.color = lv_color_mix(grad_color, main_color, (255 * i) / ext->line_cnt);
lv_draw_line(&p1, &p2, clip_area, &line_dsc);
lv_draw_line(&p1, &p2, &clip_sub, &line_dsc);
}
lv_draw_mask_remove_id(mask_id);
if(part == LV_LINEMETER_PART_MAIN) {
lv_style_int_t border_width = lv_obj_get_style_scale_border_width(lmeter, part);
lv_style_int_t end_border_width = lv_obj_get_style_scale_end_border_width(lmeter, part);