[gtk+/wip/watson/progress-tracker: 42/42] wip animation
- From: Matthew Watson <watson src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/wip/watson/progress-tracker: 42/42] wip animation
- Date: Wed, 6 Apr 2016 19:19:33 +0000 (UTC)
commit 54488654e6e0813190d2774eb49b3efa150f6607
Author: Matt Watson <mattdangerw gmail com>
Date: Tue Apr 5 18:27:05 2016 -0700
wip animation
gtk/gtkcssanimatedstyle.c | 35 +++++++++++++-------------
gtk/gtkcssanimation.c | 49 ++++++++++++++++++++++---------------
gtk/gtkcssanimationprivate.h | 8 +++---
gtk/gtkcsstransition.c | 53 ++++++++++++++++++++-------------------
gtk/gtkcsstransitionprivate.h | 3 +-
gtk/gtkstyleanimation.c | 35 ++++++++++++++++++++------
gtk/gtkstyleanimationprivate.h | 10 ++++---
7 files changed, 111 insertions(+), 82 deletions(-)
---
diff --git a/gtk/gtkcssanimatedstyle.c b/gtk/gtkcssanimatedstyle.c
index ad82c9d..b0ba4d0 100644
--- a/gtk/gtkcssanimatedstyle.c
+++ b/gtk/gtkcssanimatedstyle.c
@@ -252,7 +252,8 @@ gtk_css_animated_style_find_transition (GtkCssAnimatedStyle *style,
static GSList *
gtk_css_animated_style_create_css_transitions (GSList *animations,
GtkCssStyle *base_style,
- GtkCssStyle *source)
+ GtkCssStyle *source,
+ gint64 timestamp)
{
TransitionInfo transitions[GTK_CSS_PROPERTY_N_PROPERTIES] = { { 0, } };
GtkCssValue *durations, *delays, *timing_functions;
@@ -288,7 +289,7 @@ gtk_css_animated_style_create_css_transitions (GSList *animations,
animation = gtk_css_animated_style_find_transition (GTK_CSS_ANIMATED_STYLE (source), i);
if (animation)
{
- animation = _gtk_css_transition_copy (GTK_CSS_TRANSITION (animation));
+ animation = _gtk_style_animation_advance (animation, timestamp);
animations = g_slist_prepend (animations, animation);
}
@@ -303,6 +304,7 @@ gtk_css_animated_style_create_css_transitions (GSList *animations,
animation = _gtk_css_transition_new (i,
gtk_css_style_get_value (source, i),
_gtk_css_array_value_get_nth (timing_functions, i),
+ timestamp,
duration * G_USEC_PER_SEC,
delay * G_USEC_PER_SEC);
animations = g_slist_prepend (animations, animation);
@@ -333,6 +335,7 @@ static GSList *
gtk_css_animated_style_create_css_animations (GSList *animations,
GtkCssStyle *base_style,
GtkCssStyle *parent_style,
+ gint64 timestamp,
GtkStyleProviderPrivate *provider,
GtkCssStyle *source)
{
@@ -368,9 +371,9 @@ gtk_css_animated_style_create_css_animations (GSList *animation
if (animation)
{
- animation = _gtk_css_animation_copy (GTK_CSS_ANIMATION (animation));
- _gtk_css_animation_set_play_state (GTK_CSS_ANIMATION (animation),
- _gtk_css_play_state_value_get (_gtk_css_array_value_get_nth
(play_states, i)));
+ animation = _gtk_css_animation_advance_with_play_state (GTK_CSS_ANIMATION (animation),
+ timestamp,
+ _gtk_css_play_state_value_get
(_gtk_css_array_value_get_nth (play_states, i)));
}
else
{
@@ -382,6 +385,7 @@ gtk_css_animated_style_create_css_animations (GSList *animation
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),
@@ -400,8 +404,7 @@ gtk_css_animated_style_create_css_animations (GSList *animation
/* PUBLIC API */
static void
-gtk_css_animated_style_advance_animations (GtkCssAnimatedStyle *style,
- gint64 timestamp)
+gtk_css_animated_style_apply_animations (GtkCssAnimatedStyle *style)
{
GSList *l;
@@ -409,9 +412,8 @@ gtk_css_animated_style_advance_animations (GtkCssAnimatedStyle *style,
{
GtkStyleAnimation *animation = l->data;
- _gtk_style_animation_advance_values (animation,
- timestamp,
- GTK_CSS_ANIMATED_STYLE (style));
+ _gtk_style_animation_apply_values (animation,
+ GTK_CSS_ANIMATED_STYLE (style));
}
}
@@ -436,8 +438,8 @@ gtk_css_animated_style_new (GtkCssStyle *base_style,
animations = NULL;
if (previous_style != NULL)
- animations = gtk_css_animated_style_create_css_transitions (animations, base_style, previous_style);
- animations = gtk_css_animated_style_create_css_animations (animations, base_style, parent_style, provider,
previous_style);
+ animations = gtk_css_animated_style_create_css_transitions (animations, base_style, previous_style,
timestamp);
+ animations = gtk_css_animated_style_create_css_animations (animations, base_style, parent_style,
timestamp, provider, previous_style);
if (animations == NULL)
return g_object_ref (base_style);
@@ -448,7 +450,7 @@ gtk_css_animated_style_new (GtkCssStyle *base_style,
result->current_time = timestamp;
result->animations = animations;
- gtk_css_animated_style_advance_animations (result, timestamp);
+ gtk_css_animated_style_apply_animations (result);
return GTK_CSS_STYLE (result);
}
@@ -476,11 +478,8 @@ gtk_css_animated_style_new_advance (GtkCssAnimatedStyle *source,
if (_gtk_style_animation_is_finished (animation))
continue;
- if (GTK_IS_CSS_ANIMATION (animation))
- animation = _gtk_css_animation_copy (GTK_CSS_ANIMATION (animation));
- if (GTK_IS_CSS_TRANSITION (animation))
- animation = _gtk_css_transition_copy (GTK_CSS_TRANSITION (animation));
+ animation = _gtk_style_animation_advance (animation, timestamp);
animations = g_slist_prepend (animations, animation);
}
animations = g_slist_reverse (animations);
@@ -494,7 +493,7 @@ gtk_css_animated_style_new_advance (GtkCssAnimatedStyle *source,
result->current_time = timestamp;
result->animations = animations;
- gtk_css_animated_style_advance_animations (result, timestamp);
+ gtk_css_animated_style_apply_animations (result);
return GTK_CSS_STYLE (result);
}
diff --git a/gtk/gtkcssanimation.c b/gtk/gtkcssanimation.c
index 6f140f1..109ec4c 100644
--- a/gtk/gtkcssanimation.c
+++ b/gtk/gtkcssanimation.c
@@ -25,7 +25,6 @@
#include "gtkprogresstrackerprivate.h"
#include <math.h>
-#include <string.h>
G_DEFINE_TYPE (GtkCssAnimation, _gtk_css_animation, GTK_TYPE_STYLE_ANIMATION)
@@ -77,18 +76,25 @@ gtk_css_animation_get_progress (GtkCssAnimation *animation)
return gtk_progress_tracker_get_progress (&animation->tracker, reverse);
}
+GtkStyleAnimation *
+gtk_css_animation_advance (GtkStyleAnimation *style_animation,
+ gint64 timestamp)
+{
+ GtkCssAnimation *animation = GTK_CSS_ANIMATION (style_animation);
+
+ return _gtk_css_animation_advance_with_play_state (animation,
+ timestamp,
+ animation->play_state);
+}
+
static void
-gtk_css_animation_advance_values (GtkStyleAnimation *style_animation,
- gint64 for_time_us,
- GtkCssAnimatedStyle *style)
+gtk_css_animation_apply_values (GtkStyleAnimation *style_animation,
+ GtkCssAnimatedStyle *style)
{
GtkCssAnimation *animation = GTK_CSS_ANIMATION (style_animation);
double progress;
guint i;
- if (animation->play_state != GTK_CSS_PLAY_STATE_PAUSED)
- gtk_progress_tracker_next_frame (&animation->tracker, for_time_us);
-
if (!gtk_css_animation_is_executing (animation))
return;
@@ -148,7 +154,8 @@ _gtk_css_animation_class_init (GtkCssAnimationClass *klass)
object_class->finalize = gtk_css_animation_finalize;
- animation_class->advance_values = gtk_css_animation_advance_values;
+ animation_class->advance = gtk_css_animation_advance;
+ animation_class->apply_values = gtk_css_animation_apply_values;
animation_class->is_finished = gtk_css_animation_is_finished;
animation_class->is_static = gtk_css_animation_is_static;
}
@@ -161,6 +168,7 @@ _gtk_css_animation_init (GtkCssAnimation *animation)
GtkStyleAnimation *
_gtk_css_animation_new (const char *name,
GtkCssKeyframes *keyframes,
+ gint64 timestamp,
gint64 delay_us,
gint64 duration_us,
GtkCssValue *ease,
@@ -186,12 +194,18 @@ _gtk_css_animation_new (const char *name,
animation->fill_mode = fill_mode;
gtk_progress_tracker_start (&animation->tracker, duration_us, delay_us, iteration_count);
+ if (animation->play_state == GTK_CSS_PLAY_STATE_PAUSED)
+ gtk_progress_tracker_skip_frame (&animation->tracker, timestamp);
+ else
+ gtk_progress_tracker_advance_frame (&animation->tracker, timestamp);
return GTK_STYLE_ANIMATION (animation);
}
GtkStyleAnimation *
-_gtk_css_animation_copy (GtkCssAnimation *source)
+_gtk_css_animation_advance_with_play_state (GtkCssAnimation *source,
+ gint64 timestamp,
+ GtkCssPlayState play_state)
{
GtkCssAnimation *animation;
@@ -203,10 +217,14 @@ _gtk_css_animation_copy (GtkCssAnimation *source)
animation->keyframes = _gtk_css_keyframes_ref (source->keyframes);
animation->ease = _gtk_css_value_ref (source->ease);
animation->direction = source->direction;
- animation->play_state = source->play_state;
+ animation->play_state = play_state;
animation->fill_mode = source->fill_mode;
- memcpy (&animation->tracker, &source->tracker, sizeof (source->tracker));
+ gtk_progress_tracker_init_copy (&source->tracker, &animation->tracker);
+ if (animation->play_state == GTK_CSS_PLAY_STATE_PAUSED)
+ gtk_progress_tracker_skip_frame (&animation->tracker, timestamp);
+ else
+ gtk_progress_tracker_advance_frame (&animation->tracker, timestamp);
return GTK_STYLE_ANIMATION (animation);
}
@@ -218,12 +236,3 @@ _gtk_css_animation_get_name (GtkCssAnimation *animation)
return animation->name;
}
-
-void
-_gtk_css_animation_set_play_state (GtkCssAnimation *animation,
- GtkCssPlayState play_state)
-{
- g_return_if_fail (GTK_IS_CSS_ANIMATION (animation));
-
- animation->play_state = play_state;
-}
diff --git a/gtk/gtkcssanimationprivate.h b/gtk/gtkcssanimationprivate.h
index e9f6623..811cddf 100644
--- a/gtk/gtkcssanimationprivate.h
+++ b/gtk/gtkcssanimationprivate.h
@@ -59,6 +59,7 @@ GType _gtk_css_animation_get_type (void) G_GNUC_CONST;
GtkStyleAnimation * _gtk_css_animation_new (const char *name,
GtkCssKeyframes *keyframes,
+ gint64 timestamp,
gint64 delay_us,
gint64 duration_us,
GtkCssValue *ease,
@@ -67,13 +68,12 @@ GtkStyleAnimation * _gtk_css_animation_new (const char *
GtkCssFillMode fill_mode,
double iteration_count);
-GtkStyleAnimation * _gtk_css_animation_copy (GtkCssAnimation *animation);
+GtkStyleAnimation * _gtk_css_animation_advance_with_play_state (GtkCssAnimation *animation,
+ gint64 timestamp,
+ GtkCssPlayState play_state);
const char * _gtk_css_animation_get_name (GtkCssAnimation *animation);
-void _gtk_css_animation_set_play_state (GtkCssAnimation *animation,
- GtkCssPlayState play_state);
-
G_END_DECLS
#endif /* __GTK_CSS_ANIMATION_PRIVATE_H__ */
diff --git a/gtk/gtkcsstransition.c b/gtk/gtkcsstransition.c
index 7cd787e..5f8e1a4 100644
--- a/gtk/gtkcsstransition.c
+++ b/gtk/gtkcsstransition.c
@@ -24,23 +24,39 @@
#include "gtkcsseasevalueprivate.h"
#include "gtkprogresstrackerprivate.h"
-#include <string.h>
-
G_DEFINE_TYPE (GtkCssTransition, _gtk_css_transition, GTK_TYPE_STYLE_ANIMATION)
+static GtkStyleAnimation *
+gtk_css_transition_advance (GtkStyleAnimation *style_animation,
+ gint64 timestamp)
+{
+ GtkCssTransition *source = GTK_CSS_TRANSITION (style_animation);
+
+ GtkCssTransition *transition;
+
+ transition = g_object_new (GTK_TYPE_CSS_TRANSITION, NULL);
+
+ transition->property = source->property;
+ transition->start = _gtk_css_value_ref (source->start);
+ transition->ease = _gtk_css_value_ref (source->ease);
+
+ gtk_progress_tracker_init_copy (&source->tracker, &transition->tracker);
+ gtk_progress_tracker_advance_frame (&transition->tracker, timestamp);
+
+ return GTK_STYLE_ANIMATION (transition);
+}
+
static void
-gtk_css_transition_advance_values (GtkStyleAnimation *animation,
- gint64 for_time_us,
- GtkCssAnimatedStyle *style)
+gtk_css_transition_apply_values (GtkStyleAnimation *style_animation,
+ GtkCssAnimatedStyle *style)
{
- GtkCssTransition *transition = GTK_CSS_TRANSITION (animation);
+ GtkCssTransition *transition = GTK_CSS_TRANSITION (style_animation);
GtkCssValue *value, *end;
double progress;
GtkProgressState state;
end = gtk_css_animated_style_get_intrinsic_value (style, transition->property);
- gtk_progress_tracker_next_frame (&transition->tracker, for_time_us);
state = gtk_progress_tracker_get_state (&transition->tracker);
if (state == GTK_PROGRESS_STATE_BEFORE)
@@ -100,7 +116,8 @@ _gtk_css_transition_class_init (GtkCssTransitionClass *klass)
object_class->finalize = gtk_css_transition_finalize;
- animation_class->advance_values = gtk_css_transition_advance_values;
+ animation_class->advance = gtk_css_transition_advance;
+ animation_class->apply_values = gtk_css_transition_apply_values;
animation_class->is_finished = gtk_css_transition_is_finished;
animation_class->is_static = gtk_css_transition_is_static;
}
@@ -114,6 +131,7 @@ GtkStyleAnimation *
_gtk_css_transition_new (guint property,
GtkCssValue *start,
GtkCssValue *ease,
+ gint64 timestamp,
gint64 duration_us,
gint64 delay_us)
{
@@ -128,24 +146,7 @@ _gtk_css_transition_new (guint property,
transition->start = _gtk_css_value_ref (start);
transition->ease = _gtk_css_value_ref (ease);
gtk_progress_tracker_start (&transition->tracker, duration_us, delay_us, 1.0);
-
- return GTK_STYLE_ANIMATION (transition);
-}
-
-GtkStyleAnimation *
-_gtk_css_transition_copy (GtkCssTransition *source)
-{
- GtkCssTransition *transition;
-
- g_return_val_if_fail (GTK_IS_CSS_TRANSITION (source), NULL);
-
- transition = g_object_new (GTK_TYPE_CSS_TRANSITION, NULL);
-
- transition->property = source->property;
- transition->start = _gtk_css_value_ref (source->start);
- transition->ease = _gtk_css_value_ref (source->ease);
-
- memcpy (&transition->tracker, &source->tracker, sizeof (source->tracker));
+ gtk_progress_tracker_advance_frame (&transition->tracker, timestamp);
return GTK_STYLE_ANIMATION (transition);
}
diff --git a/gtk/gtkcsstransitionprivate.h b/gtk/gtkcsstransitionprivate.h
index 0f81aa5..822a824 100644
--- a/gtk/gtkcsstransitionprivate.h
+++ b/gtk/gtkcsstransitionprivate.h
@@ -55,11 +55,10 @@ GType _gtk_css_transition_get_type (void) G_GNUC_CONST;
GtkStyleAnimation * _gtk_css_transition_new (guint property,
GtkCssValue *start,
GtkCssValue *ease,
+ gint64 timestamp,
gint64 duration_us,
gint64 delay_us);
-GtkStyleAnimation * _gtk_css_transition_copy (GtkCssTransition *transition);
-
guint _gtk_css_transition_get_property (GtkCssTransition *transition);
G_END_DECLS
diff --git a/gtk/gtkstyleanimation.c b/gtk/gtkstyleanimation.c
index 3ba62f7..89f8319 100644
--- a/gtk/gtkstyleanimation.c
+++ b/gtk/gtkstyleanimation.c
@@ -23,10 +23,16 @@
G_DEFINE_ABSTRACT_TYPE (GtkStyleAnimation, _gtk_style_animation, G_TYPE_OBJECT)
+static GtkStyleAnimation *
+gtk_style_animation_real_advance (GtkStyleAnimation *animation,
+ gint64 timestamp)
+{
+ return NULL;
+}
+
static void
-gtk_style_animation_real_advance_values (GtkStyleAnimation *animation,
- gint64 for_time_us,
- GtkCssAnimatedStyle *style)
+gtk_style_animation_real_apply_values (GtkStyleAnimation *animation,
+ GtkCssAnimatedStyle *style)
{
}
@@ -45,7 +51,8 @@ gtk_style_animation_real_is_static (GtkStyleAnimation *animation)
static void
_gtk_style_animation_class_init (GtkStyleAnimationClass *klass)
{
- klass->advance_values = gtk_style_animation_real_advance_values;
+ klass->advance = gtk_style_animation_real_advance;
+ klass->apply_values = gtk_style_animation_real_apply_values;
klass->is_finished = gtk_style_animation_real_is_finished;
klass->is_static = gtk_style_animation_real_is_static;
}
@@ -55,10 +62,22 @@ _gtk_style_animation_init (GtkStyleAnimation *animation)
{
}
+GtkStyleAnimation *
+_gtk_style_animation_advance (GtkStyleAnimation *animation,
+ gint64 timestamp)
+{
+ GtkStyleAnimationClass *klass;
+
+ g_return_val_if_fail (GTK_IS_STYLE_ANIMATION (animation), NULL);
+
+ klass = GTK_STYLE_ANIMATION_GET_CLASS (animation);
+
+ return klass->advance (animation, timestamp);
+}
+
void
-_gtk_style_animation_advance_values (GtkStyleAnimation *animation,
- gint64 for_time_us,
- GtkCssAnimatedStyle *style)
+_gtk_style_animation_apply_values (GtkStyleAnimation *animation,
+ GtkCssAnimatedStyle *style)
{
GtkStyleAnimationClass *klass;
@@ -67,7 +86,7 @@ _gtk_style_animation_advance_values (GtkStyleAnimation *animation,
klass = GTK_STYLE_ANIMATION_GET_CLASS (animation);
- klass->advance_values (animation, for_time_us, style);
+ klass->apply_values (animation, style);
}
gboolean
diff --git a/gtk/gtkstyleanimationprivate.h b/gtk/gtkstyleanimationprivate.h
index 404baa7..dacb159 100644
--- a/gtk/gtkstyleanimationprivate.h
+++ b/gtk/gtkstyleanimationprivate.h
@@ -45,15 +45,17 @@ struct _GtkStyleAnimationClass
gboolean (* is_finished) (GtkStyleAnimation *animation);
gboolean (* is_static) (GtkStyleAnimation *animation);
- void (* advance_values) (GtkStyleAnimation *animation,
- gint64 for_time_us,
+ void (* apply_values) (GtkStyleAnimation *animation,
GtkCssAnimatedStyle *style);
+ GtkStyleAnimation * (* advance) (GtkStyleAnimation *animation,
+ gint64 timestamp);
};
GType _gtk_style_animation_get_type (void) G_GNUC_CONST;
-void _gtk_style_animation_advance_values (GtkStyleAnimation *animation,
- gint64 for_time_us,
+GtkStyleAnimation * _gtk_style_animation_advance (GtkStyleAnimation *animation,
+ gint64 timestamp);
+void _gtk_style_animation_apply_values (GtkStyleAnimation *animation,
GtkCssAnimatedStyle *style);
gboolean _gtk_style_animation_is_finished (GtkStyleAnimation *animation);
gboolean _gtk_style_animation_is_static (GtkStyleAnimation *animation);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]