| /* | |
| * Copyright 2020 Google LLC | |
| * | |
| * Use of this source code is governed by a BSD-style license that can be | |
| * found in the LICENSE file. | |
| */ | |
| #include "include/codec/SkCodec.h" | |
| #include "include/core/SkAlphaType.h" | |
| #include "include/core/SkBitmap.h" | |
| #include "include/core/SkImageInfo.h" | |
| #include "tests/Test.h" | |
| #include "tools/Resources.h" | |
| #include "tools/ToolUtils.h" | |
| #include <memory> | |
| DEF_TEST(WebpCodecBlend, r) { | |
| const char* path = "images/blendBG.webp"; | |
| auto codec = SkCodec::MakeFromData(GetResourceAsData(path)); | |
| if (!codec) { | |
| ERRORF(r, "Failed to open/decode %s", path); | |
| return; | |
| } | |
| // Previously, a bug in SkWebpCodec resulted in different output depending | |
| // on whether kPremul or kOpaque SkAlphaType was passed to getPixels(). | |
| // Decode each frame twice, once with kPremul and once with kOpaque if the | |
| // frame is opaque, and verify they look the same. | |
| auto premulInfo = codec->getInfo().makeAlphaType(kPremul_SkAlphaType); | |
| SkBitmap premulBm, changeBm; | |
| premulBm.allocPixels(premulInfo); | |
| changeBm.allocPixels(premulInfo); // The SkBitmap's SkAlphaType is unrelated to the bug. | |
| for (int i = 0; i < codec->getFrameCount(); i++) { | |
| SkCodec::Options options; | |
| options.fFrameIndex = i; | |
| auto result = codec->getPixels(premulBm.pixmap(), &options); | |
| if (result != SkCodec::kSuccess) { | |
| ERRORF(r, "Failed to decode %s frame %i (premul) - error %s", path, i, | |
| SkCodec::ResultToString(result)); | |
| return; | |
| } | |
| SkCodec::FrameInfo frameInfo; | |
| if (!codec->getFrameInfo(i, &frameInfo)) { | |
| ERRORF(r, "Failed to getFrameInfo for %s frame %i", path, i); | |
| return; | |
| } | |
| auto alphaType = frameInfo.fAlphaType == kOpaque_SkAlphaType ? kOpaque_SkAlphaType | |
| : kPremul_SkAlphaType; | |
| result = codec->getPixels(premulInfo.makeAlphaType(alphaType), changeBm.getPixels(), | |
| changeBm.rowBytes(), &options); | |
| if (result != SkCodec::kSuccess) { | |
| ERRORF(r, "Failed to decode %s frame %i (change) - error %s", path, i, | |
| SkCodec::ResultToString(result)); | |
| return; | |
| } | |
| REPORTER_ASSERT(r, ToolUtils::equal_pixels(premulBm, changeBm), "%s frame %i does not match" | |
| " with mismatched SkAlphaType", path, i); | |
| } | |
| } |