[mutter/cherry-pick-5d19aee2] actor: Also recompute paint volume if we recently dropped effects



commit 13c8415c65c3ae1c00df5e3b23bf23cb37769daa
Author: Sam Spilsbury <sam endlessm com>
Date:   Sun Sep 2 22:17:43 2018 +0800

    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.
    
    (cherry picked from commit a8a3c1017fd8604f4f7db272a867ae17b0214cf7)

 clutter/clutter/clutter-actor.c | 15 +++++++++++++--
 1 file changed, 13 insertions(+), 2 deletions(-)
---
diff --git a/clutter/clutter/clutter-actor.c b/clutter/clutter/clutter-actor.c
index 70b2d521f..63952c38a 100644
--- a/clutter/clutter/clutter-actor.c
+++ b/clutter/clutter/clutter-actor.c
@@ -841,6 +841,7 @@ struct _ClutterActorPrivate
   guint needs_x_expand              : 1;
   guint needs_y_expand              : 1;
   guint needs_paint_volume_update   : 1;
+  guint had_effects_on_last_paint_volume_update : 1;
 };
 
 enum
@@ -17557,23 +17558,33 @@ _clutter_actor_has_active_paint_volume_override_effects (ClutterActor *self)
 static ClutterPaintVolume *
 _clutter_actor_get_paint_volume_mutable (ClutterActor *self)
 {
+  gboolean has_paint_volume_override_effects;
   ClutterActorPrivate *priv;
 
   priv = self->priv;
 
+  has_paint_volume_override_effects = _clutter_actor_has_active_paint_volume_override_effects (self);
+
   if (priv->paint_volume_valid)
     {
       /* If effects are applied, the actor paint volume
        * needs to be recomputed on each paint, since those
        * 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 &&
           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;
       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))
     {
       priv->paint_volume_valid = TRUE;


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