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/fpdf_page/cpdf_contentmarkdata.h"
8 
9 #include "core/fpdfapi/fpdf_parser/include/cpdf_dictionary.h"
10 #include "third_party/base/stl_util.h"
11 
CPDF_ContentMarkData()12 CPDF_ContentMarkData::CPDF_ContentMarkData() {}
13 
CPDF_ContentMarkData(const CPDF_ContentMarkData & src)14 CPDF_ContentMarkData::CPDF_ContentMarkData(const CPDF_ContentMarkData& src)
15     : m_Marks(src.m_Marks) {}
16 
~CPDF_ContentMarkData()17 CPDF_ContentMarkData::~CPDF_ContentMarkData() {}
18 
CountItems() const19 int CPDF_ContentMarkData::CountItems() const {
20   return pdfium::CollectionSize<int>(m_Marks);
21 }
22 
GetItem(int index)23 CPDF_ContentMarkItem& CPDF_ContentMarkData::GetItem(int index) {
24   return m_Marks[index];
25 }
26 
GetItem(int index) const27 const CPDF_ContentMarkItem& CPDF_ContentMarkData::GetItem(int index) const {
28   return m_Marks[index];
29 }
30 
GetMCID() const31 int CPDF_ContentMarkData::GetMCID() const {
32   for (const auto& mark : m_Marks) {
33     CPDF_ContentMarkItem::ParamType type = mark.GetParamType();
34     if (type == CPDF_ContentMarkItem::PropertiesDict ||
35         type == CPDF_ContentMarkItem::DirectDict) {
36       CPDF_Dictionary* pDict = mark.GetParam();
37       if (pDict->KeyExist("MCID"))
38         return pDict->GetIntegerBy("MCID");
39     }
40   }
41   return -1;
42 }
43 
AddMark(const CFX_ByteString & name,CPDF_Dictionary * pDict,FX_BOOL bDirect)44 void CPDF_ContentMarkData::AddMark(const CFX_ByteString& name,
45                                    CPDF_Dictionary* pDict,
46                                    FX_BOOL bDirect) {
47   CPDF_ContentMarkItem item;
48   item.SetName(name);
49   if (pDict) {
50     if (bDirect) {
51       item.SetParam(CPDF_ContentMarkItem::DirectDict,
52                     ToDictionary(pDict->Clone()));
53     } else {
54       item.SetParam(CPDF_ContentMarkItem::PropertiesDict, pDict);
55     }
56   }
57   m_Marks.push_back(item);
58 }
59 
DeleteLastMark()60 void CPDF_ContentMarkData::DeleteLastMark() {
61   if (!m_Marks.empty())
62     m_Marks.pop_back();
63 }
64