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

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

Issue 571163002: removing GrDrawEffect (Closed) Base URL: https://skia.googlesource.com/skia.git@gp3
Patch Set: rebase after revert Created 6 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
« no previous file with comments | « src/gpu/effects/GrOvalEffect.cpp ('k') | src/gpu/effects/GrSimpleTextureEffect.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 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" 8 #include "gl/builders/GrGLProgramBuilder.h"
9 #include "GrRRectEffect.h" 9 #include "GrRRectEffect.h"
10 10
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
95 95
96 CircularRRectEffect::CircularRRectEffect(GrEffectEdgeType edgeType, uint32_t cir cularCornerFlags, 96 CircularRRectEffect::CircularRRectEffect(GrEffectEdgeType edgeType, uint32_t cir cularCornerFlags,
97 const SkRRect& rrect) 97 const SkRRect& rrect)
98 : fRRect(rrect) 98 : fRRect(rrect)
99 , fEdgeType(edgeType) 99 , fEdgeType(edgeType)
100 , fCircularCornerFlags(circularCornerFlags) { 100 , fCircularCornerFlags(circularCornerFlags) {
101 this->setWillReadFragmentPosition(); 101 this->setWillReadFragmentPosition();
102 } 102 }
103 103
104 bool CircularRRectEffect::onIsEqual(const GrEffect& other) const { 104 bool CircularRRectEffect::onIsEqual(const GrEffect& other) const {
105 const CircularRRectEffect& crre = CastEffect<CircularRRectEffect>(other); 105 const CircularRRectEffect& crre = other.cast<CircularRRectEffect>();
106 // The corner flags are derived from fRRect, so no need to check them. 106 // The corner flags are derived from fRRect, so no need to check them.
107 return fEdgeType == crre.fEdgeType && fRRect == crre.fRRect; 107 return fEdgeType == crre.fEdgeType && fRRect == crre.fRRect;
108 } 108 }
109 109
110 ////////////////////////////////////////////////////////////////////////////// 110 //////////////////////////////////////////////////////////////////////////////
111 111
112 GR_DEFINE_EFFECT_TEST(CircularRRectEffect); 112 GR_DEFINE_EFFECT_TEST(CircularRRectEffect);
113 113
114 GrEffect* CircularRRectEffect::TestCreate(SkRandom* random, 114 GrEffect* CircularRRectEffect::TestCreate(SkRandom* random,
115 GrContext*, 115 GrContext*,
116 const GrDrawTargetCaps& caps, 116 const GrDrawTargetCaps& caps,
117 GrTexture*[]) { 117 GrTexture*[]) {
118 SkScalar w = random->nextRangeScalar(20.f, 1000.f); 118 SkScalar w = random->nextRangeScalar(20.f, 1000.f);
119 SkScalar h = random->nextRangeScalar(20.f, 1000.f); 119 SkScalar h = random->nextRangeScalar(20.f, 1000.f);
120 SkScalar r = random->nextRangeF(kRadiusMin, 9.f); 120 SkScalar r = random->nextRangeF(kRadiusMin, 9.f);
121 SkRRect rrect; 121 SkRRect rrect;
122 rrect.setRectXY(SkRect::MakeWH(w, h), r, r); 122 rrect.setRectXY(SkRect::MakeWH(w, h), r, r);
123 GrEffect* effect; 123 GrEffect* effect;
124 do { 124 do {
125 GrEffectEdgeType et = (GrEffectEdgeType)random->nextULessThan(kGrEffectE dgeTypeCnt); 125 GrEffectEdgeType et = (GrEffectEdgeType)random->nextULessThan(kGrEffectE dgeTypeCnt);
126 effect = GrRRectEffect::Create(et, rrect); 126 effect = GrRRectEffect::Create(et, rrect);
127 } while (NULL == effect); 127 } while (NULL == effect);
128 return effect; 128 return effect;
129 } 129 }
130 130
131 ////////////////////////////////////////////////////////////////////////////// 131 //////////////////////////////////////////////////////////////////////////////
132 132
133 class GLCircularRRectEffect : public GrGLEffect { 133 class GLCircularRRectEffect : public GrGLEffect {
134 public: 134 public:
135 GLCircularRRectEffect(const GrBackendEffectFactory&, const GrDrawEffect&); 135 GLCircularRRectEffect(const GrBackendEffectFactory&, const GrEffect&);
136 136
137 virtual void emitCode(GrGLProgramBuilder* builder, 137 virtual void emitCode(GrGLProgramBuilder* builder,
138 const GrDrawEffect& drawEffect, 138 const GrEffect& effect,
139 const GrEffectKey& key, 139 const GrEffectKey& key,
140 const char* outputColor, 140 const char* outputColor,
141 const char* inputColor, 141 const char* inputColor,
142 const TransformedCoordsArray&, 142 const TransformedCoordsArray&,
143 const TextureSamplerArray&) SK_OVERRIDE; 143 const TextureSamplerArray&) SK_OVERRIDE;
144 144
145 static inline void GenKey(const GrDrawEffect&, const GrGLCaps&, GrEffectKeyB uilder*); 145 static inline void GenKey(const GrEffect&, const GrGLCaps&, GrEffectKeyBuild er*);
146 146
147 virtual void setData(const GrGLProgramDataManager&, const GrDrawEffect&) SK_ OVERRIDE; 147 virtual void setData(const GrGLProgramDataManager&, const GrEffect&) SK_OVER RIDE;
148 148
149 private: 149 private:
150 GrGLProgramDataManager::UniformHandle fInnerRectUniform; 150 GrGLProgramDataManager::UniformHandle fInnerRectUniform;
151 GrGLProgramDataManager::UniformHandle fRadiusPlusHalfUniform; 151 GrGLProgramDataManager::UniformHandle fRadiusPlusHalfUniform;
152 SkRRect fPrevRRect; 152 SkRRect fPrevRRect;
153 typedef GrGLEffect INHERITED; 153 typedef GrGLEffect INHERITED;
154 }; 154 };
155 155
156 GLCircularRRectEffect::GLCircularRRectEffect(const GrBackendEffectFactory& facto ry, 156 GLCircularRRectEffect::GLCircularRRectEffect(const GrBackendEffectFactory& facto ry,
157 const GrDrawEffect& drawEffect) 157 const GrEffect& effect)
158 : INHERITED (factory) { 158 : INHERITED (factory) {
159 fPrevRRect.setEmpty(); 159 fPrevRRect.setEmpty();
160 } 160 }
161 161
162 void GLCircularRRectEffect::emitCode(GrGLProgramBuilder* builder, 162 void GLCircularRRectEffect::emitCode(GrGLProgramBuilder* builder,
163 const GrDrawEffect& drawEffect, 163 const GrEffect& effect,
164 const GrEffectKey& key, 164 const GrEffectKey& key,
165 const char* outputColor, 165 const char* outputColor,
166 const char* inputColor, 166 const char* inputColor,
167 const TransformedCoordsArray&, 167 const TransformedCoordsArray&,
168 const TextureSamplerArray& samplers) { 168 const TextureSamplerArray& samplers) {
169 const CircularRRectEffect& crre = drawEffect.castEffect<CircularRRectEffect> (); 169 const CircularRRectEffect& crre = effect.cast<CircularRRectEffect>();
170 const char *rectName; 170 const char *rectName;
171 const char *radiusPlusHalfName; 171 const char *radiusPlusHalfName;
172 // The inner rect is the rrect bounds inset by the radius. Its left, top, ri ght, and bottom 172 // The inner rect is the rrect bounds inset by the radius. Its left, top, ri ght, and bottom
173 // edges correspond to components x, y, z, and w, respectively. When a side of the rrect has 173 // edges correspond to components x, y, z, and w, respectively. When a side of the rrect has
174 // only rectangular corners, that side's value corresponds to the rect edge' s value outset by 174 // only rectangular corners, that side's value corresponds to the rect edge' s value outset by
175 // half a pixel. 175 // half a pixel.
176 fInnerRectUniform = builder->addUniform(GrGLProgramBuilder::kFragment_Visibi lity, 176 fInnerRectUniform = builder->addUniform(GrGLProgramBuilder::kFragment_Visibi lity,
177 kVec4f_GrSLType, 177 kVec4f_GrSLType,
178 "innerRect", 178 "innerRect",
179 &rectName); 179 &rectName);
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
286 } 286 }
287 287
288 if (kInverseFillAA_GrEffectEdgeType == crre.getEdgeType()) { 288 if (kInverseFillAA_GrEffectEdgeType == crre.getEdgeType()) {
289 fsBuilder->codeAppend("\t\talpha = 1.0 - alpha;\n"); 289 fsBuilder->codeAppend("\t\talpha = 1.0 - alpha;\n");
290 } 290 }
291 291
292 fsBuilder->codeAppendf("\t\t%s = %s;\n", outputColor, 292 fsBuilder->codeAppendf("\t\t%s = %s;\n", outputColor,
293 (GrGLSLExpr4(inputColor) * GrGLSLExpr1("alpha")).c_st r()); 293 (GrGLSLExpr4(inputColor) * GrGLSLExpr1("alpha")).c_st r());
294 } 294 }
295 295
296 void GLCircularRRectEffect::GenKey(const GrDrawEffect& drawEffect, const GrGLCap s&, 296 void GLCircularRRectEffect::GenKey(const GrEffect& effect, const GrGLCaps&,
297 GrEffectKeyBuilder* b) { 297 GrEffectKeyBuilder* b) {
298 const CircularRRectEffect& crre = drawEffect.castEffect<CircularRRectEffect> (); 298 const CircularRRectEffect& crre = effect.cast<CircularRRectEffect>();
299 GR_STATIC_ASSERT(kGrEffectEdgeTypeCnt <= 8); 299 GR_STATIC_ASSERT(kGrEffectEdgeTypeCnt <= 8);
300 b->add32((crre.getCircularCornerFlags() << 3) | crre.getEdgeType()); 300 b->add32((crre.getCircularCornerFlags() << 3) | crre.getEdgeType());
301 } 301 }
302 302
303 void GLCircularRRectEffect::setData(const GrGLProgramDataManager& pdman, 303 void GLCircularRRectEffect::setData(const GrGLProgramDataManager& pdman,
304 const GrDrawEffect& drawEffect) { 304 const GrEffect& effect) {
305 const CircularRRectEffect& crre = drawEffect.castEffect<CircularRRectEffect> (); 305 const CircularRRectEffect& crre = effect.cast<CircularRRectEffect>();
306 const SkRRect& rrect = crre.getRRect(); 306 const SkRRect& rrect = crre.getRRect();
307 if (rrect != fPrevRRect) { 307 if (rrect != fPrevRRect) {
308 SkRect rect = rrect.getBounds(); 308 SkRect rect = rrect.getBounds();
309 SkScalar radius = 0; 309 SkScalar radius = 0;
310 switch (crre.getCircularCornerFlags()) { 310 switch (crre.getCircularCornerFlags()) {
311 case CircularRRectEffect::kAll_CornerFlags: 311 case CircularRRectEffect::kAll_CornerFlags:
312 SkASSERT(rrect.isSimpleCircular()); 312 SkASSERT(rrect.isSimpleCircular());
313 radius = rrect.getSimpleRadii().fX; 313 radius = rrect.getSimpleRadii().fX;
314 SkASSERT(radius >= kRadiusMin); 314 SkASSERT(radius >= kRadiusMin);
315 rect.inset(radius, radius); 315 rect.inset(radius, radius);
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
429 return GrTBackendEffectFactory<EllipticalRRectEffect>::getInstance(); 429 return GrTBackendEffectFactory<EllipticalRRectEffect>::getInstance();
430 } 430 }
431 431
432 EllipticalRRectEffect::EllipticalRRectEffect(GrEffectEdgeType edgeType, const Sk RRect& rrect) 432 EllipticalRRectEffect::EllipticalRRectEffect(GrEffectEdgeType edgeType, const Sk RRect& rrect)
433 : fRRect(rrect) 433 : fRRect(rrect)
434 , fEdgeType(edgeType){ 434 , fEdgeType(edgeType){
435 this->setWillReadFragmentPosition(); 435 this->setWillReadFragmentPosition();
436 } 436 }
437 437
438 bool EllipticalRRectEffect::onIsEqual(const GrEffect& other) const { 438 bool EllipticalRRectEffect::onIsEqual(const GrEffect& other) const {
439 const EllipticalRRectEffect& erre = CastEffect<EllipticalRRectEffect>(other) ; 439 const EllipticalRRectEffect& erre = other.cast<EllipticalRRectEffect>();
440 return fEdgeType == erre.fEdgeType && fRRect == erre.fRRect; 440 return fEdgeType == erre.fEdgeType && fRRect == erre.fRRect;
441 } 441 }
442 442
443 ////////////////////////////////////////////////////////////////////////////// 443 //////////////////////////////////////////////////////////////////////////////
444 444
445 GR_DEFINE_EFFECT_TEST(EllipticalRRectEffect); 445 GR_DEFINE_EFFECT_TEST(EllipticalRRectEffect);
446 446
447 GrEffect* EllipticalRRectEffect::TestCreate(SkRandom* random, 447 GrEffect* EllipticalRRectEffect::TestCreate(SkRandom* random,
448 GrContext*, 448 GrContext*,
449 const GrDrawTargetCaps& caps, 449 const GrDrawTargetCaps& caps,
(...skipping 29 matching lines...) Expand all
479 GrEffectEdgeType et = (GrEffectEdgeType)random->nextULessThan(kGrEffectE dgeTypeCnt); 479 GrEffectEdgeType et = (GrEffectEdgeType)random->nextULessThan(kGrEffectE dgeTypeCnt);
480 effect = GrRRectEffect::Create(et, rrect); 480 effect = GrRRectEffect::Create(et, rrect);
481 } while (NULL == effect); 481 } while (NULL == effect);
482 return effect; 482 return effect;
483 } 483 }
484 484
485 ////////////////////////////////////////////////////////////////////////////// 485 //////////////////////////////////////////////////////////////////////////////
486 486
487 class GLEllipticalRRectEffect : public GrGLEffect { 487 class GLEllipticalRRectEffect : public GrGLEffect {
488 public: 488 public:
489 GLEllipticalRRectEffect(const GrBackendEffectFactory&, const GrDrawEffect&); 489 GLEllipticalRRectEffect(const GrBackendEffectFactory&, const GrEffect&);
490 490
491 virtual void emitCode(GrGLProgramBuilder* builder, 491 virtual void emitCode(GrGLProgramBuilder* builder,
492 const GrDrawEffect& drawEffect, 492 const GrEffect& effect,
493 const GrEffectKey& key, 493 const GrEffectKey& key,
494 const char* outputColor, 494 const char* outputColor,
495 const char* inputColor, 495 const char* inputColor,
496 const TransformedCoordsArray&, 496 const TransformedCoordsArray&,
497 const TextureSamplerArray&) SK_OVERRIDE; 497 const TextureSamplerArray&) SK_OVERRIDE;
498 498
499 static inline void GenKey(const GrDrawEffect&, const GrGLCaps&, GrEffectKeyB uilder*); 499 static inline void GenKey(const GrEffect&, const GrGLCaps&, GrEffectKeyBuild er*);
500 500
501 virtual void setData(const GrGLProgramDataManager&, const GrDrawEffect&) SK_ OVERRIDE; 501 virtual void setData(const GrGLProgramDataManager&, const GrEffect&) SK_OVER RIDE;
502 502
503 private: 503 private:
504 GrGLProgramDataManager::UniformHandle fInnerRectUniform; 504 GrGLProgramDataManager::UniformHandle fInnerRectUniform;
505 GrGLProgramDataManager::UniformHandle fInvRadiiSqdUniform; 505 GrGLProgramDataManager::UniformHandle fInvRadiiSqdUniform;
506 SkRRect fPrevRRect; 506 SkRRect fPrevRRect;
507 typedef GrGLEffect INHERITED; 507 typedef GrGLEffect INHERITED;
508 }; 508 };
509 509
510 GLEllipticalRRectEffect::GLEllipticalRRectEffect(const GrBackendEffectFactory& f actory, 510 GLEllipticalRRectEffect::GLEllipticalRRectEffect(const GrBackendEffectFactory& f actory,
511 const GrDrawEffect& drawEffect) 511 const GrEffect& effect)
512 : INHERITED (factory) { 512 : INHERITED (factory) {
513 fPrevRRect.setEmpty(); 513 fPrevRRect.setEmpty();
514 } 514 }
515 515
516 void GLEllipticalRRectEffect::emitCode(GrGLProgramBuilder* builder, 516 void GLEllipticalRRectEffect::emitCode(GrGLProgramBuilder* builder,
517 const GrDrawEffect& drawEffect, 517 const GrEffect& effect,
518 const GrEffectKey& key, 518 const GrEffectKey& key,
519 const char* outputColor, 519 const char* outputColor,
520 const char* inputColor, 520 const char* inputColor,
521 const TransformedCoordsArray&, 521 const TransformedCoordsArray&,
522 const TextureSamplerArray& samplers) { 522 const TextureSamplerArray& samplers) {
523 const EllipticalRRectEffect& erre = drawEffect.castEffect<EllipticalRRectEff ect>(); 523 const EllipticalRRectEffect& erre = effect.cast<EllipticalRRectEffect>();
524 const char *rectName; 524 const char *rectName;
525 // The inner rect is the rrect bounds inset by the x/y radii 525 // The inner rect is the rrect bounds inset by the x/y radii
526 fInnerRectUniform = builder->addUniform(GrGLProgramBuilder::kFragment_Visibi lity, 526 fInnerRectUniform = builder->addUniform(GrGLProgramBuilder::kFragment_Visibi lity,
527 kVec4f_GrSLType, 527 kVec4f_GrSLType,
528 "innerRect", 528 "innerRect",
529 &rectName); 529 &rectName);
530 530
531 GrGLFragmentShaderBuilder* fsBuilder = builder->getFragmentShaderBuilder(); 531 GrGLFragmentShaderBuilder* fsBuilder = builder->getFragmentShaderBuilder();
532 const char* fragmentPos = fsBuilder->fragmentPosition(); 532 const char* fragmentPos = fsBuilder->fragmentPosition();
533 // At each quarter-ellipse corner we compute a vector that is the offset of the fragment pos 533 // At each quarter-ellipse corner we compute a vector that is the offset of the fragment pos
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
583 if (kFillAA_GrEffectEdgeType == erre.getEdgeType()) { 583 if (kFillAA_GrEffectEdgeType == erre.getEdgeType()) {
584 fsBuilder->codeAppend("\t\tfloat alpha = clamp(0.5 - approx_dist, 0.0, 1 .0);\n"); 584 fsBuilder->codeAppend("\t\tfloat alpha = clamp(0.5 - approx_dist, 0.0, 1 .0);\n");
585 } else { 585 } else {
586 fsBuilder->codeAppend("\t\tfloat alpha = clamp(0.5 + approx_dist, 0.0, 1 .0);\n"); 586 fsBuilder->codeAppend("\t\tfloat alpha = clamp(0.5 + approx_dist, 0.0, 1 .0);\n");
587 } 587 }
588 588
589 fsBuilder->codeAppendf("\t\t%s = %s;\n", outputColor, 589 fsBuilder->codeAppendf("\t\t%s = %s;\n", outputColor,
590 (GrGLSLExpr4(inputColor) * GrGLSLExpr1("alpha")).c_st r()); 590 (GrGLSLExpr4(inputColor) * GrGLSLExpr1("alpha")).c_st r());
591 } 591 }
592 592
593 void GLEllipticalRRectEffect::GenKey(const GrDrawEffect& drawEffect, const GrGLC aps&, 593 void GLEllipticalRRectEffect::GenKey(const GrEffect& effect, const GrGLCaps&,
594 GrEffectKeyBuilder* b) { 594 GrEffectKeyBuilder* b) {
595 const EllipticalRRectEffect& erre = drawEffect.castEffect<EllipticalRRectEff ect>(); 595 const EllipticalRRectEffect& erre = effect.cast<EllipticalRRectEffect>();
596 GR_STATIC_ASSERT(kLast_GrEffectEdgeType < (1 << 3)); 596 GR_STATIC_ASSERT(kLast_GrEffectEdgeType < (1 << 3));
597 b->add32(erre.getRRect().getType() | erre.getEdgeType() << 3); 597 b->add32(erre.getRRect().getType() | erre.getEdgeType() << 3);
598 } 598 }
599 599
600 void GLEllipticalRRectEffect::setData(const GrGLProgramDataManager& pdman, 600 void GLEllipticalRRectEffect::setData(const GrGLProgramDataManager& pdman,
601 const GrDrawEffect& drawEffect) { 601 const GrEffect& effect) {
602 const EllipticalRRectEffect& erre = drawEffect.castEffect<EllipticalRRectEff ect>(); 602 const EllipticalRRectEffect& erre = effect.cast<EllipticalRRectEffect>();
603 const SkRRect& rrect = erre.getRRect(); 603 const SkRRect& rrect = erre.getRRect();
604 if (rrect != fPrevRRect) { 604 if (rrect != fPrevRRect) {
605 SkRect rect = rrect.getBounds(); 605 SkRect rect = rrect.getBounds();
606 const SkVector& r0 = rrect.radii(SkRRect::kUpperLeft_Corner); 606 const SkVector& r0 = rrect.radii(SkRRect::kUpperLeft_Corner);
607 SkASSERT(r0.fX >= kRadiusMin); 607 SkASSERT(r0.fX >= kRadiusMin);
608 SkASSERT(r0.fY >= kRadiusMin); 608 SkASSERT(r0.fY >= kRadiusMin);
609 switch (erre.getRRect().getType()) { 609 switch (erre.getRRect().getType()) {
610 case SkRRect::kSimple_Type: 610 case SkRRect::kSimple_Type:
611 rect.inset(r0.fX, r0.fY); 611 rect.inset(r0.fX, r0.fY);
612 pdman.set2f(fInvRadiiSqdUniform, 1.f / (r0.fX * r0.fX), 612 pdman.set2f(fInvRadiiSqdUniform, 1.f / (r0.fX * r0.fX),
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
725 if (rrect.isNinePatch()) { 725 if (rrect.isNinePatch()) {
726 return EllipticalRRectEffect::Create(edgeType, rrect); 726 return EllipticalRRectEffect::Create(edgeType, rrect);
727 } 727 }
728 return NULL; 728 return NULL;
729 } 729 }
730 } 730 }
731 } 731 }
732 732
733 return NULL; 733 return NULL;
734 } 734 }
OLDNEW
« no previous file with comments | « src/gpu/effects/GrOvalEffect.cpp ('k') | src/gpu/effects/GrSimpleTextureEffect.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698