Add interface to SkXfermode to return a GrEffect and blend coeffs.
Review URL: https://codereview.chromium.org/13097006

git-svn-id: http://skia.googlecode.com/svn/trunk@8412 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/core/SkXfermode.cpp b/src/core/SkXfermode.cpp
index de18c26..09710a3 100644
--- a/src/core/SkXfermode.cpp
+++ b/src/core/SkXfermode.cpp
@@ -680,6 +680,22 @@
     return false;
 }
 
+bool SkXfermode::asNewEffect(GrContext*, GrEffectRef**, Coeff*, Coeff*) const {
+    return false;
+}
+
+bool SkXfermode::AsNewEffect(SkXfermode* xfermode,
+                             GrContext* context,
+                             GrEffectRef** effect,
+                             Coeff* src,
+                             Coeff* dst) {
+    if (NULL == xfermode) {
+        return ModeAsCoeff(kSrcOver_Mode, src, dst);
+    } else {
+        return xfermode->asNewEffect(context, effect, src, dst);
+    }
+}
+
 SkPMColor SkXfermode::xferColor(SkPMColor src, SkPMColor dst) const{
     // no-op. subclasses should override this
     return dst;
@@ -958,6 +974,10 @@
         return true;
     }
 
+    virtual bool asNewEffect(GrContext*, GrEffectRef**, Coeff* src, Coeff* dst) const SK_OVERRIDE {
+        return this->asCoeff(src, dst);
+    }
+
     SK_DEVELOPER_TO_STRING()
     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkProcCoeffXfermode)
 
diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp
index 77c4bd1..ad65d17 100644
--- a/src/gpu/SkGpuDevice.cpp
+++ b/src/gpu/SkGpuDevice.cpp
@@ -484,13 +484,15 @@
     SkXfermode::Coeff dm = SkXfermode::kISA_Coeff;
 
     SkXfermode* mode = skPaint.getXfermode();
-    if (mode) {
-        if (!mode->asCoeff(&sm, &dm)) {
-            //SkDEBUGCODE(SkDebugf("Unsupported xfer mode.\n");)
+    GrEffectRef* xferEffect;
+    if (SkXfermode::AsNewEffect(mode, dev->context(), &xferEffect, &sm, &dm)) {
+        // We're not ready for xfermode effects yet
+        GrAssert(NULL == xferEffect);
+    } else {
+        //SkDEBUGCODE(SkDebugf("Unsupported xfer mode.\n");)
 #if 0
-            return false;
+        return false;
 #endif
-        }
     }
     grPaint->setBlendFunc(sk_blend_to_grblend(sm), sk_blend_to_grblend(dm));