• 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 #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 
CPDF_ContentMark()15 CPDF_ContentMark::CPDF_ContentMark() {}
16 
CPDF_ContentMark(const CPDF_ContentMark & that)17 CPDF_ContentMark::CPDF_ContentMark(const CPDF_ContentMark& that)
18     : m_Ref(that.m_Ref) {}
19 
~CPDF_ContentMark()20 CPDF_ContentMark::~CPDF_ContentMark() {}
21 
SetNull()22 void CPDF_ContentMark::SetNull() {
23   m_Ref.SetNull();
24 }
25 
CountItems() const26 int CPDF_ContentMark::CountItems() const {
27   return m_Ref.GetObject()->CountItems();
28 }
29 
GetItem(int i) const30 const CPDF_ContentMarkItem& CPDF_ContentMark::GetItem(int i) const {
31   return m_Ref.GetObject()->GetItem(i);
32 }
33 
GetMCID() const34 int CPDF_ContentMark::GetMCID() const {
35   const MarkData* pData = m_Ref.GetObject();
36   return pData ? pData->GetMCID() : -1;
37 }
38 
AddMark(const CFX_ByteString & name,CPDF_Dictionary * pDict,bool bDirect)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 
DeleteLastMark()45 void CPDF_ContentMark::DeleteLastMark() {
46   m_Ref.GetPrivateCopy()->DeleteLastMark();
47   if (CountItems() == 0)
48     m_Ref.SetNull();
49 }
50 
HasMark(const CFX_ByteStringC & mark) const51 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 
LookupMark(const CFX_ByteStringC & mark,CPDF_Dictionary * & pDict) const63 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 
MarkData()79 CPDF_ContentMark::MarkData::MarkData() {}
80 
MarkData(const MarkData & src)81 CPDF_ContentMark::MarkData::MarkData(const MarkData& src)
82     : m_Marks(src.m_Marks) {}
83 
~MarkData()84 CPDF_ContentMark::MarkData::~MarkData() {}
85 
CountItems() const86 int CPDF_ContentMark::MarkData::CountItems() const {
87   return pdfium::CollectionSize<int>(m_Marks);
88 }
89 
GetItem(int index)90 CPDF_ContentMarkItem& CPDF_ContentMark::MarkData::GetItem(int index) {
91   return m_Marks[index];
92 }
93 
GetItem(int index) const94 const CPDF_ContentMarkItem& CPDF_ContentMark::MarkData::GetItem(
95     int index) const {
96   return m_Marks[index];
97 }
98 
GetMCID() const99 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 
AddMark(const CFX_ByteString & name,CPDF_Dictionary * pDict,bool bDirect)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 
DeleteLastMark()124 void CPDF_ContentMark::MarkData::DeleteLastMark() {
125   if (!m_Marks.empty())
126     m_Marks.pop_back();
127 }
128