Revert "evas_textblock: pick textrun fonts"
authorCarsten Haitzler (Rasterman) <raster@rasterman.com>
Fri, 17 Apr 2020 18:19:52 +0000 (19:19 +0100)
committerJongmin Lee <jm105.lee@samsung.com>
Fri, 17 Apr 2020 22:25:36 +0000 (07:25 +0900)
This reverts commit 9b987c67e1e38602ba2e4c9c990798e99d938bbe.

this breaks color emoji in terminology (evas textgrid).

src/lib/evas/common/evas_font_query.c
src/tests/evas/evas_test_textblock.c

index a25c19c..ec480fd 100644 (file)
@@ -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 EINA_UNUSED, 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, const Eina_Unicode *text, int run_len)
 {
    RGBA_Font_Int *fi = NULL;
    const Eina_Unicode *run_end = text + run_len;
@@ -26,7 +26,38 @@ 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)
      {
-        fi = fn->fonts->data;
+        const Eina_Unicode *base_char = NULL;
+        /* 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;
 
         *script_fi = fi;
      }
index d26b8fc..acf2118 100644 (file)
@@ -4184,27 +4184,6 @@ 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)
@@ -5076,7 +5055,6 @@ 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