summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKhaled Hosny <khaledhosny@eglug.org>2018-02-24 13:50:57 +0200
committerOleg Oshmyan <chortos@inbox.lv>2019-09-26 02:34:36 +0300
commitdf7c00c95ec6e526bf85e6bc8296eaca66f5db8d (patch)
treec8be7f911185c76218b6f8de460bf9b7443a9eff
parentf8dd7d20828167310515edf4849e85782a64c1ab (diff)
downloadlibass-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.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/libass/ass_shaper.c b/libass/ass_shaper.c
index fff40db..1a75ef1 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;