Index: tests/CodexTest.cpp |
diff --git a/tests/CodexTest.cpp b/tests/CodexTest.cpp |
index f4682055a42d8a67f17a578781774b6536d7e5cb..82e490a2bd5676d2eb69be89cdd5e5d69eb33725 100644 |
--- a/tests/CodexTest.cpp |
+++ b/tests/CodexTest.cpp |
@@ -9,6 +9,7 @@ |
#include "SkBitmap.h" |
#include "SkCodec.h" |
#include "SkMD5.h" |
+#include "SkRandom.h" |
#include "SkScanlineDecoder.h" |
#include "Test.h" |
@@ -41,10 +42,23 @@ static void compare_to_good_digest(skiatest::Reporter* r, const SkMD5::Digest& g |
REPORTER_ASSERT(r, digest == goodDigest); |
} |
+SkIRect generate_random_subset(SkRandom* rand, int w, int h) { |
+ SkIRect rect; |
+ do { |
+ rect.fLeft = rand->nextRangeU(0, w); |
+ rect.fTop = rand->nextRangeU(0, h); |
+ rect.fRight = rand->nextRangeU(0, w); |
+ rect.fBottom = rand->nextRangeU(0, h); |
+ rect.sort(); |
+ } while (rect.isEmpty()); |
+ return rect; |
+} |
+ |
static void check(skiatest::Reporter* r, |
const char path[], |
SkISize size, |
- bool supportsScanlineDecoding) { |
+ bool supportsScanlineDecoding, |
+ bool supportsSubsetDecoding) { |
SkAutoTDelete<SkStream> stream(resource(path)); |
if (!stream) { |
SkDebugf("Missing resource '%s'\n", path); |
@@ -102,53 +116,88 @@ static void check(skiatest::Reporter* r, |
} else { |
REPORTER_ASSERT(r, !scanlineDecoder); |
} |
+ |
+ // The rest of this function tests decoding subsets, and will decode an arbitrary number of |
+ // random subsets. |
+ // Do not attempt to decode subsets of an image of only once pixel, since there is no |
+ // meaningful subset. |
+ if (size.width() * size.height() == 1) { |
+ return; |
+ } |
+ |
+ SkRandom rand; |
+ SkIRect subset; |
+ SkCodec::Options opts; |
+ opts.fSubset = ⊂ |
+ for (int i = 0; i < 5; i++) { |
+ subset = generate_random_subset(&rand, size.width(), size.height()); |
+ SkASSERT(!subset.isEmpty()); |
+ const bool supported = codec->getValidSubset(&subset); |
+ REPORTER_ASSERT(r, supported == supportsSubsetDecoding); |
+ |
+ SkImageInfo subsetInfo = info.makeWH(subset.width(), subset.height()); |
+ SkBitmap bm; |
+ bm.allocPixels(subsetInfo); |
+ const SkCodec::Result result = codec->getPixels(bm.info(), bm.getPixels(), bm.rowBytes(), |
+ &opts, NULL, NULL); |
+ |
+ if (supportsSubsetDecoding) { |
+ REPORTER_ASSERT(r, result == SkCodec::kSuccess); |
+ // Webp is the only codec that supports subsets, and it will have modified the subset |
+ // to have even left/top. |
+ REPORTER_ASSERT(r, SkIsAlign2(subset.fLeft) && SkIsAlign2(subset.fTop)); |
+ } else { |
+ // No subsets will work. |
+ REPORTER_ASSERT(r, result == SkCodec::kUnimplemented); |
+ } |
+ } |
} |
DEF_TEST(Codec, r) { |
// WBMP |
- check(r, "mandrill.wbmp", SkISize::Make(512, 512), false); |
+ check(r, "mandrill.wbmp", SkISize::Make(512, 512), false, false); |
// WEBP |
- check(r, "baby_tux.webp", SkISize::Make(386, 395), false); |
- check(r, "color_wheel.webp", SkISize::Make(128, 128), false); |
- check(r, "yellow_rose.webp", SkISize::Make(400, 301), false); |
+ check(r, "baby_tux.webp", SkISize::Make(386, 395), false, true); |
+ check(r, "color_wheel.webp", SkISize::Make(128, 128), false, true); |
+ check(r, "yellow_rose.webp", SkISize::Make(400, 301), false, true); |
// BMP |
- check(r, "randPixels.bmp", SkISize::Make(8, 8), false); |
+ check(r, "randPixels.bmp", SkISize::Make(8, 8), false, false); |
// ICO |
// These two tests examine interestingly different behavior: |
// Decodes an embedded BMP image |
- check(r, "color_wheel.ico", SkISize::Make(128, 128), false); |
+ check(r, "color_wheel.ico", SkISize::Make(128, 128), false, false); |
// Decodes an embedded PNG image |
- check(r, "google_chrome.ico", SkISize::Make(256, 256), false); |
+ check(r, "google_chrome.ico", SkISize::Make(256, 256), false, false); |
// GIF |
- check(r, "box.gif", SkISize::Make(200, 55), false); |
- check(r, "color_wheel.gif", SkISize::Make(128, 128), false); |
- check(r, "randPixels.gif", SkISize::Make(8, 8), false); |
+ check(r, "box.gif", SkISize::Make(200, 55), false, false); |
+ check(r, "color_wheel.gif", SkISize::Make(128, 128), false, false); |
+ check(r, "randPixels.gif", SkISize::Make(8, 8), false, false); |
// JPG |
- check(r, "CMYK.jpg", SkISize::Make(642, 516), true); |
- check(r, "color_wheel.jpg", SkISize::Make(128, 128), true); |
- check(r, "grayscale.jpg", SkISize::Make(128, 128), true); |
- check(r, "mandrill_512_q075.jpg", SkISize::Make(512, 512), true); |
- check(r, "randPixels.jpg", SkISize::Make(8, 8), true); |
+ check(r, "CMYK.jpg", SkISize::Make(642, 516), true, false); |
+ check(r, "color_wheel.jpg", SkISize::Make(128, 128), true, false); |
+ check(r, "grayscale.jpg", SkISize::Make(128, 128), true, false); |
+ check(r, "mandrill_512_q075.jpg", SkISize::Make(512, 512), true, false); |
+ check(r, "randPixels.jpg", SkISize::Make(8, 8), true, false); |
// PNG |
- check(r, "arrow.png", SkISize::Make(187, 312), true); |
- check(r, "baby_tux.png", SkISize::Make(240, 246), true); |
- check(r, "color_wheel.png", SkISize::Make(128, 128), true); |
- check(r, "half-transparent-white-pixel.png", SkISize::Make(1, 1), true); |
- check(r, "mandrill_128.png", SkISize::Make(128, 128), true); |
- check(r, "mandrill_16.png", SkISize::Make(16, 16), true); |
- check(r, "mandrill_256.png", SkISize::Make(256, 256), true); |
- check(r, "mandrill_32.png", SkISize::Make(32, 32), true); |
- check(r, "mandrill_512.png", SkISize::Make(512, 512), true); |
- check(r, "mandrill_64.png", SkISize::Make(64, 64), true); |
- check(r, "plane.png", SkISize::Make(250, 126), true); |
- check(r, "randPixels.png", SkISize::Make(8, 8), true); |
- check(r, "yellow_rose.png", SkISize::Make(400, 301), true); |
+ check(r, "arrow.png", SkISize::Make(187, 312), true, false); |
+ check(r, "baby_tux.png", SkISize::Make(240, 246), true, false); |
+ check(r, "color_wheel.png", SkISize::Make(128, 128), true, false); |
+ check(r, "half-transparent-white-pixel.png", SkISize::Make(1, 1), true, false); |
+ check(r, "mandrill_128.png", SkISize::Make(128, 128), true, false); |
+ check(r, "mandrill_16.png", SkISize::Make(16, 16), true, false); |
+ check(r, "mandrill_256.png", SkISize::Make(256, 256), true, false); |
+ check(r, "mandrill_32.png", SkISize::Make(32, 32), true, false); |
+ check(r, "mandrill_512.png", SkISize::Make(512, 512), true, false); |
+ check(r, "mandrill_64.png", SkISize::Make(64, 64), true, false); |
+ check(r, "plane.png", SkISize::Make(250, 126), true, false); |
+ check(r, "randPixels.png", SkISize::Make(8, 8), true, false); |
+ check(r, "yellow_rose.png", SkISize::Make(400, 301), true, false); |
} |
static void test_invalid_stream(skiatest::Reporter* r, const void* stream, size_t len) { |