From af58f012be3ad64fc4fd0754b4894a8b5278c0ad Mon Sep 17 00:00:00 2001 From: Lucas CHOLLET Date: Sat, 4 Mar 2023 22:05:02 -0500 Subject: [PATCH] Tests: Add a test for JPEGs with RGB components --- Tests/LibGfx/TestImageDecoder.cpp | 11 +++++++++++ Tests/LibGfx/test-inputs/rgb_components.jpg | Bin 0 -> 32286 bytes 2 files changed, 11 insertions(+) create mode 100644 Tests/LibGfx/test-inputs/rgb_components.jpg diff --git a/Tests/LibGfx/TestImageDecoder.cpp b/Tests/LibGfx/TestImageDecoder.cpp index c7925f9295..f5a1533438 100644 --- a/Tests/LibGfx/TestImageDecoder.cpp +++ b/Tests/LibGfx/TestImageDecoder.cpp @@ -112,6 +112,17 @@ TEST_CASE(test_jpeg_sof0_several_scans) EXPECT_EQ(frame.image->size(), Gfx::IntSize(592, 800)); } +TEST_CASE(test_jpeg_rgb_components) +{ + auto file = MUST(Core::MappedFile::map(TEST_INPUT("rgb_components.jpg"sv))); + EXPECT(Gfx::JPEGImageDecoderPlugin::sniff(file->bytes())); + auto plugin_decoder = MUST(Gfx::JPEGImageDecoderPlugin::create(file->bytes())); + EXPECT(plugin_decoder->initialize()); + + auto frame = MUST(plugin_decoder->frame(0)); + EXPECT_EQ(frame.image->size(), Gfx::IntSize(592, 800)); +} + TEST_CASE(test_jpeg_sof2_spectral_selection) { auto file = MUST(Core::MappedFile::map(TEST_INPUT("spectral_selection.jpg"sv))); diff --git a/Tests/LibGfx/test-inputs/rgb_components.jpg b/Tests/LibGfx/test-inputs/rgb_components.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e451c5cc298aba119af9630f0a52bd340b3d3dc8 GIT binary patch literal 32286 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