[gtk+/wip/watson/progress-tracker: 42/42] wip animation



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]