diff options
author | Khaled Hosny <khaledhosny@eglug.org> | 2018-02-24 13:50:57 +0200 |
---|---|---|
committer | Oleg Oshmyan <chortos@inbox.lv> | 2019-09-26 02:34:36 +0300 |
commit | df7c00c95ec6e526bf85e6bc8296eaca66f5db8d (patch) | |
tree | c8be7f911185c76218b6f8de460bf9b7443a9eff | |
parent | f8dd7d20828167310515edf4849e85782a64c1ab (diff) | |
download | libass-df7c00c95ec6e526bf85e6bc8296eaca66f5db8d.tar.bz2 libass-df7c00c95ec6e526bf85e6bc8296eaca66f5db8d.tar.xz |
Use FriBiDi 1.x API when available
This allows making use of the updated UBA in Unicode 6.3 and up.
-rw-r--r-- | libass/ass_shaper.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/libass/ass_shaper.c b/libass/ass_shaper.c index fff40db6..1a75ef1f 100644 --- a/libass/ass_shaper.c +++ b/libass/ass_shaper.c @@ -39,6 +39,10 @@ enum { #define NUM_FEATURES 5 #endif +#if FRIBIDI_MAJOR_VERSION >= 1 +#define USE_FRIBIDI_EX_API +#endif + struct ass_shaper { ASS_ShapingLevel shaping_level; @@ -46,6 +50,9 @@ struct ass_shaper { int n_glyphs; FriBidiChar *event_text; FriBidiCharType *ctypes; +#ifdef USE_FRIBIDI_EX_API + FriBidiBracketType *btypes; +#endif FriBidiLevel *emblevels; FriBidiStrIndex *cmap; FriBidiParType base_direction; @@ -97,6 +104,9 @@ static bool check_allocations(ASS_Shaper *shaper, size_t new_size) if (new_size > shaper->n_glyphs) { if (!ASS_REALLOC_ARRAY(shaper->event_text, new_size) || !ASS_REALLOC_ARRAY(shaper->ctypes, new_size) || +#ifdef USE_FRIBIDI_EX_API + !ASS_REALLOC_ARRAY(shaper->btypes, new_size) || +#endif !ASS_REALLOC_ARRAY(shaper->emblevels, new_size) || !ASS_REALLOC_ARRAY(shaper->cmap, new_size)) return false; @@ -116,6 +126,9 @@ void ass_shaper_free(ASS_Shaper *shaper) #endif free(shaper->event_text); free(shaper->ctypes); +#ifdef USE_FRIBIDI_EX_API + free(shaper->btypes); +#endif free(shaper->emblevels); free(shaper->cmap); free(shaper); @@ -877,8 +890,17 @@ int ass_shaper_shape(ASS_Shaper *shaper, TextInfo *text_info) dir = shaper->base_direction; fribidi_get_bidi_types(shaper->event_text + last_break, i - last_break + 1, shaper->ctypes + last_break); +#ifdef USE_FRIBIDI_EX_API + fribidi_get_bracket_types(shaper->event_text + last_break, + i - last_break + 1, shaper->ctypes + last_break, + shaper->btypes + last_break); + ret = fribidi_get_par_embedding_levels_ex( + shaper->ctypes + last_break, shaper->btypes + last_break, + i - last_break + 1, &dir, shaper->emblevels + last_break); +#else ret = fribidi_get_par_embedding_levels(shaper->ctypes + last_break, i - last_break + 1, &dir, shaper->emblevels + last_break); +#endif if (ret == 0) return -1; last_break = i + 1; |