On Mon, Sep 03, 2012 at 04:48:41PM +0300, Pekka Paalanen wrote:
> Remove weston_surface::opaque_rect completely.
> 
> Instead, set the opaque region in xwayland.
> 
> Before this patch, black text in xterm was transparent. Now it is not.
> 
> However, this patch fixes only a part of the alpha problem. If you apply
> full-surface alpha with super+alt+wheel, the problem reappears. This
> problem is still due to bad alpha channel contents on xwayland windows.

Very nice, that's a better solution.  Series applied.

Kristian

> Signed-off-by: Pekka Paalanen <ppaala...@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..65eb11a 100644
> --- a/src/xwayland/window-manager.c
> +++ b/src/xwayland/window-manager.c
> @@ -717,17 +717,19 @@ 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,
> +                                       width, 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,
> @@ -740,13 +742,15 @@ static void
>  weston_wm_window_schedule_repaint(struct weston_wm_window *window)
>  {
>       struct weston_wm *wm = window->wm;
> +     int width, height;
>  
>       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;
> +                     weston_wm_window_get_frame_size(window, &width, 
> &height);
> +                     pixman_region32_fini(&window->surface->opaque);
> +                     pixman_region32_init_rect(&window->surface->opaque, 0, 
> 0,
> +                                               width, height);
> +                     window->surface->geometry.dirty = 1;
>               }
>               return;
>       }
> -- 
> 1.7.8.6
> 
_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to