diff --git a/src/lv_api_map.h b/src/lv_api_map.h index 904dcf93d..fde6f1633 100644 --- a/src/lv_api_map.h +++ b/src/lv_api_map.h @@ -31,18 +31,6 @@ extern "C" { * 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 #define lv_chart_get_point_cnt lv_chart_get_point_count diff --git a/src/lv_core/lv_obj.c b/src/lv_core/lv_obj.c index 09bb104cd..9b76a5628 100644 --- a/src/lv_core/lv_obj.c +++ b/src/lv_core/lv_obj.c @@ -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 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); @@ -487,31 +489,56 @@ void lv_obj_invalidate(const lv_obj_t * obj) 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) || 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) { - union_ok = lv_area_intersect(&area_trunc, &area_trunc, &par->coords); - if(union_ok == false) break; /*If no common parts with parent break;*/ + is_common = lv_area_intersect(&area_trunc, &area_trunc, &par->coords); + 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*/ 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 *====================*/ diff --git a/src/lv_core/lv_obj.h b/src/lv_core/lv_obj.h index 57b1451ac..58bf4f4ab 100644 --- a/src/lv_core/lv_obj.h +++ b/src/lv_core/lv_obj.h @@ -365,6 +365,15 @@ void lv_obj_del_async(struct _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' * @param obj pointer to an object diff --git a/src/lv_core/lv_refr.c b/src/lv_core/lv_refr.c index 12429ce88..c925b9412 100644 --- a/src/lv_core/lv_refr.c +++ b/src/lv_core/lv_refr.c @@ -533,6 +533,7 @@ static void lv_refr_obj(lv_obj_t * obj, const lv_area_t * mask_ori_p) #if MASK_AREA_DEBUG static lv_color_t debug_color = LV_COLOR_RED; +<<<<<<< HEAD lv_draw_rect_dsc_t draw_dsc; lv_draw_rect_dsc_init(&draw_dsc); 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; 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 += 0xA1; #if LV_COLOR_DEPTH == 32 diff --git a/src/lv_draw/lv_draw_arc.c b/src/lv_draw/lv_draw_arc.c index 37599d12c..08476e31b 100644 --- a/src/lv_draw/lv_draw_arc.c +++ b/src/lv_draw/lv_draw_arc.c @@ -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) { angle_gap = 360 - (end_angle - start_angle); } else { - angle_gap = end_angle - start_angle; + angle_gap = start_angle - end_angle; } if(angle_gap > SPLIT_ANGLE_GAP_LIMIT && radius > SPLIT_RADIUS_LIMIT) { /*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.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); 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) || (q->start_quarter == 0 && 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*/ quarter_area.x1 = q->center_x - 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.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); 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) { const uint8_t ps = 8; diff --git a/src/lv_font/lv_font_fmt_txt.c b/src/lv_font/lv_font_fmt_txt.c index 947d80bef..04829948c 100644 --- a/src/lv_font/lv_font_fmt_txt.c +++ b/src/lv_font/lv_font_fmt_txt.c @@ -269,7 +269,7 @@ static int8_t get_kern_value(const lv_font_t * font, uint32_t gid_left, uint32_t /*Kern classes*/ const lv_font_fmt_txt_kern_classes_t * kdsc = fdsc->kern_dsc; 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 * 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) { - return (*(uint16_t *)ref) - (*(uint16_t *)element); + return ((int32_t)(*(uint16_t *)ref)) - ((int32_t)(*(uint16_t *)element)); } diff --git a/src/lv_font/lv_symbol_def.h b/src/lv_font/lv_symbol_def.h index 43a6a29ca..db5c3dfe5 100644 --- a/src/lv_font/lv_symbol_def.h +++ b/src/lv_font/lv_symbol_def.h @@ -9,12 +9,12 @@ extern "C" { #include "../lv_conf_internal.h" /* In the font converter use this list as range: - 61441, 61448, 61451, 61452, 61452, 61453, 61457, 61459, 61461, 61465, - 61468, 61473, 61478, 61479, 61480, 61502, 61512, 61515, 61516, 61517, - 61521, 61522, 61523, 61524, 61543, 61544, 61550, 61552, 61553, 61556, - 61559, 61560, 61561, 61563, 61587, 61589, 61636, 61637, 61639, 61671, - 61674, 61683, 61724, 61732, 61787, 61931, 62016, 62017, 62018, 62019, - 62020, 62087, 62099, 62212, 62189, 62810, 63426, 63650 + 61441, 61448, 61451, 61452, 61453, 61457, 61459, 61461, 61465, 61468, + 61473, 61478, 61479, 61480, 61502, 61512, 61515, 61516, 61517, 61521, + 61522, 61523, 61524, 61543, 61544, 61550, 61552, 61553, 61556, 61559, + 61560, 61561, 61563, 61587, 61589, 61636, 61637, 61639, 61671, 61674, + 61683, 61724, 61732, 61787, 61931, 62016, 62017, 62018, 62019, 62020, + 62087, 62099, 62212, 62189, 62810, 63426, 63650 */ #define LV_SYMBOL_AUDIO "\xef\x80\x81" /*61441, 0xF001*/ @@ -90,7 +90,6 @@ enum { _LV_STR_SYMBOL_CLOSE, _LV_STR_SYMBOL_POWER, _LV_STR_SYMBOL_SETTINGS, - _LV_STR_SYMBOL_TRASH, _LV_STR_SYMBOL_HOME, _LV_STR_SYMBOL_DOWNLOAD, _LV_STR_SYMBOL_DRIVE, @@ -110,6 +109,8 @@ enum { _LV_STR_SYMBOL_RIGHT, _LV_STR_SYMBOL_PLUS, _LV_STR_SYMBOL_MINUS, + _LV_STR_SYMBOL_EYE_OPEN, + _LV_STR_SYMBOL_EYE_CLOSE, _LV_STR_SYMBOL_WARNING, _LV_STR_SYMBOL_SHUFFLE, _LV_STR_SYMBOL_UP, @@ -122,6 +123,7 @@ enum { _LV_STR_SYMBOL_COPY, _LV_STR_SYMBOL_SAVE, _LV_STR_SYMBOL_CHARGE, + _LV_STR_SYMBOL_PASTE, _LV_STR_SYMBOL_BELL, _LV_STR_SYMBOL_KEYBOARD, _LV_STR_SYMBOL_GPS, @@ -132,7 +134,12 @@ enum { _LV_STR_SYMBOL_BATTERY_2, _LV_STR_SYMBOL_BATTERY_1, _LV_STR_SYMBOL_BATTERY_EMPTY, + _LV_STR_SYMBOL_USB, _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, }; diff --git a/src/lv_misc/lv_color.h b/src/lv_misc/lv_color.h index 465884897..b045ce568 100644 --- a/src/lv_misc/lv_color.h +++ b/src/lv_misc/lv_color.h @@ -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) { - #if LV_COLOR_DEPTH == 1 if(color.full == 0) return 0; @@ -369,9 +368,7 @@ static inline uint16_t lv_color_to16(lv_color_t color) #endif LV_COLOR_SET_B16(ret, LV_COLOR_GET_B(color) >> 3); /* 8 - 5 = 3*/ return ret.full; -#endif - - return 0; +#endif } static inline uint32_t lv_color_to32(lv_color_t color) diff --git a/src/lv_objx/lv_arc.c b/src/lv_objx/lv_arc.c index 4081c060b..5696b5d12 100644 --- a/src/lv_objx/lv_arc.c +++ b/src/lv_objx/lv_arc.c @@ -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_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 void inv_arc_area(lv_obj_t * arc, uint16_t start_angle, uint16_t end_angle); /********************** * 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); 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; - - 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); 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; +} - 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; } + +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 diff --git a/src/lv_objx/lv_arc.h b/src/lv_objx/lv_arc.h index 8ecef7d1c..8a61eb56e 100644 --- a/src/lv_objx/lv_arc.h +++ b/src/lv_objx/lv_arc.h @@ -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); +/** + * 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 *====================*/ diff --git a/src/lv_objx/lv_btnm.c b/src/lv_objx/lv_btnm.c index 560c8740e..9977c0645 100644 --- a/src/lv_objx/lv_btnm.c +++ b/src/lv_objx/lv_btnm.c @@ -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.y2 += btnm_area.y1; - lv_inv_area(lv_obj_get_disp(btnm), &btn_area); + lv_obj_invalidate_area(btnm, &btn_area); } /** diff --git a/src/lv_objx/lv_chart.c b/src/lv_objx/lv_chart.c index 8514a1609..05086f05c 100644 --- a/src/lv_objx/lv_chart.c +++ b/src/lv_objx/lv_chart.c @@ -1394,13 +1394,13 @@ static void invalidate_lines(lv_obj_t * chart, uint16_t i) if(i < ext->point_cnt - 1) { 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; - lv_inv_area(lv_obj_get_disp(chart), &coords); + lv_obj_invalidate_area(chart, &coords); } if(i > 0) { 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; - lv_inv_area(lv_obj_get_disp(chart), &coords); + lv_obj_invalidate_area(chart, &coords); } } diff --git a/src/lv_objx/lv_cpicker.c b/src/lv_objx/lv_cpicker.c index 95c6d26aa..74bfe64ff 100644 --- a/src/lv_objx/lv_cpicker.c +++ b/src/lv_objx/lv_cpicker.c @@ -689,7 +689,7 @@ static void invalidate_indic(lv_obj_t * 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) diff --git a/src/lv_objx/lv_label.c b/src/lv_objx/lv_label.c index 375326520..6522cb114 100644 --- a/src/lv_objx/lv_label.c +++ b/src/lv_objx/lv_label.c @@ -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) { LV_ASSERT_OBJ(label, LV_OBJX_NAME); - LV_ASSERT_STR(text); lv_label_ext_t * ext = lv_obj_get_ext_attr(label); 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*/ 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); + 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 i; uint8_t len = 0; for(i = 0; i <= LV_LABEL_DOT_NUM; i++) { len += lv_txt_encoded_size(&ext->text[byte_id]); diff --git a/src/lv_objx/lv_page.c b/src/lv_objx/lv_page.c index f7dd41136..65355597d 100644 --- a/src/lv_objx/lv_page.c +++ b/src/lv_objx/lv_page.c @@ -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*/ else if(sign == LV_SIGNAL_CHILD_CHG) { 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_right = lv_page_get_scrl_fit_right(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*/ if(page_ext->sb.mode == LV_SB_MODE_DRAG) { - lv_disp_t * disp = lv_obj_get_disp(page); lv_area_t sb_area_tmp; if(page_ext->sb.hor_draw) { 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.x2 += page->coords.x1; 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; } 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.x2 += page->coords.x1; 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; } } + } else if(sign == LV_SIGNAL_CLEANUP) { + page_ext->scrl = NULL; } return res; } @@ -1115,7 +1118,6 @@ static void lv_page_sb_refresh(lv_obj_t * page) } /*Invalidate the current (old) scrollbar areas*/ - lv_disp_t * disp = lv_obj_get_disp(page); lv_area_t sb_area_tmp; if(ext->sb.hor_draw != 0) { 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.x2 += page->coords.x1; 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) { 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.x2 += page->coords.x1; 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) { @@ -1193,7 +1195,7 @@ static void lv_page_sb_refresh(lv_obj_t * page) sb_area_tmp.y1 += page->coords.y1; sb_area_tmp.x2 += page->coords.x1; 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) { 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.x2 += page->coords.x1; sb_area_tmp.y2 += page->coords.y1; - lv_inv_area(disp, &sb_area_tmp); + lv_obj_invalidate_area(page, &sb_area_tmp); } } diff --git a/src/lv_objx/lv_preload.c b/src/lv_objx/lv_preload.c index 642a26f8e..ee37ce26f 100644 --- a/src/lv_objx/lv_preload.c +++ b/src/lv_objx/lv_preload.c @@ -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->anim_type = LV_PRELOAD_DEF_ANIM; 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*/ 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_end = angle_end % 360; - lv_arc_set_start_angle(preload, angle_start); - lv_arc_set_end_angle(preload, angle_end); + lv_arc_set_angles(preload, angle_start, angle_end); } /********************** diff --git a/src/lv_objx/lv_ta.c b/src/lv_objx/lv_ta.c index 249fe91f0..09edec4d8 100644 --- a/src/lv_objx/lv_ta.c +++ b/src/lv_objx/lv_ta.c @@ -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; lv_anim_create(&a); } else { + lv_anim_del(ta, (lv_anim_exec_xcb_t)cursor_blink_anim); ext->cursor.state = 1; } #else @@ -1581,14 +1582,13 @@ static void cursor_blink_anim(lv_obj_t * ta, lv_anim_value_t show) if(show != ext->cursor.state) { ext->cursor.state = show == 0 ? 0 : 1; if(ext->cursor.hidden == 0) { - lv_disp_t * disp = lv_obj_get_disp(ta); lv_area_t area_tmp; lv_area_copy(&area_tmp, &ext->cursor.area); area_tmp.x1 += ext->label->coords.x1; area_tmp.y1 += ext->label->coords.y1; area_tmp.x2 += ext->label->coords.x1; 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; /*Save the new area*/ - lv_disp_t * disp = lv_obj_get_disp(ta); lv_area_t area_tmp; lv_area_copy(&area_tmp, &ext->cursor.area); area_tmp.x1 += ext->label->coords.x1; area_tmp.y1 += ext->label->coords.y1; area_tmp.x2 += ext->label->coords.x1; 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); @@ -1753,7 +1752,7 @@ static void refr_cursor_area(lv_obj_t * ta) area_tmp.y1 += ext->label->coords.y1; area_tmp.x2 += ext->label->coords.x1; 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) diff --git a/src/lv_objx/lv_tabview.c b/src/lv_objx/lv_tabview.c index 71db7589e..6f2fd31c8 100644 --- a/src/lv_objx/lv_tabview.c +++ b/src/lv_objx/lv_tabview.c @@ -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. * 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 */ - lv_obj_set_size(tabview, lv_obj_get_width_fit(lv_obj_get_parent(tabview)), - lv_obj_get_height_fit(lv_obj_get_parent(tabview))); + lv_coord_t w; + 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->btns = lv_btnm_create(tabview, NULL); diff --git a/src/lv_objx/lv_tileview.c b/src/lv_objx/lv_tileview.c index 5155f0dbf..cdb1b3694 100644 --- a/src/lv_objx/lv_tileview.c +++ b/src/lv_objx/lv_tileview.c @@ -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. * 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 */ - lv_obj_set_size(new_tileview, lv_obj_get_width_fit(lv_obj_get_parent(new_tileview)), - lv_obj_get_height_fit(lv_obj_get_parent(new_tileview))); - lv_obj_set_drag_dir(lv_page_get_scrl(new_tileview), LV_DRAG_DIR_ONE); - lv_obj_set_drag_throw(lv_page_get_scrl(new_tileview), true); + lv_coord_t w; + lv_coord_t h; + if(par) { + 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_obj_reset_style(new_tileview, LV_PAGE_PART_SCRL); diff --git a/src/lv_objx/lv_win.c b/src/lv_objx/lv_win.c index e0be314f6..4ab883796 100644 --- a/src/lv_objx/lv_win.c +++ b/src/lv_objx/lv_win.c @@ -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. * 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 */ - lv_obj_set_size(new_win, lv_obj_get_width_fit(lv_obj_get_parent(new_win)), - lv_obj_get_height_fit(lv_obj_get_parent(new_win))); + lv_coord_t w; + 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); ext->page = lv_page_create(new_win, NULL);