| Index: third_party/harfbuzz-ng/src/hb-glib.cc
|
| diff --git a/third_party/harfbuzz-ng/src/hb-glib.cc b/third_party/harfbuzz-ng/src/hb-glib.cc
|
| index 6b655dd130bdcfa86b2557f483951b6b7e5ae3fc..046275879890fc06bb4b7ca23ebe67e2cf3e3c31 100644
|
| --- a/third_party/harfbuzz-ng/src/hb-glib.cc
|
| +++ b/third_party/harfbuzz-ng/src/hb-glib.cc
|
| @@ -192,13 +192,13 @@ hb_glib_script_from_script (hb_script_t script)
|
| }
|
|
|
|
|
| -static unsigned int
|
| +static hb_unicode_combining_class_t
|
| hb_glib_unicode_combining_class (hb_unicode_funcs_t *ufuncs HB_UNUSED,
|
| hb_codepoint_t unicode,
|
| void *user_data HB_UNUSED)
|
|
|
| {
|
| - return g_unichar_combining_class (unicode);
|
| + return (hb_unicode_combining_class_t) g_unichar_combining_class (unicode);
|
| }
|
|
|
| static unsigned int
|
| @@ -250,12 +250,9 @@ hb_glib_unicode_compose (hb_unicode_funcs_t *ufuncs HB_UNUSED,
|
| /* We don't ifdef-out the fallback code such that compiler always
|
| * sees it and makes sure it's compilable. */
|
|
|
| - if (!a || !b)
|
| - return false;
|
| -
|
| gchar utf8[12];
|
| gchar *normalized;
|
| - gint len;
|
| + int len;
|
| hb_bool_t ret;
|
|
|
| len = g_unichar_to_utf8 (a, utf8);
|
| @@ -292,7 +289,7 @@ hb_glib_unicode_decompose (hb_unicode_funcs_t *ufuncs HB_UNUSED,
|
|
|
| gchar utf8[6];
|
| gchar *normalized;
|
| - gint len;
|
| + int len;
|
| hb_bool_t ret;
|
|
|
| len = g_unichar_to_utf8 (ab, utf8);
|
| @@ -336,23 +333,52 @@ hb_glib_unicode_decompose (hb_unicode_funcs_t *ufuncs HB_UNUSED,
|
| return ret;
|
| }
|
|
|
| +static unsigned int
|
| +hb_glib_unicode_decompose_compatibility (hb_unicode_funcs_t *ufuncs,
|
| + hb_codepoint_t u,
|
| + hb_codepoint_t *decomposed,
|
| + void *user_data HB_UNUSED)
|
| +{
|
| +#if GLIB_CHECK_VERSION(2,29,12)
|
| + return g_unichar_fully_decompose (u, TRUE, decomposed, HB_UNICODE_MAX_DECOMPOSITION_LEN);
|
| +#endif
|
|
|
| -extern HB_INTERNAL const hb_unicode_funcs_t _hb_glib_unicode_funcs;
|
| -const hb_unicode_funcs_t _hb_glib_unicode_funcs = {
|
| - HB_OBJECT_HEADER_STATIC,
|
| + /* If the user doesn't have GLib >= 2.29.12 we have to perform
|
| + * a round trip to UTF-8 and the associated memory management dance. */
|
| + gchar utf8[6];
|
| + gchar *utf8_decomposed, *c;
|
| + gsize utf8_len, utf8_decomposed_len, i;
|
|
|
| - NULL, /* parent */
|
| - true, /* immutable */
|
| - {
|
| -#define HB_UNICODE_FUNC_IMPLEMENT(name) hb_glib_unicode_##name,
|
| - HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS
|
| -#undef HB_UNICODE_FUNC_IMPLEMENT
|
| - }
|
| -};
|
| + /* Convert @u to UTF-8 and normalise it in NFKD mode. This performs the compatibility decomposition. */
|
| + utf8_len = g_unichar_to_utf8 (u, utf8);
|
| + utf8_decomposed = g_utf8_normalize (utf8, utf8_len, G_NORMALIZE_NFKD);
|
| + utf8_decomposed_len = g_utf8_strlen (utf8_decomposed, -1);
|
| +
|
| + assert (utf8_decomposed_len <= HB_UNICODE_MAX_DECOMPOSITION_LEN);
|
| +
|
| + for (i = 0, c = utf8_decomposed; i < utf8_decomposed_len; i++, c = g_utf8_next_char (c))
|
| + *decomposed++ = g_utf8_get_char (c);
|
| +
|
| + g_free (utf8_decomposed);
|
| +
|
| + return utf8_decomposed_len;
|
| +}
|
|
|
| hb_unicode_funcs_t *
|
| hb_glib_get_unicode_funcs (void)
|
| {
|
| + static const hb_unicode_funcs_t _hb_glib_unicode_funcs = {
|
| + HB_OBJECT_HEADER_STATIC,
|
| +
|
| + NULL, /* parent */
|
| + true, /* immutable */
|
| + {
|
| +#define HB_UNICODE_FUNC_IMPLEMENT(name) hb_glib_unicode_##name,
|
| + HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS
|
| +#undef HB_UNICODE_FUNC_IMPLEMENT
|
| + }
|
| + };
|
| +
|
| return const_cast<hb_unicode_funcs_t *> (&_hb_glib_unicode_funcs);
|
| }
|
|
|
|
|