aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/effects/GrGaussianConvolutionFragmentProcessor.h
diff options
context:
space:
mode:
authorGravatar wutao <wutao@google.com>2017-06-30 10:44:45 -0700
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-06-30 18:11:16 +0000
commit039a7c70cea29aa40c4fb880b0d6bb523d449568 (patch)
treeb62a5274d4b1cbcaac89ad5fb8bf86118c7caa87 /src/gpu/effects/GrGaussianConvolutionFragmentProcessor.h
parent981deec8b2928f07e3899849bed31bfbb8c19b9b (diff)
Added new edge handling mode (clamp and repeat) to Gaussian blur filter.
Gaussian blur filter will interpolate value by using out of bounds coords, which is 0. This makes it appears darker near the bounds in the blurred images. There are two issues: 1) when downsampling and upsampling, we should use GrTextureDomainEffect kClamp_Mode to clamp the texture coords to the bounds; 2) during Gaussian blur, we need to clamp to texture bounds. BUG=622128 TEST=cc_unittests, GM image test & manual. Some test results can be found at: https://bugs.chromium.org/p/chromium/issues/detail?id=622128#c49 Change-Id: I9283da1d91efb0da94a991f2d372e9f62c288bdc Reviewed-on: https://skia-review.googlesource.com/20465 Commit-Queue: Robert Phillips <robertphillips@google.com> Reviewed-by: Stephen White <senorblanco@chromium.org> Reviewed-by: Robert Phillips <robertphillips@google.com> Reviewed-by: Mike Reed <reed@google.com>
Diffstat (limited to 'src/gpu/effects/GrGaussianConvolutionFragmentProcessor.h')
-rw-r--r--src/gpu/effects/GrGaussianConvolutionFragmentProcessor.h15
1 files changed, 9 insertions, 6 deletions
diff --git a/src/gpu/effects/GrGaussianConvolutionFragmentProcessor.h b/src/gpu/effects/GrGaussianConvolutionFragmentProcessor.h
index d6398726b5..5f520df23b 100644
--- a/src/gpu/effects/GrGaussianConvolutionFragmentProcessor.h
+++ b/src/gpu/effects/GrGaussianConvolutionFragmentProcessor.h
@@ -9,6 +9,7 @@
#define GrGaussianConvolutionFragmentProcessor_DEFINED
#include "Gr1DKernelEffect.h"
+#include "GrTextureDomain.h"
/**
* A 1D Gaussian convolution effect. The kernel is computed as an array of 2 * half-width weights.
@@ -22,10 +23,10 @@ public:
Direction dir,
int halfWidth,
float gaussianSigma,
- bool useBounds,
+ GrTextureDomain::Mode mode,
int* bounds) {
return sk_sp<GrFragmentProcessor>(new GrGaussianConvolutionFragmentProcessor(
- std::move(proxy), dir, halfWidth, gaussianSigma, useBounds, bounds));
+ std::move(proxy), dir, halfWidth, gaussianSigma, mode, bounds));
}
~GrGaussianConvolutionFragmentProcessor() override;
@@ -33,7 +34,9 @@ public:
const float* kernel() const { return fKernel; }
const int* bounds() const { return fBounds; }
- bool useBounds() const { return fUseBounds; }
+ bool useBounds() const { return fMode != GrTextureDomain::kIgnore_Mode; }
+
+ GrTextureDomain::Mode mode() const { return fMode; }
const char* name() const override { return "GaussianConvolution"; }
@@ -49,8 +52,8 @@ public:
private:
/// Convolve with a Gaussian kernel
GrGaussianConvolutionFragmentProcessor(sk_sp<GrTextureProxy>, Direction,
- int halfWidth, float gaussianSigma, bool useBounds,
- int bounds[2]);
+ int halfWidth, float gaussianSigma,
+ GrTextureDomain::Mode mode, int bounds[2]);
GrGLSLFragmentProcessor* onCreateGLSLInstance() const override;
@@ -63,8 +66,8 @@ private:
// TODO: Inline the kernel constants into the generated shader code. This may involve pulling
// some of the logic from SkGpuBlurUtils into this class related to radius/sigma calculations.
float fKernel[kMaxKernelWidth];
- bool fUseBounds;
int fBounds[2];
+ GrTextureDomain::Mode fMode;
typedef Gr1DKernelEffect INHERITED;
};