From 8da9ff24e4e720b1e80a027f09c419ac9503f896 Mon Sep 17 00:00:00 2001 From: Lucas CHOLLET Date: Sun, 7 May 2023 16:35:54 -0400 Subject: [PATCH] Tests: Add tests for 12 bits JPEGs In this commit, two tests are added, one with a `SOF1` image, the other with a `SOF2`. --- Tests/LibGfx/TestImageDecoder.cpp | 22 ++++++++++++++++++ .../LibGfx/test-inputs/12-bit-progressive.jpg | Bin 0 -> 12439 bytes Tests/LibGfx/test-inputs/12-bit.jpg | Bin 0 -> 12968 bytes 3 files changed, 22 insertions(+) create mode 100644 Tests/LibGfx/test-inputs/12-bit-progressive.jpg create mode 100644 Tests/LibGfx/test-inputs/12-bit.jpg diff --git a/Tests/LibGfx/TestImageDecoder.cpp b/Tests/LibGfx/TestImageDecoder.cpp index 9faaecaa2f..b3b711885b 100644 --- a/Tests/LibGfx/TestImageDecoder.cpp +++ b/Tests/LibGfx/TestImageDecoder.cpp @@ -156,6 +156,28 @@ TEST_CASE(test_jpeg_sof2_successive_aproximation) EXPECT_EQ(frame.image->size(), Gfx::IntSize(600, 800)); } +TEST_CASE(test_jpeg_sof1_12bits) +{ + auto file = MUST(Core::MappedFile::map(TEST_INPUT("12-bit.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(320, 240)); +} + +TEST_CASE(test_jpeg_sof2_12bits) +{ + auto file = MUST(Core::MappedFile::map(TEST_INPUT("12-bit-progressive.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(320, 240)); +} + TEST_CASE(test_pbm) { auto file = MUST(Core::MappedFile::map(TEST_INPUT("buggie-raw.pbm"sv))); diff --git a/Tests/LibGfx/test-inputs/12-bit-progressive.jpg b/Tests/LibGfx/test-inputs/12-bit-progressive.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a463f7b32c9b3c60c3432efa35f647a56e027166 GIT binary patch literal 12439 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 Rzc$#WD#n{{-^QP%{{fco&wl^_ literal 0 HcmV?d00001 diff --git a/Tests/LibGfx/test-inputs/12-bit.jpg b/Tests/LibGfx/test-inputs/12-bit.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d7173d08e1ee9d5d5ab1e956ce4fb396bccf6a6c GIT binary patch literal 12968 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 tc;6Gf=0d$?Zu_2pa_{J}$GpRQ{CxY