[PATCH weston] xwayland: replace opaque_rect
Pekka Paalanen
ppaalanen at gmail.com
Mon Sep 3 04:35:07 PDT 2012
On Mon, 3 Sep 2012 14:15:44 +0300
Pekka Paalanen <ppaalanen at gmail.com> wrote:
> 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;
> }
Eh, I forgot to use the right(?) width, height variables. Anyway, this
is the idea. Now I just need to fix the shader usage in compositor.c.
I'll send a remake of this patch, and the shader change, later.
Thanks,
pq
More information about the wayland-devel
mailing list