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

#if _FX_OS_ == _FX_ANDROID_

#include <map>

#include "core/include/fxge/fpf.h"

#define FPF_SKIAFONTTYPE_Unknown 0
#define FPF_SKIAFONTTYPE_Path 1
#define FPF_SKIAFONTTYPE_File 2
#define FPF_SKIAFONTTYPE_Buffer 3

class CFPF_SkiaFont;

class CFPF_SkiaFontDescriptor {
 public:
  CFPF_SkiaFontDescriptor()
      : m_pFamily(NULL),
        m_dwStyle(0),
        m_iFaceIndex(0),
        m_dwCharsets(0),
        m_iGlyphNum(0) {}
  virtual ~CFPF_SkiaFontDescriptor() { FX_Free(m_pFamily); }

  virtual int32_t GetType() const { return FPF_SKIAFONTTYPE_Unknown; }

  void SetFamily(const FX_CHAR* pFamily) {
    FX_Free(m_pFamily);
    int32_t iSize = FXSYS_strlen(pFamily);
    m_pFamily = FX_Alloc(FX_CHAR, iSize + 1);
    FXSYS_memcpy(m_pFamily, pFamily, iSize * sizeof(FX_CHAR));
    m_pFamily[iSize] = 0;
  }
  FX_CHAR* m_pFamily;
  FX_DWORD m_dwStyle;
  int32_t m_iFaceIndex;
  FX_DWORD m_dwCharsets;
  int32_t m_iGlyphNum;
};

class CFPF_SkiaPathFont : public CFPF_SkiaFontDescriptor {
 public:
  CFPF_SkiaPathFont() : m_pPath(NULL) {}
  ~CFPF_SkiaPathFont() override { FX_Free(m_pPath); }

  // CFPF_SkiaFontDescriptor
  int32_t GetType() const override { return FPF_SKIAFONTTYPE_Path; }

  void SetPath(const FX_CHAR* pPath) {
    FX_Free(m_pPath);
    int32_t iSize = FXSYS_strlen(pPath);
    m_pPath = FX_Alloc(FX_CHAR, iSize + 1);
    FXSYS_memcpy(m_pPath, pPath, iSize * sizeof(FX_CHAR));
    m_pPath[iSize] = 0;
  }
  FX_CHAR* m_pPath;
};

class CFPF_SkiaFileFont : public CFPF_SkiaFontDescriptor {
 public:
  CFPF_SkiaFileFont() : m_pFile(NULL) {}

  // CFPF_SkiaFontDescriptor
  int32_t GetType() const override { return FPF_SKIAFONTTYPE_File; }
  IFX_FileRead* m_pFile;
};

class CFPF_SkiaBufferFont : public CFPF_SkiaFontDescriptor {
 public:
  CFPF_SkiaBufferFont() : m_pBuffer(NULL), m_szBuffer(0) {}

  // CFPF_SkiaFontDescriptor
  int32_t GetType() const override { return FPF_SKIAFONTTYPE_Buffer; }

  void* m_pBuffer;
  size_t m_szBuffer;
};

class CFPF_SkiaFontMgr : public IFPF_FontMgr {
 public:
  CFPF_SkiaFontMgr();
  ~CFPF_SkiaFontMgr() override;

  // IFPF_FontMgr
  void LoadSystemFonts() override;
  void LoadPrivateFont(IFX_FileRead* pFontFile) override;
  void LoadPrivateFont(const CFX_ByteStringC& bsFileName) override;
  void LoadPrivateFont(void* pBuffer, size_t szBuffer) override;
  IFPF_Font* CreateFont(const CFX_ByteStringC& bsFamilyname,
                        uint8_t uCharset,
                        FX_DWORD dwStyle,
                        FX_DWORD dwMatch = 0) override;

  FX_BOOL InitFTLibrary();
  FXFT_Face GetFontFace(IFX_FileRead* pFileRead, int32_t iFaceIndex = 0);
  FXFT_Face GetFontFace(const CFX_ByteStringC& bsFile, int32_t iFaceIndex = 0);
  FXFT_Face GetFontFace(const uint8_t* pBuffer,
                        size_t szBuffer,
                        int32_t iFaceIndex = 0);

 protected:
  void ScanPath(const CFX_ByteStringC& path);
  void ScanFile(const CFX_ByteStringC& file);
  void ReportFace(FXFT_Face face, CFPF_SkiaFontDescriptor* pFontDesc);
  void OutputSystemFonts();
  FX_BOOL m_bLoaded;
  CFX_PtrArray m_FontFaces;
  FXFT_Library m_FTLibrary;
  std::map<FX_DWORD, CFPF_SkiaFont*> m_FamilyFonts;
};

#endif

#endif  // CORE_SRC_FXGE_ANDROID_FPF_SKIAFONTMGR_H_
