diff --git a/Tests/LibGfx/TestImageDecoder.cpp b/Tests/LibGfx/TestImageDecoder.cpp index 998b6acc9944b8..f0d0bb486f400b 100644 --- a/Tests/LibGfx/TestImageDecoder.cpp +++ b/Tests/LibGfx/TestImageDecoder.cpp @@ -909,6 +909,22 @@ TEST_CASE(test_jpeg2000_decode_indexed) } } +TEST_CASE(test_jpeg2000_decode_indexed_small_raw) +{ + auto file = TRY_OR_FAIL(Core::MappedFile::map(TEST_INPUT("jpeg2000/indexed-small.jp2"sv))); + EXPECT(Gfx::JPEG2000ImageDecoderPlugin::sniff(file->bytes())); + auto plugin_decoder = TRY_OR_FAIL(Gfx::JPEG2000ImageDecoderPlugin::create(file->bytes())); + + auto frame = TRY_OR_FAIL(plugin_decoder->frame(0)).image; + EXPECT_EQ(frame->size(), Gfx::IntSize(3, 2)); + EXPECT_EQ(frame->scanline(0)[0], Gfx::Color(255, 0, 0).value()); + EXPECT_EQ(frame->scanline(0)[1], Gfx::Color(0, 255, 0).value()); + EXPECT_EQ(frame->scanline(0)[2], Gfx::Color(0, 0, 255).value()); + EXPECT_EQ(frame->scanline(1)[0], Gfx::Color(0, 255, 255).value()); + EXPECT_EQ(frame->scanline(1)[1], Gfx::Color(255, 0, 255).value()); + EXPECT_EQ(frame->scanline(1)[2], Gfx::Color(255, 255, 0).value()); +} + TEST_CASE(test_jpeg2000_decode_unsupported) { Array test_inputs = { diff --git a/Tests/LibGfx/test-inputs/jpeg2000/indexed-small.jp2 b/Tests/LibGfx/test-inputs/jpeg2000/indexed-small.jp2 new file mode 100644 index 00000000000000..9feeba6824cbb3 Binary files /dev/null and b/Tests/LibGfx/test-inputs/jpeg2000/indexed-small.jp2 differ diff --git a/Tests/LibPDF/CMakeLists.txt b/Tests/LibPDF/CMakeLists.txt index 47e232dda4b366..dd73f39ffbbcce 100644 --- a/Tests/LibPDF/CMakeLists.txt +++ b/Tests/LibPDF/CMakeLists.txt @@ -13,6 +13,7 @@ set(TEST_FILES encoding.pdf encryption_nocopy.pdf jbig2-globals.pdf + jpeg2000-indexed-small.pdf linearized.pdf non-linearized.pdf offset.pdf diff --git a/Tests/LibPDF/TestPDF.cpp b/Tests/LibPDF/TestPDF.cpp index 2c77927a5efd6f..7d53512021bb1f 100644 --- a/Tests/LibPDF/TestPDF.cpp +++ b/Tests/LibPDF/TestPDF.cpp @@ -386,3 +386,29 @@ TEST_CASE(render) // MyCalGray EXPECT_EQ(bitmap->get_pixel(270, 370 - 320), Gfx::Color::NamedColor::Black); } + +TEST_CASE(render_jpeg2000_indexed) +{ +#if !defined(AK_OS_SERENITY) + // Get from Build/lagom/bin/TestPDF to Build/lagom/Root/res. + auto source_root = LexicalPath(MUST(Core::System::current_executable_path())).parent().parent().string(); + Core::ResourceImplementation::install(make(MUST(String::formatted("{}/Root/res", source_root)))); +#endif + + auto file = MUST(Core::MappedFile::map("jpeg2000-indexed-small.pdf"sv)); + auto document = MUST(PDF::Document::create(file->bytes())); + MUST(document->initialize()); + EXPECT_EQ(document->get_page_count(), 1U); + + auto page = MUST(document->get_page(0)); + auto page_size = Gfx::IntSize { 3, 2 }; + auto bitmap = MUST(Gfx::Bitmap::create(Gfx::BitmapFormat::BGRx8888, page_size)); + MUST(PDF::Renderer::render(document, page, bitmap, Color::White, PDF::RenderingPreferences {})); + + EXPECT_EQ(bitmap->scanline(0)[0], Gfx::Color(127, 0, 0).value()); + EXPECT_EQ(bitmap->scanline(0)[1], Gfx::Color(0, 127, 0).value()); + EXPECT_EQ(bitmap->scanline(0)[2], Gfx::Color(0, 0, 127).value()); + EXPECT_EQ(bitmap->scanline(1)[0], Gfx::Color(0, 127, 127).value()); + EXPECT_EQ(bitmap->scanline(1)[1], Gfx::Color(127, 0, 127).value()); + EXPECT_EQ(bitmap->scanline(1)[2], Gfx::Color(127, 127, 0).value()); +} diff --git a/Tests/LibPDF/jpeg2000-indexed-small.pdf b/Tests/LibPDF/jpeg2000-indexed-small.pdf new file mode 100644 index 00000000000000..c222c15d9fa3ac Binary files /dev/null and b/Tests/LibPDF/jpeg2000-indexed-small.pdf differ