From: Pekka Paalanen <[email protected]>

We can use and render the opaque region only, if we are not applying a
full-surface alpha.

Test case: weston-terminal; use super+alt+mousewheel to adjust the
window transparency. Before it went black, now it blends correctly.

Signed-off-by: Pekka Paalanen <[email protected]>
---
 src/compositor.c |   31 +++++++++++--------------------
 1 file changed, 11 insertions(+), 20 deletions(-)

diff --git a/src/compositor.c b/src/compositor.c
index 030ec8f..e9fa56e 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -1280,18 +1280,17 @@ repaint_region(struct weston_surface *es, 
pixman_region32_t *region,
 
 WL_EXPORT void
 weston_surface_draw(struct weston_surface *es, struct weston_output *output,
-                   pixman_region32_t *damage)
+                   pixman_region32_t *damage) /* in global coordinates */
 {
        struct weston_compositor *ec = es->compositor;
        /* repaint bounding region in global coordinates: */
        pixman_region32_t repaint;
-       /* regions of surface to draw opaque/blended in surface coordinates: */
-       pixman_region32_t surface_opaque, surface_blend;
+       /* non-opaque region in surface coordinates: */
+       pixman_region32_t surface_blend;
        GLint filter;
        int i;
 
        pixman_region32_init(&repaint);
-       pixman_region32_init(&surface_opaque);
        pixman_region32_init(&surface_blend);
 
        pixman_region32_intersect(&repaint,
@@ -1305,20 +1304,13 @@ weston_surface_draw(struct weston_surface *es, struct 
weston_output *output,
                                 &ec->primary_plane.damage, &repaint);
 
        glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
-       if (1 || es->alpha < 1.0) {
-               /* blended region is whole surface minus opaque region: */
-               pixman_region32_init_rect(&surface_blend, 0, 0,
-                               es->geometry.width, es->geometry.height);
-               pixman_region32_init(&surface_opaque);
-               pixman_region32_copy(&surface_opaque, &es->opaque);
+
+       /* blended region is whole surface minus opaque region: */
+       pixman_region32_init_rect(&surface_blend, 0, 0,
+                                 es->geometry.width, es->geometry.height);
+       if (es->alpha >= 1.0)
                pixman_region32_subtract(&surface_blend, &surface_blend,
-                               &surface_opaque);
-       } else {
-               /* whole surface is opaque: */
-               pixman_region32_init_rect(&surface_opaque, 0, 0,
-                               es->geometry.width, es->geometry.height);
-               pixman_region32_init(&surface_blend);
-       }
+                                        &es->opaque);
 
        if (ec->current_shader != es->shader) {
                glUseProgram(es->shader->program);
@@ -1343,9 +1335,9 @@ weston_surface_draw(struct weston_surface *es, struct 
weston_output *output,
                glTexParameteri(es->target, GL_TEXTURE_MAG_FILTER, filter);
        }
 
-       if (pixman_region32_not_empty(&surface_opaque)) {
+       if (pixman_region32_not_empty(&es->opaque) && es->alpha >= 1.0) {
                glDisable(GL_BLEND);
-               repaint_region(es, &repaint, &surface_opaque);
+               repaint_region(es, &repaint, &es->opaque);
        }
 
        if (pixman_region32_not_empty(&surface_blend)) {
@@ -1355,7 +1347,6 @@ weston_surface_draw(struct weston_surface *es, struct 
weston_output *output,
 
 out:
        pixman_region32_fini(&repaint);
-       pixman_region32_fini(&surface_opaque);
        pixman_region32_fini(&surface_blend);
 }
 
-- 
1.7.9.5

_______________________________________________
wayland-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to