summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/fpdfdoc/cpdf_structelement.cpp134
-rw-r--r--core/fpdfdoc/cpdf_structelement.h36
-rw-r--r--core/fpdfdoc/cpdf_structtree.cpp2
-rw-r--r--core/fpdfdoc/cpdf_structtree.h11
4 files changed, 9 insertions, 174 deletions
diff --git a/core/fpdfdoc/cpdf_structelement.cpp b/core/fpdfdoc/cpdf_structelement.cpp
index 418f75b3a9..137d5b32e4 100644
--- a/core/fpdfdoc/cpdf_structelement.cpp
+++ b/core/fpdfdoc/cpdf_structelement.cpp
@@ -16,38 +16,6 @@
#include "core/fpdfdoc/cpdf_structtree.h"
#include "third_party/base/stl_util.h"
-namespace {
-
-const int nMaxRecursion = 32;
-
-CPDF_Dictionary* FindAttrDict(CPDF_Object* pAttrs,
- const CFX_ByteStringC& owner,
- float nLevel = 0.0F) {
- if (nLevel > nMaxRecursion)
- return nullptr;
- if (!pAttrs)
- return nullptr;
-
- CPDF_Dictionary* pDict = nullptr;
- if (pAttrs->IsDictionary()) {
- pDict = pAttrs->AsDictionary();
- } else if (CPDF_Stream* pStream = pAttrs->AsStream()) {
- pDict = pStream->GetDict();
- } else if (CPDF_Array* pArray = pAttrs->AsArray()) {
- for (uint32_t i = 0; i < pArray->GetCount(); i++) {
- CPDF_Object* pElement = pArray->GetDirectObjectAt(i);
- pDict = FindAttrDict(pElement, owner, nLevel + 1);
- if (pDict)
- return pDict;
- }
- }
- if (pDict && pDict->GetStringFor("O") == owner)
- return pDict;
- return nullptr;
-}
-
-} // namespace
-
CPDF_StructKid::CPDF_StructKid()
: m_Type(Invalid),
m_pDict(nullptr),
@@ -166,105 +134,3 @@ void CPDF_StructElement::LoadKid(uint32_t PageObjNum,
pKid->m_pElement =
pdfium::MakeRetain<CPDF_StructElement>(m_pTree, this, pKidDict);
}
-
-CPDF_Object* CPDF_StructElement::GetAttr(const CFX_ByteStringC& owner,
- const CFX_ByteStringC& name,
- bool bInheritable,
- float fLevel) {
- if (fLevel > nMaxRecursion)
- return nullptr;
-
- if (bInheritable) {
- if (CPDF_Object* pAttr = GetAttr(owner, name, false))
- return pAttr;
- if (!m_pParent)
- return nullptr;
- return m_pParent->GetAttr(owner, name, true, fLevel + 1);
- }
-
- if (CPDF_Object* pA = m_pDict->GetDirectObjectFor("A")) {
- if (CPDF_Dictionary* dict = FindAttrDict(pA, owner)) {
- if (CPDF_Object* attr = dict->GetDirectObjectFor(CFX_ByteString(name)))
- return attr;
- }
- }
-
- CPDF_Object* pC = m_pDict->GetDirectObjectFor("C");
- if (!pC)
- return nullptr;
-
- CPDF_Dictionary* pClassMap = m_pTree->GetTreeRoot()->GetDictFor("ClassMap");
- if (!pClassMap)
- return nullptr;
-
- if (CPDF_Array* pArray = pC->AsArray()) {
- for (uint32_t i = 0; i < pArray->GetCount(); i++) {
- CFX_ByteString class_name = pArray->GetStringAt(i);
- CPDF_Dictionary* pClassDict = pClassMap->GetDictFor(class_name);
- if (pClassDict && pClassDict->GetStringFor("O") == owner)
- return pClassDict->GetDirectObjectFor(CFX_ByteString(name));
- }
- return nullptr;
- }
-
- CFX_ByteString class_name = pC->GetString();
- CPDF_Dictionary* pClassDict = pClassMap->GetDictFor(class_name);
- if (pClassDict && pClassDict->GetStringFor("O") == owner)
- return pClassDict->GetDirectObjectFor(CFX_ByteString(name));
- return nullptr;
-}
-
-CPDF_Object* CPDF_StructElement::GetAttr(const CFX_ByteStringC& owner,
- const CFX_ByteStringC& name,
- bool bInheritable,
- int subindex) {
- CPDF_Object* pAttr = GetAttr(owner, name, bInheritable);
- CPDF_Array* pArray = ToArray(pAttr);
- if (!pArray || subindex == -1)
- return pAttr;
- if (subindex >= static_cast<int>(pArray->GetCount()))
- return pAttr;
- return pArray->GetDirectObjectAt(subindex);
-}
-
-CFX_ByteString CPDF_StructElement::GetName(const CFX_ByteStringC& owner,
- const CFX_ByteStringC& name,
- const CFX_ByteStringC& default_value,
- bool bInheritable,
- int subindex) {
- CPDF_Object* pAttr = GetAttr(owner, name, bInheritable, subindex);
- if (ToName(pAttr))
- return pAttr->GetString();
- return CFX_ByteString(default_value);
-}
-
-FX_ARGB CPDF_StructElement::GetColor(const CFX_ByteStringC& owner,
- const CFX_ByteStringC& name,
- FX_ARGB default_value,
- bool bInheritable,
- int subindex) {
- CPDF_Array* pArray = ToArray(GetAttr(owner, name, bInheritable, subindex));
- if (!pArray)
- return default_value;
- return 0xff000000 | (static_cast<int>(pArray->GetNumberAt(0) * 255) << 16) |
- (static_cast<int>(pArray->GetNumberAt(1) * 255) << 8) |
- static_cast<int>(pArray->GetNumberAt(2) * 255);
-}
-
-float CPDF_StructElement::GetNumber(const CFX_ByteStringC& owner,
- const CFX_ByteStringC& name,
- float default_value,
- bool bInheritable,
- int subindex) {
- CPDF_Object* pAttr = GetAttr(owner, name, bInheritable, subindex);
- return ToNumber(pAttr) ? pAttr->GetNumber() : default_value;
-}
-
-int CPDF_StructElement::GetInteger(const CFX_ByteStringC& owner,
- const CFX_ByteStringC& name,
- int default_value,
- bool bInheritable,
- int subindex) {
- CPDF_Object* pAttr = GetAttr(owner, name, bInheritable, subindex);
- return ToNumber(pAttr) ? pAttr->GetInteger() : default_value;
-}
diff --git a/core/fpdfdoc/cpdf_structelement.h b/core/fpdfdoc/cpdf_structelement.h
index b227397431..ba0685e895 100644
--- a/core/fpdfdoc/cpdf_structelement.h
+++ b/core/fpdfdoc/cpdf_structelement.h
@@ -38,45 +38,12 @@ class CPDF_StructElement : public CFX_Retainable {
template <typename T, typename... Args>
friend CFX_RetainPtr<T> pdfium::MakeRetain(Args&&... args);
- CPDF_StructTree* GetTree() const { return m_pTree; }
const CFX_ByteString& GetType() const { return m_Type; }
- CPDF_StructElement* GetParent() const { return m_pParent; }
CPDF_Dictionary* GetDict() const { return m_pDict; }
int CountKids() const;
CPDF_StructElement* GetKidIfElement(int index) const;
- CPDF_Object* GetAttr(const CFX_ByteStringC& owner,
- const CFX_ByteStringC& name,
- bool bInheritable = false,
- float fLevel = 0.0F);
- CFX_ByteString GetName(const CFX_ByteStringC& owner,
- const CFX_ByteStringC& name,
- const CFX_ByteStringC& default_value,
- bool bInheritable = false,
- int subindex = -1);
- FX_ARGB GetColor(const CFX_ByteStringC& owner,
- const CFX_ByteStringC& name,
- FX_ARGB default_value,
- bool bInheritable = false,
- int subindex = -1);
- float GetNumber(const CFX_ByteStringC& owner,
- const CFX_ByteStringC& name,
- float default_value,
- bool bInheritable = false,
- int subindex = -1);
- int GetInteger(const CFX_ByteStringC& owner,
- const CFX_ByteStringC& name,
- int default_value,
- bool bInheritable = false,
- int subindex = -1);
-
std::vector<CPDF_StructKid>* GetKids() { return &m_Kids; }
- void LoadKids(CPDF_Dictionary* pDict);
- void LoadKid(uint32_t PageObjNum, CPDF_Object* pObj, CPDF_StructKid* pKid);
- CPDF_Object* GetAttr(const CFX_ByteStringC& owner,
- const CFX_ByteStringC& name,
- bool bInheritable,
- int subindex);
private:
CPDF_StructElement(CPDF_StructTree* pTree,
@@ -84,6 +51,9 @@ class CPDF_StructElement : public CFX_Retainable {
CPDF_Dictionary* pDict);
~CPDF_StructElement() override;
+ void LoadKids(CPDF_Dictionary* pDict);
+ void LoadKid(uint32_t PageObjNum, CPDF_Object* pObj, CPDF_StructKid* pKid);
+
CPDF_StructTree* const m_pTree;
CPDF_StructElement* const m_pParent;
CPDF_Dictionary* const m_pDict;
diff --git a/core/fpdfdoc/cpdf_structtree.cpp b/core/fpdfdoc/cpdf_structtree.cpp
index 51ad2c775c..62500ac155 100644
--- a/core/fpdfdoc/cpdf_structtree.cpp
+++ b/core/fpdfdoc/cpdf_structtree.cpp
@@ -88,7 +88,7 @@ void CPDF_StructTree::LoadPageTree(const CPDF_Dictionary* pPageDict) {
std::map<CPDF_Dictionary*, CFX_RetainPtr<CPDF_StructElement>> element_map;
for (size_t i = 0; i < pParentArray->GetCount(); i++) {
if (CPDF_Dictionary* pParent = pParentArray->GetDictAt(i))
- AddPageNode(pParent, &element_map);
+ AddPageNode(pParent, &element_map, 0);
}
}
diff --git a/core/fpdfdoc/cpdf_structtree.h b/core/fpdfdoc/cpdf_structtree.h
index 20bf41e7ee..aa30f802db 100644
--- a/core/fpdfdoc/cpdf_structtree.h
+++ b/core/fpdfdoc/cpdf_structtree.h
@@ -28,20 +28,19 @@ class CPDF_StructTree {
int CountTopElements() const;
CPDF_StructElement* GetTopElement(int i) const;
+ const CPDF_Dictionary* GetRoleMap() const { return m_pRoleMap; }
+ const CPDF_Dictionary* GetPage() const { return m_pPage; }
+ const CPDF_Dictionary* GetTreeRoot() const { return m_pTreeRoot; }
+ private:
void LoadPageTree(const CPDF_Dictionary* pPageDict);
CFX_RetainPtr<CPDF_StructElement> AddPageNode(
CPDF_Dictionary* pElement,
std::map<CPDF_Dictionary*, CFX_RetainPtr<CPDF_StructElement>>* map,
- int nLevel = 0);
+ int nLevel);
bool AddTopLevelNode(CPDF_Dictionary* pDict,
const CFX_RetainPtr<CPDF_StructElement>& pElement);
- const CPDF_Dictionary* GetRoleMap() const { return m_pRoleMap; }
- const CPDF_Dictionary* GetPage() const { return m_pPage; }
- const CPDF_Dictionary* GetTreeRoot() const { return m_pTreeRoot; }
-
- private:
const CPDF_Dictionary* const m_pTreeRoot;
const CPDF_Dictionary* const m_pRoleMap;
const CPDF_Dictionary* m_pPage;