Unify edge type enums across GrEffect subclasses that clip rendering to a geometry.

BUG=skia:
R=egdaniel@google.com, robertphillips@google.com

Author: bsalomon@google.com

Review URL: https://codereview.chromium.org/183893023

git-svn-id: http://skia.googlecode.com/svn/trunk@13674 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/gpu/effects/GrConvexPolyEffect.cpp b/src/gpu/effects/GrConvexPolyEffect.cpp
index baad928..0793bef 100644
--- a/src/gpu/effects/GrConvexPolyEffect.cpp
+++ b/src/gpu/effects/GrConvexPolyEffect.cpp
@@ -19,13 +19,12 @@
 class AARectEffect : public GrEffect {
 public:
     typedef GLAARectEffect GLEffect;
-    typedef GrConvexPolyEffect::EdgeType EdgeType;
 
     const SkRect& getRect() const { return fRect; }
 
     static const char* Name() { return "AARect"; }
 
-    static GrEffectRef* Create(EdgeType edgeType, const SkRect& rect) {
+    static GrEffectRef* Create(GrEffectEdgeType edgeType, const SkRect& rect) {
         return CreateEffectRef(AutoEffectUnref(SkNEW_ARGS(AARectEffect, (edgeType, rect))));
     }
 
@@ -40,12 +39,12 @@
         }
     }
 
-    GrConvexPolyEffect::EdgeType getEdgeType() const { return fEdgeType; }
+    GrEffectEdgeType getEdgeType() const { return fEdgeType; }
 
     virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE;
 
 private:
-    AARectEffect(EdgeType edgeType, const SkRect& rect) : fRect(rect), fEdgeType(edgeType) {
+    AARectEffect(GrEffectEdgeType edgeType, const SkRect& rect) : fRect(rect), fEdgeType(edgeType) {
         this->setWillReadFragmentPosition();
     }
 
@@ -55,7 +54,7 @@
     }
 
     SkRect fRect;
-    EdgeType fEdgeType;
+    GrEffectEdgeType fEdgeType;
 
     typedef GrEffect INHERITED;
 
@@ -69,14 +68,18 @@
                                       GrContext*,
                                       const GrDrawTargetCaps& caps,
                                       GrTexture*[]) {
-    EdgeType edgeType = static_cast<EdgeType>(
-                                    random->nextULessThan(GrConvexPolyEffect::kEdgeTypeCnt));
-
     SkRect rect = SkRect::MakeLTRB(random->nextSScalar1(),
                                    random->nextSScalar1(),
                                    random->nextSScalar1(),
                                    random->nextSScalar1());
-    return AARectEffect::Create(edgeType, rect);
+    GrEffectRef* effect;
+    do {
+        GrEffectEdgeType edgeType = static_cast<GrEffectEdgeType>(random->nextULessThan(
+                                                                    kGrEffectEdgeTypeCnt));
+
+        effect = AARectEffect::Create(edgeType, rect);
+    } while (NULL == effect);
+    return effect;
 }
 
 //////////////////////////////////////////////////////////////////////////////
@@ -125,8 +128,7 @@
                                        "rect",
                                        &rectName);
     const char* fragmentPos = builder->fragmentPosition();
-    if (GrConvexPolyEffect::kFillAA_EdgeType == aare.getEdgeType() ||
-        GrConvexPolyEffect::kInverseFillAA_EdgeType == aare.getEdgeType()) {
+    if (GrEffectEdgeTypeIsAA(aare.getEdgeType())) {
         // The amount of coverage removed in x and y by the edges is computed as a pair of negative
         // numbers, xSub and ySub.
         builder->fsCodeAppend("\t\tfloat xSub, ySub;\n");
@@ -145,8 +147,7 @@
         builder->fsCodeAppendf("\t\talpha *= (%s.w - %s.y) > 0.5 ? 1.0 : 0.0;\n", rectName, fragmentPos);
     }
 
-    if (GrConvexPolyEffect::kInverseFillAA_EdgeType == aare.getEdgeType() ||
-        GrConvexPolyEffect::kInverseFillNoAA_EdgeType == aare.getEdgeType()) {
+    if (GrEffectEdgeTypeIsInverseFill(aare.getEdgeType())) {
         builder->fsCodeAppend("\t\talpha = 1.0 - alpha;\n");
     }
     builder->fsCodeAppendf("\t\t%s = %s;\n", outputColor,
@@ -223,15 +224,10 @@
     for (int i = 0; i < cpe.getEdgeCount(); ++i) {
         builder->fsCodeAppendf("\t\tedge = dot(%s[%d], vec3(%s.x, %s.y, 1));\n",
                                edgeArrayName, i, fragmentPos, fragmentPos);
-        switch (cpe.getEdgeType()) {
-            case GrConvexPolyEffect::kFillAA_EdgeType:
-            case GrConvexPolyEffect::kInverseFillAA_EdgeType: // inverse handled at the end
-                builder->fsCodeAppend("\t\tedge = clamp(edge, 0.0, 1.0);\n");
-                break;
-            case GrConvexPolyEffect::kFillNoAA_EdgeType:
-            case GrConvexPolyEffect::kInverseFillNoAA_EdgeType: // inverse handled at the end
-                builder->fsCodeAppend("\t\tedge = edge >= 0.5 ? 1.0 : 0.0;\n");
-                break;
+        if (GrEffectEdgeTypeIsAA(cpe.getEdgeType())) {
+            builder->fsCodeAppend("\t\tedge = clamp(edge, 0.0, 1.0);\n");
+        } else {
+            builder->fsCodeAppend("\t\tedge = edge >= 0.5 ? 1.0 : 0.0;\n");
         }
         builder->fsCodeAppend("\t\talpha *= edge;\n");
     }
@@ -241,8 +237,7 @@
         builder->fsCodeAppend("\t\tif (-1.0 == alpha) {\n\t\t\tdiscard;\n\t\t}\n");
     }
 
-    if (GrConvexPolyEffect::kInverseFillAA_EdgeType == cpe.getEdgeType() ||
-        GrConvexPolyEffect::kInverseFillNoAA_EdgeType == cpe.getEdgeType() ) {
+    if (GrEffectEdgeTypeIsInverseFill(cpe.getEdgeType())) {
         builder->fsCodeAppend("\talpha = 1.0 - alpha;\n");
     }
     builder->fsCodeAppendf("\t%s = %s;\n", outputColor,
@@ -261,16 +256,18 @@
 GrGLEffect::EffectKey GrGLConvexPolyEffect::GenKey(const GrDrawEffect& drawEffect,
                                                    const GrGLCaps&) {
     const GrConvexPolyEffect& cpe = drawEffect.castEffect<GrConvexPolyEffect>();
-    GR_STATIC_ASSERT(GrConvexPolyEffect::kEdgeTypeCnt <= 4);
-    return (cpe.getEdgeCount() << 2) | cpe.getEdgeType();
+    GR_STATIC_ASSERT(kGrEffectEdgeTypeCnt <= 8);
+    return (cpe.getEdgeCount() << 3) | cpe.getEdgeType();
 }
 
 //////////////////////////////////////////////////////////////////////////////
 
-GrEffectRef* GrConvexPolyEffect::Create(EdgeType type, const SkPath& path, const SkVector* offset) {
+GrEffectRef* GrConvexPolyEffect::Create(GrEffectEdgeType type, const SkPath& path, const SkVector* offset) {
+    if (kHairlineAA_GrEffectEdgeType == type) {
+        return NULL;
+    }
     if (path.getSegmentMasks() != SkPath::kLine_SegmentMask ||
-        !path.isConvex() ||
-        path.isInverseFillType()) {
+        !path.isConvex()) {
         return NULL;
     }
 
@@ -309,10 +306,16 @@
             ++n;
         }
     }
+    if (path.isInverseFillType()) {
+        type = GrInvertEffectEdgeType(type);
+    }
     return Create(type, n, edges);
 }
 
-GrEffectRef* GrConvexPolyEffect::Create(EdgeType edgeType, const SkRect& rect) {
+GrEffectRef* GrConvexPolyEffect::Create(GrEffectEdgeType edgeType, const SkRect& rect) {
+    if (kHairlineAA_GrEffectEdgeType == edgeType){
+        return NULL;
+    }
     return AARectEffect::Create(edgeType, rect);
 }
 
@@ -326,7 +329,7 @@
     return GrTBackendEffectFactory<GrConvexPolyEffect>::getInstance();
 }
 
-GrConvexPolyEffect::GrConvexPolyEffect(EdgeType edgeType, int n, const SkScalar edges[])
+GrConvexPolyEffect::GrConvexPolyEffect(GrEffectEdgeType edgeType, int n, const SkScalar edges[])
     : fEdgeType(edgeType)
     , fEdgeCount(n) {
     // Factory function should have already ensured this.
@@ -355,12 +358,17 @@
                                             GrContext*,
                                             const GrDrawTargetCaps& caps,
                                             GrTexture*[]) {
-    EdgeType edgeType = static_cast<EdgeType>(random->nextULessThan(kEdgeTypeCnt));
     int count = random->nextULessThan(kMaxEdges) + 1;
     SkScalar edges[kMaxEdges * 3];
     for (int i = 0; i < 3 * count; ++i) {
         edges[i] = random->nextSScalar1();
     }
 
-    return GrConvexPolyEffect::Create(edgeType, count, edges);
+    GrEffectRef* effect;
+    do {
+        GrEffectEdgeType edgeType = static_cast<GrEffectEdgeType>(
+                                        random->nextULessThan(kGrEffectEdgeTypeCnt));
+        effect = GrConvexPolyEffect::Create(edgeType, count, edges);
+    } while (NULL == effect);
+    return effect;
 }