From b3a48fda3935e2d7f4a543c15e88217be6c7e8ea Mon Sep 17 00:00:00 2001 From: Ali Alzyod Date: Fri, 17 Apr 2020 12:28:41 +0900 Subject: [PATCH] evas_textblock: pick textrun fonts MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Summary: Picking font on textrun, will now give priority into font picked by the user, regardless of script type. picking font due script can cause many inconvenient results Example of wrong results: (User font is **NotoColorEmoji**) {F3847118} -> add 'a' at the end (notice how text render is wrong) {F3847119} -> add tab before 'a' (text rendering now is right) {F3847120} After Change results: (User font is **NotoColorEmoji**) {F3847118} -> add 'a' at the end -> {F3847122}-> add tab before 'a' -> {F3847123} Also now the following lines will be shown exactly the same, regardless of characters order ``` "가123A321" "A321가123" "123가A321" "A가123321" ``` Test Plan: ``` /* gcc -o example test.c `pkg-config --cflags --libs elementary` */ EAPI_MAIN int elm_main(int argc EINA_UNUSED, char **argv EINA_UNUSED) { Evas_Object *win, *en; elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED); win = elm_win_util_standard_add("", ""); elm_win_autodel_set(win, EINA_TRUE); en = elm_entry_add(win); elm_entry_scrollable_set(en, EINA_TRUE); evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_entry_text_style_user_push(en,"DEFAULT='font=NotoColorEmoji font_size=30 color=red'"); elm_object_text_set(en, "☪123456a"); evas_object_show(en); elm_object_content_set(win, en); evas_object_resize(win, 400, 200); evas_object_show(win); elm_run(); return 0; } ELM_MAIN() ``` Reviewers: woohyun, bowonryu, tasn, raster, cedric Reviewed By: tasn Subscribers: cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T8556 Differential Revision: https://phab.enlightenment.org/D11302 --- src/lib/evas/common/evas_font_query.c | 43 ++--------------------------------- src/tests/evas/evas_test_textblock.c | 22 ++++++++++++++++++ 2 files changed, 24 insertions(+), 41 deletions(-) diff --git a/src/lib/evas/common/evas_font_query.c b/src/lib/evas/common/evas_font_query.c index b954ff3..1464d7f 100644 --- a/src/lib/evas/common/evas_font_query.c +++ b/src/lib/evas/common/evas_font_query.c @@ -17,7 +17,7 @@ * @return length of the run found. */ EAPI int -evas_common_font_query_run_font_end_get(RGBA_Font *fn, RGBA_Font_Int **script_fi, RGBA_Font_Int **cur_fi, Evas_Script_Type script, const Eina_Unicode *text, int run_len) +evas_common_font_query_run_font_end_get(RGBA_Font *fn, RGBA_Font_Int **script_fi, RGBA_Font_Int **cur_fi, Evas_Script_Type script EINA_UNUSED, const Eina_Unicode *text, int run_len) { RGBA_Font_Int *fi = NULL; const Eina_Unicode *run_end = text + run_len; @@ -26,46 +26,7 @@ evas_common_font_query_run_font_end_get(RGBA_Font *fn, RGBA_Font_Int **script_fi /* If there's no current script_fi, find it first */ if (!*script_fi) { - const Eina_Unicode *base_char = NULL; - - /* TIZEN_ONLY(20180221): Don't pick a script font based on COMMON/UNKNOWN script text. */ - /* It just skip searching font if the given script is not explicit script. - * In this case, it will pick the top font as its script font. */ - if (((script) == EVAS_SCRIPT_UNKNOWN) || ((script) <= EVAS_SCRIPT_INHERITED)) - goto get_top_font; - /* END */ - - /* Skip common chars */ - for (base_char = text ; - (base_char < run_end) && - (evas_common_language_char_script_get(*base_char) != script) ; - base_char++) - ; - /* If counter reach variation sequence it is safe to pick default font */ - if(VAR_SEQ_SAFE(base_char) || (base_char != run_end && VAR_SEQ_SAFE((base_char+1)))) goto get_top_font; - - if (base_char == run_end) base_char = text; - - /* Find the first renderable char */ - while (base_char < run_end) - { - /* 0x1F is the last ASCII contral char, just a hack in - * the meanwhile. */ - if ((*base_char > 0x1F) && - evas_common_font_glyph_search(fn, &fi, *base_char, 0, EVAS_FONT_SEARCH_OPTION_NONE)) - break; - base_char++; - } - - - /* If everything else fails, at least try to find a font for the - * replacement char */ - if (base_char == run_end) - evas_common_font_glyph_search(fn, &fi, REPLACEMENT_CHAR, 0, EVAS_FONT_SEARCH_OPTION_NONE); -get_top_font: - - if (!fi) - fi = fn->fonts->data; + fi = fn->fonts->data; *script_fi = fi; } diff --git a/src/tests/evas/evas_test_textblock.c b/src/tests/evas/evas_test_textblock.c index dab090f..d3c5750 100644 --- a/src/tests/evas/evas_test_textblock.c +++ b/src/tests/evas/evas_test_textblock.c @@ -4168,6 +4168,27 @@ EFL_START_TEST(evas_textblock_fit) } EFL_END_TEST; +EFL_START_TEST(evas_textblock_textrun_font) +{ + START_TB_TEST(); + int w1, h1, w2, h2; + + evas_object_resize(tb, 300, 300); + evas_object_textblock_text_markup_set(tb, "가123A321"); + evas_object_textblock_size_native_get(tb, &w1, &h1); + evas_object_textblock_text_markup_set(tb, "A321가123"); + evas_object_textblock_size_native_get(tb, &w2, &h2); + ck_assert(w1==w2 && h1==h2); + evas_object_textblock_text_markup_set(tb, "123가A321"); + evas_object_textblock_size_native_get(tb, &w2, &h2); + ck_assert(w1==w2 && h1==h2); + evas_object_textblock_text_markup_set(tb, "A가123321"); + evas_object_textblock_size_native_get(tb, &w2, &h2); + ck_assert(w1==w2 && h1==h2); + END_TB_TEST(); +} +EFL_END_TEST; + #ifdef HAVE_HYPHEN static void _hyphenation_width_stress(Evas_Object *tb, Evas_Textblock_Cursor *cur) @@ -5038,6 +5059,7 @@ void evas_test_textblock(TCase *tc) tcase_add_test(tc, evas_textblock_delete); tcase_add_test(tc, evas_textblock_obstacle); tcase_add_test(tc, evas_textblock_fit); + tcase_add_test(tc, evas_textblock_textrun_font); #ifdef HAVE_HYPHEN tcase_add_test(tc, evas_textblock_hyphenation); #endif -- 2.7.4