Combine nearly identical code in CPDF_GenerateAP::GenerateFormAP() Add helper functions to avoid code duplication and further shrink GenerateFormAP(). Change-Id: I4fbd7d0a714ef4ae96e71d495bb167052898966c Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/126593 Reviewed-by: Tom Sepez <tsepez@chromium.org> Commit-Queue: Lei Zhang <thestig@chromium.org> Reviewed-by: Thomas Sepez <tsepez@google.com>
diff --git a/core/fpdfdoc/cpdf_generateap.cpp b/core/fpdfdoc/cpdf_generateap.cpp index 0d5a0cb..e2d704c 100644 --- a/core/fpdfdoc/cpdf_generateap.cpp +++ b/core/fpdfdoc/cpdf_generateap.cpp
@@ -251,6 +251,41 @@ return default_appearance_string; } +bool CloneResourcesDictIfMissingFromStream(CPDF_Dictionary* stream_dict, + const CPDF_Dictionary* dr_dict) { + RetainPtr<CPDF_Dictionary> resources_dict = + stream_dict->GetMutableDictFor("Resources"); + if (resources_dict) { + return false; + } + + stream_dict->SetFor("Resources", dr_dict->Clone()); + return true; +} + +bool ValidateOrCreateFontResources(CPDF_Document* doc, + CPDF_Dictionary* stream_dict, + const CPDF_Dictionary* font_dict, + const ByteString& font_name) { + RetainPtr<CPDF_Dictionary> resources_dict = + stream_dict->GetMutableDictFor("Resources"); + RetainPtr<CPDF_Dictionary> font_resource_dict = + resources_dict->GetMutableDictFor("Font"); + if (!font_resource_dict) { + font_resource_dict = resources_dict->SetNewFor<CPDF_Dictionary>("Font"); + } + + if (!ValidateFontResourceDict(font_resource_dict.Get())) { + return false; + } + + if (!font_resource_dict->KeyExist(font_name)) { + font_resource_dict->SetNewFor<CPDF_Reference>(font_name, doc, + font_dict->GetObjNum()); + } + return true; +} + ByteString GenerateEditAP(IPVT_FontMap* font_map, CPVT_VariableText::Iterator* vt_iterator, const CFX_PointF& offset, @@ -1343,25 +1378,15 @@ RetainPtr<CPDF_Dictionary> resources_dict; if (normal_stream) { RetainPtr<CPDF_Dictionary> stream_dict = normal_stream->GetMutableDict(); - resources_dict = stream_dict->GetMutableDictFor("Resources"); - if (resources_dict) { - RetainPtr<CPDF_Dictionary> font_resource_dict = - resources_dict->GetMutableDictFor("Font"); - if (font_resource_dict) { - if (!ValidateFontResourceDict(font_resource_dict.Get())) { - return; - } - } else { - font_resource_dict = resources_dict->SetNewFor<CPDF_Dictionary>("Font"); + const bool cloned = + CloneResourcesDictIfMissingFromStream(stream_dict, dr_dict); + if (!cloned) { + if (!ValidateOrCreateFontResources(doc, stream_dict, font_dict, + font_name)) { + return; } - if (!font_resource_dict->KeyExist(font_name)) { - font_resource_dict->SetNewFor<CPDF_Reference>(font_name, doc, - font_dict->GetObjNum()); - } - } else { - resources_dict = ToDictionary(dr_dict->Clone()); - stream_dict->SetFor("Resources", resources_dict); } + resources_dict = stream_dict->GetMutableDictFor("Resources"); } else { normal_stream = doc->NewIndirect<CPDF_Stream>(pdfium::MakeRetain<CPDF_Dictionary>()); @@ -1410,26 +1435,14 @@ RetainPtr<CPDF_Dictionary> stream_dict = normal_stream->GetMutableDict(); stream_dict->SetMatrixFor("Matrix", annot_dimensions_and_color.matrix); stream_dict->SetRectFor("BBox", annot_dimensions_and_color.bbox); - resources_dict = stream_dict->GetMutableDictFor("Resources"); - if (!resources_dict) { - stream_dict->SetFor("Resources", dr_dict->Clone()); + + const bool cloned = + CloneResourcesDictIfMissingFromStream(stream_dict, dr_dict); + if (cloned) { return; } - RetainPtr<CPDF_Dictionary> font_resource_dict = - resources_dict->GetMutableDictFor("Font"); - if (font_resource_dict) { - if (!ValidateFontResourceDict(font_resource_dict.Get())) { - return; - } - } else { - font_resource_dict = resources_dict->SetNewFor<CPDF_Dictionary>("Font"); - } - - if (!font_resource_dict->KeyExist(font_name)) { - font_resource_dict->SetNewFor<CPDF_Reference>(font_name, doc, - font_dict->GetObjNum()); - } + ValidateOrCreateFontResources(doc, stream_dict, font_dict, font_name); } // static