summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRalf Sippl <ralf.sippl@gmail.com>2018-03-26 18:38:20 +0000
committerChromium commit bot <commit-bot@chromium.org>2018-03-26 18:38:20 +0000
commitca28cb636331de447125de476decbec333fe613b (patch)
treeb532813458060d0700e76ea53e940d1587e2a6bb
parent3ae75c2f2e5759fcf8218e59fa380c26b98aa6b6 (diff)
downloadpdfium-ca28cb636331de447125de476decbec333fe613b.tar.xz
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>
-rw-r--r--fpdfsdk/fpdfannot.cpp15
-rw-r--r--fpdfsdk/fpdfannot_embeddertest.cpp21
-rw-r--r--fpdfsdk/fpdfview_c_api_test.c1
-rw-r--r--public/fpdf_annot.h11
4 files changed, 45 insertions, 3 deletions
diff --git a/fpdfsdk/fpdfannot.cpp b/fpdfsdk/fpdfannot.cpp
index b5dccaade1..c52807148e 100644
--- a/fpdfsdk/fpdfannot.cpp
+++ b/fpdfsdk/fpdfannot.cpp
@@ -583,7 +583,7 @@ FPDFAnnot_HasAttachmentPoints(FPDF_ANNOTATION annot) {
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 @@ FPDFAnnot_SetAttachmentPoints(FPDF_ANNOTATION annot,
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 b96460a395..552398c41f 100644
--- a/fpdfsdk/fpdfannot_embeddertest.cpp
+++ b/fpdfsdk/fpdfannot_embeddertest.cpp
@@ -47,7 +47,7 @@ TEST_F(FPDFAnnotEmbeddertest, RenderAnnotWithOnlyRolloverAP) {
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 @@ TEST_F(FPDFAnnotEmbeddertest, ModifyRectQuadpointsWithAP) {
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 2a0b230ca5..201fd90669 100644
--- a/fpdfsdk/fpdfview_c_api_test.c
+++ b/fpdfsdk/fpdfview_c_api_test.c
@@ -55,6 +55,7 @@ int CheckPDFiumCApi() {
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 f4dc03a2c4..a84c4f982a 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 @@ FPDFAnnot_SetAttachmentPoints(FPDF_ANNOTATION annot,
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.