diff options
Diffstat (limited to 'libass/ass_shaper.c')
-rw-r--r-- | libass/ass_shaper.c | 33 |
1 files changed, 21 insertions, 12 deletions
diff --git a/libass/ass_shaper.c b/libass/ass_shaper.c index ab94f10..fc12974 100644 --- a/libass/ass_shaper.c +++ b/libass/ass_shaper.c @@ -39,10 +39,6 @@ enum { #define NUM_FEATURES 5 #endif -#if FRIBIDI_MAJOR_VERSION >= 1 -#define USE_FRIBIDI_EX_API -#endif - struct ass_shaper { ASS_ShapingLevel shaping_level; @@ -50,9 +46,6 @@ 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; @@ -66,6 +59,11 @@ struct ass_shaper { // Glyph metrics cache, to speed up shaping Cache *metrics_cache; #endif + +#ifdef USE_FRIBIDI_EX_API + FriBidiBracketType *btypes; + bool bidi_brackets; +#endif }; #ifdef CONFIG_HARFBUZZ @@ -105,7 +103,7 @@ static bool check_allocations(ASS_Shaper *shaper, size_t new_size) 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) || + (shaper->bidi_brackets && !ASS_REALLOC_ARRAY(shaper->btypes, new_size)) || #endif !ASS_REALLOC_ARRAY(shaper->emblevels, new_size) || !ASS_REALLOC_ARRAY(shaper->cmap, new_size)) @@ -860,6 +858,13 @@ void ass_shaper_set_level(ASS_Shaper *shaper, ASS_ShapingLevel level) shaper->shaping_level = level; } +#ifdef USE_FRIBIDI_EX_API +void ass_shaper_set_bidi_brackets(ASS_Shaper *shaper, bool match_brackets) +{ + shaper->bidi_brackets = match_brackets; +} +#endif + /** * \brief Remove all zero-width invisible characters from the text. * \param text_info text @@ -907,11 +912,15 @@ int ass_shaper_shape(ASS_Shaper *shaper, TextInfo *text_info) 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); + FriBidiBracketType *btypes = NULL; + if (shaper->bidi_brackets) { + btypes = shaper->btypes + last_break; + fribidi_get_bracket_types(shaper->event_text + last_break, + i - last_break + 1, shaper->ctypes + last_break, + btypes); + } ret = fribidi_get_par_embedding_levels_ex( - shaper->ctypes + last_break, shaper->btypes + last_break, + shaper->ctypes + last_break, btypes, i - last_break + 1, &dir, shaper->emblevels + last_break); #else ret = fribidi_get_par_embedding_levels(shaper->ctypes + last_break, |