Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(141)

Side by Side Diff: src/gpu/effects/GrOvalEffect.cpp

Issue 778453002: Remove backend factories (Closed) Base URL: https://skia.googlesource.com/skia.git@unichoice
Patch Set: cleanup Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 "gl/builders/GrGLProgramBuilder.h"
9 #include "GrOvalEffect.h" 8 #include "GrOvalEffect.h"
9
10 #include "GrFragmentProcessor.h"
10 #include "GrInvariantOutput.h" 11 #include "GrInvariantOutput.h"
12 #include "SkRect.h"
11 #include "gl/GrGLProcessor.h" 13 #include "gl/GrGLProcessor.h"
12 #include "gl/GrGLSL.h" 14 #include "gl/GrGLSL.h"
13 #include "GrTBackendProcessorFactory.h" 15 #include "gl/builders/GrGLProgramBuilder.h"
14
15 #include "SkRect.h"
16 16
17 ////////////////////////////////////////////////////////////////////////////// 17 //////////////////////////////////////////////////////////////////////////////
18 18
19 class GLCircleEffect;
20
21 class CircleEffect : public GrFragmentProcessor { 19 class CircleEffect : public GrFragmentProcessor {
22 public: 20 public:
23 static GrFragmentProcessor* Create(GrPrimitiveEdgeType, const SkPoint& cente r, SkScalar radius); 21 static GrFragmentProcessor* Create(GrPrimitiveEdgeType, const SkPoint& cente r, SkScalar radius);
24 22
25 virtual ~CircleEffect() {}; 23 virtual ~CircleEffect() {};
26 static const char* Name() { return "Circle"; } 24
25 virtual const char* name() const SK_OVERRIDE { return "Circle"; }
26
27 virtual void getGLProcessorKey(const GrGLCaps&, GrProcessorKeyBuilder*) cons t SK_OVERRIDE;
28
29 virtual GrGLFragmentProcessor* createGLInstance() const SK_OVERRIDE;
30
31 virtual uint32_t classID() const {
32 static uint32_t id = GenClassID();
33 return id;
34 }
27 35
28 const SkPoint& getCenter() const { return fCenter; } 36 const SkPoint& getCenter() const { return fCenter; }
29 SkScalar getRadius() const { return fRadius; } 37 SkScalar getRadius() const { return fRadius; }
30 38
31 GrPrimitiveEdgeType getEdgeType() const { return fEdgeType; } 39 GrPrimitiveEdgeType getEdgeType() const { return fEdgeType; }
32 40
33 typedef GLCircleEffect GLProcessor;
34
35 virtual const GrBackendFragmentProcessorFactory& getFactory() const SK_OVERR IDE;
36
37 private: 41 private:
38 CircleEffect(GrPrimitiveEdgeType, const SkPoint& center, SkScalar radius); 42 CircleEffect(GrPrimitiveEdgeType, const SkPoint& center, SkScalar radius);
39 43
40 virtual bool onIsEqual(const GrFragmentProcessor&) const SK_OVERRIDE; 44 virtual bool onIsEqual(const GrFragmentProcessor&) const SK_OVERRIDE;
41 45
42 virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVE RRIDE; 46 virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVE RRIDE;
43 47
44 SkPoint fCenter; 48 SkPoint fCenter;
45 SkScalar fRadius; 49 SkScalar fRadius;
46 GrPrimitiveEdgeType fEdgeType; 50 GrPrimitiveEdgeType fEdgeType;
47 51
48 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; 52 GR_DECLARE_FRAGMENT_PROCESSOR_TEST;
49 53
50 typedef GrFragmentProcessor INHERITED; 54 typedef GrFragmentProcessor INHERITED;
51 }; 55 };
52 56
53 GrFragmentProcessor* CircleEffect::Create(GrPrimitiveEdgeType edgeType, const Sk Point& center, 57 GrFragmentProcessor* CircleEffect::Create(GrPrimitiveEdgeType edgeType, const Sk Point& center,
54 SkScalar radius) { 58 SkScalar radius) {
55 SkASSERT(radius >= 0); 59 SkASSERT(radius >= 0);
56 return SkNEW_ARGS(CircleEffect, (edgeType, center, radius)); 60 return SkNEW_ARGS(CircleEffect, (edgeType, center, radius));
57 } 61 }
58 62
59 void CircleEffect::onComputeInvariantOutput(GrInvariantOutput* inout) const { 63 void CircleEffect::onComputeInvariantOutput(GrInvariantOutput* inout) const {
60 inout->mulByUnknownAlpha(); 64 inout->mulByUnknownAlpha();
61 } 65 }
62 66
63 const GrBackendFragmentProcessorFactory& CircleEffect::getFactory() const {
64 return GrTBackendFragmentProcessorFactory<CircleEffect>::getInstance();
65 }
66
67 CircleEffect::CircleEffect(GrPrimitiveEdgeType edgeType, const SkPoint& c, SkSca lar r) 67 CircleEffect::CircleEffect(GrPrimitiveEdgeType edgeType, const SkPoint& c, SkSca lar r)
68 : fCenter(c) 68 : fCenter(c)
69 , fRadius(r) 69 , fRadius(r)
70 , fEdgeType(edgeType) { 70 , fEdgeType(edgeType) {
71 this->setWillReadFragmentPosition(); 71 this->setWillReadFragmentPosition();
72 } 72 }
73 73
74 bool CircleEffect::onIsEqual(const GrFragmentProcessor& other) const { 74 bool CircleEffect::onIsEqual(const GrFragmentProcessor& other) const {
75 const CircleEffect& ce = other.cast<CircleEffect>(); 75 const CircleEffect& ce = other.cast<CircleEffect>();
76 return fEdgeType == ce.fEdgeType && fCenter == ce.fCenter && fRadius == ce.f Radius; 76 return fEdgeType == ce.fEdgeType && fCenter == ce.fCenter && fRadius == ce.f Radius;
(...skipping 15 matching lines...) Expand all
92 do { 92 do {
93 et = (GrPrimitiveEdgeType)random->nextULessThan(kGrProcessorEdgeTypeCnt) ; 93 et = (GrPrimitiveEdgeType)random->nextULessThan(kGrProcessorEdgeTypeCnt) ;
94 } while (kHairlineAA_GrProcessorEdgeType == et); 94 } while (kHairlineAA_GrProcessorEdgeType == et);
95 return CircleEffect::Create(et, center, radius); 95 return CircleEffect::Create(et, center, radius);
96 } 96 }
97 97
98 ////////////////////////////////////////////////////////////////////////////// 98 //////////////////////////////////////////////////////////////////////////////
99 99
100 class GLCircleEffect : public GrGLFragmentProcessor { 100 class GLCircleEffect : public GrGLFragmentProcessor {
101 public: 101 public:
102 GLCircleEffect(const GrBackendProcessorFactory&, const GrProcessor&); 102 GLCircleEffect(const GrProcessor&);
103 103
104 virtual void emitCode(GrGLFPBuilder* builder, 104 virtual void emitCode(GrGLFPBuilder* builder,
105 const GrFragmentProcessor& fp, 105 const GrFragmentProcessor& fp,
106 const char* outputColor, 106 const char* outputColor,
107 const char* inputColor, 107 const char* inputColor,
108 const TransformedCoordsArray&, 108 const TransformedCoordsArray&,
109 const TextureSamplerArray&) SK_OVERRIDE; 109 const TextureSamplerArray&) SK_OVERRIDE;
110 110
111 static inline void GenKey(const GrProcessor&, const GrGLCaps&, GrProcessorKe yBuilder*); 111 static inline void GenKey(const GrProcessor&, const GrGLCaps&, GrProcessorKe yBuilder*);
112 112
113 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_O VERRIDE; 113 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_O VERRIDE;
114 114
115 private: 115 private:
116 GrGLProgramDataManager::UniformHandle fCircleUniform; 116 GrGLProgramDataManager::UniformHandle fCircleUniform;
117 SkPoint fPrevCenter; 117 SkPoint fPrevCenter;
118 SkScalar fPrevRadius; 118 SkScalar fPrevRadius;
119 119
120 typedef GrGLFragmentProcessor INHERITED; 120 typedef GrGLFragmentProcessor INHERITED;
121 }; 121 };
122 122
123 GLCircleEffect::GLCircleEffect(const GrBackendProcessorFactory& factory, 123 GLCircleEffect::GLCircleEffect(const GrProcessor&) {
124 const GrProcessor&)
125 : INHERITED (factory) {
126 fPrevRadius = -1.f; 124 fPrevRadius = -1.f;
127 } 125 }
128 126
129 void GLCircleEffect::emitCode(GrGLFPBuilder* builder, 127 void GLCircleEffect::emitCode(GrGLFPBuilder* builder,
130 const GrFragmentProcessor& fp, 128 const GrFragmentProcessor& fp,
131 const char* outputColor, 129 const char* outputColor,
132 const char* inputColor, 130 const char* inputColor,
133 const TransformedCoordsArray&, 131 const TransformedCoordsArray&,
134 const TextureSamplerArray& samplers) { 132 const TextureSamplerArray& samplers) {
135 const CircleEffect& ce = fp.cast<CircleEffect>(); 133 const CircleEffect& ce = fp.cast<CircleEffect>();
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
176 radius -= 0.5f; 174 radius -= 0.5f;
177 } else { 175 } else {
178 radius += 0.5f; 176 radius += 0.5f;
179 } 177 }
180 pdman.set3f(fCircleUniform, ce.getCenter().fX, ce.getCenter().fY, radius ); 178 pdman.set3f(fCircleUniform, ce.getCenter().fX, ce.getCenter().fY, radius );
181 fPrevCenter = ce.getCenter(); 179 fPrevCenter = ce.getCenter();
182 fPrevRadius = ce.getRadius(); 180 fPrevRadius = ce.getRadius();
183 } 181 }
184 } 182 }
185 183
184 //////////////////////////////////////////////////////////////////////////////// ///////////////////
185
186 void CircleEffect::getGLProcessorKey(const GrGLCaps& caps,
187 GrProcessorKeyBuilder* b) const {
188 GLCircleEffect::GenKey(*this, caps, b);
189 }
190
191 GrGLFragmentProcessor* CircleEffect::createGLInstance() const {
192 return SkNEW_ARGS(GLCircleEffect, (*this));
193 }
194
186 ////////////////////////////////////////////////////////////////////////////// 195 //////////////////////////////////////////////////////////////////////////////
187 196
188 class GLEllipseEffect;
189
190 class EllipseEffect : public GrFragmentProcessor { 197 class EllipseEffect : public GrFragmentProcessor {
191 public: 198 public:
192 static GrFragmentProcessor* Create(GrPrimitiveEdgeType, const SkPoint& cente r, SkScalar rx, 199 static GrFragmentProcessor* Create(GrPrimitiveEdgeType, const SkPoint& cente r, SkScalar rx,
193 SkScalar ry); 200 SkScalar ry);
194 201
195 virtual ~EllipseEffect() {}; 202 virtual ~EllipseEffect() {};
196 static const char* Name() { return "Ellipse"; } 203
204 virtual const char* name() const SK_OVERRIDE { return "Ellipse"; }
205
206 virtual void getGLProcessorKey(const GrGLCaps&, GrProcessorKeyBuilder*) cons t SK_OVERRIDE;
207
208 virtual GrGLFragmentProcessor* createGLInstance() const SK_OVERRIDE;
209
210 virtual uint32_t classID() const {
211 static uint32_t id = GenClassID();
212 return id;
213 }
197 214
198 const SkPoint& getCenter() const { return fCenter; } 215 const SkPoint& getCenter() const { return fCenter; }
199 SkVector getRadii() const { return fRadii; } 216 SkVector getRadii() const { return fRadii; }
200 217
201 GrPrimitiveEdgeType getEdgeType() const { return fEdgeType; } 218 GrPrimitiveEdgeType getEdgeType() const { return fEdgeType; }
202 219
203 typedef GLEllipseEffect GLProcessor;
204
205 virtual const GrBackendFragmentProcessorFactory& getFactory() const SK_OVERR IDE;
206
207 private: 220 private:
208 EllipseEffect(GrPrimitiveEdgeType, const SkPoint& center, SkScalar rx, SkSca lar ry); 221 EllipseEffect(GrPrimitiveEdgeType, const SkPoint& center, SkScalar rx, SkSca lar ry);
209 222
210 virtual bool onIsEqual(const GrFragmentProcessor&) const SK_OVERRIDE; 223 virtual bool onIsEqual(const GrFragmentProcessor&) const SK_OVERRIDE;
211 224
212 virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVE RRIDE; 225 virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVE RRIDE;
213 226
214 SkPoint fCenter; 227 SkPoint fCenter;
215 SkVector fRadii; 228 SkVector fRadii;
216 GrPrimitiveEdgeType fEdgeType; 229 GrPrimitiveEdgeType fEdgeType;
217 230
218 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; 231 GR_DECLARE_FRAGMENT_PROCESSOR_TEST;
219 232
220 typedef GrFragmentProcessor INHERITED; 233 typedef GrFragmentProcessor INHERITED;
221 }; 234 };
222 235
223 GrFragmentProcessor* EllipseEffect::Create(GrPrimitiveEdgeType edgeType, 236 GrFragmentProcessor* EllipseEffect::Create(GrPrimitiveEdgeType edgeType,
224 const SkPoint& center, 237 const SkPoint& center,
225 SkScalar rx, 238 SkScalar rx,
226 SkScalar ry) { 239 SkScalar ry) {
227 SkASSERT(rx >= 0 && ry >= 0); 240 SkASSERT(rx >= 0 && ry >= 0);
228 return SkNEW_ARGS(EllipseEffect, (edgeType, center, rx, ry)); 241 return SkNEW_ARGS(EllipseEffect, (edgeType, center, rx, ry));
229 } 242 }
230 243
231 void EllipseEffect::onComputeInvariantOutput(GrInvariantOutput* inout) const { 244 void EllipseEffect::onComputeInvariantOutput(GrInvariantOutput* inout) const {
232 inout->mulByUnknownAlpha(); 245 inout->mulByUnknownAlpha();
233 } 246 }
234 247
235 const GrBackendFragmentProcessorFactory& EllipseEffect::getFactory() const {
236 return GrTBackendFragmentProcessorFactory<EllipseEffect>::getInstance();
237 }
238
239 EllipseEffect::EllipseEffect(GrPrimitiveEdgeType edgeType, const SkPoint& c, SkS calar rx, SkScalar ry) 248 EllipseEffect::EllipseEffect(GrPrimitiveEdgeType edgeType, const SkPoint& c, SkS calar rx, SkScalar ry)
240 : fCenter(c) 249 : fCenter(c)
241 , fRadii(SkVector::Make(rx, ry)) 250 , fRadii(SkVector::Make(rx, ry))
242 , fEdgeType(edgeType) { 251 , fEdgeType(edgeType) {
243 this->setWillReadFragmentPosition(); 252 this->setWillReadFragmentPosition();
244 } 253 }
245 254
246 bool EllipseEffect::onIsEqual(const GrFragmentProcessor& other) const { 255 bool EllipseEffect::onIsEqual(const GrFragmentProcessor& other) const {
247 const EllipseEffect& ee = other.cast<EllipseEffect>(); 256 const EllipseEffect& ee = other.cast<EllipseEffect>();
248 return fEdgeType == ee.fEdgeType && fCenter == ee.fCenter && fRadii == ee.fR adii; 257 return fEdgeType == ee.fEdgeType && fCenter == ee.fCenter && fRadii == ee.fR adii;
(...skipping 16 matching lines...) Expand all
265 do { 274 do {
266 et = (GrPrimitiveEdgeType)random->nextULessThan(kGrProcessorEdgeTypeCnt) ; 275 et = (GrPrimitiveEdgeType)random->nextULessThan(kGrProcessorEdgeTypeCnt) ;
267 } while (kHairlineAA_GrProcessorEdgeType == et); 276 } while (kHairlineAA_GrProcessorEdgeType == et);
268 return EllipseEffect::Create(et, center, rx, ry); 277 return EllipseEffect::Create(et, center, rx, ry);
269 } 278 }
270 279
271 ////////////////////////////////////////////////////////////////////////////// 280 //////////////////////////////////////////////////////////////////////////////
272 281
273 class GLEllipseEffect : public GrGLFragmentProcessor { 282 class GLEllipseEffect : public GrGLFragmentProcessor {
274 public: 283 public:
275 GLEllipseEffect(const GrBackendProcessorFactory&, const GrProcessor&); 284 GLEllipseEffect(const GrProcessor&);
276 285
277 virtual void emitCode(GrGLFPBuilder* builder, 286 virtual void emitCode(GrGLFPBuilder* builder,
278 const GrFragmentProcessor& fp, 287 const GrFragmentProcessor& fp,
279 const char* outputColor, 288 const char* outputColor,
280 const char* inputColor, 289 const char* inputColor,
281 const TransformedCoordsArray&, 290 const TransformedCoordsArray&,
282 const TextureSamplerArray&) SK_OVERRIDE; 291 const TextureSamplerArray&) SK_OVERRIDE;
283 292
284 static inline void GenKey(const GrProcessor&, const GrGLCaps&, GrProcessorKe yBuilder*); 293 static inline void GenKey(const GrProcessor&, const GrGLCaps&, GrProcessorKe yBuilder*);
285 294
286 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_O VERRIDE; 295 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_O VERRIDE;
287 296
288 private: 297 private:
289 GrGLProgramDataManager::UniformHandle fEllipseUniform; 298 GrGLProgramDataManager::UniformHandle fEllipseUniform;
290 SkPoint fPrevCenter; 299 SkPoint fPrevCenter;
291 SkVector fPrevRadii; 300 SkVector fPrevRadii;
292 301
293 typedef GrGLFragmentProcessor INHERITED; 302 typedef GrGLFragmentProcessor INHERITED;
294 }; 303 };
295 304
296 GLEllipseEffect::GLEllipseEffect(const GrBackendProcessorFactory& factory, 305 GLEllipseEffect::GLEllipseEffect(const GrProcessor& effect) {
297 const GrProcessor& effect)
298 : INHERITED (factory) {
299 fPrevRadii.fX = -1.f; 306 fPrevRadii.fX = -1.f;
300 } 307 }
301 308
302 void GLEllipseEffect::emitCode(GrGLFPBuilder* builder, 309 void GLEllipseEffect::emitCode(GrGLFPBuilder* builder,
303 const GrFragmentProcessor& fp, 310 const GrFragmentProcessor& fp,
304 const char* outputColor, 311 const char* outputColor,
305 const char* inputColor, 312 const char* inputColor,
306 const TransformedCoordsArray&, 313 const TransformedCoordsArray&,
307 const TextureSamplerArray& samplers) { 314 const TextureSamplerArray& samplers) {
308 const EllipseEffect& ee = fp.cast<EllipseEffect>(); 315 const EllipseEffect& ee = fp.cast<EllipseEffect>();
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
358 const EllipseEffect& ee = effect.cast<EllipseEffect>(); 365 const EllipseEffect& ee = effect.cast<EllipseEffect>();
359 if (ee.getRadii() != fPrevRadii || ee.getCenter() != fPrevCenter) { 366 if (ee.getRadii() != fPrevRadii || ee.getCenter() != fPrevCenter) {
360 SkScalar invRXSqd = 1.f / (ee.getRadii().fX * ee.getRadii().fX); 367 SkScalar invRXSqd = 1.f / (ee.getRadii().fX * ee.getRadii().fX);
361 SkScalar invRYSqd = 1.f / (ee.getRadii().fY * ee.getRadii().fY); 368 SkScalar invRYSqd = 1.f / (ee.getRadii().fY * ee.getRadii().fY);
362 pdman.set4f(fEllipseUniform, ee.getCenter().fX, ee.getCenter().fY, invRX Sqd, invRYSqd); 369 pdman.set4f(fEllipseUniform, ee.getCenter().fX, ee.getCenter().fY, invRX Sqd, invRYSqd);
363 fPrevCenter = ee.getCenter(); 370 fPrevCenter = ee.getCenter();
364 fPrevRadii = ee.getRadii(); 371 fPrevRadii = ee.getRadii();
365 } 372 }
366 } 373 }
367 374
375 //////////////////////////////////////////////////////////////////////////////// ///////////////////
376
377 void EllipseEffect::getGLProcessorKey(const GrGLCaps& caps,
378 GrProcessorKeyBuilder* b) const {
379 GLEllipseEffect::GenKey(*this, caps, b);
380 }
381
382 GrGLFragmentProcessor* EllipseEffect::createGLInstance() const {
383 return SkNEW_ARGS(GLEllipseEffect, (*this));
384 }
385
368 ////////////////////////////////////////////////////////////////////////////// 386 //////////////////////////////////////////////////////////////////////////////
369 387
370 GrFragmentProcessor* GrOvalEffect::Create(GrPrimitiveEdgeType edgeType, const Sk Rect& oval) { 388 GrFragmentProcessor* GrOvalEffect::Create(GrPrimitiveEdgeType edgeType, const Sk Rect& oval) {
371 if (kHairlineAA_GrProcessorEdgeType == edgeType) { 389 if (kHairlineAA_GrProcessorEdgeType == edgeType) {
372 return NULL; 390 return NULL;
373 } 391 }
374 SkScalar w = oval.width(); 392 SkScalar w = oval.width();
375 SkScalar h = oval.height(); 393 SkScalar h = oval.height();
376 if (SkScalarNearlyEqual(w, h)) { 394 if (SkScalarNearlyEqual(w, h)) {
377 w /= 2; 395 w /= 2;
378 return CircleEffect::Create(edgeType, SkPoint::Make(oval.fLeft + w, oval .fTop + w), w); 396 return CircleEffect::Create(edgeType, SkPoint::Make(oval.fLeft + w, oval .fTop + w), w);
379 } else { 397 } else {
380 w /= 2; 398 w /= 2;
381 h /= 2; 399 h /= 2;
382 return EllipseEffect::Create(edgeType, SkPoint::Make(oval.fLeft + w, ova l.fTop + h), w, h); 400 return EllipseEffect::Create(edgeType, SkPoint::Make(oval.fLeft + w, ova l.fTop + h), w, h);
383 } 401 }
384 402
385 return NULL; 403 return NULL;
386 } 404 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698