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 "src/gpu/effects/GrTextureDomain.h"
12
13// A little bit less than the minimum # uniforms required by DX9SM2 (32).
14// Allows for a 5x5 kernel (or 25x1, for that matter).
15#define MAX_KERNEL_SIZE 25
16
17class GrMatrixConvolutionEffect : public GrFragmentProcessor {
18public:
19 static std::unique_ptr<GrFragmentProcessor> Make(GrSurfaceProxyView srcView,
20 const SkIRect& srcBounds,
21 const SkISize& kernelSize,
22 const SkScalar* kernel,
23 SkScalar gain,
24 SkScalar bias,
25 const SkIPoint& kernelOffset,
26 GrTextureDomain::Mode tileMode,
27 bool convolveAlpha) {
28 return std::unique_ptr<GrFragmentProcessor>(
29 new GrMatrixConvolutionEffect(std::move(srcView), srcBounds, kernelSize, kernel,
30 gain, bias, kernelOffset, tileMode, convolveAlpha));
31 }
32
33 static std::unique_ptr<GrFragmentProcessor> MakeGaussian(GrSurfaceProxyView srcView,
34 const SkIRect& srcBounds,
35 const SkISize& kernelSize,
36 SkScalar gain,
37 SkScalar bias,
38 const SkIPoint& kernelOffset,
39 GrTextureDomain::Mode tileMode,
40 bool convolveAlpha,
41 SkScalar sigmaX,
42 SkScalar sigmaY);
43
44 const SkIRect& bounds() const { return fBounds; }
45 const SkISize& kernelSize() const { return fKernelSize; }
46 const float* kernelOffset() const { return fKernelOffset; }
47 const float* kernel() const { return fKernel; }
48 float gain() const { return fGain; }
49 float bias() const { return fBias; }
50 bool convolveAlpha() const { return fConvolveAlpha; }
51 const GrTextureDomain& domain() const { return fDomain; }
52
53 const char* name() const override { return "MatrixConvolution"; }
54
55 std::unique_ptr<GrFragmentProcessor> clone() const override;
56
57private:
58 // srcProxy is the texture that is going to be convolved
59 // srcBounds is the subset of 'srcProxy' that will be used (e.g., for clamp mode)
60 GrMatrixConvolutionEffect(GrSurfaceProxyView srcView,
61 const SkIRect& srcBounds,
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 GrMatrixConvolutionEffect(const GrMatrixConvolutionEffect&);
71
72 GrGLSLFragmentProcessor* onCreateGLSLInstance() const override;
73
74 void onGetGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder*) const override;
75
76 bool onIsEqual(const GrFragmentProcessor&) const override;
77
78 const TextureSampler& onTextureSampler(int i) const override { return fTextureSampler; }
79
80 GrCoordTransform fCoordTransform;
81 GrTextureDomain fDomain;
82 TextureSampler fTextureSampler;
83 SkIRect fBounds;
84 SkISize fKernelSize;
85 float fKernel[MAX_KERNEL_SIZE];
86 float fGain;
87 float fBias;
88 float fKernelOffset[2];
89 bool fConvolveAlpha;
90
91 GR_DECLARE_FRAGMENT_PROCESSOR_TEST
92
93 typedef GrFragmentProcessor INHERITED;
94};
95
96#endif
97