| 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/include/fxcrt/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 |