[API] Add hb_language_get_default()

It uses locale information to detect default language.  It's used by
hb_shape() whenever language is not set on the buffer.

Not sure how to properly test it in the test suite.  Tested by observing
that with DejaVu Sans we select the proper local glyph version for U+431
under Serbian locale.  See http://www.pango.org/ScriptGallery
pull/1/head
Behdad Esfahbod 14 years ago
parent c78f448558
commit 34fb5521a5
  1. 21
      src/hb-common.cc
  2. 3
      src/hb-common.h
  3. 2
      src/hb-shape.cc
  4. 5
      test/test-common.c

@ -33,6 +33,8 @@
#include "hb-mutex-private.hh"
#include "hb-object-private.hh"
#include <locale.h>
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 */

@ -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 */

@ -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);

@ -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

Loading…
Cancel
Save