1 // Copyright 2014 The PDFium Authors 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 #include "core/fpdfapi/page/cpdf_patterncs.h" 8 9 #include <optional> 10 11 #include "core/fpdfapi/page/cpdf_docpagedata.h" 12 #include "core/fpdfapi/parser/cpdf_array.h" 13 #include "core/fpdfapi/parser/cpdf_document.h" 14 #include "core/fxcrt/notreached.h" 15 CPDF_PatternCS()16CPDF_PatternCS::CPDF_PatternCS() : CPDF_BasedCS(Family::kPattern) {} 17 18 CPDF_PatternCS::~CPDF_PatternCS() = default; 19 InitializeStockPattern()20void CPDF_PatternCS::InitializeStockPattern() { 21 SetComponentsForStockCS(1); 22 } 23 v_Load(CPDF_Document * pDoc,const CPDF_Array * pArray,std::set<const CPDF_Object * > * pVisited)24uint32_t CPDF_PatternCS::v_Load(CPDF_Document* pDoc, 25 const CPDF_Array* pArray, 26 std::set<const CPDF_Object*>* pVisited) { 27 RetainPtr<const CPDF_Object> pBaseCS = pArray->GetDirectObjectAt(1); 28 if (HasSameArray(pBaseCS.Get())) 29 return 0; 30 31 auto* pDocPageData = CPDF_DocPageData::FromDocument(pDoc); 32 m_pBaseCS = 33 pDocPageData->GetColorSpaceGuarded(pBaseCS.Get(), nullptr, pVisited); 34 if (!m_pBaseCS) 35 return 1; 36 37 if (m_pBaseCS->GetFamily() == Family::kPattern) 38 return 0; 39 40 if (m_pBaseCS->ComponentCount() > kMaxPatternColorComps) { 41 return 0; 42 } 43 44 return m_pBaseCS->ComponentCount() + 1; 45 } 46 GetRGB(pdfium::span<const float> pBuf) const47std::optional<FX_RGB_STRUCT<float>> CPDF_PatternCS::GetRGB( 48 pdfium::span<const float> pBuf) const { 49 NOTREACHED_NORETURN(); 50 } 51 AsPatternCS() const52const CPDF_PatternCS* CPDF_PatternCS::AsPatternCS() const { 53 return this; 54 } 55 GetPatternRGB(const PatternValue & value) const56std::optional<FX_RGB_STRUCT<float>> CPDF_PatternCS::GetPatternRGB( 57 const PatternValue& value) const { 58 if (!m_pBaseCS) { 59 return std::nullopt; 60 } 61 62 return m_pBaseCS->GetRGB(value.GetComps()); 63 } 64