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.