Home | History | Annotate | Download | only in page
      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