blob: 30ece5403f6dc388ed8f397fbd03359c40527ca5 [file] [log] [blame]
// 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;
}