public:
BlurEffect();
+ virtual std::string effect_type_id() const { return "BlurEffect"; }
+
// We want this for the same reason as ResizeEffect; we could end up scaling
// down quite a lot.
virtual bool needs_texture_bounce() const { return true; }
class SingleBlurPassEffect : public Effect {
public:
SingleBlurPassEffect();
+ virtual std::string effect_type_id() const { return "SingleBlurPassEffect"; }
+
std::string output_fragment_shader();
virtual bool needs_texture_bounce() const { return true; }
class ColorSpaceConversionEffect : public Effect {
public:
ColorSpaceConversionEffect();
+ virtual std::string effect_type_id() const { return "ColorSpaceConversionEffect"; }
std::string output_fragment_shader();
virtual bool needs_srgb_primaries() const { return false; }
class DiffusionEffect : public Effect {
public:
DiffusionEffect();
+ virtual std::string effect_type_id() const { return "DiffusionEffect"; }
virtual void add_self_to_effect_chain(EffectChain *chain, const std::vector<Effect *> &input);
virtual bool set_float(const std::string &key, float value);
class OverlayMatteEffect : public Effect {
public:
OverlayMatteEffect();
+ virtual std::string effect_type_id() const { return "OverlayMatteEffect"; }
std::string output_fragment_shader();
unsigned num_inputs() const { return 2; }
void set_uniform_vec4_array(GLuint glsl_program_num, const std::string &prefix, const std::string &key, const float *values, size_t num_values);
class Effect {
-public:
+public:
+ // An identifier for this type of effect, mostly used for debug output
+ // (but some special names, like "ColorSpaceConversionEffect", holds special
+ // meaning). Same as the class name is fine.
+ virtual std::string effect_type_id() const = 0;
+
// Whether this effects expects its input (and output) to be in
// linear gamma, ie. without an applied gamma curve. Most effects
// will want this, although the ones that never actually look at
std::reverse(phases.begin(), phases.end());
}
+void EffectChain::output_dot(const char *filename)
+{
+ FILE *fp = fopen(filename, "w");
+ if (fp == NULL) {
+ perror(filename);
+ exit(1);
+ }
+
+ fprintf(fp, "digraph G {\n");
+ for (unsigned i = 0; i < nodes.size(); ++i) {
+ fprintf(fp, " n%ld [label=\"%s\"];\n", (long)nodes[i], nodes[i]->effect->effect_type_id().c_str());
+ for (unsigned j = 0; j < nodes[i]->outgoing_links.size(); ++j) {
+ fprintf(fp, " n%ld -> n%ld;\n", (long)nodes[i], (long)nodes[i]->outgoing_links[j]);
+ }
+ }
+ fprintf(fp, "}\n");
+
+ fclose(fp);
+}
+
void EffectChain::find_output_size(Phase *phase)
{
Node *output_node = phase->effects.back();
void EffectChain::finalize()
{
+ output_dot("final.dot");
+
// Find the output effect. This is, simply, one that has no outgoing links.
// If there are multiple ones, the graph is malformed (we do not support
// multiple outputs right now).
// that depends on it (whenever possible).
void construct_glsl_programs(Node *output);
+ // Output the current graph to the given file in a Graphviz-compatible format;
+ // only useful for debugging.
+ void output_dot(const char *filename);
+
unsigned width, height;
ImageFormat output_format;
public:
FlatInput(ImageFormat format, MovitPixelFormat pixel_format, unsigned width, unsigned height);
+ virtual std::string effect_type_id() const { return "FlatInput"; }
+
// Create the texture itself. We cannot do this in the constructor,
// because we don't necessarily know all the settings (sRGB texture,
// mipmap generation) at that point.
class GammaCompressionEffect : public Effect {
public:
GammaCompressionEffect();
+ virtual std::string effect_type_id() const { return "GammaCompressionEffect"; }
std::string output_fragment_shader();
virtual bool needs_srgb_primaries() const { return false; }
class GammaExpansionEffect : public Effect {
public:
GammaExpansionEffect();
+ virtual std::string effect_type_id() const { return "GammaExpansionEffect"; }
std::string output_fragment_shader();
virtual bool needs_linear_light() const { return false; }
class GlowEffect : public Effect {
public:
GlowEffect();
+ virtual std::string effect_type_id() const { return "GlowEffect"; }
virtual bool needs_srgb_primaries() const { return false; }
class LiftGammaGainEffect : public Effect {
public:
LiftGammaGainEffect();
+ virtual std::string effect_type_id() const { return "LiftGammaGainEffect"; }
std::string output_fragment_shader();
void set_gl_state(GLuint glsl_program_num, const std::string &prefix, unsigned *sampler_num);
class MirrorEffect : public Effect {
public:
MirrorEffect();
+ virtual std::string effect_type_id() const { return "MirrorEffect"; }
std::string output_fragment_shader();
virtual bool needs_linear_light() const { return false; }
class MixEffect : public Effect {
public:
MixEffect();
+ virtual std::string effect_type_id() const { return "MixEffect"; }
std::string output_fragment_shader();
virtual bool needs_srgb_primaries() const { return false; }
class ResizeEffect : public Effect {
public:
ResizeEffect();
+ virtual std::string effect_type_id() const { return "ResizeEffect"; }
std::string output_fragment_shader();
// We want processing done pre-filtering and mipmapped,
class SandboxEffect : public Effect {
public:
SandboxEffect();
+ virtual std::string effect_type_id() const { return "SandboxEffect"; }
std::string output_fragment_shader();
void set_gl_state(GLuint glsl_program_num, const std::string &prefix, unsigned *sampler_num);
class SaturationEffect : public Effect {
public:
SaturationEffect();
+ virtual std::string effect_type_id() const { return "SaturationEffect"; }
std::string output_fragment_shader();
private:
class VignetteEffect : public Effect {
public:
VignetteEffect();
+ virtual std::string effect_type_id() const { return "VignetteEffect"; }
std::string output_fragment_shader();
virtual bool needs_srgb_primaries() const { return false; }
const YCbCrFormat &ycbcr_format,
unsigned width, unsigned height);
+ virtual std::string effect_type_id() const { return "YCbCrInput"; }
+
// Create the texture itself. We cannot do this in the constructor,
// because we don't necessarily know all the settings (sRGB texture,
// mipmap generation) at that point.