Teach FPDFPageObj_SetMatrix() to set the matrix for form objects.

Convert some embedder tests to use the new API capability, instead of
accessing the internal CPDF_FormObject directly.

Change-Id: If5384dca03f9a11304b923afd7a36c4311490fc8
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/82613
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fpdfapi/page/cpdf_formobject.cpp b/core/fpdfapi/page/cpdf_formobject.cpp
index 1a9373d..84e070c 100644
--- a/core/fpdfapi/page/cpdf_formobject.cpp
+++ b/core/fpdfapi/page/cpdf_formobject.cpp
@@ -44,3 +44,8 @@
 void CPDF_FormObject::CalcBoundingBox() {
   SetRect(m_FormMatrix.TransformRect(m_pForm->CalcBoundingBox()));
 }
+
+void CPDF_FormObject::SetFormMatrix(const CFX_Matrix& matrix) {
+  m_FormMatrix = matrix;
+  CalcBoundingBox();
+}
diff --git a/core/fpdfapi/page/cpdf_formobject.h b/core/fpdfapi/page/cpdf_formobject.h
index c24bfbf..c3a1966 100644
--- a/core/fpdfapi/page/cpdf_formobject.h
+++ b/core/fpdfapi/page/cpdf_formobject.h
@@ -31,6 +31,7 @@
   void CalcBoundingBox();
   const CPDF_Form* form() const { return m_pForm.get(); }
   const CFX_Matrix& form_matrix() const { return m_FormMatrix; }
+  void SetFormMatrix(const CFX_Matrix& matrix);
 
  private:
   std::unique_ptr<CPDF_Form> const m_pForm;
diff --git a/fpdfsdk/fpdf_edit_embeddertest.cpp b/fpdfsdk/fpdf_edit_embeddertest.cpp
index 999e8e9..11fca24 100644
--- a/fpdfsdk/fpdf_edit_embeddertest.cpp
+++ b/fpdfsdk/fpdf_edit_embeddertest.cpp
@@ -2487,13 +2487,9 @@
   ASSERT_EQ(nullptr, FPDFFormObj_GetObject(form, -1));
   ASSERT_EQ(nullptr, FPDFFormObj_GetObject(form, 2));
 
-  // Reset the form object matrix to identity.
-  CPDF_FormObject* pFormObj = CPDFPageObjectFromFPDFPageObject(form)->AsForm();
-  pFormObj->Transform(pFormObj->form_matrix().GetInverse());
-
   // FPDFPageObj_GetMatrix() positive testing for forms.
   static constexpr FS_MATRIX kMatrix = {1.0f, 1.5f, 2.0f, 2.5f, 100.0f, 200.0f};
-  pFormObj->Transform(CFXMatrixFromFSMatrix(kMatrix));
+  EXPECT_TRUE(FPDFPageObj_SetMatrix(form, &kMatrix));
 
   FS_MATRIX matrix;
   EXPECT_TRUE(FPDFPageObj_GetMatrix(form, &matrix));
diff --git a/fpdfsdk/fpdf_editpage.cpp b/fpdfsdk/fpdf_editpage.cpp
index e118a91a..dc0f8a2 100644
--- a/fpdfsdk/fpdf_editpage.cpp
+++ b/fpdfsdk/fpdf_editpage.cpp
@@ -662,7 +662,8 @@
     case CPDF_PageObject::SHADING:
       return false;
     case CPDF_PageObject::FORM:
-      return false;
+      pPageObj->AsForm()->SetFormMatrix(cmatrix);
+      break;
     default:
       NOTREACHED();
       return false;
diff --git a/fpdfsdk/fpdf_ppo_embeddertest.cpp b/fpdfsdk/fpdf_ppo_embeddertest.cpp
index dc5130c..f635996 100644
--- a/fpdfsdk/fpdf_ppo_embeddertest.cpp
+++ b/fpdfsdk/fpdf_ppo_embeddertest.cpp
@@ -249,13 +249,8 @@
   ASSERT_TRUE(page_object);
   ASSERT_EQ(FPDF_PAGEOBJ_FORM, FPDFPageObj_GetType(page_object));
 
-  // Access the CPDF_FormObject underneath, as there is no public API to set
-  // the matrix for form objects. (yet)
   static constexpr FS_MATRIX kMatrix = {0.5f, 0.0f, 0.0f, 0.5f, 0.0f, 0.0f};
-  CPDF_FormObject* pFormObj =
-      CPDFPageObjectFromFPDFPageObject(page_object)->AsForm();
-  pFormObj->Transform(CFXMatrixFromFSMatrix(kMatrix));
-  pFormObj->SetDirty(true);
+  EXPECT_TRUE(FPDFPageObj_SetMatrix(page_object, &kMatrix));
 
   FPDFPage_InsertObject(page, page_object);
   EXPECT_TRUE(FPDFPage_GenerateContent(page));