Support wbmp that are supported by SkImageDecoder

The wbmp version of SkImageDecoder will support decoding an image where
the second byte can be masked away with 0x9F. Prior to this CL, SkCodec
checked that the entire byte was zero. The SkCodec implementation
appears to be more correct (at least according to Wikipedia [1]), but
it also means we could regress if someone was using an image that did
not quite fit the specification.

[1] https://en.wikipedia.org/wiki/Wireless_Application_Protocol_Bitmap_Format

BUG=skia:3257

Review URL: https://codereview.chromium.org/1473673005
diff --git a/tests/CodexTest.cpp b/tests/CodexTest.cpp
index b53cbe1..697ba74 100644
--- a/tests/CodexTest.cpp
+++ b/tests/CodexTest.cpp
@@ -10,9 +10,11 @@
 #include "SkBitmap.h"
 #include "SkCodec.h"
 #include "SkData.h"
+#include "SkImageDecoder.h"
 #include "SkMD5.h"
 #include "SkRandom.h"
 #include "SkStream.h"
+#include "SkStreamPriv.h"
 #include "SkPngChunkReader.h"
 #include "Test.h"
 
@@ -845,3 +847,33 @@
     REPORTER_ASSERT(r, chunkReader.allHaveBeenSeen());
 }
 #endif // PNG_READ_UNKNOWN_CHUNKS_SUPPORTED
+
+// SkCodec's wbmp decoder was initially more restrictive than SkImageDecoder.
+// It required the second byte to be zero. But SkImageDecoder allowed a couple
+// of bits to be 1 (so long as they do not overlap with 0x9F). Test that
+// SkCodec now supports an image with these bits set.
+DEF_TEST(Codec_wbmp, r) {
+    const char* path = "mandrill.wbmp";
+    SkAutoTDelete<SkStream> stream(resource(path));
+    if (!stream) {
+        SkDebugf("Missing resource '%s'\n", path);
+        return;
+    }
+
+    // Modify the stream to contain a second byte with some bits set.
+    SkAutoTUnref<SkData> data(SkCopyStreamToData(stream));
+    uint8_t* writeableData = static_cast<uint8_t*>(data->writable_data());
+    writeableData[1] = static_cast<uint8_t>(~0x9F);
+
+    // SkImageDecoder supports this.
+    SkBitmap bitmap;
+    REPORTER_ASSERT(r, SkImageDecoder::DecodeMemory(data->data(), data->size(), &bitmap));
+
+    // So SkCodec should, too.
+    SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(data));
+    REPORTER_ASSERT(r, codec);
+    if (!codec) {
+        return;
+    }
+    test_info(r, codec, codec->getInfo(), SkCodec::kSuccess, nullptr);
+}