diff options
author | 2017-06-30 10:44:45 -0700 | |
---|---|---|
committer | 2017-06-30 18:11:16 +0000 | |
commit | 039a7c70cea29aa40c4fb880b0d6bb523d449568 (patch) | |
tree | b62a5274d4b1cbcaac89ad5fb8bf86118c7caa87 /src/gpu/effects/GrGaussianConvolutionFragmentProcessor.h | |
parent | 981deec8b2928f07e3899849bed31bfbb8c19b9b (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.h | 15 |
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; }; |