Install brightness and saturation variables for surface shader
authorScott Moreau <oreaus@gmail.com>
Wed, 18 Apr 2012 01:06:19 +0000 (19:06 -0600)
committerKristian Høgsberg <krh@bitplanet.net>
Thu, 19 Apr 2012 16:50:57 +0000 (12:50 -0400)
src/compositor.c
src/compositor.h

index 4c59da6..abf5ce9 100644 (file)
@@ -226,6 +226,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;
@@ -822,6 +824,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);
 
@@ -2185,6 +2189,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"
@@ -2192,6 +2198,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";
 
@@ -2253,6 +2263,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");
index e9c6823..b19900b 100644 (file)
@@ -136,6 +136,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;
 };
@@ -292,6 +294,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.