OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2014 Google Inc. | 2 * Copyright 2014 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 #include "gl/builders/GrGLProgramBuilder.h" | |
8 #include "GrMatrixConvolutionEffect.h" | 7 #include "GrMatrixConvolutionEffect.h" |
9 #include "gl/GrGLProcessor.h" | 8 #include "gl/GrGLProcessor.h" |
10 #include "gl/GrGLSL.h" | 9 #include "gl/GrGLSL.h" |
11 #include "gl/GrGLTexture.h" | 10 #include "gl/GrGLTexture.h" |
12 #include "GrTBackendProcessorFactory.h" | 11 #include "gl/builders/GrGLProgramBuilder.h" |
13 | 12 |
14 class GrGLMatrixConvolutionEffect : public GrGLFragmentProcessor { | 13 class GrGLMatrixConvolutionEffect : public GrGLFragmentProcessor { |
15 public: | 14 public: |
16 GrGLMatrixConvolutionEffect(const GrBackendProcessorFactory& factory, | 15 GrGLMatrixConvolutionEffect(const GrProcessor&); |
17 const GrProcessor&); | |
18 virtual void emitCode(GrGLFPBuilder*, | 16 virtual void emitCode(GrGLFPBuilder*, |
19 const GrFragmentProcessor&, | 17 const GrFragmentProcessor&, |
20 const char* outputColor, | 18 const char* outputColor, |
21 const char* inputColor, | 19 const char* inputColor, |
22 const TransformedCoordsArray&, | 20 const TransformedCoordsArray&, |
23 const TextureSamplerArray&) SK_OVERRIDE; | 21 const TextureSamplerArray&) SK_OVERRIDE; |
24 | 22 |
25 static inline void GenKey(const GrProcessor&, const GrGLCaps&, GrProcessorKe
yBuilder*); | 23 static inline void GenKey(const GrProcessor&, const GrGLCaps&, GrProcessorKe
yBuilder*); |
26 | 24 |
27 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_O
VERRIDE; | 25 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_O
VERRIDE; |
28 | 26 |
29 private: | 27 private: |
30 typedef GrGLProgramDataManager::UniformHandle UniformHandle; | 28 typedef GrGLProgramDataManager::UniformHandle UniformHandle; |
31 SkISize fKernelSize; | 29 SkISize fKernelSize; |
32 bool fConvolveAlpha; | 30 bool fConvolveAlpha; |
33 | 31 |
34 UniformHandle fBoundsUni; | 32 UniformHandle fBoundsUni; |
35 UniformHandle fKernelUni; | 33 UniformHandle fKernelUni; |
36 UniformHandle fImageIncrementUni; | 34 UniformHandle fImageIncrementUni; |
37 UniformHandle fKernelOffsetUni; | 35 UniformHandle fKernelOffsetUni; |
38 UniformHandle fGainUni; | 36 UniformHandle fGainUni; |
39 UniformHandle fBiasUni; | 37 UniformHandle fBiasUni; |
40 GrTextureDomain::GLDomain fDomain; | 38 GrTextureDomain::GLDomain fDomain; |
41 | 39 |
42 typedef GrGLFragmentProcessor INHERITED; | 40 typedef GrGLFragmentProcessor INHERITED; |
43 }; | 41 }; |
44 | 42 |
45 GrGLMatrixConvolutionEffect::GrGLMatrixConvolutionEffect(const GrBackendProcesso
rFactory& factory, | 43 GrGLMatrixConvolutionEffect::GrGLMatrixConvolutionEffect(const GrProcessor& proc
essor) { |
46 const GrProcessor& proc
essor) | |
47 : INHERITED(factory) { | |
48 const GrMatrixConvolutionEffect& m = processor.cast<GrMatrixConvolutionEffec
t>(); | 44 const GrMatrixConvolutionEffect& m = processor.cast<GrMatrixConvolutionEffec
t>(); |
49 fKernelSize = m.kernelSize(); | 45 fKernelSize = m.kernelSize(); |
50 fConvolveAlpha = m.convolveAlpha(); | 46 fConvolveAlpha = m.convolveAlpha(); |
51 } | 47 } |
52 | 48 |
53 void GrGLMatrixConvolutionEffect::emitCode(GrGLFPBuilder* builder, | 49 void GrGLMatrixConvolutionEffect::emitCode(GrGLFPBuilder* builder, |
54 const GrFragmentProcessor& fp, | 50 const GrFragmentProcessor& fp, |
55 const char* outputColor, | 51 const char* outputColor, |
56 const char* inputColor, | 52 const char* inputColor, |
57 const TransformedCoordsArray& coords, | 53 const TransformedCoordsArray& coords, |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
153 SkScalar bias, | 149 SkScalar bias, |
154 const SkIPoint& kernelOffse
t, | 150 const SkIPoint& kernelOffse
t, |
155 GrTextureDomain::Mode tileM
ode, | 151 GrTextureDomain::Mode tileM
ode, |
156 bool convolveAlpha) | 152 bool convolveAlpha) |
157 : INHERITED(texture, GrCoordTransform::MakeDivByTextureWHMatrix(texture)), | 153 : INHERITED(texture, GrCoordTransform::MakeDivByTextureWHMatrix(texture)), |
158 fKernelSize(kernelSize), | 154 fKernelSize(kernelSize), |
159 fGain(SkScalarToFloat(gain)), | 155 fGain(SkScalarToFloat(gain)), |
160 fBias(SkScalarToFloat(bias) / 255.0f), | 156 fBias(SkScalarToFloat(bias) / 255.0f), |
161 fConvolveAlpha(convolveAlpha), | 157 fConvolveAlpha(convolveAlpha), |
162 fDomain(GrTextureDomain::MakeTexelDomain(texture, bounds), tileMode) { | 158 fDomain(GrTextureDomain::MakeTexelDomain(texture, bounds), tileMode) { |
| 159 this->initClassID<GrMatrixConvolutionEffect>(); |
163 for (int i = 0; i < kernelSize.width() * kernelSize.height(); i++) { | 160 for (int i = 0; i < kernelSize.width() * kernelSize.height(); i++) { |
164 fKernel[i] = SkScalarToFloat(kernel[i]); | 161 fKernel[i] = SkScalarToFloat(kernel[i]); |
165 } | 162 } |
166 fKernelOffset[0] = static_cast<float>(kernelOffset.x()); | 163 fKernelOffset[0] = static_cast<float>(kernelOffset.x()); |
167 fKernelOffset[1] = static_cast<float>(kernelOffset.y()); | 164 fKernelOffset[1] = static_cast<float>(kernelOffset.y()); |
168 } | 165 } |
169 | 166 |
170 GrMatrixConvolutionEffect::~GrMatrixConvolutionEffect() { | 167 GrMatrixConvolutionEffect::~GrMatrixConvolutionEffect() { |
171 } | 168 } |
172 | 169 |
173 const GrBackendFragmentProcessorFactory& GrMatrixConvolutionEffect::getFactory()
const { | 170 void GrMatrixConvolutionEffect::getGLProcessorKey(const GrGLCaps& caps, |
174 return GrTBackendFragmentProcessorFactory<GrMatrixConvolutionEffect>::getIns
tance(); | 171 GrProcessorKeyBuilder* b) cons
t { |
| 172 GrGLMatrixConvolutionEffect::GenKey(*this, caps, b); |
| 173 } |
| 174 |
| 175 GrGLFragmentProcessor* GrMatrixConvolutionEffect::createGLInstance() const { |
| 176 return SkNEW_ARGS(GrGLMatrixConvolutionEffect, (*this)); |
175 } | 177 } |
176 | 178 |
177 bool GrMatrixConvolutionEffect::onIsEqual(const GrFragmentProcessor& sBase) cons
t { | 179 bool GrMatrixConvolutionEffect::onIsEqual(const GrFragmentProcessor& sBase) cons
t { |
178 const GrMatrixConvolutionEffect& s = sBase.cast<GrMatrixConvolutionEffect>()
; | 180 const GrMatrixConvolutionEffect& s = sBase.cast<GrMatrixConvolutionEffect>()
; |
179 return fKernelSize == s.kernelSize() && | 181 return fKernelSize == s.kernelSize() && |
180 !memcmp(fKernel, s.kernel(), | 182 !memcmp(fKernel, s.kernel(), |
181 fKernelSize.width() * fKernelSize.height() * sizeof(float)) &
& | 183 fKernelSize.width() * fKernelSize.height() * sizeof(float)) &
& |
182 fGain == s.gain() && | 184 fGain == s.gain() && |
183 fBias == s.bias() && | 185 fBias == s.bias() && |
184 fKernelOffset == s.kernelOffset() && | 186 fKernelOffset == s.kernelOffset() && |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
263 return GrMatrixConvolutionEffect::Create(textures[texIdx], | 265 return GrMatrixConvolutionEffect::Create(textures[texIdx], |
264 bounds, | 266 bounds, |
265 kernelSize, | 267 kernelSize, |
266 kernel.get(), | 268 kernel.get(), |
267 gain, | 269 gain, |
268 bias, | 270 bias, |
269 kernelOffset, | 271 kernelOffset, |
270 tileMode, | 272 tileMode, |
271 convolveAlpha); | 273 convolveAlpha); |
272 } | 274 } |
OLD | NEW |