diff options
Diffstat (limited to 'xfa/fgas')
-rw-r--r-- | xfa/fgas/font/cfgas_fontmgr.cpp | 83 | ||||
-rw-r--r-- | xfa/fgas/font/cfgas_fontmgr.h | 28 |
2 files changed, 47 insertions, 64 deletions
diff --git a/xfa/fgas/font/cfgas_fontmgr.cpp b/xfa/fgas/font/cfgas_fontmgr.cpp index 9d3954fb1e..72f7b88f95 100644 --- a/xfa/fgas/font/cfgas_fontmgr.cpp +++ b/xfa/fgas/font/cfgas_fontmgr.cpp @@ -6,6 +6,7 @@ #include "xfa/fgas/font/cfgas_fontmgr.h" +#include <algorithm> #include <memory> #include <utility> @@ -572,10 +573,7 @@ std::unique_ptr<CFGAS_FontMgr> CFGAS_FontMgr::Create( CFGAS_FontMgr::CFGAS_FontMgr(CFX_FontSourceEnum_File* pFontEnum) : m_pFontSource(pFontEnum) {} -CFGAS_FontMgr::~CFGAS_FontMgr() { - for (int32_t i = 0; i < m_InstalledFonts.GetSize(); i++) - delete m_InstalledFonts[i]; -} +CFGAS_FontMgr::~CFGAS_FontMgr() {} bool CFGAS_FontMgr::EnumFontsFromFontMapper() { CFX_FontMapper* pFontMapper = @@ -598,7 +596,7 @@ bool CFGAS_FontMgr::EnumFontsFromFontMapper() { CFX_WideString::FromLocal(pFontMapper->GetFaceName(i).c_str()); RegisterFaces(pFontStream, &wsFaceName); } - return m_InstalledFonts.GetSize() != 0; + return !m_InstalledFonts.empty(); } bool CFGAS_FontMgr::EnumFontsFromFiles() { @@ -611,7 +609,7 @@ bool CFGAS_FontMgr::EnumFontsFromFiles() { if (pFontStream) RegisterFaces(pFontStream, nullptr); } - return m_InstalledFonts.GetSize() != 0; + return !m_InstalledFonts.empty(); } bool CFGAS_FontMgr::EnumFonts() { @@ -637,18 +635,19 @@ CFX_RetainPtr<CFGAS_GEFont> CFGAS_FontMgr::GetFontByCodePage( if (!pFontArray->empty()) return (*pFontArray)[0]; - CFX_FontDescriptorInfos* sortedFonts = m_Hash2CandidateList[dwHash].get(); - if (!sortedFonts) { - auto pNewFonts = pdfium::MakeUnique<CFX_FontDescriptorInfos>(); - sortedFonts = pNewFonts.get(); - MatchFonts(*sortedFonts, wCodePage, dwFontStyles, + std::vector<CFX_FontDescriptorInfo>* sortedFontInfos = + m_Hash2CandidateList[dwHash].get(); + if (!sortedFontInfos) { + auto pNewFonts = pdfium::MakeUnique<std::vector<CFX_FontDescriptorInfo>>(); + sortedFontInfos = pNewFonts.get(); + MatchFonts(sortedFontInfos, wCodePage, dwFontStyles, CFX_WideString(pszFontFamily), 0); m_Hash2CandidateList[dwHash] = std::move(pNewFonts); } - if (sortedFonts->GetSize() == 0) + if (sortedFontInfos->empty()) return nullptr; - CFX_FontDescriptor* pDesc = sortedFonts->GetAt(0).pFont; + CFX_FontDescriptor* pDesc = (*sortedFontInfos)[0].pFont; CFX_RetainPtr<CFGAS_GEFont> pFont = LoadFont(pDesc->m_wsFaceName, pDesc->m_nFaceIndex, nullptr); if (!pFont) @@ -681,16 +680,17 @@ CFX_RetainPtr<CFGAS_GEFont> CFGAS_FontMgr::GetFontByUnicode( if (VerifyUnicode((*pFonts)[i], wUnicode)) return (*pFonts)[i]; } - CFX_FontDescriptorInfos* sortedFonts = m_Hash2CandidateList[dwHash].get(); - if (!sortedFonts) { - auto pNewFonts = pdfium::MakeUnique<CFX_FontDescriptorInfos>(); - sortedFonts = pNewFonts.get(); - MatchFonts(*sortedFonts, wCodePage, dwFontStyles, + std::vector<CFX_FontDescriptorInfo>* sortedFontInfos = + m_Hash2CandidateList[dwHash].get(); + if (!sortedFontInfos) { + auto pNewFonts = pdfium::MakeUnique<std::vector<CFX_FontDescriptorInfo>>(); + sortedFontInfos = pNewFonts.get(); + MatchFonts(sortedFontInfos, wCodePage, dwFontStyles, CFX_WideString(pszFontFamily), wUnicode); m_Hash2CandidateList[dwHash] = std::move(pNewFonts); } - for (int32_t i = 0; i < sortedFonts->GetSize(); ++i) { - CFX_FontDescriptor* pDesc = sortedFonts->GetAt(i).pFont; + for (const auto& info : *sortedFontInfos) { + CFX_FontDescriptor* pDesc = info.pFont; if (!VerifyUnicode(pDesc, wUnicode)) continue; CFX_RetainPtr<CFGAS_GEFont> pFont = @@ -874,36 +874,23 @@ CFX_RetainPtr<IFX_SeekableReadStream> CFGAS_FontMgr::CreateFontStream( return nullptr; } -int32_t CFGAS_FontMgr::MatchFonts(CFX_FontDescriptorInfos& MatchedFonts, - uint16_t wCodePage, - uint32_t dwFontStyles, - const CFX_WideString& FontName, - FX_WCHAR wcUnicode) { - MatchedFonts.RemoveAll(); - CFX_WideString wsNormalizedFontName = FontName; - - CFX_FontDescriptor* pFont = nullptr; - int32_t nCount = m_InstalledFonts.GetSize(); - for (int32_t i = 0; i < nCount; i++) { - pFont = m_InstalledFonts[i]; - int32_t nPenalty = CalcPenalty(pFont, wCodePage, dwFontStyles, - wsNormalizedFontName, wcUnicode); +void CFGAS_FontMgr::MatchFonts( + std::vector<CFX_FontDescriptorInfo>* pMatchedFonts, + uint16_t wCodePage, + uint32_t dwFontStyles, + const CFX_WideString& FontName, + FX_WCHAR wcUnicode) { + pMatchedFonts->clear(); + for (const auto& pFont : m_InstalledFonts) { + int32_t nPenalty = + CalcPenalty(pFont.get(), wCodePage, dwFontStyles, FontName, wcUnicode); if (nPenalty >= 0xffff) continue; - - FX_FontDescriptorInfo FontInfo; - FontInfo.pFont = pFont; - FontInfo.nPenalty = nPenalty; - MatchedFonts.Add(FontInfo); - if (MatchedFonts.GetSize() == 0xffff) + pMatchedFonts->push_back({pFont.get(), nPenalty}); + if (pMatchedFonts->size() == 0xffff) break; } - if (MatchedFonts.GetSize() == 0) - return 0; - - CFX_SSortTemplate<FX_FontDescriptorInfo> ssort; - ssort.ShellSort(MatchedFonts.GetData(), MatchedFonts.GetSize()); - return MatchedFonts.GetSize(); + std::sort(pMatchedFonts->begin(), pMatchedFonts->end()); } int32_t CFGAS_FontMgr::CalcPenalty(CFX_FontDescriptor* pInstalled, @@ -1003,7 +990,7 @@ void CFGAS_FontMgr::RegisterFace(FXFT_Face pFace, if ((pFace->face_flags & FT_FACE_FLAG_SCALABLE) == 0) return; - std::unique_ptr<CFX_FontDescriptor> pFont(new CFX_FontDescriptor); + auto pFont = pdfium::MakeUnique<CFX_FontDescriptor>(); pFont->m_dwFontStyles |= FXFT_Is_Face_Bold(pFace) ? FX_FONTSTYLE_Bold : 0; pFont->m_dwFontStyles |= FXFT_Is_Face_Italic(pFace) ? FX_FONTSTYLE_Italic : 0; pFont->m_dwFontStyles |= GetFlags(pFace); @@ -1029,7 +1016,7 @@ void CFGAS_FontMgr::RegisterFace(FXFT_Face pFace, pFaceName ? *pFaceName : CFX_WideString::FromLocal(FXFT_Get_Postscript_Name(pFace)); pFont->m_nFaceIndex = pFace->face_index; - m_InstalledFonts.Add(pFont.release()); + m_InstalledFonts.push_back(std::move(pFont)); } void CFGAS_FontMgr::RegisterFaces( diff --git a/xfa/fgas/font/cfgas_fontmgr.h b/xfa/fgas/font/cfgas_fontmgr.h index 20efa3296b..303d73404b 100644 --- a/xfa/fgas/font/cfgas_fontmgr.h +++ b/xfa/fgas/font/cfgas_fontmgr.h @@ -146,26 +146,22 @@ class CFX_FontDescriptor { uint32_t m_dwCsb[2]; }; -typedef CFX_ArrayTemplate<CFX_FontDescriptor*> CFX_FontDescriptors; - -struct FX_FontDescriptorInfo { +class CFX_FontDescriptorInfo { public: CFX_FontDescriptor* pFont; int32_t nPenalty; - bool operator>(const FX_FontDescriptorInfo& other) const { + bool operator>(const CFX_FontDescriptorInfo& other) const { return nPenalty > other.nPenalty; } - bool operator<(const FX_FontDescriptorInfo& other) const { + bool operator<(const CFX_FontDescriptorInfo& other) const { return nPenalty < other.nPenalty; } - bool operator==(const FX_FontDescriptorInfo& other) const { + bool operator==(const CFX_FontDescriptorInfo& other) const { return nPenalty == other.nPenalty; } }; -typedef CFX_ArrayTemplate<FX_FontDescriptorInfo> CFX_FontDescriptorInfos; - struct FX_HandleParentPath { FX_HandleParentPath() {} FX_HandleParentPath(const FX_HandleParentPath& x) { @@ -226,11 +222,11 @@ class CFGAS_FontMgr { bool VerifyUnicode(const CFX_RetainPtr<CFGAS_GEFont>& pFont, FX_WCHAR wcUnicode); int32_t IsPartName(const CFX_WideString& Name1, const CFX_WideString& Name2); - int32_t MatchFonts(CFX_FontDescriptorInfos& MatchedFonts, - uint16_t wCodePage, - uint32_t dwFontStyles, - const CFX_WideString& FontName, - FX_WCHAR wcUnicode = 0xFFFE); + void MatchFonts(std::vector<CFX_FontDescriptorInfo>* MatchedFonts, + uint16_t wCodePage, + uint32_t dwFontStyles, + const CFX_WideString& FontName, + FX_WCHAR wcUnicode = 0xFFFE); int32_t CalcPenalty(CFX_FontDescriptor* pInstalled, uint16_t wCodePage, uint32_t dwFontStyles, @@ -248,14 +244,14 @@ class CFGAS_FontMgr { CFX_RetainPtr<IFX_SeekableReadStream> CreateFontStream( const CFX_ByteString& bsFaceName); - CFX_FontDescriptors m_InstalledFonts; - std::map<uint32_t, std::unique_ptr<CFX_FontDescriptorInfos>> + CFX_FontSourceEnum_File* const m_pFontSource; + std::vector<std::unique_ptr<CFX_FontDescriptor>> m_InstalledFonts; + std::map<uint32_t, std::unique_ptr<std::vector<CFX_FontDescriptorInfo>>> m_Hash2CandidateList; std::map<uint32_t, std::vector<CFX_RetainPtr<CFGAS_GEFont>>> m_Hash2Fonts; std::map<CFX_RetainPtr<CFGAS_GEFont>, CFX_RetainPtr<IFX_SeekableReadStream>> m_IFXFont2FileRead; std::set<FX_WCHAR> m_FailedUnicodesSet; - CFX_FontSourceEnum_File* const m_pFontSource; }; #endif // _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ |