static void gtk_css_computed_values_create_css_transitions (GtkCssComputedValues *values, gint64 timestamp, GtkCssComputedValues *source) { TransitionInfo transitions[GTK_CSS_PROPERTY_N_PROPERTIES] = { { 0, } }; GtkCssValue *durations, *delays, *timing_functions; guint i; transition_infos_set (transitions, _gtk_css_computed_values_get_value (values, GTK_CSS_PROPERTY_TRANSITION_PROPERTY)); durations = _gtk_css_computed_values_get_value (values, GTK_CSS_PROPERTY_TRANSITION_DURATION); delays = _gtk_css_computed_values_get_value (values, GTK_CSS_PROPERTY_TRANSITION_DELAY); timing_functions = _gtk_css_computed_values_get_value (values, GTK_CSS_PROPERTY_TRANSITION_TIMING_FUNCTION); for (i = 0; i < GTK_CSS_PROPERTY_N_PROPERTIES; i++) { GtkStyleAnimation *animation; GtkCssValue *start, *end; double duration, delay; if (!transitions[i].pending) continue; duration = _gtk_css_number_value_get (_gtk_css_array_value_get_nth (durations, transitions[i].index), 100); delay = _gtk_css_number_value_get (_gtk_css_array_value_get_nth (delays, transitions[i].index), 100); if (duration + delay == 0.0) continue; start = _gtk_css_computed_values_get_intrinsic_value (source, i); end = _gtk_css_computed_values_get_intrinsic_value (values, i); if (_gtk_css_value_equal (start, end)) { animation = gtk_css_computed_values_find_transition (GTK_CSS_COMPUTED_VALUES (source), i); if (animation) values->animations = g_slist_prepend (values->animations, g_object_ref (animation)); } else { animation = _gtk_css_transition_new (i, _gtk_css_computed_values_get_value (source, i), _gtk_css_array_value_get_nth (timing_functions, i), timestamp + delay * G_USEC_PER_SEC, timestamp + (delay + duration) * G_USEC_PER_SEC); values->animations = g_slist_prepend (values->animations, animation); } } }
static void gtk_css_animation_set_values (GtkStyleAnimation *style_animation, gint64 for_time_us, GtkCssComputedValues *values) { GtkCssAnimation *animation = GTK_CSS_ANIMATION (style_animation); double iteration, progress; guint i; iteration = gtk_css_animation_get_iteration (animation, for_time_us); if (!gtk_css_animation_is_executing_at_iteration (animation, iteration)) return; progress = gtk_css_animation_get_progress_from_iteration (animation, iteration); progress = _gtk_css_ease_value_transform (animation->ease, progress); for (i = 0; i < _gtk_css_keyframes_get_n_properties (animation->keyframes); i++) { GtkCssValue *value; guint property_id; property_id = _gtk_css_keyframes_get_property_id (animation->keyframes, i); value = _gtk_css_keyframes_get_value (animation->keyframes, i, progress, _gtk_css_computed_values_get_intrinsic_value (values, property_id)); _gtk_css_computed_values_set_animated_value (values, property_id, value); _gtk_css_value_unref (value); } }
GtkCssValue * _gtk_css_computed_values_get_value (GtkCssComputedValues *values, guint id) { gtk_internal_return_val_if_fail (GTK_IS_CSS_COMPUTED_VALUES (values), NULL); if (values->animated_values && id < values->animated_values->len && g_ptr_array_index (values->animated_values, id)) return g_ptr_array_index (values->animated_values, id); return _gtk_css_computed_values_get_intrinsic_value (values, id); }