X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcolorcurve.cpp;h=81b5a43e7a6ef4d6724a39e2ea182e7ecd63586a;hb=d1e3975c163694d7bca6417463462be950019e5e;hp=95c82491740765bfe47d9f18dbe7e33ef0adfeaf;hpb=9a54442d865974ac8785988e7e740480e72ab24c;p=libs%2Fgl.git diff --git a/source/colorcurve.cpp b/source/colorcurve.cpp index 95c82491..81b5a43e 100644 --- a/source/colorcurve.cpp +++ b/source/colorcurve.cpp @@ -1,54 +1,31 @@ +#include +#include "color.h" #include "colorcurve.h" #include "mesh.h" +#include "renderer.h" #include "shader.h" #include "texture2d.h" using namespace std; -namespace { - -static const char fragment_src[] = - "uniform sampler2D texture;\n" - "uniform float peak;\n" - "uniform float brightness;\n" - "varying vec2 texcoord;\n" - "void main()\n" - "{\n" - " vec4 sample = texture2D(texture, texcoord);\n" - " float maxc = max(sample.r, max(sample.g, sample.b));\n" - " if(maxc>1.0-peak)\n" - " {\n" - " vec3 saturated = sample.rgb/maxc;\n" - " if(maxc>1.0+peak)\n" - " {\n" - " gl_FragColor.rgb = mix(vec3(1.0), saturated, 1.0/pow(brightness, maxc-1-peak));\n" - " }\n" - " else\n" - " {\n" - " float x = (1.0+peak-maxc)/(2.0*peak);\n" - " gl_FragColor.rgb = saturated.rgb*(1.0-peak+(1-x*x)*peak);\n" - " }\n" - " gl_FragColor.a = sample.a;\n" - " }\n" - " else\n" - " gl_FragColor = sample;\n" - "}"; - -} - namespace Msp { namespace GL { ColorCurve::ColorCurve(): + shprog("colorcurve.glsl"), quad(get_fullscreen_quad()) { - shprog.attach_shader(get_fullscreen_vertex_shader()); - Shader *fs = new Shader(FRAGMENT_SHADER, fragment_src); - shprog.attach_shader_owned(fs); - shprog.link(); + shdata.uniform("source", 0); + shdata.uniform("curve", 1); + + curve.storage(LUMINANCE, 256); + curve.set_min_filter(LINEAR); + curve.set_wrap(CLAMP_TO_EDGE); + texturing.attach(1, curve); set_peak(0.2); set_brightness(1.5); + set_linear(); } void ColorCurve::set_peak(float p) @@ -65,12 +42,42 @@ void ColorCurve::set_brightness(float b) shdata.uniform("brightness", b); } -void ColorCurve::render(const Texture2D &color_buf, const Texture2D &) +void ColorCurve::set_gamma(float g) +{ + if(g<0.1 || g>10) + throw invalid_argument("ColorCurve::set_gamma"); + + unsigned char curve_data[256]; + for(unsigned i=0; i<256; ++i) + curve_data[i] = pow(i/255.0f, 1/g)*255+0.5f; + curve.image(0, LUMINANCE, UNSIGNED_BYTE, curve_data); +} + +void ColorCurve::set_srgb() +{ + unsigned char curve_data[256]; + curve_data[0] = 0; + for(unsigned i=1; i<256; ++i) + curve_data[i] = to_srgb(i/255.0f)*255+0.5f; + curve.image(0, LUMINANCE, UNSIGNED_BYTE, curve_data); +} + +void ColorCurve::set_linear() { - Bind _bind_shader(shprog); - shdata.apply(); - Bind _bind_tex(color_buf); - quad.draw(); + unsigned char curve_data[256]; + for(unsigned i=0; i<256; ++i) + curve_data[i] = i; + curve.image(0, LUMINANCE, UNSIGNED_BYTE, curve_data); +} + +void ColorCurve::render(Renderer &renderer, const Texture2D &color_buf, const Texture2D &) +{ + texturing.attach(0, color_buf); + + Renderer::Push push(renderer); + renderer.set_shader_program(&shprog, &shdata); + renderer.set_texturing(&texturing); + quad.draw(renderer); } } // namespace GL