diff options
author | Tom Sepez <tsepez@chromium.org> | 2016-01-12 08:54:49 -0800 |
---|---|---|
committer | Tom Sepez <tsepez@chromium.org> | 2016-01-12 08:54:49 -0800 |
commit | 067e2b4fe59b70291ee19705ba45575ec39feb9d (patch) | |
tree | 0b1a5b00d5b892f34790fb6805272757b40a7432 /core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp | |
parent | b9bc6b79cba90c5c0e28ab31276029aa0d0c04cb (diff) | |
download | pdfium-067e2b4fe59b70291ee19705ba45575ec39feb9d.tar.xz |
Merget to XFA: Use std::map in CPDF_IndirectObjects
Review URL: https://codereview.chromium.org/1576113003 .
(cherry picked from commit fce548047a44c7015996874452f3e778bf64cad6)
TBR=thestig@chromium.org
Review URL: https://codereview.chromium.org/1579693004 .
Diffstat (limited to 'core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp')
-rw-r--r-- | core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp | 146 |
1 files changed, 63 insertions, 83 deletions
diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp index 2cb81002fb..e0ce3faadf 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; -} |