diff options
author | Khaled Hosny <khaledhosny@eglug.org> | 2017-11-13 15:25:35 +0200 |
---|---|---|
committer | Khaled Hosny <khaledhosny@eglug.org> | 2018-02-04 02:46:22 +0200 |
commit | 5e8cb02bec01e4a9b0ddff173889043d9db65fbc (patch) | |
tree | b07e1bd76561dacddf0c3691f909159f49f0ddc3 | |
parent | 1addea2febecb9e3511329b985d5566de6d8369e (diff) | |
download | pango-5e8cb02bec01e4a9b0ddff173889043d9db65fbc.tar.gz |
Switch to using external FriBiDi
-rw-r--r-- | configure.ac | 4 | ||||
-rw-r--r-- | meson.build | 4 | ||||
-rw-r--r-- | pango/Makefile.am | 14 | ||||
-rw-r--r-- | pango/meson.build | 4 | ||||
-rw-r--r-- | pango/pango-bidi-type.c | 54 |
5 files changed, 52 insertions, 28 deletions
diff --git a/configure.ac b/configure.ac index 90d3258a..9025166f 100644 --- a/configure.ac +++ b/configure.ac @@ -456,6 +456,10 @@ PKG_CHECK_MODULES(GLIB, $GLIB_MODULES, :, GLIB_MKENUMS=`$PKG_CONFIG --variable=glib_mkenums glib-2.0` AC_SUBST(GLIB_MKENUMS) +# Checks for FriBiDi +FRIBIDI_REQUIRED_VERSION=0.19.7 +PKG_CHECK_MODULES(FRIBIDI, fribidi >= $FRIBIDI_REQUIRED_VERSION) + # # Checks for LibThai # diff --git a/meson.build b/meson.build index 494104be..2f6f539f 100644 --- a/meson.build +++ b/meson.build @@ -194,6 +194,7 @@ endif pango_deps = [] glib_req_version = '>= 2.33.12' +fribidi_req_version = '>= 0.19.7' libthai_req_version = '>= 0.1.9' harfbuzz_req_version = '>= 1.2.3' fontconfig_req_version = '>= 2.11.91' @@ -208,6 +209,9 @@ pango_deps += mathlib_dep gobject_dep = dependency('gobject-2.0', version: glib_req_version) pango_deps += gobject_dep +fribidi_dep = dependency('fribidi', version: fribidi_req_version) +pango_deps += fribidi_dep + thai_dep = dependency('libthai', version: libthai_req_version, required: false) if thai_dep.found() pango_conf.set('HAVE_LIBTHAI', 1) diff --git a/pango/Makefile.am b/pango/Makefile.am index ac889151..0ce84357 100644 --- a/pango/Makefile.am +++ b/pango/Makefile.am @@ -11,7 +11,7 @@ INTROSPECTION_SCANNER_ARGS = --warn-all --add-include-path=$(srcdir) --add-inclu INTROSPECTION_COMPILER_ARGS = --includedir=$(srcdir) --includedir=. INTROSPECTION_SCANNER_ENV = CC="$(CC)" -SUBDIRS = mini-fribidi +SUBDIRS = INCLUDES = \ -DG_LOG_DOMAIN=\"Pango\" \ @@ -29,6 +29,7 @@ INCLUDES = \ $(HARFBUZZ_CFLAGS) \ $(FREETYPE_CFLAGS) \ $(FONTCONFIG_CFLAGS) \ + $(FRIBIDI_CFLAGS) \ $(LIBTHAI_CFLAGS) \ $(X_CFLAGS) \ $(PANGO_HIDDEN_VISIBILITY_CFLAGS) @@ -51,10 +52,9 @@ libpango_1_0_la_LDFLAGS = $(LIBRARY_LIBTOOL_OPTIONS) libpango_1_0_la_LIBADD = \ $(GLIB_LIBS) \ $(LIBTHAI_LIBS) \ + $(FRIBIDI_LIBS) \ $(libm) - -libpango_1_0_la_LIBADD += mini-fribidi/libmini-fribidi.la -libpango_1_0_la_DEPENDENCIES = mini-fribidi/libmini-fribidi.la +libpango_1_0_la_DEPENDENCIES = if PLATFORM_WIN32 libpango_1_0_la_LDFLAGS += -Wl,pango-win32-res.o @@ -460,15 +460,9 @@ DISTCLEANFILES = \ # ------------------- MSVC Build Items ---------------- -extra_fribidi_srcs_for_msvc = \ - mini-fribidi/fribidi.c \ - mini-fribidi/fribidi_char_type.c \ - mini-fribidi/fribidi_types.c - MSVCPROJS = pango pangowin32 pangoft2 pangocairo pango_FILES = \ - $(extra_fribidi_srcs_for_msvc) \ $(libpango_1_0_la_SOURCES) pango_EXCLUDES = dummy pango_HEADERS_DIR = $(pangoincludedir) diff --git a/pango/meson.build b/pango/meson.build index 9c6fbeca..6301410d 100644 --- a/pango/meson.build +++ b/pango/meson.build @@ -1,5 +1,3 @@ -subdir('mini-fribidi') - pango_sources = [ 'break.c', 'ellipsize.c', @@ -109,7 +107,7 @@ libpango = shared_library('pango-@0@'.format(pango_api_version), version: pango_libversion, soversion: pango_soversion, install: true, - dependencies: [ gobject_dep, mathlib_dep, thai_dep, mini_fribidi_dep ], + dependencies: [ gobject_dep, mathlib_dep, thai_dep, fribidi_dep ], include_directories: [ root_inc, pango_inc ], c_args: common_cflags + pango_debug_cflags + pango_cflags, link_args: common_ldflags) diff --git a/pango/pango-bidi-type.c b/pango/pango-bidi-type.c index 462e7b00..b363ca89 100644 --- a/pango/pango-bidi-type.c +++ b/pango/pango-bidi-type.c @@ -41,12 +41,11 @@ #include <string.h> +#include <fribidi.h> + #include "pango-bidi-type.h" #include "pango-utils.h" -#include "mini-fribidi/fribidi.h" - - /** * pango_bidi_type_for_unichar: @@ -66,7 +65,11 @@ PangoBidiType pango_bidi_type_for_unichar (gunichar ch) { - FriBidiCharType fribidi_ch_type = fribidi_get_type (ch); + FriBidiCharType fribidi_ch_type; + + G_STATIC_ASSERT (sizeof (FriBidiChar) == sizeof (gunichar)); + + fribidi_ch_type = fribidi_get_bidi_type (ch); switch (fribidi_ch_type) { @@ -122,26 +125,29 @@ pango_log2vis_get_embedding_levels (const gchar *text, int length, PangoDirection *pbase_dir) { - FriBidiCharType fribidi_base_dir; + FriBidiParType fribidi_base_dir; guint8 *embedding_levels_list; + G_STATIC_ASSERT (sizeof (FriBidiLevel) == sizeof (guint8)); + G_STATIC_ASSERT (sizeof (FriBidiChar) == sizeof (gunichar)); + switch (*pbase_dir) { case PANGO_DIRECTION_LTR: case PANGO_DIRECTION_TTB_RTL: - fribidi_base_dir = FRIBIDI_TYPE_L; + fribidi_base_dir = FRIBIDI_PAR_LTR; break; case PANGO_DIRECTION_RTL: case PANGO_DIRECTION_TTB_LTR: - fribidi_base_dir = FRIBIDI_TYPE_R; + fribidi_base_dir = FRIBIDI_PAR_RTL; break; case PANGO_DIRECTION_WEAK_RTL: - fribidi_base_dir = FRIBIDI_TYPE_WR; + fribidi_base_dir = FRIBIDI_PAR_WRTL; break; case PANGO_DIRECTION_WEAK_LTR: case PANGO_DIRECTION_NEUTRAL: default: - fribidi_base_dir = FRIBIDI_TYPE_WL; + fribidi_base_dir = FRIBIDI_PAR_WLTR; break; } @@ -154,17 +160,31 @@ pango_log2vis_get_embedding_levels (const gchar *text, #else { gunichar *text_ucs4; - int n_chars; + glong n_chars; + FriBidiCharType *bidi_types; + FriBidiLevel max_level; + text_ucs4 = g_utf8_to_ucs4_fast (text, length, &n_chars); + bidi_types = g_new (FriBidiCharType, n_chars); embedding_levels_list = g_new (guint8, n_chars); - fribidi_log2vis_get_embedding_levels ((FriBidiChar*)text_ucs4, n_chars, - &fribidi_base_dir, - (FriBidiLevel*)embedding_levels_list); + + fribidi_get_bidi_types (text_ucs4, n_chars, bidi_types); + max_level = fribidi_get_par_embedding_levels (bidi_types, n_chars, + &fribidi_base_dir, + (FriBidiLevel*)embedding_levels_list); + if (G_UNLIKELY(max_level == 0)) + { + /* fribidi_get_par_embedding_levels() failed, + * is this the best thing to do? */ + memset (embedding_levels_list, 0, length); + } + g_free (text_ucs4); + g_free (bidi_types); } #endif - *pbase_dir = (fribidi_base_dir == FRIBIDI_TYPE_L) ? PANGO_DIRECTION_LTR : PANGO_DIRECTION_RTL; + *pbase_dir = (fribidi_base_dir == FRIBIDI_PAR_LTR) ? PANGO_DIRECTION_LTR : PANGO_DIRECTION_RTL; return embedding_levels_list; } @@ -187,7 +207,11 @@ pango_log2vis_get_embedding_levels (const gchar *text, PangoDirection pango_unichar_direction (gunichar ch) { - FriBidiCharType fribidi_ch_type = fribidi_get_type (ch); + FriBidiCharType fribidi_ch_type; + + G_STATIC_ASSERT (sizeof (FriBidiChar) == sizeof (gunichar)); + + fribidi_ch_type = fribidi_get_bidi_type (ch); if (!FRIBIDI_IS_STRONG (fribidi_ch_type)) return PANGO_DIRECTION_NEUTRAL; |