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 #include "core/fpdfapi/page/cpdf_contentmark.h" 8 9 #include <memory> 10 #include <utility> 11 12 #include "core/fpdfapi/parser/cpdf_dictionary.h" 13 #include "third_party/base/stl_util.h" 14 15 CPDF_ContentMark::CPDF_ContentMark() {} 16 17 CPDF_ContentMark::CPDF_ContentMark(const CPDF_ContentMark& that) 18 : m_Ref(that.m_Ref) {} 19 20 CPDF_ContentMark::~CPDF_ContentMark() {} 21 22 void CPDF_ContentMark::SetNull() { 23 m_Ref.SetNull(); 24 } 25 26 int CPDF_ContentMark::CountItems() const { 27 return m_Ref.GetObject()->CountItems(); 28 } 29 30 const CPDF_ContentMarkItem& CPDF_ContentMark::GetItem(int i) const { 31 return m_Ref.GetObject()->GetItem(i); 32 } 33 34 int CPDF_ContentMark::GetMCID() const { 35 const MarkData* pData = m_Ref.GetObject(); 36 return pData ? pData->GetMCID() : -1; 37 } 38 39 void CPDF_ContentMark::AddMark(const CFX_ByteString& name, 40 CPDF_Dictionary* pDict, 41 bool bDirect) { 42 m_Ref.GetPrivateCopy()->AddMark(name, pDict, bDirect); 43 } 44 45 void CPDF_ContentMark::DeleteLastMark() { 46 m_Ref.GetPrivateCopy()->DeleteLastMark(); 47 if (CountItems() == 0) 48 m_Ref.SetNull(); 49 } 50 51 bool CPDF_ContentMark::HasMark(const CFX_ByteStringC& mark) const { 52 const MarkData* pData = m_Ref.GetObject(); 53 if (!pData) 54 return false; 55 56 for (int i = 0; i < pData->CountItems(); i++) { 57 if (pData->GetItem(i).GetName() == mark) 58 return true; 59 } 60 return false; 61 } 62 63 bool CPDF_ContentMark::LookupMark(const CFX_ByteStringC& mark, 64 CPDF_Dictionary*& pDict) const { 65 const MarkData* pData = m_Ref.GetObject(); 66 if (!pData) 67 return false; 68 69 for (int i = 0; i < pData->CountItems(); i++) { 70 const CPDF_ContentMarkItem& item = pData->GetItem(i); 71 if (item.GetName() == mark) { 72 pDict = item.GetParam(); 73 return true; 74 } 75 } 76 return false; 77 } 78 79 CPDF_ContentMark::MarkData::MarkData() {} 80 81 CPDF_ContentMark::MarkData::MarkData(const MarkData& src) 82 : m_Marks(src.m_Marks) {} 83 84 CPDF_ContentMark::MarkData::~MarkData() {} 85 86 int CPDF_ContentMark::MarkData::CountItems() const { 87 return pdfium::CollectionSize<int>(m_Marks); 88 } 89 90 CPDF_ContentMarkItem& CPDF_ContentMark::MarkData::GetItem(int index) { 91 return m_Marks[index]; 92 } 93 94 const CPDF_ContentMarkItem& CPDF_ContentMark::MarkData::GetItem( 95 int index) const { 96 return m_Marks[index]; 97 } 98 99 int CPDF_ContentMark::MarkData::GetMCID() const { 100 for (const auto& mark : m_Marks) { 101 CPDF_Dictionary* pDict = mark.GetParam(); 102 if (pDict && pDict->KeyExist("MCID")) 103 return pDict->GetIntegerFor("MCID"); 104 } 105 return -1; 106 } 107 108 void CPDF_ContentMark::MarkData::AddMark(const CFX_ByteString& name, 109 CPDF_Dictionary* pDict, 110 bool bDirect) { 111 CPDF_ContentMarkItem item; 112 item.SetName(name); 113 if (pDict) { 114 if (bDirect) { 115 item.SetDirectDict( 116 std::unique_ptr<CPDF_Dictionary>(ToDictionary(pDict->Clone()))); 117 } else { 118 item.SetPropertiesDict(pDict); 119 } 120 } 121 m_Marks.push_back(std::move(item)); 122 } 123 124 void CPDF_ContentMark::MarkData::DeleteLastMark() { 125 if (!m_Marks.empty()) 126 m_Marks.pop_back(); 127 } 128