- Integrate pdf-tools.cc with the rest of the code
- What if an input page specifies /Rotate?
+- Better error messages from instantiation
for (auto p: pages)
{
xform_page *q = new xform_page(p, p->width, p->height);
- // FIXME: This does not work yet
- q->xform.rotate_deg(90);
+ switch (deg)
+ {
+ case 0:
+ break;
+ case 90:
+ q->xform.rotate_deg(-90);
+ q->xform.shift(0, p->width);
+ swap(q->width, q->height);
+ break;
+ case 180:
+ q->xform.rotate_deg(180);
+ q->xform.shift(p->width, p->height);
+ break;
+ case 270:
+ q->xform.rotate_deg(90);
+ q->xform.shift(p->height, 0);
+ swap(q->width, q->height);
+ break;
+ default:
+ abort();
+ }
out.push_back(q);
}
return out;
static cmd_exec *rotate_ctor(cmd *c)
{
rotate_cmd *r = new rotate_cmd;
- r->deg = c->args.at(0)->as_int(0);
+ r->deg = c->args.at(0)->as_int(0) % 360;
+ if (r->deg < 0)
+ r->deg += 360;
+ if (r->deg % 90)
+ die("Rotate requires a multiple of 90 degrees");
return r;
}
class arg_val {
public:
virtual bool given() { return false; }
- int as_int(int def) { return def; }
- double as_double(double def) { return def; }
- const string as_string(const string def) { return def; }
+ virtual int as_int(int def) { return def; }
+ virtual double as_double(double def) { return def; }
+ virtual const string as_string(const string def) { return def; }
virtual string dump() { return "<undef>"; }
};
arg_int(int x) { val = x; }
bool given() { return true; }
int as_int(int def UNUSED) { return val; }
- string dump() { return to_string(val); }
+ string dump() { return "<int> " + to_string(val); }
};
class arg_double : public arg_val {
arg_double(double x) { val = x; }
bool given() { return true; }
double as_double(double def UNUSED) { return val; }
- string dump() { return to_string(val); }
+ string dump() { return "<double> " + to_string(val); }
};
class arg_string : public arg_val {
public:
arg_string(string x) { val = x; }
bool given() { return true; }
- string as_string(string def UNUSED) { return val; }
- string dump() { return '"' + val + '"'; }
+ const string as_string(string def UNUSED) { return val; }
+ string dump() { return "<string> \"" + val + '"'; }
};
static arg_val null_arg;