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 using CPDF_CountedColorSpace = CPDF_CountedObject<CPDF_ColorSpace*>;
47 using CPDF_CountedPattern = CPDF_CountedObject<CPDF_Pattern*>;
49 #define PDFFONT_TYPE1 1
50 #define PDFFONT_TRUETYPE 2
51 #define PDFFONT_TYPE3 3
52 #define PDFFONT_CIDFONT 4
53 #define PDFFONT_FIXEDPITCH 1
54 #define PDFFONT_SERIF 2
55 #define PDFFONT_SYMBOLIC 4
56 #define PDFFONT_SCRIPT 8
57 #define PDFFONT_NONSYMBOLIC 32
58 #define PDFFONT_ITALIC 64
59 #define PDFFONT_ALLCAP 0x10000
60 #define PDFFONT_SMALLCAP 0x20000
61 #define PDFFONT_FORCEBOLD 0x40000
62 #define PDFFONT_USEEXTERNATTR 0x80000
63 FX_WCHAR PDF_UnicodeFromAdobeName(const FX_CHAR* name);
64 CFX_ByteString PDF_AdobeNameFromUnicode(FX_WCHAR unicode);
68 static CPDF_Font* CreateFontF(CPDF_Document* pDoc, CPDF_Dictionary* pFontDict);
69 static CPDF_Font* GetStockFont(CPDF_Document* pDoc, const CFX_ByteStringC& fontname);
73 bool IsFontType(int fonttype) const { return fonttype == m_FontType; }
74 int GetFontType() const { return m_FontType; }
76 CFX_ByteString GetFontTypeName() const;
78 const CFX_ByteString& GetBaseFont() const
83 const CFX_SubstFont* GetSubstFont() const
85 return m_Font.GetSubstFont();
88 FX_DWORD GetFlags() const
93 virtual FX_BOOL IsVertWriting()const;
98 CPDF_Type1Font* GetType1Font() const
100 return m_FontType == PDFFONT_TYPE1 ? (CPDF_Type1Font*)(void*)this : NULL;
103 CPDF_TrueTypeFont* GetTrueTypeFont() const
105 return m_FontType == PDFFONT_TRUETYPE ? (CPDF_TrueTypeFont*)(void*)this : NULL;
108 CPDF_CIDFont* GetCIDFont() const
110 return (m_FontType == PDFFONT_CIDFONT) ? (CPDF_CIDFont*)(void*)this : NULL;
113 CPDF_Type3Font* GetType3Font() const
115 return (m_FontType == PDFFONT_TYPE3) ? (CPDF_Type3Font*)(void*)this : NULL;
119 FX_BOOL IsEmbedded() const
121 return m_FontType == PDFFONT_TYPE3 || m_pFontFile != NULL;
124 virtual FX_BOOL IsUnicodeCompatible() const
129 CPDF_StreamAcc* GetFontFile() const
134 CPDF_Dictionary* GetFontDict() const
139 FX_BOOL IsStandardFont() const;
141 FXFT_Face GetFace() const
143 return m_Font.GetFace();
146 virtual FX_DWORD GetNextChar(const FX_CHAR* pString, int nStrLen, int& offset) const
148 if (offset < 0 || nStrLen < 1) {
151 uint8_t ch = offset < nStrLen ? pString[offset++] : pString[nStrLen-1];
152 return static_cast<FX_DWORD>(ch);
155 virtual int CountChar(const FX_CHAR* pString, int size) const
160 void AppendChar(CFX_ByteString& str, FX_DWORD charcode) const;
162 virtual int AppendChar(FX_CHAR* buf, FX_DWORD charcode) const
164 *buf = (FX_CHAR)charcode;
168 virtual int GetCharSize(FX_DWORD charcode) const
176 virtual int GlyphFromCharCode(FX_DWORD charcode, FX_BOOL *pVertGlyph = NULL) = 0;
177 virtual int GlyphFromCharCodeExt(FX_DWORD charcode)
179 return GlyphFromCharCode(charcode);
182 CFX_WideString UnicodeFromCharCode(FX_DWORD charcode) const;
184 FX_DWORD CharCodeFromUnicode(FX_WCHAR Unicode) const;
186 CFX_CharMap* GetCharMap()
191 CFX_ByteString EncodeString(const CFX_WideString& str) const;
193 CFX_WideString DecodeString(const CFX_ByteString& str) const;
198 void GetFontBBox(FX_RECT& rect) const
203 int GetTypeAscent() const
208 int GetTypeDescent() const
213 int GetItalicAngle() const
215 return m_ItalicAngle;
223 int GetStringWidth(const FX_CHAR* pString, int size);
225 virtual int GetCharWidthF(FX_DWORD charcode, int level = 0) = 0;
227 virtual int GetCharTypeWidth(FX_DWORD charcode);
229 virtual void GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level = 0) = 0;
233 CPDF_Document* m_pDocument;
235 class CFX_PathData* LoadGlyphPath(FX_DWORD charcode, int dest_width = 0);
240 explicit CPDF_Font(int fonttype);
242 FX_BOOL Initialize();
246 virtual FX_BOOL _Load() = 0;
248 virtual FX_WCHAR _UnicodeFromCharCode(FX_DWORD charcode) const = 0;
250 virtual FX_DWORD _CharCodeFromUnicode(FX_WCHAR Unicode) const = 0;
252 void LoadUnicodeMap();
254 void LoadPDFEncoding(CPDF_Object* pEncoding, int& iBaseEncoding,
255 CFX_ByteString*& pCharNames, FX_BOOL bEmbedded, FX_BOOL bTrueType);
257 void LoadFontDescriptor(CPDF_Dictionary*);
259 void LoadCharWidths(FX_WORD* pWidths);
261 void CheckFontMetrics();
263 CFX_CharMap* m_pCharMap;
267 CFX_ByteString m_BaseFont;
269 CPDF_StreamAcc* m_pFontFile;
271 CPDF_Dictionary* m_pFontDict;
273 CPDF_ToUnicodeMap* m_pToUnicodeMap;
275 FX_BOOL m_bToUnicodeLoaded;
293 const int m_FontType;
295 #define PDFFONT_ENCODING_BUILTIN 0
296 #define PDFFONT_ENCODING_WINANSI 1
297 #define PDFFONT_ENCODING_MACROMAN 2
298 #define PDFFONT_ENCODING_MACEXPERT 3
299 #define PDFFONT_ENCODING_STANDARD 4
300 #define PDFFONT_ENCODING_ADOBE_SYMBOL 5
301 #define PDFFONT_ENCODING_ZAPFDINGBATS 6
302 #define PDFFONT_ENCODING_PDFDOC 7
303 #define PDFFONT_ENCODING_MS_SYMBOL 8
304 #define PDFFONT_ENCODING_UNICODE 9
305 class CPDF_FontEncoding
311 CPDF_FontEncoding(int PredefinedEncoding);
313 void LoadEncoding(CPDF_Object* pEncoding);
315 FX_BOOL IsIdentical(CPDF_FontEncoding* pAnother) const;
317 FX_WCHAR UnicodeFromCharCode(uint8_t charcode) const
319 return m_Unicodes[charcode];
322 int CharCodeFromUnicode(FX_WCHAR unicode) const;
324 void SetUnicode(uint8_t charcode, FX_WCHAR unicode)
326 m_Unicodes[charcode] = unicode;
329 CPDF_Object* Realize();
332 FX_WCHAR m_Unicodes[256];
334 class CPDF_SimpleFont : public CPDF_Font
337 explicit CPDF_SimpleFont(int fonttype);
338 ~CPDF_SimpleFont() override;
340 CPDF_FontEncoding* GetEncoding()
344 virtual int GetCharWidthF(FX_DWORD charcode, int level = 0);
345 virtual void GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level = 0);
346 virtual int GlyphFromCharCode(FX_DWORD charcode, FX_BOOL *pVertGlyph = NULL);
347 virtual FX_BOOL IsUnicodeCompatible() const;
350 FX_BOOL LoadCommon();
352 void LoadSubstFont();
354 void LoadFaceMetrics();
356 virtual void LoadGlyphMap() = 0;
357 virtual FX_WCHAR _UnicodeFromCharCode(FX_DWORD charcode) const
359 return m_Encoding.UnicodeFromCharCode((uint8_t)charcode);
361 virtual FX_DWORD _CharCodeFromUnicode(FX_WCHAR Unicode) const
363 return m_Encoding.CharCodeFromUnicode(Unicode);
368 CPDF_FontEncoding m_Encoding;
370 FX_WORD m_GlyphIndex[256];
371 FX_WORD m_ExtGID[256];
376 CFX_ByteString* m_pCharNames;
383 FX_WORD m_CharWidth[256];
385 FX_SMALL_RECT m_CharBBox[256];
387 FX_BOOL m_bUseFontWidth;
389 void LoadCharMetrics(int charcode);
392 class CPDF_Type1Font : public CPDF_SimpleFont
402 virtual int GlyphFromCharCodeExt(FX_DWORD charcode);
404 virtual FX_BOOL _Load();
407 virtual void LoadGlyphMap();
409 class CPDF_TrueTypeFont : public CPDF_SimpleFont
415 virtual FX_BOOL _Load();
416 virtual void LoadGlyphMap();
426 FX_BOOL LoadBitmap(CPDF_RenderContext* pContext);
430 FX_BOOL m_bPageRequired;
436 CFX_AffineMatrix m_ImageMatrix;
438 CFX_DIBitmap* m_pBitmap;
445 class CPDF_Type3Font : public CPDF_SimpleFont
449 ~CPDF_Type3Font() override;
450 void SetPageResources(CPDF_Dictionary* pResources)
452 m_pPageResources = pResources;
454 CPDF_Type3Char* LoadChar(FX_DWORD charcode, int level = 0);
455 virtual int GetCharWidthF(FX_DWORD charcode, int level = 0);
456 virtual int GetCharTypeWidth(FX_DWORD charcode)
458 return GetCharWidthF(charcode);
460 virtual void GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level = 0);
461 CFX_AffineMatrix& GetFontMatrix()
465 void CheckType3FontMetrics();
467 virtual FX_BOOL _Load();
468 virtual void LoadGlyphMap() {}
469 int m_CharWidthL[256];
470 CPDF_Dictionary* m_pCharProcs;
471 CPDF_Dictionary* m_pPageResources;
472 CPDF_Dictionary* m_pFontResources;
473 CFX_MapPtrToPtr m_CacheMap;
474 CFX_MapPtrToPtr m_DeletedMap;
476 CFX_AffineMatrix m_FontMatrix;
478 #define CIDSET_UNKNOWN 0
480 #define CIDSET_CNS1 2
481 #define CIDSET_JAPAN1 3
482 #define CIDSET_KOREA1 4
483 #define CIDSET_UNICODE 5
484 #define NUMBER_OF_CIDSETS 6
486 class CPDF_CIDFont : public CPDF_Font
492 virtual ~CPDF_CIDFont();
494 FX_BOOL LoadGB2312();
495 virtual int GlyphFromCharCode(FX_DWORD charcode, FX_BOOL *pVertGlyph = NULL);
496 virtual int GetCharWidthF(FX_DWORD charcode, int level = 0);
497 virtual void GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level = 0);
498 FX_WORD CIDFromCharCode(FX_DWORD charcode) const;
505 virtual FX_DWORD GetNextChar(const FX_CHAR* pString, int nStrLen, int& offset) const override;
506 virtual int CountChar(const FX_CHAR* pString, int size) const;
507 virtual int AppendChar(FX_CHAR* str, FX_DWORD charcode) const;
508 virtual int GetCharSize(FX_DWORD charcode) const;
510 int GetCharset() const
515 const uint8_t* GetCIDTransform(FX_WORD CID) const;
516 virtual FX_BOOL IsVertWriting() const;
517 short GetVertWidth(FX_WORD CID) const;
518 void GetVertOrigin(FX_WORD CID, short& vx, short& vy) const;
519 virtual FX_BOOL IsUnicodeCompatible() const;
520 virtual FX_BOOL IsFontStyleFromCharCode(FX_DWORD charcode) const;
523 friend class CPDF_Font;
524 virtual FX_BOOL _Load();
525 virtual FX_WCHAR _UnicodeFromCharCode(FX_DWORD charcode) const;
526 virtual FX_DWORD _CharCodeFromUnicode(FX_WCHAR Unicode) const;
527 int GetGlyphIndex(FX_DWORD unicodeb, FX_BOOL *pVertGlyph);
530 CPDF_CMap* m_pAllocatedCMap;
531 CPDF_CID2UnicodeMap* m_pCID2UnicodeMap;
534 CPDF_StreamAcc* m_pCIDToGIDMap;
536 FX_WORD m_DefaultWidth;
537 FX_WORD* m_pAnsiWidths;
538 FX_SMALL_RECT m_CharBBox[256];
539 CFX_DWordArray m_WidthList;
542 CFX_DWordArray m_VertMetrics;
544 void LoadMetricsArray(CPDF_Array* pArray, CFX_DWordArray& result, int nElements);
545 void LoadSubstFont();
547 FX_BOOL m_bAdobeCourierStd;
548 CFX_CTTGSUBTable* m_pTTGSUBTable;
551 #define PDFCS_DEVICEGRAY 1
552 #define PDFCS_DEVICERGB 2
553 #define PDFCS_DEVICECMYK 3
554 #define PDFCS_CALGRAY 4
555 #define PDFCS_CALRGB 5
557 #define PDFCS_ICCBASED 7
558 #define PDFCS_SEPARATION 8
559 #define PDFCS_DEVICEN 9
560 #define PDFCS_INDEXED 10
561 #define PDFCS_PATTERN 11
563 class CPDF_ColorSpace
567 static CPDF_ColorSpace* GetStockCS(int Family);
569 static CPDF_ColorSpace* Load(CPDF_Document* pDoc, CPDF_Object* pCSObj);
573 int GetBufSize() const;
575 FX_FLOAT* CreateBuf();
577 void GetDefaultColor(FX_FLOAT* buf) const;
579 int CountComponents() const
581 return m_nComponents;
584 int GetFamily() const
589 virtual void GetDefaultValue(int iComponent, FX_FLOAT& value, FX_FLOAT& min, FX_FLOAT& max) const
596 FX_BOOL sRGB() const;
600 virtual FX_BOOL GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const = 0;
602 virtual FX_BOOL SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const
610 FX_BOOL GetCMYK(FX_FLOAT* pBuf, FX_FLOAT& c, FX_FLOAT& m, FX_FLOAT& y, FX_FLOAT& k) const;
612 FX_BOOL SetCMYK(FX_FLOAT* pBuf, FX_FLOAT c, FX_FLOAT m, FX_FLOAT y, FX_FLOAT k) const;
615 virtual void TranslateImageLine(uint8_t* dest_buf, const uint8_t* src_buf, int pixels,
616 int image_width, int image_height, FX_BOOL bTransMask = FALSE) const;
618 CPDF_Array*& GetArray()
623 int GetMaxIndex() const;
625 virtual CPDF_ColorSpace* GetBaseCS() const
630 virtual void EnableStdConversion(FX_BOOL bEnabled);
631 CPDF_Document* m_pDocument;
636 virtual ~CPDF_ColorSpace() {}
637 virtual FX_BOOL v_Load(CPDF_Document* pDoc, CPDF_Array* pArray)
641 virtual FX_BOOL v_GetCMYK(FX_FLOAT* pBuf, FX_FLOAT& c, FX_FLOAT& m, FX_FLOAT& y, FX_FLOAT& k) const
645 virtual FX_BOOL v_SetCMYK(FX_FLOAT* pBuf, FX_FLOAT c, FX_FLOAT m, FX_FLOAT y, FX_FLOAT k) const
654 CPDF_Array* m_pArray;
656 FX_DWORD m_dwStdConversion;
662 CPDF_Color() :m_pCS(NULL), m_pBuffer(NULL)
666 CPDF_Color(int family);
670 FX_BOOL IsNull() const
672 return m_pBuffer == NULL;
675 FX_BOOL IsEqual(const CPDF_Color& other) const;
677 FX_BOOL IsPattern() const
679 return m_pCS && m_pCS->GetFamily() == PDFCS_PATTERN;
682 void Copy(const CPDF_Color* pSrc);
684 void SetColorSpace(CPDF_ColorSpace* pCS);
686 void SetValue(FX_FLOAT* comp);
688 void SetValue(CPDF_Pattern* pPattern, FX_FLOAT* comp, int ncomps);
690 FX_BOOL GetRGB(int& R, int& G, int& B) const;
692 CPDF_Pattern* GetPattern() const;
694 CPDF_ColorSpace* GetPatternCS() const;
696 FX_FLOAT* GetPatternColor() const;
698 CPDF_ColorSpace* m_pCS;
701 void ReleaseBuffer();
702 void ReleaseColorSpace();
705 #define PATTERN_TILING 1
706 #define PATTERN_SHADING 2
711 virtual ~CPDF_Pattern();
712 void SetForceClear(FX_BOOL bForceClear) { m_bForceClear = bForceClear; }
714 CPDF_Object* m_pPatternObj;
718 CFX_AffineMatrix m_Pattern2Form;
719 CFX_AffineMatrix m_ParentMatrix;
721 CPDF_Document* m_pDocument;
724 CPDF_Pattern(const CFX_AffineMatrix* pParentMatrix);
725 FX_BOOL m_bForceClear;
728 class CPDF_TilingPattern : public CPDF_Pattern
732 CPDF_TilingPattern(CPDF_Document* pDoc, CPDF_Object* pPatternObj, const CFX_AffineMatrix* parentMatrix);
734 virtual ~CPDF_TilingPattern();
742 CFX_FloatRect m_BBox;
752 class CPDF_ShadingPattern : public CPDF_Pattern
756 CPDF_ShadingPattern(CPDF_Document* pDoc, CPDF_Object* pPatternObj, FX_BOOL bShading, const CFX_AffineMatrix* parentMatrix);
758 virtual ~CPDF_ShadingPattern();
760 CPDF_Object* m_pShadingObj;
762 FX_BOOL m_bShadingObj;
770 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.
772 CPDF_CountedColorSpace* m_pCountedCS;
774 CPDF_Function* m_pFunctions[4];
780 struct CPDF_MeshVertex {
784 class CPDF_MeshStream
788 FX_BOOL Load(CPDF_Stream* pShadingStream, CPDF_Function** pFuncs, int nFuncs, CPDF_ColorSpace* pCS);
792 void GetCoords(FX_FLOAT& x, FX_FLOAT& y);
794 void GetColor(FX_FLOAT& r, FX_FLOAT& g, FX_FLOAT& b);
796 FX_DWORD GetVertex(CPDF_MeshVertex& vertex, CFX_AffineMatrix* pObject2Bitmap);
798 FX_BOOL GetVertexRow(CPDF_MeshVertex* vertex, int count, CFX_AffineMatrix* pObject2Bitmap);
799 CPDF_Function** m_pFuncs;
800 CPDF_ColorSpace* m_pCS;
801 FX_DWORD m_nFuncs, m_nCoordBits, m_nCompBits, m_nFlagBits, m_nComps;
802 FX_DWORD m_CoordMax, m_CompMax;
803 FX_FLOAT m_xmin, m_xmax, m_ymin, m_ymax;
804 FX_FLOAT m_ColorMin[8], m_ColorMax[8];
805 CPDF_StreamAcc m_Stream;
806 CFX_BitStream m_BitStream;
808 #define PDF_IMAGE_NO_COMPRESS 0x0000
809 #define PDF_IMAGE_LOSSY_COMPRESS 0x0001
810 #define PDF_IMAGE_LOSSLESS_COMPRESS 0x0002
811 #define PDF_IMAGE_MASK_LOSSY_COMPRESS 0x0004
812 #define PDF_IMAGE_MASK_LOSSLESS_COMPRESS 0x0008
813 class CPDF_ImageSetParam
821 FX_ARGB* pMatteColor;
828 CPDF_Image(CPDF_Document* pDoc);
832 FX_BOOL LoadImageF(CPDF_Stream* pImageStream, FX_BOOL bInline);
843 void SetInlineDict(CPDF_Dictionary* pDict)
845 m_pInlineDict = pDict;
848 CPDF_Dictionary* GetInlineDict() const
850 return m_pInlineDict;
853 CPDF_Stream* GetStream() const
858 CPDF_Dictionary* GetDict() const
860 return m_pStream? m_pStream->GetDict(): NULL;
863 CPDF_Dictionary* GetOC() const
868 CPDF_Document* GetDocument() const
875 int32_t GetPixelHeight() const
880 int32_t GetPixelWidth() const
886 FX_BOOL IsMask() const
891 FX_BOOL IsInterpol() const
893 return m_bInterpolate;
896 CFX_DIBSource* LoadDIBSource(CFX_DIBSource** ppMask = NULL, FX_DWORD* pMatteColor = NULL, FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE) const;
900 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);
902 void SetJpegImage(uint8_t* pImageData, FX_DWORD size);
904 void SetJpegImage(IFX_FileRead *pFile);
906 void ResetCache(CPDF_Page* pPage, const CFX_DIBitmap* pDIBitmap);
909 FX_BOOL StartLoadDIBSource(CPDF_Dictionary* pFormResource, CPDF_Dictionary* pPageResource, FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE);
910 FX_BOOL Continue(IFX_Pause* pPause);
911 CFX_DIBSource* DetachBitmap();
912 CFX_DIBSource* DetachMask();
913 CFX_DIBSource* m_pDIBSource;
914 CFX_DIBSource* m_pMask;
915 FX_DWORD m_MatteColor;
918 CPDF_Stream* m_pStream;
920 CPDF_Dictionary* m_pInlineDict;
928 FX_BOOL m_bInterpolate;
930 CPDF_Document* m_pDocument;
932 CPDF_Dictionary* m_pOC;
933 CPDF_Dictionary* InitJPEG(uint8_t* pData, FX_DWORD size);
936 #endif // CORE_INCLUDE_FPDFAPI_FPDF_RESOURCE_H_