+ std::map<std::string, int *> params_int;
+ std::map<std::string, float *> params_float;
+ std::map<std::string, float *> params_vec3;
+};
+
+bool Effect::set_int(const std::string &key, int value)
+{
+ if (params_int.count(key) == 0) {
+ return false;
+ }
+ *params_int[key] = value;
+ return true;
+}
+
+bool Effect::set_float(const std::string &key, float value)
+{
+ if (params_float.count(key) == 0) {
+ return false;
+ }
+ *params_float[key] = value;
+ return true;
+}
+
+bool Effect::set_vec3(const std::string &key, const float *values)
+{
+ if (params_vec3.count(key) == 0) {
+ return false;
+ }
+ memcpy(params_vec3[key], values, sizeof(float) * 3);
+ return true;
+}
+
+void Effect::register_int(const std::string &key, int *value)
+{
+ assert(params_int.count(key) == 0);
+ params_int[key] = value;
+}
+
+void Effect::register_float(const std::string &key, float *value)
+{
+ assert(params_float.count(key) == 0);
+ params_float[key] = value;
+}
+
+void Effect::register_vec3(const std::string &key, float *values)
+{
+ assert(params_vec3.count(key) == 0);
+ params_vec3[key] = values;
+}
+
+// Can alias on a float[3].
+struct RGBTriplet {
+ RGBTriplet(float r, float g, float b)
+ : r(r), g(g), b(b) {}
+
+ float r, g, b;
+};
+
+class GammaExpansionEffect : public Effect {
+public:
+ GammaExpansionEffect()
+ : source_curve(GAMMA_LINEAR)
+ {
+ register_int("source_curve", (int *)&source_curve);
+ }
+
+private:
+ GammaCurve source_curve;
+};
+
+class ColorSpaceConversionEffect : public Effect {
+public:
+ ColorSpaceConversionEffect()
+ : source_space(COLORSPACE_sRGB),
+ destination_space(COLORSPACE_sRGB)
+ {
+ register_int("source_space", (int *)&source_space);
+ register_int("destination_space", (int *)&destination_space);
+ }
+
+private:
+ ColorSpace source_space, destination_space;
+};
+
+class ColorSpaceConversionEffect;
+
+class LiftGammaGainEffect : public Effect {
+public:
+ 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)
+ {
+ register_vec3("lift", (float *)&lift);
+ register_vec3("gamma", (float *)&gamma);
+ register_vec3("gain", (float *)&gain);
+ register_float("saturation", &saturation);
+ }
+
+private:
+ RGBTriplet lift, gamma, gain;
+ float saturation;
+};