[metacity] surface-xrender: clip image to shape region



commit 5c7ac3d231326edc29d7e3263748a0ac7080f7f3
Author: Alberts Muktupāvels <alberts muktupavels gmail com>
Date:   Fri Oct 18 01:57:15 2019 +0300

    surface-xrender: clip image to shape region

 src/compositor/meta-surface-xrender.c | 30 ++++++++++++++++++++++++++++++
 1 file changed, 30 insertions(+)
---
diff --git a/src/compositor/meta-surface-xrender.c b/src/compositor/meta-surface-xrender.c
index 6ad837e6..35c9239a 100644
--- a/src/compositor/meta-surface-xrender.c
+++ b/src/compositor/meta-surface-xrender.c
@@ -44,6 +44,34 @@ struct _MetaSurfaceXRender
 
 G_DEFINE_TYPE (MetaSurfaceXRender, meta_surface_xrender, META_TYPE_SURFACE)
 
+static void
+clip_to_shape_region (MetaSurfaceXRender *self,
+                      cairo_t            *cr)
+{
+  XserverRegion shape_region;
+  int n_rects;
+  XRectangle *rects;
+  int i;
+
+  shape_region = meta_surface_get_shape_region (META_SURFACE (self));
+  rects = XFixesFetchRegion (self->xdisplay, shape_region, &n_rects);
+
+  if (rects == NULL)
+    return;
+
+  for (i = 0; i < n_rects; i++)
+    {
+      XRectangle *rect;
+
+      rect = &rects[i];
+
+      cairo_rectangle (cr, rect->x, rect->y, rect->width, rect->height);
+    }
+
+  cairo_clip (cr);
+  XFree (rects);
+}
+
 static Pixmap
 create_mask_pixmap (MetaSurfaceXRender *self,
                     gboolean            with_opacity)
@@ -343,6 +371,8 @@ meta_surface_xrender_get_image (MetaSurface *surface)
   cairo_set_source_surface (cr, back_surface, 0, 0);
   cairo_surface_destroy (back_surface);
 
+  clip_to_shape_region (self, cr);
+
   if (mask_pixmap != None)
     {
       Screen *xscreen;


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