1e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Copyright 2014 PDFium Authors. All rights reserved. 2e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Use of this source code is governed by a BSD-style license that can be 3e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// found in the LICENSE file. 4ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 5e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 7ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "core/include/fpdfapi/fpdf_page.h" 8ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "core/include/fpdfapi/fpdf_parser.h" 9ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "core/include/fpdfdoc/fpdf_tagged.h" 10e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include "tagged_int.h" 11ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 12e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovconst int nMaxRecursion = 32; 13ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic FX_BOOL IsTagged(const CPDF_Document* pDoc) { 14ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pCatalog = pDoc->GetRoot(); 15ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pMarkInfo = pCatalog->GetDict("MarkInfo"); 16ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pMarkInfo != NULL && pMarkInfo->GetInteger("Marked"); 17e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 18ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_StructTree* CPDF_StructTree::LoadPage(const CPDF_Document* pDoc, 19ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CPDF_Dictionary* pPageDict) { 20ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!IsTagged(pDoc)) { 21ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return NULL; 22ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 23ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_StructTreeImpl* pTree = new CPDF_StructTreeImpl(pDoc); 24ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pTree->LoadPageTree(pPageDict); 25ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pTree; 26e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 27ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_StructTree* CPDF_StructTree::LoadDoc(const CPDF_Document* pDoc) { 28ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!IsTagged(pDoc)) { 29ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return NULL; 30ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 31ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_StructTreeImpl* pTree = new CPDF_StructTreeImpl(pDoc); 32ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pTree->LoadDocTree(); 33ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pTree; 34ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 35ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_StructTreeImpl::CPDF_StructTreeImpl(const CPDF_Document* pDoc) { 36ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pCatalog = pDoc->GetRoot(); 37ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pTreeRoot = pCatalog->GetDict("StructTreeRoot"); 38ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!m_pTreeRoot) { 39ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 40ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 41ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pRoleMap = m_pTreeRoot->GetDict("RoleMap"); 42e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 43ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_StructTreeImpl::~CPDF_StructTreeImpl() { 44ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int i = 0; i < m_Kids.GetSize(); i++) 45ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_Kids[i]) { 46ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Kids[i]->Release(); 47e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 48e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 49ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StructTreeImpl::LoadDocTree() { 50ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pPage = nullptr; 51ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!m_pTreeRoot) 52ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 53ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 54ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Object* pKids = m_pTreeRoot->GetElementValue("K"); 55ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pKids) 56ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 57ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (CPDF_Dictionary* pDict = pKids->AsDictionary()) { 58ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_StructElementImpl* pStructElementImpl = 59ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann new CPDF_StructElementImpl(this, nullptr, pDict); 60ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Kids.Add(pStructElementImpl); 61ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 62ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 63ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Array* pArray = pKids->AsArray(); 64ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pArray) 65ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 66ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 67ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (FX_DWORD i = 0; i < pArray->GetCount(); i++) { 68ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pKid = pArray->GetDict(i); 69ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_StructElementImpl* pStructElementImpl = 70ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann new CPDF_StructElementImpl(this, nullptr, pKid); 71ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Kids.Add(pStructElementImpl); 72ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 73e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 74ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StructTreeImpl::LoadPageTree(const CPDF_Dictionary* pPageDict) { 75ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pPage = pPageDict; 76ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!m_pTreeRoot) 77ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 78ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 79ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Object* pKids = m_pTreeRoot->GetElementValue("K"); 80ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pKids) 81ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 82ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 83ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD dwKids = 0; 84ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pKids->IsDictionary()) 85ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dwKids = 1; 86ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann else if (CPDF_Array* pArray = pKids->AsArray()) 87ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dwKids = pArray->GetCount(); 88ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann else 89ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 90ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 91ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD i; 92ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Kids.SetSize(dwKids); 93ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (i = 0; i < dwKids; i++) { 94ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Kids[i] = NULL; 95ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 96ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_MapPtrToPtr element_map; 97ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pParentTree = m_pTreeRoot->GetDict("ParentTree"); 98ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pParentTree) { 99ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 100ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 101ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_NumberTree parent_tree(pParentTree); 102ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int parents_id = pPageDict->GetInteger("StructParents", -1); 103ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (parents_id >= 0) { 104ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Array* pParentArray = ToArray(parent_tree.LookupValue(parents_id)); 105ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pParentArray) 106ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 107ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 108ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (i = 0; i < pParentArray->GetCount(); i++) { 109ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pParent = pParentArray->GetDict(i); 110ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pParent) { 111ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann continue; 112ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 113ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann AddPageNode(pParent, element_map); 114ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 115ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 116e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 117ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_StructElementImpl* CPDF_StructTreeImpl::AddPageNode(CPDF_Dictionary* pDict, 118ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_MapPtrToPtr& map, 119ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int nLevel) { 120ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (nLevel > nMaxRecursion) { 121ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return NULL; 122ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 123ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_StructElementImpl* pElement = NULL; 124ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (map.Lookup(pDict, (void*&)pElement)) { 125ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pElement; 126ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 127ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pElement = new CPDF_StructElementImpl(this, NULL, pDict); 128ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann map.SetAt(pDict, pElement); 129ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pParent = pDict->GetDict("P"); 130ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pParent || pParent->GetString("Type") == "StructTreeRoot") { 131ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!AddTopLevelNode(pDict, pElement)) { 132ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pElement->Release(); 133ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann map.RemoveKey(pDict); 134ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 135ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 136ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_StructElementImpl* pParentElement = 137ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann AddPageNode(pParent, map, nLevel + 1); 138ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bSave = FALSE; 139ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int i = 0; i < pParentElement->m_Kids.GetSize(); i++) { 140ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pParentElement->m_Kids[i].m_Type != CPDF_StructKid::Element) { 141ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann continue; 142ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 143ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pParentElement->m_Kids[i].m_Element.m_pDict != pDict) { 144ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann continue; 145ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 146ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pParentElement->m_Kids[i].m_Element.m_pElement = pElement->Retain(); 147ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bSave = TRUE; 148ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 149ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!bSave) { 150ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pElement->Release(); 151ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann map.RemoveKey(pDict); 152ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 153ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 154ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pElement; 155e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 156ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_StructTreeImpl::AddTopLevelNode(CPDF_Dictionary* pDict, 157ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_StructElementImpl* pElement) { 158ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Object* pObj = m_pTreeRoot->GetElementValue("K"); 159ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pObj) { 160ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 161ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 162ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pObj->IsDictionary()) { 163ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pObj->GetObjNum() == pDict->GetObjNum()) { 164ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_Kids[0]) { 165ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Kids[0]->Release(); 166ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 167ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Kids[0] = pElement->Retain(); 168e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 169ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 170e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 171ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 172ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (CPDF_Array* pTopKids = pObj->AsArray()) { 173ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD i; 174ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bSave = FALSE; 175ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (i = 0; i < pTopKids->GetCount(); i++) { 176ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Reference* pKidRef = ToReference(pTopKids->GetElement(i)); 177ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pKidRef) 178ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann continue; 179ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pKidRef->GetRefObjNum() != pDict->GetObjNum()) 180ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann continue; 181ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 182ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_Kids[i]) 183ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Kids[i]->Release(); 184ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Kids[i] = pElement->Retain(); 185ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bSave = TRUE; 186ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 187ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!bSave) 188ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 189ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 190ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 191e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 192ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_StructElementImpl::CPDF_StructElementImpl(CPDF_StructTreeImpl* pTree, 193ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_StructElementImpl* pParent, 194ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pDict) 195ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann : m_RefCount(0) { 196ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pTree = pTree; 197ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pDict = pDict; 198ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Type = pDict->GetString("S"); 199ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pTree->m_pRoleMap) { 200ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteString mapped = pTree->m_pRoleMap->GetString(m_Type); 201ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!mapped.IsEmpty()) { 202ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Type = mapped; 203ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 204ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 205ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pParent = pParent; 206ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann LoadKids(pDict); 207e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 208ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_StructElementImpl::~CPDF_StructElementImpl() { 209ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int i = 0; i < m_Kids.GetSize(); i++) { 210ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_Kids[i].m_Type == CPDF_StructKid::Element && 211ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Kids[i].m_Element.m_pElement) { 212ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ((CPDF_StructElementImpl*)m_Kids[i].m_Element.m_pElement)->Release(); 213e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 214ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 215e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 216ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_StructElementImpl* CPDF_StructElementImpl::Retain() { 217ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_RefCount++; 218ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return this; 219e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 220ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StructElementImpl::Release() { 221ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (--m_RefCount < 1) { 222ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann delete this; 223ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 224e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 225ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StructElementImpl::LoadKids(CPDF_Dictionary* pDict) { 226ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Object* pObj = pDict->GetElement("Pg"); 227ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD PageObjNum = 0; 228ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (CPDF_Reference* pRef = ToReference(pObj)) 229ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann PageObjNum = pRef->GetRefObjNum(); 230ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 231ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Object* pKids = pDict->GetElementValue("K"); 232ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pKids) 233ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 234ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 235ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (CPDF_Array* pArray = pKids->AsArray()) { 236ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Kids.SetSize(pArray->GetCount()); 237ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (FX_DWORD i = 0; i < pArray->GetCount(); i++) { 238ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Object* pKid = pArray->GetElementValue(i); 239ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann LoadKid(PageObjNum, pKid, &m_Kids[i]); 240ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 241ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 242ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Kids.SetSize(1); 243ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann LoadKid(PageObjNum, pKids, &m_Kids[0]); 244ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 245e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 246ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StructElementImpl::LoadKid(FX_DWORD PageObjNum, 247ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Object* pKidObj, 248ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_StructKid* pKid) { 249ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pKid->m_Type = CPDF_StructKid::Invalid; 250ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pKidObj) 251ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 252ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 253ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pKidObj->IsNumber()) { 254ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pTree->m_pPage && m_pTree->m_pPage->GetObjNum() != PageObjNum) { 255ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 256ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 257ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pKid->m_Type = CPDF_StructKid::PageContent; 258ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pKid->m_PageContent.m_ContentId = pKidObj->GetInteger(); 259ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pKid->m_PageContent.m_PageObjNum = PageObjNum; 260ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 261ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 262ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 263ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pKidDict = pKidObj->AsDictionary(); 264ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pKidDict) 265ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 266ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 267ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (CPDF_Reference* pRef = ToReference(pKidDict->GetElement("Pg"))) 268ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann PageObjNum = pRef->GetRefObjNum(); 269ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 270ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteString type = pKidDict->GetString("Type"); 271ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (type == "MCR") { 272ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pTree->m_pPage && m_pTree->m_pPage->GetObjNum() != PageObjNum) { 273ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 274ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 275ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pKid->m_Type = CPDF_StructKid::StreamContent; 276ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (CPDF_Reference* pRef = ToReference(pKidDict->GetElement("Stm"))) { 277ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pKid->m_StreamContent.m_RefObjNum = pRef->GetRefObjNum(); 278e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 279ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pKid->m_StreamContent.m_RefObjNum = 0; 280e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 281ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pKid->m_StreamContent.m_PageObjNum = PageObjNum; 282ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pKid->m_StreamContent.m_ContentId = pKidDict->GetInteger("MCID"); 283ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (type == "OBJR") { 284ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pTree->m_pPage && m_pTree->m_pPage->GetObjNum() != PageObjNum) { 285ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 286e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 287ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pKid->m_Type = CPDF_StructKid::Object; 288ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (CPDF_Reference* pObj = ToReference(pKidDict->GetElement("Obj"))) { 289ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pKid->m_Object.m_RefObjNum = pObj->GetRefObjNum(); 290ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 291ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pKid->m_Object.m_RefObjNum = 0; 292ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 293ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pKid->m_Object.m_PageObjNum = PageObjNum; 294ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 295ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pKid->m_Type = CPDF_StructKid::Element; 296ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pKid->m_Element.m_pDict = pKidDict; 297ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!m_pTree->m_pPage) { 298ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pKid->m_Element.m_pElement = 299ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann new CPDF_StructElementImpl(m_pTree, this, pKidDict); 300e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 301ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pKid->m_Element.m_pElement = NULL; 302e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 303ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 304e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 305ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic CPDF_Dictionary* FindAttrDict(CPDF_Object* pAttrs, 306ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CFX_ByteStringC& owner, 307ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FLOAT nLevel = 0.0F) { 308ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (nLevel > nMaxRecursion) 309ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return nullptr; 310ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pAttrs) 311ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return nullptr; 312ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 313ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pDict = nullptr; 314ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pAttrs->IsDictionary()) { 315ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pDict = pAttrs->AsDictionary(); 316ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (CPDF_Stream* pStream = pAttrs->AsStream()) { 317ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pDict = pStream->GetDict(); 318ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (CPDF_Array* pArray = pAttrs->AsArray()) { 319ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (FX_DWORD i = 0; i < pArray->GetCount(); i++) { 320ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Object* pElement = pArray->GetElementValue(i); 321ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pDict = FindAttrDict(pElement, owner, nLevel + 1); 322ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pDict) 323e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return pDict; 324e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 325ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 326ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pDict && pDict->GetString("O") == owner) 327ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pDict; 328ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return nullptr; 329e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 330ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Object* CPDF_StructElementImpl::GetAttr(const CFX_ByteStringC& owner, 331ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CFX_ByteStringC& name, 332ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bInheritable, 333ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FLOAT fLevel) { 334ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (fLevel > nMaxRecursion) { 335e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return NULL; 336ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 337ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (bInheritable) { 338ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Object* pAttr = GetAttr(owner, name, FALSE); 339ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pAttr) { 340ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pAttr; 341ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 342ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!m_pParent) { 343ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return NULL; 344ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 345ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_pParent->GetAttr(owner, name, TRUE, fLevel + 1); 346ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 347ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Object* pA = m_pDict->GetElementValue("A"); 348ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pA) { 349ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pAttrDict = FindAttrDict(pA, owner); 350ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pAttrDict) { 351ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Object* pAttr = pAttrDict->GetElementValue(name); 352ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pAttr) { 353e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return pAttr; 354ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 355e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 356ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 357ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Object* pC = m_pDict->GetElementValue("C"); 358ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pC) 359ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return nullptr; 360ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 361ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pClassMap = m_pTree->m_pTreeRoot->GetDict("ClassMap"); 362ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pClassMap) 363ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return nullptr; 364ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 365ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (CPDF_Array* pArray = pC->AsArray()) { 366ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (FX_DWORD i = 0; i < pArray->GetCount(); i++) { 367ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteString class_name = pArray->GetString(i); 368ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pClassDict = pClassMap->GetDict(class_name); 369ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pClassDict && pClassDict->GetString("O") == owner) 370ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pClassDict->GetElementValue(name); 371e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 372ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return nullptr; 373ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 374ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteString class_name = pC->GetString(); 375ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pClassDict = pClassMap->GetDict(class_name); 376ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pClassDict && pClassDict->GetString("O") == owner) 377ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pClassDict->GetElementValue(name); 378ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return nullptr; 379e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 380ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Object* CPDF_StructElementImpl::GetAttr(const CFX_ByteStringC& owner, 381ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CFX_ByteStringC& name, 382ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bInheritable, 383ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int subindex) { 384ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Object* pAttr = GetAttr(owner, name, bInheritable); 385ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Array* pArray = ToArray(pAttr); 386ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pArray || subindex == -1) 387ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pAttr; 388ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 389ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (subindex >= static_cast<int>(pArray->GetCount())) 390ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pAttr; 391ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pArray->GetElementValue(subindex); 392ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 393ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_ByteString CPDF_StructElementImpl::GetName( 394ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CFX_ByteStringC& owner, 395ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CFX_ByteStringC& name, 396ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CFX_ByteStringC& default_value, 397ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bInheritable, 398ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int subindex) { 399ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Object* pAttr = GetAttr(owner, name, bInheritable, subindex); 400ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (ToName(pAttr)) 401e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return pAttr->GetString(); 402ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return default_value; 403e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 404ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 405ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_ARGB CPDF_StructElementImpl::GetColor(const CFX_ByteStringC& owner, 406ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CFX_ByteStringC& name, 407ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_ARGB default_value, 408ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bInheritable, 409ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int subindex) { 410ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Array* pArray = ToArray(GetAttr(owner, name, bInheritable, subindex)); 411ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pArray) 412ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return default_value; 413ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0xff000000 | ((int)(pArray->GetNumber(0) * 255) << 16) | 414ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ((int)(pArray->GetNumber(1) * 255) << 8) | 415ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann (int)(pArray->GetNumber(2) * 255); 416e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 417ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_FLOAT CPDF_StructElementImpl::GetNumber(const CFX_ByteStringC& owner, 418ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CFX_ByteStringC& name, 419ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FLOAT default_value, 420ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bInheritable, 421ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int subindex) { 422ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Object* pAttr = GetAttr(owner, name, bInheritable, subindex); 423ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return ToNumber(pAttr) ? pAttr->GetNumber() : default_value; 424e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 425ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint CPDF_StructElementImpl::GetInteger(const CFX_ByteStringC& owner, 426ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CFX_ByteStringC& name, 427ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int default_value, 428ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bInheritable, 429ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int subindex) { 430ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Object* pAttr = GetAttr(owner, name, bInheritable, subindex); 431ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return ToNumber(pAttr) ? pAttr->GetInteger() : default_value; 432e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 433