Add FPDFTextObj_SetTextRenderMode() to public API Corresponds to FPDFTextObj_GetTextRenderMode(). Bug: pdfium:979 Change-Id: I25546c16dbf8a963164e4abf914ab11e46839de4 Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/64010 Commit-Queue: Daniel Hosseinian <dhoss@chromium.org> Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/fpdfsdk/fpdf_edit_embeddertest.cpp b/fpdfsdk/fpdf_edit_embeddertest.cpp index b96b679..b6cc84c 100644 --- a/fpdfsdk/fpdf_edit_embeddertest.cpp +++ b/fpdfsdk/fpdf_edit_embeddertest.cpp
@@ -2076,14 +2076,63 @@ ASSERT_TRUE(page); ASSERT_EQ(2, FPDFPage_CountObjects(page)); - ASSERT_EQ(FPDF_TEXTRENDERMODE_UNKNOWN, + EXPECT_EQ(FPDF_TEXTRENDERMODE_UNKNOWN, FPDFTextObj_GetTextRenderMode(nullptr)); FPDF_PAGEOBJECT fill = FPDFPage_GetObject(page, 0); - ASSERT_EQ(FPDF_TEXTRENDERMODE_FILL, FPDFTextObj_GetTextRenderMode(fill)); + EXPECT_EQ(FPDF_TEXTRENDERMODE_FILL, FPDFTextObj_GetTextRenderMode(fill)); FPDF_PAGEOBJECT stroke = FPDFPage_GetObject(page, 1); - ASSERT_EQ(FPDF_TEXTRENDERMODE_STROKE, FPDFTextObj_GetTextRenderMode(stroke)); + EXPECT_EQ(FPDF_TEXTRENDERMODE_STROKE, FPDFTextObj_GetTextRenderMode(stroke)); + + UnloadPage(page); +} + +TEST_F(FPDFEditEmbedderTest, SetTextRenderMode) { + EXPECT_TRUE(OpenDocument("text_render_mode.pdf")); + FPDF_PAGE page = LoadPage(0); + ASSERT_TRUE(page); + ASSERT_EQ(2, FPDFPage_CountObjects(page)); + + // Check the bitmap + { +#if defined(OS_MACOSX) + const char md5[] = "139846b4ffbd34b1fd67e3b82cf33b7e"; +#elif defined(OS_WIN) + const char md5[] = "de6e86bad3e9fda753a8471a45cfbb58"; +#else + const char md5[] = "5a012d2920ac075c39ffa9437ea42faa"; +#endif + ScopedFPDFBitmap page_bitmap = RenderPage(page); + CompareBitmap(page_bitmap.get(), 612, 446, md5); + } + + // Cannot set on a null object. + EXPECT_FALSE( + FPDFTextObj_SetTextRenderMode(nullptr, FPDF_TEXTRENDERMODE_UNKNOWN)); + EXPECT_FALSE( + FPDFTextObj_SetTextRenderMode(nullptr, FPDF_TEXTRENDERMODE_INVISIBLE)); + + FPDF_PAGEOBJECT page_object = FPDFPage_GetObject(page, 0); + ASSERT_TRUE(page_object); + EXPECT_EQ(FPDF_TEXTRENDERMODE_FILL, + FPDFTextObj_GetTextRenderMode(page_object)); + + // Cannot set UNKNOWN as a render mode. + EXPECT_FALSE( + FPDFTextObj_SetTextRenderMode(page_object, FPDF_TEXTRENDERMODE_UNKNOWN)); + + EXPECT_TRUE( + FPDFTextObj_SetTextRenderMode(page_object, FPDF_TEXTRENDERMODE_STROKE)); + EXPECT_EQ(FPDF_TEXTRENDERMODE_STROKE, + FPDFTextObj_GetTextRenderMode(page_object)); + + // Check that bitmap displays changed content + { + const char md5[] = "412e52e621b46bd77baf2162e1fb1a1d"; + ScopedFPDFBitmap page_bitmap = RenderPage(page); + CompareBitmap(page_bitmap.get(), 612, 446, md5); + } UnloadPage(page); }
diff --git a/fpdfsdk/fpdf_edittext.cpp b/fpdfsdk/fpdf_edittext.cpp index dc29351..dc11ab2 100644 --- a/fpdfsdk/fpdf_edittext.cpp +++ b/fpdfsdk/fpdf_edittext.cpp
@@ -599,3 +599,20 @@ return FPDF_TEXTRENDERMODE_UNKNOWN; return static_cast<FPDF_TEXT_RENDERMODE>(pTextObj->m_TextState.GetTextMode()); } + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +FPDFTextObj_SetTextRenderMode(FPDF_PAGEOBJECT text, + FPDF_TEXT_RENDERMODE render_mode) { + if (render_mode <= FPDF_TEXTRENDERMODE_UNKNOWN || + render_mode > FPDF_TEXTRENDERMODE_LAST) { + return false; + } + + CPDF_TextObject* pTextObj = CPDFTextObjectFromFPDFPageObject(text); + if (!pTextObj) + return false; + + pTextObj->m_TextState.SetTextMode( + static_cast<TextRenderingMode>(render_mode)); + return true; +}
diff --git a/fpdfsdk/fpdf_view_c_api_test.c b/fpdfsdk/fpdf_view_c_api_test.c index dce7a23..89ca154 100644 --- a/fpdfsdk/fpdf_view_c_api_test.c +++ b/fpdfsdk/fpdf_view_c_api_test.c
@@ -211,6 +211,7 @@ CHK(FPDFTextObj_GetMatrix); CHK(FPDFTextObj_GetText); CHK(FPDFTextObj_GetTextRenderMode); + CHK(FPDFTextObj_SetTextRenderMode); CHK(FPDFText_LoadFont); CHK(FPDFText_LoadStandardFont); CHK(FPDFText_SetText);
diff --git a/public/fpdf_edit.h b/public/fpdf_edit.h index ef089db..8e0d234 100644 --- a/public/fpdf_edit.h +++ b/public/fpdf_edit.h
@@ -1139,6 +1139,18 @@ FPDFTextObj_GetTextRenderMode(FPDF_PAGEOBJECT text); // Experimental API. +// Set the text rendering mode of a text object. +// +// text - the handle to the text object. +// render_mode - the FPDF_TEXT_RENDERMODE enum value to be set (cannot set to +// FPDF_TEXTRENDERMODE_UNKNOWN). +// +// Returns TRUE on success. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +FPDFTextObj_SetTextRenderMode(FPDF_PAGEOBJECT text, + FPDF_TEXT_RENDERMODE render_mode); + +// Experimental API. // Get the font name of a text object. // // text - the handle to the text object.