On Mon, 3 Sep 2012 14:15:44 +0300 Pekka Paalanen <[email protected]> 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 <[email protected]> > --- > 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 _______________________________________________ wayland-devel mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/wayland-devel
