// 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_SKIAFONT_H_
#define CORE_SRC_FXGE_ANDROID_FPF_SKIAFONT_H_

#if _FX_OS_ == _FX_ANDROID_
class CFPF_SkiaFontDescriptor;
class CFPF_SkiaFontMgr;
class SkTypeface;
class CFPF_SkiaFont : public IFPF_Font
{
public:
    CFPF_SkiaFont();
    virtual ~CFPF_SkiaFont();
    virtual void			Release();
    virtual IFPF_Font*		Retain();

    virtual FPF_HFONT		GetHandle();

    virtual CFX_ByteString	GetFamilyName();
    virtual CFX_WideString	GetPsName();

    virtual FX_DWORD		GetFontStyle() const
    {
        return m_dwStyle;
    }
    virtual uint8_t			GetCharset() const
    {
        return m_uCharset;
    }

    virtual int32_t		GetGlyphIndex(FX_WCHAR wUnicode);
    virtual int32_t		GetGlyphWidth(int32_t iGlyphIndex);

    virtual int32_t		GetAscent() const;
    virtual int32_t		GetDescent() const;

    virtual bool			GetGlyphBBox(int32_t iGlyphIndex, FX_RECT &rtBBox);
    virtual bool			GetBBox(FX_RECT &rtBBox);

    virtual int32_t		GetHeight() const;
    virtual int32_t		GetItalicAngle() const;
    virtual FX_DWORD		GetFontData(FX_DWORD dwTable, uint8_t* pBuffer, FX_DWORD dwSize);
    bool					InitFont(CFPF_SkiaFontMgr *pFontMgr, CFPF_SkiaFontDescriptor *pFontDes, const CFX_ByteStringC& bsFamily, FX_DWORD dwStyle, uint8_t uCharset);
protected:
    CFPF_SkiaFontMgr		*m_pFontMgr;
    CFPF_SkiaFontDescriptor	*m_pFontDes;
    FXFT_Face				m_Face;
    FX_DWORD				m_dwStyle;
    uint8_t					m_uCharset;
    FX_DWORD				m_dwRefCount;
};
#endif

#endif  // CORE_SRC_FXGE_ANDROID_FPF_SKIAFONT_H_
