1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
7 #ifndef _FPDF_RESOURCE_
8 #define _FPDF_RESOURCE_
10 #include "fpdf_parser.h"
13 #include "../fxge/fx_font.h"
17 class CPDF_TrueTypeFont;
20 class CPDF_FontEncoding;
22 class CPDF_CID2UnicodeMap;
23 class CPDF_ColorSpace;
27 class CPDF_TilingPattern;
28 class CPDF_ShadingPattern;
31 class CPDF_ToUnicodeMap;
34 class CPDF_RenderContext;
36 class CPDF_ImageObject;
38 typedef struct FT_FaceRec_* FXFT_Face;
39 class CFX_CTTGSUBTable;
41 #define PDFFONT_TYPE1 1
42 #define PDFFONT_TRUETYPE 2
43 #define PDFFONT_TYPE3 3
44 #define PDFFONT_CIDFONT 4
45 #define PDFFONT_FIXEDPITCH 1
46 #define PDFFONT_SERIF 2
47 #define PDFFONT_SYMBOLIC 4
48 #define PDFFONT_SCRIPT 8
49 #define PDFFONT_NONSYMBOLIC 32
50 #define PDFFONT_ITALIC 64
51 #define PDFFONT_ALLCAP 0x10000
52 #define PDFFONT_SMALLCAP 0x20000
53 #define PDFFONT_FORCEBOLD 0x40000
54 #define PDFFONT_USEEXTERNATTR 0x80000
55 FX_WCHAR PDF_UnicodeFromAdobeName(const FX_CHAR* name);
56 CFX_ByteString PDF_AdobeNameFromUnicode(FX_WCHAR unicode);
57 class CPDF_Font : public CFX_Object
61 static CPDF_Font* CreateFontF(CPDF_Document* pDoc, CPDF_Dictionary* pFontDict);
63 static CPDF_Font* GetStockFont(CPDF_Document* pDoc, FX_BSTR fontname);
70 int GetFontType() const
75 CFX_ByteString GetFontTypeName() const;
77 const CFX_ByteString& GetBaseFont() const
82 const CFX_SubstFont* GetSubstFont() const
84 return m_Font.GetSubstFont();
87 FX_DWORD GetFlags() const
92 virtual FX_BOOL IsVertWriting()const;
97 CPDF_Type1Font* GetType1Font() const
99 return m_FontType == PDFFONT_TYPE1 ? (CPDF_Type1Font*)(void*)this : NULL;
102 CPDF_TrueTypeFont* GetTrueTypeFont() const
104 return m_FontType == PDFFONT_TRUETYPE ? (CPDF_TrueTypeFont*)(void*)this : NULL;
107 CPDF_CIDFont* GetCIDFont() const
109 return (m_FontType == PDFFONT_CIDFONT) ? (CPDF_CIDFont*)(void*)this : NULL;
112 CPDF_Type3Font* GetType3Font() const
114 return (m_FontType == PDFFONT_TYPE3) ? (CPDF_Type3Font*)(void*)this : NULL;
118 FX_BOOL IsEmbedded() const
120 return m_FontType == PDFFONT_TYPE3 || m_pFontFile != NULL;
123 virtual FX_BOOL IsUnicodeCompatible() const
128 CPDF_StreamAcc* GetFontFile() const
133 CPDF_Dictionary* GetFontDict() const
138 FX_BOOL IsStandardFont() const;
140 FXFT_Face GetFace() const
142 return m_Font.GetFace();
147 virtual FX_DWORD GetNextChar(FX_LPCSTR pString, int& offset) const
149 return (FX_BYTE)pString[offset++];
152 virtual int CountChar(FX_LPCSTR pString, int size) const
157 void AppendChar(CFX_ByteString& str, FX_DWORD charcode) const;
159 virtual int AppendChar(FX_LPSTR buf, FX_DWORD charcode) const
161 *buf = (FX_CHAR)charcode;
165 virtual int GetCharSize(FX_DWORD charcode) const
173 virtual int GlyphFromCharCode(FX_DWORD charcode, FX_BOOL *pVertGlyph = NULL) = 0;
174 virtual int GlyphFromCharCodeExt(FX_DWORD charcode)
176 return GlyphFromCharCode(charcode);
179 CFX_WideString UnicodeFromCharCode(FX_DWORD charcode) const;
181 FX_DWORD CharCodeFromUnicode(FX_WCHAR Unicode) const;
183 CFX_CharMap* GetCharMap()
188 CFX_ByteString EncodeString(const CFX_WideString& str) const;
190 CFX_WideString DecodeString(const CFX_ByteString& str) const;
195 void GetFontBBox(FX_RECT& rect) const
200 int GetTypeAscent() const
205 int GetTypeDescent() const
210 int GetItalicAngle() const
212 return m_ItalicAngle;
220 int GetStringWidth(const FX_CHAR* pString, int size);
222 virtual int GetCharWidthF(FX_DWORD charcode, int level = 0) = 0;
224 virtual int GetCharTypeWidth(FX_DWORD charcode);
226 virtual void GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level = 0) = 0;
230 CPDF_Document* m_pDocument;
232 class CFX_PathData* LoadGlyphPath(FX_DWORD charcode, int dest_width = 0);
239 FX_BOOL Initialize();
243 virtual FX_BOOL _Load() = 0;
245 virtual FX_WCHAR _UnicodeFromCharCode(FX_DWORD charcode) const = 0;
247 virtual FX_DWORD _CharCodeFromUnicode(FX_WCHAR Unicode) const = 0;
249 void LoadUnicodeMap();
251 void LoadPDFEncoding(CPDF_Object* pEncoding, int& iBaseEncoding,
252 CFX_ByteString*& pCharNames, FX_BOOL bEmbedded, FX_BOOL bTrueType);
254 void LoadFontDescriptor(CPDF_Dictionary*);
256 void LoadCharWidths(FX_WORD* pWidths);
258 void CheckFontMetrics();
260 CFX_CharMap* m_pCharMap;
266 CFX_ByteString m_BaseFont;
268 CPDF_StreamAcc* m_pFontFile;
270 CPDF_Dictionary* m_pFontDict;
272 CPDF_ToUnicodeMap* m_pToUnicodeMap;
274 FX_BOOL m_bToUnicodeLoaded;
292 #define PDFFONT_ENCODING_BUILTIN 0
293 #define PDFFONT_ENCODING_WINANSI 1
294 #define PDFFONT_ENCODING_MACROMAN 2
295 #define PDFFONT_ENCODING_MACEXPERT 3
296 #define PDFFONT_ENCODING_STANDARD 4
297 #define PDFFONT_ENCODING_ADOBE_SYMBOL 5
298 #define PDFFONT_ENCODING_ZAPFDINGBATS 6
299 #define PDFFONT_ENCODING_PDFDOC 7
300 #define PDFFONT_ENCODING_MS_SYMBOL 8
301 #define PDFFONT_ENCODING_UNICODE 9
302 class CPDF_FontEncoding : public CFX_Object
308 CPDF_FontEncoding(int PredefinedEncoding);
310 void LoadEncoding(CPDF_Object* pEncoding);
312 FX_BOOL IsIdentical(CPDF_FontEncoding* pAnother) const;
314 FX_WCHAR UnicodeFromCharCode(FX_BYTE charcode) const
316 return m_Unicodes[charcode];
319 int CharCodeFromUnicode(FX_WCHAR unicode) const;
321 void SetUnicode(FX_BYTE charcode, FX_WCHAR unicode)
323 m_Unicodes[charcode] = unicode;
326 CPDF_Object* Realize();
329 FX_WCHAR m_Unicodes[256];
331 class CPDF_SimpleFont : public CPDF_Font
337 virtual ~CPDF_SimpleFont();
339 CPDF_FontEncoding* GetEncoding()
343 virtual int GetCharWidthF(FX_DWORD charcode, int level = 0);
344 virtual void GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level = 0);
345 virtual int GlyphFromCharCode(FX_DWORD charcode, FX_BOOL *pVertGlyph = NULL);
346 virtual FX_BOOL IsUnicodeCompatible() const;
349 FX_BOOL LoadCommon();
351 void LoadSubstFont();
353 void LoadFaceMetrics();
355 virtual void LoadGlyphMap() = 0;
356 virtual FX_WCHAR _UnicodeFromCharCode(FX_DWORD charcode) const
358 return m_Encoding.UnicodeFromCharCode((FX_BYTE)charcode);
360 virtual FX_DWORD _CharCodeFromUnicode(FX_WCHAR Unicode) const
362 return m_Encoding.CharCodeFromUnicode(Unicode);
367 CPDF_FontEncoding m_Encoding;
369 FX_WORD m_GlyphIndex[256];
370 FX_WORD m_ExtGID[256];
375 CFX_ByteString* m_pCharNames;
382 FX_WORD m_CharWidth[256];
384 FX_SMALL_RECT m_CharBBox[256];
386 FX_BOOL m_bUseFontWidth;
388 void LoadCharMetrics(int charcode);
391 class CPDF_Type1Font : public CPDF_SimpleFont
401 virtual int GlyphFromCharCodeExt(FX_DWORD charcode);
403 virtual FX_BOOL _Load();
406 virtual void LoadGlyphMap();
408 class CPDF_TrueTypeFont : public CPDF_SimpleFont
414 virtual FX_BOOL _Load();
415 virtual void LoadGlyphMap();
417 class CPDF_Type3Char : public CFX_Object
425 FX_BOOL LoadBitmap(CPDF_RenderContext* pContext);
429 FX_BOOL m_bPageRequired;
435 CFX_AffineMatrix m_ImageMatrix;
437 CFX_DIBitmap* m_pBitmap;
444 class CPDF_Type3Font : public CPDF_SimpleFont
448 virtual ~CPDF_Type3Font();
449 void SetPageResources(CPDF_Dictionary* pResources)
451 m_pPageResources = pResources;
453 CPDF_Type3Char* LoadChar(FX_DWORD charcode, int level = 0);
454 virtual int GetCharWidthF(FX_DWORD charcode, int level = 0);
455 virtual int GetCharTypeWidth(FX_DWORD charcode)
457 return GetCharWidthF(charcode);
459 virtual void GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level = 0);
460 CFX_AffineMatrix& GetFontMatrix()
464 void CheckType3FontMetrics();
466 virtual FX_BOOL _Load();
467 virtual void LoadGlyphMap() {}
468 int m_CharWidthL[256];
469 CPDF_Dictionary* m_pCharProcs;
470 CPDF_Dictionary* m_pPageResources;
471 CPDF_Dictionary* m_pFontResources;
472 CFX_MapPtrToPtr m_CacheMap;
473 CFX_MapPtrToPtr m_DeletedMap;
475 CFX_AffineMatrix m_FontMatrix;
477 #define CIDSET_UNKNOWN 0
479 #define CIDSET_CNS1 2
480 #define CIDSET_JAPAN1 3
481 #define CIDSET_KOREA1 4
482 #define CIDSET_UNICODE 5
483 class CPDF_CIDFont : public CPDF_Font
489 virtual ~CPDF_CIDFont();
491 FX_BOOL LoadGB2312();
492 virtual int GlyphFromCharCode(FX_DWORD charcode, FX_BOOL *pVertGlyph = NULL);
493 virtual int GetCharWidthF(FX_DWORD charcode, int level = 0);
494 virtual void GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level = 0);
496 FX_WORD CIDFromCharCode(FX_DWORD charcode) const;
504 virtual FX_DWORD GetNextChar(const FX_CHAR* pString, int& offset) const;
505 virtual int CountChar(const FX_CHAR* pString, int size) const;
506 virtual int AppendChar(FX_LPSTR str, FX_DWORD charcode) const;
507 virtual int GetCharSize(FX_DWORD charcode) const;
510 int GetCharset() const
515 FX_LPCBYTE GetCIDTransform(FX_WORD CID) const;
519 virtual FX_BOOL IsVertWriting() const;
521 short GetVertWidth(FX_WORD CID) const;
523 void GetVertOrigin(FX_WORD CID, short& vx, short& vy) const;
525 virtual FX_BOOL IsUnicodeCompatible() const;
526 virtual FX_BOOL IsFontStyleFromCharCode(FX_DWORD charcode) const;
528 friend class CPDF_Font;
529 virtual FX_BOOL _Load();
530 virtual FX_WCHAR _UnicodeFromCharCode(FX_DWORD charcode) const;
531 virtual FX_DWORD _CharCodeFromUnicode(FX_WCHAR Unicode) const;
532 int GetGlyphIndex(FX_DWORD unicodeb, FX_BOOL *pVertGlyph);
536 CPDF_CMap* m_pAllocatedCMap;
538 CPDF_CID2UnicodeMap* m_pCID2UnicodeMap;
544 CPDF_StreamAcc* m_pCIDToGIDMap;
549 FX_WORD m_DefaultWidth;
551 FX_WORD* m_pAnsiWidths;
553 FX_SMALL_RECT m_CharBBox[256];
555 CFX_DWordArray m_WidthList;
561 CFX_DWordArray m_VertMetrics;
564 void LoadMetricsArray(CPDF_Array* pArray, CFX_DWordArray& result, int nElements);
566 void LoadSubstFont();
568 FX_BOOL m_bAdobeCourierStd;
570 CFX_CTTGSUBTable* m_pTTGSUBTable;
572 #define PDFCS_DEVICEGRAY 1
574 #define PDFCS_DEVICERGB 2
575 #define PDFCS_DEVICECMYK 3
576 #define PDFCS_CALGRAY 4
577 #define PDFCS_CALRGB 5
579 #define PDFCS_ICCBASED 7
580 #define PDFCS_SEPARATION 8
581 #define PDFCS_DEVICEN 9
582 #define PDFCS_INDEXED 10
583 #define PDFCS_PATTERN 11
584 class CPDF_ColorSpace : public CFX_Object
588 static CPDF_ColorSpace* GetStockCS(int Family);
590 static CPDF_ColorSpace* Load(CPDF_Document* pDoc, CPDF_Object* pCSObj);
594 int GetBufSize() const;
596 FX_FLOAT* CreateBuf();
598 void GetDefaultColor(FX_FLOAT* buf) const;
600 int CountComponents() const
602 return m_nComponents;
605 int GetFamily() const
610 virtual void GetDefaultValue(int iComponent, FX_FLOAT& value, FX_FLOAT& min, FX_FLOAT& max) const
617 FX_BOOL sRGB() const;
621 virtual FX_BOOL GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const = 0;
623 virtual FX_BOOL SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const
631 FX_BOOL GetCMYK(FX_FLOAT* pBuf, FX_FLOAT& c, FX_FLOAT& m, FX_FLOAT& y, FX_FLOAT& k) const;
633 FX_BOOL SetCMYK(FX_FLOAT* pBuf, FX_FLOAT c, FX_FLOAT m, FX_FLOAT y, FX_FLOAT k) const;
636 virtual void TranslateImageLine(FX_LPBYTE dest_buf, FX_LPCBYTE src_buf, int pixels,
637 int image_width, int image_height, FX_BOOL bTransMask = FALSE) const;
639 CPDF_Array*& GetArray()
644 int GetMaxIndex() const;
646 virtual CPDF_ColorSpace* GetBaseCS() const
651 virtual void EnableStdConversion(FX_BOOL bEnabled);
652 CPDF_Document* m_pDocument;
657 virtual ~CPDF_ColorSpace() {}
658 virtual FX_BOOL v_Load(CPDF_Document* pDoc, CPDF_Array* pArray)
662 virtual FX_BOOL v_GetCMYK(FX_FLOAT* pBuf, FX_FLOAT& c, FX_FLOAT& m, FX_FLOAT& y, FX_FLOAT& k) const
666 virtual FX_BOOL v_SetCMYK(FX_FLOAT* pBuf, FX_FLOAT c, FX_FLOAT m, FX_FLOAT y, FX_FLOAT k) const
675 CPDF_Array* m_pArray;
677 FX_DWORD m_dwStdConversion;
679 class CPDF_Color : public CFX_Object
683 CPDF_Color() :m_pCS(NULL), m_pBuffer(NULL)
687 CPDF_Color(int family);
691 FX_BOOL IsNull() const
693 return m_pBuffer == NULL;
696 FX_BOOL IsEqual(const CPDF_Color& other) const;
698 FX_BOOL IsPattern() const
700 return m_pCS && m_pCS->GetFamily() == PDFCS_PATTERN;
703 void Copy(const CPDF_Color* pSrc);
705 void SetColorSpace(CPDF_ColorSpace* pCS);
707 void SetValue(FX_FLOAT* comp);
709 void SetValue(CPDF_Pattern* pPattern, FX_FLOAT* comp, int ncomps);
711 FX_BOOL GetRGB(int& R, int& G, int& B) const;
713 CPDF_Pattern* GetPattern() const;
715 CPDF_ColorSpace* GetPatternCS() const;
717 FX_FLOAT* GetPatternColor() const;
719 CPDF_ColorSpace* m_pCS;
722 void ReleaseBuffer();
723 void ReleaseColorSpace();
726 #define PATTERN_TILING 1
727 #define PATTERN_SHADING 2
728 class CPDF_Pattern : public CFX_Object
732 virtual ~CPDF_Pattern();
733 void SetForceClear(FX_BOOL bForceClear) { m_bForceClear = bForceClear; }
735 CPDF_Object* m_pPatternObj;
739 CFX_AffineMatrix m_Pattern2Form;
740 CFX_AffineMatrix m_ParentMatrix;
742 CPDF_Document* m_pDocument;
745 CPDF_Pattern(const CFX_AffineMatrix* pParentMatrix);
746 FX_BOOL m_bForceClear;
749 class CPDF_TilingPattern : public CPDF_Pattern
753 CPDF_TilingPattern(CPDF_Document* pDoc, CPDF_Object* pPatternObj, const CFX_AffineMatrix* parentMatrix);
755 virtual ~CPDF_TilingPattern();
763 CFX_FloatRect m_BBox;
773 class CPDF_ShadingPattern : public CPDF_Pattern
777 CPDF_ShadingPattern(CPDF_Document* pDoc, CPDF_Object* pPatternObj, FX_BOOL bShading, const CFX_AffineMatrix* parentMatrix);
779 virtual ~CPDF_ShadingPattern();
781 CPDF_Object* m_pShadingObj;
783 FX_BOOL m_bShadingObj;
791 CPDF_ColorSpace* m_pCS;
794 CPDF_Function* m_pFunctions[4];
800 struct CPDF_MeshVertex {
804 class CPDF_MeshStream : public CFX_Object
808 FX_BOOL Load(CPDF_Stream* pShadingStream, CPDF_Function** pFuncs, int nFuncs, CPDF_ColorSpace* pCS);
812 void GetCoords(FX_FLOAT& x, FX_FLOAT& y);
814 void GetColor(FX_FLOAT& r, FX_FLOAT& g, FX_FLOAT& b);
816 FX_DWORD GetVertex(CPDF_MeshVertex& vertex, CFX_AffineMatrix* pObject2Bitmap);
818 FX_BOOL GetVertexRow(CPDF_MeshVertex* vertex, int count, CFX_AffineMatrix* pObject2Bitmap);
819 CPDF_Function** m_pFuncs;
820 CPDF_ColorSpace* m_pCS;
821 FX_DWORD m_nFuncs, m_nCoordBits, m_nCompBits, m_nFlagBits, m_nComps;
822 FX_DWORD m_CoordMax, m_CompMax;
823 FX_FLOAT m_xmin, m_xmax, m_ymin, m_ymax;
824 FX_FLOAT m_ColorMin[8], m_ColorMax[8];
825 CPDF_StreamAcc m_Stream;
826 CFX_BitStream m_BitStream;
828 #define PDF_IMAGE_NO_COMPRESS 0x0000
829 #define PDF_IMAGE_LOSSY_COMPRESS 0x0001
830 #define PDF_IMAGE_LOSSLESS_COMPRESS 0x0002
831 #define PDF_IMAGE_MASK_LOSSY_COMPRESS 0x0004
832 #define PDF_IMAGE_MASK_LOSSLESS_COMPRESS 0x0008
833 class CPDF_ImageSetParam
841 FX_ARGB* pMatteColor;
844 class CPDF_Image : public CFX_Object
848 CPDF_Image(CPDF_Document* pDoc);
852 FX_BOOL LoadImageF(CPDF_Stream* pImageStream, FX_BOOL bInline);
863 void SetInlineDict(CPDF_Dictionary* pDict)
865 m_pInlineDict = pDict;
868 CPDF_Dictionary* GetInlineDict() const
870 return m_pInlineDict;
873 CPDF_Stream* GetStream() const
878 CPDF_Dictionary* GetDict() const
880 return m_pStream? m_pStream->GetDict(): NULL;
883 CPDF_Dictionary* GetOC() const
888 CPDF_Document* GetDocument() const
895 FX_INT32 GetPixelHeight() const
900 FX_INT32 GetPixelWidth() const
906 FX_BOOL IsMask() const
911 FX_BOOL IsInterpol() const
913 return m_bInterpolate;
916 CFX_DIBSource* LoadDIBSource(CFX_DIBSource** ppMask = NULL, FX_DWORD* pMatteColor = NULL, FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE) const;
920 void SetImage(const CFX_DIBitmap* pDIBitmap, FX_INT32 iCompress, IFX_FileWrite *pFileWrite = NULL, IFX_FileRead *pFileRead = NULL, const CFX_DIBitmap* pMask = NULL, const CPDF_ImageSetParam* pParam = NULL);
922 void SetJpegImage(FX_BYTE* pImageData, FX_DWORD size);
924 void SetJpegImage(IFX_FileRead *pFile);
926 void ResetCache(CPDF_Page* pPage, const CFX_DIBitmap* pDIBitmap);
929 FX_BOOL StartLoadDIBSource(CPDF_Dictionary* pFormResource, CPDF_Dictionary* pPageResource, FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE);
930 FX_BOOL Continue(IFX_Pause* pPause);
931 CFX_DIBSource* DetachBitmap();
932 CFX_DIBSource* DetachMask();
933 CFX_DIBSource* m_pDIBSource;
934 CFX_DIBSource* m_pMask;
935 FX_DWORD m_MatteColor;
938 CPDF_Stream* m_pStream;
940 CPDF_Dictionary* m_pInlineDict;
948 FX_BOOL m_bInterpolate;
950 CPDF_Document* m_pDocument;
952 CPDF_Dictionary* m_pOC;
953 CPDF_Dictionary* InitJPEG(FX_LPBYTE pData, FX_DWORD size);