Browse Source

WebP/Lossy: Add test for lossy webp with uncompressed alpha

The alpha channel of a lossy webp is always stored separately from
the (lossy) RGB data. Alpha is either compressed in a lossless webp
that stores just the alpha data, or it's stored completely
uncompressed. (But again, even if it's compressed, it's losslessly
compressed.)

This adds a test for uncompressed alpha, which I hadn't tested before.
It seems to work correctly, though :^)

I generated the test image by running:

    ~/Downloads/libwebp-1.3.0-mac-arm64/bin/cwebp \
      -alpha_method 0 \
      Tests/LibGfx/test-inputs/extended-lossless.webp \
      -o Tests/LibGfx/test-inputs/extended-lossy-uncompressed-alpha.webp
Nico Weber 2 years ago
parent
commit
b7e31ba194

+ 25 - 0
Tests/LibGfx/TestImageDecoder.cpp

@@ -379,6 +379,31 @@ TEST_CASE(test_webp_extended_lossy)
     EXPECT_EQ(frame.image->get_pixel(341, 75), Gfx::Color(0, 0, 0, 128));
 }
 
+TEST_CASE(test_webp_extended_lossy_uncompressed_alpha)
+{
+    auto file = MUST(Core::MappedFile::map(TEST_INPUT("extended-lossy-uncompressed-alpha.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(417, 223));
+
+    auto frame = MUST(plugin_decoder->frame(0));
+    EXPECT_EQ(frame.image->size(), Gfx::IntSize(417, 223));
+
+    // While VP8 YUV contents are defined bit-exact, the YUV->RGB conversion isn't.
+    // So pixels changing by 1 or so below is fine if you change code.
+    EXPECT_EQ(frame.image->get_pixel(89, 72), Gfx::Color(255, 0, 4, 255));
+    EXPECT_EQ(frame.image->get_pixel(174, 69), Gfx::Color(4, 255, 0, 255));
+    EXPECT_EQ(frame.image->get_pixel(245, 84), Gfx::Color(0, 0, 255, 255));
+    EXPECT_EQ(frame.image->get_pixel(352, 125), Gfx::Color(0, 0, 0, 128));
+    EXPECT_EQ(frame.image->get_pixel(355, 106), Gfx::Color(0, 0, 0, 0));
+}
+
 TEST_CASE(test_webp_lossy_5)
 {
     // This is https://commons.wikimedia.org/wiki/File:Fr%C3%BChling_bl%C3%BChender_Kirschenbaum.jpg,

BIN
Tests/LibGfx/test-inputs/extended-lossy-uncompressed-alpha.webp