[clutter] scroll-actor: Use :child-transform



commit 01ba68ad3b2990513e1125bd3ce97a24d0a72670
Author: Emmanuele Bassi <ebassi gnome org>
Date:   Wed Feb 20 23:02:05 2013 +0000

    scroll-actor: Use :child-transform
    
    Instead of using a custom apply_transform(), paint(), and pick()
    implementations, we can simply apply a transformation to the children of
    a ScrollActor.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=686225

 clutter/clutter-scroll-actor.c |  103 ++++++---------------------------------
 1 files changed, 16 insertions(+), 87 deletions(-)
---
diff --git a/clutter/clutter-scroll-actor.c b/clutter/clutter-scroll-actor.c
index 366047c..8783e10 100644
--- a/clutter/clutter-scroll-actor.c
+++ b/clutter/clutter-scroll-actor.c
@@ -100,92 +100,13 @@ G_DEFINE_TYPE_WITH_CODE (ClutterScrollActor, clutter_scroll_actor, CLUTTER_TYPE_
                                                 clutter_animatable_iface_init))
 
 static void
-clutter_scroll_actor_apply_transform (ClutterActor *actor,
-                                      CoglMatrix   *transform)
-{
-  ClutterScrollActorPrivate *priv = CLUTTER_SCROLL_ACTOR (actor)->priv;
-  float x_factor, y_factor;
-
-  CLUTTER_ACTOR_CLASS (clutter_scroll_actor_parent_class)->apply_transform (actor, transform);
-
-  if (priv->scroll_mode & CLUTTER_SCROLL_HORIZONTALLY)
-    x_factor = -priv->scroll_to.x;
-  else
-    x_factor = 0.f;
-
-  if (priv->scroll_mode & CLUTTER_SCROLL_VERTICALLY)
-    y_factor = -priv->scroll_to.y;
-  else
-    y_factor = 0.f;
-
-  cogl_matrix_translate (transform, x_factor, y_factor, 0.0f);
-}
-
-static inline void
-clutter_scroll_actor_push_clip (ClutterActor *actor)
-{
-  ClutterScrollActorPrivate *priv = CLUTTER_SCROLL_ACTOR (actor)->priv;
-  ClutterActorBox allocation;
-  float width, height;
-  float x, y;
-
-  clutter_actor_get_allocation_box (actor, &allocation);
-  clutter_actor_box_get_size (&allocation, &width, &height);
-
-  if (priv->scroll_mode & CLUTTER_SCROLL_HORIZONTALLY)
-    x = priv->scroll_to.x;
-  else
-    x = 0.f;
-
-  if (priv->scroll_mode & CLUTTER_SCROLL_VERTICALLY)
-    y = priv->scroll_to.y;
-  else
-    y = 0.f;
-
-  /* offset the clip so that we keep it at the right place */
-  cogl_clip_push_rectangle (x,
-                            y,
-                            x + width,
-                            y + height);
-}
-
-static void
-clutter_scroll_actor_paint (ClutterActor *actor)
-{
-  clutter_scroll_actor_push_clip (actor);
-
-  CLUTTER_ACTOR_CLASS (clutter_scroll_actor_parent_class)->paint (actor);
-
-  cogl_clip_pop ();
-}
-
-static void
-clutter_scroll_actor_pick (ClutterActor       *actor,
-                           const ClutterColor *pick_color)
-{
-  ClutterActorIter iter;
-  ClutterActor *child;
-
-  clutter_scroll_actor_push_clip (actor);
-
-  CLUTTER_ACTOR_CLASS (clutter_scroll_actor_parent_class)->pick (actor, pick_color);
-
-  /* FIXME - this has to go away when we remove the vfunc check inside
-   * the ClutterActor::pick default implementation
-   */
-  clutter_actor_iter_init (&iter, actor);
-  while (clutter_actor_iter_next (&iter, &child))
-    clutter_actor_paint (child);
-
-  cogl_clip_pop ();
-}
-
-static void
 clutter_scroll_actor_set_scroll_to_internal (ClutterScrollActor *self,
                                              const ClutterPoint *point)
 {
   ClutterScrollActorPrivate *priv = self->priv;
   ClutterActor *actor = CLUTTER_ACTOR (self);
+  ClutterMatrix m = CLUTTER_MATRIX_INIT_IDENTITY;
+  float dx, dy;
 
   if (clutter_point_equals (&priv->scroll_to, point))
     return;
@@ -195,7 +116,18 @@ clutter_scroll_actor_set_scroll_to_internal (ClutterScrollActor *self,
   else
     priv->scroll_to = *point;
 
-  clutter_actor_queue_redraw (actor);
+  if (priv->scroll_mode & CLUTTER_SCROLL_HORIZONTALLY)
+    dx = -priv->scroll_to.x;
+  else
+    dx = 0.f;
+
+  if (priv->scroll_mode & CLUTTER_SCROLL_VERTICALLY)
+    dy = -priv->scroll_to.y;
+  else
+    dy = 0.f;
+
+  cogl_matrix_translate (&m, dx, dy, 0.f);
+  clutter_actor_set_child_transform (actor, &m);
 }
 
 static void
@@ -240,17 +172,12 @@ static void
 clutter_scroll_actor_class_init (ClutterScrollActorClass *klass)
 {
   GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
-  ClutterActorClass *actor_class = CLUTTER_ACTOR_CLASS (klass);
 
   g_type_class_add_private (klass, sizeof (ClutterScrollActorPrivate));
 
   gobject_class->set_property = clutter_scroll_actor_set_property;
   gobject_class->get_property = clutter_scroll_actor_get_property;
 
-  actor_class->apply_transform = clutter_scroll_actor_apply_transform;
-  actor_class->paint = clutter_scroll_actor_paint;
-  actor_class->pick = clutter_scroll_actor_pick;
-
   /**
    * ClutterScrollActor:scroll-mode:
    *
@@ -277,6 +204,8 @@ clutter_scroll_actor_init (ClutterScrollActor *self)
                                             ClutterScrollActorPrivate);
 
   self->priv->scroll_mode = CLUTTER_SCROLL_BOTH;
+
+  clutter_actor_set_clip_to_allocation (CLUTTER_ACTOR (self), TRUE);
 }
 
 static GParamSpec *


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]