aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2018-12-18 19:08:55 +0100
committerJay Berkenbilt <ejb@ql.org>2018-12-18 22:46:10 +0100
commitf38df27aa3eae905e3ee90365099335e317173d8 (patch)
tree3a0c8ac95e389889cbcee3a92924d2652e2d42a0 /include
parent077d3d451204393d17b9a14c2145487c35fce572 (diff)
downloadqpdf-f38df27aa3eae905e3ee90365099335e317173d8.tar.zst
Add QPDFNumberTreeObjectHelper
Diffstat (limited to 'include')
-rw-r--r--include/qpdf/QPDFNumberTreeObjectHelper.hh110
1 files changed, 110 insertions, 0 deletions
diff --git a/include/qpdf/QPDFNumberTreeObjectHelper.hh b/include/qpdf/QPDFNumberTreeObjectHelper.hh
new file mode 100644
index 00000000..be67c887
--- /dev/null
+++ b/include/qpdf/QPDFNumberTreeObjectHelper.hh
@@ -0,0 +1,110 @@
+// Copyright (c) 2005-2018 Jay Berkenbilt
+//
+// This file is part of qpdf.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// Versions of qpdf prior to version 7 were released under the terms
+// of version 2.0 of the Artistic License. At your option, you may
+// continue to consider qpdf to be licensed under those terms. Please
+// see the manual for additional information.
+
+#ifndef QPDFNUMBERTREEOBJECTHELPER_HH
+#define QPDFNUMBERTREEOBJECTHELPER_HH
+
+#include <qpdf/QPDFObjectHelper.hh>
+#include <qpdf/QPDFObjGen.hh>
+#include <functional>
+#include <map>
+
+#include <qpdf/DLL.h>
+
+// This is an object helper for number trees. See section 7.9.7 in the
+// PDF spec (ISO 32000) for a description of number trees. This
+// implementation disregards stated limits and sequencing and simply
+// builds a map from numerical index to object. If the array of
+// numbers does not contain a numerical value where expected, this
+// implementation silently skips forward until it finds a number.
+
+class QPDFNumberTreeObjectHelper: public QPDFObjectHelper
+{
+ public:
+ QPDF_DLL
+ QPDFNumberTreeObjectHelper(QPDFObjectHandle);
+
+ typedef long long int numtree_number;
+
+ // Return overall minimum and maximum indices
+ QPDF_DLL
+ numtree_number getMin();
+ QPDF_DLL
+ numtree_number getMax();
+
+ // Return whether the number tree has an explicit entry for this
+ // number.
+ QPDF_DLL
+ bool hasIndex(numtree_number idx);
+
+ // Find an object with a specific index. If found, returns true
+ // and initializes oh.
+ QPDF_DLL
+ bool findObject(numtree_number idx, QPDFObjectHandle& oh);
+ // Find the object at the index or, if not found, the object whose
+ // index is the highest index less than the requested index. If
+ // the requested index is less than the minimum, return false.
+ // Otherwise, return true, initialize oh to the object, and set
+ // offset to the difference between the requested index and the
+ // actual index. For example, if a number tree has values for 3
+ // and 6 and idx is 5, this method would return true, initialize
+ // oh to the value with index 3, and set offset to 2 (5 - 3).
+ QPDF_DLL
+ bool findObjectAtOrBelow(numtree_number idx, QPDFObjectHandle& oh,
+ numtree_number& offset);
+
+ typedef std::map<numtree_number, QPDFObjectHandle> idx_map;
+ QPDF_DLL
+ idx_map getAsMap() const;
+
+ private:
+ class Members
+ {
+ friend class QPDFNumberTreeObjectHelper;
+ typedef QPDFNumberTreeObjectHelper::numtree_number numtree_number;
+
+ public:
+ QPDF_DLL
+ ~Members();
+
+ private:
+ Members();
+ Members(Members const&);
+
+ // Use a reverse sorted map so we can use the lower_bound
+ // method for searching. lower_bound returns smallest entry
+ // not before the searched entry, meaning that the searched
+ // entry is the lower bound. There's also an upper_bound
+ // method, but it does not do what you'd think it should.
+ // lower_bound implements >=, and upper_bound implements >.
+ typedef std::map<numtree_number,
+ QPDFObjectHandle,
+ std::greater<numtree_number> > idx_map;
+ idx_map entries;
+ std::set<QPDFObjGen> seen;
+ };
+
+ void updateMap(QPDFObjectHandle oh);
+
+ PointerHolder<Members> m;
+};
+
+#endif // QPDFNUMBERTREEOBJECTHELPER_HH