Files
core/ASCImageStudio3/ASCGraphics/Objects/Font/Font.h

289 lines
9.8 KiB
C++

#ifndef _FONT_H
#define _FONT_H
#include "GlyphBitmap.h"
#include "FontConsts.h"
struct TFontCacheTag;
class CFontFile;
class CFontPath;
class CGlyphString;
//-------------------------------------------------------------------------------------------------------------------------------
// CFont
//-------------------------------------------------------------------------------------------------------------------------------
class CFont
{
public:
CFont(CFontFile *pFontFile, BOOL bAntiAliasing, BOOL bUseKerning);
// Ôóíêöèþ íàäî âûçûâàòüï îñëå êîíñòðóêòîðà, ÷òîáû ó êîíñòðóêòîð ïîäêëàññà ìîã âû÷èñëèòü BBox.
void InitCache();
void ClearCache();
virtual ~CFont();
CFontFile *GetFontFile()
{
return m_pFontFile;
}
// Ïðîâåðÿåì èäåíòè÷íîñòü ïî FontFile è ìàòðèöàì.
BOOL Matches(CFontFile *pFontFile, double *pFontMatrix, double *pTextMatrix)
{
// TO DO: Èçìåíèòü ïðîâåðêó ïî FontFile
return ( pFontFile == m_pFontFile &&
pFontMatrix[0] == m_arrdFontMatrix[0] && pFontMatrix[1] == m_arrdFontMatrix[1] && pFontMatrix[2] == m_arrdFontMatrix[2] && pFontMatrix[3] == m_arrdFontMatrix[3] &&
pTextMatrix[0] == m_arrdTextMatrix[0] && pTextMatrix[1] == m_arrdTextMatrix[1] && pTextMatrix[2] == m_arrdTextMatrix[2] && pTextMatrix[3] == m_arrdTextMatrix[3] );
}
BOOL Matches(CFontFile *pFontFile)
{
return ( pFontFile == m_pFontFile );
}
// Çàáèðàåì ñèìâîë (êàê bitmap) - ñíà÷àëà ïûòàåìñÿ íàéòè åãî â êýøå, åñëè íå íàøëè ñîçäàåì íîâûé Bitmap è äîáàâëÿåì åãî â êýø.
// Âåëè÷èíû nFracX è nFracY, ïðåäñòàâëÿþò ÷èñëèòåëü íåêîòîðîãî çíà÷åíèÿ èç [0, 1), ãäå çíàìåíàòåëü ðàâåí sfontFraction = 1 << sfontFractionBits.
// Ïðîèçâîäíûå êëàññû, íå ïîääåðæèâàþùèå, ðàöèîíàëüíûå êîîäðèíàòû äîëæíû ñ÷èòàòü äàííîå çíà÷åíèå 0.
virtual BOOL GetGlyph(int nCode, int nFracX, int nFracY, TGlyphBitmap *pBitmap);
// Ñîçäàåì èç Glyph áèòìàï. Çíà÷åíèÿ nFracX è nFracY èìåþò òîò æå ñìûñë, ÷òî è â GetGlyph.
virtual BOOL MakeGlyph(int nCode, int nFracX, int nFracY, TGlyphBitmap *pBitmap) = 0;
// Ôóíêöèÿ âîçâðàùàåò ïîçèöèè ñèìâîëîâ â ñòðîêå, íà÷èíàÿ ñ òî÷êè (0;0)
virtual BOOL GetString(CGlyphString *pString) = 0;
// Ôóíêöèÿ âîçâðàùàåò ïîçèöèè ñèìâîëîâ â ñòðîêå, íà÷èíàÿ ñ òî÷êè (0;0) è ñðàçó ñ÷èòûâàåò ñàìè êàðòèíêè áóêâ
virtual BOOL GetString2(CGlyphString *pString) = 0;
// Ôóíêöèÿ âîçâðàùàåò CFontPath äëÿ äàííîãî ñèìâîëà.
virtual CFontPath *GetGlyphPath(int nCode) = 0;
// Ôóíêöèÿ óñòàíàâëèâåò çíà÷åíèå, ÿâëÿþñÿò ëè ýëåìåíòû ñòðîêè þíèêîäíûìè çíà÷åíèÿìè èëè íîìåðàìè ãëèôîâ
virtual void SetStringGID(BOOL bGID) = 0;
// Ôóíêöèÿ âîçâðàùàåò çíà÷åíèå, ÿâëÿþñÿò ëè ýëåìåíòû ñòðîêè þíèêîäíûìè çíà÷åíèÿìè èëè íîìåðàìè ãëèôîâ
virtual BOOL GetStringGID() = 0;
//----- Ãëîáàëüíûå ïàðàìåòðû øðèôòà ----------------------------------------------------
// Ôóíêöèÿ âîçâðàùàåò Ascent â åäèíèöàõ øðèôòà
virtual short GetAscender() = 0;
// Ôóíêöèÿ âîçâðàùàåò Descent â åäèíèöàõ øðèôòà
virtual short GetDescender() = 0;
// Ôóíêöèÿ âîçâðàùàåò âûñîòó áóêâû 'M' â åäèíèöàõ øðèôòà
virtual unsigned short GetUnitsPerEm() = 0;
// Ôóíêöèÿ âîçâðàùàåò ðàññòîÿíèå ìåæäó ëèíèÿìè â åäèíèöàõ øðèôòà
virtual short GetLineSpacing() = 0;
// Ôóíêöèÿ âîçâðàùàåò íàçâàíèå ñåìåéñòâà øðèôòà
virtual char * GetFamilyName() = 0;
// Ôóíêöèÿ âîâçàðàùàåò êîëè÷åñòâî øðèôòîâ, õðàíÿùèõñÿ â ôàéëå
virtual long GetFacesCount() = 0;
// Ôóíêöèÿ âîçâðàùàåò íîìåð òåêóùåãî øðèôòà â ôàéëå
virtual long GetFaceIndex() = 0;
// Ôóíêöèÿ âîçâðàùàåò êîëè÷åñòâî ãëèôîâ â ôàéëå
virtual long GetGlyphsCount() = 0;
// Ôóíêöèÿ âîçâðàùàåò ñòèëü øðèôòà â òåêñòîâîé ôîðìå ("Regular", "Bold" è ò.ä.)
virtual char *GetStyleName() = 0;
// Ôóíêöèÿ âîçâðàùàåò ïîçèöèþ ëèíèè äëÿ ïîä÷åðêèâàíèÿ (îòíîñèòåëüíî BaseLine)
virtual short GetUnderlinePosition() = 0;
// Ôóíêöèÿ âîçâðàùàåò òîëùèíó ëèíèè ïîä÷åðêèâàíèÿ
virtual short GetUnderlineThickness() = 0;
// Ôóíêöèÿ âîçâðàùàåò ìàêñèìàëüíîå ðàññòîÿíèå ïî ãîðèçîíòàëè ìåæäó íà÷àëüíûìè òî÷êàìè ðèñîâàíèÿ äâóõ ñîñåäíèõ ñèìâîëîâ
virtual short GetMaxAdvanceWidth() = 0;
// Ôóíêöèÿ âîçâðàùàåò ìàêñèìàëüíîå ðàññòîÿíèå ïî âåðòèêàëè ìåæäó íà÷àëüíûìè òî÷êàìè ðèñîâàíèÿ äâóõ ñîñåäíèõ ñèìâîëîâ
virtual short GetMaxAdvanceHeight() = 0;
// Ôóíêöèÿ âîçâðàùàåò íàèìåíüøèé ïðÿìîóãîëüíèê, â êîòîðîì ìîæíî íàðèñîâàòü ëþáóþ áóêâó èç øðèôòà
virtual void GetBBox(long *plMinX, long *plMinY, long *plMaxX, long *plMaxY) = 0;
// Ôóíêöèÿ âîçâðàùàåò íîìåð ãëèôà ïî åãî èìåíè
virtual unsigned short GetNameIndex(char *sName) = 0;
//--------------------------------------------------------------------------------------
// Ôóíêöèÿ âîçâðàùàåò true, åñëè ñèìâîë ñ þíèêîäíûì çíà÷åíèåì lUnicode ïðèñóòñòâóåò â øðèôòå(â êàêîì-íèáóäü CMap)
virtual bool IsCharAvailable(long lUnicode) = 0;
// Óñòàíàâëèâàåì Dpi
virtual void SetSizeAndDpi(float fSize, unsigned int unHorDpi, unsigned int unVerDpi) = 0;
// Ôóíêöèÿ âîçâðàùàåò òèï øðèôòà
virtual const char *GetFontFormat() = 0;
// Ôóíêöèÿ ïðîâåðÿåò ïðèñóòñòâóåò ëè äàííûå Unicode Range â øðèôòå èëè CodeRange(åñëè ïàðàìåòð un4ByteIndex ðàâåí 4 èëè 5)
virtual int IsUnicodeRangeAvailable(unsigned long ulBit, unsigned int un4ByteIndex) = 0;
// Ôóíêöèÿ âîçâðàùàåò íîìåð êîäà ïî íîìåðó ãëèôà
virtual unsigned long GetCodeByGID(unsigned short ushGID) = 0;
// Ôóíêöèÿ âîçâðàùàåò panose (â òàáëèöå OS/2)
virtual void GetPanose(char **ppPanose) = 0;
// Ôóíêöèÿ ïðîâåðÿåì ÿâëÿåòñÿ ëè äàííûé øðèôò ìîíîøèðèííûì
virtual bool IsFixedWidth() = 0;
//--------------------------------------------------------------------------------------
// Ñáðàñûâàåì ìàòðèöó ïðåîáðàçîâàíèé ê åäèíè÷íîé
virtual void ResetFontMatrix() = 0;
// Ñáðàñûâàåì ãëîáàëüíóþ ìàòðèöó
virtual void ResetTextMatrix() = 0;
// Ïðèìåíÿåì ïðåîáðàçîâàíèå (ê ìàòðèöå øðèôòà)
virtual void ApplyTransform(float fA, float fB, float fC, float fD, float fE, float fF) = 0;
// Óñòàíàâëèâàåì ìàòðèöó øðèôòà
virtual void SetFontMatrix(float fA, float fB, float fC, float fD, float fE, float fF) = 0;
// Óñòàíàâëèâàåì ãëîáàëüíóþ ìàòðèöó (îáùàÿ ìàòðèöà äëÿ âñåãî òåêñòà)
virtual void SetTextMatrix(float fA, float fB, float fC, float fD, float fE, float fF) = 0;
//--------------------------------------------------------------------------------------
// Ïîñêîëüêó íå âñåãäà øðèôò èìååòñÿ â íóæíîì ñòèëå, ïîýòîìó íóæíûå ýëåìåíòû ñòèëÿ
// äåëàåì âðó÷íóþ.
//--------------------------------------------------------------------------------------
// Óñòàíàâëèâàåì, íóæíî ëè äåëàòü øðèôò æèðíûì(àëãîðèòìè÷åñêè)
void SetBold(BOOL bBold)
{
m_bNeedDoBold = bBold;
};
// Ñ÷èòûâàåì, äåëàåòñÿ ëè øðèôò æèðíûì
BOOL GetBold()
{
return m_bNeedDoBold;
}
// Óñòàíàâëèâàåì, íóæíî ëè äåëàòü øðèôò íàêëîííûì(àëãîðèòìè÷åñêè)
void SetItalic(BOOL bItalic)
{
m_bNeedDoItalic = bItalic;
ResetFontMatrix();
}
// Ñ÷èòûâàåì, äåëàåòñÿ ëè øðèôò íàêëîííûì
BOOL GetItalic()
{
return m_bNeedDoItalic;
}
//--------------------------------------------------------------------------------------
// Óñòàíàâëèâàåì ñòàíäàðòíûé øðèôò
void SetDefaultFont(CFont *pDefFont)
{
m_pDefaultFont = pDefFont;
}
// Ôóíêöèÿ âîçâðàùàåò ñòàíäàðòíûé øðèôò
CFont *GetDefaultFont()
{
return m_pDefaultFont;
}
void SetUseDefaultFont(BOOL bUse)
{
m_bUseDefaultFont = bUse;
}
BOOL GetUseDefaultFont()
{
return m_bUseDefaultFont;
}
// Ôóíêöèÿ ôîçâðàùàåò FontMatrix
double *GetMatrix()
{
return m_arrdFontMatrix;
}
// Ôóíêöèÿ ôîçâðàùàåò BBox äëÿ Glyph.
void GetBBox(int *pnMinX, int *pnMinY, int *pnMaxX, int *pnMaxY)
{
*pnMinX = m_nMinX;
*pnMinY = m_nMinY;
*pnMaxX = m_nMaxX;
*pnMaxY = m_nMaxY;
}
// Óñòàíàâëèâàåì ìåæñèâîëüíûé èíòåðâàë
void SetCharSpacing(float fCharSpacing)
{
m_fCharSpacing = fCharSpacing;
}
// Ïîëó÷àåì ìåæñèìâîëüíûé èíòåðâàë
float GetCharSpacing()
{
return m_fCharSpacing;
}
//--------------------------------------------------------------------------------------
float GetFontSize()
{
return m_fSize;
}
unsigned int GetVerDpi()
{
return m_unVerDpi;
}
unsigned int GetHorDpi()
{
return m_unHorDpi;
}
protected:
CFontFile *m_pFontFile;
double m_arrdFontMatrix[6]; // FontMatrix (Text space -> Device space)
double m_arrdTextMatrix[6]; // TextMatrix (Text space -> User space)
BOOL m_bAntiAliasing; // Anti-aliasing
BOOL m_bUseKerning; // Èñïîëüçîâàòü è äîñòóïåí ëè Kerning
float m_fSize; // Ðàçìåð øðèôòà
unsigned int m_unHorDpi; // Ãîðèçîíòàëüíîå ðàçðåøåíèå
unsigned int m_unVerDpi; // Âåðòèêàëüíîå ðàçðåøåíèå
BOOL m_bNeedDoItalic; // Äàííûé øðèôò íóæíî ñäåëàòü íàêëîííûì | Òàêîå ñëó÷àåòñÿ â 2-õ ñëó÷àÿõ, ëèáî ìû ãðóçèì øðèôò èç ôàéëà,
BOOL m_bNeedDoBold; // Äàííûé øðèôò íóæíî ñäåëàòü æèðíûì | ëèáî ñðåäè óñòàíîâëåííûõ øðèôòîâ íåò øðèôòà ñ íóæíûì ñòèëåì.
float m_fCharSpacing; // Ìåæñèìâîëüíûé èíòåðâàë
int m_nMinX; //
int m_nMinY; // Glyph BBox
int m_nMaxX; //
int m_nMaxY; //
unsigned char *m_pCache; // Glyph bitmap cache
TFontCacheTag *m_pCacheTags; // Cache Tags
int m_nGlyphWidth; // Øèðèíà Glyph bitmaps
int m_nGlyphHeight; // Âûñîòà Glyph bitmaps
int m_nGlyphSize; // Ðçàìåð Glyph bitmaps â áàéòàõ
int m_nCacheSets; // Êîëè÷åñòâî Sets â êýøå
int m_nCacheAssoc; // Êîëè÷åñòâî Glyphs â Set
CFont *m_pDefaultFont; // Ñòàíäàðòíûé øðèôò, êîòîðûé èñïîëüçóåòñÿ, åñëè â èñõîäíîì êàêèå-òî ñèìâîëû íå ðèñóþòñÿ
BOOL m_bUseDefaultFont; // Èñïîëüçóåì ëè ñòàíäàðòíûé øðèôò? Åñëè íåò, òîãäà êîãäà íåò ñèìâîëà ðèñóåì ñòàíäàðòíûé ñèìâîë
};
#endif /* _FONT_H */