fix(txt) enhance the function of break_chars (#2327)
Co-authored-by: guowei15 <guowei15@xiaomi.com>
This commit is contained in:
committed by
Gabor Kiss-Vamosi
parent
bff9546c26
commit
0de30d7f56
@@ -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 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 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 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 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,
|
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 */
|
/* break word deal width */
|
||||||
if(isfill && next_ofs > 0 && snippet_cnt > 0) {
|
if(isfill && next_ofs > 0 && snippet_cnt > 0) {
|
||||||
uint32_t letter = (uint32_t)cur_txt[cur_txt_ofs + next_ofs - 1];
|
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];
|
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;
|
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
|
* draw span group
|
||||||
* @param spans obj handle
|
* @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 */
|
/* break word deal width */
|
||||||
if(isfill && next_ofs > 0 && lv_get_snippet_cnt() > 0) {
|
if(isfill && next_ofs > 0 && lv_get_snippet_cnt() > 0) {
|
||||||
uint32_t letter = (uint32_t)cur_txt[cur_txt_ofs + next_ofs - 1];
|
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];
|
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;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,7 +26,6 @@
|
|||||||
/**********************
|
/**********************
|
||||||
* STATIC PROTOTYPES
|
* STATIC PROTOTYPES
|
||||||
**********************/
|
**********************/
|
||||||
static inline bool is_break_char(uint32_t letter);
|
|
||||||
|
|
||||||
#if LV_TXT_ENC == LV_TXT_ENC_UTF8
|
#if LV_TXT_ENC == LV_TXT_ENC_UTF8
|
||||||
static uint8_t lv_txt_utf8_size(const char * str);
|
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*/
|
/*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.
|
/*Update the output width on the first character if it fits.
|
||||||
*Must do this here in case first letter is a break character.*/
|
*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;
|
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`"
|
#error "Invalid character encoding. See `LV_TXT_ENC` in `lv_conf.h`"
|
||||||
|
|
||||||
#endif
|
#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;
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -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);
|
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
|
* GLOBAL FUNCTION POINTERS FOR CHARACTER ENCODING INTERFACE
|
||||||
***************************************************************/
|
***************************************************************/
|
||||||
|
|||||||
Reference in New Issue
Block a user