diff options
author | Benjamin Otte <otte@redhat.com> | 2014-12-15 04:17:42 +0100 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2015-01-07 14:26:47 +0100 |
commit | f3f021106d467f909458a2dba8e7053f27dd1e2b (patch) | |
tree | 405110f91f0d51033b4512fd7439faaa8fbd4d38 /gtk/gtkcssanimatedstyle.c | |
parent | 682abc345fe197b915af6efcbf572d303e8b05e7 (diff) | |
download | gtk+-f3f021106d467f909458a2dba8e7053f27dd1e2b.tar.gz |
cssanimatedstyle: Avoid creating animation
... when no animation exists.
This makes the function name kinda wrong, but I'm not sure what else to
call it.
Diffstat (limited to 'gtk/gtkcssanimatedstyle.c')
-rw-r--r-- | gtk/gtkcssanimatedstyle.c | 80 |
1 files changed, 47 insertions, 33 deletions
diff --git a/gtk/gtkcssanimatedstyle.c b/gtk/gtkcssanimatedstyle.c index b663c18baf..c36cfe37cc 100644 --- a/gtk/gtkcssanimatedstyle.c +++ b/gtk/gtkcssanimatedstyle.c @@ -244,8 +244,9 @@ gtk_css_animated_style_find_transition (GtkCssAnimatedStyle *style, return NULL; } -static void -gtk_css_animated_style_create_css_transitions (GtkCssAnimatedStyle *style, +static GSList * +gtk_css_animated_style_create_css_transitions (GSList *animations, + GtkCssStyle *base_style, gint64 timestamp, GtkCssStyle *source) { @@ -253,11 +254,11 @@ gtk_css_animated_style_create_css_transitions (GtkCssAnimatedStyle *style, GtkCssValue *durations, *delays, *timing_functions; guint i; - transition_infos_set (transitions, gtk_css_style_get_value (GTK_CSS_STYLE (style), GTK_CSS_PROPERTY_TRANSITION_PROPERTY)); + transition_infos_set (transitions, gtk_css_style_get_value (base_style, GTK_CSS_PROPERTY_TRANSITION_PROPERTY)); - durations = gtk_css_style_get_value (GTK_CSS_STYLE (style), GTK_CSS_PROPERTY_TRANSITION_DURATION); - delays = gtk_css_style_get_value (GTK_CSS_STYLE (style), GTK_CSS_PROPERTY_TRANSITION_DELAY); - timing_functions = gtk_css_style_get_value (GTK_CSS_STYLE (style), GTK_CSS_PROPERTY_TRANSITION_TIMING_FUNCTION); + durations = gtk_css_style_get_value (base_style, GTK_CSS_PROPERTY_TRANSITION_DURATION); + delays = gtk_css_style_get_value (base_style, GTK_CSS_PROPERTY_TRANSITION_DELAY); + timing_functions = gtk_css_style_get_value (base_style, GTK_CSS_PROPERTY_TRANSITION_TIMING_FUNCTION); for (i = 0; i < GTK_CSS_PROPERTY_N_PROPERTIES; i++) { @@ -276,12 +277,13 @@ gtk_css_animated_style_create_css_transitions (GtkCssAnimatedStyle *style, if (GTK_IS_CSS_ANIMATED_STYLE (source)) { start = gtk_css_animated_style_get_intrinsic_value (GTK_CSS_ANIMATED_STYLE (source), i); - end = gtk_css_animated_style_get_intrinsic_value (style, i); + end = gtk_css_style_get_value (base_style, i); + if (_gtk_css_value_equal (start, end)) { animation = gtk_css_animated_style_find_transition (GTK_CSS_ANIMATED_STYLE (source), i); if (animation) - style->animations = g_slist_prepend (style->animations, g_object_ref (animation)); + animations = g_slist_prepend (animations, g_object_ref (animation)); continue; } @@ -292,17 +294,19 @@ gtk_css_animated_style_create_css_transitions (GtkCssAnimatedStyle *style, _gtk_css_array_value_get_nth (timing_functions, i), timestamp + delay * G_USEC_PER_SEC, timestamp + (delay + duration) * G_USEC_PER_SEC); - style->animations = g_slist_prepend (style->animations, animation); + animations = g_slist_prepend (animations, animation); } + + return animations; } static GtkStyleAnimation * -gtk_css_animated_style_find_animation (GtkCssAnimatedStyle *style, - const char *name) +gtk_css_animated_style_find_animation (GSList *animations, + const char *name) { GSList *list; - for (list = style->animations; list; list = list->next) + for (list = animations; list; list = list->next) { if (!GTK_IS_CSS_ANIMATION (list->data)) continue; @@ -314,43 +318,44 @@ gtk_css_animated_style_find_animation (GtkCssAnimatedStyle *style, return NULL; } -static void -gtk_css_animated_style_create_css_animations (GtkCssAnimatedStyle *style, +static GSList * +gtk_css_animated_style_create_css_animations (GSList *animations, + GtkCssStyle *base_style, GtkCssStyle *parent_style, gint64 timestamp, GtkStyleProviderPrivate *provider, int scale, GtkCssStyle *source) { - GtkCssValue *durations, *delays, *timing_functions, *animations; + GtkCssValue *durations, *delays, *timing_functions, *animation_names; GtkCssValue *iteration_counts, *directions, *play_states, *fill_modes; guint i; - animations = gtk_css_style_get_value (GTK_CSS_STYLE (style), GTK_CSS_PROPERTY_ANIMATION_NAME); - durations = gtk_css_style_get_value (GTK_CSS_STYLE (style), GTK_CSS_PROPERTY_ANIMATION_DURATION); - delays = gtk_css_style_get_value (GTK_CSS_STYLE (style), GTK_CSS_PROPERTY_ANIMATION_DELAY); - timing_functions = gtk_css_style_get_value (GTK_CSS_STYLE (style), GTK_CSS_PROPERTY_ANIMATION_TIMING_FUNCTION); - iteration_counts = gtk_css_style_get_value (GTK_CSS_STYLE (style), GTK_CSS_PROPERTY_ANIMATION_ITERATION_COUNT); - directions = gtk_css_style_get_value (GTK_CSS_STYLE (style), GTK_CSS_PROPERTY_ANIMATION_DIRECTION); - play_states = gtk_css_style_get_value (GTK_CSS_STYLE (style), GTK_CSS_PROPERTY_ANIMATION_PLAY_STATE); - fill_modes = gtk_css_style_get_value (GTK_CSS_STYLE (style), GTK_CSS_PROPERTY_ANIMATION_FILL_MODE); + animation_names = gtk_css_style_get_value (base_style, GTK_CSS_PROPERTY_ANIMATION_NAME); + durations = gtk_css_style_get_value (base_style, GTK_CSS_PROPERTY_ANIMATION_DURATION); + delays = gtk_css_style_get_value (base_style, GTK_CSS_PROPERTY_ANIMATION_DELAY); + timing_functions = gtk_css_style_get_value (base_style, GTK_CSS_PROPERTY_ANIMATION_TIMING_FUNCTION); + iteration_counts = gtk_css_style_get_value (base_style, GTK_CSS_PROPERTY_ANIMATION_ITERATION_COUNT); + directions = gtk_css_style_get_value (base_style, GTK_CSS_PROPERTY_ANIMATION_DIRECTION); + play_states = gtk_css_style_get_value (base_style, GTK_CSS_PROPERTY_ANIMATION_PLAY_STATE); + fill_modes = gtk_css_style_get_value (base_style, GTK_CSS_PROPERTY_ANIMATION_FILL_MODE); - for (i = 0; i < _gtk_css_array_value_get_n_values (animations); i++) + for (i = 0; i < _gtk_css_array_value_get_n_values (animation_names); i++) { GtkStyleAnimation *animation; GtkCssKeyframes *keyframes; const char *name; - name = _gtk_css_ident_value_get (_gtk_css_array_value_get_nth (animations, i)); + name = _gtk_css_ident_value_get (_gtk_css_array_value_get_nth (animation_names, i)); if (g_ascii_strcasecmp (name, "none") == 0) continue; - animation = gtk_css_animated_style_find_animation (style, name); + animation = gtk_css_animated_style_find_animation (animations, name); if (animation) continue; if (GTK_IS_CSS_ANIMATED_STYLE (source)) - animation = gtk_css_animated_style_find_animation (GTK_CSS_ANIMATED_STYLE (source), name); + animation = gtk_css_animated_style_find_animation (GTK_CSS_ANIMATED_STYLE (source)->animations, name); if (animation) { @@ -364,7 +369,7 @@ gtk_css_animated_style_create_css_animations (GtkCssAnimatedStyle *style, if (keyframes == NULL) continue; - keyframes = _gtk_css_keyframes_compute (keyframes, provider, scale, GTK_CSS_STYLE (style), parent_style); + keyframes = _gtk_css_keyframes_compute (keyframes, provider, scale, base_style, parent_style); animation = _gtk_css_animation_new (name, keyframes, @@ -378,8 +383,10 @@ gtk_css_animated_style_create_css_animations (GtkCssAnimatedStyle *style, _gtk_css_number_value_get (_gtk_css_array_value_get_nth (iteration_counts, i), 100)); _gtk_css_keyframes_unref (keyframes); } - style->animations = g_slist_prepend (style->animations, animation); + animations = g_slist_prepend (animations, animation); } + + return animations; } /* PUBLIC API */ @@ -393,19 +400,26 @@ gtk_css_animated_style_new (GtkCssStyle *base_style, GtkCssStyle *previous_style) { GtkCssAnimatedStyle *result; + GSList *animations; gtk_internal_return_val_if_fail (GTK_IS_CSS_STYLE (base_style), NULL); gtk_internal_return_val_if_fail (parent_style == NULL || GTK_IS_CSS_STYLE (parent_style), NULL); gtk_internal_return_val_if_fail (GTK_IS_STYLE_PROVIDER (provider), NULL); gtk_internal_return_val_if_fail (previous_style == NULL || GTK_IS_CSS_STYLE (previous_style), NULL); + animations = NULL; + + if (previous_style != NULL) + animations = gtk_css_animated_style_create_css_transitions (animations, base_style, timestamp, previous_style); + animations = gtk_css_animated_style_create_css_animations (animations, base_style, parent_style, timestamp, provider, scale, previous_style); + + if (animations == NULL) + return g_object_ref (base_style); + result = g_object_new (GTK_TYPE_CSS_ANIMATED_STYLE, NULL); result->style = g_object_ref (base_style); - - if (previous_style != NULL) - gtk_css_animated_style_create_css_transitions (result, timestamp, previous_style); - gtk_css_animated_style_create_css_animations (result, parent_style, timestamp, provider, scale, previous_style); + result->animations = animations; return GTK_CSS_STYLE (result); } |