1 /* 2 * Copyright 2014 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #ifndef GrMatrixConvolutionEffect_DEFINED 9 #define GrMatrixConvolutionEffect_DEFINED 10 11 #include "GrSingleTextureEffect.h" 12 #include "GrTextureDomain.h" 13 14 // A little bit less than the minimum # uniforms required by DX9SM2 (32). 15 // Allows for a 5x5 kernel (or 25x1, for that matter). 16 #define MAX_KERNEL_SIZE 25 17 18 class GrMatrixConvolutionEffect : public GrSingleTextureEffect { 19 public: Make(GrResourceProvider * resourceProvider,sk_sp<GrTextureProxy> proxy,const SkIRect & bounds,const SkISize & kernelSize,const SkScalar * kernel,SkScalar gain,SkScalar bias,const SkIPoint & kernelOffset,GrTextureDomain::Mode tileMode,bool convolveAlpha)20 static sk_sp<GrFragmentProcessor> Make(GrResourceProvider* resourceProvider, 21 sk_sp<GrTextureProxy> proxy, 22 const SkIRect& bounds, 23 const SkISize& kernelSize, 24 const SkScalar* kernel, 25 SkScalar gain, 26 SkScalar bias, 27 const SkIPoint& kernelOffset, 28 GrTextureDomain::Mode tileMode, 29 bool convolveAlpha) { 30 return sk_sp<GrFragmentProcessor>( 31 new GrMatrixConvolutionEffect(resourceProvider, std::move(proxy), bounds, kernelSize, 32 kernel, gain, bias, kernelOffset, tileMode, convolveAlpha)); 33 } 34 35 static sk_sp<GrFragmentProcessor> MakeGaussian(GrResourceProvider*, 36 sk_sp<GrTextureProxy> proxy, 37 const SkIRect& bounds, 38 const SkISize& kernelSize, 39 SkScalar gain, 40 SkScalar bias, 41 const SkIPoint& kernelOffset, 42 GrTextureDomain::Mode tileMode, 43 bool convolveAlpha, 44 SkScalar sigmaX, 45 SkScalar sigmaY); 46 bounds()47 const SkIRect& bounds() const { return fBounds; } kernelSize()48 const SkISize& kernelSize() const { return fKernelSize; } kernelOffset()49 const float* kernelOffset() const { return fKernelOffset; } kernel()50 const float* kernel() const { return fKernel; } gain()51 float gain() const { return fGain; } bias()52 float bias() const { return fBias; } convolveAlpha()53 bool convolveAlpha() const { return fConvolveAlpha; } domain()54 const GrTextureDomain& domain() const { return fDomain; } 55 name()56 const char* name() const override { return "MatrixConvolution"; } 57 58 private: 59 GrMatrixConvolutionEffect(GrResourceProvider*, 60 sk_sp<GrTextureProxy> proxy, 61 const SkIRect& bounds, 62 const SkISize& kernelSize, 63 const SkScalar* kernel, 64 SkScalar gain, 65 SkScalar bias, 66 const SkIPoint& kernelOffset, 67 GrTextureDomain::Mode tileMode, 68 bool convolveAlpha); 69 70 GrGLSLFragmentProcessor* onCreateGLSLInstance() const override; 71 72 void onGetGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder*) const override; 73 74 bool onIsEqual(const GrFragmentProcessor&) const override; 75 76 SkIRect fBounds; 77 SkISize fKernelSize; 78 float fKernel[MAX_KERNEL_SIZE]; 79 float fGain; 80 float fBias; 81 float fKernelOffset[2]; 82 bool fConvolveAlpha; 83 GrTextureDomain fDomain; 84 85 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; 86 87 typedef GrSingleTextureEffect INHERITED; 88 }; 89 90 #endif 91