• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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()16 CPDF_PatternCS::CPDF_PatternCS() : CPDF_BasedCS(Family::kPattern) {}
17 
18 CPDF_PatternCS::~CPDF_PatternCS() = default;
19 
InitializeStockPattern()20 void CPDF_PatternCS::InitializeStockPattern() {
21   SetComponentsForStockCS(1);
22 }
23 
v_Load(CPDF_Document * pDoc,const CPDF_Array * pArray,std::set<const CPDF_Object * > * pVisited)24 uint32_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) const47 std::optional<FX_RGB_STRUCT<float>> CPDF_PatternCS::GetRGB(
48     pdfium::span<const float> pBuf) const {
49   NOTREACHED_NORETURN();
50 }
51 
AsPatternCS() const52 const CPDF_PatternCS* CPDF_PatternCS::AsPatternCS() const {
53   return this;
54 }
55 
GetPatternRGB(const PatternValue & value) const56 std::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