Index: src/gpu/effects/GrRRectEffect.cpp |
diff --git a/src/gpu/effects/GrRRectEffect.cpp b/src/gpu/effects/GrRRectEffect.cpp |
index 61652c17452e74033d8ed407e3c2535b77120caf..e4120c956ae5156a8680a4e3f621cc36ec6b6031 100644 |
--- a/src/gpu/effects/GrRRectEffect.cpp |
+++ b/src/gpu/effects/GrRRectEffect.cpp |
@@ -377,24 +377,16 @@ class GLEllipticalRRectEffect; |
class EllipticalRRectEffect : public GrEffect { |
public: |
- // This effect currently works for these two classifications of SkRRects |
- enum RRectType { |
- kSimple_RRectType, // SkRRect::kSimple_Type |
- kNinePatch_RRectType, // The two left x radii are the same, the two |
- // top y radii are the same, etc. |
- }; |
- |
// This effect only supports rrects where the radii are >= kRadiusMin. |
static const SkScalar kRadiusMin; |
- static GrEffectRef* Create(GrEffectEdgeType, RRectType, const SkRRect&); |
+ static GrEffectRef* Create(GrEffectEdgeType, const SkRRect&); |
virtual ~EllipticalRRectEffect() {}; |
static const char* Name() { return "EllipticalRRect"; } |
const SkRRect& getRRect() const { return fRRect; } |
- RRectType getRRectType() const { return fRRectType; } |
GrEffectEdgeType getEdgeType() const { return fEdgeType; } |
@@ -405,12 +397,11 @@ public: |
virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE; |
private: |
- EllipticalRRectEffect(GrEffectEdgeType, RRectType, const SkRRect&); |
+ EllipticalRRectEffect(GrEffectEdgeType, const SkRRect&); |
virtual bool onIsEqual(const GrEffect& other) const SK_OVERRIDE; |
SkRRect fRRect; |
- RRectType fRRectType; |
GrEffectEdgeType fEdgeType; |
GR_DECLARE_EFFECT_TEST; |
@@ -420,12 +411,9 @@ private: |
const SkScalar EllipticalRRectEffect::kRadiusMin = 0.5f; |
-GrEffectRef* EllipticalRRectEffect::Create(GrEffectEdgeType edgeType, |
- RRectType rrType, |
- const SkRRect& rrect) { |
+GrEffectRef* EllipticalRRectEffect::Create(GrEffectEdgeType edgeType, const SkRRect& rrect) { |
SkASSERT(kFillAA_GrEffectEdgeType == edgeType || kInverseFillAA_GrEffectEdgeType == edgeType); |
- return CreateEffectRef(AutoEffectUnref(SkNEW_ARGS(EllipticalRRectEffect, (edgeType, rrType, |
- rrect)))); |
+ return CreateEffectRef(AutoEffectUnref(SkNEW_ARGS(EllipticalRRectEffect, (edgeType, rrect)))); |
} |
void EllipticalRRectEffect::getConstantColorComponents(GrColor* color, uint32_t* validFlags) const { |
@@ -436,17 +424,14 @@ const GrBackendEffectFactory& EllipticalRRectEffect::getFactory() const { |
return GrTBackendEffectFactory<EllipticalRRectEffect>::getInstance(); |
} |
-EllipticalRRectEffect::EllipticalRRectEffect(GrEffectEdgeType edgeType, RRectType rrType, |
- const SkRRect& rrect) |
+EllipticalRRectEffect::EllipticalRRectEffect(GrEffectEdgeType edgeType, const SkRRect& rrect) |
: fRRect(rrect) |
- , fRRectType(rrType) |
, fEdgeType(edgeType){ |
this->setWillReadFragmentPosition(); |
} |
bool EllipticalRRectEffect::onIsEqual(const GrEffect& other) const { |
const EllipticalRRectEffect& erre = CastEffect<EllipticalRRectEffect>(other); |
- // No need to check fRRectType as it is derived from fRRect. |
return fEdgeType == erre.fEdgeType && fRRect == erre.fRRect; |
} |
@@ -551,8 +536,8 @@ void GLEllipticalRRectEffect::emitCode(GrGLShaderBuilder* builder, |
// need be computed to determine the min alpha. |
builder->fsCodeAppendf("\t\tvec2 dxy0 = %s.xy - %s.xy;\n", rectName, fragmentPos); |
builder->fsCodeAppendf("\t\tvec2 dxy1 = %s.xy - %s.zw;\n", fragmentPos, rectName); |
- switch (erre.getRRectType()) { |
- case EllipticalRRectEffect::kSimple_RRectType: { |
+ switch (erre.getRRect().getType()) { |
+ case SkRRect::kSimple_Type: { |
const char *invRadiiXYSqdName; |
fInvRadiiSqdUniform = builder->addUniform(GrGLShaderBuilder::kFragment_Visibility, |
kVec2f_GrSLType, |
@@ -563,7 +548,7 @@ void GLEllipticalRRectEffect::emitCode(GrGLShaderBuilder* builder, |
builder->fsCodeAppendf("\t\tvec2 Z = dxy * %s;\n", invRadiiXYSqdName); |
break; |
} |
- case EllipticalRRectEffect::kNinePatch_RRectType: { |
+ case SkRRect::kNinePatch_Type: { |
const char *invRadiiLTRBSqdName; |
fInvRadiiSqdUniform = builder->addUniform(GrGLShaderBuilder::kFragment_Visibility, |
kVec4f_GrSLType, |
@@ -576,7 +561,9 @@ void GLEllipticalRRectEffect::emitCode(GrGLShaderBuilder* builder, |
builder->fsCodeAppendf("\t\tvec2 Z = max(max(dxy0 * %s.xy, dxy1 * %s.zw), 0.0);\n", |
invRadiiLTRBSqdName, invRadiiLTRBSqdName); |
break; |
- } |
+ } |
+ default: |
+ GrCrash("RRect should always be simple or nine-patch."); |
} |
// implicit is the evaluation of (x/a)^2 + (y/b)^2 - 1. |
builder->fsCodeAppend("\t\tfloat implicit = dot(Z, dxy) - 1.0;\n"); |
@@ -599,7 +586,7 @@ GrGLEffect::EffectKey GLEllipticalRRectEffect::GenKey(const GrDrawEffect& drawEf |
const GrGLCaps&) { |
const EllipticalRRectEffect& erre = drawEffect.castEffect<EllipticalRRectEffect>(); |
GR_STATIC_ASSERT(kLast_GrEffectEdgeType < (1 << 3)); |
- return erre.getRRectType() | erre.getEdgeType() << 3; |
+ return erre.getRRect().getType() | erre.getEdgeType() << 3; |
} |
void GLEllipticalRRectEffect::setData(const GrGLUniformManager& uman, |
@@ -611,13 +598,13 @@ void GLEllipticalRRectEffect::setData(const GrGLUniformManager& uman, |
const SkVector& r0 = rrect.radii(SkRRect::kUpperLeft_Corner); |
SkASSERT(r0.fX >= EllipticalRRectEffect::kRadiusMin); |
SkASSERT(r0.fY >= EllipticalRRectEffect::kRadiusMin); |
- switch (erre.getRRectType()) { |
- case EllipticalRRectEffect::kSimple_RRectType: |
+ switch (erre.getRRect().getType()) { |
+ case SkRRect::kSimple_Type: |
rect.inset(r0.fX, r0.fY); |
uman.set2f(fInvRadiiSqdUniform, 1.f / (r0.fX * r0.fX), |
1.f / (r0.fY * r0.fY)); |
break; |
- case EllipticalRRectEffect::kNinePatch_RRectType: { |
+ case SkRRect::kNinePatch_Type: { |
const SkVector& r1 = rrect.radii(SkRRect::kLowerRight_Corner); |
SkASSERT(r1.fX >= EllipticalRRectEffect::kRadiusMin); |
SkASSERT(r1.fY >= EllipticalRRectEffect::kRadiusMin); |
@@ -631,6 +618,8 @@ void GLEllipticalRRectEffect::setData(const GrGLUniformManager& uman, |
1.f / (r1.fY * r1.fY)); |
break; |
} |
+ default: |
+ GrCrash("RRect should always be simple or nine-patch."); |
} |
uman.set4f(fInnerRectUniform, rect.fLeft, rect.fTop, rect.fRight, rect.fBottom); |
fPrevRRect = rrect; |
@@ -655,8 +644,7 @@ GrEffectRef* GrRRectEffect::Create(GrEffectEdgeType edgeType, const SkRRect& rre |
rrect.getSimpleRadii().fY < EllipticalRRectEffect::kRadiusMin) { |
return NULL; |
} |
- return EllipticalRRectEffect::Create(edgeType, |
- EllipticalRRectEffect::kSimple_RRectType, rrect); |
+ return EllipticalRRectEffect::Create(edgeType, rrect); |
} |
} else if (rrect.isComplex() || rrect.isNinePatch()) { |
// Check for the "tab" cases - two adjacent circular corners and two square corners. |
@@ -707,9 +695,7 @@ GrEffectRef* GrRRectEffect::Create(GrEffectEdgeType edgeType, const SkRRect& rre |
r0.fY >= EllipticalRRectEffect::kRadiusMin && |
r1.fX >= EllipticalRRectEffect::kRadiusMin && |
r1.fY >= EllipticalRRectEffect::kRadiusMin) { |
- return EllipticalRRectEffect::Create(edgeType, |
- EllipticalRRectEffect::kNinePatch_RRectType, |
- rrect); |
+ return EllipticalRRectEffect::Create(edgeType, rrect); |
} |
} |
return NULL; |