Reuse existing CPDF_InteractiveForm in two APIs.

In FPDFPage_HasFormFieldAtPoint(), the implementation creates a new
CPDF_InteractiveForm object and then examine its form controls.
Constructing CPDF_InteractiveForm objects can be expensive, since
interactive form fields can have hierarchies and inheritance. Meanwhile,
there is a FPDF_FORMHANDLE being passed in and its almost unused. Put it
to use by getting the CPDFSDK_InteractiveForm from the handle. The
CPDFSDK_InteractiveForm then has a pointer to an existing
CPDF_InteractiveForm. Use that instead.

FPDFPage_FormFieldZOrderAtPoint() started out as a sibling of
FPDFPage_HasFormFieldAtPoint(), and has a similar issue.

Change-Id: Ic8928a7354e5fcd8c260d8f4ac824fbc66a18dbe
Reviewed-on: https://pdfium-review.googlesource.com/c/50710
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/fpdfsdk/fpdf_formfill.cpp b/fpdfsdk/fpdf_formfill.cpp
index 4bbc392..41ce671 100644
--- a/fpdfsdk/fpdf_formfill.cpp
+++ b/fpdfsdk/fpdf_formfill.cpp
@@ -238,12 +238,14 @@
                              FPDF_PAGE page,
                              double page_x,
                              double page_y) {
-  if (!hHandle)
-    return -1;
   CPDF_Page* pPage = CPDFPageFromFPDFPage(page);
   if (pPage) {
-    CPDF_InteractiveForm interactive_form(pPage->GetDocument());
-    CPDF_FormControl* pFormCtrl = interactive_form.GetControlAtPoint(
+    CPDFSDK_InteractiveForm* pForm = FormHandleToInteractiveForm(hHandle);
+    if (!pForm)
+      return -1;
+
+    CPDF_InteractiveForm* pPDFForm = pForm->GetInteractiveForm();
+    CPDF_FormControl* pFormCtrl = pPDFForm->GetControlAtPoint(
         pPage,
         CFX_PointF(static_cast<float>(page_x), static_cast<float>(page_y)),
         nullptr);
@@ -253,6 +255,9 @@
     return pFormField ? static_cast<int>(pFormField->GetFieldType()) : -1;
   }
 
+  if (!hHandle)
+    return -1;
+
 #ifdef PDF_ENABLE_XFA
   CPDFXFA_Page* pXFAPage = ToXFAPage(IPDFPageFromFPDFPage(page));
   if (!pXFAPage)
@@ -299,14 +304,17 @@
                                 FPDF_PAGE page,
                                 double page_x,
                                 double page_y) {
-  if (!hHandle)
+  CPDFSDK_InteractiveForm* pForm = FormHandleToInteractiveForm(hHandle);
+  if (!pForm)
     return -1;
+
   CPDF_Page* pPage = CPDFPageFromFPDFPage(page);
   if (!pPage)
     return -1;
-  CPDF_InteractiveForm interactive_form(pPage->GetDocument());
+
+  CPDF_InteractiveForm* pPDFForm = pForm->GetInteractiveForm();
   int z_order = -1;
-  (void)interactive_form.GetControlAtPoint(
+  pPDFForm->GetControlAtPoint(
       pPage, CFX_PointF(static_cast<float>(page_x), static_cast<float>(page_y)),
       &z_order);
   return z_order;