X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fcolorcurve.h;h=3f65b04916897c6d85bde7ec4f33fece160a3cd1;hp=75e7fd302a76a2bea330162942c7c881379dd2c5;hb=bec07999d95b76f4b47cffcc564d0cd0afc0435e;hpb=aa987216b92584aafc0ecbc3d578606018078f91 diff --git a/source/colorcurve.h b/source/colorcurve.h index 75e7fd30..3f65b049 100644 --- a/source/colorcurve.h +++ b/source/colorcurve.h @@ -1,45 +1,80 @@ -#ifndef COLORCURVE_H_ -#define COLORCURVE_H_ +#ifndef MSP_GL_COLORCURVE_H_ +#define MSP_GL_COLORCURVE_H_ #include "postprocessor.h" #include "program.h" #include "programdata.h" #include "texture1d.h" +#include "texturing.h" namespace Msp { namespace GL { /** Processes oversaturated colors to preserve hues. When one color component -exceeds 1.0, the others are scaled towards white. A transition curve is also -applied near 1.0 to prevent the abrupt change in the gradient. +exceeds 1.0, the overflow is distributed to the other components, scaling the +color towards white. -Only makes sense when used in an HDR framebuffer. +Gamma or sRGB correction can also be applied to the output. It can be used to +improve color reproduction by performing lighting calculations in linear color +space and converting to sRGB for display. */ class ColorCurve: public PostProcessor { +public: + struct Template: public PostProcessor::Template + { + class Loader: public DataFile::DerivedObjectLoader + { + public: + Loader(Template &); + + private: + void gamma(float); + void srgb(); + }; + + float exposure_adjust; + float brightness_response; + float gamma; + bool srgb; + + Template(); + + virtual ColorCurve *create(unsigned, unsigned) const; + }; + private: Program shprog; ProgramData shdata; Texture1D curve; - const Mesh &quad; + Texturing texturing; + RefPtr quad; + RefPtr linear_sampler; + RefPtr nearest_sampler; public: ColorCurve(); - /// Sets the size of the peak zone. Must be between 0 and 1, inclusive. - void set_peak(float); + /** Set exposure adjustment in EV units. Positive values brighten the + image, negative values darken it. Zero is neutral. */ + void set_exposure_adjust(float); - /** Sets brightness for oversaturated colors. Must be >= 1. Suggested - values are between 1.5 and 2.0; a value of 1.0 will clamp colors to the - saturated value. */ - void set_brightness(float); + /** Sets the exponent of the */ + void set_brightness_response(float); + /** Sets the gamma value used for mapping output colors. Allowed range is + from 0.1 to 10. */ void set_gamma(float); + + /** Sets output mapping to sRGB. This is almost, but not exactly equivalent + to set_gamma(2.2). */ void set_srgb(); + + /// Sets output mapping to linear. This is equivalent to set_gamma(1). void set_linear(); - virtual void render(const Texture2D &, const Texture2D &); + virtual void render(Renderer &, const Texture2D &, const Texture2D &); }; } // namespace GL