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 | 7 |
8 #include "GrOvalEffect.h" | 8 #include "GrOvalEffect.h" |
9 | 9 |
10 #include "GrFragmentProcessor.h" | 10 #include "GrFragmentProcessor.h" |
11 #include "GrInvariantOutput.h" | 11 #include "GrInvariantOutput.h" |
12 #include "SkRect.h" | 12 #include "SkRect.h" |
13 #include "gl/GrGLFragmentProcessor.h" | 13 #include "gl/GrGLFragmentProcessor.h" |
14 #include "gl/builders/GrGLProgramBuilder.h" | 14 #include "gl/builders/GrGLProgramBuilder.h" |
| 15 #include "glsl/GrGLSLProgramDataManager.h" |
15 | 16 |
16 ////////////////////////////////////////////////////////////////////////////// | 17 ////////////////////////////////////////////////////////////////////////////// |
17 | 18 |
18 class CircleEffect : public GrFragmentProcessor { | 19 class CircleEffect : public GrFragmentProcessor { |
19 public: | 20 public: |
20 static GrFragmentProcessor* Create(GrPrimitiveEdgeType, const SkPoint& cente
r, SkScalar radius); | 21 static GrFragmentProcessor* Create(GrPrimitiveEdgeType, const SkPoint& cente
r, SkScalar radius); |
21 | 22 |
22 virtual ~CircleEffect() {}; | 23 virtual ~CircleEffect() {}; |
23 | 24 |
24 const char* name() const override { return "Circle"; } | 25 const char* name() const override { return "Circle"; } |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
91 | 92 |
92 class GLCircleEffect : public GrGLFragmentProcessor { | 93 class GLCircleEffect : public GrGLFragmentProcessor { |
93 public: | 94 public: |
94 GLCircleEffect(const GrProcessor&); | 95 GLCircleEffect(const GrProcessor&); |
95 | 96 |
96 virtual void emitCode(EmitArgs&) override; | 97 virtual void emitCode(EmitArgs&) override; |
97 | 98 |
98 static inline void GenKey(const GrProcessor&, const GrGLSLCaps&, GrProcessor
KeyBuilder*); | 99 static inline void GenKey(const GrProcessor&, const GrGLSLCaps&, GrProcessor
KeyBuilder*); |
99 | 100 |
100 protected: | 101 protected: |
101 void onSetData(const GrGLProgramDataManager&, const GrProcessor&) override; | 102 void onSetData(const GrGLSLProgramDataManager&, const GrProcessor&) override
; |
102 | 103 |
103 private: | 104 private: |
104 GrGLProgramDataManager::UniformHandle fCircleUniform; | 105 GrGLSLProgramDataManager::UniformHandle fCircleUniform; |
105 SkPoint fPrevCenter; | 106 SkPoint fPrevCenter; |
106 SkScalar fPrevRadius; | 107 SkScalar fPrevRadius; |
107 | 108 |
108 typedef GrGLFragmentProcessor INHERITED; | 109 typedef GrGLFragmentProcessor INHERITED; |
109 }; | 110 }; |
110 | 111 |
111 GLCircleEffect::GLCircleEffect(const GrProcessor&) { | 112 GLCircleEffect::GLCircleEffect(const GrProcessor&) { |
112 fPrevRadius = -1.f; | 113 fPrevRadius = -1.f; |
113 } | 114 } |
114 | 115 |
115 void GLCircleEffect::emitCode(EmitArgs& args) { | 116 void GLCircleEffect::emitCode(EmitArgs& args) { |
116 const CircleEffect& ce = args.fFp.cast<CircleEffect>(); | 117 const CircleEffect& ce = args.fFp.cast<CircleEffect>(); |
(...skipping 29 matching lines...) Expand all Loading... |
146 fsBuilder->codeAppendf("\t\t%s = %s;\n", args.fOutputColor, | 147 fsBuilder->codeAppendf("\t\t%s = %s;\n", args.fOutputColor, |
147 (GrGLSLExpr4(args.fInputColor) * GrGLSLExpr1("d")).c_
str()); | 148 (GrGLSLExpr4(args.fInputColor) * GrGLSLExpr1("d")).c_
str()); |
148 } | 149 } |
149 | 150 |
150 void GLCircleEffect::GenKey(const GrProcessor& processor, const GrGLSLCaps&, | 151 void GLCircleEffect::GenKey(const GrProcessor& processor, const GrGLSLCaps&, |
151 GrProcessorKeyBuilder* b) { | 152 GrProcessorKeyBuilder* b) { |
152 const CircleEffect& ce = processor.cast<CircleEffect>(); | 153 const CircleEffect& ce = processor.cast<CircleEffect>(); |
153 b->add32(ce.getEdgeType()); | 154 b->add32(ce.getEdgeType()); |
154 } | 155 } |
155 | 156 |
156 void GLCircleEffect::onSetData(const GrGLProgramDataManager& pdman, const GrProc
essor& processor) { | 157 void GLCircleEffect::onSetData(const GrGLSLProgramDataManager& pdman, |
| 158 const GrProcessor& processor) { |
157 const CircleEffect& ce = processor.cast<CircleEffect>(); | 159 const CircleEffect& ce = processor.cast<CircleEffect>(); |
158 if (ce.getRadius() != fPrevRadius || ce.getCenter() != fPrevCenter) { | 160 if (ce.getRadius() != fPrevRadius || ce.getCenter() != fPrevCenter) { |
159 SkScalar radius = ce.getRadius(); | 161 SkScalar radius = ce.getRadius(); |
160 if (GrProcessorEdgeTypeIsInverseFill(ce.getEdgeType())) { | 162 if (GrProcessorEdgeTypeIsInverseFill(ce.getEdgeType())) { |
161 radius -= 0.5f; | 163 radius -= 0.5f; |
162 } else { | 164 } else { |
163 radius += 0.5f; | 165 radius += 0.5f; |
164 } | 166 } |
165 pdman.set4f(fCircleUniform, ce.getCenter().fX, ce.getCenter().fY, radius
, | 167 pdman.set4f(fCircleUniform, ce.getCenter().fX, ce.getCenter().fY, radius
, |
166 SkScalarInvert(radius)); | 168 SkScalarInvert(radius)); |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
262 | 264 |
263 class GLEllipseEffect : public GrGLFragmentProcessor { | 265 class GLEllipseEffect : public GrGLFragmentProcessor { |
264 public: | 266 public: |
265 GLEllipseEffect(const GrProcessor&); | 267 GLEllipseEffect(const GrProcessor&); |
266 | 268 |
267 virtual void emitCode(EmitArgs&) override; | 269 virtual void emitCode(EmitArgs&) override; |
268 | 270 |
269 static inline void GenKey(const GrProcessor&, const GrGLSLCaps&, GrProcessor
KeyBuilder*); | 271 static inline void GenKey(const GrProcessor&, const GrGLSLCaps&, GrProcessor
KeyBuilder*); |
270 | 272 |
271 protected: | 273 protected: |
272 void onSetData(const GrGLProgramDataManager&, const GrProcessor&) override; | 274 void onSetData(const GrGLSLProgramDataManager&, const GrProcessor&) override
; |
273 | 275 |
274 private: | 276 private: |
275 GrGLProgramDataManager::UniformHandle fEllipseUniform; | 277 GrGLSLProgramDataManager::UniformHandle fEllipseUniform; |
276 SkPoint fPrevCenter; | 278 SkPoint fPrevCenter; |
277 SkVector fPrevRadii; | 279 SkVector fPrevRadii; |
278 | 280 |
279 typedef GrGLFragmentProcessor INHERITED; | 281 typedef GrGLFragmentProcessor INHERITED; |
280 }; | 282 }; |
281 | 283 |
282 GLEllipseEffect::GLEllipseEffect(const GrProcessor& effect) { | 284 GLEllipseEffect::GLEllipseEffect(const GrProcessor& effect) { |
283 fPrevRadii.fX = -1.f; | 285 fPrevRadii.fX = -1.f; |
284 } | 286 } |
285 | 287 |
286 void GLEllipseEffect::emitCode(EmitArgs& args) { | 288 void GLEllipseEffect::emitCode(EmitArgs& args) { |
287 const EllipseEffect& ee = args.fFp.cast<EllipseEffect>(); | 289 const EllipseEffect& ee = args.fFp.cast<EllipseEffect>(); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
327 fsBuilder->codeAppendf("\t\t%s = %s;\n", args.fOutputColor, | 329 fsBuilder->codeAppendf("\t\t%s = %s;\n", args.fOutputColor, |
328 (GrGLSLExpr4(args.fInputColor) * GrGLSLExpr1("alpha")
).c_str()); | 330 (GrGLSLExpr4(args.fInputColor) * GrGLSLExpr1("alpha")
).c_str()); |
329 } | 331 } |
330 | 332 |
331 void GLEllipseEffect::GenKey(const GrProcessor& effect, const GrGLSLCaps&, | 333 void GLEllipseEffect::GenKey(const GrProcessor& effect, const GrGLSLCaps&, |
332 GrProcessorKeyBuilder* b) { | 334 GrProcessorKeyBuilder* b) { |
333 const EllipseEffect& ee = effect.cast<EllipseEffect>(); | 335 const EllipseEffect& ee = effect.cast<EllipseEffect>(); |
334 b->add32(ee.getEdgeType()); | 336 b->add32(ee.getEdgeType()); |
335 } | 337 } |
336 | 338 |
337 void GLEllipseEffect::onSetData(const GrGLProgramDataManager& pdman, const GrPro
cessor& effect) { | 339 void GLEllipseEffect::onSetData(const GrGLSLProgramDataManager& pdman, |
| 340 const GrProcessor& effect) { |
338 const EllipseEffect& ee = effect.cast<EllipseEffect>(); | 341 const EllipseEffect& ee = effect.cast<EllipseEffect>(); |
339 if (ee.getRadii() != fPrevRadii || ee.getCenter() != fPrevCenter) { | 342 if (ee.getRadii() != fPrevRadii || ee.getCenter() != fPrevCenter) { |
340 SkScalar invRXSqd = 1.f / (ee.getRadii().fX * ee.getRadii().fX); | 343 SkScalar invRXSqd = 1.f / (ee.getRadii().fX * ee.getRadii().fX); |
341 SkScalar invRYSqd = 1.f / (ee.getRadii().fY * ee.getRadii().fY); | 344 SkScalar invRYSqd = 1.f / (ee.getRadii().fY * ee.getRadii().fY); |
342 pdman.set4f(fEllipseUniform, ee.getCenter().fX, ee.getCenter().fY, invRX
Sqd, invRYSqd); | 345 pdman.set4f(fEllipseUniform, ee.getCenter().fX, ee.getCenter().fY, invRX
Sqd, invRYSqd); |
343 fPrevCenter = ee.getCenter(); | 346 fPrevCenter = ee.getCenter(); |
344 fPrevRadii = ee.getRadii(); | 347 fPrevRadii = ee.getRadii(); |
345 } | 348 } |
346 } | 349 } |
347 | 350 |
(...skipping 20 matching lines...) Expand all Loading... |
368 w /= 2; | 371 w /= 2; |
369 return CircleEffect::Create(edgeType, SkPoint::Make(oval.fLeft + w, oval
.fTop + w), w); | 372 return CircleEffect::Create(edgeType, SkPoint::Make(oval.fLeft + w, oval
.fTop + w), w); |
370 } else { | 373 } else { |
371 w /= 2; | 374 w /= 2; |
372 h /= 2; | 375 h /= 2; |
373 return EllipseEffect::Create(edgeType, SkPoint::Make(oval.fLeft + w, ova
l.fTop + h), w, h); | 376 return EllipseEffect::Create(edgeType, SkPoint::Make(oval.fLeft + w, ova
l.fTop + h), w, h); |
374 } | 377 } |
375 | 378 |
376 return nullptr; | 379 return nullptr; |
377 } | 380 } |
OLD | NEW |