[mutter] surface-actor: Add culling offset for geometry scale



commit 41130b08eb104b8071833e0ee745b57cf6143795
Author: Robert Mader <robert mader posteo de>
Date:   Fri Mar 6 13:42:04 2020 +0100

    surface-actor: Add culling offset for geometry scale
    
    This fixes a case that was overlooked in
    https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1036 - when we
    have a geometry scale > 1 and Wayland subsurfaces that have an offset
    to their parent surface (which is often the case when the toplevel surface
    includes decoration/shadows etc.), we have to add extra offset to their
    opaque regions so they match their 'visible' location.
    
    This is necessary as `meta_cullable_cull_out_children` moves the coordinate
    system during culling, but does not know about geometry scale.
    
    Also, remove the redundant check for `window_actor` - we only hit this code
    path if a `window_actor` culls out its children.
    
    https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1108

 src/compositor/meta-surface-actor.c | 13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)
---
diff --git a/src/compositor/meta-surface-actor.c b/src/compositor/meta-surface-actor.c
index 41aa5a26d..c328fab73 100644
--- a/src/compositor/meta-surface-actor.c
+++ b/src/compositor/meta-surface-actor.c
@@ -282,7 +282,8 @@ meta_surface_actor_cull_out (MetaCullable   *cullable,
       MetaWindowActor *window_actor;
       cairo_region_t *scaled_opaque_region;
       cairo_region_t *opaque_region;
-      int geometry_scale = 1;
+      int geometry_scale;
+      float x, y;
 
       opaque_region = meta_shaped_texture_get_opaque_region (priv->texture);
       if (opaque_region)
@@ -305,12 +306,14 @@ meta_surface_actor_cull_out (MetaCullable   *cullable,
           return;
         }
 
-      window_actor =
-        meta_window_actor_from_actor (CLUTTER_ACTOR (surface_actor));
-      if (window_actor)
-        geometry_scale = meta_window_actor_get_geometry_scale (window_actor);
+      window_actor = meta_window_actor_from_actor (CLUTTER_ACTOR (surface_actor));
+      geometry_scale = meta_window_actor_get_geometry_scale (window_actor);
+      clutter_actor_get_position (CLUTTER_ACTOR (surface_actor), &x, &y);
 
+      cairo_region_translate (opaque_region, x, y);
       scaled_opaque_region = meta_region_scale (opaque_region, geometry_scale);
+      cairo_region_translate (scaled_opaque_region, -x, -y);
+      cairo_region_translate (opaque_region, -x, -y);
 
       if (unobscured_region)
         cairo_region_subtract (unobscured_region, scaled_opaque_region);


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