From 1ccfb8a20099bf70df188daacf243ca1dc786233 Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Wed, 10 Sep 2025 07:37:57 -0400 Subject: [PATCH 1/2] Tests/PDF: Rename an input file Renames jbig2-globals.pdf to jbig2-globals-indirect-reference.pdf. No behavior change. --- Tests/LibPDF/CMakeLists.txt | 2 +- Tests/LibPDF/TestPDF.cpp | 2 +- ...als.pdf => jbig2-globals-indirect-reference.pdf} | Bin 3 files changed, 2 insertions(+), 2 deletions(-) rename Tests/LibPDF/{jbig2-globals.pdf => jbig2-globals-indirect-reference.pdf} (100%) diff --git a/Tests/LibPDF/CMakeLists.txt b/Tests/LibPDF/CMakeLists.txt index 6f8d97ce17ef87..c69561c02c25c6 100644 --- a/Tests/LibPDF/CMakeLists.txt +++ b/Tests/LibPDF/CMakeLists.txt @@ -14,7 +14,7 @@ set(TEST_FILES encoding.pdf encryption_nocopy.pdf group.pdf - jbig2-globals.pdf + jbig2-globals-indirect-reference.pdf jpeg2000-indexed-small.pdf linearized.pdf non-linearized.pdf diff --git a/Tests/LibPDF/TestPDF.cpp b/Tests/LibPDF/TestPDF.cpp index 592045893469ca..c88f03ad17a735 100644 --- a/Tests/LibPDF/TestPDF.cpp +++ b/Tests/LibPDF/TestPDF.cpp @@ -131,7 +131,7 @@ TEST_CASE(encrypted_object_stream) TEST_CASE(resolve_indirect_reference_during_parsing) { - auto file = TRY_OR_FAIL(Core::MappedFile::map("jbig2-globals.pdf"sv)); + auto file = TRY_OR_FAIL(Core::MappedFile::map("jbig2-globals-indirect-reference.pdf"sv)); auto document = MUST(PDF::Document::create(file->bytes())); MUST(document->initialize()); EXPECT_EQ(document->get_page_count(), 1U); diff --git a/Tests/LibPDF/jbig2-globals.pdf b/Tests/LibPDF/jbig2-globals-indirect-reference.pdf similarity index 100% rename from Tests/LibPDF/jbig2-globals.pdf rename to Tests/LibPDF/jbig2-globals-indirect-reference.pdf From 5298cf34e0b4c50efe6249e91407189076b26639 Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Wed, 10 Sep 2025 07:45:56 -0400 Subject: [PATCH 2/2] Tests/LibPDF: Add test for embedded jbig2 cross-chunk ref Test case created by copying Tests/LibGfx/test-inputs/jbig2/bitmap-symbol.jbig2, changing the byte at offset 0x31 from 0x01 to 0x00 to make the symbol dictionary segment a global segment instead of associated with page 1, then ran Meta/jbig2_to_pdf.py on that modified file to create the new PDF. The new file contains a JBIG2Globals stream with the symbol dictionary segment, which the main jbig2 data stream refers to. This would've caught the regression fixed in #26199. --- Tests/LibGfx/TestImageDecoder.cpp | 1 - Tests/LibPDF/CMakeLists.txt | 1 + Tests/LibPDF/TestPDF.cpp | 13 +++++++++++++ Tests/LibPDF/jbig2-globals.pdf | Bin 0 -> 1232 bytes 4 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 Tests/LibPDF/jbig2-globals.pdf diff --git a/Tests/LibGfx/TestImageDecoder.cpp b/Tests/LibGfx/TestImageDecoder.cpp index 37fbbc01a55c27..b372a955f458f8 100644 --- a/Tests/LibGfx/TestImageDecoder.cpp +++ b/Tests/LibGfx/TestImageDecoder.cpp @@ -407,7 +407,6 @@ TEST_CASE(test_jbig2_decode) // - immediate refinement regions referring to a direct region (code support added in #26197) // - immediate refinement regions referring to a direct region (code support added in #26197) // - TPGRON set in refinement region (only reachable in standalone refinement regions) - // - in embedded organization, reference from segment in one chunk to segment in another chunk // Missing tests for things that aren't implemented yet: // - immediate refinement regions not referring to a direct region (i.e. refining the page) // - immediate lossless refinement regions diff --git a/Tests/LibPDF/CMakeLists.txt b/Tests/LibPDF/CMakeLists.txt index c69561c02c25c6..3a9a5a460f0907 100644 --- a/Tests/LibPDF/CMakeLists.txt +++ b/Tests/LibPDF/CMakeLists.txt @@ -14,6 +14,7 @@ set(TEST_FILES encoding.pdf encryption_nocopy.pdf group.pdf + jbig2-globals.pdf jbig2-globals-indirect-reference.pdf jpeg2000-indexed-small.pdf linearized.pdf diff --git a/Tests/LibPDF/TestPDF.cpp b/Tests/LibPDF/TestPDF.cpp index c88f03ad17a735..a0d22b20e63293 100644 --- a/Tests/LibPDF/TestPDF.cpp +++ b/Tests/LibPDF/TestPDF.cpp @@ -141,6 +141,19 @@ TEST_CASE(resolve_indirect_reference_during_parsing) EXPECT_EQ(jbig2_stream->bytes().size(), 20'000U); } +TEST_CASE(jbig2_embedded_organization_cross_chunk_reference) +{ + auto file = TRY_OR_FAIL(Core::MappedFile::map("jbig2-globals.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 { 399, 400 }; + auto bitmap = TRY_OR_FAIL(Gfx::Bitmap::create(Gfx::BitmapFormat::BGRx8888, page_size)); + MUST(PDF::Renderer::render(document, page, bitmap, Color::White, PDF::RenderingPreferences {})); +} + TEST_CASE(malformed_pdf_document) { Array test_inputs = { diff --git a/Tests/LibPDF/jbig2-globals.pdf b/Tests/LibPDF/jbig2-globals.pdf new file mode 100644 index 0000000000000000000000000000000000000000..865e95e8fce9a4dbc3a15baf349a59b3a5b1d58d GIT binary patch literal 1232 zcmY!laB(}>5%}X!I zP%ttx1)5)6Qk0sQ%f-OJzzBpu@Q;Ck`TyVlO#l7?Sqv;7%-8f`b2Gt>!BeXsqOY4%oT(Qo$~JrbhAI**PlvP$?`F~rOafB}W3&deN19al+F xVrEWi5wsWz&a6rWx)2yALHYT>kOYM?sQ4%@Nh~S>d%)1Z$e2r2)z#mP3jncQZjJx| literal 0 HcmV?d00001