// 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_GE_TEXT_INT_H_
#define CORE_SRC_FXGE_GE_TEXT_INT_H_

struct _CFX_UniqueKeyGen {
    void		Generate(int count, ...);
    FX_CHAR		m_Key[128];
    int			m_KeyLen;
};
class CFX_SizeGlyphCache
{
public:
    CFX_SizeGlyphCache()
    {
        m_GlyphMap.InitHashTable(253);
    }
    ~CFX_SizeGlyphCache();
    CFX_MapPtrToPtr			m_GlyphMap;
};
class CTTFontDesc
{
public:
    CTTFontDesc()
    {
        m_Type = 0;
        m_pFontData = NULL;
        m_RefCount = 0;
    }
    ~CTTFontDesc();
    bool			ReleaseFace(FXFT_Face face);
    int				m_Type;
    union {
        struct {
            bool		m_bItalic;
            bool		m_bBold;
            FXFT_Face	m_pFace;
        } m_SingleFace;
        struct {
            FXFT_Face	m_pFaces[16];
        } m_TTCFace;
    };
    uint8_t*		m_pFontData;
    int				m_RefCount;
};
class CFX_UnicodeEncoding : public IFX_FontEncoding
{
public:
    CFX_UnicodeEncoding(CFX_Font* pFont);
    virtual FX_DWORD		GlyphFromCharCodeEx(FX_DWORD charcode, int encoding = ENCODING_UNICODE);
private:
    CFX_Font*			m_pFont;
    virtual FX_DWORD		GlyphFromCharCode(FX_DWORD charcode);
    virtual CFX_WideString	UnicodeFromCharCode(FX_DWORD charcode) const
    {
        return CFX_WideString((FX_WCHAR)charcode);
    }
    virtual FX_DWORD		CharCodeFromUnicode(FX_WCHAR Unicode) const
    {
        return Unicode;
    }
    virtual bool			IsUnicodeCompatible() const
    {
        return true;
    }
};
#define CHARSET_FLAG_ANSI		1
#define CHARSET_FLAG_SYMBOL		2
#define CHARSET_FLAG_SHIFTJIS	4
#define CHARSET_FLAG_BIG5		8
#define CHARSET_FLAG_GB			16
#define CHARSET_FLAG_KOREAN		32
class CFontFaceInfo
{
public:
    CFX_ByteString		m_FilePath;
    CFX_ByteString		m_FaceName;
    FX_DWORD			m_Styles;
    FX_DWORD			m_Charsets;
    FX_DWORD			m_FontOffset;
    FX_DWORD			m_FileSize;
    CFX_ByteString		m_FontTables;
};
class CFontFileFaceInfo
{
public:
    CFontFileFaceInfo();
    ~CFontFileFaceInfo();
    IFX_FileStream*		m_pFile;
    FXFT_Face			m_Face;
    CFX_ByteString		m_FaceName;
    FX_DWORD			m_Charsets;
    FX_DWORD			m_FileSize;
    FX_DWORD			m_FontOffset;
    int					m_Weight;
    bool				m_bItalic;
    int					m_PitchFamily;
    CFX_ByteString		m_FontTables;
};

#endif  // CORE_SRC_FXGE_GE_TEXT_INT_H_
