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 CORE_INCLUDE_FPDFAPI_FPDF_RESOURCE_H_
8 #define CORE_INCLUDE_FPDFAPI_FPDF_RESOURCE_H_
10 #include "../fxge/fx_font.h"
11 #include "fpdf_parser.h"
13 class CFX_CTTGSUBTable;
17 class CPDF_CID2UnicodeMap;
21 class CPDF_ColorSpace;
24 class CPDF_FontEncoding;
28 class CPDF_ImageObject;
31 class CPDF_RenderContext;
32 class CPDF_ShadingPattern;
33 class CPDF_TilingPattern;
34 class CPDF_ToUnicodeMap;
35 class CPDF_TrueTypeFont;
38 typedef struct FT_FaceRec_* FXFT_Face;
40 template <class ObjClass> class CPDF_CountedObject
46 typedef CPDF_CountedObject<CPDF_StreamAcc*> CPDF_CountedStreamAcc;
47 using CPDF_CountedColorSpace = CPDF_CountedObject<CPDF_ColorSpace*>;
48 using CPDF_CountedPattern = CPDF_CountedObject<CPDF_Pattern*>;
50 typedef CFX_MapPtrTemplate<CPDF_Stream*, CPDF_CountedStreamAcc*> CPDF_FontFileMap;
52 #define PDFFONT_TYPE1 1
53 #define PDFFONT_TRUETYPE 2
54 #define PDFFONT_TYPE3 3
55 #define PDFFONT_CIDFONT 4
56 #define PDFFONT_FIXEDPITCH 1
57 #define PDFFONT_SERIF 2
58 #define PDFFONT_SYMBOLIC 4
59 #define PDFFONT_SCRIPT 8
60 #define PDFFONT_NONSYMBOLIC 32
61 #define PDFFONT_ITALIC 64
62 #define PDFFONT_ALLCAP 0x10000
63 #define PDFFONT_SMALLCAP 0x20000
64 #define PDFFONT_FORCEBOLD 0x40000
65 #define PDFFONT_USEEXTERNATTR 0x80000
66 FX_WCHAR PDF_UnicodeFromAdobeName(const FX_CHAR* name);
67 CFX_ByteString PDF_AdobeNameFromUnicode(FX_WCHAR unicode);
71 static CPDF_Font* CreateFontF(CPDF_Document* pDoc, CPDF_Dictionary* pFontDict);
72 static CPDF_Font* GetStockFont(CPDF_Document* pDoc, const CFX_ByteStringC& fontname);
76 bool IsFontType(int fonttype) const { return fonttype == m_FontType; }
77 int GetFontType() const { return m_FontType; }
79 CFX_ByteString GetFontTypeName() const;
81 const CFX_ByteString& GetBaseFont() const
86 const CFX_SubstFont* GetSubstFont() const
88 return m_Font.GetSubstFont();
91 FX_DWORD GetFlags() const
96 virtual FX_BOOL IsVertWriting()const;
101 CPDF_Type1Font* GetType1Font() const
103 return m_FontType == PDFFONT_TYPE1 ? (CPDF_Type1Font*)(void*)this : NULL;
106 CPDF_TrueTypeFont* GetTrueTypeFont() const
108 return m_FontType == PDFFONT_TRUETYPE ? (CPDF_TrueTypeFont*)(void*)this : NULL;
111 CPDF_CIDFont* GetCIDFont() const
113 return (m_FontType == PDFFONT_CIDFONT) ? (CPDF_CIDFont*)(void*)this : NULL;
116 CPDF_Type3Font* GetType3Font() const
118 return (m_FontType == PDFFONT_TYPE3) ? (CPDF_Type3Font*)(void*)this : NULL;
122 FX_BOOL IsEmbedded() const
124 return m_FontType == PDFFONT_TYPE3 || m_pFontFile != NULL;
127 virtual FX_BOOL IsUnicodeCompatible() const
132 CPDF_StreamAcc* GetFontFile() const
137 CPDF_Dictionary* GetFontDict() const
142 FX_BOOL IsStandardFont() const;
144 FXFT_Face GetFace() const
146 return m_Font.GetFace();
149 virtual FX_DWORD GetNextChar(const FX_CHAR* pString, int nStrLen, int& offset) const
151 if (offset < 0 || nStrLen < 1) {
154 uint8_t ch = offset < nStrLen ? pString[offset++] : pString[nStrLen-1];
155 return static_cast<FX_DWORD>(ch);
158 virtual int CountChar(const FX_CHAR* pString, int size) const
163 void AppendChar(CFX_ByteString& str, FX_DWORD charcode) const;
165 virtual int AppendChar(FX_CHAR* buf, FX_DWORD charcode) const
167 *buf = (FX_CHAR)charcode;
171 virtual int GetCharSize(FX_DWORD charcode) const
179 virtual int GlyphFromCharCode(FX_DWORD charcode, FX_BOOL *pVertGlyph = NULL) = 0;
180 virtual int GlyphFromCharCodeExt(FX_DWORD charcode)
182 return GlyphFromCharCode(charcode);
185 CFX_WideString UnicodeFromCharCode(FX_DWORD charcode) const;
187 FX_DWORD CharCodeFromUnicode(FX_WCHAR Unicode) const;
189 CFX_CharMap* GetCharMap()
194 CFX_ByteString EncodeString(const CFX_WideString& str) const;
196 CFX_WideString DecodeString(const CFX_ByteString& str) const;
201 void GetFontBBox(FX_RECT& rect) const
206 int GetTypeAscent() const
211 int GetTypeDescent() const
216 int GetItalicAngle() const
218 return m_ItalicAngle;
226 int GetStringWidth(const FX_CHAR* pString, int size);
228 virtual int GetCharWidthF(FX_DWORD charcode, int level = 0) = 0;
230 virtual int GetCharTypeWidth(FX_DWORD charcode);
232 virtual void GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level = 0) = 0;
236 CPDF_Document* m_pDocument;
238 class CFX_PathData* LoadGlyphPath(FX_DWORD charcode, int dest_width = 0);
243 explicit CPDF_Font(int fonttype);
245 FX_BOOL Initialize();
249 virtual FX_BOOL _Load() = 0;
251 virtual FX_WCHAR _UnicodeFromCharCode(FX_DWORD charcode) const = 0;
253 virtual FX_DWORD _CharCodeFromUnicode(FX_WCHAR Unicode) const = 0;
255 void LoadUnicodeMap();
257 void LoadPDFEncoding(CPDF_Object* pEncoding, int& iBaseEncoding,
258 CFX_ByteString*& pCharNames, FX_BOOL bEmbedded, FX_BOOL bTrueType);
260 void LoadFontDescriptor(CPDF_Dictionary*);
262 void LoadCharWidths(FX_WORD* pWidths);
264 void CheckFontMetrics();
266 CFX_CharMap* m_pCharMap;
270 CFX_ByteString m_BaseFont;
272 CPDF_StreamAcc* m_pFontFile;
274 CPDF_Dictionary* m_pFontDict;
276 CPDF_ToUnicodeMap* m_pToUnicodeMap;
278 FX_BOOL m_bToUnicodeLoaded;
296 const int m_FontType;
298 #define PDFFONT_ENCODING_BUILTIN 0
299 #define PDFFONT_ENCODING_WINANSI 1
300 #define PDFFONT_ENCODING_MACROMAN 2
301 #define PDFFONT_ENCODING_MACEXPERT 3
302 #define PDFFONT_ENCODING_STANDARD 4
303 #define PDFFONT_ENCODING_ADOBE_SYMBOL 5
304 #define PDFFONT_ENCODING_ZAPFDINGBATS 6
305 #define PDFFONT_ENCODING_PDFDOC 7
306 #define PDFFONT_ENCODING_MS_SYMBOL 8
307 #define PDFFONT_ENCODING_UNICODE 9
308 class CPDF_FontEncoding
314 CPDF_FontEncoding(int PredefinedEncoding);
316 void LoadEncoding(CPDF_Object* pEncoding);
318 FX_BOOL IsIdentical(CPDF_FontEncoding* pAnother) const;
320 FX_WCHAR UnicodeFromCharCode(uint8_t charcode) const
322 return m_Unicodes[charcode];
325 int CharCodeFromUnicode(FX_WCHAR unicode) const;
327 void SetUnicode(uint8_t charcode, FX_WCHAR unicode)
329 m_Unicodes[charcode] = unicode;
332 CPDF_Object* Realize();
335 FX_WCHAR m_Unicodes[256];
337 class CPDF_SimpleFont : public CPDF_Font
340 explicit CPDF_SimpleFont(int fonttype);
341 ~CPDF_SimpleFont() override;
343 CPDF_FontEncoding* GetEncoding()
347 virtual int GetCharWidthF(FX_DWORD charcode, int level = 0);
348 virtual void GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level = 0);
349 virtual int GlyphFromCharCode(FX_DWORD charcode, FX_BOOL *pVertGlyph = NULL);
350 virtual FX_BOOL IsUnicodeCompatible() const;
353 FX_BOOL LoadCommon();
355 void LoadSubstFont();
357 void LoadFaceMetrics();
359 virtual void LoadGlyphMap() = 0;
360 virtual FX_WCHAR _UnicodeFromCharCode(FX_DWORD charcode) const
362 return m_Encoding.UnicodeFromCharCode((uint8_t)charcode);
364 virtual FX_DWORD _CharCodeFromUnicode(FX_WCHAR Unicode) const
366 return m_Encoding.CharCodeFromUnicode(Unicode);
371 CPDF_FontEncoding m_Encoding;
373 FX_WORD m_GlyphIndex[256];
374 FX_WORD m_ExtGID[256];
379 CFX_ByteString* m_pCharNames;
386 FX_WORD m_CharWidth[256];
388 FX_SMALL_RECT m_CharBBox[256];
390 FX_BOOL m_bUseFontWidth;
392 void LoadCharMetrics(int charcode);
395 class CPDF_Type1Font : public CPDF_SimpleFont
405 virtual int GlyphFromCharCodeExt(FX_DWORD charcode);
407 virtual FX_BOOL _Load();
410 virtual void LoadGlyphMap();
412 class CPDF_TrueTypeFont : public CPDF_SimpleFont
418 virtual FX_BOOL _Load();
419 virtual void LoadGlyphMap();
429 FX_BOOL LoadBitmap(CPDF_RenderContext* pContext);
433 FX_BOOL m_bPageRequired;
439 CFX_AffineMatrix m_ImageMatrix;
441 CFX_DIBitmap* m_pBitmap;
448 class CPDF_Type3Font : public CPDF_SimpleFont
452 ~CPDF_Type3Font() override;
453 void SetPageResources(CPDF_Dictionary* pResources)
455 m_pPageResources = pResources;
457 CPDF_Type3Char* LoadChar(FX_DWORD charcode, int level = 0);
458 virtual int GetCharWidthF(FX_DWORD charcode, int level = 0);
459 virtual int GetCharTypeWidth(FX_DWORD charcode)
461 return GetCharWidthF(charcode);
463 virtual void GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level = 0);
464 CFX_AffineMatrix& GetFontMatrix()
468 void CheckType3FontMetrics();
470 virtual FX_BOOL _Load();
471 virtual void LoadGlyphMap() {}
472 int m_CharWidthL[256];
473 CPDF_Dictionary* m_pCharProcs;
474 CPDF_Dictionary* m_pPageResources;
475 CPDF_Dictionary* m_pFontResources;
476 CFX_MapPtrToPtr m_CacheMap;
477 CFX_MapPtrToPtr m_DeletedMap;
479 CFX_AffineMatrix m_FontMatrix;
481 #define CIDSET_UNKNOWN 0
483 #define CIDSET_CNS1 2
484 #define CIDSET_JAPAN1 3
485 #define CIDSET_KOREA1 4
486 #define CIDSET_UNICODE 5
487 #define NUMBER_OF_CIDSETS 6
489 class CPDF_CIDFont : public CPDF_Font
495 virtual ~CPDF_CIDFont();
497 FX_BOOL LoadGB2312();
498 virtual int GlyphFromCharCode(FX_DWORD charcode, FX_BOOL *pVertGlyph = NULL);
499 virtual int GetCharWidthF(FX_DWORD charcode, int level = 0);
500 virtual void GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level = 0);
501 FX_WORD CIDFromCharCode(FX_DWORD charcode) const;
508 virtual FX_DWORD GetNextChar(const FX_CHAR* pString, int nStrLen, int& offset) const override;
509 virtual int CountChar(const FX_CHAR* pString, int size) const;
510 virtual int AppendChar(FX_CHAR* str, FX_DWORD charcode) const;
511 virtual int GetCharSize(FX_DWORD charcode) const;
513 int GetCharset() const
518 const uint8_t* GetCIDTransform(FX_WORD CID) const;
519 virtual FX_BOOL IsVertWriting() const;
520 short GetVertWidth(FX_WORD CID) const;
521 void GetVertOrigin(FX_WORD CID, short& vx, short& vy) const;
522 virtual FX_BOOL IsUnicodeCompatible() const;
523 virtual FX_BOOL IsFontStyleFromCharCode(FX_DWORD charcode) const;
526 friend class CPDF_Font;
527 virtual FX_BOOL _Load();
528 virtual FX_WCHAR _UnicodeFromCharCode(FX_DWORD charcode) const;
529 virtual FX_DWORD _CharCodeFromUnicode(FX_WCHAR Unicode) const;
530 int GetGlyphIndex(FX_DWORD unicodeb, FX_BOOL *pVertGlyph);
533 CPDF_CMap* m_pAllocatedCMap;
534 CPDF_CID2UnicodeMap* m_pCID2UnicodeMap;
537 CPDF_StreamAcc* m_pCIDToGIDMap;
539 FX_WORD m_DefaultWidth;
540 FX_WORD* m_pAnsiWidths;
541 FX_SMALL_RECT m_CharBBox[256];
542 CFX_DWordArray m_WidthList;
545 CFX_DWordArray m_VertMetrics;
547 void LoadMetricsArray(CPDF_Array* pArray, CFX_DWordArray& result, int nElements);
548 void LoadSubstFont();
550 FX_BOOL m_bAdobeCourierStd;
551 CFX_CTTGSUBTable* m_pTTGSUBTable;
554 #define PDFCS_DEVICEGRAY 1
555 #define PDFCS_DEVICERGB 2
556 #define PDFCS_DEVICECMYK 3
557 #define PDFCS_CALGRAY 4
558 #define PDFCS_CALRGB 5
560 #define PDFCS_ICCBASED 7
561 #define PDFCS_SEPARATION 8
562 #define PDFCS_DEVICEN 9
563 #define PDFCS_INDEXED 10
564 #define PDFCS_PATTERN 11
566 class CPDF_ColorSpace
570 static CPDF_ColorSpace* GetStockCS(int Family);
572 static CPDF_ColorSpace* Load(CPDF_Document* pDoc, CPDF_Object* pCSObj);
576 int GetBufSize() const;
578 FX_FLOAT* CreateBuf();
580 void GetDefaultColor(FX_FLOAT* buf) const;
582 int CountComponents() const
584 return m_nComponents;
587 int GetFamily() const
592 virtual void GetDefaultValue(int iComponent, FX_FLOAT& value, FX_FLOAT& min, FX_FLOAT& max) const
599 FX_BOOL sRGB() const;
603 virtual FX_BOOL GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const = 0;
605 virtual FX_BOOL SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const
613 FX_BOOL GetCMYK(FX_FLOAT* pBuf, FX_FLOAT& c, FX_FLOAT& m, FX_FLOAT& y, FX_FLOAT& k) const;
615 FX_BOOL SetCMYK(FX_FLOAT* pBuf, FX_FLOAT c, FX_FLOAT m, FX_FLOAT y, FX_FLOAT k) const;
618 virtual void TranslateImageLine(uint8_t* dest_buf, const uint8_t* src_buf, int pixels,
619 int image_width, int image_height, FX_BOOL bTransMask = FALSE) const;
621 CPDF_Array*& GetArray()
626 int GetMaxIndex() const;
628 virtual CPDF_ColorSpace* GetBaseCS() const
633 virtual void EnableStdConversion(FX_BOOL bEnabled);
634 CPDF_Document* m_pDocument;
639 virtual ~CPDF_ColorSpace() {}
640 virtual FX_BOOL v_Load(CPDF_Document* pDoc, CPDF_Array* pArray)
644 virtual FX_BOOL v_GetCMYK(FX_FLOAT* pBuf, FX_FLOAT& c, FX_FLOAT& m, FX_FLOAT& y, FX_FLOAT& k) const
648 virtual FX_BOOL v_SetCMYK(FX_FLOAT* pBuf, FX_FLOAT c, FX_FLOAT m, FX_FLOAT y, FX_FLOAT k) const
657 CPDF_Array* m_pArray;
659 FX_DWORD m_dwStdConversion;
665 CPDF_Color() :m_pCS(NULL), m_pBuffer(NULL)
669 CPDF_Color(int family);
673 FX_BOOL IsNull() const
675 return m_pBuffer == NULL;
678 FX_BOOL IsEqual(const CPDF_Color& other) const;
680 FX_BOOL IsPattern() const
682 return m_pCS && m_pCS->GetFamily() == PDFCS_PATTERN;
685 void Copy(const CPDF_Color* pSrc);
687 void SetColorSpace(CPDF_ColorSpace* pCS);
689 void SetValue(FX_FLOAT* comp);
691 void SetValue(CPDF_Pattern* pPattern, FX_FLOAT* comp, int ncomps);
693 FX_BOOL GetRGB(int& R, int& G, int& B) const;
695 CPDF_Pattern* GetPattern() const;
697 CPDF_ColorSpace* GetPatternCS() const;
699 FX_FLOAT* GetPatternColor() const;
701 CPDF_ColorSpace* m_pCS;
704 void ReleaseBuffer();
705 void ReleaseColorSpace();
708 #define PATTERN_TILING 1
709 #define PATTERN_SHADING 2
714 virtual ~CPDF_Pattern();
715 void SetForceClear(FX_BOOL bForceClear) { m_bForceClear = bForceClear; }
717 CPDF_Object* m_pPatternObj;
721 CFX_AffineMatrix m_Pattern2Form;
722 CFX_AffineMatrix m_ParentMatrix;
724 CPDF_Document* m_pDocument;
727 CPDF_Pattern(const CFX_AffineMatrix* pParentMatrix);
728 FX_BOOL m_bForceClear;
731 class CPDF_TilingPattern : public CPDF_Pattern
735 CPDF_TilingPattern(CPDF_Document* pDoc, CPDF_Object* pPatternObj, const CFX_AffineMatrix* parentMatrix);
737 virtual ~CPDF_TilingPattern();
745 CFX_FloatRect m_BBox;
755 class CPDF_ShadingPattern : public CPDF_Pattern
759 CPDF_ShadingPattern(CPDF_Document* pDoc, CPDF_Object* pPatternObj, FX_BOOL bShading, const CFX_AffineMatrix* parentMatrix);
761 virtual ~CPDF_ShadingPattern();
763 CPDF_Object* m_pShadingObj;
765 FX_BOOL m_bShadingObj;
773 CPDF_ColorSpace* m_pCS; // Still keep m_pCS as some CPDF_ColorSpace (name object) are not managed as counted objects. Refer to CPDF_DocPageData::GetColorSpace.
775 CPDF_CountedColorSpace* m_pCountedCS;
777 CPDF_Function* m_pFunctions[4];
783 struct CPDF_MeshVertex {
787 class CPDF_MeshStream
791 FX_BOOL Load(CPDF_Stream* pShadingStream, CPDF_Function** pFuncs, int nFuncs, CPDF_ColorSpace* pCS);
795 void GetCoords(FX_FLOAT& x, FX_FLOAT& y);
797 void GetColor(FX_FLOAT& r, FX_FLOAT& g, FX_FLOAT& b);
799 FX_DWORD GetVertex(CPDF_MeshVertex& vertex, CFX_AffineMatrix* pObject2Bitmap);
801 FX_BOOL GetVertexRow(CPDF_MeshVertex* vertex, int count, CFX_AffineMatrix* pObject2Bitmap);
802 CPDF_Function** m_pFuncs;
803 CPDF_ColorSpace* m_pCS;
804 FX_DWORD m_nFuncs, m_nCoordBits, m_nCompBits, m_nFlagBits, m_nComps;
805 FX_DWORD m_CoordMax, m_CompMax;
806 FX_FLOAT m_xmin, m_xmax, m_ymin, m_ymax;
807 FX_FLOAT m_ColorMin[8], m_ColorMax[8];
808 CPDF_StreamAcc m_Stream;
809 CFX_BitStream m_BitStream;
811 #define PDF_IMAGE_NO_COMPRESS 0x0000
812 #define PDF_IMAGE_LOSSY_COMPRESS 0x0001
813 #define PDF_IMAGE_LOSSLESS_COMPRESS 0x0002
814 #define PDF_IMAGE_MASK_LOSSY_COMPRESS 0x0004
815 #define PDF_IMAGE_MASK_LOSSLESS_COMPRESS 0x0008
816 class CPDF_ImageSetParam
824 FX_ARGB* pMatteColor;
831 CPDF_Image(CPDF_Document* pDoc);
835 FX_BOOL LoadImageF(CPDF_Stream* pImageStream, FX_BOOL bInline);
846 void SetInlineDict(CPDF_Dictionary* pDict)
848 m_pInlineDict = pDict;
851 CPDF_Dictionary* GetInlineDict() const
853 return m_pInlineDict;
856 CPDF_Stream* GetStream() const
861 CPDF_Dictionary* GetDict() const
863 return m_pStream? m_pStream->GetDict(): NULL;
866 CPDF_Dictionary* GetOC() const
871 CPDF_Document* GetDocument() const
878 int32_t GetPixelHeight() const
883 int32_t GetPixelWidth() const
889 FX_BOOL IsMask() const
894 FX_BOOL IsInterpol() const
896 return m_bInterpolate;
899 CFX_DIBSource* LoadDIBSource(CFX_DIBSource** ppMask = NULL, FX_DWORD* pMatteColor = NULL, FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE) const;
903 void SetImage(const CFX_DIBitmap* pDIBitmap, int32_t iCompress, IFX_FileWrite *pFileWrite = NULL, IFX_FileRead *pFileRead = NULL, const CFX_DIBitmap* pMask = NULL, const CPDF_ImageSetParam* pParam = NULL);
905 void SetJpegImage(uint8_t* pImageData, FX_DWORD size);
907 void SetJpegImage(IFX_FileRead *pFile);
909 void ResetCache(CPDF_Page* pPage, const CFX_DIBitmap* pDIBitmap);
912 FX_BOOL StartLoadDIBSource(CPDF_Dictionary* pFormResource, CPDF_Dictionary* pPageResource, FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE);
913 FX_BOOL Continue(IFX_Pause* pPause);
914 CFX_DIBSource* DetachBitmap();
915 CFX_DIBSource* DetachMask();
916 CFX_DIBSource* m_pDIBSource;
917 CFX_DIBSource* m_pMask;
918 FX_DWORD m_MatteColor;
921 CPDF_Stream* m_pStream;
923 CPDF_Dictionary* m_pInlineDict;
931 FX_BOOL m_bInterpolate;
933 CPDF_Document* m_pDocument;
935 CPDF_Dictionary* m_pOC;
936 CPDF_Dictionary* InitJPEG(uint8_t* pData, FX_DWORD size);
939 #endif // CORE_INCLUDE_FPDFAPI_FPDF_RESOURCE_H_