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_Pattern*> CPDF_CountedPattern;
47 typedef CPDF_CountedObject<CPDF_Image*> CPDF_CountedImage;
48 typedef CPDF_CountedObject<CPDF_IccProfile*> CPDF_CountedICCProfile;
49 typedef CPDF_CountedObject<CPDF_StreamAcc*> CPDF_CountedStreamAcc;
50 using CPDF_CountedColorSpace = CPDF_CountedObject<CPDF_ColorSpace*>;
53 typedef CFX_MapPtrTemplate<CPDF_Object*, CPDF_CountedPattern*> CPDF_PatternMap;
54 typedef CFX_MapPtrTemplate<FX_DWORD, CPDF_CountedImage*> CPDF_ImageMap;
55 typedef CFX_MapPtrTemplate<CPDF_Stream*, CPDF_CountedICCProfile*> CPDF_IccProfileMap;
56 typedef CFX_MapPtrTemplate<CPDF_Stream*, CPDF_CountedStreamAcc*> CPDF_FontFileMap;
58 #define PDFFONT_TYPE1 1
59 #define PDFFONT_TRUETYPE 2
60 #define PDFFONT_TYPE3 3
61 #define PDFFONT_CIDFONT 4
62 #define PDFFONT_FIXEDPITCH 1
63 #define PDFFONT_SERIF 2
64 #define PDFFONT_SYMBOLIC 4
65 #define PDFFONT_SCRIPT 8
66 #define PDFFONT_NONSYMBOLIC 32
67 #define PDFFONT_ITALIC 64
68 #define PDFFONT_ALLCAP 0x10000
69 #define PDFFONT_SMALLCAP 0x20000
70 #define PDFFONT_FORCEBOLD 0x40000
71 #define PDFFONT_USEEXTERNATTR 0x80000
72 FX_WCHAR PDF_UnicodeFromAdobeName(const FX_CHAR* name);
73 CFX_ByteString PDF_AdobeNameFromUnicode(FX_WCHAR unicode);
77 static CPDF_Font* CreateFontF(CPDF_Document* pDoc, CPDF_Dictionary* pFontDict);
78 static CPDF_Font* GetStockFont(CPDF_Document* pDoc, const CFX_ByteStringC& fontname);
82 bool IsFontType(int fonttype) const { return fonttype == m_FontType; }
83 int GetFontType() const { return m_FontType; }
85 CFX_ByteString GetFontTypeName() const;
87 const CFX_ByteString& GetBaseFont() const
92 const CFX_SubstFont* GetSubstFont() const
94 return m_Font.GetSubstFont();
97 FX_DWORD GetFlags() const
102 virtual FX_BOOL IsVertWriting()const;
107 CPDF_Type1Font* GetType1Font() const
109 return m_FontType == PDFFONT_TYPE1 ? (CPDF_Type1Font*)(void*)this : NULL;
112 CPDF_TrueTypeFont* GetTrueTypeFont() const
114 return m_FontType == PDFFONT_TRUETYPE ? (CPDF_TrueTypeFont*)(void*)this : NULL;
117 CPDF_CIDFont* GetCIDFont() const
119 return (m_FontType == PDFFONT_CIDFONT) ? (CPDF_CIDFont*)(void*)this : NULL;
122 CPDF_Type3Font* GetType3Font() const
124 return (m_FontType == PDFFONT_TYPE3) ? (CPDF_Type3Font*)(void*)this : NULL;
128 FX_BOOL IsEmbedded() const
130 return m_FontType == PDFFONT_TYPE3 || m_pFontFile != NULL;
133 virtual FX_BOOL IsUnicodeCompatible() const
138 CPDF_StreamAcc* GetFontFile() const
143 CPDF_Dictionary* GetFontDict() const
148 FX_BOOL IsStandardFont() const;
150 FXFT_Face GetFace() const
152 return m_Font.GetFace();
155 virtual FX_DWORD GetNextChar(const FX_CHAR* pString, int nStrLen, int& offset) const
157 if (offset < 0 || nStrLen < 1) {
160 uint8_t ch = offset < nStrLen ? pString[offset++] : pString[nStrLen-1];
161 return static_cast<FX_DWORD>(ch);
164 virtual int CountChar(const FX_CHAR* pString, int size) const
169 void AppendChar(CFX_ByteString& str, FX_DWORD charcode) const;
171 virtual int AppendChar(FX_CHAR* buf, FX_DWORD charcode) const
173 *buf = (FX_CHAR)charcode;
177 virtual int GetCharSize(FX_DWORD charcode) const
185 virtual int GlyphFromCharCode(FX_DWORD charcode, FX_BOOL *pVertGlyph = NULL) = 0;
186 virtual int GlyphFromCharCodeExt(FX_DWORD charcode)
188 return GlyphFromCharCode(charcode);
191 CFX_WideString UnicodeFromCharCode(FX_DWORD charcode) const;
193 FX_DWORD CharCodeFromUnicode(FX_WCHAR Unicode) const;
195 CFX_CharMap* GetCharMap()
200 CFX_ByteString EncodeString(const CFX_WideString& str) const;
202 CFX_WideString DecodeString(const CFX_ByteString& str) const;
207 void GetFontBBox(FX_RECT& rect) const
212 int GetTypeAscent() const
217 int GetTypeDescent() const
222 int GetItalicAngle() const
224 return m_ItalicAngle;
232 int GetStringWidth(const FX_CHAR* pString, int size);
234 virtual int GetCharWidthF(FX_DWORD charcode, int level = 0) = 0;
236 virtual int GetCharTypeWidth(FX_DWORD charcode);
238 virtual void GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level = 0) = 0;
242 CPDF_Document* m_pDocument;
244 class CFX_PathData* LoadGlyphPath(FX_DWORD charcode, int dest_width = 0);
249 explicit CPDF_Font(int fonttype);
251 FX_BOOL Initialize();
255 virtual FX_BOOL _Load() = 0;
257 virtual FX_WCHAR _UnicodeFromCharCode(FX_DWORD charcode) const = 0;
259 virtual FX_DWORD _CharCodeFromUnicode(FX_WCHAR Unicode) const = 0;
261 void LoadUnicodeMap();
263 void LoadPDFEncoding(CPDF_Object* pEncoding, int& iBaseEncoding,
264 CFX_ByteString*& pCharNames, FX_BOOL bEmbedded, FX_BOOL bTrueType);
266 void LoadFontDescriptor(CPDF_Dictionary*);
268 void LoadCharWidths(FX_WORD* pWidths);
270 void CheckFontMetrics();
272 CFX_CharMap* m_pCharMap;
276 CFX_ByteString m_BaseFont;
278 CPDF_StreamAcc* m_pFontFile;
280 CPDF_Dictionary* m_pFontDict;
282 CPDF_ToUnicodeMap* m_pToUnicodeMap;
284 FX_BOOL m_bToUnicodeLoaded;
302 const int m_FontType;
304 #define PDFFONT_ENCODING_BUILTIN 0
305 #define PDFFONT_ENCODING_WINANSI 1
306 #define PDFFONT_ENCODING_MACROMAN 2
307 #define PDFFONT_ENCODING_MACEXPERT 3
308 #define PDFFONT_ENCODING_STANDARD 4
309 #define PDFFONT_ENCODING_ADOBE_SYMBOL 5
310 #define PDFFONT_ENCODING_ZAPFDINGBATS 6
311 #define PDFFONT_ENCODING_PDFDOC 7
312 #define PDFFONT_ENCODING_MS_SYMBOL 8
313 #define PDFFONT_ENCODING_UNICODE 9
314 class CPDF_FontEncoding
320 CPDF_FontEncoding(int PredefinedEncoding);
322 void LoadEncoding(CPDF_Object* pEncoding);
324 FX_BOOL IsIdentical(CPDF_FontEncoding* pAnother) const;
326 FX_WCHAR UnicodeFromCharCode(uint8_t charcode) const
328 return m_Unicodes[charcode];
331 int CharCodeFromUnicode(FX_WCHAR unicode) const;
333 void SetUnicode(uint8_t charcode, FX_WCHAR unicode)
335 m_Unicodes[charcode] = unicode;
338 CPDF_Object* Realize();
341 FX_WCHAR m_Unicodes[256];
343 class CPDF_SimpleFont : public CPDF_Font
346 explicit CPDF_SimpleFont(int fonttype);
347 ~CPDF_SimpleFont() override;
349 CPDF_FontEncoding* GetEncoding()
353 virtual int GetCharWidthF(FX_DWORD charcode, int level = 0);
354 virtual void GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level = 0);
355 virtual int GlyphFromCharCode(FX_DWORD charcode, FX_BOOL *pVertGlyph = NULL);
356 virtual FX_BOOL IsUnicodeCompatible() const;
359 FX_BOOL LoadCommon();
361 void LoadSubstFont();
363 void LoadFaceMetrics();
365 virtual void LoadGlyphMap() = 0;
366 virtual FX_WCHAR _UnicodeFromCharCode(FX_DWORD charcode) const
368 return m_Encoding.UnicodeFromCharCode((uint8_t)charcode);
370 virtual FX_DWORD _CharCodeFromUnicode(FX_WCHAR Unicode) const
372 return m_Encoding.CharCodeFromUnicode(Unicode);
377 CPDF_FontEncoding m_Encoding;
379 FX_WORD m_GlyphIndex[256];
380 FX_WORD m_ExtGID[256];
385 CFX_ByteString* m_pCharNames;
392 FX_WORD m_CharWidth[256];
394 FX_SMALL_RECT m_CharBBox[256];
396 FX_BOOL m_bUseFontWidth;
398 void LoadCharMetrics(int charcode);
401 class CPDF_Type1Font : public CPDF_SimpleFont
411 virtual int GlyphFromCharCodeExt(FX_DWORD charcode);
413 virtual FX_BOOL _Load();
416 virtual void LoadGlyphMap();
418 class CPDF_TrueTypeFont : public CPDF_SimpleFont
424 virtual FX_BOOL _Load();
425 virtual void LoadGlyphMap();
435 FX_BOOL LoadBitmap(CPDF_RenderContext* pContext);
439 FX_BOOL m_bPageRequired;
445 CFX_AffineMatrix m_ImageMatrix;
447 CFX_DIBitmap* m_pBitmap;
454 class CPDF_Type3Font : public CPDF_SimpleFont
458 ~CPDF_Type3Font() override;
459 void SetPageResources(CPDF_Dictionary* pResources)
461 m_pPageResources = pResources;
463 CPDF_Type3Char* LoadChar(FX_DWORD charcode, int level = 0);
464 virtual int GetCharWidthF(FX_DWORD charcode, int level = 0);
465 virtual int GetCharTypeWidth(FX_DWORD charcode)
467 return GetCharWidthF(charcode);
469 virtual void GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level = 0);
470 CFX_AffineMatrix& GetFontMatrix()
474 void CheckType3FontMetrics();
476 virtual FX_BOOL _Load();
477 virtual void LoadGlyphMap() {}
478 int m_CharWidthL[256];
479 CPDF_Dictionary* m_pCharProcs;
480 CPDF_Dictionary* m_pPageResources;
481 CPDF_Dictionary* m_pFontResources;
482 CFX_MapPtrToPtr m_CacheMap;
483 CFX_MapPtrToPtr m_DeletedMap;
485 CFX_AffineMatrix m_FontMatrix;
487 #define CIDSET_UNKNOWN 0
489 #define CIDSET_CNS1 2
490 #define CIDSET_JAPAN1 3
491 #define CIDSET_KOREA1 4
492 #define CIDSET_UNICODE 5
493 #define NUMBER_OF_CIDSETS 6
495 class CPDF_CIDFont : public CPDF_Font
501 virtual ~CPDF_CIDFont();
503 FX_BOOL LoadGB2312();
504 virtual int GlyphFromCharCode(FX_DWORD charcode, FX_BOOL *pVertGlyph = NULL);
505 virtual int GetCharWidthF(FX_DWORD charcode, int level = 0);
506 virtual void GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level = 0);
507 FX_WORD CIDFromCharCode(FX_DWORD charcode) const;
514 virtual FX_DWORD GetNextChar(const FX_CHAR* pString, int nStrLen, int& offset) const override;
515 virtual int CountChar(const FX_CHAR* pString, int size) const;
516 virtual int AppendChar(FX_CHAR* str, FX_DWORD charcode) const;
517 virtual int GetCharSize(FX_DWORD charcode) const;
519 int GetCharset() const
524 const uint8_t* GetCIDTransform(FX_WORD CID) const;
525 virtual FX_BOOL IsVertWriting() const;
526 short GetVertWidth(FX_WORD CID) const;
527 void GetVertOrigin(FX_WORD CID, short& vx, short& vy) const;
528 virtual FX_BOOL IsUnicodeCompatible() const;
529 virtual FX_BOOL IsFontStyleFromCharCode(FX_DWORD charcode) const;
532 friend class CPDF_Font;
533 virtual FX_BOOL _Load();
534 virtual FX_WCHAR _UnicodeFromCharCode(FX_DWORD charcode) const;
535 virtual FX_DWORD _CharCodeFromUnicode(FX_WCHAR Unicode) const;
536 int GetGlyphIndex(FX_DWORD unicodeb, FX_BOOL *pVertGlyph);
539 CPDF_CMap* m_pAllocatedCMap;
540 CPDF_CID2UnicodeMap* m_pCID2UnicodeMap;
543 CPDF_StreamAcc* m_pCIDToGIDMap;
545 FX_WORD m_DefaultWidth;
546 FX_WORD* m_pAnsiWidths;
547 FX_SMALL_RECT m_CharBBox[256];
548 CFX_DWordArray m_WidthList;
551 CFX_DWordArray m_VertMetrics;
553 void LoadMetricsArray(CPDF_Array* pArray, CFX_DWordArray& result, int nElements);
554 void LoadSubstFont();
556 FX_BOOL m_bAdobeCourierStd;
557 CFX_CTTGSUBTable* m_pTTGSUBTable;
560 #define PDFCS_DEVICEGRAY 1
561 #define PDFCS_DEVICERGB 2
562 #define PDFCS_DEVICECMYK 3
563 #define PDFCS_CALGRAY 4
564 #define PDFCS_CALRGB 5
566 #define PDFCS_ICCBASED 7
567 #define PDFCS_SEPARATION 8
568 #define PDFCS_DEVICEN 9
569 #define PDFCS_INDEXED 10
570 #define PDFCS_PATTERN 11
572 class CPDF_ColorSpace
576 static CPDF_ColorSpace* GetStockCS(int Family);
578 static CPDF_ColorSpace* Load(CPDF_Document* pDoc, CPDF_Object* pCSObj);
582 int GetBufSize() const;
584 FX_FLOAT* CreateBuf();
586 void GetDefaultColor(FX_FLOAT* buf) const;
588 int CountComponents() const
590 return m_nComponents;
593 int GetFamily() const
598 virtual void GetDefaultValue(int iComponent, FX_FLOAT& value, FX_FLOAT& min, FX_FLOAT& max) const
605 FX_BOOL sRGB() const;
609 virtual FX_BOOL GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const = 0;
611 virtual FX_BOOL SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const
619 FX_BOOL GetCMYK(FX_FLOAT* pBuf, FX_FLOAT& c, FX_FLOAT& m, FX_FLOAT& y, FX_FLOAT& k) const;
621 FX_BOOL SetCMYK(FX_FLOAT* pBuf, FX_FLOAT c, FX_FLOAT m, FX_FLOAT y, FX_FLOAT k) const;
624 virtual void TranslateImageLine(uint8_t* dest_buf, const uint8_t* src_buf, int pixels,
625 int image_width, int image_height, FX_BOOL bTransMask = FALSE) const;
627 CPDF_Array*& GetArray()
632 int GetMaxIndex() const;
634 virtual CPDF_ColorSpace* GetBaseCS() const
639 virtual void EnableStdConversion(FX_BOOL bEnabled);
640 CPDF_Document* m_pDocument;
645 virtual ~CPDF_ColorSpace() {}
646 virtual FX_BOOL v_Load(CPDF_Document* pDoc, CPDF_Array* pArray)
650 virtual FX_BOOL v_GetCMYK(FX_FLOAT* pBuf, FX_FLOAT& c, FX_FLOAT& m, FX_FLOAT& y, FX_FLOAT& k) const
654 virtual FX_BOOL v_SetCMYK(FX_FLOAT* pBuf, FX_FLOAT c, FX_FLOAT m, FX_FLOAT y, FX_FLOAT k) const
663 CPDF_Array* m_pArray;
665 FX_DWORD m_dwStdConversion;
671 CPDF_Color() :m_pCS(NULL), m_pBuffer(NULL)
675 CPDF_Color(int family);
679 FX_BOOL IsNull() const
681 return m_pBuffer == NULL;
684 FX_BOOL IsEqual(const CPDF_Color& other) const;
686 FX_BOOL IsPattern() const
688 return m_pCS && m_pCS->GetFamily() == PDFCS_PATTERN;
691 void Copy(const CPDF_Color* pSrc);
693 void SetColorSpace(CPDF_ColorSpace* pCS);
695 void SetValue(FX_FLOAT* comp);
697 void SetValue(CPDF_Pattern* pPattern, FX_FLOAT* comp, int ncomps);
699 FX_BOOL GetRGB(int& R, int& G, int& B) const;
701 CPDF_Pattern* GetPattern() const;
703 CPDF_ColorSpace* GetPatternCS() const;
705 FX_FLOAT* GetPatternColor() const;
707 CPDF_ColorSpace* m_pCS;
710 void ReleaseBuffer();
711 void ReleaseColorSpace();
714 #define PATTERN_TILING 1
715 #define PATTERN_SHADING 2
720 virtual ~CPDF_Pattern();
721 void SetForceClear(FX_BOOL bForceClear) { m_bForceClear = bForceClear; }
723 CPDF_Object* m_pPatternObj;
727 CFX_AffineMatrix m_Pattern2Form;
728 CFX_AffineMatrix m_ParentMatrix;
730 CPDF_Document* m_pDocument;
733 CPDF_Pattern(const CFX_AffineMatrix* pParentMatrix);
734 FX_BOOL m_bForceClear;
737 class CPDF_TilingPattern : public CPDF_Pattern
741 CPDF_TilingPattern(CPDF_Document* pDoc, CPDF_Object* pPatternObj, const CFX_AffineMatrix* parentMatrix);
743 virtual ~CPDF_TilingPattern();
751 CFX_FloatRect m_BBox;
761 class CPDF_ShadingPattern : public CPDF_Pattern
765 CPDF_ShadingPattern(CPDF_Document* pDoc, CPDF_Object* pPatternObj, FX_BOOL bShading, const CFX_AffineMatrix* parentMatrix);
767 virtual ~CPDF_ShadingPattern();
769 CPDF_Object* m_pShadingObj;
771 FX_BOOL m_bShadingObj;
779 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.
781 CPDF_CountedColorSpace* m_pCountedCS;
783 CPDF_Function* m_pFunctions[4];
789 struct CPDF_MeshVertex {
793 class CPDF_MeshStream
797 FX_BOOL Load(CPDF_Stream* pShadingStream, CPDF_Function** pFuncs, int nFuncs, CPDF_ColorSpace* pCS);
801 void GetCoords(FX_FLOAT& x, FX_FLOAT& y);
803 void GetColor(FX_FLOAT& r, FX_FLOAT& g, FX_FLOAT& b);
805 FX_DWORD GetVertex(CPDF_MeshVertex& vertex, CFX_AffineMatrix* pObject2Bitmap);
807 FX_BOOL GetVertexRow(CPDF_MeshVertex* vertex, int count, CFX_AffineMatrix* pObject2Bitmap);
808 CPDF_Function** m_pFuncs;
809 CPDF_ColorSpace* m_pCS;
810 FX_DWORD m_nFuncs, m_nCoordBits, m_nCompBits, m_nFlagBits, m_nComps;
811 FX_DWORD m_CoordMax, m_CompMax;
812 FX_FLOAT m_xmin, m_xmax, m_ymin, m_ymax;
813 FX_FLOAT m_ColorMin[8], m_ColorMax[8];
814 CPDF_StreamAcc m_Stream;
815 CFX_BitStream m_BitStream;
817 #define PDF_IMAGE_NO_COMPRESS 0x0000
818 #define PDF_IMAGE_LOSSY_COMPRESS 0x0001
819 #define PDF_IMAGE_LOSSLESS_COMPRESS 0x0002
820 #define PDF_IMAGE_MASK_LOSSY_COMPRESS 0x0004
821 #define PDF_IMAGE_MASK_LOSSLESS_COMPRESS 0x0008
822 class CPDF_ImageSetParam
830 FX_ARGB* pMatteColor;
837 CPDF_Image(CPDF_Document* pDoc);
841 FX_BOOL LoadImageF(CPDF_Stream* pImageStream, FX_BOOL bInline);
852 void SetInlineDict(CPDF_Dictionary* pDict)
854 m_pInlineDict = pDict;
857 CPDF_Dictionary* GetInlineDict() const
859 return m_pInlineDict;
862 CPDF_Stream* GetStream() const
867 CPDF_Dictionary* GetDict() const
869 return m_pStream? m_pStream->GetDict(): NULL;
872 CPDF_Dictionary* GetOC() const
877 CPDF_Document* GetDocument() const
884 int32_t GetPixelHeight() const
889 int32_t GetPixelWidth() const
895 FX_BOOL IsMask() const
900 FX_BOOL IsInterpol() const
902 return m_bInterpolate;
905 CFX_DIBSource* LoadDIBSource(CFX_DIBSource** ppMask = NULL, FX_DWORD* pMatteColor = NULL, FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE) const;
909 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);
911 void SetJpegImage(uint8_t* pImageData, FX_DWORD size);
913 void SetJpegImage(IFX_FileRead *pFile);
915 void ResetCache(CPDF_Page* pPage, const CFX_DIBitmap* pDIBitmap);
918 FX_BOOL StartLoadDIBSource(CPDF_Dictionary* pFormResource, CPDF_Dictionary* pPageResource, FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE);
919 FX_BOOL Continue(IFX_Pause* pPause);
920 CFX_DIBSource* DetachBitmap();
921 CFX_DIBSource* DetachMask();
922 CFX_DIBSource* m_pDIBSource;
923 CFX_DIBSource* m_pMask;
924 FX_DWORD m_MatteColor;
927 CPDF_Stream* m_pStream;
929 CPDF_Dictionary* m_pInlineDict;
937 FX_BOOL m_bInterpolate;
939 CPDF_Document* m_pDocument;
941 CPDF_Dictionary* m_pOC;
942 CPDF_Dictionary* InitJPEG(uint8_t* pData, FX_DWORD size);
945 #endif // CORE_INCLUDE_FPDFAPI_FPDF_RESOURCE_H_