From e19892a099a1502c7a1c92161395c2cc93c681cf Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Sun, 18 Jun 2023 10:47:05 -0400 Subject: [PATCH] WebP/Lossless: Set alpha to 0xff if is_alpha_used is false in header simple-vp8l-alpha-used-false.webp is a copy of simple-vp8l.webp, with the byte at offset 0x18 changed from 0x10 to 0x00 -- that is, the bit in the VP8L header that stores `is_alpha_used` is cleared. We would already allocated a BGRx8888 instead of a BGRA8888 bitmap, but keep actual alpha data in the `x` channel. That lead to at least `image` still writing a PNG with an alpha channel. So explicitly set the alpha channel to 0xff when is_alpha_used is false, to make sure all consumers of decoded lossless webp data have behavior consistent with other webp readers. In practice, webp encoders usually don't write files that have `is_alpha_used` set to false and then write actual alpha data to their output. So this is rarely observable. However, for example for lossy+ALPH webp files, the lossless webp used to store the ALPH channel has `is_alpha_used` set to false and all channels but green are 0 (since the lossless green channel stores the alpha channel of a lossy+ALPH webp). So if we dump such a bitmap to a standalone webp file (e.g. with the temporary debugging code in fc3249a1ca8f42e72), then without this commit here, `image` would convert that webp to a fully transparent webp, while other webp software would correctly display the green image with opaque alpha. --- Tests/LibGfx/TestImageDecoder.cpp | 23 ++++++++++++++++++ .../simple-vp8l-alpha-used-false.webp | Bin 0 -> 27650 bytes .../ImageFormats/WebPLoaderLossless.cpp | 3 +++ 3 files changed, 26 insertions(+) create mode 100644 Tests/LibGfx/test-inputs/simple-vp8l-alpha-used-false.webp diff --git a/Tests/LibGfx/TestImageDecoder.cpp b/Tests/LibGfx/TestImageDecoder.cpp index 998804bacf..5787845c25 100644 --- a/Tests/LibGfx/TestImageDecoder.cpp +++ b/Tests/LibGfx/TestImageDecoder.cpp @@ -342,10 +342,33 @@ TEST_CASE(test_webp_simple_lossless) auto frame = MUST(plugin_decoder->frame(0)); EXPECT_EQ(frame.image->size(), Gfx::IntSize(386, 395)); + EXPECT_EQ(frame.image->get_pixel(0, 0), Gfx::Color(0, 0, 0, 0)); + // This pixel tests all predictor modes except 5, 7, 8, 9, and 13. EXPECT_EQ(frame.image->get_pixel(289, 332), Gfx::Color(0xf2, 0xee, 0xd3, 255)); } +TEST_CASE(test_webp_simple_lossless_alpha_used_false) +{ + // This file is identical to simple-vp8l.webp, but the `is_alpha_used` used bit is false. + // The file still contains alpha data. This tests that the decoder replaces the stored alpha data with 0xff if `is_alpha_used` is false. + auto file = MUST(Core::MappedFile::map(TEST_INPUT("simple-vp8l-alpha-used-false.webp"sv))); + EXPECT(Gfx::WebPImageDecoderPlugin::sniff(file->bytes())); + auto plugin_decoder = MUST(Gfx::WebPImageDecoderPlugin::create(file->bytes())); + MUST(plugin_decoder->initialize()); + + EXPECT_EQ(plugin_decoder->frame_count(), 1u); + EXPECT(!plugin_decoder->is_animated()); + EXPECT(!plugin_decoder->loop_count()); + + EXPECT_EQ(plugin_decoder->size(), Gfx::IntSize(386, 395)); + + auto frame = MUST(plugin_decoder->frame(0)); + EXPECT_EQ(frame.image->size(), Gfx::IntSize(386, 395)); + + EXPECT_EQ(frame.image->get_pixel(0, 0), Gfx::Color(0, 0, 0, 0xff)); +} + TEST_CASE(test_webp_extended_lossy) { // This extended lossy image has an ALPH chunk for (losslessly compressed) alpha data. diff --git a/Tests/LibGfx/test-inputs/simple-vp8l-alpha-used-false.webp b/Tests/LibGfx/test-inputs/simple-vp8l-alpha-used-false.webp new file mode 100644 index 0000000000000000000000000000000000000000..67fc16f8ed6cbef3f8caf774ad4a8a810ec4a8ce GIT binary patch literal 27650 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 decode_webp_chunk_VP8L_contents(VP8LHeader const& for (auto const& transform : transforms.in_reverse()) bitmap = TRY(transform->transform(bitmap)); + if (!vp8l_header.is_alpha_used) + bitmap->strip_alpha_channel(); + return bitmap; }