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

Side by Side Diff: src/gpu/GrOvalRenderer.cpp

Issue 23653059: Mark when effects and programs have vertex code (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Created 7 years, 3 months 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 | Annotate | Revision Log
« no previous file with comments | « src/gpu/GrEffect.cpp ('k') | src/gpu/effects/GrBezierEffect.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2013 Google Inc. 2 * Copyright 2013 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 "GrOvalRenderer.h" 8 #include "GrOvalRenderer.h"
9 9
10 #include "GrEffect.h" 10 #include "GrEffect.h"
11 #include "gl/GrGLEffect.h" 11 #include "gl/GrGLEffect.h"
12 #include "gl/GrGLSL.h" 12 #include "gl/GrGLSL.h"
13 #include "GrTBackendEffectFactory.h" 13 #include "GrTBackendEffectFactory.h"
14 14
15 #include "GrDrawState.h" 15 #include "GrDrawState.h"
16 #include "GrDrawTarget.h" 16 #include "GrDrawTarget.h"
17 #include "GrGpu.h" 17 #include "GrGpu.h"
18 18
19 #include "SkRRect.h" 19 #include "SkRRect.h"
20 #include "SkStrokeRec.h" 20 #include "SkStrokeRec.h"
21 21
22 #include "effects/GrVertexEffect.h"
23
22 SK_DEFINE_INST_COUNT(GrOvalRenderer) 24 SK_DEFINE_INST_COUNT(GrOvalRenderer)
23 25
24 namespace { 26 namespace {
25 27
26 struct CircleVertex { 28 struct CircleVertex {
27 GrPoint fPos; 29 GrPoint fPos;
28 GrPoint fOffset; 30 GrPoint fOffset;
29 SkScalar fOuterRadius; 31 SkScalar fOuterRadius;
30 SkScalar fInnerRadius; 32 SkScalar fInnerRadius;
31 }; 33 };
(...skipping 17 matching lines...) Expand all
49 51
50 } 52 }
51 53
52 /////////////////////////////////////////////////////////////////////////////// 54 ///////////////////////////////////////////////////////////////////////////////
53 55
54 /** 56 /**
55 * The output of this effect is a modulation of the input color and coverage for a circle, 57 * The output of this effect is a modulation of the input color and coverage for a circle,
56 * specified as offset_x, offset_y (both from center point), outer radius and in ner radius. 58 * specified as offset_x, offset_y (both from center point), outer radius and in ner radius.
57 */ 59 */
58 60
59 class CircleEdgeEffect : public GrEffect { 61 class CircleEdgeEffect : public GrVertexEffect {
60 public: 62 public:
61 static GrEffectRef* Create(bool stroke) { 63 static GrEffectRef* Create(bool stroke) {
62 GR_CREATE_STATIC_EFFECT(gCircleStrokeEdge, CircleEdgeEffect, (true)); 64 GR_CREATE_STATIC_EFFECT(gCircleStrokeEdge, CircleEdgeEffect, (true));
63 GR_CREATE_STATIC_EFFECT(gCircleFillEdge, CircleEdgeEffect, (false)); 65 GR_CREATE_STATIC_EFFECT(gCircleFillEdge, CircleEdgeEffect, (false));
64 66
65 if (stroke) { 67 if (stroke) {
66 gCircleStrokeEdge->ref(); 68 gCircleStrokeEdge->ref();
67 return gCircleStrokeEdge; 69 return gCircleStrokeEdge;
68 } else { 70 } else {
69 gCircleFillEdge->ref(); 71 gCircleFillEdge->ref();
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
127 } 129 }
128 130
129 virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_ OVERRIDE {} 131 virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_ OVERRIDE {}
130 132
131 private: 133 private:
132 typedef GrGLEffect INHERITED; 134 typedef GrGLEffect INHERITED;
133 }; 135 };
134 136
135 137
136 private: 138 private:
137 CircleEdgeEffect(bool stroke) : GrEffect() { 139 CircleEdgeEffect(bool stroke) : GrVertexEffect() {
138 this->addVertexAttrib(kVec4f_GrSLType); 140 this->addVertexAttrib(kVec4f_GrSLType);
139 fStroke = stroke; 141 fStroke = stroke;
140 } 142 }
141 143
142 virtual bool onIsEqual(const GrEffect& other) const SK_OVERRIDE { 144 virtual bool onIsEqual(const GrEffect& other) const SK_OVERRIDE {
143 const CircleEdgeEffect& cee = CastEffect<CircleEdgeEffect>(other); 145 const CircleEdgeEffect& cee = CastEffect<CircleEdgeEffect>(other);
144 return cee.fStroke == fStroke; 146 return cee.fStroke == fStroke;
145 } 147 }
146 148
147 bool fStroke; 149 bool fStroke;
148 150
149 GR_DECLARE_EFFECT_TEST; 151 GR_DECLARE_EFFECT_TEST;
150 152
151 typedef GrEffect INHERITED; 153 typedef GrVertexEffect INHERITED;
152 }; 154 };
153 155
154 GR_DEFINE_EFFECT_TEST(CircleEdgeEffect); 156 GR_DEFINE_EFFECT_TEST(CircleEdgeEffect);
155 157
156 GrEffectRef* CircleEdgeEffect::TestCreate(SkRandom* random, 158 GrEffectRef* CircleEdgeEffect::TestCreate(SkRandom* random,
157 GrContext* context, 159 GrContext* context,
158 const GrDrawTargetCaps&, 160 const GrDrawTargetCaps&,
159 GrTexture* textures[]) { 161 GrTexture* textures[]) {
160 return CircleEdgeEffect::Create(random->nextBool()); 162 return CircleEdgeEffect::Create(random->nextBool());
161 } 163 }
162 164
163 /////////////////////////////////////////////////////////////////////////////// 165 ///////////////////////////////////////////////////////////////////////////////
164 166
165 /** 167 /**
166 * The output of this effect is a modulation of the input color and coverage for an axis-aligned 168 * The output of this effect is a modulation of the input color and coverage for an axis-aligned
167 * ellipse, specified as a 2D offset from center, and the reciprocals of the out er and inner radii, 169 * ellipse, specified as a 2D offset from center, and the reciprocals of the out er and inner radii,
168 * in both x and y directions. 170 * in both x and y directions.
169 * 171 *
170 * We are using an implicit function of x^2/a^2 + y^2/b^2 - 1 = 0. 172 * We are using an implicit function of x^2/a^2 + y^2/b^2 - 1 = 0.
171 */ 173 */
172 174
173 class EllipseEdgeEffect : public GrEffect { 175 class EllipseEdgeEffect : public GrVertexEffect {
174 public: 176 public:
175 static GrEffectRef* Create(bool stroke) { 177 static GrEffectRef* Create(bool stroke) {
176 GR_CREATE_STATIC_EFFECT(gEllipseStrokeEdge, EllipseEdgeEffect, (true)); 178 GR_CREATE_STATIC_EFFECT(gEllipseStrokeEdge, EllipseEdgeEffect, (true));
177 GR_CREATE_STATIC_EFFECT(gEllipseFillEdge, EllipseEdgeEffect, (false)); 179 GR_CREATE_STATIC_EFFECT(gEllipseFillEdge, EllipseEdgeEffect, (false));
178 180
179 if (stroke) { 181 if (stroke) {
180 gEllipseStrokeEdge->ref(); 182 gEllipseStrokeEdge->ref();
181 return gEllipseStrokeEdge; 183 return gEllipseStrokeEdge;
182 } else { 184 } else {
183 gEllipseFillEdge->ref(); 185 gEllipseFillEdge->ref();
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
262 } 264 }
263 265
264 virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_ OVERRIDE { 266 virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_ OVERRIDE {
265 } 267 }
266 268
267 private: 269 private:
268 typedef GrGLEffect INHERITED; 270 typedef GrGLEffect INHERITED;
269 }; 271 };
270 272
271 private: 273 private:
272 EllipseEdgeEffect(bool stroke) : GrEffect() { 274 EllipseEdgeEffect(bool stroke) : GrVertexEffect() {
273 this->addVertexAttrib(kVec2f_GrSLType); 275 this->addVertexAttrib(kVec2f_GrSLType);
274 this->addVertexAttrib(kVec4f_GrSLType); 276 this->addVertexAttrib(kVec4f_GrSLType);
275 fStroke = stroke; 277 fStroke = stroke;
276 } 278 }
277 279
278 virtual bool onIsEqual(const GrEffect& other) const SK_OVERRIDE { 280 virtual bool onIsEqual(const GrEffect& other) const SK_OVERRIDE {
279 const EllipseEdgeEffect& eee = CastEffect<EllipseEdgeEffect>(other); 281 const EllipseEdgeEffect& eee = CastEffect<EllipseEdgeEffect>(other);
280 return eee.fStroke == fStroke; 282 return eee.fStroke == fStroke;
281 } 283 }
282 284
283 bool fStroke; 285 bool fStroke;
284 286
285 GR_DECLARE_EFFECT_TEST; 287 GR_DECLARE_EFFECT_TEST;
286 288
287 typedef GrEffect INHERITED; 289 typedef GrVertexEffect INHERITED;
288 }; 290 };
289 291
290 GR_DEFINE_EFFECT_TEST(EllipseEdgeEffect); 292 GR_DEFINE_EFFECT_TEST(EllipseEdgeEffect);
291 293
292 GrEffectRef* EllipseEdgeEffect::TestCreate(SkRandom* random, 294 GrEffectRef* EllipseEdgeEffect::TestCreate(SkRandom* random,
293 GrContext* context, 295 GrContext* context,
294 const GrDrawTargetCaps&, 296 const GrDrawTargetCaps&,
295 GrTexture* textures[]) { 297 GrTexture* textures[]) {
296 return EllipseEdgeEffect::Create(random->nextBool()); 298 return EllipseEdgeEffect::Create(random->nextBool());
297 } 299 }
298 300
299 /////////////////////////////////////////////////////////////////////////////// 301 ///////////////////////////////////////////////////////////////////////////////
300 302
301 /** 303 /**
302 * The output of this effect is a modulation of the input color and coverage for an ellipse, 304 * The output of this effect is a modulation of the input color and coverage for an ellipse,
303 * specified as a 2D offset from center for both the outer and inner paths (if s troked). The 305 * specified as a 2D offset from center for both the outer and inner paths (if s troked). The
304 * implict equation used is for a unit circle (x^2 + y^2 - 1 = 0) and the edge c orrected by 306 * implict equation used is for a unit circle (x^2 + y^2 - 1 = 0) and the edge c orrected by
305 * using differentials. 307 * using differentials.
306 * 308 *
307 * The result is device-independent and can be used with any affine matrix. 309 * The result is device-independent and can be used with any affine matrix.
308 */ 310 */
309 311
310 class DIEllipseEdgeEffect : public GrEffect { 312 class DIEllipseEdgeEffect : public GrVertexEffect {
311 public: 313 public:
312 enum Mode { kStroke = 0, kHairline, kFill }; 314 enum Mode { kStroke = 0, kHairline, kFill };
313 315
314 static GrEffectRef* Create(Mode mode) { 316 static GrEffectRef* Create(Mode mode) {
315 GR_CREATE_STATIC_EFFECT(gEllipseStrokeEdge, DIEllipseEdgeEffect, (kStrok e)); 317 GR_CREATE_STATIC_EFFECT(gEllipseStrokeEdge, DIEllipseEdgeEffect, (kStrok e));
316 GR_CREATE_STATIC_EFFECT(gEllipseHairlineEdge, DIEllipseEdgeEffect, (kHai rline)); 318 GR_CREATE_STATIC_EFFECT(gEllipseHairlineEdge, DIEllipseEdgeEffect, (kHai rline));
317 GR_CREATE_STATIC_EFFECT(gEllipseFillEdge, DIEllipseEdgeEffect, (kFill)); 319 GR_CREATE_STATIC_EFFECT(gEllipseFillEdge, DIEllipseEdgeEffect, (kFill));
318 320
319 if (kStroke == mode) { 321 if (kStroke == mode) {
320 gEllipseStrokeEdge->ref(); 322 gEllipseStrokeEdge->ref();
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
423 } 425 }
424 426
425 virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_ OVERRIDE { 427 virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_ OVERRIDE {
426 } 428 }
427 429
428 private: 430 private:
429 typedef GrGLEffect INHERITED; 431 typedef GrGLEffect INHERITED;
430 }; 432 };
431 433
432 private: 434 private:
433 DIEllipseEdgeEffect(Mode mode) : GrEffect() { 435 DIEllipseEdgeEffect(Mode mode) : GrVertexEffect() {
434 this->addVertexAttrib(kVec2f_GrSLType); 436 this->addVertexAttrib(kVec2f_GrSLType);
435 this->addVertexAttrib(kVec2f_GrSLType); 437 this->addVertexAttrib(kVec2f_GrSLType);
436 fMode = mode; 438 fMode = mode;
437 } 439 }
438 440
439 virtual bool onIsEqual(const GrEffect& other) const SK_OVERRIDE { 441 virtual bool onIsEqual(const GrEffect& other) const SK_OVERRIDE {
440 const DIEllipseEdgeEffect& eee = CastEffect<DIEllipseEdgeEffect>(other); 442 const DIEllipseEdgeEffect& eee = CastEffect<DIEllipseEdgeEffect>(other);
441 return eee.fMode == fMode; 443 return eee.fMode == fMode;
442 } 444 }
443 445
444 Mode fMode; 446 Mode fMode;
445 447
446 GR_DECLARE_EFFECT_TEST; 448 GR_DECLARE_EFFECT_TEST;
447 449
448 typedef GrEffect INHERITED; 450 typedef GrVertexEffect INHERITED;
449 }; 451 };
450 452
451 GR_DEFINE_EFFECT_TEST(DIEllipseEdgeEffect); 453 GR_DEFINE_EFFECT_TEST(DIEllipseEdgeEffect);
452 454
453 GrEffectRef* DIEllipseEdgeEffect::TestCreate(SkRandom* random, 455 GrEffectRef* DIEllipseEdgeEffect::TestCreate(SkRandom* random,
454 GrContext* context, 456 GrContext* context,
455 const GrDrawTargetCaps&, 457 const GrDrawTargetCaps&,
456 GrTexture* textures[]) { 458 GrTexture* textures[]) {
457 return DIEllipseEdgeEffect::Create((Mode)(random->nextRangeU(0,2))); 459 return DIEllipseEdgeEffect::Create((Mode)(random->nextRangeU(0,2)));
458 } 460 }
(...skipping 679 matching lines...) Expand 10 before | Expand all | Expand 10 after
1138 } 1140 }
1139 1141
1140 // drop out the middle quad if we're stroked 1142 // drop out the middle quad if we're stroked
1141 int indexCnt = isStroked ? GR_ARRAY_COUNT(gRRectIndices)-6 : GR_ARRAY_CO UNT(gRRectIndices); 1143 int indexCnt = isStroked ? GR_ARRAY_COUNT(gRRectIndices)-6 : GR_ARRAY_CO UNT(gRRectIndices);
1142 target->setIndexSourceToBuffer(indexBuffer); 1144 target->setIndexSourceToBuffer(indexBuffer);
1143 target->drawIndexed(kTriangles_GrPrimitiveType, 0, 0, 16, indexCnt, &bou nds); 1145 target->drawIndexed(kTriangles_GrPrimitiveType, 0, 0, 16, indexCnt, &bou nds);
1144 } 1146 }
1145 1147
1146 return true; 1148 return true;
1147 } 1149 }
OLDNEW
« no previous file with comments | « src/gpu/GrEffect.cpp ('k') | src/gpu/effects/GrBezierEffect.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698