| /* | 
 |  * 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/SkBitmap.h" | 
 | #include "tests/Test.h" | 
 | #include "tools/Resources.h" | 
 | #include "tools/ToolUtils.h" | 
 |  | 
 | 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); | 
 |     } | 
 | } |