OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "Resources.h" | 8 #include "Resources.h" |
9 #include "SkAndroidCodec.h" | 9 #include "SkAndroidCodec.h" |
10 #include "SkBitmap.h" | 10 #include "SkBitmap.h" |
11 #include "SkCodec.h" | 11 #include "SkCodec.h" |
12 #include "SkData.h" | 12 #include "SkData.h" |
13 #include "SkImageDecoder.h" | |
13 #include "SkMD5.h" | 14 #include "SkMD5.h" |
14 #include "SkRandom.h" | 15 #include "SkRandom.h" |
15 #include "SkStream.h" | 16 #include "SkStream.h" |
17 #include "SkStreamPriv.h" | |
16 #include "SkPngChunkReader.h" | 18 #include "SkPngChunkReader.h" |
17 #include "Test.h" | 19 #include "Test.h" |
18 | 20 |
19 #include "png.h" | 21 #include "png.h" |
20 | 22 |
21 static SkStreamAsset* resource(const char path[]) { | 23 static SkStreamAsset* resource(const char path[]) { |
22 SkString fullPath = GetResourcePath(path); | 24 SkString fullPath = GetResourcePath(path); |
23 return SkStream::NewFromFile(fullPath.c_str()); | 25 return SkStream::NewFromFile(fullPath.c_str()); |
24 } | 26 } |
25 | 27 |
(...skipping 812 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
838 REPORTER_ASSERT(r, chunkReader.allHaveBeenSeen()); | 840 REPORTER_ASSERT(r, chunkReader.allHaveBeenSeen()); |
839 | 841 |
840 // Decoding again will read the chunks again. | 842 // Decoding again will read the chunks again. |
841 chunkReader.reset(); | 843 chunkReader.reset(); |
842 REPORTER_ASSERT(r, !chunkReader.allHaveBeenSeen()); | 844 REPORTER_ASSERT(r, !chunkReader.allHaveBeenSeen()); |
843 result = codec->getPixels(codec->getInfo(), decodedBm.getPixels(), decodedBm .rowBytes()); | 845 result = codec->getPixels(codec->getInfo(), decodedBm.getPixels(), decodedBm .rowBytes()); |
844 REPORTER_ASSERT(r, SkCodec::kSuccess == result); | 846 REPORTER_ASSERT(r, SkCodec::kSuccess == result); |
845 REPORTER_ASSERT(r, chunkReader.allHaveBeenSeen()); | 847 REPORTER_ASSERT(r, chunkReader.allHaveBeenSeen()); |
846 } | 848 } |
847 #endif // PNG_READ_UNKNOWN_CHUNKS_SUPPORTED | 849 #endif // PNG_READ_UNKNOWN_CHUNKS_SUPPORTED |
850 | |
851 // SkCodec's wbmp decoder was initially more restrictive than SkImageDecoder. | |
852 // It required the second byte to be zero. But SkImageDecoder allowed a couple | |
853 // of bits to be 1 (so long as they do not overlap with 0x9F). Test that | |
854 // SkCodec now supports an image with these bits set. | |
855 DEF_TEST(Codec_wbmp, r) { | |
856 const char* path = "mandrill.wbmp"; | |
msarett
2015/11/30 13:24:55
Did we fail on this image before you made this cha
scroggo
2015/11/30 13:48:13
No. See below - I had to modify the image to make
msarett
2015/11/30 14:00:44
My mistake, it's perfectly clear.
| |
857 SkAutoTDelete<SkStream> stream(resource(path)); | |
858 if (!stream) { | |
859 SkDebugf("Missing resource '%s'\n", path); | |
860 return; | |
861 } | |
862 | |
863 // Modify the stream to contain a second byte with some bits set. | |
864 SkAutoTUnref<SkData> data(SkCopyStreamToData(stream)); | |
865 uint8_t* writeableData = static_cast<uint8_t*>(data->writable_data()); | |
866 writeableData[1] = static_cast<uint8_t>(~0x9F); | |
867 | |
868 // SkImageDecoder supports this. | |
869 SkBitmap bitmap; | |
870 REPORTER_ASSERT(r, SkImageDecoder::DecodeMemory(data->data(), data->size(), &bitmap)); | |
871 | |
872 // So SkCodec should, too. | |
873 SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(data)); | |
874 REPORTER_ASSERT(r, codec); | |
875 if (!codec) { | |
876 return; | |
877 } | |
878 test_info(r, codec, codec->getInfo(), SkCodec::kSuccess, nullptr); | |
879 } | |
OLD | NEW |