Add FPDFAnnot_CountAttachmentPoints

This CL adds a function to the API that returns the number of quadpoint
sets.

Change-Id: I999bc567a4c98f6c32e87810e7ecfbb634c7b677
Reviewed-on: https://pdfium-review.googlesource.com/29130
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/fpdfsdk/fpdfannot.cpp b/fpdfsdk/fpdfannot.cpp
index b5dccaa..c528071 100644
--- a/fpdfsdk/fpdfannot.cpp
+++ b/fpdfsdk/fpdfannot.cpp
@@ -583,7 +583,7 @@
 FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
 FPDFAnnot_SetAttachmentPoints(FPDF_ANNOTATION annot,
                               const FS_QUADPOINTSF* quad_points) {
-  if (!annot || !quad_points || !FPDFAnnot_HasAttachmentPoints(annot))
+  if (!FPDFAnnot_HasAttachmentPoints(annot) || !quad_points)
     return false;
 
   CPDF_Dictionary* pAnnotDict =
@@ -621,10 +621,21 @@
   return true;
 }
 
+FPDF_EXPORT size_t FPDF_CALLCONV
+FPDFAnnot_CountAttachmentPoints(FPDF_ANNOTATION annot) {
+  if (!FPDFAnnot_HasAttachmentPoints(annot))
+    return 0;
+
+  CPDF_Dictionary* pAnnotDict =
+      CPDFAnnotContextFromFPDFAnnotation(annot)->GetAnnotDict();
+  const CPDF_Array* pArray = GetQuadPointsArrayFromDictionary(pAnnotDict);
+  return pArray ? pArray->GetCount() / 8 : 0;
+}
+
 FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
 FPDFAnnot_GetAttachmentPoints(FPDF_ANNOTATION annot,
                               FS_QUADPOINTSF* quad_points) {
-  if (!annot || !quad_points || !FPDFAnnot_HasAttachmentPoints(annot))
+  if (!FPDFAnnot_HasAttachmentPoints(annot) || !quad_points)
     return false;
 
   return GetQuadPointsFromDictionary(
diff --git a/fpdfsdk/fpdfannot_embeddertest.cpp b/fpdfsdk/fpdfannot_embeddertest.cpp
index b96460a..552398c 100644
--- a/fpdfsdk/fpdfannot_embeddertest.cpp
+++ b/fpdfsdk/fpdfannot_embeddertest.cpp
@@ -47,7 +47,7 @@
 
 TEST_F(FPDFAnnotEmbeddertest, RenderMultilineMarkupAnnotWithoutAP) {
   const char md5_hash[] = "76512832d88017668d9acc7aacd13dae";
-  // Open a file with two multiline markup annotations.
+  // Open a file with multiline markup annotations.
   ASSERT_TRUE(OpenDocument("annotation_markup_multiline_no_ap.pdf"));
   FPDF_PAGE page = LoadPage(0);
   ASSERT_TRUE(page);
@@ -471,6 +471,25 @@
   UnloadPage(page);
 }
 
+TEST_F(FPDFAnnotEmbeddertest, CountAttachmentPoints) {
+  // Open a file with multiline markup annotations.
+  ASSERT_TRUE(OpenDocument("annotation_markup_multiline_no_ap.pdf"));
+  FPDF_PAGE page = LoadPage(0);
+  ASSERT_TRUE(page);
+  {
+    std::unique_ptr<void, FPDFAnnotationDeleter> annot(
+        FPDFPage_GetAnnot(page, 0));
+    ASSERT_TRUE(annot);
+
+    // This is a three line annotation.
+    EXPECT_EQ(3u, FPDFAnnot_CountAttachmentPoints(annot.get()));
+  }
+  UnloadPage(page);
+
+  // null annotation should return 0
+  EXPECT_EQ(0u, FPDFAnnot_CountAttachmentPoints(nullptr));
+}
+
 TEST_F(FPDFAnnotEmbeddertest, RemoveAnnotation) {
   // Open a file with 3 annotations on its first page.
   ASSERT_TRUE(OpenDocument("annotation_ink_multiple.pdf"));
diff --git a/fpdfsdk/fpdfview_c_api_test.c b/fpdfsdk/fpdfview_c_api_test.c
index 2a0b230..201fd90 100644
--- a/fpdfsdk/fpdfview_c_api_test.c
+++ b/fpdfsdk/fpdfview_c_api_test.c
@@ -55,6 +55,7 @@
     CHK(FPDFAnnot_GetColor);
     CHK(FPDFAnnot_HasAttachmentPoints);
     CHK(FPDFAnnot_SetAttachmentPoints);
+    CHK(FPDFAnnot_CountAttachmentPoints);
     CHK(FPDFAnnot_GetAttachmentPoints);
     CHK(FPDFAnnot_SetRect);
     CHK(FPDFAnnot_GetRect);
diff --git a/public/fpdf_annot.h b/public/fpdf_annot.h
index f4dc03a..a84c4f9 100644
--- a/public/fpdf_annot.h
+++ b/public/fpdf_annot.h
@@ -5,6 +5,8 @@
 #ifndef PUBLIC_FPDF_ANNOT_H_
 #define PUBLIC_FPDF_ANNOT_H_
 
+#include <stddef.h>
+
 // NOLINTNEXTLINE(build/include)
 #include "fpdfview.h"
 
@@ -311,6 +313,15 @@
                               const FS_QUADPOINTSF* quad_points);
 
 // Experimental API.
+// Get the number of sets of quadpoints of an annotation.
+//
+//   annot  - handle to an annotation.
+//
+// Returns the number of sets of quadpoints, or 0 on failure.
+FPDF_EXPORT size_t FPDF_CALLCONV
+FPDFAnnot_CountAttachmentPoints(FPDF_ANNOTATION annot);
+
+// Experimental API.
 // Get the attachment points (i.e. quadpoints) of an annotation.
 //
 //   annot       - handle to an annotation.