[PATCH weston] xwayland: replace opaque_rect

Pekka Paalanen ppaalanen at gmail.com
Mon Sep 3 04:15:44 PDT 2012


Remove weston_surface::opaque_rect completely.

Instead, set the opaque region in xwayland.

This seems to fix all the alpha problems I could see with xterm, where
the text was semi-transparent.

Signed-off-by: Pekka Paalanen <ppaalanen at gmail.com>
---
 src/compositor.c              |    4 ----
 src/compositor.h              |    1 -
 src/xwayland/window-manager.c |   28 ++++++++++++++++------------
 3 files changed, 16 insertions(+), 17 deletions(-)

diff --git a/src/compositor.c b/src/compositor.c
index 9ce44d4..5e9a0c2 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -243,10 +243,6 @@ weston_surface_create(struct weston_compositor *compositor)
 
 	surface->compositor = compositor;
 	surface->alpha = 1.0;
-	surface->opaque_rect[0] = 0.0;
-	surface->opaque_rect[1] = 0.0;
-	surface->opaque_rect[2] = 0.0;
-	surface->opaque_rect[3] = 0.0;
 	surface->pitch = 1;
 
 	surface->num_textures = 0;
diff --git a/src/compositor.h b/src/compositor.h
index 96a0477..38c2657 100644
--- a/src/compositor.h
+++ b/src/compositor.h
@@ -399,7 +399,6 @@ struct weston_surface {
 	struct wl_list layer_link;
 	struct weston_shader *shader;
 	GLfloat color[4];
-	GLfloat opaque_rect[4];
 	GLfloat alpha;
 	struct weston_plane *plane;
 
diff --git a/src/xwayland/window-manager.c b/src/xwayland/window-manager.c
index e705fec..9c0410f 100644
--- a/src/xwayland/window-manager.c
+++ b/src/xwayland/window-manager.c
@@ -717,17 +717,20 @@ weston_wm_window_draw_decoration(void *data)
 	cairo_destroy(cr);
 
 	if (window->surface) {
+		pixman_region32_fini(&window->surface->opaque);
+		pixman_region32_init_rect(&window->surface->opaque, 0, 0,
+					  window->surface->geometry.width,
+					  window->surface->geometry.height);
+
 		/* We leave an extra pixel around the X window area to
 		 * make sure we don't sample from the undefined alpha
 		 * channel when filtering. */
-		window->surface->opaque_rect[0] =
-			(double) (x - 1) / width;
-		window->surface->opaque_rect[1] =
-			(double) (x + window->width + 1) / width;
-		window->surface->opaque_rect[2] =
-			(double) (y - 1) / height;
-		window->surface->opaque_rect[3] =
-			(double) (y + window->height + 1) / height;
+		pixman_region32_intersect_rect(&window->surface->opaque,
+					       &window->surface->opaque,
+					       x - 1, y - 1,
+					       window->width + 2,
+					       window->height + 2);
+		window->surface->geometry.dirty = 1;
 
 		pixman_region32_init_rect(&window->surface->input,
 					  t->margin, t->margin,
@@ -743,10 +746,11 @@ weston_wm_window_schedule_repaint(struct weston_wm_window *window)
 
 	if (window->frame_id == XCB_WINDOW_NONE) {
 		if (window->surface != NULL) {
-			window->surface->opaque_rect[0] = 0.0;
-			window->surface->opaque_rect[1] = 1.0;
-			window->surface->opaque_rect[2] = 0.0;
-			window->surface->opaque_rect[3] = 1.0;
+			pixman_region32_fini(&window->surface->opaque);
+			pixman_region32_init_rect(&window->surface->opaque, 0, 0,
+						  window->surface->geometry.width,
+						  window->surface->geometry.height);
+			window->surface->geometry.dirty = 1;
 		}
 		return;
 	}
-- 
1.7.8.6



More information about the wayland-devel mailing list