| Index: tests/CodecTest.cpp
|
| diff --git a/tests/CodecTest.cpp b/tests/CodecTest.cpp
|
| index 348bc64739abb433e69a933c95d178ea17982fca..044c2fd6b45ff733b5c7c2c55eec5fd265570ee9 100644
|
| --- a/tests/CodecTest.cpp
|
| +++ b/tests/CodecTest.cpp
|
| @@ -1073,22 +1073,53 @@ DEF_TEST(Codec_ColorXform, r) {
|
| check_color_xform(r, "mandrill_512.png");
|
| }
|
|
|
| -static void check_round_trip(skiatest::Reporter* r, const SkBitmap& bm1) {
|
| - SkColorType origColorType = bm1.colorType();
|
| - SkAlphaType origAlphaType = bm1.alphaType();
|
| +static bool color_type_match(SkColorType origColorType, SkColorType codecColorType) {
|
| + switch (origColorType) {
|
| + case kRGBA_8888_SkColorType:
|
| + case kBGRA_8888_SkColorType:
|
| + return kRGBA_8888_SkColorType == codecColorType ||
|
| + kBGRA_8888_SkColorType == codecColorType;
|
| + default:
|
| + return origColorType == codecColorType;
|
| + }
|
| +}
|
| +
|
| +static bool alpha_type_match(SkAlphaType origAlphaType, SkAlphaType codecAlphaType) {
|
| + switch (origAlphaType) {
|
| + case kUnpremul_SkAlphaType:
|
| + case kPremul_SkAlphaType:
|
| + return kUnpremul_SkAlphaType == codecAlphaType ||
|
| + kPremul_SkAlphaType == codecAlphaType;
|
| + default:
|
| + return origAlphaType == codecAlphaType;
|
| + }
|
| +}
|
| +
|
| +static void check_round_trip(skiatest::Reporter* r, SkCodec* origCodec, const SkImageInfo& info) {
|
| + SkBitmap bm1;
|
| + SkPMColor colors[256];
|
| + SkAutoTUnref<SkColorTable> colorTable1(new SkColorTable(colors, 256));
|
| + bm1.allocPixels(info, nullptr, colorTable1.get());
|
| + int numColors;
|
| + SkCodec::Result result = origCodec->getPixels(info, bm1.getPixels(), bm1.rowBytes(), nullptr,
|
| + const_cast<SkPMColor*>(colorTable1->readColors()),
|
| + &numColors);
|
| + // This will fail to update colorTable1->count() but is fine for the purpose of this test.
|
| + REPORTER_ASSERT(r, SkCodec::kSuccess == result);
|
|
|
| // Encode the image to png.
|
| sk_sp<SkData> data =
|
| sk_sp<SkData>(SkImageEncoder::EncodeData(bm1, SkImageEncoder::kPNG_Type, 100));
|
|
|
| - // Prepare to decode. The codec should recognize that the PNG is 565.
|
| SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(data));
|
| - REPORTER_ASSERT(r, origColorType == codec->getInfo().colorType());
|
| - REPORTER_ASSERT(r, origAlphaType == codec->getInfo().alphaType());
|
| + REPORTER_ASSERT(r, color_type_match(info.colorType(), codec->getInfo().colorType()));
|
| + REPORTER_ASSERT(r, alpha_type_match(info.alphaType(), codec->getInfo().alphaType()));
|
|
|
| SkBitmap bm2;
|
| - bm2.allocPixels(codec->getInfo());
|
| - SkCodec::Result result = codec->getPixels(codec->getInfo(), bm2.getPixels(), bm2.rowBytes());
|
| + SkAutoTUnref<SkColorTable> colorTable2(new SkColorTable(colors, 256));
|
| + bm2.allocPixels(info, nullptr, colorTable2.get());
|
| + result = codec->getPixels(info, bm2.getPixels(), bm2.rowBytes(), nullptr,
|
| + const_cast<SkPMColor*>(colorTable2->readColors()), &numColors);
|
| REPORTER_ASSERT(r, SkCodec::kSuccess == result);
|
|
|
| SkMD5::Digest d1, d2;
|
| @@ -1098,26 +1129,52 @@ static void check_round_trip(skiatest::Reporter* r, const SkBitmap& bm1) {
|
| }
|
|
|
| DEF_TEST(Codec_PngRoundTrip, r) {
|
| - // Create an arbitrary 565 bitmap.
|
| const char* path = "mandrill_512_q075.jpg";
|
| SkAutoTDelete<SkStream> stream(resource(path));
|
| SkAutoTDelete<SkCodec> codec(SkCodec::NewFromStream(stream.release()));
|
| - SkImageInfo info565 = codec->getInfo().makeColorType(kRGB_565_SkColorType);
|
| - SkBitmap bm1;
|
| - bm1.allocPixels(info565);
|
| - SkCodec::Result result = codec->getPixels(info565, bm1.getPixels(), bm1.rowBytes());
|
| - REPORTER_ASSERT(r, SkCodec::kSuccess == result);
|
| - check_round_trip(r, bm1);
|
|
|
| - // Create an arbitrary gray bitmap.
|
| + SkColorType colorTypesOpaque[] = {
|
| + kRGB_565_SkColorType, kRGBA_8888_SkColorType, kBGRA_8888_SkColorType
|
| + };
|
| + for (SkColorType colorType : colorTypesOpaque) {
|
| + SkImageInfo newInfo = codec->getInfo().makeColorType(colorType);
|
| + check_round_trip(r, codec.get(), newInfo);
|
| + }
|
| +
|
| path = "grayscale.jpg";
|
| stream.reset(resource(path));
|
| codec.reset(SkCodec::NewFromStream(stream.release()));
|
| - SkBitmap bm2;
|
| - bm2.allocPixels(codec->getInfo());
|
| - result = codec->getPixels(codec->getInfo(), bm2.getPixels(), bm2.rowBytes());
|
| - REPORTER_ASSERT(r, SkCodec::kSuccess == result);
|
| - check_round_trip(r, bm2);
|
| + check_round_trip(r, codec.get(), codec->getInfo());
|
| +
|
| + path = "yellow_rose.png";
|
| + stream.reset(resource(path));
|
| + codec.reset(SkCodec::NewFromStream(stream.release()));
|
| +
|
| + SkColorType colorTypesWithAlpha[] = {
|
| + kRGBA_8888_SkColorType, kBGRA_8888_SkColorType
|
| + };
|
| + SkAlphaType alphaTypes[] = {
|
| + kUnpremul_SkAlphaType, kPremul_SkAlphaType
|
| + };
|
| + for (SkColorType colorType : colorTypesWithAlpha) {
|
| + for (SkAlphaType alphaType : alphaTypes) {
|
| + // Set color space to nullptr because color correct premultiplies do not round trip.
|
| + SkImageInfo newInfo = codec->getInfo().makeColorType(colorType)
|
| + .makeAlphaType(alphaType)
|
| + .makeColorSpace(nullptr);
|
| + check_round_trip(r, codec.get(), newInfo);
|
| + }
|
| + }
|
| +
|
| + path = "index8.png";
|
| + stream.reset(resource(path));
|
| + codec.reset(SkCodec::NewFromStream(stream.release()));
|
| +
|
| + for (SkAlphaType alphaType : alphaTypes) {
|
| + SkImageInfo newInfo = codec->getInfo().makeAlphaType(alphaType)
|
| + .makeColorSpace(nullptr);
|
| + check_round_trip(r, codec.get(), newInfo);
|
| + }
|
| }
|
|
|
| static void test_conversion_possible(skiatest::Reporter* r, const char* path,
|
|
|