// 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(
    const WideString& wsFontFamily,
    uint32_t dwFontStyles,
    FX_CodePage 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(const WideString& wsFontFamily,
                                       uint32_t dwFontStyles,
                                       FX_CodePage wCodePage) {
  return m_wsFamily == wsFontFamily && m_dwStyles == dwFontStyles &&
         m_dwCodePage == wCodePage;
}

bool CFWL_FontManager::FontData::LoadFont(const WideString& wsFontFamily,
                                          uint32_t dwFontStyles,
                                          FX_CodePage dwCodePage) {
  m_wsFamily = wsFontFamily;
  m_dwStyles = dwFontStyles;
  m_dwCodePage = dwCodePage;

  m_pFont = CFGAS_GEFont::LoadFont(wsFontFamily, dwFontStyles, dwCodePage);
  return !!m_pFont;
}

RetainPtr<CFGAS_GEFont> CFWL_FontManager::FontData::GetFont() const {
  return m_pFont;
}
