Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2016 PDFium Authors. All rights reserved. | 1 // Copyright 2016 PDFium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
| 6 | 6 |
| 7 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h" | 7 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h" |
| 8 | 8 |
| 9 #include <set> | |
| 10 | |
| 9 #include "core/fpdfapi/fpdf_parser/include/cpdf_name.h" | 11 #include "core/fpdfapi/fpdf_parser/include/cpdf_name.h" |
| 10 #include "core/fpdfapi/fpdf_parser/include/cpdf_number.h" | 12 #include "core/fpdfapi/fpdf_parser/include/cpdf_number.h" |
| 11 #include "core/fpdfapi/fpdf_parser/include/cpdf_reference.h" | 13 #include "core/fpdfapi/fpdf_parser/include/cpdf_reference.h" |
| 12 #include "core/fpdfapi/fpdf_parser/include/cpdf_stream.h" | 14 #include "core/fpdfapi/fpdf_parser/include/cpdf_stream.h" |
| 13 #include "core/fpdfapi/fpdf_parser/include/cpdf_string.h" | 15 #include "core/fpdfapi/fpdf_parser/include/cpdf_string.h" |
| 14 #include "third_party/base/stl_util.h" | 16 #include "third_party/base/stl_util.h" |
| 15 | 17 |
| 16 CPDF_Array::CPDF_Array() {} | 18 CPDF_Array::CPDF_Array() {} |
| 17 | 19 |
| 18 CPDF_Array::~CPDF_Array() { | 20 CPDF_Array::~CPDF_Array() { |
| 19 // Mark the object as deleted so that it will not be deleted again | 21 // Mark the object as deleted so that it will not be deleted again |
| 20 // in case of cyclic references. | 22 // in case of cyclic references. |
| 21 m_ObjNum = kInvalidObjNum; | 23 m_ObjNum = kInvalidObjNum; |
| 22 for (auto& it : m_Objects) { | 24 for (auto& it : m_Objects) { |
| 23 if (it) | 25 if (it) |
|
Lei Zhang
2016/08/25 17:20:24
Same check here.
| |
| 24 it->Release(); | 26 it->Release(); |
| 25 } | 27 } |
| 26 } | 28 } |
| 27 | 29 |
| 28 CPDF_Object::Type CPDF_Array::GetType() const { | 30 CPDF_Object::Type CPDF_Array::GetType() const { |
| 29 return ARRAY; | 31 return ARRAY; |
| 30 } | 32 } |
| 31 | 33 |
| 32 bool CPDF_Array::IsArray() const { | 34 bool CPDF_Array::IsArray() const { |
| 33 return true; | 35 return true; |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 44 CPDF_Object* CPDF_Array::Clone() const { | 46 CPDF_Object* CPDF_Array::Clone() const { |
| 45 return CloneObjectNonCyclic(false); | 47 return CloneObjectNonCyclic(false); |
| 46 } | 48 } |
| 47 | 49 |
| 48 CPDF_Object* CPDF_Array::CloneNonCyclic( | 50 CPDF_Object* CPDF_Array::CloneNonCyclic( |
| 49 bool bDirect, | 51 bool bDirect, |
| 50 std::set<const CPDF_Object*>* pVisited) const { | 52 std::set<const CPDF_Object*>* pVisited) const { |
| 51 pVisited->insert(this); | 53 pVisited->insert(this); |
| 52 CPDF_Array* pCopy = new CPDF_Array(); | 54 CPDF_Array* pCopy = new CPDF_Array(); |
| 53 for (size_t i = 0; i < GetCount(); i++) { | 55 for (size_t i = 0; i < GetCount(); i++) { |
| 54 CPDF_Object* value = m_Objects.at(i); | 56 CPDF_Object* value = m_Objects[i]; |
| 55 if (!pdfium::ContainsKey(*pVisited, value)) | 57 if (!pdfium::ContainsKey(*pVisited, value)) |
| 56 pCopy->m_Objects.push_back(value->CloneNonCyclic(bDirect, pVisited)); | 58 pCopy->m_Objects.push_back(value->CloneNonCyclic(bDirect, pVisited)); |
| 57 } | 59 } |
| 58 return pCopy; | 60 return pCopy; |
| 59 } | 61 } |
| 60 | 62 |
| 61 CFX_FloatRect CPDF_Array::GetRect() { | 63 CFX_FloatRect CPDF_Array::GetRect() { |
| 62 CFX_FloatRect rect; | 64 CFX_FloatRect rect; |
| 63 if (!IsArray() || m_Objects.size() != 4) | 65 if (!IsArray() || m_Objects.size() != 4) |
| 64 return rect; | 66 return rect; |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 76 return matrix; | 78 return matrix; |
| 77 | 79 |
| 78 matrix.Set(GetNumberAt(0), GetNumberAt(1), GetNumberAt(2), GetNumberAt(3), | 80 matrix.Set(GetNumberAt(0), GetNumberAt(1), GetNumberAt(2), GetNumberAt(3), |
| 79 GetNumberAt(4), GetNumberAt(5)); | 81 GetNumberAt(4), GetNumberAt(5)); |
| 80 return matrix; | 82 return matrix; |
| 81 } | 83 } |
| 82 | 84 |
| 83 CPDF_Object* CPDF_Array::GetObjectAt(size_t i) const { | 85 CPDF_Object* CPDF_Array::GetObjectAt(size_t i) const { |
| 84 if (i >= m_Objects.size()) | 86 if (i >= m_Objects.size()) |
| 85 return nullptr; | 87 return nullptr; |
| 86 return m_Objects.at(i); | 88 return m_Objects[i]; |
| 87 } | 89 } |
| 88 | 90 |
| 89 CPDF_Object* CPDF_Array::GetDirectObjectAt(size_t i) const { | 91 CPDF_Object* CPDF_Array::GetDirectObjectAt(size_t i) const { |
| 90 if (i >= m_Objects.size()) | 92 if (i >= m_Objects.size()) |
| 91 return nullptr; | 93 return nullptr; |
| 92 return m_Objects.at(i)->GetDirect(); | 94 return m_Objects[i]->GetDirect(); |
| 93 } | 95 } |
| 94 | 96 |
| 95 CFX_ByteString CPDF_Array::GetStringAt(size_t i) const { | 97 CFX_ByteString CPDF_Array::GetStringAt(size_t i) const { |
| 96 if (i >= m_Objects.size()) | 98 if (i >= m_Objects.size()) |
| 97 return CFX_ByteString(); | 99 return CFX_ByteString(); |
| 98 return m_Objects.at(i)->GetString(); | 100 return m_Objects[i]->GetString(); |
| 99 } | 101 } |
| 100 | 102 |
| 101 int CPDF_Array::GetIntegerAt(size_t i) const { | 103 int CPDF_Array::GetIntegerAt(size_t i) const { |
| 102 if (i >= m_Objects.size()) | 104 if (i >= m_Objects.size()) |
| 103 return 0; | 105 return 0; |
| 104 return m_Objects.at(i)->GetInteger(); | 106 return m_Objects[i]->GetInteger(); |
| 105 } | 107 } |
| 106 | 108 |
| 107 FX_FLOAT CPDF_Array::GetNumberAt(size_t i) const { | 109 FX_FLOAT CPDF_Array::GetNumberAt(size_t i) const { |
| 108 if (i >= m_Objects.size()) | 110 if (i >= m_Objects.size()) |
| 109 return 0; | 111 return 0; |
| 110 return m_Objects.at(i)->GetNumber(); | 112 return m_Objects[i]->GetNumber(); |
| 111 } | 113 } |
| 112 | 114 |
| 113 CPDF_Dictionary* CPDF_Array::GetDictAt(size_t i) const { | 115 CPDF_Dictionary* CPDF_Array::GetDictAt(size_t i) const { |
| 114 CPDF_Object* p = GetDirectObjectAt(i); | 116 CPDF_Object* p = GetDirectObjectAt(i); |
| 115 if (!p) | 117 if (!p) |
| 116 return nullptr; | 118 return nullptr; |
| 117 if (CPDF_Dictionary* pDict = p->AsDictionary()) | 119 if (CPDF_Dictionary* pDict = p->AsDictionary()) |
| 118 return pDict; | 120 return pDict; |
| 119 if (CPDF_Stream* pStream = p->AsStream()) | 121 if (CPDF_Stream* pStream = p->AsStream()) |
| 120 return pStream->GetDict(); | 122 return pStream->GetDict(); |
| 121 return nullptr; | 123 return nullptr; |
| 122 } | 124 } |
| 123 | 125 |
| 124 CPDF_Stream* CPDF_Array::GetStreamAt(size_t i) const { | 126 CPDF_Stream* CPDF_Array::GetStreamAt(size_t i) const { |
| 125 return ToStream(GetDirectObjectAt(i)); | 127 return ToStream(GetDirectObjectAt(i)); |
| 126 } | 128 } |
| 127 | 129 |
| 128 CPDF_Array* CPDF_Array::GetArrayAt(size_t i) const { | 130 CPDF_Array* CPDF_Array::GetArrayAt(size_t i) const { |
| 129 return ToArray(GetDirectObjectAt(i)); | 131 return ToArray(GetDirectObjectAt(i)); |
| 130 } | 132 } |
| 131 | 133 |
| 132 void CPDF_Array::RemoveAt(size_t i, size_t nCount) { | 134 void CPDF_Array::RemoveAt(size_t i, size_t nCount) { |
| 133 if (i >= m_Objects.size()) | 135 if (i >= m_Objects.size()) |
| 134 return; | 136 return; |
| 135 | 137 |
| 136 if (nCount <= 0 || nCount > m_Objects.size() - i) | 138 if (nCount <= 0 || nCount > m_Objects.size() - i) |
| 137 return; | 139 return; |
| 138 | 140 |
| 139 for (size_t j = 0; j < nCount; ++j) { | 141 for (size_t j = 0; j < nCount; ++j) { |
| 140 if (CPDF_Object* p = m_Objects.at(i + j)) | 142 if (CPDF_Object* p = m_Objects[i + j]) |
| 141 p->Release(); | 143 p->Release(); |
| 142 } | 144 } |
| 143 m_Objects.erase(m_Objects.begin() + i, m_Objects.begin() + i + nCount); | 145 m_Objects.erase(m_Objects.begin() + i, m_Objects.begin() + i + nCount); |
| 144 } | 146 } |
| 145 | 147 |
| 146 void CPDF_Array::SetAt(size_t i, | 148 void CPDF_Array::SetAt(size_t i, |
| 147 CPDF_Object* pObj, | 149 CPDF_Object* pObj, |
| 148 CPDF_IndirectObjectHolder* pObjs) { | 150 CPDF_IndirectObjectHolder* pObjs) { |
| 149 ASSERT(IsArray()); | 151 ASSERT(IsArray()); |
| 150 ASSERT(i < m_Objects.size()); | 152 if (i >= m_Objects.size()) { |
| 151 if (i >= m_Objects.size()) | 153 ASSERT(false); |
| 152 return; | 154 return; |
| 153 if (CPDF_Object* pOld = m_Objects.at(i)) | 155 } |
| 156 if (CPDF_Object* pOld = m_Objects[i]) | |
| 154 pOld->Release(); | 157 pOld->Release(); |
| 155 if (pObj->GetObjNum()) { | 158 if (pObj->GetObjNum()) { |
| 156 ASSERT(pObjs); | 159 ASSERT(pObjs); |
| 157 pObj = new CPDF_Reference(pObjs, pObj->GetObjNum()); | 160 pObj = new CPDF_Reference(pObjs, pObj->GetObjNum()); |
| 158 } | 161 } |
| 159 m_Objects[i] = pObj; | 162 m_Objects[i] = pObj; |
| 160 } | 163 } |
| 161 | 164 |
| 162 void CPDF_Array::InsertAt(size_t index, | 165 void CPDF_Array::InsertAt(size_t index, |
| 163 CPDF_Object* pObj, | 166 CPDF_Object* pObj, |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 203 ASSERT(IsArray()); | 206 ASSERT(IsArray()); |
| 204 CPDF_Number* pNumber = new CPDF_Number(f); | 207 CPDF_Number* pNumber = new CPDF_Number(f); |
| 205 Add(pNumber); | 208 Add(pNumber); |
| 206 } | 209 } |
| 207 | 210 |
| 208 void CPDF_Array::AddReference(CPDF_IndirectObjectHolder* pDoc, | 211 void CPDF_Array::AddReference(CPDF_IndirectObjectHolder* pDoc, |
| 209 uint32_t objnum) { | 212 uint32_t objnum) { |
| 210 ASSERT(IsArray()); | 213 ASSERT(IsArray()); |
| 211 Add(new CPDF_Reference(pDoc, objnum)); | 214 Add(new CPDF_Reference(pDoc, objnum)); |
| 212 } | 215 } |
| OLD | NEW |