From 6c55ba5d31add41980d7e25818cd55a2b1e7a75e Mon Sep 17 00:00:00 2001 From: Brian Pugh Date: Fri, 11 Jan 2019 08:57:23 -0800 Subject: [PATCH] Fixed characters jumping after character after future break character --- lv_misc/lv_txt.c | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/lv_misc/lv_txt.c b/lv_misc/lv_txt.c index 688e8d310..9759edc59 100644 --- a/lv_misc/lv_txt.c +++ b/lv_misc/lv_txt.c @@ -152,7 +152,7 @@ uint16_t lv_txt_get_next_line(const char * txt, const lv_font_t * font, uint32_t i = 0; lv_coord_t cur_w = 0; lv_coord_t w_at_last_break = 0; - uint32_t n_char_since_last_break = 0; + uint32_t n_char_since_last_break = 0; /* Used count word length of long words */ uint32_t last_break = NO_BREAK_FOUND; lv_txt_cmd_state_t cmd_state = LV_TXT_CMD_STATE_WAIT; uint32_t letter = 0; @@ -160,7 +160,6 @@ uint16_t lv_txt_get_next_line(const char * txt, const lv_font_t * font, while(txt[i] != '\0') { lv_coord_t letter_width; letter = lv_txt_encoded_next(txt, &i); - n_char_since_last_break++; /*Handle the recolor command*/ if((flag & LV_TXT_FLAG_RECOLOR) != 0) { @@ -169,6 +168,7 @@ uint16_t lv_txt_get_next_line(const char * txt, const lv_font_t * font, } } + /*Check for new line chars*/ if(letter == '\n' || letter == '\r') { uint32_t i_tmp = i; @@ -178,52 +178,65 @@ uint16_t lv_txt_get_next_line(const char * txt, const lv_font_t * font, return i; /*Return with the first letter of the next line*/ } else { /*Check the actual length*/ + n_char_since_last_break++; letter_width = lv_font_get_width(font, letter); cur_w += letter_width; - /*If the txt is too long then finish, this is the line endi. - * The current character doesn't fit. */ + /* Get the length of the current work and determine best place + * to break the line. */ if(cur_w > max_width) { if( last_break != NO_BREAK_FOUND ) { /* Continue searching for next breakable character to see if the next word will fit */ uint32_t n_char_fit = n_char_since_last_break; - if( 0 || n_char_since_last_break <= LV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN ) { + if( n_char_since_last_break <= LV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN ) { i = last_break; } else { uint32_t i_tmp = i; cur_w -= w_at_last_break + letter_space; /*ignore the first letter_space after the break char */ + bool other = true; while(txt[i_tmp] != '\0') { letter = lv_txt_encoded_next(txt, &i_tmp); - n_char_since_last_break++; + + /*Handle the recolor command*/ + if((flag & LV_TXT_FLAG_RECOLOR) != 0) { + if(lv_txt_is_cmd(&cmd_state, letter) != false) { + continue; /*Skip the letter is it is part of a command*/ + } + } + /*Check for new line chars*/ if(letter == '\n' || letter == '\r' || is_break_char(letter)) { if(n_char_since_last_break >= LV_TXT_LINE_BREAK_LONG_LEN) { /* Figure out the prettiest place to break */ uint32_t char_remain; + lv_txt_encoded_prev(txt, &i); for(char_remain=n_char_since_last_break - n_char_fit; char_remain < LV_TXT_LINE_BREAK_LONG_POST_MIN_LEN; - char_remain++){ + char_remain++) { lv_txt_encoded_prev(txt, &i); } } else{ i = last_break; } + other = false; break; } + n_char_since_last_break++; lv_coord_t letter_width = lv_font_get_width(font, letter); cur_w += letter_width; if(cur_w > max_width) { /* Current letter already exceeds, return previous */ lv_txt_encoded_prev(txt, &i); + other = false; break; } if(letter_width > 0){ cur_w += letter_space; } } - if(txt[i_tmp] == '\0') { + if( other ) { if(n_char_since_last_break >= LV_TXT_LINE_BREAK_LONG_LEN) { /* Figure out the prettiest place to break */ uint32_t char_remain; @@ -237,7 +250,6 @@ uint16_t lv_txt_get_next_line(const char * txt, const lv_font_t * font, else{ i = last_break; } - } } } else { @@ -257,6 +269,9 @@ uint16_t lv_txt_get_next_line(const char * txt, const lv_font_t * font, else if(is_break_char(letter)) { last_break = i; /*Save the first char index after break*/ w_at_last_break = cur_w; + if(letter_width > 0) { + w_at_last_break += letter_space; + } n_char_since_last_break = 0; } }