diff options
author | Jane Liu <janeliulwq@google.com> | 2017-07-05 15:04:33 -0400 |
---|---|---|
committer | Chromium commit bot <commit-bot@chromium.org> | 2017-07-06 13:09:26 +0000 |
commit | b137e75343cada31ddcf905fc581a3a86a63b5d5 (patch) | |
tree | 69c8a46658e61739da60852b522b5dbfcc3b9cac | |
parent | ddf2418ba8e5d925909d7955ac22b33f37ccce44 (diff) | |
download | pdfium-b137e75343cada31ddcf905fc581a3a86a63b5d5.tar.xz |
Added APIs for setting annotation flag values
1. Added APIs for getting/setting/unsetting annotation flag values in
annotation dictionaries.
* Added an embedder test testing all the new functions.
Bug=pdfium:737
Change-Id: Ib6bbcf05d6e93c43ec4dcd7120db71bc244afdbf
Reviewed-on: https://pdfium-review.googlesource.com/7154
Reviewed-by: dsinclair <dsinclair@chromium.org>
Commit-Queue: dsinclair <dsinclair@chromium.org>
-rw-r--r-- | fpdfsdk/fpdfannot.cpp | 26 | ||||
-rw-r--r-- | fpdfsdk/fpdfannot_embeddertest.cpp | 50 | ||||
-rw-r--r-- | fpdfsdk/fpdfview_c_api_test.c | 2 | ||||
-rw-r--r-- | public/fpdf_annot.h | 30 |
4 files changed, 108 insertions, 0 deletions
diff --git a/fpdfsdk/fpdfannot.cpp b/fpdfsdk/fpdfannot.cpp index 4d75e6e236..d7ab8abac1 100644 --- a/fpdfsdk/fpdfannot.cpp +++ b/fpdfsdk/fpdfannot.cpp @@ -705,3 +705,29 @@ DLLEXPORT unsigned long STDCALL FPDFAnnot_GetText(FPDF_ANNOTATION annot, return len; } + +DLLEXPORT int STDCALL FPDFAnnot_GetFlags(FPDF_ANNOTATION annot) { + if (!annot) + return FPDF_ANNOT_FLAG_NONE; + + CPDF_Dictionary* pAnnotDict = + CPDFAnnotContextFromFPDFAnnotation(annot)->GetAnnotDict(); + if (!pAnnotDict) + return FPDF_ANNOT_FLAG_NONE; + + return pAnnotDict->GetIntegerFor("F"); +} + +DLLEXPORT FPDF_BOOL STDCALL FPDFAnnot_SetFlags(FPDF_ANNOTATION annot, + int flags) { + if (!annot) + return false; + + CPDF_Dictionary* pAnnotDict = + CPDFAnnotContextFromFPDFAnnotation(annot)->GetAnnotDict(); + if (!pAnnotDict) + return false; + + pAnnotDict->SetNewFor<CPDF_Number>("F", flags); + return true; +} diff --git a/fpdfsdk/fpdfannot_embeddertest.cpp b/fpdfsdk/fpdfannot_embeddertest.cpp index 6c56c06396..beaedf91af 100644 --- a/fpdfsdk/fpdfannot_embeddertest.cpp +++ b/fpdfsdk/fpdfannot_embeddertest.cpp @@ -555,3 +555,53 @@ TEST_F(FPDFAnnotEmbeddertest, AddAndModifyPath) { FPDFPage_CloseAnnot(annot); CloseSaved(); } + +TEST_F(FPDFAnnotEmbeddertest, ModifyAnnotationFlags) { + // Open a file with an annotation and load its first page. + ASSERT_TRUE(OpenDocument("annotation_highlight_rollover_ap.pdf")); + FPDF_PAGE page = FPDF_LoadPage(document(), 0); + ASSERT_TRUE(page); + + // Check that the page renders correctly. + FPDF_BITMAP bitmap = RenderPageWithFlags(page, form_handle_, FPDF_ANNOT); + CompareBitmap(bitmap, 612, 792, "dc98f06da047bd8aabfa99562d2cbd1e"); + FPDFBitmap_Destroy(bitmap); + + // Retrieve the annotation. + FPDF_ANNOTATION annot = FPDFPage_GetAnnot(page, 0); + ASSERT_TRUE(annot); + + // Check that the original flag values are as expected. + int flags = FPDFAnnot_GetFlags(annot); + EXPECT_FALSE(flags & FPDF_ANNOT_FLAG_HIDDEN); + EXPECT_TRUE(flags & FPDF_ANNOT_FLAG_PRINT); + + // Set the HIDDEN flag. + flags |= FPDF_ANNOT_FLAG_HIDDEN; + EXPECT_TRUE(FPDFAnnot_SetFlags(annot, flags)); + flags = FPDFAnnot_GetFlags(annot); + EXPECT_TRUE(flags & FPDF_ANNOT_FLAG_HIDDEN); + EXPECT_TRUE(flags & FPDF_ANNOT_FLAG_PRINT); + + // Check that the page renders correctly without rendering the annotation. + bitmap = RenderPageWithFlags(page, form_handle_, FPDF_ANNOT); + CompareBitmap(bitmap, 612, 792, "1940568c9ba33bac5d0b1ee9558c76b3"); + FPDFBitmap_Destroy(bitmap); + + // Unset the HIDDEN flag. + EXPECT_TRUE(FPDFAnnot_SetFlags(annot, FPDF_ANNOT_FLAG_NONE)); + EXPECT_FALSE(FPDFAnnot_GetFlags(annot)); + flags &= ~FPDF_ANNOT_FLAG_HIDDEN; + EXPECT_TRUE(FPDFAnnot_SetFlags(annot, flags)); + flags = FPDFAnnot_GetFlags(annot); + EXPECT_FALSE(flags & FPDF_ANNOT_FLAG_HIDDEN); + EXPECT_TRUE(flags & FPDF_ANNOT_FLAG_PRINT); + + // Check that the page renders correctly as before. + bitmap = RenderPageWithFlags(page, form_handle_, FPDF_ANNOT); + CompareBitmap(bitmap, 612, 792, "dc98f06da047bd8aabfa99562d2cbd1e"); + FPDFBitmap_Destroy(bitmap); + + FPDFPage_CloseAnnot(annot); + UnloadPage(page); +} diff --git a/fpdfsdk/fpdfview_c_api_test.c b/fpdfsdk/fpdfview_c_api_test.c index 94f4051bcd..01c318912f 100644 --- a/fpdfsdk/fpdfview_c_api_test.c +++ b/fpdfsdk/fpdfview_c_api_test.c @@ -55,6 +55,8 @@ int CheckPDFiumCApi() { CHK(FPDFAnnot_GetRect); CHK(FPDFAnnot_SetText); CHK(FPDFAnnot_GetText); + CHK(FPDFAnnot_GetFlags); + CHK(FPDFAnnot_SetFlags); // fpdf_dataavail.h CHK(FPDFAvail_Create); diff --git a/public/fpdf_annot.h b/public/fpdf_annot.h index 89edd01613..971662f8e8 100644 --- a/public/fpdf_annot.h +++ b/public/fpdf_annot.h @@ -45,6 +45,18 @@ extern "C" { #define FPDF_ANNOT_RICHMEDIA 26 #define FPDF_ANNOT_XFAWIDGET 27 +// Refer to PDF Reference (6th edition) table 8.16 for all annotation flags. +#define FPDF_ANNOT_FLAG_NONE 0 +#define FPDF_ANNOT_FLAG_INVISIBLE (1 << 0) +#define FPDF_ANNOT_FLAG_HIDDEN (1 << 1) +#define FPDF_ANNOT_FLAG_PRINT (1 << 2) +#define FPDF_ANNOT_FLAG_NOZOOM (1 << 3) +#define FPDF_ANNOT_FLAG_NOROTATE (1 << 4) +#define FPDF_ANNOT_FLAG_NOVIEW (1 << 5) +#define FPDF_ANNOT_FLAG_READONLY (1 << 6) +#define FPDF_ANNOT_FLAG_LOCKED (1 << 7) +#define FPDF_ANNOT_FLAG_TOGGLENOVIEW (1 << 8) + typedef enum FPDFANNOT_COLORTYPE { FPDFANNOT_COLORTYPE_Color = 0, FPDFANNOT_COLORTYPE_InteriorColor @@ -275,6 +287,24 @@ DLLEXPORT unsigned long STDCALL FPDFAnnot_GetText(FPDF_ANNOTATION annot, void* buffer, unsigned long buflen); +// Experimental API. +// Get the annotation flags of |annot|. +// +// annot - handle to an annotation. +// +// Returns the annotation flags. +DLLEXPORT int STDCALL FPDFAnnot_GetFlags(FPDF_ANNOTATION annot); + +// Experimental API. +// Set the |annot|'s flags to be of the value |flags|. +// +// annot - handle to an annotation. +// flags - the flag values to be set. +// +// Returns true if successful. +DLLEXPORT FPDF_BOOL STDCALL FPDFAnnot_SetFlags(FPDF_ANNOTATION annot, + int flags); + #ifdef __cplusplus } // extern "C" #endif // __cplusplus |