fix(txt) enhance the function of break_chars (#2327)

Co-authored-by: guowei15 <guowei15@xiaomi.com>
This commit is contained in:
guoweilkd
2021-06-22 20:42:39 +08:00
committed by Gabor Kiss-Vamosi
parent bff9546c26
commit 0de30d7f56
3 changed files with 31 additions and 48 deletions

View File

@@ -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;
}
}

View File

@@ -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;
}

View File

@@ -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
***************************************************************/