• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.
4 
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 
7 #ifndef CORE_INCLUDE_FPDFAPI_FPDF_RESOURCE_H_
8 #define CORE_INCLUDE_FPDFAPI_FPDF_RESOURCE_H_
9 
10 #include <map>
11 
12 #include "core/include/fxcrt/fx_system.h"
13 #include "core/include/fxge/fx_font.h"
14 #include "fpdf_parser.h"
15 
16 class CFX_CTTGSUBTable;
17 class CFX_DIBitmap;
18 class CFX_Font;
19 class CFX_SubstFont;
20 class CPDF_CID2UnicodeMap;
21 class CPDF_CIDFont;
22 class CPDF_CMap;
23 class CPDF_Color;
24 class CPDF_ColorSpace;
25 class CPDF_Face;
26 class CPDF_FontEncoding;
27 class CPDF_Form;
28 class CPDF_Function;
29 class CPDF_Image;
30 class CPDF_ImageObject;
31 class CPDF_Page;
32 class CPDF_Pattern;
33 class CPDF_RenderContext;
34 class CPDF_ShadingPattern;
35 class CPDF_TilingPattern;
36 class CPDF_ToUnicodeMap;
37 class CPDF_TrueTypeFont;
38 class CPDF_Type1Font;
39 class CPDF_Type3Font;
40 typedef struct FT_FaceRec_* FXFT_Face;
41 
42 FX_WCHAR PDF_UnicodeFromAdobeName(const FX_CHAR* name);
43 CFX_ByteString PDF_AdobeNameFromUnicode(FX_WCHAR unicode);
44 const FX_CHAR* FCS_GetAltStr(FX_WCHAR unicode);
45 const FX_CHAR* PDF_CharNameFromPredefinedCharSet(int encoding,
46                                                  uint8_t charcode);
47 
48 FX_WCHAR FT_UnicodeFromCharCode(int encoding, FX_DWORD charcode);
49 FX_DWORD FT_CharCodeFromUnicode(int encoding, FX_WCHAR unicode);
50 const FX_WORD* PDF_UnicodesForPredefinedCharSet(int encoding);
51 const FX_CHAR* GetAdobeCharName(int iBaseEncoding,
52                                 const CFX_ByteString* pCharNames,
53                                 int charcode);
54 
55 template <class T>
56 class CPDF_CountedObject {
57  public:
CPDF_CountedObject(T * ptr)58   explicit CPDF_CountedObject(T* ptr) : m_nCount(1), m_pObj(ptr) {}
reset(T * ptr)59   void reset(T* ptr) {  // CAUTION: tosses prior ref counts.
60     m_nCount = 1;
61     m_pObj = ptr;
62   }
clear()63   void clear() {  // Now you're all weak ptrs ...
64     delete m_pObj;
65     m_pObj = nullptr;
66   }
get()67   T* get() const { return m_pObj; }
AddRef()68   T* AddRef() {
69     FXSYS_assert(m_pObj);
70     ++m_nCount;
71     return m_pObj;
72   }
RemoveRef()73   void RemoveRef() {
74     if (m_nCount)
75       --m_nCount;
76   }
use_count()77   size_t use_count() const { return m_nCount; }
78 
79  protected:
80   size_t m_nCount;
81   T* m_pObj;
82 };
83 using CPDF_CountedColorSpace = CPDF_CountedObject<CPDF_ColorSpace>;
84 using CPDF_CountedPattern = CPDF_CountedObject<CPDF_Pattern>;
85 #define PDFFONT_TYPE1 1
86 #define PDFFONT_TRUETYPE 2
87 #define PDFFONT_TYPE3 3
88 #define PDFFONT_CIDFONT 4
89 #define PDFFONT_FIXEDPITCH 1
90 #define PDFFONT_SERIF 2
91 #define PDFFONT_SYMBOLIC 4
92 #define PDFFONT_SCRIPT 8
93 #define PDFFONT_NONSYMBOLIC 32
94 #define PDFFONT_ITALIC 64
95 #define PDFFONT_ALLCAP 0x10000
96 #define PDFFONT_SMALLCAP 0x20000
97 #define PDFFONT_FORCEBOLD 0x40000
98 #define PDFFONT_USEEXTERNATTR 0x80000
99 class CPDF_Font {
100  public:
101   static CPDF_Font* CreateFontF(CPDF_Document* pDoc,
102                                 CPDF_Dictionary* pFontDict);
103   static CPDF_Font* GetStockFont(CPDF_Document* pDoc,
104                                  const CFX_ByteStringC& fontname);
105   static const FX_DWORD kInvalidCharCode = static_cast<FX_DWORD>(-1);
106 
107   virtual ~CPDF_Font();
108 
IsFontType(int fonttype)109   bool IsFontType(int fonttype) const { return fonttype == m_FontType; }
GetFontType()110   int GetFontType() const { return m_FontType; }
111 
112   CFX_ByteString GetFontTypeName() const;
113 
GetBaseFont()114   const CFX_ByteString& GetBaseFont() const { return m_BaseFont; }
115 
GetSubstFont()116   const CFX_SubstFont* GetSubstFont() const { return m_Font.GetSubstFont(); }
117 
GetFlags()118   FX_DWORD GetFlags() const { return m_Flags; }
119 
120   virtual FX_BOOL IsVertWriting() const;
121 
GetType1Font()122   CPDF_Type1Font* GetType1Font() const {
123     return m_FontType == PDFFONT_TYPE1 ? (CPDF_Type1Font*)(void*)this : NULL;
124   }
125 
GetTrueTypeFont()126   CPDF_TrueTypeFont* GetTrueTypeFont() const {
127     return m_FontType == PDFFONT_TRUETYPE ? (CPDF_TrueTypeFont*)(void*)this
128                                           : NULL;
129   }
130 
GetCIDFont()131   CPDF_CIDFont* GetCIDFont() const {
132     return (m_FontType == PDFFONT_CIDFONT) ? (CPDF_CIDFont*)(void*)this : NULL;
133   }
134 
GetType3Font()135   CPDF_Type3Font* GetType3Font() const {
136     return (m_FontType == PDFFONT_TYPE3) ? (CPDF_Type3Font*)(void*)this : NULL;
137   }
138 
IsEmbedded()139   FX_BOOL IsEmbedded() const {
140     return m_FontType == PDFFONT_TYPE3 || m_pFontFile != NULL;
141   }
142 
IsUnicodeCompatible()143   virtual FX_BOOL IsUnicodeCompatible() const { return FALSE; }
144 
GetFontFile()145   CPDF_StreamAcc* GetFontFile() const { return m_pFontFile; }
146 
GetFontDict()147   CPDF_Dictionary* GetFontDict() const { return m_pFontDict; }
148 
149   FX_BOOL IsStandardFont() const;
150 
GetFace()151   FXFT_Face GetFace() const { return m_Font.GetFace(); }
152 
GetNextChar(const FX_CHAR * pString,int nStrLen,int & offset)153   virtual FX_DWORD GetNextChar(const FX_CHAR* pString,
154                                int nStrLen,
155                                int& offset) const {
156     if (offset < 0 || nStrLen < 1) {
157       return 0;
158     }
159     uint8_t ch = offset < nStrLen ? pString[offset++] : pString[nStrLen - 1];
160     return static_cast<FX_DWORD>(ch);
161   }
162 
CountChar(const FX_CHAR * pString,int size)163   virtual int CountChar(const FX_CHAR* pString, int size) const { return size; }
164 
165   void AppendChar(CFX_ByteString& str, FX_DWORD charcode) const;
166 
AppendChar(FX_CHAR * buf,FX_DWORD charcode)167   virtual int AppendChar(FX_CHAR* buf, FX_DWORD charcode) const {
168     *buf = (FX_CHAR)charcode;
169     return 1;
170   }
171 
GetCharSize(FX_DWORD charcode)172   virtual int GetCharSize(FX_DWORD charcode) const { return 1; }
173 
174   virtual int GlyphFromCharCode(FX_DWORD charcode,
175                                 FX_BOOL* pVertGlyph = NULL) = 0;
GlyphFromCharCodeExt(FX_DWORD charcode)176   virtual int GlyphFromCharCodeExt(FX_DWORD charcode) {
177     return GlyphFromCharCode(charcode);
178   }
179 
180   CFX_WideString UnicodeFromCharCode(FX_DWORD charcode) const;
181 
182   FX_DWORD CharCodeFromUnicode(FX_WCHAR Unicode) const;
183 
GetCharMap()184   CFX_CharMap* GetCharMap() { return m_pCharMap; }
185 
186   CFX_ByteString EncodeString(const CFX_WideString& str) const;
187 
188   CFX_WideString DecodeString(const CFX_ByteString& str) const;
189 
GetFontBBox(FX_RECT & rect)190   void GetFontBBox(FX_RECT& rect) const { rect = m_FontBBox; }
191 
GetTypeAscent()192   int GetTypeAscent() const { return m_Ascent; }
193 
GetTypeDescent()194   int GetTypeDescent() const { return m_Descent; }
195 
GetItalicAngle()196   int GetItalicAngle() const { return m_ItalicAngle; }
197 
GetStemV()198   int GetStemV() const { return m_StemV; }
199 
200   int GetStringWidth(const FX_CHAR* pString, int size);
201 
202   virtual int GetCharWidthF(FX_DWORD charcode, int level = 0) = 0;
203 
204   virtual int GetCharTypeWidth(FX_DWORD charcode);
205 
206   virtual void GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level = 0) = 0;
207 
208   CPDF_Document* m_pDocument;
209 
210   class CFX_PathData* LoadGlyphPath(FX_DWORD charcode, int dest_width = 0);
211 
212   CFX_Font m_Font;
213 
214  protected:
215   explicit CPDF_Font(int fonttype);
216 
217   FX_BOOL Initialize();
218 
219   FX_BOOL Load();
220 
221   virtual FX_BOOL _Load() = 0;
222 
223   virtual FX_WCHAR _UnicodeFromCharCode(FX_DWORD charcode) const = 0;
224 
225   virtual FX_DWORD _CharCodeFromUnicode(FX_WCHAR Unicode) const = 0;
226 
227   void LoadUnicodeMap();
228 
229   void LoadPDFEncoding(CPDF_Object* pEncoding,
230                        int& iBaseEncoding,
231                        CFX_ByteString*& pCharNames,
232                        FX_BOOL bEmbedded,
233                        FX_BOOL bTrueType);
234 
235   void LoadFontDescriptor(CPDF_Dictionary*);
236 
237   void LoadCharWidths(FX_WORD* pWidths);
238 
239   void CheckFontMetrics();
240 
241   CFX_CharMap* m_pCharMap;
242 
243   CFX_ByteString m_BaseFont;
244 
245   CPDF_StreamAcc* m_pFontFile;
246 
247   CPDF_Dictionary* m_pFontDict;
248 
249   CPDF_ToUnicodeMap* m_pToUnicodeMap;
250 
251   FX_BOOL m_bToUnicodeLoaded;
252 
253   int m_Flags;
254 
255   FX_RECT m_FontBBox;
256 
257   int m_StemV;
258 
259   int m_Ascent;
260 
261   int m_Descent;
262 
263   int m_ItalicAngle;
264 
265  private:
266   const int m_FontType;
267 };
268 #define PDFFONT_ENCODING_BUILTIN 0
269 #define PDFFONT_ENCODING_WINANSI 1
270 #define PDFFONT_ENCODING_MACROMAN 2
271 #define PDFFONT_ENCODING_MACEXPERT 3
272 #define PDFFONT_ENCODING_STANDARD 4
273 #define PDFFONT_ENCODING_ADOBE_SYMBOL 5
274 #define PDFFONT_ENCODING_ZAPFDINGBATS 6
275 #define PDFFONT_ENCODING_PDFDOC 7
276 #define PDFFONT_ENCODING_MS_SYMBOL 8
277 #define PDFFONT_ENCODING_UNICODE 9
278 class CPDF_FontEncoding {
279  public:
280   CPDF_FontEncoding();
281 
282   CPDF_FontEncoding(int PredefinedEncoding);
283 
284   void LoadEncoding(CPDF_Object* pEncoding);
285 
286   FX_BOOL IsIdentical(CPDF_FontEncoding* pAnother) const;
287 
UnicodeFromCharCode(uint8_t charcode)288   FX_WCHAR UnicodeFromCharCode(uint8_t charcode) const {
289     return m_Unicodes[charcode];
290   }
291 
292   int CharCodeFromUnicode(FX_WCHAR unicode) const;
293 
SetUnicode(uint8_t charcode,FX_WCHAR unicode)294   void SetUnicode(uint8_t charcode, FX_WCHAR unicode) {
295     m_Unicodes[charcode] = unicode;
296   }
297 
298   CPDF_Object* Realize();
299 
300  public:
301   FX_WCHAR m_Unicodes[256];
302 };
303 
304 class CPDF_SimpleFont : public CPDF_Font {
305  public:
306   explicit CPDF_SimpleFont(int fonttype);
307   ~CPDF_SimpleFont() override;
308 
GetEncoding()309   CPDF_FontEncoding* GetEncoding() { return &m_Encoding; }
310   int GetCharWidthF(FX_DWORD charcode, int level = 0) override;
311   void GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level = 0) override;
312   int GlyphFromCharCode(FX_DWORD charcode, FX_BOOL* pVertGlyph = NULL) override;
313   FX_BOOL IsUnicodeCompatible() const override;
314 
315  protected:
316   FX_BOOL LoadCommon();
317 
318   void LoadSubstFont();
319 
320   void LoadFaceMetrics();
321 
322   virtual void LoadGlyphMap() = 0;
323 
_UnicodeFromCharCode(FX_DWORD charcode)324   FX_WCHAR _UnicodeFromCharCode(FX_DWORD charcode) const override {
325     return m_Encoding.UnicodeFromCharCode((uint8_t)charcode);
326   }
327 
_CharCodeFromUnicode(FX_WCHAR Unicode)328   FX_DWORD _CharCodeFromUnicode(FX_WCHAR Unicode) const override {
329     return m_Encoding.CharCodeFromUnicode(Unicode);
330   }
331 
332   void LoadCharMetrics(int charcode);
333 
334   CPDF_FontEncoding m_Encoding;
335   FX_WORD m_GlyphIndex[256];
336   FX_WORD m_ExtGID[256];
337   CFX_ByteString* m_pCharNames;
338   int m_BaseEncoding;
339   FX_WORD m_CharWidth[256];
340   FX_SMALL_RECT m_CharBBox[256];
341   FX_BOOL m_bUseFontWidth;
342 };
343 
344 class CPDF_Type1Font : public CPDF_SimpleFont {
345  public:
346   CPDF_Type1Font();
347 
GetBase14Font()348   int GetBase14Font() { return m_Base14Font; }
349 
350  protected:
351   // CPDF_SimpleFont:
352   int GlyphFromCharCodeExt(FX_DWORD charcode) override;
353   FX_BOOL _Load() override;
354   void LoadGlyphMap() override;
355 
356   int m_Base14Font;
357 };
358 class CPDF_TrueTypeFont : public CPDF_SimpleFont {
359  public:
360   CPDF_TrueTypeFont();
361 
362  protected:
363   // CPDF_SimpleFont:
364   FX_BOOL _Load() override;
365   void LoadGlyphMap() override;
366 };
367 
368 class CPDF_Type3Char {
369  public:
370   // Takes ownership of |pForm|.
371   explicit CPDF_Type3Char(CPDF_Form* pForm);
372   ~CPDF_Type3Char();
373 
374   FX_BOOL LoadBitmap(CPDF_RenderContext* pContext);
375 
376   CPDF_Form* m_pForm;
377   CFX_DIBitmap* m_pBitmap;
378   FX_BOOL m_bColored;
379   int m_Width;
380   CFX_Matrix m_ImageMatrix;
381   FX_RECT m_BBox;
382 };
383 
384 class CPDF_Type3Font : public CPDF_SimpleFont {
385  public:
386   CPDF_Type3Font();
387   ~CPDF_Type3Font() override;
388 
SetPageResources(CPDF_Dictionary * pResources)389   void SetPageResources(CPDF_Dictionary* pResources) {
390     m_pPageResources = pResources;
391   }
392   CPDF_Type3Char* LoadChar(FX_DWORD charcode, int level = 0);
393   int GetCharWidthF(FX_DWORD charcode, int level = 0) override;
GetCharTypeWidth(FX_DWORD charcode)394   int GetCharTypeWidth(FX_DWORD charcode) override {
395     return GetCharWidthF(charcode);
396   }
397   void GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level = 0) override;
GetFontMatrix()398   CFX_Matrix& GetFontMatrix() { return m_FontMatrix; }
399   void CheckType3FontMetrics();
400 
401  protected:
402   CFX_Matrix m_FontMatrix;
403 
404  private:
405   FX_BOOL _Load() override;
LoadGlyphMap()406   void LoadGlyphMap() override {}
407 
408   int m_CharWidthL[256];
409   CPDF_Dictionary* m_pCharProcs;
410   CPDF_Dictionary* m_pPageResources;
411   CPDF_Dictionary* m_pFontResources;
412   std::map<FX_DWORD, CPDF_Type3Char*> m_CacheMap;
413 };
414 
415 enum CIDSet {
416   CIDSET_UNKNOWN,
417   CIDSET_GB1,
418   CIDSET_CNS1,
419   CIDSET_JAPAN1,
420   CIDSET_KOREA1,
421   CIDSET_UNICODE,
422   CIDSET_NUM_SETS
423 };
424 
425 class CPDF_CIDFont : public CPDF_Font {
426  public:
427   CPDF_CIDFont();
428 
429   ~CPDF_CIDFont() override;
430 
431   static FX_FLOAT CIDTransformToFloat(uint8_t ch);
432 
433   // CPDF_Font:
434   int GlyphFromCharCode(FX_DWORD charcode, FX_BOOL* pVertGlyph = NULL) override;
435   int GetCharWidthF(FX_DWORD charcode, int level = 0) override;
436   void GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level = 0) override;
437   FX_DWORD GetNextChar(const FX_CHAR* pString,
438                        int nStrLen,
439                        int& offset) const override;
440   int CountChar(const FX_CHAR* pString, int size) const override;
441   int AppendChar(FX_CHAR* str, FX_DWORD charcode) const override;
442   int GetCharSize(FX_DWORD charcode) const override;
443   FX_BOOL IsVertWriting() const override;
444   FX_BOOL IsUnicodeCompatible() const override;
445   FX_BOOL _Load() override;
446   FX_WCHAR _UnicodeFromCharCode(FX_DWORD charcode) const override;
447   FX_DWORD _CharCodeFromUnicode(FX_WCHAR Unicode) const override;
448 
449   FX_BOOL LoadGB2312();
450   FX_WORD CIDFromCharCode(FX_DWORD charcode) const;
IsTrueType()451   FX_BOOL IsTrueType() const { return !m_bType1; }
452   const uint8_t* GetCIDTransform(FX_WORD CID) const;
453   short GetVertWidth(FX_WORD CID) const;
454   void GetVertOrigin(FX_WORD CID, short& vx, short& vy) const;
455   virtual FX_BOOL IsFontStyleFromCharCode(FX_DWORD charcode) const;
456 
457  protected:
458   friend class CPDF_Font;
459 
460   int GetGlyphIndex(FX_DWORD unicodeb, FX_BOOL* pVertGlyph);
461   void LoadMetricsArray(CPDF_Array* pArray,
462                         CFX_DWordArray& result,
463                         int nElements);
464   void LoadSubstFont();
465 
466   CPDF_CMap* m_pCMap;
467   CPDF_CMap* m_pAllocatedCMap;
468   CPDF_CID2UnicodeMap* m_pCID2UnicodeMap;
469   CIDSet m_Charset;
470   FX_BOOL m_bType1;
471   CPDF_StreamAcc* m_pCIDToGIDMap;
472   FX_BOOL m_bCIDIsGID;
473   FX_WORD m_DefaultWidth;
474   FX_WORD* m_pAnsiWidths;
475   FX_SMALL_RECT m_CharBBox[256];
476   CFX_DWordArray m_WidthList;
477   short m_DefaultVY;
478   short m_DefaultW1;
479   CFX_DWordArray m_VertMetrics;
480   FX_BOOL m_bAdobeCourierStd;
481   CFX_CTTGSUBTable* m_pTTGSUBTable;
482 };
483 
484 #define PDFCS_DEVICEGRAY 1
485 #define PDFCS_DEVICERGB 2
486 #define PDFCS_DEVICECMYK 3
487 #define PDFCS_CALGRAY 4
488 #define PDFCS_CALRGB 5
489 #define PDFCS_LAB 6
490 #define PDFCS_ICCBASED 7
491 #define PDFCS_SEPARATION 8
492 #define PDFCS_DEVICEN 9
493 #define PDFCS_INDEXED 10
494 #define PDFCS_PATTERN 11
495 
496 class CPDF_ColorSpace {
497  public:
498   static CPDF_ColorSpace* GetStockCS(int Family);
499 
500   static CPDF_ColorSpace* Load(CPDF_Document* pDoc, CPDF_Object* pCSObj);
501 
502   void ReleaseCS();
503 
504   int GetBufSize() const;
505 
506   FX_FLOAT* CreateBuf();
507 
508   void GetDefaultColor(FX_FLOAT* buf) const;
509 
CountComponents()510   int CountComponents() const { return m_nComponents; }
511 
GetFamily()512   int GetFamily() const { return m_Family; }
513 
GetDefaultValue(int iComponent,FX_FLOAT & value,FX_FLOAT & min,FX_FLOAT & max)514   virtual void GetDefaultValue(int iComponent,
515                                FX_FLOAT& value,
516                                FX_FLOAT& min,
517                                FX_FLOAT& max) const {
518     value = 0;
519     min = 0;
520     max = 1.0f;
521   }
522 
523   FX_BOOL sRGB() const;
524 
525   virtual FX_BOOL GetRGB(FX_FLOAT* pBuf,
526                          FX_FLOAT& R,
527                          FX_FLOAT& G,
528                          FX_FLOAT& B) const = 0;
529 
SetRGB(FX_FLOAT * pBuf,FX_FLOAT R,FX_FLOAT G,FX_FLOAT B)530   virtual FX_BOOL SetRGB(FX_FLOAT* pBuf,
531                          FX_FLOAT R,
532                          FX_FLOAT G,
533                          FX_FLOAT B) const {
534     return FALSE;
535   }
536 
537   FX_BOOL GetCMYK(FX_FLOAT* pBuf,
538                   FX_FLOAT& c,
539                   FX_FLOAT& m,
540                   FX_FLOAT& y,
541                   FX_FLOAT& k) const;
542 
543   FX_BOOL SetCMYK(FX_FLOAT* pBuf,
544                   FX_FLOAT c,
545                   FX_FLOAT m,
546                   FX_FLOAT y,
547                   FX_FLOAT k) const;
548 
549   virtual void TranslateImageLine(uint8_t* dest_buf,
550                                   const uint8_t* src_buf,
551                                   int pixels,
552                                   int image_width,
553                                   int image_height,
554                                   FX_BOOL bTransMask = FALSE) const;
555 
GetArray()556   CPDF_Array*& GetArray() { return m_pArray; }
557 
558   int GetMaxIndex() const;
559 
GetBaseCS()560   virtual CPDF_ColorSpace* GetBaseCS() const { return NULL; }
561 
562   virtual void EnableStdConversion(FX_BOOL bEnabled);
563 
564   CPDF_Document* const m_pDocument;
565 
566  protected:
CPDF_ColorSpace(CPDF_Document * pDoc,int family,int nComponents)567   CPDF_ColorSpace(CPDF_Document* pDoc, int family, int nComponents)
568       : m_pDocument(pDoc),
569         m_Family(family),
570         m_nComponents(nComponents),
571         m_pArray(nullptr),
572         m_dwStdConversion(0) {}
~CPDF_ColorSpace()573   virtual ~CPDF_ColorSpace() {}
v_Load(CPDF_Document * pDoc,CPDF_Array * pArray)574   virtual FX_BOOL v_Load(CPDF_Document* pDoc, CPDF_Array* pArray) {
575     return TRUE;
576   }
v_GetCMYK(FX_FLOAT * pBuf,FX_FLOAT & c,FX_FLOAT & m,FX_FLOAT & y,FX_FLOAT & k)577   virtual FX_BOOL v_GetCMYK(FX_FLOAT* pBuf,
578                             FX_FLOAT& c,
579                             FX_FLOAT& m,
580                             FX_FLOAT& y,
581                             FX_FLOAT& k) const {
582     return FALSE;
583   }
v_SetCMYK(FX_FLOAT * pBuf,FX_FLOAT c,FX_FLOAT m,FX_FLOAT y,FX_FLOAT k)584   virtual FX_BOOL v_SetCMYK(FX_FLOAT* pBuf,
585                             FX_FLOAT c,
586                             FX_FLOAT m,
587                             FX_FLOAT y,
588                             FX_FLOAT k) const {
589     return FALSE;
590   }
591 
592   int m_Family;
593 
594   int m_nComponents;
595 
596   CPDF_Array* m_pArray;
597 
598   FX_DWORD m_dwStdConversion;
599 };
600 class CPDF_Color {
601  public:
CPDF_Color()602   CPDF_Color() : m_pCS(NULL), m_pBuffer(NULL) {}
603 
604   CPDF_Color(int family);
605 
606   ~CPDF_Color();
607 
IsNull()608   FX_BOOL IsNull() const { return !m_pBuffer; }
609 
610   FX_BOOL IsEqual(const CPDF_Color& other) const;
611 
IsPattern()612   FX_BOOL IsPattern() const {
613     return m_pCS && m_pCS->GetFamily() == PDFCS_PATTERN;
614   }
615 
616   void Copy(const CPDF_Color* pSrc);
617 
618   void SetColorSpace(CPDF_ColorSpace* pCS);
619 
620   void SetValue(FX_FLOAT* comp);
621 
622   void SetValue(CPDF_Pattern* pPattern, FX_FLOAT* comp, int ncomps);
623 
624   FX_BOOL GetRGB(int& R, int& G, int& B) const;
625 
626   CPDF_Pattern* GetPattern() const;
627 
628   CPDF_ColorSpace* GetPatternCS() const;
629 
630   FX_FLOAT* GetPatternColor() const;
631 
632   CPDF_ColorSpace* m_pCS;
633 
634  protected:
635   void ReleaseBuffer();
636   void ReleaseColorSpace();
637   FX_FLOAT* m_pBuffer;
638 };
639 
640 class CPDF_Pattern {
641  public:
642   enum PatternType { TILING = 1, SHADING };
643 
644   virtual ~CPDF_Pattern();
645 
SetForceClear(FX_BOOL bForceClear)646   void SetForceClear(FX_BOOL bForceClear) { m_bForceClear = bForceClear; }
647 
648   const PatternType m_PatternType;
649   CPDF_Document* const m_pDocument;
650   CPDF_Object* const m_pPatternObj;
651   CFX_Matrix m_Pattern2Form;
652   CFX_Matrix m_ParentMatrix;
653 
654  protected:
655   CPDF_Pattern(PatternType type,
656                CPDF_Document* pDoc,
657                CPDF_Object* pObj,
658                const CFX_Matrix* pParentMatrix);
659 
660   FX_BOOL m_bForceClear;
661 };
662 
663 class CPDF_TilingPattern : public CPDF_Pattern {
664  public:
665   CPDF_TilingPattern(CPDF_Document* pDoc,
666                      CPDF_Object* pPatternObj,
667                      const CFX_Matrix* parentMatrix);
668 
669   ~CPDF_TilingPattern() override;
670 
671   FX_BOOL Load();
672 
673   FX_BOOL m_bColored;
674 
675   CFX_FloatRect m_BBox;
676 
677   FX_FLOAT m_XStep;
678 
679   FX_FLOAT m_YStep;
680 
681   CPDF_Form* m_pForm;
682 };
683 
684 typedef enum {
685   kInvalidShading = 0,
686   kFunctionBasedShading = 1,
687   kAxialShading = 2,
688   kRadialShading = 3,
689   kFreeFormGouraudTriangleMeshShading = 4,
690   kLatticeFormGouraudTriangleMeshShading = 5,
691   kCoonsPatchMeshShading = 6,
692   kTensorProductPatchMeshShading = 7,
693   kMaxShading = 8
694 } ShadingType;
695 
696 class CPDF_ShadingPattern : public CPDF_Pattern {
697  public:
698   CPDF_ShadingPattern(CPDF_Document* pDoc,
699                       CPDF_Object* pPatternObj,
700                       FX_BOOL bShading,
701                       const CFX_Matrix* parentMatrix);
702 
703   ~CPDF_ShadingPattern() override;
704 
IsMeshShading()705   bool IsMeshShading() const {
706     return m_ShadingType == kFreeFormGouraudTriangleMeshShading ||
707            m_ShadingType == kLatticeFormGouraudTriangleMeshShading ||
708            m_ShadingType == kCoonsPatchMeshShading ||
709            m_ShadingType == kTensorProductPatchMeshShading;
710   }
711   FX_BOOL Load();
712 
713   ShadingType m_ShadingType;
714   FX_BOOL m_bShadingObj;
715   CPDF_Object* m_pShadingObj;
716 
717   // Still keep |m_pCS| as some CPDF_ColorSpace (name object) are not managed
718   // as counted objects. Refer to CPDF_DocPageData::GetColorSpace.
719   CPDF_ColorSpace* m_pCS;
720 
721   CPDF_CountedColorSpace* m_pCountedCS;
722   CPDF_Function* m_pFunctions[4];
723   int m_nFuncs;
724 };
725 
726 struct CPDF_MeshVertex {
727   FX_FLOAT x, y;
728   FX_FLOAT r, g, b;
729 };
730 class CPDF_MeshStream {
731  public:
732   FX_BOOL Load(CPDF_Stream* pShadingStream,
733                CPDF_Function** pFuncs,
734                int nFuncs,
735                CPDF_ColorSpace* pCS);
736 
737   FX_DWORD GetFlag();
738 
739   void GetCoords(FX_FLOAT& x, FX_FLOAT& y);
740 
741   void GetColor(FX_FLOAT& r, FX_FLOAT& g, FX_FLOAT& b);
742 
743   FX_DWORD GetVertex(CPDF_MeshVertex& vertex, CFX_Matrix* pObject2Bitmap);
744 
745   FX_BOOL GetVertexRow(CPDF_MeshVertex* vertex,
746                        int count,
747                        CFX_Matrix* pObject2Bitmap);
748   CPDF_Function** m_pFuncs;
749   CPDF_ColorSpace* m_pCS;
750   FX_DWORD m_nFuncs, m_nCoordBits, m_nCompBits, m_nFlagBits, m_nComps;
751   FX_DWORD m_CoordMax, m_CompMax;
752   FX_FLOAT m_xmin, m_xmax, m_ymin, m_ymax;
753   FX_FLOAT m_ColorMin[8], m_ColorMax[8];
754   CPDF_StreamAcc m_Stream;
755   CFX_BitStream m_BitStream;
756 };
757 #define PDF_IMAGE_NO_COMPRESS 0x0000
758 #define PDF_IMAGE_LOSSY_COMPRESS 0x0001
759 #define PDF_IMAGE_LOSSLESS_COMPRESS 0x0002
760 #define PDF_IMAGE_MASK_LOSSY_COMPRESS 0x0004
761 #define PDF_IMAGE_MASK_LOSSLESS_COMPRESS 0x0008
762 class CPDF_ImageSetParam {
763  public:
CPDF_ImageSetParam()764   CPDF_ImageSetParam() : pMatteColor(NULL), nQuality(80) {}
765   FX_ARGB* pMatteColor;
766   int32_t nQuality;
767 };
768 class CPDF_Image {
769  public:
770   CPDF_Image(CPDF_Document* pDoc);
771 
772   ~CPDF_Image();
773 
774   FX_BOOL LoadImageF(CPDF_Stream* pImageStream, FX_BOOL bInline);
775 
776   void Release();
777 
778   CPDF_Image* Clone();
779 
IsInline()780   FX_BOOL IsInline() { return m_bInline; }
781 
SetInlineDict(CPDF_Dictionary * pDict)782   void SetInlineDict(CPDF_Dictionary* pDict) { m_pInlineDict = pDict; }
783 
GetInlineDict()784   CPDF_Dictionary* GetInlineDict() const { return m_pInlineDict; }
785 
GetStream()786   CPDF_Stream* GetStream() const { return m_pStream; }
787 
GetDict()788   CPDF_Dictionary* GetDict() const {
789     return m_pStream ? m_pStream->GetDict() : NULL;
790   }
791 
GetOC()792   CPDF_Dictionary* GetOC() const { return m_pOC; }
793 
GetDocument()794   CPDF_Document* GetDocument() const { return m_pDocument; }
795 
GetPixelHeight()796   int32_t GetPixelHeight() const { return m_Height; }
797 
GetPixelWidth()798   int32_t GetPixelWidth() const { return m_Width; }
799 
IsMask()800   FX_BOOL IsMask() const { return m_bIsMask; }
801 
IsInterpol()802   FX_BOOL IsInterpol() const { return m_bInterpolate; }
803 
804   CFX_DIBSource* LoadDIBSource(CFX_DIBSource** ppMask = NULL,
805                                FX_DWORD* pMatteColor = NULL,
806                                FX_BOOL bStdCS = FALSE,
807                                FX_DWORD GroupFamily = 0,
808                                FX_BOOL bLoadMask = FALSE) const;
809 
810   void SetImage(const CFX_DIBitmap* pDIBitmap,
811                 int32_t iCompress,
812                 IFX_FileWrite* pFileWrite = NULL,
813                 IFX_FileRead* pFileRead = NULL,
814                 const CFX_DIBitmap* pMask = NULL,
815                 const CPDF_ImageSetParam* pParam = NULL);
816 
817   void SetJpegImage(uint8_t* pImageData, FX_DWORD size);
818 
819   void SetJpegImage(IFX_FileRead* pFile);
820 
821   void ResetCache(CPDF_Page* pPage, const CFX_DIBitmap* pDIBitmap);
822 
823  public:
824   FX_BOOL StartLoadDIBSource(CPDF_Dictionary* pFormResource,
825                              CPDF_Dictionary* pPageResource,
826                              FX_BOOL bStdCS = FALSE,
827                              FX_DWORD GroupFamily = 0,
828                              FX_BOOL bLoadMask = FALSE);
829   FX_BOOL Continue(IFX_Pause* pPause);
830   CFX_DIBSource* DetachBitmap();
831   CFX_DIBSource* DetachMask();
832   CFX_DIBSource* m_pDIBSource;
833   CFX_DIBSource* m_pMask;
834   FX_DWORD m_MatteColor;
835 
836  private:
837   CPDF_Stream* m_pStream;
838   FX_BOOL m_bInline;
839   CPDF_Dictionary* m_pInlineDict;
840 
841   int32_t m_Height;
842 
843   int32_t m_Width;
844 
845   FX_BOOL m_bIsMask;
846 
847   FX_BOOL m_bInterpolate;
848 
849   CPDF_Document* m_pDocument;
850 
851   CPDF_Dictionary* m_pOC;
852   CPDF_Dictionary* InitJPEG(uint8_t* pData, FX_DWORD size);
853 };
854 
855 #endif  // CORE_INCLUDE_FPDFAPI_FPDF_RESOURCE_H_
856