blob: 4d76f4c9ac71b03bbb2acd73841faab413171943 [file] [log] [blame]
joshualittac977922014-07-22 09:52:11 -07001/*
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"
joshualitt5ae5fc52014-07-29 12:59:27 -070012#include "GrTextureDomain.h"
joshualittac977922014-07-22 09:52:11 -070013
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
18class GrGLMatrixConvolutionEffect;
19
20class GrMatrixConvolutionEffect : public GrSingleTextureEffect {
21public:
joshualittb0a8a372014-09-23 09:50:21 -070022 static GrFragmentProcessor* Create(GrTexture* texture,
23 const SkIRect& bounds,
24 const SkISize& kernelSize,
25 const SkScalar* kernel,
26 SkScalar gain,
27 SkScalar bias,
28 const SkIPoint& kernelOffset,
29 GrTextureDomain::Mode tileMode,
30 bool convolveAlpha) {
joshualittac977922014-07-22 09:52:11 -070031 return SkNEW_ARGS(GrMatrixConvolutionEffect, (texture,
32 bounds,
33 kernelSize,
34 kernel,
35 gain,
36 bias,
37 kernelOffset,
38 tileMode,
39 convolveAlpha));
40 }
joshualitt5acfea72014-08-11 13:55:34 -070041
joshualittb0a8a372014-09-23 09:50:21 -070042 static GrFragmentProcessor* CreateGaussian(GrTexture* texture,
43 const SkIRect& bounds,
44 const SkISize& kernelSize,
45 SkScalar gain,
46 SkScalar bias,
47 const SkIPoint& kernelOffset,
48 GrTextureDomain::Mode tileMode,
49 bool convolveAlpha,
50 SkScalar sigmaX,
51 SkScalar sigmaY);
joshualitt5acfea72014-08-11 13:55:34 -070052
joshualittac977922014-07-22 09:52:11 -070053 virtual ~GrMatrixConvolutionEffect();
54
joshualittac977922014-07-22 09:52:11 -070055 static const char* Name() { return "MatrixConvolution"; }
56 const SkIRect& bounds() const { return fBounds; }
57 const SkISize& kernelSize() const { return fKernelSize; }
58 const float* kernelOffset() const { return fKernelOffset; }
59 const float* kernel() const { return fKernel; }
60 float gain() const { return fGain; }
61 float bias() const { return fBias; }
joshualittac977922014-07-22 09:52:11 -070062 bool convolveAlpha() const { return fConvolveAlpha; }
joshualitt5ae5fc52014-07-29 12:59:27 -070063 const GrTextureDomain& domain() const { return fDomain; }
joshualittac977922014-07-22 09:52:11 -070064
joshualittb0a8a372014-09-23 09:50:21 -070065 typedef GrGLMatrixConvolutionEffect GLProcessor;
joshualittac977922014-07-22 09:52:11 -070066
joshualittb0a8a372014-09-23 09:50:21 -070067 virtual const GrBackendFragmentProcessorFactory& getFactory() const SK_OVERRIDE;
joshualittac977922014-07-22 09:52:11 -070068
69private:
70 GrMatrixConvolutionEffect(GrTexture*,
71 const SkIRect& bounds,
72 const SkISize& kernelSize,
73 const SkScalar* kernel,
74 SkScalar gain,
75 SkScalar bias,
76 const SkIPoint& kernelOffset,
joshualitt5ae5fc52014-07-29 12:59:27 -070077 GrTextureDomain::Mode tileMode,
joshualittac977922014-07-22 09:52:11 -070078 bool convolveAlpha);
79
joshualittb0a8a372014-09-23 09:50:21 -070080 virtual bool onIsEqual(const GrProcessor&) const SK_OVERRIDE;
joshualittac977922014-07-22 09:52:11 -070081
egdaniel1a8ecdf2014-10-03 06:24:12 -070082 virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERRIDE {
83 // TODO: Try to do better?
84 inout->fValidFlags = 0;
85 inout->fIsSingleComponent = false;
86 }
87
joshualitt5ae5fc52014-07-29 12:59:27 -070088 SkIRect fBounds;
89 SkISize fKernelSize;
joshualitt5acfea72014-08-11 13:55:34 -070090 float fKernel[MAX_KERNEL_SIZE];
joshualitt5ae5fc52014-07-29 12:59:27 -070091 float fGain;
92 float fBias;
93 float fKernelOffset[2];
94 bool fConvolveAlpha;
95 GrTextureDomain fDomain;
joshualittac977922014-07-22 09:52:11 -070096
joshualittb0a8a372014-09-23 09:50:21 -070097 GR_DECLARE_FRAGMENT_PROCESSOR_TEST;
joshualittac977922014-07-22 09:52:11 -070098
99 typedef GrSingleTextureEffect INHERITED;
100};
101
102#endif