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