/*
* PaperJam -- Low-level handling of PDFs
*
- * (c) 2018 Martin Mares <mj@ucw.cz>
+ * (c) 2018--2022 Martin Mares <mj@ucw.cz>
*/
#include <cassert>
#include <cstdlib>
#include <cstdio>
+#include <cstring>
#include <unistd.h>
#include <sys/wait.h>
void render(out_context *out, pdf_matrix xform);
void debug_dump() { debug("Input page %d", index); }
in_page(QPDFObjectHandle inpg, int idx);
+ int get_rotate();
};
in_page::in_page(QPDFObjectHandle inpg, int idx)
out->contents += "q " + m.to_string() + " cm " + xobj_res + " Do Q ";
}
+int in_page::get_rotate()
+{
+ QPDFObjectHandle rotate = pdf_page.getKey("/Rotate");
+ if (rotate.isNull())
+ return 0;
+ else if (rotate.isInteger())
+ {
+ long long deg = rotate.getIntValue();
+ if (deg < 0 || deg >= 360 || deg % 90)
+ {
+ warn("Page #%d: /Rotate must be 0, 90, 180 or 270", index);
+ return 0;
+ }
+ else
+ return deg;
+ }
+ else
+ {
+ warn("Page #%d: /Rotate is not an integer", index);
+ return 0;
+ }
+}
+
void debug_pages(vector<page *> &pages)
{
if (!debug_level)
}
}
+static vector<page *> apply_input_xforms(vector<page *> in_pages)
+{
+ vector<page *> out_pages;
+
+ for (auto pg: in_pages)
+ {
+ in_page * in_pg = dynamic_cast<in_page *>(pg);
+ if (in_pg)
+ {
+ int deg = in_pg->get_rotate();
+ if (deg)
+ pg = new xform_page(pg, "/Rotate", pdf_rotation_matrix(deg, pg->width, pg->height));
+ }
+ out_pages.push_back(pg);
+ }
+
+ return out_pages;
+}
+
vector<page *> run_command_list(list<cmd *> &cmds, vector<page *> &pages)
{
debug("# Input");
if (recalc_bbox)
do_recalc_bbox(pages, in_name);
+ if (!no_auto_transforms)
+ {
+ debug("### Applying input transforms");
+ pages = apply_input_xforms(pages);
+ }
+
debug("### Running commands");
pages = run_command_list(cmds, pages);
for (size_t i=0; i<pages.size(); i++)
pages[i]->image_box = bboxes[i];
}
+
+// Transformed page
+
+xform_page::xform_page(page *p, const char *desc, pdf_matrix xf)
+{
+ orig_page = p;
+ index = p->index;
+ description = desc;
+ xform = xf;
+
+ BBox media(p->width, p->height);
+ media.transform(xf);
+ width = media.width();
+ height = media.height();
+
+ image_box = p->image_box;
+ image_box.transform(xf);
+}
+
+void xform_page::debug_dump()
+{
+ debug("Transform (%s): [%s]", description, xform.to_string().c_str());
+ orig_page->debug_dump();
+}
+
+void xform_page::render(out_context *out, pdf_matrix parent_xform)
+{
+ orig_page->render(out, xform * parent_xform);
+}