| // 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; | |
| } |