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 <array> 11 #include <memory> 12 #include <set> 13 #include <vector> 14 15 #include "core/fpdfapi/page/cpdf_pattern.h" 16 #include "core/fxcrt/fx_string.h" 17 #include "core/fxcrt/fx_system.h" 18 #include "core/fxcrt/observed_ptr.h" 19 #include "core/fxcrt/retain_ptr.h" 20 #include "core/fxcrt/unowned_ptr.h" 21 #include "third_party/base/span.h" 22 23 #define PDFCS_DEVICEGRAY 1 24 #define PDFCS_DEVICERGB 2 25 #define PDFCS_DEVICECMYK 3 26 #define PDFCS_CALGRAY 4 27 #define PDFCS_CALRGB 5 28 #define PDFCS_LAB 6 29 #define PDFCS_ICCBASED 7 30 #define PDFCS_SEPARATION 8 31 #define PDFCS_DEVICEN 9 32 #define PDFCS_INDEXED 10 33 #define PDFCS_PATTERN 11 34 35 class CPDF_Array; 36 class CPDF_Document; 37 class CPDF_Object; 38 class CPDF_PatternCS; 39 40 constexpr size_t kMaxPatternColorComps = 16; 41 42 class PatternValue { 43 public: 44 PatternValue(); 45 PatternValue(const PatternValue& that); 46 ~PatternValue(); 47 48 void SetComps(pdfium::span<const float> comps); GetComps()49 pdfium::span<const float> GetComps() const { 50 // TODO(tsepez): update span.h from base for implicit std::array ctor. 51 return {m_Comps.data(), m_Comps.size()}; 52 } 53 GetPattern()54 CPDF_Pattern* GetPattern() const { return m_pRetainedPattern.Get(); } SetPattern(const RetainPtr<CPDF_Pattern> & pPattern)55 void SetPattern(const RetainPtr<CPDF_Pattern>& pPattern) { 56 m_pRetainedPattern = pPattern; 57 } 58 59 private: 60 RetainPtr<CPDF_Pattern> m_pRetainedPattern; 61 std::array<float, kMaxPatternColorComps> m_Comps; 62 }; 63 64 class CPDF_ColorSpace : public Retainable, public Observable { 65 public: 66 static RetainPtr<CPDF_ColorSpace> GetStockCS(int Family); 67 static RetainPtr<CPDF_ColorSpace> ColorspaceFromName(const ByteString& name); 68 static RetainPtr<CPDF_ColorSpace> Load(CPDF_Document* pDoc, 69 CPDF_Object* pObj); 70 static RetainPtr<CPDF_ColorSpace> Load( 71 CPDF_Document* pDoc, 72 const CPDF_Object* pObj, 73 std::set<const CPDF_Object*>* pVisited); 74 static uint32_t ComponentsForFamily(int family); 75 static bool IsValidIccComponents(int components); 76 GetArray()77 const CPDF_Array* GetArray() const { return m_pArray.Get(); } GetDocument()78 CPDF_Document* GetDocument() const { return m_pDocument.Get(); } 79 80 // Should only be called if this colorspace is not a pattern. 81 std::vector<float> CreateBufAndSetDefaultColor() const; 82 83 uint32_t CountComponents() const; GetFamily()84 int GetFamily() const { return m_Family; } IsSpecial()85 bool IsSpecial() const { 86 return GetFamily() == PDFCS_SEPARATION || GetFamily() == PDFCS_DEVICEN || 87 GetFamily() == PDFCS_INDEXED || GetFamily() == PDFCS_PATTERN; 88 } 89 90 virtual bool GetRGB(const float* pBuf, 91 float* R, 92 float* G, 93 float* B) const = 0; 94 95 virtual void GetDefaultValue(int iComponent, 96 float* value, 97 float* min, 98 float* max) const; 99 virtual void TranslateImageLine(uint8_t* dest_buf, 100 const uint8_t* src_buf, 101 int pixels, 102 int image_width, 103 int image_height, 104 bool bTransMask) const; 105 virtual void EnableStdConversion(bool bEnabled); 106 virtual bool IsNormal() const; 107 108 // Returns |this| as a CPDF_PatternCS* if |this| is a pattern. 109 virtual CPDF_PatternCS* AsPatternCS(); 110 virtual const CPDF_PatternCS* AsPatternCS() const; 111 112 // Use instead of GetRGB() for patterns. 113 virtual bool GetPatternRGB(const PatternValue& value, 114 float* R, 115 float* G, 116 float* B) const; 117 118 protected: 119 CPDF_ColorSpace(CPDF_Document* pDoc, int family); 120 ~CPDF_ColorSpace() override; 121 122 // Returns the number of components, or 0 on failure. 123 virtual uint32_t v_Load(CPDF_Document* pDoc, 124 const CPDF_Array* pArray, 125 std::set<const CPDF_Object*>* pVisited) = 0; 126 127 // Stock colorspaces are not loaded normally. This initializes their 128 // components count. 129 void SetComponentsForStockCS(uint32_t nComponents); 130 131 UnownedPtr<CPDF_Document> const m_pDocument; 132 RetainPtr<const CPDF_Array> m_pArray; 133 const int m_Family; 134 uint32_t m_dwStdConversion = 0; 135 136 private: 137 uint32_t m_nComponents = 0; 138 }; 139 140 #endif // CORE_FPDFAPI_PAGE_CPDF_COLORSPACE_H_ 141