// Copyright 2014 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

#ifndef XFA_FXFA_INCLUDE_XFA_FONTMGR_H_
#define XFA_FXFA_INCLUDE_XFA_FONTMGR_H_

#include <map>

#include "core/fxcrt/include/fx_ext.h"
#include "core/fxcrt/include/fx_system.h"
#include "xfa/fgas/font/fgas_font.h"
#include "xfa/fxfa/include/fxfa.h"

class CPDF_Font;

struct XFA_FONTINFO {
  uint32_t dwFontNameHash;
  const FX_WCHAR* pPsName;
  const FX_WCHAR* pReplaceFont;
  uint16_t dwStyles;
  uint16_t wCodePage;
};

class CXFA_DefFontMgr {
 public:
  CXFA_DefFontMgr() {}
  ~CXFA_DefFontMgr();

  IFX_Font* GetFont(CXFA_FFDoc* hDoc,
                    const CFX_WideStringC& wsFontFamily,
                    uint32_t dwFontStyles,
                    uint16_t wCodePage = 0xFFFF);
  IFX_Font* GetDefaultFont(CXFA_FFDoc* hDoc,
                           const CFX_WideStringC& wsFontFamily,
                           uint32_t dwFontStyles,
                           uint16_t wCodePage = 0xFFFF);

 protected:
  CFX_ArrayTemplate<IFX_Font*> m_CacheFonts;
};

class CXFA_PDFFontMgr {
 public:
  CXFA_PDFFontMgr(CXFA_FFDoc* pDoc);
  ~CXFA_PDFFontMgr();

  IFX_Font* GetFont(const CFX_WideStringC& wsFontFamily,
                    uint32_t dwFontStyles,
                    CPDF_Font** pPDFFont,
                    FX_BOOL bStrictMatch = TRUE);
  FX_BOOL GetCharWidth(IFX_Font* pFont,
                       FX_WCHAR wUnicode,
                       int32_t& iWidth,
                       FX_BOOL bCharCode);
  CFX_MapPtrToPtr m_FDE2PDFFont;

 protected:
  IFX_Font* FindFont(CFX_ByteString strFamilyName,
                     FX_BOOL bBold,
                     FX_BOOL bItalic,
                     CPDF_Font** pPDFFont,
                     FX_BOOL bStrictMatch = TRUE);
  CFX_ByteString PsNameToFontName(const CFX_ByteString& strPsName,
                                  FX_BOOL bBold,
                                  FX_BOOL bItalic);
  FX_BOOL PsNameMatchDRFontName(const CFX_ByteStringC& bsPsName,
                                FX_BOOL bBold,
                                FX_BOOL bItalic,
                                const CFX_ByteString& bsDRFontName,
                                FX_BOOL bStrictMatch = TRUE);

  CXFA_FFDoc* m_pDoc;
  std::map<CFX_ByteString, IFX_Font*> m_FontMap;
};

class CXFA_FontMgr {
 public:
  CXFA_FontMgr();
  ~CXFA_FontMgr();
  IFX_Font* GetFont(CXFA_FFDoc* hDoc,
                    const CFX_WideStringC& wsFontFamily,
                    uint32_t dwFontStyles,
                    uint16_t wCodePage = 0xFFFF);
  void LoadDocFonts(CXFA_FFDoc* hDoc);
  void ReleaseDocFonts(CXFA_FFDoc* hDoc);

  void SetDefFontMgr(CXFA_DefFontMgr* pFontMgr);

 protected:
  void DelAllMgrMap();

  CFX_MapPtrToPtr m_PDFFontMgrArray;
  CXFA_DefFontMgr* m_pDefFontMgr;
  std::map<CFX_ByteString, IFX_Font*> m_FontMap;
};

#endif  //  XFA_FXFA_INCLUDE_XFA_FONTMGR_H_
