diff --git a/clutter/clutter-alpha.c b/clutter/clutter-alpha.c index 0a144c476..9a41de6aa 100644 --- a/clutter/clutter-alpha.c +++ b/clutter/clutter-alpha.c @@ -302,25 +302,14 @@ clutter_alpha_parse_custom_node (ClutterScriptable *scriptable, */ if (strncmp (name, "mode", 4) == 0) { - if (JSON_NODE_TYPE (node) != JSON_NODE_VALUE) - return FALSE; + gulong mode; + + mode = clutter_script_resolve_animation_mode (node); g_value_init (value, G_TYPE_ULONG); + g_value_set_ulong (value, mode); - if (json_node_get_value_type (node) == G_TYPE_INT64) - { - g_value_set_ulong (value, json_node_get_int (node)); - return TRUE; - } - else if (json_node_get_value_type (node) == G_TYPE_STRING) - { - const gchar *str = json_node_get_string (node); - gulong mode; - - mode = clutter_script_resolve_animation_mode (str); - g_value_set_ulong (value, mode); - return TRUE; - } + return TRUE; } return FALSE; diff --git a/clutter/clutter-animation.c b/clutter/clutter-animation.c index 7139e77e6..40590acb9 100644 --- a/clutter/clutter-animation.c +++ b/clutter/clutter-animation.c @@ -403,29 +403,14 @@ clutter_animation_parse_custom_node (ClutterScriptable *scriptable, { if (strncmp (name, "mode", 4) == 0) { - if (json_node_get_node_type (node) != JSON_NODE_VALUE) - return FALSE; + gulong mode; + + mode = clutter_script_resolve_animation_mode (node); g_value_init (value, G_TYPE_ULONG); + g_value_set_ulong (value, mode); - if (json_node_get_value_type (node) == G_TYPE_INT64) - { - g_value_set_ulong (value, json_node_get_int (node)); - return TRUE; - } - else if (json_node_get_value_type (node) == G_TYPE_STRING) - { - const gchar *str = json_node_get_string (node); - gulong mode = CLUTTER_LINEAR; - - mode = clutter_script_resolve_animation_mode (str); - g_value_set_ulong (value, mode); - - return TRUE; - } - else - g_warning ("Expected an integer id or a string id for " - "the ClutterAnimation mode property"); + return TRUE; } return FALSE; diff --git a/clutter/clutter-script-parser.c b/clutter/clutter-script-parser.c index a33702c7e..37585fecd 100644 --- a/clutter/clutter-script-parser.c +++ b/clutter/clutter-script-parser.c @@ -769,27 +769,40 @@ static const struct static const gint n_animation_modes = G_N_ELEMENTS (animation_modes); gulong -clutter_script_resolve_animation_mode (const gchar *name) +clutter_script_resolve_animation_mode (JsonNode *node) { - gint i, res = 0; + gint i, res = CLUTTER_CUSTOM_MODE; - /* XXX - we might be able to optimize by changing the ordering - * of the animation_modes array, e.g. - * - special casing linear - * - tokenizing ('ease', 'In', 'Sine') and matching on token - * - binary searching? - */ - for (i = 0; i < n_animation_modes; i++) + if (JSON_NODE_TYPE (node) != JSON_NODE_VALUE) + return CLUTTER_CUSTOM_MODE; + + if (json_node_get_value_type (node) == G_TYPE_INT64) + return json_node_get_int (node); + + if (json_node_get_value_type (node) == G_TYPE_STRING) { - if (strcmp (animation_modes[i].name, name) == 0) - return animation_modes[i].mode; + const gchar *name = json_node_get_string (node); + + /* XXX - we might be able to optimize by changing the ordering + * of the animation_modes array, e.g. + * - special casing linear + * - tokenizing ('ease', 'In', 'Sine') and matching on token + * - binary searching? + */ + for (i = 0; i < n_animation_modes; i++) + { + if (strcmp (animation_modes[i].name, name) == 0) + return animation_modes[i].mode; + } + + if (clutter_script_enum_from_string (CLUTTER_TYPE_ANIMATION_MODE, + name, + &res)) + return res; + + g_warning ("Unable to find the animation mode '%s'", name); } - if (clutter_script_enum_from_string (CLUTTER_TYPE_ANIMATION_MODE, name, &res)) - return res; - - g_warning ("Unable to find the animation mode '%s'", name); - return CLUTTER_CUSTOM_MODE; } @@ -850,8 +863,8 @@ _clutter_script_parse_alpha (ClutterScript *script, } val = json_object_get_member (object, "mode"); - if (val && json_node_get_string (val) != NULL) - mode = clutter_script_resolve_animation_mode (json_node_get_string (val)); + if (val) + mode = clutter_script_resolve_animation_mode (val); if (mode == CLUTTER_CUSTOM_MODE) { diff --git a/clutter/clutter-script-private.h b/clutter/clutter-script-private.h index 601a93b73..3dc73786a 100644 --- a/clutter/clutter-script-private.h +++ b/clutter/clutter-script-private.h @@ -103,7 +103,7 @@ gboolean clutter_script_parse_node (ClutterScript *script, GType clutter_script_get_type_from_symbol (const gchar *symbol); GType clutter_script_get_type_from_class (const gchar *name); -gulong clutter_script_resolve_animation_mode (const gchar *namer); +gulong clutter_script_resolve_animation_mode (JsonNode *node); gboolean clutter_script_enum_from_string (GType gtype, const gchar *string,