• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2016 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_FPDFAPI_PAGE_CPDF_COLORSPACE_H_
8 #define CORE_FPDFAPI_PAGE_CPDF_COLORSPACE_H_
9 
10 #include <memory>
11 #include <set>
12 
13 #include "core/fpdfapi/page/cpdf_pattern.h"
14 #include "core/fxcrt/fx_string.h"
15 #include "core/fxcrt/fx_system.h"
16 #include "core/fxcrt/unowned_ptr.h"
17 
18 #define PDFCS_DEVICEGRAY 1
19 #define PDFCS_DEVICERGB 2
20 #define PDFCS_DEVICECMYK 3
21 #define PDFCS_CALGRAY 4
22 #define PDFCS_CALRGB 5
23 #define PDFCS_LAB 6
24 #define PDFCS_ICCBASED 7
25 #define PDFCS_SEPARATION 8
26 #define PDFCS_DEVICEN 9
27 #define PDFCS_INDEXED 10
28 #define PDFCS_PATTERN 11
29 
30 class CPDF_Array;
31 class CPDF_Document;
32 class CPDF_Object;
33 
34 constexpr size_t kMaxPatternColorComps = 16;
35 
36 struct PatternValue {
37   CPDF_Pattern* m_pPattern;
38   CPDF_CountedPattern* m_pCountedPattern;
39   int m_nComps;
40   float m_Comps[kMaxPatternColorComps];
41 };
42 
43 class CPDF_ColorSpace {
44  public:
45   static CPDF_ColorSpace* GetStockCS(int Family);
46   static CPDF_ColorSpace* ColorspaceFromName(const ByteString& name);
47   static std::unique_ptr<CPDF_ColorSpace> Load(CPDF_Document* pDoc,
48                                                CPDF_Object* pCSObj);
49   static std::unique_ptr<CPDF_ColorSpace> Load(
50       CPDF_Document* pDoc,
51       CPDF_Object* pCSObj,
52       std::set<CPDF_Object*>* pVisited);
53 
54   void Release();
55 
56   int GetBufSize() const;
57   float* CreateBuf();
58   void GetDefaultColor(float* buf) const;
59   uint32_t CountComponents() const;
GetFamily()60   int GetFamily() const { return m_Family; }
IsSpecial()61   bool IsSpecial() const {
62     return GetFamily() == PDFCS_SEPARATION || GetFamily() == PDFCS_DEVICEN ||
63            GetFamily() == PDFCS_INDEXED || GetFamily() == PDFCS_PATTERN;
64   }
65 
66   virtual void GetDefaultValue(int iComponent,
67                                float* value,
68                                float* min,
69                                float* max) const;
70 
71   virtual bool GetRGB(float* pBuf, float* R, float* G, float* B) const = 0;
72 
73   virtual void TranslateImageLine(uint8_t* dest_buf,
74                                   const uint8_t* src_buf,
75                                   int pixels,
76                                   int image_width,
77                                   int image_height,
78                                   bool bTransMask) const;
79   virtual void EnableStdConversion(bool bEnabled);
80 
GetArray()81   CPDF_Array* GetArray() const { return m_pArray.Get(); }
GetDocument()82   CPDF_Document* GetDocument() const { return m_pDocument.Get(); }
83 
84  protected:
85   CPDF_ColorSpace(CPDF_Document* pDoc, int family);
86   virtual ~CPDF_ColorSpace();
87 
88   // Returns the number of components, or 0 on failure.
89   virtual uint32_t v_Load(CPDF_Document* pDoc,
90                           CPDF_Array* pArray,
91                           std::set<CPDF_Object*>* pVisited) = 0;
92 
93   // Stock colorspaces are not loaded normally. This initializes their
94   // components count.
95   void SetComponentsForStockCS(uint32_t nComponents);
96 
97   UnownedPtr<CPDF_Document> const m_pDocument;
98   UnownedPtr<CPDF_Array> m_pArray;
99   const int m_Family;
100   uint32_t m_dwStdConversion = 0;
101 
102  private:
103   uint32_t m_nComponents = 0;
104 };
105 using CPDF_CountedColorSpace = CPDF_CountedObject<CPDF_ColorSpace>;
106 
107 namespace std {
108 
109 // Make std::unique_ptr<CPDF_ColorSpace> call Release() rather than
110 // simply deleting the object.
111 template <>
112 struct default_delete<CPDF_ColorSpace> {
113   void operator()(CPDF_ColorSpace* pColorSpace) const {
114     if (pColorSpace)
115       pColorSpace->Release();
116   }
117 };
118 
119 }  // namespace std
120 
121 #endif  // CORE_FPDFAPI_PAGE_CPDF_COLORSPACE_H_
122