blob: 6104f11402b958e5daae724fed788ab2afe19f5c [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
joshualittac977922014-07-22 09:52:11 -070018class GrMatrixConvolutionEffect : public GrSingleTextureEffect {
19public:
Robert Phillips296b1cc2017-03-15 10:42:12 -040020 static sk_sp<GrFragmentProcessor> Make(GrResourceProvider* resourceProvider,
Robert Phillips40fd7c92017-01-30 08:06:27 -050021 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>(
Robert Phillips296b1cc2017-03-15 10:42:12 -040031 new GrMatrixConvolutionEffect(resourceProvider, std::move(proxy), bounds, kernelSize,
32 kernel, gain, bias, kernelOffset, tileMode, convolveAlpha));
Robert Phillips40fd7c92017-01-30 08:06:27 -050033 }
34
Robert Phillips296b1cc2017-03-15 10:42:12 -040035 static sk_sp<GrFragmentProcessor> MakeGaussian(GrResourceProvider*,
Robert Phillips40fd7c92017-01-30 08:06:27 -050036 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
joshualittac977922014-07-22 09:52:11 -070047 const SkIRect& bounds() const { return fBounds; }
48 const SkISize& kernelSize() const { return fKernelSize; }
49 const float* kernelOffset() const { return fKernelOffset; }
50 const float* kernel() const { return fKernel; }
51 float gain() const { return fGain; }
52 float bias() const { return fBias; }
joshualittac977922014-07-22 09:52:11 -070053 bool convolveAlpha() const { return fConvolveAlpha; }
joshualitt5ae5fc52014-07-29 12:59:27 -070054 const GrTextureDomain& domain() const { return fDomain; }
joshualittac977922014-07-22 09:52:11 -070055
mtklein36352bf2015-03-25 18:17:31 -070056 const char* name() const override { return "MatrixConvolution"; }
joshualittac977922014-07-22 09:52:11 -070057
joshualittac977922014-07-22 09:52:11 -070058private:
Robert Phillips296b1cc2017-03-15 10:42:12 -040059 GrMatrixConvolutionEffect(GrResourceProvider*,
Robert Phillips40fd7c92017-01-30 08:06:27 -050060 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
egdaniel57d3b032015-11-13 11:57:27 -080070 GrGLSLFragmentProcessor* onCreateGLSLInstance() const override;
wangyixb1daa862015-08-18 11:29:31 -070071
Brian Salomon94efbf52016-11-29 13:43:05 -050072 void onGetGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder*) const override;
wangyix4b3050b2015-08-04 07:59:37 -070073
mtklein36352bf2015-03-25 18:17:31 -070074 bool onIsEqual(const GrFragmentProcessor&) const override;
joshualittac977922014-07-22 09:52:11 -070075
joshualitt5ae5fc52014-07-29 12:59:27 -070076 SkIRect fBounds;
77 SkISize fKernelSize;
joshualitt5acfea72014-08-11 13:55:34 -070078 float fKernel[MAX_KERNEL_SIZE];
joshualitt5ae5fc52014-07-29 12:59:27 -070079 float fGain;
80 float fBias;
81 float fKernelOffset[2];
82 bool fConvolveAlpha;
83 GrTextureDomain fDomain;
joshualittac977922014-07-22 09:52:11 -070084
joshualittb0a8a372014-09-23 09:50:21 -070085 GR_DECLARE_FRAGMENT_PROCESSOR_TEST;
joshualittac977922014-07-22 09:52:11 -070086
87 typedef GrSingleTextureEffect INHERITED;
88};
89
90#endif