Fixing SkDeferredCanvas to not consider paint as opaque when xfermode source coeff depends
on destination pixel value

TEST=DeferredCanvas unit test
BUG=http://code.google.com/p/chromium/issues/detail?id=154748



git-svn-id: http://skia.googlecode.com/svn/trunk@5907 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/utils/SkDeferredCanvas.cpp b/src/utils/SkDeferredCanvas.cpp
index c3de393..13b8d28 100644
--- a/src/utils/SkDeferredCanvas.cpp
+++ b/src/utils/SkDeferredCanvas.cpp
@@ -93,6 +93,10 @@
 
     SkXfermode::Coeff srcCoeff, dstCoeff;
     if (SkXfermode::AsCoeff(paint->getXfermode(), &srcCoeff, &dstCoeff)){
+        if (SkXfermode::kDA_Coeff == srcCoeff || SkXfermode::kDC_Coeff == srcCoeff ||
+            SkXfermode::kIDA_Coeff == srcCoeff || SkXfermode::kIDC_Coeff == srcCoeff) {
+            return false;
+        }
         switch (dstCoeff) {
         case SkXfermode::kZero_Coeff:
             return true;
diff --git a/tests/DeferredCanvasTest.cpp b/tests/DeferredCanvasTest.cpp
index f0b4ad2..80747a4 100644
--- a/tests/DeferredCanvasTest.cpp
+++ b/tests/DeferredCanvasTest.cpp
@@ -101,6 +101,14 @@
         canvas.drawRect(fullRect, paint);
         REPORTER_ASSERT(reporter, canvas.isFreshFrame());
     }
+	{
+        SkPaint paint;
+        paint.setStyle( SkPaint::kFill_Style );
+        paint.setAlpha( 255 );
+        paint.setXfermodeMode(SkXfermode::kSrcIn_Mode);
+        canvas.drawRect(fullRect, paint);
+        REPORTER_ASSERT(reporter, !canvas.isFreshFrame());
+    }
     {
         SkPaint paint;
         paint.setStyle( SkPaint::kFill_Style );