// 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 FPDFSDK_INCLUDE_FORMFILLER_FFL_CBA_FONTMAP_H_
#define FPDFSDK_INCLUDE_FORMFILLER_FFL_CBA_FONTMAP_H_

#include "fpdfsdk/include/pdfwindow/PWL_FontMap.h"

class CPDF_Dictionary;
class CPDFSDK_Annot;

class CBA_FontMap : public CPWL_FontMap {
 public:
  CBA_FontMap(CPDFSDK_Annot* pAnnot, IFX_SystemHandler* pSystemHandler);
  CBA_FontMap(CPDF_Document* pDocument,
              CPDF_Dictionary* pAnnotDict,
              IFX_SystemHandler* pSystemHandler);

  ~CBA_FontMap() override;

  virtual void Initial(const FX_CHAR* fontname = NULL);

 public:
  void SetDefaultFont(CPDF_Font* pFont, const CFX_ByteString& sFontName);

  void Reset();
  void SetAPType(const CFX_ByteString& sAPType);

 protected:
  virtual CPDF_Font* FindFontSameCharset(CFX_ByteString& sFontAlias,
                                         int32_t nCharset);
  virtual void AddedFont(CPDF_Font* pFont, const CFX_ByteString& sFontAlias);
  virtual CPDF_Document* GetDocument();

 private:
  CPDF_Font* FindResFontSameCharset(CPDF_Dictionary* pResDict,
                                    CFX_ByteString& sFontAlias,
                                    int32_t nCharset);
  CPDF_Font* GetAnnotDefaultFont(CFX_ByteString& csNameTag);
  void AddFontToAnnotDict(CPDF_Font* pFont, const CFX_ByteString& sAlias);

 private:
  CPDF_Document* m_pDocument;
  CPDF_Dictionary* m_pAnnotDict;
  CPDF_Font* m_pDefaultFont;
  CFX_ByteString m_sDefaultFontName;

  CFX_ByteString m_sAPType;
};

#endif  // FPDFSDK_INCLUDE_FORMFILLER_FFL_CBA_FONTMAP_H_
