guint propagated_one_redraw : 1;
guint paint_volume_valid : 1;
guint last_paint_box_valid : 1;
+ guint in_clone_paint : 1;
gfloat clip[4];
gfloat z;
guint8 opacity;
+ gint opacity_override;
ClutterActor *parent_actor;
GList *children;
PangoContext *pango_context;
- ClutterActor *opacity_parent;
-
ClutterTextDirection text_direction;
gint internal_child;
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;
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 */
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;
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
_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
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
: "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))
_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