Add freetext annotation support to FPDFAnnot_GetFontColor() FPDFAnnot_GetFontColor() currently only supports widgets with variable text. Freetext annotation also has variable text, so it should work with FPDFAnnot_GetFontColor() as well. Bug: 419321436 Change-Id: I9db634fd88396b8ee0b60530bb8ce877725d49cf Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/131952 Reviewed-by: Tom Sepez <tsepez@chromium.org> Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdfdoc/cpdf_defaultappearance.cpp b/core/fpdfdoc/cpdf_defaultappearance.cpp index ed934d2..94e56e4 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 2ead581..e8e69ee 100644 --- a/fpdfsdk/fpdf_annot.cpp +++ b/fpdfsdk/fpdf_annot.cpp
@@ -357,6 +357,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 @@ -1533,19 +1554,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; }
diff --git a/fpdfsdk/fpdf_annot_embeddertest.cpp b/fpdfsdk/fpdf_annot_embeddertest.cpp index 0417f74..fb33ce1 100644 --- a/fpdfsdk/fpdf_annot_embeddertest.cpp +++ b/fpdfsdk/fpdf_annot_embeddertest.cpp
@@ -2792,10 +2792,22 @@ ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0)); ASSERT_TRUE(annot); - // TODO(thestig): Check FPDFAnnot_GetFontColor() results before and after, - // when the API supports freetext annotations. + unsigned int r = 1; + unsigned int g = 2; + unsigned int b = 3; + ASSERT_TRUE(FPDFAnnot_GetFontColor(form_handle(), annot.get(), &r, &g, &b)); + EXPECT_EQ(0u, r); + EXPECT_EQ(0u, g); + EXPECT_EQ(0u, b); + ASSERT_TRUE( FPDFAnnot_SetFontColor(form_handle(), annot.get(), 60, 120, 180)); + + ASSERT_TRUE(FPDFAnnot_GetFontColor(form_handle(), annot.get(), &r, &g, &b)); + EXPECT_EQ(60u, r); + EXPECT_EQ(120u, g); + EXPECT_EQ(180u, b); + bitmap = RenderLoadedPageWithFlags(page.get(), FPDF_ANNOT); CompareBitmap(bitmap.get(), kDimension, kDimension, modified_checksum); }