Add test for black rectangle over edited objects inside clipping path
The regenerated stream resets the nonstroking color space to black,
which causes paths to be drawn as black.
Bug: pdfium:1574
Change-Id: I8fce9ba1ba86e866715e17aba96264e1179fa163
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/77630
Reviewed-by: Hui Yingst <nigi@chromium.org>
Commit-Queue: Daniel Hosseinian <dhoss@chromium.org>
diff --git a/fpdfsdk/fpdf_edit_embeddertest.cpp b/fpdfsdk/fpdf_edit_embeddertest.cpp
index b7ff7ed..e00784f 100644
--- a/fpdfsdk/fpdf_edit_embeddertest.cpp
+++ b/fpdfsdk/fpdf_edit_embeddertest.cpp
@@ -793,6 +793,75 @@
CloseSavedDocument();
}
+TEST_F(FPDFEditEmbedderTest, BUG_1574) {
+ // Load document with some text within a clipping path.
+ ASSERT_TRUE(OpenDocument("bug_1574.pdf"));
+ FPDF_PAGE page = LoadPage(0);
+ ASSERT_TRUE(page);
+
+#if defined(_SKIA_SUPPORT_) || defined(_SKIA_SUPPORT_PATHS_)
+ static constexpr char kOriginalChecksum[] =
+ "c17ce567e0fd2ecd14352cf56d8d574b";
+#else
+#if defined(OS_WIN)
+ static constexpr char kOriginalChecksum[] =
+ "297c5e52c38802106d570e35f94b5cfd";
+#elif defined(OS_APPLE)
+ static constexpr char kOriginalChecksum[] =
+ "6a11148c99a141eea7c2b91e6987eb97";
+#else
+ static constexpr char kOriginalChecksum[] =
+ "75b6f6da7c24f2e395edb1c7d81dc906";
+#endif
+#endif // defined(_SKIA_SUPPORT_) || defined(_SKIA_SUPPORT_PATHS_)
+ {
+ // When opened before any editing and saving, the text object is rendered.
+ ScopedFPDFBitmap original_bitmap = RenderPage(page);
+ CompareBitmap(original_bitmap.get(), 200, 300, kOriginalChecksum);
+ }
+
+ // "Change" the text in the objects to their current values to force them to
+ // regenerate when saving.
+ {
+ ScopedFPDFTextPage text_page(FPDFText_LoadPage(page));
+ ASSERT_TRUE(text_page);
+
+ ASSERT_EQ(2, FPDFPage_CountObjects(page));
+ FPDF_PAGEOBJECT text_obj = FPDFPage_GetObject(page, 1);
+ ASSERT_EQ(FPDF_PAGEOBJ_TEXT, FPDFPageObj_GetType(text_obj));
+
+ unsigned long size = FPDFTextObj_GetText(text_obj, text_page.get(),
+ /*buffer=*/nullptr, /*length=*/0);
+ ASSERT_GT(size, 0u);
+ std::vector<FPDF_WCHAR> buffer = GetFPDFWideStringBuffer(size);
+ ASSERT_EQ(size, FPDFTextObj_GetText(text_obj, text_page.get(),
+ buffer.data(), size));
+ EXPECT_TRUE(FPDFText_SetText(text_obj, buffer.data()));
+ }
+
+ // Save the file.
+ EXPECT_TRUE(FPDFPage_GenerateContent(page));
+ EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
+ UnloadPage(page);
+
+ // Open the saved copy and render it.
+ ASSERT_TRUE(OpenSavedDocument());
+ FPDF_PAGE saved_page = LoadSavedPage(0);
+ ASSERT_TRUE(saved_page);
+
+ // TODO(crbug.com/pdfium/1578): The regenerated text object should not be
+ // covered by a black rectangle. The expected bitmap should still be
+ // |kOriginalChecksum|.
+ static constexpr char kChangedChecksum[] = "bb3606ecbe252f867bc51d65f9d56503";
+ {
+ ScopedFPDFBitmap saved_bitmap = RenderSavedPage(saved_page);
+ CompareBitmap(saved_bitmap.get(), 200, 300, kChangedChecksum);
+ }
+
+ CloseSavedPage(saved_page);
+ CloseSavedDocument();
+}
+
TEST_F(FPDFEditEmbedderTest, RemovePageObject) {
// Load document with some text.
ASSERT_TRUE(OpenDocument("hello_world.pdf"));
diff --git a/testing/resources/bug_1574.in b/testing/resources/bug_1574.in
new file mode 100644
index 0000000..5d7a08d
--- /dev/null
+++ b/testing/resources/bug_1574.in
@@ -0,0 +1,60 @@
+{{header}}
+{{object 1 0}} <<
+ /Type /Catalog
+ /Pages 2 0 R
+>>
+endobj
+{{object 2 0}} <<
+ /Type /Pages
+ /Count 1
+ /Kids [3 0 R]
+>>
+endobj
+{{object 3 0}} <<
+ /Type /Page
+ /Parent 2 0 R
+ /MediaBox [0 0 200 300]
+ /Resources <<
+ /Font <<
+ /F1 4 0 R
+ >>
+ >>
+ /Contents 5 0 R
+>>
+endobj
+{{object 4 0}} <<
+ /Type /Font
+ /Subtype /Type1
+ /BaseFont /Times-Roman
+>>
+endobj
+{{object 5 0}} <<
+ {{streamlen}}
+>>
+stream
+q
+0 0 50 75 re
+W* n
+1 1 1 rg
+0 150 m
+100 150 l
+100 0 l
+0 0 l
+0 150 l
+h
+f*
+q
+0 0 0 rg
+BT
+20 50 Td
+/F1 12 Tf
+(Text) Tj
+ET
+Q
+Q
+endstream
+endobj
+{{xref}}
+{{trailer}}
+{{startxref}}
+%%EOF
diff --git a/testing/resources/bug_1574.pdf b/testing/resources/bug_1574.pdf
new file mode 100644
index 0000000..df27418
--- /dev/null
+++ b/testing/resources/bug_1574.pdf
@@ -0,0 +1,72 @@
+%PDF-1.7
+% ò¤ô
+1 0 obj <<
+ /Type /Catalog
+ /Pages 2 0 R
+>>
+endobj
+2 0 obj <<
+ /Type /Pages
+ /Count 1
+ /Kids [3 0 R]
+>>
+endobj
+3 0 obj <<
+ /Type /Page
+ /Parent 2 0 R
+ /MediaBox [0 0 200 300]
+ /Resources <<
+ /Font <<
+ /F1 4 0 R
+ >>
+ >>
+ /Contents 5 0 R
+>>
+endobj
+4 0 obj <<
+ /Type /Font
+ /Subtype /Type1
+ /BaseFont /Times-Roman
+>>
+endobj
+5 0 obj <<
+ /Length 124
+>>
+stream
+q
+0 0 50 75 re
+W* n
+1 1 1 rg
+0 150 m
+100 150 l
+100 0 l
+0 0 l
+0 150 l
+h
+f*
+q
+0 0 0 rg
+BT
+20 50 Td
+/F1 12 Tf
+(Text) Tj
+ET
+Q
+Q
+endstream
+endobj
+xref
+0 6
+0000000000 65535 f
+0000000015 00000 n
+0000000068 00000 n
+0000000131 00000 n
+0000000283 00000 n
+0000000361 00000 n
+trailer <<
+ /Root 1 0 R
+ /Size 6
+>>
+startxref
+537
+%%EOF