diff options
author | Alberts Muktupāvels <alberts.muktupavels@gmail.com> | 2019-10-12 00:26:17 +0300 |
---|---|---|
committer | Alberts Muktupāvels <alberts.muktupavels@gmail.com> | 2019-10-12 00:26:17 +0300 |
commit | 3d666ac47d9eea4f0934e12fe3262dcd226a315c (patch) | |
tree | 531139f2015a70bb106a382e2e536c6155f2b19e | |
parent | 4a80ec0127e2770941d5abac8c8972cf8e058cea (diff) | |
download | metacity-3d666ac47d9eea4f0934e12fe3262dcd226a315c.tar.gz |
surface-xrender: make create_mask_pixmap static
-rw-r--r-- | src/compositor/meta-surface-xrender.c | 226 | ||||
-rw-r--r-- | src/compositor/meta-surface-xrender.h | 9 |
2 files changed, 116 insertions, 119 deletions
diff --git a/src/compositor/meta-surface-xrender.c b/src/compositor/meta-surface-xrender.c index edbd6218..0532e312 100644 --- a/src/compositor/meta-surface-xrender.c +++ b/src/compositor/meta-surface-xrender.c @@ -41,6 +41,117 @@ struct _MetaSurfaceXRender G_DEFINE_TYPE (MetaSurfaceXRender, meta_surface_xrender, META_TYPE_SURFACE) +static Pixmap +create_mask_pixmap (MetaSurfaceXRender *self, + gboolean with_opacity) +{ + MetaWindow *window; + MetaFrame *frame; + MetaDisplay *display; + Display *xdisplay; + int width; + int height; + XRenderPictFormat *format; + double opacity; + cairo_surface_t *surface; + cairo_t *cr; + Pixmap pixmap; + + window = meta_surface_get_window (META_SURFACE (self)); + + frame = meta_window_get_frame (window); + if (frame == NULL && window->opacity == OPAQUE) + return None; + + display = meta_window_get_display (window); + xdisplay = meta_display_get_xdisplay (display); + + width = frame != NULL ? meta_surface_get_width (META_SURFACE (self)) : 1; + height = frame != NULL ? meta_surface_get_height (META_SURFACE (self)) : 1; + + format = XRenderFindStandardFormat (xdisplay, PictStandardA8); + + meta_error_trap_push (display); + pixmap = XCreatePixmap (xdisplay, + DefaultRootWindow (xdisplay), + width, + height, + format->depth); + + if (meta_error_trap_pop_with_return (display) != 0) + return None; + + opacity = 1.0; + if (with_opacity) + opacity = (double) window->opacity / OPAQUE; + + surface = cairo_xlib_surface_create_with_xrender_format (xdisplay, + pixmap, + DefaultScreenOfDisplay (xdisplay), + format, + width, + height); + + cr = cairo_create (surface); + + cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR); + cairo_set_source_rgba (cr, 0, 0, 0, 1); + cairo_paint (cr); + + if (frame != NULL) + { + cairo_rectangle_int_t rect; + cairo_region_t *frame_paint_region; + MetaFrameBorders borders; + + rect.x = 0; + rect.y = 0; + rect.width = width; + rect.height = height; + + frame_paint_region = cairo_region_create_rectangle (&rect); + meta_frame_calc_borders (frame, &borders); + + rect.x += borders.total.left; + rect.y += borders.total.top; + rect.width -= borders.total.left + borders.total.right; + rect.height -= borders.total.top + borders.total.bottom; + + cairo_region_subtract_rectangle (frame_paint_region, &rect); + + cairo_rectangle (cr, rect.x, rect.y, rect.width, rect.height); + cairo_clip (cr); + + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_set_source_rgba (cr, 0, 0, 0, opacity); + cairo_paint (cr); + + cairo_reset_clip (cr); + gdk_cairo_region (cr, frame_paint_region); + cairo_region_destroy (frame_paint_region); + cairo_clip (cr); + + cairo_push_group (cr); + + cairo_set_operator (cr, CAIRO_OPERATOR_OVER); + meta_frame_get_mask (frame, cr); + + cairo_pop_group_to_source (cr); + cairo_paint_with_alpha (cr, opacity); + } + else + { + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_set_source_rgba (cr, 0, 0, 0, opacity); + cairo_paint (cr); + } + + cairo_destroy (cr); + cairo_surface_destroy (surface); + + return pixmap; +} + static void free_picture (MetaSurfaceXRender *self) { @@ -216,7 +327,7 @@ meta_surface_xrender_get_image (MetaSurface *surface) if (window->opacity != OPAQUE) { - mask_pixmap = meta_surface_xrender_create_mask_pixmap (self, FALSE); + mask_pixmap = create_mask_pixmap (self, FALSE); free_pixmap = TRUE; } @@ -355,7 +466,7 @@ meta_surface_xrender_pre_paint (MetaSurface *surface) self->picture = get_window_picture (self); if (self->mask_pixmap == None) - self->mask_pixmap = meta_surface_xrender_create_mask_pixmap (self, TRUE); + self->mask_pixmap = create_mask_pixmap (self, TRUE); if (self->mask_picture == None) self->mask_picture = get_window_mask_picture (self); @@ -385,117 +496,6 @@ meta_surface_xrender_init (MetaSurfaceXRender *self) { } -Pixmap -meta_surface_xrender_create_mask_pixmap (MetaSurfaceXRender *self, - gboolean with_opacity) -{ - MetaWindow *window; - MetaFrame *frame; - MetaDisplay *display; - Display *xdisplay; - int width; - int height; - XRenderPictFormat *format; - double opacity; - cairo_surface_t *surface; - cairo_t *cr; - Pixmap pixmap; - - window = meta_surface_get_window (META_SURFACE (self)); - - frame = meta_window_get_frame (window); - if (frame == NULL && window->opacity == OPAQUE) - return None; - - display = meta_window_get_display (window); - xdisplay = meta_display_get_xdisplay (display); - - width = frame != NULL ? meta_surface_get_width (META_SURFACE (self)) : 1; - height = frame != NULL ? meta_surface_get_height (META_SURFACE (self)) : 1; - - format = XRenderFindStandardFormat (xdisplay, PictStandardA8); - - meta_error_trap_push (display); - pixmap = XCreatePixmap (xdisplay, - DefaultRootWindow (xdisplay), - width, - height, - format->depth); - - if (meta_error_trap_pop_with_return (display) != 0) - return None; - - opacity = 1.0; - if (with_opacity) - opacity = (double) window->opacity / OPAQUE; - - surface = cairo_xlib_surface_create_with_xrender_format (xdisplay, - pixmap, - DefaultScreenOfDisplay (xdisplay), - format, - width, - height); - - cr = cairo_create (surface); - - cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR); - cairo_set_source_rgba (cr, 0, 0, 0, 1); - cairo_paint (cr); - - if (frame != NULL) - { - cairo_rectangle_int_t rect; - cairo_region_t *frame_paint_region; - MetaFrameBorders borders; - - rect.x = 0; - rect.y = 0; - rect.width = width; - rect.height = height; - - frame_paint_region = cairo_region_create_rectangle (&rect); - meta_frame_calc_borders (frame, &borders); - - rect.x += borders.total.left; - rect.y += borders.total.top; - rect.width -= borders.total.left + borders.total.right; - rect.height -= borders.total.top + borders.total.bottom; - - cairo_region_subtract_rectangle (frame_paint_region, &rect); - - cairo_rectangle (cr, rect.x, rect.y, rect.width, rect.height); - cairo_clip (cr); - - cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); - cairo_set_source_rgba (cr, 0, 0, 0, opacity); - cairo_paint (cr); - - cairo_reset_clip (cr); - gdk_cairo_region (cr, frame_paint_region); - cairo_region_destroy (frame_paint_region); - cairo_clip (cr); - - cairo_push_group (cr); - - cairo_set_operator (cr, CAIRO_OPERATOR_OVER); - meta_frame_get_mask (frame, cr); - - cairo_pop_group_to_source (cr); - cairo_paint_with_alpha (cr, opacity); - } - else - { - cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); - cairo_set_source_rgba (cr, 0, 0, 0, opacity); - cairo_paint (cr); - } - - cairo_destroy (cr); - cairo_surface_destroy (surface); - - return pixmap; -} - Picture meta_surface_xrender_get_picture (MetaSurfaceXRender *self) { diff --git a/src/compositor/meta-surface-xrender.h b/src/compositor/meta-surface-xrender.h index ea0b1987..a402749e 100644 --- a/src/compositor/meta-surface-xrender.h +++ b/src/compositor/meta-surface-xrender.h @@ -27,14 +27,11 @@ G_BEGIN_DECLS G_DECLARE_FINAL_TYPE (MetaSurfaceXRender, meta_surface_xrender, META, SURFACE_XRENDER, MetaSurface) -Pixmap meta_surface_xrender_create_mask_pixmap (MetaSurfaceXRender *self, - gboolean with_opacity); +Picture meta_surface_xrender_get_picture (MetaSurfaceXRender *self); -Picture meta_surface_xrender_get_picture (MetaSurfaceXRender *self); +Pixmap meta_surface_xrender_get_mask_pixmap (MetaSurfaceXRender *self); -Pixmap meta_surface_xrender_get_mask_pixmap (MetaSurfaceXRender *self); - -Picture meta_surface_xrender_get_mask_picture (MetaSurfaceXRender *self); +Picture meta_surface_xrender_get_mask_picture (MetaSurfaceXRender *self); G_END_DECLS |