X-Git-Url: https://git.sesse.net/?p=movit;a=blobdiff_plain;f=blur_effect.h;h=b68094755bfe6188c801ebfbae222cd89870a0a6;hp=2aada42061098561892b71b3d6d1fb1a2d91f19f;hb=c7e57f5c9fbc1b58d450557cfbffe60480bdd6b7;hpb=e655afd53f2e56938bd4e7f72640eff56ef4a1ee diff --git a/blur_effect.h b/blur_effect.h index 2aada42..b680947 100644 --- a/blur_effect.h +++ b/blur_effect.h @@ -24,6 +24,9 @@ public: virtual bool needs_texture_bounce() const { return true; } virtual bool needs_mipmaps() const { return true; } virtual bool needs_srgb_primaries() const { return false; } + virtual AlphaHandling alpha_handling() const { return INPUT_AND_OUTPUT_ALPHA_PREMULTIPLIED; } + + virtual void inform_input_size(unsigned input_num, unsigned width, unsigned height); virtual std::string output_fragment_shader() { assert(false); @@ -40,11 +43,14 @@ private: float radius; SingleBlurPassEffect *hpass, *vpass; + unsigned input_width, input_height; }; class SingleBlurPassEffect : public Effect { public: - SingleBlurPassEffect(); + // If parent is non-NULL, calls to inform_input_size will be forwarded + // so that it can make reasonable decisions for both blur passes. + SingleBlurPassEffect(BlurEffect *parent); virtual std::string effect_type_id() const { return "SingleBlurPassEffect"; } std::string output_fragment_shader(); @@ -53,6 +59,11 @@ public: virtual bool needs_mipmaps() const { return true; } virtual bool needs_srgb_primaries() const { return false; } + virtual void inform_input_size(unsigned input_num, unsigned width, unsigned height) { + if (parent != NULL) { + parent->inform_input_size(input_num, width, height); + } + } virtual bool changes_output_size() const { return true; } virtual void get_output_size(unsigned *width, unsigned *height) const { @@ -66,6 +77,7 @@ public: enum Direction { HORIZONTAL = 0, VERTICAL = 1 }; private: + BlurEffect *parent; float radius; Direction direction; int width, height;