123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- /*
- ** Copyright (c) 2012, Romain Dura romain@shazbits.com
- **
- ** Permission to use, copy, modify, and/or distribute this software for any
- ** purpose with or without fee is hereby granted, provided that the above
- ** copyright notice and this permission notice appear in all copies.
- **
- ** THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- ** WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- ** MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
- ** SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- ** WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- ** ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
- ** IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
- /*
- ** Hue, saturation, luminance
- */
- /*
- ** 2013 adapted for Extended View Toolkit by Marian Weger
- */
- #extension GL_ARB_texture_rectangle : enable
- uniform sampler2DRect tex0;
- uniform vec4 gain;
- vec3 RGBToHSL(vec3 color)
- {
- vec3 hsl; // init to 0 to avoid warnings ? (and reverse if + remove first part)
-
- float fmin = min(min(color.r, color.g), color.b); //Min. value of RGB
- float fmax = max(max(color.r, color.g), color.b); //Max. value of RGB
- float delta = fmax - fmin; //Delta RGB value
- hsl.z = (fmax + fmin) / 2.0; // Luminance
- if (delta == 0.0) //This is a gray, no chroma...
- {
- hsl.x = 0.0; // Hue
- hsl.y = 0.0; // Saturation
- }
- else //Chromatic data...
- {
- if (hsl.z < 0.5)
- hsl.y = delta / (fmax + fmin); // Saturation
- else
- hsl.y = delta / (2.0 - fmax - fmin); // Saturation
-
- float deltaR = (((fmax - color.r) / 6.0) + (delta / 2.0)) / delta;
- float deltaG = (((fmax - color.g) / 6.0) + (delta / 2.0)) / delta;
- float deltaB = (((fmax - color.b) / 6.0) + (delta / 2.0)) / delta;
- if (color.r == fmax )
- hsl.x = deltaB - deltaG; // Hue
- else if (color.g == fmax)
- hsl.x = (1.0 / 3.0) + deltaR - deltaB; // Hue
- else if (color.b == fmax)
- hsl.x = (2.0 / 3.0) + deltaG - deltaR; // Hue
- if (hsl.x < 0.0)
- hsl.x += 1.0; // Hue
- else if (hsl.x > 1.0)
- hsl.x -= 1.0; // Hue
- }
- return hsl;
- }
- float HueToRGB(float f1, float f2, float hue)
- {
- if (hue < 0.0)
- hue += 1.0;
- else if (hue > 1.0)
- hue -= 1.0;
- float res;
- if ((6.0 * hue) < 1.0)
- res = f1 + (f2 - f1) * 6.0 * hue;
- else if ((2.0 * hue) < 1.0)
- res = f2;
- else if ((3.0 * hue) < 2.0)
- res = f1 + (f2 - f1) * ((2.0 / 3.0) - hue) * 6.0;
- else
- res = f1;
- return res;
- }
- vec3 HSLToRGB(vec3 hsl)
- {
- vec3 rgb;
-
- if (hsl.y == 0.0)
- rgb = vec3(hsl.z); // Luminance
- else
- {
- float f2;
-
- if (hsl.z < 0.5)
- f2 = hsl.z * (1.0 + hsl.y);
- else
- f2 = (hsl.z + hsl.y) - (hsl.y * hsl.z);
-
- float f1 = 2.0 * hsl.z - f2;
-
- rgb.r = HueToRGB(f1, f2, hsl.x + (1.0/3.0));
- rgb.g = HueToRGB(f1, f2, hsl.x);
- rgb.b= HueToRGB(f1, f2, hsl.x - (1.0/3.0));
- }
-
- return rgb;
- }
- void main(void)
- {
- vec2 pos = (gl_TextureMatrix[0] * gl_TexCoord[0]).st;
- vec4 color_old = texture2DRect(tex0, vec2(pos.x, pos.y));
- vec4 color_hsl = vec4(RGBToHSL(color_old.rgb), color_old.a);
- color_hsl.r = clamp(gain.r * color_hsl.r, 0., 1.);
- color_hsl.g = clamp(gain.g * color_hsl.g, 0., 1.);
- color_hsl.b = clamp(gain.b * color_hsl.b, 0., 1.);
- color_hsl.a = clamp(gain.a * color_hsl.a, 0., 1.);
- vec4 color_new = vec4(HSLToRGB(color_hsl.rgb), color_hsl.a);
- gl_FragColor = color_new;
- }
|