// 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 "../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_
