X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtkcsscomputedvalues.c;h=dea23bdf5e3ef50da9a0e2b4c63945bd034e415c;hb=5bbbc47a4c306653e8347f7afb85a940a503f755;hp=283412404df5e2f863536baef073f1a908df06d7;hpb=bf19d895108be6f80fd0b050b811e14cb2c885dc;p=~andy%2Fgtk diff --git a/gtk/gtkcsscomputedvalues.c b/gtk/gtkcsscomputedvalues.c index 283412404..dea23bdf5 100644 --- a/gtk/gtkcsscomputedvalues.c +++ b/gtk/gtkcsscomputedvalues.c @@ -19,6 +19,7 @@ #include "config.h" +#include "gtkprivate.h" #include "gtkcsscomputedvaluesprivate.h" #include "gtkcssanimationprivate.h" @@ -110,17 +111,19 @@ maybe_unref_section (gpointer section) } void -_gtk_css_computed_values_compute_value (GtkCssComputedValues *values, - GtkStyleContext *context, - guint id, - GtkCssValue *specified, - GtkCssSection *section) +_gtk_css_computed_values_compute_value (GtkCssComputedValues *values, + GtkStyleProviderPrivate *provider, + GtkCssComputedValues *parent_values, + guint id, + GtkCssValue *specified, + GtkCssSection *section) { GtkCssDependencies dependencies; GtkCssValue *value; - g_return_if_fail (GTK_IS_CSS_COMPUTED_VALUES (values)); - g_return_if_fail (GTK_IS_STYLE_CONTEXT (context)); + gtk_internal_return_if_fail (GTK_IS_CSS_COMPUTED_VALUES (values)); + gtk_internal_return_if_fail (GTK_IS_STYLE_PROVIDER_PRIVATE (provider)); + gtk_internal_return_if_fail (parent_values == NULL || GTK_IS_CSS_COMPUTED_VALUES (parent_values)); /* http://www.w3.org/TR/css3-cascade/#cascade * Then, for every element, the value for each property can be found @@ -139,7 +142,7 @@ _gtk_css_computed_values_compute_value (GtkCssComputedValues *values, else _gtk_css_value_ref (specified); - value = _gtk_css_value_compute (specified, id, context, &dependencies); + value = _gtk_css_value_compute (specified, id, provider, values, parent_values, &dependencies); _gtk_css_computed_values_set_value (values, id, value, dependencies, section); @@ -152,8 +155,8 @@ _gtk_css_computed_values_set_animated_value (GtkCssComputedValues *values, guint id, GtkCssValue *value) { - g_return_if_fail (GTK_IS_CSS_COMPUTED_VALUES (values)); - g_return_if_fail (value != NULL); + gtk_internal_return_if_fail (GTK_IS_CSS_COMPUTED_VALUES (values)); + gtk_internal_return_if_fail (value != NULL); if (values->animated_values == NULL) values->animated_values = g_ptr_array_new_with_free_func ((GDestroyNotify)_gtk_css_value_unref); @@ -173,10 +176,11 @@ _gtk_css_computed_values_set_value (GtkCssComputedValues *values, GtkCssDependencies dependencies, GtkCssSection *section) { - g_return_if_fail (GTK_IS_CSS_COMPUTED_VALUES (values)); + gtk_internal_return_if_fail (GTK_IS_CSS_COMPUTED_VALUES (values)); if (values->values == NULL) - values->values = g_ptr_array_new_with_free_func ((GDestroyNotify)_gtk_css_value_unref); + values->values = g_ptr_array_new_full (_gtk_css_style_property_get_n_properties (), + (GDestroyNotify)_gtk_css_value_unref); if (id >= values->values->len) g_ptr_array_set_size (values->values, id + 1); @@ -193,6 +197,12 @@ _gtk_css_computed_values_set_value (GtkCssComputedValues *values, if (dependencies & (GTK_CSS_DEPENDS_ON_FONT_SIZE)) values->depends_on_font_size = _gtk_bitmask_set (values->depends_on_font_size, id, TRUE); + if (values->sections && values->sections->len > id && g_ptr_array_index (values->sections, id)) + { + gtk_css_section_unref (g_ptr_array_index (values->sections, id)); + g_ptr_array_index (values->sections, id) = NULL; + } + if (section) { if (values->sections == NULL) @@ -208,7 +218,7 @@ GtkCssValue * _gtk_css_computed_values_get_value (GtkCssComputedValues *values, guint id) { - g_return_val_if_fail (GTK_IS_CSS_COMPUTED_VALUES (values), NULL); + gtk_internal_return_val_if_fail (GTK_IS_CSS_COMPUTED_VALUES (values), NULL); if (values->animated_values && id < values->animated_values->len && @@ -222,7 +232,7 @@ GtkCssValue * _gtk_css_computed_values_get_intrinsic_value (GtkCssComputedValues *values, guint id) { - g_return_val_if_fail (GTK_IS_CSS_COMPUTED_VALUES (values), NULL); + gtk_internal_return_val_if_fail (GTK_IS_CSS_COMPUTED_VALUES (values), NULL); if (values->values == NULL || id >= values->values->len) @@ -235,7 +245,7 @@ GtkCssSection * _gtk_css_computed_values_get_section (GtkCssComputedValues *values, guint id) { - g_return_val_if_fail (GTK_IS_CSS_COMPUTED_VALUES (values), NULL); + gtk_internal_return_val_if_fail (GTK_IS_CSS_COMPUTED_VALUES (values), NULL); if (values->sections == NULL || id >= values->sections->len) @@ -364,9 +374,9 @@ gtk_css_computed_values_find_transition (GtkCssComputedValues *values, } static void -gtk_css_computed_values_start_transitions (GtkCssComputedValues *values, - gint64 timestamp, - GtkCssComputedValues *source) +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; @@ -403,8 +413,7 @@ gtk_css_computed_values_start_transitions (GtkCssComputedValues *values, else { animation = _gtk_css_transition_new (i, - start, - end, + _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); @@ -432,16 +441,16 @@ gtk_css_computed_values_find_animation (GtkCssComputedValues *values, } static void -gtk_css_computed_values_start_css_animations (GtkCssComputedValues *values, - gint64 timestamp, - GtkStyleContext *context) +gtk_css_computed_values_create_css_animations (GtkCssComputedValues *values, + GtkCssComputedValues *parent_values, + gint64 timestamp, + GtkStyleProviderPrivate *provider, + GtkCssComputedValues *source) { - GtkStyleProviderPrivate *provider; GtkCssValue *durations, *delays, *timing_functions, *animations; GtkCssValue *iteration_counts, *directions, *play_states, *fill_modes; guint i; - provider = _gtk_style_context_get_style_provider (context); animations = _gtk_css_computed_values_get_value (values, GTK_CSS_PROPERTY_ANIMATION_NAME); durations = _gtk_css_computed_values_get_value (values, GTK_CSS_PROPERTY_ANIMATION_DURATION); delays = _gtk_css_computed_values_get_value (values, GTK_CSS_PROPERTY_ANIMATION_DELAY); @@ -465,21 +474,35 @@ gtk_css_computed_values_start_css_animations (GtkCssComputedValues *values, if (animation) continue; - keyframes = _gtk_style_provider_private_get_keyframes (provider, name); - if (keyframes == NULL) - continue; + if (source) + animation = gtk_css_computed_values_find_animation (source, name); + + if (animation) + { + animation = _gtk_css_animation_copy (GTK_CSS_ANIMATION (animation), + timestamp, + _gtk_css_play_state_value_get (_gtk_css_array_value_get_nth (play_states, i))); + } + else + { + keyframes = _gtk_style_provider_private_get_keyframes (provider, name); + if (keyframes == NULL) + continue; - keyframes = _gtk_css_keyframes_compute (keyframes, context); - - animation = _gtk_css_animation_new (name, - keyframes, - timestamp + _gtk_css_number_value_get (_gtk_css_array_value_get_nth (delays, i), 100) * G_USEC_PER_SEC, - _gtk_css_number_value_get (_gtk_css_array_value_get_nth (durations, i), 100) * G_USEC_PER_SEC, - _gtk_css_array_value_get_nth (timing_functions, i), - _gtk_css_direction_value_get (_gtk_css_array_value_get_nth (directions, i)), - _gtk_css_play_state_value_get (_gtk_css_array_value_get_nth (play_states, i)), - _gtk_css_fill_mode_value_get (_gtk_css_array_value_get_nth (fill_modes, i)), - _gtk_css_number_value_get (_gtk_css_array_value_get_nth (iteration_counts, i), 100)); + keyframes = _gtk_css_keyframes_compute (keyframes, provider, values, parent_values); + + animation = _gtk_css_animation_new (name, + keyframes, + timestamp, + _gtk_css_number_value_get (_gtk_css_array_value_get_nth (delays, i), 100) * G_USEC_PER_SEC, + _gtk_css_number_value_get (_gtk_css_array_value_get_nth (durations, i), 100) * G_USEC_PER_SEC, + _gtk_css_array_value_get_nth (timing_functions, i), + _gtk_css_direction_value_get (_gtk_css_array_value_get_nth (directions, i)), + _gtk_css_play_state_value_get (_gtk_css_array_value_get_nth (play_states, i)), + _gtk_css_fill_mode_value_get (_gtk_css_array_value_get_nth (fill_modes, i)), + _gtk_css_number_value_get (_gtk_css_array_value_get_nth (iteration_counts, i), 100)); + _gtk_css_keyframes_unref (keyframes); + } values->animations = g_slist_prepend (values->animations, animation); } } @@ -487,18 +510,15 @@ gtk_css_computed_values_start_css_animations (GtkCssComputedValues *values, /* PUBLIC API */ void -_gtk_css_computed_values_start_animations (GtkCssComputedValues *values, - gint64 timestamp, - GtkCssComputedValues *source, - GtkStyleContext *context) +_gtk_css_computed_values_create_animations (GtkCssComputedValues *values, + GtkCssComputedValues *parent_values, + gint64 timestamp, + GtkStyleProviderPrivate *provider, + GtkCssComputedValues *source) { - GtkBitmask *ignore; - - gtk_css_computed_values_start_transitions (values, timestamp, source); - gtk_css_computed_values_start_css_animations (values, timestamp, context); - - ignore = _gtk_css_computed_values_advance (values, timestamp); - _gtk_bitmask_free (ignore); + if (source != NULL) + gtk_css_computed_values_create_css_transitions (values, timestamp, source); + gtk_css_computed_values_create_css_animations (values, parent_values, timestamp, provider, source); } GtkBitmask * @@ -510,8 +530,8 @@ _gtk_css_computed_values_advance (GtkCssComputedValues *values, GSList *list; guint i; - g_return_val_if_fail (GTK_IS_CSS_COMPUTED_VALUES (values), NULL); - g_return_val_if_fail (timestamp >= values->current_time, NULL); + gtk_internal_return_val_if_fail (GTK_IS_CSS_COMPUTED_VALUES (values), NULL); + gtk_internal_return_val_if_fail (timestamp >= values->current_time, NULL); values->current_time = timestamp; old_computed_values = values->animated_values; @@ -560,7 +580,7 @@ _gtk_css_computed_values_is_static (GtkCssComputedValues *values) { GSList *list; - g_return_val_if_fail (GTK_IS_CSS_COMPUTED_VALUES (values), TRUE); + gtk_internal_return_val_if_fail (GTK_IS_CSS_COMPUTED_VALUES (values), TRUE); for (list = values->animations; list; list = list->next) { @@ -570,3 +590,37 @@ _gtk_css_computed_values_is_static (GtkCssComputedValues *values) return TRUE; } + +void +_gtk_css_computed_values_cancel_animations (GtkCssComputedValues *values) +{ + gtk_internal_return_if_fail (GTK_IS_CSS_COMPUTED_VALUES (values)); + + if (values->animated_values) + { + g_ptr_array_unref (values->animated_values); + values->animated_values = NULL; + } + + g_slist_free_full (values->animations, g_object_unref); + values->animations = NULL; +} + +GtkBitmask * +_gtk_css_computed_values_compute_dependencies (GtkCssComputedValues *values, + const GtkBitmask *parent_changes) +{ + GtkBitmask *changes; + + gtk_internal_return_val_if_fail (GTK_IS_CSS_COMPUTED_VALUES (values), _gtk_bitmask_new ()); + + changes = _gtk_bitmask_copy (parent_changes); + changes = _gtk_bitmask_intersect (changes, values->depends_on_parent); + if (_gtk_bitmask_get (changes, GTK_CSS_PROPERTY_COLOR)) + changes = _gtk_bitmask_union (changes, values->depends_on_color); + if (_gtk_bitmask_get (changes, GTK_CSS_PROPERTY_FONT_SIZE)) + changes = _gtk_bitmask_union (changes, values->depends_on_font_size); + + return changes; +} +