| // Copyright 2020 PDFium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 
 |  | 
 | #include "xfa/fwl/theme/cfwl_fontmanager.h" | 
 |  | 
 | #include <utility> | 
 |  | 
 | #include "xfa/fgas/font/cfgas_gefont.h" | 
 |  | 
 | namespace { | 
 |  | 
 | CFWL_FontManager* g_FontManager = nullptr; | 
 |  | 
 | }  // namespace | 
 |  | 
 | // static | 
 | CFWL_FontManager* CFWL_FontManager::GetInstance() { | 
 |   if (!g_FontManager) | 
 |     g_FontManager = new CFWL_FontManager; | 
 |   return g_FontManager; | 
 | } | 
 |  | 
 | // static | 
 | void CFWL_FontManager::DestroyInstance() { | 
 |   delete g_FontManager; | 
 |   g_FontManager = nullptr; | 
 | } | 
 |  | 
 | CFWL_FontManager::CFWL_FontManager() = default; | 
 |  | 
 | CFWL_FontManager::~CFWL_FontManager() = default; | 
 |  | 
 | RetainPtr<CFGAS_GEFont> CFWL_FontManager::FindFont(WideStringView wsFontFamily, | 
 |                                                    uint32_t dwFontStyles, | 
 |                                                    uint16_t wCodePage) { | 
 |   for (const auto& pData : m_FontsArray) { | 
 |     if (pData->Equal(wsFontFamily, dwFontStyles, wCodePage)) | 
 |       return pData->GetFont(); | 
 |   } | 
 |   auto pFontData = std::make_unique<FontData>(); | 
 |   if (!pFontData->LoadFont(wsFontFamily, dwFontStyles, wCodePage)) | 
 |     return nullptr; | 
 |  | 
 |   m_FontsArray.push_back(std::move(pFontData)); | 
 |   return m_FontsArray.back()->GetFont(); | 
 | } | 
 |  | 
 | CFWL_FontManager::FontData::FontData() = default; | 
 |  | 
 | CFWL_FontManager::FontData::~FontData() = default; | 
 |  | 
 | bool CFWL_FontManager::FontData::Equal(WideStringView wsFontFamily, | 
 |                                        uint32_t dwFontStyles, | 
 |                                        uint16_t wCodePage) { | 
 |   return m_wsFamily == wsFontFamily && m_dwStyles == dwFontStyles && | 
 |          m_dwCodePage == wCodePage; | 
 | } | 
 |  | 
 | bool CFWL_FontManager::FontData::LoadFont(WideStringView wsFontFamily, | 
 |                                           uint32_t dwFontStyles, | 
 |                                           uint16_t dwCodePage) { | 
 |   m_wsFamily = wsFontFamily; | 
 |   m_dwStyles = dwFontStyles; | 
 |   m_dwCodePage = dwCodePage; | 
 |  | 
 |   // TODO(tsepez): check usage of c_str() below. | 
 |   m_pFont = CFGAS_GEFont::LoadFont(wsFontFamily.unterminated_c_str(), | 
 |                                    dwFontStyles, dwCodePage); | 
 |   return !!m_pFont; | 
 | } | 
 |  | 
 | RetainPtr<CFGAS_GEFont> CFWL_FontManager::FontData::GetFont() const { | 
 |   return m_pFont; | 
 | } |