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