CXXFLAGS=-Wall -g
LDFLAGS=-lSDL -lSDL_image -lGL
OBJS=main.o util.o widgets.o effect.o effect_chain.o
-OBJS += lift_gamma_gain_effect.o gamma_expansion_effect.o gamma_compression_effect.o colorspace_conversion_effect.o
+OBJS += lift_gamma_gain_effect.o gamma_expansion_effect.o gamma_compression_effect.o colorspace_conversion_effect.o saturation_effect.o
test: $(OBJS)
$(CXX) -o test $(OBJS) $(LDFLAGS)
#include "gamma_compression_effect.h"
#include "lift_gamma_gain_effect.h"
#include "colorspace_conversion_effect.h"
+#include "saturation_effect.h"
#include "texture_enum.h"
EffectChain::EffectChain(unsigned width, unsigned height)
return new GammaExpansionEffect();
case LIFT_GAMMA_GAIN:
return new LiftGammaGainEffect();
+ case SATURATION:
+ return new SaturationEffect();
}
assert(false);
}
// Color.
LIFT_GAMMA_GAIN,
+ SATURATION,
};
#endif // !defined(_EFFECT_ID_H)
LiftGammaGainEffect::LiftGammaGainEffect()
: lift(0.0f, 0.0f, 0.0f),
gamma(1.0f, 1.0f, 1.0f),
- gain(1.0f, 1.0f, 1.0f),
- saturation(1.0f)
+ gain(1.0f, 1.0f, 1.0f)
{
register_vec3("lift", (float *)&lift);
register_vec3("gamma", (float *)&gamma);
register_vec3("gain", (float *)&gain);
- register_float("saturation", &saturation);
}
std::string LiftGammaGainEffect::output_glsl()
private:
RGBTriplet lift, gamma, gain;
- float saturation;
};
#endif // !defined(_LIFT_GAMMA_GAIN_EFFECT_H)
float gain_theta = 0.0f, gain_rad = 0.0f, gain_v = 0.25f;
float saturation = 1.0f;
-void update_hsv(Effect *lift_gamma_gain_effect)
+void update_hsv(Effect *lift_gamma_gain_effect, Effect *saturation_effect)
{
RGBTriplet lift(0.0f, 0.0f, 0.0f);
RGBTriplet gamma(1.0f, 1.0f, 1.0f);
if (saturation < 0.0) {
saturation = 0.0;
}
+ ok = saturation_effect->set_float("saturation", saturation);
+ assert(ok);
}
void mouse(int x, int y)
chain.add_input(inout_format);
Effect *lift_gamma_gain_effect = chain.add_effect(LIFT_GAMMA_GAIN);
+ Effect *saturation_effect = chain.add_effect(SATURATION);
chain.add_output(inout_format);
chain.finalize();
++frame;
- update_hsv(lift_gamma_gain_effect);
+ update_hsv(lift_gamma_gain_effect, saturation_effect);
chain.render_to_screen(src_img);
glReadPixels(0, 0, WIDTH, HEIGHT, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, BUFFER_OFFSET(0));
--- /dev/null
+#define GL_GLEXT_PROTOTYPES 1
+
+#include "saturation_effect.h"
+#include "util.h"
+
+SaturationEffect::SaturationEffect()
+ : saturation(1.0f)
+{
+ register_float("saturation", &saturation);
+}
+
+std::string SaturationEffect::output_glsl()
+{
+ return read_file("saturation_effect.glsl");
+}
--- /dev/null
+// Saturate/desaturate (in linear space).
+
+vec4 FUNCNAME(vec2 tc) {
+ vec4 x = LAST_INPUT(tc);
+
+ float luminance = dot(x.rgb, vec3(0.2126, 0.7152, 0.0722));
+ x.rgb = mix(vec3(luminance), x.rgb, PREFIX(saturation));
+
+ return x;
+}
--- /dev/null
+#ifndef _SATURATION_EFFECT_H
+#define _SATURATION_EFFECT_H 1
+
+#include "effect.h"
+
+class SaturationEffect : public Effect {
+public:
+ SaturationEffect();
+ std::string output_glsl();
+
+private:
+ float saturation;
+};
+
+#endif // !defined(_SATURATION_EFFECT_H)