blob: 58b129c8b5df18c7a41632f7d1cab520eeefbc81 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
//========================================================================
//
// StructTreeRoot.h
//
// This file is licensed under the GPLv2 or later
//
// Copyright 2013, 2014 Igalia S.L.
// Copyright 2018, 2019 Albert Astals Cid <aacid@kde.org>
// Copyright 2018 Adrian Johnson <ajohnson@redneon.com>
// Copyright 2018 Adam Reichold <adam.reichold@t-online.de>
//
//========================================================================
#ifndef STRUCTTREEROOT_H
#define STRUCTTREEROOT_H
#include "Object.h"
#include "StructElement.h"
#include <map>
#include <vector>
class Dict;
class PDFDoc;
class StructTreeRoot
{
public:
StructTreeRoot(PDFDoc *docA, Dict *rootDict);
~StructTreeRoot();
StructTreeRoot& operator=(const StructTreeRoot &) = delete;
StructTreeRoot(const StructTreeRoot &) = delete;
PDFDoc *getDoc() { return doc; }
Dict *getRoleMap() { return roleMap.isDict() ? roleMap.getDict() : nullptr; }
Dict *getClassMap() { return classMap.isDict() ? classMap.getDict() : nullptr; }
unsigned getNumChildren() const { return elements.size(); }
const StructElement *getChild(int i) const { return elements.at(i); }
StructElement *getChild(int i) { return elements.at(i); }
void appendChild(StructElement *element) {
if (element && element->isOk()) {
elements.push_back(element);
}
}
const StructElement *findParentElement(int key, unsigned mcid = 0) const {
auto it = parentTree.find(key);
if (it != parentTree.end()) {
if (mcid < it->second.size()) {
return it->second[mcid].element;
}
}
return nullptr;
}
private:
typedef std::vector<StructElement*> ElemPtrArray;
// Structure for items in /ParentTree, it keeps a mapping of
// object references and pointers to StructElement objects.
struct Parent {
Ref ref;
StructElement *element;
Parent(): element(nullptr) { ref = Ref::INVALID(); }
Parent(const Parent &p) = default;
Parent& operator=(const Parent &) = default;
~Parent() {}
};
PDFDoc *doc;
Object roleMap;
Object classMap;
ElemPtrArray elements;
std::map<int, std::vector<Parent> > parentTree;
std::multimap<Ref, Parent*> refToParentMap;
void parse(Dict *rootDict);
void parseNumberTreeNode(Dict *node);
void parentTreeAdd(const Ref objectRef, StructElement *element);
friend class StructElement;
};
#endif
|