actor: Replace private opacity_parent with opacity_override
authorChris Lord <chris@linux.intel.com>
Thu, 3 Feb 2011 13:58:20 +0000 (13:58 +0000)
committerChris Lord <chris@linux.intel.com>
Fri, 11 Feb 2011 16:17:57 +0000 (16:17 +0000)
Replace the opacity_parent with an opacity_override variable, to allow
direct overriding of the paint opacity and simplify this mechanism
somewhat.

This also required a new private flag, in_clone_paint, to maintain the
functionality of the public function clutter_actor_is_in_clone_paint()

clutter/clutter-actor-private.h
clutter/clutter-actor.c
clutter/clutter-clone.c

index eb6ecc7..db670ae 100644 (file)
@@ -129,8 +129,10 @@ void _clutter_actor_rerealize (ClutterActor    *self,
                                ClutterCallback  callback,
                                gpointer         data);
 
-void _clutter_actor_set_opacity_parent (ClutterActor *self,
-                                        ClutterActor *parent);
+void _clutter_actor_set_opacity_override (ClutterActor *self,
+                                          gint          opacity);
+void _clutter_actor_set_in_clone_paint (ClutterActor *self,
+                                        gboolean      in_clone_paint);
 
 void _clutter_actor_set_enable_model_view_transform (ClutterActor *self,
                                                      gboolean      enable);
index 47cf8ac..390b1aa 100644 (file)
@@ -412,6 +412,7 @@ struct _ClutterActorPrivate
   guint propagated_one_redraw       : 1;
   guint paint_volume_valid          : 1;
   guint last_paint_box_valid        : 1;
+  guint in_clone_paint              : 1;
 
   gfloat clip[4];
 
@@ -436,6 +437,7 @@ struct _ClutterActorPrivate
   gfloat z;
 
   guint8 opacity;
+  gint   opacity_override;
 
   ClutterActor   *parent_actor;
   GList          *children;
@@ -453,8 +455,6 @@ struct _ClutterActorPrivate
 
   PangoContext   *pango_context;
 
-  ClutterActor   *opacity_parent;
-
   ClutterTextDirection text_direction;
 
   gint internal_child;
@@ -2581,9 +2581,9 @@ clutter_actor_paint (ClutterActor *self)
   if (context->pick_mode == CLUTTER_PICK_NONE &&
       /* ignore top-levels, since they might be transparent */
       !CLUTTER_ACTOR_IS_TOPLEVEL (self) &&
-      /* If the actor is being painted from a clone then check the
-         clone's opacity instead */
-      (priv->opacity_parent ? priv->opacity_parent->priv : priv)->opacity == 0)
+      /* Use the override opacity if its been set */
+      ((priv->opacity_override >= 0) ?
+       priv->opacity_override : priv->opacity) == 0)
     {
       priv->propagated_one_redraw = FALSE;
       return;
@@ -4901,7 +4901,7 @@ clutter_actor_init (ClutterActor *self)
   priv->cached_width_age = 1;
   priv->cached_height_age = 1;
 
-  priv->opacity_parent = NULL;
+  priv->opacity_override = -1;
   priv->enable_model_view_transform = TRUE;
 
   /* Initialize an empty paint box to start with */
@@ -7065,8 +7065,8 @@ clutter_actor_get_paint_opacity_internal (ClutterActor *self)
   if (CLUTTER_ACTOR_IS_TOPLEVEL (self))
     return 255;
 
-  if (priv->opacity_parent != NULL)
-    return clutter_actor_get_paint_opacity_internal (priv->opacity_parent);
+  if (priv->opacity_override >= 0)
+    return priv->opacity_override;
 
   parent = priv->parent_actor;
 
@@ -10196,15 +10196,16 @@ clutter_actor_create_pango_layout (ClutterActor *self,
   return layout;
 }
 
-/* Allows overriding the parent traversed when querying an actors paint
- * opacity. Used by ClutterClone. */
+/* Allows overriding the calculated paint opacity. Used by ClutterClone and
+ * ClutterOffscreenEffect.
+ */
 void
-_clutter_actor_set_opacity_parent (ClutterActor *self,
-                                   ClutterActor *parent)
+_clutter_actor_set_opacity_override (ClutterActor *self,
+                                     gint          opacity)
 {
   g_return_if_fail (CLUTTER_IS_ACTOR (self));
 
-  self->priv->opacity_parent = parent;
+  self->priv->opacity_override = opacity;
 }
 
 /* Allows you to disable applying the actors model view transform during
@@ -10568,6 +10569,14 @@ clutter_actor_get_transformation_matrix (ClutterActor *self,
   _clutter_actor_apply_modelview_transform (self, matrix);
 }
 
+void
+_clutter_actor_set_in_clone_paint (ClutterActor *self,
+                                   gboolean      in_clone_paint)
+{
+  g_return_if_fail (CLUTTER_IS_ACTOR (self));
+  self->priv->in_clone_paint = in_clone_paint;
+}
+
 /**
  * clutter_actor_is_in_clone_paint:
  * @self: a #ClutterActor
@@ -10588,20 +10597,9 @@ clutter_actor_get_transformation_matrix (ClutterActor *self,
 gboolean
 clutter_actor_is_in_clone_paint (ClutterActor *self)
 {
-  ClutterActorPrivate *priv;
-
   g_return_val_if_fail (CLUTTER_IS_ACTOR (self), FALSE);
 
-  /* XXX - keep in sync with the overrides set by ClutterClone:
-   *
-   *  - opacity_parent != NULL
-   *  - enable_model_view_transform == FALSE
-   */
-
-  priv = self->priv;
-
-  return priv->opacity_parent != NULL &&
-         !priv->enable_model_view_transform;
+  return self->priv->in_clone_paint;
 }
 
 static void
index ed33489..b1bc7f6 100644 (file)
@@ -169,13 +169,16 @@ clutter_clone_paint (ClutterActor *self)
                                               : "unknown");
 
   /* The final bits of magic:
-   * - We need to make sure that when the clone-source actor's paint
-   *   method calls clutter_actor_get_paint_opacity, it traverses to
-   *   us and our parent not it's real parent.
+   * - We need to override the paint opacity of the actor with our own
+   *   opacity.
+   * - We need to inform the actor that it's in a clone paint (for the function
+   *   clutter_actor_is_in_clone_paint())
    * - We need to stop clutter_actor_paint applying the model view matrix of
    *   the clone source actor.
    */
-  _clutter_actor_set_opacity_parent (priv->clone_source, self);
+  _clutter_actor_set_in_clone_paint (priv->clone_source, TRUE);
+  _clutter_actor_set_opacity_override (priv->clone_source,
+                                       clutter_actor_get_paint_opacity (self));
   _clutter_actor_set_enable_model_view_transform (priv->clone_source, FALSE);
 
   if (!CLUTTER_ACTOR_IS_MAPPED (priv->clone_source))
@@ -192,7 +195,8 @@ clutter_clone_paint (ClutterActor *self)
     _clutter_actor_set_enable_paint_unmapped (priv->clone_source, FALSE);
 
   _clutter_actor_set_enable_model_view_transform (priv->clone_source, TRUE);
-  _clutter_actor_set_opacity_parent (priv->clone_source, NULL);
+  _clutter_actor_set_opacity_override (priv->clone_source, -1);
+  _clutter_actor_set_in_clone_paint (priv->clone_source, FALSE);
 }
 
 gboolean