File paps-layout.patch of Package paps
Try to get page layout to something useful
---
src/paps.1 | 6 ++
src/paps.c | 162 +++++++++++++++++++++++++++++++++++++++++--------------------
2 files changed, 116 insertions(+), 52 deletions(-)
--- src/paps.1
+++ src/paps.1 2017-12-06 12:02:16.293502145 +0000
@@ -272,6 +272,12 @@ Set gutter width. Default is 40 postscri
.TP
.B \-\-header
Draw page header with document name, date and page number for each page. Header
+is not printed by default. Page numbers are only done without
+.B \-\-footer
+option.
+.TP
+.B \-\-footer
+Draw page footer page number for each page. Footer
is not printed by default.
.TP
.B \-\-title="text"
--- src/paps.c
+++ src/paps.c 2017-12-06 12:02:16.297502070 +0000
@@ -169,7 +169,6 @@ static int output_pages
cairo_t *cr,
GList *pango_lines,
page_layout_t *page_layout,
- gboolean need_header,
PangoContext *pango_context);
static void eject_column (cairo_t *cr,
page_layout_t *page_layout,
@@ -185,7 +184,10 @@ static void draw_line_to_page
PangoLayoutLine *line,
gboolean draw_wrap_character);
static int draw_page_header_line_to_page(cairo_t *cr,
- gboolean is_footer,
+ page_layout_t *page_layout,
+ PangoContext *ctx,
+ int page);
+static int draw_page_footer_line_to_page(cairo_t *cr,
page_layout_t *page_layout,
PangoContext *ctx,
int page);
@@ -699,6 +701,8 @@ int main(int argc, char *argv[])
do_duplex = TRUE;
}
+ page_layout.do_draw_header = do_draw_header;
+ page_layout.do_draw_footer = do_draw_footer;
page_layout.page_width = page_width;
page_layout.page_height = page_height;
page_layout.paper_type = paper_type;
@@ -715,9 +719,9 @@ int main(int argc, char *argv[])
page_layout.scale_x = 1.0L;
page_layout.scale_y = 1.0L;
if (do_draw_header)
- page_layout.header_sep = 0; // header_sep;
+ page_layout.header_sep = header_sep;
else
- page_layout.header_sep = 0;
+ page_layout.header_sep = 0;
page_layout.column_height = (int)page_height
- page_layout.top_margin
@@ -782,7 +786,7 @@ int main(int argc, char *argv[])
cairo_scale(cr, page_layout.scale_x, page_layout.scale_y);
- output_pages(surface, cr, pango_lines, &page_layout, do_draw_header, pango_context);
+ output_pages(surface, cr, pango_lines, &page_layout, pango_context);
cairo_destroy (cr);
cairo_surface_finish (surface);
@@ -1184,7 +1188,6 @@ output_pages(cairo_surface_t *surface,
cairo_t *cr,
GList *pango_lines,
page_layout_t *page_layout,
- gboolean need_header,
PangoContext *pango_context)
{
int column_idx = 0;
@@ -1196,8 +1199,10 @@ output_pages(cairo_surface_t *surface,
start_page(surface, cr, page_layout);
- if (need_header)
- draw_page_header_line_to_page(cr, TRUE, page_layout, pango_context, page_idx);
+ if (page_layout->do_draw_header)
+ draw_page_header_line_to_page(cr, page_layout, pango_context, page_idx);
+ if (page_layout->do_draw_footer)
+ draw_page_footer_line_to_page(cr, page_layout, pango_context, page_idx);
while(pango_lines)
{
@@ -1219,8 +1224,10 @@ output_pages(cairo_surface_t *surface,
page_idx++;
start_page(surface, cr, page_layout);
- if (need_header)
- draw_page_header_line_to_page(cr, TRUE, page_layout, pango_context, page_idx);
+ if (page_layout->do_draw_header)
+ draw_page_header_line_to_page(cr, page_layout, pango_context, page_idx);
+ if (page_layout->do_draw_footer)
+ draw_page_footer_line_to_page(cr, page_layout, pango_context, page_idx);
}
else
{
@@ -1438,7 +1445,6 @@ get_date(char *date, int maxlen)
int
draw_page_header_line_to_page(cairo_t *cr,
- gboolean is_footer,
page_layout_t *page_layout,
PangoContext *ctx,
int page)
@@ -1449,24 +1455,29 @@ draw_page_header_line_to_page(cairo_t
/* Assume square aspect ratio for now */
double x_pos, y_pos;
gchar *header, date[256];
- int height;
+ int height, title_len;
gdouble line_pos;
/* Reset gravity?? */
-#if 0
- header = g_strdup_printf("<span font_desc=\"%s\">%s</span>\n"
- "<span font_desc=\"%s\">%s</span>\n"
- "<span font_desc=\"%s\">%d</span>",
- page_layout->header_font_desc,
- page_layout->title,
- page_layout->header_font_desc,
- get_date(date, 255),
- page_layout->header_font_desc,
- page);
-#endif
- header = g_strdup_printf("<span font_desc=\"%s\">%d</span>\n",
- page_layout->header_font_desc,
- page);
+ if (page_layout->do_draw_footer)
+ header = g_strdup_printf("<span font_desc=\"%s\">%s</span>\n"
+ "<span font_desc=\"%s\">%s</span>\n",
+ page_layout->header_font_desc,
+ page_layout->title,
+ page_layout->header_font_desc,
+ get_date(date, 255));
+ else
+ header = g_strdup_printf("<span font_desc=\"%s\">%s</span>\n"
+ "<span font_desc=\"%s\">%s</span>\n"
+ "<span font_desc=\"%s\">%d</span>",
+ page_layout->header_font_desc,
+ page_layout->title,
+ page_layout->header_font_desc,
+ get_date(date, 255),
+ page_layout->header_font_desc,
+ page);
+
+ title_len = strlen(page_layout->title);
pango_layout_set_markup(layout, header, -1);
g_free(header);
@@ -1476,54 +1487,101 @@ draw_page_header_line_to_page(cairo_t
pango_layout_line_get_extents(line,
&ink_rect,
&logical_rect);
- x_pos = page_layout->left_margin + (page_layout->page_width-page_layout->left_margin-page_layout->right_margin)*0.5 - 0.5*logical_rect.width/PANGO_SCALE;
+ x_pos = page_layout->left_margin;
+ x_pos += 0.5*(page_layout->page_width - page_layout->left_margin-page_layout->right_margin);
+ x_pos -= 0.7*(logical_rect.width / PANGO_SCALE);
height = logical_rect.height / PANGO_SCALE /3.0;
/* The header is placed right after the margin */
- if (is_footer)
- {
- y_pos = page_layout->page_height - page_layout->bottom_margin*0.5;
- page_layout->footer_height = height;
- }
- else
- {
- y_pos = page_layout->top_margin + height;
- page_layout->header_height = height;
- }
+ y_pos = page_layout->top_margin + height;
+ page_layout->header_height = height;
cairo_move_to(cr, x_pos,y_pos);
pango_cairo_show_layout_line(cr,line);
- /* output a right edge of header/footer */
- line = pango_layout_get_line(layout, 2);
- pango_layout_line_get_extents(line,
- &ink_rect,
- &logical_rect);
- pagenum_rect = logical_rect;
- x_pos = page_layout->page_width - page_layout->right_margin - (logical_rect.width / PANGO_SCALE );
- cairo_move_to(cr, x_pos,y_pos);
- pango_cairo_show_layout_line(cr,line);
+ if (!page_layout->do_draw_footer)
+ {
+ line = pango_layout_get_line(layout, 1);
+ pango_layout_line_get_extents(line,
+ &ink_rect,
+ &logical_rect);
+ x_pos = page_layout->page_width;
+ x_pos -= page_layout->right_margin;
+ x_pos -= (logical_rect.width + pagenum_rect.width) / PANGO_SCALE;
+ x_pos -= page_layout->gutter_width;
+ cairo_move_to(cr, x_pos,y_pos);
+ pango_cairo_show_layout_line(cr,line);
+ }
+
+ /* output a right edge of header */
+ if (!page_layout->do_draw_footer)
+ line = pango_layout_get_line(layout, 2);
+ else
+ line = pango_layout_get_line(layout, 1);
- /* output a "center" of header/footer */
- line = pango_layout_get_line(layout, 1);
pango_layout_line_get_extents(line,
&ink_rect,
&logical_rect);
- x_pos = page_layout->page_width - page_layout->right_margin -
- ((logical_rect.width + pagenum_rect.width) / PANGO_SCALE + page_layout->gutter_width);
+ pagenum_rect = logical_rect;
+ x_pos = page_layout->page_width;
+ x_pos -= page_layout->right_margin;
+ x_pos -= logical_rect.width / PANGO_SCALE;
cairo_move_to(cr, x_pos,y_pos);
pango_cairo_show_layout_line(cr,line);
g_object_unref(layout);
/* header separator */
-#if 0
line_pos = page_layout->top_margin + page_layout->header_height + page_layout->header_sep / 2;
cairo_move_to(cr, page_layout->left_margin, line_pos);
cairo_line_to(cr,page_layout->page_width - page_layout->right_margin, line_pos);
cairo_set_line_width(cr,0.1); // TBD
cairo_stroke(cr);
-#endif
+
+ return logical_rect.height;
+}
+
+int
+draw_page_footer_line_to_page(cairo_t *cr,
+ page_layout_t *page_layout,
+ PangoContext *ctx,
+ int page)
+{
+ PangoLayout *layout = pango_layout_new(ctx);
+ PangoLayoutLine *line;
+ PangoRectangle ink_rect, logical_rect, pagenum_rect;
+ /* Assume square aspect ratio for now */
+ double x_pos, y_pos;
+ gchar *footer;
+ int height;
+ gdouble line_pos;
+
+ /* Reset gravity?? */
+ footer = g_strdup_printf("<span font_desc=\"%s\">%d</span>\n",
+ page_layout->header_font_desc,
+ page);
+
+ pango_layout_set_markup(layout, footer, -1);
+ g_free(footer);
+
+ /* output footer */
+ line = pango_layout_get_line(layout, 0);
+ pango_layout_line_get_extents(line,
+ &ink_rect,
+ &logical_rect);
+
+ x_pos = page_layout->left_margin;
+ x_pos += 0.5*(page_layout->page_width - page_layout->left_margin-page_layout->right_margin);
+ x_pos -= 0.5*(logical_rect.width / PANGO_SCALE);
+ height = logical_rect.height / PANGO_SCALE /3.0;
+
+ y_pos = page_layout->page_height - page_layout->bottom_margin*0.5;
+ page_layout->footer_height = height;
+
+ cairo_move_to(cr, x_pos,y_pos);
+ pango_cairo_show_layout_line(cr,line);
+
+ g_object_unref(layout);
return logical_rect.height;
}