diff --git a/src/gpu/GrContext.cpp b/src/gpu/GrContext.cpp
index e70ac5c..6e5fb08 100644
--- a/src/gpu/GrContext.cpp
+++ b/src/gpu/GrContext.cpp
@@ -263,8 +263,8 @@
     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);
 }
diff --git a/src/gpu/effects/GrConvolutionEffect.cpp b/src/gpu/effects/GrConvolutionEffect.cpp
index 33f61b6..3804d57 100644
--- a/src/gpu/effects/GrConvolutionEffect.cpp
+++ b/src/gpu/effects/GrConvolutionEffect.cpp
@@ -163,6 +163,30 @@
     }
 }
 
+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 @@
             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;
-    }
-}
diff --git a/src/gpu/effects/GrConvolutionEffect.h b/src/gpu/effects/GrConvolutionEffect.h
index 58cad83..e04e802 100644
--- a/src/gpu/effects/GrConvolutionEffect.h
+++ b/src/gpu/effects/GrConvolutionEffect.h
@@ -21,19 +21,15 @@
 
 public:
 
+    /// Convolve with an arbitrary user-specified kernel
     GrConvolutionEffect(GrTexture*, Direction,
                         int halfWidth, const float* kernel = NULL);
+
+    /// Convolve with a gaussian kernel
+    GrConvolutionEffect(GrTexture*, Direction,
+                        int halfWidth, float gaussianSigma);
     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);
-
     const float* kernel() const { return fKernel; }
 
     static const char* Name() { return "Convolution"; }
