Add freetext annotation support to FPDFAnnot_GetFontColor() Cherry-picked cl - https://pdfium-review.googlesource.com/c/pdfium/+/131952/1 Bug: 417867931 Test: Build and atest CtsPdfModuleTestCases Change-Id: I0521873a89de50046f7e3391da76551c46272fa9
diff --git a/core/fpdfdoc/cpdf_defaultappearance.cpp b/core/fpdfdoc/cpdf_defaultappearance.cpp index 671c7b3..9edcdb0 100644 --- a/core/fpdfdoc/cpdf_defaultappearance.cpp +++ b/core/fpdfdoc/cpdf_defaultappearance.cpp
@@ -27,7 +27,7 @@ if (default_appearance_object) { default_appearance_string = default_appearance_object->GetString(); } - if (default_appearance_string.IsEmpty()) { + if (default_appearance_string.IsEmpty() && acroform_dict) { default_appearance_string = acroform_dict->GetByteStringFor("DA"); } return default_appearance_string;
diff --git a/fpdfsdk/fpdf_annot.cpp b/fpdfsdk/fpdf_annot.cpp index d7821c2..adbd1a4 100644 --- a/fpdfsdk/fpdf_annot.cpp +++ b/fpdfsdk/fpdf_annot.cpp
@@ -353,6 +353,27 @@ : nullptr; } +std::optional<CFX_Color::TypeAndARGB> GetFreetextFontColor( + FPDF_FORMHANDLE handle, + FPDF_ANNOTATION annot) { + const CPDF_Dictionary* annot_dict = GetAnnotDictFromFPDFAnnotation(annot); + CHECK(annot_dict); // Has to be true to determine `annot` is for Freetext. + + CPDFSDK_InteractiveForm* form = FormHandleToInteractiveForm(handle); + CPDF_Document* doc = form ? form->GetInteractiveForm()->document() : nullptr; + const CPDF_Dictionary* root_dict = doc ? doc->GetRoot() : nullptr; + RetainPtr<const CPDF_Dictionary> acroform_dict = + root_dict ? root_dict->GetDictFor("AcroForm") : nullptr; + CPDF_DefaultAppearance default_appearance(annot_dict, acroform_dict); + return default_appearance.GetColorARGB(); +} + +std::optional<FX_COLORREF> GetWidgetFontColor(FPDF_FORMHANDLE handle, + FPDF_ANNOTATION annot) { + const CPDFSDK_Widget* widget = GetWidgetOfTypes(handle, annot, {}); + return widget ? widget->GetTextColor() : std::nullopt; +} + } // namespace FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV @@ -1436,19 +1457,32 @@ return false; } - const CPDFSDK_Widget* widget = GetWidgetOfTypes(hHandle, annot, {}); - if (!widget) { - return false; + FX_COLORREF font_color; + switch (FPDFAnnot_GetSubtype(annot)) { + case FPDF_ANNOT_FREETEXT: { + auto maybe_font_color = GetFreetextFontColor(hHandle, annot); + if (!maybe_font_color.has_value()) { + return false; + } + font_color = ArgbToColorRef(maybe_font_color.value().argb); + break; + } + case FPDF_ANNOT_WIDGET: { + auto maybe_font_color = GetWidgetFontColor(hHandle, annot); + if (!maybe_font_color.has_value()) { + return false; + } + font_color = maybe_font_color.value(); + break; + } + default: { + return false; + } } - std::optional<FX_COLORREF> text_color = widget->GetTextColor(); - if (!text_color) { - return false; - } - - *R = FXSYS_GetRValue(*text_color); - *G = FXSYS_GetGValue(*text_color); - *B = FXSYS_GetBValue(*text_color); + *R = FXSYS_GetRValue(font_color); + *G = FXSYS_GetGValue(font_color); + *B = FXSYS_GetBValue(font_color); return true; }