// 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_
#define FPF_SKIAFONTTYPE_Unknown	0
#define	FPF_SKIAFONTTYPE_Path		1
#define FPF_SKIAFONTTYPE_File		2
#define FPF_SKIAFONTTYPE_Buffer		3
class CFPF_SkiaFontDescriptor 
{
public:
    CFPF_SkiaFontDescriptor() : m_pFamily(NULL), m_dwStyle(0), m_iFaceIndex(0), m_dwCharsets(0), m_iGlyphNum(0) {}
    virtual ~CFPF_SkiaFontDescriptor()
    {
        if (m_pFamily) {
            FX_Free(m_pFamily);
        }
    }
    virtual	int32_t	GetType() const
    {
        return FPF_SKIAFONTTYPE_Unknown;
    }
    void				SetFamily(const FX_CHAR* pFamily)
    {
        if (m_pFamily) {
            FX_Free(m_pFamily);
        }
        int32_t iSize = FXSYS_strlen(pFamily);
        m_pFamily = FX_Alloc(FX_CHAR, iSize + 1);
        FXSYS_memcpy32(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) {}
    virtual ~CFPF_SkiaPathFont()
    {
        if (m_pPath) {
            FX_Free(m_pPath);
        }
    }
    virtual	int32_t	GetType() const
    {
        return FPF_SKIAFONTTYPE_Path;
    }
    void				SetPath(const FX_CHAR* pPath)
    {
        if (m_pPath) {
            FX_Free(m_pPath);
        }
        int32_t iSize = FXSYS_strlen(pPath);
        m_pPath = FX_Alloc(FX_CHAR, iSize + 1);
        FXSYS_memcpy32(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) {}
    virtual int32_t	GetType() const
    {
        return FPF_SKIAFONTTYPE_File;
    }
    IFX_FileRead		*m_pFile;
};
class CFPF_SkiaBufferFont : public CFPF_SkiaFontDescriptor
{
public:
    CFPF_SkiaBufferFont() : m_pBuffer(NULL), m_szBuffer(0) {}
    virtual int32_t	GetType() const
    {
        return FPF_SKIAFONTTYPE_Buffer;
    }
    void*			m_pBuffer;
    size_t				m_szBuffer;
};
class CFPF_SkiaFontMgr : public IFPF_FontMgr
{
public:
    CFPF_SkiaFontMgr();
    virtual ~CFPF_SkiaFontMgr();
    FX_BOOL					InitFTLibrary();
    virtual void			LoadSystemFonts();
    virtual void			LoadPrivateFont(IFX_FileRead* pFontFile);
    virtual void			LoadPrivateFont(const CFX_ByteStringC& bsFileName);
    virtual void			LoadPrivateFont(void* pBuffer, size_t szBuffer);

    virtual IFPF_Font*		CreateFont(const CFX_ByteStringC& bsFamilyname, uint8_t uCharset, FX_DWORD dwStyle, FX_DWORD dwMatch = 0);
    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;
    CFX_MapPtrToPtr		m_FamilyFonts;
};
#endif

#endif  // CORE_SRC_FXGE_ANDROID_FPF_SKIAFONTMGR_H_
