Prefer Optional<vector> to than unique_ptr<vector> The use of the unique_ptr in this case is just to provide a no-value case by means of nullptr. We can avoid the additional indirection via Optional. -- Return results by value while we're at it. Change-Id: I2fae135aa72ae7b6a539effe8647ce1ef44c8346 Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/78714 Reviewed-by: Lei Zhang <thestig@chromium.org> Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/xfa/fgas/font/cfgas_fontmgr.cpp b/xfa/fgas/font/cfgas_fontmgr.cpp index 93f5b32..9a45efc 100644 --- a/xfa/fgas/font/cfgas_fontmgr.cpp +++ b/xfa/fgas/font/cfgas_fontmgr.cpp
@@ -637,17 +637,12 @@ const wchar_t* pszFontFamily, uint32_t dwHash, uint16_t wCodePage, - uint16_t /* wBitField */) { - std::vector<CFGAS_FontDescriptorInfo>* sortedFontInfos = - m_Hash2CandidateList[dwHash].get(); - if (!sortedFontInfos) { - auto pNewFonts = std::make_unique<std::vector<CFGAS_FontDescriptorInfo>>(); - sortedFontInfos = pNewFonts.get(); - MatchFonts(sortedFontInfos, wCodePage, dwFontStyles, - WideString(pszFontFamily), wUnicode); - m_Hash2CandidateList[dwHash] = std::move(pNewFonts); + uint16_t /* wBitField*/) { + if (!m_Hash2CandidateList[dwHash].has_value()) { + m_Hash2CandidateList[dwHash] = + MatchFonts(wCodePage, dwFontStyles, pszFontFamily, wUnicode); } - for (const auto& info : *sortedFontInfos) { + for (const auto& info : m_Hash2CandidateList[dwHash].value()) { CFGAS_FontDescriptor* pDesc = info.pFont; if (!VerifyUnicodeForFontDescriptor(pDesc, wUnicode)) continue; @@ -679,23 +674,23 @@ return CFGAS_GEFont::LoadFont(std::move(pInternalFont)); } -void CFGAS_FontMgr::MatchFonts( - std::vector<CFGAS_FontDescriptorInfo>* pMatchedFonts, +std::vector<CFGAS_FontDescriptorInfo> CFGAS_FontMgr::MatchFonts( uint16_t wCodePage, uint32_t dwFontStyles, const WideString& FontName, wchar_t wcUnicode) { - pMatchedFonts->clear(); + std::vector<CFGAS_FontDescriptorInfo> matched_fonts; for (const auto& pFont : m_InstalledFonts) { int32_t nPenalty = CalcPenalty(pFont.get(), wCodePage, dwFontStyles, FontName, wcUnicode); if (nPenalty >= 0xffff) continue; - pMatchedFonts->push_back({pFont.get(), nPenalty}); - if (pMatchedFonts->size() == 0xffff) + matched_fonts.push_back({pFont.get(), nPenalty}); + if (matched_fonts.size() == 0xffff) break; } - std::sort(pMatchedFonts->begin(), pMatchedFonts->end()); + std::sort(matched_fonts.begin(), matched_fonts.end()); + return matched_fonts; } void CFGAS_FontMgr::RegisterFace(RetainPtr<CFX_Face> pFace, @@ -780,15 +775,12 @@ RetainPtr<CFGAS_GEFont> pFont = CFGAS_GEFont::LoadFont(pFD->wsFontFace, dwFontStyles, wCodePage); #else // defined(OS_WIN) - std::vector<CFGAS_FontDescriptorInfo>* sortedFontInfos = - m_Hash2CandidateList[dwHash].get(); - if (!sortedFontInfos) { - auto pNewFonts = std::make_unique<std::vector<CFGAS_FontDescriptorInfo>>(); - sortedFontInfos = pNewFonts.get(); - MatchFonts(sortedFontInfos, wCodePage, dwFontStyles, - WideString(pszFontFamily), 0); - m_Hash2CandidateList[dwHash] = std::move(pNewFonts); + if (!m_Hash2CandidateList[dwHash].has_value()) { + m_Hash2CandidateList[dwHash] = + MatchFonts(wCodePage, dwFontStyles, WideString(pszFontFamily), 0); } + std::vector<CFGAS_FontDescriptorInfo>* sortedFontInfos = + &m_Hash2CandidateList[dwHash].value(); if (sortedFontInfos->empty()) return nullptr;
diff --git a/xfa/fgas/font/cfgas_fontmgr.h b/xfa/fgas/font/cfgas_fontmgr.h index 995ca95..4b5d59e 100644 --- a/xfa/fgas/font/cfgas_fontmgr.h +++ b/xfa/fgas/font/cfgas_fontmgr.h
@@ -19,6 +19,7 @@ #include "core/fxcrt/retain_ptr.h" #include "core/fxge/cfx_face.h" #include "core/fxge/fx_freetype.h" +#include "third_party/base/optional.h" class CFGAS_GEFont; class IFX_SeekableReadStream; @@ -131,11 +132,10 @@ void RegisterFace(RetainPtr<CFX_Face> pFace, const WideString* pFaceName); void RegisterFaces(const RetainPtr<IFX_SeekableReadStream>& pFontStream, const WideString* pFaceName); - void MatchFonts(std::vector<CFGAS_FontDescriptorInfo>* MatchedFonts, - uint16_t wCodePage, - uint32_t dwFontStyles, - const WideString& FontName, - wchar_t wcUnicode); + std::vector<CFGAS_FontDescriptorInfo> MatchFonts(uint16_t wCodePage, + uint32_t dwFontStyles, + const WideString& FontName, + wchar_t wcUnicode); RetainPtr<CFGAS_GEFont> LoadFontInternal(const WideString& wsFaceName, int32_t iFaceIndex); #endif // defined(OS_WIN) @@ -147,7 +147,7 @@ std::deque<FX_FONTDESCRIPTOR> m_FontFaces; #else std::vector<std::unique_ptr<CFGAS_FontDescriptor>> m_InstalledFonts; - std::map<uint32_t, std::unique_ptr<std::vector<CFGAS_FontDescriptorInfo>>> + std::map<uint32_t, Optional<std::vector<CFGAS_FontDescriptorInfo>>> m_Hash2CandidateList; #endif // defined(OS_WIN) };