Add Gray support to SkPNGImageEncoder

BUG=skia:5616
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2290843002

Review-Url: https://codereview.chromium.org/2290843002
diff --git a/tests/CodecTest.cpp b/tests/CodecTest.cpp
index 8023ff2..fcbfadd 100644
--- a/tests/CodecTest.cpp
+++ b/tests/CodecTest.cpp
@@ -1074,7 +1074,31 @@
     check_color_xform(r, "mandrill_512.png");
 }
 
-DEF_TEST(Codec_Png565, r) {
+static void check_round_trip(skiatest::Reporter* r, const SkBitmap& bm1) {
+    SkColorType origColorType = bm1.colorType();
+    SkAlphaType origAlphaType = bm1.alphaType();
+
+    // Encode the image to png.
+    sk_sp<SkData> data =
+            sk_sp<SkData>(SkImageEncoder::EncodeData(bm1, SkImageEncoder::kPNG_Type, 100));
+
+    // Prepare to decode.  The codec should recognize that the PNG is 565.
+    SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(data.get()));
+    REPORTER_ASSERT(r, origColorType == codec->getInfo().colorType());
+    REPORTER_ASSERT(r, origAlphaType == codec->getInfo().alphaType());
+
+    SkBitmap bm2;
+    bm2.allocPixels(codec->getInfo());
+    SkCodec::Result result = codec->getPixels(codec->getInfo(), bm2.getPixels(), bm2.rowBytes());
+    REPORTER_ASSERT(r, SkCodec::kSuccess == result);
+
+    SkMD5::Digest d1, d2;
+    md5(bm1, &d1);
+    md5(bm2, &d2);
+    REPORTER_ASSERT(r, d1 == d2);
+}
+
+DEF_TEST(Codec_PngRoundTrip, r) {
     // Create an arbitrary 565 bitmap.
     const char* path = "mandrill_512_q075.jpg";
     SkAutoTDelete<SkStream> stream(resource(path));
@@ -1084,23 +1108,15 @@
     bm1.allocPixels(info565);
     SkCodec::Result result = codec->getPixels(info565, bm1.getPixels(), bm1.rowBytes());
     REPORTER_ASSERT(r, SkCodec::kSuccess == result);
+    check_round_trip(r, bm1);
 
-    // Encode the image to png.
-    sk_sp<SkData> data =
-            sk_sp<SkData>(SkImageEncoder::EncodeData(bm1, SkImageEncoder::kPNG_Type, 100));
-
-    // Prepare to decode.  The codec should recognize that the PNG is 565.
-    codec.reset(SkCodec::NewFromData(data.get()));
-    REPORTER_ASSERT(r, kRGB_565_SkColorType == codec->getInfo().colorType());
-    REPORTER_ASSERT(r, kOpaque_SkAlphaType == codec->getInfo().alphaType());
-
+    // Create an arbitrary gray bitmap.
+    path = "grayscale.jpg";
+    stream.reset(resource(path));
+    codec.reset(SkCodec::NewFromStream(stream.release()));
     SkBitmap bm2;
     bm2.allocPixels(codec->getInfo());
     result = codec->getPixels(codec->getInfo(), bm2.getPixels(), bm2.rowBytes());
     REPORTER_ASSERT(r, SkCodec::kSuccess == result);
-
-    SkMD5::Digest d1, d2;
-    md5(bm1, &d1);
-    md5(bm2, &d2);
-    REPORTER_ASSERT(r, d1 == d2);
+    check_round_trip(r, bm2);
 }