From 27cf78d88fdb44bd246cd17bcc712225388e9134 Mon Sep 17 00:00:00 2001 From: Henrique Nakashima Date: Thu, 14 Jun 2018 16:22:30 +0000 Subject: Rewrite content stream regeneration. Loop through the dirty page objects and streams and regenerate all streams that are dirty. Bug: pdfium:1051 Change-Id: I837b5a7cd9542b7777e7c7ae7ac9cc75f69f30b5 Reviewed-on: https://pdfium-review.googlesource.com/34330 Commit-Queue: Henrique Nakashima Reviewed-by: dsinclair --- fpdfsdk/fpdf_edit_embeddertest.cpp | 133 +++++++++++++++++++++++++++++++++++-- 1 file changed, 129 insertions(+), 4 deletions(-) (limited to 'fpdfsdk/fpdf_edit_embeddertest.cpp') diff --git a/fpdfsdk/fpdf_edit_embeddertest.cpp b/fpdfsdk/fpdf_edit_embeddertest.cpp index 0a119b9577..07879c5054 100644 --- a/fpdfsdk/fpdf_edit_embeddertest.cpp +++ b/fpdfsdk/fpdf_edit_embeddertest.cpp @@ -428,8 +428,7 @@ TEST_F(FPDFEditEmbeddertest, AddPaths) { VerifySavedDocument(612, 792, kLastMD5); } -// Fails due to pdfium:1051. -TEST_F(FPDFEditEmbeddertest, DISABLED_SetText) { +TEST_F(FPDFEditEmbeddertest, SetText) { // Load document with some text. EXPECT_TRUE(OpenDocument("hello_world.pdf")); FPDF_PAGE page = LoadPage(0); @@ -626,8 +625,7 @@ TEST_F(FPDFEditEmbeddertest, RemoveMarkedObjectsPrime) { UnloadPage(page); } -// Fails due to pdfium:1051. -TEST_F(FPDFEditEmbeddertest, DISABLED_RemoveExistingPageObject) { +TEST_F(FPDFEditEmbeddertest, RemoveExistingPageObject) { // Load document with some text. EXPECT_TRUE(OpenDocument("hello_world.pdf")); FPDF_PAGE page = LoadPage(0); @@ -656,6 +654,100 @@ TEST_F(FPDFEditEmbeddertest, DISABLED_RemoveExistingPageObject) { CloseSavedDocument(); } +TEST_F(FPDFEditEmbeddertest, RemoveExistingPageObjectSplitStreamsNotLonely) { + // Load document with some text. + EXPECT_TRUE(OpenDocument("hello_world_split_streams.pdf")); + FPDF_PAGE page = LoadPage(0); + ASSERT_TRUE(page); + + // Get the "Hello, world!" text object and remove it. There is another object + // in the same stream that says "Goodbye, world!" + ASSERT_EQ(3, FPDFPage_CountObjects(page)); + FPDF_PAGEOBJECT page_object = FPDFPage_GetObject(page, 0); + ASSERT_TRUE(page_object); + EXPECT_TRUE(FPDFPage_RemoveObject(page, page_object)); + + // Verify the "Hello, world!" text is gone. + ASSERT_EQ(2, FPDFPage_CountObjects(page)); +#if _FX_PLATFORM_ == _FX_PLATFORM_APPLE_ + const char kHelloRemovedMD5[] = "e07a62d412728fc4d6e3ff42f2dd0e11"; +#elif _FX_PLATFORM_ == _FX_PLATFORM_WINDOWS_ + const char kHelloRemovedMD5[] = "de37b0bb7ff903c1068bae361844be50"; +#else + const char kHelloRemovedMD5[] = "95b92950647a2190e1230911e7a1a0e9"; +#endif + { + ScopedFPDFBitmap page_bitmap = RenderPageWithFlags(page, nullptr, 0); + CompareBitmap(page_bitmap.get(), 200, 200, kHelloRemovedMD5); + } + + // Save the file + EXPECT_TRUE(FPDFPage_GenerateContent(page)); + EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0)); + UnloadPage(page); + FPDFPageObj_Destroy(page_object); + + // Re-open the file and check the page object count is still 2. + OpenSavedDocument(); + FPDF_PAGE saved_page = LoadSavedPage(0); + + EXPECT_EQ(2, FPDFPage_CountObjects(saved_page)); + { + ScopedFPDFBitmap page_bitmap = RenderPageWithFlags(saved_page, nullptr, 0); + CompareBitmap(page_bitmap.get(), 200, 200, kHelloRemovedMD5); + } + + CloseSavedPage(saved_page); + CloseSavedDocument(); +} + +TEST_F(FPDFEditEmbeddertest, RemoveExistingPageObjectSplitStreamsLonely) { + // Load document with some text. + EXPECT_TRUE(OpenDocument("hello_world_split_streams.pdf")); + FPDF_PAGE page = LoadPage(0); + ASSERT_TRUE(page); + + // Get the "Greetings, world!" text object and remove it. This is the only + // object in the stream. + ASSERT_EQ(3, FPDFPage_CountObjects(page)); + FPDF_PAGEOBJECT page_object = FPDFPage_GetObject(page, 2); + ASSERT_TRUE(page_object); + EXPECT_TRUE(FPDFPage_RemoveObject(page, page_object)); + + // Verify the "Greetings, world!" text is gone. + ASSERT_EQ(2, FPDFPage_CountObjects(page)); +#if _FX_PLATFORM_ == _FX_PLATFORM_APPLE_ + const char kGreetingsRemovedMD5[] = "b90475ca64d1348c3bf5e2b77ad9187a"; +#elif _FX_PLATFORM_ == _FX_PLATFORM_WINDOWS_ + const char kGreetingsRemovedMD5[] = "e5a6fa28298db07484cd922f3e210c88"; +#else + const char kGreetingsRemovedMD5[] = "2baa4c0e1758deba1b9c908e1fbd04ed"; +#endif + { + ScopedFPDFBitmap page_bitmap = RenderPageWithFlags(page, nullptr, 0); + CompareBitmap(page_bitmap.get(), 200, 200, kGreetingsRemovedMD5); + } + + // Save the file + EXPECT_TRUE(FPDFPage_GenerateContent(page)); + EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0)); + UnloadPage(page); + FPDFPageObj_Destroy(page_object); + + // Re-open the file and check the page object count is still 2. + OpenSavedDocument(); + FPDF_PAGE saved_page = LoadSavedPage(0); + + EXPECT_EQ(2, FPDFPage_CountObjects(saved_page)); + { + ScopedFPDFBitmap page_bitmap = RenderPageWithFlags(saved_page, nullptr, 0); + CompareBitmap(page_bitmap.get(), 200, 200, kGreetingsRemovedMD5); + } + + CloseSavedPage(saved_page); + CloseSavedDocument(); +} + // TODO(pdfium:1051): Extend this test to remove some elements and verify // saving works. TEST_F(FPDFEditEmbeddertest, GetContentStream) { @@ -713,6 +805,39 @@ TEST_F(FPDFEditEmbeddertest, InsertPageObjectAndSave) { CloseSavedDocument(); } +TEST_F(FPDFEditEmbeddertest, InsertPageObjectEditAndSave) { + // Load document with some text. + EXPECT_TRUE(OpenDocument("hello_world.pdf")); + FPDF_PAGE page = LoadPage(0); + ASSERT_TRUE(page); + + // Add a red rectangle. + ASSERT_EQ(2, FPDFPage_CountObjects(page)); + FPDF_PAGEOBJECT red_rect = FPDFPageObj_CreateNewRect(20, 100, 50, 50); + EXPECT_TRUE(FPDFPath_SetFillColor(red_rect, 255, 100, 100, 255)); + EXPECT_TRUE(FPDFPath_SetDrawMode(red_rect, FPDF_FILLMODE_ALTERNATE, 0)); + FPDFPage_InsertObject(page, red_rect); + + // Verify the red rectangle was added. + ASSERT_EQ(3, FPDFPage_CountObjects(page)); + + // Generate content but change it again + EXPECT_TRUE(FPDFPage_GenerateContent(page)); + EXPECT_TRUE(FPDFPath_SetFillColor(red_rect, 255, 0, 0, 255)); + + // Save the file + EXPECT_TRUE(FPDFPage_GenerateContent(page)); + EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0)); + UnloadPage(page); + + // Re-open the file and check the page object count is still 3. + OpenSavedDocument(); + FPDF_PAGE saved_page = LoadSavedPage(0); + EXPECT_EQ(3, FPDFPage_CountObjects(saved_page)); + CloseSavedPage(saved_page); + CloseSavedDocument(); +} + TEST_F(FPDFEditEmbeddertest, AddAndRemovePaths) { // Start with a blank page. FPDF_PAGE page = FPDFPage_New(CreateNewDocument(), 0, 612, 792); -- cgit v1.2.3