Use GrAAHairlineRenderer for line segments only if FS derivs not avail
Rebaseline complexclip_gpu for windows 
Note: complexclip_gpu gm will go red on mac and linux until I update them

Review URL: http://codereview.appspot.com/5109041/



git-svn-id: http://skia.googlecode.com/svn/trunk@2316 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/gpu/src/GrAAHairLinePathRenderer.cpp b/gpu/src/GrAAHairLinePathRenderer.cpp
index 4d05a6b..f836188 100644
--- a/gpu/src/GrAAHairLinePathRenderer.cpp
+++ b/gpu/src/GrAAHairLinePathRenderer.cpp
@@ -66,36 +66,26 @@
 }
 
 GrPathRenderer* GrAAHairLinePathRenderer::Create(GrContext* context) {
-    if (CanBeUsed(context)) {
-        const GrIndexBuffer* lIdxBuffer = context->getQuadIndexBuffer();
-        if (NULL == lIdxBuffer) {
-            return NULL;
-        }
-        GrGpu* gpu = context->getGpu();
-        GrIndexBuffer* qIdxBuf = gpu->createIndexBuffer(kQuadIdxSBufize, false);
-        SkAutoTUnref<GrIndexBuffer> qIdxBuffer(qIdxBuf); // cons will take a ref
-        if (NULL == qIdxBuf ||
-            !push_quad_index_data(qIdxBuffer.get())) {
-            return NULL;
-        }
-        return new GrAAHairLinePathRenderer(context,
-                                            lIdxBuffer,
-                                            qIdxBuf);
-    } else {
+    const GrIndexBuffer* lIdxBuffer = context->getQuadIndexBuffer();
+    if (NULL == lIdxBuffer) {
         return NULL;
     }
-}
-
-bool GrAAHairLinePathRenderer::CanBeUsed(const GrContext* context) {
-    return context->getGpu()->getCaps().fShaderDerivativeSupport;
-
+    GrGpu* gpu = context->getGpu();
+    GrIndexBuffer* qIdxBuf = gpu->createIndexBuffer(kQuadIdxSBufize, false);
+    SkAutoTUnref<GrIndexBuffer> qIdxBuffer(qIdxBuf);
+    if (NULL == qIdxBuf ||
+        !push_quad_index_data(qIdxBuf)) {
+        return NULL;
+    }
+    return new GrAAHairLinePathRenderer(context,
+                                        lIdxBuffer,
+                                        qIdxBuf);
 }
 
 GrAAHairLinePathRenderer::GrAAHairLinePathRenderer(
                                         const GrContext* context,
                                         const GrIndexBuffer* linesIndexBuffer,
                                         const GrIndexBuffer* quadsIndexBuffer) {
-    GrAssert(CanBeUsed(context));
     fLinesIndexBuffer = linesIndexBuffer;
     linesIndexBuffer->ref();
     fQuadsIndexBuffer = quadsIndexBuffer;
@@ -117,7 +107,12 @@
 bool GrAAHairLinePathRenderer::canDrawPath(const GrDrawTarget* target,
                                            const SkPath& path,
                                            GrPathFill fill) const {
-    return kHairLine_PathFill == fill;
+    static const uint32_t gReqDerivMask = SkPath::kCubic_SegmentMask |
+                                          SkPath::kQuad_SegmentMask;
+    return (kHairLine_PathFill == fill &&
+            target->isAntialiasState() &&
+            (target->getCaps().fShaderDerivativeSupport ||
+             !(gReqDerivMask & path.getSegmentMasks())));
 }
 
 void GrAAHairLinePathRenderer::pathWillClear() {