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;
|
EvasBiDiLevel *embedding_levels = NULL;
|
||||||
const FriBidiChar *ustr;
|
const FriBidiChar *ustr;
|
||||||
FriBidiChar *base_ustr = NULL;
|
FriBidiChar *base_ustr = NULL;
|
||||||
|
EvasBiDiLevel ret_level = 0;
|
||||||
|
#if FRIBIDI_MAJOR_VERSION >= 1
|
||||||
|
EvasBiDiBracketType *bracket_types = NULL;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (!eina_ustr)
|
if (!eina_ustr)
|
||||||
return NULL;
|
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);
|
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);
|
embedding_levels = (EvasBiDiLevel *)malloc(sizeof(EvasBiDiLevel) * len);
|
||||||
if (!embedding_levels)
|
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++)
|
for (itr = segment_idxs ; *itr > 0 ; itr++)
|
||||||
{
|
{
|
||||||
direction = base_bidi;
|
direction = base_bidi;
|
||||||
if (!fribidi_get_par_embedding_levels(char_types + pos,
|
#if FRIBIDI_MAJOR_VERSION >= 1
|
||||||
*itr - pos,
|
ret_level = fribidi_get_par_embedding_levels_ex(char_types + pos,
|
||||||
&direction,
|
bracket_types,
|
||||||
embedding_levels + pos))
|
*itr - pos,
|
||||||
|
&direction,
|
||||||
|
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;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
@ -308,10 +330,19 @@ evas_bidi_paragraph_props_get(const Eina_Unicode *eina_ustr, size_t len,
|
||||||
}
|
}
|
||||||
|
|
||||||
direction = base_bidi;
|
direction = base_bidi;
|
||||||
if (!fribidi_get_par_embedding_levels(char_types + pos,
|
#if FRIBIDI_MAJOR_VERSION >= 1
|
||||||
len - pos,
|
ret_level = fribidi_get_par_embedding_levels_ex(char_types + pos,
|
||||||
&direction,
|
bracket_types,
|
||||||
embedding_levels + pos))
|
len - pos,
|
||||||
|
&direction,
|
||||||
|
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;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
@ -328,8 +359,19 @@ evas_bidi_paragraph_props_get(const Eina_Unicode *eina_ustr, size_t len,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!fribidi_get_par_embedding_levels(char_types, len,
|
#if FRIBIDI_MAJOR_VERSION >= 1
|
||||||
&bidi_props->direction, embedding_levels))
|
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;
|
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;
|
bidi_props->char_types = char_types;
|
||||||
|
|
||||||
if (base_ustr) free(base_ustr);
|
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;
|
return bidi_props;
|
||||||
|
|
||||||
/* Cleanup */
|
/* Cleanup */
|
||||||
cleanup:
|
cleanup:
|
||||||
if (char_types) free(char_types);
|
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 (embedding_levels) free(embedding_levels);
|
||||||
if (base_ustr) free(base_ustr);
|
if (base_ustr) free(base_ustr);
|
||||||
if (bidi_props) evas_bidi_paragraph_props_unref(bidi_props); /* Clean up the bidi props */
|
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(StrIndex);
|
||||||
_EVAS_BIDI_TYPEDEF(Level);
|
_EVAS_BIDI_TYPEDEF(Level);
|
||||||
_EVAS_BIDI_TYPEDEF(JoiningType);
|
_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_Paragraph_Props Evas_BiDi_Paragraph_Props;
|
||||||
typedef struct _Evas_BiDi_Props Evas_BiDi_Props;
|
typedef struct _Evas_BiDi_Props Evas_BiDi_Props;
|
||||||
|
|
Loading…
Reference in New Issue