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

merge dev-7.0

This commit is contained in:
Gabor Kiss-Vamosi 2020-02-05 15:12:45 +01:00
commit 167e4d8e25
20 changed files with 296 additions and 85 deletions

View File

@ -31,18 +31,6 @@ extern "C" {
* V6.0 COMPATIBILITY * V6.0 COMPATIBILITY
*--------------------*/ *--------------------*/
#if LV_USE_ARC
static inline void lv_arc_set_angles(lv_obj_t * arc, uint16_t start, uint16_t end)
{
lv_arc_set_start_angle(arc, start);
lv_arc_set_end_angle(arc, end);
}
#endif
#if LV_USE_CHART #if LV_USE_CHART
#define lv_chart_get_point_cnt lv_chart_get_point_count #define lv_chart_get_point_cnt lv_chart_get_point_count

View File

@ -473,10 +473,12 @@ void lv_obj_clean(lv_obj_t * obj)
} }
/** /**
* Mark the object as invalid therefore its current position will be redrawn by 'lv_refr_task' * Mark an area of an object as invalid.
* This area will be redrawn by 'lv_refr_task'
* @param obj pointer to an object * @param obj pointer to an object
* @param area the area to redraw
*/ */
void lv_obj_invalidate(const lv_obj_t * obj) void lv_obj_invalidate_area(const lv_obj_t * obj, const lv_area_t * area)
{ {
LV_ASSERT_OBJ(obj, LV_OBJX_NAME); LV_ASSERT_OBJ(obj, LV_OBJX_NAME);
@ -487,31 +489,56 @@ void lv_obj_invalidate(const lv_obj_t * obj)
lv_disp_t * disp = lv_obj_get_disp(obj_scr); lv_disp_t * disp = lv_obj_get_disp(obj_scr);
if(obj_scr == lv_disp_get_scr_act(disp) || obj_scr == lv_disp_get_layer_top(disp) || if(obj_scr == lv_disp_get_scr_act(disp) || obj_scr == lv_disp_get_layer_top(disp) ||
obj_scr == lv_disp_get_layer_sys(disp)) { obj_scr == lv_disp_get_layer_sys(disp)) {
/*Truncate recursively to the parents*/
lv_area_t area_trunc;
lv_obj_t * par = lv_obj_get_parent(obj);
bool union_ok = true;
/*Start with the original coordinates*/
lv_coord_t ext_size = obj->ext_draw_pad;
lv_area_copy(&area_trunc, &obj->coords);
area_trunc.x1 -= ext_size;
area_trunc.y1 -= ext_size;
area_trunc.x2 += ext_size;
area_trunc.y2 += ext_size;
/*Check through all parents*/ /*Truncate the area to the object*/
lv_area_t obj_coords;
lv_coord_t ext_size = obj->ext_draw_pad;
lv_area_copy(&obj_coords, &obj->coords);
obj_coords.x1 -= ext_size;
obj_coords.y1 -= ext_size;
obj_coords.x2 += ext_size;
obj_coords.y2 += ext_size;
bool is_common;
lv_area_t area_trunc;
is_common = lv_area_intersect(&area_trunc, area, &obj_coords);
if(is_common == false) return; /*The area is not on the object*/
/*Truncate recursively to the parents*/
lv_obj_t * par = lv_obj_get_parent(obj);
while(par != NULL) { while(par != NULL) {
union_ok = lv_area_intersect(&area_trunc, &area_trunc, &par->coords); is_common = lv_area_intersect(&area_trunc, &area_trunc, &par->coords);
if(union_ok == false) break; /*If no common parts with parent break;*/ if(is_common == false) break; /*If no common parts with parent break;*/
if(lv_obj_get_hidden(par)) return; /*If the parent is hidden then the child is hidden and won't be drawn*/ if(lv_obj_get_hidden(par)) return; /*If the parent is hidden then the child is hidden and won't be drawn*/
par = lv_obj_get_parent(par); par = lv_obj_get_parent(par);
} }
if(union_ok) lv_inv_area(disp, &area_trunc); if(is_common) lv_inv_area(disp, &area_trunc);
} }
} }
/**
* Mark the object as invalid therefore its current position will be redrawn by 'lv_refr_task'
* @param obj pointer to an object
*/
void lv_obj_invalidate(const lv_obj_t * obj)
{
LV_ASSERT_OBJ(obj, LV_OBJX_NAME);
/*Truncate the area to the object*/
lv_area_t obj_coords;
lv_coord_t ext_size = obj->ext_draw_pad;
lv_area_copy(&obj_coords, &obj->coords);
obj_coords.x1 -= ext_size;
obj_coords.y1 -= ext_size;
obj_coords.x2 += ext_size;
obj_coords.y2 += ext_size;
lv_obj_invalidate_area(obj, &obj_coords);
}
/*===================== /*=====================
* Setter functions * Setter functions
*====================*/ *====================*/

View File

@ -365,6 +365,15 @@ void lv_obj_del_async(struct _lv_obj_t *obj);
*/ */
void lv_obj_clean(lv_obj_t * obj); void lv_obj_clean(lv_obj_t * obj);
/**
* Mark an area of an object as invalid.
* This area will be redrawn by 'lv_refr_task'
* @param obj pointer to an object
* @param area the area to redraw
*/
void lv_obj_invalidate_area(const lv_obj_t * obj, const lv_area_t * area);
/** /**
* Mark the object as invalid therefore its current position will be redrawn by 'lv_refr_task' * Mark the object as invalid therefore its current position will be redrawn by 'lv_refr_task'
* @param obj pointer to an object * @param obj pointer to an object

View File

@ -533,6 +533,7 @@ static void lv_refr_obj(lv_obj_t * obj, const lv_area_t * mask_ori_p)
#if MASK_AREA_DEBUG #if MASK_AREA_DEBUG
static lv_color_t debug_color = LV_COLOR_RED; static lv_color_t debug_color = LV_COLOR_RED;
<<<<<<< HEAD
lv_draw_rect_dsc_t draw_dsc; lv_draw_rect_dsc_t draw_dsc;
lv_draw_rect_dsc_init(&draw_dsc); lv_draw_rect_dsc_init(&draw_dsc);
draw_dsc.bg_color.full = debug_color.full; draw_dsc.bg_color.full = debug_color.full;
@ -541,6 +542,14 @@ static void lv_refr_obj(lv_obj_t * obj, const lv_area_t * mask_ori_p)
draw_dsc.border_color.full = (debug_color.full + 0x13) * 9; draw_dsc.border_color.full = (debug_color.full + 0x13) * 9;
lv_draw_rect(&obj_ext_mask, &obj_ext_mask, &draw_dsc); lv_draw_rect(&obj_ext_mask, &obj_ext_mask, &draw_dsc);
=======
LV_STYLE_CREATE(style_debug, &lv_style_plain);
style_debug.body.main_color = debug_color;
style_debug.body.grad_color = debug_color;
style_debug.body.border.width = 2;
style_debug.body.border.color.full = (debug_color.full + 0x13) * 9;
lv_draw_rect(&obj_ext_mask, &obj_ext_mask, &style_debug, LV_OPA_20);
>>>>>>> dev-7.0
debug_color.full *= 17; debug_color.full *= 17;
debug_color.full += 0xA1; debug_color.full += 0xA1;
#if LV_COLOR_DEPTH == 32 #if LV_COLOR_DEPTH == 32

View File

@ -96,7 +96,7 @@ void lv_draw_arc(lv_coord_t center_x, lv_coord_t center_y, uint16_t radius, uin
if(end_angle > start_angle) { if(end_angle > start_angle) {
angle_gap = 360 - (end_angle - start_angle); angle_gap = 360 - (end_angle - start_angle);
} else { } else {
angle_gap = end_angle - start_angle; angle_gap = start_angle - end_angle;
} }
if(angle_gap > SPLIT_ANGLE_GAP_LIMIT && radius > SPLIT_RADIUS_LIMIT) { if(angle_gap > SPLIT_ANGLE_GAP_LIMIT && radius > SPLIT_RADIUS_LIMIT) {
/*Handle each quarter individually and skip which is empty*/ /*Handle each quarter individually and skip which is empty*/
@ -217,7 +217,7 @@ static void draw_quarter_1(quarter_draw_dsc_t * q)
quarter_area.y2 = q->center_y + ((lv_trigo_sin(q->start_angle) * (q->radius)) >> LV_TRIGO_SHIFT); quarter_area.y2 = q->center_y + ((lv_trigo_sin(q->start_angle) * (q->radius)) >> LV_TRIGO_SHIFT);
quarter_area.x2 = q->center_x + ((lv_trigo_sin(q->start_angle + 90) * (q->radius - q->width)) >> LV_TRIGO_SHIFT); quarter_area.x2 = q->center_x + ((lv_trigo_sin(q->start_angle + 90) * (q->radius - q->width)) >> LV_TRIGO_SHIFT);
quarter_area.y1 = q->center_y + ((lv_trigo_sin(q->end_angle) * q->radius - q->width) >> LV_TRIGO_SHIFT); quarter_area.y1 = q->center_y + ((lv_trigo_sin(q->end_angle) * (q->radius - q->width)) >> LV_TRIGO_SHIFT);
quarter_area.x1 = q->center_x + ((lv_trigo_sin(q->end_angle + 90) * (q->radius)) >> LV_TRIGO_SHIFT); quarter_area.x1 = q->center_x + ((lv_trigo_sin(q->end_angle + 90) * (q->radius)) >> LV_TRIGO_SHIFT);
bool ok = lv_area_intersect(&quarter_area, &quarter_area, q->clip_area); bool ok = lv_area_intersect(&quarter_area, &quarter_area, q->clip_area);
@ -302,7 +302,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;
@ -325,7 +325,7 @@ static void draw_quarter_3(quarter_draw_dsc_t * q)
quarter_area.y1 = q->center_y + ((lv_trigo_sin(q->start_angle) * (q->radius)) >> LV_TRIGO_SHIFT); quarter_area.y1 = q->center_y + ((lv_trigo_sin(q->start_angle) * (q->radius)) >> LV_TRIGO_SHIFT);
quarter_area.x2 = q->center_x + ((lv_trigo_sin(q->end_angle + 90) * (q->radius)) >> LV_TRIGO_SHIFT); quarter_area.x2 = q->center_x + ((lv_trigo_sin(q->end_angle + 90) * (q->radius)) >> LV_TRIGO_SHIFT);
quarter_area.y2 = q->center_y + ((lv_trigo_sin(q->end_angle) * q->radius - q->width) >> LV_TRIGO_SHIFT); quarter_area.y2 = q->center_y + ((lv_trigo_sin(q->end_angle) * (q->radius - q->width)) >> LV_TRIGO_SHIFT);
bool ok = lv_area_intersect(&quarter_area, &quarter_area, q->clip_area); bool ok = lv_area_intersect(&quarter_area, &quarter_area, q->clip_area);
if(ok) lv_draw_rect(q->draw_area, &quarter_area, q->draw_dsc); if(ok) lv_draw_rect(q->draw_area, &quarter_area, q->draw_dsc);
@ -369,8 +369,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;

View File

@ -269,7 +269,7 @@ static int8_t get_kern_value(const lv_font_t * font, uint32_t gid_left, uint32_t
/*Kern classes*/ /*Kern classes*/
const lv_font_fmt_txt_kern_classes_t * kdsc = fdsc->kern_dsc; const lv_font_fmt_txt_kern_classes_t * kdsc = fdsc->kern_dsc;
uint8_t left_class = kdsc->left_class_mapping[gid_left]; uint8_t left_class = kdsc->left_class_mapping[gid_left];
uint8_t right_class = kdsc->left_class_mapping[gid_right]; uint8_t right_class = kdsc->right_class_mapping[gid_right];
/* If class = 0, kerning not exist for that glyph /* If class = 0, kerning not exist for that glyph
* else got the value form `class_pair_values` 2D array*/ * else got the value form `class_pair_values` 2D array*/
@ -489,5 +489,5 @@ static uint8_t rle_next(void)
*/ */
static int32_t unicode_list_compare(const void * ref, const void * element) static int32_t unicode_list_compare(const void * ref, const void * element)
{ {
return (*(uint16_t *)ref) - (*(uint16_t *)element); return ((int32_t)(*(uint16_t *)ref)) - ((int32_t)(*(uint16_t *)element));
} }

View File

@ -9,12 +9,12 @@ extern "C" {
#include "../lv_conf_internal.h" #include "../lv_conf_internal.h"
/* In the font converter use this list as range: /* In the font converter use this list as range:
61441, 61448, 61451, 61452, 61452, 61453, 61457, 61459, 61461, 61465, 61441, 61448, 61451, 61452, 61453, 61457, 61459, 61461, 61465, 61468,
61468, 61473, 61478, 61479, 61480, 61502, 61512, 61515, 61516, 61517, 61473, 61478, 61479, 61480, 61502, 61512, 61515, 61516, 61517, 61521,
61521, 61522, 61523, 61524, 61543, 61544, 61550, 61552, 61553, 61556, 61522, 61523, 61524, 61543, 61544, 61550, 61552, 61553, 61556, 61559,
61559, 61560, 61561, 61563, 61587, 61589, 61636, 61637, 61639, 61671, 61560, 61561, 61563, 61587, 61589, 61636, 61637, 61639, 61671, 61674,
61674, 61683, 61724, 61732, 61787, 61931, 62016, 62017, 62018, 62019, 61683, 61724, 61732, 61787, 61931, 62016, 62017, 62018, 62019, 62020,
62020, 62087, 62099, 62212, 62189, 62810, 63426, 63650 62087, 62099, 62212, 62189, 62810, 63426, 63650
*/ */
#define LV_SYMBOL_AUDIO "\xef\x80\x81" /*61441, 0xF001*/ #define LV_SYMBOL_AUDIO "\xef\x80\x81" /*61441, 0xF001*/
@ -90,7 +90,6 @@ enum {
_LV_STR_SYMBOL_CLOSE, _LV_STR_SYMBOL_CLOSE,
_LV_STR_SYMBOL_POWER, _LV_STR_SYMBOL_POWER,
_LV_STR_SYMBOL_SETTINGS, _LV_STR_SYMBOL_SETTINGS,
_LV_STR_SYMBOL_TRASH,
_LV_STR_SYMBOL_HOME, _LV_STR_SYMBOL_HOME,
_LV_STR_SYMBOL_DOWNLOAD, _LV_STR_SYMBOL_DOWNLOAD,
_LV_STR_SYMBOL_DRIVE, _LV_STR_SYMBOL_DRIVE,
@ -110,6 +109,8 @@ enum {
_LV_STR_SYMBOL_RIGHT, _LV_STR_SYMBOL_RIGHT,
_LV_STR_SYMBOL_PLUS, _LV_STR_SYMBOL_PLUS,
_LV_STR_SYMBOL_MINUS, _LV_STR_SYMBOL_MINUS,
_LV_STR_SYMBOL_EYE_OPEN,
_LV_STR_SYMBOL_EYE_CLOSE,
_LV_STR_SYMBOL_WARNING, _LV_STR_SYMBOL_WARNING,
_LV_STR_SYMBOL_SHUFFLE, _LV_STR_SYMBOL_SHUFFLE,
_LV_STR_SYMBOL_UP, _LV_STR_SYMBOL_UP,
@ -122,6 +123,7 @@ enum {
_LV_STR_SYMBOL_COPY, _LV_STR_SYMBOL_COPY,
_LV_STR_SYMBOL_SAVE, _LV_STR_SYMBOL_SAVE,
_LV_STR_SYMBOL_CHARGE, _LV_STR_SYMBOL_CHARGE,
_LV_STR_SYMBOL_PASTE,
_LV_STR_SYMBOL_BELL, _LV_STR_SYMBOL_BELL,
_LV_STR_SYMBOL_KEYBOARD, _LV_STR_SYMBOL_KEYBOARD,
_LV_STR_SYMBOL_GPS, _LV_STR_SYMBOL_GPS,
@ -132,7 +134,12 @@ enum {
_LV_STR_SYMBOL_BATTERY_2, _LV_STR_SYMBOL_BATTERY_2,
_LV_STR_SYMBOL_BATTERY_1, _LV_STR_SYMBOL_BATTERY_1,
_LV_STR_SYMBOL_BATTERY_EMPTY, _LV_STR_SYMBOL_BATTERY_EMPTY,
_LV_STR_SYMBOL_USB,
_LV_STR_SYMBOL_BLUETOOTH, _LV_STR_SYMBOL_BLUETOOTH,
_LV_STR_SYMBOL_TRASH,
_LV_STR_SYMBOL_BACKSPACE,
_LV_STR_SYMBOL_SD_CARD,
_LV_STR_SYMBOL_NEW_LINE,
_LV_STR_SYMBOL_DUMMY, _LV_STR_SYMBOL_DUMMY,
}; };

View File

@ -340,7 +340,6 @@ static inline uint8_t lv_color_to8(lv_color_t color)
static inline uint16_t lv_color_to16(lv_color_t color) static inline uint16_t lv_color_to16(lv_color_t color)
{ {
#if LV_COLOR_DEPTH == 1 #if LV_COLOR_DEPTH == 1
if(color.full == 0) if(color.full == 0)
return 0; return 0;
@ -369,9 +368,7 @@ static inline uint16_t lv_color_to16(lv_color_t color)
#endif #endif
LV_COLOR_SET_B16(ret, LV_COLOR_GET_B(color) >> 3); /* 8 - 5 = 3*/ LV_COLOR_SET_B16(ret, LV_COLOR_GET_B(color) >> 3); /* 8 - 5 = 3*/
return ret.full; return ret.full;
#endif #endif
return 0;
} }
static inline uint32_t lv_color_to32(lv_color_t color) static inline uint32_t lv_color_to32(lv_color_t color)

View File

@ -29,6 +29,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 lv_style_list_t * lv_arc_get_style(lv_obj_t * arc, uint8_t part); 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);
/********************** /**********************
* STATIC VARIABLES * STATIC VARIABLES
@ -128,11 +129,25 @@ void lv_arc_set_start_angle(lv_obj_t * arc, int16_t start)
lv_arc_ext_t * ext = lv_obj_get_ext_attr(arc); lv_arc_ext_t * ext = lv_obj_get_ext_attr(arc);
if(start > 360) start -= 360; if(start > 360) start -= 360;
if(start < 0) start += 360;
/*Too large move, the whole arc need to be invalidated anyway*/
if(LV_MATH_ABS(start - ext->arc_angle_start) >= 180) {
lv_obj_invalidate(arc);
}
/*Only a smaller incremental move*/
else if(ext->arc_angle_start > ext->arc_angle_end && start > ext->arc_angle_end) {
inv_arc_area(arc, LV_MATH_MIN(ext->arc_angle_start, start), LV_MATH_MAX(ext->arc_angle_start, start));
}
/*Only a smaller incremental move*/
else if(ext->arc_angle_start < ext->arc_angle_end && start < ext->arc_angle_end) {
inv_arc_area(arc, LV_MATH_MIN(ext->arc_angle_start, start), LV_MATH_MAX(ext->arc_angle_start, start));
}
/*Crossing the start angle makes the whole arc change*/
else {
lv_obj_invalidate(arc);
}
ext->arc_angle_start = start; ext->arc_angle_start = start;
lv_obj_invalidate(arc);
} }
/** /**
@ -147,11 +162,49 @@ void lv_arc_set_end_angle(lv_obj_t * arc, int16_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(end < 0) 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);
}
/*Only a smaller incremental move*/
else if(ext->arc_angle_end > ext->arc_angle_start && end > ext->arc_angle_start ) {
inv_arc_area(arc, LV_MATH_MIN(ext->arc_angle_end, end), LV_MATH_MAX(ext->arc_angle_end, end));
}
/*Only a smaller incremental move*/
else if(ext->arc_angle_end < ext->arc_angle_start && end < ext->arc_angle_start ) {
inv_arc_area(arc, LV_MATH_MIN(ext->arc_angle_end, end), LV_MATH_MAX(ext->arc_angle_end, end));
}
/*Crossing the end angle makes the whole arc change*/
else {
lv_obj_invalidate(arc);
}
ext->arc_angle_end= end; ext->arc_angle_end= end;
}
lv_obj_invalidate(arc);
/**
* Set the start and end angles
* @param arc pointer to an arc object
* @param start the start angle
* @param end the end angle
*/
void lv_arc_set_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(end > 360) end -= 360;
if(start > 360) start -= 360;
inv_arc_area(arc, ext->arc_angle_start, ext->arc_angle_end);
ext->arc_angle_start = start;
ext->arc_angle_end = end;
inv_arc_area(arc, ext->arc_angle_start, ext->arc_angle_end);
} }
/*===================== /*=====================
@ -297,4 +350,85 @@ static lv_style_list_t * lv_arc_get_style(lv_obj_t * arc, uint8_t part)
return style_dsc_p; return style_dsc_p;
} }
static void inv_arc_area(lv_obj_t * arc, uint16_t start_angle, uint16_t end_angle)
{
uint8_t start_quarter = start_angle / 90;
uint8_t end_quarter = end_angle / 90;
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 rout = (LV_MATH_MIN(lv_obj_get_width(arc), lv_obj_get_height(arc))) / 2;
lv_style_int_t w = lv_obj_get_style_line_width(arc, LV_ARC_PART_ARC);
lv_coord_t rin = rout - w;
lv_area_t inv_area;
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);
inv_area.y2 = y + ((lv_trigo_sin(end_angle) * rout) >> LV_TRIGO_SHIFT);
inv_area.x1 = x + ((lv_trigo_sin(end_angle + 90) * rin) >> LV_TRIGO_SHIFT);
lv_obj_invalidate_area(arc, &inv_area);
}
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

View File

@ -81,6 +81,14 @@ void lv_arc_set_start_angle(lv_obj_t * arc, int16_t start);
*/ */
void lv_arc_set_end_angle(lv_obj_t * arc, int16_t end); void lv_arc_set_end_angle(lv_obj_t * arc, int16_t end);
/**
* Set the start and end angles
* @param arc pointer to an arc object
* @param start the start angle
* @param end the end angle
*/
void lv_arc_set_angles(lv_obj_t * arc, uint16_t start, uint16_t end);
/*===================== /*=====================
* Getter functions * Getter functions
*====================*/ *====================*/

View File

@ -1124,7 +1124,7 @@ static void invalidate_button_area(const lv_obj_t * btnm, uint16_t btn_idx)
btn_area.x2 += btnm_area.x1; btn_area.x2 += btnm_area.x1;
btn_area.y2 += btnm_area.y1; btn_area.y2 += btnm_area.y1;
lv_inv_area(lv_obj_get_disp(btnm), &btn_area); lv_obj_invalidate_area(btnm, &btn_area);
} }
/** /**

View File

@ -1394,13 +1394,13 @@ static void invalidate_lines(lv_obj_t * chart, uint16_t i)
if(i < ext->point_cnt - 1) { if(i < ext->point_cnt - 1) {
coords.x1 = ((w * i) / (ext->point_cnt - 1)) + x_ofs - line_width - point_radius; coords.x1 = ((w * i) / (ext->point_cnt - 1)) + x_ofs - line_width - point_radius;
coords.x2 = ((w * (i + 1)) / (ext->point_cnt - 1)) + x_ofs + line_width + point_radius; coords.x2 = ((w * (i + 1)) / (ext->point_cnt - 1)) + x_ofs + line_width + point_radius;
lv_inv_area(lv_obj_get_disp(chart), &coords); lv_obj_invalidate_area(chart, &coords);
} }
if(i > 0) { if(i > 0) {
coords.x1 = ((w * (i - 1)) / (ext->point_cnt - 1)) + x_ofs - line_width - point_radius; coords.x1 = ((w * (i - 1)) / (ext->point_cnt - 1)) + x_ofs - line_width - point_radius;
coords.x2 = ((w * i) / (ext->point_cnt - 1)) + x_ofs + line_width + point_radius; coords.x2 = ((w * i) / (ext->point_cnt - 1)) + x_ofs + line_width + point_radius;
lv_inv_area(lv_obj_get_disp(chart), &coords); lv_obj_invalidate_area(chart, &coords);
} }
} }

View File

@ -689,7 +689,7 @@ static void invalidate_indic(lv_obj_t * cpicker)
{ {
lv_area_t indic_area = get_indic_area(cpicker); lv_area_t indic_area = get_indic_area(cpicker);
lv_inv_area(lv_obj_get_disp(cpicker), &indic_area); lv_obj_invalidate_area(cpicker, &indic_area);
} }
static lv_area_t get_indic_area(lv_obj_t * cpicker) static lv_area_t get_indic_area(lv_obj_t * cpicker)

View File

@ -314,7 +314,6 @@ void lv_label_set_array_text(lv_obj_t * label, const char * array, uint16_t size
void lv_label_set_static_text(lv_obj_t * label, const char * text) void lv_label_set_static_text(lv_obj_t * label, const char * text)
{ {
LV_ASSERT_OBJ(label, LV_OBJX_NAME); LV_ASSERT_OBJ(label, LV_OBJX_NAME);
LV_ASSERT_STR(text);
lv_label_ext_t * ext = lv_obj_get_ext_attr(label); lv_label_ext_t * ext = lv_obj_get_ext_attr(label);
if(ext->static_txt == 0 && ext->text != NULL) { if(ext->static_txt == 0 && ext->text != NULL) {
@ -1321,10 +1320,18 @@ static void lv_label_refr_text(lv_obj_t * label)
p.y -= line_space; /*Trim the last line space*/ p.y -= line_space; /*Trim the last line space*/
uint32_t letter_id = lv_label_get_letter_on(label, &p); uint32_t letter_id = lv_label_get_letter_on(label, &p);
/*Save letters under the dots and replace them with dots*/
uint32_t i; /*Be sure there is space for the dots*/
size_t txt_len = strlen(ext->text);
uint32_t byte_id = lv_txt_encoded_get_byte_id(ext->text, letter_id); uint32_t byte_id = lv_txt_encoded_get_byte_id(ext->text, letter_id);
while(byte_id + LV_LABEL_DOT_NUM > txt_len) {
byte_id -= lv_txt_encoded_size(&ext->text[byte_id]);
letter_id--;
}
/*Save letters under the dots and replace them with dots*/
uint32_t byte_id_ori = byte_id; uint32_t byte_id_ori = byte_id;
uint32_t i;
uint8_t len = 0; uint8_t len = 0;
for(i = 0; i <= LV_LABEL_DOT_NUM; i++) { for(i = 0; i <= LV_LABEL_DOT_NUM; i++) {
len += lv_txt_encoded_size(&ext->text[byte_id]); len += lv_txt_encoded_size(&ext->text[byte_id]);

View File

@ -766,6 +766,8 @@ static lv_res_t lv_page_signal(lv_obj_t * page, lv_signal_t sign, void * param)
/*Automatically move children to the scrollable object*/ /*Automatically move children to the scrollable object*/
else if(sign == LV_SIGNAL_CHILD_CHG) { else if(sign == LV_SIGNAL_CHILD_CHG) {
lv_obj_t * child; lv_obj_t * child;
if(ext->scrl == NULL) return LV_RES_OK;
lv_fit_t fit_left = lv_page_get_scrl_fit_left(page); lv_fit_t fit_left = lv_page_get_scrl_fit_left(page);
lv_fit_t fit_right = lv_page_get_scrl_fit_right(page); lv_fit_t fit_right = lv_page_get_scrl_fit_right(page);
lv_fit_t fit_top = lv_page_get_scrl_fit_top(page); lv_fit_t fit_top = lv_page_get_scrl_fit_top(page);
@ -995,7 +997,6 @@ static lv_res_t lv_page_scrollable_signal(lv_obj_t * scrl, lv_signal_t sign, voi
/*Hide scrollbars if required*/ /*Hide scrollbars if required*/
if(page_ext->sb.mode == LV_SB_MODE_DRAG) { if(page_ext->sb.mode == LV_SB_MODE_DRAG) {
lv_disp_t * disp = lv_obj_get_disp(page);
lv_area_t sb_area_tmp; lv_area_t sb_area_tmp;
if(page_ext->sb.hor_draw) { if(page_ext->sb.hor_draw) {
lv_area_copy(&sb_area_tmp, &page_ext->sb.hor_area); lv_area_copy(&sb_area_tmp, &page_ext->sb.hor_area);
@ -1003,7 +1004,7 @@ static lv_res_t lv_page_scrollable_signal(lv_obj_t * scrl, lv_signal_t sign, voi
sb_area_tmp.y1 += page->coords.y1; sb_area_tmp.y1 += page->coords.y1;
sb_area_tmp.x2 += page->coords.x1; sb_area_tmp.x2 += page->coords.x1;
sb_area_tmp.y2 += page->coords.y1; sb_area_tmp.y2 += page->coords.y1;
lv_inv_area(disp, &sb_area_tmp); lv_obj_invalidate_area(page, &sb_area_tmp);
page_ext->sb.hor_draw = 0; page_ext->sb.hor_draw = 0;
} }
if(page_ext->sb.ver_draw) { if(page_ext->sb.ver_draw) {
@ -1012,10 +1013,12 @@ static lv_res_t lv_page_scrollable_signal(lv_obj_t * scrl, lv_signal_t sign, voi
sb_area_tmp.y1 += page->coords.y1; sb_area_tmp.y1 += page->coords.y1;
sb_area_tmp.x2 += page->coords.x1; sb_area_tmp.x2 += page->coords.x1;
sb_area_tmp.y2 += page->coords.y1; sb_area_tmp.y2 += page->coords.y1;
lv_inv_area(disp, &sb_area_tmp); lv_obj_invalidate_area(page, &sb_area_tmp);
page_ext->sb.ver_draw = 0; page_ext->sb.ver_draw = 0;
} }
} }
} else if(sign == LV_SIGNAL_CLEANUP) {
page_ext->scrl = NULL;
} }
return res; return res;
} }
@ -1115,7 +1118,6 @@ static void lv_page_sb_refresh(lv_obj_t * page)
} }
/*Invalidate the current (old) scrollbar areas*/ /*Invalidate the current (old) scrollbar areas*/
lv_disp_t * disp = lv_obj_get_disp(page);
lv_area_t sb_area_tmp; lv_area_t sb_area_tmp;
if(ext->sb.hor_draw != 0) { if(ext->sb.hor_draw != 0) {
lv_area_copy(&sb_area_tmp, &ext->sb.hor_area); lv_area_copy(&sb_area_tmp, &ext->sb.hor_area);
@ -1123,7 +1125,7 @@ static void lv_page_sb_refresh(lv_obj_t * page)
sb_area_tmp.y1 += page->coords.y1; sb_area_tmp.y1 += page->coords.y1;
sb_area_tmp.x2 += page->coords.x1; sb_area_tmp.x2 += page->coords.x1;
sb_area_tmp.y2 += page->coords.y1; sb_area_tmp.y2 += page->coords.y1;
lv_inv_area(disp, &sb_area_tmp); lv_obj_invalidate_area(page, &sb_area_tmp);
} }
if(ext->sb.ver_draw != 0) { if(ext->sb.ver_draw != 0) {
lv_area_copy(&sb_area_tmp, &ext->sb.ver_area); lv_area_copy(&sb_area_tmp, &ext->sb.ver_area);
@ -1131,7 +1133,7 @@ static void lv_page_sb_refresh(lv_obj_t * page)
sb_area_tmp.y1 += page->coords.y1; sb_area_tmp.y1 += page->coords.y1;
sb_area_tmp.x2 += page->coords.x1; sb_area_tmp.x2 += page->coords.x1;
sb_area_tmp.y2 += page->coords.y1; sb_area_tmp.y2 += page->coords.y1;
lv_inv_area(disp, &sb_area_tmp); lv_obj_invalidate_area(page, &sb_area_tmp);
} }
if(ext->sb.mode == LV_SB_MODE_DRAG && lv_indev_is_dragging(lv_indev_get_act()) == false) { if(ext->sb.mode == LV_SB_MODE_DRAG && lv_indev_is_dragging(lv_indev_get_act()) == false) {
@ -1193,7 +1195,7 @@ static void lv_page_sb_refresh(lv_obj_t * page)
sb_area_tmp.y1 += page->coords.y1; sb_area_tmp.y1 += page->coords.y1;
sb_area_tmp.x2 += page->coords.x1; sb_area_tmp.x2 += page->coords.x1;
sb_area_tmp.y2 += page->coords.y1; sb_area_tmp.y2 += page->coords.y1;
lv_inv_area(disp, &sb_area_tmp); lv_obj_invalidate_area(page, &sb_area_tmp);
} }
if(ext->sb.ver_draw != 0) { if(ext->sb.ver_draw != 0) {
lv_area_copy(&sb_area_tmp, &ext->sb.ver_area); lv_area_copy(&sb_area_tmp, &ext->sb.ver_area);
@ -1201,7 +1203,7 @@ static void lv_page_sb_refresh(lv_obj_t * page)
sb_area_tmp.y1 += page->coords.y1; sb_area_tmp.y1 += page->coords.y1;
sb_area_tmp.x2 += page->coords.x1; sb_area_tmp.x2 += page->coords.x1;
sb_area_tmp.y2 += page->coords.y1; sb_area_tmp.y2 += page->coords.y1;
lv_inv_area(disp, &sb_area_tmp); lv_obj_invalidate_area(page, &sb_area_tmp);
} }
} }

View File

@ -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;
/*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(preload, lv_preload_signal); lv_obj_set_signal_cb(preload, lv_preload_signal);
@ -321,8 +321,7 @@ void lv_preload_spinner_anim(void * ptr, lv_anim_value_t val)
angle_start = angle_start % 360; angle_start = angle_start % 360;
angle_end = angle_end % 360; angle_end = angle_end % 360;
lv_arc_set_start_angle(preload, angle_start); lv_arc_set_angles(preload, angle_start, angle_end);
lv_arc_set_end_angle(preload, angle_end);
} }
/********************** /**********************

View File

@ -914,6 +914,7 @@ void lv_ta_set_cursor_blink_time(lv_obj_t * ta, uint16_t time)
a.path_cb = lv_anim_path_step; a.path_cb = lv_anim_path_step;
lv_anim_create(&a); lv_anim_create(&a);
} else { } else {
lv_anim_del(ta, (lv_anim_exec_xcb_t)cursor_blink_anim);
ext->cursor.state = 1; ext->cursor.state = 1;
} }
#else #else
@ -1581,14 +1582,13 @@ static void cursor_blink_anim(lv_obj_t * ta, lv_anim_value_t show)
if(show != ext->cursor.state) { if(show != ext->cursor.state) {
ext->cursor.state = show == 0 ? 0 : 1; ext->cursor.state = show == 0 ? 0 : 1;
if(ext->cursor.hidden == 0) { if(ext->cursor.hidden == 0) {
lv_disp_t * disp = lv_obj_get_disp(ta);
lv_area_t area_tmp; lv_area_t area_tmp;
lv_area_copy(&area_tmp, &ext->cursor.area); lv_area_copy(&area_tmp, &ext->cursor.area);
area_tmp.x1 += ext->label->coords.x1; area_tmp.x1 += ext->label->coords.x1;
area_tmp.y1 += ext->label->coords.y1; area_tmp.y1 += ext->label->coords.y1;
area_tmp.x2 += ext->label->coords.x1; area_tmp.x2 += ext->label->coords.x1;
area_tmp.y2 += ext->label->coords.y1; area_tmp.y2 += ext->label->coords.y1;
lv_inv_area(disp, &area_tmp); lv_obj_invalidate_area(ta, &area_tmp);
} }
} }
} }
@ -1737,14 +1737,13 @@ static void refr_cursor_area(lv_obj_t * ta)
cur_area.y2 = letter_pos.y + bottom + letter_h; cur_area.y2 = letter_pos.y + bottom + letter_h;
/*Save the new area*/ /*Save the new area*/
lv_disp_t * disp = lv_obj_get_disp(ta);
lv_area_t area_tmp; lv_area_t area_tmp;
lv_area_copy(&area_tmp, &ext->cursor.area); lv_area_copy(&area_tmp, &ext->cursor.area);
area_tmp.x1 += ext->label->coords.x1; area_tmp.x1 += ext->label->coords.x1;
area_tmp.y1 += ext->label->coords.y1; area_tmp.y1 += ext->label->coords.y1;
area_tmp.x2 += ext->label->coords.x1; area_tmp.x2 += ext->label->coords.x1;
area_tmp.y2 += ext->label->coords.y1; area_tmp.y2 += ext->label->coords.y1;
lv_inv_area(disp, &area_tmp); lv_obj_invalidate_area(ta, &area_tmp);
lv_area_copy(&ext->cursor.area, &cur_area); lv_area_copy(&ext->cursor.area, &cur_area);
@ -1753,7 +1752,7 @@ static void refr_cursor_area(lv_obj_t * ta)
area_tmp.y1 += ext->label->coords.y1; area_tmp.y1 += ext->label->coords.y1;
area_tmp.x2 += ext->label->coords.x1; area_tmp.x2 += ext->label->coords.x1;
area_tmp.y2 += ext->label->coords.y1; area_tmp.y2 += ext->label->coords.y1;
lv_inv_area(disp, &area_tmp); lv_obj_invalidate_area(ta, &area_tmp);
} }
static void placeholder_update(lv_obj_t * ta) static void placeholder_update(lv_obj_t * ta)

View File

@ -113,8 +113,17 @@ lv_obj_t * lv_tabview_create(lv_obj_t * par, const lv_obj_t * copy)
/* Set a size which fits into the parent. /* Set a size which fits into the parent.
* Don't use `par` directly because if the tabview is created on a page it is moved to the * Don't use `par` directly because if the tabview is created on a page it is moved to the
* scrollable so the parent has changed */ * scrollable so the parent has changed */
lv_obj_set_size(tabview, lv_obj_get_width_fit(lv_obj_get_parent(tabview)), lv_coord_t w;
lv_obj_get_height_fit(lv_obj_get_parent(tabview))); lv_coord_t h;
if(par) {
w = lv_obj_get_width_fit(lv_obj_get_parent(tabview));
h = lv_obj_get_height_fit(lv_obj_get_parent(tabview));
} else {
w = lv_disp_get_hor_res(NULL);
h = lv_disp_get_ver_res(NULL);
}
lv_obj_set_size(tabview, w, h);
ext->content = lv_page_create(tabview, NULL); ext->content = lv_page_create(tabview, NULL);
ext->btns = lv_btnm_create(tabview, NULL); ext->btns = lv_btnm_create(tabview, NULL);

View File

@ -101,10 +101,20 @@ lv_obj_t * lv_tileview_create(lv_obj_t * par, const lv_obj_t * copy)
/* Set a size which fits into the parent. /* Set a size which fits into the parent.
* Don't use `par` directly because if the tileview is created on a page it is moved to the * Don't use `par` directly because if the tileview is created on a page it is moved to the
* scrollable so the parent has changed */ * scrollable so the parent has changed */
lv_obj_set_size(new_tileview, lv_obj_get_width_fit(lv_obj_get_parent(new_tileview)), lv_coord_t w;
lv_obj_get_height_fit(lv_obj_get_parent(new_tileview))); lv_coord_t h;
lv_obj_set_drag_dir(lv_page_get_scrl(new_tileview), LV_DRAG_DIR_ONE); if(par) {
lv_obj_set_drag_throw(lv_page_get_scrl(new_tileview), true); w = lv_obj_get_width_fit(lv_obj_get_parent(new_tileview));
h = lv_obj_get_height_fit(lv_obj_get_parent(new_tileview));
} else {
w = lv_disp_get_hor_res(NULL);
h = lv_disp_get_ver_res(NULL);
}
lv_obj_set_size(new_tileview, w, h);
lv_obj_set_drag_throw(lv_page_get_scrl(new_tileview), false);
lv_page_set_scrl_fit(new_tileview, LV_FIT_TIGHT); lv_page_set_scrl_fit(new_tileview, LV_FIT_TIGHT);
lv_obj_reset_style(new_tileview, LV_PAGE_PART_SCRL); lv_obj_reset_style(new_tileview, LV_PAGE_PART_SCRL);

View File

@ -78,10 +78,18 @@ lv_obj_t * lv_win_create(lv_obj_t * par, const lv_obj_t * copy)
/* Set a size which fits into the parent. /* Set a size which fits into the parent.
* Don't use `par` directly because if the window is created on a page it is moved to the * Don't use `par` directly because if the window is created on a page it is moved to the
* scrollable so the parent has changed */ * scrollable so the parent has changed */
lv_obj_set_size(new_win, lv_obj_get_width_fit(lv_obj_get_parent(new_win)), lv_coord_t w;
lv_obj_get_height_fit(lv_obj_get_parent(new_win))); lv_coord_t h;
if(par) {
w = lv_obj_get_width_fit(lv_obj_get_parent(new_win));
h = lv_obj_get_height_fit(lv_obj_get_parent(new_win));
} else {
w = lv_disp_get_hor_res(NULL);
h = lv_disp_get_ver_res(NULL);
}
lv_obj_set_size(new_win, w, h);
lv_obj_set_pos(new_win, 0, 0);
lv_obj_set_style(new_win, &lv_style_pretty); lv_obj_set_style(new_win, &lv_style_pretty);
ext->page = lv_page_create(new_win, NULL); ext->page = lv_page_create(new_win, NULL);