{
char *env = getenv ("HB_SHAPER_LIST");
shaper_list = NULL;
- if (!env || !*env)
+ if (!env || !*env) {
+ fallback:
+ ASSERT_STATIC ((ARRAY_LENGTH (shapers) + 1) * sizeof (*shaper_list) <= sizeof (static_buffer));
+ shaper_list = (const char **) static_buffer;
+ unsigned int i;
+ for (i = 0; i < ARRAY_LENGTH (shapers); i++)
+ shaper_list[i] = shapers[i].name;
+ shaper_list[i] = NULL;
return;
+ }
unsigned int count = 3; /* initial, fallback, null */
for (const char *p = env; (p == strchr (p, ',')) && p++; )
unsigned int len = strlen (env);
if (count > 100 || len > 1000)
- return;
+ goto fallback;
len += count * sizeof (*shaper_list) + 1;
char *buffer = len < sizeof (static_buffer) ? static_buffer : (char *) malloc (len);
const char **shaper_list;
char static_buffer[32];
-} env_shaper_list;
+} static_shaper_list;
+
+const char **
+hb_shape_list_shapers (void)
+{
+ return static_shaper_list.shaper_list;
+}
hb_bool_t
hb_shape_full (hb_font_t *font,
const char **shaper_list)
{
if (likely (!shaper_list))
- shaper_list = env_shaper_list.shaper_list;
+ shaper_list = static_shaper_list.shaper_list;
if (likely (!shaper_list)) {
for (unsigned int i = 0; i < ARRAY_LENGTH (shapers); i++)
hb_font_destroy (font);
}
+static void
+test_shape_list (void)
+{
+ const char **shapers = hb_shape_list_shapers ();
+
+ unsigned int i;
+ for (i = 0; shapers[i]; i++)
+ ;
+
+ g_assert_cmpint (i, >, 1);
+ g_assert (!strcmp (shapers[i - 1], "fallback"));
+}
int
main (int argc, char **argv)
hb_test_init (&argc, &argv);
hb_test_add (test_shape);
+ /* TODO test fallback shaper */
+ /* TODO test shaper_full */
+ hb_test_add (test_shape_list);
return hb_test_run();
}