// 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 _TEXT_INT_H_
#define _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();
    FX_BOOL			ReleaseFace(FXFT_Face face);
    int				m_Type;
    union {
        struct {
            FX_BOOL		m_bItalic;
            FX_BOOL		m_bBold;
            FXFT_Face	m_pFace;
        } m_SingleFace;
        struct {
            FXFT_Face	m_pFaces[16];
        } m_TTCFace;
    };
    FX_BYTE*		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 FX_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;
    FX_BOOL				m_bItalic;
    int					m_PitchFamily;
    CFX_ByteString		m_FontTables;
};

#endif  // _TEXT_INT_H_
