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