From 1faf9bb44fb1d99c246d8d229c95d34616c2a559 Mon Sep 17 00:00:00 2001 From: Lucas CHOLLET Date: Mon, 22 Jan 2024 21:19:42 -0500 Subject: [PATCH] LibGfx/TIFF: Apply the HorizontalDifferencing on the alpha channel When present, the alpha channel is also affected by the horizontal differencing predictor. The test case was generated with GIMP with the following steps: - Open an RGB image - Add a transparency layer - Export as TIFF with the LZW compression scheme --- Tests/LibGfx/TestImageDecoder.cpp | 12 ++++++++++++ .../test-inputs/tiff/alpha_predictor.tiff | Bin 0 -> 13915 bytes .../LibGfx/ImageFormats/TIFFLoader.cpp | 2 ++ 3 files changed, 14 insertions(+) create mode 100644 Tests/LibGfx/test-inputs/tiff/alpha_predictor.tiff diff --git a/Tests/LibGfx/TestImageDecoder.cpp b/Tests/LibGfx/TestImageDecoder.cpp index 069daa4d27..0afa5f2878 100644 --- a/Tests/LibGfx/TestImageDecoder.cpp +++ b/Tests/LibGfx/TestImageDecoder.cpp @@ -676,6 +676,18 @@ TEST_CASE(test_tiff_palette_alpha) EXPECT_EQ(frame.image->get_pixel(60, 75), Gfx::Color::NamedColor::Red); } +TEST_CASE(test_tiff_alpha_predictor) +{ + auto file = TRY_OR_FAIL(Core::MappedFile::map(TEST_INPUT("tiff/alpha_predictor.tiff"sv))); + EXPECT(Gfx::TIFFImageDecoderPlugin::sniff(file->bytes())); + auto plugin_decoder = TRY_OR_FAIL(Gfx::TIFFImageDecoderPlugin::create(file->bytes())); + + auto frame = TRY_OR_FAIL(expect_single_frame_of_size(*plugin_decoder, { 400, 300 })); + + EXPECT_EQ(frame.image->get_pixel(0, 0).alpha(), 255); + EXPECT_EQ(frame.image->get_pixel(60, 75), Gfx::Color::NamedColor::Red); +} + TEST_CASE(test_tiff_16_bits) { auto file = TRY_OR_FAIL(Core::MappedFile::map(TEST_INPUT("tiff/16_bits.tiff"sv))); diff --git a/Tests/LibGfx/test-inputs/tiff/alpha_predictor.tiff b/Tests/LibGfx/test-inputs/tiff/alpha_predictor.tiff new file mode 100644 index 0000000000000000000000000000000000000000..b727ba2c30d09eba7a3a5f2d0ea7a189efa87d28 GIT binary patch literal 13915 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 + color.red()); color.set_green(last_color->green() + color.green()); color.set_blue(last_color->blue() + color.blue()); + if (alpha_channel_index().has_value()) + color.set_alpha(last_color->alpha() + color.alpha()); } last_color = color;