Having updated the documentation of GrCustomStage to argue that all custom stages...
authortomhudson@google.com <tomhudson@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>
Mon, 16 Jul 2012 12:23:32 +0000 (12:23 +0000)
committertomhudson@google.com <tomhudson@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>
Mon, 16 Jul 2012 12:23:32 +0000 (12:23 +0000)
immutable, this CL makes that true for ConvolutionEffect.

http://codereview.appspot.com/6398043/

git-svn-id: http://skia.googlecode.com/svn/trunk@4613 2bbb7eff-a529-9590-31e7-b0007b416f81

src/gpu/GrContext.cpp
src/gpu/effects/GrConvolutionEffect.cpp
src/gpu/effects/GrConvolutionEffect.h

index e70ac5c..6e5fb08 100644 (file)
@@ -263,8 +263,8 @@ void convolve_gaussian(GrGpu* gpu,
     sampleM.setIDiv(texture->width(), texture->height());
     drawState->sampler(0)->reset(sampleM);
     SkAutoTUnref<GrConvolutionEffect> conv(SkNEW_ARGS(GrConvolutionEffect,
-                                                      (texture, direction, radius)));
-    conv->setGaussianKernel(sigma);
+                                                      (texture, direction, radius,
+                                                       sigma)));
     drawState->sampler(0)->setCustomStage(conv);
     gpu->drawSimpleRect(rect, NULL, 1 << 0);
 }
index 33f61b6..3804d57 100644 (file)
@@ -163,6 +163,30 @@ GrConvolutionEffect::GrConvolutionEffect(GrTexture* texture,
     }
 }
 
+GrConvolutionEffect::GrConvolutionEffect(GrTexture* texture,
+                                         Direction direction,
+                                         int radius,
+                                         float gaussianSigma)
+    : Gr1DKernelEffect(texture, direction, radius) {
+    GrAssert(radius <= kMaxKernelRadius);
+    int width = this->width();
+
+    float sum = 0.0f;
+    float denom = 1.0f / (2.0f * gaussianSigma * gaussianSigma);
+    for (int i = 0; i < width; ++i) {
+        float x = static_cast<float>(i - this->radius());
+        // Note that the constant term (1/(sqrt(2*pi*sigma^2)) of the Gaussian
+        // is dropped here, since we renormalize the kernel below.
+        fKernel[i] = sk_float_exp(- x * x * denom);
+        sum += fKernel[i];
+    }
+    // Normalize the kernel
+    float scale = 1.0f / sum;
+    for (int i = 0; i < width; ++i) {
+        fKernel[i] *= scale;
+    }
+}
+
 GrConvolutionEffect::~GrConvolutionEffect() {
 }
 
@@ -179,20 +203,3 @@ bool GrConvolutionEffect::isEqual(const GrCustomStage& sBase) const {
             0 == memcmp(fKernel, s.fKernel, this->width() * sizeof(float)));
 }
 
-void GrConvolutionEffect::setGaussianKernel(float sigma) {
-    int width = this->width();
-    float sum = 0.0f;
-    float denom = 1.0f / (2.0f * sigma * sigma);
-    for (int i = 0; i < width; ++i) {
-        float x = static_cast<float>(i - this->radius());
-        // Note that the constant term (1/(sqrt(2*pi*sigma^2)) of the Gaussian
-        // is dropped here, since we renormalize the kernel below.
-        fKernel[i] = sk_float_exp(- x * x * denom);
-        sum += fKernel[i];
-    }
-    // Normalize the kernel
-    float scale = 1.0f / sum;
-    for (int i = 0; i < width; ++i) {
-        fKernel[i] *= scale;
-    }
-}
index 58cad83..e04e802 100644 (file)
@@ -21,18 +21,14 @@ class GrConvolutionEffect : public Gr1DKernelEffect {
 
 public:
 
+    /// Convolve with an arbitrary user-specified kernel
     GrConvolutionEffect(GrTexture*, Direction,
                         int halfWidth, const float* kernel = NULL);
-    virtual ~GrConvolutionEffect();
-
-    void setKernel(const float* kernel) {
-        memcpy(fKernel, kernel, this->width());
-    }
 
-    /**
-     * Helper to set the kernel to a Gaussian. Replaces the existing kernel.
-     */
-    void setGaussianKernel(float sigma);
+    /// Convolve with a gaussian kernel
+    GrConvolutionEffect(GrTexture*, Direction,
+                        int halfWidth, float gaussianSigma);
+    virtual ~GrConvolutionEffect();
 
     const float* kernel() const { return fKernel; }