Fix SkXfermode deserialization.

Validation was failing due to an inverted test condition.

BUG=417266
R=reed@google.com

Author: senorblanco@chromium.org

Review URL: https://codereview.chromium.org/596333002
diff --git a/src/core/SkXfermode.cpp b/src/core/SkXfermode.cpp
index 443aa19..8a3218f 100644
--- a/src/core/SkXfermode.cpp
+++ b/src/core/SkXfermode.cpp
@@ -1258,7 +1258,7 @@
 
 SkFlattenable* SkProcCoeffXfermode::CreateProc(SkReadBuffer& buffer) {
     uint32_t mode32 = buffer.read32();
-    if (!buffer.validate(mode32 >= SK_ARRAY_COUNT(gProcCoeffs))) {
+    if (!buffer.validate(mode32 < SK_ARRAY_COUNT(gProcCoeffs))) {
         return NULL;
     }
     return SkXfermode::Create((SkXfermode::Mode)mode32);
diff --git a/tests/SerializationTest.cpp b/tests/SerializationTest.cpp
index b6ee978..af14600 100644
--- a/tests/SerializationTest.cpp
+++ b/tests/SerializationTest.cpp
@@ -261,6 +261,19 @@
     }
 }
 
+static void TestXfermodeSerialization(skiatest::Reporter* reporter) {
+    for (size_t i = 0; i <= SkXfermode::kLastMode; ++i) {
+        if (i == SkXfermode::kSrcOver_Mode) {
+            // skip SrcOver, as it is allowed to return NULL from Create()
+            continue;
+        }
+        SkAutoTUnref<SkXfermode> mode(SkXfermode::Create(static_cast<SkXfermode::Mode>(i)));
+        REPORTER_ASSERT(reporter, mode.get());
+        SkAutoTUnref<SkXfermode> copy(
+            TestFlattenableSerialization<SkXfermode>(mode.get(), true, reporter));
+    }
+}
+
 static SkBitmap draw_picture(SkPicture& picture) {
      SkBitmap bitmap;
      bitmap.allocN32Pixels(SkScalarCeilToInt(picture.cullRect().width()), 
@@ -406,6 +419,11 @@
         TestObjectSerialization(&region, reporter);
     }
 
+    // Test xfermode serialization
+    {
+        TestXfermodeSerialization(reporter);
+    }
+
     // Test string serialization
     {
         SkString string("string");