diff options
author | Scott Moreau <oreaus@gmail.com> | 2012-05-22 10:18:50 -0600 |
---|---|---|
committer | Kristian Høgsberg <krh@bitplanet.net> | 2012-05-22 13:06:51 -0400 |
commit | 9fb9824c1753c7aa560f755d013008cedd454388 (patch) | |
tree | 012d229a43ab77dcd1c46f37a86c94c1c3a2a37e | |
parent | 9b68af06086a53872dfdae7619bf49b95a79c656 (diff) |
compositor: Address blending for XRGB surfaces with alpha < 1.0.
-rw-r--r-- | src/compositor.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/src/compositor.c b/src/compositor.c index 5e77bc8..3c1e058 100644 --- a/src/compositor.c +++ b/src/compositor.c @@ -839,6 +839,7 @@ WL_EXPORT void weston_surface_draw(struct weston_surface *es, struct weston_output *output, pixman_region32_t *damage) { + GLfloat surface_rect[4] = { 0.0, 1.0, 0.0, 1.0 }; struct weston_compositor *ec = es->compositor; GLfloat *v; pixman_region32_t repaint; @@ -854,7 +855,7 @@ weston_surface_draw(struct weston_surface *es, struct weston_output *output, goto out; glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); - if (es->blend) + if (es->blend || es->alpha < 1.0) glEnable(GL_BLEND); else glDisable(GL_BLEND); @@ -873,7 +874,10 @@ weston_surface_draw(struct weston_surface *es, struct weston_output *output, glUniform1f(es->shader->saturation_uniform, es->saturation); glUniform1f(es->shader->texwidth_uniform, (GLfloat)es->geometry.width / es->pitch); - glUniform4fv(es->shader->opaque_uniform, 1, es->opaque_rect); + if (es->blend) + glUniform4fv(es->shader->opaque_uniform, 1, es->opaque_rect); + else + glUniform4fv(es->shader->opaque_uniform, 1, surface_rect); if (es->transform.enabled || output->zoom.active) filter = GL_LINEAR; @@ -2419,10 +2423,8 @@ weston_shader_init(struct weston_shader *shader, shader->brightness_uniform = glGetUniformLocation(shader->program, "bright"); shader->saturation_uniform = glGetUniformLocation(shader->program, "saturation"); shader->color_uniform = glGetUniformLocation(shader->program, "color"); - shader->texwidth_uniform = glGetUniformLocation(shader->program, - "texwidth"); - shader->opaque_uniform = - glGetUniformLocation(shader->program, "opaque"); + shader->texwidth_uniform = glGetUniformLocation(shader->program, "texwidth"); + shader->opaque_uniform = glGetUniformLocation(shader->program, "opaque"); return 0; } |