aboutsummaryrefslogtreecommitdiffhomepage
path: root/tests
diff options
context:
space:
mode:
authorGravatar scroggo <scroggo@google.com>2015-11-30 06:25:31 -0800
committerGravatar Commit bot <commit-bot@chromium.org>2015-11-30 06:25:31 -0800
commitb9a1e34362c282e21d9e99edededf987a48e98de (patch)
treefc5704cca9db79c17b2a560a08019ed6c418a998 /tests
parent0e7029eaef917d314475dcc9df9df174af88de52 (diff)
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
Diffstat (limited to 'tests')
-rw-r--r--tests/CodexTest.cpp32
1 files changed, 32 insertions, 0 deletions
diff --git a/tests/CodexTest.cpp b/tests/CodexTest.cpp
index b53cbe1a4d..697ba749f7 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 @@ DEF_TEST(Codec_pngChunkReader, r) {
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);
+}