aboutsummaryrefslogtreecommitdiffstats
path: root/libqpdf
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2017-08-12 19:22:46 +0200
committerJay Berkenbilt <ejb@ql.org>2017-08-13 04:57:38 +0200
commitcfa2eb97fb9b38d62fd2cd8d54ab59bac503967f (patch)
treee29e4276b80b9fda4049017cdbe8e8bc01b8aa05 /libqpdf
parentd926d7805963901d2c7cd10198f2cb125e363210 (diff)
downloadqpdf-cfa2eb97fb9b38d62fd2cd8d54ab59bac503967f.tar.zst
Add page rotation (fixes #132)
Diffstat (limited to 'libqpdf')
-rw-r--r--libqpdf/QPDFObjectHandle.cc56
1 files changed, 56 insertions, 0 deletions
diff --git a/libqpdf/QPDFObjectHandle.cc b/libqpdf/QPDFObjectHandle.cc
index e263a3ec..a8a7e5a7 100644
--- a/libqpdf/QPDFObjectHandle.cc
+++ b/libqpdf/QPDFObjectHandle.cc
@@ -673,6 +673,62 @@ QPDFObjectHandle::addPageContents(QPDFObjectHandle new_contents, bool first)
this->replaceKey("/Contents", contents);
}
+void
+QPDFObjectHandle::rotatePage(int angle, bool relative)
+{
+ assertPageObject();
+ if ((angle % 90) != 0)
+ {
+ throw std::runtime_error(
+ "QPDF::rotatePage called with an"
+ " angle that is not a multiple of 90");
+ }
+ int new_angle = angle;
+ if (relative)
+ {
+ int old_angle = 0;
+ bool found_rotate = false;
+ QPDFObjectHandle cur_obj = *this;
+ bool searched_parent = false;
+ std::set<QPDFObjGen> visited;
+ while (! found_rotate)
+ {
+ if (visited.count(cur_obj.getObjGen()))
+ {
+ // Don't get stuck in an infinite loop
+ break;
+ }
+ if (! visited.empty())
+ {
+ searched_parent = true;
+ }
+ visited.insert(cur_obj.getObjGen());
+ if (cur_obj.getKey("/Rotate").isInteger())
+ {
+ found_rotate = true;
+ old_angle = cur_obj.getKey("/Rotate").getIntValue();
+ }
+ else if (cur_obj.getKey("/Parent").isDictionary())
+ {
+ cur_obj = cur_obj.getKey("/Parent");
+ }
+ else
+ {
+ break;
+ }
+ }
+ QTC::TC("qpdf", "QPDFObjectHandle found old angle",
+ searched_parent ? 0 : 1);
+ if ((old_angle % 90) != 0)
+ {
+ old_angle = 0;
+ }
+ new_angle += old_angle;
+ }
+ new_angle = (new_angle + 360) % 360;
+ replaceKey("/Rotate", QPDFObjectHandle::newInteger(new_angle));
+}
+
std::string
QPDFObjectHandle::unparse()
{