mirror of
https://github.com/brl/mutter.git
synced 2025-04-08 19:29:39 +00:00
actor: Replace private opacity_parent with opacity_override
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()
This commit is contained in:
parent
75434b8a69
commit
b2ea7d1352
@ -129,8 +129,10 @@ void _clutter_actor_rerealize (ClutterActor *self,
|
|||||||
ClutterCallback callback,
|
ClutterCallback callback,
|
||||||
gpointer data);
|
gpointer data);
|
||||||
|
|
||||||
void _clutter_actor_set_opacity_parent (ClutterActor *self,
|
void _clutter_actor_set_opacity_override (ClutterActor *self,
|
||||||
ClutterActor *parent);
|
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,
|
void _clutter_actor_set_enable_model_view_transform (ClutterActor *self,
|
||||||
gboolean enable);
|
gboolean enable);
|
||||||
|
@ -412,6 +412,7 @@ struct _ClutterActorPrivate
|
|||||||
guint propagated_one_redraw : 1;
|
guint propagated_one_redraw : 1;
|
||||||
guint paint_volume_valid : 1;
|
guint paint_volume_valid : 1;
|
||||||
guint last_paint_box_valid : 1;
|
guint last_paint_box_valid : 1;
|
||||||
|
guint in_clone_paint : 1;
|
||||||
|
|
||||||
gfloat clip[4];
|
gfloat clip[4];
|
||||||
|
|
||||||
@ -436,6 +437,7 @@ struct _ClutterActorPrivate
|
|||||||
gfloat z;
|
gfloat z;
|
||||||
|
|
||||||
guint8 opacity;
|
guint8 opacity;
|
||||||
|
gint opacity_override;
|
||||||
|
|
||||||
ClutterActor *parent_actor;
|
ClutterActor *parent_actor;
|
||||||
GList *children;
|
GList *children;
|
||||||
@ -453,8 +455,6 @@ struct _ClutterActorPrivate
|
|||||||
|
|
||||||
PangoContext *pango_context;
|
PangoContext *pango_context;
|
||||||
|
|
||||||
ClutterActor *opacity_parent;
|
|
||||||
|
|
||||||
ClutterTextDirection text_direction;
|
ClutterTextDirection text_direction;
|
||||||
|
|
||||||
gint internal_child;
|
gint internal_child;
|
||||||
@ -2581,9 +2581,9 @@ clutter_actor_paint (ClutterActor *self)
|
|||||||
if (context->pick_mode == CLUTTER_PICK_NONE &&
|
if (context->pick_mode == CLUTTER_PICK_NONE &&
|
||||||
/* ignore top-levels, since they might be transparent */
|
/* ignore top-levels, since they might be transparent */
|
||||||
!CLUTTER_ACTOR_IS_TOPLEVEL (self) &&
|
!CLUTTER_ACTOR_IS_TOPLEVEL (self) &&
|
||||||
/* If the actor is being painted from a clone then check the
|
/* Use the override opacity if its been set */
|
||||||
clone's opacity instead */
|
((priv->opacity_override >= 0) ?
|
||||||
(priv->opacity_parent ? priv->opacity_parent->priv : priv)->opacity == 0)
|
priv->opacity_override : priv->opacity) == 0)
|
||||||
{
|
{
|
||||||
priv->propagated_one_redraw = FALSE;
|
priv->propagated_one_redraw = FALSE;
|
||||||
return;
|
return;
|
||||||
@ -4901,7 +4901,7 @@ clutter_actor_init (ClutterActor *self)
|
|||||||
priv->cached_width_age = 1;
|
priv->cached_width_age = 1;
|
||||||
priv->cached_height_age = 1;
|
priv->cached_height_age = 1;
|
||||||
|
|
||||||
priv->opacity_parent = NULL;
|
priv->opacity_override = -1;
|
||||||
priv->enable_model_view_transform = TRUE;
|
priv->enable_model_view_transform = TRUE;
|
||||||
|
|
||||||
/* Initialize an empty paint box to start with */
|
/* 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))
|
if (CLUTTER_ACTOR_IS_TOPLEVEL (self))
|
||||||
return 255;
|
return 255;
|
||||||
|
|
||||||
if (priv->opacity_parent != NULL)
|
if (priv->opacity_override >= 0)
|
||||||
return clutter_actor_get_paint_opacity_internal (priv->opacity_parent);
|
return priv->opacity_override;
|
||||||
|
|
||||||
parent = priv->parent_actor;
|
parent = priv->parent_actor;
|
||||||
|
|
||||||
@ -10196,15 +10196,16 @@ clutter_actor_create_pango_layout (ClutterActor *self,
|
|||||||
return layout;
|
return layout;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Allows overriding the parent traversed when querying an actors paint
|
/* Allows overriding the calculated paint opacity. Used by ClutterClone and
|
||||||
* opacity. Used by ClutterClone. */
|
* ClutterOffscreenEffect.
|
||||||
|
*/
|
||||||
void
|
void
|
||||||
_clutter_actor_set_opacity_parent (ClutterActor *self,
|
_clutter_actor_set_opacity_override (ClutterActor *self,
|
||||||
ClutterActor *parent)
|
gint opacity)
|
||||||
{
|
{
|
||||||
g_return_if_fail (CLUTTER_IS_ACTOR (self));
|
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
|
/* 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);
|
_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:
|
* clutter_actor_is_in_clone_paint:
|
||||||
* @self: a #ClutterActor
|
* @self: a #ClutterActor
|
||||||
@ -10588,20 +10597,9 @@ clutter_actor_get_transformation_matrix (ClutterActor *self,
|
|||||||
gboolean
|
gboolean
|
||||||
clutter_actor_is_in_clone_paint (ClutterActor *self)
|
clutter_actor_is_in_clone_paint (ClutterActor *self)
|
||||||
{
|
{
|
||||||
ClutterActorPrivate *priv;
|
|
||||||
|
|
||||||
g_return_val_if_fail (CLUTTER_IS_ACTOR (self), FALSE);
|
g_return_val_if_fail (CLUTTER_IS_ACTOR (self), FALSE);
|
||||||
|
|
||||||
/* XXX - keep in sync with the overrides set by ClutterClone:
|
return self->priv->in_clone_paint;
|
||||||
*
|
|
||||||
* - opacity_parent != NULL
|
|
||||||
* - enable_model_view_transform == FALSE
|
|
||||||
*/
|
|
||||||
|
|
||||||
priv = self->priv;
|
|
||||||
|
|
||||||
return priv->opacity_parent != NULL &&
|
|
||||||
!priv->enable_model_view_transform;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -169,13 +169,16 @@ clutter_clone_paint (ClutterActor *self)
|
|||||||
: "unknown");
|
: "unknown");
|
||||||
|
|
||||||
/* The final bits of magic:
|
/* The final bits of magic:
|
||||||
* - We need to make sure that when the clone-source actor's paint
|
* - We need to override the paint opacity of the actor with our own
|
||||||
* method calls clutter_actor_get_paint_opacity, it traverses to
|
* opacity.
|
||||||
* us and our parent not it's real parent.
|
* - 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
|
* - We need to stop clutter_actor_paint applying the model view matrix of
|
||||||
* the clone source actor.
|
* 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);
|
_clutter_actor_set_enable_model_view_transform (priv->clone_source, FALSE);
|
||||||
|
|
||||||
if (!CLUTTER_ACTOR_IS_MAPPED (priv->clone_source))
|
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_paint_unmapped (priv->clone_source, FALSE);
|
||||||
|
|
||||||
_clutter_actor_set_enable_model_view_transform (priv->clone_source, TRUE);
|
_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
|
gboolean
|
||||||
|
Loading…
x
Reference in New Issue
Block a user