actor: Also recompute paint volume if we recently dropped effects

Otherwise we'll be stuck with the same paint volume on the last
frame of the given effect, which could be wrong.
This commit is contained in:
Sam Spilsbury 2018-09-02 22:17:43 +08:00 committed by Georges Basile Stavracas Neto
parent 5d19aee23a
commit a8a3c1017f

View File

@ -841,6 +841,7 @@ struct _ClutterActorPrivate
guint needs_x_expand : 1; guint needs_x_expand : 1;
guint needs_y_expand : 1; guint needs_y_expand : 1;
guint needs_paint_volume_update : 1; guint needs_paint_volume_update : 1;
guint had_effects_on_last_paint_volume_update : 1;
}; };
enum enum
@ -17557,23 +17558,33 @@ _clutter_actor_has_active_paint_volume_override_effects (ClutterActor *self)
static ClutterPaintVolume * static ClutterPaintVolume *
_clutter_actor_get_paint_volume_mutable (ClutterActor *self) _clutter_actor_get_paint_volume_mutable (ClutterActor *self)
{ {
gboolean has_paint_volume_override_effects;
ClutterActorPrivate *priv; ClutterActorPrivate *priv;
priv = self->priv; priv = self->priv;
has_paint_volume_override_effects = _clutter_actor_has_active_paint_volume_override_effects (self);
if (priv->paint_volume_valid) if (priv->paint_volume_valid)
{ {
/* If effects are applied, the actor paint volume /* If effects are applied, the actor paint volume
* needs to be recomputed on each paint, since those * needs to be recomputed on each paint, since those
* paint volumes could change over the duration of the * paint volumes could change over the duration of the
* effect. */ * effect.
*
* We also need to update the paint volume if we went
* from having effects to not having effects on the last
* paint volume update. */
if (!priv->needs_paint_volume_update && if (!priv->needs_paint_volume_update &&
priv->current_effect == NULL && priv->current_effect == NULL &&
!_clutter_actor_has_active_paint_volume_override_effects (self)) !has_paint_volume_override_effects &&
!priv->had_effects_on_last_paint_volume_update)
return &priv->paint_volume; return &priv->paint_volume;
clutter_paint_volume_free (&priv->paint_volume); clutter_paint_volume_free (&priv->paint_volume);
} }
priv->had_effects_on_last_paint_volume_update = has_paint_volume_override_effects;
if (_clutter_actor_get_paint_volume_real (self, &priv->paint_volume)) if (_clutter_actor_get_paint_volume_real (self, &priv->paint_volume))
{ {
priv->paint_volume_valid = TRUE; priv->paint_volume_valid = TRUE;