| 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" |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 130 otherAt = kUnpremul_SkAlphaType; | 130 otherAt = kUnpremul_SkAlphaType; |
| 131 } else { | 131 } else { |
| 132 otherAt = kPremul_SkAlphaType; | 132 otherAt = kPremul_SkAlphaType; |
| 133 } | 133 } |
| 134 // The other non-opaque alpha type should always succeed, but not ma
tch. | 134 // The other non-opaque alpha type should always succeed, but not ma
tch. |
| 135 test_info(r, codec, info.makeAlphaType(otherAt), expectedResult, nul
lptr); | 135 test_info(r, codec, info.makeAlphaType(otherAt), expectedResult, nul
lptr); |
| 136 } | 136 } |
| 137 } | 137 } |
| 138 } | 138 } |
| 139 | 139 |
| 140 // FIXME: SkScaledCodec is currently only supported for types used by BRD | 140 static bool supports_partial_scanlines(const char path[]) { |
| 141 // https://bug.skia.org/4428 | |
| 142 static bool supports_scaled_codec(const char path[]) { | |
| 143 static const char* const exts[] = { | 141 static const char* const exts[] = { |
| 144 "jpg", "jpeg", "png", "webp" | 142 "jpg", "jpeg", "png", "webp" |
| 145 "JPG", "JPEG", "PNG", "WEBP" | 143 "JPG", "JPEG", "PNG", "WEBP" |
| 146 }; | 144 }; |
| 147 | 145 |
| 148 for (uint32_t i = 0; i < SK_ARRAY_COUNT(exts); i++) { | 146 for (uint32_t i = 0; i < SK_ARRAY_COUNT(exts); i++) { |
| 149 if (SkStrEndsWith(path, exts[i])) { | 147 if (SkStrEndsWith(path, exts[i])) { |
| 150 return true; | 148 return true; |
| 151 } | 149 } |
| 152 } | 150 } |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 223 REPORTER_ASSERT(r, lines == 1); | 221 REPORTER_ASSERT(r, lines == 1); |
| 224 } | 222 } |
| 225 REPORTER_ASSERT(r, codec->getPixels(bm.info(), bm.getPixels(), bm.rowByt
es()) | 223 REPORTER_ASSERT(r, codec->getPixels(bm.info(), bm.getPixels(), bm.rowByt
es()) |
| 226 == expectedResult); | 224 == expectedResult); |
| 227 REPORTER_ASSERT(r, codec->getScanlines(bm.getAddr(0, 0), 1, 0) | 225 REPORTER_ASSERT(r, codec->getScanlines(bm.getAddr(0, 0), 1, 0) |
| 228 == 0); | 226 == 0); |
| 229 REPORTER_ASSERT(r, codec->skipScanlines(1) | 227 REPORTER_ASSERT(r, codec->skipScanlines(1) |
| 230 == 0); | 228 == 0); |
| 231 | 229 |
| 232 // Test partial scanline decodes | 230 // Test partial scanline decodes |
| 233 if (supports_scaled_codec(path) && info.width() >= 3) { | 231 if (supports_partial_scanlines(path) && info.width() >= 3) { |
| 234 SkCodec::Options options; | 232 SkCodec::Options options; |
| 235 int width = info.width(); | 233 int width = info.width(); |
| 236 int height = info.height(); | 234 int height = info.height(); |
| 237 SkIRect subset = SkIRect::MakeXYWH(2 * (width / 3), 0, width / 3, he
ight); | 235 SkIRect subset = SkIRect::MakeXYWH(2 * (width / 3), 0, width / 3, he
ight); |
| 238 options.fSubset = ⊂ | 236 options.fSubset = ⊂ |
| 239 | 237 |
| 240 const SkCodec::Result partialStartResult = codec->startScanlineDecod
e(info, &options, | 238 const SkCodec::Result partialStartResult = codec->startScanlineDecod
e(info, &options, |
| 241 nullptr, nullptr); | 239 nullptr, nullptr); |
| 242 REPORTER_ASSERT(r, partialStartResult == SkCodec::kSuccess); | 240 REPORTER_ASSERT(r, partialStartResult == SkCodec::kSuccess); |
| 243 | 241 |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 280 REPORTER_ASSERT(r, result == expectedResult); | 278 REPORTER_ASSERT(r, result == expectedResult); |
| 281 // Webp is the only codec that supports subsets, and it will have mo
dified the subset | 279 // Webp is the only codec that supports subsets, and it will have mo
dified the subset |
| 282 // to have even left/top. | 280 // to have even left/top. |
| 283 REPORTER_ASSERT(r, SkIsAlign2(subset.fLeft) && SkIsAlign2(subset.fTo
p)); | 281 REPORTER_ASSERT(r, SkIsAlign2(subset.fLeft) && SkIsAlign2(subset.fTo
p)); |
| 284 } else { | 282 } else { |
| 285 // No subsets will work. | 283 // No subsets will work. |
| 286 REPORTER_ASSERT(r, result == SkCodec::kUnimplemented); | 284 REPORTER_ASSERT(r, result == SkCodec::kUnimplemented); |
| 287 } | 285 } |
| 288 } | 286 } |
| 289 | 287 |
| 290 // SkScaledCodec tests | 288 // SkAndroidCodec tests |
| 291 if ((supportsScanlineDecoding || supportsSubsetDecoding) && supports_scaled_
codec(path)) { | 289 if (supportsScanlineDecoding || supportsSubsetDecoding) { |
| 292 | 290 |
| 293 SkAutoTDelete<SkStream> stream(resource(path)); | 291 SkAutoTDelete<SkStream> stream(resource(path)); |
| 294 if (!stream) { | 292 if (!stream) { |
| 295 SkDebugf("Missing resource '%s'\n", path); | 293 SkDebugf("Missing resource '%s'\n", path); |
| 296 return; | 294 return; |
| 297 } | 295 } |
| 298 | 296 |
| 299 SkAutoTDelete<SkAndroidCodec> androidCodec(nullptr); | 297 SkAutoTDelete<SkAndroidCodec> androidCodec(nullptr); |
| 300 if (isIncomplete) { | 298 if (isIncomplete) { |
| 301 size_t size = stream->getLength(); | 299 size_t size = stream->getLength(); |
| 302 SkAutoTUnref<SkData> data((SkData::NewFromStream(stream, 2 * size /
3))); | 300 SkAutoTUnref<SkData> data((SkData::NewFromStream(stream, 2 * size /
3))); |
| 303 androidCodec.reset(SkAndroidCodec::NewFromData(data)); | 301 androidCodec.reset(SkAndroidCodec::NewFromData(data)); |
| 304 } else { | 302 } else { |
| 305 androidCodec.reset(SkAndroidCodec::NewFromStream(stream.detach())); | 303 androidCodec.reset(SkAndroidCodec::NewFromStream(stream.detach())); |
| 306 } | 304 } |
| 307 if (!androidCodec) { | 305 if (!androidCodec) { |
| 308 ERRORF(r, "Unable to decode '%s'", path); | 306 ERRORF(r, "Unable to decode '%s'", path); |
| 309 return; | 307 return; |
| 310 } | 308 } |
| 311 | 309 |
| 312 SkBitmap bm; | 310 SkBitmap bm; |
| 313 SkMD5::Digest scaledCodecDigest; | 311 SkMD5::Digest androidCodecDigest; |
| 314 test_codec(r, androidCodec.get(), bm, info, size, expectedResult, &scale
dCodecDigest, | 312 test_codec(r, androidCodec.get(), bm, info, size, expectedResult, &andro
idCodecDigest, |
| 315 &codecDigest); | 313 &codecDigest); |
| 316 } | 314 } |
| 317 | 315 |
| 318 // Test SkCodecImageGenerator | 316 // Test SkCodecImageGenerator |
| 319 if (!isIncomplete) { | 317 if (!isIncomplete) { |
| 320 SkAutoTDelete<SkStream> stream(resource(path)); | 318 SkAutoTDelete<SkStream> stream(resource(path)); |
| 321 SkAutoTUnref<SkData> fullData(SkData::NewFromStream(stream, stream->getL
ength())); | 319 SkAutoTUnref<SkData> fullData(SkData::NewFromStream(stream, stream->getL
ength())); |
| 322 SkAutoTDelete<SkImageGenerator> gen(SkCodecImageGenerator::NewFromEncode
dCodec(fullData)); | 320 SkAutoTDelete<SkImageGenerator> gen(SkCodecImageGenerator::NewFromEncode
dCodec(fullData)); |
| 323 SkBitmap bm; | 321 SkBitmap bm; |
| 324 bm.allocPixels(info); | 322 bm.allocPixels(info); |
| (...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 511 test_invalid_stream(r, nonSupportedStream, sizeof(nonSupportedStream)); | 509 test_invalid_stream(r, nonSupportedStream, sizeof(nonSupportedStream)); |
| 512 test_invalid_stream(r, emptyPng, sizeof(emptyPng)); | 510 test_invalid_stream(r, emptyPng, sizeof(emptyPng)); |
| 513 test_invalid_stream(r, emptyJpeg, sizeof(emptyJpeg)); | 511 test_invalid_stream(r, emptyJpeg, sizeof(emptyJpeg)); |
| 514 test_invalid_stream(r, emptyWebp, sizeof(emptyWebp)); | 512 test_invalid_stream(r, emptyWebp, sizeof(emptyWebp)); |
| 515 test_invalid_stream(r, emptyBmp, sizeof(emptyBmp)); | 513 test_invalid_stream(r, emptyBmp, sizeof(emptyBmp)); |
| 516 test_invalid_stream(r, emptyIco, sizeof(emptyIco)); | 514 test_invalid_stream(r, emptyIco, sizeof(emptyIco)); |
| 517 test_invalid_stream(r, emptyGif, sizeof(emptyGif)); | 515 test_invalid_stream(r, emptyGif, sizeof(emptyGif)); |
| 518 } | 516 } |
| 519 | 517 |
| 520 DEF_TEST(Codec_null, r) { | 518 DEF_TEST(Codec_null, r) { |
| 521 // Attempting to create an SkCodec or an SkScaledCodec with null should not | 519 // Attempting to create an SkCodec or an SkAndroidCodec with null should not |
| 522 // crash. | 520 // crash. |
| 523 SkCodec* codec = SkCodec::NewFromStream(nullptr); | 521 SkCodec* codec = SkCodec::NewFromStream(nullptr); |
| 524 REPORTER_ASSERT(r, !codec); | 522 REPORTER_ASSERT(r, !codec); |
| 525 | 523 |
| 526 SkAndroidCodec* androidCodec = SkAndroidCodec::NewFromStream(nullptr); | 524 SkAndroidCodec* androidCodec = SkAndroidCodec::NewFromStream(nullptr); |
| 527 REPORTER_ASSERT(r, !androidCodec); | 525 REPORTER_ASSERT(r, !androidCodec); |
| 528 } | 526 } |
| 529 | 527 |
| 530 static void test_dimensions(skiatest::Reporter* r, const char path[]) { | 528 static void test_dimensions(skiatest::Reporter* r, const char path[]) { |
| 531 // Create the codec from the resource file | 529 // Create the codec from the resource file |
| (...skipping 422 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 954 // Now test an image which is too big. Any image with a larger header (i.e. | 952 // Now test an image which is too big. Any image with a larger header (i.e. |
| 955 // has bigger width/height) is also too big. | 953 // has bigger width/height) is also too big. |
| 956 const unsigned char tooBigWbmp[] = { 0x00, 0x00, // Header | 954 const unsigned char tooBigWbmp[] = { 0x00, 0x00, // Header |
| 957 0x84, 0x80, 0x00, // W: 65536 | 955 0x84, 0x80, 0x00, // W: 65536 |
| 958 0x84, 0x80, 0x00 }; // H: 65536 | 956 0x84, 0x80, 0x00 }; // H: 65536 |
| 959 stream.reset(new SkMemoryStream(tooBigWbmp, sizeof(tooBigWbmp), false)); | 957 stream.reset(new SkMemoryStream(tooBigWbmp, sizeof(tooBigWbmp), false)); |
| 960 codec.reset(SkCodec::NewFromStream(stream.detach())); | 958 codec.reset(SkCodec::NewFromStream(stream.detach())); |
| 961 | 959 |
| 962 REPORTER_ASSERT(r, !codec); | 960 REPORTER_ASSERT(r, !codec); |
| 963 } | 961 } |
| OLD | NEW |