forked from enlightenment/efl
evas: apply fribidi bracket types to show paired bracket properly
Summary: The fribidi couldn't reorganize paired brackets (Ex. '(', ')') when there is RTL + LTR text. According to TR9(http://www.unicode.org/reports/tr9/), it has to be shown properly without LRM or RLM. Also, from the fribidi 1.0.0, fribidi_get_par_embedding_levels() was deprecated. It is replaced with fribidi_get_par_embedding_levels_ex() which is including paired brankets rules from TR9. @feature Test Plan: 1. Create a elm_entry. 2. Set a text by calling text_set. elm_entry_entry_set(entry, "مرحبا Hello (40)"); 3. Run and see the results. - Without this patch or fribidi 1.X.X, it will show text like this... "(Hello (40 مرحبا" - With this patch and fribidi >= 1.0.0 "Hello (40) مرحبا" Reviewers: raster, cedric, herdsman, woohyun Reviewed By: herdsman Differential Revision: https://phab.enlightenment.org/D5921
This commit is contained in:
parent
e4fbab8b47
commit
4c36461233
|
@ -234,6 +234,10 @@ evas_bidi_paragraph_props_get(const Eina_Unicode *eina_ustr, size_t len,
|
|||
EvasBiDiLevel *embedding_levels = NULL;
|
||||
const FriBidiChar *ustr;
|
||||
FriBidiChar *base_ustr = NULL;
|
||||
EvasBiDiLevel ret_level = 0;
|
||||
#if FRIBIDI_MAJOR_VERSION >= 1
|
||||
EvasBiDiBracketType *bracket_types = NULL;
|
||||
#endif
|
||||
|
||||
if (!eina_ustr)
|
||||
return NULL;
|
||||
|
@ -266,6 +270,15 @@ evas_bidi_paragraph_props_get(const Eina_Unicode *eina_ustr, size_t len,
|
|||
}
|
||||
fribidi_get_bidi_types(ustr, len, char_types);
|
||||
|
||||
#if FRIBIDI_MAJOR_VERSION >= 1
|
||||
bracket_types = (EvasBiDiBracketType *) malloc(sizeof(EvasBiDiBracketType) * len);
|
||||
if (!bracket_types)
|
||||
{
|
||||
goto cleanup;
|
||||
}
|
||||
fribidi_get_bracket_types(ustr, len, char_types, bracket_types);
|
||||
#endif
|
||||
|
||||
embedding_levels = (EvasBiDiLevel *)malloc(sizeof(EvasBiDiLevel) * len);
|
||||
if (!embedding_levels)
|
||||
{
|
||||
|
@ -282,10 +295,19 @@ evas_bidi_paragraph_props_get(const Eina_Unicode *eina_ustr, size_t len,
|
|||
for (itr = segment_idxs ; *itr > 0 ; itr++)
|
||||
{
|
||||
direction = base_bidi;
|
||||
if (!fribidi_get_par_embedding_levels(char_types + pos,
|
||||
#if FRIBIDI_MAJOR_VERSION >= 1
|
||||
ret_level = fribidi_get_par_embedding_levels_ex(char_types + pos,
|
||||
bracket_types,
|
||||
*itr - pos,
|
||||
&direction,
|
||||
embedding_levels + pos))
|
||||
embedding_levels + pos);
|
||||
#else
|
||||
ret_level = fribidi_get_par_embedding_levels(char_types + pos,
|
||||
*itr - pos,
|
||||
&direction,
|
||||
embedding_levels + pos);
|
||||
#endif
|
||||
if (!ret_level)
|
||||
{
|
||||
goto cleanup;
|
||||
}
|
||||
|
@ -308,10 +330,19 @@ evas_bidi_paragraph_props_get(const Eina_Unicode *eina_ustr, size_t len,
|
|||
}
|
||||
|
||||
direction = base_bidi;
|
||||
if (!fribidi_get_par_embedding_levels(char_types + pos,
|
||||
#if FRIBIDI_MAJOR_VERSION >= 1
|
||||
ret_level = fribidi_get_par_embedding_levels_ex(char_types + pos,
|
||||
bracket_types,
|
||||
len - pos,
|
||||
&direction,
|
||||
embedding_levels + pos))
|
||||
embedding_levels + pos);
|
||||
#else
|
||||
ret_level = fribidi_get_par_embedding_levels(char_types + pos,
|
||||
len - pos,
|
||||
&direction,
|
||||
embedding_levels + pos);
|
||||
#endif
|
||||
if (!ret_level)
|
||||
{
|
||||
goto cleanup;
|
||||
}
|
||||
|
@ -328,8 +359,19 @@ evas_bidi_paragraph_props_get(const Eina_Unicode *eina_ustr, size_t len,
|
|||
}
|
||||
else
|
||||
{
|
||||
if (!fribidi_get_par_embedding_levels(char_types, len,
|
||||
&bidi_props->direction, embedding_levels))
|
||||
#if FRIBIDI_MAJOR_VERSION >= 1
|
||||
ret_level = fribidi_get_par_embedding_levels_ex(char_types,
|
||||
bracket_types,
|
||||
len,
|
||||
&bidi_props->direction,
|
||||
embedding_levels);
|
||||
#else
|
||||
ret_level = fribidi_get_par_embedding_levels(char_types,
|
||||
len,
|
||||
&bidi_props->direction,
|
||||
embedding_levels);
|
||||
#endif
|
||||
if (!ret_level)
|
||||
{
|
||||
goto cleanup;
|
||||
}
|
||||
|
@ -352,13 +394,19 @@ evas_bidi_paragraph_props_get(const Eina_Unicode *eina_ustr, size_t len,
|
|||
bidi_props->char_types = char_types;
|
||||
|
||||
if (base_ustr) free(base_ustr);
|
||||
|
||||
#if FRIBIDI_MAJOR_VERSION >= 1
|
||||
/* Currently, bracket_types is not reused in other places. */
|
||||
if (bracket_types) free(bracket_types);
|
||||
#endif
|
||||
|
||||
return bidi_props;
|
||||
|
||||
/* Cleanup */
|
||||
cleanup:
|
||||
if (char_types) free(char_types);
|
||||
#if FRIBIDI_MAJOR_VERSION >= 1
|
||||
if (bracket_types) free(bracket_types);
|
||||
#endif
|
||||
if (embedding_levels) free(embedding_levels);
|
||||
if (base_ustr) free(base_ustr);
|
||||
if (bidi_props) evas_bidi_paragraph_props_unref(bidi_props); /* Clean up the bidi props */
|
||||
|
|
|
@ -56,6 +56,9 @@ _EVAS_BIDI_TYPEDEF(ParType);
|
|||
_EVAS_BIDI_TYPEDEF(StrIndex);
|
||||
_EVAS_BIDI_TYPEDEF(Level);
|
||||
_EVAS_BIDI_TYPEDEF(JoiningType);
|
||||
#if FRIBIDI_MAJOR_VERSION >= 1
|
||||
_EVAS_BIDI_TYPEDEF(BracketType);
|
||||
#endif
|
||||
|
||||
typedef struct _Evas_BiDi_Paragraph_Props Evas_BiDi_Paragraph_Props;
|
||||
typedef struct _Evas_BiDi_Props Evas_BiDi_Props;
|
||||
|
|
Loading…
Reference in New Issue