/*** null ***/
class null_cmd : public cmd_exec {
+ vector<page *> process(vector<page *> pages) { return pages; }
};
static const arg_def null_args[] = {
class move_cmd : public cmd_exec {
public:
double x, y;
+ vector<page *> process(vector<page *> pages);
};
+class xform_page : public page {
+ page *orig_page;
+public:
+ pdf_matrix xform;
+ void render(page_out *out, pdf_matrix xform);
+ xform_page(page *_orig, double _w, double _h) : page(_w, _h), orig_page(_orig) { }
+};
+
+void xform_page::render(page_out *out, pdf_matrix parent_xform)
+{
+ orig_page->render(out, xform * parent_xform);
+}
+
+vector<page *> move_cmd::process(vector<page *> pages)
+{
+ vector<page *> out;
+ for (auto p: pages)
+ {
+ xform_page *q = new xform_page(p, p->width, p->height);
+ q->xform.shift(x, y);
+ out.push_back(q);
+ }
+ return out;
+}
+
static const arg_def move_args[] = {
{ "x", AT_DIMEN | AT_MANDATORY | AT_POSITIONAL },
{ "y", AT_DIMEN | AT_MANDATORY | AT_POSITIONAL },
- { "str", AT_STRING },
{ NULL, 0 }
};
return m;
}
+/*** scale ***/
+
+class scale_cmd : public cmd_exec {
+public:
+ double x_factor, y_factor;
+ vector<page *> process(vector<page *> pages);
+};
+
+vector<page *> scale_cmd::process(vector<page *> pages)
+{
+ vector<page *> out;
+ for (auto p: pages)
+ {
+ xform_page *q = new xform_page(p, x_factor*p->width, y_factor*p->height);
+ q->xform.scale(x_factor, y_factor);
+ out.push_back(q);
+ }
+ return out;
+}
+
+static const arg_def scale_args[] = {
+ { "x", AT_DOUBLE | AT_MANDATORY | AT_POSITIONAL },
+ { "y", AT_DOUBLE | AT_POSITIONAL },
+ { NULL, 0 }
+};
+
+static cmd_exec *scale_ctor(cmd *c)
+{
+ scale_cmd *s = new scale_cmd;
+ s->x_factor = c->args.at(0)->double_default(1);
+ s->y_factor = c->args.at(1)->double_default(s->x_factor);
+ return s;
+}
+
/*** Command table ***/
const cmd_def cmd_table[] = {
- { "move", move_args, 1, move_ctor },
+ { "move", move_args, 0, move_ctor },
+ { "scale", scale_args, 0, scale_ctor },
{ "null", null_args, 0, null_ctor },
{ NULL, NULL, 0, NULL }
};