From: Martin Mares Date: Mon, 2 Apr 2018 09:25:21 +0000 (+0200) Subject: Simplified single-page commands X-Git-Tag: v0.1~33 X-Git-Url: http://mj.ucw.cz/gitweb/?a=commitdiff_plain;h=40c9b83fb89b54c343b838d66e5b0bc80902957c;p=paperjam.git Simplified single-page commands --- diff --git a/cmds.cc b/cmds.cc index ca3f81f..71f9c29 100644 --- a/cmds.cc +++ b/cmds.cc @@ -7,7 +7,7 @@ /*** null ***/ class null_cmd : public cmd_exec { - vector process(vector &pages) { return pages; } + vector process(vector &pages) override { return pages; } }; static const arg_def no_args[] = { @@ -25,7 +25,7 @@ class xform_page : public page { page *orig_page; pdf_matrix xform; public: - void render(out_context *out, pdf_matrix xform); + void render(out_context *out, pdf_matrix xform) override; xform_page(page *p, pdf_matrix xf); }; @@ -49,25 +49,31 @@ void xform_page::render(out_context *out, pdf_matrix parent_xform) orig_page->render(out, xform * parent_xform); } -/*** move ***/ - -class move_cmd : public cmd_exec { -public: - double x, y; - vector process(vector &pages); +class cmd_exec_simple : public cmd_exec { + virtual page *process_page(page *p) = 0; + vector process(vector &pages) override; }; -vector move_cmd::process(vector &pages) +vector cmd_exec_simple::process(vector &pages) { vector out; for (auto p: pages) + out.push_back(process_page(p)); + return out; +} + +/*** move ***/ + +class move_cmd : public cmd_exec_simple { +public: + double x, y; + page *process_page(page *p) override { pdf_matrix m; m.shift(x, y); - out.push_back(new xform_page(p, m)); + return new xform_page(p, m); } - return out; -} +}; static const arg_def move_args[] = { { "x", AT_DIMEN | AT_MANDATORY | AT_POSITIONAL }, @@ -85,23 +91,16 @@ static cmd_exec *move_ctor(cmd *c) /*** scale ***/ -class scale_cmd : public cmd_exec { +class scale_cmd : public cmd_exec_simple { public: double x_factor, y_factor; - vector process(vector &pages); -}; - -vector scale_cmd::process(vector &pages) -{ - vector out; - for (auto p: pages) + page *process_page(page *p) override { pdf_matrix m; m.scale(x_factor, y_factor); - out.push_back(new xform_page(p, m)); + return new xform_page(p, m); } - return out; -} +}; static const arg_def scale_args[] = { { "x", AT_DOUBLE | AT_MANDATORY | AT_POSITIONAL }, @@ -119,16 +118,10 @@ static cmd_exec *scale_ctor(cmd *c) /*** rotate ***/ -class rotate_cmd : public cmd_exec { +class rotate_cmd : public cmd_exec_simple { public: int deg; - vector process(vector &pages); -}; - -vector rotate_cmd::process(vector &pages) -{ - vector out; - for (auto p: pages) + page *process_page(page *p) override { pdf_matrix m; switch (deg) @@ -150,10 +143,9 @@ vector rotate_cmd::process(vector &pages) default: abort(); } - out.push_back(new xform_page(p, m)); + return new xform_page(p, m); } - return out; -} +}; static const arg_def rotate_args[] = { { "angle", AT_INT | AT_MANDATORY | AT_POSITIONAL }, @@ -173,17 +165,11 @@ static cmd_exec *rotate_ctor(cmd *c) /*** flip ***/ -class flip_cmd : public cmd_exec { +class flip_cmd : public cmd_exec_simple { public: bool horizontal; bool vertical; - vector process(vector &pages); -}; - -vector flip_cmd::process(vector &pages) -{ - vector out; - for (auto p: pages) + page *process_page(page *p) override { pdf_matrix m; if (vertical) @@ -196,10 +182,9 @@ vector flip_cmd::process(vector &pages) m.scale(-1, 1); m.shift(p->width, 0); } - out.push_back(new xform_page(p, m)); + return new xform_page(p, m); } - return out; -} +}; static const arg_def flip_args[] = { { "h", AT_SWITCH }, diff --git a/jam.h b/jam.h index 002ad04..7fd316a 100644 --- a/jam.h +++ b/jam.h @@ -68,7 +68,7 @@ struct empty_page : public page { }; struct cmd_exec { - virtual vector process(vector &pages UNUSED) { abort(); } + virtual vector process(vector &pages UNUSED) = 0; }; struct cmd_def {