// 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_FONTMGR_H_
#define XFA_FONTMGR_H_

#include <map>

struct XFA_FONTINFO {
  FX_DWORD dwFontNameHash;
  const FX_WCHAR* pPsName;
  const FX_WCHAR* pReplaceFont;
  FX_WORD dwStyles;
  FX_WORD wCodePage;
};

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

  // IXFA_FontMgr:
  IFX_Font* GetFont(IXFA_Doc* hDoc,
                    const CFX_WideStringC& wsFontFamily,
                    FX_DWORD dwFontStyles,
                    FX_WORD wCodePage = 0xFFFF) override;
  IFX_Font* GetDefaultFont(IXFA_Doc* hDoc,
                           const CFX_WideStringC& wsFontFamily,
                           FX_DWORD dwFontStyles,
                           FX_WORD wCodePage = 0xFFFF) override;

 protected:
  CFX_PtrArray m_CacheFonts;
};

class CXFA_PDFFontMgr : public IFX_FontProvider {
 public:
  CXFA_PDFFontMgr(CXFA_FFDoc* pDoc);
  ~CXFA_PDFFontMgr();
  IFX_Font* GetFont(const CFX_WideStringC& wsFontFamily,
                    FX_DWORD 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(IXFA_Doc* hDoc,
                    const CFX_WideStringC& wsFontFamily,
                    FX_DWORD dwFontStyles,
                    FX_WORD wCodePage = 0xFFFF);
  void LoadDocFonts(IXFA_Doc* hDoc);
  void ReleaseDocFonts(IXFA_Doc* hDoc);

  void SetDefFontMgr(IXFA_FontMgr* pFontMgr);

 protected:
  void DelAllMgrMap();

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

#endif  //  XFA_FONTMGR_H_
