Make GrConvexPolyEffect support inverse fills and non-AA rects

BUG=skia:2151
R=robertphillips@google.com

Author: bsalomon@google.com

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

git-svn-id: http://skia.googlecode.com/svn/trunk@13621 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/gm/convexpolyeffect.cpp b/gm/convexpolyeffect.cpp
index 2632bd4..9142ca9 100644
--- a/gm/convexpolyeffect.cpp
+++ b/gm/convexpolyeffect.cpp
@@ -44,7 +44,7 @@
     }
 
     virtual SkISize onISize() SK_OVERRIDE {
-        return make_isize(475, 800);
+        return make_isize(720, 800);
     }
 
     virtual uint32_t onGetFlags() const SK_OVERRIDE {
@@ -100,7 +100,6 @@
         fRects.addToTail(SkRect::MakeLTRB(5.05f, .55f, 5.45f, .85f));
         // inverted in x and y
         fRects.addToTail(SkRect::MakeLTRB(100.f, 50.5f, 5.f, 0.5f));
-
     }
 
     virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
@@ -174,55 +173,58 @@
             y += SkScalarCeilToScalar(path->getBounds().height() + 20.f);
         }
 
-        // Draw rects. We only have specialized effect code for the AA case, so don't do non-AA.
         for (SkTLList<SkRect>::Iter iter(fRects, SkTLList<SkRect>::Iter::kHead_IterStart);
              NULL != iter.get();
              iter.next()) {
 
             SkScalar x = 0;
 
-            GrTestTarget tt;
-            context->getTestTarget(&tt);
-            if (NULL == tt.target()) {
-                SkDEBUGFAIL("Couldn't get Gr test target.");
-                return;
+            for (int et = 0; et < GrConvexPolyEffect::kEdgeTypeCnt; ++et) {
+                GrTestTarget tt;
+                context->getTestTarget(&tt);
+                if (NULL == tt.target()) {
+                    SkDEBUGFAIL("Couldn't get Gr test target.");
+                    return;
+                }
+                SkRect rect = *iter.get();
+                rect.offset(x, y);
+                GrConvexPolyEffect::EdgeType edgeType = (GrConvexPolyEffect::EdgeType) et;
+                SkAutoTUnref<GrEffectRef> effect(GrConvexPolyEffect::Create(edgeType, rect));
+                if (!effect) {
+                    SkDEBUGFAIL("Couldn't create convex poly effect.");
+                    return;
+                }
+
+                GrDrawState* drawState = tt.target()->drawState();
+                drawState->setVertexAttribs<kAttribs>(SK_ARRAY_COUNT(kAttribs));
+                drawState->addCoverageEffect(effect, 1);
+                drawState->setIdentityViewMatrix();
+                drawState->setRenderTarget(rt);
+                drawState->setColor(0xff000000);
+
+                SkPoint verts[4];
+                SkRect bounds = rect;
+                bounds.outset(5.f, 5.f);
+                bounds.toQuad(verts);
+
+                tt.target()->setVertexSourceToArray(verts, 4);
+                tt.target()->setIndexSourceToBuffer(context->getQuadIndexBuffer());
+                tt.target()->drawIndexed(kTriangleFan_GrPrimitiveType, 0, 0, 4, 6);
+
+                x += SkScalarCeilToScalar(rect.width() + 10.f);
             }
 
-            SkRect rect = *iter.get();
-            rect.offset(x, y);
-            SkAutoTUnref<GrEffectRef> effect(GrConvexPolyEffect::CreateForAAFillRect(rect));
-            if (!effect) {
-                SkDEBUGFAIL("Couldn't create convex poly effect.");
-                return;
-            }
-
-            GrDrawState* drawState = tt.target()->drawState();
-            drawState->setVertexAttribs<kAttribs>(SK_ARRAY_COUNT(kAttribs));
-            drawState->addCoverageEffect(effect, 1);
-            drawState->setIdentityViewMatrix();
-            drawState->setRenderTarget(rt);
-            drawState->setColor(0xff000000);
-
-            SkPoint verts[4];
-            SkRect bounds = rect;
-            bounds.outset(5.f, 5.f);
-            bounds.toQuad(verts);
-
-            tt.target()->setVertexSourceToArray(verts, 4);
-            tt.target()->setIndexSourceToBuffer(context->getQuadIndexBuffer());
-            tt.target()->drawIndexed(kTriangleFan_GrPrimitiveType, 0, 0, 4, 6);
-
-            x += SkScalarCeilToScalar(rect.width() + 10.f);
-
-            // Draw AA rect using normal API for reference
+            // Draw rect without and with AA using normal API for reference
             canvas->save();
             canvas->translate(x, y);
             SkPaint paint;
+            canvas->drawRect(*iter.get(), paint);
+            x += SkScalarCeilToScalar(iter.get()->width() + 10.f);
             paint.setAntiAlias(true);
             canvas->drawRect(*iter.get(), paint);
             canvas->restore();
 
-            y += SkScalarCeilToScalar(rect.height() + 20.f);
+            y += SkScalarCeilToScalar(iter.get()->height() + 20.f);
         }
     }