vector<page *> process(vector<page *> &pages) { return pages; }
};
-static const arg_def null_args[] = {
+static const arg_def no_args[] = {
{ NULL, 0 }
};
return r;
}
+/*** select ***/
+
+class select_cmd : public cmd_exec {
+public:
+ pipeline *pipe;
+ vector<page *> process(vector<page *> &pages);
+};
+
+static int validate_page_index(vector<page *> &pages, int idx)
+{
+ if (idx >= 1 && idx <= (int) pages.size())
+ return idx - 1;
+ if (idx <= -1 && idx >= (int) -pages.size())
+ return idx + pages.size();
+ die("Page index %d out of range", idx);
+}
+
+vector<page *> select_cmd::process(vector<page *> &pages)
+{
+ vector<page *> out;
+ for (auto pb: pipe->branches)
+ for (auto ps: pb->selectors)
+ {
+ int f = validate_page_index(pages, ps.from);
+ int t = validate_page_index(pages, ps.to);
+ int step = (f <= t) ? 1 : -1;
+ for (int i=f; f<=t; f += step)
+ {
+ vector<page *> selected;
+ selected.push_back(pages[i]);
+ selected = run_command_list(pb->commands, selected);
+ for (auto p: selected)
+ out.push_back(p);
+ }
+ }
+ return out;
+}
+
+static cmd_exec *select_ctor(cmd *c)
+{
+ select_cmd *r = new select_cmd;
+ r->pipe = c->pipe;
+ return r;
+}
+
/*** Command table ***/
const cmd_def cmd_table[] = {
+ { "null", no_args, 0, null_ctor },
{ "move", move_args, 0, move_ctor },
{ "scale", scale_args, 0, scale_ctor },
{ "rotate", rotate_args, 0, rotate_ctor },
- { "null", null_args, 0, null_ctor },
+ { "select", no_args, 1, select_ctor },
{ NULL, NULL, 0, NULL }
};
out->contents += "q " + m.to_string() + " cm " + xobj_res + " Do Q";
}
+static int run_indent;
+
static void debug_pages(vector<page *> &pages)
{
if (!debug_mode)
return;
for (auto pg: pages)
- debug("Page #%d: w=%.3f h=%.3f", pg->index, pg->width, pg->height);
+ debug("%*sPage #%d: w=%.3f h=%.3f", run_indent, "", pg->index, pg->width, pg->height);
+}
+
+vector<page *> run_command_list(list<cmd *> &cmds, vector<page *> &pages)
+{
+ debug("%*s# Input", run_indent, "");
+ debug_pages(pages);
+
+ for (auto c: cmds)
+ {
+ debug("%*s# Executing %s", run_indent, "", c->def->name);
+ run_indent += 4;
+ pages = c->exec->process(pages);
+ run_indent -= 4;
+ debug_pages(pages);
+ }
+
+ return pages;
}
static void process(list<cmd *> &cmds, const char *in_name, const char *out_name)
int cnt = 0;
for (auto inpg: in_pages)
pages.push_back(new in_page(inpg, ++cnt));
- debug("# Input document");
- debug_pages(pages);
- for (auto c: cmds)
- {
- debug("# Executing %s", c->def->name);
- pages = c->exec->process(pages);
- debug_pages(pages);
- }
+ pages = run_command_list(cmds, pages);
for (auto pg: pages)
{