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