From 1e22dfe90ae40fafb03ddb780c327b915c18a9c7 Mon Sep 17 00:00:00 2001 From: Martin Mares Date: Fri, 6 Apr 2018 21:42:35 +0200 Subject: [PATCH] Nup: Cropmarks --- TODO | 2 +- cmds.cc | 20 ++++++++++++++++---- pdf-tools.cc | 7 +++++++ pdf-tools.h | 1 + 4 files changed, 25 insertions(+), 5 deletions(-) diff --git a/TODO b/TODO index b43e598..b93a78f 100644 --- a/TODO +++ b/TODO @@ -74,7 +74,7 @@ duplex | rotate=1 # Override rotation decision | scale=1 # Override scaling factor | hspace / vspace / space # Distance between tiles - cmark, cpen, clen, coffset # Cropmark parameters +| cmark, cpen, clen, coffset # Cropmark parameters # Send pages to multiple pipes and merge their results mix { ..., ..., ...} diff --git a/cmds.cc b/cmds.cc index 67b3736..87dc17b 100644 --- a/cmds.cc +++ b/cmds.cc @@ -243,7 +243,7 @@ class cropmark_spec { string crop_cross(double x, double y, uint mask); QPDFObjectHandle egstate; public: - cropmark_spec(cmd *c, string prefix="", string def_type="cross") + cropmark_spec(cmd *c, const string prefix="", const string def_type="cross") { string t = c->arg(prefix + "mark")->as_string(def_type); if (t == "none") @@ -259,7 +259,7 @@ public: else die("Invalid cropmark type %s", t.c_str()); - pen_width = c->arg(prefix + "pen")->as_double(1); + pen_width = c->arg(prefix + "pen")->as_double(0.2); arm_length = c->arg(prefix + "len")->as_double(5*mm); offset = c->arg(prefix + "offset")->as_double(0); egstate = QPDFObjectHandle::newNull(); @@ -290,6 +290,9 @@ string cropmark_spec::crop_cross(double x, double y, uint mask) string cropmark_spec::pdf_stream(out_context *out, BBox &box, pdf_matrix &xform) { + if (type == MARK_NONE) + return ""; + string s = "q "; s += "0 0 0 RG "; s += xform.to_string() + " cm "; @@ -989,6 +992,7 @@ class nup_cmd : public cmd_exec { pos_spec pos; pos_spec tpos; double hspace, vspace; + cropmark_spec cmarks; // Processing state page *process_single(vector &in); @@ -999,7 +1003,7 @@ class nup_cmd : public cmd_exec { BBox common_page_box; public: - nup_cmd(cmd *c) : paper(c), marg(c, "margin", "margin"), pos(c), tpos(c->arg("tpos")->as_string("tl")) + nup_cmd(cmd *c) : paper(c), marg(c, "margin", "margin"), pos(c), tpos(c->arg("tpos")->as_string("tl")), cmarks(c, "c", "none") { grid_n = c->arg("n")->as_int(0); grid_m = c->arg("m")->as_int(0); @@ -1198,6 +1202,8 @@ class nup_page : public page { public: vector orig_pages; vector xforms; + vector tile_boxes; + cropmark_spec *cmarks; void render(out_context *out, pdf_matrix xform) override; nup_page(nup_state &st) : page(st.paper_w, st.paper_h) { } }; @@ -1205,7 +1211,10 @@ public: void nup_page::render(out_context *out, pdf_matrix parent_xform) { for (int i=0; i < (int) orig_pages.size(); i++) - orig_pages[i]->render(out, xforms[i] * parent_xform); + { + orig_pages[i]->render(out, xforms[i] * parent_xform); + out->contents += cmarks->pdf_stream(out, tile_boxes[i], parent_xform); + } } page *nup_cmd::process_single(vector &in) @@ -1253,6 +1262,8 @@ page *nup_cmd::process_single(vector &in) p->orig_pages.push_back(in[i]); p->xforms.push_back(m * place_xform); + p->tile_boxes.push_back(tile_box.transformed(place_xform)); + p->cmarks = &cmarks; } return p; @@ -1270,6 +1281,7 @@ static const arg_def nup_args[] = { MARGIN_ARGS1_NAMED("margin"), MARGIN_ARGS2("margin"), POS_ARGS, + CROPMARK_ARGS("c"), { "tpos", AT_STRING }, { "space", AT_DIMEN }, { "hspace", AT_DIMEN }, diff --git a/pdf-tools.cc b/pdf-tools.cc index 973ba9a..4c10313 100644 --- a/pdf-tools.cc +++ b/pdf-tools.cc @@ -84,6 +84,13 @@ void BBox::transform(pdf_matrix &m) swap(y_min, y_max); } +BBox BBox::transformed(pdf_matrix &m) +{ + BBox b = *this; + b.transform(m); + return b; +} + void BBox::join(BBox &with) { x_min = min(x_min, with.x_min); diff --git a/pdf-tools.h b/pdf-tools.h index 844d4b5..0225e9c 100644 --- a/pdf-tools.h +++ b/pdf-tools.h @@ -129,6 +129,7 @@ struct BBox { double width() { return x_max - x_min; } double height() { return y_max - y_min; } void transform(pdf_matrix &m); + BBox transformed(pdf_matrix &m); void join(BBox &with); private: bool parse(QPDFObjectHandle h); -- 2.39.5