]> mj.ucw.cz Git - paperjam.git/commitdiff
Nup: Cropmarks
authorMartin Mares <mj@ucw.cz>
Fri, 6 Apr 2018 19:42:35 +0000 (21:42 +0200)
committerMartin Mares <mj@ucw.cz>
Fri, 6 Apr 2018 19:42:35 +0000 (21:42 +0200)
TODO
cmds.cc
pdf-tools.cc
pdf-tools.h

diff --git a/TODO b/TODO
index b43e5987a53b71b2cef835a85c40bbbb6a735267..b93a78fe52fe3c2246f4f5558de3ae50fe52d056 100644 (file)
--- 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 67b37366d0495760c8c123fc86f0aabdb11082f0..87dc17bfca9e3578467e3db8534ab36469a27bca 100644 (file)
--- 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<page *> &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<page *> orig_pages;
   vector<pdf_matrix> xforms;
+  vector<BBox> 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<page *> &in)
@@ -1253,6 +1262,8 @@ page *nup_cmd::process_single(vector<page *> &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 },
index 973ba9a5199d4da64e21a93ed9c995bcd4054673..4c10313d371f5f12f4d887de2f1c4b09027785c0 100644 (file)
@@ -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);
index 844d4b5b4aa26d9ce8602260ebff2ccaa1300bea..0225e9c457f951806aa07129c9a692ab55856f9e 100644 (file)
@@ -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);