| 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 { ..., ..., ...}
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")
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();
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 ";
pos_spec pos;
pos_spec tpos;
double hspace, vspace;
+ cropmark_spec cmarks;
// Processing state
page *process_single(vector<page *> &in);
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);
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) { }
};
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)
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;
MARGIN_ARGS1_NAMED("margin"),
MARGIN_ARGS2("margin"),
POS_ARGS,
+ CROPMARK_ARGS("c"),
{ "tpos", AT_STRING },
{ "space", AT_DIMEN },
{ "hspace", AT_DIMEN },