// 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_PDFWINDOW_PWL_FONTMAP_H_
#define FPDFSDK_INCLUDE_PDFWINDOW_PWL_FONTMAP_H_

#include "fpdfsdk/include/fxedit/fx_edit.h"
#include "public/fpdf_sysfontinfo.h"

class CPDF_Document;
class IFX_SystemHandler;

struct CPWL_FontMap_Data {
  CPDF_Font* pFont;
  int32_t nCharset;
  CFX_ByteString sFontName;
};

struct CPWL_FontMap_Native {
  int32_t nCharset;
  CFX_ByteString sFontName;
};

#ifndef ANSI_CHARSET

#define ANSI_CHARSET 0
#define DEFAULT_CHARSET 1
#define SYMBOL_CHARSET 2
#define SHIFTJIS_CHARSET 128
#define HANGEUL_CHARSET 129
#define HANGUL_CHARSET 129
#define GB2312_CHARSET 134
#define CHINESEBIG5_CHARSET 136
#define OEM_CHARSET 255
#define JOHAB_CHARSET 130
#define HEBREW_CHARSET 177
#define ARABIC_CHARSET 178
#define GREEK_CHARSET 161
#define TURKISH_CHARSET 162
#define VIETNAMESE_CHARSET 163
#define THAI_CHARSET 222
#define EASTEUROPE_CHARSET 238
#define RUSSIAN_CHARSET 204
#define BALTIC_CHARSET 186

#endif

class CPWL_FontMap : public IFX_Edit_FontMap {
 public:
  CPWL_FontMap(IFX_SystemHandler* pSystemHandler);
  ~CPWL_FontMap() override;

  // IFX_Edit_FontMap
  CPDF_Font* GetPDFFont(int32_t nFontIndex) override;
  CFX_ByteString GetPDFFontAlias(int32_t nFontIndex) override;
  int32_t GetWordFontIndex(FX_WORD word,
                           int32_t nCharset,
                           int32_t nFontIndex) override;
  int32_t CharCodeFromUnicode(int32_t nFontIndex, FX_WORD word) override;
  int32_t CharSetFromUnicode(FX_WORD word, int32_t nOldCharset) override;

  void SetSystemHandler(IFX_SystemHandler* pSystemHandler);
  int32_t GetFontMapCount() const;
  const CPWL_FontMap_Data* GetFontMapData(int32_t nIndex) const;
  static int32_t GetNativeCharset();
  CFX_ByteString GetNativeFontName(int32_t nCharset);

  static CFX_ByteString GetDefaultFontByCharset(int32_t nCharset);

  CPDF_Font* AddFontToDocument(CPDF_Document* pDoc,
                               CFX_ByteString& sFontName,
                               uint8_t nCharset);
  static FX_BOOL IsStandardFont(const CFX_ByteString& sFontName);
  CPDF_Font* AddStandardFont(CPDF_Document* pDoc, CFX_ByteString& sFontName);
  CPDF_Font* AddSystemFont(CPDF_Document* pDoc,
                           CFX_ByteString& sFontName,
                           uint8_t nCharset);

 protected:
  void Initial(const FX_CHAR* fontname = NULL);
  CPDF_Document* GetDocument();
  CPDF_Font* FindFontSameCharset(CFX_ByteString& sFontAlias, int32_t nCharset);
  void AddedFont(CPDF_Font* pFont, const CFX_ByteString& sFontAlias);

  FX_BOOL KnowWord(int32_t nFontIndex, FX_WORD word);

  void Empty();
  int32_t GetFontIndex(const CFX_ByteString& sFontName,
                       int32_t nCharset,
                       FX_BOOL bFind);
  int32_t GetPWLFontIndex(FX_WORD word, int32_t nCharset);
  int32_t AddFontData(CPDF_Font* pFont,
                      const CFX_ByteString& sFontAlias,
                      int32_t nCharset = DEFAULT_CHARSET);

  CFX_ByteString EncodeFontAlias(const CFX_ByteString& sFontName,
                                 int32_t nCharset);
  CFX_ByteString EncodeFontAlias(const CFX_ByteString& sFontName);

 private:
  CFX_ByteString GetFontName(int32_t nFontIndex);
  int32_t FindFont(const CFX_ByteString& sFontName,
                   int32_t nCharset = DEFAULT_CHARSET);

  CFX_ByteString GetNativeFont(int32_t nCharset);

 public:
  using CharsetFontMap = FPDF_CharsetFontMap;
  static const CharsetFontMap defaultTTFMap[];

 protected:
  CFX_ArrayTemplate<CPWL_FontMap_Data*> m_aData;
  CFX_ArrayTemplate<CPWL_FontMap_Native*> m_aNativeFont;

 private:
  CPDF_Document* m_pPDFDoc;
  IFX_SystemHandler* m_pSystemHandler;
};

class CPWL_DocFontMap : public CPWL_FontMap {
 public:
  CPWL_DocFontMap(IFX_SystemHandler* pSystemHandler,
                  CPDF_Document* pAttachedDoc);
  ~CPWL_DocFontMap() override;

  virtual CPDF_Document* GetDocument();

 private:
  CPDF_Document* m_pAttachedDoc;
};

#endif  // FPDFSDK_INCLUDE_PDFWINDOW_PWL_FONTMAP_H_
