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;
 }
