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.