mirror of
https://github.com/lvgl/lvgl.git
synced 2026-05-28 22:30:49 +08:00
fix(text): do not draw letters treated as marker (#4865)
Signed-off-by: Xu Xingliang <xuxingliang@xiaomi.com>
This commit is contained in:
@@ -100,6 +100,8 @@ LV_ATTRIBUTE_FAST_MEM void lv_draw_letter(lv_layer_t * layer, lv_draw_label_dsc_
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(_lv_text_is_marker(unicode_letter)) return;
|
||||||
|
|
||||||
lv_font_glyph_dsc_t g;
|
lv_font_glyph_dsc_t g;
|
||||||
lv_font_get_glyph_dsc(dsc->font, &g, unicode_letter, 0);
|
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;
|
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;
|
LV_PROFILER_BEGIN;
|
||||||
bool g_ret = lv_font_get_glyph_dsc(font, &g, letter, '\0');
|
bool g_ret = lv_font_get_glyph_dsc(font, &g, letter, '\0');
|
||||||
if(g_ret == false) {
|
if(g_ret == false) {
|
||||||
/*Add warning if the dsc is not found
|
/*Add warning if the dsc is not found*/
|
||||||
*but do not print warning for non printable ASCII chars (e.g. '\n')*/
|
LV_LOG_WARN("lv_draw_letter: glyph dsc. not found for U+%" LV_PRIX32, letter);
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*Don't draw anything if the character is empty. E.g. space*/
|
/*Don't draw anything if the character is empty. E.g. space*/
|
||||||
|
|||||||
+10
-12
@@ -8,9 +8,11 @@
|
|||||||
*********************/
|
*********************/
|
||||||
|
|
||||||
#include "lv_font.h"
|
#include "lv_font.h"
|
||||||
|
#include "../misc/lv_text.h"
|
||||||
#include "../misc/lv_utils.h"
|
#include "../misc/lv_utils.h"
|
||||||
#include "../misc/lv_log.h"
|
#include "../misc/lv_log.h"
|
||||||
#include "../misc/lv_assert.h"
|
#include "../misc/lv_assert.h"
|
||||||
|
#include "../stdlib/lv_string.h"
|
||||||
|
|
||||||
/*********************
|
/*********************
|
||||||
* DEFINES
|
* 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
|
#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
|
#if LV_USE_FONT_PLACEHOLDER
|
||||||
dsc_out->box_w = font_p->line_height / 2;
|
dsc_out->box_w = font_p->line_height / 2;
|
||||||
dsc_out->adv_w = dsc_out->box_w + 2;
|
dsc_out->adv_w = dsc_out->box_w + 2;
|
||||||
#else
|
#else
|
||||||
dsc_out->box_w = 0;
|
dsc_out->box_w = 0;
|
||||||
dsc_out->adv_w = 0;
|
dsc_out->adv_w = 0;
|
||||||
#endif
|
#endif
|
||||||
}
|
|
||||||
|
|
||||||
dsc_out->resolved_font = NULL;
|
dsc_out->resolved_font = NULL;
|
||||||
dsc_out->box_h = font_p->line_height;
|
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_ASSERT_NULL(font);
|
||||||
lv_font_glyph_dsc_t g;
|
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);
|
lv_font_get_glyph_dsc(font, &g, letter, letter_next);
|
||||||
return g.adv_w;
|
return g.adv_w;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -220,6 +220,41 @@ static inline bool _lv_text_is_a_word(uint32_t letter)
|
|||||||
return false;
|
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
|
* GLOBAL FUNCTION POINTERS FOR CHARACTER ENCODING INTERFACE
|
||||||
***************************************************************/
|
***************************************************************/
|
||||||
|
|||||||
Reference in New Issue
Block a user