diff options
author | Alberts Muktupāvels <alberts.muktupavels@gmail.com> | 2019-10-22 23:17:25 +0300 |
---|---|---|
committer | Alberts Muktupāvels <alberts.muktupavels@gmail.com> | 2019-10-22 23:17:25 +0300 |
commit | 66afc4b1920cbcadf31eb1412fbaf42add710446 (patch) | |
tree | 8e6eb7226e79c7f8446b03f5ee002de7aff17d21 | |
parent | 4977d10134e66e5d72689c89ad970f9d578d22ce (diff) | |
download | metacity-66afc4b1920cbcadf31eb1412fbaf42add710446.tar.gz |
compositor-xrender: move shadow painting to separate function
-rw-r--r-- | src/compositor/meta-compositor-xrender.c | 119 |
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); |