From 0de30d7f5623553be1a3ab81ba6d0e5488234df2 Mon Sep 17 00:00:00 2001 From: guoweilkd <35251456+guoweilkd@users.noreply.github.com> Date: Tue, 22 Jun 2021 20:42:39 +0800 Subject: [PATCH] fix(txt) enhance the function of break_chars (#2327) Co-authored-by: guowei15 --- src/extra/widgets/span/lv_span.c | 25 ++++--------------------- src/misc/lv_txt.c | 28 +--------------------------- src/misc/lv_txt.h | 26 ++++++++++++++++++++++++++ 3 files changed, 31 insertions(+), 48 deletions(-) diff --git a/src/extra/widgets/span/lv_span.c b/src/extra/widgets/span/lv_span.c index ad40baaa1..412cddce5 100644 --- a/src/extra/widgets/span/lv_span.c +++ b/src/extra/widgets/span/lv_span.c @@ -50,7 +50,6 @@ static lv_opa_t lv_span_get_style_text_blend_mode(lv_obj_t * par, lv_span_t * sp static int32_t lv_span_get_style_text_decor(lv_obj_t * par, lv_span_t * span); static inline void span_text_check(const char ** text); -static inline bool is_break_char(uint32_t letter); static void get_txt_coords(const lv_obj_t * span, lv_area_t * area); static void lv_draw_span(lv_obj_t * spans, const lv_area_t * coords, const lv_area_t * mask); static bool lv_txt_get_snippet(const char * txt, const lv_font_t * font, lv_coord_t letter_space, @@ -442,9 +441,9 @@ lv_coord_t lv_spangroup_get_expand_height(lv_obj_t * obj, lv_coord_t width) /* break word deal width */ if(isfill && next_ofs > 0 && snippet_cnt > 0) { uint32_t letter = (uint32_t)cur_txt[cur_txt_ofs + next_ofs - 1]; - if(!(letter == '\0' || letter == '\n' || letter == '\r' || is_break_char(letter))) { + if(!(letter == '\0' || letter == '\n' || letter == '\r' || _lv_txt_is_break_char(letter))) { letter = (uint32_t)cur_txt[cur_txt_ofs + next_ofs]; - if(!(letter == '\0' || letter == '\n' || letter == '\r' || is_break_char(letter))) { + if(!(letter == '\0' || letter == '\n' || letter == '\r' || _lv_txt_is_break_char(letter))) { break; } } @@ -694,22 +693,6 @@ static inline void span_text_check(const char ** text) } } -static inline bool is_break_char(uint32_t letter) -{ - uint8_t i; - bool ret = false; - - /*Compare the letter to TXT_BREAK_CHARS*/ - for(i = 0; LV_TXT_BREAK_CHARS[i] != '\0'; i++) { - if(letter == (uint32_t)LV_TXT_BREAK_CHARS[i]) { - ret = true; /*If match then it is break char*/ - break; - } - } - - return ret; -} - /** * draw span group * @param spans obj handle @@ -788,9 +771,9 @@ static void lv_draw_span(lv_obj_t * obj, const lv_area_t * coords, const lv_area /* break word deal width */ if(isfill && next_ofs > 0 && lv_get_snippet_cnt() > 0) { uint32_t letter = (uint32_t)cur_txt[cur_txt_ofs + next_ofs - 1]; - if(!(letter == '\0' || letter == '\n' || letter == '\r' || is_break_char(letter))) { + if(!(letter == '\0' || letter == '\n' || letter == '\r' || _lv_txt_is_break_char(letter))) { letter = (uint32_t)cur_txt[cur_txt_ofs + next_ofs]; - if(!(letter == '\0' || letter == '\n' || letter == '\r' || is_break_char(letter))) { + if(!(letter == '\0' || letter == '\n' || letter == '\r' || _lv_txt_is_break_char(letter))) { break; } } diff --git a/src/misc/lv_txt.c b/src/misc/lv_txt.c index fa2bf0be9..10dcd1a0c 100644 --- a/src/misc/lv_txt.c +++ b/src/misc/lv_txt.c @@ -26,7 +26,6 @@ /********************** * STATIC PROTOTYPES **********************/ -static inline bool is_break_char(uint32_t letter); #if LV_TXT_ENC == LV_TXT_ENC_UTF8 static uint8_t lv_txt_utf8_size(const char * str); @@ -224,7 +223,7 @@ static uint32_t lv_txt_get_next_word(const char * txt, const lv_font_t * font, } /*Check for new line chars and breakchars*/ - if(letter == '\n' || letter == '\r' || is_break_char(letter)) { + if(letter == '\n' || letter == '\r' || _lv_txt_is_break_char(letter)) { /*Update the output width on the first character if it fits. *Must do this here in case first letter is a break character.*/ if(i == 0 && break_index == NO_BREAK_FOUND && word_w_ptr != NULL) *word_w_ptr = cur_w; @@ -895,28 +894,3 @@ static uint32_t lv_txt_iso8859_1_get_length(const char * txt) #error "Invalid character encoding. See `LV_TXT_ENC` in `lv_conf.h`" #endif - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * Test if char is break char or not (a text can broken here or not) - * @param letter a letter - * @return false: 'letter' is not break char - */ -static inline bool is_break_char(uint32_t letter) -{ - uint8_t i; - bool ret = false; - - /*Compare the letter to TXT_BREAK_CHARS*/ - for(i = 0; LV_TXT_BREAK_CHARS[i] != '\0'; i++) { - if(letter == (uint32_t)LV_TXT_BREAK_CHARS[i]) { - ret = true; /*If match then it is break char*/ - break; - } - } - - return ret; -} diff --git a/src/misc/lv_txt.h b/src/misc/lv_txt.h index e9a097e9a..0bfaf58be 100644 --- a/src/misc/lv_txt.h +++ b/src/misc/lv_txt.h @@ -154,6 +154,32 @@ char * _lv_txt_set_text_vfmt(const char * fmt, va_list ap); */ void _lv_txt_encoded_letter_next_2(const char * txt, uint32_t * letter, uint32_t * letter_next, uint32_t *ofs); +/** + * Test if char is break char or not (a text can broken here or not) + * @param letter a letter + * @return false: 'letter' is not break char + */ +static inline bool _lv_txt_is_break_char(uint32_t letter) +{ + uint8_t i; + bool ret = false; + + /* each chinese character can be break */ + if (letter >= 0x4E00 && letter <= 0x9FA5) { + return true; + } + + /*Compare the letter to TXT_BREAK_CHARS*/ + for(i = 0; LV_TXT_BREAK_CHARS[i] != '\0'; i++) { + if(letter == (uint32_t)LV_TXT_BREAK_CHARS[i]) { + ret = true; /*If match then it is break char*/ + break; + } + } + + return ret; +} + /*************************************************************** * GLOBAL FUNCTION POINTERS FOR CHARACTER ENCODING INTERFACE ***************************************************************/