Index: tests/CodexTest.cpp |
diff --git a/tests/CodexTest.cpp b/tests/CodexTest.cpp |
index f1c5bbaa128e1c989bf06af39f27f7a22e211864..6955ce0552e5013d956a49362749d243e61e8ff4 100644 |
--- a/tests/CodexTest.cpp |
+++ b/tests/CodexTest.cpp |
@@ -79,7 +79,8 @@ static void check(skiatest::Reporter* r, |
SkISize size, |
bool supportsScanlineDecoding, |
bool supportsSubsetDecoding, |
- bool supports565 = true) { |
+ bool supports565 = true, |
+ bool isIncomplete = false) { |
SkAutoTDelete<SkStream> stream(resource(path)); |
if (!stream) { |
SkDebugf("Missing resource '%s'\n", path); |
@@ -103,7 +104,8 @@ static void check(skiatest::Reporter* r, |
SkAutoLockPixels autoLockPixels(bm); |
SkCodec::Result result = |
codec->getPixels(info, bm.getPixels(), bm.rowBytes(), nullptr, nullptr, nullptr); |
- REPORTER_ASSERT(r, result == SkCodec::kSuccess); |
+ SkCodec::Result expected = isIncomplete ? SkCodec::kIncompleteInput : SkCodec::kSuccess; |
+ REPORTER_ASSERT(r, result == expected); |
SkMD5::Digest digest; |
md5(bm, &digest); |
@@ -111,16 +113,16 @@ static void check(skiatest::Reporter* r, |
{ |
// Test decoding to 565 |
SkImageInfo info565 = info.makeColorType(kRGB_565_SkColorType); |
- SkCodec::Result expected = (supports565 && info.alphaType() == kOpaque_SkAlphaType) ? |
+ SkCodec::Result expected565 = (supports565 && info.alphaType() == kOpaque_SkAlphaType) ? |
SkCodec::kSuccess : SkCodec::kInvalidConversion; |
- test_info(r, codec, info565, expected, nullptr); |
+ test_info(r, codec, info565, expected565, nullptr); |
} |
// Verify that re-decoding gives the same result. It is interesting to check this after |
// a decode to 565, since choosing to decode to 565 may result in some of the decode |
// options being modified. These options should return to their defaults on another |
// decode to kN32, so the new digest should match the old digest. |
- test_info(r, codec, info, SkCodec::kSuccess, &digest); |
+ test_info(r, codec, info, expected, &digest); |
{ |
// Check alpha type conversions |
@@ -140,17 +142,15 @@ static void check(skiatest::Reporter* r, |
otherAt = kPremul_SkAlphaType; |
} |
// The other non-opaque alpha type should always succeed, but not match. |
- test_info(r, codec, info.makeAlphaType(otherAt), SkCodec::kSuccess, nullptr); |
+ test_info(r, codec, info.makeAlphaType(otherAt), expected, nullptr); |
} |
} |
// Scanline decoding follows. |
- // Need to call start() first. |
- REPORTER_ASSERT(r, codec->getScanlines(bm.getAddr(0, 0), 1, 0) |
- == SkCodec::kScanlineDecodingNotStarted); |
- REPORTER_ASSERT(r, codec->skipScanlines(1) |
- == SkCodec::kScanlineDecodingNotStarted); |
+ // Need to call startScanlineDecode() first. |
+ REPORTER_ASSERT(r, codec->getScanlines(bm.getAddr(0, 0), 1, 0) == 0); |
+ REPORTER_ASSERT(r, codec->skipScanlines(1) == 0); |
const SkCodec::Result startResult = codec->startScanlineDecode(info); |
if (supportsScanlineDecoding) { |
@@ -159,8 +159,10 @@ static void check(skiatest::Reporter* r, |
REPORTER_ASSERT(r, startResult == SkCodec::kSuccess); |
for (int y = 0; y < info.height(); y++) { |
- result = codec->getScanlines(bm.getAddr(0, y), 1, 0); |
- REPORTER_ASSERT(r, result == SkCodec::kSuccess); |
+ const uint32_t lines = codec->getScanlines(bm.getAddr(0, y), 1, 0); |
+ if (!isIncomplete) { |
+ REPORTER_ASSERT(r, 1 == lines); |
+ } |
} |
// verify that scanline decoding gives the same result. |
if (SkCodec::kTopDown_SkScanlineOrder == codec->getScanlineOrder()) { |
@@ -169,19 +171,19 @@ static void check(skiatest::Reporter* r, |
// Cannot continue to decode scanlines beyond the end |
REPORTER_ASSERT(r, codec->getScanlines(bm.getAddr(0, 0), 1, 0) |
- == SkCodec::kInvalidParameters); |
+ == 0); |
// Interrupting a scanline decode with a full decode starts from |
// scratch |
REPORTER_ASSERT(r, codec->startScanlineDecode(info) == SkCodec::kSuccess); |
REPORTER_ASSERT(r, codec->getScanlines(bm.getAddr(0, 0), 1, 0) |
- == SkCodec::kSuccess); |
+ == 1); |
REPORTER_ASSERT(r, codec->getPixels(bm.info(), bm.getPixels(), bm.rowBytes()) |
- == SkCodec::kSuccess); |
+ == expected); |
REPORTER_ASSERT(r, codec->getScanlines(bm.getAddr(0, 0), 1, 0) |
- == SkCodec::kScanlineDecodingNotStarted); |
+ == 0); |
REPORTER_ASSERT(r, codec->skipScanlines(1) |
- == SkCodec::kScanlineDecodingNotStarted); |
+ == 0); |
} else { |
REPORTER_ASSERT(r, startResult == SkCodec::kUnimplemented); |
} |
@@ -268,6 +270,8 @@ DEF_TEST(Codec, r) { |
check(r, "plane_interlaced.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); |
+ // Incomplete Image |
+ check(r, "incomplete_images/android.png", SkISize::Make(1024, 1218), true, false, true, true); |
} |
// Test interlaced PNG in stripes, similar to DM's kStripe_Mode |
@@ -321,12 +325,12 @@ DEF_TEST(Codec_stripes, r) { |
// Odd stripes |
for (int i = 1; i < numStripes; i += 2) { |
// Skip the even stripes |
- result = codec->skipScanlines(stripeHeight); |
- REPORTER_ASSERT(r, result == SkCodec::kSuccess); |
+ bool skipResult = codec->skipScanlines(stripeHeight); |
+ REPORTER_ASSERT(r, skipResult); |
- result = codec->getScanlines(bm.getAddr(0, i * stripeHeight), stripeHeight, |
+ int linesDecoded = codec->getScanlines(bm.getAddr(0, i * stripeHeight), stripeHeight, |
bm.rowBytes()); |
- REPORTER_ASSERT(r, result == SkCodec::kSuccess); |
+ REPORTER_ASSERT(r, linesDecoded == stripeHeight); |
} |
// Even stripes |
@@ -334,14 +338,14 @@ DEF_TEST(Codec_stripes, r) { |
REPORTER_ASSERT(r, result == SkCodec::kSuccess); |
for (int i = 0; i < numStripes; i += 2) { |
- result = codec->getScanlines(bm.getAddr(0, i * stripeHeight), stripeHeight, |
+ int linesDecoded = codec->getScanlines(bm.getAddr(0, i * stripeHeight), stripeHeight, |
bm.rowBytes()); |
- REPORTER_ASSERT(r, result == SkCodec::kSuccess); |
+ REPORTER_ASSERT(r, linesDecoded == stripeHeight); |
// Skip the odd stripes |
if (i + 1 < numStripes) { |
- result = codec->skipScanlines(stripeHeight); |
- REPORTER_ASSERT(r, result == SkCodec::kSuccess); |
+ bool skipResult = codec->skipScanlines(stripeHeight); |
+ REPORTER_ASSERT(r, skipResult); |
} |
} |
@@ -350,12 +354,12 @@ DEF_TEST(Codec_stripes, r) { |
result = codec->startScanlineDecode(info); |
REPORTER_ASSERT(r, result == SkCodec::kSuccess); |
- result = codec->skipScanlines(height - remainingLines); |
- REPORTER_ASSERT(r, result == SkCodec::kSuccess); |
+ bool skipResult = codec->skipScanlines(height - remainingLines); |
+ REPORTER_ASSERT(r, skipResult); |
- result = codec->getScanlines(bm.getAddr(0, height - remainingLines), |
+ int linesDecoded = codec->getScanlines(bm.getAddr(0, height - remainingLines), |
remainingLines, bm.rowBytes()); |
- REPORTER_ASSERT(r, result == SkCodec::kSuccess); |
+ REPORTER_ASSERT(r, linesDecoded == remainingLines); |
} |
compare_to_good_digest(r, digest, bm); |