tasn pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=33ea5653477c97072c62c7d7d32b6263b89f8509
commit 33ea5653477c97072c62c7d7d32b6263b89f8509 Author: Youngbok Shin <youngb.s...@samsung.com> Date: Thu Feb 4 10:07:08 2016 +0000 Evas: Use proper language for harfbuzz shaping Summary: Evas Text, Textblock, Textgrid keeps own language information. This language information could be vary from the result of setlocale(). Especially, Evas Textblock supports <lang> tag. The language could be changed in the middle of text. All of these language has to be used for harfbuzz shaping. @fix Test Plan: N/A Reviewers: herdsman, raster, woohyun, tasn Reviewed By: tasn Subscribers: cedric, jpeg Differential Revision: https://phab.enlightenment.org/D3628 --- src/lib/evas/canvas/evas_object_text.c | 3 ++- src/lib/evas/canvas/evas_object_textblock.c | 9 ++++++--- src/lib/evas/canvas/evas_object_textgrid.c | 6 ++++-- src/lib/evas/common/evas_font_ot.c | 5 ++--- src/lib/evas/common/evas_font_ot.h | 2 +- src/lib/evas/common/evas_text_utils.c | 9 +++++---- src/lib/evas/common/evas_text_utils.h | 2 +- src/lib/evas/include/evas_private.h | 2 +- src/modules/evas/engines/software_generic/evas_engine.c | 4 ++-- 9 files changed, 24 insertions(+), 18 deletions(-) diff --git a/src/lib/evas/canvas/evas_object_text.c b/src/lib/evas/canvas/evas_object_text.c index 0402781..3ccac40 100644 --- a/src/lib/evas/canvas/evas_object_text.c +++ b/src/lib/evas/canvas/evas_object_text.c @@ -546,7 +546,8 @@ _evas_object_text_item_new(Evas_Object_Protected_Data *obj, { ENFN->font_text_props_info_create(ENDT, fi, str + pos, &it->text_props, - o->bidi_par_props, it->text_pos, len, EVAS_TEXT_PROPS_MODE_SHAPE); + o->bidi_par_props, it->text_pos, len, EVAS_TEXT_PROPS_MODE_SHAPE, + o->cur.fdesc->lang); _evas_object_text_item_update_sizes(obj, o, it); } o->items = (Evas_Object_Text_Item *) diff --git a/src/lib/evas/canvas/evas_object_textblock.c b/src/lib/evas/canvas/evas_object_textblock.c index 17c37c4..743f35e 100644 --- a/src/lib/evas/canvas/evas_object_textblock.c +++ b/src/lib/evas/canvas/evas_object_textblock.c @@ -4086,7 +4086,8 @@ skip: { ENFN->font_text_props_info_create(ENDT, cur_fi, str, &ti->text_props, c->par->bidi_props, - ti->parent.text_pos, run_len, EVAS_TEXT_PROPS_MODE_SHAPE); + ti->parent.text_pos, run_len, EVAS_TEXT_PROPS_MODE_SHAPE, + ti->parent.format->font.fdesc->lang); } while ((queue->start + queue->off) < (run_start + run_len)) @@ -4765,7 +4766,8 @@ _layout_ellipsis_item_new(Ctxt *c, const Evas_Object_Textblock_Item *cur_it) ENFN->font_text_props_info_create(ENDT, cur_fi, _ellip_str, &ellip_ti->text_props, - c->par->bidi_props, ellip_ti->parent.text_pos, len, EVAS_TEXT_PROPS_MODE_SHAPE); + c->par->bidi_props, ellip_ti->parent.text_pos, len, EVAS_TEXT_PROPS_MODE_SHAPE, + ellip_ti->parent.format->font.fdesc->lang); } _text_item_update_sizes(c, ellip_ti); @@ -7541,7 +7543,8 @@ _layout_hyphen_item_new(Ctxt *c, const Evas_Object_Textblock_Text_Item *cur_ti) ENFN->font_text_props_info_create(ENDT, cur_fi, _hyphen_str, &hyphen_ti->text_props, - c->par->bidi_props, hyphen_ti->parent.text_pos, len, EVAS_TEXT_PROPS_MODE_SHAPE); + c->par->bidi_props, hyphen_ti->parent.text_pos, len, EVAS_TEXT_PROPS_MODE_SHAPE, + hyphen_ti->parent.format->font.fdesc->lang); } _text_item_update_sizes(c, hyphen_ti); diff --git a/src/lib/evas/canvas/evas_object_textgrid.c b/src/lib/evas/canvas/evas_object_textgrid.c index 7aa7216..bc2f9d9 100644 --- a/src/lib/evas/canvas/evas_object_textgrid.c +++ b/src/lib/evas/canvas/evas_object_textgrid.c @@ -189,7 +189,8 @@ evas_object_textgrid_textprop_get(Evas_Object *eo_obj, Evas_Textgrid_Data *o, Ei evas_common_text_props_script_set(&(glyph->props[idx]), script); ENFN->font_text_props_info_create(ENDT, script_fi, &codepoint, &(glyph->props[idx]), NULL, 0, 1, - EVAS_TEXT_PROPS_MODE_NONE); + EVAS_TEXT_PROPS_MODE_NONE, + o->cur.font_description->lang); (*used)++; } else @@ -1216,7 +1217,8 @@ _evas_textgrid_efl_text_properties_font_set(Eo *eo_obj, Evas_Textgrid_Data *o, c evas_common_text_props_script_set(&text_props, script); ENFN->font_text_props_info_create(ENDT, script_fi, W, &text_props, NULL, 0, 1, - EVAS_TEXT_PROPS_MODE_NONE); + EVAS_TEXT_PROPS_MODE_NONE, + o->cur.font_description->lang); advance = ENFN->font_h_advance_get(ENDT, o->font, &text_props); vadvance = ENFN->font_v_advance_get(ENDT, o->font, &text_props); o->cur.char_width = advance; diff --git a/src/lib/evas/common/evas_font_ot.c b/src/lib/evas/common/evas_font_ot.c index a5fe5b2..3c4d4db 100644 --- a/src/lib/evas/common/evas_font_ot.c +++ b/src/lib/evas/common/evas_font_ot.c @@ -268,7 +268,7 @@ _evas_common_font_ot_shape(hb_buffer_t *buffer, RGBA_Font_Int *fi, Evas_Text_Pro EAPI Eina_Bool evas_common_font_ot_populate_text_props(const Eina_Unicode *text, - Evas_Text_Props *props, int len, Evas_Text_Props_Mode mode) + Evas_Text_Props *props, int len, Evas_Text_Props_Mode mode, const char *lang) { RGBA_Font_Int *fi; hb_buffer_t *buffer; @@ -293,8 +293,7 @@ evas_common_font_ot_populate_text_props(const Eina_Unicode *text, buffer = hb_buffer_create(); hb_buffer_set_unicode_funcs(buffer, _evas_common_font_ot_unicode_funcs_get()); - hb_buffer_set_language(buffer, hb_language_from_string( - evas_common_language_from_locale_get(), -1)); + hb_buffer_set_language(buffer, hb_language_from_string(lang, -1)); hb_buffer_set_script(buffer, _evas_script_to_harfbuzz[props->script]); hb_buffer_set_direction(buffer, (props->bidi_dir == EVAS_BIDI_DIRECTION_RTL) ? diff --git a/src/lib/evas/common/evas_font_ot.h b/src/lib/evas/common/evas_font_ot.h index 6f66731..fe263db 100644 --- a/src/lib/evas/common/evas_font_ot.h +++ b/src/lib/evas/common/evas_font_ot.h @@ -34,6 +34,6 @@ evas_common_font_ot_cluster_size_get(const Evas_Text_Props *props, size_t char_i EAPI Eina_Bool evas_common_font_ot_populate_text_props(const Eina_Unicode *text, - Evas_Text_Props *props, int len, Evas_Text_Props_Mode mode); + Evas_Text_Props *props, int len, Evas_Text_Props_Mode mode, const char *lang); #endif diff --git a/src/lib/evas/common/evas_text_utils.c b/src/lib/evas/common/evas_text_utils.c index bef21fe..9223c6e 100644 --- a/src/lib/evas/common/evas_text_utils.c +++ b/src/lib/evas/common/evas_text_utils.c @@ -343,13 +343,13 @@ evas_common_text_props_merge(Evas_Text_Props *item1, #ifdef OT_SUPPORT static inline void _content_create_ot(RGBA_Font_Int *fi, const Eina_Unicode *text, - Evas_Text_Props *text_props, int len, Evas_Text_Props_Mode mode) + Evas_Text_Props *text_props, int len, Evas_Text_Props_Mode mode, const char *lang) { size_t char_index; Evas_Font_Glyph_Info *gl_itr; Evas_Coord pen_x = 0, adjust_x = 0; - evas_common_font_ot_populate_text_props(text, text_props, len, mode); + evas_common_font_ot_populate_text_props(text, text_props, len, mode, lang); gl_itr = text_props->info->glyph; for (char_index = 0 ; char_index < text_props->len ; char_index++) @@ -520,7 +520,7 @@ _content_create_regular(RGBA_Font_Int *fi, const Eina_Unicode *text, EAPI Eina_Bool evas_common_text_props_content_create(void *_fi, const Eina_Unicode *text, Evas_Text_Props *text_props, const Evas_BiDi_Paragraph_Props *par_props, - size_t par_pos, int len, Evas_Text_Props_Mode mode) + size_t par_pos, int len, Evas_Text_Props_Mode mode, const char *lang) { RGBA_Font_Int *fi = (RGBA_Font_Int *) _fi; @@ -558,8 +558,9 @@ evas_common_text_props_content_create(void *_fi, const Eina_Unicode *text, #ifdef OT_SUPPORT (void) par_props; (void) par_pos; - _content_create_ot(fi, text, text_props, len, mode); + _content_create_ot(fi, text, text_props, len, mode, lang); #else + (void) lang; _content_create_regular(fi, text, text_props, par_props, par_pos, len, mode); #endif diff --git a/src/lib/evas/common/evas_text_utils.h b/src/lib/evas/common/evas_text_utils.h index e54046d..2c49dcb 100644 --- a/src/lib/evas/common/evas_text_utils.h +++ b/src/lib/evas/common/evas_text_utils.h @@ -157,7 +157,7 @@ evas_common_text_props_script_set(Evas_Text_Props *props, Evas_Script_Type scr); EAPI Eina_Bool evas_common_text_props_content_create(void *_fi, const Eina_Unicode *text, Evas_Text_Props *text_props, const Evas_BiDi_Paragraph_Props *par_props, - size_t par_pos, int len, Evas_Text_Props_Mode mode); + size_t par_pos, int len, Evas_Text_Props_Mode mode, const char *lang); void evas_common_text_props_content_copy_and_ref(Evas_Text_Props *dst, diff --git a/src/lib/evas/include/evas_private.h b/src/lib/evas/include/evas_private.h index 41fe143..91cdbe7 100644 --- a/src/lib/evas/include/evas_private.h +++ b/src/lib/evas/include/evas_private.h @@ -1378,7 +1378,7 @@ struct _Evas_Func void (*image_content_hint_set) (void *data, void *surface, int hint); int (*image_content_hint_get) (void *data, void *surface); int (*font_pen_coords_get) (void *data, Evas_Font_Set *font, const Evas_Text_Props *intl_props, int pos, int *cpen_x, int *cy, int *cadv, int *ch); - Eina_Bool (*font_text_props_info_create) (void *data, Evas_Font_Instance *fi, const Eina_Unicode *text, Evas_Text_Props *intl_props, const Evas_BiDi_Paragraph_Props *par_props, size_t pos, size_t len, Evas_Text_Props_Mode mode); + Eina_Bool (*font_text_props_info_create) (void *data, Evas_Font_Instance *fi, const Eina_Unicode *text, Evas_Text_Props *intl_props, const Evas_BiDi_Paragraph_Props *par_props, size_t pos, size_t len, Evas_Text_Props_Mode mode, const char *lang); int (*font_right_inset_get) (void *data, Evas_Font_Set *font, const Evas_Text_Props *text_props); /* EFL-GL Glue Layer */ diff --git a/src/modules/evas/engines/software_generic/evas_engine.c b/src/modules/evas/engines/software_generic/evas_engine.c index 8a4429a..e147814 100644 --- a/src/modules/evas/engines/software_generic/evas_engine.c +++ b/src/modules/evas/engines/software_generic/evas_engine.c @@ -2729,10 +2729,10 @@ eng_font_pen_coords_get(void *data EINA_UNUSED, Evas_Font_Set *font, const Evas_ } static Eina_Bool -eng_font_text_props_info_create(void *data EINA_UNUSED, Evas_Font_Instance *fi, const Eina_Unicode *text, Evas_Text_Props *text_props, const Evas_BiDi_Paragraph_Props *par_props, size_t par_pos, size_t len, Evas_Text_Props_Mode mode) +eng_font_text_props_info_create(void *data EINA_UNUSED, Evas_Font_Instance *fi, const Eina_Unicode *text, Evas_Text_Props *text_props, const Evas_BiDi_Paragraph_Props *par_props, size_t par_pos, size_t len, Evas_Text_Props_Mode mode, const char *lang) { return evas_common_text_props_content_create((RGBA_Font_Int *) fi, text, - text_props, par_props, par_pos, len, mode); + text_props, par_props, par_pos, len, mode, lang); } static int --