From: Martin Mares Date: Sun, 1 Apr 2018 21:58:29 +0000 (+0200) Subject: draw_bbox X-Git-Tag: v0.1~37 X-Git-Url: http://mj.ucw.cz/gitweb/?a=commitdiff_plain;h=79cd6567f85450ec93f37bf5fc9546baeeec336e;p=paperjam.git draw_bbox --- diff --git a/cmds.cc b/cmds.cc index 1906623..24fb0a4 100644 --- a/cmds.cc +++ b/cmds.cc @@ -337,6 +337,45 @@ static cmd_exec *modulo_ctor(cmd *c) return m; } +/*** draw_bbox ***/ + +class draw_bbox_cmd : public cmd_exec { +public: + vector process(vector &pages); +}; + +class draw_bbox_page : public page { + page *orig_page; +public: + void render(out_context *out, pdf_matrix xform); + draw_bbox_page(page *p) : page(p) { orig_page = p; } +}; + +void draw_bbox_page::render(out_context *out, pdf_matrix xform) +{ + orig_page->render(out, xform); + out->contents += + "q " + + xform.to_string() + " cm " + + "0 1 0 RG " + + bbox.to_rect() + " re S " + + "Q "; +} + +vector draw_bbox_cmd::process(vector &pages) +{ + vector out; + for (auto p: pages) + out.push_back(new draw_bbox_page(p)); + return out; +} + +static cmd_exec *draw_bbox_ctor(cmd *c UNUSED) +{ + draw_bbox_cmd *m = new draw_bbox_cmd; + return m; +} + /*** Command table ***/ const cmd_def cmd_table[] = { @@ -347,5 +386,6 @@ const cmd_def cmd_table[] = { { "select", no_args, 1, select_ctor }, { "apply", no_args, 1, apply_ctor }, { "modulo", modulo_args, 1, modulo_ctor }, + { "draw_bbox",no_args, 0, draw_bbox_ctor }, { NULL, NULL, 0, NULL } }; diff --git a/paperjam.cc b/paperjam.cc index 22dd9f5..fa2c6dd 100644 --- a/paperjam.cc +++ b/paperjam.cc @@ -61,7 +61,7 @@ void in_page::render(out_context *out, pdf_matrix xform) m.shift(-media_box.x_min, -media_box.y_min); m.concat(xform); - out->contents += "q " + m.to_string() + " cm " + xobj_res + " Do Q"; + out->contents += "q " + m.to_string() + " cm " + xobj_res + " Do Q "; } static void debug_pages(vector &pages) diff --git a/parse.cc b/parse.cc index 2e38d3a..3719a4e 100644 --- a/parse.cc +++ b/parse.cc @@ -71,7 +71,8 @@ static token_type get_next_token() { while (*in_pos >= 'A' && *in_pos <= 'Z' || *in_pos >= 'a' && *in_pos <= 'z' || - *in_pos >= '0' && *in_pos <= '9') + *in_pos >= '0' && *in_pos <= '9' || + *in_pos == '_') token += *in_pos++; return TOK_IDENT; } diff --git a/pdf-tools.cc b/pdf-tools.cc index 71dde6c..c170d8a 100644 --- a/pdf-tools.cc +++ b/pdf-tools.cc @@ -94,6 +94,13 @@ QPDFObjectHandle BBox::to_array() return a; } +string BBox::to_rect() +{ + char buf[64]; + snprintf(buf, sizeof(buf), "%.1f %.1f %.1f %.1f", x_min, y_min, width(), height()); + return string(buf); +} + bool BBox::parse(QPDFObjectHandle h) { if (!h.isArray() || h.getArrayNItems() != 4) diff --git a/pdf-tools.h b/pdf-tools.h index 5dfd95b..9563ec0 100644 --- a/pdf-tools.h +++ b/pdf-tools.h @@ -145,6 +145,7 @@ struct BBox { } } QPDFObjectHandle to_array(); + string to_rect(); double width() { return x_max - x_min; } double height() { return y_max - y_min; } void transform(pdf_matrix &m);