diff --git a/Tests/LibGfx/TestImageDecoder.cpp b/Tests/LibGfx/TestImageDecoder.cpp index f0ccfe6170..a6e2b5e9e0 100644 --- a/Tests/LibGfx/TestImageDecoder.cpp +++ b/Tests/LibGfx/TestImageDecoder.cpp @@ -324,6 +324,15 @@ TEST_CASE(test_jpeg_sof0_several_scans) TRY_OR_FAIL(expect_single_frame_of_size(*plugin_decoder, { 592, 800 })); } +TEST_CASE(test_odd_mcu_restart_interval) +{ + auto file = TRY_OR_FAIL(Core::MappedFile::map(TEST_INPUT("jpg/odd-restart.jpg"sv))); + EXPECT(Gfx::JPEGImageDecoderPlugin::sniff(file->bytes())); + auto plugin_decoder = TRY_OR_FAIL(Gfx::JPEGImageDecoderPlugin::create(file->bytes())); + + TRY_OR_FAIL(expect_single_frame_of_size(*plugin_decoder, { 102, 77 })); +} + TEST_CASE(test_jpeg_rgb_components) { auto file = TRY_OR_FAIL(Core::MappedFile::map(TEST_INPUT("jpg/rgb_components.jpg"sv))); diff --git a/Tests/LibGfx/test-inputs/jpg/odd-restart.jpg b/Tests/LibGfx/test-inputs/jpg/odd-restart.jpg new file mode 100644 index 0000000000..8f1e410a0b Binary files /dev/null and b/Tests/LibGfx/test-inputs/jpg/odd-restart.jpg differ diff --git a/Userland/Libraries/LibGfx/ImageFormats/JPEGLoader.cpp b/Userland/Libraries/LibGfx/ImageFormats/JPEGLoader.cpp index efdabd9376..c5c08dd465 100644 --- a/Userland/Libraries/LibGfx/ImageFormats/JPEGLoader.cpp +++ b/Userland/Libraries/LibGfx/ImageFormats/JPEGLoader.cpp @@ -798,12 +798,14 @@ static ErrorOr decode_huffman_stream(JPEGLoadingContext& context, Vectorhuffman_stream; if (context.dc_restart_interval > 0) { - if (i != 0 && i % (context.dc_restart_interval * context.sampling_factors.vertical * context.sampling_factors.horizontal) == 0) { + if (number_of_mcus_decoded_so_far != 0 && number_of_mcus_decoded_so_far % context.dc_restart_interval == 0) { reset_decoder(context); // Restart markers are stored in byte boundaries. Advance the huffman stream cursor to @@ -823,7 +825,7 @@ static ErrorOr decode_huffman_stream(JPEGLoadingContext& context, Vector