From: Emmanuele Bassi Date: Fri, 8 Jun 2012 16:33:30 +0000 (+0100) Subject: property-transition: Verify the interval on compute_value() X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=b21cb294791f50285bbe86c7f1c8ec446370ffbe;hp=762053cd28058bc93d4d2d71b1da1a5599042c0a;p=profile%2Fivi%2Fclutter.git property-transition: Verify the interval on compute_value() By checking if the interval is valid inside compute_value() we can catch the cases where the interval values of a PropertyTransition are set after the transition has been added to an Animatable instance - i.e. the following code: let transition = new Clutter.PropertyTransition(); transition.set_property_name('opacity'); actor.add_transition('opacityAnim', transition); transition.set_to_value(0); should be equivalent to: let transition = new Clutter.PropertyTransition(); transition.set_property_name('opacity'); transition.set_to_value(0); actor.add_transition('opacityAnim', transition); instead of emitting a warning. --- diff --git a/clutter/clutter-property-transition.c b/clutter/clutter-property-transition.c index 90f9ac2..9591169 100644 --- a/clutter/clutter-property-transition.c +++ b/clutter/clutter-property-transition.c @@ -62,6 +62,38 @@ static GParamSpec *obj_props[PROP_LAST] = { NULL, }; G_DEFINE_TYPE (ClutterPropertyTransition, clutter_property_transition, CLUTTER_TYPE_TRANSITION) +static inline void +clutter_property_transition_ensure_interval (ClutterPropertyTransition *transition, + ClutterAnimatable *animatable, + ClutterInterval *interval) +{ + ClutterPropertyTransitionPrivate *priv = transition->priv; + GValue *value_p; + + if (clutter_interval_is_valid (interval)) + return; + + /* if no initial value has been set, use the current value */ + value_p = clutter_interval_peek_initial_value (interval); + if (!G_IS_VALUE (value_p)) + { + g_value_init (value_p, clutter_interval_get_value_type (interval)); + clutter_animatable_get_initial_state (animatable, + priv->property_name, + value_p); + } + + /* if no final value has been set, use the current value */ + value_p = clutter_interval_peek_final_value (interval); + if (!G_IS_VALUE (value_p)) + { + g_value_init (value_p, clutter_interval_get_value_type (interval)); + clutter_animatable_get_initial_state (animatable, + priv->property_name, + value_p); + } +} + static void clutter_property_transition_attached (ClutterTransition *transition, ClutterAnimatable *animatable) @@ -69,7 +101,6 @@ clutter_property_transition_attached (ClutterTransition *transition, ClutterPropertyTransition *self = CLUTTER_PROPERTY_TRANSITION (transition); ClutterPropertyTransitionPrivate *priv = self->priv; ClutterInterval *interval; - GValue *value; if (priv->property_name == NULL) return; @@ -84,25 +115,7 @@ clutter_property_transition_attached (ClutterTransition *transition, if (interval == NULL) return; - /* if no initial value has been set, use the current value */ - value = clutter_interval_peek_initial_value (interval); - if (!G_IS_VALUE (value)) - { - g_value_init (value, clutter_interval_get_value_type (interval)); - clutter_animatable_get_initial_state (animatable, - priv->property_name, - value); - } - - /* if no final value has been set, use the current value */ - value = clutter_interval_peek_final_value (interval); - if (!G_IS_VALUE (value)) - { - g_value_init (value, clutter_interval_get_value_type (interval)); - clutter_animatable_get_initial_state (animatable, - priv->property_name, - value); - } + clutter_property_transition_ensure_interval (self, animatable, interval); } static void @@ -130,6 +143,8 @@ clutter_property_transition_compute_value (ClutterTransition *transition, if (priv->pspec == NULL) return; + clutter_property_transition_ensure_interval (self, animatable, interval); + g_value_init (&value, clutter_interval_get_value_type (interval)); res = clutter_animatable_interpolate_value (animatable,