From 065c35006d96eaca324f49248d20d83709a25fbe Mon Sep 17 00:00:00 2001 From: npm Date: Thu, 6 Oct 2016 12:29:09 -0700 Subject: Split m_InstalledTTFonts into two vectors to avoid sketchy logic. Instead of relying on ' ' to determine whether the CFX_Bytestring is added on one place or another, use another vector. When trying to match fonts from the fontmapper, compare with both vectors. BUG=pdfium:510 Review-Url: https://codereview.chromium.org/2395883002 --- core/fxge/cfx_fontmapper.h | 1 + core/fxge/ge/cfx_fontmapper.cpp | 21 ++++++++++----------- core/fxge/win32/fx_win32_device.cpp | 12 ++++++------ fpdfsdk/cfx_systemhandler.cpp | 4 ++++ 4 files changed, 21 insertions(+), 17 deletions(-) diff --git a/core/fxge/cfx_fontmapper.h b/core/fxge/cfx_fontmapper.h index 383550b33a..e59966a530 100644 --- a/core/fxge/cfx_fontmapper.h +++ b/core/fxge/cfx_fontmapper.h @@ -45,6 +45,7 @@ class CFX_FontMapper { } std::vector m_InstalledTTFonts; + std::vector> m_LocalizedTTFonts; private: static const size_t MM_FACE_COUNT = 2; diff --git a/core/fxge/ge/cfx_fontmapper.cpp b/core/fxge/ge/cfx_fontmapper.cpp index 86dc2389d6..b388545751 100644 --- a/core/fxge/ge/cfx_fontmapper.cpp +++ b/core/fxge/ge/cfx_fontmapper.cpp @@ -347,10 +347,8 @@ void CFX_FontMapper::AddInstalledFont(const CFX_ByteString& name, int charset) { } CFX_ByteString new_name = GetPSNameFromTT(hFont); - if (!new_name.IsEmpty()) { - new_name.Insert(0, ' '); - m_InstalledTTFonts.push_back(new_name); - } + if (!new_name.IsEmpty()) + m_LocalizedTTFonts.push_back(std::make_pair(new_name, name)); m_pFontInfo->DeleteFont(hFont); } m_InstalledTTFonts.push_back(name); @@ -372,14 +370,15 @@ CFX_ByteString CFX_FontMapper::MatchInstalledFonts( for (i = pdfium::CollectionSize(m_InstalledTTFonts) - 1; i >= 0; i--) { CFX_ByteString norm1 = TT_NormalizeName(m_InstalledTTFonts[i].c_str()); if (norm1 == norm_name) - break; + return m_InstalledTTFonts[i]; } - if (i < 0) - return CFX_ByteString(); - CFX_ByteString match = m_InstalledTTFonts[i]; - if (match[0] == ' ') - match = m_InstalledTTFonts[i + 1]; - return match; + for (i = pdfium::CollectionSize(m_LocalizedTTFonts) - 1; i >= 0; i--) { + CFX_ByteString norm1 = + TT_NormalizeName(m_LocalizedTTFonts[i].first.c_str()); + if (norm1 == norm_name) + return m_LocalizedTTFonts[i].second; + } + return CFX_ByteString(); } FXFT_Face CFX_FontMapper::UseInternalSubst(CFX_SubstFont* pSubstFont, diff --git a/core/fxge/win32/fx_win32_device.cpp b/core/fxge/win32/fx_win32_device.cpp index bc6817da63..0ef7829549 100644 --- a/core/fxge/win32/fx_win32_device.cpp +++ b/core/fxge/win32/fx_win32_device.cpp @@ -471,13 +471,13 @@ CFX_ByteString CFX_Win32FontInfo::FindFont(const CFX_ByteString& name) { for (size_t i = 0; i < m_pMapper->m_InstalledTTFonts.size(); ++i) { CFX_ByteString thisname = m_pMapper->m_InstalledTTFonts[i]; - if (thisname[0] == ' ') { - if (thisname.Mid(1, name.GetLength()) == name) { - return m_pMapper->m_InstalledTTFonts[i + 1]; - } - } else if (thisname.Left(name.GetLength()) == name) { + if (thisname.Left(name.GetLength()) == name) return m_pMapper->m_InstalledTTFonts[i]; - } + } + for (size_t i = 0; i < m_pMapper->m_LocalizedTTFonts.size(); ++i) { + CFX_ByteString thisname = m_pMapper->m_LocalizedTTFonts[i].first; + if (thisname.Left(name.GetLength()) == name) + return m_pMapper->m_LocalizedTTFonts[i].second; } return CFX_ByteString(); } diff --git a/fpdfsdk/cfx_systemhandler.cpp b/fpdfsdk/cfx_systemhandler.cpp index bfa80df126..72cb9f57ed 100644 --- a/fpdfsdk/cfx_systemhandler.cpp +++ b/fpdfsdk/cfx_systemhandler.cpp @@ -106,6 +106,10 @@ bool CFX_SystemHandler::FindNativeTrueTypeFont(CFX_ByteString sFontFaceName) { if (font.Compare(sFontFaceName.AsStringC())) return true; } + for (const auto& fontPair : pFontMapper->m_LocalizedTTFonts) { + if (fontPair.first.Compare(sFontFaceName.AsStringC())) + return true; + } return false; } -- cgit v1.2.3