summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--fpdfsdk/fpdfannot.cpp24
-rw-r--r--fpdfsdk/fpdfannot_embeddertest.cpp3
-rw-r--r--fpdfsdk/fpdfview_c_api_test.c1
-rw-r--r--public/fpdf_annot.h11
4 files changed, 39 insertions, 0 deletions
diff --git a/fpdfsdk/fpdfannot.cpp b/fpdfsdk/fpdfannot.cpp
index ec748e66ec..8c62ecf311 100644
--- a/fpdfsdk/fpdfannot.cpp
+++ b/fpdfsdk/fpdfannot.cpp
@@ -241,6 +241,30 @@ FPDF_EXPORT FPDF_ANNOTATION FPDF_CALLCONV FPDFPage_GetAnnot(FPDF_PAGE page,
return pNewAnnot.release();
}
+FPDF_EXPORT int FPDF_CALLCONV FPDFPage_GetAnnotIndex(FPDF_PAGE page,
+ FPDF_ANNOTATION annot) {
+ CPDF_Page* pPage = CPDFPageFromFPDFPage(page);
+ CPDF_AnnotContext* pAnnot = CPDFAnnotContextFromFPDFAnnotation(annot);
+ if (!pPage || !pPage->m_pFormDict || !pAnnot || !pAnnot->GetAnnotDict())
+ return -1;
+
+ CPDF_Array* pAnnots = pPage->m_pFormDict->GetArrayFor("Annots");
+ if (!pAnnots)
+ return -1;
+
+ CPDF_Dictionary* pDict = pAnnot->GetAnnotDict();
+ auto it =
+ std::find_if(pAnnots->begin(), pAnnots->end(),
+ [pDict](const std::unique_ptr<CPDF_Object>& candidate) {
+ return candidate->GetDirect() == pDict;
+ });
+
+ if (it == pAnnots->end())
+ return -1;
+
+ return it - pAnnots->begin();
+}
+
FPDF_EXPORT void FPDF_CALLCONV FPDFPage_CloseAnnot(FPDF_ANNOTATION annot) {
delete CPDFAnnotContextFromFPDFAnnotation(annot);
}
diff --git a/fpdfsdk/fpdfannot_embeddertest.cpp b/fpdfsdk/fpdfannot_embeddertest.cpp
index 47b71667b2..6c0cdedab5 100644
--- a/fpdfsdk/fpdfannot_embeddertest.cpp
+++ b/fpdfsdk/fpdfannot_embeddertest.cpp
@@ -919,11 +919,13 @@ TEST_F(FPDFAnnotEmbeddertest, ExtractLinkedAnnotations) {
ASSERT_TRUE(OpenDocument("annotation_highlight_square_with_ap.pdf"));
FPDF_PAGE page = FPDF_LoadPage(document(), 0);
ASSERT_TRUE(page);
+ EXPECT_EQ(-1, FPDFPage_GetAnnotIndex(page, nullptr));
// Retrieve the highlight annotation which has its popup defined.
FPDF_ANNOTATION annot = FPDFPage_GetAnnot(page, 0);
ASSERT_TRUE(annot);
EXPECT_EQ(FPDF_ANNOT_HIGHLIGHT, FPDFAnnot_GetSubtype(annot));
+ EXPECT_EQ(0, FPDFPage_GetAnnotIndex(page, annot));
std::unique_ptr<unsigned short, pdfium::FreeDeleter> popup_key =
GetFPDFWideString(L"Popup");
ASSERT_TRUE(FPDFAnnot_HasKey(annot, popup_key.get()));
@@ -934,6 +936,7 @@ TEST_F(FPDFAnnotEmbeddertest, ExtractLinkedAnnotations) {
FPDF_ANNOTATION popup = FPDFAnnot_GetLinkedAnnot(annot, popup_key.get());
ASSERT_TRUE(popup);
EXPECT_EQ(FPDF_ANNOT_POPUP, FPDFAnnot_GetSubtype(popup));
+ EXPECT_EQ(1, FPDFPage_GetAnnotIndex(page, popup));
FS_RECTF rect;
ASSERT_TRUE(FPDFAnnot_GetRect(popup, &rect));
EXPECT_NEAR(612.0f, rect.left, 0.001f);
diff --git a/fpdfsdk/fpdfview_c_api_test.c b/fpdfsdk/fpdfview_c_api_test.c
index b42dc160da..5bad9c8e7b 100644
--- a/fpdfsdk/fpdfview_c_api_test.c
+++ b/fpdfsdk/fpdfview_c_api_test.c
@@ -40,6 +40,7 @@ int CheckPDFiumCApi() {
CHK(FPDFPage_CreateAnnot);
CHK(FPDFPage_GetAnnotCount);
CHK(FPDFPage_GetAnnot);
+ CHK(FPDFPage_GetAnnotIndex);
CHK(FPDFPage_CloseAnnot);
CHK(FPDFPage_RemoveAnnot);
CHK(FPDFAnnot_GetSubtype);
diff --git a/public/fpdf_annot.h b/public/fpdf_annot.h
index 6a89ff9384..429a3f7541 100644
--- a/public/fpdf_annot.h
+++ b/public/fpdf_annot.h
@@ -134,6 +134,17 @@ FPDF_EXPORT FPDF_ANNOTATION FPDF_CALLCONV FPDFPage_GetAnnot(FPDF_PAGE page,
int index);
// Experimental API.
+// Get the index of |annot| in |page|. This is the opposite of
+// FPDFPage_GetAnnot().
+//
+// page - handle to the page that the annotation is on.
+// annot - handle to an annotation.
+//
+// Returns the index of |annot|, or -1 on failure.
+FPDF_EXPORT int FPDF_CALLCONV FPDFPage_GetAnnotIndex(FPDF_PAGE page,
+ FPDF_ANNOTATION annot);
+
+// Experimental API.
// Close an annotation. Must be called when the annotation returned by
// FPDFPage_CreateAnnot() or FPDFPage_GetAnnot() is no longer needed. This
// function does not remove the annotation from the document.