diff --git a/src/hb-common.cc b/src/hb-common.cc index 49f3eb885..a223edbb3 100644 --- a/src/hb-common.cc +++ b/src/hb-common.cc @@ -33,6 +33,8 @@ #include "hb-mutex-private.hh" #include "hb-object-private.hh" +#include + HB_BEGIN_DECLS @@ -179,6 +181,25 @@ hb_language_to_string (hb_language_t language) return language->s; } +hb_language_t +hb_language_get_default (void) +{ + static hb_language_t default_language; + + if (!default_language) { + /* This block is not quite threadsafe, but is not as bad as + * it looks since it's idempotent. As long as pointer ops + * are atomic, we are safe. */ + + /* I hear that setlocale() doesn't honor env vars on Windows, + * but for now we ignore that. */ + + default_language = hb_language_from_string (setlocale (LC_CTYPE, NULL)); + } + + return default_language; +} + /* hb_script_t */ diff --git a/src/hb-common.h b/src/hb-common.h index 64109dab2..9546b21c6 100644 --- a/src/hb-common.h +++ b/src/hb-common.h @@ -113,6 +113,9 @@ hb_language_from_string (const char *str); const char * hb_language_to_string (hb_language_t language); +hb_language_t +hb_language_get_default (void); + /* hb_unicode_general_category_t */ diff --git a/src/hb-shape.cc b/src/hb-shape.cc index cc711ea50..fccb81e3b 100644 --- a/src/hb-shape.cc +++ b/src/hb-shape.cc @@ -81,7 +81,7 @@ hb_shape (hb_font_t *font, /* If language is not set, use default language from locale */ if (buffer->props.language == NULL) { /* TODO get_default_for_script? using $LANGUAGE */ - //buffer->props.language = hb_language_get_default (); + buffer->props.language = hb_language_get_default (); } hb_shape_internal (font, buffer, features, num_features); diff --git a/test/test-common.c b/test/test-common.c index c2b4e1c6d..c1e3175b5 100644 --- a/test/test-common.c +++ b/test/test-common.c @@ -169,6 +169,11 @@ test_types_language (void) g_assert (NULL == hb_language_from_string (NULL)); g_assert (NULL == hb_language_from_string ("")); + + /* Not sure how to test this better. Setting env vars + * here doesn't sound like the right approach, and I'm + * not sure that it even works. */ + g_assert (NULL != hb_language_get_default ()); } int