[PATCH 2/3 v2] Install brightness and saturation variables for surface shader

Scott Moreau oreaus at gmail.com
Tue Apr 17 18:06:19 PDT 2012


---
 src/compositor.c |   12 ++++++++++++
 src/compositor.h |    4 ++++
 2 files changed, 16 insertions(+), 0 deletions(-)

diff --git a/src/compositor.c b/src/compositor.c
index 16d10f9..3fae8f5 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -217,6 +217,8 @@ weston_surface_create(struct weston_compositor *compositor)
 	surface->compositor = compositor;
 	surface->image = EGL_NO_IMAGE_KHR;
 	surface->alpha = 255;
+	surface->brightness = 255;
+	surface->saturation = 255;
 	surface->pitch = 1;
 
 	surface->buffer = NULL;
@@ -813,6 +815,8 @@ weston_surface_draw(struct weston_surface *es, struct weston_output *output,
 	glUniform1i(es->shader->tex_uniform, 0);
 	glUniform4fv(es->shader->color_uniform, 1, es->color);
 	glUniform1f(es->shader->alpha_uniform, es->alpha / 255.0);
+	glUniform1f(es->shader->brightness_uniform, es->brightness / 255.0);
+	glUniform1f(es->shader->saturation_uniform, es->saturation / 255.0);
 	glUniform1f(es->shader->texwidth_uniform,
 		    (GLfloat)es->geometry.width / es->pitch);
 
@@ -2176,6 +2180,8 @@ static const char texture_fragment_shader[] =
 	"varying vec2 v_texcoord;\n"
 	"uniform sampler2D tex;\n"
 	"uniform float alpha;\n"
+	"uniform float bright;\n"
+	"uniform float saturation;\n"
 	"uniform float texwidth;\n"
 	"void main()\n"
 	"{\n"
@@ -2183,6 +2189,10 @@ static const char texture_fragment_shader[] =
 	"       v_texcoord.y < 0.0 || v_texcoord.y > 1.0)\n"
 	"      discard;\n"
 	"   gl_FragColor = texture2D(tex, v_texcoord)\n;"
+	"   float gray = dot(gl_FragColor.rgb, vec3(0.299, 0.587, 0.114));\n"
+	"   vec3 range = (gl_FragColor.rgb - vec3 (gray, gray, gray)) * saturation;\n"
+	"   gl_FragColor = vec4(vec3(gray + range), gl_FragColor.a);\n"
+	"   gl_FragColor = vec4(vec3(bright, bright, bright) * gl_FragColor.rgb, gl_FragColor.a);\n"
 	"   gl_FragColor = alpha * gl_FragColor;\n"
 	"}\n";
 
@@ -2244,6 +2254,8 @@ weston_shader_init(struct weston_shader *shader,
 	shader->proj_uniform = glGetUniformLocation(shader->program, "proj");
 	shader->tex_uniform = glGetUniformLocation(shader->program, "tex");
 	shader->alpha_uniform = glGetUniformLocation(shader->program, "alpha");
+	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");
diff --git a/src/compositor.h b/src/compositor.h
index 7616082..b581fce 100644
--- a/src/compositor.h
+++ b/src/compositor.h
@@ -134,6 +134,8 @@ struct weston_shader {
 	GLint proj_uniform;
 	GLint tex_uniform;
 	GLint alpha_uniform;
+	GLint brightness_uniform;
+	GLint saturation_uniform;
 	GLint color_uniform;
 	GLint texwidth_uniform;
 };
@@ -290,6 +292,8 @@ struct weston_surface {
 	struct weston_shader *shader;
 	GLfloat color[4];
 	uint32_t alpha;
+	uint32_t brightness;
+	uint32_t saturation;
 
 	/* Surface geometry state, mutable.
 	 * If you change anything, set dirty = 1.
-- 
1.7.4.1



More information about the wayland-devel mailing list