blob: 5aee6c53afd859d16ef67d11247a2aacc87a03c6 [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
bsalomon0e08fc12014-10-15 08:19:04 -070080 virtual bool onIsEqual(const GrFragmentProcessor&) 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?
egdanielccb2e382014-10-13 12:53:46 -070084 inout->mulByUnknownColor();
egdaniel1a8ecdf2014-10-03 06:24:12 -070085 }
86
joshualitt5ae5fc52014-07-29 12:59:27 -070087 SkIRect fBounds;
88 SkISize fKernelSize;
joshualitt5acfea72014-08-11 13:55:34 -070089 float fKernel[MAX_KERNEL_SIZE];
joshualitt5ae5fc52014-07-29 12:59:27 -070090 float fGain;
91 float fBias;
92 float fKernelOffset[2];
93 bool fConvolveAlpha;
94 GrTextureDomain fDomain;
joshualittac977922014-07-22 09:52:11 -070095
joshualittb0a8a372014-09-23 09:50:21 -070096 GR_DECLARE_FRAGMENT_PROCESSOR_TEST;
joshualittac977922014-07-22 09:52:11 -070097
98 typedef GrSingleTextureEffect INHERITED;
99};
100
101#endif