summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlberts Muktupāvels <alberts.muktupavels@gmail.com>2019-10-22 23:17:25 +0300
committerAlberts Muktupāvels <alberts.muktupavels@gmail.com>2019-10-22 23:17:25 +0300
commit66afc4b1920cbcadf31eb1412fbaf42add710446 (patch)
tree8e6eb7226e79c7f8446b03f5ee002de7aff17d21
parent4977d10134e66e5d72689c89ad970f9d578d22ce (diff)
downloadmetacity-66afc4b1920cbcadf31eb1412fbaf42add710446.tar.gz
compositor-xrender: move shadow painting to separate function
-rw-r--r--src/compositor/meta-compositor-xrender.c119
1 files changed, 63 insertions, 56 deletions
diff --git a/src/compositor/meta-compositor-xrender.c b/src/compositor/meta-compositor-xrender.c
index 542f7e11..354b608b 100644
--- a/src/compositor/meta-compositor-xrender.c
+++ b/src/compositor/meta-compositor-xrender.c
@@ -823,44 +823,71 @@ get_shadow_region (MetaCompositorXRender *xrender,
}
static void
+paint_shadow (MetaCompositorXRender *xrender,
+ MetaSurfaceXRender *surface_xrender,
+ XserverRegion paint_region,
+ Picture paint_buffer)
+{
+ MetaCompWindow *cw;
+ XserverRegion shadow_clip;
+ XserverRegion border_clip;
+ int x;
+ int y;
+
+ cw = g_object_get_data (G_OBJECT (surface_xrender), "cw");
+
+ if (cw->shadow == None)
+ return;
+
+ shadow_clip = XFixesCreateRegion (xrender->xdisplay, NULL, 0);
+ XFixesCopyRegion (xrender->xdisplay, shadow_clip, cw->shadow_region);
+
+ border_clip = meta_surface_xrender_get_border_clip (surface_xrender);
+ XFixesIntersectRegion (xrender->xdisplay, shadow_clip, shadow_clip, border_clip);
+
+ if (paint_region != None)
+ {
+ XFixesIntersectRegion (xrender->xdisplay,
+ shadow_clip,
+ shadow_clip,
+ paint_region);
+ }
+
+ XFixesSetPictureClipRegion (xrender->xdisplay, paint_buffer, 0, 0, shadow_clip);
+ XFixesDestroyRegion (xrender->xdisplay, shadow_clip);
+
+ x = cw->rect.x;
+ y = cw->rect.y;
+
+ XRenderComposite (xrender->xdisplay, PictOpOver,
+ xrender->black_picture, cw->shadow, paint_buffer,
+ 0, 0, 0, 0,
+ x + cw->shadow_dx, y + cw->shadow_dy,
+ cw->shadow_width, cw->shadow_height);
+}
+
+static void
paint_dock_shadows (MetaCompositorXRender *xrender,
GList *surfaces,
Picture root_buffer,
XserverRegion region)
{
- Display *xdisplay = xrender->xdisplay;
GList *l;
for (l = surfaces; l != NULL; l = l->next)
{
- MetaSurfaceXRender *surface;
- MetaCompWindow *cw;
- XserverRegion shadow_clip;
-
- surface = META_SURFACE_XRENDER (l->data);
- cw = g_object_get_data (G_OBJECT (surface), "cw");
-
- if (cw->window->type == META_WINDOW_DOCK &&
- cw->shadow != None)
- {
- XserverRegion border_clip;
+ MetaSurface *surface;
+ MetaWindow *window;
- shadow_clip = XFixesCreateRegion (xdisplay, NULL, 0);
- border_clip = meta_surface_xrender_get_border_clip (surface);
+ surface = META_SURFACE (l->data);
- XFixesIntersectRegion (xdisplay, shadow_clip,
- border_clip, region);
+ if (!meta_surface_is_visible (surface))
+ continue;
- XFixesSetPictureClipRegion (xdisplay, root_buffer, 0, 0, shadow_clip);
+ window = meta_surface_get_window (surface);
- XRenderComposite (xdisplay, PictOpOver, xrender->black_picture,
- cw->shadow, root_buffer,
- 0, 0, 0, 0,
- cw->rect.x + cw->shadow_dx,
- cw->rect.y + cw->shadow_dy,
- cw->shadow_width, cw->shadow_height);
- XFixesDestroyRegion (xdisplay, shadow_clip);
- }
+ if (window->type == META_WINDOW_DOCK)
+ paint_shadow (xrender, META_SURFACE_XRENDER (surface), region, root_buffer);
}
}
@@ -937,42 +964,22 @@ paint_windows (MetaCompositorXRender *xrender,
*/
for (index = last; index; index = index->prev)
{
- MetaSurfaceXRender *surface;
-
- surface = META_SURFACE_XRENDER (index->data);
-
- if (meta_surface_xrender_get_picture (surface) != None)
- {
- MetaCompWindow *cw;
- int x, y;
-
- cw = g_object_get_data (G_OBJECT (surface), "cw");
-
- x = cw->rect.x;
- y = cw->rect.y;
-
- if (cw->shadow && cw->window->type != META_WINDOW_DOCK)
- {
- XserverRegion shadow_clip;
- XserverRegion border_clip;
+ MetaSurface *surface;
+ MetaSurfaceXRender *surface_xrender;
+ MetaWindow *window;
- shadow_clip = XFixesCreateRegion (xdisplay, NULL, 0);
- XFixesCopyRegion (xdisplay, shadow_clip, cw->shadow_region);
+ surface = META_SURFACE (index->data);
+ surface_xrender = META_SURFACE_XRENDER (surface);
- border_clip = meta_surface_xrender_get_border_clip (surface);
- XFixesIntersectRegion (xdisplay, shadow_clip, shadow_clip, border_clip);
+ if (!meta_surface_is_visible (surface))
+ continue;
- XFixesSetPictureClipRegion (xdisplay, root_buffer, 0, 0, shadow_clip);
- XFixesDestroyRegion (xdisplay, shadow_clip);
+ window = meta_surface_get_window (surface);
- XRenderComposite (xdisplay, PictOpOver, xrender->black_picture,
- cw->shadow, root_buffer, 0, 0, 0, 0,
- x + cw->shadow_dx, y + cw->shadow_dy,
- cw->shadow_width, cw->shadow_height);
- }
+ if (window->type != META_WINDOW_DOCK)
+ paint_shadow (xrender, surface_xrender, None, root_buffer);
- meta_surface_xrender_paint (surface, paint_region, root_buffer, FALSE);
- }
+ meta_surface_xrender_paint (surface_xrender, None, root_buffer, FALSE);
}
XFixesDestroyRegion (xdisplay, paint_region);