SkImage::NewFromGenerator(SkImageGenerator*), and a unit test.

R=reed@google.com

Author: halcanary@google.com

Review URL: https://codereview.chromium.org/465823003
diff --git a/tests/CachedDecodingPixelRefTest.cpp b/tests/CachedDecodingPixelRefTest.cpp
index 8de7da7..e9ee622 100644
--- a/tests/CachedDecodingPixelRefTest.cpp
+++ b/tests/CachedDecodingPixelRefTest.cpp
@@ -175,7 +175,7 @@
     };
     static int Width() { return 10; }
     static int Height() { return 10; }
-    static SkColor Color() { return SK_ColorCYAN; }
+    static uint32_t Color() { return 0xff123456; }
     TestImageGenerator(TestType type, skiatest::Reporter* reporter)
         : fType(type), fReporter(reporter) {
         SkASSERT((fType <= kLast_TestType) && (fType >= 0));
@@ -322,3 +322,43 @@
     check_pixelref(TestImageGenerator::kSucceedGetPixels_TestType,
                    reporter, kSkDiscardable_PixelRefType, globalPool);
 }
+
+////////////////////////////////////////////////////////////////////////////////
+
+DEF_TEST(Image_NewFromGenerator, r) {
+    TestImageGenerator::TestType testTypes[] = {
+        TestImageGenerator::kFailGetInfo_TestType,
+        TestImageGenerator::kFailGetPixels_TestType,
+        TestImageGenerator::kSucceedGetPixels_TestType,
+    };
+    for (size_t i = 0; i < SK_ARRAY_COUNT(testTypes); ++i) {
+        TestImageGenerator::TestType test = testTypes[i];
+        SkImageGenerator* gen = SkNEW_ARGS(TestImageGenerator, (test, r));
+        SkAutoTUnref<SkImage> image(SkImage::NewFromGenerator(gen));
+        if (TestImageGenerator::kFailGetInfo_TestType == test) {
+            REPORTER_ASSERT(r, NULL == image.get());
+            continue;
+        }
+        if (NULL == image.get()) {
+            ERRORF(r, "SkImage::NewFromGenerator unexpecedly failed ["
+                   SK_SIZE_T_SPECIFIER "]", i);
+            continue;
+        }
+        REPORTER_ASSERT(r, TestImageGenerator::Width() == image->width());
+        REPORTER_ASSERT(r, TestImageGenerator::Height() == image->height());
+
+        SkBitmap bitmap;
+        SkAssertResult(bitmap.allocN32Pixels(TestImageGenerator::Width(),
+                                             TestImageGenerator::Height()));
+        SkCanvas canvas(bitmap);
+        const SkColor kDefaultColor = 0xffabcdef;
+        canvas.clear(kDefaultColor);
+        image->draw(&canvas, 0, 0, NULL);
+        if (TestImageGenerator::kSucceedGetPixels_TestType == test) {
+            REPORTER_ASSERT(
+                    r, TestImageGenerator::Color() == *bitmap.getAddr32(0, 0));
+        } else {
+            REPORTER_ASSERT(r, kDefaultColor == bitmap.getColor(0,0));
+        }
+    }
+}