Files
core/ASCOfficePDFReader/GFont.h

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 */