// 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 _FX_GDIOBJECT_IMP | |
#define _FX_GDIOBJECT_IMP | |
#ifdef _FXPLUS | |
#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN32_MOBILE_ || \ | |
_FX_OS_ == _FX_WIN64_ | |
typedef struct _FX_GDIGOCACHE { | |
GLYPHMETRICS gm; | |
uint8_t* pOutline; | |
} FX_GDIGOCACHE, *FX_LPGDIGOCACHE; | |
typedef FX_GDIGOCACHE const* FX_LPCGDIGOCACHE; | |
class CFX_GdiFontCache { | |
public: | |
CFX_GdiFontCache(); | |
~CFX_GdiFontCache(); | |
void SetCachedGlyphOutline(FX_DWORD dwGlyph, | |
const GLYPHMETRICS& gm, | |
uint8_t* pOutline); | |
FX_LPCGDIGOCACHE GetCachedGlyphOutline(FX_DWORD dwGlyph) const; | |
protected: | |
CFX_MapPtrToPtr m_GlyphMap; | |
}; | |
class CFX_GdiFont : public IFX_Font, public CFX_ThreadLock { | |
public: | |
CFX_GdiFont(IFX_FontMgr* pFontMgr); | |
~CFX_GdiFont(); | |
virtual void Release(); | |
virtual IFX_Font* Retain(); | |
FX_BOOL LoadFont(const FX_WCHAR* pszFontFamily, | |
FX_DWORD dwFontStyles, | |
FX_WORD wCodePage); | |
FX_BOOL LoadFont(const uint8_t* pBuffer, int32_t iLength); | |
FX_BOOL LoadFont(const FX_WCHAR* pszFileName); | |
FX_BOOL LoadFont(IFX_Stream* pFontStream); | |
FX_BOOL LoadFont(const LOGFONTW& lf); | |
virtual IFX_Font* Derive(FX_DWORD dwFontStyles, FX_WORD wCodePage = 0) { | |
return NULL; | |
} | |
virtual void GetFamilyName(CFX_WideString& wsFamily) const; | |
virtual FX_DWORD GetFontStyles() const { return m_dwStyles; } | |
virtual uint8_t GetCharSet() const { return m_LogFont.lfCharSet; } | |
virtual FX_BOOL GetCharWidth(FX_WCHAR wUnicode, | |
int32_t& iWidth, | |
FX_BOOL bCharCode = FALSE); | |
virtual int32_t GetGlyphIndex(FX_WCHAR wUnicode, FX_BOOL bCharCode = FALSE); | |
virtual int32_t GetAscent() const; | |
virtual int32_t GetDescent() const; | |
virtual FX_BOOL GetCharBBox(FX_WCHAR wUnicode, | |
CFX_Rect& bbox, | |
FX_BOOL bCharCode = FALSE); | |
virtual FX_BOOL GetBBox(CFX_Rect& bbox); | |
virtual int32_t GetItalicAngle() const; | |
virtual void Reset(); | |
FX_DWORD GetGlyphDIBits(int32_t iGlyphIndex, | |
FX_ARGB argb, | |
const MAT2* pMatrix, | |
GLYPHMETRICS& gm, | |
void* pBuffer, | |
FX_DWORD bufSize); | |
FX_DWORD GetHashCode() const; | |
protected: | |
IFX_FontMgr* m_pFontMgr; | |
int32_t m_iRefCount; | |
CFX_WordDiscreteArray m_WidthCache; | |
OUTLINETEXTMETRICW m_OutlineTM; | |
HGDIOBJ m_hOldFont; | |
HFONT m_hFont; | |
HDC m_hDC; | |
LOGFONTW m_LogFont; | |
CFX_WideString m_wsFontFileName; | |
CFX_WideStringArray m_FontFamilies; | |
HANDLE m_hRes; | |
FX_DWORD m_dwStyles; | |
CFX_PtrArray m_SubstFonts; | |
CFX_MapPtrToPtr m_FontMapper; | |
CFX_MapPtrToPtr m_FontCache; | |
void ClearCache(); | |
int32_t GetFontFamilies(Gdiplus::FontCollection& fc); | |
void RetrieveFontStyles(); | |
IFX_Font* GetSubstFont(int32_t iGlyphIndex) const; | |
FX_BOOL GetCharWidth(FX_WCHAR wUnicode, | |
int32_t& iWidth, | |
FX_BOOL bRecursive, | |
FX_BOOL bCharCode = FALSE); | |
int32_t GetGlyphIndex(FX_WCHAR wUnicode, | |
FX_BOOL bRecursive, | |
IFX_Font** ppFont, | |
FX_BOOL bCharCode = FALSE); | |
FX_DWORD GetMAT2HashCode(const FIXED* pFixed); | |
void CreateGlyphBitmap(int32_t iWidth, | |
int32_t iHeight, | |
uint8_t* pOutline, | |
FX_DWORD* pDIB, | |
FX_ARGB argb); | |
friend class CFX_GdiFontMgr; | |
}; | |
#endif | |
#endif | |
#endif |