fix(text): do not draw letters treated as marker (#4865)

Signed-off-by: Xu Xingliang <xuxingliang@xiaomi.com>
This commit is contained in:
Neo Xu
2023-11-27 19:50:24 +08:00
committed by GitHub
parent a51beb9051
commit 1ee89a94c0
3 changed files with 52 additions and 19 deletions

View File

@@ -100,6 +100,8 @@ LV_ATTRIBUTE_FAST_MEM void lv_draw_letter(lv_layer_t * layer, lv_draw_label_dsc_
return;
}
if(_lv_text_is_marker(unicode_letter)) return;
lv_font_glyph_dsc_t g;
lv_font_get_glyph_dsc(dsc->font, &g, unicode_letter, 0);
@@ -362,16 +364,14 @@ static void draw_letter(lv_draw_unit_t * draw_unit, lv_draw_glyph_dsc_t * dsc,
{
lv_font_glyph_dsc_t g;
if(_lv_text_is_marker(letter)) /*Markers are valid letters but should not be rendered.*/
return;
LV_PROFILER_BEGIN;
bool g_ret = lv_font_get_glyph_dsc(font, &g, letter, '\0');
if(g_ret == false) {
/*Add warning if the dsc is not found
*but do not print warning for non printable ASCII chars (e.g. '\n')*/
if(letter >= 0x20 &&
letter != 0xf8ff && /*LV_SYMBOL_DUMMY*/
letter != 0x200c) { /*ZERO WIDTH NON-JOINER*/
LV_LOG_WARN("lv_draw_letter: glyph dsc. not found for U+%" LV_PRIX32, letter);
}
/*Add warning if the dsc is not found*/
LV_LOG_WARN("lv_draw_letter: glyph dsc. not found for U+%" LV_PRIX32, letter);
}
/*Don't draw anything if the character is empty. E.g. space*/

View File

@@ -8,9 +8,11 @@
*********************/
#include "lv_font.h"
#include "../misc/lv_text.h"
#include "../misc/lv_utils.h"
#include "../misc/lv_log.h"
#include "../misc/lv_assert.h"
#include "../stdlib/lv_string.h"
/*********************
* DEFINES
@@ -86,21 +88,13 @@ bool lv_font_get_glyph_dsc(const lv_font_t * font_p, lv_font_glyph_dsc_t * dsc_o
}
#endif
if(letter < 0x20 ||
letter == 0xf8ff || /*LV_SYMBOL_DUMMY*/
letter == 0x200c) { /*ZERO WIDTH NON-JOINER*/
dsc_out->box_w = 0;
dsc_out->adv_w = 0;
}
else {
#if LV_USE_FONT_PLACEHOLDER
dsc_out->box_w = font_p->line_height / 2;
dsc_out->adv_w = dsc_out->box_w + 2;
dsc_out->box_w = font_p->line_height / 2;
dsc_out->adv_w = dsc_out->box_w + 2;
#else
dsc_out->box_w = 0;
dsc_out->adv_w = 0;
dsc_out->box_w = 0;
dsc_out->adv_w = 0;
#endif
}
dsc_out->resolved_font = NULL;
dsc_out->box_h = font_p->line_height;
@@ -116,6 +110,10 @@ uint16_t lv_font_get_glyph_width(const lv_font_t * font, uint32_t letter, uint32
{
LV_ASSERT_NULL(font);
lv_font_glyph_dsc_t g;
/*Return zero if letter is marker*/
if(_lv_text_is_marker(letter)) return 0;
lv_font_get_glyph_dsc(font, &g, letter, letter_next);
return g.adv_w;
}

View File

@@ -220,6 +220,41 @@ static inline bool _lv_text_is_a_word(uint32_t letter)
return false;
}
/**
* Test if character can be treated as marker, and don't need to be rendered.
* Note, this is not a full list. Add your findings to the list.
*
* @param letter a letter
* @return true if so
*/
static inline bool _lv_text_is_marker(uint32_t letter)
{
if(letter < 0x20) return true;
/*U+061C ARABIC LETTER MARK, see https://www.compart.com/en/unicode/block/U+0600*/
if(letter == 0x061C) return true;
/*U+115F HANGUL CHOSEONG FILLER, See https://www.compart.com/en/unicode/block/U+1100*/
if(letter == 0x115F) return true;
/*U+1160 HANGUL JUNGSEONG FILLER*/
if(letter == 0x1160) return true;
/*See https://www.compart.com/en/unicode/block/U+1800*/
if(letter >= 0x180B && letter <= 0x180E) return true;
/*See https://www.compart.com/en/unicode/block/U+2000*/
if(letter >= 0x200B && letter <= 0x200F) return true;
if(letter >= 0x2028 && letter <= 0x202F) return true;
if(letter >= 0x205F && letter <= 0x206F) return true;
/*U+FEFF ZERO WIDTH NO-BREAK SPACE, see https://www.compart.com/en/unicode/block/U+FE70*/
if(letter == 0xFEFF) return true;
if(letter == 0xF8FF) return true; /*LV_SYMBOL_DUMMY*/
return false;
}
/***************************************************************
* GLOBAL FUNCTION POINTERS FOR CHARACTER ENCODING INTERFACE
***************************************************************/