mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-07-20 00:03:33 +08:00
375 lines
9.4 KiB
C++
375 lines
9.4 KiB
C++
#ifndef _GFONT_H
|
|
#define _GFONT_H
|
|
|
|
#include "StringExt.h"
|
|
#include "Object.h"
|
|
#include "CharTypes.h"
|
|
#include "GlobalParams.h"
|
|
|
|
class Dict;
|
|
class CMap;
|
|
class CharCodeToUnicode;
|
|
class CFontFileTrueType;
|
|
struct GrFontCIDWidths;
|
|
|
|
//------------------------------------------------------------------------
|
|
// GrFontType
|
|
//------------------------------------------------------------------------
|
|
|
|
enum GrFontType
|
|
{
|
|
//----- Gr8BitFont
|
|
fontUnknownType,
|
|
fontType1,
|
|
fontType1C,
|
|
fontType1COT,
|
|
fontType3,
|
|
fontTrueType,
|
|
fontTrueTypeOT,
|
|
//----- GrCIDFont
|
|
fontCIDType0,
|
|
fontCIDType0C,
|
|
fontCIDType0COT,
|
|
fontCIDType2,
|
|
fontCIDType2OT
|
|
};
|
|
|
|
//------------------------------------------------------------------------
|
|
// GrFontCIDWidths
|
|
//------------------------------------------------------------------------
|
|
|
|
struct GrFontCIDWidthException
|
|
{
|
|
CID nFirst; // Äàííàÿ çàïèñü ïðèìåíÿåòñÿ ê
|
|
CID nLast; // CID: <nFirst>...<nLast>
|
|
double dWidth; // Íîâàÿ øèðèíà ñèìâîëîâ
|
|
};
|
|
|
|
struct GrFontCIDWidthExceptionV
|
|
{
|
|
CID nFirst; // Äàííàÿ çàïèñü ïðèìåíÿåòñÿ ê
|
|
CID nLast; // CID: <nFirst>...<nLast>
|
|
double dHeight; // Íîâàÿ âûñîòà ñèìâîëîâ
|
|
double dVx; // Êîîðäèíàòû âåêòîðà V: origin0->origin1
|
|
double dVy; // Ñì. ôèãóðó 40 â ñïåöèôèêàöèè PDF 1.7
|
|
};
|
|
|
|
struct GrFontCIDWidths
|
|
{
|
|
double dDefaultWidth; // Ñòàíäàðòíîå çíà÷åíèå øèðèíû ñèìâîëà
|
|
double dDefaultHeight; // Ñòàíäàðòíîå çíà÷åíèå âûñîòû ñèìâîëà
|
|
double dDefaultV; // Ñòàíäàðòíîå çíà÷åíèå âåêòîðà V
|
|
GrFontCIDWidthException *pExceptions; // Èñêëþ÷åíèÿ äëÿ ãîðèçîíòàëüíûõ ìåòðèê
|
|
int nExceptionsCount; // ×èñëî èñêëþ÷åíèé
|
|
GrFontCIDWidthExceptionV*pExceptionsV; // Èñêëþ÷åíèÿ äëÿ âåðòèêàëüíûõ ìåòðèê
|
|
int nExceptionsVCount; // ×èñëî èñêëþ÷åíèé
|
|
};
|
|
|
|
//------------------------------------------------------------------------
|
|
// GrFont
|
|
//------------------------------------------------------------------------
|
|
|
|
#define fontFixedWidth (1 << 0)
|
|
#define fontSerif (1 << 1)
|
|
#define fontSymbolic (1 << 2)
|
|
#define fontItalic (1 << 6)
|
|
#define fontBold (1 << 18)
|
|
|
|
class GrFont
|
|
{
|
|
public:
|
|
|
|
static GrFont *MakeFont(XRef *pXref, char *sTag, Ref oID, Dict *pFontDict, GlobalParams *pGlobalParams);
|
|
|
|
GrFont(char *sTag, Ref oID, StringExt *seName, GlobalParams *pGlobalParams);
|
|
|
|
virtual ~GrFont();
|
|
|
|
BOOL CheckValidate()
|
|
{
|
|
return m_bValid;
|
|
}
|
|
|
|
StringExt *GetTag()
|
|
{
|
|
return m_seTag;
|
|
}
|
|
|
|
Ref *GetID()
|
|
{
|
|
return &m_oID;
|
|
}
|
|
|
|
BOOL CheckTag(char *sTag)
|
|
{
|
|
return !m_seTag->Compare(sTag);
|
|
}
|
|
|
|
StringExt *GetBaseName()
|
|
{
|
|
return m_seName;
|
|
}
|
|
|
|
StringExt *GetOriginalName()
|
|
{
|
|
return m_seOriginalName;
|
|
}
|
|
|
|
GrFontType GetType()
|
|
{
|
|
return m_eType;
|
|
}
|
|
virtual BOOL IsCIDFont()
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
// Âíåäðåííûå ôîíòû.
|
|
BOOL GetEmbeddedFontFileRef(Ref *pEmbRef)
|
|
{
|
|
*pEmbRef = m_oEmbFontFileRef;
|
|
return m_oEmbFontFileRef.nNum >= 0;
|
|
}
|
|
|
|
StringExt *GetEmbeddedFontName()
|
|
{
|
|
return m_seEmbeddedFontName;
|
|
}
|
|
|
|
CStringW GetExternalFontFilePath()
|
|
{
|
|
return m_wsExternalFontFilePath;
|
|
}
|
|
|
|
//
|
|
int GetFlags()
|
|
{
|
|
return m_nFlags;
|
|
}
|
|
BOOL IsFixedWidth()
|
|
{
|
|
return m_nFlags & fontFixedWidth;
|
|
}
|
|
BOOL IsSerif()
|
|
{
|
|
return m_nFlags & fontSerif;
|
|
}
|
|
BOOL IsSymbolic()
|
|
{
|
|
return m_nFlags & fontSymbolic;
|
|
}
|
|
BOOL IsItalic()
|
|
{
|
|
return m_nFlags & fontItalic;
|
|
}
|
|
BOOL IsBold()
|
|
{
|
|
return m_nFlags & fontBold;
|
|
}
|
|
|
|
double *GetFontMatrix()
|
|
{
|
|
return m_arrFontMatrix;
|
|
}
|
|
|
|
double *GetFontBBox()
|
|
{
|
|
return m_arrFontBBox;
|
|
}
|
|
|
|
double GetAscent()
|
|
{
|
|
return m_dAscent;
|
|
}
|
|
double GetDescent()
|
|
{
|
|
return m_dDescent;
|
|
}
|
|
|
|
// 0 = ïèøåì ïî ãîðèçîíòàëè, 1 = ïî âåðòèêàëè
|
|
virtual int GetWMode()
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
// Ñ÷èòûâàåì âíåøíèé èëè âêëþ÷åííûé FontFile â áóôåð.
|
|
char *ReadExternalFontFile(int *pnLength);
|
|
char *ReadEmbeddedFontFile(XRef *pXref, int *pnLegth);
|
|
|
|
// Ñ÷èòûâàåì ñëåäóþùèé ñèìâîë èç ñòðîêè <sText> äëèíû <nLen> áàéò, âîçâðàùåì
|
|
// êîä ñèìâîëà <unCode>, åãî þíèêîäíîå çíà÷åíèå <unUnicode>, âåêòîð çàìåùåíèÿ
|
|
// (w0 èëè w1, ñì. ñïåöèôèêàöèþ PDF 1.7 ôèãóðà 40) (<dDx>, <dDy>), è âåêòîð V
|
|
// (ñì. ôèãóðó 40) (<Vx>, <Vy>). Âîçâðàùàåì êîëè÷åñòâî áàéò íåîáõîäèìûõ äëÿ punCode.
|
|
virtual int GetNextChar(char *sText, int nLen, CharCode *punCode, Unicode *punUnicode, int uSize, int *uLen, double *pdDx, double *pdDy, double *pdVx, double *pdVy) = 0;
|
|
|
|
protected:
|
|
|
|
void ReadFontDescriptor(XRef *pXref, Dict *pFontDict);
|
|
CharCodeToUnicode *ReadToUnicodeCMap(Dict *pFontDict, int nBitsCount, CharCodeToUnicode *pCharToUnicode);
|
|
void FindExternalFontFile();
|
|
|
|
protected:
|
|
|
|
StringExt *m_seTag; // Òýã pdf-øðèôòà
|
|
Ref m_oID; // Ññûëêà íà îáúåêò-øðèôò (èñïîëüçóåì â êà÷åñòâå óíèêàëüíîãî èäåíòåôèêàòîðà)
|
|
StringExt *m_seName; // Íàçâàíèå øðèôòà
|
|
StringExt *m_seOriginalName; // Ïåðâîíà÷àëüíîå íàçâàíèå øðèôòà
|
|
GrFontType m_eType; // Òèï øðèôòà
|
|
int m_nFlags; // Ôëàãè â FontDescriptor
|
|
StringExt *m_seEmbeddedFontName; // Íàçâàíèå âêëþ÷åííîãî â PDF øðèôòà(ò.å. øðèôò èäåò âìåñòå ñ FontFile)
|
|
Ref m_oEmbFontFileRef; // Ññûëêà(pdf-ññûëêà) íà FontFile äëÿ âêëþ÷åííîãî øðèôòà
|
|
CStringW m_wsExternalFontFilePath; // Ïóòü â FontFile(ò.å. font file íå â ñàìîì PDF)
|
|
|
|
double m_arrFontMatrix[6]; // Ìàòðèöà ïðåîáðàçîâàíèÿ êîîðäèíàò ñèìâîëà â êîîðäèíàòû òåêñòà (òîëüêî äëÿ Type 3)
|
|
double m_arrFontBBox[4]; // Íàèìåíüøèé ïðÿìîóãîëüíèê çàäàþùèé ãðàíèöû âñåõ ñèìâîëîâ (òîëüêî äëÿ Type 3)
|
|
double m_dMissingWidth; // Ñòàíäàðòíîå çíà÷åíèå øèðèíû äëÿ ïðîïóùåííûõ ñèìâîëîâ
|
|
double m_dAscent; // Ascent
|
|
double m_dDescent; // Descent
|
|
|
|
BOOL m_bValid;
|
|
|
|
GlobalParams *m_pGlobalParams;
|
|
};
|
|
|
|
//------------------------------------------------------------------------
|
|
// Gr8BitFont
|
|
//------------------------------------------------------------------------
|
|
|
|
class Gr8BitFont: public GrFont
|
|
{
|
|
public:
|
|
|
|
Gr8BitFont(XRef *pXref, char *sTag, Ref oID, StringExt *seName, GrFontType eType, Dict *pFontDict, GlobalParams *pGlobalParams);
|
|
|
|
virtual ~Gr8BitFont();
|
|
|
|
virtual int GetNextChar(char *sText, int nLen, CharCode *punCode, Unicode *punUnicode, int uSize, int *uLen, double *pdDx, double *pdDy, double *pdVx, double *pdVy);
|
|
|
|
char **GetEncoding()
|
|
{
|
|
return m_ppEncoding;
|
|
}
|
|
|
|
CharCodeToUnicode *GetToUnicode();
|
|
|
|
char *GetCharName(int nCode)
|
|
{
|
|
return m_ppEncoding[nCode];
|
|
}
|
|
|
|
BOOL GetHasEncoding()
|
|
{
|
|
return m_bHasEncoding;
|
|
}
|
|
|
|
BOOL GetUsesMacRomanEncoding()
|
|
{
|
|
return m_bUsesMacRomanEncoding;
|
|
}
|
|
|
|
double GetWidth(unsigned char unChar)
|
|
{
|
|
return m_arrWidths[unChar];
|
|
}
|
|
// Òîëüêî äëÿ TrueType
|
|
unsigned short *GetCodeToGIDMap(CFontFileTrueType *pTTF);
|
|
|
|
// Ñëåäóþùèå òðè ôóíêöèè èñïîëüçóþòñÿ òîëüêî äëÿ Type 3
|
|
Dict *GetCharProcs();
|
|
Object *GetCharProc(int nCode, Object *pProc);
|
|
Dict *GetResources();
|
|
|
|
private:
|
|
|
|
char *m_ppEncoding[256]; // Êîäèðîâêà( Ñhar code --> Ñhar name)
|
|
BOOL m_arrEncFree[256]; // Áóëåâñêèå çíà÷åíèÿ äëÿ èìåíè êàæäîãî ñèìâîëà: true, åñëè ïîä ñòðîêó âûäåëÿëè ïàìÿòü
|
|
CharCodeToUnicode *m_pCharToUnicode; // Ñhar code --> Unicode
|
|
BOOL m_bHasEncoding; // Èìååòñÿ ëè êîäèðîâêà âîîáùå?
|
|
BOOL m_bUsesMacRomanEncoding; // Êîäèðîâêà MacRomanEncoding?
|
|
double m_arrWidths[256]; // Øèðèíû ñèìâîëîâ
|
|
Object m_oCharProcs; // Ñïåöèôè÷íî òîëüêî äëÿ Type 3, ñëîâàðü CharProcs
|
|
Object m_oResources; // Ñïåöèôè÷íî òîëüêî äëÿ Type 3, ñëîâàðü Resources
|
|
};
|
|
|
|
//------------------------------------------------------------------------
|
|
// GrCIDFont
|
|
//------------------------------------------------------------------------
|
|
|
|
class GrCIDFont: public GrFont
|
|
{
|
|
public:
|
|
|
|
GrCIDFont(XRef *pXref, char *sTag, Ref oID, StringExt *seName, Dict *pFontDict, GlobalParams *pGlobalParams);
|
|
|
|
virtual ~GrCIDFont();
|
|
|
|
virtual BOOL IsCIDFont()
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
virtual int GetNextChar(char *sText, int nLen, CharCode *punCode, Unicode *punUnicode, int uSize, int *uLen, double *pdDx, double *pdDy, double *pdVx, double *pdVy);
|
|
|
|
virtual int GetWMode();
|
|
|
|
CharCodeToUnicode *GetToUnicode();
|
|
|
|
// Ñollection name (<registry>-<ordering>).
|
|
StringExt *GetCollection();
|
|
|
|
// CID-to-GID. Èñïîëüçóåòñÿ òîëüêî åñëè òèï = fontCIDType2.
|
|
unsigned short *GetCIDToGID()
|
|
{
|
|
return m_pCidToGID;
|
|
}
|
|
int GetCIDToGIDLen()
|
|
{
|
|
return m_nCidToGIDLen;
|
|
}
|
|
|
|
CMap *GetCMap()
|
|
{
|
|
return m_pCMap;
|
|
}
|
|
|
|
private:
|
|
|
|
CMap *m_pCMap; // char code --> CID
|
|
CharCodeToUnicode *m_pCharToUnicode; // CID --> Unicode
|
|
GrFontCIDWidths m_oWidths; // character widths
|
|
unsigned short *m_pCidToGID; // CID --> GID mapping (for embedded TrueType fonts)
|
|
int m_nCidToGIDLen;
|
|
};
|
|
|
|
//------------------------------------------------------------------------
|
|
// GrFontDict
|
|
//------------------------------------------------------------------------
|
|
|
|
class GrFontDict
|
|
{
|
|
public:
|
|
|
|
GrFontDict(XRef *pXref, Ref *pFontDictRef, Dict *pFontDict, GlobalParams *pGlobalParams);
|
|
|
|
~GrFontDict();
|
|
|
|
GrFont *Search(char *sTag);
|
|
|
|
int GetFontsCount()
|
|
{
|
|
return m_nFontsCount;
|
|
}
|
|
GrFont *GetFont(int nIndex)
|
|
{
|
|
return m_ppFonts[nIndex];
|
|
}
|
|
|
|
private:
|
|
|
|
GrFont **m_ppFonts; // Ñïèñîê øðèôòîâ
|
|
int m_nFontsCount; // Êîëè÷åñòâî øðèôòîâ
|
|
GlobalParams *m_pGlobalParams;
|
|
};
|
|
|
|
#endif /* _GFONT_H */
|