From b22341fc772b538f725f2657c2e3af39cb1af143 Mon Sep 17 00:00:00 2001 From: Psychpsyo Date: Sun, 10 Nov 2024 17:39:40 +0100 Subject: [PATCH] LibGfx: Support AVIF images with missing pixi property --- Libraries/LibGfx/ImageFormats/AVIFLoader.cpp | 5 +++++ Tests/LibGfx/TestImageDecoder.cpp | 6 ++++++ .../test-inputs/avif/missing-pixi-property.avif | Bin 0 -> 3315 bytes 3 files changed, 11 insertions(+) create mode 100644 Tests/LibGfx/test-inputs/avif/missing-pixi-property.avif diff --git a/Libraries/LibGfx/ImageFormats/AVIFLoader.cpp b/Libraries/LibGfx/ImageFormats/AVIFLoader.cpp index f10030bbccc..1f68fc3c91b 100644 --- a/Libraries/LibGfx/ImageFormats/AVIFLoader.cpp +++ b/Libraries/LibGfx/ImageFormats/AVIFLoader.cpp @@ -68,6 +68,11 @@ static ErrorOr decode_avif_header(AVIFLoadingContext& context) if (context.decoder == nullptr) { return Error::from_string_literal("failed to allocate AVIF decoder"); } + + // This makes the decoder not error if an item in the file is missing the mandatory pixi property. + // Reason for this is that older versions of ImageMagick do not set this property, which leads to + // broken web content if the error is not ignored. + context.decoder->strictFlags &= ~AVIF_STRICT_PIXI_REQUIRED; } avifResult result = avifDecoderSetIOMemory(context.decoder, context.data.data(), context.data.size()); diff --git a/Tests/LibGfx/TestImageDecoder.cpp b/Tests/LibGfx/TestImageDecoder.cpp index f9287720d77..201553c870d 100644 --- a/Tests/LibGfx/TestImageDecoder.cpp +++ b/Tests/LibGfx/TestImageDecoder.cpp @@ -1067,3 +1067,9 @@ TEST_CASE(test_avif_frame_out_of_bounds) auto frame1 = TRY_OR_FAIL(plugin_decoder->frame(0)); EXPECT(plugin_decoder->frame(1).is_error()); } + +TEST_CASE(test_avif_missing_pixi_property) +{ + auto file = TRY_OR_FAIL(Core::MappedFile::map(TEST_INPUT("avif/missing-pixi-property.avif"sv))); + EXPECT(Gfx::AVIFImageDecoderPlugin::sniff(file->bytes())); +} diff --git a/Tests/LibGfx/test-inputs/avif/missing-pixi-property.avif b/Tests/LibGfx/test-inputs/avif/missing-pixi-property.avif new file mode 100644 index 0000000000000000000000000000000000000000..0c538b1655fd94c5c19d9c4c93b99f0fa331a1aa GIT binary patch literal 3315 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 literal 0 HcmV?d00001