[metacity] compositor-xrender: move get_window_mask_pixmap to MetaSurfaceXRender
- From: Alberts Muktupāvels <muktupavels src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [metacity] compositor-xrender: move get_window_mask_pixmap to MetaSurfaceXRender
- Date: Fri, 11 Oct 2019 22:03:51 +0000 (UTC)
commit 6ba14d4e903acb83f7e504d18d593b0b177b296c
Author: Alberts Muktupāvels <alberts muktupavels gmail com>
Date: Fri Oct 11 21:29:30 2019 +0300
compositor-xrender: move get_window_mask_pixmap to MetaSurfaceXRender
src/compositor/meta-compositor-xrender.c | 122 +++----------------------------
src/compositor/meta-surface-xrender.c | 118 ++++++++++++++++++++++++++++++
src/compositor/meta-surface-xrender.h | 5 +-
3 files changed, 131 insertions(+), 114 deletions(-)
---
diff --git a/src/compositor/meta-compositor-xrender.c b/src/compositor/meta-compositor-xrender.c
index a55bb384..ebd40aa5 100644
--- a/src/compositor/meta-compositor-xrender.c
+++ b/src/compositor/meta-compositor-xrender.c
@@ -1157,128 +1157,24 @@ get_visible_region (MetaDisplay *display,
return region;
}
-static Pixmap
-get_window_mask_pixmap (MetaCompWindow *cw,
- gboolean with_opacity)
-{
- MetaFrame *frame;
- MetaDisplay *display;
- Display *xdisplay;
- int width;
- int height;
- XRenderPictFormat *format;
- double opacity;
- cairo_surface_t *surface;
- cairo_t *cr;
- Pixmap pixmap;
-
- frame = meta_window_get_frame (cw->window);
- if (frame == NULL && cw->window->opacity == (guint) OPAQUE)
- return None;
-
- display = meta_window_get_display (cw->window);
- xdisplay = meta_display_get_xdisplay (display);
-
- width = frame != NULL ? cw->rect.width : 1;
- height = frame != NULL ? cw->rect.height : 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) cw->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 Picture
-get_window_mask (MetaDisplay *display,
- MetaCompWindow *cw)
+get_window_mask (MetaSurface *surface)
{
+ MetaCompWindow *cw;
+ MetaDisplay *display;
Display *xdisplay;
XRenderPictFormat *format;
Picture picture;
+ cw = g_object_get_data (G_OBJECT (surface), "cw");
+
if (cw->mask_pixmap == None)
- cw->mask_pixmap = get_window_mask_pixmap (cw, TRUE);
+ cw->mask_pixmap = meta_surface_xrender_create_mask_pixmap (META_SURFACE_XRENDER (surface), TRUE);
if (cw->mask_pixmap == None)
return None;
+ display = meta_window_get_display (cw->window);
xdisplay = meta_display_get_xdisplay (display);
format = XRenderFindStandardFormat (xdisplay, PictStandardA8);
@@ -1387,7 +1283,7 @@ paint_windows (MetaCompositorXRender *xrender,
picture = meta_surface_xrender_get_picture (META_SURFACE_XRENDER (surface));
if (cw->mask == None)
- cw->mask = get_window_mask (display, cw);
+ cw->mask = get_window_mask (surface);
if (cw->window_region == None)
cw->window_region = get_window_region (display, cw);
@@ -1884,7 +1780,7 @@ get_window_surface (MetaSurface *surface)
mask_pixmap = None;
if (cw->window->opacity != (guint) OPAQUE)
- mask_pixmap = get_window_mask_pixmap (cw, FALSE);
+ mask_pixmap = meta_surface_xrender_create_mask_pixmap (META_SURFACE_XRENDER (surface), FALSE);
back_surface = cairo_xlib_surface_create (xdisplay, back_pixmap,
get_toplevel_xvisual (cw->window),
diff --git a/src/compositor/meta-surface-xrender.c b/src/compositor/meta-surface-xrender.c
index d770371e..eadcff15 100644
--- a/src/compositor/meta-surface-xrender.c
+++ b/src/compositor/meta-surface-xrender.c
@@ -18,8 +18,15 @@
#include "config.h"
#include "meta-surface-xrender.h"
+#include <cairo/cairo-xlib-xrender.h>
+#include <libmetacity/meta-frame-borders.h>
+
#include "display.h"
#include "errors.h"
+#include "frame.h"
+#include "window-private.h"
+
+#define OPAQUE 0xffffffff
struct _MetaSurfaceXRender
{
@@ -166,6 +173,117 @@ 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 022a8d89..ba7c0e04 100644
--- a/src/compositor/meta-surface-xrender.h
+++ b/src/compositor/meta-surface-xrender.h
@@ -27,7 +27,10 @@ G_BEGIN_DECLS
G_DECLARE_FINAL_TYPE (MetaSurfaceXRender, meta_surface_xrender,
META, SURFACE_XRENDER, MetaSurface)
-Picture meta_surface_xrender_get_picture (MetaSurfaceXRender *self);
+Pixmap meta_surface_xrender_create_mask_pixmap (MetaSurfaceXRender *self,
+ gboolean with_opacity);
+
+Picture meta_surface_xrender_get_picture (MetaSurfaceXRender *self);
G_END_DECLS
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]