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