Index: core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp |
diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp |
index 2cb81002fb3202460a2a637290cd9aab826dd4b7..e0ce3faadfeaadfc7ad83a9141cc1564eaeae7c9 100644 |
--- a/core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp |
+++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp |
@@ -6,6 +6,8 @@ |
#include "core/include/fpdfapi/fpdf_objects.h" |
+#include <algorithm> |
+ |
#include "core/include/fpdfapi/fpdf_parser.h" |
#include "core/include/fxcrt/fx_string.h" |
#include "third_party/base/stl_util.h" |
@@ -147,7 +149,7 @@ CPDF_Dictionary* CPDF_Object::GetDict() const { |
return AsStream()->GetDict(); |
case PDFOBJ_REFERENCE: { |
const CPDF_Reference* pRef = AsReference(); |
- CPDF_IndirectObjects* pIndirect = pRef->GetObjList(); |
+ CPDF_IndirectObjectHolder* pIndirect = pRef->GetObjList(); |
if (!pIndirect) |
return nullptr; |
CPDF_Object* pObj = |
@@ -300,7 +302,7 @@ CPDF_Object* CPDF_Object::CloneInternal(FX_BOOL bDirect, |
} |
return NULL; |
} |
-CPDF_Object* CPDF_Object::CloneRef(CPDF_IndirectObjects* pDoc) const { |
+CPDF_Object* CPDF_Object::CloneRef(CPDF_IndirectObjectHolder* pDoc) const { |
if (m_ObjNum) { |
return new CPDF_Reference(pDoc, m_ObjNum); |
} |
@@ -513,7 +515,7 @@ void CPDF_Array::RemoveAt(FX_DWORD i, int nCount) { |
} |
void CPDF_Array::SetAt(FX_DWORD i, |
CPDF_Object* pObj, |
- CPDF_IndirectObjects* pObjs) { |
+ CPDF_IndirectObjectHolder* pObjs) { |
ASSERT(IsArray()); |
ASSERT(i < (FX_DWORD)m_Objects.GetSize()); |
if (i >= (FX_DWORD)m_Objects.GetSize()) |
@@ -528,14 +530,14 @@ void CPDF_Array::SetAt(FX_DWORD i, |
} |
void CPDF_Array::InsertAt(FX_DWORD index, |
CPDF_Object* pObj, |
- CPDF_IndirectObjects* pObjs) { |
+ CPDF_IndirectObjectHolder* pObjs) { |
if (pObj->GetObjNum()) { |
ASSERT(pObjs); |
pObj = new CPDF_Reference(pObjs, pObj->GetObjNum()); |
} |
m_Objects.InsertAt(index, pObj); |
} |
-void CPDF_Array::Add(CPDF_Object* pObj, CPDF_IndirectObjects* pObjs) { |
+void CPDF_Array::Add(CPDF_Object* pObj, CPDF_IndirectObjectHolder* pObjs) { |
if (pObj->GetObjNum()) { |
ASSERT(pObjs); |
pObj = new CPDF_Reference(pObjs, pObj->GetObjNum()); |
@@ -560,7 +562,8 @@ void CPDF_Array::AddNumber(FX_FLOAT f) { |
pNumber->SetNumber(f); |
Add(pNumber); |
} |
-void CPDF_Array::AddReference(CPDF_IndirectObjects* pDoc, FX_DWORD objnum) { |
+void CPDF_Array::AddReference(CPDF_IndirectObjectHolder* pDoc, |
+ FX_DWORD objnum) { |
ASSERT(IsArray()); |
Add(new CPDF_Reference(pDoc, objnum)); |
} |
@@ -765,12 +768,12 @@ void CPDF_Dictionary::SetAtString(const CFX_ByteStringC& key, |
SetAt(key, new CPDF_String(str, FALSE)); |
} |
void CPDF_Dictionary::SetAtReference(const CFX_ByteStringC& key, |
- CPDF_IndirectObjects* pDoc, |
+ CPDF_IndirectObjectHolder* pDoc, |
FX_DWORD objnum) { |
SetAt(key, new CPDF_Reference(pDoc, objnum)); |
} |
void CPDF_Dictionary::AddReference(const CFX_ByteStringC& key, |
- CPDF_IndirectObjects* pDoc, |
+ CPDF_IndirectObjectHolder* pDoc, |
FX_DWORD objnum) { |
SetAt(key, new CPDF_Reference(pDoc, objnum)); |
} |
@@ -1049,111 +1052,88 @@ uint8_t* CPDF_StreamAcc::DetachData() { |
FXSYS_memcpy(p, m_pData, m_dwSize); |
return p; |
} |
-void CPDF_Reference::SetRef(CPDF_IndirectObjects* pDoc, FX_DWORD objnum) { |
+void CPDF_Reference::SetRef(CPDF_IndirectObjectHolder* pDoc, FX_DWORD objnum) { |
m_pObjList = pDoc; |
m_RefObjNum = objnum; |
} |
-CPDF_IndirectObjects::CPDF_IndirectObjects(CPDF_Parser* pParser) { |
- m_pParser = pParser; |
- m_IndirectObjs.InitHashTable(1013); |
- if (pParser) { |
+CPDF_IndirectObjectHolder::CPDF_IndirectObjectHolder(CPDF_Parser* pParser) |
+ : m_pParser(pParser), m_LastObjNum(0) { |
+ if (pParser) |
m_LastObjNum = m_pParser->GetLastObjNum(); |
- } else { |
- m_LastObjNum = 0; |
- } |
} |
-CPDF_IndirectObjects::~CPDF_IndirectObjects() { |
- FX_POSITION pos = m_IndirectObjs.GetStartPosition(); |
- while (pos) { |
- void* key; |
- void* value; |
- m_IndirectObjs.GetNextAssoc(pos, key, value); |
- static_cast<CPDF_Object*>(value)->Destroy(); |
+CPDF_IndirectObjectHolder::~CPDF_IndirectObjectHolder() { |
+ for (const auto& pair : m_IndirectObjs) { |
+ pair.second->Destroy(); |
} |
} |
-CPDF_Object* CPDF_IndirectObjects::GetIndirectObject(FX_DWORD objnum, |
- PARSE_CONTEXT* pContext) { |
+CPDF_Object* CPDF_IndirectObjectHolder::GetIndirectObject( |
+ FX_DWORD objnum, |
+ PARSE_CONTEXT* pContext) { |
if (objnum == 0) |
return nullptr; |
- void* value; |
- if (m_IndirectObjs.Lookup((void*)(uintptr_t)objnum, value)) { |
- CPDF_Object* pValue = static_cast<CPDF_Object*>(value); |
- if (pValue->GetObjNum() == -1) |
- return nullptr; |
- return pValue; |
- } |
- CPDF_Object* pObj = nullptr; |
- if (m_pParser) |
- pObj = m_pParser->ParseIndirectObject(this, objnum, pContext); |
+ auto it = m_IndirectObjs.find(objnum); |
+ if (it != m_IndirectObjs.end()) |
+ return it->second->GetObjNum() != -1 ? it->second : nullptr; |
+ |
+ if (!m_pParser) |
+ return nullptr; |
+ |
+ CPDF_Object* pObj = m_pParser->ParseIndirectObject(this, objnum, pContext); |
if (!pObj) |
return nullptr; |
pObj->m_ObjNum = objnum; |
- if (m_LastObjNum < objnum) { |
- m_LastObjNum = objnum; |
- } |
- if (m_IndirectObjs.Lookup((void*)(uintptr_t)objnum, value)) { |
- if (value) |
- static_cast<CPDF_Object*>(value)->Destroy(); |
- } |
- m_IndirectObjs.SetAt((void*)(uintptr_t)objnum, pObj); |
+ m_LastObjNum = std::max(m_LastObjNum, objnum); |
+ if (m_IndirectObjs[objnum]) |
+ m_IndirectObjs[objnum]->Destroy(); |
+ |
+ m_IndirectObjs[objnum] = pObj; |
return pObj; |
} |
-int CPDF_IndirectObjects::GetIndirectType(FX_DWORD objnum) { |
- void* value; |
- if (m_IndirectObjs.Lookup((void*)(uintptr_t)objnum, value)) |
- return static_cast<CPDF_Object*>(value)->GetType(); |
- |
- if (m_pParser) { |
- PARSE_CONTEXT context; |
- FXSYS_memset(&context, 0, sizeof(PARSE_CONTEXT)); |
- context.m_Flags = PDFPARSE_TYPEONLY; |
- return (int)(uintptr_t)m_pParser->ParseIndirectObject(this, objnum, |
- &context); |
- } |
- return 0; |
+int CPDF_IndirectObjectHolder::GetIndirectType(FX_DWORD objnum) { |
+ auto it = m_IndirectObjs.find(objnum); |
+ if (it != m_IndirectObjs.end()) |
+ return it->second->GetType(); |
+ |
+ if (!m_pParser) |
+ return 0; |
+ |
+ PARSE_CONTEXT context; |
+ FXSYS_memset(&context, 0, sizeof(PARSE_CONTEXT)); |
+ context.m_Flags = PDFPARSE_TYPEONLY; |
+ return (int)(uintptr_t)m_pParser->ParseIndirectObject(this, objnum, &context); |
} |
-FX_DWORD CPDF_IndirectObjects::AddIndirectObject(CPDF_Object* pObj) { |
+FX_DWORD CPDF_IndirectObjectHolder::AddIndirectObject(CPDF_Object* pObj) { |
if (pObj->m_ObjNum) { |
return pObj->m_ObjNum; |
} |
m_LastObjNum++; |
- m_IndirectObjs.SetAt((void*)(uintptr_t)m_LastObjNum, pObj); |
+ m_IndirectObjs[m_LastObjNum] = pObj; |
pObj->m_ObjNum = m_LastObjNum; |
return m_LastObjNum; |
} |
-void CPDF_IndirectObjects::ReleaseIndirectObject(FX_DWORD objnum) { |
- void* value; |
- if (!m_IndirectObjs.Lookup((void*)(uintptr_t)objnum, value)) |
- return; |
- CPDF_Object* pValue = static_cast<CPDF_Object*>(value); |
- if (pValue->GetObjNum() == -1) |
+void CPDF_IndirectObjectHolder::ReleaseIndirectObject(FX_DWORD objnum) { |
+ auto it = m_IndirectObjs.find(objnum); |
+ if (it == m_IndirectObjs.end() || it->second->GetObjNum() == -1) |
return; |
- pValue->Destroy(); |
- m_IndirectObjs.RemoveKey((void*)(uintptr_t)objnum); |
+ it->second->Destroy(); |
+ m_IndirectObjs.erase(it); |
} |
-FX_BOOL CPDF_IndirectObjects::InsertIndirectObject(FX_DWORD objnum, |
- CPDF_Object* pObj) { |
+FX_BOOL CPDF_IndirectObjectHolder::InsertIndirectObject(FX_DWORD objnum, |
+ CPDF_Object* pObj) { |
if (!objnum || !pObj) |
return FALSE; |
- void* value = nullptr; |
- if (m_IndirectObjs.Lookup((void*)(uintptr_t)objnum, value)) { |
- if (value) { |
- CPDF_Object* pExistingObj = static_cast<CPDF_Object*>(value); |
- if (pObj->GetGenNum() <= pExistingObj->GetGenNum()) { |
- pObj->Destroy(); |
- return FALSE; |
- } |
- pExistingObj->Destroy(); |
+ auto it = m_IndirectObjs.find(objnum); |
+ if (it != m_IndirectObjs.end()) { |
+ if (pObj->GetGenNum() <= it->second->GetGenNum()) { |
+ pObj->Destroy(); |
+ return FALSE; |
} |
+ it->second->Destroy(); |
} |
pObj->m_ObjNum = objnum; |
- m_IndirectObjs.SetAt((void*)(uintptr_t)objnum, pObj); |
- if (m_LastObjNum < objnum) |
- m_LastObjNum = objnum; |
+ m_IndirectObjs[objnum] = pObj; |
+ m_LastObjNum = std::max(m_LastObjNum, objnum); |
return TRUE; |
} |
-FX_DWORD CPDF_IndirectObjects::GetLastObjNum() const { |
- return m_LastObjNum; |
-} |