• 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 _FPDF_RESOURCE_
8 #define _FPDF_RESOURCE_
9 #ifndef _FPDF_PARSER_
10 #include "fpdf_parser.h"
11 #endif
12 #ifndef _FX_FONT_H_
13 #include "../fxge/fx_font.h"
14 #endif
15 class CPDF_Font;
16 class CPDF_Type1Font;
17 class CPDF_TrueTypeFont;
18 class CPDF_CIDFont;
19 class CPDF_Type3Font;
20 class CPDF_FontEncoding;
21 class CPDF_CMap;
22 class CPDF_CID2UnicodeMap;
23 class CPDF_ColorSpace;
24 class CPDF_Color;
25 class CPDF_Function;
26 class CPDF_Pattern;
27 class CPDF_TilingPattern;
28 class CPDF_ShadingPattern;
29 class CPDF_Image;
30 class CPDF_Face;
31 class CPDF_ToUnicodeMap;
32 class CFX_SubstFont;
33 class CFX_Font;
34 class CPDF_RenderContext;
35 class CPDF_Form;
36 class CPDF_ImageObject;
37 class CFX_DIBitmap;
38 typedef struct FT_FaceRec_* FXFT_Face;
39 class CFX_CTTGSUBTable;
40 class CPDF_Page;
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
58 {
59 public:
60 
61     static CPDF_Font*		CreateFontF(CPDF_Document* pDoc, CPDF_Dictionary* pFontDict);
62 
63     static CPDF_Font*		GetStockFont(CPDF_Document* pDoc, FX_BSTR fontname);
64 
65     virtual ~CPDF_Font();
66 
67 
68 
69 
GetFontType()70     int						GetFontType() const
71     {
72         return m_FontType;
73     }
74 
75     CFX_ByteString			GetFontTypeName() const;
76 
GetBaseFont()77     const CFX_ByteString&	GetBaseFont() const
78     {
79         return m_BaseFont;
80     }
81 
GetSubstFont()82     const CFX_SubstFont*	GetSubstFont() const
83     {
84         return m_Font.GetSubstFont();
85     }
86 
GetFlags()87     FX_DWORD				GetFlags() const
88     {
89         return m_Flags;
90     }
91 
92     virtual FX_BOOL			IsVertWriting()const;
93 
94 
95 
96 
GetType1Font()97     CPDF_Type1Font*			GetType1Font() const
98     {
99         return m_FontType == PDFFONT_TYPE1 ? (CPDF_Type1Font*)(void*)this : NULL;
100     }
101 
GetTrueTypeFont()102     CPDF_TrueTypeFont*		GetTrueTypeFont() const
103     {
104         return m_FontType == PDFFONT_TRUETYPE ? (CPDF_TrueTypeFont*)(void*)this : NULL;
105     }
106 
GetCIDFont()107     CPDF_CIDFont*			GetCIDFont() const
108     {
109         return (m_FontType == PDFFONT_CIDFONT) ? (CPDF_CIDFont*)(void*)this : NULL;
110     }
111 
GetType3Font()112     CPDF_Type3Font*			GetType3Font() const
113     {
114         return (m_FontType == PDFFONT_TYPE3) ? (CPDF_Type3Font*)(void*)this : NULL;
115     }
116 
117 
IsEmbedded()118     FX_BOOL					IsEmbedded() const
119     {
120         return m_FontType == PDFFONT_TYPE3 || m_pFontFile != NULL;
121     }
122 
IsUnicodeCompatible()123     virtual FX_BOOL			IsUnicodeCompatible() const
124     {
125         return FALSE;
126     }
127 
GetFontFile()128     CPDF_StreamAcc*			GetFontFile() const
129     {
130         return m_pFontFile;
131     }
132 
GetFontDict()133     CPDF_Dictionary*		GetFontDict() const
134     {
135         return m_pFontDict;
136     }
137 
138     FX_BOOL					IsStandardFont() const;
139 
GetFace()140     FXFT_Face				GetFace() const
141     {
142         return m_Font.GetFace();
143     }
144 
145 
146 
GetNextChar(FX_LPCSTR pString,int & offset)147     virtual FX_DWORD		GetNextChar(FX_LPCSTR pString, int& offset) const
148     {
149         return (FX_BYTE)pString[offset++];
150     }
151 
CountChar(FX_LPCSTR pString,int size)152     virtual int				CountChar(FX_LPCSTR pString, int size) const
153     {
154         return size;
155     }
156 
157     void					AppendChar(CFX_ByteString& str, FX_DWORD charcode) const;
158 
AppendChar(FX_LPSTR buf,FX_DWORD charcode)159     virtual int				AppendChar(FX_LPSTR buf, FX_DWORD charcode) const
160     {
161         *buf = (FX_CHAR)charcode;
162         return 1;
163     }
164 
GetCharSize(FX_DWORD charcode)165     virtual int				GetCharSize(FX_DWORD charcode) const
166     {
167         return 1;
168     }
169 
170 
171 
172 
173     virtual int				GlyphFromCharCode(FX_DWORD charcode, FX_BOOL *pVertGlyph = NULL) = 0;
GlyphFromCharCodeExt(FX_DWORD charcode)174     virtual int				GlyphFromCharCodeExt(FX_DWORD charcode)
175     {
176         return GlyphFromCharCode(charcode);
177     }
178 
179     CFX_WideString			UnicodeFromCharCode(FX_DWORD charcode) const;
180 
181     FX_DWORD				CharCodeFromUnicode(FX_WCHAR Unicode) const;
182 
GetCharMap()183     CFX_CharMap*			GetCharMap()
184     {
185         return m_pCharMap;
186     }
187 
188     CFX_ByteString			EncodeString(const CFX_WideString& str) const;
189 
190     CFX_WideString			DecodeString(const CFX_ByteString& str) const;
191 
192 
193 
194 
GetFontBBox(FX_RECT & rect)195     void					GetFontBBox(FX_RECT& rect) const
196     {
197         rect = m_FontBBox;
198     }
199 
GetTypeAscent()200     int						GetTypeAscent() const
201     {
202         return m_Ascent;
203     }
204 
GetTypeDescent()205     int						GetTypeDescent() const
206     {
207         return m_Descent;
208     }
209 
GetItalicAngle()210     int						GetItalicAngle() const
211     {
212         return m_ItalicAngle;
213     }
214 
GetStemV()215     int						GetStemV() const
216     {
217         return m_StemV;
218     }
219 
220     int						GetStringWidth(const FX_CHAR* pString, int size);
221 
222     virtual int				GetCharWidthF(FX_DWORD charcode, int level = 0) = 0;
223 
224     virtual int				GetCharTypeWidth(FX_DWORD charcode);
225 
226     virtual void			GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level = 0) = 0;
227 
228 
229 
230     CPDF_Document*			m_pDocument;
231 
232     class CFX_PathData*		LoadGlyphPath(FX_DWORD charcode, int dest_width = 0);
233 
234     CFX_Font				m_Font;
235 protected:
236 
237     CPDF_Font();
238 
239     FX_BOOL					Initialize();
240 
241     FX_BOOL					Load();
242 
243     virtual FX_BOOL			_Load() = 0;
244 
245     virtual FX_WCHAR		_UnicodeFromCharCode(FX_DWORD charcode) const = 0;
246 
247     virtual FX_DWORD		_CharCodeFromUnicode(FX_WCHAR Unicode) const = 0;
248 
249     void					LoadUnicodeMap();
250 
251     void					LoadPDFEncoding(CPDF_Object* pEncoding, int& iBaseEncoding,
252                                             CFX_ByteString*& pCharNames, FX_BOOL bEmbedded, FX_BOOL bTrueType);
253 
254     void					LoadFontDescriptor(CPDF_Dictionary*);
255 
256     void					LoadCharWidths(FX_WORD* pWidths);
257 
258     void					CheckFontMetrics();
259 
260     CFX_CharMap*			m_pCharMap;
261 
262 
263 
264     int						m_FontType;
265 
266     CFX_ByteString			m_BaseFont;
267 
268     CPDF_StreamAcc*			m_pFontFile;
269 
270     CPDF_Dictionary*		m_pFontDict;
271 
272     CPDF_ToUnicodeMap*		m_pToUnicodeMap;
273 
274     FX_BOOL					m_bToUnicodeLoaded;
275 
276 
277 
278 
279     int						m_Flags;
280 
281     FX_RECT					m_FontBBox;
282 
283     int						m_StemV;
284 
285     int						m_Ascent;
286 
287     int						m_Descent;
288 
289     int						m_ItalicAngle;
290 
291 };
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
303 {
304 public:
305 
306     CPDF_FontEncoding();
307 
308     CPDF_FontEncoding(int PredefinedEncoding);
309 
310     void					LoadEncoding(CPDF_Object* pEncoding);
311 
312     FX_BOOL					IsIdentical(CPDF_FontEncoding* pAnother) const;
313 
UnicodeFromCharCode(FX_BYTE charcode)314     FX_WCHAR				UnicodeFromCharCode(FX_BYTE charcode) const
315     {
316         return m_Unicodes[charcode];
317     }
318 
319     int						CharCodeFromUnicode(FX_WCHAR unicode) const;
320 
SetUnicode(FX_BYTE charcode,FX_WCHAR unicode)321     void					SetUnicode(FX_BYTE charcode, FX_WCHAR unicode)
322     {
323         m_Unicodes[charcode] = unicode;
324     }
325 
326     CPDF_Object*			Realize();
327 public:
328 
329     FX_WCHAR				m_Unicodes[256];
330 };
331 class CPDF_SimpleFont : public CPDF_Font
332 {
333 public:
334 
335     CPDF_SimpleFont();
336 
337     virtual ~CPDF_SimpleFont();
338 
GetEncoding()339     CPDF_FontEncoding*		GetEncoding()
340     {
341         return &m_Encoding;
342     }
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;
347 protected:
348 
349     FX_BOOL					LoadCommon();
350 
351     void					LoadSubstFont();
352 
353     void					LoadFaceMetrics();
354 
355     virtual void			LoadGlyphMap() = 0;
_UnicodeFromCharCode(FX_DWORD charcode)356     virtual FX_WCHAR		_UnicodeFromCharCode(FX_DWORD charcode) const
357     {
358         return m_Encoding.UnicodeFromCharCode((FX_BYTE)charcode);
359     }
_CharCodeFromUnicode(FX_WCHAR Unicode)360     virtual FX_DWORD		_CharCodeFromUnicode(FX_WCHAR Unicode) const
361     {
362         return m_Encoding.CharCodeFromUnicode(Unicode);
363     }
364 
365 
366 
367     CPDF_FontEncoding		m_Encoding;
368 
369     FX_WORD					m_GlyphIndex[256];
370     FX_WORD					m_ExtGID[256];
371 
372 
373 
374 
375     CFX_ByteString*			m_pCharNames;
376 
377     int						m_BaseEncoding;
378 
379 
380 
381 
382     FX_WORD					m_CharWidth[256];
383 
384     FX_SMALL_RECT			m_CharBBox[256];
385 
386     FX_BOOL					m_bUseFontWidth;
387 
388     void					LoadCharMetrics(int charcode);
389 
390 };
391 class CPDF_Type1Font : public CPDF_SimpleFont
392 {
393 public:
394 
395     CPDF_Type1Font();
396 
GetBase14Font()397     int						GetBase14Font()
398     {
399         return m_Base14Font;
400     }
401     virtual int				GlyphFromCharCodeExt(FX_DWORD charcode);
402 protected:
403     virtual FX_BOOL			_Load();
404 
405     int						m_Base14Font;
406     virtual void			LoadGlyphMap();
407 };
408 class CPDF_TrueTypeFont : public CPDF_SimpleFont
409 {
410 public:
411 
412     CPDF_TrueTypeFont();
413 protected:
414     virtual FX_BOOL			_Load();
415     virtual void			LoadGlyphMap();
416 };
417 class CPDF_Type3Char : public CFX_Object
418 {
419 public:
420 
421     CPDF_Type3Char();
422 
423     ~CPDF_Type3Char();
424 
425     FX_BOOL LoadBitmap(CPDF_RenderContext* pContext);
426 
427     FX_BOOL					m_bColored;
428 
429     FX_BOOL					m_bPageRequired;
430 
431 
432 
433     CPDF_Form*				m_pForm;
434 
435     CFX_AffineMatrix		m_ImageMatrix;
436 
437     CFX_DIBitmap*			m_pBitmap;
438 
439 
440     int						m_Width;
441 
442     FX_RECT					m_BBox;
443 };
444 class CPDF_Type3Font : public CPDF_SimpleFont
445 {
446 public:
447     CPDF_Type3Font();
448     virtual ~CPDF_Type3Font();
SetPageResources(CPDF_Dictionary * pResources)449     void					SetPageResources(CPDF_Dictionary* pResources)
450     {
451         m_pPageResources = pResources;
452     }
453     CPDF_Type3Char*			LoadChar(FX_DWORD charcode, int level = 0);
454     virtual int				GetCharWidthF(FX_DWORD charcode, int level = 0);
GetCharTypeWidth(FX_DWORD charcode)455     virtual int				GetCharTypeWidth(FX_DWORD charcode)
456     {
457         return GetCharWidthF(charcode);
458     }
459     virtual void			GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level = 0);
GetFontMatrix()460     CFX_AffineMatrix&		GetFontMatrix()
461     {
462         return m_FontMatrix;
463     }
464     void					CheckType3FontMetrics();
465 private:
466     virtual FX_BOOL			_Load();
LoadGlyphMap()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;
474 protected:
475     CFX_AffineMatrix		m_FontMatrix;
476 };
477 #define CIDSET_UNKNOWN		0
478 #define CIDSET_GB1			1
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
484 {
485 public:
486 
487     CPDF_CIDFont();
488 
489     virtual ~CPDF_CIDFont();
490 
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);
495 
496     FX_WORD					CIDFromCharCode(FX_DWORD charcode) const;
497 
IsTrueType()498     FX_BOOL					IsTrueType()
499     {
500         return !m_bType1;
501     }
502 
503 
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;
508 
509 
GetCharset()510     int						GetCharset() const
511     {
512         return m_Charset;
513     }
514 
515     FX_LPCBYTE				GetCIDTransform(FX_WORD CID) const;
516 
517 
518 
519     virtual FX_BOOL			IsVertWriting() const;
520 
521     short					GetVertWidth(FX_WORD CID) const;
522 
523     void					GetVertOrigin(FX_WORD CID, short& vx, short& vy) const;
524 
525     virtual FX_BOOL			IsUnicodeCompatible() const;
526     virtual FX_BOOL			IsFontStyleFromCharCode(FX_DWORD charcode) const;
527 protected:
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);
533 
534     CPDF_CMap*				m_pCMap;
535 
536     CPDF_CMap*				m_pAllocatedCMap;
537 
538     CPDF_CID2UnicodeMap*	m_pCID2UnicodeMap;
539 
540     int						m_Charset;
541 
542     FX_BOOL					m_bType1;
543 
544     CPDF_StreamAcc*			m_pCIDToGIDMap;
545     FX_BOOL					m_bCIDIsGID;
546 
547 
548 
549     FX_WORD					m_DefaultWidth;
550 
551     FX_WORD*				m_pAnsiWidths;
552 
553     FX_SMALL_RECT			m_CharBBox[256];
554 
555     CFX_DWordArray			m_WidthList;
556 
557     short					m_DefaultVY;
558 
559     short					m_DefaultW1;
560 
561     CFX_DWordArray			m_VertMetrics;
562 
563 
564     void					LoadMetricsArray(CPDF_Array* pArray, CFX_DWordArray& result, int nElements);
565 
566     void					LoadSubstFont();
567 
568     FX_BOOL					m_bAdobeCourierStd;
569 
570     CFX_CTTGSUBTable*			m_pTTGSUBTable;
571 };
572 #define PDFCS_DEVICEGRAY		1
573 
574 #define PDFCS_DEVICERGB			2
575 #define PDFCS_DEVICECMYK		3
576 #define PDFCS_CALGRAY			4
577 #define PDFCS_CALRGB			5
578 #define PDFCS_LAB				6
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
585 {
586 public:
587 
588     static CPDF_ColorSpace* GetStockCS(int Family);
589 
590     static CPDF_ColorSpace*	Load(CPDF_Document* pDoc, CPDF_Object* pCSObj);
591 
592     void					ReleaseCS();
593 
594     int						GetBufSize() const;
595 
596     FX_FLOAT*			CreateBuf();
597 
598     void					GetDefaultColor(FX_FLOAT* buf) const;
599 
CountComponents()600     int						CountComponents() const
601     {
602         return m_nComponents;
603     }
604 
GetFamily()605     int						GetFamily() const
606     {
607         return m_Family;
608     }
609 
GetDefaultValue(int iComponent,FX_FLOAT & value,FX_FLOAT & min,FX_FLOAT & max)610     virtual void			GetDefaultValue(int iComponent, FX_FLOAT& value, FX_FLOAT& min, FX_FLOAT& max) const
611     {
612         value = 0;
613         min = 0;
614         max = 1.0f;
615     }
616 
617     FX_BOOL					sRGB() const;
618 
619 
620 
621     virtual FX_BOOL			GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const = 0;
622 
SetRGB(FX_FLOAT * pBuf,FX_FLOAT R,FX_FLOAT G,FX_FLOAT B)623     virtual FX_BOOL			SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const
624     {
625         return FALSE;
626     }
627 
628 
629 
630 
631     FX_BOOL					GetCMYK(FX_FLOAT* pBuf, FX_FLOAT& c, FX_FLOAT& m, FX_FLOAT& y, FX_FLOAT& k) const;
632 
633     FX_BOOL					SetCMYK(FX_FLOAT* pBuf, FX_FLOAT c, FX_FLOAT m, FX_FLOAT y, FX_FLOAT k) const;
634 
635 
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;
638 
GetArray()639     CPDF_Array*&			GetArray()
640     {
641         return m_pArray;
642     }
643 
644     int						GetMaxIndex() const;
645 
GetBaseCS()646     virtual CPDF_ColorSpace*	GetBaseCS() const
647     {
648         return NULL;
649     }
650 
651     virtual void			EnableStdConversion(FX_BOOL bEnabled);
652     CPDF_Document*			m_pDocument;
653 protected:
654 
655     CPDF_ColorSpace();
656 
~CPDF_ColorSpace()657     virtual ~CPDF_ColorSpace() {}
v_Load(CPDF_Document * pDoc,CPDF_Array * pArray)658     virtual FX_BOOL			v_Load(CPDF_Document* pDoc, CPDF_Array* pArray)
659     {
660         return TRUE;
661     }
v_GetCMYK(FX_FLOAT * pBuf,FX_FLOAT & c,FX_FLOAT & m,FX_FLOAT & y,FX_FLOAT & k)662     virtual FX_BOOL			v_GetCMYK(FX_FLOAT* pBuf, FX_FLOAT& c, FX_FLOAT& m, FX_FLOAT& y, FX_FLOAT& k) const
663     {
664         return FALSE;
665     }
v_SetCMYK(FX_FLOAT * pBuf,FX_FLOAT c,FX_FLOAT m,FX_FLOAT y,FX_FLOAT k)666     virtual FX_BOOL			v_SetCMYK(FX_FLOAT* pBuf, FX_FLOAT c, FX_FLOAT m, FX_FLOAT y, FX_FLOAT k) const
667     {
668         return FALSE;
669     }
670 
671     int						m_Family;
672 
673     int						m_nComponents;
674 
675     CPDF_Array*				m_pArray;
676 
677     FX_DWORD				m_dwStdConversion;
678 };
679 class CPDF_Color : public CFX_Object
680 {
681 public:
682 
CPDF_Color()683     CPDF_Color()
684     {
685         m_pBuffer = NULL;
686         m_pCS = NULL;
687     }
688 
689     CPDF_Color(int family);
690 
691     ~CPDF_Color();
692 
IsNull()693     FX_BOOL					IsNull() const
694     {
695         return m_pBuffer == NULL;
696     }
697 
698     FX_BOOL					IsEqual(const CPDF_Color& other) const;
699 
IsPattern()700     FX_BOOL					IsPattern() const
701     {
702         return m_pCS && m_pCS->GetFamily() == PDFCS_PATTERN;
703     }
704 
705     void					Copy(const CPDF_Color* pSrc);
706 
707     void					SetColorSpace(CPDF_ColorSpace* pCS);
708 
709     void					SetValue(FX_FLOAT* comp);
710 
711     void					SetValue(CPDF_Pattern* pPattern, FX_FLOAT* comp, int ncomps);
712 
713     FX_BOOL					GetRGB(int& R, int& G, int& B) const;
714 
715     CPDF_Pattern*			GetPattern() const;
716 
717     CPDF_ColorSpace*		GetPatternCS() const;
718 
719     FX_FLOAT*			GetPatternColor() const;
720 
721     CPDF_ColorSpace*		m_pCS;
722 
723     FX_FLOAT*			m_pBuffer;
724 protected:
725     void	ReleaseBuffer();
726     void	ReleaseColorSpace();
727 };
728 #define PATTERN_TILING		1
729 #define PATTERN_SHADING		2
730 class CPDF_Pattern : public CFX_Object
731 {
732 public:
733 
~CPDF_Pattern()734     virtual ~CPDF_Pattern() {}
735 
736     CPDF_Object*			m_pPatternObj;
737 
738     int						m_PatternType;
739 
740     CFX_AffineMatrix		m_Pattern2Form;
741     CFX_AffineMatrix		m_ParentMatrix;
742 
743     CPDF_Document*			m_pDocument;
744 
745 protected:
746 
CPDF_Pattern(const CFX_AffineMatrix * pParentMatrix)747     CPDF_Pattern(const CFX_AffineMatrix* pParentMatrix)
748     {
749         if (pParentMatrix) {
750             m_ParentMatrix = *pParentMatrix;
751         }
752     }
753 };
754 class CPDF_TilingPattern : public CPDF_Pattern
755 {
756 public:
757 
758     CPDF_TilingPattern(CPDF_Document* pDoc, CPDF_Object* pPatternObj, const CFX_AffineMatrix* parentMatrix);
759 
760     virtual ~CPDF_TilingPattern();
761 
762     FX_BOOL				Load();
763 
764 
765 
766     FX_BOOL				m_bColored;
767 
768     CFX_FloatRect		m_BBox;
769 
770     FX_FLOAT			m_XStep;
771 
772     FX_FLOAT			m_YStep;
773 
774 
775 
776     CPDF_Form*			m_pForm;
777 };
778 class CPDF_ShadingPattern : public CPDF_Pattern
779 {
780 public:
781 
782     CPDF_ShadingPattern(CPDF_Document* pDoc, CPDF_Object* pPatternObj, FX_BOOL bShading, const CFX_AffineMatrix* parentMatrix);
783 
784     virtual ~CPDF_ShadingPattern();
785 
786     CPDF_Object*		m_pShadingObj;
787 
788     FX_BOOL				m_bShadingObj;
789 
790     FX_BOOL				Load();
791 
792     FX_BOOL				Reload();
793 
794     int					m_ShadingType;
795 
796     CPDF_ColorSpace*	m_pCS;
797 
798 
799     CPDF_Function*		m_pFunctions[4];
800 
801     int					m_nFuncs;
802 protected:
803     void	Clear();
804 };
805 struct CPDF_MeshVertex {
806     FX_FLOAT x, y;
807     FX_FLOAT r, g, b;
808 };
809 class CPDF_MeshStream : public CFX_Object
810 {
811 public:
812 
813     FX_BOOL				Load(CPDF_Stream* pShadingStream, CPDF_Function** pFuncs, int nFuncs, CPDF_ColorSpace* pCS);
814 
815     FX_DWORD			GetFlag();
816 
817     void				GetCoords(FX_FLOAT& x, FX_FLOAT& y);
818 
819     void				GetColor(FX_FLOAT& r, FX_FLOAT& g, FX_FLOAT& b);
820 
821     FX_DWORD 			GetVertex(CPDF_MeshVertex& vertex, CFX_AffineMatrix* pObject2Bitmap);
822 
823     FX_BOOL				GetVertexRow(CPDF_MeshVertex* vertex, int count, CFX_AffineMatrix* pObject2Bitmap);
824     CPDF_Function**	m_pFuncs;
825     CPDF_ColorSpace*	m_pCS;
826     FX_DWORD			m_nFuncs, m_nCoordBits, m_nCompBits, m_nFlagBits, m_nComps;
827     FX_DWORD			m_CoordMax, m_CompMax;
828     FX_FLOAT			m_xmin, m_xmax, m_ymin, m_ymax;
829     FX_FLOAT			m_ColorMin[8], m_ColorMax[8];
830     CPDF_StreamAcc		m_Stream;
831     CFX_BitStream		m_BitStream;
832 };
833 #define PDF_IMAGE_NO_COMPRESS				0x0000
834 #define PDF_IMAGE_LOSSY_COMPRESS			0x0001
835 #define PDF_IMAGE_LOSSLESS_COMPRESS			0x0002
836 #define PDF_IMAGE_MASK_LOSSY_COMPRESS		0x0004
837 #define PDF_IMAGE_MASK_LOSSLESS_COMPRESS	0x0008
838 class CPDF_ImageSetParam
839 {
840 public:
CPDF_ImageSetParam()841     CPDF_ImageSetParam()
842         : pMatteColor(NULL)
843         , nQuality(80)
844     {
845     }
846     FX_ARGB* pMatteColor;
847     FX_INT32 nQuality;
848 };
849 class CPDF_Image : public CFX_Object
850 {
851 public:
852 
853     CPDF_Image(CPDF_Document* pDoc);
854 
855     ~CPDF_Image();
856 
857     FX_BOOL					LoadImageF(CPDF_Stream* pImageStream, FX_BOOL bInline);
858 
859     void					Release();
860 
861     CPDF_Image*				Clone();
862 
IsInline()863     FX_BOOL					IsInline()
864     {
865         return m_bInline;
866     }
867 
SetInlineDict(CPDF_Dictionary * pDict)868     void					SetInlineDict(CPDF_Dictionary* pDict)
869     {
870         m_pInlineDict = pDict;
871     }
872 
GetInlineDict()873     CPDF_Dictionary*		GetInlineDict() const
874     {
875         return m_pInlineDict;
876     }
877 
GetStream()878     CPDF_Stream*			GetStream() const
879     {
880         return m_pStream;
881     }
882 
GetDict()883     CPDF_Dictionary*		GetDict() const
884     {
885         return m_pStream->GetDict();
886     }
887 
GetOC()888     CPDF_Dictionary*		GetOC() const
889     {
890         return m_pOC;
891     }
892 
GetDocument()893     CPDF_Document*			GetDocument() const
894     {
895         return m_pDocument;
896     }
897 
898 
899 
GetPixelHeight()900     FX_INT32				GetPixelHeight() const
901     {
902         return m_Height;
903     }
904 
GetPixelWidth()905     FX_INT32				GetPixelWidth() const
906     {
907         return m_Width;
908     }
909 
910 
IsMask()911     FX_BOOL					IsMask() const
912     {
913         return m_bIsMask;
914     }
915 
IsInterpol()916     FX_BOOL					IsInterpol() const
917     {
918         return m_bInterpolate;
919     }
920 
921     CFX_DIBSource*			LoadDIBSource(CFX_DIBSource** ppMask = NULL, FX_DWORD* pMatteColor = NULL, FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE) const;
922 
923 
924 
925     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);
926 
927     void					SetJpegImage(FX_BYTE* pImageData, FX_DWORD size);
928 
929     void					SetJpegImage(IFX_FileRead *pFile);
930 
931     void					ResetCache(CPDF_Page* pPage, const CFX_DIBitmap* pDIBitmap);
932 
933 public:
934     FX_BOOL					StartLoadDIBSource(CPDF_Dictionary* pFormResource, CPDF_Dictionary* pPageResource, FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE);
935     FX_BOOL					Continue(IFX_Pause* pPause);
936     CFX_DIBSource*			DetachBitmap();
937     CFX_DIBSource*			DetachMask();
938     CFX_DIBSource*			m_pDIBSource;
939     CFX_DIBSource*			m_pMask;
940     FX_DWORD				m_MatteColor;
941 private:
942 
943     CPDF_Stream*			m_pStream;
944     FX_BOOL					m_bInline;
945     CPDF_Dictionary*		m_pInlineDict;
946 
947     FX_INT32				m_Height;
948 
949     FX_INT32				m_Width;
950 
951     FX_BOOL					m_bIsMask;
952 
953     FX_BOOL					m_bInterpolate;
954 
955     CPDF_Document*			m_pDocument;
956 
957     CPDF_Dictionary*		m_pOC;
958     CPDF_Dictionary*	InitJPEG(FX_LPBYTE pData, FX_DWORD size);
959 };
960 #endif
961