OBS-URL: https://build.opensuse.org/package/show/Publishing/paps?expand=0&rev=4
290 lines
11 KiB
Diff
290 lines
11 KiB
Diff
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;
|
|
}
|