Add GetAnnotDictFromFPDFAnnotation() helper function.
Simplify many checks in fpdf_annot.cpp.
Change-Id: I86237641feef6358c3127f2699723a51b7d53012
Reviewed-on: https://pdfium-review.googlesource.com/c/51152
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Henrique Nakashima <hnakashima@chromium.org>
diff --git a/fpdfsdk/fpdf_annot.cpp b/fpdfsdk/fpdf_annot.cpp
index 8ab2d84..7f3fac3 100644
--- a/fpdfsdk/fpdf_annot.cpp
+++ b/fpdfsdk/fpdf_annot.cpp
@@ -209,6 +209,11 @@
}
}
+CPDF_Dictionary* GetAnnotDictFromFPDFAnnotation(FPDF_ANNOTATION annot) {
+ CPDF_AnnotContext* context = CPDFAnnotContextFromFPDFAnnotation(annot);
+ return context ? context->GetAnnotDict() : nullptr;
+}
+
} // namespace
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
@@ -273,8 +278,11 @@
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->GetDict() || !pAnnot || !pAnnot->GetAnnotDict())
+ if (!pPage || !pPage->GetDict())
+ return -1;
+
+ CPDF_Dictionary* pAnnotDict = GetAnnotDictFromFPDFAnnotation(annot);
+ if (!pAnnotDict)
return -1;
CPDF_Array* pAnnots = pPage->GetDict()->GetArrayFor("Annots");
@@ -282,11 +290,10 @@
return -1;
CPDF_ArrayLocker locker(pAnnots);
- CPDF_Dictionary* pDict = pAnnot->GetAnnotDict();
auto it =
std::find_if(locker.begin(), locker.end(),
- [pDict](const std::unique_ptr<CPDF_Object>& candidate) {
- return candidate->GetDirect() == pDict;
+ [pAnnotDict](const std::unique_ptr<CPDF_Object>& candidate) {
+ return candidate->GetDirect() == pAnnotDict;
});
if (it == locker.end())
@@ -315,11 +322,7 @@
FPDF_EXPORT FPDF_ANNOTATION_SUBTYPE FPDF_CALLCONV
FPDFAnnot_GetSubtype(FPDF_ANNOTATION annot) {
- if (!annot)
- return FPDF_ANNOT_UNKNOWN;
-
- CPDF_Dictionary* pAnnotDict =
- CPDFAnnotContextFromFPDFAnnotation(annot)->GetAnnotDict();
+ CPDF_Dictionary* pAnnotDict = GetAnnotDictFromFPDFAnnotation(annot);
if (!pAnnotDict)
return FPDF_ANNOT_UNKNOWN;
@@ -485,12 +488,8 @@
unsigned int G,
unsigned int B,
unsigned int A) {
- if (!annot || R > 255 || G > 255 || B > 255 || A > 255)
- return false;
-
- CPDF_Dictionary* pAnnotDict =
- CPDFAnnotContextFromFPDFAnnotation(annot)->GetAnnotDict();
- if (!pAnnotDict)
+ CPDF_Dictionary* pAnnotDict = GetAnnotDictFromFPDFAnnotation(annot);
+ if (!pAnnotDict || R > 255 || G > 255 || B > 255 || A > 255)
return false;
// For annotations with their appearance streams already defined, the path
@@ -523,12 +522,8 @@
unsigned int* G,
unsigned int* B,
unsigned int* A) {
- if (!annot || !R || !G || !B || !A)
- return false;
-
- CPDF_Dictionary* pAnnotDict =
- CPDFAnnotContextFromFPDFAnnotation(annot)->GetAnnotDict();
- if (!pAnnotDict)
+ CPDF_Dictionary* pAnnotDict = GetAnnotDictFromFPDFAnnotation(annot);
+ if (!pAnnotDict || !R || !G || !B || !A)
return false;
// For annotations with their appearance streams already defined, the path
@@ -660,12 +655,8 @@
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFAnnot_SetRect(FPDF_ANNOTATION annot,
const FS_RECTF* rect) {
- if (!annot || !rect)
- return false;
-
- CPDF_Dictionary* pAnnotDict =
- CPDFAnnotContextFromFPDFAnnotation(annot)->GetAnnotDict();
- if (!pAnnotDict)
+ CPDF_Dictionary* pAnnotDict = GetAnnotDictFromFPDFAnnotation(annot);
+ if (!pAnnotDict || !rect)
return false;
CFX_FloatRect newRect = CFXFloatRectFromFSRECTF(*rect);
@@ -690,12 +681,8 @@
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFAnnot_GetRect(FPDF_ANNOTATION annot,
FS_RECTF* rect) {
- if (!annot || !rect)
- return false;
-
- CPDF_Dictionary* pAnnotDict =
- CPDFAnnotContextFromFPDFAnnotation(annot)->GetAnnotDict();
- if (!pAnnotDict)
+ CPDF_Dictionary* pAnnotDict = GetAnnotDictFromFPDFAnnotation(annot);
+ if (!pAnnotDict || !rect)
return false;
FSRECTFFromCFXFloatRect(pAnnotDict->GetRectFor(pdfium::annotation::kRect),
@@ -705,15 +692,8 @@
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFAnnot_HasKey(FPDF_ANNOTATION annot,
FPDF_BYTESTRING key) {
- if (!annot)
- return false;
-
- CPDF_Dictionary* pAnnotDict =
- CPDFAnnotContextFromFPDFAnnotation(annot)->GetAnnotDict();
- if (!pAnnotDict)
- return false;
-
- return pAnnotDict->KeyExist(key);
+ CPDF_Dictionary* pAnnotDict = GetAnnotDictFromFPDFAnnotation(annot);
+ return pAnnotDict && pAnnotDict->KeyExist(key);
}
FPDF_EXPORT FPDF_OBJECT_TYPE FPDF_CALLCONV
@@ -730,11 +710,7 @@
FPDFAnnot_SetStringValue(FPDF_ANNOTATION annot,
FPDF_BYTESTRING key,
FPDF_WIDESTRING value) {
- if (!annot)
- return false;
-
- CPDF_Dictionary* pAnnotDict =
- CPDFAnnotContextFromFPDFAnnotation(annot)->GetAnnotDict();
+ CPDF_Dictionary* pAnnotDict = GetAnnotDictFromFPDFAnnotation(annot);
if (!pAnnotDict)
return false;
@@ -747,11 +723,7 @@
FPDF_BYTESTRING key,
void* buffer,
unsigned long buflen) {
- if (!annot)
- return 0;
-
- CPDF_Dictionary* pAnnotDict =
- CPDFAnnotContextFromFPDFAnnotation(annot)->GetAnnotDict();
+ CPDF_Dictionary* pAnnotDict = GetAnnotDictFromFPDFAnnotation(annot);
if (!pAnnotDict)
return 0;
@@ -763,17 +735,13 @@
FPDFAnnot_SetAP(FPDF_ANNOTATION annot,
FPDF_ANNOT_APPEARANCEMODE appearanceMode,
FPDF_WIDESTRING value) {
- if (appearanceMode < 0 || appearanceMode >= FPDF_ANNOT_APPEARANCEMODE_COUNT)
- return false;
-
- if (!annot)
- return false;
-
- CPDF_Dictionary* pAnnotDict =
- CPDFAnnotContextFromFPDFAnnotation(annot)->GetAnnotDict();
+ CPDF_Dictionary* pAnnotDict = GetAnnotDictFromFPDFAnnotation(annot);
if (!pAnnotDict)
return false;
+ if (appearanceMode < 0 || appearanceMode >= FPDF_ANNOT_APPEARANCEMODE_COUNT)
+ return false;
+
constexpr const char* modeKeyForMode[] = {"N", "R", "D"};
static_assert(FX_ArraySize(modeKeyForMode) == FPDF_ANNOT_APPEARANCEMODE_COUNT,
"length of modeKeyForMode should be equal to "
@@ -809,17 +777,13 @@
FPDF_ANNOT_APPEARANCEMODE appearanceMode,
void* buffer,
unsigned long buflen) {
- if (appearanceMode < 0 || appearanceMode >= FPDF_ANNOT_APPEARANCEMODE_COUNT)
- return 0;
-
- if (!annot)
- return 0;
-
- CPDF_Dictionary* pAnnotDict =
- CPDFAnnotContextFromFPDFAnnotation(annot)->GetAnnotDict();
+ CPDF_Dictionary* pAnnotDict = GetAnnotDictFromFPDFAnnotation(annot);
if (!pAnnotDict)
return 0;
+ if (appearanceMode < 0 || appearanceMode >= FPDF_ANNOT_APPEARANCEMODE_COUNT)
+ return 0;
+
CPDF_Annot::AppearanceMode mode =
static_cast<CPDF_Annot::AppearanceMode>(appearanceMode);
@@ -846,22 +810,14 @@
}
FPDF_EXPORT int FPDF_CALLCONV FPDFAnnot_GetFlags(FPDF_ANNOTATION annot) {
- if (!annot)
- return FPDF_ANNOT_FLAG_NONE;
-
- CPDF_Dictionary* pAnnotDict =
- CPDFAnnotContextFromFPDFAnnotation(annot)->GetAnnotDict();
+ CPDF_Dictionary* pAnnotDict = GetAnnotDictFromFPDFAnnotation(annot);
return pAnnotDict ? pAnnotDict->GetIntegerFor(pdfium::annotation::kF)
: FPDF_ANNOT_FLAG_NONE;
}
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFAnnot_SetFlags(FPDF_ANNOTATION annot,
int flags) {
- if (!annot)
- return false;
-
- CPDF_Dictionary* pAnnotDict =
- CPDFAnnotContextFromFPDFAnnotation(annot)->GetAnnotDict();
+ CPDF_Dictionary* pAnnotDict = GetAnnotDictFromFPDFAnnotation(annot);
if (!pAnnotDict)
return false;
@@ -878,11 +834,10 @@
return FPDF_FORMFLAG_NONE;
CPDF_Page* pPage = CPDFPageFromFPDFPage(page);
- if (!pPage || !annot)
+ if (!pPage)
return FPDF_FORMFLAG_NONE;
- CPDF_Dictionary* pAnnotDict =
- CPDFAnnotContextFromFPDFAnnotation(annot)->GetAnnotDict();
+ CPDF_Dictionary* pAnnotDict = GetAnnotDictFromFPDFAnnotation(annot);
if (!pAnnotDict)
return FPDF_FORMFLAG_NONE;
@@ -920,11 +875,7 @@
if (!pForm)
return -1;
- if (!annot)
- return -1;
-
- CPDF_Dictionary* pAnnotDict =
- CPDFAnnotContextFromFPDFAnnotation(annot)->GetAnnotDict();
+ CPDF_Dictionary* pAnnotDict = GetAnnotDictFromFPDFAnnotation(annot);
if (!pAnnotDict)
return -1;
@@ -943,12 +894,8 @@
if (!pForm)
return 0;
- if (!annot || index < 0)
- return 0;
-
- CPDF_Dictionary* pAnnotDict =
- CPDFAnnotContextFromFPDFAnnotation(annot)->GetAnnotDict();
- if (!pAnnotDict)
+ CPDF_Dictionary* pAnnotDict = GetAnnotDictFromFPDFAnnotation(annot);
+ if (!pAnnotDict || index < 0)
return 0;
CPDF_InteractiveForm* pPDFForm = pForm->GetInteractiveForm();