CPDF_StructElementImpl* CPDF_StructTreeImpl::AddPageNode(CPDF_Dictionary* pDict, CFX_MapPtrToPtr& map, int nLevel) { if (nLevel > nMaxRecursion) { return NULL; } CPDF_StructElementImpl* pElement = NULL; if (map.Lookup(pDict, (FX_LPVOID&)pElement)) { return pElement; } pElement = FX_NEW CPDF_StructElementImpl(this, NULL, pDict); if (pElement == NULL) { return NULL; } map.SetAt(pDict, pElement); CPDF_Dictionary* pParent = pDict->GetDict(FX_BSTRC("P")); if (pParent == NULL || pParent->GetString(FX_BSTRC("Type")) == FX_BSTRC("StructTreeRoot")) { if (!AddTopLevelNode(pDict, pElement)) { pElement->Release(); map.RemoveKey(pDict); } } else { CPDF_StructElementImpl* pParentElement = AddPageNode(pParent, map, nLevel + 1); FX_BOOL bSave = FALSE; for (int i = 0; i < pParentElement->m_Kids.GetSize(); i ++) { if (pParentElement->m_Kids[i].m_Type != CPDF_StructKid::Element) { continue; } if (pParentElement->m_Kids[i].m_Element.m_pDict != pDict) { continue; } pParentElement->m_Kids[i].m_Element.m_pElement = pElement->Retain(); bSave = TRUE; } if (!bSave) { pElement->Release(); map.RemoveKey(pDict); } } return pElement; }
CPDF_StructElementImpl* CPDF_StructTreeImpl::AddPageNode( CPDF_Dictionary* pDict, std::map<CPDF_Dictionary*, CPDF_StructElementImpl*>& map, int nLevel) { if (nLevel > nMaxRecursion) return nullptr; auto it = map.find(pDict); if (it != map.end()) return it->second; CPDF_StructElementImpl* pElement = new CPDF_StructElementImpl(this, nullptr, pDict); map[pDict] = pElement; CPDF_Dictionary* pParent = pDict->GetDictBy("P"); if (!pParent || pParent->GetStringBy("Type") == "StructTreeRoot") { if (!AddTopLevelNode(pDict, pElement)) { pElement->Release(); map.erase(pDict); } } else { CPDF_StructElementImpl* pParentElement = AddPageNode(pParent, map, nLevel + 1); FX_BOOL bSave = FALSE; for (CPDF_StructKid& kid : pParentElement->m_Kids) { if (kid.m_Type != CPDF_StructKid::Element) continue; if (kid.m_Element.m_pDict != pDict) continue; kid.m_Element.m_pElement = pElement->Retain(); bSave = TRUE; } if (!bSave) { pElement->Release(); map.erase(pDict); } } return pElement; }