#include "config.h"
+#include "gtkprivate.h"
#include "gtkcsscomputedvaluesprivate.h"
#include "gtkcssanimationprivate.h"
}
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
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);
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);
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);
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)
_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 &&
_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)
_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)
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);
}
static void
-gtk_css_computed_values_create_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);
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);
- 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));
+ 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, 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);
}
}
/* PUBLIC API */
void
-_gtk_css_computed_values_create_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)
{
- gtk_css_computed_values_create_css_transitions (values, timestamp, source);
- gtk_css_computed_values_create_css_animations (values, timestamp, context);
+ 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 *
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;
{
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)
{
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;
+}
+