mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-07-14 01:43:39 +08:00
216 lines
4.9 KiB
C++
216 lines
4.9 KiB
C++
#ifndef _FT_FONT_H
|
|
#define _FT_FONT_H
|
|
|
|
#include "Font.h"
|
|
#include "GlyphBitmap.h"
|
|
|
|
class CFreeTypeFontFile;
|
|
class CPath;
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
struct TFontCacheSizes
|
|
{
|
|
unsigned short ushUnicode; // Çíà÷åíèå ñèìâîëà â þíèêîäå
|
|
EGlyphState eState; // Åñòü ëè ñèìâîë â øðèôòå/ñòàíäàðòíîì øðèôòå
|
|
int nCMapIndex; // Íîìåð òàáëèöû 'cmap', â êîòîðîé áûë íàéäåí äàííûé ñèìâîë
|
|
|
|
unsigned short ushGID;
|
|
|
|
float fAdvanceX;
|
|
|
|
struct TBBox
|
|
{
|
|
float fMinX;
|
|
float fMaxX;
|
|
float fMinY;
|
|
float fMaxY;
|
|
} oBBox;
|
|
|
|
struct TMetrics
|
|
{
|
|
float fWidth;
|
|
float fHeight;
|
|
|
|
float fHoriBearingX;
|
|
float fHoriBearingY;
|
|
float fHoriAdvance;
|
|
|
|
float fVertBearingX;
|
|
float fVertBearingY;
|
|
float fVertAdvance;
|
|
} oMetrics;
|
|
|
|
bool bBitmap;
|
|
TGlyphBitmap oBitmap;
|
|
};
|
|
|
|
#define FONT_CASHE_SIZES_SIZE 255
|
|
#define FONT_CACHE_SIZES_INDEXES_SIZE 65536
|
|
#define FONT_CACHE_SIZES_INDEXES_SIZE_2 131072 // 65536 * sizeof(unsigned short)
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------------------
|
|
// CFreeTypeFont
|
|
//-------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
class CFreeTypeFont: public CFont
|
|
{
|
|
public:
|
|
|
|
CFreeTypeFont(CFreeTypeFontFile *pFontFile);
|
|
|
|
virtual ~CFreeTypeFont();
|
|
|
|
virtual BOOL GetGlyph(int nCode, int nFracX, int nFracY, TGlyphBitmap *pBitmap);
|
|
|
|
virtual BOOL MakeGlyph(int nCode, int nFracX, int nFracY, TGlyphBitmap *pBitmap);
|
|
|
|
virtual BOOL GetString(CGlyphString *pString);
|
|
|
|
virtual BOOL GetString2(CGlyphString *pString);
|
|
|
|
virtual CFontPath *GetGlyphPath(int nCode);
|
|
|
|
virtual short GetAscender();
|
|
|
|
virtual short GetDescender();
|
|
|
|
virtual unsigned short GetUnitsPerEm();
|
|
|
|
virtual short GetLineSpacing();
|
|
|
|
virtual char * GetFamilyName();
|
|
|
|
virtual long GetFacesCount();
|
|
|
|
virtual long GetFaceIndex();
|
|
|
|
virtual long GetGlyphsCount();
|
|
|
|
virtual char *GetStyleName();
|
|
|
|
virtual short GetUnderlinePosition();
|
|
|
|
virtual short GetUnderlineThickness();
|
|
|
|
virtual short GetMaxAdvanceWidth();
|
|
|
|
virtual short GetMaxAdvanceHeight();
|
|
|
|
virtual void GetBBox(long *plMinX, long *plMinY, long *plMaxX, long *plMaxY);
|
|
|
|
virtual bool IsCharAvailable(long lUnicode);
|
|
|
|
virtual void SetSizeAndDpi(float fSize, unsigned int unHorDpi, unsigned int unVerDpi);
|
|
|
|
virtual const char *GetFontFormat();
|
|
|
|
virtual int IsUnicodeRangeAvailable(unsigned long ulBit, unsigned int un4ByteIndex);
|
|
|
|
virtual unsigned long GetCodeByGID(unsigned short ushGID);
|
|
|
|
virtual void GetPanose(char **ppPanose);
|
|
|
|
virtual bool IsFixedWidth();
|
|
|
|
virtual unsigned short GetNameIndex(char *sName);
|
|
|
|
virtual void SetStringGID(BOOL bGID);
|
|
|
|
virtual BOOL GetStringGID();
|
|
|
|
virtual void ResetFontMatrix();
|
|
|
|
virtual void ResetTextMatrix();
|
|
|
|
virtual void ApplyTransform(float fA, float fB, float fC, float fD, float fE, float fF);
|
|
|
|
virtual void SetFontMatrix(float fA, float fB, float fC, float fD, float fE, float fF);
|
|
|
|
virtual void SetTextMatrix(float fA, float fB, float fC, float fD, float fE, float fF);
|
|
|
|
int GetSymbolic()
|
|
{
|
|
return m_nSymbolic;
|
|
}
|
|
|
|
private:
|
|
|
|
int SetCMapForCharCode(long lUnicode, int *pnCMapIndex);
|
|
int SetCMapForCharCode2(long lUnicode);
|
|
inline void UpdateMatrix0();
|
|
inline void UpdateMatrix1();
|
|
inline void UpdateMatrix2();
|
|
void InitSizesCache();
|
|
void ClearSizesCache();
|
|
void AddToSizesCache(TFontCacheSizes oSizes);
|
|
__forceinline int FindInSizesCache(int nCode);
|
|
int GetDefaultChar();
|
|
int GetSymbolicCmapIndex();
|
|
|
|
private:
|
|
|
|
FT_Size m_pSize;
|
|
FT_Matrix m_oFontMatrix;
|
|
FT_Matrix m_oTextMatrix;
|
|
double m_dTextScale;
|
|
double m_dUnitsKoef;
|
|
BOOL m_bStringGID;
|
|
int m_nDefaultChar; // -1 - íå èñïîëüçóåòñÿ, > 0 - íîìåð GID
|
|
int m_nSymbolic; // íîìåð òàáëèöû cmap = Åñëè ó ÷èñëà ulCodePageRange óñòàíîâëåí 31 áèò, è òàáëèöà cmap ïîääåðæèâàåò òèï (3 0 (Symbol)); -1 = åñëè íåò
|
|
|
|
class CFontCascheSizes
|
|
{
|
|
|
|
public:
|
|
CFontCascheSizes()
|
|
{
|
|
|
|
}
|
|
~CFontCascheSizes()
|
|
{
|
|
}
|
|
void Init()
|
|
{
|
|
m_arrSizes.RemoveAll();
|
|
}
|
|
void Clear()
|
|
{
|
|
for ( int nIndex = 0; nIndex < m_arrSizes.GetSize(); nIndex++ )
|
|
{
|
|
unsigned char *pData = m_arrSizes.GetData()[nIndex].oBitmap.pData;
|
|
if ( NULL != pData )
|
|
{
|
|
free( pData );
|
|
pData = NULL;
|
|
}
|
|
}
|
|
|
|
m_arrSizes.RemoveAll();
|
|
}
|
|
|
|
int Add(TFontCacheSizes oSizes)
|
|
{
|
|
m_arrSizes.Add( oSizes );
|
|
return m_arrSizes.GetSize() - 1;
|
|
}
|
|
|
|
TFontCacheSizes Get(int nIndex)
|
|
{
|
|
return m_arrSizes.GetData()[nIndex];
|
|
}
|
|
|
|
|
|
private:
|
|
|
|
CSimpleArray<TFontCacheSizes> m_arrSizes;
|
|
} m_oCacheSizes;
|
|
|
|
unsigned short m_arrCacheSizesIndexs[FONT_CACHE_SIZES_INDEXES_SIZE];
|
|
|
|
|
|
friend class CFreeTypeFont;
|
|
};
|
|
|
|
#endif /* _FT_FONT_H */
|