Factorize the code to compute sampling points for bilinear sampling into a shared...
[movit] / blur_effect.cpp
index b48dc95..90d1b68 100644 (file)
@@ -114,12 +114,16 @@ void SingleBlurPassEffect::set_gl_state(GLuint glsl_program_num, const std::stri
        } else {
                float sum = 0.0f;
                for (unsigned i = 0; i < NUM_TAPS + 1; ++i) {
-                       float z = i / radius;
-
                        // Gaussian blur is a common, but maybe not the prettiest choice;
                        // it can feel a bit too blurry in the fine detail and too little
                        // long-tail. This is a simple logistic distribution, which has
                        // a narrower peak but longer tails.
+                       //
+                       // We interpret the radius as sigma, similar to Gaussian blur.
+                       // Wikipedia says that sigma² = pi² s² / 3, which yields:
+                       const float s = (sqrt(3.0) / M_PI) * radius;
+                       float z = i / (2.0 * s);
+
                        weight[i] = 1.0f / (cosh(z) * cosh(z));
 
                        if (i == 0) {
@@ -158,13 +162,8 @@ void SingleBlurPassEffect::set_gl_state(GLuint glsl_program_num, const std::stri
                float w2 = weight[base_pos + 1];
 
                float offset, total_weight;
-               if (w1 + w2 < 1e-6) {
-                       offset = 0.5f;
-                       total_weight = 0.0f;
-               } else {
-                       offset = w2 / (w1 + w2);
-                       total_weight = w1 + w2;
-               }
+               combine_two_samples(w1, w2, &offset, &total_weight);
+
                float x = 0.0f, y = 0.0f;
 
                if (direction == HORIZONTAL) {