summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlberts Muktupāvels <alberts.muktupavels@gmail.com>2019-10-12 00:26:17 +0300
committerAlberts Muktupāvels <alberts.muktupavels@gmail.com>2019-10-12 00:26:17 +0300
commit3d666ac47d9eea4f0934e12fe3262dcd226a315c (patch)
tree531139f2015a70bb106a382e2e536c6155f2b19e
parent4a80ec0127e2770941d5abac8c8972cf8e058cea (diff)
downloadmetacity-3d666ac47d9eea4f0934e12fe3262dcd226a315c.tar.gz
surface-xrender: make create_mask_pixmap static
-rw-r--r--src/compositor/meta-surface-xrender.c226
-rw-r--r--src/compositor/meta-surface-xrender.h9
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