| 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);
|
|
|